<?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>0.1.3</version>
  <mincmsversion>1.5.3</mincmsversion>
	<help>PHN0cm9uZz5IdmFkIGcmb3NsYXNoO3IgZGV0dGUgbW9kdWw/PC9zdHJvbmc+DQo8YnIvPg0KVGhlIENvZGVNaXJyb3IgbW9kdWxlIGFsbG93cyB5b3UgdG8gZWRpdCBjb250ZW50LCB0ZW1wbGF0ZXMgYW5kIHN0eWxlc2hlZXRzIHVzaW5nIGEgc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvciBpbnNpZGUgeW91ciBicm93c2VyLg0KSXQgY2FuIGJvdGggcmVwbGFjZSBhIHd5c2l3eWctbW9kdWxlLCBhbmQgYWN0IHN0YW5kYWxvbmUgZm9yIHRlbXBsYXRlL3N0eWxlc2hlZXQgZWRpdGluZyAob25seSBzdXBwb3J0ZWQgaW4gQ01TbXMgMS4xKykNCjxici8+PGJyLz4NCjxzdHJvbmc+SG93IGRvIEkgdXNlIHRoaXMgbW9kdWxlPzwvc3Ryb25nPg0KWW91IHNpbXBseSBpbnN0YWxsIGl0LCBhbmQgY2hvb3NlIGl0IGluIHlvdXIgYWRtaW4gdXNlciBwcmVmZXJlbmNlcy4gTm90ZSwgdGhhdCBpZiB5b3UgdXNlIENNU21zIDEuMSBvciBhYm92ZSB5b3UgY2FuDQpzZWxlY3QgQ29kZU1pcnJvciBib3RoIGFzIGEgV1lTSVdZRyBhbmQgYXMgYSBzeW50YXggaGlnaGxpZ2h0aW5nIGVkaXRvci48aDM+UGFyYW1ldHJlPC9oMz48dWw+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbGFuZz0iZW5fVVMiIC0gUGFyYW1ldHJldCBhbmdpdmVyIGh2aWxrZXQgc3Byb2cgZGVyIHNrYWwgYnJ1Z2VzIHRpbCB2aXNuaW5nIGZvciBiZXMmb3NsYXNoO2dlbmRlLiBJa2tlIGFsbGUgbW9kdWxlciB1bmRlcnN0Jm9zbGFzaDt0dGVyIGVsbGVyIGJlaCZvc2xhc2g7dmVyIGRldHRlLjwvbGk+PC91bD4=</help>
	<about>PGJyIC8+TGF2ZXQgYWY6IE1vcnRlbiBQb3Vsc2VuICZsdDsmbHQ7bW9ydGVuQHBvdWxzZW4ub3JnJmd0OyZndDs8YnIgLz48YnIgLz5WZXJzaW9uOiAwLjEuMzxiciAvPjxiciAvPkhpc3RvcmlrIG92ZXIgJmFlbGlnO25kcmluZ2VyOjxiciAvPjx1bD4KPGxpPjAuMS4zIC0gVXBkYXRlZCB0byBDTSAwLjY1LCBhZGRlZCBvcHRpb24gdG8gdG9nZ2VsIHdvcmR3cmFwPC9saT4KPGxpPjAuMS4yIC0gVXBkYXRlZCB0byBDTSAwLjYzPC9saT4KPGxpPjAuMS4xIC0gVXBkYXRlZCB0byBDTSAwLjYyLCBmaXhlZCBleGFtcGxlcyBhbmQgcHJvYmFibHkgZnVuY3Rpb25hbGl0eSBhcyB3ZWxsPC9saT4KPGxpPjAuMS4wIC0gSW5pdGlhbCByZWxlYXNlIDwvbGk+CjwvdWw+PGJyIC8+</about>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCgppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsKCmlmICghJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkgewogIGVjaG8gJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoJ25lZWRwZXJtaXNzaW9uJywgYXJyYXkoJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJykpKTsKICByZXR1cm47Cn0KCmVjaG8gJHRoaXMtPlN0YXJ0VGFiSGVhZGVycygpOwplY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoInNldHRpbmdzIiwkdGhpcy0+TGFuZygic2V0dGluZ3N0YWIiKSk7CgplY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoImh0bWx0ZXN0IiwkdGhpcy0+TGFuZygiaHRtbHRlc3QiKSk7CmVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigiY3NzdGVzdCIsJHRoaXMtPkxhbmcoImNzc3Rlc3QiKSk7CmVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigicGhwdGVzdCIsJHRoaXMtPkxhbmcoInBocHRlc3QiKSk7CgplY2hvICR0aGlzLT5FbmRUYWJIZWFkZXJzKCk7CmVjaG8gJHRoaXMtPlN0YXJ0VGFiQ29udGVudCgpOwoKCmVjaG8gJHRoaXMtPlN0YXJ0VGFiKCJzZXR0aW5ncyIpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCAnc2F2ZXNldHRpbmdzJywgJHJldHVybmlkKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwoKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzaG93bGluZW51bWJlcnN0ZXh0JywgJHRoaXMtPkxhbmcoInNob3dsaW5lbnVtYmVycyIpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzaG93bGluZW51bWJlcnNpbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCRpZCwic2hvd2xpbmVudW1iZXJzIiwxLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJzaG93bGluZW51bWJlcnMiLDEpKSk7CgokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RleHR3cmFwcGluZ3RleHQnLCAkdGhpcy0+TGFuZygidGV4dHdyYXBwaW5nIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RleHR3cmFwcGluZ2lucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCJ0ZXh0d3JhcHBpbmciLDEsJHRoaXMtPkdldFByZWZlcmVuY2UoInRleHR3cmFwcGluZyIsMSkpKTsKCiR0aGlzLT5zbWFydHktPmFzc2lnbigndXNlYXV0b2NvbXBsZXRldGV4dCcsICR0aGlzLT5MYW5nKCJ1c2VhdXRvY29tcGxldGUiKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbigndXNlYXV0b2NvbXBsZXRlaW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCgkaWQsInVzZWF1dG9jb21wbGV0ZSIsMSwkdGhpcy0+R2V0UHJlZmVyZW5jZSgidXNlYXV0b2NvbXBsZXRlIiwxKSkpOwoKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnc3VibWl0JywgJHRoaXMtPkxhbmcoJ3NhdmVzZXR0aW5ncycpKSk7CgplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ3NldHRpbmdzLnRwbCcpOwoKZWNobyAkdGhpcy0+RW5kVGFiKCk7CgplY2hvICR0aGlzLT5TdGFydFRhYigiaHRtbHRlc3QiKTsKJGNvbnRlbnQ9Igo8aHRtbD4KICA8aGVhZD4KICAgIDx0aXRsZT5UZXN0aW5nIGh0bWwtc3ludGF4PC90aXRsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICBBbmQgZG9pbmcgYWJzb2x1dGVseSBub3RoaW5nIGVsc2UKICA8L2JvZHk+CjwvaHRtbD4gCiI7CmVjaG8gJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsImRlZmF1bHRhZG1pbiIpOwplY2hvICR0aGlzLT5DcmVhdGVUZXh0QXJlYShmYWxzZSwkaWQsJGNvbnRlbnQsInRlc3RhcmVhMSIsJycsJycsJycsJycsJzYwJywnMTAnLCdDb2RlTWlycm9yJywnaHRtbCcpOwoKZWNobyAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpOwplY2hvICR0aGlzLT5FbmRUYWIoKTsKCmVjaG8gJHRoaXMtPlN0YXJ0VGFiKCJjc3N0ZXN0Iik7CiRjb250ZW50PSIKLnRlc3Rjc3MgewogIGZvbnQtd2VpZ2h0OmJvbGQ7CiAgaGVpZ2h0OiAxMHB4Owp9IAoiOwplY2hvICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCJkZWZhdWx0YWRtaW4iKTsKZWNobyAkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoZmFsc2UsJGlkLCRjb250ZW50LCJ0ZXN0YXJlYTIiLCcnLCcnLCcnLCcnLCc2MCcsJzEwJywnQ29kZU1pcnJvcicsJ2NzcycpOwoKZWNobyAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpOwoKZWNobyAkdGhpcy0+RW5kVGFiKCk7CgplY2hvICR0aGlzLT5TdGFydFRhYigicGhwdGVzdCIpOwokY29udGVudD0iCjw/cGhwCiAgZnVuY3Rpb24gdGVzdFBIUChcJHNvbWVwYXJhbSkgewogICAgZWNobyAnRG8geW91IHRoaW5rIHRoaXMgbG9va3MgbmljZT8nOwogIH0KPz4KIjsKZWNobyAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwiZGVmYXVsdGFkbWluIik7CmVjaG8gJHRoaXMtPkNyZWF0ZVRleHRBcmVhKGZhbHNlLCRpZCwkY29udGVudCwidGVzdGFyZWEzIiwnJywnJywnJywnJywnNjAnLCcxMCcsJ0NvZGVNaXJyb3InLCdwaHAnKTsKZWNobyAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpOwoKZWNobyAkdGhpcy0+RW5kVGFiQ29udGVudCgpOwoKCi8qCgplY2hvICI8aDM+Ii4kdGhpcy0+TGFuZygidGVzdGFyZWEiKS4iOjwvaDM+IjsKCiRjb250ZW50PSIKPGh0bWw+CiAgPGhlYWQ+CiAgICA8dGl0bGU+VGVzdGluZyBodG1sLXN5bnRheDwvdGl0bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgQW5kIGRvaW5nIGFic29sdXRlbHkgbm90aGluZyBlbHNlCiAgPC9ib2R5Pgo8L2h0bWw+IAoiOwplY2hvICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCJkZWZhdWx0YWRtaW4iKTsKZWNobyAkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoZmFsc2UsJGlkLCRjb250ZW50LCJ0ZXN0YXJlYSIsJycsJycsJycsJycsJycsJycsJ0NvZGVNaXJyb3InLCdodG1sJyk7CmVjaG8gJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKTsKIAplY2hvICR0aGlzLT5FbmRUYWIoKTsKICovCgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.savesettings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OwoKaWYgKCEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpKSB7CiAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnbmVlZHBlcm1pc3Npb24nLCBhcnJheSgnTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkpOwogIHJldHVybjsKfQoKaWYoaXNzZXQoJHBhcmFtc1sic2hvd2xpbmVudW1iZXJzIl0pKSAKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgic2hvd2xpbmVudW1iZXJzIiwgJHBhcmFtc1sic2hvd2xpbmVudW1iZXJzIl0pOwplbHNlCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInNob3dsaW5lbnVtYmVycyIsICcwJyk7CgppZihpc3NldCgkcGFyYW1zWyJ0ZXh0d3JhcHBpbmciXSkpCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInRleHR3cmFwcGluZyIsICRwYXJhbXNbInRleHR3cmFwcGluZyJdKTsKZWxzZQogICR0aGlzLT5TZXRQcmVmZXJlbmNlKCJ0ZXh0d3JhcHBpbmciLCAnMCcpOwogIAovKmlmKGlzc2V0KCRwYXJhbXNbInVzZWF1dG9jb21wbGV0ZSJdKSkKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgidXNlYXV0b2NvbXBsZXRlIiwgJHBhcmFtc1sidXNlYXV0b2NvbXBsZXRlIl0pOwplbHNlCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInVzZWF1dG9jb21wbGV0ZSIsICcwJyk7CiovCgokdGhpcy0+UmVkaXJlY3QoJGlkLCAnZGVmYXVsdGFkbWluJywgJHJldHVybmlkLGFycmF5KCJtb2R1bGVfbWVzc2FnZSI9PiR0aGlzLT5MYW5nKCJzZXR0aW5nc3NhdmVkIiksInRhYiI9PiJzZXR0aW5ncyIpKTsKPz4=]]></data>
	</file>
	<file>
	  <filename>/codemirror.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IC5Db2RlTWlycm9yLWxpbmUtbnVtYmVycyB7CiAgIHdpZHRoOiAyLjJlbTsKICAgY29sb3I6ICNhYWE7CiAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgIHRleHQtYWxpZ246IHJpZ2h0OwogICBwYWRkaW5nLXJpZ2h0OiAuM2VtOwogICBmb250LXNpemU6IDEwcHQ7CiAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgIHBhZGRpbmctdG9wOiAuNGVtOwogfQoK]]></data>
	</file>
	<file>
	  <filename>/CodeMirror.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiNDTVMgLSBDTVMgTWFkZSBTaW1wbGUNCiMoYykyMDA1LTA2IGJ5IE1vcnRlbiBQb3Vsc2VuIChtb3J0ZW5AcG91bHNlbi5vcmcpDQojVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMNCiNUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KI2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIw0KI1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KI2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KI0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiNhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KI0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0ENCg0KDQpjbGFzcyBDb2RlTWlycm9yIGV4dGVuZHMgQ01TTW9kdWxlIHsNCgl2YXIgJG5vZWRpdG9ycz0wOw0KCXZhciAkaGVhZGVyaW5mb3NlbnQ9ZmFsc2U7DQoNCglmdW5jdGlvbiBHZXROYW1lKCkgew0KCQlyZXR1cm4gJ0NvZGVNaXJyb3InOw0KCX0NCg0KCWZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkgew0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KDQoJZnVuY3Rpb24gSGFzQWRtaW4oKSB7DQoJCXJldHVybiB0cnVlOw0KCX0NCg0KCWZ1bmN0aW9uIEdldEhlbHAoKSB7DQoJCXJldHVybiAkdGhpcy0+TGFuZygiaGVscCIpOw0KCX0NCg0KCWZ1bmN0aW9uIEdldEF1dGhvcigpIHsNCgkJcmV0dXJuICdNb3J0ZW4gUG91bHNlbic7DQoJfQ0KDQoJZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKSB7DQoJCXJldHVybiAnJmx0O21vcnRlbkBwb3Vsc2VuLm9yZyZndDsnOw0KCX0NCg0KCWZ1bmN0aW9uIEdldENoYW5nZUxvZygpIHsNCgkJcmV0dXJuICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2NoYW5nZWxvZy50cGwnKTsNCgl9DQoNCglmdW5jdGlvbiBHZXRWZXJzaW9uKCkgew0KCQlyZXR1cm4gJzAuMS4zJzsNCgl9DQoJDQoJZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKSB7DQoJCXJldHVybiAiMS41LjMiOw0KCX0NCg0KICBmdW5jdGlvbiBIYXNDYXBhYmlsaXR5KCRjYXBhYmlsaXR5LCAkcGFyYW1zPWFycmF5KCkpIHsNCiAgICBpZiAoJGNhcGFiaWxpdHk9PSJ3eXNpd3lnIikgcmV0dXJuIHRydWU7DQogICAgaWYgKCRjYXBhYmlsaXR5PT0ic3ludGF4aGlnaGxpZ2h0aW5nIikgcmV0dXJuIHRydWU7DQogICAgcmV0dXJuIGZhbHNlOw0KICB9DQoNCglmdW5jdGlvbiBJc1dZU0lXWUcoKSB7DQoJCXJldHVybiB0cnVlOw0KCX0NCg0KCWZ1bmN0aW9uIElzU3ludGF4SGlnaGxpZ2h0ZXIoKSB7DQoJCXJldHVybiB0cnVlOw0KCX0NCg0KCWZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpIHsNCgkJcmV0dXJuICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJyk7DQoJfQ0KDQoJZnVuY3Rpb24gU3ludGF4UGFnZUZvcm1TdWJtaXQoKSB7DQoJCXJldHVybiAiZm9yICh2YXIgY250RWRpdG9yID0gMDsgY250RWRpdG9yIDwgbnVtQ29kZVByZXNzQXJlYXM7IGNudEVkaXRvcisrKSB7XG4iDQoJCS4gIlx0XHR2YXIgaWQgPSBldmFsKCdjb2RlcHJlc3MnICsgY250RWRpdG9yKTtcbiINCgkJLiAiXHRcdGlkLnRleHRhcmVhLnZhbHVlID0gaWQuZ2V0Q29kZSgpO1xuIg0KCQkuICJcdH1cbiI7DQoJfQ0KCQ0KCWZ1bmN0aW9uIFdZU0lXWUdQYWdlRm9ybVN1Ym1pdCgpIHsNCgkJcmV0dXJuICR0aGlzLT5TeW50YXhQYWdlRm9ybVN1Ym1pdCgpOw0KCX0NCg0KCWZ1bmN0aW9uIFdZU0lXWUdUZXh0QXJlYSgkbmFtZT0ndGV4dGFyZWEnLCRjb2x1bW5zPSc4MCcsJHJvd3M9JzE1JywkZW5jb2Rpbmc9JycsJGNvbnRlbnQ9JycsJHN0eWxlc2hlZXQ9JycpIHsNCgkJJHRoaXMtPnd5c2l3eWdhY3RpdmU9dHJ1ZTsNCgkJcmV0dXJuICR0aGlzLT5TeW50YXhUZXh0YXJlYSgkbmFtZSwiaHRtbCIsJGNvbHVtbnMsJHJvd3MsJGVuY29kaW5nLCRjb250ZW50KTsNCgl9DQoNCglmdW5jdGlvbiBTeW50YXhUZXh0YXJlYSgkbmFtZT0ndGV4dGFyZWEnLCRzeW50YXg9Imh0bWwiLCRjb2x1bW5zPSc4MCcsJHJvd3M9JzE1JywkZW5jb2Rpbmc9JycsJGNvbnRlbnQ9JycpIHsJICANCgkJJHRleHRhcmVhPSIiOw0KCQkkdGhpcy0+c3ludGF4YWN0aXZlPXRydWU7CQ0KCQkvKmlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgidXNlYXV0b2NvbXBsZXRlIiwiMSIpPT0iMCIpICRjbGFzcy49IiBhdXRvY29tcGxldGUtb2ZmIjsNCgkJaWYgKCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJzaG93bGluZW51bWJlcnMiLCIxIik9PSIwIikgJGNsYXNzLj0iIGxpbmVudW1iZXJzLW9mZiI7DQoJCSovDQogICAgICAvKmlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgic2hvd3RvZ2dsZXN5bnRheCIsIjEiKT09IjEiKSB7DQogICAgIA0KCQkJJHRleHRhcmVhLj0iPGJyLz48aW5wdXQgdHlwZT0nY2hlY2tib3gnIGNoZWNrZWQ9JzEnIG9uY2xpY2s9J2NvZGVwcmVzcyIuJHRoaXMtPm5vZWRpdG9ycy4iLnRvZ2dsZUVkaXRvcigpOycgY2hlY2tlZD0nY2hlY2tlZCcgaWQ9J2NvZGVwcmVzc2NoZWNrIi4kdGhpcy0+bm9lZGl0b3JzLiInPjxsYWJlbCBmb3I9J2NvZGVwcmVzc2NoZWNrIi4kdGhpcy0+bm9lZGl0b3JzLiInPiIuJHRoaXMtPkxhbmcoInRvZ2dsZXN5bnRheCIpLiI8L2xhYmVsPiI7DQoJCX0qLw0KICAgIGlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgic2hvd2xpbmVudW1iZXJzIiwiMSIpPT0iMSIpew0KICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdsaW5lbnVtYmVycycsICJ0cnVlIik7DQogICAgfSBlbHNlIHsNCiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbGluZW51bWJlcnMnLCAiZmFsc2UiKTsNCiAgICB9DQogICAgaWYgKCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0ZXh0d3JhcHBpbmciLCIxIik9PSIxIil7DQogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RleHR3cmFwcGluZycsICJ0cnVlIik7DQogICAgfSBlbHNlIHsNCiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndGV4dHdyYXBwaW5nJywgImZhbHNlIik7DQogICAgfQ0KICAgIC8vbGluZU51bWJlcnM6IHRydWUsDQogICAgJGNvbmZpZz0kdGhpcy0+R2V0Q29uZmlnKCk7DQoNCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RleHRhcmVhaWQnLCAiY29kZW1pcnJvcmFyZWEiLiR0aGlzLT5ub2VkaXRvcnMpOw0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndGV4dGFyZWFuYW1lJywgJG5hbWUpOw0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignY29udGVudCcsICRjb250ZW50KTsNCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lkJywgJHRoaXMtPm5vZWRpdG9ycyk7DQogICAgJHBhcnNlcmZpbGU9IiI7ICRjc3NmaWxlPSIiOw0KICAgICRjbWRpcj0kY29uZmlnWyJyb290X3VybCJdLicvbW9kdWxlcy9Db2RlTWlycm9yL2NvZGVtaXJyb3InOw0KICAgIHN3aXRjaCgkc3ludGF4KSB7DQogICAgICANCiAgICAgIGNhc2UgImh0bWwiIDogDQogICAgICAgICRwYXJzZXJmaWxlPScicGFyc2V4bWwuanMiJzsgDQogICAgICAgICRjc3NmaWxlPSciJy4kY21kaXIuJy9jc3MveG1sY29sb3JzLmNzcyInOw0KICAgICAgICBicmVhazsNCiAgICAgIGNhc2UgImNzcyIgOg0KICAgICAgICAkcGFyc2VyZmlsZT0nInBhcnNlY3NzLmpzIic7DQogICAgICAgICRjc3NmaWxlPSciJy4kY21kaXIuJy9jc3MvY3NzY29sb3JzLmNzcyInOw0KICAgICAgICBicmVhazsNCiAgICAgIGNhc2UgInBocCIgOg0KICAgICAgICAkcGFyc2VyZmlsZT0nWyJwYXJzZXhtbC5qcyIsICJwYXJzZWNzcy5qcyIsICJ0b2tlbml6ZWphdmFzY3JpcHQuanMiLCAicGFyc2VqYXZhc2NyaXB0LmpzIiwgInBhcnNlaHRtbG1peGVkLmpzIiwiLi4vY29udHJpYi9waHAvanMvdG9rZW5pemVwaHAuanMiLCAiLi4vY29udHJpYi9waHAvanMvcGFyc2VwaHAuanMiLCAgICAgICAgICAgICAgICAgICAgICIuLi9jb250cmliL3BocC9qcy9wYXJzZXBocGh0bWxtaXhlZC5qcyJdJzsNCiAgICAgICAgJGNzc2ZpbGU9J1siJy4kY21kaXIuJy9jc3MveG1sY29sb3JzLmNzcyIsIicuJGNtZGlyLicvY3NzL2pzY29sb3JzLmNzcyIsIicuJGNtZGlyLicvY3NzL2Nzc2NvbG9ycy5jc3MiLCInLiRjbWRpci4nL2NvbnRyaWIvcGhwL2Nzcy9waHBjb2xvcnMuY3NzIl0nOw0KICAgICAgICBicmVhazsNCiAgICB9DQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwYXJzZXJmaWxlJywgJHBhcnNlcmZpbGUpOw0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignY3NzZmlsZScsICRjc3NmaWxlKTsNCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Jvb3RfdXJsJywgJGNvbmZpZ1sicm9vdF91cmwiXSk7DQoNCiAgICAkdGV4dGFyZWE9JHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnY29kZW1pcnJvcmFyZWEudHBsJyk7DQoNCgkJJHRoaXMtPm5vZWRpdG9ycysrOw0KDQoJCXJldHVybiAkdGV4dGFyZWE7DQoJfQ0KDQoJZnVuY3Rpb24gV1lTSVdZR0dlbmVyYXRlSGVhZGVyKCRodG1scmVzdWx0PScnKSB7DQoJCXJldHVybiAkdGhpcy0+U3ludGF4R2VuZXJhdGVIZWFkZXIoKTsNCgl9DQoNCglmdW5jdGlvbiBTeW50YXhHZW5lcmF0ZUhlYWRlcigkaHRtbHJlc3VsdD0nJykgew0KCQlpZiAoJHRoaXMtPmhlYWRlcmluZm9zZW50KSByZXR1cm4gIiI7DQoJCWlmICgkdGhpcy0+bm9lZGl0b3JzPT0wKSByZXR1cm4gJyc7DQoJCS8vJEdMT0JBTFNbImNvbmZpZyJdWyJyb290X3BhdGgiXS4NCg0KCQkkc2NyaXB0cGF0aD0kR0xPQkFMU1siY29uZmlnIl1bInJvb3RfdXJsIl0uIi9tb2R1bGVzL0NvZGVNaXJyb3IvY29kZW1pcnJvci9qcy9jb2RlbWlycm9yLmpzIjsNCgkJJGhlYWRlcj0iIjsNCgkJJGhlYWRlci49JzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInLiRzY3JpcHRwYXRoLiciPjwvc2NyaXB0PlxuJzsNCiAgICAkaGVhZGVyLj0nPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJy4kR0xPQkFMU1siY29uZmlnIl1bInJvb3RfdXJsIl0uJy9tb2R1bGVzL0NvZGVNaXJyb3IvY29kZW1pcnJvci5jc3MiLz4nOw0KCQkkdGhpcy0+aGVhZGVyaW5mb3NlbnQ9dHJ1ZTsNCgkJcmV0dXJuICRoZWFkZXI7DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/bigtest.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogSmF2YVNjcmlwdCBkZW1vbnN0cmF0aW9uPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNzcy9kb2NzLmNzcyIvPgogIDwvaGVhZD4KICA8Ym9keSBzdHlsZT0icGFkZGluZzogMjBweDsiPgoKPHA+VGhpcyBwYWdlIGRlbW9uc3RyYXRlcyA8YSBocmVmPSJpbmRleC5odG1sIj5Db2RlTWlycm9yPC9hPidzCkphdmFTY3JpcHQgcGFyc2VyLiBOb3RlIHRoYXQgdGhlIHVnbHkgYnV0dG9ucyBhdCB0aGUgdG9wIGFyZSBub3QgYXJlCm5vdCBwYXJ0IG9mIENvZGVNaXJyb3IgcHJvcGVyIC0tIHRoZXkgZGVtb25zdHJhdGUgdGhlIHdheSBpdCBjYW4gYmUKZW1iZWRkZWQgaW4gYSB3ZWItYXBwbGljYXRpb24uPC9wPgoKPGRpdiBjbGFzcz0iYm9yZGVyIj4KPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMjAiIHJvd3M9IjMwIj4KLyogVGhlIEVkaXRvciBvYmplY3QgbWFuYWdlcyB0aGUgY29udGVudCBvZiB0aGUgZWRpdGFibGUgZnJhbWUuIEl0CiAqIGNhdGNoZXMgZXZlbnRzLCBjb2xvdXJzIG5vZGVzLCBhbmQgaW5kZW50cyBsaW5lcy4gVGhpcyBmaWxlIGFsc28KICogaG9sZHMgc29tZSBmdW5jdGlvbnMgZm9yIHRyYW5zZm9ybWluZyBhcmJpdHJhcnkgRE9NIHN0cnVjdHVyZXMgaW50bwogKiBwbGFpbiBzZXF1ZW5jZXMgb2YgJmx0O3NwYW4+IGFuZCAmbHQ7YnI+IGVsZW1lbnRzCiAqLwoKLy8gTWFrZSBzdXJlIGEgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gdHdvIGNvbnNlY3V0aXZlICdjb2xsYXBzZWFibGUnCi8vIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KZnVuY3Rpb24gbWFrZVdoaXRlU3BhY2UobikgewogIHZhciBidWZmZXIgPSBbXSwgbmIgPSB0cnVlOwogIGZvciAoOyBuID4gMDsgbi0tKSB7CiAgICBidWZmZXIucHVzaCgobmIgfHwgbiA9PSAxKSA/IG5ic3AgOiAiICIpOwogICAgbmIgPSAhbmI7CiAgfQogIHJldHVybiBidWZmZXIuam9pbigiIik7Cn0KCi8vIENyZWF0ZSBhIHNldCBvZiB3aGl0ZS1zcGFjZSBjaGFyYWN0ZXJzIHRoYXQgd2lsbCBub3QgYmUgY29sbGFwc2VkCi8vIGJ5IHRoZSBicm93c2VyLCBidXQgd2lsbCBub3QgYnJlYWsgdGV4dC13cmFwcGluZyBlaXRoZXIuCmZ1bmN0aW9uIGZpeFNwYWNlcyhzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmNoYXJBdCgwKSA9PSAiICIpIHN0cmluZyA9IG5ic3AgKyBzdHJpbmcuc2xpY2UoMSk7CiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bXHQgXHUwMGEwXXsyLH0vZywgZnVuY3Rpb24ocykge3JldHVybiBtYWtlV2hpdGVTcGFjZShzLmxlbmd0aCk7fSk7Cn0KCmZ1bmN0aW9uIGNsZWFuVGV4dCh0ZXh0KSB7CiAgcmV0dXJuIHRleHQucmVwbGFjZSgvXHUwMGEwL2csICIgIikucmVwbGFjZSgvXHUyMDBiL2csICIiKTsKfQoKLy8gQ3JlYXRlIGEgU1BBTiBub2RlIHdpdGggdGhlIGV4cGVjdGVkIHByb3BlcnRpZXMgZm9yIGRvY3VtZW50IHBhcnQKLy8gc3BhbnMuCmZ1bmN0aW9uIG1ha2VQYXJ0U3Bhbih2YWx1ZSwgZG9jKSB7CiAgdmFyIHRleHQgPSB2YWx1ZTsKICBpZiAodmFsdWUubm9kZVR5cGUgPT0gMykgdGV4dCA9IHZhbHVlLm5vZGVWYWx1ZTsKICBlbHNlIHZhbHVlID0gZG9jLmNyZWF0ZVRleHROb2RlKHRleHQpOwoKICB2YXIgc3BhbiA9IGRvYy5jcmVhdGVFbGVtZW50KCJTUEFOIik7CiAgc3Bhbi5pc1BhcnQgPSB0cnVlOwogIHNwYW4uYXBwZW5kQ2hpbGQodmFsdWUpOwogIHNwYW4uY3VycmVudFRleHQgPSB0ZXh0OwogIHJldHVybiBzcGFuOwp9CgovLyBPbiB3ZWJraXQsIHdoZW4gdGhlIGxhc3QgQlIgb2YgdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUgdGV4dAovLyBiZWhpbmQgaXQsIHRoZSBjdXJzb3IgY2FuIG5vdCBiZSBwdXQgb24gdGhlIGxpbmUgYWZ0ZXIgaXQuIFRoaXMKLy8gbWFrZXMgcHJlc3NpbmcgZW50ZXIgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQgb2NjYXNpb25hbGx5IGRvCi8vIG5vdGhpbmcgKG9yIGF0IGxlYXN0IHNlZW0gdG8gZG8gbm90aGluZykuIFRvIHdvcmsgYXJvdW5kIGl0LCB0aGlzCi8vIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhlIGRvY3VtZW50IGVuZHMgd2l0aCBhIHNwYW4gY29udGFpbmluZyBhCi8vIHplcm8td2lkdGggc3BhY2UgY2hhcmFjdGVyLiBUaGUgdHJhdmVyc2VET00gaXRlcmF0b3IgZmlsdGVycyBzdWNoCi8vIGNoYXJhY3RlciBvdXQgYWdhaW4sIHNvIHRoYXQgdGhlIHBhcnNlcnMgd29uJ3Qgc2VlIHRoZW0uIFRoaXMKLy8gZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYSBmZXcgc3RyYXRlZ2ljIHBsYWNlcyB0byBtYWtlIHN1cmUgdGhlCi8vIHp3c3AgaXMgcmVzdG9yZWQgYWZ0ZXIgdGhlIGhpZ2hsaWdodGluZyBwcm9jZXNzIGVhdHMgaXQuCnZhciB3ZWJraXRMYXN0TGluZUhhY2sgPSB3ZWJraXQgPwogIGZ1bmN0aW9uKGNvbnRhaW5lcikgewogICAgdmFyIGxhc3QgPSBjb250YWluZXIubGFzdENoaWxkOwogICAgaWYgKCFsYXN0IHx8ICFsYXN0LmlzUGFydCB8fCBsYXN0LnRleHRDb250ZW50ICE9ICJcdTIwMGIiKQogICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobWFrZVBhcnRTcGFuKCJcdTIwMGIiLCBjb250YWluZXIub3duZXJEb2N1bWVudCkpOwogIH0gOiBmdW5jdGlvbigpIHt9OwoKdmFyIEVkaXRvciA9IChmdW5jdGlvbigpewogIC8vIFRoZSBIVE1MIGVsZW1lbnRzIHdob3NlIGNvbnRlbnQgc2hvdWxkIGJlIHN1ZmZpeGVkIGJ5IGEgbmV3bGluZQogIC8vIHdoZW4gY29udmVydGluZyB0aGVtIHRvIGZsYXQgdGV4dC4KICB2YXIgbmV3bGluZUVsZW1lbnRzID0geyJQIjogdHJ1ZSwgIkRJViI6IHRydWUsICJMSSI6IHRydWV9OwoKICBmdW5jdGlvbiBhc0VkaXRvckxpbmVzKHN0cmluZykgewogICAgcmV0dXJuIGZpeFNwYWNlcyhzdHJpbmcucmVwbGFjZSgvXHQvZywgIiAgIikucmVwbGFjZSgvXHUwMGEwL2csICIgIikpLnJlcGxhY2UoL1xyXG4/L2csICJcbiIpLnNwbGl0KCJcbiIpOwogIH0KCiAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciB0cmF2ZXJzZURPTS4gRmxhdHRlbnMgYW4gYXJiaXRyYXJ5IERPTSBub2RlCiAgLy8gaW50byBhbiBhcnJheSBvZiB0ZXh0bm9kZXMgYW5kICZsdDticj4gdGFncy4KICBmdW5jdGlvbiBzaW1wbGlmeURPTShyb290KSB7CiAgICB2YXIgZG9jID0gcm9vdC5vd25lckRvY3VtZW50OwogICAgdmFyIHJlc3VsdCA9IFtdOwogICAgdmFyIGxlYXZpbmcgPSB0cnVlOwoKICAgIGZ1bmN0aW9uIHNpbXBsaWZ5Tm9kZShub2RlKSB7CiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHsKICAgICAgICB2YXIgdGV4dCA9IG5vZGUubm9kZVZhbHVlID0gZml4U3BhY2VzKG5vZGUubm9kZVZhbHVlLnJlcGxhY2UoL1tcclx1MjAwYl0vZywgIiIpLnJlcGxhY2UoL1xuL2csICIgIikpOwogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCkgbGVhdmluZyA9IGZhbHNlOwogICAgICAgIHJlc3VsdC5wdXNoKG5vZGUpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKG5vZGUubm9kZU5hbWUgPT0gIkJSIiAmYW1wOyZhbXA7IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPT0gMCkgewogICAgICAgIGxlYXZpbmcgPSB0cnVlOwogICAgICAgIHJlc3VsdC5wdXNoKG5vZGUpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGZvckVhY2gobm9kZS5jaGlsZE5vZGVzLCBzaW1wbGlmeU5vZGUpOwogICAgICAgIGlmICghbGVhdmluZyAmYW1wOyZhbXA7IG5ld2xpbmVFbGVtZW50cy5oYXNPd25Qcm9wZXJ0eShub2RlLm5vZGVOYW1lKSkgewogICAgICAgICAgbGVhdmluZyA9IHRydWU7CiAgICAgICAgICByZXN1bHQucHVzaChkb2MuY3JlYXRlRWxlbWVudCgiQlIiKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgc2ltcGxpZnlOb2RlKHJvb3QpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIENyZWF0ZXMgYSBNb2NoaUtpdC1zdHlsZSBpdGVyYXRvciB0aGF0IGdvZXMgb3ZlciBhIHNlcmllcyBvZiBET00KICAvLyBub2Rlcy4gVGhlIHZhbHVlcyBpdCB5aWVsZHMgYXJlIHN0cmluZ3MsIHRoZSB0ZXh0dWFsIGNvbnRlbnQgb2YKICAvLyB0aGUgbm9kZXMuIEl0IG1ha2VzIHN1cmUgdGhhdCBhbGwgbm9kZXMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUKICAvLyBvbmUgd2hvc2UgdGV4dCBpcyBiZWluZyB5aWVsZGVkIGhhdmUgYmVlbiAnbm9ybWFsaXplZCcgdG8gYmUganVzdAogIC8vICZsdDtzcGFuPiBhbmQgJmx0O2JyPiBlbGVtZW50cy4KICAvLyBTZWUgdGhlIHN0b3J5Lmh0bWwgZmlsZSBmb3Igc29tZSBzaG9ydCByZW1hcmtzIGFib3V0IHRoZSB1c2Ugb2YKICAvLyBjb250aW51YXRpb24tcGFzc2luZyBzdHlsZSBpbiB0aGlzIGl0ZXJhdG9yLgogIGZ1bmN0aW9uIHRyYXZlcnNlRE9NKHN0YXJ0KXsKICAgIGZ1bmN0aW9uIHlpZWxkKHZhbHVlLCBjKXtjYyA9IGM7IHJldHVybiB2YWx1ZTt9CiAgICBmdW5jdGlvbiBwdXNoKGZ1biwgYXJnLCBjKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZnVuKGFyZywgYyk7fTt9CiAgICBmdW5jdGlvbiBzdG9wKCl7Y2MgPSBzdG9wOyB0aHJvdyBTdG9wSXRlcmF0aW9uO307CiAgICB2YXIgY2MgPSBwdXNoKHNjYW5Ob2RlLCBzdGFydCwgc3RvcCk7CiAgICB2YXIgb3duZXIgPSBzdGFydC5vd25lckRvY3VtZW50OwogICAgdmFyIG5vZGVRdWV1ZSA9IFtdOwoKICAgIC8vIENyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5zZXJ0IG5vZGVzIGFmdGVyIHRoZQogICAgLy8gb25lIGdpdmVuIGFzIGFyZ3VtZW50LgogICAgZnVuY3Rpb24gcG9pbnRBdChub2RlKXsKICAgICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTsKICAgICAgdmFyIG5leHQgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICByZXR1cm4gZnVuY3Rpb24obmV3bm9kZSkgewogICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3bm9kZSwgbmV4dCk7CiAgICAgIH07CiAgICB9CiAgICB2YXIgcG9pbnQgPSBudWxsOwoKICAgIC8vIEluc2VydCBhIG5vcm1hbGl6ZWQgbm9kZSBhdCB0aGUgY3VycmVudCBwb2ludC4gSWYgaXQgaXMgYSB0ZXh0CiAgICAvLyBub2RlLCB3cmFwIGl0IGluIGEgJmx0O3NwYW4+LCBhbmQgZ2l2ZSB0aGF0IHNwYW4gYSBjdXJyZW50VGV4dAogICAgLy8gcHJvcGVydHkgLS0gdGhpcyBpcyB1c2VkIHRvIGNhY2hlIHRoZSBub2RlVmFsdWUsIGJlY2F1c2UKICAgIC8vIGRpcmVjdGx5IGFjY2Vzc2luZyBub2RlVmFsdWUgaXMgaG9ycmlibHkgc2xvdyBvbiBzb21lIGJyb3dzZXJzLgogICAgLy8gVGhlIGRpcnR5IHByb3BlcnR5IGlzIHVzZWQgYnkgdGhlIGhpZ2hsaWdodGVyIHRvIGRldGVybWluZQogICAgLy8gd2hpY2ggcGFydHMgb2YgdGhlIGRvY3VtZW50IGhhdmUgdG8gYmUgcmUtaGlnaGxpZ2h0ZWQuCiAgICBmdW5jdGlvbiBpbnNlcnRQYXJ0KHBhcnQpewogICAgICB2YXIgdGV4dCA9ICJcbiI7CiAgICAgIGlmIChwYXJ0Lm5vZGVUeXBlID09IDMpIHsKICAgICAgICBzZWxlY3Quc25hcHNob3RDaGFuZ2VkKCk7CiAgICAgICAgcGFydCA9IG1ha2VQYXJ0U3BhbihwYXJ0LCBvd25lcik7CiAgICAgICAgdGV4dCA9IHBhcnQuY3VycmVudFRleHQ7CiAgICAgIH0KICAgICAgcGFydC5kaXJ0eSA9IHRydWU7CiAgICAgIG5vZGVRdWV1ZS5wdXNoKHBhcnQpOwogICAgICBwb2ludChwYXJ0KTsKICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CgogICAgLy8gRXh0cmFjdCB0aGUgdGV4dCBhbmQgbmV3bGluZXMgZnJvbSBhIERPTSBub2RlLCBpbnNlcnQgdGhlbSBpbnRvCiAgICAvLyB0aGUgZG9jdW1lbnQsIGFuZCB5aWVsZCB0aGUgdGV4dHVhbCBjb250ZW50LiBVc2VkIHRvIHJlcGxhY2UKICAgIC8vIG5vbi1ub3JtYWxpemVkIG5vZGVzLgogICAgZnVuY3Rpb24gd3JpdGVOb2RlKG5vZGUsIGMpewogICAgICB2YXIgdG9ZaWVsZCA9IFtdOwogICAgICBmb3JFYWNoKHNpbXBsaWZ5RE9NKG5vZGUpLCBmdW5jdGlvbihwYXJ0KSB7CiAgICAgICAgdG9ZaWVsZC5wdXNoKGluc2VydFBhcnQocGFydCkpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHlpZWxkKHRvWWllbGQuam9pbigiIiksIGMpOwogICAgfQoKICAgIC8vIENoZWNrIHdoZXRoZXIgYSBub2RlIGlzIGEgbm9ybWFsaXplZCAmbHQ7c3Bhbj4gZWxlbWVudC4KICAgIGZ1bmN0aW9uIHBhcnROb2RlKG5vZGUpewogICAgICBpZiAobm9kZS5pc1BhcnQgJmFtcDsmYW1wOyBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID09IDEgJmFtcDsmYW1wOyBub2RlLmZpcnN0Q2hpbGQubm9kZVR5cGUgPT0gMykgewogICAgICAgIG5vZGUuY3VycmVudFRleHQgPSBub2RlLmZpcnN0Q2hpbGQubm9kZVZhbHVlOwogICAgICAgIHJldHVybiAhL1tcblx0XHJdLy50ZXN0KG5vZGUuY3VycmVudFRleHQpOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBIYW5kbGUgYSBub2RlLiBBZGQgaXRzIHN1Y2Nlc3NvciB0byB0aGUgY29udGludWF0aW9uIGlmIHRoZXJlCiAgICAvLyBpcyBvbmUsIGZpbmQgb3V0IHdoZXRoZXIgdGhlIG5vZGUgaXMgbm9ybWFsaXplZC4gSWYgaXQgaXMsCiAgICAvLyB5aWVsZCBpdHMgY29udGVudCwgb3RoZXJ3aXNlLCBub3JtYWxpemUgaXQgKHdyaXRlTm9kZSB3aWxsIHRha2UKICAgIC8vIGNhcmUgb2YgeWllbGRpbmcpLgogICAgZnVuY3Rpb24gc2Nhbk5vZGUobm9kZSwgYyl7CiAgICAgIGlmIChub2RlLm5leHRTaWJsaW5nKQogICAgICAgIGMgPSBwdXNoKHNjYW5Ob2RlLCBub2RlLm5leHRTaWJsaW5nLCBjKTsKCiAgICAgIGlmIChwYXJ0Tm9kZShub2RlKSl7CiAgICAgICAgbm9kZVF1ZXVlLnB1c2gobm9kZSk7CiAgICAgICAgcmV0dXJuIHlpZWxkKG5vZGUuY3VycmVudFRleHQsIGMpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKG5vZGUubm9kZU5hbWUgPT0gIkJSIikgewogICAgICAgIG5vZGVRdWV1ZS5wdXNoKG5vZGUpOwogICAgICAgIHJldHVybiB5aWVsZCgiXG4iLCBjKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBwb2ludCA9IHBvaW50QXQobm9kZSk7CiAgICAgICAgcmVtb3ZlRWxlbWVudChub2RlKTsKICAgICAgICByZXR1cm4gd3JpdGVOb2RlKG5vZGUsIGMpOwogICAgICB9CiAgICB9CgogICAgLy8gTW9jaGlLaXQgaXRlcmF0b3JzIGFyZSBvYmplY3RzIHdpdGggYSBuZXh0IGZ1bmN0aW9uIHRoYXQKICAgIC8vIHJldHVybnMgdGhlIG5leHQgdmFsdWUgb3IgdGhyb3dzIFN0b3BJdGVyYXRpb24gd2hlbiB0aGVyZSBhcmUKICAgIC8vIG5vIG1vcmUgdmFsdWVzLgogICAgcmV0dXJuIHtuZXh0OiBmdW5jdGlvbigpe3JldHVybiBjYygpO30sIG5vZGVzOiBub2RlUXVldWV9OwogIH0KCiAgLy8gRGV0ZXJtaW5lIHRoZSB0ZXh0IHNpemUgb2YgYSBwcm9jZXNzZWQgbm9kZS4KICBmdW5jdGlvbiBub2RlU2l6ZShub2RlKSB7CiAgICBpZiAobm9kZS5ub2RlTmFtZSA9PSAiQlIiKQogICAgICByZXR1cm4gMTsKICAgIGVsc2UKICAgICAgcmV0dXJuIG5vZGUuY3VycmVudFRleHQubGVuZ3RoOwogIH0KCiAgLy8gU2VhcmNoIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0b3AtbGV2ZWwgbm9kZXMgdW50aWwgdGhlIG5leHQgQlIgb3IKICAvLyB0aGUgc3RhcnQgb2YgdGhlIGZyYW1lLgogIGZ1bmN0aW9uIHN0YXJ0T2ZMaW5lKG5vZGUpIHsKICAgIHdoaWxlIChub2RlICZhbXA7JmFtcDsgbm9kZS5ub2RlTmFtZSAhPSAiQlIiKSBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7CiAgICByZXR1cm4gbm9kZTsKICB9CiAgZnVuY3Rpb24gZW5kT2ZMaW5lKG5vZGUsIGNvbnRhaW5lcikgewogICAgaWYgKCFub2RlKSBub2RlID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICBlbHNlIGlmIChub2RlLm5vZGVOYW1lID09ICJCUiIpIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwoKICAgIHdoaWxlIChub2RlICZhbXA7JmFtcDsgbm9kZS5ub2RlTmFtZSAhPSAiQlIiKSBub2RlID0gbm9kZS5uZXh0U2libGluZzsKICAgIHJldHVybiBub2RlOwogIH0KCiAgLy8gUmVwbGFjZSBhbGwgRE9NIG5vZGVzIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB3aXRoIG5ldyBvbmVzLgogIC8vIE5lZWRlZCB0byBwcmV2ZW50IGlzc3VlcyBpbiBJRSB3aGVyZSB0aGUgb2xkIERPTSBub2RlcyBjYW4gYmUKICAvLyBwYXN0ZWQgYmFjayBpbnRvIHRoZSBkb2N1bWVudCwgc3RpbGwgaG9sZGluZyB0aGVpciBvbGQgdW5kbwogIC8vIGluZm9ybWF0aW9uLgogIGZ1bmN0aW9uIHNjcnViUGFzdGVkKGNvbnRhaW5lciwgc3RhcnQsIHN0YXJ0MikgewogICAgdmFyIGVuZCA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKGNvbnRhaW5lciwgdHJ1ZSksCiAgICAgICAgZG9jID0gY29udGFpbmVyLm93bmVyRG9jdW1lbnQ7CiAgICBpZiAoc3RhcnQgIT0gbnVsbCAmYW1wOyZhbXA7IHN0YXJ0LnBhcmVudE5vZGUgIT0gY29udGFpbmVyKSBzdGFydCA9IHN0YXJ0MjsKICAgIGlmIChzdGFydCA9PT0gZmFsc2UpIHN0YXJ0ID0gbnVsbDsKICAgIGlmIChzdGFydCA9PSBlbmQgfHwgIWVuZCB8fCAhY29udGFpbmVyLmZpcnN0Q2hpbGQpIHJldHVybjsKCiAgICB2YXIgY2xlYXIgPSB0cmF2ZXJzZURPTShzdGFydCA/IHN0YXJ0Lm5leHRTaWJsaW5nIDogY29udGFpbmVyLmZpcnN0Q2hpbGQpOwogICAgd2hpbGUgKGVuZC5wYXJlbnROb2RlID09IGNvbnRhaW5lcikgdHJ5e2NsZWFyLm5leHQoKTt9Y2F0Y2goZSl7YnJlYWs7fQogICAgZm9yRWFjaChjbGVhci5ub2RlcywgZnVuY3Rpb24obm9kZSkgewogICAgICB2YXIgbmV3Tm9kZSA9IG5vZGUubm9kZU5hbWUgPT0gIkJSIiA/IGRvYy5jcmVhdGVFbGVtZW50KCJCUiIpIDogbWFrZVBhcnRTcGFuKG5vZGUuY3VycmVudFRleHQsIGRvYyk7CiAgICAgIGNvbnRhaW5lci5yZXBsYWNlQ2hpbGQobmV3Tm9kZSwgbm9kZSk7CiAgICB9KTsKICB9CgogIC8vIENsaWVudCBpbnRlcmZhY2UgZm9yIHNlYXJjaGluZyB0aGUgY29udGVudCBvZiB0aGUgZWRpdG9yLiBDcmVhdGUKICAvLyB0aGVzZSBieSBjYWxsaW5nIENvZGVNaXJyb3IuZ2V0U2VhcmNoQ3Vyc29yLiBUbyB1c2UsIGNhbGwKICAvLyBmaW5kTmV4dCBvbiB0aGUgcmVzdWx0aW5nIG9iamVjdCAtLSB0aGlzIHJldHVybnMgYSBib29sZWFuCiAgLy8gaW5kaWNhdGluZyB3aGV0aGVyIGFueXRoaW5nIHdhcyBmb3VuZCwgYW5kIGNhbiBiZSBjYWxsZWQgYWdhaW4gdG8KICAvLyBza2lwIHRvIHRoZSBuZXh0IGZpbmQuIFVzZSB0aGUgc2VsZWN0IGFuZCByZXBsYWNlIG1ldGhvZHMgdG8KICAvLyBhY3R1YWxseSBkbyBzb21ldGhpbmcgd2l0aCB0aGUgZm91bmQgbG9jYXRpb25zLgogIGZ1bmN0aW9uIFNlYXJjaEN1cnNvcihlZGl0b3IsIHN0cmluZywgZnJvbUN1cnNvcikgewogICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7CiAgICB0aGlzLmhpc3RvcnkgPSBlZGl0b3IuaGlzdG9yeTsKICAgIHRoaXMuaGlzdG9yeS5jb21taXQoKTsKCiAgICAvLyBBcmUgd2UgY3VycmVudGx5IGF0IGFuIG9jY3VycmVuY2Ugb2YgdGhlIHNlYXJjaCBzdHJpbmc/CiAgICB0aGlzLmF0T2NjdXJyZW5jZSA9IGZhbHNlOwogICAgLy8gVGhlIG9iamVjdCBzdG9yZXMgYSBzZXQgb2Ygbm9kZXMgY29taW5nIGFmdGVyIGl0cyBjdXJyZW50CiAgICAvLyBwb3NpdGlvbiwgc28gdGhhdCB3aGVuIHRoZSBjdXJyZW50IHBvaW50IGlzIHRha2VuIG91dCBvZiB0aGUKICAgIC8vIERPTSB0cmVlLCB3ZSBjYW4gc3RpbGwgdHJ5IHRvIGNvbnRpbnVlLgogICAgdGhpcy5mYWxsYmFja1NpemUgPSAxNTsKICAgIHZhciBjdXJzb3I7CiAgICAvLyBTdGFydCBmcm9tIHRoZSBjdXJzb3Igd2hlbiBzcGVjaWZpZWQgYW5kIGEgY3Vyc29yIGNhbiBiZSBmb3VuZC4KICAgIGlmIChmcm9tQ3Vyc29yICZhbXA7JmFtcDsgKGN1cnNvciA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5lZGl0b3IuY29udGFpbmVyKSkpIHsKICAgICAgdGhpcy5saW5lID0gY3Vyc29yLm5vZGU7CiAgICAgIHRoaXMub2Zmc2V0ID0gY3Vyc29yLm9mZnNldDsKICAgIH0KICAgIGVsc2UgewogICAgICB0aGlzLmxpbmUgPSBudWxsOwogICAgICB0aGlzLm9mZnNldCA9IDA7CiAgICB9CiAgICB0aGlzLnZhbGlkID0gISFzdHJpbmc7CgogICAgLy8gQ3JlYXRlIGEgbWF0Y2hlciBmdW5jdGlvbiBiYXNlZCBvbiB0aGUga2luZCBvZiBzdHJpbmcgd2UgaGF2ZS4KICAgIHZhciB0YXJnZXQgPSBzdHJpbmcuc3BsaXQoIlxuIiksIHNlbGYgPSB0aGlzOzsKICAgIHRoaXMubWF0Y2hlcyA9ICh0YXJnZXQubGVuZ3RoID09IDEpID8KICAgICAgLy8gRm9yIG9uZS1saW5lIHN0cmluZ3MsIHNlYXJjaGluZyBjYW4gYmUgZG9uZSBzaW1wbHkgYnkgY2FsbGluZwogICAgICAvLyBpbmRleE9mIG9uIHRoZSBjdXJyZW50IGxpbmUuCiAgICAgIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBtYXRjaCA9IGNsZWFuVGV4dChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKHNlbGYubGluZSkuc2xpY2Uoc2VsZi5vZmZzZXQpKS5pbmRleE9mKHN0cmluZyk7CiAgICAgICAgaWYgKG1hdGNoID4gLTEpCiAgICAgICAgICByZXR1cm4ge2Zyb206IHtub2RlOiBzZWxmLmxpbmUsIG9mZnNldDogc2VsZi5vZmZzZXQgKyBtYXRjaH0sCiAgICAgICAgICAgICAgICAgIHRvOiB7bm9kZTogc2VsZi5saW5lLCBvZmZzZXQ6IHNlbGYub2Zmc2V0ICsgbWF0Y2ggKyBzdHJpbmcubGVuZ3RofX07CiAgICAgIH0gOgogICAgICAvLyBNdWx0aS1saW5lIHN0cmluZ3MgcmVxdWlyZSBpbnRlcm5hbCBpdGVyYXRpb24gb3ZlciBsaW5lcywgYW5kCiAgICAgIC8vIHNvbWUgY2x1bmt5IGNoZWNrcyB0byBtYWtlIHN1cmUgdGhlIGZpcnN0IG1hdGNoIGVuZHMgYXQgdGhlCiAgICAgIC8vIGVuZCBvZiB0aGUgbGluZSBhbmQgdGhlIGxhc3QgbWF0Y2ggc3RhcnRzIGF0IHRoZSBzdGFydC4KICAgICAgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGZpcnN0TGluZSA9IGNsZWFuVGV4dChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKHNlbGYubGluZSkuc2xpY2Uoc2VsZi5vZmZzZXQpKTsKICAgICAgICB2YXIgbWF0Y2ggPSBmaXJzdExpbmUubGFzdEluZGV4T2YodGFyZ2V0WzBdKTsKICAgICAgICBpZiAobWF0Y2ggPT0gLTEgfHwgbWF0Y2ggIT0gZmlyc3RMaW5lLmxlbmd0aCAtIHRhcmdldFswXS5sZW5ndGgpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgdmFyIHN0YXJ0T2Zmc2V0ID0gc2VsZi5vZmZzZXQgKyBtYXRjaDsKCiAgICAgICAgdmFyIGxpbmUgPSBzZWxmLmhpc3Rvcnkubm9kZUFmdGVyKHNlbGYubGluZSk7CiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgJmx0OyB0YXJnZXQubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICBpZiAoY2xlYW5UZXh0KHNlbGYuaGlzdG9yeS50ZXh0QWZ0ZXIobGluZSkpICE9IHRhcmdldFtpXSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgbGluZSA9IHNlbGYuaGlzdG9yeS5ub2RlQWZ0ZXIobGluZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoY2xlYW5UZXh0KHNlbGYuaGlzdG9yeS50ZXh0QWZ0ZXIobGluZSkpLmluZGV4T2YodGFyZ2V0W3RhcmdldC5sZW5ndGggLSAxXSkgIT0gMCkKICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgcmV0dXJuIHtmcm9tOiB7bm9kZTogc2VsZi5saW5lLCBvZmZzZXQ6IHN0YXJ0T2Zmc2V0fSwKICAgICAgICAgICAgICAgIHRvOiB7bm9kZTogbGluZSwgb2Zmc2V0OiB0YXJnZXRbdGFyZ2V0Lmxlbmd0aCAtIDFdLmxlbmd0aH19OwogICAgICB9OwogIH0KCiAgU2VhcmNoQ3Vyc29yLnByb3RvdHlwZSA9IHsKICAgIGZpbmROZXh0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCF0aGlzLnZhbGlkKSByZXR1cm4gZmFsc2U7CiAgICAgIHRoaXMuYXRPY2N1cnJlbmNlID0gZmFsc2U7CiAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgIC8vIEdvIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudCBpZiB0aGUgY3VycmVudCBsaW5lIGlzCiAgICAgIC8vIG5vIGxvbmdlciBpbiB0aGUgRE9NIHRyZWUuCiAgICAgIGlmICh0aGlzLmxpbmUgJmFtcDsmYW1wOyAhdGhpcy5saW5lLnBhcmVudE5vZGUpIHsKICAgICAgICB0aGlzLmxpbmUgPSBudWxsOwogICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKICAgICAgfQoKICAgICAgLy8gU2V0IHRoZSBjdXJzb3IncyBwb3NpdGlvbiBvbmUgY2hhcmFjdGVyIGFmdGVyIHRoZSBnaXZlbgogICAgICAvLyBwb3NpdGlvbi4KICAgICAgZnVuY3Rpb24gc2F2ZUFmdGVyKHBvcykgewogICAgICAgIGlmIChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKHBvcy5ub2RlKS5sZW5ndGggJmx0OyBwb3Mub2Zmc2V0KSB7CiAgICAgICAgICBzZWxmLmxpbmUgPSBwb3Mubm9kZTsKICAgICAgICAgIHNlbGYub2Zmc2V0ID0gcG9zLm9mZnNldCArIDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgc2VsZi5saW5lID0gc2VsZi5oaXN0b3J5Lm5vZGVBZnRlcihwb3Mubm9kZSk7CiAgICAgICAgICBzZWxmLm9mZnNldCA9IDA7CiAgICAgICAgfQogICAgICB9CgogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIHZhciBtYXRjaCA9IHRoaXMubWF0Y2hlcygpOwogICAgICAgIC8vIEZvdW5kIHRoZSBzZWFyY2ggc3RyaW5nLgogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgdGhpcy5hdE9jY3VycmVuY2UgPSBtYXRjaDsKICAgICAgICAgIHNhdmVBZnRlcihtYXRjaC5mcm9tKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICB0aGlzLmxpbmUgPSB0aGlzLmhpc3Rvcnkubm9kZUFmdGVyKHRoaXMubGluZSk7CiAgICAgICAgdGhpcy5vZmZzZXQgPSAwOwogICAgICAgIC8vIEVuZCBvZiBkb2N1bWVudC4KICAgICAgICBpZiAoIXRoaXMubGluZSkgewogICAgICAgICAgdGhpcy52YWxpZCA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICBzZWxlY3Q6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5hdE9jY3VycmVuY2UpIHsKICAgICAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zKHRoaXMuZWRpdG9yLmNvbnRhaW5lciwgdGhpcy5hdE9jY3VycmVuY2UuZnJvbSwgdGhpcy5hdE9jY3VycmVuY2UudG8pOwogICAgICAgIHNlbGVjdC5zY3JvbGxUb0N1cnNvcih0aGlzLmVkaXRvci5jb250YWluZXIpOwogICAgICB9CiAgICB9LAoKICAgIHJlcGxhY2U6IGZ1bmN0aW9uKHN0cmluZykgewogICAgICBpZiAodGhpcy5hdE9jY3VycmVuY2UpIHsKICAgICAgICB2YXIgZW5kID0gdGhpcy5lZGl0b3IucmVwbGFjZVJhbmdlKHRoaXMuYXRPY2N1cnJlbmNlLmZyb20sIHRoaXMuYXRPY2N1cnJlbmNlLnRvLCBzdHJpbmcpOwogICAgICAgIHRoaXMubGluZSA9IGVuZC5ub2RlOwogICAgICAgIHRoaXMub2Zmc2V0ID0gZW5kLm9mZnNldDsKICAgICAgICB0aGlzLmF0T2NjdXJyZW5jZSA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgfTsKCiAgLy8gVGhlIEVkaXRvciBvYmplY3QgaXMgdGhlIG1haW4gaW5zaWRlLXRoZS1pZnJhbWUgaW50ZXJmYWNlLgogIGZ1bmN0aW9uIEVkaXRvcihvcHRpb25zKSB7CiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogICAgd2luZG93LmluZGVudFVuaXQgPSBvcHRpb25zLmluZGVudFVuaXQ7CiAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICAgIHRoaXMuZG9jID0gZG9jdW1lbnQ7CiAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jb250YWluZXIgPSB0aGlzLmRvYy5ib2R5OwogICAgdGhpcy53aW4gPSB3aW5kb3c7CiAgICB0aGlzLmhpc3RvcnkgPSBuZXcgSGlzdG9yeShjb250YWluZXIsIG9wdGlvbnMudW5kb0RlcHRoLCBvcHRpb25zLnVuZG9EZWxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG9wdGlvbnMub25DaGFuZ2UpOwogICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgIGlmICghRWRpdG9yLlBhcnNlcikKICAgICAgdGhyb3cgIk5vIHBhcnNlciBsb2FkZWQuIjsKICAgIGlmIChvcHRpb25zLnBhcnNlckNvbmZpZyAmYW1wOyZhbXA7IEVkaXRvci5QYXJzZXIuY29uZmlndXJlKQogICAgICBFZGl0b3IuUGFyc2VyLmNvbmZpZ3VyZShvcHRpb25zLnBhcnNlckNvbmZpZyk7CgogICAgaWYgKCFvcHRpb25zLnJlYWRPbmx5KQogICAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zKGNvbnRhaW5lciwge25vZGU6IG51bGwsIG9mZnNldDogMH0pOwoKICAgIHRoaXMuZGlydHkgPSBbXTsKICAgIGlmIChvcHRpb25zLmNvbnRlbnQpCiAgICAgIHRoaXMuaW1wb3J0Q29kZShvcHRpb25zLmNvbnRlbnQpOwogICAgZWxzZSAvLyBGRiBhY3RzIHdlaXJkIHdoZW4gdGhlIGVkaXRhYmxlIGRvY3VtZW50IGlzIGNvbXBsZXRlbHkgZW1wdHkKICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoIkJSIikpOwoKICAgIGlmICghb3B0aW9ucy5yZWFkT25seSkgewogICAgICBpZiAob3B0aW9ucy5jb250aW51b3VzU2Nhbm5pbmcgIT09IGZhbHNlKSB7CiAgICAgICAgdGhpcy5zY2FubmVyID0gdGhpcy5kb2N1bWVudFNjYW5uZXIob3B0aW9ucy5saW5lc1BlclBhc3MpOwogICAgICAgIHRoaXMuZGVsYXlTY2FubmluZygpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBzZXRFZGl0YWJsZSgpIHsKICAgICAgICAvLyBJbiBJRSwgZGVzaWduTW9kZSBmcmFtZXMgY2FuIG5vdCBydW4gYW55IHNjcmlwdHMsIHNvIHdlIHVzZQogICAgICAgIC8vIGNvbnRlbnRFZGl0YWJsZSBpbnN0ZWFkLgogICAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRlbnRFZGl0YWJsZSAhPSB1bmRlZmluZWQgJmFtcDsmYW1wOyBpbnRlcm5ldEV4cGxvcmVyKQogICAgICAgICAgZG9jdW1lbnQuYm9keS5jb250ZW50RWRpdGFibGUgPSAidHJ1ZSI7CiAgICAgICAgZWxzZQogICAgICAgICAgZG9jdW1lbnQuZGVzaWduTW9kZSA9ICJvbiI7CgogICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5ib3JkZXJXaWR0aCA9ICIwIjsKICAgICAgICBpZiAoIW9wdGlvbnMudGV4dFdyYXBwaW5nKQogICAgICAgICAgY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSAibm93cmFwIjsKICAgICAgfQoKICAgICAgLy8gSWYgc2V0dGluZyB0aGUgZnJhbWUgZWRpdGFibGUgZmFpbHMsIHRyeSBhZ2FpbiB3aGVuIHRoZSB1c2VyCiAgICAgIC8vIGZvY3VzIGl0IChoYXBwZW5zIHdoZW4gdGhlIGZyYW1lIGlzIG5vdCB2aXNpYmxlIG9uCiAgICAgIC8vIGluaXRpYWxpc2F0aW9uLCBpbiBGaXJlZm94KS4KICAgICAgdHJ5IHsKICAgICAgICBzZXRFZGl0YWJsZSgpOwogICAgICB9CiAgICAgIGNhdGNoKGUpIHsKICAgICAgICB2YXIgZm9jdXNFdmVudCA9IGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudCwgImZvY3VzIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBmb2N1c0V2ZW50KCk7CiAgICAgICAgICBzZXRFZGl0YWJsZSgpOwogICAgICAgIH0sIHRydWUpOwogICAgICB9CgogICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQsICJrZXlkb3duIiwgbWV0aG9kKHRoaXMsICJrZXlEb3duIikpOwogICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQsICJrZXlwcmVzcyIsIG1ldGhvZCh0aGlzLCAia2V5UHJlc3MiKSk7CiAgICAgIGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudCwgImtleXVwIiwgbWV0aG9kKHRoaXMsICJrZXlVcCIpKTsKCiAgICAgIGZ1bmN0aW9uIGN1cnNvckFjdGl2aXR5KCkge3NlbGYuY3Vyc29yQWN0aXZpdHkoZmFsc2UpO30KICAgICAgYWRkRXZlbnRIYW5kbGVyKGRvY3VtZW50LmJvZHksICJtb3VzZXVwIiwgY3Vyc29yQWN0aXZpdHkpOwogICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQuYm9keSwgInBhc3RlIiwgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBjdXJzb3JBY3Rpdml0eSgpOwogICAgICAgIGlmIChpbnRlcm5ldEV4cGxvcmVyKSB7CiAgICAgICAgICB2YXIgdGV4dCA9IG51bGw7CiAgICAgICAgICB0cnkge3RleHQgPSB3aW5kb3cuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJUZXh0Iik7fWNhdGNoKGUpe30KICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKICAgICAgICAgICAgc2VsZi5yZXBsYWNlU2VsZWN0aW9uKHRleHQpOwogICAgICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUoc2VsZi5jb250YWluZXIsIHRydWUpLAogICAgICAgICAgICAgICAgc3RhcnQyID0gc3RhcnQgJmFtcDsmYW1wOyBzdGFydC5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzY3J1YlBhc3RlZChzZWxmLmNvbnRhaW5lciwgc3RhcnQsIHN0YXJ0Mik7fSwgMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgYWRkRXZlbnRIYW5kbGVyKGRvY3VtZW50LmJvZHksICJjdXQiLCBjdXJzb3JBY3Rpdml0eSk7CgogICAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9NYXRjaFBhcmVucykKICAgICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQuYm9keSwgImNsaWNrIiwgbWV0aG9kKHRoaXMsICJzY2hlZHVsZVBhcmVuQmxpbmsiKSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpc1NhZmVLZXkoY29kZSkgewogICAgcmV0dXJuIChjb2RlID49IDE2ICZhbXA7JmFtcDsgY29kZSAmbHQ7PSAxOCkgfHwgLy8gc2hpZnQsIGNvbnRyb2wsIGFsdAogICAgICAgICAgIChjb2RlID49IDMzICZhbXA7JmFtcDsgY29kZSAmbHQ7PSA0MCk7IC8vIGFycm93cywgaG9tZSwgZW5kCiAgfQoKICBFZGl0b3IucHJvdG90eXBlID0gewogICAgLy8gSW1wb3J0IGEgcGllY2Ugb2YgY29kZSBpbnRvIHRoZSBlZGl0b3IuCiAgICBpbXBvcnRDb2RlOiBmdW5jdGlvbihjb2RlKSB7CiAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKG51bGwsIG51bGwsIGFzRWRpdG9yTGluZXMoY29kZSkpOwogICAgICB0aGlzLmhpc3RvcnkucmVzZXQoKTsKICAgIH0sCgogICAgLy8gRXh0cmFjdCB0aGUgY29kZSBmcm9tIHRoZSBlZGl0b3IuCiAgICBnZXRDb2RlOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKQogICAgICAgIHJldHVybiAiIjsKCiAgICAgIHZhciBhY2N1bSA9IFtdOwogICAgICBzZWxlY3QubWFya1NlbGVjdGlvbih0aGlzLndpbik7CiAgICAgIGZvckVhY2godHJhdmVyc2VET00odGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCksIG1ldGhvZChhY2N1bSwgInB1c2giKSk7CiAgICAgIHdlYmtpdExhc3RMaW5lSGFjayh0aGlzLmNvbnRhaW5lcik7CiAgICAgIHNlbGVjdC5zZWxlY3RNYXJrZWQoKTsKICAgICAgcmV0dXJuIGNsZWFuVGV4dChhY2N1bS5qb2luKCIiKSk7CiAgICB9LAoKICAgIGNoZWNrTGluZTogZnVuY3Rpb24obm9kZSkgewogICAgICBpZiAobm9kZSA9PT0gZmFsc2UgfHwgIShub2RlID09IG51bGwgfHwgbm9kZS5wYXJlbnROb2RlID09IHRoaXMuY29udGFpbmVyKSkKICAgICAgICB0aHJvdyBwYXJlbnQuQ29kZU1pcnJvci5JbnZhbGlkTGluZUhhbmRsZTsKICAgIH0sCgogICAgY3Vyc29yUG9zaXRpb246IGZ1bmN0aW9uKHN0YXJ0KSB7CiAgICAgIGlmIChzdGFydCA9PSBudWxsKSBzdGFydCA9IHRydWU7CiAgICAgIHZhciBwb3MgPSBzZWxlY3QuY3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCBzdGFydCk7CiAgICAgIGlmIChwb3MpIHJldHVybiB7bGluZTogcG9zLm5vZGUsIGNoYXJhY3RlcjogcG9zLm9mZnNldH07CiAgICAgIGVsc2UgcmV0dXJuIHtsaW5lOiBudWxsLCBjaGFyYWN0ZXI6IDB9OwogICAgfSwKCiAgICBmaXJzdExpbmU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0sCgogICAgbGFzdExpbmU6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5jb250YWluZXIubGFzdENoaWxkKSByZXR1cm4gc3RhcnRPZkxpbmUodGhpcy5jb250YWluZXIubGFzdENoaWxkKTsKICAgICAgZWxzZSByZXR1cm4gbnVsbDsKICAgIH0sCgogICAgbmV4dExpbmU6IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdGhpcy5jaGVja0xpbmUobGluZSk7CiAgICAgIHZhciBlbmQgPSBlbmRPZkxpbmUobGluZSwgdGhpcy5jb250YWluZXIpOwogICAgICByZXR1cm4gZW5kIHx8IGZhbHNlOwogICAgfSwKCiAgICBwcmV2TGluZTogZnVuY3Rpb24obGluZSkgewogICAgICB0aGlzLmNoZWNrTGluZShsaW5lKTsKICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gc3RhcnRPZkxpbmUobGluZS5wcmV2aW91c1NpYmxpbmcpOwogICAgfSwKCiAgICBzZWxlY3RMaW5lczogZnVuY3Rpb24oc3RhcnRMaW5lLCBzdGFydE9mZnNldCwgZW5kTGluZSwgZW5kT2Zmc2V0KSB7CiAgICAgIHRoaXMuY2hlY2tMaW5lKHN0YXJ0TGluZSk7CiAgICAgIHZhciBzdGFydCA9IHtub2RlOiBzdGFydExpbmUsIG9mZnNldDogc3RhcnRPZmZzZXR9LCBlbmQgPSBudWxsOwogICAgICBpZiAoZW5kT2Zmc2V0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB0aGlzLmNoZWNrTGluZShlbmRMaW5lKTsKICAgICAgICBlbmQgPSB7bm9kZTogZW5kTGluZSwgb2Zmc2V0OiBlbmRPZmZzZXR9OwogICAgICB9CiAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHN0YXJ0LCBlbmQpOwogICAgICBzZWxlY3Quc2Nyb2xsVG9DdXJzb3IodGhpcy5jb250YWluZXIpOwogICAgfSwKCiAgICBsaW5lQ29udGVudDogZnVuY3Rpb24obGluZSkgewogICAgICB0aGlzLmNoZWNrTGluZShsaW5lKTsKICAgICAgdmFyIGFjY3VtID0gW107CiAgICAgIGZvciAobGluZSA9IGxpbmUgPyBsaW5lLm5leHRTaWJsaW5nIDogdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgICAgICBsaW5lICZhbXA7JmFtcDsgbGluZS5ub2RlTmFtZSAhPSAiQlIiOyBsaW5lID0gbGluZS5uZXh0U2libGluZykKICAgICAgICBhY2N1bS5wdXNoKG5vZGVUZXh0KGxpbmUpKTsKICAgICAgcmV0dXJuIGNsZWFuVGV4dChhY2N1bS5qb2luKCIiKSk7CiAgICB9LAoKICAgIHNldExpbmVDb250ZW50OiBmdW5jdGlvbihsaW5lLCBjb250ZW50KSB7CiAgICAgIHRoaXMuaGlzdG9yeS5jb21taXQoKTsKICAgICAgdGhpcy5yZXBsYWNlUmFuZ2Uoe25vZGU6IGxpbmUsIG9mZnNldDogMH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHtub2RlOiBsaW5lLCBvZmZzZXQ6IHRoaXMuaGlzdG9yeS50ZXh0QWZ0ZXIobGluZSkubGVuZ3RofSwKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCk7CiAgICAgIHRoaXMuYWRkRGlydHlOb2RlKGxpbmUpOwogICAgICB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICB9LAoKICAgIGluc2VydEludG9MaW5lOiBmdW5jdGlvbihsaW5lLCBwb3NpdGlvbiwgY29udGVudCkgewogICAgICB2YXIgYmVmb3JlID0gbnVsbDsKICAgICAgaWYgKHBvc2l0aW9uID09ICJlbmQiKSB7CiAgICAgICAgYmVmb3JlID0gZW5kT2ZMaW5lKGxpbmUsIHRoaXMuY29udGFpbmVyKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBmb3IgKHZhciBjdXIgPSBsaW5lID8gbGluZS5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7IGN1cjsgY3VyID0gY3VyLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICBpZiAocG9zaXRpb24gPT0gMCkgewogICAgICAgICAgICBiZWZvcmUgPSBjdXI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHRleHQgPSAoY3VyLmlubmVyVGV4dCB8fCBjdXIudGV4dENvbnRlbnQgfHwgY3VyLm5vZGVWYWx1ZSB8fCAiIik7CiAgICAgICAgICBpZiAodGV4dC5sZW5ndGggPiBwb3NpdGlvbikgewogICAgICAgICAgICBiZWZvcmUgPSBjdXIubmV4dFNpYmxpbmc7CiAgICAgICAgICAgIGNvbnRlbnQgPSB0ZXh0LnNsaWNlKDAsIHBvc2l0aW9uKSArIGNvbnRlbnQgKyB0ZXh0LnNsaWNlKHBvc2l0aW9uKTsKICAgICAgICAgICAgcmVtb3ZlRWxlbWVudChjdXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHBvc2l0aW9uIC09IHRleHQubGVuZ3RoOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIGxpbmVzID0gYXNFZGl0b3JMaW5lcyhjb250ZW50KSwgZG9jID0gdGhpcy5jb250YWluZXIub3duZXJEb2N1bWVudDsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgJmx0OyBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChpID4gMCkgdGhpcy5jb250YWluZXIuaW5zZXJ0QmVmb3JlKGRvYy5jcmVhdGVFbGVtZW50KCJCUiIpLCBiZWZvcmUpOwogICAgICAgIHRoaXMuY29udGFpbmVyLmluc2VydEJlZm9yZShtYWtlUGFydFNwYW4obGluZXNbaV0sIGRvYyksIGJlZm9yZSk7CiAgICAgIH0KICAgICAgdGhpcy5hZGREaXJ0eU5vZGUobGluZSk7CiAgICAgIHRoaXMuc2NoZWR1bGVIaWdobGlnaHQoKTsKICAgIH0sCgogICAgLy8gUmV0cmlldmUgdGhlIHNlbGVjdGVkIHRleHQuCiAgICBzZWxlY3RlZFRleHQ6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgaCA9IHRoaXMuaGlzdG9yeTsKICAgICAgaC5jb21taXQoKTsKCiAgICAgIHZhciBzdGFydCA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHRydWUpLAogICAgICAgICAgZW5kID0gc2VsZWN0LmN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwgZmFsc2UpOwogICAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHJldHVybiAiIjsKCiAgICAgIGlmIChzdGFydC5ub2RlID09IGVuZC5ub2RlKQogICAgICAgIHJldHVybiBoLnRleHRBZnRlcihzdGFydC5ub2RlKS5zbGljZShzdGFydC5vZmZzZXQsIGVuZC5vZmZzZXQpOwoKICAgICAgdmFyIHRleHQgPSBbaC50ZXh0QWZ0ZXIoc3RhcnQubm9kZSkuc2xpY2Uoc3RhcnQub2Zmc2V0KV07CiAgICAgIGZvciAocG9zID0gaC5ub2RlQWZ0ZXIoc3RhcnQubm9kZSk7IHBvcyAhPSBlbmQubm9kZTsgcG9zID0gaC5ub2RlQWZ0ZXIocG9zKSkKICAgICAgICB0ZXh0LnB1c2goaC50ZXh0QWZ0ZXIocG9zKSk7CiAgICAgIHRleHQucHVzaChoLnRleHRBZnRlcihlbmQubm9kZSkuc2xpY2UoMCwgZW5kLm9mZnNldCkpOwogICAgICByZXR1cm4gY2xlYW5UZXh0KHRleHQuam9pbigiXG4iKSk7CiAgICB9LAoKICAgIC8vIFJlcGxhY2UgdGhlIHNlbGVjdGlvbiB3aXRoIGFub3RoZXIgcGllY2Ugb2YgdGV4dC4KICAgIHJlcGxhY2VTZWxlY3Rpb246IGZ1bmN0aW9uKHRleHQpIHsKICAgICAgdGhpcy5oaXN0b3J5LmNvbW1pdCgpOwogICAgICB2YXIgc3RhcnQgPSBzZWxlY3QuY3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCB0cnVlKSwKICAgICAgICAgIGVuZCA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgaWYgKCFzdGFydCB8fCAhZW5kKSByZXR1cm47CgogICAgICBlbmQgPSB0aGlzLnJlcGxhY2VSYW5nZShzdGFydCwgZW5kLCB0ZXh0KTsKICAgICAgc2VsZWN0LnNldEN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwgc3RhcnQsIGVuZCk7CiAgICB9LAoKICAgIHJlcGxhY2VSYW5nZTogZnVuY3Rpb24oZnJvbSwgdG8sIHRleHQpIHsKICAgICAgdmFyIGxpbmVzID0gYXNFZGl0b3JMaW5lcyh0ZXh0KTsKICAgICAgbGluZXNbMF0gPSB0aGlzLmhpc3RvcnkudGV4dEFmdGVyKGZyb20ubm9kZSkuc2xpY2UoMCwgZnJvbS5vZmZzZXQpICsgbGluZXNbMF07CiAgICAgIHZhciBsYXN0TGluZSA9IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdOwogICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9IGxhc3RMaW5lICsgdGhpcy5oaXN0b3J5LnRleHRBZnRlcih0by5ub2RlKS5zbGljZSh0by5vZmZzZXQpOwogICAgICB2YXIgZW5kID0gdGhpcy5oaXN0b3J5Lm5vZGVBZnRlcih0by5ub2RlKTsKICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZnJvbS5ub2RlLCBlbmQsIGxpbmVzKTsKICAgICAgcmV0dXJuIHtub2RlOiB0aGlzLmhpc3Rvcnkubm9kZUJlZm9yZShlbmQpLAogICAgICAgICAgICAgIG9mZnNldDogbGFzdExpbmUubGVuZ3RofTsKICAgIH0sCgogICAgZ2V0U2VhcmNoQ3Vyc29yOiBmdW5jdGlvbihzdHJpbmcsIGZyb21DdXJzb3IpIHsKICAgICAgcmV0dXJuIG5ldyBTZWFyY2hDdXJzb3IodGhpcywgc3RyaW5nLCBmcm9tQ3Vyc29yKTsKICAgIH0sCgogICAgLy8gUmUtaW5kZW50IHRoZSB3aG9sZSBidWZmZXIKICAgIHJlaW5kZW50OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpCiAgICAgICAgdGhpcy5pbmRlbnRSZWdpb24obnVsbCwgdGhpcy5jb250YWluZXIubGFzdENoaWxkKTsKICAgIH0sCgogICAgZ3JhYktleXM6IGZ1bmN0aW9uKGV2ZW50SGFuZGxlciwgZmlsdGVyKSB7CiAgICAgIHRoaXMuZnJvemVuID0gZXZlbnRIYW5kbGVyOwogICAgICB0aGlzLmtleUZpbHRlciA9IGZpbHRlcjsKICAgIH0sCiAgICB1bmdyYWJLZXlzOiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5mcm96ZW4gPSAibGVhdmUiOwogICAgICB0aGlzLmtleUZpbHRlciA9IG51bGw7CiAgICB9LAoKICAgIC8vIEludGVyY2VwdCBlbnRlciBhbmQgdGFiLCBhbmQgYXNzaWduIHRoZWlyIG5ldyBmdW5jdGlvbnMuCiAgICBrZXlEb3duOiBmdW5jdGlvbihldmVudCkgewogICAgICBpZiAodGhpcy5mcm96ZW4gPT0gImxlYXZlIikgdGhpcy5mcm96ZW4gPSBudWxsOwogICAgICBpZiAodGhpcy5mcm96ZW4gJmFtcDsmYW1wOyAoIXRoaXMua2V5RmlsdGVyIHx8IHRoaXMua2V5RmlsdGVyKGV2ZW50LmtleUNvZGUpKSkgewogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgICB0aGlzLmZyb3plbihldmVudCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB2YXIgY29kZSA9IGV2ZW50LmtleUNvZGU7CiAgICAgIC8vIERvbid0IHNjYW4gd2hlbiB0aGUgdXNlciBpcyB0eXBpbmcuCiAgICAgIHRoaXMuZGVsYXlTY2FubmluZygpOwogICAgICAvLyBTY2hlZHVsZSBhIHBhcmVuLWhpZ2hsaWdodCBldmVudCwgaWYgY29uZmlndXJlZC4KICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvTWF0Y2hQYXJlbnMpCiAgICAgICAgdGhpcy5zY2hlZHVsZVBhcmVuQmxpbmsoKTsKCiAgICAgIGlmIChjb2RlID09IDEzKSB7IC8vIGVudGVyCiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHsKICAgICAgICAgIHRoaXMucmVwYXJzZUJ1ZmZlcigpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHNlbGVjdC5pbnNlcnROZXdsaW5lQXRDdXJzb3IodGhpcy53aW4pOwogICAgICAgICAgdGhpcy5pbmRlbnRBdEN1cnNvcigpOwogICAgICAgICAgc2VsZWN0LnNjcm9sbFRvQ3Vyc29yKHRoaXMuY29udGFpbmVyKTsKICAgICAgICB9CiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gOSAmYW1wOyZhbXA7IHRoaXMub3B0aW9ucy50YWJNb2RlICE9ICJkZWZhdWx0IikgeyAvLyB0YWIKICAgICAgICB0aGlzLmhhbmRsZVRhYighZXZlbnQuY3RybEtleSAmYW1wOyZhbXA7ICFldmVudC5zaGlmdEtleSk7CiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMzIgJmFtcDsmYW1wOyBldmVudC5zaGlmdEtleSAmYW1wOyZhbXA7IHRoaXMub3B0aW9ucy50YWJNb2RlID09ICJkZWZhdWx0IikgeyAvLyBzcGFjZQogICAgICAgIHRoaXMuaGFuZGxlVGFiKHRydWUpOwogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmICgoY29kZSA9PSAyMTkgfHwgY29kZSA9PSAyMjEpICZhbXA7JmFtcDsgZXZlbnQuY3RybEtleSkgewogICAgICAgIHRoaXMuYmxpbmtQYXJlbnMoZXZlbnQuc2hpZnRLZXkpOwogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmIChldmVudC5tZXRhS2V5ICZhbXA7JmFtcDsgKGNvZGUgPT0gMzcgfHwgY29kZSA9PSAzOSkpIHsgLy8gTWV0YS1sZWZ0L3JpZ2h0CiAgICAgICAgdmFyIGN1cnNvciA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyKTsKICAgICAgICBpZiAoY3Vyc29yID09PSBmYWxzZSB8fCAhdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCkgcmV0dXJuOwoKICAgICAgICBpZiAoY29kZSA9PSAzNykgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlKHN0YXJ0T2ZMaW5lKGN1cnNvciksIHRoaXMuY29udGFpbmVyKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGVuZCA9IGVuZE9mTGluZShjdXJzb3IsIHRoaXMuY29udGFpbmVyKTsKICAgICAgICAgIHNlbGVjdC5mb2N1c0FmdGVyTm9kZShlbmQgPyBlbmQucHJldmlvdXNTaWJsaW5nIDogdGhpcy5jb250YWluZXIubGFzdENoaWxkLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgfQogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHsKICAgICAgICBpZiAoKGV2ZW50LnNoaWZ0S2V5ICZhbXA7JmFtcDsgY29kZSA9PSA5MCkgfHwgY29kZSA9PSA4OSkgeyAvLyBzaGlmdC1aLCBZCiAgICAgICAgICBzZWxlY3Quc2Nyb2xsVG9Ob2RlKHRoaXMuaGlzdG9yeS5yZWRvKCkpOwogICAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjb2RlID09IDkwIHx8IGNvZGUgPT0gOCkgeyAvLyBaLCBiYWNrc3BhY2UKICAgICAgICAgIHNlbGVjdC5zY3JvbGxUb05vZGUodGhpcy5oaXN0b3J5LnVuZG8oKSk7CiAgICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNvZGUgPT0gODMgJmFtcDsmYW1wOyB0aGlzLm9wdGlvbnMuc2F2ZUZ1bmN0aW9uKSB7IC8vIFMKICAgICAgICAgIHRoaXMub3B0aW9ucy5zYXZlRnVuY3Rpb24oKTsKICAgICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgLy8gQ2hlY2sgZm9yIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgcmUtaW5kZW50IHRoZSBjdXJyZW50IGxpbmUsCiAgICAvLyBhbmQgcHJldmVudCBPcGVyYSBmcm9tIGhhbmRsaW5nIGVudGVyIGFuZCB0YWIgYW55d2F5LgogICAga2V5UHJlc3M6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIHZhciBlbGVjdHJpYyA9IC9pbmRlbnR8ZGVmYXVsdC8udGVzdCh0aGlzLm9wdGlvbnMudGFiTW9kZSkgJmFtcDsmYW1wOyBFZGl0b3IuUGFyc2VyLmVsZWN0cmljQ2hhcnM7CiAgICAgIC8vIEhhY2sgZm9yIE9wZXJhLCBhbmQgRmlyZWZveCBvbiBPUyBYLCBpbiB3aGljaCBzdG9wcGluZyBhCiAgICAgIC8vIGtleWRvd24gZXZlbnQgZG9lcyBub3QgcHJldmVudCB0aGUgYXNzb2NpYXRlZCBrZXlwcmVzcyBldmVudAogICAgICAvLyBmcm9tIGhhcHBlbmluZywgc28gd2UgaGF2ZSB0byBjYW5jZWwgZW50ZXIgYW5kIHRhYiBhZ2FpbgogICAgICAvLyBoZXJlLgogICAgICBpZiAoKHRoaXMuZnJvemVuICZhbXA7JmFtcDsgKCF0aGlzLmtleUZpbHRlciB8fCB0aGlzLmtleUZpbHRlcihldmVudC5rZXlDb2RlKSkpIHx8CiAgICAgICAgICBldmVudC5jb2RlID09IDEzIHx8IChldmVudC5jb2RlID09IDkgJmFtcDsmYW1wOyB0aGlzLm9wdGlvbnMudGFiTW9kZSAhPSAiZGVmYXVsdCIpIHx8CiAgICAgICAgICAoZXZlbnQua2V5Q29kZSA9PSAzMiAmYW1wOyZhbXA7IGV2ZW50LnNoaWZ0S2V5ICZhbXA7JmFtcDsgdGhpcy5vcHRpb25zLnRhYk1vZGUgPT0gImRlZmF1bHQiKSkKICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgIGVsc2UgaWYgKGVsZWN0cmljICZhbXA7JmFtcDsgZWxlY3RyaWMuaW5kZXhPZihldmVudC5jaGFyYWN0ZXIpICE9IC0xKQogICAgICAgIHRoaXMucGFyZW50LnNldFRpbWVvdXQobWV0aG9kKHRoaXMsICJpbmRlbnRBdEN1cnNvciIpLCAwKTsKICAgIH0sCgogICAgLy8gTWFyayB0aGUgbm9kZSBhdCB0aGUgY3Vyc29yIGRpcnR5IHdoZW4gYSBub24tc2FmZSBrZXkgaXMKICAgIC8vIHJlbGVhc2VkLgogICAga2V5VXA6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIHRoaXMuY3Vyc29yQWN0aXZpdHkoaXNTYWZlS2V5KGV2ZW50LmtleUNvZGUpKTsKICAgIH0sCgogICAgLy8gSW5kZW50IHRoZSBsaW5lIGZvbGxvd2luZyBhIGdpdmVuICZsdDticj4sIG9yIG51bGwgZm9yIHRoZSBmaXJzdAogICAgLy8gbGluZS4gSWYgZ2l2ZW4gYSAmbHQ7YnI+IGVsZW1lbnQsIHRoaXMgbXVzdCBoYXZlIGJlZW4gaGlnaGxpZ2h0ZWQKICAgIC8vIHNvIHRoYXQgaXQgaGFzIGFuIGluZGVudGF0aW9uIG1ldGhvZC4gUmV0dXJucyB0aGUgd2hpdGVzcGFjZQogICAgLy8gZWxlbWVudCB0aGF0IGhhcyBiZWVuIG1vZGlmaWVkIG9yIGNyZWF0ZWQgKGlmIGFueSkuCiAgICBpbmRlbnRMaW5lQWZ0ZXI6IGZ1bmN0aW9uKHN0YXJ0LCBkaXJlY3Rpb24pIHsKICAgICAgLy8gd2hpdGVTcGFjZSBpcyB0aGUgd2hpdGVzcGFjZSBzcGFuIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSwKICAgICAgLy8gb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIG5vZGUuCiAgICAgIHZhciB3aGl0ZVNwYWNlID0gc3RhcnQgPyBzdGFydC5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgIGlmICh3aGl0ZVNwYWNlICZhbXA7JmFtcDsgIWhhc0NsYXNzKHdoaXRlU3BhY2UsICJ3aGl0ZXNwYWNlIikpCiAgICAgICAgd2hpdGVTcGFjZSA9IG51bGw7CgogICAgICAvLyBTb21ldGltZXMgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGNhbiBpbmZsdWVuY2UgdGhlIGNvcnJlY3QKICAgICAgLy8gaW5kZW50YXRpb24sIHNvIHdlIHJldHJpZXZlIGl0LgogICAgICB2YXIgZmlyc3RUZXh0ID0gd2hpdGVTcGFjZSA/IHdoaXRlU3BhY2UubmV4dFNpYmxpbmcgOiAoc3RhcnQgPyBzdGFydC5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpOwogICAgICB2YXIgbmV4dENoYXJzID0gKHN0YXJ0ICZhbXA7JmFtcDsgZmlyc3RUZXh0ICZhbXA7JmFtcDsgZmlyc3RUZXh0LmN1cnJlbnRUZXh0KSA/IGZpcnN0VGV4dC5jdXJyZW50VGV4dCA6ICIiOwoKICAgICAgLy8gQXNrIHRoZSBsZXhpY2FsIGNvbnRleHQgZm9yIHRoZSBjb3JyZWN0IGluZGVudGF0aW9uLCBhbmQKICAgICAgLy8gY29tcHV0ZSBob3cgbXVjaCB0aGlzIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCBpbmRlbnRhdGlvbi4KICAgICAgdmFyIG5ld0luZGVudCA9IDAsIGN1ckluZGVudCA9IHdoaXRlU3BhY2UgPyB3aGl0ZVNwYWNlLmN1cnJlbnRUZXh0Lmxlbmd0aCA6IDA7CiAgICAgIGlmIChkaXJlY3Rpb24gIT0gbnVsbCAmYW1wOyZhbXA7IHRoaXMub3B0aW9ucy50YWJNb2RlID09ICJzaGlmdCIpCiAgICAgICAgbmV3SW5kZW50ID0gZGlyZWN0aW9uID8gY3VySW5kZW50ICsgaW5kZW50VW5pdCA6IE1hdGgubWF4KDAsIGN1ckluZGVudCAtIGluZGVudFVuaXQpCiAgICAgIGVsc2UgaWYgKHN0YXJ0KQogICAgICAgIG5ld0luZGVudCA9IHN0YXJ0LmluZGVudGF0aW9uKG5leHRDaGFycywgY3VySW5kZW50LCBkaXJlY3Rpb24pOwogICAgICBlbHNlIGlmIChFZGl0b3IuUGFyc2VyLmZpcnN0SW5kZW50YXRpb24pCiAgICAgICAgbmV3SW5kZW50ID0gRWRpdG9yLlBhcnNlci5maXJzdEluZGVudGF0aW9uKG5leHRDaGFycywgY3VySW5kZW50LCBkaXJlY3Rpb24pOwogICAgICB2YXIgaW5kZW50RGlmZiA9IG5ld0luZGVudCAtIGN1ckluZGVudDsKCiAgICAgIC8vIElmIHRoZXJlIGlzIHRvbyBtdWNoLCB0aGlzIGlzIGp1c3QgYSBtYXR0ZXIgb2Ygc2hyaW5raW5nIGEgc3Bhbi4KICAgICAgaWYgKGluZGVudERpZmYgJmx0OyAwKSB7CiAgICAgICAgaWYgKG5ld0luZGVudCA9PSAwKSB7CiAgICAgICAgICBpZiAoZmlyc3RUZXh0KSBzZWxlY3Quc25hcHNob3RNb3ZlKHdoaXRlU3BhY2UuZmlyc3RDaGlsZCwgZmlyc3RUZXh0LmZpcnN0Q2hpbGQsIDApOwogICAgICAgICAgcmVtb3ZlRWxlbWVudCh3aGl0ZVNwYWNlKTsKICAgICAgICAgIHdoaXRlU3BhY2UgPSBudWxsOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHNlbGVjdC5zbmFwc2hvdE1vdmUod2hpdGVTcGFjZS5maXJzdENoaWxkLCB3aGl0ZVNwYWNlLmZpcnN0Q2hpbGQsIGluZGVudERpZmYsIHRydWUpOwogICAgICAgICAgd2hpdGVTcGFjZS5jdXJyZW50VGV4dCA9IG1ha2VXaGl0ZVNwYWNlKG5ld0luZGVudCk7CiAgICAgICAgICB3aGl0ZVNwYWNlLmZpcnN0Q2hpbGQubm9kZVZhbHVlID0gd2hpdGVTcGFjZS5jdXJyZW50VGV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gTm90IGVub3VnaC4uLgogICAgICBlbHNlIGlmIChpbmRlbnREaWZmID4gMCkgewogICAgICAgIC8vIElmIHRoZXJlIGlzIHdoaXRlc3BhY2UsIHdlIGdyb3cgaXQuCiAgICAgICAgaWYgKHdoaXRlU3BhY2UpIHsKICAgICAgICAgIHdoaXRlU3BhY2UuY3VycmVudFRleHQgPSBtYWtlV2hpdGVTcGFjZShuZXdJbmRlbnQpOwogICAgICAgICAgd2hpdGVTcGFjZS5maXJzdENoaWxkLm5vZGVWYWx1ZSA9IHdoaXRlU3BhY2UuY3VycmVudFRleHQ7CiAgICAgICAgfQogICAgICAgIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBhZGQgYSBuZXcgd2hpdGVzcGFjZSBub2RlLgogICAgICAgIGVsc2UgewogICAgICAgICAgd2hpdGVTcGFjZSA9IG1ha2VQYXJ0U3BhbihtYWtlV2hpdGVTcGFjZShuZXdJbmRlbnQpLCB0aGlzLmRvYyk7CiAgICAgICAgICB3aGl0ZVNwYWNlLmNsYXNzTmFtZSA9ICJ3aGl0ZXNwYWNlIjsKICAgICAgICAgIGlmIChzdGFydCkgaW5zZXJ0QWZ0ZXIod2hpdGVTcGFjZSwgc3RhcnQpOwogICAgICAgICAgZWxzZSB0aGlzLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUod2hpdGVTcGFjZSwgdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCk7CiAgICAgICAgfQogICAgICAgIGlmIChmaXJzdFRleHQpIHNlbGVjdC5zbmFwc2hvdE1vdmUoZmlyc3RUZXh0LmZpcnN0Q2hpbGQsIHdoaXRlU3BhY2UuZmlyc3RDaGlsZCwgY3VySW5kZW50LCBmYWxzZSwgdHJ1ZSk7CiAgICAgIH0KICAgICAgaWYgKGluZGVudERpZmYgIT0gMCkgdGhpcy5hZGREaXJ0eU5vZGUoc3RhcnQpOwogICAgICByZXR1cm4gd2hpdGVTcGFjZTsKICAgIH0sCgogICAgLy8gUmUtaGlnaGxpZ2h0IHRoZSBzZWxlY3RlZCBwYXJ0IG9mIHRoZSBkb2N1bWVudC4KICAgIGhpZ2hsaWdodEF0Q3Vyc29yOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHBvcyA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCB0cnVlKTsKICAgICAgdmFyIHRvID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgaWYgKHBvcyA9PT0gZmFsc2UgfHwgdG8gPT09IGZhbHNlKSByZXR1cm47CgogICAgICBzZWxlY3QubWFya1NlbGVjdGlvbih0aGlzLndpbik7CiAgICAgIGlmICh0aGlzLmhpZ2hsaWdodChwb3MsIGVuZE9mTGluZSh0bywgdGhpcy5jb250YWluZXIpLCB0cnVlLCAyMCkgPT09IGZhbHNlKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgc2VsZWN0LnNlbGVjdE1hcmtlZCgpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0sCgogICAgLy8gV2hlbiB0YWIgaXMgcHJlc3NlZCB3aXRoIHRleHQgc2VsZWN0ZWQsIHRoZSB3aG9sZSBzZWxlY3Rpb24gaXMKICAgIC8vIHJlLWluZGVudGVkLCB3aGVuIG5vdGhpbmcgaXMgc2VsZWN0ZWQsIHRoZSBsaW5lIHdpdGggdGhlIGN1cnNvcgogICAgLy8gaXMgcmUtaW5kZW50ZWQuCiAgICBoYW5kbGVUYWI6IGZ1bmN0aW9uKGRpcmVjdGlvbikgewogICAgICBpZiAodGhpcy5vcHRpb25zLnRhYk1vZGUgPT0gInNwYWNlcyIpIHsKICAgICAgICBzZWxlY3QuaW5zZXJ0VGFiQXRDdXJzb3IodGhpcy53aW4pOwogICAgICB9CiAgICAgIGVsc2UgaWYgKCFzZWxlY3Quc29tZXRoaW5nU2VsZWN0ZWQodGhpcy53aW4pKSB7CiAgICAgICAgdGhpcy5pbmRlbnRBdEN1cnNvcihkaXJlY3Rpb24pOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHZhciBzdGFydCA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCB0cnVlKSwKICAgICAgICAgICAgZW5kID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgICBpZiAoc3RhcnQgPT09IGZhbHNlIHx8IGVuZCA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgICB0aGlzLmluZGVudFJlZ2lvbihzdGFydCwgZW5kLCBkaXJlY3Rpb24pOwogICAgICB9CiAgICB9LAoKICAgIC8vIERlbGF5IChvciBpbml0aWF0ZSkgdGhlIG5leHQgcGFyZW4gYmxpbmsgZXZlbnQuCiAgICBzY2hlZHVsZVBhcmVuQmxpbms6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5wYXJlbkV2ZW50KSB0aGlzLnBhcmVudC5jbGVhclRpbWVvdXQodGhpcy5wYXJlbkV2ZW50KTsKICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICB0aGlzLnBhcmVuRXZlbnQgPSB0aGlzLnBhcmVudC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VsZi5ibGlua1BhcmVucygpO30sIDMwMCk7CiAgICB9LAoKICAgIC8vIFRha2UgdGhlIHRva2VuIGJlZm9yZSB0aGUgY3Vyc29yLiBJZiBpdCBjb250YWlucyBhIGNoYXJhY3RlciBpbgogICAgLy8gJygpW117fScsIHNlYXJjaCBmb3IgdGhlIG1hdGNoaW5nIHBhcmVuL2JyYWNlL2JyYWNrZXQsIGFuZAogICAgLy8gaGlnaGxpZ2h0IHRoZW0gaW4gZ3JlZW4gZm9yIGEgbW9tZW50LCBvciByZWQgaWYgbm8gcHJvcGVyIG1hdGNoCiAgICAvLyB3YXMgZm91bmQuCiAgICBibGlua1BhcmVuczogZnVuY3Rpb24oanVtcCkgewogICAgICAvLyBDbGVhciB0aGUgZXZlbnQgcHJvcGVydHkuCiAgICAgIGlmICh0aGlzLnBhcmVuRXZlbnQpIHRoaXMucGFyZW50LmNsZWFyVGltZW91dCh0aGlzLnBhcmVuRXZlbnQpOwogICAgICB0aGlzLnBhcmVuRXZlbnQgPSBudWxsOwoKICAgICAgLy8gRXh0cmFjdCBhICdwYXJlbicgZnJvbSBhIHBpZWNlIG9mIHRleHQuCiAgICAgIGZ1bmN0aW9uIHBhcmVuKG5vZGUpIHsKICAgICAgICBpZiAobm9kZS5jdXJyZW50VGV4dCkgewogICAgICAgICAgdmFyIG1hdGNoID0gbm9kZS5jdXJyZW50VGV4dC5tYXRjaCgvXltcc1x1MDBhMF0qKFtcKFwpXFtcXXt9XSlbXHNcdTAwYTBdKiQvKTsKICAgICAgICAgIHJldHVybiBtYXRjaCAmYW1wOyZhbXA7IG1hdGNoWzFdOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBEZXRlcm1pbmUgdGhlIGRpcmVjdGlvbiBhIHBhcmVuIGlzIGZhY2luZy4KICAgICAgZnVuY3Rpb24gZm9yd2FyZChjaCkgewogICAgICAgIHJldHVybiAvW1woXFtce10vLnRlc3QoY2gpOwogICAgICB9CgogICAgICB2YXIgY2gsIHNlbGYgPSB0aGlzLCBjdXJzb3IgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lciwgdHJ1ZSk7CiAgICAgIGlmICghY3Vyc29yIHx8ICF0aGlzLmhpZ2hsaWdodEF0Q3Vyc29yKCkpIHJldHVybjsKICAgICAgY3Vyc29yID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIHRydWUpOwogICAgICBpZiAoIShjdXJzb3IgJmFtcDsmYW1wOyAoKGNoID0gcGFyZW4oY3Vyc29yKSkgfHwgKGN1cnNvciA9IGN1cnNvci5uZXh0U2libGluZykgJmFtcDsmYW1wOyAoY2ggPSBwYXJlbihjdXJzb3IpKSkpKQogICAgICAgIHJldHVybjsKICAgICAgLy8gV2Ugb25seSBsb29rIGZvciB0b2tlbnMgd2l0aCB0aGUgc2FtZSBjbGFzc05hbWUuCiAgICAgIHZhciBjbGFzc05hbWUgPSBjdXJzb3IuY2xhc3NOYW1lLCBkaXIgPSBmb3J3YXJkKGNoKSwgbWF0Y2ggPSBtYXRjaGluZ1tjaF07CgogICAgICAvLyBTaW5jZSBwYXJ0cyBvZiB0aGUgZG9jdW1lbnQgbWlnaHQgbm90IGhhdmUgYmVlbiBwcm9wZXJseQogICAgICAvLyBoaWdobGlnaHRlZCwgYW5kIGl0IGlzIGhhcmQgdG8ga25vdyBpbiBhZHZhbmNlIHdoaWNoIHBhcnQgd2UKICAgICAgLy8gaGF2ZSB0byBzY2FuLCB3ZSBqdXN0IHRyeSwgYW5kIHdoZW4gd2UgZmluZCBkaXJ0eSBub2RlcyB3ZQogICAgICAvLyBhYm9ydCwgcGFyc2UgdGhlbSwgYW5kIHJlLXRyeS4KICAgICAgZnVuY3Rpb24gdHJ5RmluZE1hdGNoKCkgewogICAgICAgIHZhciBzdGFjayA9IFtdLCBjaCwgb2sgPSB0cnVlOzsKICAgICAgICBmb3IgKHZhciBydW5uZXIgPSBjdXJzb3I7IHJ1bm5lcjsgcnVubmVyID0gZGlyID8gcnVubmVyLm5leHRTaWJsaW5nIDogcnVubmVyLnByZXZpb3VzU2libGluZykgewogICAgICAgICAgaWYgKHJ1bm5lci5jbGFzc05hbWUgPT0gY2xhc3NOYW1lICZhbXA7JmFtcDsgcnVubmVyLm5vZGVOYW1lID09ICJTUEFOIiAmYW1wOyZhbXA7IChjaCA9IHBhcmVuKHJ1bm5lcikpKSB7CiAgICAgICAgICAgIGlmIChmb3J3YXJkKGNoKSA9PSBkaXIpCiAgICAgICAgICAgICAgc3RhY2sucHVzaChjaCk7CiAgICAgICAgICAgIGVsc2UgaWYgKCFzdGFjay5sZW5ndGgpCiAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKICAgICAgICAgICAgZWxzZSBpZiAoc3RhY2sucG9wKCkgIT0gbWF0Y2hpbmdbY2hdKQogICAgICAgICAgICAgIG9rID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKHJ1bm5lci5kaXJ0eSB8fCBydW5uZXIubm9kZU5hbWUgIT0gIlNQQU4iICZhbXA7JmFtcDsgcnVubmVyLm5vZGVOYW1lICE9ICJCUiIpIHsKICAgICAgICAgICAgcmV0dXJuIHtub2RlOiBydW5uZXIsIHN0YXR1czogImRpcnR5In07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7bm9kZTogcnVubmVyLCBzdGF0dXM6IHJ1bm5lciAmYW1wOyZhbXA7IG9rfTsKICAgICAgfQogICAgICAvLyBUZW1wb3JhcmlseSBnaXZlIHRoZSByZWxldmFudCBub2RlcyBhIGNvbG91ci4KICAgICAgZnVuY3Rpb24gYmxpbmsobm9kZSwgb2spIHsKICAgICAgICBub2RlLnN0eWxlLmZvbnRXZWlnaHQgPSAiYm9sZCI7CiAgICAgICAgbm9kZS5zdHlsZS5jb2xvciA9IG9rID8gIiM4RjgiIDogIiNGODgiOwogICAgICAgIHNlbGYucGFyZW50LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7bm9kZS5zdHlsZS5mb250V2VpZ2h0ID0gIiI7IG5vZGUuc3R5bGUuY29sb3IgPSAiIjt9LCA1MDApOwogICAgICB9CgogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIHZhciBmb3VuZCA9IHRyeUZpbmRNYXRjaCgpOwogICAgICAgIGlmIChmb3VuZC5zdGF0dXMgPT0gImRpcnR5IikgewogICAgICAgICAgdGhpcy5oaWdobGlnaHQoZm91bmQubm9kZSwgMSk7CiAgICAgICAgICAvLyBOZWVkZWQgYmVjYXVzZSBpbiBzb21lIGNvcm5lciBjYXNlcyBhIGhpZ2hsaWdodCBkb2VzIG5vdAogICAgICAgICAgLy8gcmVhY2ggYSBub2RlLgogICAgICAgICAgZm91bmQubm9kZS5kaXJ0eSA9IGZhbHNlOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgYmxpbmsoY3Vyc29yLCBmb3VuZC5zdGF0dXMpOwogICAgICAgICAgaWYgKGZvdW5kLm5vZGUpIHsKICAgICAgICAgICAgYmxpbmsoZm91bmQubm9kZSwgZm91bmQuc3RhdHVzKTsKICAgICAgICAgICAgaWYgKGp1bXApIHNlbGVjdC5mb2N1c0FmdGVyTm9kZShmb3VuZC5ub2RlLnByZXZpb3VzU2libGluZywgdGhpcy5jb250YWluZXIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIC8vIEFkanVzdCB0aGUgYW1vdW50IG9mIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIHRoYXQKICAgIC8vIHRoZSBjdXJzb3IgaXMgb24gc28gdGhhdCBpdCBpcyBpbmRlbnRlZCBwcm9wZXJseS4KICAgIGluZGVudEF0Q3Vyc29yOiBmdW5jdGlvbihkaXJlY3Rpb24pIHsKICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKSByZXR1cm47CiAgICAgIC8vIFRoZSBsaW5lIGhhcyB0byBoYXZlIHVwLXRvLWRhdGUgbGV4aWNhbCBpbmZvcm1hdGlvbiwgc28gd2UKICAgICAgLy8gaGlnaGxpZ2h0IGl0IGZpcnN0LgogICAgICBpZiAoIXRoaXMuaGlnaGxpZ2h0QXRDdXJzb3IoKSkgcmV0dXJuOwogICAgICB2YXIgY3Vyc29yID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgLy8gSWYgd2UgY291bGRuJ3QgZGV0ZXJtaW5lIHRoZSBwbGFjZSBvZiB0aGUgY3Vyc29yLAogICAgICAvLyB0aGVyZSdzIG5vdGhpbmcgdG8gaW5kZW50LgogICAgICBpZiAoY3Vyc29yID09PSBmYWxzZSkKICAgICAgICByZXR1cm47CiAgICAgIHZhciBsaW5lU3RhcnQgPSBzdGFydE9mTGluZShjdXJzb3IpOwogICAgICB2YXIgd2hpdGVTcGFjZSA9IHRoaXMuaW5kZW50TGluZUFmdGVyKGxpbmVTdGFydCwgZGlyZWN0aW9uKTsKICAgICAgaWYgKGN1cnNvciA9PSBsaW5lU3RhcnQgJmFtcDsmYW1wOyB3aGl0ZVNwYWNlKQogICAgICAgICAgY3Vyc29yID0gd2hpdGVTcGFjZTsKICAgICAgLy8gVGhpcyBtZWFucyB0aGUgaW5kZW50YXRpb24gaGFzIHByb2JhYmx5IG1lc3NlZCB1cCB0aGUgY3Vyc29yLgogICAgICBpZiAoY3Vyc29yID09IHdoaXRlU3BhY2UpCiAgICAgICAgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlKGN1cnNvciwgdGhpcy5jb250YWluZXIpOwogICAgfSwKCiAgICAvLyBJbmRlbnQgYWxsIGxpbmVzIHdob3NlIHN0YXJ0IGZhbGxzIGluc2lkZSBvZiB0aGUgY3VycmVudAogICAgLy8gc2VsZWN0aW9uLgogICAgaW5kZW50UmVnaW9uOiBmdW5jdGlvbihzdGFydCwgZW5kLCBkaXJlY3Rpb24pIHsKICAgICAgdmFyIGN1cnJlbnQgPSAoc3RhcnQgPSBzdGFydE9mTGluZShzdGFydCkpLCBiZWZvcmUgPSBzdGFydCAmYW1wOyZhbXA7IHN0YXJ0T2ZMaW5lKHN0YXJ0LnByZXZpb3VzU2libGluZyk7CiAgICAgIGlmIChlbmQubm9kZU5hbWUgIT0gIkJSIikgZW5kID0gZW5kT2ZMaW5lKGVuZCwgdGhpcy5jb250YWluZXIpOwoKICAgICAgZG8gewogICAgICAgIGlmIChjdXJyZW50KSB0aGlzLmhpZ2hsaWdodChiZWZvcmUsIGN1cnJlbnQsIHRydWUpOwogICAgICAgIHRoaXMuaW5kZW50TGluZUFmdGVyKGN1cnJlbnQsIGRpcmVjdGlvbik7CiAgICAgICAgYmVmb3JlID0gY3VycmVudDsKICAgICAgICBjdXJyZW50ID0gZW5kT2ZMaW5lKGN1cnJlbnQsIHRoaXMuY29udGFpbmVyKTsKICAgICAgfSB3aGlsZSAoY3VycmVudCAhPSBlbmQpOwogICAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCB7bm9kZTogc3RhcnQsIG9mZnNldDogMH0sIHtub2RlOiBlbmQsIG9mZnNldDogMH0pOwogICAgfSwKCiAgICAvLyBGaW5kIHRoZSBub2RlIHRoYXQgdGhlIGN1cnNvciBpcyBpbiwgbWFyayBpdCBhcyBkaXJ0eSwgYW5kIG1ha2UKICAgIC8vIHN1cmUgYSBoaWdobGlnaHQgcGFzcyBpcyBzY2hlZHVsZWQuCiAgICBjdXJzb3JBY3Rpdml0eTogZnVuY3Rpb24oc2FmZSkgewogICAgICBpZiAoaW50ZXJuZXRFeHBsb3JlcikgewogICAgICAgIHRoaXMuY29udGFpbmVyLmNyZWF0ZVRleHRSYW5nZSgpLmV4ZWNDb21tYW5kKCJ1bmxpbmsiKTsKICAgICAgICB0aGlzLnNlbGVjdGlvblNuYXBzaG90ID0gc2VsZWN0LnNlbGVjdGlvbkNvb3Jkcyh0aGlzLndpbik7CiAgICAgIH0KCiAgICAgIHZhciBhY3Rpdml0eSA9IHRoaXMub3B0aW9ucy5jdXJzb3JBY3Rpdml0eTsKICAgICAgaWYgKCFzYWZlIHx8IGFjdGl2aXR5KSB7CiAgICAgICAgdmFyIGN1cnNvciA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCBmYWxzZSk7CiAgICAgICAgaWYgKGN1cnNvciA9PT0gZmFsc2UgfHwgIXRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpIHJldHVybjsKICAgICAgICBjdXJzb3IgPSBjdXJzb3IgfHwgdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgICBpZiAoYWN0aXZpdHkpIGFjdGl2aXR5KGN1cnNvcik7CiAgICAgICAgaWYgKCFzYWZlKSB7CiAgICAgICAgICB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICAgICAgICB0aGlzLmFkZERpcnR5Tm9kZShjdXJzb3IpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICByZXBhcnNlQnVmZmVyOiBmdW5jdGlvbigpIHsKICAgICAgZm9yRWFjaCh0aGlzLmNvbnRhaW5lci5jaGlsZE5vZGVzLCBmdW5jdGlvbihub2RlKSB7bm9kZS5kaXJ0eSA9IHRydWU7fSk7CiAgICAgIGlmICh0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKQogICAgICAgIHRoaXMuYWRkRGlydHlOb2RlKHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpOwogICAgfSwKCiAgICAvLyBBZGQgYSBub2RlIHRvIHRoZSBzZXQgb2YgZGlydHkgbm9kZXMsIGlmIGl0IGlzbid0IGFscmVhZHkgaW4KICAgIC8vIHRoZXJlLgogICAgYWRkRGlydHlOb2RlOiBmdW5jdGlvbihub2RlKSB7CiAgICAgIG5vZGUgPSBub2RlIHx8IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgIGlmICghbm9kZSkgcmV0dXJuOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgJmx0OyB0aGlzLmRpcnR5Lmxlbmd0aDsgaSsrKQogICAgICAgIGlmICh0aGlzLmRpcnR5W2ldID09IG5vZGUpIHJldHVybjsKCiAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9IDMpCiAgICAgICAgbm9kZS5kaXJ0eSA9IHRydWU7CiAgICAgIHRoaXMuZGlydHkucHVzaChub2RlKTsKICAgIH0sCgogICAgLy8gQ2F1c2UgYSBoaWdobGlnaHQgcGFzcyB0byBoYXBwZW4gaW4gb3B0aW9ucy5wYXNzRGVsYXkKICAgIC8vIG1pbGxpc2Vjb25kcy4gQ2xlYXIgdGhlIGV4aXN0aW5nIHRpbWVvdXQsIGlmIG9uZSBleGlzdHMuIFRoaXMKICAgIC8vIHdheSwgdGhlIHBhc3NlcyBkbyBub3QgaGFwcGVuIHdoaWxlIHRoZSB1c2VyIGlzIHR5cGluZywgYW5kCiAgICAvLyBzaG91bGQgYXMgdW5vYnRydXNpdmUgYXMgcG9zc2libGUuCiAgICBzY2hlZHVsZUhpZ2hsaWdodDogZnVuY3Rpb24oKSB7CiAgICAgIC8vIFRpbWVvdXRzIGFyZSByb3V0ZWQgdGhyb3VnaCB0aGUgcGFyZW50IHdpbmRvdywgYmVjYXVzZSBvbgogICAgICAvLyBzb21lIGJyb3dzZXJzIGRlc2lnbk1vZGUgd2luZG93cyBkbyBub3QgZmlyZSB0aW1lb3V0cy4KICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICB0aGlzLnBhcmVudC5jbGVhclRpbWVvdXQodGhpcy5oaWdobGlnaHRUaW1lb3V0KTsKICAgICAgdGhpcy5oaWdobGlnaHRUaW1lb3V0ID0gdGhpcy5wYXJlbnQuc2V0VGltZW91dChmdW5jdGlvbigpe3NlbGYuaGlnaGxpZ2h0RGlydHkoKTt9LCB0aGlzLm9wdGlvbnMucGFzc0RlbGF5KTsKICAgIH0sCgogICAgLy8gRmV0Y2ggb25lIGRpcnR5IG5vZGUsIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZGlydHkgc2V0LgogICAgZ2V0RGlydHlOb2RlOiBmdW5jdGlvbigpIHsKICAgICAgd2hpbGUgKHRoaXMuZGlydHkubGVuZ3RoID4gMCkgewogICAgICAgIHZhciBmb3VuZCA9IHRoaXMuZGlydHkucG9wKCk7CiAgICAgICAgLy8gSUU4IHNvbWV0aW1lcyB0aHJvd3MgYW4gdW5leHBsYWluYWJsZSAnaW52YWxpZCBhcmd1bWVudCcKICAgICAgICAvLyBleGNlcHRpb24gZm9yIGZvdW5kLnBhcmVudE5vZGUKICAgICAgICB0cnkgewogICAgICAgICAgLy8gSWYgdGhlIG5vZGUgaGFzIGJlZW4gY29sb3VyZWQgaW4gdGhlIG1lYW50aW1lLCBvciBpcyBubwogICAgICAgICAgLy8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCwgaXQgc2hvdWxkIG5vdCBiZSByZXR1cm5lZC4KICAgICAgICAgIHdoaWxlIChmb3VuZCAmYW1wOyZhbXA7IGZvdW5kLnBhcmVudE5vZGUgIT0gdGhpcy5jb250YWluZXIpCiAgICAgICAgICAgIGZvdW5kID0gZm91bmQucGFyZW50Tm9kZQogICAgICAgICAgaWYgKGZvdW5kICZhbXA7JmFtcDsgKGZvdW5kLmRpcnR5IHx8IGZvdW5kLm5vZGVUeXBlID09IDMpKQogICAgICAgICAgICByZXR1cm4gZm91bmQ7CiAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0sCgogICAgLy8gUGljayBkaXJ0eSBub2RlcywgYW5kIGhpZ2hsaWdodCB0aGVtLCB1bnRpbAogICAgLy8gb3B0aW9ucy5saW5lc1BlclBhc3MgbGluZXMgaGF2ZSBiZWVuIGhpZ2hsaWdodGVkLiBUaGUgaGlnaGxpZ2h0CiAgICAvLyBtZXRob2Qgd2lsbCBjb250aW51ZSB0byBuZXh0IGxpbmVzIGFzIGxvbmcgYXMgaXQgZmluZHMgZGlydHkKICAgIC8vIG5vZGVzLiBJdCByZXR1cm5zIGFuIG9iamVjdCBpbmRpY2F0aW5nIHRoZSBhbW91bnQgb2YgbGluZXMKICAgIC8vIGxlZnQsIGFuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGxhY2Ugd2hlcmUgaXQgc3RvcHBlZC4gSWYKICAgIC8vIHRoZXJlIGFyZSBkaXJ0eSBub2RlcyBsZWZ0IGFmdGVyIHRoaXMgZnVuY3Rpb24gaGFzIHNwZW50IGFsbAogICAgLy8gaXRzIGxpbmVzLCBpdCBzaGVkdWxlcyBhbm90aGVyIGhpZ2hsaWdodCB0byBmaW5pc2ggdGhlIGpvYi4KICAgIGhpZ2hsaWdodERpcnR5OiBmdW5jdGlvbihmb3JjZSkgewogICAgICAvLyBQcmV2ZW50IEZGIGZyb20gcmFpc2luZyBhbiBlcnJvciB3aGVuIGl0IGlzIGZpcmluZyB0aW1lb3V0cwogICAgICAvLyBvbiBhIHBhZ2UgdGhhdCdzIG5vIGxvbmdlciBsb2FkZWQuCiAgICAgIGlmICghd2luZG93LnNlbGVjdCkgcmV0dXJuOwoKICAgICAgdmFyIGxpbmVzID0gZm9yY2UgPyBJbmZpbml0eSA6IHRoaXMub3B0aW9ucy5saW5lc1BlclBhc3M7CiAgICAgIGlmICghdGhpcy5vcHRpb25zLnJlYWRPbmx5KSBzZWxlY3QubWFya1NlbGVjdGlvbih0aGlzLndpbik7CiAgICAgIHZhciBzdGFydDsKICAgICAgd2hpbGUgKGxpbmVzID4gMCAmYW1wOyZhbXA7IChzdGFydCA9IHRoaXMuZ2V0RGlydHlOb2RlKCkpKXsKICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5oaWdobGlnaHQoc3RhcnQsIGxpbmVzKTsKICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICBsaW5lcyA9IHJlc3VsdC5sZWZ0OwogICAgICAgICAgaWYgKHJlc3VsdC5ub2RlICZhbXA7JmFtcDsgcmVzdWx0LmRpcnR5KQogICAgICAgICAgICB0aGlzLmFkZERpcnR5Tm9kZShyZXN1bHQubm9kZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdGhpcy5vcHRpb25zLnJlYWRPbmx5KSBzZWxlY3Quc2VsZWN0TWFya2VkKCk7CiAgICAgIGlmIChzdGFydCkKICAgICAgICB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICAgIHJldHVybiB0aGlzLmRpcnR5Lmxlbmd0aCA9PSAwOwogICAgfSwKCiAgICAvLyBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQgdGhyb3VnaCBhIHRpbWVvdXQsIHdpbGwKICAgIC8vIGNvbnRpbnVvdXNseSByZS1wYXJzZSB0aGUgZG9jdW1lbnQuCiAgICBkb2N1bWVudFNjYW5uZXI6IGZ1bmN0aW9uKGxpbmVzUGVyKSB7CiAgICAgIHZhciBzZWxmID0gdGhpcywgcG9zID0gbnVsbDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIC8vIElmIHRoZSBjdXJyZW50IG5vZGUgaXMgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudC4uLiBvaAogICAgICAgIC8vIHdlbGwsIHdlIHN0YXJ0IG92ZXIuCiAgICAgICAgaWYgKHBvcyAmYW1wOyZhbXA7IHBvcy5wYXJlbnROb2RlICE9IHNlbGYuY29udGFpbmVyKQogICAgICAgICAgcG9zID0gbnVsbDsKICAgICAgICBzZWxlY3QubWFya1NlbGVjdGlvbihzZWxmLndpbik7CiAgICAgICAgdmFyIHJlc3VsdCA9IHNlbGYuaGlnaGxpZ2h0KHBvcywgbGluZXNQZXIsIHRydWUpOwogICAgICAgIHNlbGVjdC5zZWxlY3RNYXJrZWQoKTsKICAgICAgICB2YXIgbmV3UG9zID0gcmVzdWx0ID8gKHJlc3VsdC5ub2RlICZhbXA7JmFtcDsgcmVzdWx0Lm5vZGUubmV4dFNpYmxpbmcpIDogbnVsbDsKICAgICAgICBwb3MgPSAocG9zID09IG5ld1BvcykgPyBudWxsIDogbmV3UG9zOwogICAgICAgIHNlbGYuZGVsYXlTY2FubmluZygpOwogICAgICB9OwogICAgfSwKCiAgICAvLyBTdGFydHMgdGhlIGNvbnRpbnVvdXMgc2Nhbm5pbmcgcHJvY2VzcyBmb3IgdGhpcyBkb2N1bWVudCBhZnRlcgogICAgLy8gYSBnaXZlbiBpbnRlcnZhbC4KICAgIGRlbGF5U2Nhbm5pbmc6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5zY2FubmVyKSB7CiAgICAgICAgdGhpcy5wYXJlbnQuY2xlYXJUaW1lb3V0KHRoaXMuZG9jdW1lbnRTY2FuKTsKICAgICAgICB0aGlzLmRvY3VtZW50U2NhbiA9IHRoaXMucGFyZW50LnNldFRpbWVvdXQodGhpcy5zY2FubmVyLCB0aGlzLm9wdGlvbnMuY29udGludW91c1NjYW5uaW5nKTsKICAgICAgfQogICAgfSwKCiAgICAvLyBUaGUgZnVuY3Rpb24gdGhhdCBkb2VzIHRoZSBhY3R1YWwgaGlnaGxpZ2h0aW5nL2NvbG91cmluZyAod2l0aAogICAgLy8gaGVscCBmcm9tIHRoZSBwYXJzZXIgYW5kIHRoZSBET00gbm9ybWFsaXplcikuIEl0cyBpbnRlcmZhY2UgaXMKICAgIC8vIHJhdGhlciBvdmVyY29tcGxpY2F0ZWQsIGJlY2F1c2UgaXQgaXMgdXNlZCBpbiBkaWZmZXJlbnQKICAgIC8vIHNpdHVhdGlvbnM6IGVuc3VyaW5nIHRoYXQgYSBjZXJ0YWluIGxpbmUgaXMgaGlnaGxpZ2h0ZWQsIG9yCiAgICAvLyBoaWdobGlnaHRpbmcgdXAgdG8gWCBsaW5lcyBzdGFydGluZyBmcm9tIGEgY2VydGFpbiBwb2ludC4gVGhlCiAgICAvLyAnZnJvbScgYXJndW1lbnQgZ2l2ZXMgdGhlIG5vZGUgYXQgd2hpY2ggaXQgc2hvdWxkIHN0YXJ0LiBJZgogICAgLy8gdGhpcyBpcyBudWxsLCBpdCB3aWxsIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50LgogICAgLy8gV2hlbiBhIG51bWJlciBvZiBsaW5lcyBpcyBnaXZlbiB3aXRoIHRoZSAndGFyZ2V0JyBhcmd1bWVudCwgaXQKICAgIC8vIHdpbGwgaGlnaGxpZ2h0IG5vIG1vcmUgdGhhbiB0aGF0IGFtb3VudCBvZiBsaW5lcy4gSWYgdGhpcwogICAgLy8gYXJndW1lbnQgaG9sZHMgYSBET00gbm9kZSwgaXQgd2lsbCBoaWdobGlnaHQgdW50aWwgaXQgcmVhY2hlcwogICAgLy8gdGhhdCBub2RlLiBJZiBhdCBhbnkgdGltZSBpdCBjb21lcyBhY3Jvc3MgYSAnY2xlYW4nIGxpbmUgKG5vCiAgICAvLyBkaXJ0eSBub2RlcyksIGl0IHdpbGwgc3RvcCwgZXhjZXB0IHdoZW4gJ2NsZWFuTGluZXMnIGlzIHRydWUuCiAgICBoaWdobGlnaHQ6IGZ1bmN0aW9uKGZyb20sIHRhcmdldCwgY2xlYW5MaW5lcywgbWF4QmFja3RyYWNrKXsKICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLCBzZWxmID0gdGhpcywgYWN0aXZlID0gdGhpcy5vcHRpb25zLmFjdGl2ZVRva2VuczsKICAgICAgdmFyIGxpbmVzID0gKHR5cGVvZiB0YXJnZXQgPT0gIm51bWJlciIgPyB0YXJnZXQgOiBudWxsKTsKCiAgICAgIGlmICghY29udGFpbmVyLmZpcnN0Q2hpbGQpCiAgICAgICAgcmV0dXJuOwogICAgICAvLyBCYWNrdHJhY2sgdG8gdGhlIGZpcnN0IG5vZGUgYmVmb3JlIGZyb20gdGhhdCBoYXMgYSBwYXJ0aWFsCiAgICAgIC8vIHBhcnNlIHN0b3JlZC4KICAgICAgd2hpbGUgKGZyb20gJmFtcDsmYW1wOyAoIWZyb20ucGFyc2VyRnJvbUhlcmUgfHwgZnJvbS5kaXJ0eSkpIHsKICAgICAgICBmcm9tID0gZnJvbS5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgaWYgKG1heEJhY2t0cmFjayAhPSBudWxsICZhbXA7JmFtcDsgZnJvbS5ub2RlTmFtZSA9PSAiQlIiICZhbXA7JmFtcDsgKC0tbWF4QmFja3RyYWNrKSAmbHQ7IDApCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgLy8gSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LCBkbyBub3RoaW5nLgogICAgICBpZiAoZnJvbSAmYW1wOyZhbXA7ICFmcm9tLm5leHRTaWJsaW5nKQogICAgICAgIHJldHVybjsKCiAgICAgIC8vIENoZWNrIHdoZXRoZXIgYSBwYXJ0ICgmbHQ7c3Bhbj4gbm9kZSkgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHRva2VuCiAgICAgIC8vIG1hdGNoLgogICAgICBmdW5jdGlvbiBjb3JyZWN0UGFydCh0b2tlbiwgcGFydCl7CiAgICAgICAgcmV0dXJuICFwYXJ0LnJlZHVjZWQgJmFtcDsmYW1wOyBwYXJ0LmN1cnJlbnRUZXh0ID09IHRva2VuLnZhbHVlICZhbXA7JmFtcDsgcGFydC5jbGFzc05hbWUgPT0gdG9rZW4uc3R5bGU7CiAgICAgIH0KICAgICAgLy8gU2hvcnRlbiB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0IGJ5IGNob3BwaW5nIG9mZgogICAgICAvLyBjaGFyYWN0ZXJzIGZyb20gdGhlIGZyb250LiBOb3RlIHRoYXQgb25seSB0aGUgY3VycmVudFRleHQKICAgICAgLy8gcHJvcGVydHkgZ2V0cyBjaGFuZ2VkLiBGb3IgZWZmaWNpZW5jeSByZWFzb25zLCB3ZSBsZWF2ZSB0aGUKICAgICAgLy8gbm9kZVZhbHVlIGFsb25lIC0tIHdlIHNldCB0aGUgcmVkdWNlZCBmbGFnIHRvIGluZGljYXRlIHRoYXQKICAgICAgLy8gdGhpcyBwYXJ0IG11c3QgYmUgcmVwbGFjZWQuCiAgICAgIGZ1bmN0aW9uIHNob3J0ZW5QYXJ0KHBhcnQsIG1pbnVzKXsKICAgICAgICBwYXJ0LmN1cnJlbnRUZXh0ID0gcGFydC5jdXJyZW50VGV4dC5zdWJzdHJpbmcobWludXMpOwogICAgICAgIHBhcnQucmVkdWNlZCA9IHRydWU7CiAgICAgIH0KICAgICAgLy8gQ3JlYXRlIGEgcGFydCBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gdG9rZW4uCiAgICAgIGZ1bmN0aW9uIHRva2VuUGFydCh0b2tlbil7CiAgICAgICAgdmFyIHBhcnQgPSBtYWtlUGFydFNwYW4odG9rZW4udmFsdWUsIHNlbGYuZG9jKTsKICAgICAgICBwYXJ0LmNsYXNzTmFtZSA9IHRva2VuLnN0eWxlOwogICAgICAgIHJldHVybiBwYXJ0OwogICAgICB9CgogICAgICBmdW5jdGlvbiBtYXliZVRvdWNoKG5vZGUpIHsKICAgICAgICBpZiAobm9kZSkgewogICAgICAgICAgaWYgKG5vZGUubmV4dFNpYmxpbmcgIT0gbm9kZS5vbGROZXh0U2libGluZykgewogICAgICAgICAgICBzZWxmLmhpc3RvcnkudG91Y2gobm9kZSk7CiAgICAgICAgICAgIG5vZGUub2xkTmV4dFNpYmxpbmcgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGlmIChzZWxmLmNvbnRhaW5lci5maXJzdENoaWxkICE9IHNlbGYuY29udGFpbmVyLm9sZEZpcnN0Q2hpbGQpIHsKICAgICAgICAgICAgc2VsZi5oaXN0b3J5LnRvdWNoKG5vZGUpOwogICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5vbGRGaXJzdENoaWxkID0gc2VsZi5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIEdldCB0aGUgdG9rZW4gc3RyZWFtLiBJZiBmcm9tIGlzIG51bGwsIHdlIHN0YXJ0IHdpdGggYSBuZXcKICAgICAgLy8gcGFyc2VyIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZSwgb3RoZXJ3aXNlIGEgcGFydGlhbCBwYXJzZQogICAgICAvLyBpcyByZXN1bWVkLgogICAgICB2YXIgdHJhdmVyc2FsID0gdHJhdmVyc2VET00oZnJvbSA/IGZyb20ubmV4dFNpYmxpbmcgOiBjb250YWluZXIuZmlyc3RDaGlsZCksCiAgICAgICAgICBzdHJlYW0gPSBzdHJpbmdTdHJlYW0odHJhdmVyc2FsKSwKICAgICAgICAgIHBhcnNlZCA9IGZyb20gPyBmcm9tLnBhcnNlckZyb21IZXJlKHN0cmVhbSkgOiBFZGl0b3IuUGFyc2VyLm1ha2Uoc3RyZWFtKTsKCiAgICAgIC8vIHBhcnRzIGlzIGFuIGludGVyZmFjZSB0byBtYWtlIGl0IHBvc3NpYmxlIHRvICdkZWxheScgZmV0Y2hpbmcKICAgICAgLy8gdGhlIG5leHQgRE9NIG5vZGUgdW50aWwgd2UgYXJlIGNvbXBsZXRlbHkgZG9uZSB3aXRoIHRoZSBvbmUKICAgICAgLy8gYmVmb3JlIGl0LiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9mdGVuIHRoZSBuZXh0IG5vZGUgaXMKICAgICAgLy8gbm90IHlldCBhdmFpbGFibGUgd2hlbiB3ZSB3YW50IHRvIHByb2NlZWQgcGFzdCB0aGUgY3VycmVudAogICAgICAvLyBvbmUuCiAgICAgIHZhciBwYXJ0cyA9IHsKICAgICAgICBjdXJyZW50OiBudWxsLAogICAgICAgIC8vIEZldGNoIGN1cnJlbnQgbm9kZS4KICAgICAgICBnZXQ6IGZ1bmN0aW9uKCl7CiAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudCkKICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdHJhdmVyc2FsLm5vZGVzLnNoaWZ0KCk7CiAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50OwogICAgICAgIH0sCiAgICAgICAgLy8gQWR2YW5jZSB0byB0aGUgbmV4dCBwYXJ0IChkbyBub3QgZmV0Y2ggaXQgeWV0KS4KICAgICAgICBuZXh0OiBmdW5jdGlvbigpewogICAgICAgICAgdGhpcy5jdXJyZW50ID0gbnVsbDsKICAgICAgICB9LAogICAgICAgIC8vIFJlbW92ZSB0aGUgY3VycmVudCBwYXJ0IGZyb20gdGhlIERPTSB0cmVlLCBhbmQgbW92ZSB0byB0aGUKICAgICAgICAvLyBuZXh0LgogICAgICAgIHJlbW92ZTogZnVuY3Rpb24oKXsKICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZCh0aGlzLmdldCgpKTsKICAgICAgICAgIHRoaXMuY3VycmVudCA9IG51bGw7CiAgICAgICAgfSwKICAgICAgICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHBhcnQgdGhhdCBpcyBub3QgZW1wdHksIGRpc2NhcmRpbmcgZW1wdHkKICAgICAgICAvLyBwYXJ0cy4KICAgICAgICBnZXROb25FbXB0eTogZnVuY3Rpb24oKXsKICAgICAgICAgIHZhciBwYXJ0ID0gdGhpcy5nZXQoKTsKICAgICAgICAgIC8vIEFsbG93IGVtcHR5IG5vZGVzIHdoZW4gdGhleSBhcmUgYWxvbmUgb24gYSBsaW5lLCBuZWVkZWQKICAgICAgICAgIC8vIGZvciB0aGUgRkYgY3Vyc29yIGJ1ZyB3b3JrYXJvdW5kIChzZWUgc2VsZWN0LmpzLAogICAgICAgICAgLy8gaW5zZXJ0TmV3bGluZUF0Q3Vyc29yKS4KICAgICAgICAgIHdoaWxlIChwYXJ0ICZhbXA7JmFtcDsgcGFydC5ub2RlTmFtZSA9PSAiU1BBTiIgJmFtcDsmYW1wOyBwYXJ0LmN1cnJlbnRUZXh0ID09ICIiKSB7CiAgICAgICAgICAgIHZhciBvbGQgPSBwYXJ0OwogICAgICAgICAgICB0aGlzLnJlbW92ZSgpOwogICAgICAgICAgICBwYXJ0ID0gdGhpcy5nZXQoKTsKICAgICAgICAgICAgLy8gQWRqdXN0IHNlbGVjdGlvbiBpbmZvcm1hdGlvbiwgaWYgYW55LiBTZWUgc2VsZWN0LmpzIGZvciBkZXRhaWxzLgogICAgICAgICAgICBzZWxlY3Quc25hcHNob3RNb3ZlKG9sZC5maXJzdENoaWxkLCBwYXJ0ICZhbXA7JmFtcDsgKHBhcnQuZmlyc3RDaGlsZCB8fCBwYXJ0KSwgMCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcGFydDsKICAgICAgICB9CiAgICAgIH07CgogICAgICB2YXIgbGluZURpcnR5ID0gZmFsc2UsIHByZXZMaW5lRGlydHkgPSB0cnVlLCBsaW5lTm9kZXMgPSAwOwoKICAgICAgLy8gVGhpcyBmb3JFYWNoIGxvb3BzIG92ZXIgdGhlIHRva2VucyBmcm9tIHRoZSBwYXJzZWQgc3RyZWFtLCBhbmQKICAgICAgLy8gYXQgdGhlIHNhbWUgdGltZSB1c2VzIHRoZSBwYXJ0cyBvYmplY3QgdG8gcHJvY2VlZCB0aHJvdWdoIHRoZQogICAgICAvLyBjb3JyZXNwb25kaW5nIERPTSBub2Rlcy4KICAgICAgZm9yRWFjaChwYXJzZWQsIGZ1bmN0aW9uKHRva2VuKXsKICAgICAgICB2YXIgcGFydCA9IHBhcnRzLmdldE5vbkVtcHR5KCk7CgogICAgICAgIGlmICh0b2tlbi52YWx1ZSA9PSAiXG4iKXsKICAgICAgICAgIC8vIFRoZSBpZGVhIG9mIHRoZSB0d28gc3RyZWFtcyBhY3R1YWxseSBzdGF5aW5nIHN5bmNocm9uaXplZAogICAgICAgICAgLy8gaXMgc3VjaCBhIGxvbmcgc2hvdCB0aGF0IHdlIGV4cGxpY2l0bHkgY2hlY2suCiAgICAgICAgICBpZiAocGFydC5ub2RlTmFtZSAhPSAiQlIiKQogICAgICAgICAgICB0aHJvdyAiUGFyc2VyIG91dCBvZiBzeW5jLiBFeHBlY3RlZCBCUi4iOwoKICAgICAgICAgIGlmIChwYXJ0LmRpcnR5IHx8ICFwYXJ0LmluZGVudGF0aW9uKSBsaW5lRGlydHkgPSB0cnVlOwogICAgICAgICAgbWF5YmVUb3VjaChmcm9tKTsKICAgICAgICAgIGZyb20gPSBwYXJ0OwoKICAgICAgICAgIC8vIEV2ZXJ5ICZsdDticj4gZ2V0cyBhIGNvcHkgb2YgdGhlIHBhcnNlciBzdGF0ZSBhbmQgYSBsZXhpY2FsCiAgICAgICAgICAvLyBjb250ZXh0IGFzc2lnbmVkIHRvIGl0LiBUaGUgZmlyc3QgaXMgdXNlZCB0byBiZSBhYmxlIHRvCiAgICAgICAgICAvLyBsYXRlciByZXN1bWUgcGFyc2luZyBmcm9tIHRoaXMgcG9pbnQsIHRoZSBzZWNvbmQgaXMgdXNlZAogICAgICAgICAgLy8gZm9yIGluZGVudGF0aW9uLgogICAgICAgICAgcGFydC5wYXJzZXJGcm9tSGVyZSA9IHBhcnNlZC5jb3B5KCk7CiAgICAgICAgICBwYXJ0LmluZGVudGF0aW9uID0gdG9rZW4uaW5kZW50YXRpb247CiAgICAgICAgICBwYXJ0LmRpcnR5ID0gZmFsc2U7CgogICAgICAgICAgLy8gSWYgdGhlIHRhcmdldCBhcmd1bWVudCB3YXNuJ3QgYW4gaW50ZWdlciwgZ28gYXQgbGVhc3QKICAgICAgICAgIC8vIHVudGlsIHRoYXQgbm9kZS4KICAgICAgICAgIGlmIChsaW5lcyA9PSBudWxsICZhbXA7JmFtcDsgcGFydCA9PSB0YXJnZXQpIHRocm93IFN0b3BJdGVyYXRpb247CgogICAgICAgICAgLy8gQSBjbGVhbiBsaW5lIHdpdGggbW9yZSB0aGFuIG9uZSBub2RlIG1lYW5zIHdlIGFyZSBkb25lLgogICAgICAgICAgLy8gVGhyb3dpbmcgYSBTdG9wSXRlcmF0aW9uIGlzIHRoZSB3YXkgdG8gYnJlYWsgb3V0IG9mIGEKICAgICAgICAgIC8vIE1vY2hpS2l0IGZvckVhY2ggbG9vcC4KICAgICAgICAgIGlmICgobGluZXMgIT0gbnVsbCAmYW1wOyZhbXA7IC0tbGluZXMgJmx0Oz0gMCkgfHwgKCFsaW5lRGlydHkgJmFtcDsmYW1wOyAhcHJldkxpbmVEaXJ0eSAmYW1wOyZhbXA7IGxpbmVOb2RlcyA+IDEgJmFtcDsmYW1wOyAhY2xlYW5MaW5lcykpCiAgICAgICAgICAgIHRocm93IFN0b3BJdGVyYXRpb247CiAgICAgICAgICBwcmV2TGluZURpcnR5ID0gbGluZURpcnR5OyBsaW5lRGlydHkgPSBmYWxzZTsgbGluZU5vZGVzID0gMDsKICAgICAgICAgIHBhcnRzLm5leHQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBpZiAocGFydC5ub2RlTmFtZSAhPSAiU1BBTiIpCiAgICAgICAgICAgIHRocm93ICJQYXJzZXIgb3V0IG9mIHN5bmMuIEV4cGVjdGVkIFNQQU4uIjsKICAgICAgICAgIGlmIChwYXJ0LmRpcnR5KQogICAgICAgICAgICBsaW5lRGlydHkgPSB0cnVlOwogICAgICAgICAgbGluZU5vZGVzKys7CgogICAgICAgICAgLy8gSWYgdGhlIHBhcnQgbWF0Y2hlcyB0aGUgdG9rZW4sIHdlIGNhbiBsZWF2ZSBpdCBhbG9uZS4KICAgICAgICAgIGlmIChjb3JyZWN0UGFydCh0b2tlbiwgcGFydCkpewogICAgICAgICAgICBwYXJ0LmRpcnR5ID0gZmFsc2U7CiAgICAgICAgICAgIHBhcnRzLm5leHQoKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBmaXggaXQuCiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbGluZURpcnR5ID0gdHJ1ZTsKICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBjb3JyZWN0IHBhcnQuCiAgICAgICAgICAgIHZhciBuZXdQYXJ0ID0gdG9rZW5QYXJ0KHRva2VuKTsKICAgICAgICAgICAgY29udGFpbmVyLmluc2VydEJlZm9yZShuZXdQYXJ0LCBwYXJ0KTsKICAgICAgICAgICAgaWYgKGFjdGl2ZSkgYWN0aXZlKG5ld1BhcnQsIHRva2VuLCBzZWxmKTsKICAgICAgICAgICAgdmFyIHRva2Vuc2l6ZSA9IHRva2VuLnZhbHVlLmxlbmd0aDsKICAgICAgICAgICAgdmFyIG9mZnNldCA9IDA7CiAgICAgICAgICAgIC8vIEVhdCB1cCBwYXJ0cyB1bnRpbCB0aGUgdGV4dCBmb3IgdGhpcyB0b2tlbiBoYXMgYmVlbgogICAgICAgICAgICAvLyByZW1vdmVkLCBhZGp1c3RpbmcgdGhlIHN0b3JlZCBzZWxlY3Rpb24gaW5mbyAoc2VlCiAgICAgICAgICAgIC8vIHNlbGVjdC5qcykgaW4gdGhlIHByb2Nlc3MuCiAgICAgICAgICAgIHdoaWxlICh0b2tlbnNpemUgPiAwKSB7CiAgICAgICAgICAgICAgcGFydCA9IHBhcnRzLmdldCgpOwogICAgICAgICAgICAgIHZhciBwYXJ0c2l6ZSA9IHBhcnQuY3VycmVudFRleHQubGVuZ3RoOwogICAgICAgICAgICAgIHNlbGVjdC5zbmFwc2hvdFJlcGxhY2VOb2RlKHBhcnQuZmlyc3RDaGlsZCwgbmV3UGFydC5maXJzdENoaWxkLCB0b2tlbnNpemUsIG9mZnNldCk7CiAgICAgICAgICAgICAgaWYgKHBhcnRzaXplID4gdG9rZW5zaXplKXsKICAgICAgICAgICAgICAgIHNob3J0ZW5QYXJ0KHBhcnQsIHRva2Vuc2l6ZSk7CiAgICAgICAgICAgICAgICB0b2tlbnNpemUgPSAwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRva2Vuc2l6ZSAtPSBwYXJ0c2l6ZTsKICAgICAgICAgICAgICAgIG9mZnNldCArPSBwYXJ0c2l6ZTsKICAgICAgICAgICAgICAgIHBhcnRzLnJlbW92ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIG1heWJlVG91Y2goZnJvbSk7CiAgICAgIHdlYmtpdExhc3RMaW5lSGFjayh0aGlzLmNvbnRhaW5lcik7CgogICAgICAvLyBUaGUgZnVuY3Rpb24gcmV0dXJucyBzb21lIHN0YXR1cyBpbmZvcm1hdGlvbiB0aGF0IGlzIHVzZWQgYnkKICAgICAgLy8gaGlnaHRsaWdodERpcnR5IHRvIGRldGVybWluZSB3aGV0aGVyIGFuZCB3aGVyZSBpdCBoYXMgdG8KICAgICAgLy8gY29udGludWUuCiAgICAgIHJldHVybiB7bGVmdDogbGluZXMsCiAgICAgICAgICAgICAgbm9kZTogcGFydHMuZ2V0Tm9uRW1wdHkoKSwKICAgICAgICAgICAgICBkaXJ0eTogbGluZURpcnR5fTsKICAgIH0KICB9OwoKICByZXR1cm4gRWRpdG9yOwp9KSgpOwoKICBhZGRFdmVudEhhbmRsZXIod2luZG93LCAibG9hZCIsIGZ1bmN0aW9uKCkgewogICAgICB2YXIgQ29kZU1pcnJvciA9IHdpbmRvdy5mcmFtZUVsZW1lbnQuQ29kZU1pcnJvcjsKICAgICAgQ29kZU1pcnJvci5lZGl0b3IgPSBuZXcgRWRpdG9yKENvZGVNaXJyb3Iub3B0aW9ucyk7CiAgICAgIHRoaXMucGFyZW50LnNldFRpbWVvdXQobWV0aG9kKENvZGVNaXJyb3IsICJpbml0IiksIDApOwogIH0pOwo8L3RleHRhcmVhPgo8L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICB2YXIgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29kZScpOwogIHZhciBlZGl0b3IgPSBuZXcgQ29kZU1pcnJvcihDb2RlTWlycm9yLnJlcGxhY2UodGV4dGFyZWEpLCB7CiAgICBoZWlnaHQ6ICI3NTBweCIsCiAgICB3aWR0aDogIjEwMCUiLAogICAgY29udGVudDogdGV4dGFyZWEudmFsdWUsCiAgICBwYXJzZXJmaWxlOiBbInRva2VuaXplamF2YXNjcmlwdC5qcyIsICJwYXJzZWphdmFzY3JpcHQuanMiXSwKICAgIHN0eWxlc2hlZXQ6ICJjc3MvanNjb2xvcnMuY3NzIiwKICAgIHBhdGg6ICJqcy8iLAogICAgYXV0b01hdGNoUGFyZW5zOiB0cnVlLAogICAgaW5pdENhbGxiYWNrOiBmdW5jdGlvbihlZGl0b3Ipe2VkaXRvci53aW4uZG9jdW1lbnQuYm9keS5sYXN0Q2hpbGQuc2Nyb2xsSW50b1ZpZXcoKTt9CiAgfSk7Cjwvc2NyaXB0PgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/css/luacolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmVkaXRib3ggewogIG1hcmdpbjogLjRlbTsKICBwYWRkaW5nOiAwOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxMHB0OwogIGNvbG9yOiBibGFjazsKfQoKcHJlLmNvZGUsIC5lZGl0Ym94IHsKICBjb2xvcjogIzY2NjY2NjsKfQoKLmVkaXRib3ggcCB7CiAgbWFyZ2luOiAwOwp9CgpzcGFuLmx1YS1jb21tZW50IHsKICBjb2xvcjogI0JCOTk3NzsKfQoKc3Bhbi5sdWEta2V5d29yZCB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgY29sb3I6IGJsdWU7Cn0KCnNwYW4ubHVhLXN0cmluZyB7CiAgY29sb3I6ICNBQTIyMjI7Cn0KCnNwYW4ubHVhLXN0ZGZ1bmMgewogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGNvbG9yOiAjMDc3Owp9CnNwYW4ubHVhLWN1c3RvbWZ1bmMgewogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGNvbG9yOiAjMEFBOwp9CgoKc3Bhbi5sdWEtaWRlbnRpZmllciB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLmx1YS1udW1iZXIgewogIGNvbG9yOiAjM0EzOwp9CgpzcGFuLmx1YS10b2tlbiB7CiAgY29sb3I6ICMxNTE7Cn0KCnNwYW4ubHVhLWVycm9yIHsKICBjb2xvcjogI0ZGRjsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjAwOwp9CgoKCgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2pzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogTHVhIGRlbW9uc3RyYXRpb248L3RpdGxlPgogIDwvaGVhZD4KICA8Ym9keSBzdHlsZT0icGFkZGluZzogMjBweDsiPgoKPHA+VGhpcyBwYWdlIGRlbW9uc3RyYXRlcyA8YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Db2RlTWlycm9yPC9hPidzCkx1YSBwYXJzZXIuIFdyaXR0ZW4gYnkgPGEgaHJlZj0iaHR0cDovL2ZyYW5jaW8ucGwvIj5GcmFuY2lzemVrCldhd3J6YWs8L2E+LCByZWxlYXNlZCB1bmRlciBhIEJTRC1zdHlsZSA8YQpocmVmPSJMSUNFTlNFIj5saWNlbnNlPC9hPi48L3A+Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsgcGFkZGluZzogMHB4OyI+Cjx0ZXh0YXJlYSBpZD0iY29kZSIgY29scz0iMTIwIiByb3dzPSIzMCI+Ci0tW1sKZXhhbXBsZSB1c2VsZXNzIGNvZGUgdG8gc2hvdyBsdWEgc3ludGF4IGhpZ2hsaWdodGluZwp0aGlzIGlzIG11bHRpbGluZSBjb21tZW50Cl1dCgpmdW5jdGlvbiBibGFoYmxhaGJsYWgoeCkKCiAgbG9jYWwgdGFibGUgPSB7CiAgICAiYXNkIiA9IDEyMywKICAgICJ4IiA9IDAuMzQsICAKICB9CiAgaWYgeCB+PSAzIHRoZW4KICAgIHByaW50KCB4ICkKICBlbHNlaWYgeCA9PSAic3RyaW5nIgogICAgbXlfY3VzdG9tX2Z1bmN0aW9uKCAweDM0ICkKICBlbHNlCiAgICB1bmtub3duX2Z1bmN0aW9uKCAic29tZSBzdHJpbmciICkKICBlbmQKCiAgLS1zaW5nbGUgbGluZSBjb21tZW50CiAgCmVuZAoKZnVuY3Rpb24gYmxhYmxhYmxhMygpCgogIGZvciBrLHYgaW4gaXBhaXJzKCB0YWJsZSApIGRvCiAgICAtLWFiY2RlLi4KICAgIHk9Wz1bCiAgeD1bWwogICAgICB4IGlzIGEgbXVsdGkgbGluZSBzdHJpbmcKICAgXV0KICBidXQgaXRzIGRlZmluaXRpb24gaXMgaXNpZGUgYSBoaWdoZXN0IGxldmVsIHN0cmluZyEKICBdPV0KICAgIHByaW50KCIgXCJcIiAiKQogIC0tdGhpcyBtYXJrcyBhIHBhcnNlciBlcnJvcjoKICBzID0gWz09IGFzZGFzZGFzZF1dCgogICAgcyA9IG1hdGguc2luKCB4ICkKICBlbmQKCmVuZAo8L3RleHRhcmVhPgo8L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoJ2NvZGUnLCB7CiAgICBoZWlnaHQ6ICIzNTBweCIsCiAgICBwYXJzZXJmaWxlOiAiLi4vY29udHJpYi9sdWEvanMvcGFyc2VsdWEuanMiLAogICAgc3R5bGVzaGVldDogImNzcy9sdWFjb2xvcnMuY3NzIiwKICAgIHBhdGg6ICIuLi8uLi9qcy8iCiAgfSk7Cjwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/js/parselua.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogCiBTaW1wbGUgcGFyc2VyIGZvciBMVUEgCiBXcml0dGVuIGZvciBMdWEgNS4xLCBiYXNlZCBvbiBwYXJzZWNzcyBhbmQgb3RoZXIgcGFyc2Vycy4gCiBmZWF0dXJlczogaGlnaGxpZ2h0cyBrZXl3b3Jkcywgc3RyaW5ncywgY29tbWVudHMgKG5vIGxldmVsaW5nIHN1cHBvcnRlZCEgKCJbPT1bIikpLHRva2VucywgYmFzaWMgaW5kZW50aW5nCgogdG8gbWFrZSB0aGlzIHBhcnNlciBoaWdobGlnaHQgeW91ciBzcGVjaWFsIGZ1bmN0aW9ucyBwYXNzIHRhYmxlIHdpdGggdGhpcyBmdW5jdGlvbnMgbmFtZXMgdG8gcGFyc2VyQ29uZmlnIGFyZ3VtZW50IG9mIGNyZWF0b3IsCgkKIHBhcnNlckNvbmZpZzogWyJteWZ1bmN0aW9uMSIsIm15ZnVuY3Rpb24yIl0sCiAqLwoKIApmdW5jdGlvbiBmaW5kRmlyc3RSZWdleHAod29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKD86IiArIHdvcmRzLmpvaW4oInwiKSArICIpIiwgImkiKTsKfQoKZnVuY3Rpb24gbWF0Y2hSZWdleHAod29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKD86IiArIHdvcmRzLmpvaW4oInwiKSArICIpJCIsICJpIik7Cn0KCgogCnZhciBsdWFDdXN0b21GdW5jdGlvbnM9IG1hdGNoUmVnZXhwKFtdKTsKIApmdW5jdGlvbiBjb25maWd1cmVMVUEocGFyc2VyQ29uZmlnKXsKCWlmKHBhcnNlckNvbmZpZykKCWx1YUN1c3RvbUZ1bmN0aW9ucz0gbWF0Y2hSZWdleHAocGFyc2VyQ29uZmlnKTsKfQoKCi8vbG9uZyBsaXN0IG9mIHN0YW5kYXJkIGZ1bmN0aW9ucyBmcm9tIGx1YSBtYW51YWwKdmFyIGx1YVN0ZEZ1bmN0aW9ucyA9IG1hdGNoUmVnZXhwKFsKIl9HIiwiX1ZFUlNJT04iLCJhc3NlcnQiLCJjb2xsZWN0Z2FyYmFnZSIsImRvZmlsZSIsImVycm9yIiwiZ2V0ZmVudiIsImdldG1ldGF0YWJsZSIsImlwYWlycyIsImxvYWQiLCJsb2FkZmlsZSIsImxvYWRzdHJpbmciLCJtb2R1bGUiLCJuZXh0IiwicGFpcnMiLCJwY2FsbCIsInByaW50IiwicmF3ZXF1YWwiLCJyYXdnZXQiLCJyYXdzZXQiLCJyZXF1aXJlIiwic2VsZWN0Iiwic2V0ZmVudiIsInNldG1ldGF0YWJsZSIsInRvbnVtYmVyIiwidG9zdHJpbmciLCJ0eXBlIiwidW5wYWNrIiwieHBjYWxsIiwKCiJjb3JvdXRpbmUuY3JlYXRlIiwiY29yb3V0aW5lLnJlc3VtZSIsImNvcm91dGluZS5ydW5uaW5nIiwiY29yb3V0aW5lLnN0YXR1cyIsImNvcm91dGluZS53cmFwIiwiY29yb3V0aW5lLnlpZWxkIiwKCiJkZWJ1Zy5kZWJ1ZyIsImRlYnVnLmdldGZlbnYiLCJkZWJ1Zy5nZXRob29rIiwiZGVidWcuZ2V0aW5mbyIsImRlYnVnLmdldGxvY2FsIiwiZGVidWcuZ2V0bWV0YXRhYmxlIiwiZGVidWcuZ2V0cmVnaXN0cnkiLCJkZWJ1Zy5nZXR1cHZhbHVlIiwiZGVidWcuc2V0ZmVudiIsImRlYnVnLnNldGhvb2siLCJkZWJ1Zy5zZXRsb2NhbCIsImRlYnVnLnNldG1ldGF0YWJsZSIsImRlYnVnLnNldHVwdmFsdWUiLCJkZWJ1Zy50cmFjZWJhY2siLAoKImNsb3NlIiwiZmx1c2giLCJsaW5lcyIsInJlYWQiLCJzZWVrIiwic2V0dmJ1ZiIsIndyaXRlIiwKCiJpby5jbG9zZSIsImlvLmZsdXNoIiwiaW8uaW5wdXQiLCJpby5saW5lcyIsImlvLm9wZW4iLCJpby5vdXRwdXQiLCJpby5wb3BlbiIsImlvLnJlYWQiLCJpby5zdGRlcnIiLCJpby5zdGRpbiIsImlvLnN0ZG91dCIsImlvLnRtcGZpbGUiLCJpby50eXBlIiwiaW8ud3JpdGUiLAoKIm1hdGguYWJzIiwibWF0aC5hY29zIiwibWF0aC5hc2luIiwibWF0aC5hdGFuIiwibWF0aC5hdGFuMiIsIm1hdGguY2VpbCIsIm1hdGguY29zIiwibWF0aC5jb3NoIiwibWF0aC5kZWciLCJtYXRoLmV4cCIsIm1hdGguZmxvb3IiLCJtYXRoLmZtb2QiLCJtYXRoLmZyZXhwIiwibWF0aC5odWdlIiwibWF0aC5sZGV4cCIsIm1hdGgubG9nIiwibWF0aC5sb2cxMCIsIm1hdGgubWF4IiwibWF0aC5taW4iLCJtYXRoLm1vZGYiLCJtYXRoLnBpIiwibWF0aC5wb3ciLCJtYXRoLnJhZCIsIm1hdGgucmFuZG9tIiwibWF0aC5yYW5kb21zZWVkIiwibWF0aC5zaW4iLCJtYXRoLnNpbmgiLCJtYXRoLnNxcnQiLCJtYXRoLnRhbiIsIm1hdGgudGFuaCIsCgoib3MuY2xvY2siLCJvcy5kYXRlIiwib3MuZGlmZnRpbWUiLCJvcy5leGVjdXRlIiwib3MuZXhpdCIsIm9zLmdldGVudiIsIm9zLnJlbW92ZSIsIm9zLnJlbmFtZSIsIm9zLnNldGxvY2FsZSIsIm9zLnRpbWUiLCJvcy50bXBuYW1lIiwKCiJwYWNrYWdlLmNwYXRoIiwicGFja2FnZS5sb2FkZWQiLCJwYWNrYWdlLmxvYWRlcnMiLCJwYWNrYWdlLmxvYWRsaWIiLCJwYWNrYWdlLnBhdGgiLCJwYWNrYWdlLnByZWxvYWQiLCJwYWNrYWdlLnNlZWFsbCIsCgoic3RyaW5nLmJ5dGUiLCJzdHJpbmcuY2hhciIsInN0cmluZy5kdW1wIiwic3RyaW5nLmZpbmQiLCJzdHJpbmcuZm9ybWF0Iiwic3RyaW5nLmdtYXRjaCIsInN0cmluZy5nc3ViIiwic3RyaW5nLmxlbiIsInN0cmluZy5sb3dlciIsInN0cmluZy5tYXRjaCIsInN0cmluZy5yZXAiLCJzdHJpbmcucmV2ZXJzZSIsInN0cmluZy5zdWIiLCJzdHJpbmcudXBwZXIiLAoKInRhYmxlLmNvbmNhdCIsInRhYmxlLmluc2VydCIsInRhYmxlLm1heG4iLCJ0YWJsZS5yZW1vdmUiLCJ0YWJsZS5zb3J0IgpdKTsKCgoKIHZhciBsdWFLZXl3b3JkcyA9IG1hdGNoUmVnZXhwKFsiYW5kIiwiYnJlYWsiLCJlbHNlaWYiLCJmYWxzZSIsIm5pbCIsIm5vdCIsIm9yIiwicmV0dXJuIiwKCQkJCSJ0cnVlIiwiZnVuY3Rpb24iLCAiZW5kIiwgImlmIiwgInRoZW4iLCAiZWxzZSIsICJkbyIsIAoJCQkJIndoaWxlIiwgInJlcGVhdCIsICJ1bnRpbCIsICJmb3IiLCAiaW4iLCAibG9jYWwiIF0pOwoKIHZhciBsdWFJbmRlbnRLZXlzID0gbWF0Y2hSZWdleHAoWyJmdW5jdGlvbiIsICJpZiIsInJlcGVhdCIsImZvciIsIndoaWxlIiwgIltcKF0iLCAieyJdKTsKIHZhciBsdWFVbmluZGVudEtleXMgPSBtYXRjaFJlZ2V4cChbImVuZCIsICJ1bnRpbCIsICJbXCldIiwgIn0iXSk7CgogdmFyIGx1YVVuaW5kZW50S2V5czIgPSBmaW5kRmlyc3RSZWdleHAoWyJlbmQiLCAidW50aWwiLCAiW1wpXSIsICJ9Il0pOwogdmFyIGx1YU1pZGRsZUtleXMgPSBmaW5kRmlyc3RSZWdleHAoWyJlbHNlIiwiZWxzZWlmIl0pOwoKCgp2YXIgTFVBUGFyc2VyID0gRWRpdG9yLlBhcnNlciA9IChmdW5jdGlvbigpIHsKICB2YXIgdG9rZW5pemVMVUEgPSAoZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiBub3JtYWwoc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwoKICAgaWYgKGNoID09ICItIiAmJiBzb3VyY2UuZXF1YWxzKCItIikpIHsKICAgICAgICBzb3VyY2UubmV4dCgpOwogCQlzZXRTdGF0ZShpblNMQ29tbWVudCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0gCgllbHNlIGlmIChjaCA9PSAiXCIiIHx8IGNoID09ICInIikgewogICAgICAgIHNldFN0YXRlKGluU3RyaW5nKGNoKSk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIGlmIChjaCA9PSAiWyIgJiYgKHNvdXJjZS5lcXVhbHMoIlsiKSB8fCBzb3VyY2UuZXF1YWxzKCI9IikpKSB7CiAgICAgICAgdmFyIGxldmVsID0gMDsKCQl3aGlsZShzb3VyY2UuZXF1YWxzKCI9IikpewoJCQlsZXZlbCArKzsKCQkJc291cmNlLm5leHQoKTsKCQl9CgkJaWYoISBzb3VyY2UuZXF1YWxzKCJbIikgKQoJCQlyZXR1cm4gImx1YS1lcnJvciI7CQkKCQlzZXRTdGF0ZShpbk1MU29tZXRoaW5nKGxldmVsLCJsdWEtc3RyaW5nIikpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9IAoJICAgIAogICAgICBlbHNlIGlmIChjaCA9PSAiPSIpIHsKCWlmIChzb3VyY2UuZXF1YWxzKCI9IikpCgkJc291cmNlLm5leHQoKTsKICAgICAgICByZXR1cm4gImx1YS10b2tlbiI7CiAgICAgIH0KICAJCiAgICAgIGVsc2UgaWYgKGNoID09ICIuIikgewoJaWYgKHNvdXJjZS5lcXVhbHMoIi4iKSkKCQlzb3VyY2UubmV4dCgpOwoJaWYgKHNvdXJjZS5lcXVhbHMoIi4iKSkKCQlzb3VyY2UubmV4dCgpOwogICAgICAgIHJldHVybiAibHVhLXRva2VuIjsKICAgICAgfQogICAgIAogICAgICBlbHNlIGlmIChjaCA9PSAiKyIgfHwgY2ggPT0gIi0iIHx8IGNoID09ICIqIiB8fCBjaCA9PSAiLyIgfHwgY2ggPT0gIiUiIHx8IGNoID09ICJeIiB8fCBjaCA9PSAiIyIgKSB7CiAgICAgICAgcmV0dXJuICJsdWEtdG9rZW4iOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICI+IiB8fCBjaCA9PSAiPCIgfHwgY2ggPT0gIigiIHx8IGNoID09ICIpIiB8fCBjaCA9PSAieyIgfHwgY2ggPT0gIn0iIHx8IGNoID09ICJbIiApIHsKICAgICAgICByZXR1cm4gImx1YS10b2tlbiI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIl0iIHx8IGNoID09ICI7IiB8fCBjaCA9PSAiOiIgfHwgY2ggPT0gIiwiKSB7CiAgICAgICAgcmV0dXJuICJsdWEtdG9rZW4iOwogICAgICB9CiAgICAgIGVsc2UgaWYgKHNvdXJjZS5lcXVhbHMoIj0iKSAmJiAoY2ggPT0gIn4iIHx8IGNoID09ICI8IiB8fCBjaCA9PSAiPiIpKSB7CiAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICByZXR1cm4gImx1YS10b2tlbiI7CiAgICAgIH0KCiAgICAgZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHcuJV0vKTsKICAgICAgICByZXR1cm4gImx1YS1udW1iZXIiOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHdcXFwtXy5dLyk7CiAgICAgICAgcmV0dXJuICJsdWEtaWRlbnRpZmllciI7CiAgICAgIH0KICAgIH0KIApmdW5jdGlvbiBpblNMQ29tbWVudChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBzdGFydCA9IHRydWU7Cgl2YXIgY291bnQ9MDsKICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKCSAJdmFyIGNoID0gc291cmNlLm5leHQoKTsKCQl2YXIgbGV2ZWwgPSAwOwoJCWlmICgoY2ggPT0iWyIpICYmIHN0YXJ0KQoJCQl3aGlsZShzb3VyY2UuZXF1YWxzKCI9IikpewoJCQlzb3VyY2UubmV4dCgpOwoJCQlsZXZlbCsrOwoJCQl9CgkJCWlmIChzb3VyY2UuZXF1YWxzKCJbIikpewogICAgICAgCQkJCXNldFN0YXRlKGluTUxTb21ldGhpbmcobGV2ZWwsImx1YS1jb21tZW50IikpOwogICAgICAgIAkJCXJldHVybiBudWxsOwogIAkJCQl9CgkJIHN0YXJ0ID0gZmFsc2U7CQoJfQoJc2V0U3RhdGUobm9ybWFsKTsgICAgICAJCQogICAgIHJldHVybiAibHVhLWNvbW1lbnQiOwoJCiAgICB9CgogICAgZnVuY3Rpb24gaW5NTFNvbWV0aGluZyhsZXZlbCx3aGF0KSB7CgkvL3dhdCBzaG9sdWQgYmUgImx1YS1zdHJpbmciIG9yICJsdWEtY29tbWVudCIsIGxldmVsIGlzIHRoZSBudW1iZXIgb2YgIj0iIGluIG9wZW5pbmcgbWFyay4KCXJldHVybiBmdW5jdGlvbihzb3VyY2UsIHNldFN0YXRlKXsKICAgICAgdmFyIGRhc2hlcyA9IDA7CiAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgdmFyIGNoID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAoZGFzaGVzID09IGxldmVsKzEgJiYgY2ggPT0gIl0iICkgewogICAgICAgICAgc2V0U3RhdGUobm9ybWFsKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCQlpZiAoZGFzaGVzID09IDApIAoJCQlkYXNoZXMgPSAoY2ggPT0gIl0iKSA/IDE6MDsKCQllbHNlCiAJCQlkYXNoZXMgPSAoY2ggPT0gIj0iKSA/IGRhc2hlcyArIDEgOiAwOwogICAgICAgIH0KICAgICAgcmV0dXJuIHdoYXQ7CgkgfQogICAgfQoKCiAgICBmdW5jdGlvbiBpblN0cmluZyhxdW90ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKICAgICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIGNoID09ICJcXCI7CiAgICAgICAgfQogICAgICAgIGlmICghZXNjYXBlZCkKICAgICAgICAgIHNldFN0YXRlKG5vcm1hbCk7CiAgICAgICAgcmV0dXJuICJsdWEtc3RyaW5nIjsKICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzdGFydFN0YXRlKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZXIoc291cmNlLCBzdGFydFN0YXRlIHx8IG5vcm1hbCk7CiAgICB9OwogIH0pKCk7CgogIGZ1bmN0aW9uIGluZGVudExVQShpbmRlbnREZXB0aCwgYmFzZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKG5leHRDaGFycykgewoKICAgICAgdmFyIGNsb3NpbmcgPSAobHVhVW5pbmRlbnRLZXlzMi50ZXN0KG5leHRDaGFycykgfHwgbHVhTWlkZGxlS2V5cy50ZXN0KG5leHRDaGFycykpOwoKIAkKCXJldHVybiBiYXNlICsgKCBpbmRlbnRVbml0ICogKGluZGVudERlcHRoIC0gKGNsb3Npbmc/MTowKSkgKTsKICAgIH07CiAgfQoKICAKZnVuY3Rpb24gcGFyc2VMVUEoc291cmNlLGJhc2Vjb2x1bW4pIHsKICAgICBiYXNlY29sdW1uID0gYmFzZWNvbHVtbiB8fCAwOwogICAgCgl2YXIgdG9rZW5zID0gdG9rZW5pemVMVUEoc291cmNlKTsKICAgIHZhciBpbmRlbnREZXB0aCA9IDA7CgogICAgdmFyIGl0ZXIgPSB7CiAgICAgIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB0b2tlbiA9IHRva2Vucy5uZXh0KCksIHN0eWxlID0gdG9rZW4uc3R5bGUsIGNvbnRlbnQgPSB0b2tlbi5jb250ZW50OwoKIAoJCglpZiAoc3R5bGUgPT0gImx1YS1pZGVudGlmaWVyIiAmJiBsdWFLZXl3b3Jkcy50ZXN0KGNvbnRlbnQpKXsKCSAgdG9rZW4uc3R5bGUgPSAibHVhLWtleXdvcmQiOwoJfQkKCWlmIChzdHlsZSA9PSAibHVhLWlkZW50aWZpZXIiICYmIGx1YVN0ZEZ1bmN0aW9ucy50ZXN0KGNvbnRlbnQpKXsKCSAgdG9rZW4uc3R5bGUgPSAibHVhLXN0ZGZ1bmMiOwoJfQoJaWYgKHN0eWxlID09ICJsdWEtaWRlbnRpZmllciIgJiYgbHVhQ3VzdG9tRnVuY3Rpb25zLnRlc3QoY29udGVudCkpewoJICB0b2tlbi5zdHlsZSA9ICJsdWEtY3VzdG9tZnVuYyI7Cgl9CgoJaWYgKGx1YUluZGVudEtleXMudGVzdChjb250ZW50KSkKICAgIAlpbmRlbnREZXB0aCsrOwoJZWxzZSBpZiAobHVhVW5pbmRlbnRLZXlzLnRlc3QoY29udGVudCkpCgkJaW5kZW50RGVwdGgtLTsKICAgICAgICAKCiAgICAgICAgaWYgKGNvbnRlbnQgPT0gIlxuIikKICAgICAgICAgIHRva2VuLmluZGVudGF0aW9uID0gaW5kZW50TFVBKCBpbmRlbnREZXB0aCwgYmFzZWNvbHVtbik7CgogICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgfSwKCiAgICAgIGNvcHk6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciAgX3Rva2VuU3RhdGUgPSB0b2tlbnMuc3RhdGUsIF9pbmRlbnREZXB0aCA9IGluZGVudERlcHRoOwogICAgICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UpIHsKICAgICAgICAgIHRva2VucyA9IHRva2VuaXplTFVBKHNvdXJjZSwgX3Rva2VuU3RhdGUpOwogICAgICAKCSAgaW5kZW50RGVwdGggPSBfaW5kZW50RGVwdGg7CiAgICAgICAgICByZXR1cm4gaXRlcjsKICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGl0ZXI7CiAgfQoKICByZXR1cm4ge21ha2U6IHBhcnNlTFVBLCBjb25maWd1cmU6Y29uZmlndXJlTFVBLCBlbGVjdHJpY0NoYXJzOiAiZGVsZn0pIn07ICAgLy9lbltkXSBlbHNbZV0gdW50aVtsXSBlbHNlaVtmXSAgLy8gdGhpcyBzaG91bGQgYmUgdGFrZW4gZnJvbSBLZXlzIGtleXdvcmRzCn0pKCk7Cgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChjKSAyMDA5LCBGcmFuY2lzemVrIFdhd3J6YWsKQWxsIHJpZ2h0cyByZXNlcnZlZC4KClRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgZm9yIHVzZSBpbiBjb25uZWN0aW9uIHdpdGggdGhlCkNvZGVNaXJyb3Igc3VpdGUgb2YgbW9kdWxlcyBhbmQgdXRpbGl0aWVzLCBob3N0ZWQgYW5kIG1haW50YWluZWQKYXQgaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci8uCgpSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsCndpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUKZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKCiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQogIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKICBmb2xsb3dpbmcgZGlzY2xhaW1lci4KCiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQogIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwoiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVApMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwpGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCklOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCkJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgpDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFClBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/css/phpcolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhlIGNvcHlyaWdodHMgZW1ib2RpZWQgaW4gdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGFyZSBsaWNlbnNlZCBieQpZYWhvbyEgSW5jLiB1bmRlciB0aGUgQlNEIChyZXZpc2VkKSBvcGVuIHNvdXJjZSBsaWNlbnNlCgpAYXV0aG9yIERhbiBWbGFkIERhc2NhbGVzY3UgPGRhbmR2QHlhaG9vLWluYy5jb20+CiovCgouZWRpdGJveCB7CiAgbWFyZ2luOiAuNGVtOwogIHBhZGRpbmc6IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7Cn0KCi8qV2Ugc2hvdWxkIGRlZmluZSBzcGVjaWZpYyBzdHlsZXMgZm9yIGV2ZXJ5IGVsZW1lbnQgb2YgdGhlIHN5bnRheC4KICB0aGUgc2V0dGluZyBiZWxvdyB3aWxsIGNhdXNlIHNvbWUgYW5ub3lpbmcgY29sb3IgdG8gc2hvdyB0aHJvdWdoIGlmIHdlIG1pc3NlZAogIGRlZmluaW5nIGEgc3R5bGUgZm9yIGEgdG9rZW4uIFRoaXMgaXMgYWxzbyB0aGUgImNvbG9yIiBvZiB0aGUgd2hpdGVzcGFjZSBhbmQKICBvZiB0aGUgY3Vyc29yLgoqLwpwcmUuY29kZSwgLmVkaXRib3ggewogIGNvbG9yOiByZWQ7Cn0KCi5lZGl0Ym94IHAgewogIG1hcmdpbjogMDsKfQoKc3Bhbi5waHAtcHVuY3R1YXRpb24gewogIGNvbG9yOiBibHVlOwp9CgpzcGFuLnBocC1rZXl3b3JkIHsKICBjb2xvcjogIzc3MDA4ODsKICBmb250LXdlaWdodDogYm9sZDsKfQoKc3Bhbi5waHAtb3BlcmF0b3IgewogIGNvbG9yOiBibHVlOwp9CgovKiBfX0ZJTEVfXyBldGMuOyBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vcmVzZXJ2ZWQucGhwICovCnNwYW4ucGhwLWNvbXBpbGUtdGltZS1jb25zdGFudCB7CiAgY29sb3I6ICM3NzYwODg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi8qIG91dHB1dCBvZiBnZXRfZGVmaW5lZF9jb25zdGFudHMoKS4gRGlmZmVycyBmcm9tIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9yZXNlcnZlZC5jb25zdGFudHMucGhwICovCnNwYW4ucGhwLXByZWRlZmluZWQtY29uc3RhbnQgewogIGNvbG9yOiBkYXJrZ3JlZW47CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi8qIFBIUCByZXNlcnZlZCAibGFuZ3VhZ2UgY29uc3RydWN0cyIuLi4gZWNobygpIGV0Yy47IGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9yZXNlcnZlZC5waHAgKi8Kc3Bhbi5waHAtcmVzZXJ2ZWQtbGFuZ3VhZ2UtY29uc3RydWN0IHsKICBjb2xvcjogZ3JlZW47CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi8qIFBIUCBidWlsdC1pbiBmdW5jdGlvbnM6IGdsb2IoKSwgY2hyKCkgZXRjLjsgb3V0cHV0IG9mIGdldF9kZWZpbmVkX2Z1bmN0aW9ucygpWyJpbnRlcm5hbCJdICovCnNwYW4ucGhwLXByZWRlZmluZWQtZnVuY3Rpb24gewogIGNvbG9yOiBncmVlbjsKfQoKLyogUEhQIHByZWRlZmluZWQgY2xhc3NlczogUERPLCBFeGNlcHRpb24gZXRjLjsgb3V0cHV0IG9mIGdldF9kZWNsYXJlZF9jbGFzc2VzKCkgYW5kIGRpZmZlcmVudCBmcm9tIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9yZXNlcnZlZC5jbGFzc2VzLnBocCAqLwpzcGFuLnBocC1wcmVkZWZpbmVkLWNsYXNzIHsKICBjb2xvcjogZ3JlZW47Cn0KCnNwYW4ucGhwLWF0b20gewogIGNvbG9yOiAjMjI4ODExOwp9CgovKiBjbGFzcywgaW50ZXJmYWNlLCBuYW1lc3BhY2Ugb3IgZnVuY3Rpb24gbmFtZXMsIGJ1dCBub3QgJHZhcmlhYmxlcyAqLwpzcGFuLnBocC10X3N0cmluZyB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLnBocC12YXJpYWJsZSB7CiAgY29sb3I6IGJsYWNrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoKc3Bhbi5qcy1sb2NhbHZhcmlhYmxlIHsKICBjb2xvcjogIzAwNDQ5OTsKfQoKc3Bhbi5waHAtY29tbWVudCB7CiAgY29sb3I6ICNBQTc3MDA7CiAgZm9udC1zdHJldGNoOiBjb25kZW5zZWQ7Ci8qICBmb250LXN0eWxlOiBpdGFsaWM7ICBUaGlzIGNhdXNlcyBsaW5lIGhlaWdodCB0byBzbGlnaHRseSBjaGFuZ2UsIGdldHRpbmcgbGluZSBudW1iZXJzIG91dCBvZiBzeW5jICovCn0KCnNwYW4ucGhwLXN0cmluZy1zaW5nbGUtcXVvdGVkIHsKICBjb2xvcjogI0FBMjIyMjsKfQovKiBkb3VibGUgcXVvdGVkIHN0cmluZ3MgYWxsb3cgaW50ZXJwb2xhdGlvbiAqLwpzcGFuLnBocC1zdHJpbmctZG91YmxlLXF1b3RlZCB7CiAgY29sb3I6ICNBQTIyMjI7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCnNwYW4uc3ludGF4LWVycm9yIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7Cn0KCnNwYW4uZGVwcmVjYXRlZCB7CiAgZm9udC1zaXplOiBzbWFsbGVyOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLQpDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpUaGUgY29weXJpZ2h0cyBlbWJvZGllZCBpbiB0aGUgY29udGVudCBvZiB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkIGJ5CllhaG9vISBJbmMuIHVuZGVyIHRoZSBCU0QgKHJldmlzZWQpIG9wZW4gc291cmNlIGxpY2Vuc2UKCkBhdXRob3IgRGFuIFZsYWQgRGFzY2FsZXNjdSA8ZGFuZHZAeWFob28taW5jLmNvbT4KCi0tPgoKCjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KICA8aGVhZD4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9qcy9jb2RlbWlycm9yLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFBIUCtIVE1MK0phdmFTY3JpcHQrQ1NTIG1peGVkLW1vZGUgZGVtb25zdHJhdGlvbjwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9jc3MvZG9jcy5jc3MiLz4KICA8L2hlYWQ+CiAgPGJvZHkgc3R5bGU9InBhZGRpbmc6IDIwcHg7Ij4KCiAgICA8cD5UaGlzIGlzIGEgY29tcGxleCBkZW1vbnN0cmF0aW9uIG9mIHRoZSA8Yj5QSFArSFRNTCtKYXZhU2NyaXB0K0NTUyBtaXhlZC1tb2RlCiAgICBzeW50YXggaGlnaGxpZ2h0PC9iPiBjYXBhYmlsaXRpZXMgb2YgPGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+Q29kZU1pcnJvcjwvYT4uCiAgICAmbHQ7P3BocCAuLi4gPz4gdGFncyB1c2UgdGhlIFBIUCBwYXJzZXIsICZsdDtzY3JpcHQ+IHRhZ3MgdXNlIHRoZSBKYXZhU2NyaXB0CiAgICBwYXJzZXIsIGFuZCAmbHQ7c3R5bGU+IHRhZ3MgdXNlIHRoZSBDU1MgcGFyc2VyLiBUaGUgcmVzdCBvZiB0aGUgY29udGVudCBpcwogICAgcGFyc2VkIHVzaW5nIHRoZSBYTUwgcGFyc2VyIGluIEhUTUwgbW9kZS48L3A+CgogICAgPHA+RmVhdHVyZXMgb2YgdGhlIFBIUCBwYXJzZXI6CiAgICA8dWw+CiAgICAgIDxsaT5zcGVjaWFsICJkZXByZWNhdGVkIiBzdHlsZSBmb3IgUEhQNCBrZXl3b3JkcyBsaWtlICd2YXInCiAgICAgIDxsaT5zdXBwb3J0IGZvciBQSFAgNS4zIGtleXdvcmRzOiAnbmFtZXNwYWNlJywgJ3VzZScKICAgICAgPGxpPjkxMSBwcmVkZWZpbmVkIGNvbnN0YW50cywgMTMwMSBwcmVkZWZpbmVkIGZ1bmN0aW9ucywgMTA1IHByZWRlY2xhcmVkIGNsYXNzZXMKICAgICAgICBmcm9tIGEgdHlwaWNhbCBQSFAgaW5zdGFsbGF0aW9uIGluIGEgTEFNUCBlbnZpcm9ubWVudAogICAgICA8bGk+bmV3IGZlYXR1cmU6IHN5bnRheCBlcnJvciBmbGFnZ2luZywgdGh1cyBlbmFibGluZyBzdHJpY3QgcGFyc2luZyBvZjoKICAgICAgICA8b2w+CiAgICAgICAgICA8bGk+ZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2l0aCBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHkgdHlwZWQgYXJndW1lbnRzIGFuZCBkZWZhdWx0IHZhbHVlcwogICAgICAgICAgPGxpPm1vZGlmaWVycyAocHVibGljLCBzdGF0aWMgZXRjLikgYXBwbGllZCB0byBtZXRob2QgYW5kIG1lbWJlciBkZWZpbml0aW9ucwogICAgICAgICAgPGxpPmZvcmVhY2goYXJyYXlfZXhwcmVzc2lvbiBhcyAka2V5IFs9PiAkdmFsdWVdKSBsb29wcwogICAgICAgIDwvb2w+CiAgICAgIDxsaT5kaWZmZXJlbnRpYXRpb24gYmV0d2VlbiBzaW5nbGUtcXVvdGVkIHN0cmluZ3MgYW5kIGRvdWJsZS1xdW90ZWQgaW50ZXJwb2xhdGluZyBzdHJpbmdzCiAgICA8L3VsPgogICAgPC9wPgoKICAgIDxkaXYgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nOiAzcHg7IGJhY2tncm91bmQtY29sb3I6ICNGOEY4RjgiPgogICAgPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMjAiIHJvd3M9IjMwIj4KVGhlICJyb290IiBwYXJzZXIgaXMgWE1MIGluIEhUTUwgbW9kZS4KTmV4dCwgd2UgY2FuIHN3aXRjaCBpbnRvIFBIUCBtb2RlLCBmb3IgZXhhbXBsZS4gVGhpcyBpcwo8P3BocCBlY2hvICd0ZXh0IG91dHB1dCBieSc7Cj8+ClBIUC4gPC9iPgpPbiB0aGUgbGluZSBhYm92ZSwgd2UganVzdCBoYWQgYW4gWE1MIHN5bnRheCBlcnJvciBkdWUgdG8gdGhlIDwvYj4gdGFnIG5vdCBiZWluZyBvcGVuZWQuCgo8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCcgc3RhbmRhbG9uZT0neWVzJz8+ICAgSFRNTCB0ZXh0IHdpbGwgZm9sbG93CjxodG1sPgogIDxoZWFkPgogICAgPHRpdGxlPlNpbWlsYXJseSwgdGhlICdzY3JpcHQnIHRhZyB3aWxsIHN3aXRjaCB0byB0aGUgSmF2YVNjcmlwdCBwYXJzZXI6PC90aXRsZT4KICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgICAgIC8vIFByZXNzIGVudGVyIGluc2lkZSB0aGUgb2JqZWN0IGFuZCB5b3VyIG5ldyBsaW5lIHdpbGwgYmUgc3VpdGFibHkKICAgICAgIC8vIGluZGVudGVkLgogICAgICAgdmFyIGtleUJpbmRpbmdzID0gewogICAgICAgICBlbnRlcjogIm5ld2xpbmUtYW5kLWluZGVudCIsCiAgICAgICAgIHRhYjogInJlaW5kZW50LXNlbGVjdGlvbiIsCiAgICAgICAgIGN0cmxfZW50ZXI6ICJyZXBhcnNlLWJ1ZmZlciIsCiAgICAgICAgIGN0cmxfejogInVuZG8iLAogICAgICAgICBjdHJsX3k6ICJyZWRvIiwKICAgICAgICAgY3RybF9iYWNrc3BhY2U6ICJ1bmRvLWZvci1zYWZhcmktd2hpY2gtc3R1cGlkbHktZW5vdWdoLWJsb2Nrcy1jdHJsLXoiCiAgICAgICB9OwoKICAgICAgIC8vIFByZXNzIHRhYiBvbiB0aGUgbmV4dCBsaW5lIGFuZCB0aGUgd3JvbmcgaW5kZW50YXRpb24gd2lsbCBiZSBmaXhlZC4KICAgICAgICAgICAgIHZhciByZWdleCA9IC9mb298YmFyL2k7CgogICAgICAgZnVuY3Rpb24gZXhhbXBsZSh4KSB7CiAgICAgICAgIC8vIExvY2FsIHZhcmlhYmxlcyBnZXQgYSBkaWZmZXJlbnQgY29sb3VyIHRoYW4gZ2xvYmFsIG9uZXMuCiAgICAgICAgIHZhciB5ID0gNDQuNDsKICAgICAgICAgcmV0dXJuIHggKyB5IC0gejsKICAgICAgIH0KICAgIDwvc2NyaXB0PgogICAgPHN0eWxlPgogICAgICAvKiBTb21lIGV4YW1wbGUgQ1NTICovCgogICAgICBAaW1wb3J0IHVybCgic29tZXRoaW5nLmNzcyIpOwoKICAgICAgYm9keSB7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDNlbSA2ZW07CiAgICAgICAgZm9udC1mYW1pbHk6IHRhaG9tYSwgYXJpYWwsIHNhbnMtc2VyaWY7CiAgICAgICAgY29sb3I6ICMwMDA7CiAgICAgIH0KCiAgICAgICNuYXZpZ2F0aW9uIGEgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBoMSB7CiAgICAgICAgZm9udC1zaXplOiAyLjVlbTsKICAgICAgfQoKICAgICAgaDE6YmVmb3JlLCBoMjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICI6OiI7CiAgICAgIH0KCiAgICAgIGNvZGUgewogICAgICAgIGZvbnQtZmFtaWx5OiBjb3VyaWVyLCBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiA4MCU7CiAgICAgICAgY29sb3I6ICM0MThBOEE7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgoKICA8Ym9keT4KCiAgVGhlIFBIUCBjb2RlIGJlbG93IGNvbnRhaW5zIHNvbWUgZGVsaWJlcmF0ZSBlcnJvcnMuIFBsYXkgd2l0aCB0aGUgZWRpdG9yIGJ5IGZpeGluZyB0aGVtCiAgYW5kIG9ic2VydmluZyBob3cgdGhlIGhpZ2hsaWdodCBjaGFuZ2VzLgoKICAgIDw/cGhwCiAgICBuYW1lc3BhY2UgQTsKICAgIG5hbWVzcGFjZSBBOjpCOjpDOwogICAgbmFtZXNwYWNlIEE6Ojo6QjsKICAgIG5hbWVzcGFjZSBBOjpCOjpDOjo7CiAgICBuYW1lc3BhY2UgQTo6Qjo6Qzo6RCB4OwogICAgc2VsZjo6cmFuZ2UoJHJvd1snbGZ0J10sICRyb3dbJ3JndCddKSk7ICAvLyBlcnJvcjogZXh0cmEgJyknCiAgICAkYSA9IChiKCkgKyA0KSA1IGZvbzsgIC8vIGVycm9yOiBtaXNzaW5nIG9wZXJhdG9ycwogICAgc2VsZjo6JHZhcjsKICAgICRwYXJlbnQgPSBzZWxmOjpyYW5nZSgkbWF4ICsgMSwgJG1heCArIDEpOwogICAgJHJvd1thdHRyaWJ1dGVzXVskYXR0cmlidXRlX25hbWVdID0gJGF0dHJpYnV0ZV92YWx1ZTsKICAgICRyb3dbYXR0cmlidXRlcygpXVskYXR0cmlidXRlX25hbWVdID0gJGF0dHJpYnV0ZV92YWx1ZTsKICAgICRyb3dbYXR0cmlidXRlcyg1KV1bJGF0dHJpYnV0ZV9uYW1lXSA9ICRhdHRyaWJ1dGVfdmFsdWU7CiAgICAkcm93WyRhdHRyaWJ1dGVzKCldWyRhdHRyaWJ1dGVfbmFtZV0gPSAkYXR0cmlidXRlX3ZhbHVlOwogICAgYWJzdHJhY3QgY2xhc3MgNSBleHRlbmRzIGZvbyBpbXBsZW1lbnRzIGVjaG8gewogICAgICAgIHByaXZhdGUgZnVuY3Rpb24gZG9tYWluT2JqZWN0QnVpbGRlcigpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT51c2VfZG9tYWluX29iamVjdF9idWlsZGVyCiAgICAgICAgICAgICAgICAgICA/ICR0aGlzLT5kb21haW4oKS0+b2JqZWN0QnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICA6IG51bGw7CiAgICAgICAgfQoKICAgICAgICBjb25zdCAkbXljb25zdCA9ICdzb21lIHN0cmluZyc7CiAgICAgICAgJGFycmF5W215Y29uc3RdID0gNDsKICAgICAgICAvLyB0aGlzIGlzIGEgc2luZ2xlLWxpbmUgQysrLXN0eWxlIGNvbW1lbnQKICAgICAgICAjIHRoaXMgaXMgYSBzaW5nbGUtbGluZSBzaGVsbC1zdHlsZSBjb21tZW50CiAgICAgICAgcHJpdmF0ZSB2YXIgJGEgPSBfX0ZJTEVfXzsKICAgICAgICBwcm90ZWN0ZWQgc3RhdGljICRiID0gdGltZXpvbmVfdHJhbnNpdGlvbnNfZ2V0KCdzb21lIHBhcmFtZXRlciBoZXJlJyk7CiAgICAgICAgZ2xvYmFsICRnID0gaXNzZXQoInN0cmluZyIpOwogICAgICAgIHN0YXRpYyAkcyA9IGhhc2hfdXBkYXRlX2ZpbGU7ICAvLyB3YXJuaW5nOiBwcmVkZWZpbmVkIGZ1bmN0aW9uIG5vbi1jYWxsCiAgICAgICAgZnVuY3Rpb24gbWlrZSAoJHZhcikgJGZvbzsKICAgICAgICBtaWtlKEE6OmZ1bmMocGFyYW0pKTsKICAgICAgICBmdW5jKCRiICRjKTsgIC8vIGVycm9yOiBmdW5jdGlvbiBwYXJhbWV0ZXJzIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkCiAgICAgICAgZm9vIGJhcjsgIC8vIGVycm9yOiBubyBvcGVyYXRvcgogICAgICAgICRiYXogJHF1dXg7ICAvLyBlcnJvcjogbm8gb3BlcmF0b3IKICAgICAgICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gbG9hZFBhZ2VYTUwodXRpbF9GaWxlUGF0aCAkZmlsZW5hbWUsICRtZXJnZT0wKyRmb28sICR4LCAkeT0zKSB7CiAgICAgICAgICAgICRuZXdyb3dbJGtleV0gPSAkdmFsOwogICAgICAgICAgICAkbmV3cmVzdWx0W10gPSAkcm93OwogICAgICAgICAgICAkc3RhdGUgPSAkcm93WydjJ10gPT0gMTsKICAgICAgICAgICAgJGF0dHJpYnV0ZV92YWx1ZXNbJGF0dHJpYnV0ZV9uYW1lXSA9IG51bGw7CiAgICAgICAgICAgICRyb3dbJ2F0dHJpYnV0ZXMnXVskYXR0cmlidXRlX25hbWVdID0gJGF0dHJpYnV0ZV92YWx1ZTsKICAgICAgICAgICAgJHJlc3VsdFskcm93WydlbGVtZW50J11dWyRyb3dbJ2F0dHJpYnV0ZSddXSA9ICRyb3dbJ3ZhbHVlJ107CiAgICAgICAgICAgICRzcWwgPSAibXVsdGlsaW5lIHN0cmluZwpsaW5lMiBpcyBzcGVjaWFsIC0gaXQnbGwgaW50ZXJwb2xhdGUgdmFyaWFibGVzIGxpa2UgJHN0YXRlIGFuZCBtZXRob2QgY2FsbHMKeyR0aGlzLT5jYWNoZS0+YWRkKCRrZXksIDUpfSBhbmQgbWF5YmUgXCJtb3JlXCIKCmxpbmU1IjsKICAgICAgICAgICAgJHNxbCA9ICdtdWx0aWxpbmUgc3RyaW5nCnNpbmdsZSBxdW90aW5nIG1lYW5zIG5vIFwnaW50ZXJwb2xhdGlvblwnIGxpa2UgIiRzdGFydCIgb3IgbWV0aG9kIGNhbGwKeyR0aGlzLT5jYWNoZS0+YWRkKCRrZXksIDUpfSB3aWxsIGhhcHBlbgoKbGluZTUnOwogICAgICAgICAgICAkYml0cGF0dGVybiA9IDEgPDwgMjsKICAgICAgICAgICAgJGJpdHBhdHRlcm4gPDw9IDM7CiAgICAgICAgICAgICRpbmNvcnJlY3QgPSA8PDwgNSBFT1NUUklORyAgLy8gRklYTUU6IENvZGVNaXJyb3IgdXBkYXRlIGJ1ZzogYWRkIGEgbGV0dGVyIGJlZm9yZSA1IGFuZCBub3RpY2UgdGhhdCBzeW50YXggaXMgbm90IHVwZGF0ZWQgdW50aWwgRU9GLCBldmVuIHdpdGggY29udGludW91c1NjYW5uaW5nOiA1MDAKZXJyb3I6IHRoZSBpZGVudGlmaWVyIG11c3QgY29uZm9ybSB0byB0aGUgaWRlbnRpZmllciBydWxlcwpFT1NUUklORzsKICAgICAgICAgICAgJHNxbCA9IDw8PCBFT1NRTAogICAgICAgICAgICAgICAgU0VMRUNUIGF0dHJpYnV0ZSwgZWxlbWVudCwgdmFsdWUKICAgICAgICAgICAgICAgIEZST00gYXR0cmlidXRlX3ZhbHVlcwogICAgICAgICAgICAgICAgV0hFUkUgZGltZW5zaW9uID0gPwpFT1NRTDsKICAgICAgICAgICAgJHRoaXMtPmxyX2NhY2hlLT5hZGQoJGtleSwgc2VsZjo6cmFuZ2UoJHJvd1snbGZ0J10sICRyb3dbJ3JndCddKSk7CiAgICAgICAgICAgICRjb21wb3NpdGVfc3RyaW5nID0gPDw8RU9TVFJJTkcKc29tZSBsaW5lcyBoZXJlCkVPU1RSSU5HCi4gJ3NvbWV0aGluZyBleHRyYSc7CiAgICAgICAgICAgICRwYWdlX2xmdCA9ICgkZG9tYWluLT5uYW1lKCkgPT0gJ3BhZ2UnKSA/ICRzdGFydCArIDEgOiAkcGFnZV9zdGFydCArIDE7CiAgICAgICAgICAgIGVjaG8gIlRoaXMgaXMgY2xhc3MgZm9vIjsKICAgICAgICAgICAgZWNobyAiYSA9ICIuJHRoaXMgLT5hWzIrMyokYXJyYXlbImZvbyJdXS4iIjsKICAgICAgICAgICAgZWNobyAiYiA9IHskdGhpcy0+Yn0iOyAgLy8gRklYTUU6IGhpZ2hsaWdodCBpbnRlcnBvbGF0aW9uIGluIHN0cmluZ3MKICAgICAgICB9CiAgICAgICAgZmluYWwgZnVuY3Rpb24gbWFrZWNvZmZlZSBlcnJvcigkdHlwZXMgPSBhcnJheSgiY2FwcHVjY2lubyIpLCAkY29mZmVlTWFrZXIgPSBOVUxMKSB7CiAgICAgICAgICAgICRvdXRfb2Zfd2F5X2Ftb3VudCA9ICRtYXggLSAkY2hpbGQtPmxlZnQoKSArIDE7CiAgICAgICAgICAgICRhYnNvbHV0ZV9wb3MgPSAkY2hpbGQtPmxlZnQoKSAtICRtb3ZlLT53aWR0aCgpOwogICAgICAgICAgICAkdmFyZnVuYygxLCAneCcpOwogICAgICAgICAgICAkdmFyZnVuYygxLCAneCcpICsgZm9vKCkgLSA1OwogICAgICAgICAgICAkZnVuY2FycmF5WyRpXSgncGFyYW0xJywgJHBhcmFtMik7CiAgICAgICAgICAgICAgICAkbHJbJGRvbWFpbl9uYW1lXSA9ICR0aGlzLT5nZXRfbGVmdF9hbmRfcmlnaHQoJGRvbWFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGltZW5zaW9uX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsZW1lbnRfbmFtZSk7CiAgICAgICAgICAgICRkb21haW5fbGlzdCA9IGlzX251bGwoJGRvbWFpbikgPwogICAgICAgICAgICAgICAgICAgICAgICAgICByM19Eb21haW46Om5hbWVzKCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgkZG9tYWluLT5uYW1lKCkpOwogICAgICAgICAgICBmb3JlYWNoIChyM19Eb21haW46Om5hbWVzKCkgYXMgJGRvbWFpbl9uYW1lKSB7CiAgICAgICAgICAgICAgICAkcGxhY2Vob2xkZXJzID0gJ2Rpc3RhbmNlIExJS0UgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiBpbXBsb2RlKGFycmF5X2ZpbGwoMSwgJG51bV9kaXN0YW5jZXMsICc/JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBPUiBkaXN0YW5jZSBMSUtFICcpOwoKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnRhcmdldCokdGhpcy0+dHJhbnMrbXlmdW5jKF9fTUVUSE9EX18pOwogICAgICAgICAgICAvKgogICAgICAgICAgICBlY2hvICdUaGlzIGlzIGEgdGVzdCc7IC8qIFRoaXMgY29tbWVudCB3aWxsIGNhdXNlIGEgcHJvYmxlbSAqLwogICAgICAgICAgICAqLwogICAgICAgIH0KICAgICAgICBzd2l0Y2goICR0eXBlICkgewogICAgICAgICAgICBjYXNlICJyM2NvcmVfQWRkVGVtcGxhdGVUb1RhcmdldEV2ZW50IjoKICAgICAgICAgICAgICAgICR0aGlzLT5ub3RpZnlBZGRUZW1wbGF0ZVRvVGFyZ2V0KCAkZ2VuZXZlbnQgKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJyM2NvcmVfR2VuZXJhdGVUYXJnZXRFdmVudCIgJHRoaXM6CiAgICAgICAgICAgICAgICBmb3IoJGk9MDsgJGk8PXRoaXMtPm1ldGhvZCgpOyAkaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgZWNobyAnU3ludGF4ICJoaWdobGlnaHRpbmciJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkYXJyYXkgeG9yICRsb2FkZXItPnBhcnNlX2ZuKCRmaWxlbmFtZSkgYXMgJGtleSA9PiB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgcjM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uICRlICkgewogICAgICAgICAgICAgICAgICAgIC8qKiByZXN0b3JlIHRoZSBiYWNrdXAKICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5sb2FkQWxsKCR0bXAsICRldmVudCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgLy8gYHBocCAtbGAgZG9lc24ndCBjb21wbGFpbiBhdCBhbGwgYXQgdGhpcyAoaXQgYXNzdW1lcyBzdHJpbmcgY29uc3RhbnRzKToKICAgICAgICAgICAgICAgICAgICB0aGlzICsgbWFrZXMgKiBubyAtIHNlbnNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZGVmYXVsdCBtb286CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcjNfdXRpbF9FeGNlcHRpb24oIGdldF9jbGFzcyggJGdlbmV2ZW50ICkgLiAiIGRvZXMgbm90IG1hcCIgKTsKICAgICAgICB9CgoKICAgIH07CgogICAgPz4KCiAgICA8cjM6Y3BocD4KICAgICAgICBwaHAoIndvcmtzIiwgJGhlcmUsIDIpOwogICAgPC9yMzpjcGhwPgoKICAgIDxyNDpjcGhwPgogICAgY2xhc3MgZm9vIHsKICAgICAgICAvLyBhIGNvbW1lbnQKICAgICAgICB2YXIgJGE7CiAgICAgICAgdmFyICRiOwogICAgfTsKICAgIDwvcjQ6Y3BocD4KCiAgPGgxPlRoaXMgaXMgYW4gPD9waHAgIyBlY2hvICdzaW1wbGUnOz8+IGV4YW1wbGUuPC9oMT4KICA8cD5UaGUgaGVhZGVyIGFib3ZlIHdpbGwgc2F5ICdUaGlzIGlzIGFuICBleGFtcGxlJy48L3A+CiAgPGgxPlRoaXMgaXMgYW4gPD9waHAgLy8gZWNobyAnc2ltcGxlJzs/PiBleGFtcGxlLjwvaDE+CgogIDw/cGhwIGVjaG87ID8+CiAgICA8Ym9keT4KCjw/cGhwIGVjaG8gIjxodG1sPgogIDxoZWFkPgogICAgPHNjcmlwdD4KICAgIHZhciBmb28gPSAnYmFyJzsKICAgIDwvc2NyaXB0PgogICAgPHN0eWxlPgogICAgICBzcGFuLnRlc3Qge2ZvbnQtZmFtaWx5OiBhcmlhbCwgJ2x1Y2lkYSBjb25zb2xlJywgc2Fucy1zZXJpZn0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPCEtLSBjb21tZW50IC0tPgogIDwvYm9keT4KPC9odG1sPiI7ID8+Cgo8L2JvZHk+CjwvaHRtbD4KCgogICAgPC90ZXh0YXJlYT4KICAgIDwvZGl2PgoKICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKCdjb2RlJywgewogICAgICAgIGhlaWdodDogIjM1MHB4IiwKICAgICAgICBwYXJzZXJmaWxlOiBbInBhcnNleG1sLmpzIiwgInBhcnNlY3NzLmpzIiwgInRva2VuaXplamF2YXNjcmlwdC5qcyIsICJwYXJzZWphdmFzY3JpcHQuanMiLAogICAgICAgICAgICAgICAgICAgICAiLi4vY29udHJpYi9waHAvanMvdG9rZW5pemVwaHAuanMiLCAiLi4vY29udHJpYi9waHAvanMvcGFyc2VwaHAuanMiLAogICAgICAgICAgICAgICAgICAgICAiLi4vY29udHJpYi9waHAvanMvcGFyc2VwaHBodG1sbWl4ZWQuanMiXSwKICAgICAgICBzdHlsZXNoZWV0OiBbIi4uLy4uL2Nzcy94bWxjb2xvcnMuY3NzIiwgIi4uLy4uL2Nzcy9qc2NvbG9ycy5jc3MiLCAiLi4vLi4vY3NzL2Nzc2NvbG9ycy5jc3MiLCAiY3NzL3BocGNvbG9ycy5jc3MiXSwKICAgICAgICBwYXRoOiAiLi4vLi4vanMvIiwKICAgICAgICBjb250aW51b3VzU2Nhbm5pbmc6IDUwMAogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/js/parsephp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhlIGNvcHlyaWdodHMgZW1ib2RpZWQgaW4gdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGFyZSBsaWNlbnNlZCBieQpZYWhvbyEgSW5jLiB1bmRlciB0aGUgQlNEIChyZXZpc2VkKSBvcGVuIHNvdXJjZSBsaWNlbnNlCgpAYXV0aG9yIERhbiBWbGFkIERhc2NhbGVzY3UgPGRhbmR2QHlhaG9vLWluYy5jb20+CgoKUGFyc2UgZnVuY3Rpb24gZm9yIFBIUC4gTWFrZXMgdXNlIG9mIHRoZSB0b2tlbml6ZXIgZnJvbSB0b2tlbml6ZXBocC5qcy4KQmFzZWQgb24gcGFyc2VqYXZhc2NyaXB0LmpzIGJ5IE1hcmlqbiBIYXZlcmJla2UuCgoKRmVhdHVyZXM6CiArIHNwZWNpYWwgImRlcHJlY2F0ZWQiIHN0eWxlIGZvciBQSFA0IGtleXdvcmRzIGxpa2UgJ3ZhcicKICsgc3VwcG9ydCBmb3IgUEhQIDUuMyBrZXl3b3JkczogJ25hbWVzcGFjZScsICd1c2UnCiArIDkxMSBwcmVkZWZpbmVkIGNvbnN0YW50cywgMTMwMSBwcmVkZWZpbmVkIGZ1bmN0aW9ucywgMTA1IHByZWRlY2xhcmVkIGNsYXNzZXMKICAgZnJvbSBhIHR5cGljYWwgUEhQIGluc3RhbGxhdGlvbiBpbiBhIExBTVAgZW52aXJvbm1lbnQKICsgbmV3IGZlYXR1cmU6IHN5bnRheCBlcnJvciBmbGFnZ2luZywgdGh1cyBlbmFibGluZyBzdHJpY3QgcGFyc2luZyBvZjoKICAgKyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aXRoIGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSB0eXBlZCBhcmd1bWVudHMgYW5kIGRlZmF1bHQgdmFsdWVzCiAgICsgbW9kaWZpZXJzIChwdWJsaWMsIHN0YXRpYyBldGMuKSBhcHBsaWVkIHRvIG1ldGhvZCBhbmQgbWVtYmVyIGRlZmluaXRpb25zCiAgICsgZm9yZWFjaChhcnJheV9leHByZXNzaW9uIGFzICRrZXkgWz0+ICR2YWx1ZV0pIGxvb3BzCiArIGRpZmZlcmVudGlhdGlvbiBiZXR3ZWVuIHNpbmdsZS1xdW90ZWQgc3RyaW5ncyBhbmQgZG91YmxlLXF1b3RlZCBpbnRlcnBvbGF0aW5nIHN0cmluZ3MKCiovCgoKLy8gYWRkIHRoZSBBcnJheS5pbmRleE9mIG1ldGhvZCBmb3IgSlMgZW5naW5lcyB0aGF0IGRvbid0IHN1cHBvcnQgaXQgKGUuZy4gSUUpCi8vIGNvZGUgZnJvbSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9Fbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9JbmRleE9mCmlmICghQXJyYXkucHJvdG90eXBlLmluZGV4T2YpCnsKICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uKGVsdCAvKiwgZnJvbSovKQogIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKCiAgICB2YXIgZnJvbSA9IE51bWJlcihhcmd1bWVudHNbMV0pIHx8IDA7CiAgICBmcm9tID0gKGZyb20gPCAwKQogICAgICAgICA/IE1hdGguY2VpbChmcm9tKQogICAgICAgICA6IE1hdGguZmxvb3IoZnJvbSk7CiAgICBpZiAoZnJvbSA8IDApCiAgICAgIGZyb20gKz0gbGVuOwoKICAgIGZvciAoOyBmcm9tIDwgbGVuOyBmcm9tKyspCiAgICB7CiAgICAgIGlmIChmcm9tIGluIHRoaXMgJiYKICAgICAgICAgIHRoaXNbZnJvbV0gPT09IGVsdCkKICAgICAgICByZXR1cm4gZnJvbTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9Owp9OwoKCnZhciBQSFBQYXJzZXIgPSBFZGl0b3IuUGFyc2VyID0gKGZ1bmN0aW9uKCkgewogIC8vIFRva2VuIHR5cGVzIHRoYXQgY2FuIGJlIGNvbnNpZGVyZWQgdG8gYmUgYXRvbXMsIHBhcnQgb2Ygb3BlcmF0b3IgZXhwcmVzc2lvbnMKICB2YXIgYXRvbWljVHlwZXMgPSB7CiAgICAiYXRvbSI6IHRydWUsICJudW1iZXIiOiB0cnVlLCAidmFyaWFibGUiOiB0cnVlLCAic3RyaW5nIjogdHJ1ZQogIH07CiAgLy8gQ29uc3RydWN0b3IgZm9yIHRoZSBsZXhpY2FsIGNvbnRleHQgb2JqZWN0cy4KICBmdW5jdGlvbiBQSFBMZXhpY2FsKGluZGVudGVkLCBjb2x1bW4sIHR5cGUsIGFsaWduLCBwcmV2LCBpbmZvKSB7CiAgICAvLyBpbmRlbnRhdGlvbiBhdCBzdGFydCBvZiB0aGlzIGxpbmUKICAgIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDsKICAgIC8vIGNvbHVtbiBhdCB3aGljaCB0aGlzIHNjb3BlIHdhcyBvcGVuZWQKICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwogICAgLy8gdHlwZSBvZiBzY29wZSAoJ3N0YXQnIChzdGF0ZW1lbnQpLCAnZm9ybScgKHNwZWNpYWwgZm9ybSksICdbJywgJ3snLCBvciAnKCcpCiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgLy8gJ1snLCAneycsIG9yICcoJyBibG9ja3MgdGhhdCBoYXZlIGFueSB0ZXh0IGFmdGVyIHRoZWlyIG9wZW5pbmcKICAgIC8vIGNoYXJhY3RlciBhcmUgc2FpZCB0byBiZSAnYWxpZ25lZCcgLS0gYW55IGxpbmVzIGJlbG93IGFyZQogICAgLy8gaW5kZW50ZWQgYWxsIHRoZSB3YXkgdG8gdGhlIG9wZW5pbmcgY2hhcmFjdGVyLgogICAgaWYgKGFsaWduICE9IG51bGwpCiAgICAgIHRoaXMuYWxpZ24gPSBhbGlnbjsKICAgIC8vIFBhcmVudCBzY29wZSwgaWYgYW55LgogICAgdGhpcy5wcmV2ID0gcHJldjsKICAgIHRoaXMuaW5mbyA9IGluZm87CiAgfTsKCiAgLy8gUEhQIGluZGVudGF0aW9uIHJ1bGVzCiAgZnVuY3Rpb24gaW5kZW50UEhQKGxleGljYWwpIHsKICAgIHJldHVybiBmdW5jdGlvbihmaXJzdENoYXJzKSB7CiAgICAgIHZhciBmaXJzdENoYXIgPSBmaXJzdENoYXJzICYmIGZpcnN0Q2hhcnMuY2hhckF0KDApLCB0eXBlID0gbGV4aWNhbC50eXBlOwogICAgICB2YXIgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSB0eXBlOwogICAgICBpZiAodHlwZSA9PSAiZm9ybSIgJiYgZmlyc3RDaGFyID09ICJ7IikKICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZDsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAic3RhdCIgfHwgdHlwZSA9PSAiZm9ybSIpCiAgICAgICAgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyBpbmRlbnRVbml0OwogICAgICBlbHNlIGlmIChsZXhpY2FsLmluZm8gPT0gInN3aXRjaCIgJiYgIWNsb3NpbmcpCiAgICAgICAgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyAoL14oPzpjYXNlfGRlZmF1bHQpXGIvLnRlc3QoZmlyc3RDaGFycykgPyBpbmRlbnRVbml0IDogMiAqIGluZGVudFVuaXQpOwogICAgICBlbHNlIGlmIChsZXhpY2FsLmFsaWduKQogICAgICAgIHJldHVybiBsZXhpY2FsLmNvbHVtbiAtIChjbG9zaW5nID8gMSA6IDApOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyAoY2xvc2luZyA/IDAgOiBpbmRlbnRVbml0KTsKICAgIH07CiAgfTsKCiAgLy8gVGhlIHBhcnNlci1pdGVyYXRvci1wcm9kdWNpbmcgZnVuY3Rpb24gaXRzZWxmLgogIGZ1bmN0aW9uIHBhcnNlUEhQKGlucHV0LCBiYXNlY29sdW1uKSB7CiAgICAvLyBXcmFwIHRoZSBpbnB1dCBpbiBhIHRva2VuIHN0cmVhbQogICAgdmFyIHRva2VucyA9IHRva2VuaXplUEhQKGlucHV0KTsKICAgIC8vIFRoZSBwYXJzZXIgc3RhdGUuIGNjIGlzIGEgc3RhY2sgb2YgYWN0aW9ucyB0aGF0IGhhdmUgdG8gYmUKICAgIC8vIHBlcmZvcm1lZCB0byBmaW5pc2ggdGhlIGN1cnJlbnQgc3RhdGVtZW50LiBGb3IgZXhhbXBsZSB3ZSBtaWdodAogICAgLy8ga25vdyB0aGF0IHdlIHN0aWxsIG5lZWQgdG8gZmluZCBhIGNsb3NpbmcgcGFyZW50aGVzaXMgYW5kIGEKICAgIC8vIHNlbWljb2xvbi4gQWN0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBzdGFjayBnbyBmaXJzdC4gSXQgaXMKICAgIC8vIGluaXRpYWxpemVkIHdpdGggYW4gaW5maW5pdGVseSBsb29waW5nIGFjdGlvbiB0aGF0IGNvbnN1bWVzCiAgICAvLyB3aG9sZSBzdGF0ZW1lbnRzLgogICAgdmFyIGNjID0gW3N0YXRlbWVudHNdOwogICAgLy8gVGhlIGxleGljYWwgc2NvcGUsIHVzZWQgbW9zdGx5IGZvciBpbmRlbnRhdGlvbi4KICAgIHZhciBsZXhpY2FsID0gbmV3IFBIUExleGljYWwoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAiYmxvY2siLCBmYWxzZSk7CiAgICAvLyBDdXJyZW50IGNvbHVtbiwgYW5kIHRoZSBpbmRlbnRhdGlvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQKICAgIC8vIGxpbmUuIFVzZWQgdG8gY3JlYXRlIGxleGljYWwgc2NvcGUgb2JqZWN0cy4KICAgIHZhciBjb2x1bW4gPSAwOwogICAgdmFyIGluZGVudGVkID0gMDsKICAgIC8vIFZhcmlhYmxlcyB3aGljaCBhcmUgdXNlZCBieSB0aGUgbWFyaywgY29udCwgYW5kIHBhc3MgZnVuY3Rpb25zCiAgICAvLyBiZWxvdyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBkcml2ZXIgbG9vcCBpbiB0aGUgJ25leHQnIGZ1bmN0aW9uLgogICAgdmFyIGNvbnN1bWUsIG1hcmtlZDsKCiAgICAvLyBUaGUgaXRlcmF0b3Igb2JqZWN0LgogICAgdmFyIHBhcnNlciA9IHtuZXh0OiBuZXh0LCBjb3B5OiBjb3B5fTsKCiAgICAvLyBwYXJzaW5nIGlzIGFjY29tcGxpc2hlZCBieSBjYWxsaW5nIG5leHQoKSByZXBlYXRlZGx5CiAgICBmdW5jdGlvbiBuZXh0KCl7CiAgICAgIC8vIFN0YXJ0IGJ5IHBlcmZvcm1pbmcgYW55ICdsZXhpY2FsJyBhY3Rpb25zIChhZGp1c3RpbmcgdGhlCiAgICAgIC8vIGxleGljYWwgdmFyaWFibGUpLCBvciB0aGUgb3BlcmF0aW9ucyBiZWxvdyB3aWxsIGJlIHdvcmtpbmcKICAgICAgLy8gd2l0aCB0aGUgd3JvbmcgbGV4aWNhbCBzdGF0ZS4KICAgICAgd2hpbGUoY2NbY2MubGVuZ3RoIC0gMV0ubGV4KQogICAgICAgIGNjLnBvcCgpKCk7CgogICAgICAvLyBGZXRjaCB0aGUgbmV4dCB0b2tlbi4KICAgICAgdmFyIHRva2VuID0gdG9rZW5zLm5leHQoKTsKCiAgICAgIC8vIEFkanVzdCBjb2x1bW4gYW5kIGluZGVudGVkLgogICAgICBpZiAodG9rZW4udHlwZSA9PSAid2hpdGVzcGFjZSIgJiYgY29sdW1uID09IDApCiAgICAgICAgaW5kZW50ZWQgPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgIGNvbHVtbiArPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgIGlmICh0b2tlbi5jb250ZW50ID09ICJcbiIpewogICAgICAgIGluZGVudGVkID0gY29sdW1uID0gMDsKICAgICAgICAvLyBJZiB0aGUgbGV4aWNhbCBzY29wZSdzIGFsaWduIHByb3BlcnR5IGlzIHN0aWxsIHVuZGVmaW5lZCBhdAogICAgICAgIC8vIHRoZSBlbmQgb2YgdGhlIGxpbmUsIGl0IGlzIGFuIHVuLWFsaWduZWQgc2NvcGUuCiAgICAgICAgaWYgKCEoImFsaWduIiBpbiBsZXhpY2FsKSkKICAgICAgICAgIGxleGljYWwuYWxpZ24gPSBmYWxzZTsKICAgICAgICAvLyBOZXdsaW5lIHRva2VucyBnZXQgYW4gaW5kZW50YXRpb24gZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoCiAgICAgICAgLy8gdGhlbS4KICAgICAgICB0b2tlbi5pbmRlbnRhdGlvbiA9IGluZGVudFBIUChsZXhpY2FsKTsKICAgICAgfQogICAgICAvLyBObyBtb3JlIHByb2Nlc3NpbmcgZm9yIG1lYW5pbmdsZXNzIHRva2Vucy4KICAgICAgaWYgKHRva2VuLnR5cGUgPT0gIndoaXRlc3BhY2UiIHx8IHRva2VuLnR5cGUgPT0gImNvbW1lbnQiCiAgICAgICAgfHwgdG9rZW4udHlwZSA9PSAic3RyaW5nX25vdF90ZXJtaW5hdGVkIiApCiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAvLyBXaGVuIGEgbWVhbmluZ2Z1bCB0b2tlbiBpcyBmb3VuZCBhbmQgdGhlIGxleGljYWwgc2NvcGUncwogICAgICAvLyBhbGlnbiBpcyB1bmRlZmluZWQsIGl0IGlzIGFuIGFsaWduZWQgc2NvcGUuCiAgICAgIGlmICghKCJhbGlnbiIgaW4gbGV4aWNhbCkpCiAgICAgICAgbGV4aWNhbC5hbGlnbiA9IHRydWU7CgogICAgICAvLyBFeGVjdXRlIGFjdGlvbnMgdW50aWwgb25lICdjb25zdW1lcycgdGhlIHRva2VuIGFuZCB3ZSBjYW4KICAgICAgLy8gcmV0dXJuIGl0LiAnbWFya2VkJyBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgc3R5bGUgb2YgdGhlIGN1cnJlbnQgdG9rZW4uCiAgICAgIHdoaWxlKHRydWUpIHsKICAgICAgICBjb25zdW1lID0gbWFya2VkID0gZmFsc2U7CiAgICAgICAgLy8gVGFrZSBhbmQgZXhlY3V0ZSB0aGUgdG9wbW9zdCBhY3Rpb24uCiAgICAgICAgdmFyIGFjdGlvbiA9IGNjLnBvcCgpOwogICAgICAgIGFjdGlvbih0b2tlbik7CgogICAgICAgIGlmIChjb25zdW1lKXsKICAgICAgICAgIGlmIChtYXJrZWQpCiAgICAgICAgICAgIHRva2VuLnN0eWxlID0gbWFya2VkOwogICAgICAgICAgLy8gSGVyZSB3ZSBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbG9jYWwgYW5kIGdsb2JhbCB2YXJpYWJsZXMuCiAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAxOyAvLyBGaXJlYnVnIHdvcmthcm91bmQgZm9yIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9mYnVnL2lzc3Vlcy9kZXRhaWw/aWQ9MTIzOSNjMQogICAgfQoKICAgIC8vIFRoaXMgbWFrZXMgYSBjb3B5IG9mIHRoZSBwYXJzZXIgc3RhdGUuIEl0IHN0b3JlcyBhbGwgdGhlCiAgICAvLyBzdGF0ZWZ1bCB2YXJpYWJsZXMgaW4gYSBjbG9zdXJlLCBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQKICAgIC8vIHdpbGwgcmVzdG9yZSB0aGVtIHdoZW4gY2FsbGVkIHdpdGggYSBuZXcgaW5wdXQgc3RyZWFtLiBOb3RlCiAgICAvLyB0aGF0IHRoZSBjYyBhcnJheSBoYXMgdG8gYmUgY29waWVkLCBiZWNhdXNlIGl0IGlzIGNvbnRhbnRseQogICAgLy8gYmVpbmcgbW9kaWZpZWQuIExleGljYWwgb2JqZWN0cyBhcmUgbm90IG11dGF0ZWQsIHNvIHRoZXkgY2FuCiAgICAvLyBiZSBzaGFyZWQgYmV0d2VlbiBydW5zIG9mIHRoZSBwYXJzZXIuCiAgICBmdW5jdGlvbiBjb3B5KCl7CiAgICAgIHZhciBfbGV4aWNhbCA9IGxleGljYWwsIF9jYyA9IGNjLmNvbmNhdChbXSksIF90b2tlblN0YXRlID0gdG9rZW5zLnN0YXRlOwoKICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvcHlQYXJzZXIoaW5wdXQpewogICAgICAgIGxleGljYWwgPSBfbGV4aWNhbDsKICAgICAgICBjYyA9IF9jYy5jb25jYXQoW10pOyAvLyBjb3BpZXMgdGhlIGFycmF5CiAgICAgICAgY29sdW1uID0gaW5kZW50ZWQgPSAwOwogICAgICAgIHRva2VucyA9IHRva2VuaXplUEhQKGlucHV0LCBfdG9rZW5TdGF0ZSk7CiAgICAgICAgcmV0dXJuIHBhcnNlcjsKICAgICAgfTsKICAgIH0KCiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHB1c2hpbmcgYSBudW1iZXIgb2YgYWN0aW9ucyBvbnRvIHRoZSBjYwogICAgLy8gc3RhY2sgaW4gcmV2ZXJzZSBvcmRlci4KICAgIGZ1bmN0aW9uIHB1c2goZnMpewogICAgICBmb3IgKHZhciBpID0gZnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgICAgY2MucHVzaChmc1tpXSk7CiAgICB9CiAgICAvLyBjb250IGFuZCBwYXNzIGFyZSB1c2VkIGJ5IHRoZSBhY3Rpb24gZnVuY3Rpb25zIHRvIGFkZCBvdGhlcgogICAgLy8gYWN0aW9ucyB0byB0aGUgc3RhY2suIGNvbnQgd2lsbCBjYXVzZSB0aGUgY3VycmVudCB0b2tlbiB0byBiZQogICAgLy8gY29uc3VtZWQsIHBhc3Mgd2lsbCBsZWF2ZSBpdCBmb3IgdGhlIG5leHQgYWN0aW9uLgogICAgZnVuY3Rpb24gY29udCgpewogICAgICBwdXNoKGFyZ3VtZW50cyk7CiAgICAgIGNvbnN1bWUgPSB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gcGFzcygpewogICAgICBwdXNoKGFyZ3VtZW50cyk7CiAgICAgIGNvbnN1bWUgPSBmYWxzZTsKICAgIH0KICAgIC8vIFVzZWQgdG8gY2hhbmdlIHRoZSBzdHlsZSBvZiB0aGUgY3VycmVudCB0b2tlbi4KICAgIGZ1bmN0aW9uIG1hcmsoc3R5bGUpewogICAgICBtYXJrZWQgPSBzdHlsZTsKICAgIH0KICAgIC8vIEFkZCBhIGx5ZXIgb2Ygc3R5bGUgdG8gdGhlIGN1cnJlbnQgdG9rZW4sIGZvciBleGFtcGxlIHN5bnRheC1lcnJvcgogICAgZnVuY3Rpb24gbWFya19hZGQoc3R5bGUpewogICAgICBtYXJrZWQgPSBtYXJrZWQgKyAnICcgKyBzdHlsZTsKICAgIH0KCiAgICAvLyBQdXNoIGEgbmV3IGxleGljYWwgY29udGV4dCBvZiB0aGUgZ2l2ZW4gdHlwZS4KICAgIGZ1bmN0aW9uIHB1c2hsZXgodHlwZSwgaW5mbykgewogICAgICB2YXIgcmVzdWx0ID0gZnVuY3Rpb24gcHVzaGxleGluZygpIHsKICAgICAgICBsZXhpY2FsID0gbmV3IFBIUExleGljYWwoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgbnVsbCwgbGV4aWNhbCwgaW5mbykKICAgICAgfTsKICAgICAgcmVzdWx0LmxleCA9IHRydWU7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvLyBQb3Agb2ZmIHRoZSBjdXJyZW50IGxleGljYWwgY29udGV4dC4KICAgIGZ1bmN0aW9uIHBvcGxleCgpewogICAgICBsZXhpY2FsID0gbGV4aWNhbC5wcmV2OwogICAgfQogICAgcG9wbGV4LmxleCA9IHRydWU7CiAgICAvLyBUaGUgJ2xleCcgZmxhZyBvbiB0aGVzZSBhY3Rpb25zIGlzIHVzZWQgYnkgdGhlICduZXh0JyBmdW5jdGlvbgogICAgLy8gdG8ga25vdyB0aGV5IGNhbiAoYW5kIGhhdmUgdG8pIGJlIHJhbiBiZWZvcmUgbW92aW5nIG9uIHRvIHRoZQogICAgLy8gbmV4dCB0b2tlbi4KCiAgICAvLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IGRpc2NhcmRzIHRva2VucyB1bnRpbCBpdCBmaW5kcyBvbmUgb2YKICAgIC8vIHRoZSBnaXZlbiB0eXBlLiBUaGlzIHdpbGwgaWdub3JlIChhbmQgcmVjb3ZlciBmcm9tKSBzeW50YXggZXJyb3JzLgogICAgZnVuY3Rpb24gZXhwZWN0KHdhbnRlZCl7CiAgICAgIHJldHVybiBmdW5jdGlvbiBleHBlY3RpbmcodG9rZW4pewogICAgICAgIGlmICh0b2tlbi50eXBlID09IHdhbnRlZCkgY29udCgpOyAgLy8gY29uc3VtZSB0aGUgdG9rZW4KICAgICAgICBlbHNlIHsKICAgICAgICAgIGNvbnQoYXJndW1lbnRzLmNhbGxlZSk7ICAvLyBjb250aW51ZSBleHBlY3RpbmcoKSAtIGNhbGwgaXRzZWxmCiAgICAgICAgfQogICAgICB9OwogICAgfQoKICAgIC8vIFJlcXVpcmUgYSBzcGVjaWZpYyB0b2tlbiB0eXBlLCBvciBvbmUgb2YgdGhlIHRva2VucyBwYXNzZWQgaW4gdGhlICd3YW50ZWQnIGFycmF5CiAgICAvLyBVc2VkIHRvIGRldGVjdCBibGF0YW50IHN5bnRheCBlcnJvcnMuICdleGVjdXRlJyBpcyB1c2VkIHRvIHBhc3MgZXh0cmEgY29kZQogICAgLy8gdG8gYmUgZXhlY3V0ZWQgaWYgdGhlIHRva2VuIGlzIG1hdGNoZWQuIEZvciBleGFtcGxlLCBhICcoJyBtYXRjaCBjb3VsZAogICAgLy8gJ2V4ZWN1dGUnIGEgY29udCggY29tcGFzZXAoZnVuY2FyZyksIHJlcXVpcmUoIikiKSApCiAgICBmdW5jdGlvbiByZXF1aXJlKHdhbnRlZCwgZXhlY3V0ZSl7CiAgICAgIHJldHVybiBmdW5jdGlvbiByZXF1aXJpbmcodG9rZW4pewogICAgICAgIHZhciBvazsKICAgICAgICB2YXIgdHlwZSA9IHRva2VuLnR5cGU7CiAgICAgICAgaWYgKHR5cGVvZih3YW50ZWQpID09ICJzdHJpbmciKQogICAgICAgICAgb2sgPSAodHlwZSA9PSB3YW50ZWQpIC0xOwogICAgICAgIGVsc2UKICAgICAgICAgIG9rID0gd2FudGVkLmluZGV4T2YodHlwZSk7CiAgICAgICAgaWYgKG9rID49IDApIHsKICAgICAgICAgIGlmIChleGVjdXRlICYmIHR5cGVvZihleGVjdXRlW29rXSkgPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgZXhlY3V0ZVtva10odG9rZW4pOwogICAgICAgICAgICBjb250KCk7ICAvLyBqdXN0IGNvbnN1bWUgdGhlIHRva2VuCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgaWYgKCFtYXJrZWQpIG1hcmsodG9rZW4uc3R5bGUpOwogICAgICAgICAgbWFya19hZGQoInN5bnRheC1lcnJvciIpOwogICAgICAgICAgY29udChhcmd1bWVudHMuY2FsbGVlKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgLy8gTG9va3MgZm9yIGEgc3RhdGVtZW50LCBhbmQgdGhlbiBjYWxscyBpdHNlbGYuCiAgICBmdW5jdGlvbiBzdGF0ZW1lbnRzKHRva2VuKXsKICAgICAgcmV0dXJuIHBhc3Moc3RhdGVtZW50LCBzdGF0ZW1lbnRzKTsKICAgIH0KICAgIC8vIERpc3BhdGNoZXMgdmFyaW91cyB0eXBlcyBvZiBzdGF0ZW1lbnRzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IHRva2VuLgogICAgZnVuY3Rpb24gc3RhdGVtZW50KHRva2VuKXsKICAgICAgdmFyIHR5cGUgPSB0b2tlbi50eXBlOwogICAgICBpZiAodHlwZSA9PSAia2V5d29yZCBhIikgY29udChwdXNobGV4KCJmb3JtIiksIGV4cHJlc3Npb24sIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAia2V5d29yZCBiIikgY29udChwdXNobGV4KCJmb3JtIiksIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAieyIpIGNvbnQocHVzaGxleCgifSIpLCBibG9jaywgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiZnVuY3Rpb24iKSBmdW5jZGVmKCk7CiAgICAgIC8vIHRlY2huaWNhbGx5LCAiY2xhc3MgaW1wbG9kZSB7Li4ufSIgaXMgY29ycmVjdCwgYnV0IHdlJ2xsIGZsYWcgdGhhdCBhcyBhbiBlcnJvciBiZWNhdXNlIGl0IG92ZXJyaWRlcyBhIHByZWRlZmluZWQgZnVuY3Rpb24KICAgICAgZWxzZSBpZiAodHlwZSA9PSAiY2xhc3MiKSBjb250KHJlcXVpcmUoInRfc3RyaW5nIiksIGV4cGVjdCgieyIpLCBwdXNobGV4KCJ9IiksIGJsb2NrLCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmb3JlYWNoIikgY29udChwdXNobGV4KCJmb3JtIiksIHJlcXVpcmUoIigiKSwgcHVzaGxleCgiKSIpLCBleHByZXNzaW9uLCByZXF1aXJlKCJhcyIpLCByZXF1aXJlKCJ2YXJpYWJsZSIpLCAvKiA9PiAkdmFsdWUgKi8gZXhwZWN0KCIpIiksIHBvcGxleCwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmb3IiKSBjb250KHB1c2hsZXgoImZvcm0iKSwgcmVxdWlyZSgiKCIpLCBwdXNobGV4KCIpIiksIGV4cHJlc3Npb24sIHJlcXVpcmUoIjsiKSwgZXhwcmVzc2lvbiwgcmVxdWlyZSgiOyIpLCBleHByZXNzaW9uLCByZXF1aXJlKCIpIiksIHBvcGxleCwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICAvLyBwdWJsaWMgZmluYWwgZnVuY3Rpb24gZm9vKCksIHByb3RlY3RlZCBzdGF0aWMgJGJhcjsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAibW9kaWZpZXIiKSBjb250KHJlcXVpcmUoWyJtb2RpZmllciIsICJ2YXJpYWJsZSIsICJmdW5jdGlvbiJdLCBbbnVsbCwgbnVsbCwgZnVuY2RlZl0pKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAic3dpdGNoIikgY29udChwdXNobGV4KCJmb3JtIiksIHJlcXVpcmUoIigiKSwgZXhwcmVzc2lvbiwgcmVxdWlyZSgiKSIpLCBwdXNobGV4KCJ9IiwgInN3aXRjaCIpLCByZXF1aXJlKFsiOiIsICJ7Il0pLCBibG9jaywgcG9wbGV4LCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJjYXNlIikgY29udChleHByZXNzaW9uLCByZXF1aXJlKCI6IikpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJkZWZhdWx0IikgY29udChyZXF1aXJlKCI6IikpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJjYXRjaCIpIGNvbnQocHVzaGxleCgiZm9ybSIpLCByZXF1aXJlKCIoIiksIHJlcXVpcmUoInRfc3RyaW5nIiksIHJlcXVpcmUoInZhcmlhYmxlIiksIHJlcXVpcmUoIikiKSwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJjb25zdCIpIGNvbnQocmVxdWlyZSgidF9zdHJpbmciKSk7ICAvLyAnY29uc3Qgc3RhdGljIHg9NScgaXMgYSBzeW50YXggZXJyb3IKICAgICAgLy8gdGVjaG5pY2FsbHksICJuYW1lc3BhY2UgaW1wbG9kZSB7Li4ufSIgaXMgY29ycmVjdCwgYnV0IHdlJ2xsIGZsYWcgdGhhdCBhcyBhbiBlcnJvciBiZWNhdXNlIGl0IG92ZXJyaWRlcyBhIHByZWRlZmluZWQgZnVuY3Rpb24KICAgICAgZWxzZSBpZiAodHlwZSA9PSAibmFtZXNwYWNlIikgY29udChuYW1lc3BhY2VkZWYsIHJlcXVpcmUoIjsiKSk7CiAgICAgIC8vICR2YXJpYWJsZXMgbWF5IGJlIGZvbGxvd2VkIGJ5IG9wZXJhdG9ycywgKCkgZm9yIHZhcmlhYmxlIGZ1bmN0aW9uIGNhbGxzLCBvciBbXSBzdWJzY3JpcHRzCiAgICAgIGVsc2UgcGFzcyhwdXNobGV4KCJzdGF0IiksIGV4cHJlc3Npb24sIHJlcXVpcmUoIjsiKSwgcG9wbGV4KTsKICAgIH0KICAgIC8vIERpc3BhdGNoIGV4cHJlc3Npb24gdHlwZXMuCiAgICBmdW5jdGlvbiBleHByZXNzaW9uKHRva2VuKXsKICAgICAgdmFyIHR5cGUgPSB0b2tlbi50eXBlOwogICAgICBpZiAoYXRvbWljVHlwZXMuaGFzT3duUHJvcGVydHkodHlwZSkpIGNvbnQobWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIjw8PCIpIGNvbnQocmVxdWlyZSgic3RyaW5nIiksIG1heWJlb3BlcmF0b3IpOyAgLy8gaGVyZWRvYy9ub3dkb2MKICAgICAgZWxzZSBpZiAodHlwZSA9PSAidF9zdHJpbmciKSBjb250KG1heWJlX2RvdWJsZV9jb2xvbiwgbWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImtleXdvcmQgYyIpIGNvbnQoZXhwcmVzc2lvbik7CiAgICAgIC8vIGZ1bmN0aW9uIGNhbGwgb3IgcGFyZW50aGVzaXplZCBleHByZXNzaW9uOiAkYSA9ICgkYiArIDEpICogMjsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiKCIpIGNvbnQocHVzaGxleCgiKSIpLCBjb21tYXNlcChleHByZXNzaW9uKSwgcmVxdWlyZSgiKSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJvcGVyYXRvciIpIGNvbnQoZXhwcmVzc2lvbik7CiAgICB9CiAgICAvLyBDYWxsZWQgZm9yIHBsYWNlcyB3aGVyZSBvcGVyYXRvcnMsIGZ1bmN0aW9uIGNhbGxzLCBvciBzdWJzY3JpcHRzIGFyZQogICAgLy8gdmFsaWQuIFdpbGwgc2tpcCBvbiB0byB0aGUgbmV4dCBhY3Rpb24gaWYgbm9uZSBpcyBmb3VuZC4KICAgIGZ1bmN0aW9uIG1heWJlb3BlcmF0b3IodG9rZW4pewogICAgICB2YXIgdHlwZSA9IHRva2VuLnR5cGU7CiAgICAgIGlmICh0eXBlID09ICJvcGVyYXRvciIpIHsKICAgICAgICBpZiAodG9rZW4uY29udGVudCA9PSAiPyIpIGNvbnQoZXhwcmVzc2lvbiwgcmVxdWlyZSgiOiIpLCBleHByZXNzaW9uKTsgIC8vIHRlcm5hcnkgb3BlcmF0b3IKICAgICAgICBlbHNlIGNvbnQoZXhwcmVzc2lvbik7CiAgICAgIH0KICAgICAgZWxzZSBpZiAodHlwZSA9PSAiKCIpIGNvbnQocHVzaGxleCgiKSIpLCBleHByZXNzaW9uLCBjb21tYXNlcChleHByZXNzaW9uKSwgcmVxdWlyZSgiKSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IgLyogJHZhcmZ1bmMoKSArIDMgKi8pOwogICAgICBlbHNlIGlmICh0eXBlID09ICJbIikgY29udChwdXNobGV4KCJdIiksIGV4cHJlc3Npb24sIHJlcXVpcmUoIl0iKSwgbWF5YmVvcGVyYXRvciAvKiBmb3IgbXVsdGlkaW1lbnNpb25hbCBhcnJheXMsIG9yICRmdW5jWyRpXSgpICovLCBwb3BsZXgpOwogICAgfQogICAgLy8gQSByZWd1bGFyIHVzZSBvZiB0aGUgZG91YmxlIGNvbG9uIHRvIHNwZWNpZnkgYSBjbGFzcywgYXMgaW4gc2VsZjo6ZnVuYygpIG9yIG15Y2xhc3M6OiR2YXI7CiAgICAvLyBEaWZmZXJzIGZyb20gYG5hbWVzcGFjZWAgb3IgYHVzZWAgaW4gdGhhdCBvbmx5IG9uZSBjbGFzcyBjYW4gYmUgdGhlIHBhcmVudDsgY2hhaW5zIChBOjpCOjokdmFyKSBhcmUgYSBzeW50YXggZXJyb3IuCiAgICBmdW5jdGlvbiBtYXliZV9kb3VibGVfY29sb24odG9rZW4pIHsKICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInRfZG91YmxlX2NvbG9uIikKICAgICAgICAvLyBBOjokdmFyLCBBOjpmdW5jKCksIEE6OmNvbnN0CiAgICAgICAgY29udChyZXF1aXJlKFsidF9zdHJpbmciLCAidmFyaWFibGUiXSksIG1heWJlb3BlcmF0b3IpOwogICAgICBlbHNlIHsKICAgICAgICAvLyBhIHRfc3RyaW5nIHdhc24ndCBmb2xsb3dlZCBieSA6Oiwgc3VjaCBhcyBpbiBhIGZ1bmN0aW9uIGNhbGw6IGZvbygpCiAgICAgICAgcGFzcyhleHByZXNzaW9uKQogICAgICB9CiAgICB9CiAgICAvLyB0aGUgZGVjbGFyYXRpb24gb3IgZGVmaW5pdGlvbiBvZiBhIGZ1bmN0aW9uCiAgICBmdW5jdGlvbiBmdW5jZGVmKCkgewogICAgICBjb250KHJlcXVpcmUoInRfc3RyaW5nIiksIHJlcXVpcmUoIigiKSwgcHVzaGxleCgiKSIpLCBjb21tYXNlcChmdW5jYXJnKSwgcmVxdWlyZSgiKSIpLCBwb3BsZXgsIGJsb2NrKTsKICAgIH0KICAgIC8vIFBhcnNlcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSB0aGluZ3MgdGhhdCBhcmUgcmVjb2duaXplZAogICAgLy8gYnkgdGhlICd3aGF0JyBhcmd1bWVudC4KICAgIGZ1bmN0aW9uIGNvbW1hc2VwKHdoYXQpewogICAgICBmdW5jdGlvbiBwcm9jZWVkKHRva2VuKSB7CiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gIiwiKSBjb250KHdoYXQsIHByb2NlZWQpOwogICAgICB9OwogICAgICByZXR1cm4gZnVuY3Rpb24gY29tbWFTZXBhcmF0ZWQoKSB7CiAgICAgICAgcGFzcyh3aGF0LCBwcm9jZWVkKTsKICAgICAgfTsKICAgIH0KICAgIC8vIExvb2sgZm9yIHN0YXRlbWVudHMgdW50aWwgYSBjbG9zaW5nIGJyYWNlIGlzIGZvdW5kLgogICAgZnVuY3Rpb24gYmxvY2sodG9rZW4pIHsKICAgICAgaWYgKHRva2VuLnR5cGUgPT0gIn0iKSBjb250KCk7CiAgICAgIGVsc2UgcGFzcyhzdGF0ZW1lbnQsIGJsb2NrKTsKICAgIH0KICAgIGZ1bmN0aW9uIG1heWJlZGVmYXVsdHBhcmFtZXRlcih0b2tlbil7CiAgICAgIGlmICh0b2tlbi5jb250ZW50ID09ICI9IikgY29udChleHByZXNzaW9uKTsKICAgIH0KICAgIC8vIHN1cHBvcnQgZm9yIGRlZmF1bHQgYXJndW1lbnRzOiBodHRwOi8vdXMucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb25zLmFyZ3VtZW50cy5waHAjZnVuY3Rpb25zLmFyZ3VtZW50cy5kZWZhdWx0CiAgICBmdW5jdGlvbiBmdW5jYXJnKHRva2VuKXsKICAgICAgLy8gZnVuY3Rpb24gZm9vKG15Y2xhc3MgJG9iaikgey4uLn0KICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInRfc3RyaW5nIikgY29udChyZXF1aXJlKCJ2YXJpYWJsZSIpLCBtYXliZWRlZmF1bHRwYXJhbWV0ZXIpOwogICAgICAvLyBmdW5jdGlvbiBmb28oJHN0cmluZykgey4uLn0KICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAidmFyaWFibGUiKSBjb250KG1heWJlZGVmYXVsdHBhcmFtZXRlcik7CiAgICB9CgogICAgLy8gQSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBvciB1c2UKICAgIGZ1bmN0aW9uIG1heWJlX2RvdWJsZV9jb2xvbl9kZWYodG9rZW4pIHsKICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInRfZG91YmxlX2NvbG9uIikKICAgICAgICBjb250KG5hbWVzcGFjZWRlZik7CiAgICB9CiAgICBmdW5jdGlvbiBuYW1lc3BhY2VkZWYodG9rZW4pIHsKICAgICAgcGFzcyhyZXF1aXJlKCJ0X3N0cmluZyIpLCBtYXliZV9kb3VibGVfY29sb25fZGVmKTsKICAgIH0KCiAgICByZXR1cm4gcGFyc2VyOwogIH0KCiAgcmV0dXJuIHttYWtlOiBwYXJzZVBIUCwgZWxlY3RyaWNDaGFyczogInt9OiJ9OwoKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/js/parsephphtmlmixed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhlIGNvcHlyaWdodHMgZW1ib2RpZWQgaW4gdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGFyZSBsaWNlbnNlZCBieQpZYWhvbyEgSW5jLiB1bmRlciB0aGUgQlNEIChyZXZpc2VkKSBvcGVuIHNvdXJjZSBsaWNlbnNlCgpAYXV0aG9yIERhbiBWbGFkIERhc2NhbGVzY3UgPGRhbmR2QHlhaG9vLWluYy5jb20+CgpCYXNlZCBvbiBwYXJzZWh0bWxtaXhlZC5qcyBieSBNYXJpam4gSGF2ZXJiZWtlLgoqLwoKdmFyIFBIUEhUTUxNaXhlZFBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgaWYgKCEoUEhQUGFyc2VyICYmIENTU1BhcnNlciAmJiBKU1BhcnNlciAmJiBYTUxQYXJzZXIpKQogICAgdGhyb3cgbmV3IEVycm9yKCJQSFAsIENTUywgSlMsIGFuZCBYTUwgcGFyc2VycyBtdXN0IGJlIGxvYWRlZCBmb3IgUEhQK0hUTUwgbWl4ZWQgbW9kZSB0byB3b3JrLiIpOwogIFhNTFBhcnNlci5jb25maWd1cmUoe3VzZUhUTUxLbHVkZ2VzOiB0cnVlfSk7CgogIGZ1bmN0aW9uIHBhcnNlTWl4ZWQoc3RyZWFtKSB7CiAgICB2YXIgaHRtbFBhcnNlciA9IFhNTFBhcnNlci5tYWtlKHN0cmVhbSksIGxvY2FsUGFyc2VyID0gbnVsbCwgaW5UYWcgPSBmYWxzZTsKICAgIHZhciBpdGVyID0ge25leHQ6IHRvcCwgY29weTogY29weX07CgogICAgZnVuY3Rpb24gdG9wKCkgewogICAgICB2YXIgdG9rZW4gPSBodG1sUGFyc2VyLm5leHQoKTsKICAgICAgaWYgKHRva2VuLmNvbnRlbnQgPT0gIjwiKQogICAgICAgIGluVGFnID0gdHJ1ZTsKICAgICAgZWxzZSBpZiAodG9rZW4uc3R5bGUgPT0gInhtbC10YWduYW1lIiAmJiBpblRhZyA9PT0gdHJ1ZSkKICAgICAgICBpblRhZyA9IHRva2VuLmNvbnRlbnQudG9Mb3dlckNhc2UoKTsKICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAieG1sLXByb2Nlc3NpbmciKSB7CiAgICAgICAgLy8gZGlzcGF0Y2ggb24gUEhQCiAgICAgICAgaWYgKHRva2VuLmNvbnRlbnQgPT0gIjw/cGhwIikKICAgICAgICAgIGl0ZXIubmV4dCA9IGxvY2FsKFBIUFBhcnNlciwgIj8+Iik7CiAgICAgIH0KICAgICAgLy8gInhtbC1wcm9jZXNzaW5nIiB0b2tlbnMgYXJlIGlnbm9yZWQsIGJlY2F1c2UgdGhleSBzaG91bGQgYmUgaGFuZGxlZCBieSBhIHNwZWNpZmljIGxvY2FsIHBhcnNlcgogICAgICBlbHNlIGlmICh0b2tlbi5jb250ZW50ID09ICI+IikgewogICAgICAgIGlmIChpblRhZyA9PSAic2NyaXB0IikKICAgICAgICAgIGl0ZXIubmV4dCA9IGxvY2FsKEpTUGFyc2VyLCAiPC9zY3JpcHQiKTsKICAgICAgICBlbHNlIGlmIChpblRhZyA9PSAic3R5bGUiKQogICAgICAgICAgaXRlci5uZXh0ID0gbG9jYWwoQ1NTUGFyc2VyLCAiPC9zdHlsZSIpOwogICAgICAgIGluVGFnID0gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRva2VuOwogICAgfQogICAgZnVuY3Rpb24gbG9jYWwocGFyc2VyLCB0YWcpIHsKICAgICAgdmFyIGJhc2VJbmRlbnQgPSBodG1sUGFyc2VyLmluZGVudGF0aW9uKCk7CiAgICAgIGxvY2FsUGFyc2VyID0gcGFyc2VyLm1ha2Uoc3RyZWFtLCBiYXNlSW5kZW50ICsgaW5kZW50VW5pdCk7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoc3RyZWFtLmxvb2tBaGVhZCh0YWcsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpIHsKICAgICAgICAgIGxvY2FsUGFyc2VyID0gbnVsbDsKICAgICAgICAgIGl0ZXIubmV4dCA9IHRvcDsKICAgICAgICAgIHJldHVybiB0b3AoKTsgIC8vIHBhc3MgdGhlIGVuZGluZyB0YWcgdG8gdGhlIGVuY2xvc2luZyBwYXJzZXIKICAgICAgICB9CgogICAgICAgIHZhciB0b2tlbiA9IGxvY2FsUGFyc2VyLm5leHQoKTsKICAgICAgICB2YXIgbHQgPSB0b2tlbi52YWx1ZS5sYXN0SW5kZXhPZigiPCIpLCBzeiA9IE1hdGgubWluKHRva2VuLnZhbHVlLmxlbmd0aCAtIGx0LCB0YWcubGVuZ3RoKTsKICAgICAgICBpZiAobHQgIT0gLTEgJiYgdG9rZW4udmFsdWUuc2xpY2UobHQsIGx0ICsgc3opLnRvTG93ZXJDYXNlKCkgPT0gdGFnLnNsaWNlKDAsIHN6KSAmJgogICAgICAgICAgICBzdHJlYW0ubG9va0FoZWFkKHRhZy5zbGljZShzeiksIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpIHsKICAgICAgICAgIHN0cmVhbS5wdXNoKHRva2VuLnZhbHVlLnNsaWNlKGx0KSk7CiAgICAgICAgICB0b2tlbi52YWx1ZSA9IHRva2VuLnZhbHVlLnNsaWNlKDAsIGx0KTsKICAgICAgICB9CgogICAgICAgIGlmICh0b2tlbi5pbmRlbnRhdGlvbikgewogICAgICAgICAgdmFyIG9sZEluZGVudCA9IHRva2VuLmluZGVudGF0aW9uOwogICAgICAgICAgdG9rZW4uaW5kZW50YXRpb24gPSBmdW5jdGlvbihjaGFycykgewogICAgICAgICAgICBpZiAoY2hhcnMgPT0gIjwvIikKICAgICAgICAgICAgICByZXR1cm4gYmFzZUluZGVudDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHJldHVybiBvbGRJbmRlbnQoY2hhcnMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvcHkoKSB7CiAgICAgIHZhciBfaHRtbCA9IGh0bWxQYXJzZXIuY29weSgpLCBfbG9jYWwgPSBsb2NhbFBhcnNlciAmJiBsb2NhbFBhcnNlci5jb3B5KCksCiAgICAgICAgICBfbmV4dCA9IGl0ZXIubmV4dCwgX2luVGFnID0gaW5UYWc7CiAgICAgIHJldHVybiBmdW5jdGlvbihfc3RyZWFtKSB7CiAgICAgICAgc3RyZWFtID0gX3N0cmVhbTsKICAgICAgICBodG1sUGFyc2VyID0gX2h0bWwoX3N0cmVhbSk7CiAgICAgICAgbG9jYWxQYXJzZXIgPSBfbG9jYWwgJiYgX2xvY2FsKF9zdHJlYW0pOwogICAgICAgIGl0ZXIubmV4dCA9IF9uZXh0OwogICAgICAgIGluVGFnID0gX2luVGFnOwogICAgICAgIHJldHVybiBpdGVyOwogICAgICB9OwogICAgfQogICAgcmV0dXJuIGl0ZXI7CiAgfQoKICByZXR1cm4ge21ha2U6IHBhcnNlTWl4ZWQsIGVsZWN0cmljQ2hhcnM6ICJ7fS86In07Cgp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/js/tokenizephp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgWWFob28hIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuClRoZSBjb3B5cmlnaHRzIGVtYm9kaWVkIGluIHRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBhcmUgbGljZW5zZWQgYnkKWWFob28hIEluYy4gdW5kZXIgdGhlIEJTRCAocmV2aXNlZCkgb3BlbiBzb3VyY2UgbGljZW5zZQoKQGF1dGhvciBWbGFkIERhbiBEYXNjYWxlc2N1IDxkYW5kdkB5YWhvby1pbmMuY29tPgoKClRva2VuaXplciBmb3IgUEhQIGNvZGUKClJlZmVyZW5jZXM6CiAgKyBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vcmVzZXJ2ZWQucGhwCiAgKyBodHRwOi8vcGhwLm5ldC90b2tlbnMKICArIGdldF9kZWZpbmVkX2NvbnN0YW50cygpLCBnZXRfZGVmaW5lZF9mdW5jdGlvbnMoKSwgZ2V0X2RlY2xhcmVkX2NsYXNzZXMoKQogICAgICBleGVjdXRlZCBvbiBhIHJlYWxpc3RpYyAobm90IHZhbmlsbGEpIFBIUCBpbnN0YWxsYXRpb24gd2l0aCB0eXBpY2FsIExBTVAgbW9kdWxlcy4KICAgICAgU3BlY2lmaWNhbGx5LCB0aGUgUEhQIGJ1bmRsZWQgd2l0aCB0aGUgVW5pZm9ybSBXZWIgU2VydmVyICh3d3cudW5pZm9ybXNlcnZlci5jb20pLgoKKi8KCgovLyBhZGQgdGhlIGZvckVhY2ggbWV0aG9kIGZvciBKUyBlbmdpbmVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCAoZS5nLiBJRSkKLy8gY29kZSBmcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL0VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlOk9iamVjdHM6QXJyYXk6Zm9yRWFjaAppZiAoIUFycmF5LnByb3RvdHlwZS5mb3JFYWNoKQp7CiAgQXJyYXkucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihmdW4gLyosIHRoaXNwKi8pCiAgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgaWYgKHR5cGVvZiBmdW4gIT0gImZ1bmN0aW9uIikKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOwoKICAgIHZhciB0aGlzcCA9IGFyZ3VtZW50c1sxXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspCiAgICB7CiAgICAgIGlmIChpIGluIHRoaXMpCiAgICAgICAgZnVuLmNhbGwodGhpc3AsIHRoaXNbaV0sIGksIHRoaXMpOwogICAgfQogIH07Cn0KCgp2YXIgdG9rZW5pemVQSFAgPSAoZnVuY3Rpb24oKSB7CiAgLyogQSBtYXAgb2YgUEhQJ3MgcmVzZXJ2ZWQgd29yZHMgKGtleXdvcmRzLCBwcmVkZWZpbmVkIGNsYXNzZXMsIGZ1bmN0aW9ucyBhbmQKICAgICBjb25zdGFudHMuIEVhY2ggdG9rZW4gaGFzIGEgdHlwZSAoJ2tleXdvcmQnLCAnb3BlcmF0b3InIGV0Yy4pIGFuZCBhIHN0eWxlLgogICAgIFRoZSBzdHlsZSBjb3JyZXNwb25kcyB0byB0aGUgQ1NTIHNwYW4gY2xhc3MgaW4gcGhwY29sb3JzLmNzcy4KCiAgICAgS2V5d29yZHMgY2FuIGJlIG9mIHRocmVlIHR5cGVzOgogICAgIGEgLSB0YWtlcyBhbiBleHByZXNzaW9uIGFuZCBmb3JtcyBhIHN0YXRlbWVudCAtIGUuZy4gaWYKICAgICBiIC0gdGFrZXMganVzdCBhIHN0YXRlbWVudCAtIGUuZy4gZWxzZQogICAgIGMgLSB0YWtlcyBhbiBvcHRpbm9hbCBleHByZXNzaW9uLCBidXQgbm8gc3RhdGVtZW50IC0gZS5nLiByZXR1cm4KICAgICBUaGlzIGRpc3RpbmN0aW9uIGdpdmVzIHRoZSBwYXJzZXIgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHBhcnNlCiAgICAgY29ycmVjdCBjb2RlIGNvcnJlY3RseSAod2UgZG9uJ3QgY2FyZSB0aGF0IG11Y2ggaG93IHdlIHBhcnNlCiAgICAgaW5jb3JyZWN0IGNvZGUpLgoKICAgICBSZWZlcmVuY2U6IGh0dHA6Ly91cy5waHAubmV0L21hbnVhbC9lbi9yZXNlcnZlZC5waHAKICAqLwogIHZhciBrZXl3b3JkcyA9IGZ1bmN0aW9uKCl7CiAgICBmdW5jdGlvbiB0b2tlbih0eXBlLCBzdHlsZSl7CiAgICAgIHJldHVybiB7dHlwZTogdHlwZSwgc3R5bGU6IHN0eWxlfTsKICAgIH0KICAgIHZhciByZXN1bHQgPSB7fTsKCiAgICAvLyBmb3IgZWFjaCh2YXIgZWxlbWVudCBpbiBbIi4uLiIsICIuLi4iXSkgY2FuIHBpY2sgdXAgZWxlbWVudHMgYWRkZWQgdG8KICAgIC8vIEFycmF5LnByb3RvdHlwZSwgc28gd2UnbGwgdXNlIHRoZSBsb29wIHN0cnVjdHVyZSBiZWxvdy4gU2VlIGFsc28KICAgIC8vIGh0dHA6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vQ29yZV9KYXZhU2NyaXB0XzEuNV9SZWZlcmVuY2UvU3RhdGVtZW50cy9mb3JfZWFjaC4uLmluCgogICAgLy8ga2V5d29yZHMgdGhhdCB0YWtlIGFuIGV4cHJlc3Npb24gYW5kIGZvcm0gYSBzdGF0ZW1lbnQKICAgIFsiaWYiLCAiZWxzZWlmIiwgIndoaWxlIiwgImRlY2xhcmUiXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigia2V5d29yZCBhIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICAvLyBrZXl3b3JkcyB0aGF0IHRha2UganVzdCBhIHN0YXRlbWVudAogICAgWyJkbyIsICJlbHNlIiwgInRyeSIgXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigia2V5d29yZCBiIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICAvLyBrZXl3b3JkcyB0aGF0IHRha2UgYW4gb3B0aW9uYWwgZXhwcmVzc2lvbiwgYnV0IG5vIHN0YXRlbWVudAogICAgWyJyZXR1cm4iLCAiYnJlYWsiLCAiY29udGludWUiLCAgLy8gdGhlIGV4cHJlc3Npb24gaXMgb3B0aW9uYWwKICAgICAgIm5ldyIsICJjbG9uZSIsICJ0aHJvdyIgIC8vIHRoZSBleHByZXNzaW9uIGlzIG1hbmRhdG9yeQogICAgXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigia2V5d29yZCBjIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICBbIl9fQ0xBU1NfXyIsICJfX0RJUl9fIiwgIl9fRklMRV9fIiwgIl9fRlVOQ1RJT05fXyIsICJfX01FVEhPRF9fIiwgIl9fTkFNRVNQQUNFX18iXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigiYXRvbSIsICJwaHAtY29tcGlsZS10aW1lLWNvbnN0YW50Iik7CiAgICB9KTsKCiAgICBbInRydWUiLCAiZmFsc2UiLCAibnVsbCJdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJhdG9tIiwgInBocC1hdG9tIik7CiAgICB9KTsKCiAgICBbImFuZCIsICJvciIsICJ4b3IiLCAiaW5zdGFuY2VvZiJdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJvcGVyYXRvciIsICJwaHAta2V5d29yZCBwaHAtb3BlcmF0b3IiKTsKICAgIH0pOwoKICAgIFsiY2xhc3MiLCAiaW50ZXJmYWNlIl0uZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCwgYXJyYXkpIHsKICAgICAgcmVzdWx0W2VsZW1lbnRdID0gdG9rZW4oImNsYXNzIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKICAgIFsibmFtZXNwYWNlIiwgInVzZSIsICJleHRlbmRzIiwgImltcGxlbWVudHMiXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigibmFtZXNwYWNlIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICAvLyByZXNlcnZlZCAibGFuZ3VhZ2UgY29uc3RydWN0cyIuLi4gaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL3Jlc2VydmVkLnBocAogICAgWyAiZGllIiwgImVjaG8iLCAiZW1wdHkiLCAiZXhpdCIsICJldmFsIiwgImluY2x1ZGUiLCAiaW5jbHVkZV9vbmNlIiwgImlzc2V0IiwKICAgICAgImxpc3QiLCAicmVxdWlyZSIsICJyZXF1aXJlX29uY2UiLCAicmV0dXJuIiwgInByaW50IiwgInVuc2V0IiwKICAgICAgImFycmF5IiAvLyBhIGtleXdvcmQgcmF0aGVyLCBidXQgbWFuZGF0ZXMgYSBwYXJlbnRoZXNpemVkIHBhcmFtZXRlciBsaXN0CiAgICBdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJ0X3N0cmluZyIsICJwaHAtcmVzZXJ2ZWQtbGFuZ3VhZ2UtY29uc3RydWN0Iik7CiAgICB9KTsKCiAgICByZXN1bHRbInN3aXRjaCJdID0gdG9rZW4oInN3aXRjaCIsICJwaHAta2V5d29yZCIpOwogICAgcmVzdWx0WyJjYXNlIl0gPSB0b2tlbigiY2FzZSIsICJwaHAta2V5d29yZCIpOwogICAgcmVzdWx0WyJkZWZhdWx0Il0gPSB0b2tlbigiZGVmYXVsdCIsICJwaHAta2V5d29yZCIpOwogICAgcmVzdWx0WyJjYXRjaCJdID0gdG9rZW4oImNhdGNoIiwgInBocC1rZXl3b3JkIik7CiAgICByZXN1bHRbImZ1bmN0aW9uIl0gPSB0b2tlbigiZnVuY3Rpb24iLCAicGhwLWtleXdvcmQiKTsKCiAgICAvLyBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vY29udHJvbC1zdHJ1Y3R1cmVzLmFsdGVybmF0aXZlLXN5bnRheC5waHAgbXVzdCBiZSBmb2xsb3dlZCBieSBhICc6JwogICAgWyJlbmRpZiIsICJlbmR3aGlsZSIsICJlbmRmb3IiLCAiZW5kZm9yZWFjaCIsICJlbmRzd2l0Y2giLCAiZW5kZGVjbGFyZSJdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJkZWZhdWx0IiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICByZXN1bHRbImNvbnN0Il0gPSB0b2tlbigiY29uc3QiLCAicGhwLWtleXdvcmQiKTsKCiAgICBbImFic3RyYWN0IiwgImZpbmFsIiwgInByaXZhdGUiLCAicHJvdGVjdGVkIiwgInB1YmxpYyIsICJnbG9iYWwiLCAic3RhdGljIl0uZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCwgYXJyYXkpIHsKICAgICAgcmVzdWx0W2VsZW1lbnRdID0gdG9rZW4oIm1vZGlmaWVyIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKICAgIHJlc3VsdFsidmFyIl0gPSB0b2tlbigibW9kaWZpZXIiLCAicGhwLWtleXdvcmQgZGVwcmVjYXRlZCIpOwoKICAgIHJlc3VsdFsiZm9yZWFjaCJdID0gdG9rZW4oImZvcmVhY2giLCAicGhwLWtleXdvcmQiKTsKICAgIHJlc3VsdFsiYXMiXSA9IHRva2VuKCJhcyIsICJwaHAta2V5d29yZCIpOwogICAgcmVzdWx0WyJmb3IiXSA9IHRva2VuKCJmb3IiLCAicGhwLWtleXdvcmQiKTsKCiAgICAvLyBQSFAgYnVpbHQtaW4gZnVuY3Rpb25zIC0gb3V0cHV0IG9mIGdldF9kZWZpbmVkX2Z1bmN0aW9ucygpWyJpbnRlcm5hbCJdCiAgICBbICJ6ZW5kX3ZlcnNpb24iLCAiZnVuY19udW1fYXJncyIsICJmdW5jX2dldF9hcmciLCAiZnVuY19nZXRfYXJncyIsICJzdHJsZW4iLAogICAgICAic3RyY21wIiwgInN0cm5jbXAiLCAic3RyY2FzZWNtcCIsICJzdHJuY2FzZWNtcCIsICJlYWNoIiwgImVycm9yX3JlcG9ydGluZyIsCiAgICAgICJkZWZpbmUiLCAiZGVmaW5lZCIsICJnZXRfY2xhc3MiLCAiZ2V0X3BhcmVudF9jbGFzcyIsICJtZXRob2RfZXhpc3RzIiwKICAgICAgInByb3BlcnR5X2V4aXN0cyIsICJjbGFzc19leGlzdHMiLCAiaW50ZXJmYWNlX2V4aXN0cyIsICJmdW5jdGlvbl9leGlzdHMiLAogICAgICAiZ2V0X2luY2x1ZGVkX2ZpbGVzIiwgImdldF9yZXF1aXJlZF9maWxlcyIsICJpc19zdWJjbGFzc19vZiIsICJpc19hIiwKICAgICAgImdldF9jbGFzc192YXJzIiwgImdldF9vYmplY3RfdmFycyIsICJnZXRfY2xhc3NfbWV0aG9kcyIsICJ0cmlnZ2VyX2Vycm9yIiwKICAgICAgInVzZXJfZXJyb3IiLCAic2V0X2Vycm9yX2hhbmRsZXIiLCAicmVzdG9yZV9lcnJvcl9oYW5kbGVyIiwKICAgICAgInNldF9leGNlcHRpb25faGFuZGxlciIsICJyZXN0b3JlX2V4Y2VwdGlvbl9oYW5kbGVyIiwgImdldF9kZWNsYXJlZF9jbGFzc2VzIiwKICAgICAgImdldF9kZWNsYXJlZF9pbnRlcmZhY2VzIiwgImdldF9kZWZpbmVkX2Z1bmN0aW9ucyIsICJnZXRfZGVmaW5lZF92YXJzIiwKICAgICAgImNyZWF0ZV9mdW5jdGlvbiIsICJnZXRfcmVzb3VyY2VfdHlwZSIsICJnZXRfbG9hZGVkX2V4dGVuc2lvbnMiLAogICAgICAiZXh0ZW5zaW9uX2xvYWRlZCIsICJnZXRfZXh0ZW5zaW9uX2Z1bmNzIiwgImdldF9kZWZpbmVkX2NvbnN0YW50cyIsCiAgICAgICJkZWJ1Z19iYWNrdHJhY2UiLCAiZGVidWdfcHJpbnRfYmFja3RyYWNlIiwgImJjYWRkIiwgImJjc3ViIiwgImJjbXVsIiwgImJjZGl2IiwKICAgICAgImJjbW9kIiwgImJjcG93IiwgImJjc3FydCIsICJiY3NjYWxlIiwgImJjY29tcCIsICJiY3Bvd21vZCIsICJqZHRvZ3JlZ29yaWFuIiwKICAgICAgImdyZWdvcmlhbnRvamQiLCAiamR0b2p1bGlhbiIsICJqdWxpYW50b2pkIiwgImpkdG9qZXdpc2giLCAiamV3aXNodG9qZCIsCiAgICAgICJqZHRvZnJlbmNoIiwgImZyZW5jaHRvamQiLCAiamRkYXlvZndlZWsiLCAiamRtb250aG5hbWUiLCAiZWFzdGVyX2RhdGUiLAogICAgICAiZWFzdGVyX2RheXMiLCAidW5peHRvamQiLCAiamR0b3VuaXgiLCAiY2FsX3RvX2pkIiwgImNhbF9mcm9tX2pkIiwKICAgICAgImNhbF9kYXlzX2luX21vbnRoIiwgImNhbF9pbmZvIiwgInZhcmlhbnRfc2V0IiwgInZhcmlhbnRfYWRkIiwgInZhcmlhbnRfY2F0IiwKICAgICAgInZhcmlhbnRfc3ViIiwgInZhcmlhbnRfbXVsIiwgInZhcmlhbnRfYW5kIiwgInZhcmlhbnRfZGl2IiwgInZhcmlhbnRfZXF2IiwKICAgICAgInZhcmlhbnRfaWRpdiIsICJ2YXJpYW50X2ltcCIsICJ2YXJpYW50X21vZCIsICJ2YXJpYW50X29yIiwgInZhcmlhbnRfcG93IiwKICAgICAgInZhcmlhbnRfeG9yIiwgInZhcmlhbnRfYWJzIiwgInZhcmlhbnRfZml4IiwgInZhcmlhbnRfaW50IiwgInZhcmlhbnRfbmVnIiwKICAgICAgInZhcmlhbnRfbm90IiwgInZhcmlhbnRfcm91bmQiLCAidmFyaWFudF9jbXAiLCAidmFyaWFudF9kYXRlX3RvX3RpbWVzdGFtcCIsCiAgICAgICJ2YXJpYW50X2RhdGVfZnJvbV90aW1lc3RhbXAiLCAidmFyaWFudF9nZXRfdHlwZSIsICJ2YXJpYW50X3NldF90eXBlIiwKICAgICAgInZhcmlhbnRfY2FzdCIsICJjb21fY3JlYXRlX2d1aWQiLCAiY29tX2V2ZW50X3NpbmsiLCAiY29tX3ByaW50X3R5cGVpbmZvIiwKICAgICAgImNvbV9tZXNzYWdlX3B1bXAiLCAiY29tX2xvYWRfdHlwZWxpYiIsICJjb21fZ2V0X2FjdGl2ZV9vYmplY3QiLCAiY3R5cGVfYWxudW0iLAogICAgICAiY3R5cGVfYWxwaGEiLCAiY3R5cGVfY250cmwiLCAiY3R5cGVfZGlnaXQiLCAiY3R5cGVfbG93ZXIiLCAiY3R5cGVfZ3JhcGgiLAogICAgICAiY3R5cGVfcHJpbnQiLCAiY3R5cGVfcHVuY3QiLCAiY3R5cGVfc3BhY2UiLCAiY3R5cGVfdXBwZXIiLCAiY3R5cGVfeGRpZ2l0IiwKICAgICAgInN0cnRvdGltZSIsICJkYXRlIiwgImlkYXRlIiwgImdtZGF0ZSIsICJta3RpbWUiLCAiZ21ta3RpbWUiLCAiY2hlY2tkYXRlIiwKICAgICAgInN0cmZ0aW1lIiwgImdtc3RyZnRpbWUiLCAidGltZSIsICJsb2NhbHRpbWUiLCAiZ2V0ZGF0ZSIsICJkYXRlX2NyZWF0ZSIsCiAgICAgICJkYXRlX3BhcnNlIiwgImRhdGVfZm9ybWF0IiwgImRhdGVfbW9kaWZ5IiwgImRhdGVfdGltZXpvbmVfZ2V0IiwKICAgICAgImRhdGVfdGltZXpvbmVfc2V0IiwgImRhdGVfb2Zmc2V0X2dldCIsICJkYXRlX3RpbWVfc2V0IiwgImRhdGVfZGF0ZV9zZXQiLAogICAgICAiZGF0ZV9pc29kYXRlX3NldCIsICJ0aW1lem9uZV9vcGVuIiwgInRpbWV6b25lX25hbWVfZ2V0IiwKICAgICAgInRpbWV6b25lX25hbWVfZnJvbV9hYmJyIiwgInRpbWV6b25lX29mZnNldF9nZXQiLCAidGltZXpvbmVfdHJhbnNpdGlvbnNfZ2V0IiwKICAgICAgInRpbWV6b25lX2lkZW50aWZpZXJzX2xpc3QiLCAidGltZXpvbmVfYWJicmV2aWF0aW9uc19saXN0IiwKICAgICAgImRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQiLCAiZGF0ZV9kZWZhdWx0X3RpbWV6b25lX2dldCIsICJkYXRlX3N1bnJpc2UiLAogICAgICAiZGF0ZV9zdW5zZXQiLCAiZGF0ZV9zdW5faW5mbyIsICJmaWx0ZXJfaW5wdXQiLCAiZmlsdGVyX3ZhciIsCiAgICAgICJmaWx0ZXJfaW5wdXRfYXJyYXkiLCAiZmlsdGVyX3Zhcl9hcnJheSIsICJmaWx0ZXJfbGlzdCIsICJmaWx0ZXJfaGFzX3ZhciIsCiAgICAgICJmaWx0ZXJfaWQiLCAiZnRwX2Nvbm5lY3QiLCAiZnRwX2xvZ2luIiwgImZ0cF9wd2QiLCAiZnRwX2NkdXAiLCAiZnRwX2NoZGlyIiwKICAgICAgImZ0cF9leGVjIiwgImZ0cF9yYXciLCAiZnRwX21rZGlyIiwgImZ0cF9ybWRpciIsICJmdHBfY2htb2QiLCAiZnRwX2FsbG9jIiwKICAgICAgImZ0cF9ubGlzdCIsICJmdHBfcmF3bGlzdCIsICJmdHBfc3lzdHlwZSIsICJmdHBfcGFzdiIsICJmdHBfZ2V0IiwgImZ0cF9mZ2V0IiwKICAgICAgImZ0cF9wdXQiLCAiZnRwX2ZwdXQiLCAiZnRwX3NpemUiLCAiZnRwX21kdG0iLCAiZnRwX3JlbmFtZSIsICJmdHBfZGVsZXRlIiwKICAgICAgImZ0cF9zaXRlIiwgImZ0cF9jbG9zZSIsICJmdHBfc2V0X29wdGlvbiIsICJmdHBfZ2V0X29wdGlvbiIsICJmdHBfbmJfZmdldCIsCiAgICAgICJmdHBfbmJfZ2V0IiwgImZ0cF9uYl9jb250aW51ZSIsICJmdHBfbmJfcHV0IiwgImZ0cF9uYl9mcHV0IiwgImZ0cF9xdWl0IiwKICAgICAgImhhc2giLCAiaGFzaF9maWxlIiwgImhhc2hfaG1hYyIsICJoYXNoX2htYWNfZmlsZSIsICJoYXNoX2luaXQiLCAiaGFzaF91cGRhdGUiLAogICAgICAiaGFzaF91cGRhdGVfc3RyZWFtIiwgImhhc2hfdXBkYXRlX2ZpbGUiLCAiaGFzaF9maW5hbCIsICJoYXNoX2FsZ29zIiwgImljb252IiwKICAgICAgIm9iX2ljb252X2hhbmRsZXIiLCAiaWNvbnZfZ2V0X2VuY29kaW5nIiwgImljb252X3NldF9lbmNvZGluZyIsICJpY29udl9zdHJsZW4iLAogICAgICAiaWNvbnZfc3Vic3RyIiwgImljb252X3N0cnBvcyIsICJpY29udl9zdHJycG9zIiwgImljb252X21pbWVfZW5jb2RlIiwKICAgICAgImljb252X21pbWVfZGVjb2RlIiwgImljb252X21pbWVfZGVjb2RlX2hlYWRlcnMiLCAianNvbl9lbmNvZGUiLCAianNvbl9kZWNvZGUiLAogICAgICAib2RiY19hdXRvY29tbWl0IiwgIm9kYmNfYmlubW9kZSIsICJvZGJjX2Nsb3NlIiwgIm9kYmNfY2xvc2VfYWxsIiwKICAgICAgIm9kYmNfY29sdW1ucyIsICJvZGJjX2NvbW1pdCIsICJvZGJjX2Nvbm5lY3QiLCAib2RiY19jdXJzb3IiLAogICAgICAib2RiY19kYXRhX3NvdXJjZSIsICJvZGJjX2V4ZWN1dGUiLCAib2RiY19lcnJvciIsICJvZGJjX2Vycm9ybXNnIiwgIm9kYmNfZXhlYyIsCiAgICAgICJvZGJjX2ZldGNoX2FycmF5IiwgIm9kYmNfZmV0Y2hfb2JqZWN0IiwgIm9kYmNfZmV0Y2hfcm93IiwgIm9kYmNfZmV0Y2hfaW50byIsCiAgICAgICJvZGJjX2ZpZWxkX2xlbiIsICJvZGJjX2ZpZWxkX3NjYWxlIiwgIm9kYmNfZmllbGRfbmFtZSIsICJvZGJjX2ZpZWxkX3R5cGUiLAogICAgICAib2RiY19maWVsZF9udW0iLCAib2RiY19mcmVlX3Jlc3VsdCIsICJvZGJjX2dldHR5cGVpbmZvIiwgIm9kYmNfbG9uZ3JlYWRsZW4iLAogICAgICAib2RiY19uZXh0X3Jlc3VsdCIsICJvZGJjX251bV9maWVsZHMiLCAib2RiY19udW1fcm93cyIsICJvZGJjX3Bjb25uZWN0IiwKICAgICAgIm9kYmNfcHJlcGFyZSIsICJvZGJjX3Jlc3VsdCIsICJvZGJjX3Jlc3VsdF9hbGwiLCAib2RiY19yb2xsYmFjayIsCiAgICAgICJvZGJjX3NldG9wdGlvbiIsICJvZGJjX3NwZWNpYWxjb2x1bW5zIiwgIm9kYmNfc3RhdGlzdGljcyIsICJvZGJjX3RhYmxlcyIsCiAgICAgICJvZGJjX3ByaW1hcnlrZXlzIiwgIm9kYmNfY29sdW1ucHJpdmlsZWdlcyIsICJvZGJjX3RhYmxlcHJpdmlsZWdlcyIsCiAgICAgICJvZGJjX2ZvcmVpZ25rZXlzIiwgIm9kYmNfcHJvY2VkdXJlcyIsICJvZGJjX3Byb2NlZHVyZWNvbHVtbnMiLCAib2RiY19kbyIsCiAgICAgICJvZGJjX2ZpZWxkX3ByZWNpc2lvbiIsICJwcmVnX21hdGNoIiwgInByZWdfbWF0Y2hfYWxsIiwgInByZWdfcmVwbGFjZSIsCiAgICAgICJwcmVnX3JlcGxhY2VfY2FsbGJhY2siLCAicHJlZ19zcGxpdCIsICJwcmVnX3F1b3RlIiwgInByZWdfZ3JlcCIsCiAgICAgICJwcmVnX2xhc3RfZXJyb3IiLCAic2Vzc2lvbl9uYW1lIiwgInNlc3Npb25fbW9kdWxlX25hbWUiLCAic2Vzc2lvbl9zYXZlX3BhdGgiLAogICAgICAic2Vzc2lvbl9pZCIsICJzZXNzaW9uX3JlZ2VuZXJhdGVfaWQiLCAic2Vzc2lvbl9kZWNvZGUiLCAic2Vzc2lvbl9yZWdpc3RlciIsCiAgICAgICJzZXNzaW9uX3VucmVnaXN0ZXIiLCAic2Vzc2lvbl9pc19yZWdpc3RlcmVkIiwgInNlc3Npb25fZW5jb2RlIiwKICAgICAgInNlc3Npb25fc3RhcnQiLCAic2Vzc2lvbl9kZXN0cm95IiwgInNlc3Npb25fdW5zZXQiLAogICAgICAic2Vzc2lvbl9zZXRfc2F2ZV9oYW5kbGVyIiwgInNlc3Npb25fY2FjaGVfbGltaXRlciIsICJzZXNzaW9uX2NhY2hlX2V4cGlyZSIsCiAgICAgICJzZXNzaW9uX3NldF9jb29raWVfcGFyYW1zIiwgInNlc3Npb25fZ2V0X2Nvb2tpZV9wYXJhbXMiLAogICAgICAic2Vzc2lvbl93cml0ZV9jbG9zZSIsICJzZXNzaW9uX2NvbW1pdCIsICJzcGxfY2xhc3NlcyIsICJzcGxfYXV0b2xvYWQiLAogICAgICAic3BsX2F1dG9sb2FkX2V4dGVuc2lvbnMiLCAic3BsX2F1dG9sb2FkX3JlZ2lzdGVyIiwgInNwbF9hdXRvbG9hZF91bnJlZ2lzdGVyIiwKICAgICAgInNwbF9hdXRvbG9hZF9mdW5jdGlvbnMiLCAic3BsX2F1dG9sb2FkX2NhbGwiLCAiY2xhc3NfcGFyZW50cyIsCiAgICAgICJjbGFzc19pbXBsZW1lbnRzIiwgInNwbF9vYmplY3RfaGFzaCIsICJpdGVyYXRvcl90b19hcnJheSIsICJpdGVyYXRvcl9jb3VudCIsCiAgICAgICJpdGVyYXRvcl9hcHBseSIsICJjb25zdGFudCIsICJiaW4yaGV4IiwgInNsZWVwIiwgInVzbGVlcCIsICJmbHVzaCIsCiAgICAgICJ3b3Jkd3JhcCIsICJodG1sc3BlY2lhbGNoYXJzIiwgImh0bWxlbnRpdGllcyIsICJodG1sX2VudGl0eV9kZWNvZGUiLAogICAgICAiaHRtbHNwZWNpYWxjaGFyc19kZWNvZGUiLCAiZ2V0X2h0bWxfdHJhbnNsYXRpb25fdGFibGUiLCAic2hhMSIsICJzaGExX2ZpbGUiLAogICAgICAibWQ1IiwgIm1kNV9maWxlIiwgImNyYzMyIiwgImlwdGNwYXJzZSIsICJpcHRjZW1iZWQiLCAiZ2V0aW1hZ2VzaXplIiwKICAgICAgImltYWdlX3R5cGVfdG9fbWltZV90eXBlIiwgImltYWdlX3R5cGVfdG9fZXh0ZW5zaW9uIiwgInBocGluZm8iLCAicGhwdmVyc2lvbiIsCiAgICAgICJwaHBjcmVkaXRzIiwgInBocF9sb2dvX2d1aWQiLCAicGhwX3JlYWxfbG9nb19ndWlkIiwgInBocF9lZ2dfbG9nb19ndWlkIiwKICAgICAgInplbmRfbG9nb19ndWlkIiwgInBocF9zYXBpX25hbWUiLCAicGhwX3VuYW1lIiwgInBocF9pbmlfc2Nhbm5lZF9maWxlcyIsCiAgICAgICJzdHJuYXRjbXAiLCAic3RybmF0Y2FzZWNtcCIsICJzdWJzdHJfY291bnQiLCAic3Ryc3BuIiwgInN0cmNzcG4iLCAic3RydG9rIiwKICAgICAgInN0cnRvdXBwZXIiLCAic3RydG9sb3dlciIsICJzdHJwb3MiLCAic3RyaXBvcyIsICJzdHJycG9zIiwgInN0cnJpcG9zIiwKICAgICAgInN0cnJldiIsICJoZWJyZXYiLCAiaGVicmV2YyIsICJubDJiciIsICJiYXNlbmFtZSIsICJkaXJuYW1lIiwgInBhdGhpbmZvIiwKICAgICAgInN0cmlwc2xhc2hlcyIsICJzdHJpcGNzbGFzaGVzIiwgInN0cnN0ciIsICJzdHJpc3RyIiwgInN0cnJjaHIiLCAic3RyX3NodWZmbGUiLAogICAgICAic3RyX3dvcmRfY291bnQiLCAic3RyX3NwbGl0IiwgInN0cnBicmsiLCAic3Vic3RyX2NvbXBhcmUiLCAic3RyY29sbCIsCiAgICAgICJzdWJzdHIiLCAic3Vic3RyX3JlcGxhY2UiLCAicXVvdGVtZXRhIiwgInVjZmlyc3QiLCAidWN3b3JkcyIsICJzdHJ0ciIsCiAgICAgICJhZGRzbGFzaGVzIiwgImFkZGNzbGFzaGVzIiwgInJ0cmltIiwgInN0cl9yZXBsYWNlIiwgInN0cl9pcmVwbGFjZSIsCiAgICAgICJzdHJfcmVwZWF0IiwgImNvdW50X2NoYXJzIiwgImNodW5rX3NwbGl0IiwgInRyaW0iLCAibHRyaW0iLCAic3RyaXBfdGFncyIsCiAgICAgICJzaW1pbGFyX3RleHQiLCAiZXhwbG9kZSIsICJpbXBsb2RlIiwgInNldGxvY2FsZSIsICJsb2NhbGVjb252IiwgInNvdW5kZXgiLAogICAgICAibGV2ZW5zaHRlaW4iLCAiY2hyIiwgIm9yZCIsICJwYXJzZV9zdHIiLCAic3RyX3BhZCIsICJjaG9wIiwgInN0cmNociIsCiAgICAgICJzcHJpbnRmIiwgInByaW50ZiIsICJ2cHJpbnRmIiwgInZzcHJpbnRmIiwgImZwcmludGYiLCAidmZwcmludGYiLCAic3NjYW5mIiwKICAgICAgImZzY2FuZiIsICJwYXJzZV91cmwiLCAidXJsZW5jb2RlIiwgInVybGRlY29kZSIsICJyYXd1cmxlbmNvZGUiLAogICAgICAicmF3dXJsZGVjb2RlIiwgImh0dHBfYnVpbGRfcXVlcnkiLCAidW5saW5rIiwgImV4ZWMiLCAic3lzdGVtIiwKICAgICAgImVzY2FwZXNoZWxsY21kIiwgImVzY2FwZXNoZWxsYXJnIiwgInBhc3N0aHJ1IiwgInNoZWxsX2V4ZWMiLCAicHJvY19vcGVuIiwKICAgICAgInByb2NfY2xvc2UiLCAicHJvY190ZXJtaW5hdGUiLCAicHJvY19nZXRfc3RhdHVzIiwgInJhbmQiLCAic3JhbmQiLAogICAgICAiZ2V0cmFuZG1heCIsICJtdF9yYW5kIiwgIm10X3NyYW5kIiwgIm10X2dldHJhbmRtYXgiLCAiZ2V0c2VydmJ5bmFtZSIsCiAgICAgICJnZXRzZXJ2Ynlwb3J0IiwgImdldHByb3RvYnluYW1lIiwgImdldHByb3RvYnludW1iZXIiLCAiZ2V0bXl1aWQiLCAiZ2V0bXlnaWQiLAogICAgICAiZ2V0bXlwaWQiLCAiZ2V0bXlpbm9kZSIsICJnZXRsYXN0bW9kIiwgImJhc2U2NF9kZWNvZGUiLCAiYmFzZTY0X2VuY29kZSIsCiAgICAgICJjb252ZXJ0X3V1ZW5jb2RlIiwgImNvbnZlcnRfdXVkZWNvZGUiLCAiYWJzIiwgImNlaWwiLCAiZmxvb3IiLCAicm91bmQiLCAic2luIiwKICAgICAgImNvcyIsICJ0YW4iLCAiYXNpbiIsICJhY29zIiwgImF0YW4iLCAiYXRhbjIiLCAic2luaCIsICJjb3NoIiwgInRhbmgiLCAicGkiLAogICAgICAiaXNfZmluaXRlIiwgImlzX25hbiIsICJpc19pbmZpbml0ZSIsICJwb3ciLCAiZXhwIiwgImxvZyIsICJsb2cxMCIsICJzcXJ0IiwKICAgICAgImh5cG90IiwgImRlZzJyYWQiLCAicmFkMmRlZyIsICJiaW5kZWMiLCAiaGV4ZGVjIiwgIm9jdGRlYyIsICJkZWNiaW4iLAogICAgICAiZGVjb2N0IiwgImRlY2hleCIsICJiYXNlX2NvbnZlcnQiLCAibnVtYmVyX2Zvcm1hdCIsICJmbW9kIiwgImlwMmxvbmciLAogICAgICAibG9uZzJpcCIsICJnZXRlbnYiLCAicHV0ZW52IiwgIm1pY3JvdGltZSIsICJnZXR0aW1lb2ZkYXkiLCAidW5pcWlkIiwKICAgICAgInF1b3RlZF9wcmludGFibGVfZGVjb2RlIiwgImNvbnZlcnRfY3lyX3N0cmluZyIsICJnZXRfY3VycmVudF91c2VyIiwKICAgICAgInNldF90aW1lX2xpbWl0IiwgImdldF9jZmdfdmFyIiwgIm1hZ2ljX3F1b3Rlc19ydW50aW1lIiwKICAgICAgInNldF9tYWdpY19xdW90ZXNfcnVudGltZSIsICJnZXRfbWFnaWNfcXVvdGVzX2dwYyIsICJnZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUiLAogICAgICAiaW1wb3J0X3JlcXVlc3RfdmFyaWFibGVzIiwgImVycm9yX2xvZyIsICJlcnJvcl9nZXRfbGFzdCIsICJjYWxsX3VzZXJfZnVuYyIsCiAgICAgICJjYWxsX3VzZXJfZnVuY19hcnJheSIsICJjYWxsX3VzZXJfbWV0aG9kIiwgImNhbGxfdXNlcl9tZXRob2RfYXJyYXkiLAogICAgICAic2VyaWFsaXplIiwgInVuc2VyaWFsaXplIiwgInZhcl9kdW1wIiwgInZhcl9leHBvcnQiLCAiZGVidWdfenZhbF9kdW1wIiwKICAgICAgInByaW50X3IiLCAibWVtb3J5X2dldF91c2FnZSIsICJtZW1vcnlfZ2V0X3BlYWtfdXNhZ2UiLAogICAgICAicmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24iLCAicmVnaXN0ZXJfdGlja19mdW5jdGlvbiIsCiAgICAgICJ1bnJlZ2lzdGVyX3RpY2tfZnVuY3Rpb24iLCAiaGlnaGxpZ2h0X2ZpbGUiLCAic2hvd19zb3VyY2UiLAogICAgICAiaGlnaGxpZ2h0X3N0cmluZyIsICJwaHBfc3RyaXBfd2hpdGVzcGFjZSIsICJpbmlfZ2V0IiwgImluaV9nZXRfYWxsIiwKICAgICAgImluaV9zZXQiLCAiaW5pX2FsdGVyIiwgImluaV9yZXN0b3JlIiwgImdldF9pbmNsdWRlX3BhdGgiLCAic2V0X2luY2x1ZGVfcGF0aCIsCiAgICAgICJyZXN0b3JlX2luY2x1ZGVfcGF0aCIsICJzZXRjb29raWUiLCAic2V0cmF3Y29va2llIiwgImhlYWRlciIsICJoZWFkZXJzX3NlbnQiLAogICAgICAiaGVhZGVyc19saXN0IiwgImNvbm5lY3Rpb25fYWJvcnRlZCIsICJjb25uZWN0aW9uX3N0YXR1cyIsICJpZ25vcmVfdXNlcl9hYm9ydCIsCiAgICAgICJwYXJzZV9pbmlfZmlsZSIsICJpc191cGxvYWRlZF9maWxlIiwgIm1vdmVfdXBsb2FkZWRfZmlsZSIsICJnZXRob3N0YnlhZGRyIiwKICAgICAgImdldGhvc3RieW5hbWUiLCAiZ2V0aG9zdGJ5bmFtZWwiLCAiaW50dmFsIiwgImZsb2F0dmFsIiwgImRvdWJsZXZhbCIsICJzdHJ2YWwiLAogICAgICAiZ2V0dHlwZSIsICJzZXR0eXBlIiwgImlzX251bGwiLCAiaXNfcmVzb3VyY2UiLCAiaXNfYm9vbCIsICJpc19sb25nIiwKICAgICAgImlzX2Zsb2F0IiwgImlzX2ludCIsICJpc19pbnRlZ2VyIiwgImlzX2RvdWJsZSIsICJpc19yZWFsIiwgImlzX251bWVyaWMiLAogICAgICAiaXNfc3RyaW5nIiwgImlzX2FycmF5IiwgImlzX29iamVjdCIsICJpc19zY2FsYXIiLCAiaXNfY2FsbGFibGUiLCAiZXJlZyIsCiAgICAgICJlcmVnX3JlcGxhY2UiLCAiZXJlZ2kiLCAiZXJlZ2lfcmVwbGFjZSIsICJzcGxpdCIsICJzcGxpdGkiLCAiam9pbiIsCiAgICAgICJzcWxfcmVnY2FzZSIsICJkbCIsICJwY2xvc2UiLCAicG9wZW4iLCAicmVhZGZpbGUiLCAicmV3aW5kIiwgInJtZGlyIiwgInVtYXNrIiwKICAgICAgImZjbG9zZSIsICJmZW9mIiwgImZnZXRjIiwgImZnZXRzIiwgImZnZXRzcyIsICJmcmVhZCIsICJmb3BlbiIsICJmcGFzc3RocnUiLAogICAgICAiZnRydW5jYXRlIiwgImZzdGF0IiwgImZzZWVrIiwgImZ0ZWxsIiwgImZmbHVzaCIsICJmd3JpdGUiLCAiZnB1dHMiLCAibWtkaXIiLAogICAgICAicmVuYW1lIiwgImNvcHkiLCAidGVtcG5hbSIsICJ0bXBmaWxlIiwgImZpbGUiLCAiZmlsZV9nZXRfY29udGVudHMiLAogICAgICAiZmlsZV9wdXRfY29udGVudHMiLCAic3RyZWFtX3NlbGVjdCIsICJzdHJlYW1fY29udGV4dF9jcmVhdGUiLAogICAgICAic3RyZWFtX2NvbnRleHRfc2V0X3BhcmFtcyIsICJzdHJlYW1fY29udGV4dF9zZXRfb3B0aW9uIiwKICAgICAgInN0cmVhbV9jb250ZXh0X2dldF9vcHRpb25zIiwgInN0cmVhbV9jb250ZXh0X2dldF9kZWZhdWx0IiwKICAgICAgInN0cmVhbV9maWx0ZXJfcHJlcGVuZCIsICJzdHJlYW1fZmlsdGVyX2FwcGVuZCIsICJzdHJlYW1fZmlsdGVyX3JlbW92ZSIsCiAgICAgICJzdHJlYW1fc29ja2V0X2NsaWVudCIsICJzdHJlYW1fc29ja2V0X3NlcnZlciIsICJzdHJlYW1fc29ja2V0X2FjY2VwdCIsCiAgICAgICJzdHJlYW1fc29ja2V0X2dldF9uYW1lIiwgInN0cmVhbV9zb2NrZXRfcmVjdmZyb20iLCAic3RyZWFtX3NvY2tldF9zZW5kdG8iLAogICAgICAic3RyZWFtX3NvY2tldF9lbmFibGVfY3J5cHRvIiwgInN0cmVhbV9zb2NrZXRfc2h1dGRvd24iLAogICAgICAic3RyZWFtX2NvcHlfdG9fc3RyZWFtIiwgInN0cmVhbV9nZXRfY29udGVudHMiLCAiZmdldGNzdiIsICJmcHV0Y3N2IiwgImZsb2NrIiwKICAgICAgImdldF9tZXRhX3RhZ3MiLCAic3RyZWFtX3NldF93cml0ZV9idWZmZXIiLCAic2V0X2ZpbGVfYnVmZmVyIiwKICAgICAgInNldF9zb2NrZXRfYmxvY2tpbmciLCAic3RyZWFtX3NldF9ibG9ja2luZyIsICJzb2NrZXRfc2V0X2Jsb2NraW5nIiwKICAgICAgInN0cmVhbV9nZXRfbWV0YV9kYXRhIiwgInN0cmVhbV9nZXRfbGluZSIsICJzdHJlYW1fd3JhcHBlcl9yZWdpc3RlciIsCiAgICAgICJzdHJlYW1fcmVnaXN0ZXJfd3JhcHBlciIsICJzdHJlYW1fd3JhcHBlcl91bnJlZ2lzdGVyIiwKICAgICAgInN0cmVhbV93cmFwcGVyX3Jlc3RvcmUiLCAic3RyZWFtX2dldF93cmFwcGVycyIsICJzdHJlYW1fZ2V0X3RyYW5zcG9ydHMiLAogICAgICAiZ2V0X2hlYWRlcnMiLCAic3RyZWFtX3NldF90aW1lb3V0IiwgInNvY2tldF9zZXRfdGltZW91dCIsICJzb2NrZXRfZ2V0X3N0YXR1cyIsCiAgICAgICJyZWFscGF0aCIsICJmc29ja29wZW4iLCAicGZzb2Nrb3BlbiIsICJwYWNrIiwgInVucGFjayIsICJnZXRfYnJvd3NlciIsCiAgICAgICJjcnlwdCIsICJvcGVuZGlyIiwgImNsb3NlZGlyIiwgImNoZGlyIiwgImdldGN3ZCIsICJyZXdpbmRkaXIiLCAicmVhZGRpciIsCiAgICAgICJkaXIiLCAic2NhbmRpciIsICJnbG9iIiwgImZpbGVhdGltZSIsICJmaWxlY3RpbWUiLCAiZmlsZWdyb3VwIiwgImZpbGVpbm9kZSIsCiAgICAgICJmaWxlbXRpbWUiLCAiZmlsZW93bmVyIiwgImZpbGVwZXJtcyIsICJmaWxlc2l6ZSIsICJmaWxldHlwZSIsICJmaWxlX2V4aXN0cyIsCiAgICAgICJpc193cml0YWJsZSIsICJpc193cml0ZWFibGUiLCAiaXNfcmVhZGFibGUiLCAiaXNfZXhlY3V0YWJsZSIsICJpc19maWxlIiwKICAgICAgImlzX2RpciIsICJpc19saW5rIiwgInN0YXQiLCAibHN0YXQiLCAiY2hvd24iLCAiY2hncnAiLCAiY2htb2QiLCAidG91Y2giLAogICAgICAiY2xlYXJzdGF0Y2FjaGUiLCAiZGlza190b3RhbF9zcGFjZSIsICJkaXNrX2ZyZWVfc3BhY2UiLCAiZGlza2ZyZWVzcGFjZSIsCiAgICAgICJtYWlsIiwgImV6bWxtX2hhc2giLCAib3BlbmxvZyIsICJzeXNsb2ciLCAiY2xvc2Vsb2ciLAogICAgICAiZGVmaW5lX3N5c2xvZ192YXJpYWJsZXMiLCAibGNnX3ZhbHVlIiwgIm1ldGFwaG9uZSIsICJvYl9zdGFydCIsICJvYl9mbHVzaCIsCiAgICAgICJvYl9jbGVhbiIsICJvYl9lbmRfZmx1c2giLCAib2JfZW5kX2NsZWFuIiwgIm9iX2dldF9mbHVzaCIsICJvYl9nZXRfY2xlYW4iLAogICAgICAib2JfZ2V0X2xlbmd0aCIsICJvYl9nZXRfbGV2ZWwiLCAib2JfZ2V0X3N0YXR1cyIsICJvYl9nZXRfY29udGVudHMiLAogICAgICAib2JfaW1wbGljaXRfZmx1c2giLCAib2JfbGlzdF9oYW5kbGVycyIsICJrc29ydCIsICJrcnNvcnQiLCAibmF0c29ydCIsCiAgICAgICJuYXRjYXNlc29ydCIsICJhc29ydCIsICJhcnNvcnQiLCAic29ydCIsICJyc29ydCIsICJ1c29ydCIsICJ1YXNvcnQiLCAidWtzb3J0IiwKICAgICAgInNodWZmbGUiLCAiYXJyYXlfd2FsayIsICJhcnJheV93YWxrX3JlY3Vyc2l2ZSIsICJjb3VudCIsICJlbmQiLCAicHJldiIsCiAgICAgICJuZXh0IiwgInJlc2V0IiwgImN1cnJlbnQiLCAia2V5IiwgIm1pbiIsICJtYXgiLCAiaW5fYXJyYXkiLCAiYXJyYXlfc2VhcmNoIiwKICAgICAgImV4dHJhY3QiLCAiY29tcGFjdCIsICJhcnJheV9maWxsIiwgImFycmF5X2ZpbGxfa2V5cyIsICJyYW5nZSIsCiAgICAgICJhcnJheV9tdWx0aXNvcnQiLCAiYXJyYXlfcHVzaCIsICJhcnJheV9wb3AiLCAiYXJyYXlfc2hpZnQiLCAiYXJyYXlfdW5zaGlmdCIsCiAgICAgICJhcnJheV9zcGxpY2UiLCAiYXJyYXlfc2xpY2UiLCAiYXJyYXlfbWVyZ2UiLCAiYXJyYXlfbWVyZ2VfcmVjdXJzaXZlIiwKICAgICAgImFycmF5X2tleXMiLCAiYXJyYXlfdmFsdWVzIiwgImFycmF5X2NvdW50X3ZhbHVlcyIsICJhcnJheV9yZXZlcnNlIiwKICAgICAgImFycmF5X3JlZHVjZSIsICJhcnJheV9wYWQiLCAiYXJyYXlfZmxpcCIsICJhcnJheV9jaGFuZ2Vfa2V5X2Nhc2UiLAogICAgICAiYXJyYXlfcmFuZCIsICJhcnJheV91bmlxdWUiLCAiYXJyYXlfaW50ZXJzZWN0IiwgImFycmF5X2ludGVyc2VjdF9rZXkiLAogICAgICAiYXJyYXlfaW50ZXJzZWN0X3VrZXkiLCAiYXJyYXlfdWludGVyc2VjdCIsICJhcnJheV9pbnRlcnNlY3RfYXNzb2MiLAogICAgICAiYXJyYXlfdWludGVyc2VjdF9hc3NvYyIsICJhcnJheV9pbnRlcnNlY3RfdWFzc29jIiwgImFycmF5X3VpbnRlcnNlY3RfdWFzc29jIiwKICAgICAgImFycmF5X2RpZmYiLCAiYXJyYXlfZGlmZl9rZXkiLCAiYXJyYXlfZGlmZl91a2V5IiwgImFycmF5X3VkaWZmIiwKICAgICAgImFycmF5X2RpZmZfYXNzb2MiLCAiYXJyYXlfdWRpZmZfYXNzb2MiLCAiYXJyYXlfZGlmZl91YXNzb2MiLAogICAgICAiYXJyYXlfdWRpZmZfdWFzc29jIiwgImFycmF5X3N1bSIsICJhcnJheV9wcm9kdWN0IiwgImFycmF5X2ZpbHRlciIsCiAgICAgICJhcnJheV9tYXAiLCAiYXJyYXlfY2h1bmsiLCAiYXJyYXlfY29tYmluZSIsICJhcnJheV9rZXlfZXhpc3RzIiwgInBvcyIsCiAgICAgICJzaXplb2YiLCAia2V5X2V4aXN0cyIsICJhc3NlcnQiLCAiYXNzZXJ0X29wdGlvbnMiLCAidmVyc2lvbl9jb21wYXJlIiwKICAgICAgInN0cl9yb3QxMyIsICJzdHJlYW1fZ2V0X2ZpbHRlcnMiLCAic3RyZWFtX2ZpbHRlcl9yZWdpc3RlciIsCiAgICAgICJzdHJlYW1fYnVja2V0X21ha2Vfd3JpdGVhYmxlIiwgInN0cmVhbV9idWNrZXRfcHJlcGVuZCIsCiAgICAgICJzdHJlYW1fYnVja2V0X2FwcGVuZCIsICJzdHJlYW1fYnVja2V0X25ldyIsICJvdXRwdXRfYWRkX3Jld3JpdGVfdmFyIiwKICAgICAgIm91dHB1dF9yZXNldF9yZXdyaXRlX3ZhcnMiLCAic3lzX2dldF90ZW1wX2RpciIsICJ0b2tlbl9nZXRfYWxsIiwgInRva2VuX25hbWUiLAogICAgICAicmVhZGd6ZmlsZSIsICJnenJld2luZCIsICJnemNsb3NlIiwgImd6ZW9mIiwgImd6Z2V0YyIsICJnemdldHMiLCAiZ3pnZXRzcyIsCiAgICAgICJnenJlYWQiLCAiZ3pvcGVuIiwgImd6cGFzc3RocnUiLCAiZ3pzZWVrIiwgImd6dGVsbCIsICJnendyaXRlIiwgImd6cHV0cyIsCiAgICAgICJnemZpbGUiLCAiZ3pjb21wcmVzcyIsICJnenVuY29tcHJlc3MiLCAiZ3pkZWZsYXRlIiwgImd6aW5mbGF0ZSIsICJnemVuY29kZSIsCiAgICAgICJvYl9nemhhbmRsZXIiLCAiemxpYl9nZXRfY29kaW5nX3R5cGUiLCAibGlieG1sX3NldF9zdHJlYW1zX2NvbnRleHQiLAogICAgICAibGlieG1sX3VzZV9pbnRlcm5hbF9lcnJvcnMiLCAibGlieG1sX2dldF9sYXN0X2Vycm9yIiwgImxpYnhtbF9jbGVhcl9lcnJvcnMiLAogICAgICAibGlieG1sX2dldF9lcnJvcnMiLCAiZG9tX2ltcG9ydF9zaW1wbGV4bWwiLCAic2ltcGxleG1sX2xvYWRfZmlsZSIsCiAgICAgICJzaW1wbGV4bWxfbG9hZF9zdHJpbmciLCAic2ltcGxleG1sX2ltcG9ydF9kb20iLCAid2RkeF9zZXJpYWxpemVfdmFsdWUiLAogICAgICAid2RkeF9zZXJpYWxpemVfdmFycyIsICJ3ZGR4X3BhY2tldF9zdGFydCIsICJ3ZGR4X3BhY2tldF9lbmQiLCAid2RkeF9hZGRfdmFycyIsCiAgICAgICJ3ZGR4X2Rlc2VyaWFsaXplIiwgInhtbF9wYXJzZXJfY3JlYXRlIiwgInhtbF9wYXJzZXJfY3JlYXRlX25zIiwKICAgICAgInhtbF9zZXRfb2JqZWN0IiwgInhtbF9zZXRfZWxlbWVudF9oYW5kbGVyIiwgInhtbF9zZXRfY2hhcmFjdGVyX2RhdGFfaGFuZGxlciIsCiAgICAgICJ4bWxfc2V0X3Byb2Nlc3NpbmdfaW5zdHJ1Y3Rpb25faGFuZGxlciIsICJ4bWxfc2V0X2RlZmF1bHRfaGFuZGxlciIsCiAgICAgICJ4bWxfc2V0X3VucGFyc2VkX2VudGl0eV9kZWNsX2hhbmRsZXIiLCAieG1sX3NldF9ub3RhdGlvbl9kZWNsX2hhbmRsZXIiLAogICAgICAieG1sX3NldF9leHRlcm5hbF9lbnRpdHlfcmVmX2hhbmRsZXIiLCAieG1sX3NldF9zdGFydF9uYW1lc3BhY2VfZGVjbF9oYW5kbGVyIiwKICAgICAgInhtbF9zZXRfZW5kX25hbWVzcGFjZV9kZWNsX2hhbmRsZXIiLCAieG1sX3BhcnNlIiwgInhtbF9wYXJzZV9pbnRvX3N0cnVjdCIsCiAgICAgICJ4bWxfZ2V0X2Vycm9yX2NvZGUiLCAieG1sX2Vycm9yX3N0cmluZyIsICJ4bWxfZ2V0X2N1cnJlbnRfbGluZV9udW1iZXIiLAogICAgICAieG1sX2dldF9jdXJyZW50X2NvbHVtbl9udW1iZXIiLCAieG1sX2dldF9jdXJyZW50X2J5dGVfaW5kZXgiLAogICAgICAieG1sX3BhcnNlcl9mcmVlIiwgInhtbF9wYXJzZXJfc2V0X29wdGlvbiIsICJ4bWxfcGFyc2VyX2dldF9vcHRpb24iLAogICAgICAidXRmOF9lbmNvZGUiLCAidXRmOF9kZWNvZGUiLCAieG1sd3JpdGVyX29wZW5fdXJpIiwgInhtbHdyaXRlcl9vcGVuX21lbW9yeSIsCiAgICAgICJ4bWx3cml0ZXJfc2V0X2luZGVudCIsICJ4bWx3cml0ZXJfc2V0X2luZGVudF9zdHJpbmciLAogICAgICAieG1sd3JpdGVyX3N0YXJ0X2NvbW1lbnQiLCAieG1sd3JpdGVyX2VuZF9jb21tZW50IiwKICAgICAgInhtbHdyaXRlcl9zdGFydF9hdHRyaWJ1dGUiLCAieG1sd3JpdGVyX2VuZF9hdHRyaWJ1dGUiLAogICAgICAieG1sd3JpdGVyX3dyaXRlX2F0dHJpYnV0ZSIsICJ4bWx3cml0ZXJfc3RhcnRfYXR0cmlidXRlX25zIiwKICAgICAgInhtbHdyaXRlcl93cml0ZV9hdHRyaWJ1dGVfbnMiLCAieG1sd3JpdGVyX3N0YXJ0X2VsZW1lbnQiLAogICAgICAieG1sd3JpdGVyX2VuZF9lbGVtZW50IiwgInhtbHdyaXRlcl9mdWxsX2VuZF9lbGVtZW50IiwKICAgICAgInhtbHdyaXRlcl9zdGFydF9lbGVtZW50X25zIiwgInhtbHdyaXRlcl93cml0ZV9lbGVtZW50IiwKICAgICAgInhtbHdyaXRlcl93cml0ZV9lbGVtZW50X25zIiwgInhtbHdyaXRlcl9zdGFydF9waSIsICJ4bWx3cml0ZXJfZW5kX3BpIiwKICAgICAgInhtbHdyaXRlcl93cml0ZV9waSIsICJ4bWx3cml0ZXJfc3RhcnRfY2RhdGEiLCAieG1sd3JpdGVyX2VuZF9jZGF0YSIsCiAgICAgICJ4bWx3cml0ZXJfd3JpdGVfY2RhdGEiLCAieG1sd3JpdGVyX3RleHQiLCAieG1sd3JpdGVyX3dyaXRlX3JhdyIsCiAgICAgICJ4bWx3cml0ZXJfc3RhcnRfZG9jdW1lbnQiLCAieG1sd3JpdGVyX2VuZF9kb2N1bWVudCIsCiAgICAgICJ4bWx3cml0ZXJfd3JpdGVfY29tbWVudCIsICJ4bWx3cml0ZXJfc3RhcnRfZHRkIiwgInhtbHdyaXRlcl9lbmRfZHRkIiwKICAgICAgInhtbHdyaXRlcl93cml0ZV9kdGQiLCAieG1sd3JpdGVyX3N0YXJ0X2R0ZF9lbGVtZW50IiwKICAgICAgInhtbHdyaXRlcl9lbmRfZHRkX2VsZW1lbnQiLCAieG1sd3JpdGVyX3dyaXRlX2R0ZF9lbGVtZW50IiwKICAgICAgInhtbHdyaXRlcl9zdGFydF9kdGRfYXR0bGlzdCIsICJ4bWx3cml0ZXJfZW5kX2R0ZF9hdHRsaXN0IiwKICAgICAgInhtbHdyaXRlcl93cml0ZV9kdGRfYXR0bGlzdCIsICJ4bWx3cml0ZXJfc3RhcnRfZHRkX2VudGl0eSIsCiAgICAgICJ4bWx3cml0ZXJfZW5kX2R0ZF9lbnRpdHkiLCAieG1sd3JpdGVyX3dyaXRlX2R0ZF9lbnRpdHkiLAogICAgICAieG1sd3JpdGVyX291dHB1dF9tZW1vcnkiLCAieG1sd3JpdGVyX2ZsdXNoIiwgImdkX2luZm8iLCAiaW1hZ2VhcmMiLAogICAgICAiaW1hZ2VlbGxpcHNlIiwgImltYWdlY2hhciIsICJpbWFnZWNoYXJ1cCIsICJpbWFnZWNvbG9yYXQiLAogICAgICAiaW1hZ2Vjb2xvcmFsbG9jYXRlIiwgImltYWdlcGFsZXR0ZWNvcHkiLCAiaW1hZ2VjcmVhdGVmcm9tc3RyaW5nIiwKICAgICAgImltYWdlY29sb3JjbG9zZXN0IiwgImltYWdlY29sb3JkZWFsbG9jYXRlIiwgImltYWdlY29sb3JyZXNvbHZlIiwKICAgICAgImltYWdlY29sb3JleGFjdCIsICJpbWFnZWNvbG9yc2V0IiwgImltYWdlY29sb3J0cmFuc3BhcmVudCIsCiAgICAgICJpbWFnZWNvbG9yc3RvdGFsIiwgImltYWdlY29sb3JzZm9yaW5kZXgiLCAiaW1hZ2Vjb3B5IiwgImltYWdlY29weW1lcmdlIiwKICAgICAgImltYWdlY29weW1lcmdlZ3JheSIsICJpbWFnZWNvcHlyZXNpemVkIiwgImltYWdlY3JlYXRlIiwKICAgICAgImltYWdlY3JlYXRldHJ1ZWNvbG9yIiwgImltYWdlaXN0cnVlY29sb3IiLCAiaW1hZ2V0cnVlY29sb3J0b3BhbGV0dGUiLAogICAgICAiaW1hZ2VzZXR0aGlja25lc3MiLCAiaW1hZ2VmaWxsZWRhcmMiLCAiaW1hZ2VmaWxsZWRlbGxpcHNlIiwKICAgICAgImltYWdlYWxwaGFibGVuZGluZyIsICJpbWFnZXNhdmVhbHBoYSIsICJpbWFnZWNvbG9yYWxsb2NhdGVhbHBoYSIsCiAgICAgICJpbWFnZWNvbG9ycmVzb2x2ZWFscGhhIiwgImltYWdlY29sb3JjbG9zZXN0YWxwaGEiLCAiaW1hZ2Vjb2xvcmV4YWN0YWxwaGEiLAogICAgICAiaW1hZ2Vjb3B5cmVzYW1wbGVkIiwgImltYWdlZ3JhYndpbmRvdyIsICJpbWFnZWdyYWJzY3JlZW4iLCAiaW1hZ2Vyb3RhdGUiLAogICAgICAiaW1hZ2VhbnRpYWxpYXMiLCAiaW1hZ2VzZXR0aWxlIiwgImltYWdlc2V0YnJ1c2giLCAiaW1hZ2VzZXRzdHlsZSIsCiAgICAgICJpbWFnZWNyZWF0ZWZyb21wbmciLCAiaW1hZ2VjcmVhdGVmcm9tZ2lmIiwgImltYWdlY3JlYXRlZnJvbWpwZWciLAogICAgICAiaW1hZ2VjcmVhdGVmcm9td2JtcCIsICJpbWFnZWNyZWF0ZWZyb214Ym0iLCAiaW1hZ2VjcmVhdGVmcm9tZ2QiLAogICAgICAiaW1hZ2VjcmVhdGVmcm9tZ2QyIiwgImltYWdlY3JlYXRlZnJvbWdkMnBhcnQiLCAiaW1hZ2VwbmciLCAiaW1hZ2VnaWYiLAogICAgICAiaW1hZ2VqcGVnIiwgImltYWdld2JtcCIsICJpbWFnZWdkIiwgImltYWdlZ2QyIiwgImltYWdlZGVzdHJveSIsCiAgICAgICJpbWFnZWdhbW1hY29ycmVjdCIsICJpbWFnZWZpbGwiLCAiaW1hZ2VmaWxsZWRwb2x5Z29uIiwgImltYWdlZmlsbGVkcmVjdGFuZ2xlIiwKICAgICAgImltYWdlZmlsbHRvYm9yZGVyIiwgImltYWdlZm9udHdpZHRoIiwgImltYWdlZm9udGhlaWdodCIsICJpbWFnZWludGVybGFjZSIsCiAgICAgICJpbWFnZWxpbmUiLCAiaW1hZ2Vsb2FkZm9udCIsICJpbWFnZXBvbHlnb24iLCAiaW1hZ2VyZWN0YW5nbGUiLAogICAgICAiaW1hZ2VzZXRwaXhlbCIsICJpbWFnZXN0cmluZyIsICJpbWFnZXN0cmluZ3VwIiwgImltYWdlc3giLCAiaW1hZ2VzeSIsCiAgICAgICJpbWFnZWRhc2hlZGxpbmUiLCAiaW1hZ2V0dGZiYm94IiwgImltYWdldHRmdGV4dCIsICJpbWFnZWZ0YmJveCIsCiAgICAgICJpbWFnZWZ0dGV4dCIsICJpbWFnZXBzbG9hZGZvbnQiLCAiaW1hZ2Vwc2ZyZWVmb250IiwgImltYWdlcHNlbmNvZGVmb250IiwKICAgICAgImltYWdlcHNleHRlbmRmb250IiwgImltYWdlcHNzbGFudGZvbnQiLCAiaW1hZ2Vwc3RleHQiLCAiaW1hZ2Vwc2Jib3giLAogICAgICAiaW1hZ2V0eXBlcyIsICJqcGVnMndibXAiLCAicG5nMndibXAiLCAiaW1hZ2Uyd2JtcCIsICJpbWFnZWxheWVyZWZmZWN0IiwKICAgICAgImltYWdlY29sb3JtYXRjaCIsICJpbWFnZXhibSIsICJpbWFnZWZpbHRlciIsICJpbWFnZWNvbnZvbHV0aW9uIiwKICAgICAgIm1iX2NvbnZlcnRfY2FzZSIsICJtYl9zdHJ0b3VwcGVyIiwgIm1iX3N0cnRvbG93ZXIiLCAibWJfbGFuZ3VhZ2UiLAogICAgICAibWJfaW50ZXJuYWxfZW5jb2RpbmciLCAibWJfaHR0cF9pbnB1dCIsICJtYl9odHRwX291dHB1dCIsICJtYl9kZXRlY3Rfb3JkZXIiLAogICAgICAibWJfc3Vic3RpdHV0ZV9jaGFyYWN0ZXIiLCAibWJfcGFyc2Vfc3RyIiwgIm1iX291dHB1dF9oYW5kbGVyIiwKICAgICAgIm1iX3ByZWZlcnJlZF9taW1lX25hbWUiLCAibWJfc3RybGVuIiwgIm1iX3N0cnBvcyIsICJtYl9zdHJycG9zIiwgIm1iX3N0cmlwb3MiLAogICAgICAibWJfc3Rycmlwb3MiLCAibWJfc3Ryc3RyIiwgIm1iX3N0cnJjaHIiLCAibWJfc3RyaXN0ciIsICJtYl9zdHJyaWNociIsCiAgICAgICJtYl9zdWJzdHJfY291bnQiLCAibWJfc3Vic3RyIiwgIm1iX3N0cmN1dCIsICJtYl9zdHJ3aWR0aCIsICJtYl9zdHJpbXdpZHRoIiwKICAgICAgIm1iX2NvbnZlcnRfZW5jb2RpbmciLCAibWJfZGV0ZWN0X2VuY29kaW5nIiwgIm1iX2xpc3RfZW5jb2RpbmdzIiwKICAgICAgIm1iX2NvbnZlcnRfa2FuYSIsICJtYl9lbmNvZGVfbWltZWhlYWRlciIsICJtYl9kZWNvZGVfbWltZWhlYWRlciIsCiAgICAgICJtYl9jb252ZXJ0X3ZhcmlhYmxlcyIsICJtYl9lbmNvZGVfbnVtZXJpY2VudGl0eSIsICJtYl9kZWNvZGVfbnVtZXJpY2VudGl0eSIsCiAgICAgICJtYl9zZW5kX21haWwiLCAibWJfZ2V0X2luZm8iLCAibWJfY2hlY2tfZW5jb2RpbmciLCAibWJfcmVnZXhfZW5jb2RpbmciLAogICAgICAibWJfcmVnZXhfc2V0X29wdGlvbnMiLCAibWJfZXJlZyIsICJtYl9lcmVnaSIsICJtYl9lcmVnX3JlcGxhY2UiLAogICAgICAibWJfZXJlZ2lfcmVwbGFjZSIsICJtYl9zcGxpdCIsICJtYl9lcmVnX21hdGNoIiwgIm1iX2VyZWdfc2VhcmNoIiwKICAgICAgIm1iX2VyZWdfc2VhcmNoX3BvcyIsICJtYl9lcmVnX3NlYXJjaF9yZWdzIiwgIm1iX2VyZWdfc2VhcmNoX2luaXQiLAogICAgICAibWJfZXJlZ19zZWFyY2hfZ2V0cmVncyIsICJtYl9lcmVnX3NlYXJjaF9nZXRwb3MiLCAibWJfZXJlZ19zZWFyY2hfc2V0cG9zIiwKICAgICAgIm1icmVnZXhfZW5jb2RpbmciLCAibWJlcmVnIiwgIm1iZXJlZ2kiLCAibWJlcmVnX3JlcGxhY2UiLCAibWJlcmVnaV9yZXBsYWNlIiwKICAgICAgIm1ic3BsaXQiLCAibWJlcmVnX21hdGNoIiwgIm1iZXJlZ19zZWFyY2giLCAibWJlcmVnX3NlYXJjaF9wb3MiLAogICAgICAibWJlcmVnX3NlYXJjaF9yZWdzIiwgIm1iZXJlZ19zZWFyY2hfaW5pdCIsICJtYmVyZWdfc2VhcmNoX2dldHJlZ3MiLAogICAgICAibWJlcmVnX3NlYXJjaF9nZXRwb3MiLCAibWJlcmVnX3NlYXJjaF9zZXRwb3MiLCAibXlzcWxfY29ubmVjdCIsCiAgICAgICJteXNxbF9wY29ubmVjdCIsICJteXNxbF9jbG9zZSIsICJteXNxbF9zZWxlY3RfZGIiLCAibXlzcWxfcXVlcnkiLAogICAgICAibXlzcWxfdW5idWZmZXJlZF9xdWVyeSIsICJteXNxbF9kYl9xdWVyeSIsICJteXNxbF9saXN0X2RicyIsCiAgICAgICJteXNxbF9saXN0X3RhYmxlcyIsICJteXNxbF9saXN0X2ZpZWxkcyIsICJteXNxbF9saXN0X3Byb2Nlc3NlcyIsCiAgICAgICJteXNxbF9lcnJvciIsICJteXNxbF9lcnJubyIsICJteXNxbF9hZmZlY3RlZF9yb3dzIiwgIm15c3FsX2luc2VydF9pZCIsCiAgICAgICJteXNxbF9yZXN1bHQiLCAibXlzcWxfbnVtX3Jvd3MiLCAibXlzcWxfbnVtX2ZpZWxkcyIsICJteXNxbF9mZXRjaF9yb3ciLAogICAgICAibXlzcWxfZmV0Y2hfYXJyYXkiLCAibXlzcWxfZmV0Y2hfYXNzb2MiLCAibXlzcWxfZmV0Y2hfb2JqZWN0IiwKICAgICAgIm15c3FsX2RhdGFfc2VlayIsICJteXNxbF9mZXRjaF9sZW5ndGhzIiwgIm15c3FsX2ZldGNoX2ZpZWxkIiwKICAgICAgIm15c3FsX2ZpZWxkX3NlZWsiLCAibXlzcWxfZnJlZV9yZXN1bHQiLCAibXlzcWxfZmllbGRfbmFtZSIsCiAgICAgICJteXNxbF9maWVsZF90YWJsZSIsICJteXNxbF9maWVsZF9sZW4iLCAibXlzcWxfZmllbGRfdHlwZSIsCiAgICAgICJteXNxbF9maWVsZF9mbGFncyIsICJteXNxbF9lc2NhcGVfc3RyaW5nIiwgIm15c3FsX3JlYWxfZXNjYXBlX3N0cmluZyIsCiAgICAgICJteXNxbF9zdGF0IiwgIm15c3FsX3RocmVhZF9pZCIsICJteXNxbF9jbGllbnRfZW5jb2RpbmciLCAibXlzcWxfcGluZyIsCiAgICAgICJteXNxbF9nZXRfY2xpZW50X2luZm8iLCAibXlzcWxfZ2V0X2hvc3RfaW5mbyIsICJteXNxbF9nZXRfcHJvdG9faW5mbyIsCiAgICAgICJteXNxbF9nZXRfc2VydmVyX2luZm8iLCAibXlzcWxfaW5mbyIsICJteXNxbF9zZXRfY2hhcnNldCIsICJteXNxbCIsCiAgICAgICJteXNxbF9maWVsZG5hbWUiLCAibXlzcWxfZmllbGR0YWJsZSIsICJteXNxbF9maWVsZGxlbiIsICJteXNxbF9maWVsZHR5cGUiLAogICAgICAibXlzcWxfZmllbGRmbGFncyIsICJteXNxbF9zZWxlY3RkYiIsICJteXNxbF9mcmVlcmVzdWx0IiwgIm15c3FsX251bWZpZWxkcyIsCiAgICAgICJteXNxbF9udW1yb3dzIiwgIm15c3FsX2xpc3RkYnMiLCAibXlzcWxfbGlzdHRhYmxlcyIsICJteXNxbF9saXN0ZmllbGRzIiwKICAgICAgIm15c3FsX2RiX25hbWUiLCAibXlzcWxfZGJuYW1lIiwgIm15c3FsX3RhYmxlbmFtZSIsICJteXNxbF90YWJsZV9uYW1lIiwKICAgICAgIm15c3FsaV9hZmZlY3RlZF9yb3dzIiwgIm15c3FsaV9hdXRvY29tbWl0IiwgIm15c3FsaV9jaGFuZ2VfdXNlciIsCiAgICAgICJteXNxbGlfY2hhcmFjdGVyX3NldF9uYW1lIiwgIm15c3FsaV9jbG9zZSIsICJteXNxbGlfY29tbWl0IiwgIm15c3FsaV9jb25uZWN0IiwKICAgICAgIm15c3FsaV9jb25uZWN0X2Vycm5vIiwgIm15c3FsaV9jb25uZWN0X2Vycm9yIiwgIm15c3FsaV9kYXRhX3NlZWsiLAogICAgICAibXlzcWxpX2RlYnVnIiwgIm15c3FsaV9kaXNhYmxlX3JlYWRzX2Zyb21fbWFzdGVyIiwgIm15c3FsaV9kaXNhYmxlX3JwbF9wYXJzZSIsCiAgICAgICJteXNxbGlfZHVtcF9kZWJ1Z19pbmZvIiwgIm15c3FsaV9lbmFibGVfcmVhZHNfZnJvbV9tYXN0ZXIiLAogICAgICAibXlzcWxpX2VuYWJsZV9ycGxfcGFyc2UiLCAibXlzcWxpX2VtYmVkZGVkX3NlcnZlcl9lbmQiLAogICAgICAibXlzcWxpX2VtYmVkZGVkX3NlcnZlcl9zdGFydCIsICJteXNxbGlfZXJybm8iLCAibXlzcWxpX2Vycm9yIiwKICAgICAgIm15c3FsaV9zdG10X2V4ZWN1dGUiLCAibXlzcWxpX2V4ZWN1dGUiLCAibXlzcWxpX2ZldGNoX2ZpZWxkIiwKICAgICAgIm15c3FsaV9mZXRjaF9maWVsZHMiLCAibXlzcWxpX2ZldGNoX2ZpZWxkX2RpcmVjdCIsICJteXNxbGlfZmV0Y2hfbGVuZ3RocyIsCiAgICAgICJteXNxbGlfZmV0Y2hfYXJyYXkiLCAibXlzcWxpX2ZldGNoX2Fzc29jIiwgIm15c3FsaV9mZXRjaF9vYmplY3QiLAogICAgICAibXlzcWxpX2ZldGNoX3JvdyIsICJteXNxbGlfZmllbGRfY291bnQiLCAibXlzcWxpX2ZpZWxkX3NlZWsiLAogICAgICAibXlzcWxpX2ZpZWxkX3RlbGwiLCAibXlzcWxpX2ZyZWVfcmVzdWx0IiwgIm15c3FsaV9nZXRfY2hhcnNldCIsCiAgICAgICJteXNxbGlfZ2V0X2NsaWVudF9pbmZvIiwgIm15c3FsaV9nZXRfY2xpZW50X3ZlcnNpb24iLCAibXlzcWxpX2dldF9ob3N0X2luZm8iLAogICAgICAibXlzcWxpX2dldF9wcm90b19pbmZvIiwgIm15c3FsaV9nZXRfc2VydmVyX2luZm8iLCAibXlzcWxpX2dldF9zZXJ2ZXJfdmVyc2lvbiIsCiAgICAgICJteXNxbGlfZ2V0X3dhcm5pbmdzIiwgIm15c3FsaV9pbml0IiwgIm15c3FsaV9pbmZvIiwgIm15c3FsaV9pbnNlcnRfaWQiLAogICAgICAibXlzcWxpX2tpbGwiLCAibXlzcWxpX3NldF9sb2NhbF9pbmZpbGVfZGVmYXVsdCIsCiAgICAgICJteXNxbGlfc2V0X2xvY2FsX2luZmlsZV9oYW5kbGVyIiwgIm15c3FsaV9tYXN0ZXJfcXVlcnkiLAogICAgICAibXlzcWxpX21vcmVfcmVzdWx0cyIsICJteXNxbGlfbXVsdGlfcXVlcnkiLCAibXlzcWxpX25leHRfcmVzdWx0IiwKICAgICAgIm15c3FsaV9udW1fZmllbGRzIiwgIm15c3FsaV9udW1fcm93cyIsICJteXNxbGlfb3B0aW9ucyIsICJteXNxbGlfcGluZyIsCiAgICAgICJteXNxbGlfcHJlcGFyZSIsICJteXNxbGlfcmVwb3J0IiwgIm15c3FsaV9xdWVyeSIsICJteXNxbGlfcmVhbF9jb25uZWN0IiwKICAgICAgIm15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmciLCAibXlzcWxpX3JlYWxfcXVlcnkiLCAibXlzcWxpX3JvbGxiYWNrIiwKICAgICAgIm15c3FsaV9ycGxfcGFyc2VfZW5hYmxlZCIsICJteXNxbGlfcnBsX3Byb2JlIiwgIm15c3FsaV9ycGxfcXVlcnlfdHlwZSIsCiAgICAgICJteXNxbGlfc2VsZWN0X2RiIiwgIm15c3FsaV9zZXRfY2hhcnNldCIsICJteXNxbGlfc3RtdF9hdHRyX2dldCIsCiAgICAgICJteXNxbGlfc3RtdF9hdHRyX3NldCIsICJteXNxbGlfc3RtdF9maWVsZF9jb3VudCIsICJteXNxbGlfc3RtdF9pbml0IiwKICAgICAgIm15c3FsaV9zdG10X3ByZXBhcmUiLCAibXlzcWxpX3N0bXRfcmVzdWx0X21ldGFkYXRhIiwKICAgICAgIm15c3FsaV9zdG10X3NlbmRfbG9uZ19kYXRhIiwgIm15c3FsaV9zdG10X2JpbmRfcGFyYW0iLAogICAgICAibXlzcWxpX3N0bXRfYmluZF9yZXN1bHQiLCAibXlzcWxpX3N0bXRfZmV0Y2giLCAibXlzcWxpX3N0bXRfZnJlZV9yZXN1bHQiLAogICAgICAibXlzcWxpX3N0bXRfZ2V0X3dhcm5pbmdzIiwgIm15c3FsaV9zdG10X2luc2VydF9pZCIsICJteXNxbGlfc3RtdF9yZXNldCIsCiAgICAgICJteXNxbGlfc3RtdF9wYXJhbV9jb3VudCIsICJteXNxbGlfc2VuZF9xdWVyeSIsICJteXNxbGlfc2xhdmVfcXVlcnkiLAogICAgICAibXlzcWxpX3NxbHN0YXRlIiwgIm15c3FsaV9zc2xfc2V0IiwgIm15c3FsaV9zdGF0IiwKICAgICAgIm15c3FsaV9zdG10X2FmZmVjdGVkX3Jvd3MiLCAibXlzcWxpX3N0bXRfY2xvc2UiLCAibXlzcWxpX3N0bXRfZGF0YV9zZWVrIiwKICAgICAgIm15c3FsaV9zdG10X2Vycm5vIiwgIm15c3FsaV9zdG10X2Vycm9yIiwgIm15c3FsaV9zdG10X251bV9yb3dzIiwKICAgICAgIm15c3FsaV9zdG10X3NxbHN0YXRlIiwgIm15c3FsaV9zdG9yZV9yZXN1bHQiLCAibXlzcWxpX3N0bXRfc3RvcmVfcmVzdWx0IiwKICAgICAgIm15c3FsaV90aHJlYWRfaWQiLCAibXlzcWxpX3RocmVhZF9zYWZlIiwgIm15c3FsaV91c2VfcmVzdWx0IiwKICAgICAgIm15c3FsaV93YXJuaW5nX2NvdW50IiwgIm15c3FsaV9iaW5kX3BhcmFtIiwgIm15c3FsaV9iaW5kX3Jlc3VsdCIsCiAgICAgICJteXNxbGlfY2xpZW50X2VuY29kaW5nIiwgIm15c3FsaV9lc2NhcGVfc3RyaW5nIiwgIm15c3FsaV9mZXRjaCIsCiAgICAgICJteXNxbGlfcGFyYW1fY291bnQiLCAibXlzcWxpX2dldF9tZXRhZGF0YSIsICJteXNxbGlfc2VuZF9sb25nX2RhdGEiLAogICAgICAibXlzcWxpX3NldF9vcHQiLCAicGRvX2RyaXZlcnMiLCAic29ja2V0X3NlbGVjdCIsICJzb2NrZXRfY3JlYXRlIiwKICAgICAgInNvY2tldF9jcmVhdGVfbGlzdGVuIiwgInNvY2tldF9hY2NlcHQiLCAic29ja2V0X3NldF9ub25ibG9jayIsCiAgICAgICJzb2NrZXRfc2V0X2Jsb2NrIiwgInNvY2tldF9saXN0ZW4iLCAic29ja2V0X2Nsb3NlIiwgInNvY2tldF93cml0ZSIsCiAgICAgICJzb2NrZXRfcmVhZCIsICJzb2NrZXRfZ2V0c29ja25hbWUiLCAic29ja2V0X2dldHBlZXJuYW1lIiwgInNvY2tldF9jb25uZWN0IiwKICAgICAgInNvY2tldF9zdHJlcnJvciIsICJzb2NrZXRfYmluZCIsICJzb2NrZXRfcmVjdiIsICJzb2NrZXRfc2VuZCIsCiAgICAgICJzb2NrZXRfcmVjdmZyb20iLCAic29ja2V0X3NlbmR0byIsICJzb2NrZXRfZ2V0X29wdGlvbiIsICJzb2NrZXRfc2V0X29wdGlvbiIsCiAgICAgICJzb2NrZXRfc2h1dGRvd24iLCAic29ja2V0X2xhc3RfZXJyb3IiLCAic29ja2V0X2NsZWFyX2Vycm9yIiwgInNvY2tldF9nZXRvcHQiLAogICAgICAic29ja2V0X3NldG9wdCIsICJlYWNjZWxlcmF0b3JfcHV0IiwgImVhY2NlbGVyYXRvcl9nZXQiLCAiZWFjY2VsZXJhdG9yX3JtIiwKICAgICAgImVhY2NlbGVyYXRvcl9nYyIsICJlYWNjZWxlcmF0b3JfbG9jayIsICJlYWNjZWxlcmF0b3JfdW5sb2NrIiwKICAgICAgImVhY2NlbGVyYXRvcl9jYWNoaW5nIiwgImVhY2NlbGVyYXRvcl9vcHRpbWl6ZXIiLCAiZWFjY2VsZXJhdG9yX2NsZWFyIiwKICAgICAgImVhY2NlbGVyYXRvcl9jbGVhbiIsICJlYWNjZWxlcmF0b3JfaW5mbyIsICJlYWNjZWxlcmF0b3JfcHVyZ2UiLAogICAgICAiZWFjY2VsZXJhdG9yX2NhY2hlZF9zY3JpcHRzIiwgImVhY2NlbGVyYXRvcl9yZW1vdmVkX3NjcmlwdHMiLAogICAgICAiZWFjY2VsZXJhdG9yX2xpc3Rfa2V5cyIsICJlYWNjZWxlcmF0b3JfZW5jb2RlIiwgImVhY2NlbGVyYXRvcl9sb2FkIiwKICAgICAgIl9lYWNjZWxlcmF0b3JfbG9hZGVyX2ZpbGUiLCAiX2VhY2NlbGVyYXRvcl9sb2FkZXJfbGluZSIsCiAgICAgICJlYWNjZWxlcmF0b3Jfc2V0X3Nlc3Npb25faGFuZGxlcnMiLCAiX2VhY2NlbGVyYXRvcl9vdXRwdXRfaGFuZGxlciIsCiAgICAgICJlYWNjZWxlcmF0b3JfY2FjaGVfcGFnZSIsICJlYWNjZWxlcmF0b3Jfcm1fcGFnZSIsICJlYWNjZWxlcmF0b3JfY2FjaGVfb3V0cHV0IiwKICAgICAgImVhY2NlbGVyYXRvcl9jYWNoZV9yZXN1bHQiLCAieGRlYnVnX2dldF9zdGFja19kZXB0aCIsCiAgICAgICJ4ZGVidWdfZ2V0X2Z1bmN0aW9uX3N0YWNrIiwgInhkZWJ1Z19wcmludF9mdW5jdGlvbl9zdGFjayIsCiAgICAgICJ4ZGVidWdfZ2V0X2RlY2xhcmVkX3ZhcnMiLCAieGRlYnVnX2NhbGxfY2xhc3MiLCAieGRlYnVnX2NhbGxfZnVuY3Rpb24iLAogICAgICAieGRlYnVnX2NhbGxfZmlsZSIsICJ4ZGVidWdfY2FsbF9saW5lIiwgInhkZWJ1Z192YXJfZHVtcCIsICJ4ZGVidWdfZGVidWdfenZhbCIsCiAgICAgICJ4ZGVidWdfZGVidWdfenZhbF9zdGRvdXQiLCAieGRlYnVnX2VuYWJsZSIsICJ4ZGVidWdfZGlzYWJsZSIsCiAgICAgICJ4ZGVidWdfaXNfZW5hYmxlZCIsICJ4ZGVidWdfYnJlYWsiLCAieGRlYnVnX3N0YXJ0X3RyYWNlIiwgInhkZWJ1Z19zdG9wX3RyYWNlIiwKICAgICAgInhkZWJ1Z19nZXRfdHJhY2VmaWxlX25hbWUiLCAieGRlYnVnX2dldF9wcm9maWxlcl9maWxlbmFtZSIsCiAgICAgICJ4ZGVidWdfZHVtcF9hZ2dyX3Byb2ZpbGluZ19kYXRhIiwgInhkZWJ1Z19jbGVhcl9hZ2dyX3Byb2ZpbGluZ19kYXRhIiwKICAgICAgInhkZWJ1Z19tZW1vcnlfdXNhZ2UiLCAieGRlYnVnX3BlYWtfbWVtb3J5X3VzYWdlIiwgInhkZWJ1Z190aW1lX2luZGV4IiwKICAgICAgInhkZWJ1Z19zdGFydF9lcnJvcl9jb2xsZWN0aW9uIiwgInhkZWJ1Z19zdG9wX2Vycm9yX2NvbGxlY3Rpb24iLAogICAgICAieGRlYnVnX2dldF9jb2xsZWN0ZWRfZXJyb3JzIiwgInhkZWJ1Z19zdGFydF9jb2RlX2NvdmVyYWdlIiwKICAgICAgInhkZWJ1Z19zdG9wX2NvZGVfY292ZXJhZ2UiLCAieGRlYnVnX2dldF9jb2RlX2NvdmVyYWdlIiwKICAgICAgInhkZWJ1Z19nZXRfZnVuY3Rpb25fY291bnQiLCAieGRlYnVnX2R1bXBfc3VwZXJnbG9iYWxzIiwKICAgICAgIl8iIC8vIGFsaWFzIGZvciBnZXR0ZXh0KCkKICAgIF0uZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCwgYXJyYXkpIHsKICAgICAgcmVzdWx0W2VsZW1lbnRdID0gdG9rZW4oInRfc3RyaW5nIiwgInBocC1wcmVkZWZpbmVkLWZ1bmN0aW9uIik7CiAgICB9KTsKCiAgICAvLyBvdXRwdXQgb2YgZ2V0X2RlZmluZWRfY29uc3RhbnRzKCkuIERpZmZlcnMgc2lnbmlmaWNhbnRseSBmcm9tIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9yZXNlcnZlZC5jb25zdGFudHMucGhwCiAgICBbICJFX0VSUk9SIiwgIkVfUkVDT1ZFUkFCTEVfRVJST1IiLCAiRV9XQVJOSU5HIiwgIkVfUEFSU0UiLCAiRV9OT1RJQ0UiLAogICAgICAiRV9TVFJJQ1QiLCAiRV9DT1JFX0VSUk9SIiwgIkVfQ09SRV9XQVJOSU5HIiwgIkVfQ09NUElMRV9FUlJPUiIsCiAgICAgICJFX0NPTVBJTEVfV0FSTklORyIsICJFX1VTRVJfRVJST1IiLCAiRV9VU0VSX1dBUk5JTkciLCAiRV9VU0VSX05PVElDRSIsCiAgICAgICJFX0FMTCIsICJUUlVFIiwgIkZBTFNFIiwgIk5VTEwiLCAiWkVORF9USFJFQURfU0FGRSIsICJQSFBfVkVSU0lPTiIsICJQSFBfT1MiLAogICAgICAiUEhQX1NBUEkiLCAiREVGQVVMVF9JTkNMVURFX1BBVEgiLCAiUEVBUl9JTlNUQUxMX0RJUiIsICJQRUFSX0VYVEVOU0lPTl9ESVIiLAogICAgICAiUEhQX0VYVEVOU0lPTl9ESVIiLCAiUEhQX1BSRUZJWCIsICJQSFBfQklORElSIiwgIlBIUF9MSUJESVIiLCAiUEhQX0RBVEFESVIiLAogICAgICAiUEhQX1NZU0NPTkZESVIiLCAiUEhQX0xPQ0FMU1RBVEVESVIiLCAiUEhQX0NPTkZJR19GSUxFX1BBVEgiLAogICAgICAiUEhQX0NPTkZJR19GSUxFX1NDQU5fRElSIiwgIlBIUF9TSExJQl9TVUZGSVgiLCAiUEhQX0VPTCIsICJQSFBfRU9MIiwKICAgICAgIlBIUF9JTlRfTUFYIiwgIlBIUF9JTlRfU0laRSIsICJQSFBfT1VUUFVUX0hBTkRMRVJfU1RBUlQiLAogICAgICAiUEhQX09VVFBVVF9IQU5ETEVSX0NPTlQiLCAiUEhQX09VVFBVVF9IQU5ETEVSX0VORCIsICJVUExPQURfRVJSX09LIiwKICAgICAgIlVQTE9BRF9FUlJfSU5JX1NJWkUiLCAiVVBMT0FEX0VSUl9GT1JNX1NJWkUiLCAiVVBMT0FEX0VSUl9QQVJUSUFMIiwKICAgICAgIlVQTE9BRF9FUlJfTk9fRklMRSIsICJVUExPQURfRVJSX05PX1RNUF9ESVIiLCAiVVBMT0FEX0VSUl9DQU5UX1dSSVRFIiwKICAgICAgIlVQTE9BRF9FUlJfRVhURU5TSU9OIiwgIkNBTF9HUkVHT1JJQU4iLCAiQ0FMX0pVTElBTiIsICJDQUxfSkVXSVNIIiwKICAgICAgIkNBTF9GUkVOQ0giLCAiQ0FMX05VTV9DQUxTIiwgIkNBTF9ET1dfREFZTk8iLCAiQ0FMX0RPV19TSE9SVCIsICJDQUxfRE9XX0xPTkciLAogICAgICAiQ0FMX01PTlRIX0dSRUdPUklBTl9TSE9SVCIsICJDQUxfTU9OVEhfR1JFR09SSUFOX0xPTkciLAogICAgICAiQ0FMX01PTlRIX0pVTElBTl9TSE9SVCIsICJDQUxfTU9OVEhfSlVMSUFOX0xPTkciLCAiQ0FMX01PTlRIX0pFV0lTSCIsCiAgICAgICJDQUxfTU9OVEhfRlJFTkNIIiwgIkNBTF9FQVNURVJfREVGQVVMVCIsICJDQUxfRUFTVEVSX1JPTUFOIiwKICAgICAgIkNBTF9FQVNURVJfQUxXQVlTX0dSRUdPUklBTiIsICJDQUxfRUFTVEVSX0FMV0FZU19KVUxJQU4iLAogICAgICAiQ0FMX0pFV0lTSF9BRERfQUxBRklNX0dFUkVTSCIsICJDQUxfSkVXSVNIX0FERF9BTEFGSU0iLAogICAgICAiQ0FMX0pFV0lTSF9BRERfR0VSRVNIQVlJTSIsICJDTFNDVFhfSU5QUk9DX1NFUlZFUiIsICJDTFNDVFhfSU5QUk9DX0hBTkRMRVIiLAogICAgICAiQ0xTQ1RYX0xPQ0FMX1NFUlZFUiIsICJDTFNDVFhfUkVNT1RFX1NFUlZFUiIsICJDTFNDVFhfU0VSVkVSIiwgIkNMU0NUWF9BTEwiLAogICAgICAiVlRfTlVMTCIsICJWVF9FTVBUWSIsICJWVF9VSTEiLCAiVlRfSTEiLCAiVlRfVUkyIiwgIlZUX0kyIiwgIlZUX1VJNCIsICJWVF9JNCIsCiAgICAgICJWVF9SNCIsICJWVF9SOCIsICJWVF9CT09MIiwgIlZUX0VSUk9SIiwgIlZUX0NZIiwgIlZUX0RBVEUiLCAiVlRfQlNUUiIsCiAgICAgICJWVF9ERUNJTUFMIiwgIlZUX1VOS05PV04iLCAiVlRfRElTUEFUQ0giLCAiVlRfVkFSSUFOVCIsICJWVF9JTlQiLCAiVlRfVUlOVCIsCiAgICAgICJWVF9BUlJBWSIsICJWVF9CWVJFRiIsICJDUF9BQ1AiLCAiQ1BfTUFDQ1AiLCAiQ1BfT0VNQ1AiLCAiQ1BfVVRGNyIsICJDUF9VVEY4IiwKICAgICAgIkNQX1NZTUJPTCIsICJDUF9USFJFQURfQUNQIiwgIlZBUkNNUF9MVCIsICJWQVJDTVBfRVEiLCAiVkFSQ01QX0dUIiwKICAgICAgIlZBUkNNUF9OVUxMIiwgIk5PUk1fSUdOT1JFQ0FTRSIsICJOT1JNX0lHTk9SRU5PTlNQQUNFIiwgIk5PUk1fSUdOT1JFU1lNQk9MUyIsCiAgICAgICJOT1JNX0lHTk9SRVdJRFRIIiwgIk5PUk1fSUdOT1JFS0FOQVRZUEUiLCAiRElTUF9FX0RJVkJZWkVSTyIsCiAgICAgICJESVNQX0VfT1ZFUkZMT1ciLCAiRElTUF9FX0JBRElOREVYIiwgIk1LX0VfVU5BVkFJTEFCTEUiLCAiSU5QVVRfUE9TVCIsCiAgICAgICJJTlBVVF9HRVQiLCAiSU5QVVRfQ09PS0lFIiwgIklOUFVUX0VOViIsICJJTlBVVF9TRVJWRVIiLCAiSU5QVVRfU0VTU0lPTiIsCiAgICAgICJJTlBVVF9SRVFVRVNUIiwgIkZJTFRFUl9GTEFHX05PTkUiLCAiRklMVEVSX1JFUVVJUkVfU0NBTEFSIiwKICAgICAgIkZJTFRFUl9SRVFVSVJFX0FSUkFZIiwgIkZJTFRFUl9GT1JDRV9BUlJBWSIsICJGSUxURVJfTlVMTF9PTl9GQUlMVVJFIiwKICAgICAgIkZJTFRFUl9WQUxJREFURV9JTlQiLCAiRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4iLCAiRklMVEVSX1ZBTElEQVRFX0ZMT0FUIiwKICAgICAgIkZJTFRFUl9WQUxJREFURV9SRUdFWFAiLCAiRklMVEVSX1ZBTElEQVRFX1VSTCIsICJGSUxURVJfVkFMSURBVEVfRU1BSUwiLAogICAgICAiRklMVEVSX1ZBTElEQVRFX0lQIiwgIkZJTFRFUl9ERUZBVUxUIiwgIkZJTFRFUl9VTlNBRkVfUkFXIiwKICAgICAgIkZJTFRFUl9TQU5JVElaRV9TVFJJTkciLCAiRklMVEVSX1NBTklUSVpFX1NUUklQUEVEIiwKICAgICAgIkZJTFRFUl9TQU5JVElaRV9FTkNPREVEIiwgIkZJTFRFUl9TQU5JVElaRV9TUEVDSUFMX0NIQVJTIiwKICAgICAgIkZJTFRFUl9TQU5JVElaRV9FTUFJTCIsICJGSUxURVJfU0FOSVRJWkVfVVJMIiwgIkZJTFRFUl9TQU5JVElaRV9OVU1CRVJfSU5UIiwKICAgICAgIkZJTFRFUl9TQU5JVElaRV9OVU1CRVJfRkxPQVQiLCAiRklMVEVSX1NBTklUSVpFX01BR0lDX1FVT1RFUyIsCiAgICAgICJGSUxURVJfQ0FMTEJBQ0siLCAiRklMVEVSX0ZMQUdfQUxMT1dfT0NUQUwiLCAiRklMVEVSX0ZMQUdfQUxMT1dfSEVYIiwKICAgICAgIkZJTFRFUl9GTEFHX1NUUklQX0xPVyIsICJGSUxURVJfRkxBR19TVFJJUF9ISUdIIiwgIkZJTFRFUl9GTEFHX0VOQ09ERV9MT1ciLAogICAgICAiRklMVEVSX0ZMQUdfRU5DT0RFX0hJR0giLCAiRklMVEVSX0ZMQUdfRU5DT0RFX0FNUCIsCiAgICAgICJGSUxURVJfRkxBR19OT19FTkNPREVfUVVPVEVTIiwgIkZJTFRFUl9GTEFHX0VNUFRZX1NUUklOR19OVUxMIiwKICAgICAgIkZJTFRFUl9GTEFHX0FMTE9XX0ZSQUNUSU9OIiwgIkZJTFRFUl9GTEFHX0FMTE9XX1RIT1VTQU5EIiwKICAgICAgIkZJTFRFUl9GTEFHX0FMTE9XX1NDSUVOVElGSUMiLCAiRklMVEVSX0ZMQUdfU0NIRU1FX1JFUVVJUkVEIiwKICAgICAgIkZJTFRFUl9GTEFHX0hPU1RfUkVRVUlSRUQiLCAiRklMVEVSX0ZMQUdfUEFUSF9SRVFVSVJFRCIsCiAgICAgICJGSUxURVJfRkxBR19RVUVSWV9SRVFVSVJFRCIsICJGSUxURVJfRkxBR19JUFY0IiwgIkZJTFRFUl9GTEFHX0lQVjYiLAogICAgICAiRklMVEVSX0ZMQUdfTk9fUkVTX1JBTkdFIiwgIkZJTFRFUl9GTEFHX05PX1BSSVZfUkFOR0UiLCAiRlRQX0FTQ0lJIiwKICAgICAgIkZUUF9URVhUIiwgIkZUUF9CSU5BUlkiLCAiRlRQX0lNQUdFIiwgIkZUUF9BVVRPUkVTVU1FIiwgIkZUUF9USU1FT1VUX1NFQyIsCiAgICAgICJGVFBfQVVUT1NFRUsiLCAiRlRQX0ZBSUxFRCIsICJGVFBfRklOSVNIRUQiLCAiRlRQX01PUkVEQVRBIiwgIkhBU0hfSE1BQyIsCiAgICAgICJJQ09OVl9JTVBMIiwgIklDT05WX1ZFUlNJT04iLCAiSUNPTlZfTUlNRV9ERUNPREVfU1RSSUNUIiwKICAgICAgIklDT05WX01JTUVfREVDT0RFX0NPTlRJTlVFX09OX0VSUk9SIiwgIk9EQkNfVFlQRSIsICJPREJDX0JJTk1PREVfUEFTU1RIUlUiLAogICAgICAiT0RCQ19CSU5NT0RFX1JFVFVSTiIsICJPREJDX0JJTk1PREVfQ09OVkVSVCIsICJTUUxfT0RCQ19DVVJTT1JTIiwKICAgICAgIlNRTF9DVVJfVVNFX0RSSVZFUiIsICJTUUxfQ1VSX1VTRV9JRl9ORUVERUQiLCAiU1FMX0NVUl9VU0VfT0RCQyIsCiAgICAgICJTUUxfQ09OQ1VSUkVOQ1kiLCAiU1FMX0NPTkNVUl9SRUFEX09OTFkiLCAiU1FMX0NPTkNVUl9MT0NLIiwKICAgICAgIlNRTF9DT05DVVJfUk9XVkVSIiwgIlNRTF9DT05DVVJfVkFMVUVTIiwgIlNRTF9DVVJTT1JfVFlQRSIsCiAgICAgICJTUUxfQ1VSU09SX0ZPUldBUkRfT05MWSIsICJTUUxfQ1VSU09SX0tFWVNFVF9EUklWRU4iLCAiU1FMX0NVUlNPUl9EWU5BTUlDIiwKICAgICAgIlNRTF9DVVJTT1JfU1RBVElDIiwgIlNRTF9LRVlTRVRfU0laRSIsICJTUUxfRkVUQ0hfRklSU1QiLCAiU1FMX0ZFVENIX05FWFQiLAogICAgICAiU1FMX0NIQVIiLCAiU1FMX1ZBUkNIQVIiLCAiU1FMX0xPTkdWQVJDSEFSIiwgIlNRTF9ERUNJTUFMIiwgIlNRTF9OVU1FUklDIiwKICAgICAgIlNRTF9CSVQiLCAiU1FMX1RJTllJTlQiLCAiU1FMX1NNQUxMSU5UIiwgIlNRTF9JTlRFR0VSIiwgIlNRTF9CSUdJTlQiLAogICAgICAiU1FMX1JFQUwiLCAiU1FMX0ZMT0FUIiwgIlNRTF9ET1VCTEUiLCAiU1FMX0JJTkFSWSIsICJTUUxfVkFSQklOQVJZIiwKICAgICAgIlNRTF9MT05HVkFSQklOQVJZIiwgIlNRTF9EQVRFIiwgIlNRTF9USU1FIiwgIlNRTF9USU1FU1RBTVAiLAogICAgICAiUFJFR19QQVRURVJOX09SREVSIiwgIlBSRUdfU0VUX09SREVSIiwgIlBSRUdfT0ZGU0VUX0NBUFRVUkUiLAogICAgICAiUFJFR19TUExJVF9OT19FTVBUWSIsICJQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUiLCAiUFJFR19TUExJVF9PRkZTRVRfQ0FQVFVSRSIsCiAgICAgICJQUkVHX0dSRVBfSU5WRVJUIiwgIlBSRUdfTk9fRVJST1IiLCAiUFJFR19JTlRFUk5BTF9FUlJPUiIsCiAgICAgICJQUkVHX0JBQ0tUUkFDS19MSU1JVF9FUlJPUiIsICJQUkVHX1JFQ1VSU0lPTl9MSU1JVF9FUlJPUiIsCiAgICAgICJQUkVHX0JBRF9VVEY4X0VSUk9SIiwgIkRBVEVfQVRPTSIsICJEQVRFX0NPT0tJRSIsICJEQVRFX0lTTzg2MDEiLAogICAgICAiREFURV9SRkM4MjIiLCAiREFURV9SRkM4NTAiLCAiREFURV9SRkMxMDM2IiwgIkRBVEVfUkZDMTEyMyIsICJEQVRFX1JGQzI4MjIiLAogICAgICAiREFURV9SRkMzMzM5IiwgIkRBVEVfUlNTIiwgIkRBVEVfVzNDIiwgIlNVTkZVTkNTX1JFVF9USU1FU1RBTVAiLAogICAgICAiU1VORlVOQ1NfUkVUX1NUUklORyIsICJTVU5GVU5DU19SRVRfRE9VQkxFIiwgIkxJQlhNTF9WRVJTSU9OIiwKICAgICAgIkxJQlhNTF9ET1RURURfVkVSU0lPTiIsICJMSUJYTUxfTk9FTlQiLCAiTElCWE1MX0RURExPQUQiLCAiTElCWE1MX0RUREFUVFIiLAogICAgICAiTElCWE1MX0RURFZBTElEIiwgIkxJQlhNTF9OT0VSUk9SIiwgIkxJQlhNTF9OT1dBUk5JTkciLCAiTElCWE1MX05PQkxBTktTIiwKICAgICAgIkxJQlhNTF9YSU5DTFVERSIsICJMSUJYTUxfTlNDTEVBTiIsICJMSUJYTUxfTk9DREFUQSIsICJMSUJYTUxfTk9ORVQiLAogICAgICAiTElCWE1MX0NPTVBBQ1QiLCAiTElCWE1MX05PWE1MREVDTCIsICJMSUJYTUxfTk9FTVBUWVRBRyIsICJMSUJYTUxfRVJSX05PTkUiLAogICAgICAiTElCWE1MX0VSUl9XQVJOSU5HIiwgIkxJQlhNTF9FUlJfRVJST1IiLCAiTElCWE1MX0VSUl9GQVRBTCIsCiAgICAgICJDT05ORUNUSU9OX0FCT1JURUQiLCAiQ09OTkVDVElPTl9OT1JNQUwiLCAiQ09OTkVDVElPTl9USU1FT1VUIiwgIklOSV9VU0VSIiwKICAgICAgIklOSV9QRVJESVIiLCAiSU5JX1NZU1RFTSIsICJJTklfQUxMIiwgIlBIUF9VUkxfU0NIRU1FIiwgIlBIUF9VUkxfSE9TVCIsCiAgICAgICJQSFBfVVJMX1BPUlQiLCAiUEhQX1VSTF9VU0VSIiwgIlBIUF9VUkxfUEFTUyIsICJQSFBfVVJMX1BBVEgiLAogICAgICAiUEhQX1VSTF9RVUVSWSIsICJQSFBfVVJMX0ZSQUdNRU5UIiwgIk1fRSIsICJNX0xPRzJFIiwgIk1fTE9HMTBFIiwgIk1fTE4yIiwKICAgICAgIk1fTE4xMCIsICJNX1BJIiwgIk1fUElfMiIsICJNX1BJXzQiLCAiTV8xX1BJIiwgIk1fMl9QSSIsICJNX1NRUlRQSSIsCiAgICAgICJNXzJfU1FSVFBJIiwgIk1fTE5QSSIsICJNX0VVTEVSIiwgIk1fU1FSVDIiLCAiTV9TUVJUMV8yIiwgIk1fU1FSVDMiLCAiSU5GIiwKICAgICAgIk5BTiIsICJJTkZPX0dFTkVSQUwiLCAiSU5GT19DUkVESVRTIiwgIklORk9fQ09ORklHVVJBVElPTiIsICJJTkZPX01PRFVMRVMiLAogICAgICAiSU5GT19FTlZJUk9OTUVOVCIsICJJTkZPX1ZBUklBQkxFUyIsICJJTkZPX0xJQ0VOU0UiLCAiSU5GT19BTEwiLAogICAgICAiQ1JFRElUU19HUk9VUCIsICJDUkVESVRTX0dFTkVSQUwiLCAiQ1JFRElUU19TQVBJIiwgIkNSRURJVFNfTU9EVUxFUyIsCiAgICAgICJDUkVESVRTX0RPQ1MiLCAiQ1JFRElUU19GVUxMUEFHRSIsICJDUkVESVRTX1FBIiwgIkNSRURJVFNfQUxMIiwKICAgICAgIkhUTUxfU1BFQ0lBTENIQVJTIiwgIkhUTUxfRU5USVRJRVMiLCAiRU5UX0NPTVBBVCIsICJFTlRfUVVPVEVTIiwKICAgICAgIkVOVF9OT1FVT1RFUyIsICJTVFJfUEFEX0xFRlQiLCAiU1RSX1BBRF9SSUdIVCIsICJTVFJfUEFEX0JPVEgiLAogICAgICAiUEFUSElORk9fRElSTkFNRSIsICJQQVRISU5GT19CQVNFTkFNRSIsICJQQVRISU5GT19FWFRFTlNJT04iLAogICAgICAiUEFUSElORk9fRklMRU5BTUUiLCAiQ0hBUl9NQVgiLCAiTENfQ1RZUEUiLCAiTENfTlVNRVJJQyIsICJMQ19USU1FIiwKICAgICAgIkxDX0NPTExBVEUiLCAiTENfTU9ORVRBUlkiLCAiTENfQUxMIiwgIlNFRUtfU0VUIiwgIlNFRUtfQ1VSIiwgIlNFRUtfRU5EIiwKICAgICAgIkxPQ0tfU0giLCAiTE9DS19FWCIsICJMT0NLX1VOIiwgIkxPQ0tfTkIiLCAiU1RSRUFNX05PVElGWV9DT05ORUNUIiwKICAgICAgIlNUUkVBTV9OT1RJRllfQVVUSF9SRVFVSVJFRCIsICJTVFJFQU1fTk9USUZZX0FVVEhfUkVTVUxUIiwKICAgICAgIlNUUkVBTV9OT1RJRllfTUlNRV9UWVBFX0lTIiwgIlNUUkVBTV9OT1RJRllfRklMRV9TSVpFX0lTIiwKICAgICAgIlNUUkVBTV9OT1RJRllfUkVESVJFQ1RFRCIsICJTVFJFQU1fTk9USUZZX1BST0dSRVNTIiwgIlNUUkVBTV9OT1RJRllfRkFJTFVSRSIsCiAgICAgICJTVFJFQU1fTk9USUZZX0NPTVBMRVRFRCIsICJTVFJFQU1fTk9USUZZX1JFU09MVkUiLAogICAgICAiU1RSRUFNX05PVElGWV9TRVZFUklUWV9JTkZPIiwgIlNUUkVBTV9OT1RJRllfU0VWRVJJVFlfV0FSTiIsCiAgICAgICJTVFJFQU1fTk9USUZZX1NFVkVSSVRZX0VSUiIsICJTVFJFQU1fRklMVEVSX1JFQUQiLCAiU1RSRUFNX0ZJTFRFUl9XUklURSIsCiAgICAgICJTVFJFQU1fRklMVEVSX0FMTCIsICJTVFJFQU1fQ0xJRU5UX1BFUlNJU1RFTlQiLCAiU1RSRUFNX0NMSUVOVF9BU1lOQ19DT05ORUNUIiwKICAgICAgIlNUUkVBTV9DTElFTlRfQ09OTkVDVCIsICJTVFJFQU1fQ1JZUFRPX01FVEhPRF9TU0x2Ml9DTElFTlQiLAogICAgICAiU1RSRUFNX0NSWVBUT19NRVRIT0RfU1NMdjNfQ0xJRU5UIiwgIlNUUkVBTV9DUllQVE9fTUVUSE9EX1NTTHYyM19DTElFTlQiLAogICAgICAiU1RSRUFNX0NSWVBUT19NRVRIT0RfVExTX0NMSUVOVCIsICJTVFJFQU1fQ1JZUFRPX01FVEhPRF9TU0x2Ml9TRVJWRVIiLAogICAgICAiU1RSRUFNX0NSWVBUT19NRVRIT0RfU1NMdjNfU0VSVkVSIiwgIlNUUkVBTV9DUllQVE9fTUVUSE9EX1NTTHYyM19TRVJWRVIiLAogICAgICAiU1RSRUFNX0NSWVBUT19NRVRIT0RfVExTX1NFUlZFUiIsICJTVFJFQU1fU0hVVF9SRCIsICJTVFJFQU1fU0hVVF9XUiIsCiAgICAgICJTVFJFQU1fU0hVVF9SRFdSIiwgIlNUUkVBTV9QRl9JTkVUIiwgIlNUUkVBTV9QRl9JTkVUNiIsICJTVFJFQU1fUEZfVU5JWCIsCiAgICAgICJTVFJFQU1fSVBQUk9UT19JUCIsICJTVFJFQU1fSVBQUk9UT19UQ1AiLCAiU1RSRUFNX0lQUFJPVE9fVURQIiwKICAgICAgIlNUUkVBTV9JUFBST1RPX0lDTVAiLCAiU1RSRUFNX0lQUFJPVE9fUkFXIiwgIlNUUkVBTV9TT0NLX1NUUkVBTSIsCiAgICAgICJTVFJFQU1fU09DS19ER1JBTSIsICJTVFJFQU1fU09DS19SQVciLCAiU1RSRUFNX1NPQ0tfU0VRUEFDS0VUIiwKICAgICAgIlNUUkVBTV9TT0NLX1JETSIsICJTVFJFQU1fUEVFSyIsICJTVFJFQU1fT09CIiwgIlNUUkVBTV9TRVJWRVJfQklORCIsCiAgICAgICJTVFJFQU1fU0VSVkVSX0xJU1RFTiIsICJGSUxFX1VTRV9JTkNMVURFX1BBVEgiLCAiRklMRV9JR05PUkVfTkVXX0xJTkVTIiwKICAgICAgIkZJTEVfU0tJUF9FTVBUWV9MSU5FUyIsICJGSUxFX0FQUEVORCIsICJGSUxFX05PX0RFRkFVTFRfQ09OVEVYVCIsCiAgICAgICJQU0ZTX1BBU1NfT04iLCAiUFNGU19GRUVEX01FIiwgIlBTRlNfRVJSX0ZBVEFMIiwgIlBTRlNfRkxBR19OT1JNQUwiLAogICAgICAiUFNGU19GTEFHX0ZMVVNIX0lOQyIsICJQU0ZTX0ZMQUdfRkxVU0hfQ0xPU0UiLCAiQ1JZUFRfU0FMVF9MRU5HVEgiLAogICAgICAiQ1JZUFRfU1REX0RFUyIsICJDUllQVF9FWFRfREVTIiwgIkNSWVBUX01ENSIsICJDUllQVF9CTE9XRklTSCIsCiAgICAgICJESVJFQ1RPUllfU0VQQVJBVE9SIiwgIlBBVEhfU0VQQVJBVE9SIiwgIkdMT0JfQlJBQ0UiLCAiR0xPQl9NQVJLIiwKICAgICAgIkdMT0JfTk9TT1JUIiwgIkdMT0JfTk9DSEVDSyIsICJHTE9CX05PRVNDQVBFIiwgIkdMT0JfRVJSIiwgIkdMT0JfT05MWURJUiIsCiAgICAgICJMT0dfRU1FUkciLCAiTE9HX0FMRVJUIiwgIkxPR19DUklUIiwgIkxPR19FUlIiLCAiTE9HX1dBUk5JTkciLCAiTE9HX05PVElDRSIsCiAgICAgICJMT0dfSU5GTyIsICJMT0dfREVCVUciLCAiTE9HX0tFUk4iLCAiTE9HX1VTRVIiLCAiTE9HX01BSUwiLCAiTE9HX0RBRU1PTiIsCiAgICAgICJMT0dfQVVUSCIsICJMT0dfU1lTTE9HIiwgIkxPR19MUFIiLCAiTE9HX05FV1MiLCAiTE9HX1VVQ1AiLCAiTE9HX0NST04iLAogICAgICAiTE9HX0FVVEhQUklWIiwgIkxPR19QSUQiLCAiTE9HX0NPTlMiLCAiTE9HX09ERUxBWSIsICJMT0dfTkRFTEFZIiwKICAgICAgIkxPR19OT1dBSVQiLCAiTE9HX1BFUlJPUiIsICJFWFRSX09WRVJXUklURSIsICJFWFRSX1NLSVAiLCAiRVhUUl9QUkVGSVhfU0FNRSIsCiAgICAgICJFWFRSX1BSRUZJWF9BTEwiLCAiRVhUUl9QUkVGSVhfSU5WQUxJRCIsICJFWFRSX1BSRUZJWF9JRl9FWElTVFMiLAogICAgICAiRVhUUl9JRl9FWElTVFMiLCAiRVhUUl9SRUZTIiwgIlNPUlRfQVNDIiwgIlNPUlRfREVTQyIsICJTT1JUX1JFR1VMQVIiLAogICAgICAiU09SVF9OVU1FUklDIiwgIlNPUlRfU1RSSU5HIiwgIlNPUlRfTE9DQUxFX1NUUklORyIsICJDQVNFX0xPV0VSIiwKICAgICAgIkNBU0VfVVBQRVIiLCAiQ09VTlRfTk9STUFMIiwgIkNPVU5UX1JFQ1VSU0lWRSIsICJBU1NFUlRfQUNUSVZFIiwKICAgICAgIkFTU0VSVF9DQUxMQkFDSyIsICJBU1NFUlRfQkFJTCIsICJBU1NFUlRfV0FSTklORyIsICJBU1NFUlRfUVVJRVRfRVZBTCIsCiAgICAgICJTVFJFQU1fVVNFX1BBVEgiLCAiU1RSRUFNX0lHTk9SRV9VUkwiLCAiU1RSRUFNX0VORk9SQ0VfU0FGRV9NT0RFIiwKICAgICAgIlNUUkVBTV9SRVBPUlRfRVJST1JTIiwgIlNUUkVBTV9NVVNUX1NFRUsiLCAiU1RSRUFNX1VSTF9TVEFUX0xJTksiLAogICAgICAiU1RSRUFNX1VSTF9TVEFUX1FVSUVUIiwgIlNUUkVBTV9NS0RJUl9SRUNVUlNJVkUiLCAiSU1BR0VUWVBFX0dJRiIsCiAgICAgICJJTUFHRVRZUEVfSlBFRyIsICJJTUFHRVRZUEVfUE5HIiwgIklNQUdFVFlQRV9TV0YiLCAiSU1BR0VUWVBFX1BTRCIsCiAgICAgICJJTUFHRVRZUEVfQk1QIiwgIklNQUdFVFlQRV9USUZGX0lJIiwgIklNQUdFVFlQRV9USUZGX01NIiwgIklNQUdFVFlQRV9KUEMiLAogICAgICAiSU1BR0VUWVBFX0pQMiIsICJJTUFHRVRZUEVfSlBYIiwgIklNQUdFVFlQRV9KQjIiLCAiSU1BR0VUWVBFX1NXQyIsCiAgICAgICJJTUFHRVRZUEVfSUZGIiwgIklNQUdFVFlQRV9XQk1QIiwgIklNQUdFVFlQRV9KUEVHMjAwMCIsICJJTUFHRVRZUEVfWEJNIiwKICAgICAgIlRfSU5DTFVERSIsICJUX0lOQ0xVREVfT05DRSIsICJUX0VWQUwiLCAiVF9SRVFVSVJFIiwgIlRfUkVRVUlSRV9PTkNFIiwKICAgICAgIlRfTE9HSUNBTF9PUiIsICJUX0xPR0lDQUxfWE9SIiwgIlRfTE9HSUNBTF9BTkQiLCAiVF9QUklOVCIsICJUX1BMVVNfRVFVQUwiLAogICAgICAiVF9NSU5VU19FUVVBTCIsICJUX01VTF9FUVVBTCIsICJUX0RJVl9FUVVBTCIsICJUX0NPTkNBVF9FUVVBTCIsICJUX01PRF9FUVVBTCIsCiAgICAgICJUX0FORF9FUVVBTCIsICJUX09SX0VRVUFMIiwgIlRfWE9SX0VRVUFMIiwgIlRfU0xfRVFVQUwiLCAiVF9TUl9FUVVBTCIsCiAgICAgICJUX0JPT0xFQU5fT1IiLCAiVF9CT09MRUFOX0FORCIsICJUX0lTX0VRVUFMIiwgIlRfSVNfTk9UX0VRVUFMIiwKICAgICAgIlRfSVNfSURFTlRJQ0FMIiwgIlRfSVNfTk9UX0lERU5USUNBTCIsICJUX0lTX1NNQUxMRVJfT1JfRVFVQUwiLAogICAgICAiVF9JU19HUkVBVEVSX09SX0VRVUFMIiwgIlRfU0wiLCAiVF9TUiIsICJUX0lOQyIsICJUX0RFQyIsICJUX0lOVF9DQVNUIiwKICAgICAgIlRfRE9VQkxFX0NBU1QiLCAiVF9TVFJJTkdfQ0FTVCIsICJUX0FSUkFZX0NBU1QiLCAiVF9PQkpFQ1RfQ0FTVCIsCiAgICAgICJUX0JPT0xfQ0FTVCIsICJUX1VOU0VUX0NBU1QiLCAiVF9ORVciLCAiVF9FWElUIiwgIlRfSUYiLCAiVF9FTFNFSUYiLCAiVF9FTFNFIiwKICAgICAgIlRfRU5ESUYiLCAiVF9MTlVNQkVSIiwgIlRfRE5VTUJFUiIsICJUX1NUUklORyIsICJUX1NUUklOR19WQVJOQU1FIiwKICAgICAgIlRfVkFSSUFCTEUiLCAiVF9OVU1fU1RSSU5HIiwgIlRfSU5MSU5FX0hUTUwiLCAiVF9DSEFSQUNURVIiLAogICAgICAiVF9CQURfQ0hBUkFDVEVSIiwgIlRfRU5DQVBTRURfQU5EX1dISVRFU1BBQ0UiLCAiVF9DT05TVEFOVF9FTkNBUFNFRF9TVFJJTkciLAogICAgICAiVF9FQ0hPIiwgIlRfRE8iLCAiVF9XSElMRSIsICJUX0VORFdISUxFIiwgIlRfRk9SIiwgIlRfRU5ERk9SIiwgIlRfRk9SRUFDSCIsCiAgICAgICJUX0VOREZPUkVBQ0giLCAiVF9ERUNMQVJFIiwgIlRfRU5EREVDTEFSRSIsICJUX0FTIiwgIlRfU1dJVENIIiwgIlRfRU5EU1dJVENIIiwKICAgICAgIlRfQ0FTRSIsICJUX0RFRkFVTFQiLCAiVF9CUkVBSyIsICJUX0NPTlRJTlVFIiwgIlRfRlVOQ1RJT04iLCAiVF9DT05TVCIsCiAgICAgICJUX1JFVFVSTiIsICJUX1VTRSIsICJUX0dMT0JBTCIsICJUX1NUQVRJQyIsICJUX1ZBUiIsICJUX1VOU0VUIiwgIlRfSVNTRVQiLAogICAgICAiVF9FTVBUWSIsICJUX0NMQVNTIiwgIlRfRVhURU5EUyIsICJUX0lOVEVSRkFDRSIsICJUX0lNUExFTUVOVFMiLAogICAgICAiVF9PQkpFQ1RfT1BFUkFUT1IiLCAiVF9ET1VCTEVfQVJST1ciLCAiVF9MSVNUIiwgIlRfQVJSQVkiLCAiVF9DTEFTU19DIiwKICAgICAgIlRfRlVOQ19DIiwgIlRfTUVUSE9EX0MiLCAiVF9MSU5FIiwgIlRfRklMRSIsICJUX0NPTU1FTlQiLCAiVF9ET0NfQ09NTUVOVCIsCiAgICAgICJUX09QRU5fVEFHIiwgIlRfT1BFTl9UQUdfV0lUSF9FQ0hPIiwgIlRfQ0xPU0VfVEFHIiwgIlRfV0hJVEVTUEFDRSIsCiAgICAgICJUX1NUQVJUX0hFUkVET0MiLCAiVF9FTkRfSEVSRURPQyIsICJUX0RPTExBUl9PUEVOX0NVUkxZX0JSQUNFUyIsCiAgICAgICJUX0NVUkxZX09QRU4iLCAiVF9QQUFNQVlJTV9ORUtVRE9UQVlJTSIsICJUX0RPVUJMRV9DT0xPTiIsICJUX0FCU1RSQUNUIiwKICAgICAgIlRfQ0FUQ0giLCAiVF9GSU5BTCIsICJUX0lOU1RBTkNFT0YiLCAiVF9QUklWQVRFIiwgIlRfUFJPVEVDVEVEIiwgIlRfUFVCTElDIiwKICAgICAgIlRfVEhST1ciLCAiVF9UUlkiLCAiVF9DTE9ORSIsICJUX0hBTFRfQ09NUElMRVIiLCAiRk9SQ0VfR1pJUCIsCiAgICAgICJGT1JDRV9ERUZMQVRFIiwgIlhNTF9FTEVNRU5UX05PREUiLCAiWE1MX0FUVFJJQlVURV9OT0RFIiwgIlhNTF9URVhUX05PREUiLAogICAgICAiWE1MX0NEQVRBX1NFQ1RJT05fTk9ERSIsICJYTUxfRU5USVRZX1JFRl9OT0RFIiwgIlhNTF9FTlRJVFlfTk9ERSIsCiAgICAgICJYTUxfUElfTk9ERSIsICJYTUxfQ09NTUVOVF9OT0RFIiwgIlhNTF9ET0NVTUVOVF9OT0RFIiwKICAgICAgIlhNTF9ET0NVTUVOVF9UWVBFX05PREUiLCAiWE1MX0RPQ1VNRU5UX0ZSQUdfTk9ERSIsICJYTUxfTk9UQVRJT05fTk9ERSIsCiAgICAgICJYTUxfSFRNTF9ET0NVTUVOVF9OT0RFIiwgIlhNTF9EVERfTk9ERSIsICJYTUxfRUxFTUVOVF9ERUNMX05PREUiLAogICAgICAiWE1MX0FUVFJJQlVURV9ERUNMX05PREUiLCAiWE1MX0VOVElUWV9ERUNMX05PREUiLCAiWE1MX05BTUVTUEFDRV9ERUNMX05PREUiLAogICAgICAiWE1MX0xPQ0FMX05BTUVTUEFDRSIsICJYTUxfQVRUUklCVVRFX0NEQVRBIiwgIlhNTF9BVFRSSUJVVEVfSUQiLAogICAgICAiWE1MX0FUVFJJQlVURV9JRFJFRiIsICJYTUxfQVRUUklCVVRFX0lEUkVGUyIsICJYTUxfQVRUUklCVVRFX0VOVElUWSIsCiAgICAgICJYTUxfQVRUUklCVVRFX05NVE9LRU4iLCAiWE1MX0FUVFJJQlVURV9OTVRPS0VOUyIsICJYTUxfQVRUUklCVVRFX0VOVU1FUkFUSU9OIiwKICAgICAgIlhNTF9BVFRSSUJVVEVfTk9UQVRJT04iLCAiRE9NX1BIUF9FUlIiLCAiRE9NX0lOREVYX1NJWkVfRVJSIiwKICAgICAgIkRPTVNUUklOR19TSVpFX0VSUiIsICJET01fSElFUkFSQ0hZX1JFUVVFU1RfRVJSIiwgIkRPTV9XUk9OR19ET0NVTUVOVF9FUlIiLAogICAgICAiRE9NX0lOVkFMSURfQ0hBUkFDVEVSX0VSUiIsICJET01fTk9fREFUQV9BTExPV0VEX0VSUiIsCiAgICAgICJET01fTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSIiwgIkRPTV9OT1RfRk9VTkRfRVJSIiwKICAgICAgIkRPTV9OT1RfU1VQUE9SVEVEX0VSUiIsICJET01fSU5VU0VfQVRUUklCVVRFX0VSUiIsICJET01fSU5WQUxJRF9TVEFURV9FUlIiLAogICAgICAiRE9NX1NZTlRBWF9FUlIiLCAiRE9NX0lOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiIsICJET01fTkFNRVNQQUNFX0VSUiIsCiAgICAgICJET01fSU5WQUxJRF9BQ0NFU1NfRVJSIiwgIkRPTV9WQUxJREFUSU9OX0VSUiIsICJYTUxfRVJST1JfTk9ORSIsCiAgICAgICJYTUxfRVJST1JfTk9fTUVNT1JZIiwgIlhNTF9FUlJPUl9TWU5UQVgiLCAiWE1MX0VSUk9SX05PX0VMRU1FTlRTIiwKICAgICAgIlhNTF9FUlJPUl9JTlZBTElEX1RPS0VOIiwgIlhNTF9FUlJPUl9VTkNMT1NFRF9UT0tFTiIsCiAgICAgICJYTUxfRVJST1JfUEFSVElBTF9DSEFSIiwgIlhNTF9FUlJPUl9UQUdfTUlTTUFUQ0giLAogICAgICAiWE1MX0VSUk9SX0RVUExJQ0FURV9BVFRSSUJVVEUiLCAiWE1MX0VSUk9SX0pVTktfQUZURVJfRE9DX0VMRU1FTlQiLAogICAgICAiWE1MX0VSUk9SX1BBUkFNX0VOVElUWV9SRUYiLCAiWE1MX0VSUk9SX1VOREVGSU5FRF9FTlRJVFkiLAogICAgICAiWE1MX0VSUk9SX1JFQ1VSU0lWRV9FTlRJVFlfUkVGIiwgIlhNTF9FUlJPUl9BU1lOQ19FTlRJVFkiLAogICAgICAiWE1MX0VSUk9SX0JBRF9DSEFSX1JFRiIsICJYTUxfRVJST1JfQklOQVJZX0VOVElUWV9SRUYiLAogICAgICAiWE1MX0VSUk9SX0FUVFJJQlVURV9FWFRFUk5BTF9FTlRJVFlfUkVGIiwgIlhNTF9FUlJPUl9NSVNQTEFDRURfWE1MX1BJIiwKICAgICAgIlhNTF9FUlJPUl9VTktOT1dOX0VOQ09ESU5HIiwgIlhNTF9FUlJPUl9JTkNPUlJFQ1RfRU5DT0RJTkciLAogICAgICAiWE1MX0VSUk9SX1VOQ0xPU0VEX0NEQVRBX1NFQ1RJT04iLCAiWE1MX0VSUk9SX0VYVEVSTkFMX0VOVElUWV9IQU5ETElORyIsCiAgICAgICJYTUxfT1BUSU9OX0NBU0VfRk9MRElORyIsICJYTUxfT1BUSU9OX1RBUkdFVF9FTkNPRElORyIsCiAgICAgICJYTUxfT1BUSU9OX1NLSVBfVEFHU1RBUlQiLCAiWE1MX09QVElPTl9TS0lQX1dISVRFIiwgIlhNTF9TQVhfSU1QTCIsICJJTUdfR0lGIiwKICAgICAgIklNR19KUEciLCAiSU1HX0pQRUciLCAiSU1HX1BORyIsICJJTUdfV0JNUCIsICJJTUdfWFBNIiwgIklNR19DT0xPUl9USUxFRCIsCiAgICAgICJJTUdfQ09MT1JfU1RZTEVEIiwgIklNR19DT0xPUl9CUlVTSEVEIiwgIklNR19DT0xPUl9TVFlMRURCUlVTSEVEIiwKICAgICAgIklNR19DT0xPUl9UUkFOU1BBUkVOVCIsICJJTUdfQVJDX1JPVU5ERUQiLCAiSU1HX0FSQ19QSUUiLCAiSU1HX0FSQ19DSE9SRCIsCiAgICAgICJJTUdfQVJDX05PRklMTCIsICJJTUdfQVJDX0VER0VEIiwgIklNR19HRDJfUkFXIiwgIklNR19HRDJfQ09NUFJFU1NFRCIsCiAgICAgICJJTUdfRUZGRUNUX1JFUExBQ0UiLCAiSU1HX0VGRkVDVF9BTFBIQUJMRU5EIiwgIklNR19FRkZFQ1RfTk9STUFMIiwKICAgICAgIklNR19FRkZFQ1RfT1ZFUkxBWSIsICJHRF9CVU5ETEVEIiwgIklNR19GSUxURVJfTkVHQVRFIiwKICAgICAgIklNR19GSUxURVJfR1JBWVNDQUxFIiwgIklNR19GSUxURVJfQlJJR0hUTkVTUyIsICJJTUdfRklMVEVSX0NPTlRSQVNUIiwKICAgICAgIklNR19GSUxURVJfQ09MT1JJWkUiLCAiSU1HX0ZJTFRFUl9FREdFREVURUNUIiwgIklNR19GSUxURVJfR0FVU1NJQU5fQkxVUiIsCiAgICAgICJJTUdfRklMVEVSX1NFTEVDVElWRV9CTFVSIiwgIklNR19GSUxURVJfRU1CT1NTIiwgIklNR19GSUxURVJfTUVBTl9SRU1PVkFMIiwKICAgICAgIklNR19GSUxURVJfU01PT1RIIiwgIlBOR19OT19GSUxURVIiLCAiUE5HX0ZJTFRFUl9OT05FIiwgIlBOR19GSUxURVJfU1VCIiwKICAgICAgIlBOR19GSUxURVJfVVAiLCAiUE5HX0ZJTFRFUl9BVkciLCAiUE5HX0ZJTFRFUl9QQUVUSCIsICJQTkdfQUxMX0ZJTFRFUlMiLAogICAgICAiTUJfT1ZFUkxPQURfTUFJTCIsICJNQl9PVkVSTE9BRF9TVFJJTkciLCAiTUJfT1ZFUkxPQURfUkVHRVgiLCAiTUJfQ0FTRV9VUFBFUiIsCiAgICAgICJNQl9DQVNFX0xPV0VSIiwgIk1CX0NBU0VfVElUTEUiLCAiTVlTUUxfQVNTT0MiLCAiTVlTUUxfTlVNIiwgIk1ZU1FMX0JPVEgiLAogICAgICAiTVlTUUxfQ0xJRU5UX0NPTVBSRVNTIiwgIk1ZU1FMX0NMSUVOVF9TU0wiLCAiTVlTUUxfQ0xJRU5UX0lOVEVSQUNUSVZFIiwKICAgICAgIk1ZU1FMX0NMSUVOVF9JR05PUkVfU1BBQ0UiLCAiTVlTUUxJX1JFQURfREVGQVVMVF9HUk9VUCIsCiAgICAgICJNWVNRTElfUkVBRF9ERUZBVUxUX0ZJTEUiLCAiTVlTUUxJX09QVF9DT05ORUNUX1RJTUVPVVQiLAogICAgICAiTVlTUUxJX09QVF9MT0NBTF9JTkZJTEUiLCAiTVlTUUxJX0lOSVRfQ09NTUFORCIsICJNWVNRTElfQ0xJRU5UX1NTTCIsCiAgICAgICJNWVNRTElfQ0xJRU5UX0NPTVBSRVNTIiwgIk1ZU1FMSV9DTElFTlRfSU5URVJBQ1RJVkUiLAogICAgICAiTVlTUUxJX0NMSUVOVF9JR05PUkVfU1BBQ0UiLCAiTVlTUUxJX0NMSUVOVF9OT19TQ0hFTUEiLAogICAgICAiTVlTUUxJX0NMSUVOVF9GT1VORF9ST1dTIiwgIk1ZU1FMSV9TVE9SRV9SRVNVTFQiLCAiTVlTUUxJX1VTRV9SRVNVTFQiLAogICAgICAiTVlTUUxJX0FTU09DIiwgIk1ZU1FMSV9OVU0iLCAiTVlTUUxJX0JPVEgiLAogICAgICAiTVlTUUxJX1NUTVRfQVRUUl9VUERBVEVfTUFYX0xFTkdUSCIsICJNWVNRTElfU1RNVF9BVFRSX0NVUlNPUl9UWVBFIiwKICAgICAgIk1ZU1FMSV9DVVJTT1JfVFlQRV9OT19DVVJTT1IiLCAiTVlTUUxJX0NVUlNPUl9UWVBFX1JFQURfT05MWSIsCiAgICAgICJNWVNRTElfQ1VSU09SX1RZUEVfRk9SX1VQREFURSIsICJNWVNRTElfQ1VSU09SX1RZUEVfU0NST0xMQUJMRSIsCiAgICAgICJNWVNRTElfU1RNVF9BVFRSX1BSRUZFVENIX1JPV1MiLCAiTVlTUUxJX05PVF9OVUxMX0ZMQUciLAogICAgICAiTVlTUUxJX1BSSV9LRVlfRkxBRyIsICJNWVNRTElfVU5JUVVFX0tFWV9GTEFHIiwgIk1ZU1FMSV9NVUxUSVBMRV9LRVlfRkxBRyIsCiAgICAgICJNWVNRTElfQkxPQl9GTEFHIiwgIk1ZU1FMSV9VTlNJR05FRF9GTEFHIiwgIk1ZU1FMSV9aRVJPRklMTF9GTEFHIiwKICAgICAgIk1ZU1FMSV9BVVRPX0lOQ1JFTUVOVF9GTEFHIiwgIk1ZU1FMSV9USU1FU1RBTVBfRkxBRyIsICJNWVNRTElfU0VUX0ZMQUciLAogICAgICAiTVlTUUxJX05VTV9GTEFHIiwgIk1ZU1FMSV9QQVJUX0tFWV9GTEFHIiwgIk1ZU1FMSV9HUk9VUF9GTEFHIiwKICAgICAgIk1ZU1FMSV9UWVBFX0RFQ0lNQUwiLCAiTVlTUUxJX1RZUEVfVElOWSIsICJNWVNRTElfVFlQRV9TSE9SVCIsCiAgICAgICJNWVNRTElfVFlQRV9MT05HIiwgIk1ZU1FMSV9UWVBFX0ZMT0FUIiwgIk1ZU1FMSV9UWVBFX0RPVUJMRSIsCiAgICAgICJNWVNRTElfVFlQRV9OVUxMIiwgIk1ZU1FMSV9UWVBFX1RJTUVTVEFNUCIsICJNWVNRTElfVFlQRV9MT05HTE9ORyIsCiAgICAgICJNWVNRTElfVFlQRV9JTlQyNCIsICJNWVNRTElfVFlQRV9EQVRFIiwgIk1ZU1FMSV9UWVBFX1RJTUUiLAogICAgICAiTVlTUUxJX1RZUEVfREFURVRJTUUiLCAiTVlTUUxJX1RZUEVfWUVBUiIsICJNWVNRTElfVFlQRV9ORVdEQVRFIiwKICAgICAgIk1ZU1FMSV9UWVBFX0VOVU0iLCAiTVlTUUxJX1RZUEVfU0VUIiwgIk1ZU1FMSV9UWVBFX1RJTllfQkxPQiIsCiAgICAgICJNWVNRTElfVFlQRV9NRURJVU1fQkxPQiIsICJNWVNRTElfVFlQRV9MT05HX0JMT0IiLCAiTVlTUUxJX1RZUEVfQkxPQiIsCiAgICAgICJNWVNRTElfVFlQRV9WQVJfU1RSSU5HIiwgIk1ZU1FMSV9UWVBFX1NUUklORyIsICJNWVNRTElfVFlQRV9DSEFSIiwKICAgICAgIk1ZU1FMSV9UWVBFX0lOVEVSVkFMIiwgIk1ZU1FMSV9UWVBFX0dFT01FVFJZIiwgIk1ZU1FMSV9UWVBFX05FV0RFQ0lNQUwiLAogICAgICAiTVlTUUxJX1RZUEVfQklUIiwgIk1ZU1FMSV9SUExfTUFTVEVSIiwgIk1ZU1FMSV9SUExfU0xBVkUiLCAiTVlTUUxJX1JQTF9BRE1JTiIsCiAgICAgICJNWVNRTElfTk9fREFUQSIsICJNWVNRTElfREFUQV9UUlVOQ0FURUQiLCAiTVlTUUxJX1JFUE9SVF9JTkRFWCIsCiAgICAgICJNWVNRTElfUkVQT1JUX0VSUk9SIiwgIk1ZU1FMSV9SRVBPUlRfU1RSSUNUIiwgIk1ZU1FMSV9SRVBPUlRfQUxMIiwKICAgICAgIk1ZU1FMSV9SRVBPUlRfT0ZGIiwgIkFGX1VOSVgiLCAiQUZfSU5FVCIsICJBRl9JTkVUNiIsICJTT0NLX1NUUkVBTSIsCiAgICAgICJTT0NLX0RHUkFNIiwgIlNPQ0tfUkFXIiwgIlNPQ0tfU0VRUEFDS0VUIiwgIlNPQ0tfUkRNIiwgIk1TR19PT0IiLAogICAgICAiTVNHX1dBSVRBTEwiLCAiTVNHX1BFRUsiLCAiTVNHX0RPTlRST1VURSIsICJTT19ERUJVRyIsICJTT19SRVVTRUFERFIiLAogICAgICAiU09fS0VFUEFMSVZFIiwgIlNPX0RPTlRST1VURSIsICJTT19MSU5HRVIiLCAiU09fQlJPQURDQVNUIiwgIlNPX09PQklOTElORSIsCiAgICAgICJTT19TTkRCVUYiLCAiU09fUkNWQlVGIiwgIlNPX1NORExPV0FUIiwgIlNPX1JDVkxPV0FUIiwgIlNPX1NORFRJTUVPIiwKICAgICAgIlNPX1JDVlRJTUVPIiwgIlNPX1RZUEUiLCAiU09fRVJST1IiLCAiU09MX1NPQ0tFVCIsICJTT01BWENPTk4iLAogICAgICAiUEhQX05PUk1BTF9SRUFEIiwgIlBIUF9CSU5BUllfUkVBRCIsICJTT0NLRVRfRUlOVFIiLCAiU09DS0VUX0VCQURGIiwKICAgICAgIlNPQ0tFVF9FQUNDRVMiLCAiU09DS0VUX0VGQVVMVCIsICJTT0NLRVRfRUlOVkFMIiwgIlNPQ0tFVF9FTUZJTEUiLAogICAgICAiU09DS0VUX0VXT1VMREJMT0NLIiwgIlNPQ0tFVF9FSU5QUk9HUkVTUyIsICJTT0NLRVRfRUFMUkVBRFkiLAogICAgICAiU09DS0VUX0VOT1RTT0NLIiwgIlNPQ0tFVF9FREVTVEFERFJSRVEiLCAiU09DS0VUX0VNU0dTSVpFIiwKICAgICAgIlNPQ0tFVF9FUFJPVE9UWVBFIiwgIlNPQ0tFVF9FTk9QUk9UT09QVCIsICJTT0NLRVRfRVBST1RPTk9TVVBQT1JUIiwKICAgICAgIlNPQ0tFVF9FU09DS1ROT1NVUFBPUlQiLCAiU09DS0VUX0VPUE5PVFNVUFAiLCAiU09DS0VUX0VQRk5PU1VQUE9SVCIsCiAgICAgICJTT0NLRVRfRUFGTk9TVVBQT1JUIiwgIlNPQ0tFVF9FQUREUklOVVNFIiwgIlNPQ0tFVF9FQUREUk5PVEFWQUlMIiwKICAgICAgIlNPQ0tFVF9FTkVURE9XTiIsICJTT0NLRVRfRU5FVFVOUkVBQ0giLCAiU09DS0VUX0VORVRSRVNFVCIsCiAgICAgICJTT0NLRVRfRUNPTk5BQk9SVEVEIiwgIlNPQ0tFVF9FQ09OTlJFU0VUIiwgIlNPQ0tFVF9FTk9CVUZTIiwgIlNPQ0tFVF9FSVNDT05OIiwKICAgICAgIlNPQ0tFVF9FTk9UQ09OTiIsICJTT0NLRVRfRVNIVVRET1dOIiwgIlNPQ0tFVF9FVE9PTUFOWVJFRlMiLAogICAgICAiU09DS0VUX0VUSU1FRE9VVCIsICJTT0NLRVRfRUNPTk5SRUZVU0VEIiwgIlNPQ0tFVF9FTE9PUCIsCiAgICAgICJTT0NLRVRfRU5BTUVUT09MT05HIiwgIlNPQ0tFVF9FSE9TVERPV04iLCAiU09DS0VUX0VIT1NUVU5SRUFDSCIsCiAgICAgICJTT0NLRVRfRU5PVEVNUFRZIiwgIlNPQ0tFVF9FUFJPQ0xJTSIsICJTT0NLRVRfRVVTRVJTIiwgIlNPQ0tFVF9FRFFVT1QiLAogICAgICAiU09DS0VUX0VTVEFMRSIsICJTT0NLRVRfRVJFTU9URSIsICJTT0NLRVRfRURJU0NPTiIsICJTT0NLRVRfU1lTTk9UUkVBRFkiLAogICAgICAiU09DS0VUX1ZFUk5PVFNVUFBPUlRFRCIsICJTT0NLRVRfTk9USU5JVElBTElTRUQiLCAiU09DS0VUX0hPU1RfTk9UX0ZPVU5EIiwKICAgICAgIlNPQ0tFVF9UUllfQUdBSU4iLCAiU09DS0VUX05PX1JFQ09WRVJZIiwgIlNPQ0tFVF9OT19EQVRBIiwKICAgICAgIlNPQ0tFVF9OT19BRERSRVNTIiwgIlNPTF9UQ1AiLCAiU09MX1VEUCIsICJFQUNDRUxFUkFUT1JfVkVSU0lPTiIsCiAgICAgICJFQUNDRUxFUkFUT1JfU0hNX0FORF9ESVNLIiwgIkVBQ0NFTEVSQVRPUl9TSE0iLCAiRUFDQ0VMRVJBVE9SX1NITV9PTkxZIiwKICAgICAgIkVBQ0NFTEVSQVRPUl9ESVNLX09OTFkiLCAiRUFDQ0VMRVJBVE9SX05PTkUiLCAiWERFQlVHX1RSQUNFX0FQUEVORCIsCiAgICAgICJYREVCVUdfVFJBQ0VfQ09NUFVURVJJWkVEIiwgIlhERUJVR19UUkFDRV9IVE1MIiwgIlhERUJVR19DQ19VTlVTRUQiLAogICAgICAiWERFQlVHX0NDX0RFQURfQ09ERSIsICJTVERJTiIsICJTVERPVVQiLCAiU1RERVJSIiwKICAgIF0uZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCwgYXJyYXkpIHsKICAgICAgcmVzdWx0W2VsZW1lbnRdID0gdG9rZW4oImF0b20iLCAicGhwLXByZWRlZmluZWQtY29uc3RhbnQiKTsKICAgIH0pOwoKICAgIC8vIFBIUCBkZWNsYXJlZCBjbGFzc2VzIC0gb3V0cHV0IG9mIGdldF9kZWNsYXJlZF9jbGFzc2VzKCkuIERpZmZlcnMgZnJvbSBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vcmVzZXJ2ZWQuY2xhc3Nlcy5waHAKICAgIFsgICJzdGRDbGFzcyIsICJFeGNlcHRpb24iLCAiRXJyb3JFeGNlcHRpb24iLCAiQ09NUGVyc2lzdEhlbHBlciIsICJjb21fZXhjZXB0aW9uIiwKICAgICAgImNvbV9zYWZlYXJyYXlfcHJveHkiLCAidmFyaWFudCIsICJjb20iLCAiZG90bmV0IiwgIlJlZmxlY3Rpb25FeGNlcHRpb24iLAogICAgICAiUmVmbGVjdGlvbiIsICJSZWZsZWN0aW9uRnVuY3Rpb25BYnN0cmFjdCIsICJSZWZsZWN0aW9uRnVuY3Rpb24iLAogICAgICAiUmVmbGVjdGlvblBhcmFtZXRlciIsICJSZWZsZWN0aW9uTWV0aG9kIiwgIlJlZmxlY3Rpb25DbGFzcyIsCiAgICAgICJSZWZsZWN0aW9uT2JqZWN0IiwgIlJlZmxlY3Rpb25Qcm9wZXJ0eSIsICJSZWZsZWN0aW9uRXh0ZW5zaW9uIiwgIkRhdGVUaW1lIiwKICAgICAgIkRhdGVUaW1lWm9uZSIsICJMaWJYTUxFcnJvciIsICJfX1BIUF9JbmNvbXBsZXRlX0NsYXNzIiwgInBocF91c2VyX2ZpbHRlciIsCiAgICAgICJEaXJlY3RvcnkiLCAiU2ltcGxlWE1MRWxlbWVudCIsICJET01FeGNlcHRpb24iLCAiRE9NU3RyaW5nTGlzdCIsCiAgICAgICJET01OYW1lTGlzdCIsICJET01JbXBsZW1lbnRhdGlvbkxpc3QiLCAiRE9NSW1wbGVtZW50YXRpb25Tb3VyY2UiLAogICAgICAiRE9NSW1wbGVtZW50YXRpb24iLCAiRE9NTm9kZSIsICJET01OYW1lU3BhY2VOb2RlIiwgIkRPTURvY3VtZW50RnJhZ21lbnQiLAogICAgICAiRE9NRG9jdW1lbnQiLCAiRE9NTm9kZUxpc3QiLCAiRE9NTmFtZWROb2RlTWFwIiwgIkRPTUNoYXJhY3RlckRhdGEiLCAiRE9NQXR0ciIsCiAgICAgICJET01FbGVtZW50IiwgIkRPTVRleHQiLCAiRE9NQ29tbWVudCIsICJET01UeXBlaW5mbyIsICJET01Vc2VyRGF0YUhhbmRsZXIiLAogICAgICAiRE9NRG9tRXJyb3IiLCAiRE9NRXJyb3JIYW5kbGVyIiwgIkRPTUxvY2F0b3IiLCAiRE9NQ29uZmlndXJhdGlvbiIsCiAgICAgICJET01DZGF0YVNlY3Rpb24iLCAiRE9NRG9jdW1lbnRUeXBlIiwgIkRPTU5vdGF0aW9uIiwgIkRPTUVudGl0eSIsCiAgICAgICJET01FbnRpdHlSZWZlcmVuY2UiLCAiRE9NUHJvY2Vzc2luZ0luc3RydWN0aW9uIiwgIkRPTVN0cmluZ0V4dGVuZCIsCiAgICAgICJET01YUGF0aCIsICJSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yIiwgIkl0ZXJhdG9ySXRlcmF0b3IiLCAiRmlsdGVySXRlcmF0b3IiLAogICAgICAiUmVjdXJzaXZlRmlsdGVySXRlcmF0b3IiLCAiUGFyZW50SXRlcmF0b3IiLCAiTGltaXRJdGVyYXRvciIsCiAgICAgICJDYWNoaW5nSXRlcmF0b3IiLCAiUmVjdXJzaXZlQ2FjaGluZ0l0ZXJhdG9yIiwgIk5vUmV3aW5kSXRlcmF0b3IiLAogICAgICAiQXBwZW5kSXRlcmF0b3IiLCAiSW5maW5pdGVJdGVyYXRvciIsICJSZWdleEl0ZXJhdG9yIiwKICAgICAgIlJlY3Vyc2l2ZVJlZ2V4SXRlcmF0b3IiLCAiRW1wdHlJdGVyYXRvciIsICJBcnJheU9iamVjdCIsICJBcnJheUl0ZXJhdG9yIiwKICAgICAgIlJlY3Vyc2l2ZUFycmF5SXRlcmF0b3IiLCAiU3BsRmlsZUluZm8iLCAiRGlyZWN0b3J5SXRlcmF0b3IiLAogICAgICAiUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IiLCAiU3BsRmlsZU9iamVjdCIsICJTcGxUZW1wRmlsZU9iamVjdCIsCiAgICAgICJTaW1wbGVYTUxJdGVyYXRvciIsICJMb2dpY0V4Y2VwdGlvbiIsICJCYWRGdW5jdGlvbkNhbGxFeGNlcHRpb24iLAogICAgICAiQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvbiIsICJEb21haW5FeGNlcHRpb24iLCAiSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIiwKICAgICAgIkxlbmd0aEV4Y2VwdGlvbiIsICJPdXRPZlJhbmdlRXhjZXB0aW9uIiwgIlJ1bnRpbWVFeGNlcHRpb24iLAogICAgICAiT3V0T2ZCb3VuZHNFeGNlcHRpb24iLCAiT3ZlcmZsb3dFeGNlcHRpb24iLCAiUmFuZ2VFeGNlcHRpb24iLAogICAgICAiVW5kZXJmbG93RXhjZXB0aW9uIiwgIlVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiIsICJTcGxPYmplY3RTdG9yYWdlIiwKICAgICAgIlhNTFJlYWRlciIsICJYTUxXcml0ZXIiLCAibXlzcWxpX3NxbF9leGNlcHRpb24iLCAibXlzcWxpX2RyaXZlciIsICJteXNxbGkiLAogICAgICAibXlzcWxpX3dhcm5pbmciLCAibXlzcWxpX3Jlc3VsdCIsICJteXNxbGlfc3RtdCIsICJQRE9FeGNlcHRpb24iLCAiUERPIiwKICAgICAgIlBET1N0YXRlbWVudCIsICJQRE9Sb3ciCiAgICBdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJ0X3N0cmluZyIsICJwaHAtcHJlZGVmaW5lZC1jbGFzcyIpOwogICAgfSk7CgogICAgcmV0dXJuIHJlc3VsdDsKCiAgfSgpOwoKICAvLyBIZWxwZXIgcmVnZXhwcwogIHZhciBpc09wZXJhdG9yQ2hhciA9IC9bKyomJVwvPTw+IT8ufC1dLzsKICB2YXIgaXNIZXhEaWdpdCA9IC9bMC05QS1GYS1mXS87CiAgdmFyIGlzV29yZENoYXIgPSAvW1x3XCRfXS87CgogIC8vIFdyYXBwZXIgYXJvdW5kIHBocFRva2VuIHRoYXQgaGVscHMgbWFpbnRhaW4gcGFyc2VyIHN0YXRlICh3aGV0aGVyCiAgLy8gd2UgYXJlIGluc2lkZSBvZiBhIG11bHRpLWxpbmUgY29tbWVudCkKICBmdW5jdGlvbiBwaHBUb2tlblN0YXRlKGluc2lkZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgdmFyIG5ld0luc2lkZSA9IGluc2lkZTsKICAgICAgdmFyIHR5cGUgPSBwaHBUb2tlbihpbnNpZGUsIHNvdXJjZSwgZnVuY3Rpb24oYykge25ld0luc2lkZSA9IGM7fSk7CiAgICAgIGlmIChuZXdJbnNpZGUgIT0gaW5zaWRlKQogICAgICAgIHNldFN0YXRlKHBocFRva2VuU3RhdGUobmV3SW5zaWRlKSk7CiAgICAgIHJldHVybiB0eXBlOwogICAgfTsKICB9CgogIC8vIFRoZSB0b2tlbiByZWFkZXIsIGludGVkZWQgdG8gYmUgdXNlZCBieSB0aGUgdG9rZW5pemVyIGZyb20KICAvLyB0b2tlbml6ZS5qcyAodGhyb3VnaCBwaHBUb2tlblN0YXRlKS4gQWR2YW5jZXMgdGhlIHNvdXJjZSBzdHJlYW0KICAvLyBvdmVyIGEgdG9rZW4sIGFuZCByZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0eXBlIGFuZCBzdHlsZQogIC8vIG9mIHRoYXQgdG9rZW4uCiAgZnVuY3Rpb24gcGhwVG9rZW4oaW5zaWRlLCBzb3VyY2UsIHNldEluc2lkZSkgewogICAgZnVuY3Rpb24gcmVhZEhleE51bWJlcigpewogICAgICBzb3VyY2UubmV4dCgpOyAgLy8gc2tpcCB0aGUgJ3gnCiAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKGlzSGV4RGlnaXQpOwogICAgICByZXR1cm4ge3R5cGU6ICJudW1iZXIiLCBzdHlsZTogInBocC1hdG9tIn07CiAgICB9CgogICAgZnVuY3Rpb24gcmVhZE51bWJlcigpIHsKICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swLTldLyk7CiAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCIuIikpewogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swLTldLyk7CiAgICAgIH0KICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoImUiKSB8fCBzb3VyY2UuZXF1YWxzKCJFIikpewogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoIi0iKSkKICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swLTldLyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHt0eXBlOiAibnVtYmVyIiwgc3R5bGU6ICJwaHAtYXRvbSJ9OwogICAgfQogICAgLy8gUmVhZCBhIHdvcmQgYW5kIGxvb2sgaXQgdXAgaW4gdGhlIGtleXdvcmRzIGFycmF5LiBJZiBmb3VuZCwgaXQncyBhCiAgICAvLyBrZXl3b3JkIG9mIHRoYXQgdHlwZTsgb3RoZXJ3aXNlIGl0J3MgYSBQSFAgVF9TVFJJTkcuCiAgICBmdW5jdGlvbiByZWFkV29yZCgpIHsKICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoaXNXb3JkQ2hhcik7CiAgICAgIHZhciB3b3JkID0gc291cmNlLmdldCgpOwogICAgICB2YXIga25vd24gPSBrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSAmJiBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSAmJiBrZXl3b3Jkc1t3b3JkXTsKICAgICAgLy8gc2luY2Ugd2UgY2FsbGVkIGdldCgpLCB0b2tlbml6ZTo6dGFrZSB3b24ndCBnZXQoKSBhbnl0aGluZy4gVGh1cywgd2UgbXVzdCBzZXQgdG9rZW4uY29udGVudAogICAgICByZXR1cm4ga25vd24gPyB7dHlwZToga25vd24udHlwZSwgc3R5bGU6IGtub3duLnN0eWxlLCBjb250ZW50OiB3b3JkfSA6CiAgICAgIHt0eXBlOiAidF9zdHJpbmciLCBzdHlsZTogInBocC10X3N0cmluZyIsIGNvbnRlbnQ6IHdvcmR9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZFZhcmlhYmxlKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc1dvcmRDaGFyKTsKICAgICAgdmFyIHdvcmQgPSBzb3VyY2UuZ2V0KCk7CiAgICAgIC8vIGluIFBIUCwgJyR0aGlzJyBpcyBhIHJlc2VydmVkIHdvcmQsIGJ1dCAndGhpcycgaXNuJ3QuIFlvdSBjYW4gaGF2ZSBmdW5jdGlvbiB0aGlzKCkgey4uLn0KICAgICAgaWYgKHdvcmQgPT0gIiR0aGlzIikKICAgICAgICByZXR1cm4ge3R5cGU6ICJ2YXJpYWJsZSIsIHN0eWxlOiAicGhwLWtleXdvcmQiLCBjb250ZW50OiB3b3JkfTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiB7dHlwZTogInZhcmlhYmxlIiwgc3R5bGU6ICJwaHAtdmFyaWFibGUiLCBjb250ZW50OiB3b3JkfTsKICAgIH0KCiAgICAvLyBBZHZhbmNlIHRoZSBzdHJlYW0gdW50aWwgdGhlIGdpdmVuIGNoYXJhY3RlciAobm90IHByZWNlZGVkIGJ5IGEKICAgIC8vIGJhY2tzbGFzaCkgaXMgZW5jb3VudGVyZWQsIG9yIHRoZSBlbmQgb2YgdGhlIGxpbmUgaXMgcmVhY2hlZC4KICAgIGZ1bmN0aW9uIG5leHRVbnRpbFVuZXNjYXBlZChzb3VyY2UsIGVuZCkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlOwogICAgICB2YXIgbmV4dDsKICAgICAgd2hpbGUoIXNvdXJjZS5lbmRPZkxpbmUoKSl7CiAgICAgICAgdmFyIG5leHQgPSBzb3VyY2UubmV4dCgpOwogICAgICAgIGlmIChuZXh0ID09IGVuZCAmJiAhZXNjYXBlZCkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBlc2NhcGVkID0gbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIHJldHVybiBlc2NhcGVkOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlYWRTaW5nbGVMaW5lQ29tbWVudCgpIHsKICAgICAgLy8gcmVhZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5lIG9yIHVudGlsID8+LCB3aGljaCB0ZXJtaW5hdGVzIHNpbmdsZS1saW5lIGNvbW1lbnRzCiAgICAgIC8vIGA8P3BocCBlY2hvIDE7IC8vIGNvbW1lbnQgPz4gZm9vYCB3aWxsIGRpc3BsYXkgIjEgZm9vIgogICAgICB3aGlsZSghc291cmNlLmxvb2tBaGVhZCgiPz4iKSAmJiAhc291cmNlLmVuZE9mTGluZSgpKQogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgIHJldHVybiB7dHlwZTogImNvbW1lbnQiLCBzdHlsZTogInBocC1jb21tZW50In07CiAgICB9CiAgICAvKiBGb3IgbXVsdGktbGluZSBjb21tZW50cywgd2Ugd2FudCB0byByZXR1cm4gYSBjb21tZW50IHRva2VuIGZvcgogICAgICAgZXZlcnkgbGluZSBvZiB0aGUgY29tbWVudCwgYnV0IHdlIGFsc28gd2FudCB0byByZXR1cm4gdGhlIG5ld2xpbmVzCiAgICAgICBpbiB0aGVtIGFzIHJlZ3VsYXIgbmV3bGluZSB0b2tlbnMuIFdlIHRoZXJlZm9yZSBuZWVkIHRvIHNhdmUgYQogICAgICAgc3RhdGUgdmFyaWFibGUgKCJpbnNpZGUiKSB0byBpbmRpY2F0ZSB3aGV0aGVyIHdlIGFyZSBpbnNpZGUgYQogICAgICAgbXVsdGktbGluZSBjb21tZW50LgogICAgKi8KCiAgICBmdW5jdGlvbiByZWFkTXVsdGlsaW5lQ29tbWVudChzdGFydCl7CiAgICAgIHZhciBuZXdJbnNpZGUgPSAiLyoiOwogICAgICB2YXIgbWF5YmVFbmQgPSAoc3RhcnQgPT0gIioiKTsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBpZiAoc291cmNlLmVuZE9mTGluZSgpKQogICAgICAgICAgYnJlYWs7CiAgICAgICAgdmFyIG5leHQgPSBzb3VyY2UubmV4dCgpOwogICAgICAgIGlmIChuZXh0ID09ICIvIiAmJiBtYXliZUVuZCl7CiAgICAgICAgICBuZXdJbnNpZGUgPSBudWxsOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIG1heWJlRW5kID0gKG5leHQgPT0gIioiKTsKICAgICAgfQogICAgICBzZXRJbnNpZGUobmV3SW5zaWRlKTsKICAgICAgcmV0dXJuIHt0eXBlOiAiY29tbWVudCIsIHN0eWxlOiAicGhwLWNvbW1lbnQifTsKICAgIH0KCiAgICAvLyBzaW1pbGFyIHRvIHJlYWRNdWx0aWxpbmVDb21tZW50IGFuZCBuZXh0VW50aWxVbmVzY2FwZWQKICAgIC8vIHVubGlrZSBjb21tZW50cywgc3RyaW5ncyBhcmUgbm90IHN0b3BwZWQgYnkgPz4KICAgIGZ1bmN0aW9uIHJlYWRNdWx0aWxpbmVTdHJpbmcoc3RhcnQpewogICAgICB2YXIgbmV3SW5zaWRlID0gc3RhcnQ7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5lbmRPZkxpbmUoKSkKICAgICAgICAgIGJyZWFrOwogICAgICAgIHZhciBuZXh0ID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAobmV4dCA9PSBzdGFydCAmJiAhZXNjYXBlZCl7CiAgICAgICAgICBuZXdJbnNpZGUgPSBudWxsOyAgLy8gd2UncmUgb3V0c2lkZSBvZiB0aGUgc3RyaW5nIG5vdwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVzY2FwZWQgPSAobmV4dCA9PSAiXFwiKTsKICAgICAgfQogICAgICBzZXRJbnNpZGUobmV3SW5zaWRlKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB0eXBlOiBuZXdJbnNpZGUgPT0gbnVsbD8gInN0cmluZyIgOiAic3RyaW5nX25vdF90ZXJtaW5hdGVkIiwKICAgICAgICBzdHlsZTogKHN0YXJ0ID09ICInIj8gInBocC1zdHJpbmctc2luZ2xlLXF1b3RlZCIgOiAicGhwLXN0cmluZy1kb3VibGUtcXVvdGVkIikKICAgICAgfTsKICAgIH0KCiAgICAvLyBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2UudHlwZXMuc3RyaW5nLnBocCNsYW5ndWFnZS50eXBlcy5zdHJpbmcuc3ludGF4LmhlcmVkb2MKICAgIC8vIFNlZSBhbHNvICdub3dkb2MnIG9uIHRoZSBwYWdlLiBIZXJlZG9jcyBhcmUgbm90IGludGVycnVwdGVkIGJ5IHRoZSAnPz4nIHRva2VuLgogICAgZnVuY3Rpb24gcmVhZEhlcmVkb2MoaWRlbnRpZmllcil7CiAgICAgIHZhciB0b2tlbiA9IHt9OwogICAgICBpZiAoaWRlbnRpZmllciA9PSAiPDw8IikgewogICAgICAgIC8vIG9uIG91ciBmaXJzdCBpbnZvY2F0aW9uIGFmdGVyIHJlYWRpbmcgdGhlIDw8PCwgd2UgbXVzdCBkZXRlcm1pbmUgdGhlIGNsb3NpbmcgaWRlbnRpZmllcgogICAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCInIikpIHsKICAgICAgICAgIC8vIG5vd2RvYwogICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoaXNXb3JkQ2hhcik7CiAgICAgICAgICBpZGVudGlmaWVyID0gIiciICsgc291cmNlLmdldCgpICsgIiciOwogICAgICAgICAgc291cmNlLm5leHQoKTsgIC8vIGNvbnN1bWUgdGhlIGNsb3NpbmcgIiciCiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UubWF0Y2hlcygvW0EtWmEtel9dLykpIHsKICAgICAgICAgIC8vIGhlcmVkb2MKICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKGlzV29yZENoYXIpOwogICAgICAgICAgaWRlbnRpZmllciA9IHNvdXJjZS5nZXQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gc3ludGF4IGVycm9yCiAgICAgICAgICBzZXRJbnNpZGUobnVsbCk7CiAgICAgICAgICByZXR1cm4geyB0eXBlOiAiZXJyb3IiLCBzdHlsZTogInN5bnRheC1lcnJvciIgfTsKICAgICAgICB9CiAgICAgICAgc2V0SW5zaWRlKGlkZW50aWZpZXIpOwogICAgICAgIHRva2VuLnR5cGUgPSAic3RyaW5nX25vdF90ZXJtaW5hdGVkIjsKICAgICAgICB0b2tlbi5zdHlsZSA9IGlkZW50aWZpZXIuY2hhckF0KDApID09ICInIj8gInBocC1zdHJpbmctc2luZ2xlLXF1b3RlZCIgOiAicGhwLXN0cmluZy1kb3VibGUtcXVvdGVkIjsKICAgICAgICB0b2tlbi5jb250ZW50ID0gaWRlbnRpZmllcjsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2tlbi5zdHlsZSA9IGlkZW50aWZpZXIuY2hhckF0KDApID09ICInIj8gInBocC1zdHJpbmctc2luZ2xlLXF1b3RlZCIgOiAicGhwLXN0cmluZy1kb3VibGUtcXVvdGVkIjsKICAgICAgICAvLyBjb25zdW1lIGEgbGluZSBvZiBoZXJlZG9jIGFuZCBjaGVjayBpZiBpdCBlcXVhbHMgdGhlIGNsb3NpbmcgaWRlbnRpZmllciBwbHVzIGFuIG9wdGlvbmFsIHNlbWljb2xvbgogICAgICAgIGlmIChzb3VyY2UubG9va0FoZWFkKGlkZW50aWZpZXIsIHRydWUpICYmIChzb3VyY2UubG9va0FoZWFkKCI7XG4iKSB8fCBzb3VyY2UuZW5kT2ZMaW5lKCkpKSB7CiAgICAgICAgICAvLyB0aGUgY2xvc2luZyBpZGVudGlmaWVyIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lCiAgICAgICAgICAvLyBub3RlIHRoYXQgZXZlbiB3aGl0ZXNwYWNlIGFmdGVyIHRoZSAiOyIgaXMgZm9yYmlkZGVuIGJ5IHRoZSBQSFAgaGVyZWRvYyBzeW50YXgKICAgICAgICAgIHRva2VuLnR5cGUgPSAic3RyaW5nIjsKICAgICAgICAgIHRva2VuLmNvbnRlbnQgPSBzb3VyY2UuZ2V0KCk7ICAvLyBkb24ndCBnZXQgdGhlICI7IiBpZiB0aGVyZSBpcyBvbmUKICAgICAgICAgIHNldEluc2lkZShudWxsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdG9rZW4udHlwZSA9ICJzdHJpbmdfbm90X3Rlcm1pbmF0ZWQiOwogICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1teXG5dLyk7CiAgICAgICAgICB0b2tlbi5jb250ZW50ID0gc291cmNlLmdldCgpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdG9rZW47CiAgICB9CgogICAgZnVuY3Rpb24gcmVhZE9wZXJhdG9yKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc09wZXJhdG9yQ2hhcik7CiAgICAgIHJldHVybiB7dHlwZTogIm9wZXJhdG9yIiwgc3R5bGU6ICJwaHAtb3BlcmF0b3IifTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRTdHJpbmdTaW5nbGVRdW90ZWQoKSB7CiAgICAgIHZhciBlbmRCYWNrU2xhc2ggPSBuZXh0VW50aWxVbmVzY2FwZWQoc291cmNlLCAiJyIsIGZhbHNlKTsKICAgICAgc2V0SW5zaWRlKGVuZEJhY2tTbGFzaCA/ICInIiA6IG51bGwpOwogICAgICByZXR1cm4ge3R5cGU6ICJzdHJpbmciLCBzdHlsZTogInBocC1zdHJpbmctc2luZ2xlLXF1b3RlZCJ9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZFN0cmluZ0RvdWJsZVF1b3RlZCgpIHsKICAgICAgdmFyIGVuZEJhY2tTbGFzaCA9IG5leHRVbnRpbFVuZXNjYXBlZChzb3VyY2UsICJcIiIsIGZhbHNlKTsKICAgICAgc2V0SW5zaWRlKGVuZEJhY2tTbGFzaCA/ICJcIiI6IG51bGwpOwogICAgICByZXR1cm4ge3R5cGU6ICJzdHJpbmciLCBzdHlsZTogInBocC1zdHJpbmctZG91YmxlLXF1b3RlZCJ9OwogICAgfQoKICAgIC8vIEZldGNoIHRoZSBuZXh0IHRva2VuLiBEaXNwYXRjaGVzIG9uIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUKICAgIC8vIHN0cmVhbSwgb3IgZmlyc3QgdHdvIGNoYXJhY3RlcnMgd2hlbiB0aGUgZmlyc3QgaXMgYSBzbGFzaC4KICAgIHN3aXRjaCAoaW5zaWRlKSB7CiAgICAgIGNhc2UgbnVsbDoKICAgICAgY2FzZSBmYWxzZTogYnJlYWs7CiAgICAgIGNhc2UgIiciOgogICAgICBjYXNlICJcIiI6IHJldHVybiByZWFkTXVsdGlsaW5lU3RyaW5nKGluc2lkZSk7CiAgICAgIGNhc2UgIi8qIjogcmV0dXJuIHJlYWRNdWx0aWxpbmVDb21tZW50KHNvdXJjZS5uZXh0KCkpOwogICAgICBkZWZhdWx0OiByZXR1cm4gcmVhZEhlcmVkb2MoaW5zaWRlKTsKICAgIH0KICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICBpZiAoY2ggPT0gIiciIHx8IGNoID09ICJcIiIpCiAgICAgIHJldHVybiByZWFkTXVsdGlsaW5lU3RyaW5nKGNoKQogICAgZWxzZSBpZiAoY2ggPT0gIiMiKQogICAgICByZXR1cm4gcmVhZFNpbmdsZUxpbmVDb21tZW50KCk7CiAgICBlbHNlIGlmIChjaCA9PSAiJCIpCiAgICAgIHJldHVybiByZWFkVmFyaWFibGUoKTsKICAgIGVsc2UgaWYgKGNoID09ICI6IiAmJiBzb3VyY2UuZXF1YWxzKCI6IikpIHsKICAgICAgc291cmNlLm5leHQoKTsKICAgICAgLy8gdGhlIFRfRE9VQkxFX0NPTE9OIGNhbiBvbmx5IGZvbGxvdyBhIFRfU1RSSU5HIChjbGFzcyBuYW1lKQogICAgICByZXR1cm4ge3R5cGU6ICJ0X2RvdWJsZV9jb2xvbiIsIHN0eWxlOiAicGhwLW9wZXJhdG9yIn0KICAgIH0KICAgIC8vIHdpdGggcHVuY3R1YXRpb24sIHRoZSB0eXBlIG9mIHRoZSB0b2tlbiBpcyB0aGUgc3ltYm9sIGl0c2VsZgogICAgZWxzZSBpZiAoL1tcW1xde31cKFwpLDs6XS8udGVzdChjaCkpIHsKICAgICAgcmV0dXJuIHt0eXBlOiBjaCwgc3R5bGU6ICJwaHAtcHVuY3R1YXRpb24ifTsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICIwIiAmJiAoc291cmNlLmVxdWFscygieCIpIHx8IHNvdXJjZS5lcXVhbHMoIlgiKSkpCiAgICAgIHJldHVybiByZWFkSGV4TnVtYmVyKCk7CiAgICBlbHNlIGlmICgvWzAtOV0vLnRlc3QoY2gpKQogICAgICByZXR1cm4gcmVhZE51bWJlcigpOwogICAgZWxzZSBpZiAoY2ggPT0gIi8iKSB7CiAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCIqIikpCiAgICAgIHsgc291cmNlLm5leHQoKTsgcmV0dXJuIHJlYWRNdWx0aWxpbmVDb21tZW50KGNoKTsgfQogICAgICBlbHNlIGlmIChzb3VyY2UuZXF1YWxzKCIvIikpCiAgICAgICAgcmV0dXJuIHJlYWRTaW5nbGVMaW5lQ29tbWVudCgpOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIHJlYWRPcGVyYXRvcigpOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIjwiKSB7CiAgICAgIGlmIChzb3VyY2UubG9va0FoZWFkKCI8PCIsIHRydWUpKSB7CiAgICAgICAgc2V0SW5zaWRlKCI8PDwiKTsKICAgICAgICByZXR1cm4ge3R5cGU6ICI8PDwiLCBzdHlsZTogInBocC1wdW5jdHVhdGlvbiJ9OwogICAgICB9CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gcmVhZE9wZXJhdG9yKCk7CiAgICB9CiAgICBlbHNlIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkKICAgICAgcmV0dXJuIHJlYWRPcGVyYXRvcigpOwogICAgZWxzZQogICAgICByZXR1cm4gcmVhZFdvcmQoKTsKICB9CgogIC8vIFRoZSBleHRlcm5hbCBpbnRlcmZhY2UgdG8gdGhlIHRva2VuaXplci4KICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzdGFydFN0YXRlKSB7CiAgICByZXR1cm4gdG9rZW5pemVyKHNvdXJjZSwgc3RhcnRTdGF0ZSB8fCBwaHBUb2tlblN0YXRlKGZhbHNlLCB0cnVlKSk7CiAgfTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChjKSAyMDA4LTIwMDksIFlhaG9vISBJbmMuCkFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGZvciB1c2UgaW4gY29ubmVjdGlvbiB3aXRoIHRoZQpDb2RlTWlycm9yIHN1aXRlIG9mIG1vZHVsZXMgYW5kIHV0aWxpdGllcywgaG9zdGVkIGFuZCBtYWludGFpbmVkCmF0IGh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLAp3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCmZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CgoqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCiAgZm9sbG93aW5nIGRpc2NsYWltZXIuCgoqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCiAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCiAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KCiogTmVpdGhlciB0aGUgbmFtZSBvZiBZYWhvbyEgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwogIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCiAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFlhaG9vISBJbmMuCgpUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCkxJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkNPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwpMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCkNBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVApMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgpBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/license.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChjKSAyMDA4LTIwMDksIFlhaG9vISBJbmMuCkFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGZvciB1c2UgaW4gY29ubmVjdGlvbiB3aXRoIHRoZQpDb2RlTWlycm9yIHN1aXRlIG9mIG1vZHVsZXMgYW5kIHV0aWxpdGllcywgaG9zdGVkIGFuZCBtYWludGFpbmVkCmF0IGh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLAp3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCmZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CgoqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCiAgZm9sbG93aW5nIGRpc2NsYWltZXIuCgoqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCiAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCiAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KCiogTmVpdGhlciB0aGUgbmFtZSBvZiBZYWhvbyEgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwogIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCiAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFlhaG9vISBJbmMuCgpUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCkxJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkNPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwpMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCkNBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVApMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgpBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/css/pythoncolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmVkaXRib3ggewogIHBhZGRpbmc6IC40ZW07CiAgbWFyZ2luOiAwOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxMHB0OwogIGxpbmUtaGVpZ2h0OiAxLjFlbTsKICBjb2xvcjogYmxhY2s7Cn0KCnByZS5jb2RlLCAuZWRpdGJveCB7CiAgY29sb3I6ICM2NjY2NjY7Cn0KCi5lZGl0Ym94IHAgewogIG1hcmdpbjogMDsKfQoKc3Bhbi5weS1kZWxpbWl0ZXIsIHNwYW4ucHktc3BlY2lhbCB7CiAgY29sb3I6ICM2NjY2NjY7Cn0KCnNwYW4ucHktb3BlcmF0b3IgewogIGNvbG9yOiAjNjY2NjY2Owp9CgpzcGFuLnB5LWVycm9yIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjYwMDAwOwogIGNvbG9yOiAjRkZGRkZGOwp9CgpzcGFuLnB5LWtleXdvcmQgewogIGNvbG9yOiAjNzcwMDg4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgpzcGFuLnB5LWxpdGVyYWwgewogIGNvbG9yOiAjMjI4ODExOwp9CgpzcGFuLnB5LWlkZW50aWZpZXIsIHNwYW4ucHktZnVuYyAgewogIGNvbG9yOiBibGFjazsKfQoKc3Bhbi5weS10eXBlLCBzcGFuLnB5LWRlY29yYXRvciB7CiAgY29sb3I6ICMwMDAwRkY7Cn0KCnNwYW4ucHktY29tbWVudCB7CiAgY29sb3I6ICNBQTc3MDA7Cn0KCnNwYW4ucHktc3RyaW5nLCBzcGFuLnB5LWJ5dGVzLCBzcGFuLnB5LXJhdywgc3Bhbi5weS11bmljb2RlIHsKICBjb2xvcjogI0FBMjIyMjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgo8aGVhZD4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9qcy9jb2RlbWlycm9yLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFB5dGhvbiBkZW1vbnN0cmF0aW9uPC90aXRsZT4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yLWxpbmUtbnVtYmVycyB7CiAgICAgICAgd2lkdGg6IDIuMmVtOwogICAgICAgIGNvbG9yOiAjYWFhOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZzogLjRlbTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDEwcHQ7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMWVtOwogICAgICB9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyI+CjxwPgogICAgVGhpcyBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIHRoZSBQeXRob24gc3ludGF4IGhpZ2hsaWdodGluZyBtb2R1bGUKICAgIGZvciA8YSBocmVmPSJpbmRleC5odG1sIj5Db2RlTWlycm9yPC9hPi4KPC9wPgo8cD4KICAgIEZlYXR1cmVzIG9mIHRoaXMgcGFyc2VyIGluY2x1ZGU6CjwvcD4KPHVsPgogICAgPGxpPlRva2VuLWJhc2VkIHN5bnRheCBoaWdobGlnaHRpbmcgLSBjdXJyZW50bHkgdmVyeSBsaXR0bGUgbGV4aWNhbCBhbmFseXNpcyBoYXBwZW5zLiAgRmV3IGxleGljYWwgZXJyb3JzIHdpbGwgYmUgZGV0ZWN0ZWQuPC9saT4KICAgIDxsaT5Vc2UgdGhlIG5vcm1hbCBpbmRlbnRhdGlvbiBtb2RlIHRvIGVuZm9yY2UgcmVndWxhciBpbmRlbnRhdGlvbiwgb3RoZXJ3aXNlIHRoZSAic2hpZnQiIGluZGVudGF0aW9uIG1vZGUgd2lsbCBnaXZlIHlvdSBtb3JlIGZsZXhpYmlsaXR5LjwvbGk+CiAgICA8bGk+UGFyc2VyIE9wdGlvbnM6CiAgICAgICAgPHVsPgogICAgICAgICAgICA8bGk+cHl0aG9uVmVyc2lvbiAoSW50ZWdlcikgLSAyIG9yIDMgdG8gaW5kaWNhdGUgd2hpY2ggdmVyc2lvbiBvZiBQeXRob24gdG8gcGFyc2UuICBEZWZhdWx0ID0gMjwvbGk+CiAgICAgICAgICAgIDxsaT5zdHJpY3RFcnJvcnMgKEJvb2wpIC0gdHJ1ZSB0byBoaWdobGlnaHQgZXJyb3JzIHRoYXQgbWF5IG5vdCBiZSBQeXRob24gZXJyb3JzIGJ1dCBjYXVzZSBjb25mdXNpb24gZm9yIHRoaXMgcGFyc2VyLiBEZWZhdWx0ID0gdHJ1ZTwvbGk+CiAgICAgICAgPC91bD4KICAgIDwvbGk+CjwvdWw+CjxwPldyaXR0ZW4gYnkgVGltb3RoeSBGYXJyZWxsICg8YSBocmVmPSJMSUNFTlNFIj5saWNlbnNlPC9hPikuIFNwZWNpYWwKdGhhbmtzIHRvIEFkYW0gQnJhbmQgYW5kIE1hcmlqbiBIYXZlcmJla2UgZm9yIHRoZWlyIGhlbHAgaW4gZGVidWdnaW5nCmFuZCBwcm92aWRpbmcgZm9yIHRoaXMgcGFyc2VyLjwvcD4KCjxkaXYgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nOiAwcHg7Ij4KPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMDAiIHJvd3M9IjIwIiBzdHlsZT0id2lkdGg6MTAwJSI+CiMgTGl0ZXJhbHMKMTIzNAowLjBlMTAxCi4xMjMKMGIwMTAxMDAxMTEwMAowbzAxMjM0NTY3CjB4MDk4NzY1NDMyMWFiY2RlZgojIEVycm9yIExpdGVyYWxzCi4wYjAwMAowLjBlCjBlCgojIFN0cmluZyBMaXRlcmFscwonRm9yXCcnCiJHb2RcIiIKIiIic28gbG92ZWQKdGhlIHdvcmxkIiIiCicnJ3RoYXQgaGUgZ2F2ZQpoaXMgb25seSBiZWdvdHRlblwnICcnJwondGhhdCB3aG9zb2V2ZXIgYmVsaWV2ZXRoIFwKaW4gaGltJwonJwoKIyBJZGVudGlmaWVycwpfX2FfXwphLmIKYS5iLmMKIyBFcnJvciBJZGVudGlmaWVycwphLgoKIyBPcGVyYXRvcnMKKyAtICogLyAlICYgfCBeIH4gPCA+Cj09ICE9IDw9ID49IDw+IDw8ID4+IC8vICoqCmFuZCBvciBub3QgaW4gaXMKCiMgRGVsaW1pdGVycwooKSBbXSB7fSAsIDogYCA9IDsgQCAuICMgQXQtc2lnbnMgYW5kIHBlcmlvZHMgcmVxdWlyZSBjb250ZXh0Cis9IC09ICo9IC89ICU9ICY9IHw9IF49Ci8vPSA+Pj0gPDw9ICoqPQoKIyBLZXl3b3JkcwphcyBhc3NlcnQgYnJlYWsgY2xhc3MgY29udGludWUgZGVmIGRlbCBlbGlmIGVsc2UgZXhjZXB0CmZpbmFsbHkgZm9yIGZyb20gZ2xvYmFsIGlmIGltcG9ydCBsYW1iZGEgcGFzcyByYWlzZQpyZXR1cm4gdHJ5IHdoaWxlIHdpdGggeWllbGQKCiMgUHl0aG9uIDIgS2V5d29yZHMgKG90aGVyd2lzZSBJZGVudGlmaWVycykKZXhlYyBwcmludAoKIyBQeXRob24gMyBLZXl3b3JkcyAob3RoZXJ3aXNlIElkZW50aWZpZXJzKQpub25sb2NhbAoKIyBUeXBlcwpib29sIGNsYXNzbWV0aG9kIGNvbXBsZXggZGljdCBlbnVtZXJhdGUgZmxvYXQgZnJvemVuc2V0IGludCBsaXN0IG9iamVjdApwcm9wZXJ0eSByZXZlcnNlZCBzZXQgc2xpY2Ugc3RhdGljbWV0aG9kIHN0ciBzdXBlciB0dXBsZSB0eXBlCgojIFB5dGhvbiAyIFR5cGVzIChvdGhlcndpc2UgSWRlbnRpZmllcnMpCmJhc2VzdHJpbmcgYnVmZmVyIGZpbGUgbG9uZyB1bmljb2RlIHhyYW5nZQoKIyBQeXRob24gMyBUeXBlcyAob3RoZXJ3aXNlIElkZW50aWZpZXJzKQpieXRlYXJyYXkgYnl0ZXMgZmlsdGVyIG1hcCBtZW1vcnl2aWV3IG9wZW4gcmFuZ2UgemlwCgojIEV4YW1wbGUgU3RyaWN0IEVycm9ycwpkZWYgZG9lc05vdGhpbmcoKToKICAgcGFzcyAjIGluZGVudFVuaXQgaXMgc2V0IHRvIDQgYnV0IHRoaXMgbGluZSBpcyBpbmRlbnRlZCAzCgojIFNvbWUgRXhhbXBsZSBjb2RlCmltcG9ydCBvcwpmcm9tIHBhY2thZ2UgaW1wb3J0IFBhcmVudENsYXNzCgpAbm9uc2Vuc2VEZWNvcmF0b3IKZGVmIGRvZXNOb3RoaW5nKCk6CiAgICBwYXNzCgpjbGFzcyBFeGFtcGxlQ2xhc3MoUGFyZW50Q2xhc3MpOgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGV4YW1wbGUoaW5wdXRTdHIpOgogICAgICAgIGEgPSBsaXN0KGlucHV0U3RyKQogICAgICAgIGEucmV2ZXJzZSgpCiAgICAgICAgcmV0dXJuICcnLmpvaW4oYSkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWl4aW4gPSAnSGVsbG8nKToKICAgICAgICBzZWxmLm1peGluID0gbWl4aW4KCjwvdGV4dGFyZWE+CjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKCdjb2RlJywgewogICAgICAgIHBhcnNlcmZpbGU6IFsiLi4vY29udHJpYi9weXRob24vanMvcGFyc2VweXRob24uanMiXSwKICAgICAgICBzdHlsZXNoZWV0OiAiY3NzL3B5dGhvbmNvbG9ycy5jc3MiLAogICAgICAgIHBhdGg6ICIuLi8uLi9qcy8iLAogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIHRleHRXcmFwcGluZzogZmFsc2UsCiAgICAgICAgaW5kZW50VW5pdDogNCwKICAgICAgICBwYXJzZXJDb25maWc6IHsncHl0aG9uVmVyc2lvbic6IDIsICdzdHJpY3RFcnJvcnMnOiB0cnVlfQogICAgfSk7Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/js/parsepython.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIFB5dGhvblBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiB3b3JkUmVnZXhwKHdvcmRzKSB7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgd29yZHMuam9pbigifCIpICsgIikkIik7CiAgICB9CiAgICB2YXIgREVMSU1JVEVSQ0xBU1MgPSAncHktZGVsaW1pdGVyJzsKICAgIHZhciBMSVRFUkFMQ0xBU1MgPSAncHktbGl0ZXJhbCc7CiAgICB2YXIgRVJST1JDTEFTUyA9ICdweS1lcnJvcic7CiAgICB2YXIgT1BFUkFUT1JDTEFTUyA9ICdweS1vcGVyYXRvcic7CiAgICB2YXIgSURFTlRJRklFUkNMQVNTID0gJ3B5LWlkZW50aWZpZXInOwogICAgdmFyIFNUUklOR0NMQVNTID0gJ3B5LXN0cmluZyc7CiAgICB2YXIgQllURVNDTEFTUyA9ICdweS1ieXRlcyc7CiAgICB2YXIgVU5JQ09ERUNMQVNTID0gJ3B5LXVuaWNvZGUnOwogICAgdmFyIFJBV0NMQVNTID0gJ3B5LXJhdyc7CiAgICB2YXIgTk9STUFMQ09OVEVYVCA9ICdub3JtYWwnOwogICAgdmFyIFNUUklOR0NPTlRFWFQgPSAnc3RyaW5nJzsKICAgIHZhciBzaW5nbGVPcGVyYXRvcnMgPSAnKy0qLyUmfF5+PD4nOwogICAgdmFyIGRvdWJsZU9wZXJhdG9ycyA9IHdvcmRSZWdleHAoWyc9PScsICchPScsICdcXDw9JywgJ1xcPj0nLCAnXFw8XFw+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFw8XFw8JywgJ1xcPlxcPicsICdcXC9cXC8nLCAnXFwqXFwqJ10pOwogICAgdmFyIHNpbmdsZURlbGltaXRlcnMgPSAnKClbXXt9QCw6YD07JzsKICAgIHZhciBkb3VibGVEZWxpbWl0ZXJzID0gWydcXCs9JywgJ1xcLT0nLCAnXFwqPScsICcvPScsICclPScsICcmPScsICdcXHw9JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXF49J107CiAgICB2YXIgdHJpcGxlRGVsaW1pdGVycyA9IHdvcmRSZWdleHAoWycvLz0nLCdcXD5cXD49JywnXFw8XFw8PScsJ1xcKlxcKj0nXSk7CiAgICB2YXIgc2luZ2xlU3RhcnRlcnMgPSBzaW5nbGVPcGVyYXRvcnMgKyBzaW5nbGVEZWxpbWl0ZXJzICsgJz0hJzsKICAgIHZhciBkb3VibGVTdGFydGVycyA9ICc9PD4qLyc7CiAgICB2YXIgaWRlbnRpZmllclN0YXJ0ZXJzID0gL1tfQS1aYS16XS87CgogICAgdmFyIHdvcmRPcGVyYXRvcnMgPSB3b3JkUmVnZXhwKFsnYW5kJywgJ29yJywgJ25vdCcsICdpcycsICdpbiddKTsKICAgIHZhciBjb21tb25rZXl3b3JkcyA9IFsnYXMnLCAnYXNzZXJ0JywgJ2JyZWFrJywgJ2NsYXNzJywgJ2NvbnRpbnVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVmJywgJ2RlbCcsICdlbGlmJywgJ2Vsc2UnLCAnZXhjZXB0JywgJ2ZpbmFsbHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICdmb3InLCAnZnJvbScsICdnbG9iYWwnLCAnaWYnLCAnaW1wb3J0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFtYmRhJywgJ3Bhc3MnLCAncmFpc2UnLCAncmV0dXJuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAndHJ5JywgJ3doaWxlJywgJ3dpdGgnLCAneWllbGQnXTsKICAgIHZhciBjb21tb250eXBlcyA9IFsnYm9vbCcsICdjbGFzc21ldGhvZCcsICdjb21wbGV4JywgJ2RpY3QnLCAnZW51bWVyYXRlJywKICAgICAgICAgICAgICAgICAgICAgICAnZmxvYXQnLCAnZnJvemVuc2V0JywgJ2ludCcsICdsaXN0JywgJ29iamVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5JywgJ3JldmVyc2VkJywgJ3NldCcsICdzbGljZScsICdzdGF0aWNtZXRob2QnLAogICAgICAgICAgICAgICAgICAgICAgICdzdHInLCAnc3VwZXInLCAndHVwbGUnLCAndHlwZSddOwogICAgdmFyIHB5MiA9IHsndHlwZXMnOiBbJ2Jhc2VzdHJpbmcnLCAnYnVmZmVyJywgJ2ZpbGUnLCAnbG9uZycsICd1bmljb2RlJywKICAgICAgICAgICAgICAgICAgICAgICAgICd4cmFuZ2UnXSwKICAgICAgICAgICAgICAgJ2tleXdvcmRzJzogWydleGVjJywgJ3ByaW50J10sCiAgICAgICAgICAgICAgICd2ZXJzaW9uJzogMiB9OwogICAgdmFyIHB5MyA9IHsndHlwZXMnOiBbJ2J5dGVhcnJheScsICdieXRlcycsICdmaWx0ZXInLCAnbWFwJywgJ21lbW9yeXZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ29wZW4nLCAncmFuZ2UnLCAnemlwJ10sCiAgICAgICAgICAgICAgICdrZXl3b3Jkcyc6IFsnbm9ubG9jYWwnXSwKICAgICAgICAgICAgICAgJ3ZlcnNpb24nOiAzfTsKCiAgICB2YXIgcHksIGtleXdvcmRzLCB0eXBlcywgc3RyaW5nU3RhcnRlcnMsIHN0cmluZ1R5cGVzLCBjb25maWc7CgogICAgZnVuY3Rpb24gY29uZmlndXJlKGNvbmYpIHsKICAgICAgICBpZiAoIWNvbmYuaGFzT3duUHJvcGVydHkoJ3B5dGhvblZlcnNpb24nKSkgewogICAgICAgICAgICBjb25mLnB5dGhvblZlcnNpb24gPSAyOwogICAgICAgIH0KICAgICAgICBpZiAoIWNvbmYuaGFzT3duUHJvcGVydHkoJ3N0cmljdEVycm9ycycpKSB7CiAgICAgICAgICAgIGNvbmYuc3RyaWN0RXJyb3JzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbmYucHl0aG9uVmVyc2lvbiAhPSAyICYmIGNvbmYucHl0aG9uVmVyc2lvbiAhPSAzKSB7CiAgICAgICAgICAgIGFsZXJ0KCdDb2RlTWlycm9yOiBVbmtub3duIFB5dGhvbiBWZXJzaW9uICInICsKICAgICAgICAgICAgICAgICAgY29uZi5weXRob25WZXJzaW9uICsKICAgICAgICAgICAgICAgICAgJyIsIGRlZmF1bHRpbmcgdG8gUHl0aG9uIDIueC4nKTsKICAgICAgICAgICAgY29uZi5weXRob25WZXJzaW9uID0gMjsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbmYucHl0aG9uVmVyc2lvbiA9PSAzKSB7CiAgICAgICAgICAgIHB5ID0gcHkzOwogICAgICAgICAgICBzdHJpbmdTdGFydGVycyA9IC9bXCdcInJiUkJdLzsKICAgICAgICAgICAgc3RyaW5nVHlwZXMgPSAvW3JiXS87CiAgICAgICAgICAgIGRvdWJsZURlbGltaXRlcnMucHVzaCgnXFwtXFw+Jyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHkgPSBweTI7CiAgICAgICAgICAgIHN0cmluZ1N0YXJ0ZXJzID0gL1tcJ1wiUlVydV0vOwogICAgICAgICAgICBzdHJpbmdUeXBlcyA9IC9bcnVdLzsKICAgICAgICB9CiAgICAgICAgY29uZmlnID0gY29uZjsKICAgICAgICBrZXl3b3JkcyA9IHdvcmRSZWdleHAoY29tbW9ua2V5d29yZHMuY29uY2F0KHB5LmtleXdvcmRzKSk7CiAgICAgICAgdHlwZXMgPSB3b3JkUmVnZXhwKGNvbW1vbnR5cGVzLmNvbmNhdChweS50eXBlcykpOwogICAgICAgIGRvdWJsZURlbGltaXRlcnMgPSB3b3JkUmVnZXhwKGRvdWJsZURlbGltaXRlcnMpOwogICAgfQoKICAgIHZhciB0b2tlbml6ZVB5dGhvbiA9IChmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBub3JtYWwoc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgICAgICB2YXIgc3RyaW5nRGVsaW0sIHRocmVlU3RyLCB0ZW1wLCB0eXBlLCB3b3JkLCBwb3NzaWJsZSA9IHt9OwogICAgICAgICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAKICAgICAgICAgICAgZnVuY3Rpb24gZmlsdGVyUG9zc2libGUodG9rZW4sIHN0eWxlSWZQb3NzaWJsZSkgewogICAgICAgICAgICAgICAgaWYgKCFwb3NzaWJsZS5zdHlsZSAmJiAhcG9zc2libGUuY29udGVudCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mKHRva2VuKSA9PSBTVFJJTkdDT05URVhUKSB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB7Y29udGVudDogc291cmNlLmdldCgpLCBzdHlsZTogdG9rZW59OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHBvc3NpYmxlLnN0eWxlIHx8IHN0eWxlSWZQb3NzaWJsZSkgewogICAgICAgICAgICAgICAgICAgIHRva2VuLnN0eWxlID0gc3R5bGVJZlBvc3NpYmxlID8gc3R5bGVJZlBvc3NpYmxlIDogcG9zc2libGUuc3R5bGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocG9zc2libGUuY29udGVudCkgewogICAgICAgICAgICAgICAgICAgIHRva2VuLmNvbnRlbnQgPSBwb3NzaWJsZS5jb250ZW50ICsgdG9rZW4uY29udGVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBvc3NpYmxlID0ge307CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEhhbmRsZSBjb21tZW50cwogICAgICAgICAgICBpZiAoY2ggPT0gJyMnKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgewogICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJ3B5LWNvbW1lbnQnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNoYXJzCiAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnKSB7CiAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgewogICAgICAgICAgICAgICAgICAgIHZhciB3aGl0ZXNwYWNlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZighKC9bXHNcdTAwYTBdLy50ZXN0KHNvdXJjZS5uZXh0KCkpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghd2hpdGVzcGFjZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JDTEFTUzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJ3B5LXNwZWNpYWwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEhhbmRsZSBvcGVyYXRvcnMgYW5kIGRlbGltaXRlcnMKICAgICAgICAgICAgaWYgKHNpbmdsZVN0YXJ0ZXJzLmluZGV4T2YoY2gpICE9IC0xIHx8IChjaCA9PSAiLiIgJiYgIXNvdXJjZS5tYXRjaGVzKC9cZC8pKSkgewogICAgICAgICAgICAgICAgaWYgKGRvdWJsZVN0YXJ0ZXJzLmluZGV4T2Yoc291cmNlLnBlZWsoKSkgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wID0gY2ggKyBzb3VyY2UucGVlaygpOwogICAgICAgICAgICAgICAgICAgIC8vIEl0IG11c3QgYmUgYSBkb3VibGUgZGVsaW1pdGVyIG9yIG9wZXJhdG9yIG9yIHRyaXBsZSBkZWxpbWl0ZXIKICAgICAgICAgICAgICAgICAgICBpZiAoZG91YmxlT3BlcmF0b3JzLnRlc3QodGVtcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRDaGFyID0gc291cmNlLnBlZWsoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFyICYmIHRyaXBsZURlbGltaXRlcnMudGVzdCh0ZW1wICsgbmV4dENoYXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFTElNSVRFUkNMQVNTOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QRVJBVE9SQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRvdWJsZURlbGltaXRlcnMudGVzdCh0ZW1wKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVMSU1JVEVSQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gSXQgbXVzdCBiZSBhIHNpbmdsZSBkZWxpbWl0ZXIgb3Igb3BlcmF0b3IKICAgICAgICAgICAgICAgIGlmIChzaW5nbGVPcGVyYXRvcnMuaW5kZXhPZihjaCkgIT0gLTEgfHwgY2ggPT0gIi4iKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QRVJBVE9SQ0xBU1M7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNpbmdsZURlbGltaXRlcnMuaW5kZXhPZihjaCkgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ0AnICYmIHNvdXJjZS5tYXRjaGVzKC9cdy8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHdcZF9dLyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7c3R5bGU6J3B5LWRlY29yYXRvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogc291cmNlLmdldCgpfTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVMSU1JVEVSQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JDTEFTUzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBIYW5kbGUgbnVtYmVyIGxpdGVyYWxzCiAgICAgICAgICAgIGlmICgvXGQvLnRlc3QoY2gpIHx8IChjaCA9PSAiLiIgJiYgc291cmNlLm1hdGNoZXMoL1xkLykpKSB7CiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICcwJyAmJiAhc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzb3VyY2UucGVlaygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ28nOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdPJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvWzAtN10vKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJQb3NzaWJsZShMSVRFUkFMQ0xBU1MsIEVSUk9SQ0xBU1MpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnWCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swLTlBLUZhLWZdLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyUG9zc2libGUoTElURVJBTENMQVNTLCBFUlJPUkNMQVNTKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYic6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0InOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bMDFdLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyUG9zc2libGUoTElURVJBTENMQVNTLCBFUlJPUkNMQVNTKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvXGQvKTsKICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnLicgJiYgc291cmNlLnBlZWsoKSA9PSAnLicpIHsKICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9cZC8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gR3JhYiBhbiBleHBvbmVudAogICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5tYXRjaGVzKC9lL2kpKSB7CiAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLnBlZWsoKSA9PSAnKycgfHwgc291cmNlLnBlZWsoKSA9PSAnLScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5tYXRjaGVzKC9cZC8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9cZC8pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJQb3NzaWJsZShFUlJPUkNMQVNTKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBHcmFiIGEgY29tcGxleCBudW1iZXIKICAgICAgICAgICAgICAgIGlmIChzb3VyY2UubWF0Y2hlcygvai9pKSkgewogICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlclBvc3NpYmxlKExJVEVSQUxDTEFTUyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSGFuZGxlIHN0cmluZ3MKICAgICAgICAgICAgaWYgKHN0cmluZ1N0YXJ0ZXJzLnRlc3QoY2gpKSB7CiAgICAgICAgICAgICAgICB2YXIgcGVlayA9IHNvdXJjZS5wZWVrKCk7CiAgICAgICAgICAgICAgICB2YXIgc3RyaW5nVHlwZSA9IFNUUklOR0NMQVNTOwogICAgICAgICAgICAgICAgaWYgKChzdHJpbmdUeXBlcy50ZXN0KGNoKSkgJiYgKHBlZWsgPT0gJyInIHx8IHBlZWsgPT0gIiciKSkgewogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY2gudG9Mb3dlckNhc2UoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdiJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1R5cGUgPSBCWVRFU0NMQVNTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVHlwZSA9IFJBV0NMQVNTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3UnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVHlwZSA9IFVOSUNPREVDTEFTUzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgc3RyaW5nRGVsaW0gPSBjaDsKICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLnBlZWsoKSAhPSBzdHJpbmdEZWxpbSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShpblN0cmluZyhzdHJpbmdUeXBlLCBzdHJpbmdEZWxpbSkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLnBlZWsoKSA9PSBzdHJpbmdEZWxpbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVlU3RyID0gc3RyaW5nRGVsaW0gKyBzdHJpbmdEZWxpbSArIHN0cmluZ0RlbGltOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoaW5TdHJpbmcoc3RyaW5nVHlwZSwgdGhyZWVTdHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1R5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICInIiB8fCBjaCA9PSAnIicpIHsKICAgICAgICAgICAgICAgICAgICBzdHJpbmdEZWxpbSA9IGNoOwogICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UucGVlaygpICE9IHN0cmluZ0RlbGltKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKGluU3RyaW5nKHN0cmluZ1R5cGUsIHN0cmluZ0RlbGltKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UucGVlaygpID09IHN0cmluZ0RlbGltKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWVTdHIgPSBzdHJpbmdEZWxpbSArIHN0cmluZ0RlbGltICsgc3RyaW5nRGVsaW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShpblN0cmluZyhzdHJpbmdUeXBlLCB0aHJlZVN0cikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBIYW5kbGUgSWRlbnRpZmllcgogICAgICAgICAgICBpZiAoaWRlbnRpZmllclN0YXJ0ZXJzLnRlc3QoY2gpKSB7CiAgICAgICAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW1x3XGRfXS8pOwogICAgICAgICAgICAgICAgd29yZCA9IHNvdXJjZS5nZXQoKTsKICAgICAgICAgICAgICAgIGlmICh3b3JkT3BlcmF0b3JzLnRlc3Qod29yZCkpIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gT1BFUkFUT1JDTEFTUzsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5d29yZHMudGVzdCh3b3JkKSkgewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSAncHkta2V5d29yZCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVzLnRlc3Qod29yZCkpIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ3B5LXR5cGUnOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gSURFTlRJRklFUkNMQVNTOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChzb3VyY2UucGVlaygpID09ICcuJykgewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLm1hdGNoZXMoaWRlbnRpZmllclN0YXJ0ZXJzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1tcd1xkXS8pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVSUk9SQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3b3JkID0gd29yZCArIHNvdXJjZS5nZXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJQb3NzaWJsZSh7c3R5bGU6IHR5cGUsIGNvbnRlbnQ6IHdvcmR9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUmVnaXN0ZXIgRG9sbGFyIHNpZ24gYW5kIFF1ZXN0aW9uIG1hcmsgYXMgZXJyb3JzLiBBbHdheXMhCiAgICAgICAgICAgIGlmICgvXCRcPy8udGVzdChjaCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJQb3NzaWJsZShFUlJPUkNMQVNTKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGZpbHRlclBvc3NpYmxlKEVSUk9SQ0xBU1MpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaW5TdHJpbmcoc3R5bGUsIHRlcm1pbmF0b3IpIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgICAgICAgICAgIHZhciBtYXRjaGVzID0gW107CiAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHdoaWxlICghZm91bmQgJiYgIXNvdXJjZS5lbmRPZkxpbmUoKSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCksIG5ld01hdGNoZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGVzY2FwZWQgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UucGVlaygpID09ICdcbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gdGVybWluYXRvci5jaGFyQXQoMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHRlcm1pbmF0b3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gbWF0Y2hlc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmNoYXJBdCgwKSA9PSBjaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUobm9ybWFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01hdGNoZXMucHVzaChtYXRjaC5zbGljZSgxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyA9IG5ld01hdGNoZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzdGFydFN0YXRlKSB7CiAgICAgICAgICAgIHJldHVybiB0b2tlbml6ZXIoc291cmNlLCBzdGFydFN0YXRlIHx8IG5vcm1hbCk7CiAgICAgICAgfTsKICAgIH0pKCk7CgogICAgZnVuY3Rpb24gcGFyc2VQeXRob24oc291cmNlKSB7CiAgICAgICAgaWYgKCFrZXl3b3JkcykgewogICAgICAgICAgICBjb25maWd1cmUoe30pOwogICAgICAgIH0KCiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplUHl0aG9uKHNvdXJjZSk7CiAgICAgICAgdmFyIGxhc3RUb2tlbiA9IG51bGw7CiAgICAgICAgdmFyIGNvbHVtbiA9IDA7CiAgICAgICAgdmFyIGNvbnRleHQgPSB7cHJldjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICBlbmRPZlNjb3BlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICBzdGFydE5ld1Njb3BlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogMCwKICAgICAgICAgICAgICAgICAgICAgICBuZXh0OiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE5PUk1BTENPTlRFWFQKICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBwdXNoQ29udGV4dChsZXZlbCwgdHlwZSkgewogICAgICAgICAgICB0eXBlID0gdHlwZSA/IHR5cGUgOiBOT1JNQUxDT05URVhUOwogICAgICAgICAgICBjb250ZXh0ID0ge3ByZXY6IGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgZW5kT2ZTY29wZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgc3RhcnROZXdTY29wZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGxldmVsLAogICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZQogICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBwb3BDb250ZXh0KHJlbW92ZSkgewogICAgICAgICAgICByZW1vdmUgPSByZW1vdmUgPyByZW1vdmUgOiBmYWxzZTsKICAgICAgICAgICAgaWYgKGNvbnRleHQucHJldikgewogICAgICAgICAgICAgICAgaWYgKHJlbW92ZSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5uZXh0ID0gbnVsbDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wcmV2Lm5leHQgPSBjb250ZXh0OwogICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGluZGVudFB5dGhvbihjb250ZXh0KSB7CiAgICAgICAgICAgIHZhciB0ZW1wOwogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24obmV4dENoYXJzLCBjdXJyZW50TGV2ZWwsIGRpcmVjdGlvbikgewogICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gbnVsbCB8fCBkaXJlY3Rpb24gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvbnRleHQubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQubmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5sZXZlbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGV2ZWwgPT0gY29udGV4dC5sZXZlbCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5uZXh0LmxldmVsOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQubGV2ZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gY29udGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRlbXAucHJldiAmJiB0ZW1wLnByZXYubGV2ZWwgPiBjdXJyZW50TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wLnByZXY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXAubGV2ZWw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMZXZlbCA+IGNvbnRleHQubGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQubGV2ZWw7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0LnByZXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IGNvbnRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0ZW1wLnByZXYgJiYgdGVtcC5wcmV2LmxldmVsID49IGN1cnJlbnRMZXZlbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAucHJldjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcC5wcmV2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcC5wcmV2LmxldmVsOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXAubGV2ZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5sZXZlbDsKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIHZhciBpdGVyID0gewogICAgICAgICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vucy5uZXh0KCk7CiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IHRva2VuLnN0eWxlOwogICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSB0b2tlbi5jb250ZW50OwoKICAgICAgICAgICAgICAgIGlmIChsYXN0VG9rZW4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFRva2VuLmNvbnRlbnQgPT0gJ2RlZicgJiYgdHlwZSA9PSBJREVOVElGSUVSQ0xBU1MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uc3R5bGUgPSAncHktZnVuYyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0VG9rZW4uY29udGVudCA9PSAnXG4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wQ3R4ID0gY29udGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgZGlmZmVyZW50IHNjb3BlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09ICd3aGl0ZXNwYWNlJyAmJiBjb250ZXh0LnR5cGUgPT0gTk9STUFMQ09OVEVYVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnZhbHVlLmxlbmd0aCA8IGNvbnRleHQubGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodG9rZW4udmFsdWUubGVuZ3RoIDwgY29udGV4dC5sZXZlbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BDb250ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udmFsdWUubGVuZ3RoICE9IGNvbnRleHQubGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IHRlbXBDdHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuc3RyaWN0RXJyb3JzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5zdHlsZSA9IEVSUk9SQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm5leHQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0LmxldmVsICE9PSAwICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC50eXBlID09IE5PUk1BTENPTlRFWFQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgwICE9PSBjb250ZXh0LmxldmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wQ29udGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmxldmVsICE9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IHRlbXBDdHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5zdHJpY3RFcnJvcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uc3R5bGUgPSBFUlJPUkNMQVNTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgU2NvcGUgQ2hhbmdlcwogICAgICAgICAgICAgICAgc3dpdGNoKHR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIFNUUklOR0NMQVNTOgogICAgICAgICAgICAgICAgICAgIGNhc2UgQllURVNDTEFTUzoKICAgICAgICAgICAgICAgICAgICBjYXNlIFJBV0NMQVNTOgogICAgICAgICAgICAgICAgICAgIGNhc2UgVU5JQ09ERUNMQVNTOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC50eXBlICE9PSBTVFJJTkdDT05URVhUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoQ29udGV4dChjb250ZXh0LmxldmVsICsgMSwgU1RSSU5HQ09OVEVYVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQudHlwZSA9PT0gU1RSSU5HQ09OVEVYVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wQ29udGV4dCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN3aXRjaChjb250ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnLic6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnQCc6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGRlbGltaXRlcnMgZG9uJ3QgYXBwZWFyIGJ5IHRoZW1zZWx2ZXMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgIT09IHRva2VuLnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5zdHlsZSA9IEVSUk9SQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnOic6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbG9ucyBvbmx5IGRlbGltaXQgc2NvcGUgaW5zaWRlIGEgbm9ybWFsIHNjb3BlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LnR5cGUgPT09IE5PUk1BTENPTlRFWFQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhcnROZXdTY29wZSA9IGNvbnRleHQubGV2ZWwraW5kZW50VW5pdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICcoJzoKICAgICAgICAgICAgICAgICAgICBjYXNlICdbJzoKICAgICAgICAgICAgICAgICAgICBjYXNlICd7JzoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2Ugc3RhcnQgYSBzZXF1ZW5jZSBzY29wZQogICAgICAgICAgICAgICAgICAgICAgICBwdXNoQ29udGV4dChjb2x1bW4gKyBjb250ZW50Lmxlbmd0aCwgJ3NlcXVlbmNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJyknOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ10nOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ30nOgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBlbmQgYSBzZXF1ZW5jZSBzY29wZQogICAgICAgICAgICAgICAgICAgICAgICBwb3BDb250ZXh0KHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdwYXNzJzoKICAgICAgICAgICAgICAgICAgICBjYXNlICdyZXR1cm4nOgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBlbmQgYSBub3JtYWwgc2NvcGUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQudHlwZSA9PT0gTk9STUFMQ09OVEVYVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5lbmRPZlNjb3BlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IG91ciBjb2x1bW4KICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBhbnkgc2NvcGUgY2hhbmdlcwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5lbmRPZlNjb3BlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVuZE9mU2NvcGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcENvbnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0LnN0YXJ0TmV3U2NvcGUgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcCA9IGNvbnRleHQuc3RhcnROZXdTY29wZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhcnROZXdTY29wZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaENvbnRleHQodGVtcCwgTk9STUFMQ09OVEVYVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3bGluZXMgcmVxdWlyZSBhbiBpbmRlbnRhdGlvbiBmdW5jdGlvbiB3cmFwcGVkIGluIGEgY2xvc3VyZSBmb3IgcHJvcGVyIGNvbnRleHQuCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmluZGVudGF0aW9uID0gaW5kZW50UHl0aG9uKGNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIGN1cnJlbnQgY29sdW1uIGZvciBjZXJ0YWluIHNjb3Blcy4KICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICE9ICdcbicpIHsKICAgICAgICAgICAgICAgICAgICBjb2x1bW4gKz0gdG9rZW4udmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxhc3RUb2tlbiA9IHRva2VuOwogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgY29weTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgX2NvbnRleHQgPSBjb250ZXh0LCBfdG9rZW5TdGF0ZSA9IHRva2Vucy5zdGF0ZTsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0b2tlbml6ZVB5dGhvbihzb3VyY2UsIF90b2tlblN0YXRlKTsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gX2NvbnRleHQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gaXRlcjsKICAgIH0KCiAgICByZXR1cm4ge21ha2U6IHBhcnNlUHl0aG9uLAogICAgICAgICAgICBlbGVjdHJpY0NoYXJzOiAiIiwKICAgICAgICAgICAgY29uZmlndXJlOiBjb25maWd1cmV9Owp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChjKSAyMDA5LCBUaW1vdGh5IEZhcnJlbGwNCkFsbCByaWdodHMgcmVzZXJ2ZWQuDQoNClRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgZm9yIHVzZSBpbiBjb25uZWN0aW9uIHdpdGggdGhlDQpDb2RlTWlycm9yIHN1aXRlIG9mIG1vZHVsZXMgYW5kIHV0aWxpdGllcywgaG9zdGVkIGFuZCBtYWludGFpbmVkDQphdCBodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yLy4NCg0KUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLA0Kd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZQ0KZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCg0KKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlDQogIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUNCiAgZm9sbG93aW5nIGRpc2NsYWltZXIuDQoNCiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlDQogIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcg0KICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLg0KDQpUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQoiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MNCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFDQpDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsDQpJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLA0KQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOw0KTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUg0KQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUDQpMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTg0KQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFDQpQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/sql/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/sql/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/sql/css/sqlcolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmVkaXRib3ggewogIG1hcmdpbjogLjRlbTsKICBwYWRkaW5nOiAwOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxMHB0OwogIGNvbG9yOiBibGFjazsKfQoKLmVkaXRib3ggcCB7CiAgbWFyZ2luOiAwOwp9CgpzcGFuLnNxbC1rZXl3b3JkIHsKICBjb2xvcjogYmx1ZTsKfQoKc3Bhbi5zcWwtdmFyIHsKICBjb2xvcjogcmVkOwp9CgpzcGFuLnNxbC1jb21tZW50IHsKICBjb2xvcjogI0FBNzcwMDsKfQoKc3Bhbi5zcWwtbGl0ZXJhbCB7CiAgY29sb3I6IGdyZWVuOwp9CgpzcGFuLnNxbC1vcGVyYXRvciB7CiAgY29sb3I6IGJsdWU7Cn0KCnNwYW4uc3FsLXdvcmQgewogIGNvbG9yOiBibGFjazsKfQoKc3Bhbi5zcWwtZnVuY3Rpb24gewogIGNvbG9yOiBkYXJrb3JhbmdlOwp9CgpzcGFuLnNxbC10eXBlIHsKICBjb2xvcjogcHVycGxlOwp9CgpzcGFuLnNxbC1zZXBhcmF0b3IgewogIGNvbG9yOiAjNjY2NjY2Owp9CgpzcGFuLnNxbC1udW1iZXIgewogIGNvbG9yOiBkYXJrY3lhbjsKfQoKCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/sql/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2pzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogU1FMIGRlbW9uc3RyYXRpb248L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vY3NzL2RvY3MuY3NzIi8+CiAgPC9oZWFkPgogIDxib2R5IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyI+Cgo8cD5EZW1vbnN0cmF0aW9uIG9mIDxhIGhyZWY9ImluZGV4Lmh0bWwiPkNvZGVNaXJyb3I8L2E+J3MgU1FMCmhpZ2hsaWdodGVyLjwvcD4KCjxwPldyaXR0ZW4gYnkgSm9obiBCZW5lZGlrdHNzb24gKDxhIGhyZWY9IkxJQ0VOU0UiPmxpY2Vuc2U8L2E+KS48L3A+Cgo8ZGl2IGNsYXNzPSJib3JkZXIiPgo8dGV4dGFyZWEgaWQ9ImNvZGUiIGNvbHM9IjEyMCIgcm93cz0iNTAiPgpjcmVhdGUgdGFibGUgaWYgbm90IGV4aXN0cyB0YWJsZTEoCiAgYSAgYmlnaW50KDEzKSBub3QgbnVsbCBwcmltYXJ5IGtleSwKICBiICBjaGFyKDQpICAgIG5vdCBudWxsLAogIGMgIGNoYXIoNTApICAgbm90IG51bGwsCiAgZCAgaW50KDkpICAgICBub3QgbnVsbCwKKTsKCmluc2VydCBpbnRvIHRhYmxlMSB2YWx1ZXMgKDEyMzQ1Njc4OTAxMjMsICJiIiwgImMiLCAwKTsKCnNlbGVjdCBmcm9tX3VuaXh0aW1lKGEvMTAwMCksIGIsIGMsIG1pbihkKSBhcyBgdXNpbmdgCiAgZnJvbSB0YWJsZTEgdDEKICBsZWZ0IGpvaW4gdGFibGUyIHQyIHVzaW5nIChhKQogIC0tIGlubmVyIGpvaW4gdGFibGUzIHQzIG9uIHQzLl9hID0gdDEuYQogIGpvaW4gKAogICAgc2VsZWN0IGEsIGIsIGMKICAgIGZyb20gZGF0YQogICkgYXMgZm9vIG9uIGZvby5hID0gdDEuYQoKICB3aGVyZSBhICZndDsgMTAKICBhbmQgYiBsaWtlICclZm9vJwogIG9yIGMgPSAzLjE0MTU5CiAgYW5kIGQgJmx0OyAtMTUuNwogIG9yZGVyIGJ5IDEgZGVzYwo7CgpzZWxlY3QgQHRvdGFsIDo9IHN1bShkKSBmcm9tIGRhdGE7CjwvdGV4dGFyZWE+CjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSgnY29kZScsIHsKICAgIGhlaWdodDogIjQ1MHB4IiwKICAgIHBhcnNlcmZpbGU6ICIuLi9jb250cmliL3NxbC9qcy9wYXJzZXNxbC5qcyIsCiAgICBzdHlsZXNoZWV0OiAiY3NzL3NxbGNvbG9ycy5jc3MiLAogICAgcGF0aDogIi4uLy4uL2pzLyIsCiAgICB0ZXh0V3JhcHBpbmc6IGZhbHNlLAogIH0pOwo8L3NjcmlwdD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/sql/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/sql/js/parsesql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIFNxbFBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CgogIGZ1bmN0aW9uIHdvcmRSZWdleHAod29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKD86IiArIHdvcmRzLmpvaW4oInwiKSArICIpJCIsICJpIik7CiAgfQoKICB2YXIgZnVuY3Rpb25zID0gd29yZFJlZ2V4cChbCiAgICAiYWJzIiwgImFjb3MiLCAiYWRkZGF0ZSIsICJhZXNfZW5jcnlwdCIsICJhZXNfZGVjcnlwdCIsICJhc2NpaSIsCiAgICAiYXNpbiIsICJhdGFuIiwgImF0YW4yIiwgImF2ZyIsICJiZW5jaG1hcmsiLCAiYmluIiwgImJpdF9hbmQiLAogICAgImJpdF9jb3VudCIsICJiaXRfbGVuZ3RoIiwgImJpdF9vciIsICJjYXN0IiwgImNlaWwiLCAiY2VpbGluZyIsCiAgICAiY2hhcl9sZW5ndGgiLCAiY2hhcmFjdGVyX2xlbmd0aCIsICJjb2FsZXNjZSIsICJjb25jYXQiLCAiY29uY2F0X3dzIiwKICAgICJjb25uZWN0aW9uX2lkIiwgImNvbnYiLCAiY29udmVydCIsICJjb3MiLCAiY290IiwgImNvdW50IiwgImN1cmRhdGUiLAogICAgImN1cnJlbnRfZGF0ZSIsICJjdXJyZW50X3RpbWUiLCAiY3VycmVudF90aW1lc3RhbXAiLCAiY3VycmVudF91c2VyIiwKICAgICJjdXJ0aW1lIiwgImRhdGFiYXNlIiwgImRhdGVfYWRkIiwgImRhdGVfZm9ybWF0IiwgImRhdGVfc3ViIiwKICAgICJkYXluYW1lIiwgImRheW9mbW9udGgiLCAiZGF5b2Z3ZWVrIiwgImRheW9meWVhciIsICJkZWNvZGUiLCAiZGVncmVlcyIsCiAgICAiZGVzX2VuY3J5cHQiLCAiZGVzX2RlY3J5cHQiLCAiZWx0IiwgImVuY29kZSIsICJlbmNyeXB0IiwgImV4cCIsCiAgICAiZXhwb3J0X3NldCIsICJleHRyYWN0IiwgImZpZWxkIiwgImZpbmRfaW5fc2V0IiwgImZsb29yIiwgImZvcm1hdCIsCiAgICAiZm91bmRfcm93cyIsICJmcm9tX2RheXMiLCAiZnJvbV91bml4dGltZSIsICJnZXRfbG9jayIsICJncmVhdGVzdCIsCiAgICAiZ3JvdXBfdW5pcXVlX3VzZXJzIiwgImhleCIsICJpZm51bGwiLCAiaW5ldF9hdG9uIiwgImluZXRfbnRvYSIsICJpbnN0ciIsCiAgICAiaW50ZXJ2YWwiLCAiaXNfZnJlZV9sb2NrIiwgImlzbnVsbCIsICJsYXN0X2luc2VydF9pZCIsICJsY2FzZSIsICJsZWFzdCIsCiAgICAibGVmdCIsICJsZW5ndGgiLCAibG4iLCAibG9hZF9maWxlIiwgImxvY2F0ZSIsICJsb2ciLCAibG9nMiIsICJsb2cxMCIsCiAgICAibG93ZXIiLCAibHBhZCIsICJsdHJpbSIsICJtYWtlX3NldCIsICJtYXN0ZXJfcG9zX3dhaXQiLCAibWF4IiwgIm1kNSIsCiAgICAibWlkIiwgIm1pbiIsICJtb2QiLCAibW9udGhuYW1lIiwgIm5vdyIsICJudWxsaWYiLCAib2N0IiwgIm9jdGV0X2xlbmd0aCIsCiAgICAib3JkIiwgInBhc3N3b3JkIiwgInBlcmlvZF9hZGQiLCAicGVyaW9kX2RpZmYiLCAicGkiLCAicG9zaXRpb24iLAogICAgInBvdyIsICJwb3dlciIsICJxdWFydGVyIiwgInF1b3RlIiwgInJhZGlhbnMiLCAicmFuZCIsICJyZWxlYXNlX2xvY2siLAogICAgInJlcGVhdCIsICJyZXZlcnNlIiwgInJpZ2h0IiwgInJvdW5kIiwgInJwYWQiLCAicnRyaW0iLCAic2VjX3RvX3RpbWUiLAogICAgInNlc3Npb25fdXNlciIsICJzaGEiLCAic2hhMSIsICJzaWduIiwgInNpbiIsICJzb3VuZGV4IiwgInNwYWNlIiwgInNxcnQiLAogICAgInN0ZCIsICJzdGRkZXYiLCAic3RyY21wIiwgInN1YmRhdGUiLCAic3Vic3RyaW5nIiwgInN1YnN0cmluZ19pbmRleCIsCiAgICAic3VtIiwgInN5c2RhdGUiLCAic3lzdGVtX3VzZXIiLCAidGFuIiwgInRpbWVfZm9ybWF0IiwgInRpbWVfdG9fc2VjIiwKICAgICJ0b19kYXlzIiwgInRyaW0iLCAidWNhc2UiLCAidW5pcXVlX3VzZXJzIiwgInVuaXhfdGltZXN0YW1wIiwgInVwcGVyIiwKICAgICJ1c2VyIiwgInZlcnNpb24iLCAid2VlayIsICJ3ZWVrZGF5IiwgInllYXJ3ZWVrIgogIF0pOwoKICB2YXIga2V5d29yZHMgPSB3b3JkUmVnZXhwKFsKICAgICJhbHRlciIsICJncmFudCIsICJyZXZva2UiLCAicHJpbWFyeSIsICJrZXkiLCAidGFibGUiLCAic3RhcnQiLAogICAgInRyYW5zYWN0aW9uIiwgInNlbGVjdCIsICJ1cGRhdGUiLCAiaW5zZXJ0IiwgImRlbGV0ZSIsICJjcmVhdGUiLCAiZGVzY3JpYmUiLAogICAgImZyb20iLCAiaW50byIsICJ2YWx1ZXMiLCAid2hlcmUiLCAiam9pbiIsICJpbm5lciIsICJsZWZ0IiwgIm5hdHVyYWwiLCAiYW5kIiwKICAgICJvciIsICJpbiIsICJub3QiLCAieG9yIiwgImxpa2UiLCAidXNpbmciLCAib24iLCAib3JkZXIiLCAiZ3JvdXAiLCAiYnkiLAogICAgImFzYyIsICJkZXNjIiwgImxpbWl0IiwgIm9mZnNldCIsICJ1bmlvbiIsICJhbGwiLCAiYXMiLCAiZGlzdGluY3QiLCAic2V0IiwKICAgICJjb21taXQiLCAicm9sbGJhY2siLCAicmVwbGFjZSIsICJ2aWV3IiwgImRhdGFiYXNlIiwgInNlcGFyYXRvciIsICJpZiIsCiAgICAiZXhpc3RzIiwgIm51bGwiLCAidHJ1bmNhdGUiLCAic3RhdHVzIiwgInNob3ciLCAibG9jayIsICJ1bmlxdWUiCiAgXSk7CgogIHZhciB0eXBlcyA9IHdvcmRSZWdleHAoWwogICAgImJpZ2ludCIsICJiaW5hcnkiLCAiYml0IiwgImJsb2IiLCAiYm9vbCIsICJjaGFyIiwgImNoYXJhY3RlciIsICJkYXRlIiwKICAgICJkYXRldGltZSIsICJkZWMiLCAiZGVjaW1hbCIsICJkb3VibGUiLCAiZW51bSIsICJmbG9hdCIsICJmbG9hdDQiLCAiZmxvYXQ4IiwKICAgICJpbnQiLCAiaW50MSIsICJpbnQyIiwgImludDMiLCAiaW50NCIsICJpbnQ4IiwgImludGVnZXIiLCAibG9uZyIsICJsb25nYmxvYiIsCiAgICAibG9uZ3RleHQiLCAibWVkaXVtYmxvYiIsICJtZWRpdW1pbnQiLCAibWVkaXVtdGV4dCIsICJtaWRkbGVpbnQiLCAibmNoYXIiLAogICAgIm51bWVyaWMiLCAicmVhbCIsICJzZXQiLCAic21hbGxpbnQiLCAidGV4dCIsICJ0aW1lIiwgInRpbWVzdGFtcCIsICJ0aW55YmxvYiIsCiAgICAidGlueWludCIsICJ0aW55dGV4dCIsICJ2YXJiaW5hcnkiLCAidmFyY2hhciIsICJ5ZWFyIgogIF0pOwoKICB2YXIgb3BlcmF0b3JzID0gd29yZFJlZ2V4cChbCiAgICAiOj0iLCAiPCIsICI8PSIsICI9PSIsICI8PiIsICI+IiwgIj49IiwgImxpa2UiLCAicmxpa2UiLCAiaW4iLCAieG9yIiwgImJldHdlZW4iCiAgXSk7CgogIHZhciBvcGVyYXRvckNoYXJzID0gL1sqK1wtPD49Jnw6XC9dLzsKCiAgdmFyIHRva2VuaXplU3FsID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gbm9ybWFsKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgdmFyIGNoID0gc291cmNlLm5leHQoKTsKICAgICAgaWYgKGNoID09ICJAIiB8fCBjaCA9PSAiJCIpIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW1x3XGRdLyk7CiAgICAgICAgcmV0dXJuICJzcWwtdmFyIjsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiXCIiIHx8IGNoID09ICInIiB8fCBjaCA9PSAiYCIpIHsKICAgICAgICBzZXRTdGF0ZShpbkxpdGVyYWwoY2gpKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiLCIgfHwgY2ggPT0gIjsiKSB7CiAgICAgICAgcmV0dXJuICJzcWwtc2VwYXJhdG9yIgogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICctJykgewogICAgICAgIGlmIChzb3VyY2UucGVlaygpID09ICItIikgewogICAgICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICByZXR1cm4gInNxbC1jb21tZW50IjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoL1xkLy50ZXN0KHNvdXJjZS5wZWVrKCkpKSB7CiAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvXGQvKTsKICAgICAgICAgIGlmIChzb3VyY2UucGVlaygpID09ICcuJykgewogICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvXGQvKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAic3FsLW51bWJlciI7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiAic3FsLW9wZXJhdG9yIjsKICAgICAgfQogICAgICBlbHNlIGlmIChvcGVyYXRvckNoYXJzLnRlc3QoY2gpKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMob3BlcmF0b3JDaGFycyk7CiAgICAgICAgcmV0dXJuICJzcWwtb3BlcmF0b3IiOwogICAgICB9CiAgICAgIGVsc2UgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvXGQvKTsKICAgICAgICBpZiAoc291cmNlLnBlZWsoKSA9PSAnLicpIHsKICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvXGQvKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJzcWwtbnVtYmVyIjsKICAgICAgfQogICAgICBlbHNlIGlmICgvWygpXS8udGVzdChjaCkpIHsKICAgICAgICByZXR1cm4gInNxbC1wdW5jdHVhdGlvbiI7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1tfXHdcZF0vKTsKICAgICAgICB2YXIgd29yZCA9IHNvdXJjZS5nZXQoKSwgdHlwZTsKICAgICAgICBpZiAob3BlcmF0b3JzLnRlc3Qod29yZCkpCiAgICAgICAgICB0eXBlID0gInNxbC1vcGVyYXRvciI7CiAgICAgICAgZWxzZSBpZiAoa2V5d29yZHMudGVzdCh3b3JkKSkKICAgICAgICAgIHR5cGUgPSAic3FsLWtleXdvcmQiOwogICAgICAgIGVsc2UgaWYgKGZ1bmN0aW9ucy50ZXN0KHdvcmQpKQogICAgICAgICAgdHlwZSA9ICJzcWwtZnVuY3Rpb24iOwogICAgICAgIGVsc2UgaWYgKHR5cGVzLnRlc3Qod29yZCkpCiAgICAgICAgICB0eXBlID0gInNxbC10eXBlIjsKICAgICAgICBlbHNlCiAgICAgICAgICB0eXBlID0gInNxbC13b3JkIjsKICAgICAgICByZXR1cm4ge3N0eWxlOiB0eXBlLCBjb250ZW50OiB3b3JkfTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGluTGl0ZXJhbChxdW90ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKICAgICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpIHsKICAgICAgICAgICAgc2V0U3RhdGUobm9ybWFsKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHF1b3RlID09ICJgIiA/ICJzcWwtd29yZCIgOiAic3FsLWxpdGVyYWwiOwogICAgICB9OwogICAgfQoKICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UsIHN0YXJ0U3RhdGUpIHsKICAgICAgcmV0dXJuIHRva2VuaXplcihzb3VyY2UsIHN0YXJ0U3RhdGUgfHwgbm9ybWFsKTsKICAgIH07CiAgfSkoKTsKCiAgZnVuY3Rpb24gaW5kZW50U3FsKGNvbnRleHQpIHsKICAgIHJldHVybiBmdW5jdGlvbihuZXh0Q2hhcnMpIHsKICAgICAgdmFyIGZpcnN0Q2hhciA9IG5leHRDaGFycyAmJiBuZXh0Q2hhcnMuY2hhckF0KDApOwogICAgICB2YXIgY2xvc2luZyA9IGNvbnRleHQgJiYgZmlyc3RDaGFyID09IGNvbnRleHQudHlwZTsKICAgICAgaWYgKCFjb250ZXh0KQogICAgICAgIHJldHVybiAwOwogICAgICBlbHNlIGlmIChjb250ZXh0LmFsaWduKQogICAgICAgIHJldHVybiBjb250ZXh0LmNvbCAtIChjbG9zaW5nID8gY29udGV4dC53aWR0aCA6IDApOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIGNvbnRleHQuaW5kZW50ICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXJzZVNxbChzb3VyY2UpIHsKICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZVNxbChzb3VyY2UpOwogICAgdmFyIGNvbnRleHQgPSBudWxsLCBpbmRlbnQgPSAwLCBjb2wgPSAwOwogICAgZnVuY3Rpb24gcHVzaENvbnRleHQodHlwZSwgd2lkdGgsIGFsaWduKSB7CiAgICAgIGNvbnRleHQgPSB7cHJldjogY29udGV4dCwgaW5kZW50OiBpbmRlbnQsIGNvbDogY29sLCB0eXBlOiB0eXBlLCB3aWR0aDogd2lkdGgsIGFsaWduOiBhbGlnbn07CiAgICB9CiAgICBmdW5jdGlvbiBwb3BDb250ZXh0KCkgewogICAgICBjb250ZXh0ID0gY29udGV4dC5wcmV2OwogICAgfQoKICAgIHZhciBpdGVyID0gewogICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnMubmV4dCgpOwogICAgICAgIHZhciB0eXBlID0gdG9rZW4uc3R5bGUsIGNvbnRlbnQgPSB0b2tlbi5jb250ZW50LCB3aWR0aCA9IHRva2VuLnZhbHVlLmxlbmd0aDsKCiAgICAgICAgaWYgKGNvbnRlbnQgPT0gIlxuIikgewogICAgICAgICAgdG9rZW4uaW5kZW50YXRpb24gPSBpbmRlbnRTcWwoY29udGV4dCk7CiAgICAgICAgICBpbmRlbnQgPSBjb2wgPSAwOwogICAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5hbGlnbiA9PSBudWxsKSBjb250ZXh0LmFsaWduID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIndoaXRlc3BhY2UiICYmIGNvbCA9PSAwKSB7CiAgICAgICAgICBpbmRlbnQgPSB3aWR0aDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoIWNvbnRleHQgJiYgdHlwZSAhPSAic3FsLWNvbW1lbnQiKSB7CiAgICAgICAgICBwdXNoQ29udGV4dCgiOyIsIDAsIGZhbHNlKTsKICAgICAgICB9CgogICAgICAgIGlmIChjb250ZW50ICE9ICJcbiIpIGNvbCArPSB3aWR0aDsKCiAgICAgICAgaWYgKHR5cGUgPT0gInNxbC1wdW5jdHVhdGlvbiIpIHsKICAgICAgICAgIGlmIChjb250ZW50ID09ICIoIikKICAgICAgICAgICAgcHVzaENvbnRleHQoIikiLCB3aWR0aCk7CiAgICAgICAgICBlbHNlIGlmIChjb250ZW50ID09ICIpIikKICAgICAgICAgICAgcG9wQ29udGV4dCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlID09ICJzcWwtc2VwYXJhdG9yIiAmJiBjb250ZW50ID09ICI7IiAmJiBjb250ZXh0ICYmICFjb250ZXh0LnByZXYpIHsKICAgICAgICAgIHBvcENvbnRleHQoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgfSwKCiAgICAgIGNvcHk6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBfY29udGV4dCA9IGNvbnRleHQsIF9pbmRlbnQgPSBpbmRlbnQsIF9jb2wgPSBjb2wsIF90b2tlblN0YXRlID0gdG9rZW5zLnN0YXRlOwogICAgICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UpIHsKICAgICAgICAgIHRva2VucyA9IHRva2VuaXplU3FsKHNvdXJjZSwgX3Rva2VuU3RhdGUpOwogICAgICAgICAgY29udGV4dCA9IF9jb250ZXh0OwogICAgICAgICAgaW5kZW50ID0gX2luZGVudDsKICAgICAgICAgIGNvbCA9IF9jb2w7CiAgICAgICAgICByZXR1cm4gaXRlcjsKICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGl0ZXI7CiAgfQoKICByZXR1cm4ge21ha2U6IHBhcnNlU3FsLCBlbGVjdHJpY0NoYXJzOiAiKSJ9Owp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/sql/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IENvcHlyaWdodCAoYykgMjAwOSBKb2huIEJlbmVkaWt0c3NvbgoKIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCiB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55CiBkYW1hZ2VzIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCgogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiBwdXJwb3NlLCBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQKIHJlZGlzdHJpYnV0ZSBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CgogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdAogICAgbm90IGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzCiAgICBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0CiAgICBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCgogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdAogICAgbm90IGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KCiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UKICAgIGRpc3RyaWJ1dGlvbi4KCiBKb2huIEJlbmVkaWt0c3Nvbgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/css/csscolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmVkaXRib3ggewogIG1hcmdpbjogLjRlbTsKICBwYWRkaW5nOiAwOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxMHB0OwogIGNvbG9yOiBibGFjazsKfQoKcHJlLmNvZGUsIC5lZGl0Ym94IHsKICBjb2xvcjogIzY2NjY2NjsKfQoKLmVkaXRib3ggcCB7CiAgbWFyZ2luOiAwOwp9CgpzcGFuLmNzcy1hdCB7CiAgY29sb3I6ICM3NzAwODg7Cn0KCnNwYW4uY3NzLXVuaXQgewogIGNvbG9yOiAjMjI4ODExOwp9CgpzcGFuLmNzcy12YWx1ZSB7CiAgY29sb3I6ICM3NzAwODg7Cn0KCnNwYW4uY3NzLWlkZW50aWZpZXIgewogIGNvbG9yOiBibGFjazsKfQoKc3Bhbi5jc3MtaW1wb3J0YW50IHsKICBjb2xvcjogIzAwMDBGRjsKfQoKc3Bhbi5jc3MtY29sb3Jjb2RlIHsKICBjb2xvcjogIzAwNDQ5OTsKfQoKc3Bhbi5jc3MtY29tbWVudCB7CiAgY29sb3I6ICNBQTc3MDA7Cn0KCnNwYW4uY3NzLXN0cmluZyB7CiAgY29sb3I6ICNBQTIyMjI7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/docs.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ym9keSB7CiAgbWFyZ2luOiAwOwogIHBhZGRpbmc6IDNlbSA2ZW07CiAgY29sb3I6IGJsYWNrOwogIG1heC13aWR0aDogNTBlbTsKfQoKaDEgewogIGZvbnQtc2l6ZTogMjJwdDsKfQoKLnVuZGVybGluZSB7CiAgYm9yZGVyLWJvdHRvbTogM3B4IHNvbGlkICNDNDQ7Cn0KCmgyIHsKICBmb250LXNpemU6IDE0cHQ7Cn0KCmgzIHsKICBmb250LXNpemU6IDEycHQ7Cn0KCnAucmVsIHsKICBwYWRkaW5nLWxlZnQ6IDJlbTsKICB0ZXh0LWluZGVudDogLTJlbTsKfQoKZGl2LmJvcmRlciB7CiAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgcGFkZGluZzogM3B4Owp9Cgpjb2RlIHsKICBmb250LWZhbWlseTogY291cmllciwgbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogOTAlOwogIGNvbG9yOiAjMTQ0Owp9CgpwcmUuY29kZSB7CiAgbWFyZ2luOiAxLjFlbSAxMnB4OwogIGJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7CiAgY29sb3I6IGJsYWNrOwogIHBhZGRpbmc6IC40ZW07CiAgZm9udC1mYW1pbHk6IGNvdXJpZXIsIG1vbm9zcGFjZTsKfQoKLndhcm4gewogIGNvbG9yOiAjQzAwOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/jscolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmVkaXRib3ggewogIG1hcmdpbjogLjRlbTsKICBwYWRkaW5nOiAwOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxMHB0OwogIGNvbG9yOiBibGFjazsKfQoKcHJlLmNvZGUsIC5lZGl0Ym94IHsKICBjb2xvcjogIzY2NjY2NjsKfQoKLmVkaXRib3ggcCB7CiAgbWFyZ2luOiAwOwp9CgpzcGFuLmpzLXB1bmN0dWF0aW9uIHsKICBjb2xvcjogIzY2NjY2NjsKfQoKc3Bhbi5qcy1vcGVyYXRvciB7CiAgY29sb3I6ICM2NjY2NjY7Cn0KCnNwYW4uanMta2V5d29yZCB7CiAgY29sb3I6ICM3NzAwODg7Cn0KCnNwYW4uanMtYXRvbSB7CiAgY29sb3I6ICMyMjg4MTE7Cn0KCnNwYW4uanMtdmFyaWFibGUgewogIGNvbG9yOiBibGFjazsKfQoKc3Bhbi5qcy12YXJpYWJsZWRlZiB7CiAgY29sb3I6ICMwMDAwRkY7Cn0KCnNwYW4uanMtbG9jYWx2YXJpYWJsZSB7CiAgY29sb3I6ICMwMDQ0OTk7Cn0KCnNwYW4uanMtcHJvcGVydHkgewogIGNvbG9yOiBibGFjazsKfQoKc3Bhbi5qcy1jb21tZW50IHsKICBjb2xvcjogI0FBNzcwMDsKfQoKc3Bhbi5qcy1zdHJpbmcgewogIGNvbG9yOiAjQUEyMjIyOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/people.jpg</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAAAAgAAAAAAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAD0AK8DASIAAhEBAxEB/8QAHAAAAAcBAQAAAAAAAAAAAAAAAAIEBQYHCAMB/8QARxAAAQMDAwEFBQUDCQcEAwAAAQIDBAAFEQYSITEHEyJBURQyYXGBFUKRobEWI8EIM1JicpKistEkNENTc4LhFzXC8VSDk//EABsBAAEFAQEAAAAAAAAAAAAAAAYBAgMEBQcA/8QAOBEAAQMCBAMGAwgCAgMAAAAAAQACAwQRBRIhMQZBURNhcYGhwRQikRUWMkJSsdHwB+EjQzNT8f/aAAwDAQACEQMRAD8A2A9K7jaXTgH4Ub2tjPvc+lM2r7g1Btbk57PcspUp3A5CQM8Vm1zW2rg4dt9lhOeOQB+lUK3EI6QgPF79Fs4Tgk2JhzoyAB1Wp3JcdKtyia8NxijqVD6Vl0az1XsBXfJfP9elFs1JqmW/uOoJ+1PhUO89f4VSGPQk2yn0/lazuDqpouZB6/wtLKu0JKiNyiR6CiLvcJP/ADP7hrLrV5urd4kzIlxksuSHCHHO88Sk58yevlTmvVV7bcU2m9SlpI+8rkfOkZj8RHzNKWTg6dp+WQH6/wC1pEXqBjO9X92iJvtvzhTpB/smszr1PqRKSpN7kH5KApN+1OplnH21LGT5OUv29B+k+n8r33Nqv1j1/hahXe7fkbXT9EmjC9QCnPen5bTWYJGqdRFrYLvK3jg+PPFFb1TqAnx3eZtPlvpDj8P6T6L33Nqv1j1/hagN7gBSBudO444bJxxnn8KKq/21PvKcH/Yay9+0+o0P5+2JWwE8BzqCMV6jUupFL3C8SgT6rzXvt+Dk0+i8ODao/nHr/C09+0VszjvVj/8AWaMnUFtV7rqifTYazAvVF/WnCrpI6YyFYNERqO/oQUovEwZ55dJpv3giv+Apw4Mqrf8AkHqtSIvkBSsBxWf7NdBd4ZGQtWPlWWBqXUqVf++zAR6OGui9U6iDYUi+T9+fJ0077fh/SfRJ9zKr/wBjfX+FqRF0jKJG5QI+FepucVStqVkn5VlqNqvUqR+8vc7zz+9NHOr9R4wi8zkceTxr32/B+kpDwbVj84WpROZPQq/CjplNqPRX5VlRWrdUHOL/AHBOfR08UdrVWqggrOop/p/PGk+8EPJpTvuXVH/sb6/wtTuy2mgCtKhnpgda6NvoWgKGRnPUelZZterdTuXWKld+nuDvkZSXSQeRWm7StbsBpwYVkE5PrnmtCirmVYJaLWWHiuDyYa5rXuBv0SLVTaHI6G3EJW2sLCkKTkKGPMVmrRxs67043dVstJLCxHLydzSXfulQ80jng1prUoPsydqNxwv9DWZG3F21T0+I1HfjSkFl5p1vI2lQO0+fVIORg1hcTMMjABvYoh4SBdHMwG17e6kK7MwTCZv7MF2JKkhtm52lxttKVYPhUkI2kE4PQEYPJ6Uig2OBCuvsU5qe06/c/YWe7kpGGyQCo5bO7G5PPGc+WKajc03Blm1OKjWm3JcU9+6bWtPebSApWSpR8hwTjOcUrvWpXpGo4VzHdS1QW20oKwoIccSMleAQfe5HToMjyoLbHODlB5HqPDuueYCKhDPfL1B7vDuueYBXW62G2pt9/cguzEu2eSlpRdWlQdSpZRwAkYII9Tn4V01vGt++yNW+A6zIk21hwFC0kL3bhhSQgFSyceLPPpSB7UzzrF2Z+zYKRdVhyQR3mQoHIKfHxhWVefJ9MAc3dSTHGoWY0P2iE220zJ7slxKW1bkjk7evmBnHGeac2KfMHHl39w97qRkNRmDna27+oHvdOty0xb41tuE9puYyLe60HGHprLji0LVt5CAe6V/aB+uKLqKxWS3Whu5xjOcYmNIMIqeTnvOd+8bOAOOh5/HCI6sfWLi05abYpu4rSuUna6N6kqKgcheRyc8HH50JmqpMq2ybe9boBYfUFhOHP3RCQlJR4/DgD+ByOKRsdUCM3XrysO/rfy08GtjqwW5uvXlYd/W/lp4KeylxxGuoKUOKSlxLqVgHAUO7UcH1GQD8wKSybZbP2bYvkb2wtpn+yPNOOJysbN+5JCfDkeRCsfGkOnbu9Y7oi4xmGHn20qCO+CiEkjBOEkc4JHPHPyrv9vH7F+yPsuB7L7V7VjLud/pnf02+H5fHmpZIpO3zt20H0vf9wppIpe37Rmxyj6Zr/uFINTWOP9v6hlzZcx+PbUMFe0oS66pxKQkZCcAfHb5UW3QLfAlaTuttXOQ9cZ2Fb3k4QhLgQpGAkE5CsZz0zxzwjZ1Gu6Xa4Srg7boSZcZKHm1surZkKSQEhQSSpJA+8n+j8c0a8aiitCwot7UWQq0lxzhDiWStSgpISCQshOAcnqeueaqhk9mxOvtr0tl26fiVMR1FmxOvtY9LZNun4l01Ja4EtWp7lHVJRJt8797vUkoc7x1SeABkYPxOae0tm4az0umRIlJefsbag+haSsL2OEqO9KgrIyPrnPFRF3Uz7jF2ZNugAXVYckEd5kKByCnx8YVlXnyfTAChvWEtu5wbi3bLcl+BH9mj8O4SjGBkFfJAKhn+sc54wrqacsy25EDbm0D97pX0s5ZltsCBtzaB+9/JJ02u3RNPwLncTKcVcHHEtJYWlIbSghJUcg7jk9OPnUpgW+HZdR6ns0Z2Z7G3ZXFO73AorO1J3YAA4CyBnPnzzimC13CI9aUMTJdsaQ1KWtmNIjvr7hJwctqTnIzkbVk+7znNdLpq0HU94uMKCw8zcGhHPtAXnutoSR4VDG7aD6jyxzSysmlcW68/DcW+gullZPK5zLHn4fiFvoLo8K0Wtq4aWuCGn3IlzkFC47y0qIUhwI5O3BSSQcY5GRkZyFVniwHu1R2DEblQkh+QhKmnGzsWnfkpBbwE4BATjjPXimBeopJhWqK3FiNfZTneRnEBe7dncc5UQcqAJ48uMDiu8fVcli+pvLVstqJSVOLyELwVue8o+PJOMjGcDJwM8058E7g7qQ4DXvNvSykfBO5rupDgNe82v5WRodss40ei9y0z1Oif7KtDTyAlQ2bsjKDt4+fTyzwouelolvuN+MmRIchWlLRKWyEuOl3GwZIIHXk4PTpTb9vH7F+yPsuB7L7V7VjLud/pnf02+H5fHml6NRrul3uEq4O26EmZGCHm3GXlsyFJKdoUEkqSQOik/wBH45pzm1DXF2ttfpcbeV/qnObUtcXC9te/S428sw8/oqh2m0Q7fZbvEMzvJ61kh9xJDYQ4EYACRk5I5z5dOeNG2PP2WyT1xWb7ndYctiyW2GWlCCFBSmUKQ2St1BwkL8WAB1PJrR1gIVa2yM43KHP9o0ZcKlxhfn3ud+lzb0sgfinP/wAZde/zb9L6ei5aiSVRRj0V+hrKn2g4Yb0NxO5KlZCs88f/AFWsLyncwR5bVE/SslPDuXV90oOJUVeXQZPWpcf0LD4q/wAGNa7tAe73XAdM0KW6af06jVNub1g8uPaZKVlGxKtrpBKfEpPKQFDHxqc3t3sd3pbOnJ0RlCu775SJUdRI9FDg8EdaowYPJLH2hcGg9Vq1nFNNTzmGNpfbp7dVXDqu5QXF+EJG7n0oraJaYcOVKbaaRNC1MJSslRSnbkkEDHvAdT0NT+Dp7shmy0SHb/cFwkncuM5PSUHHO1X3znHTPNC8R4vaHa2JVqSzZJNoedaiNPjKX2FYJDhT7isgHPPWrLMGsx7SQX8gCqMvFOaaN7WlsQNnEjrsFAAcrwEnNHqRPaB1gwwXmbQm4N596FJbd/LIV+VR+S2/FmOQpkZ+LKb99l9soWPoax5qSeHWRpCKKbEqWq0hkDvAqVWW3WdjRxvs9uNLcM3ue5dceQNoQVbAUD3z5E5SARk5yKb/ANmJ/eez99F9v7nvvYtyu927d3ptzjnGc/CvftO3/sN9i7pXtnt3tee6T3fu7Nu7dnpznHXjHnTl+1ED9oP2m7qV9p9zt7janue87vu927OcY527frWKe3aXFtzcn0tYdwOtyoD8Q1zy25uTa/dbKO4HW59U3s6ZfXAt8tV0tjLFw3d0pxaxhSTgpV4OMHPPTjr0y3adhs3K+QYL73ctSH0NqVznBOMDg8noOMZIzxS+8XOBJ0vZrbHVK9pgd73hW0lKFd4rccEKJ4Ix0568dKa7JKTAu8OapBWI0hDpSOp2qBx+VWGdqY3EnXW31NvSysx9q6N5J11tp3m3pZSexWO1jtFNif7q4Q1Leb95xKm9m4gEjb4htGcZTycfBlk2GW1AYmsPR5bT0j2YdwpRKXcZ2HIHPxGR8aebdfbFD1sNQJ+0lJU6+8tBZRnLmQEgb+g3KJVnngYHWk8S926DptmDFXLclx7qme0pxhKUK2jaEnCyRwM9Dzx8arB07XAi50bv11v4clVa6oa8EXOjd+vzX8OSQSdOy2Uy9kqI+/CSVSo7SlFbQBAJOUgHBODtJxTPUrvWpW5iprzVxvahKSsCG48Qy0VdeQvxJGThO0DpnjgxSrVM6Vzf+Qf3+/0q5TOlc28g/v8Af6UKFChVlWUVRwlXOPSuaSd4zXRYyMnoK5qzwcceVLa6eLWS62HFyinOMPIOf+4VrPTyVJtiQrr3jn+c1kqD/vrH/UT+ta4soIgoBIPjX/mNEnD2ufyXP+NRrCfH2RLwf3XzQv8Aymso2aA9eL7DtTCyhcp/uwsI3bBySrHngAmtYXVIUzz1CFkfhWXNF3SFYtYQLrNU4mMy6rvVp+4lSVJJPw8QJ+AqfFg0zxB+yqcNvkjpKl0f4gBb1T12vtOacmadtFpvdohsR4hbRCuLHed+Qr30qKVBJ+OU/OmrW7yZt0taWg8w+mEl+QlBSqM54W0lSfPJJA+hp27ZdV6VvV2jR4uq4UCTbHT3pXAEttwKSD6Hgeo9ajV7uES56kjS4LrEiMzb0NLfZbUlC1KUg4AOMABOQMedaFTlNM7NsAh/DnO+PiLL3JCSBsBwAJSOR5UeM0thxclqW/FfSnCVtOKQVDzBKTz8q9c5eO0jrXJ5xSjtJ4FAschbq02IXZJYmStLHAEJdE1JqeIlSI97WoH3Q+yhWPqAFH8aVXC+XjU3Z2Jt7jsmXCuyG2JKeu0laVtg9SMAKwf4UzEh1IwnCkDp8PWvC/c0WpiyKnBVrZlKmJY7tOe8Vv53gZI/eK4Pw9K1afE39m9kziQQbeKHazAYe2hmpGBrmuBNtNEWhQouFZHPFZCJlIYel3ZVgcvabrbkQ2lBDyld9ltR2+EgNnJ8Q6ZHxrhc9OzYVrbuqHo0yCtW3v4yypKT6EEAj6ipPptMdXZDeUynXWmfbk7lNNhahyzjCSpIPPxFN7V1gP2OPo+zIkhE6Wjv5MoJB3FSRwkE4HCfPy+NZbaiYvdbUB1jppawN79f7ZZLamcvdbUNdY6aZbA3v1/tlD9wzjkfE9K9qxJWnLDE1GuzymYTEFLWFTXbkhMhKyjduKCvGMnGNnx6U0WqwQGdPXq+SymemA/7Oy2hwhtw7kjeSk5I8QIwfWpm18Tm3F9bW777f0qduIwuaHAHW1ttb7f0qJpxnxZx8K8qVP2iBP0K9qKLGEJ+LI7l1pC1KbWDt5G4kg+MefkaX6shWK02OxT2LIwp+fH71xCn3u7HhQTgb89Vcc/PNO+NYXBoBuSRy3Av16J3x7C4MDTckjluBfr0UQtMJVxuUeA280yuQsNoU5nbuPABwCeTgdPOul/tciy3Z+2SltLeZ27lNklJykKGMgHofSpZMskK26k0ncIAW2xcnWHgypW7uzuQSAeuPEOvoaXXKxMag7XLjDlOKSw20h1YScFQDbYwD8yKg+Pbnzfkyk99wbKv9otz5/yZSe+4ICrZXTFOytNTv2UGo/aIvsgXs7vervM7tvTGPj16U+O2e0S7Hc3nU262S4ye8ipj3JDxeSASUkb1c8DkYznpSRuao9lvsJQ9u+0857pWzZsz72Nud3lnNSuqHPAMf6gD4Kc1bngdlp8wB8O62ij8EZmsD1cT+ta4sgSm3gI6BavPP3jWSrSkLusRCuin0A/3hWtrNkQikpxhxY/xGjPh4H5z4IP41cM0I8fZEupG1OR/w1856cCsiqK1rUoqA+nFa6ueMDcMju1/wrJKikOkpUCM9RTeITbIncFC5l8vdR2LZWrZC1bc2oja22beJDK1EEtrU6lBxk9PF/8AVS7T4TK7N2nUIAIc79ZJAyMAZz58EDHwqB6j1fKtk28WdMVpxifb/ZlleQRlQUFpweoKRSuDfp180hB0XYYpMlTZakPO7QkNg+XoPzrWo43T0WSXciyG8TnbSYqZoBo11+nipIycKPBGRXJR5yBmmrT7Mu3SJ9pfkplJgPBlDmCM+EE9eeCeM07g5IAHJ9BQZPAaeQxHkur4fVNraZlQBYOF0VC1IJUBg4NAkHlIwMdK4PTIzboaXJaStRwElYyfpXdstqZICVd4lXiO4EY8uPWoi0jkpzJGXaHVChRkIKs48hmjym+7cKc8A9PSkTr62T1D1Q7GsDljTarcuG6oLeSrvsuKG3xEhwYPhHTA+FMLa1NuJcQopWkgpUDggjzryhUbImMvlG+6jZCyO+Ub7qQO6rmvTm7i9Ct7txbACZam1b8gcKwFbCR6lNJLdf7hDRMaJbksTTmSy+CpLhznJwQQfiCKaqFMFNEBbLomCmiAy5dP428E6z77Kk2tFraaYhwUr7zuGArCleqiolR+pqW60uURvTOnY6BabkY0cNyGjICy2sIQB/NrCscK6HHTPlVe0KjfSMc5pGliT43UT6NjnMcNMpJ8bi26epGpbhIvUO6SG47ioW32djaUtN7fdwEkHg4PXyGcjijydVXN3Un7QMpYizSkJX3QVtXgY5CifLA+g8+aYVEBJ458q9eWyUrVylZV4U7cJ21KKWLSzRtby6KX4WEW+Xlby6J5dvzpjy2osKFA9rSUyFx0q3LT1KfEo7QT5DFczqa4/swNOfufYyvcTs8fvbsZz0zz0zTSC0YxSFL7zIx4Rt+PPX0rmEgrGSd3w86d8NFYXHf58intpoju3Y38+qX2j/3aHn/no/zCtcQvC0pISffUevqayPZ8fa8PPT2hH+YVrmBwyQMnxq5Pzor4d2f5ID42/HF4H2XG5jwdf+Ev69KyApSd5yNvPStf3MgJBIzhtf6Csf7dylZI6mmcRD8HmpOCTczeXuq37TEJY1Bv4UHI6SAeqcEilWgry1Zb3MuCN6kogvKGOmRyB+IFJO04hWokpCyrawkc+XJP8ajLTziQsE+8naflWzhmlMw9yFsescQmHK6svQ0l962TbhNUpJflOOlajweBuP60gu98l3m8MWK1pdjh11CC8TtJCsDn0HPnS6JdIVo7L7O2l9pq4vuuqQD4sJKjkqx0GAMUp7DxJvWt4sNaYjUJ1SkSe7KUuykkng5yojnJ8gB8qrNwsfGPlkFxuFoS8QP+y46aA5SNCoo1py6B+aW7ZPeEEKXKXswG0pPKgvkfjXsSUtMJp+JKmMyinckEEh4ZAwD5knPGD7prTfa5f9M2DTLdgdgpaipWloJVG/2VI64UkAbxnkgAj1INVK3dNF27UzF8m3dq5ynFhuM3CjBliMB4QdileEgdCceZrSETHg3CHfiJYXfKdVw0zLXMsXtzpHtKVltxvBCkcdVZ+NOcte6TvJJ3oCqsWLCsV30zOu1qyEz4x9occCTucaSDvBSSP6PIJqt3VBSWSfNsfqaDsWpWQTXZsV1PhjEH1tKe1N3NNvdeUKFCspEiFA9eOlCvD06Zry8vaFeqxk7QQPLNFJwM15eQUSBkHBFSbs3isSpd2nzihxmFCCQ2obipSyQD8MbVfiKi6yCkgGrH0NbWonZhLujqwF3KSQCkY3NoVtQM/MLP1rWwenEs9zyQ7xTWmkoTY2JP/wBVbqKGysnOxKsDPn6VYGmtMw7FaV6h1aG2chPcx3leFpKiEhawOhyoYHl+kS0Tf2tNakkxVWWPcFOzg3GkPAqdZO8A4JyANpPQA5qQ64vQasq3rmoy413Q9bpZJ39ysM72ClPllY5+QxitmnwgQOMkmpQpifE0tW1tPDdoNvEps1H7CjXqWLa0huM3KbQEo6EhYya1TEG1ojJPiNY4sjjyrhbXJHLpca7z+1kVsSE4FtLIB4WRXsGLXPlLdrp/FMbo46Zrjc5db9dFzuWO6Of+WusfHhxSR0ya2BdMBo/2F4/CsglGXTng5NVOIdcnmr/BI1l8vdVd2jKJ1KvJ6NN/LB4qPymTHcSkqSslO7jy56VKe0uG41e48vG5t9KUj5pPI/Oo7cT3j4Kk7Vbc4HzrZw1wdSsI6IUx1pbiEwd1/dJCtagkEkgDABPTp/4q/wD+SXabe+5KvBbQ7ObmNxjvcUO7aUMg7R1yoDrxxVDQ3UNupK0hQByc/T/SrV0dqGVonUkTV8CM25bpMdDcyNnaNpwM/MEZB/1qeadrHNYfzbKrBSOmifI38tr+HVaG13onR13uv2pebY9NmrTkAKccIbQOQE5wPj6/OqCuQYvt/wBTW6LaXY6pcxuTDY9m2raCBt2Og/zeR6+dalvMBq/WRxhE1+KZCE4kR17XEZIOM+h8x51R+oLOoanlWqVEkRwyjiamG2wp8AjH7wLKlZ+X4U+EZjlKrz6fMpN2aKtCNCyIDFrTAAkKRJadBGwFGHFcccpH6VW76QQ13fujISfhnipffrw7bLK7bIoSDOTh5ZO47UnGB9RioWlZCNo4HWhfHpmOmEY/KukcGU0rKUzv0D9h4X1XuSFYNGrl5811rARk4IUKFCvJqFFUfu48jRq5OImTZkW02mKZdxlna2hPISPNavRI9amgidK8NaFBU1EdNGZJDYBce+K5zFtjp7+fKOyOwk+Jaj0+nnn0Bqfa4vDPZ9pGy6QkH7QmbFynSlWAhZUSE48kkqVg/wBWmftIFv7KU6dlWhxq4XmK689JDwyt3e2UBxWAdrYUeB8fnVeWRq53efIvN9lOvzJRLjpdzlKfr09AKMqDD2UjS7c81y7GcYfikoZl+UGwHjopjadPl0/aF3kBYdX3wQ2spAJOc5/DpXe+PwU2aPZIkdgx25HfrJbBJUEgA7upPX8ab5ElyVnJKG0ABtvOQkY6VxSAlYJJx6ZrMxDGu0uyEWHVEeDcKdjIJ6l1yNm8vNKbMgOXSKTnwvNngf1hWv7cnDLmcfzqv1rJNhQTeWC2tSU94gkA8KG9JwfxrW8EAB4D/mZ/wipOH9GvVPjU3li8D7JPdnEo27jjKVgfhWRSdyzg4561rPUCkpLW4ZG1zHz21khKyFk48+lRcQ/kU/BP/YfD3UL7TnE+02xg+JQcKvmMgfwqMavS23PbQ2hCB3KcgHzGc09dpIc+24bqz4O6wkgcjB5+vSmLULivakEEEbTyoDOd6h/CtbCxalYAhjiNxdiMl+Vv2TPtz6VYGiYUnWDjdiamoZTGYQtEQjK5e1QKwk9AQnJANQMrSQSrGfWnqxT5Vg1FDucJa0PxFIeHl5cj5HJH1q6+JryC4bbLJiqJI2ua02zaFah7TIt/dgwtZ9mdwkCVGCYsyC14u8A4G5s5G5HQ5HQg1T69T3idqm5yNQS7jGuTEdSpTaorbRQE7QEBXUbiUgYHn1q29CzpN/t7uptHS2rddkrIuEOWP9lmddu4DlKsffT9c1W+v+/l9qzH2nbFWx+4OMuTlrcSphQaHRtY4Ujwg5ODnAOMUsd8yhlN2pfPchsQrJZ3pbbd2TB7xyOsEKdK1rWSkn3iOQR14pF4cZHNN0qEnW/agh21rWqLDj92uWhJ2JWkLKVZ6EbinjzxTDqHUGotOXV61XaFEXJQQrvEIUkKSckFPOMH5Vh4nhEk0pli57o04c4qipqdtPU302I6KXp65rok5+dMNi1FGucUuPbYzqQCtClAcH7wJ8qc2ZkR5pTrUllbaDhSkrBA+ZoclppGGzgugQV0FQwPY8EFKt2CQeflRnihC9oVu4H44pjumoLbCYDxkoeGcBDKwpRNRe/6xVMhqjwm3GAr31qxux8MVYp8Nmn2bYKhXY7RUTSXvueg5qfxvbZ9zatNnjGbdH890wn7gBwVrPkkfGpxeLvpzsYsbjClNXTV05oqWrAKueQFH7rYPQDk4rPum9a6h06EmyzjEeLoccdCQpbuOiVKOcp/q9D55rpGRdtY6jlXK5SVyFqIfmPqHOM4ASB5nolIx5UVUeHtpW2bqeq5vi2NyYjJcizeQ/lIJsi86gvRlS3pMudMOcqJUpeT0Hw/0qSQdO6vjuNKmMSY8RDqS4HnQAcHOACeanuldMtWIuXy8d2JxThttr3WE44QnPn8f/NGuU6Rc17lZSlsZQjPT/zUeIV8dOwsvdx5Kxw/gstbMJjowHU+HJNwSkEnGMjyoAZr3rg5JzRsBPnQXuuuW1S/T2PtuID/AE0jj+0DWuLerIeOD/OfwFZCtfgvEIAEOd+kH+8K1zaOW3/+sf0FE3D+rXjwXOuNhaSK3Q+yR6lGEMn4LH+E/wClZLCOevnWtNTZU2zgdCvP9w1koJ5yrPB6VHj5sWX71LwYbCXy91D+0+OgwIsk53NvbPoR/wCKiup2GWVR1NJUAtKiCrz8ajU07Ro7rtgUpKSpKHApWPujBH8aadXWxb1qs89CCGX2nA4ojhCknn9avYLJmpgOhWJxYy2Ik2tcBQttsuJO0c9BmltxVtua0o6JCUk/IDP51zcQUlKm8pSkjaT5/GivsubtxJUVc59a2ENAWUwserrtb7Qu1217uEuq3rUgeJRxjA9KeHYU11mLA1HJeetdxKFRZnJVGfPTOemRkYquEv7AkpQUlJ6/EVZelrqdVaKuVikHE1hje0T94J5BHxyB+NSxWOirzXDdE63K16glOuWbTbn2HZYayxyVIVIcABK+OTnOMk1DtaNSJ2noS50SY1NtCTAeeUO8bf8AGVAlYOQrC/PqB1qyNFXRV505EmLVvdSnu3DjopPUfp+NOdwtzFxtsuE+gKRKb2r9cjofpgfhU/Ytc26rNncx1iFnaU+2tphDUVLK2wd7m9Siv8TgD5V7GbkSHURIyVqceUEBCc+Ik+lOtmsUi46gdsqmiJDbb6fgFIBI/MY+tSCPaE6W0p9tyw4LxO/cQW+P3IPClYHJOOPrVQRA6ELQMpaNCVDmLVJkXgWqOEPye9LWG+RkdTn0Hma4XBhEac9HZfTJQ2opDqUkJXjqRnyzViWvTcjTnZ9c73MR3E+Qx3SCoZLaVnGPgpWfyHxpl7OdHS9Q3FuRJZULa2crUrPjx90fxpxYAbJgkJBPJRSLFfky2orDZW+6oIQgdVE9BWh9F6Sh6asLTUoocmFwPvuHhIUBgfRIJx8Tmu1s0barffF3liKEPLSlCOmxsBOCQP1NItS3EyXRGju7mUe8oH3z/pVWvnbSR5ideS1MGoJMUqRE0WbuT0Se83L7QkfuwUspJ2A9VfE0jYUpD6VISVKB4A865JGK9yQ14ffzkUBSyulcXO3K7PT0sVLEIoxYBdXo7rC1pU2pIScc1wPvDOQAec0ollzv1hLiykY6mi5WdpJBI9RUV1P+Vd4Km1XyM8nke1IUB6+MGtc2tISh8Dp3p/yprI9qSkXKIAlP+8Nc454VWuoZKQ6APvjP90UT8P6h9u5c841/HF4H2SW/kFpHHTd/kNZIPiWQOMHmta6lKG4YJJ53D/Cay23AckPn2dvvCtRASDyfl61FxALlnmn8HSNaJST0902vQvbWXIhPhdQUH05HU/KpH2a2ODrPS8/RU4tARGkvwJH/ABEuhIQpfxBwjim25sOQZHsxwFbQo4+NeaZuD2k9f2W7tkJhzHvZ5AUcJDbm1Jz8ikGo8BlyudGpeL4GyRR1A5G3kq31FpiXZbpNtVxaIfiOltw48J5wCPgeoppkx21T2o7PiwjJyeB0rd8u2W6U8XpUCI+4Ud2VraSoqTnODnqM881nDtp7Mbn+3Mp/SFnUuK7DEp1tkABCt21QSPPPBx86Jg++65+5tjoqQLCXIdzWSAph1soAHGCVA/wo+l7suy3uNPRkJQcOD1Qeop30pAdkjUcMIUt1m2vOrG3kFGM/hn8qiIG1IKTxnH1qVrrWIUDm6aq6+z0NQpN6gtOBTaZgeQP6i0JINSwrPeYSSkKP4VU3ZrdHF6giMuHl+GqOSTjcUHKSfjg4+gqzlrWADnk1oROBbcLPlb82qTWvT6Y3aa3fWUqDMqM73oI4S4NoyPmP40+OaWbm6j+2J6++VG4iND3Gh6gevxrtZ5O1te8btg3dPhz+lIZOrnFZESK0hBHCnMrPzx0/Ksytro6W2c7rawzCarEiRA29tzfZLdR6cYv6IzE54ot0VfeOMpICXFj3dyvQen51ykXe0WyOWYTSZDjY2oSkbWk/XqfypgnXadNQUPzHljPKQrCfwFIaG6zH3uNoRbvKO8M4Kijs6sOYjkNv9pXdbzcbgr/aZCtgGAhI2pA9BikCQTn8qOODkE/jXtYMk75Dd5uUbQwRQNyxNDR3Iu0cUZGEqCsZwc0KFQ3UqO4UqUtfQqOcfjmiUKFeXkqs6FOXeIhHXvkH5c1riGtOHf7Q/QCsm2khE+GNwRueRzjn3hWr7fhYUTzhWM/QGinh/RjyO5c+40IMkfcD7Ju1ipSYCB13OKA/uKrLUWS/GklxhwoGcn485rU+sEFcNjHk6T/gVWUW3CB0GKi4gJBZZScFtBbLfu90pny35bvfSFlXOE5GAkdcU2doNxkRNDsPMJQosvd2FKSCQDuP6gU7Qtjm87ApQHGfL40j1JC9v0Vco4bLi0oWpIH9JJQQfzrJw6Ux1DXIjxqlbPRPjaNlpPQs1V10fZrg8sLXJgsuLV18RQM/nTsppPebsJJBHOOSKrH+TDcXpfZXDhSVI9ptzi2FpC9xSkncjOOh2mrQ4HXJJ/KjR2jjZcoFrBZm7KdOtvau7T1tNkiPHmQmVdBucUvj54QPxqh4UFb9puElIwmIhLqyPPLiEAfma3FoXS0ax268uYK3bxPfmP8Ax3KO0D5JI/E1jdLDrGltSbElDbkyKyB81Oqx/h/Spm7lVnNNrleaFaMjWFmioAQG3t5UB1G3Jq5nEpUvanOM45qoNHvC39ocYKSAS6WMHyy3j9cVcG4tuBSDg+Rq9AdLLNqdHhSZhuEhgtMNu7tgTuUMbiRUAWhtJUFFQUjO5J81DyqVWqSoMukqKlo8WSc54NQ0rU4AtZypRKlfEmhbiUgFnXX2XRf8fZnGYcvl910TjaMDFe15nDe7HGcUEkkdKEzuukW5r2hQoUiRCjpACCVA88A0Shk4xk4pQbJCujrqlp2/dByPWghQJAKQCT1xXOhXrk7r1kthgG8xfEDiSjryPeFassW4sKKjnx/ltFZMt4xcYpBx+/R/mFaw06sLjOEeTmPwAoo4fPyPt1C59xmLOiHcfZF1WtDcBKl8DeR/gVWTdyQ1swOvWtV62O6zpwf+KP0NZVcZ2nepeVjqPX1+tR8Qi2RT8EOsJR4e6PHdSg5T6YNO1tdYTZZ5kr2NpQVKUTzjaT/8RTIFeqab7/LUppMJK9mUlwkdDgFI48+orFoI+1naxE+OT/DUb5VPf5H8KQw1qOR3hEN9bJbR5bgV5/7gMcehq/1JCutRvstssaw6FtUCNGSwTGQ48PNTigFKJPrk1JsUbOIvYLkLbnU81yVwknaVYGdoPJ+A+NZc7QLND/8AS2HIZCIjlw1Cp9SO72lxLSFoyfTzrU/AOSKz9/KFtS2LbpXTsFZS8p2Q5gqJyVqSk/m6akh3AUcoFrlZ8QHkT7Vc1fzj1xWrPxC04/WrzfA75QR0BIFU3gRtOaceeHiFxUpWPPChn9KszUU82+6Wx0uLDD8lTLqc/wBJPB+hFakRygnwWLUXc4DxUm0+gKLqDwTwPrUSKCh5baxhaCQoehBxUvsqVBTqsHhQ58hzUZuiSi6ywoYJfWefIZzQvxOy7GP8V0L/AB5L88zOoHof9rhQoUKDl05ChQoV5eQoU92axfaNinT0vbHI7yG0pI4O5Kic/QUwNOtPth6M8iQyfdcR0UPhn48VM6nkawSEaHZVYq2CWZ0DXfM3cLpR2WH3yQww46UgqVsTnaB1JPQAepp8tulZUtmQZcyPbXW46nwy+oJdKB97B90ZxyrA5psuUO9GKWFx3o1pIRvbjOFxt8gAb3HB72eu3hPwqeOkdlzyaD1VeTEWuf2cFnHrewHn7BKLRCiOx2pT1ya75MppCmmUFYSVHIBV0zxzjODWntKf7k8OeHj1+QrMVhjuuQVlhClkXKKEpQnOOF5xitRafASw9xgFzP8AhFEeDsAa7KLDRBHFrnZow52Yi/skOvsJsIIzkOjGPkazFc2nG3vGpPPv+qT6fOtNdoqj+z2U9Q+j+NZjLi32thwAD4/RWOlVeIdcnmrfBd7yeSTHHln5GozMf7ztFtEFHJcCEhJ6FReH+lSRxIOCOmKi1kSzM7dbFHkbVNmUw2UkcHJzg/iKoYE29VfoCtfjCXLhtuZcFtZkbUhOAMJAwPLijg4oYIWrOPoK8opO65sgrkGqw7Q7S7du1PSyQEFlmLJeWCeTsKSBj03FHNWWpSQeVCm+VAYVeEXbq+iKqMjzwCsKJ/FIpzSQdEyRuZtisUahiLToG3ykkYiTnFH4hSiB+dP/AGry9mn7e+0oFS5CSF/9meK7XlmMvQkxhx1r3nTsKwDw6T09abNbOx5mgbU9vQlS+52pz08JBrXcPlJB5LCBJe3Tn6K1tJz2pdmZKgAHUIcSr5gE0g1pD7uSxNTyl5PdrPQ70/D5EUz9lLiX9HR0g7u63NcfA8VK7k8yqwzG5YIabSHdxGdoT1/LNZuLU3xNKQNxqFucN15oMSY47E2PmocFDO09fSvcjz4rs3Ek3dRd05DcnNZ/nSQ0yM+iz1x6YzTZLTa4DvcX6/rflg4Vb7MkrI+BVjP4baDocHqZRmIyjvXU6vimgg+VpL3dG6pakJcUG0SY4eV7jKnAlxfH3Qev0robZdXLHMuH2c/HQylJQZCdu8lWD4fexjnJxSK2O3J2YmNpPTMW3qdOEvzEl+Uo+uM8fUkVKLpYZUG2ORdYSkXJ9xYUr7RfTHjMqHkkJw44f6qePia1oMPoGak5iN+iHa3G8YlBDGiMHa/4rev7J40U1Cj6KueL/EmI9uaDkgAJbQQhQwnBJV8hk1E9PSdPWvS8VNluxjLJU0J9xj7SohXVvG4N5O4eIbuPKpXZpkV2wTe6jP3UNrbQ24EojMxxhXhR4QQk/wBVsfM9aZdU3m4WLsq0wqB7BAS9cRHRB9nRI9nGXDkrd3Er88gDgitCaJskALNGjzWBTVctPWu7U5nusDra9yN9NQnDS2nbk41c7glxh2O9DdSuWqR4VLOCMrUc5PrTVGXAtJ7xWoHXXk8Fq0J7459C5kIH4mmic4u4O7p8mROWkk7n3VOAc+QJIT9AKMg5UlCeSRhKB1PoBQu+aO4DATbqulR4fUkHO4NB5NHTvOnopDD1tcvaY8WJa4bLTryUOPSSHX3BnGVbQlOcE+taVsC9zDqcDhzbwf6qazDGsqIT8aRepBiqW4lTUZACnlcjBIHuDPrzWltJulyJIUfJ/wD+IrewmV7w4OFtkFcT00EJZ2JJve5+myS6/SRYHM+6HkEk/OswqWltIbAUMnJH6VqDXqwuxLbKCQXEAn/urONyhrbXlLCjuGQcZ6np+FV8dhe9rXtF7KXhKriic9j3WLrel0jmKadYQlI5IB6Y2nzHxqJdj8RF4/lFQCv3GJi3iNwH82klI5+ITUsfhvIaS45lsKHh3JPJ9OPOq70sTP7brW00paUi9NBICjnh0Z/Sq+BxPjqHh4sbK9xdPFLRxmJ2YZj6BbnPXzpFeXp0e3uO22GiZKSMtsre7oKPpuwcUuc4WaIryreO6CBss2dr+re2VKA4qyzNO2+OFFbkF3vARkcrcBPA58hVLTda6ukqKX9T3dzBPWYv1+day/lJXAW3siu+xzu1ye7jp2kjO5fP5A1izaWVlC0bSPI+VWGkEbKvK4tdZGkPF1DZWpRWCStSjkrUeck0nUSo55GPKnt+1qhacTc31FDktW1hBHVA6n8f0pk6mnuaRuoQU/WPVN+tDfdQ7pIaQkk90TlJ+GDVlaO7THHDi/WhQSjAW6wgjcD1O08fnQ7KIVndtSLgxCbXJWCHHHAFKSv05HT/AFqwZ0Fq5WiTDXGbcWUhxtO0A7k8jH51LLnhjc+97BQQ5J5mxnS5tdQZSZk9K3595nTGXcKbZXhtoo+6ChPB4x1pY5crK0pxqTFTA3qSe97pSEFOB0Vj/WiOOqWtS1JJJ8umK7N61mQx7JN01JfipASFsPJcyAMZKTigykc2vkeKmSw5arq+IxHCKeN9FAHHmR4b/VSO1OOROzPWMm0zkoUIQUzIaUkKSonBwtOfT/xTJbLY1JZakPpS248hKlSUqCVOKKRknqFflTNqC76Iuenrg5bX0Qrq42UJQpK4y9wPQ4wkjr1NPjdnuK3vtCwX+JNQDw0/hYAxwneg9B0HH41tnDXtibHEQ4DyQizHmPqZJpwWuI33sVIdOsiHp64xil5aVyWVJUEEJSAFdT05z5GorqFSrb2S9nrRYZEpyetmSHG0lSkpKyArPPpz1pdYb9dLQy7ab3CkNGUveytkJfQruwVK93C8geWK66anWW5o0zZN6S66ZHesyu7LjJS6NhVwFAnco+uKtwx5aYRgZd1n1tW2XEDMXdoNNdr7IyLLHumkZSnA3b2nso9ocBOzke71UrnyA4zUh09apFkjxTaYiBHZYUl2ZMQEvOK2KwfFwlJOMbSfiaZblqK5XrSk1t+/vxkp7xoPQnV4CQrAUB1HxBximy2R5DNpZjLuC5oCAUyA6Fd5wOTk81SrouxgZ8tz1AWtg1UayslGfKDqA4kjwTm1Agybi0/cnItvkl0Ky1LDveKz5pySCf7VX7oPd9mvdVAyFc/QYrNEBlkXNjdhKw8jOxI5O4dQDitJ9njp+ypAKTkSD+gqPC7HNbuVriZpHZNPQ+HLZedo7y06ZfW5+7QFt+L/ALhVe6Sg2e+6QlXhLinw0pwIUFEDhI8qsfXsWXcdOOxozPfuKWghCOuAeagGg9J3fTmlnbGzDkOMPuLdUXQQpJUAMcfKtg3tohNwzEKDYZksJS6AQpYOQSCOKrHsSgtS/wCUBEQ0D3TU998HrgI3qA/ECr9/YSXHSN7EpSWzzsQcn8qYdA9mKtIawXqWK3cpT6g6A25FUEgrPJ4HoSPrSuYC7PbVV4hI0dmT8o28VejygkDJrmFbqj71yvDiQfsiRj/or/0oqbreUowLPI//AIOf6VD2ZV4PFlVn8rB5+bE0/p6EFPvyZKnjHB4XgBKc/VeKzjNtDkrVz9nYWqQ6ZKmlrHmQcKI+Fa3u2n5F01lD1PLt89UmG2ENMGMooBBUd3u9cnP0FQW0djiLRenbrGF5kPLUo5XHIGScnoKnjZa11UlubkKlu1p1tOoGbTHUO5gMpZSPIEdfr5/WoWsjvVeQx51o+/8AYam53aVcHF3sKkLK8CL0JxjyorH8n6P36FvKvDiB1SY2Mj6Cnvu43TGss2yrXsQu6Yd+Xb33QGpQ8AWeN4GRj4mr2iOIYnMPY3I3eKog32CJiz2pbDt93NO94jbF93B46irEj6Wuq43cC13AjqFKaKT+lP3bYqN8Rz5mqC3SyOJ1C9HZZcUyolaDjgg89elIlWG6qJT7OlPP3nEj+NWZcdNageCEItk1koRgrDfebqbk6C1XKadCLjc4oI//AA2kkfLKSawvsGmJJcSi9nF+INYI2BoAFuaj9403Zbb2F6gkKtMBF0MV9xchLaSv30/e+tcdB9ndgf09PfuEJPtTcNt1p5hSmltnaTnKTz9amh0deHtFTdKzk3WUJLDjTktbY7whSgrIxxxjFItMdn1+04ZZYu19l+1IS2sSY3e4Sn08h9K0WQNbl7tlhzVUshcTb5t9P26KEWLSeof2cF3c1E+J8Ve1LM1pEhtO4lPB4UAUgdD50zwrvebqLWzO0mzdzcY6n2kwiVLQlLpbKilWdvKT51ddt0zckW6RbTGnLDqkLKywU42/Pim3RvZ5O05OivxzcHDHhmIkOMDGwvl4+XXKttWjcbLOZDfdUohmyjSTbEm63S0x5SXW3CWstL8ZznhQBBwCcg0vsrMkQO4t7kK5xmEoabcYcCF4CE4IySM9QRx0q0B2RuI0rJsPfXAsvl1ZWGBlHeKCjjHXBFNbnYRb2rchtt26tyEJCA+xHwvI+9xjJqCoYJAGubmV6gc+me57JMh5X1uoE9cZMfVbTMuO81ESiKkB5oZDp9/xDPn0PnWpOz1LibQ9lBwp8kZ8uAKpy0dmt4t7qdk3VEkAoJ7+KhW7b5ZIJH4+dXZomJNYtG2XFUysuqIS4MKx5ZpGwCNxPX0T5KqSeNrHgaX18VIwhKTkCvT79ChT1CvFe+KMOTzQoUvJLyXvShgHrQoUiRFVQCQBwKFClOyaN14oZIzRhQoV7kvHdDNDNChTU9DNAUKFKF5e15QoV4pEM17QoV4JSiq4rzqTQoUwk3TSgCdwFHoUKelGwX//2Q==]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/sparqlcolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmVkaXRib3ggewogIG1hcmdpbjogLjRlbTsKICBwYWRkaW5nOiAwOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxMHB0OwogIGNvbG9yOiBibGFjazsKfQoKLmVkaXRib3ggcCB7CiAgbWFyZ2luOiAwOwp9CgpzcGFuLnNwLWtleXdvcmQgewogIGNvbG9yOiAjNzA4Owp9CgpzcGFuLnNwLXByZWZpeGVkIHsKICBjb2xvcjogIzVkMTsKfQoKc3Bhbi5zcC12YXIgewogIGNvbG9yOiAjMDBjOwp9CgpzcGFuLnNwLWNvbW1lbnQgewogIGNvbG9yOiAjYTcwOwp9CgpzcGFuLnNwLWxpdGVyYWwgewogIGNvbG9yOiAjYTIyOwp9CgpzcGFuLnNwLXVyaSB7CiAgY29sb3I6ICMyOTI7Cn0KCnNwYW4uc3Atb3BlcmF0b3IgewogIGNvbG9yOiAjMDg4Owp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/xmlcolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmVkaXRib3ggewogIG1hcmdpbjogLjRlbTsKICBwYWRkaW5nOiAwOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxMHB0OwogIGNvbG9yOiBibGFjazsKfQoKLmVkaXRib3ggcCB7CiAgbWFyZ2luOiAwOwp9CgpzcGFuLnhtbC10YWduYW1lIHsKICBjb2xvcjogI0EwQjsKfQoKc3Bhbi54bWwtYXR0cmlidXRlIHsKICBjb2xvcjogIzI4MTsKfQoKc3Bhbi54bWwtcHVuY3R1YXRpb24gewogIGNvbG9yOiBibGFjazsKfQoKc3Bhbi54bWwtYXR0bmFtZSB7CiAgY29sb3I6ICMwMEY7Cn0KCnNwYW4ueG1sLWNvbW1lbnQgewogIGNvbG9yOiAjQTcwOwp9CgpzcGFuLnhtbC1jZGF0YSB7CiAgY29sb3I6ICM0OEE7Cn0KCnNwYW4ueG1sLXByb2Nlc3NpbmcgewogIGNvbG9yOiAjOTk5Owp9CgpzcGFuLnhtbC1lbnRpdHkgewogIGNvbG9yOiAjQTIyOwp9CgpzcGFuLnhtbC1lcnJvciB7CiAgY29sb3I6ICNGMDA7Cn0KCnNwYW4ueG1sLXRleHQgewogIGNvbG9yOiBibGFjazsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/csstest.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogQ1NTIGRlbW9uc3RyYXRpb248L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL2RvY3MuY3NzIi8+CiAgPC9oZWFkPgogIDxib2R5IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyI+Cgo8cD5EZW1vbnN0cmF0aW9uIG9mIDxhIGhyZWY9ImluZGV4Lmh0bWwiPkNvZGVNaXJyb3I8L2E+J3MgQ1NTCmhpZ2hsaWdodGVyLjwvcD4KCjxkaXYgY2xhc3M9ImJvcmRlciI+Cjx0ZXh0YXJlYSBpZD0iY29kZSIgY29scz0iMTIwIiByb3dzPSIzMCI+Ci8qIFNvbWUgZXhhbXBsZSBDU1MgKi8KCkBpbXBvcnQgdXJsKCJzb21ldGhpbmcuY3NzIik7Cgpib2R5IHsKICBtYXJnaW46IDA7CiAgcGFkZGluZzogM2VtIDZlbTsKICBmb250LWZhbWlseTogdGFob21hLCBhcmlhbCwgc2Fucy1zZXJpZjsKICBjb2xvcjogIzAwMDsKfQoKI25hdmlnYXRpb24gYSB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7Cn0KCmgxIHsKICBmb250LXNpemU6IDIuNWVtOwp9CgpoMiB7CiAgZm9udC1zaXplOiAxLjdlbTsKfQoKaDE6YmVmb3JlLCBoMjpiZWZvcmUgewogIGNvbnRlbnQ6ICI6OiI7Cn0KCmNvZGUgewogIGZvbnQtZmFtaWx5OiBjb3VyaWVyLCBtb25vc3BhY2U7CiAgZm9udC1zaXplOiA4MCU7CiAgY29sb3I6ICM0MThBOEE7Cn0KPC90ZXh0YXJlYT4KPC9kaXY+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKCdjb2RlJywgewogICAgaGVpZ2h0OiAiMzUwcHgiLAogICAgcGFyc2VyZmlsZTogInBhcnNlY3NzLmpzIiwKICAgIHN0eWxlc2hlZXQ6ICJjc3MvY3NzY29sb3JzLmNzcyIsCiAgICBwYXRoOiAianMvIgogIH0pOwo8L3NjcmlwdD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/highlight.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2hpZ2hsaWdodC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJqcy9zdHJpbmdzdHJlYW0uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ianMvdG9rZW5pemUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ianMvdG9rZW5pemVqYXZhc2NyaXB0LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImpzL3BhcnNlamF2YXNjcmlwdC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KICAgIDx0aXRsZT5Db2RlTWlycm9yOiBTdHJpbmcgaGlnaGxpZ2h0IGRlbW9uc3RyYXRpb248L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL2pzY29sb3JzLmNzcyIvPgogIDwvaGVhZD4KICA8Ym9keSBzdHlsZT0icGFkZGluZzogMjBweDsiPgoKPGRpdiBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7IHBhZGRpbmc6IC40ZW07Ij4KPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMjAiIHJvd3M9IjIwIiBzdHlsZT0iYm9yZGVyLXdpZHRoOiAwIj4KLy8gRGVtbyBmb3IgcnVubmluZyBhIENvZGVNaXJyb3IgcGFyc2VyIG92ZXIgYSBwaWVjZSBvZiBjb2RlIHdpdGhvdXQKLy8gY3JlYXRpbmcgYW4gYWN0dWFsIGVkaXRvci4KCihmdW5jdGlvbigpewogIGZ1bmN0aW9uIG5vcm1hbGlzZVN0cmluZyhzdHJpbmcpIHsKICAgIHZhciB0YWIgPSAiIjsKICAgIGZvciAodmFyIGkgPSAwOyBpICZsdDsgaW5kZW50VW5pdDsgaSsrKSB0YWIgKz0gIiAiOwoKICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cdC9nLCB0YWIpLnJlcGxhY2UoL1x1MDBhMC9nLCAiICIpLnJlcGxhY2UoL1xyXG4/L2csICJcbiIpOwogICAgdmFyIHBvcyA9IDAsIHBhcnRzID0gW10sIGxpbmVzID0gc3RyaW5nLnNwbGl0KCJcbiIpOwogICAgZm9yICh2YXIgbGluZSA9IDA7IGxpbmUgJmx0OyBsaW5lcy5sZW5ndGg7IGxpbmUrKykgewogICAgICBpZiAobGluZSAhPSAwKSBwYXJ0cy5wdXNoKCJcbiIpOwogICAgICBwYXJ0cy5wdXNoKGxpbmVzW2xpbmVdKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAocG9zICZsdDsgcGFydHMubGVuZ3RoKSByZXR1cm4gcGFydHNbcG9zKytdOwogICAgICAgIGVsc2UgdGhyb3cgU3RvcEl0ZXJhdGlvbjsKICAgICAgfQogICAgfTsKICB9CgogIHdpbmRvdy5oaWdobGlnaHRUZXh0ID0gZnVuY3Rpb24oc3RyaW5nLCBvdXRwdXQsIHBhcnNlcikgewogICAgdmFyIHBhcnNlciA9IChwYXJzZXIgfHwgRWRpdG9yLlBhcnNlcikubWFrZShzdHJpbmdTdHJlYW0obm9ybWFsaXNlU3RyaW5nKHN0cmluZykpKTsKICAgIHRyeSB7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdmFyIHRva2VuID0gcGFyc2VyLm5leHQoKTsKICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlNQQU4iKTsKICAgICAgICBzcGFuLmNsYXNzTmFtZSA9IHRva2VuLnN0eWxlOwogICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodG9rZW4udmFsdWUpKTsKICAgICAgICBvdXRwdXQuYXBwZW5kQ2hpbGQoc3Bhbik7CiAgICAgIH0KICAgIH0KICAgIGNhdGNoIChlKSB7CiAgICAgIGlmIChlICE9IFN0b3BJdGVyYXRpb24pIHRocm93IGU7CiAgICB9CiAgfQp9KSgpOwo8L3RleHRhcmVhPgo8L2Rpdj4KCjxidXR0b24gb25jbGljaz0iaGlnaGxpZ2h0KCkiPlJ1biBoaWdobGlnaHRlcjwvYnV0dG9uPgoKPGRpdj4KPGRpdiBpZD0ibnVtYmVycyIgc3R5bGU9ImZsb2F0OiBsZWZ0OyB3aWR0aDogMmVtOyBtYXJnaW4tcmlnaHQ6IC41ZW07IHRleHQtYWxpZ246IHJpZ2h0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogI0NDQzsiPjwvZGl2Pgo8cHJlIGlkPSJvdXRwdXQiIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlIj48L3ByZT4KPC9kaXY+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgLy8gU2ltcGxlIGhhY2sgdG8gZGVtb25zdHJhdGUgYWRkaW5nIGxpbmUgbnVtYmVycy4gSnVzdCBwYXNzIHRoZSBET00gbm9kZSBhcwogIC8vIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gaGlnaGxpZ2h0VGV4dCB3aGVuIHlvdSBkb24ndCBuZWVkIHRob3NlCiAgZnVuY3Rpb24gaGlnaGxpZ2h0KCkgewogICAgdmFyIGxpbmVObyA9IDEsIG91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRwdXQiKSwgbnVtYmVycyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJudW1iZXJzIik7CiAgICBvdXRwdXQuaW5uZXJIVE1MID0gbnVtYmVycy5pbm5lckhUTUwgPSAiIjsKCiAgICBmdW5jdGlvbiBhZGRMaW5lKGxpbmUpIHsKICAgICAgbnVtYmVycy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcobGluZU5vKyspKSk7CiAgICAgIG51bWJlcnMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiQlIiKSk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKykgb3V0cHV0LmFwcGVuZENoaWxkKGxpbmVbaV0pOwogICAgICBvdXRwdXQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiQlIiKSk7CiAgICB9CiAgICBoaWdobGlnaHRUZXh0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIikudmFsdWUsIGFkZExpbmUpOwogIH0KPC9zY3JpcHQ+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/htmltest.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogSFRNTC9YTUwgZGVtb25zdHJhdGlvbjwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjc3MvZG9jcy5jc3MiLz4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yLWxpbmUtbnVtYmVycyB7CiAgICAgICAgd2lkdGg6IDIuMmVtOwogICAgICAgIGNvbG9yOiAjYWFhOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogLjNlbTsKICAgICAgICBmb250LXNpemU6IDEwcHQ7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBwYWRkaW5nLXRvcDogLjRlbTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHkgc3R5bGU9InBhZGRpbmc6IDIwcHg7Ij4KCjxwPlRoaXMgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiB0aGUgWE1ML0hUTUwgaW5kZW50YXRpb24gbW9kdWxlCmZvciA8YSBocmVmPSJpbmRleC5odG1sIj5Db2RlTWlycm9yPC9hPi4gVGhlIDxhCmhyZWY9ImpzL3BhcnNleG1sLmpzIj5qYXZhc2NyaXB0PC9hPiBmaWxlIGNvbnRhaW5zIHNvbWUgY29tbWVudHMgd2l0aAptb3JlIGluZm9ybWF0aW9uLjwvcD4KCjxkaXYgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nOiAwcHg7Ij4KPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMjAiIHJvd3M9IjMwIj4KJmx0O2h0bWwgc3R5bGU9ImNvbG9yOiBncmVlbiImZ3Q7CiAgJmx0OyEtLSB0aGlzIGlzIGEgY29tbWVudCAtLSZndDsKICAmbHQ7aGVhZCZndDsKICAgICZsdDt0aXRsZSZndDtIVE1MIEV4YW1wbGUmbHQ7L3RpdGxlJmd0OwogICZsdDsvaGVhZCZndDsKICAmbHQ7Ym9keSZndDsKICAgIFRoZSBpbmRlbnRhdGlvbiB0cmllcyB0byBiZSAmbHQ7ZW0mZ3Q7c29tZXdoYXQgJmFtcDtxdW90O2RvIHdoYXQKICAgIEkgbWVhbiZhbXA7cXVvdDsmbHQ7L2VtJmd0Oy4uLiBidXQgbWlnaHQgbm90IG1hdGNoIHlvdXIgc3R5bGUuCiAgJmx0Oy9ib2R5Jmd0OwombHQ7L2h0bWwmZ3Q7CjwvdGV4dGFyZWE+CjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSgnY29kZScsIHsKICAgIGhlaWdodDogIjM1MHB4IiwKICAgIHBhcnNlcmZpbGU6ICJwYXJzZXhtbC5qcyIsCiAgICBzdHlsZXNoZWV0OiAiY3NzL3htbGNvbG9ycy5jc3MiLAogICAgcGF0aDogImpzLyIsCiAgICBjb250aW51b3VzU2Nhbm5pbmc6IDUwMCwKICAgIGxpbmVOdW1iZXJzOiB0cnVlCiAgfSk7Cjwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEluLWJyb3dzZXIgY29kZSBlZGl0aW5nPC90aXRsZT4KCiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjc3MvZG9jcy5jc3MiLz4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIGRpdi50b3Age3RleHQtYWxpZ246IGNlbnRlcjt9CiAgICAgIGRpdi50b3AgaDEge21hcmdpbi1ib3R0b206IDA7fQogICAgICBkaXYudG9wIGgyIHttYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAxLjVlbTt9CiAgICAgIGRpdi5kb25hdGUgc3BhbiB7Y3Vyc29yOiBwb2ludGVyOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTt9CiAgICAgIGRpdi5kb25hdGUge2ZvbnQtc2l6ZTogNzAlOyBtYXJnaW4tdG9wOiAxZW07IHdpZHRoOiAxNTVweDsgcGFkZGluZzogMTBweDsgYm9yZGVyOiAxcHggc29saWQgI2M0NDt9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KCjxkaXYgY2xhc3M9InRvcCI+CiAgPGgxPkNvZGVNaXJyb3I8L2gxPgogIDxoMiBjbGFzcz0idW5kZXJsaW5lIj5Jbi1icm93c2VyIGNvZGUgZWRpdGluZyBtYWRlIGFsbW9zdCBiZWFyYWJsZTwvaDI+CjwvZGl2Pgo8ZGl2IHN0eWxlPSJmbG9hdDogcmlnaHQ7IHBhZGRpbmctbGVmdDogMTBweDsiPgogIDxmb3JtIGFjdGlvbj0iaHR0cHM6Ly93d3cucGF5cGFsLmNvbS9jZ2ktYmluL3dlYnNjciIgbWV0aG9kPSJwb3N0IiBpZD0icGF5cGFsIj4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhjbGljayIvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaG9zdGVkX2J1dHRvbl9pZCIgdmFsdWU9IjM3MDE1NDQiLz4KICA8L2Zvcm0+CiAgPGltZyBzcmM9ImNzcy9wZW9wbGUuanBnIiBhbHQ9IiIvPjxici8+CiAgPGRpdiBjbGFzcz0iZG9uYXRlIj4KICAgIE1ha2UgYSBkb25hdGlvbjoKICAgIDx1bCBzdHlsZT0ibWFyZ2luOiAwIDJlbTsgcGFkZGluZzogMCI+CiAgICAgIDxsaT48c3BhbiBvbmNsaWNrPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGF5cGFsJykuc3VibWl0KCk7Ij5QYXlwYWw8L3NwYW4+PC9saT4KICAgICAgPGxpPjxzcGFuIG9uY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYW5raW5mbycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOyI+QmFuazwvc3Bhbj48L2xpPgogICAgPC91bD4KICAgIDxkaXYgaWQ9ImJhbmtpbmZvIiBzdHlsZT0iZGlzcGxheTogbm9uZTsgZm9udC1zaXplOiA4MCU7Ij4KICAgICAgQmFuazogPGk+UmFib2Jhbms8L2k+PGJyLz4KICAgICAgQ291bnRyeTogPGk+TmV0aGVybGFuZHM8L2k+PGJyLz4KICAgICAgU1dJRlQ6IDxpPlJBQk9OTDJVPC9pPjxici8+CiAgICAgIEFjY291bnQ6IDxpPjE0Nzg1MDc3MDwvaT48YnIvPgogICAgICBOYW1lOiA8aT5NYXJpam4gSGF2ZXJiZWtlPC9pPjxici8+CiAgICAgIElCQU46IDxpPk5MMjYgUkFCTyAwMTQ3IDg1MDcgNzA8L2k+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC9kaXY+Cgo8cD5Db2RlTWlycm9yIGlzIGEgSmF2YVNjcmlwdCBsaWJyYXJ5IHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEKcmVsYXRpdmVseSBwbGVhc2FudCBlZGl0b3IgaW50ZXJmYWNlIGZvciBjb2RlLWxpa2UgY29udGVudCAmI3gyMDE1Owpjb21wdXRlciBwcm9ncmFtcywgSFRNTCBtYXJrdXAsIGFuZCBzaW1pbGFyLiBJZiBhIHBhcnNlciBoYXMgYmVlbgp3cml0dGVuIGZvciB0aGUgbGFuZ3VhZ2UgeW91IGFyZSBlZGl0aW5nIChzZWUgYmVsb3cgZm9yIGEgbGlzdCBvZgpzdXBwb3J0ZWQgbGFuZ3VhZ2VzKSwgdGhlIGNvZGUgd2lsbCBiZSBjb2xvdXJlZCwgYW5kIHRoZSBlZGl0b3Igd2lsbApoZWxwIHlvdSB3aXRoIGluZGVudGF0aW9uLjwvcD4KCjxwPlRvIGdldCBhIGxvb2sgYXQgQ29kZU1pcnJvciwgc2VlIHRoZSB0ZXN0IHBhZ2VzIGZvciB0aGUgdmFyaW91cwpwYXJzZXJzLi4uPC9wPgoKPHVsPgogIDxsaT48YSBocmVmPSJqc3Rlc3QuaHRtbCI+SmF2YVNjcmlwdDwvYT48L2xpPgogIDxsaT48YSBocmVmPSJodG1sdGVzdC5odG1sIj5YTUwvSFRNTDwvYT48L2xpPgogIDxsaT48YSBocmVmPSJjc3N0ZXN0Lmh0bWwiPkNTUzwvYT48L2xpPgogIDxsaT48YSBocmVmPSJzcGFycWx0ZXN0Lmh0bWwiPlNQQVJRTDwvYT48L2xpPgogIDxsaT48YSBocmVmPSJtaXhlZHRlc3QuaHRtbCI+SFRNTCBtaXhlZC1tb2RlPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9ImNvbnRyaWIvcGhwL2luZGV4Lmh0bWwiPkhUTUwrUEhQIG1peGVkLW1vZGU8L2E+IChjb3VydGVzeSBvZiA8YSBocmVmPSJjb250cmliL3BocC9MSUNFTlNFIj5ZYWhvbyE8L2E+KTwvbGk+CiAgPGxpPjxhIGhyZWY9ImNvbnRyaWIvcHl0aG9uL2luZGV4Lmh0bWwiPlB5dGhvbjwvYT4gKGNvdXJ0ZXN5IG9mIDxhIGhyZWY9ImNvbnRyaWIvcHl0aG9uL0xJQ0VOU0UiPlRpbW90aHkgRmFycmVsbDwvYT4pPC9saT4KICA8bGk+PGEgaHJlZj0iY29udHJpYi9sdWEvaW5kZXguaHRtbCI+THVhPC9hPiAoY291cnRlc3kgb2YgPGEgaHJlZj0iaHR0cDovL2ZyYW5jaW8ucGwvIj5GcmFuY2lzemVrIFdhd3J6YWs8L2E+KTwvbGk+CiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9kLmhhbnRsLmN6L2QvcnVieS1pbi1jb2RlbWlycm9yLyI+UnVieTwvYT4gKGJ5IE1pY2hhbCBIYW50bCwgPGEgaHJlZj0iaHR0cDovL2dpdGh1Yi5jb20vaGFrdW5pbi9ydWJ5LWluLWNvZGVtaXJyb3IvdHJlZS9tYXN0ZXIiPnVuZmluaXNoZWQ8L2E+KTwvbGk+CiAgPGxpPjxhIGhyZWY9ImNvbnRyaWIvc3FsL2luZGV4Lmh0bWwiPlNRTDwvYT4gKGNvdXJ0ZXN5IG9mIEpvaG4gQmVuZWRpa3Rzc29uKTwvbGk+CjwvdWw+Cgo8cD5PciB0YWtlIGEgbG9vayBhdCBzb21lIHJlYWwtd29ybGQgdXNlcyBvZiB0aGUgc3lzdGVtLi4uPC9wPgoKPHVsPgogIDxsaT48YSBocmVmPSJodHRwOi8vZ2l0aHViLmNvbS9kYXJ3aW4vZmlyZXJhaW5ib3ciPkZpcmVSYWluYm93OiBzeW50YXggY29sb3VyaW5nIGZvciBGaXJlYnVnPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZnJlZWJhc2VhcHBzLmNvbS8iPkZyZWViYXNlJ3MgQWNyZSBJREU8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iaHR0cDovL2ttbC1zYW1wbGVzLmdvb2dsZWNvZGUuY29tL3N2bi90cnVuay9pbnRlcmFjdGl2ZS9pbmRleC5odG1sIj5Hb29nbGUgRWFydGggS01MIHNhbXBsZXI8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iaHR0cDovL2Vsb3F1ZW50amF2YXNjcmlwdC5uZXQvY2hhcHRlcjEuaHRtbCI+RWxvcXVlbnQgSmF2YVNjcmlwdCdzIGNvbnNvbGU8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iaHR0cDovL2RlbW8ucW9veGRvby5vcmcvY3VycmVudC9wbGF5Z3JvdW5kLyNIZWxsb19Xb3JsZCI+VGhlIHFvb3hkb28gcGxheWdyb3VuZDwvYT48L2xpPgogIDxsaT48YSBocmVmPSJodHRwOi8vYmlsbG1pbGwub3JnL3N0YXRpYy9jYW52YXN0dXRvcmlhbC9pbmRleC5odG1sIj5BIGNvb2wgdHV0b3JpYWwgYWJvdXQgdGhlICZsdDtjYW52YXM+IGVsZW1lbnQ8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iaHR0cDovL29yYy5jc3Jlcy51dGV4YXMuZWR1L3RyeW9yYy5zaHRtbCI+QW4gb25saW5lIElERSBmb3IgdGhlIE9yYyBwcm9ncmFtbWluZyBsYW5ndWFnZTwvYT48L2xpPgogIDxsaT48YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL2FwaXMvYWpheC9wbGF5Z3JvdW5kIj5Hb29nbGUncyBBUEkgcGxheWdyb3VuZDwvYT48L2xpPgo8L3VsPgoKPGgyPlJlbGVhc2VzPC9oMj4KCjxwIGNsYXNzPSJyZWwiPjxlbT4xMi0xMS0yMDA5PC9lbT46IDxhCmhyZWY9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvY29kZW1pcnJvci0wLjY1LnppcCI+VmVyc2lvbgowLjY1PC9hPjogQWRkIHN1cHBvcnQgZm9yIGhhdmluZyBib3RoIGxpbmUtd3JhcHBpbmcgYW5kIGxpbmUtbnVtYmVycwp0dXJuZWQgb24sIG1ha2UgcGFyZW4taGlnaGxpZ2h0aW5nIHN0eWxlIGN1c3RvbWlzYWJsZQooPGNvZGU+bWFya1BhcmVuPC9jb2RlPiBhbmQgPGNvZGU+dW5tYXJrUGFyZW48L2NvZGU+IGNvbmZpZyBvcHRpb25zKSwKd29yayBhcm91bmQgYSBzZWxlY3Rpb24gYnVnIHRoYXQgT3BlcmEgPGVtPnJlPC9lbT5pbnRyb2R1Y2VkIGluCnZlcnNpb24gMTAuPC9wPgoKPHAgY2xhc3M9InJlbCI+PGVtPjIzLTEwLTIwMDk8L2VtPjogPGEKaHJlZj0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci9jb2RlbWlycm9yLTAuNjQuemlwIj5WZXJzaW9uCjAuNjQ8L2E+OiBTb2x2ZXMgc29tZSBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGUgcGFzdGUtaGFuZGxpbmcgY2hhbmdlcwpmcm9tIHRoZSBwcmV2aW91cyByZWxlYXNlLiBBZGRzIDxjb2RlPnNldFNwZWxsY2hlY2s8L2NvZGU+LAo8Y29kZT5zZXRUZXh0V3JhcHBpbmc8L2NvZGU+LCA8Y29kZT5zZXRJbmRlbnRVbml0PC9jb2RlPiwKPGNvZGU+c2V0VW5kb0RlcHRoPC9jb2RlPiwgPGNvZGU+c2V0VGFiTW9kZTwvY29kZT4sIGFuZAo8Y29kZT5zZXRMaW5lTnVtYmVyczwvY29kZT4gdG8gY3VzdG9taXNlIGEgcnVubmluZyBlZGl0b3IuIEludHJvZHVjZXMKYW4gPGEgaHJlZj0iY29udHJpYi9zcWwvaW5kZXguaHRtbCI+U1FMPC9hPiBwYXJzZXIuIEZpeGVzIGEgZmV3IHNtYWxsCnByb2JsZW1zIGluIHRoZSA8YSBocmVmPSJjb250cmliL3B5dGhvbi9pbmRleC5odG1sIj5QeXRob248L2E+IHBhcnNlci4KQW5kLCBhcyB1c3VhbCwgYWRkIHdvcmthcm91bmRzIGZvciB2YXJpb3VzIG5ld2x5IGRpc2NvdmVyZWQgYnJvd3NlcgppbmNvbXBhdGliaWxpdGllcy48L3A+Cgo8cCBjbGFzcz0icmVsIj48ZW0+MzEtMDgtMjAwOTwvZW0+OiA8YQpocmVmPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yL2NvZGVtaXJyb3ItMC42My56aXAiPlZlcnNpb24KMC42MzwvYT46IE92ZXJoYXVsIG9mIHBhc3RlLWhhbmRsaW5nIChsZXNzIGZyYWdpbGUpLCBmaXhlcyBmb3Igc2V2ZXJhbApzZXJpb3VzIElFOCBpc3N1ZXMgKGN1cnNvciBqdW1waW5nLCBlbmQtb2YtZG9jdW1lbnQgYnVncykgYW5kIGEgbnVtYmVyCm9mIHNtYWxsIHByb2JsZW1zLjwvcD4KCjxwIGNsYXNzPSJyZWwiPjxlbT4zMC0wNS0yMDA5PC9lbT46IDxhCmhyZWY9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvY29kZW1pcnJvci0wLjYyLnppcCI+VmVyc2lvbgowLjYyPC9hPjogSW50cm9kdWNlcyA8YSBocmVmPSJjb250cmliL3B5dGhvbi9pbmRleC5odG1sIj5QeXRob248L2E+CmFuZCA8YSBocmVmPSJjb250cmliL2x1YS9pbmRleC5odG1sIj5MdWE8L2E+IHBhcnNlcnMuIEFkZAo8Y29kZT5zZXRQYXJzZXI8L2NvZGU+IChvbi10aGUtZmx5IG1vZGUgY2hhbmdpbmcpIGFuZAo8Y29kZT5jbGVhckhpc3Rvcnk8L2NvZGU+IG1ldGhvZHMuIE1ha2UgcGFyc2luZyBwYXNzZXMgdGltZS1iYXNlZAppbnN0ZWFkIG9mIGxpbmVzLWJhc2VkIChzZWUgdGhlIDxjb2RlPnBhc3NUaW1lPC9jb2RlPiBvcHRpb24pLjwvcD4KCjxwIGNsYXNzPSJyZWwiPjxlbT4wNC0wMy0yMDA5PC9lbT46IDxhCmhyZWY9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvY29kZW1pcnJvci0wLjYxLnppcCI+VmVyc2lvbgowLjYxPC9hPjogQWRkIGxpbmUgbnVtYmVycyBzdXBwb3J0IChzZWUgPGNvZGU+bGluZU51bWJlcnM8L2NvZGU+Cm9wdGlvbiBpbiA8YSBocmVmPSJtYW51YWwuaHRtbCI+bWFudWFsPC9hPikuIFN1cHBvcnQgYSBtb2RlIHdoZXJlIHRhYgonc2hpZnRzJyBpbmRlbnRhdGlvbiBpbnN0ZWFkIG9mIHJlc2V0dGluZyBpdCAoc2VlCjxjb2RlPnRhYk1vZGU9InNoaWZ0IjwvY29kZT4pLiBBZGQgPGNvZGU+aW5kZW50VW5pdDwvY29kZT4gb3B0aW9uIHRvCmNvbmZpZ3VyZSBpbmRlbnRhdGlvbiBkZXB0aHMuIE1ha2UgaXQgcG9zc2libGUgdG8gZ3JhYiB0aGUgZWRpdG9yJ3MKa2V5Ym9hcmQgaW5wdXQsIHdoaWNoIGlzIHVzZWZ1bCB3aGVuIHBvcHBpbmcgdXAgZGlhbG9ncyAoc2VlCjxjb2RlPmdyYWJLZXlzPC9jb2RlPi88Y29kZT51bmdyYWJLZXlzPC9jb2RlPikuIEZpeCBhIGxvdCBvZiBzbWFsbApidWdzLCBhbW9uZyB3aGljaCB0aGUgdmFyaW91cyBpc3N1ZXMgcmVsYXRlZCB0byBwYXN0aW5nIGluIEludGVybmV0CkV4cGxvcmVyLjwvcD4KCjxoMiBpZD0ic3VwcG9ydGVkIj5TdXBwb3J0ZWQgYnJvd3NlcnM8L2gyPgoKPHA+QXQgdGhpcyB0aW1lLCB0aGUgZm9sbG93aW5nIGJyb3dzZXJzIGFyZSBzdXBwb3J0ZWQ6PC9wPgoKPHVsPgogIDxsaT5GaXJlZm94IDEuNSBvciBoaWdoZXI8L2xpPgogIDxsaT5JbnRlcm5ldCBFeHBsb3JlciA2IG9yIGhpZ2hlcjwvbGk+CiAgPGxpPlNhZmFyaSAzIG9yIGhpZ2hlcjwvbGk+CiAgPGxpPk9wZXJhIDkuNTIgb3IgaGlnaGVyPC9saT4KICA8bGk+Q2hyb21lPC9saT4KPC91bD4KCjxwPk1ha2luZyBpdCB3b3JrIG9uIG90aGVyIGJyb3dzZXJzIHRoYXQgaGF2ZSBkZWNlbnQgc3VwcG9ydCBmb3IgdGhlClczQyBET00gbW9kZWwgc2hvdWxkIG5vdCBiZSB0b28gaGFyZCwgYnV0IEkgYW0gbm90IGFjdGl2ZWx5IHRlc3RpbmcKYWdhaW5zdCB0aG9zZS48L3A+Cgo8aDI+R2V0dGluZyB0aGUgY29kZTwvaDI+Cgo8cD5BbGwgb2YgQ29kZU1pcnJvciBpcyByZWxlYXNlZCB1bmRlciBhIDxhCmhyZWY9IkxJQ0VOU0UiPnpsaWItc3R5bGU8L2E+IGxpY2Vuc2UuIFRvIGdldCBpdCwgeW91IGNhbiBkb3dubG9hZCB0aGUKPGEgaHJlZj0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci9jb2RlbWlycm9yLnppcCI+bGF0ZXN0CnJlbGVhc2U8L2E+IG9yIHRoZSBjdXJyZW50IDxhCmhyZWY9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvY29kZW1pcnJvci1sYXRlc3QuemlwIj5kZXZlbG9wbWVudApzbmFwc2hvdDwvYT4gYXMgemlwIGZpbGVzLCBvciB1c2UgPGEKaHJlZj0iaHR0cDovL2dpdC1zY20uY29tLyI+Z2l0PC9hPiB0byBnZXQgdGhlIHJlcG9zaXRvcnk6PC9wPgoKPHByZSBjbGFzcz0iY29kZSI+Z2l0IGNsb25lIGh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvLmdpdDwvcHJlPgoKPHA+VGhpcyBzZWNvbmQgbWV0aG9kIGlzIHJlY29tbWVuZGVkIGlmIHlvdSBhcmUgcGxhbm5pbmcgdG8gaGFjayBvbgpDb2RlTWlycm9yICYjeDIwMTU7IGl0IG1ha2VzIGl0IGVhc3kgdG8gcmVjb3JkIHlvdXIgcGF0Y2hlcyBhbmQgc2hhcmUKdGhlbSB3aXRoIG1lLiBDb2RlTWlycm9yIGNhbiBhbHNvIGJlIGZvdW5kIG9uIEdpdEh1YjogPGEKaHJlZj0iaHR0cDovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yIj5odHRwOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3I8L2E+LjwvcD4KCjxoMj5TdXBwb3J0PC9oMj4KCjxwPlRoZXJlIGlzIGEgPGEKaHJlZj0iaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2NvZGVtaXJyb3IiPkdvb2dsZSBncm91cDwvYT4gKGEKc29ydCBvZiBtYWlsaW5nIGxpc3QvbmV3c2dyb3VwIHRoaW5neSkgZm9yIGRpc2N1c3Npb24gYW5kIG5ld3MgcmVsYXRlZAp0byBDb2RlTWlycm9yLiBZb3UgY2FuIGFsc28gZS1tYWlsIG1lIGRpcmVjdGx5OiA8YQpocmVmPSJtYWlsdG86bWFyaWpuaEBnbWFpbC5jb20iPk1hcmlqbiBIYXZlcmJla2U8L2E+LjwvcD4KCjxoMj5Eb2N1bWVudGF0aW9uPC9oMj4KCjx1bD4KICA8bGk+VGhlIDxhIGhyZWY9Im1hbnVhbC5odG1sIj5tYW51YWw8L2E+IGlzIGFsbCBtb3N0IHVzZXJzIHdpbGwgbmVlZAogIHRvIHJlYWQgKG9yIHNraW0pLjwvbGk+CiAgPGxpPklmIHlvdSdyZSBpbnRlcmVzdGVkIGluIHdvcmtpbmcgb24gdGhlIGNvZGUsIDxhCiAgaHJlZj0ic3RvcnkuaHRtbCI+dGhpcyBkb2N1bWVudDwvYT4gYWJvdXQgQ29kZU1pcnJvcidzIGFyY2hpdGVjdHVyZQogIHdpbGwgYmUgdXNlZnVsLjwvbGk+CiAgPGxpPlRoZSA8YSBocmVmPSJodHRwOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IiPnNvdXJjZQogIGNvZGU8L2E+IGlzLCBmb3IgdGhlIG1vc3QgcGFydCwgcmF0aGVyIHdlbGwgY29tbWVudGVkLCBzbyBpZiBhbGwKICBlbHNlIGZhaWxzLCB5b3UgY2FuIHRyeSByZWFkaW5nIGl0LjwvbGk+CjwvdWw+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/js/codemirror.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQ29kZU1pcnJvciBtYWluIG1vZHVsZQogKgogKiBJbXBsZW1lbnRzIHRoZSBDb2RlTWlycm9yIGNvbnN0cnVjdG9yIGFuZCBwcm90b3R5cGUsIHdoaWNoIHRha2UgY2FyZQogKiBvZiBpbml0aWFsaXppbmcgdGhlIGVkaXRvciBmcmFtZSwgYW5kIHByb3ZpZGluZyB0aGUgb3V0c2lkZSBpbnRlcmZhY2UuCiAqLwoKLy8gVGhlIENvZGVNaXJyb3JDb25maWcgb2JqZWN0IGlzIHVzZWQgdG8gc3BlY2lmeSBhIGRlZmF1bHQKLy8gY29uZmlndXJhdGlvbi4gSWYgeW91IHNwZWNpZnkgc3VjaCBhbiBvYmplY3QgYmVmb3JlIGxvYWRpbmcgdGhpcwovLyBmaWxlLCB0aGUgdmFsdWVzIHlvdSBwdXQgaW50byBpdCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0cyBnaXZlbgovLyBiZWxvdy4gWW91IGNhbiBhbHNvIGFzc2lnbiB0byBpdCBhZnRlciBsb2FkaW5nLgp2YXIgQ29kZU1pcnJvckNvbmZpZyA9IHdpbmRvdy5Db2RlTWlycm9yQ29uZmlnIHx8IHt9OwoKdmFyIENvZGVNaXJyb3IgPSAoZnVuY3Rpb24oKXsKICBmdW5jdGlvbiBzZXREZWZhdWx0cyhvYmplY3QsIGRlZmF1bHRzKSB7CiAgICBmb3IgKHZhciBvcHRpb24gaW4gZGVmYXVsdHMpIHsKICAgICAgaWYgKCFvYmplY3QuaGFzT3duUHJvcGVydHkob3B0aW9uKSkKICAgICAgICBvYmplY3Rbb3B0aW9uXSA9IGRlZmF1bHRzW29wdGlvbl07CiAgICB9CiAgfQogIGZ1bmN0aW9uIGZvckVhY2goYXJyYXksIGFjdGlvbikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKICAgICAgYWN0aW9uKGFycmF5W2ldKTsKICB9CgogIC8vIFRoZXNlIGRlZmF1bHQgb3B0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwYXNzaW5nIGEgc2V0IG9mCiAgLy8gb3B0aW9ucyB0byBhIHNwZWNpZmljIENvZGVNaXJyb3IgY29uc3RydWN0b3IuIFNlZSBtYW51YWwuaHRtbCBmb3IKICAvLyB0aGVpciBtZWFuaW5nLgogIHNldERlZmF1bHRzKENvZGVNaXJyb3JDb25maWcsIHsKICAgIHN0eWxlc2hlZXQ6ICIiLAogICAgcGF0aDogIiIsCiAgICBwYXJzZXJmaWxlOiBbXSwKICAgIGJhc2VmaWxlczogWyJ1dGlsLmpzIiwgInN0cmluZ3N0cmVhbS5qcyIsICJzZWxlY3QuanMiLCAidW5kby5qcyIsICJlZGl0b3IuanMiLCAidG9rZW5pemUuanMiXSwKICAgIGlmcmFtZUNsYXNzOiBudWxsLAogICAgcGFzc0RlbGF5OiAyMDAsCiAgICBwYXNzVGltZTogNTAsCiAgICBsaW5lTnVtYmVyRGVsYXk6IDIwMCwKICAgIGxpbmVOdW1iZXJUaW1lOiA1MCwKICAgIGNvbnRpbnVvdXNTY2FubmluZzogZmFsc2UsCiAgICBzYXZlRnVuY3Rpb246IG51bGwsCiAgICBvbkNoYW5nZTogbnVsbCwKICAgIHVuZG9EZXB0aDogNTAsCiAgICB1bmRvRGVsYXk6IDgwMCwKICAgIGRpc2FibGVTcGVsbGNoZWNrOiB0cnVlLAogICAgdGV4dFdyYXBwaW5nOiB0cnVlLAogICAgcmVhZE9ubHk6IGZhbHNlLAogICAgd2lkdGg6ICIiLAogICAgaGVpZ2h0OiAiMzAwcHgiLAogICAgYXV0b01hdGNoUGFyZW5zOiBmYWxzZSwKICAgIHBhcnNlckNvbmZpZzogbnVsbCwKICAgIHRhYk1vZGU6ICJpbmRlbnQiLCAvLyBvciAic3BhY2VzIiwgImRlZmF1bHQiLCAic2hpZnQiCiAgICByZWluZGVudE9uTG9hZDogZmFsc2UsCiAgICBhY3RpdmVUb2tlbnM6IG51bGwsCiAgICBjdXJzb3JBY3Rpdml0eTogbnVsbCwKICAgIGxpbmVOdW1iZXJzOiBmYWxzZSwKICAgIGluZGVudFVuaXQ6IDIKICB9KTsKCiAgZnVuY3Rpb24gYWRkTGluZU51bWJlckRpdihjb250YWluZXIpIHsKICAgIHZhciBudW1zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksCiAgICAgICAgc2Nyb2xsZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKTsKICAgIG51bXMuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgbnVtcy5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICBpZiAobnVtcy5zdHlsZS5zZXRFeHByZXNzaW9uKSB7CiAgICAgIHRyeSB7bnVtcy5zdHlsZS5zZXRFeHByZXNzaW9uKCJoZWlnaHQiLCAidGhpcy5wcmV2aW91c1NpYmxpbmcub2Zmc2V0SGVpZ2h0ICsgJ3B4JyIpO30KICAgICAgY2F0Y2goZSkge30gLy8gU2VlbXMgdG8gdGhyb3cgJ05vdCBJbXBsZW1lbnRlZCcgb24gc29tZSBJRTggdmVyc2lvbnMKICAgIH0KICAgIG51bXMuc3R5bGUudG9wID0gIjBweCI7CiAgICBudW1zLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobnVtcyk7CiAgICBzY3JvbGxlci5jbGFzc05hbWUgPSAiQ29kZU1pcnJvci1saW5lLW51bWJlcnMiOwogICAgbnVtcy5hcHBlbmRDaGlsZChzY3JvbGxlcik7CiAgICByZXR1cm4gbnVtczsKICB9CgogIGZ1bmN0aW9uIENvZGVNaXJyb3IocGxhY2UsIG9wdGlvbnMpIHsKICAgIC8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIGRlcHJlY2F0ZWQgb3B0aW9ucy4KICAgIGlmIChvcHRpb25zLmR1bWJUYWJzKSBvcHRpb25zLnRhYk1vZGUgPSAic3BhY2VzIjsKICAgIGVsc2UgaWYgKG9wdGlvbnMubm9ybWFsVGFiKSBvcHRpb25zLnRhYk1vZGUgPSAiZGVmYXVsdCI7CgogICAgLy8gVXNlIHBhc3NlZCBvcHRpb25zLCBpZiBhbnksIHRvIG92ZXJyaWRlIGRlZmF1bHRzLgogICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICBzZXREZWZhdWx0cyhvcHRpb25zLCBDb2RlTWlycm9yQ29uZmlnKTsKCiAgICB2YXIgZnJhbWUgPSB0aGlzLmZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiSUZSQU1FIik7CiAgICBpZiAob3B0aW9ucy5pZnJhbWVDbGFzcykgZnJhbWUuY2xhc3NOYW1lID0gb3B0aW9ucy5pZnJhbWVDbGFzczsKICAgIGZyYW1lLmZyYW1lQm9yZGVyID0gMDsKICAgIGZyYW1lLnNyYyA9ICJqYXZhc2NyaXB0OmZhbHNlOyI7CiAgICBmcmFtZS5zdHlsZS5ib3JkZXIgPSAiMCI7CiAgICBmcmFtZS5zdHlsZS53aWR0aCA9ICcxMDAlJzsKICAgIGZyYW1lLnN0eWxlLmhlaWdodCA9ICcxMDAlJzsKICAgIC8vIGRpc3BsYXk6IGJsb2NrIG9jY2FzaW9uYWxseSBzdXBwcmVzc2VzIHNvbWUgRmlyZWZveCBidWdzLCBzbyB3ZQogICAgLy8gYWx3YXlzIGFkZCBpdCwgcmVkdW5kYW50IGFzIGl0IHNvdW5kcy4KICAgIGZyYW1lLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwoKICAgIHZhciBkaXYgPSB0aGlzLndyYXBwaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIik7CiAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwogICAgZGl2LmNsYXNzTmFtZSA9ICJDb2RlTWlycm9yLXdyYXBwaW5nIjsKICAgIGRpdi5zdHlsZS53aWR0aCA9IG9wdGlvbnMud2lkdGg7CiAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQ7CgogICAgaWYgKHBsYWNlLmFwcGVuZENoaWxkKSBwbGFjZS5hcHBlbmRDaGlsZChkaXYpOwogICAgZWxzZSBwbGFjZShkaXYpOwogICAgZGl2LmFwcGVuZENoaWxkKGZyYW1lKTsKICAgIGlmIChvcHRpb25zLmxpbmVOdW1iZXJzKSB0aGlzLmxpbmVOdW1iZXJzID0gYWRkTGluZU51bWJlckRpdihkaXYpOwoKICAgIC8vIExpbmsgYmFjayB0byB0aGlzIG9iamVjdCwgc28gdGhhdCB0aGUgZWRpdG9yIGNhbiBmZXRjaCBvcHRpb25zCiAgICAvLyBhbmQgYWRkIGEgcmVmZXJlbmNlIHRvIGl0c2VsZi4KICAgIGZyYW1lLkNvZGVNaXJyb3IgPSB0aGlzOwogICAgdGhpcy53aW4gPSBmcmFtZS5jb250ZW50V2luZG93OwoKICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5wYXJzZXJmaWxlID09ICJzdHJpbmciKQogICAgICBvcHRpb25zLnBhcnNlcmZpbGUgPSBbb3B0aW9ucy5wYXJzZXJmaWxlXTsKICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zdHlsZXNoZWV0ID09ICJzdHJpbmciKQogICAgICBvcHRpb25zLnN0eWxlc2hlZXQgPSBbb3B0aW9ucy5zdHlsZXNoZWV0XTsKCiAgICB2YXIgaHRtbCA9IFsiPCFET0NUWVBFIEhUTUwgUFVCTElDIFwiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkXCI+PGh0bWw+PGhlYWQ+Il07CiAgICAvLyBIYWNrIHRvIHdvcmsgYXJvdW5kIGEgYnVuY2ggb2YgSUU4LXNwZWNpZmljIHByb2JsZW1zLgogICAgaHRtbC5wdXNoKCI8bWV0YSBodHRwLWVxdWl2PVwiWC1VQS1Db21wYXRpYmxlXCIgY29udGVudD1cIklFPUVtdWxhdGVJRTdcIi8+Iik7CiAgICBmb3JFYWNoKG9wdGlvbnMuc3R5bGVzaGVldCwgZnVuY3Rpb24oZmlsZSkgewogICAgICBodG1sLnB1c2goIjxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIiBocmVmPVwiIiArIGZpbGUgKyAiXCIvPiIpOwogICAgfSk7CiAgICBmb3JFYWNoKG9wdGlvbnMuYmFzZWZpbGVzLmNvbmNhdChvcHRpb25zLnBhcnNlcmZpbGUpLCBmdW5jdGlvbihmaWxlKSB7CiAgICAgIGh0bWwucHVzaCgiPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgc3JjPVwiIiArIG9wdGlvbnMucGF0aCArIGZpbGUgKyAiXCI+PCIgKyAiL3NjcmlwdD4iKTsKICAgIH0pOwogICAgaHRtbC5wdXNoKCI8L2hlYWQ+PGJvZHkgc3R5bGU9XCJib3JkZXItd2lkdGg6IDA7XCIgY2xhc3M9XCJlZGl0Ym94XCIgc3BlbGxjaGVjaz1cIiIgKwogICAgICAgICAgICAgIChvcHRpb25zLmRpc2FibGVTcGVsbGNoZWNrID8gImZhbHNlIiA6ICJ0cnVlIikgKyAiXCI+PC9ib2R5PjwvaHRtbD4iKTsKCiAgICB2YXIgZG9jID0gdGhpcy53aW4uZG9jdW1lbnQ7CiAgICBkb2Mub3BlbigpOwogICAgZG9jLndyaXRlKGh0bWwuam9pbigiIikpOwogICAgZG9jLmNsb3NlKCk7CiAgfQoKICBDb2RlTWlycm9yLnByb3RvdHlwZSA9IHsKICAgIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5vcHRpb25zLmluaXRDYWxsYmFjaykgdGhpcy5vcHRpb25zLmluaXRDYWxsYmFjayh0aGlzKTsKICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW5lTnVtYmVycykgdGhpcy5hY3RpdmF0ZUxpbmVOdW1iZXJzKCk7CiAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVpbmRlbnRPbkxvYWQpIHRoaXMucmVpbmRlbnQoKTsKICAgIH0sCgogICAgZ2V0Q29kZTogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuZWRpdG9yLmdldENvZGUoKTt9LAogICAgc2V0Q29kZTogZnVuY3Rpb24oY29kZSkge3RoaXMuZWRpdG9yLmltcG9ydENvZGUoY29kZSk7fSwKICAgIHNlbGVjdGlvbjogZnVuY3Rpb24oKSB7dGhpcy5mb2N1c0lmSUUoKTsgcmV0dXJuIHRoaXMuZWRpdG9yLnNlbGVjdGVkVGV4dCgpO30sCiAgICByZWluZGVudDogZnVuY3Rpb24oKSB7dGhpcy5lZGl0b3IucmVpbmRlbnQoKTt9LAogICAgcmVpbmRlbnRTZWxlY3Rpb246IGZ1bmN0aW9uKCkge3RoaXMuZm9jdXNJZklFKCk7IHRoaXMuZWRpdG9yLnJlaW5kZW50U2VsZWN0aW9uKG51bGwpO30sCgogICAgZm9jdXNJZklFOiBmdW5jdGlvbigpIHsKICAgICAgLy8gaW4gSUUsIGEgbG90IG9mIHNlbGVjdGlvbi1yZWxhdGVkIGZ1bmN0aW9uYWxpdHkgb25seSB3b3JrcyB3aGVuIHRoZSBmcmFtZSBpcyBmb2N1c2VkCiAgICAgIGlmICh0aGlzLndpbi5zZWxlY3QuaWVfc2VsZWN0aW9uKSB0aGlzLmZvY3VzKCk7CiAgICB9LAogICAgZm9jdXM6IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLndpbi5mb2N1cygpOwogICAgICBpZiAodGhpcy5lZGl0b3Iuc2VsZWN0aW9uU25hcHNob3QpIC8vIElFIGhhY2sKICAgICAgICB0aGlzLndpbi5zZWxlY3Quc2V0Qm9va21hcmsodGhpcy53aW4uZG9jdW1lbnQuYm9keSwgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uU25hcHNob3QpOwogICAgfSwKICAgIHJlcGxhY2VTZWxlY3Rpb246IGZ1bmN0aW9uKHRleHQpIHsKICAgICAgdGhpcy5mb2N1cygpOwogICAgICB0aGlzLmVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKHRleHQpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0sCiAgICByZXBsYWNlQ2hhcnM6IGZ1bmN0aW9uKHRleHQsIHN0YXJ0LCBlbmQpIHsKICAgICAgdGhpcy5lZGl0b3IucmVwbGFjZUNoYXJzKHRleHQsIHN0YXJ0LCBlbmQpOwogICAgfSwKICAgIGdldFNlYXJjaEN1cnNvcjogZnVuY3Rpb24oc3RyaW5nLCBmcm9tQ3Vyc29yLCBjYXNlRm9sZCkgewogICAgICByZXR1cm4gdGhpcy5lZGl0b3IuZ2V0U2VhcmNoQ3Vyc29yKHN0cmluZywgZnJvbUN1cnNvciwgY2FzZUZvbGQpOwogICAgfSwKCiAgICB1bmRvOiBmdW5jdGlvbigpIHt0aGlzLmVkaXRvci5oaXN0b3J5LnVuZG8oKTt9LAogICAgcmVkbzogZnVuY3Rpb24oKSB7dGhpcy5lZGl0b3IuaGlzdG9yeS5yZWRvKCk7fSwKICAgIGhpc3RvcnlTaXplOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5lZGl0b3IuaGlzdG9yeS5oaXN0b3J5U2l6ZSgpO30sCiAgICBjbGVhckhpc3Rvcnk6IGZ1bmN0aW9uKCkge3RoaXMuZWRpdG9yLmhpc3RvcnkuY2xlYXIoKTt9LAoKICAgIGdyYWJLZXlzOiBmdW5jdGlvbihjYWxsYmFjaywgZmlsdGVyKSB7dGhpcy5lZGl0b3IuZ3JhYktleXMoY2FsbGJhY2ssIGZpbHRlcik7fSwKICAgIHVuZ3JhYktleXM6IGZ1bmN0aW9uKCkge3RoaXMuZWRpdG9yLnVuZ3JhYktleXMoKTt9LAoKICAgIHNldFBhcnNlcjogZnVuY3Rpb24obmFtZSkge3RoaXMuZWRpdG9yLnNldFBhcnNlcihuYW1lKTt9LAogICAgc2V0U3BlbGxjaGVjazogZnVuY3Rpb24ob24pIHt0aGlzLndpbi5kb2N1bWVudC5ib2R5LnNwZWxsY2hlY2sgPSBvbjt9LAogICAgc2V0VGV4dFdyYXBwaW5nOiBmdW5jdGlvbihvbikgewogICAgICBpZiAob24gPT0gdGhpcy5vcHRpb25zLnRleHRXcmFwcGluZykgcmV0dXJuOwogICAgICB0aGlzLndpbi5kb2N1bWVudC5ib2R5LnN0eWxlLndoaXRlU3BhY2UgPSBvbiA/ICIiIDogIm5vd3JhcCI7CiAgICAgIHRoaXMub3B0aW9ucy50ZXh0V3JhcHBpbmcgPSBvbjsKICAgICAgaWYgKHRoaXMubGluZU51bWJlcnMpIHsKICAgICAgICB0aGlzLnNldExpbmVOdW1iZXJzKGZhbHNlKTsKICAgICAgICB0aGlzLnNldExpbmVOdW1iZXJzKHRydWUpOwogICAgICB9CiAgICB9LAogICAgc2V0SW5kZW50VW5pdDogZnVuY3Rpb24odW5pdCkge3RoaXMud2luLmluZGVudFVuaXQgPSB1bml0O30sCiAgICBzZXRVbmRvRGVwdGg6IGZ1bmN0aW9uKGRlcHRoKSB7dGhpcy5lZGl0b3IuaGlzdG9yeS5tYXhEZXB0aCA9IGRlcHRoO30sCiAgICBzZXRUYWJNb2RlOiBmdW5jdGlvbihtb2RlKSB7dGhpcy5vcHRpb25zLnRhYk1vZGUgPSBtb2RlO30sCiAgICBzZXRMaW5lTnVtYmVyczogZnVuY3Rpb24ob24pIHsKICAgICAgaWYgKG9uICYmICF0aGlzLmxpbmVOdW1iZXJzKSB7CiAgICAgICAgdGhpcy5saW5lTnVtYmVycyA9IGFkZExpbmVOdW1iZXJEaXYodGhpcy53cmFwcGluZyk7CiAgICAgICAgdGhpcy5hY3RpdmF0ZUxpbmVOdW1iZXJzKCk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoIW9uICYmIHRoaXMubGluZU51bWJlcnMpIHsKICAgICAgICB0aGlzLndyYXBwaW5nLnJlbW92ZUNoaWxkKHRoaXMubGluZU51bWJlcnMpOwogICAgICAgIHRoaXMud3JhcHBpbmcuc3R5bGUubWFyZ2luTGVmdCA9ICIiOwogICAgICAgIHRoaXMubGluZU51bWJlcnMgPSBudWxsOwogICAgICB9CiAgICB9LAoKICAgIGN1cnNvclBvc2l0aW9uOiBmdW5jdGlvbihzdGFydCkge3RoaXMuZm9jdXNJZklFKCk7IHJldHVybiB0aGlzLmVkaXRvci5jdXJzb3JQb3NpdGlvbihzdGFydCk7fSwKICAgIGZpcnN0TGluZTogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuZWRpdG9yLmZpcnN0TGluZSgpO30sCiAgICBsYXN0TGluZTogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuZWRpdG9yLmxhc3RMaW5lKCk7fSwKICAgIG5leHRMaW5lOiBmdW5jdGlvbihsaW5lKSB7cmV0dXJuIHRoaXMuZWRpdG9yLm5leHRMaW5lKGxpbmUpO30sCiAgICBwcmV2TGluZTogZnVuY3Rpb24obGluZSkge3JldHVybiB0aGlzLmVkaXRvci5wcmV2TGluZShsaW5lKTt9LAogICAgbGluZUNvbnRlbnQ6IGZ1bmN0aW9uKGxpbmUpIHtyZXR1cm4gdGhpcy5lZGl0b3IubGluZUNvbnRlbnQobGluZSk7fSwKICAgIHNldExpbmVDb250ZW50OiBmdW5jdGlvbihsaW5lLCBjb250ZW50KSB7dGhpcy5lZGl0b3Iuc2V0TGluZUNvbnRlbnQobGluZSwgY29udGVudCk7fSwKICAgIGluc2VydEludG9MaW5lOiBmdW5jdGlvbihsaW5lLCBwb3NpdGlvbiwgY29udGVudCkge3RoaXMuZWRpdG9yLmluc2VydEludG9MaW5lKGxpbmUsIHBvc2l0aW9uLCBjb250ZW50KTt9LAogICAgc2VsZWN0TGluZXM6IGZ1bmN0aW9uKHN0YXJ0TGluZSwgc3RhcnRPZmZzZXQsIGVuZExpbmUsIGVuZE9mZnNldCkgewogICAgICB0aGlzLndpbi5mb2N1cygpOwogICAgICB0aGlzLmVkaXRvci5zZWxlY3RMaW5lcyhzdGFydExpbmUsIHN0YXJ0T2Zmc2V0LCBlbmRMaW5lLCBlbmRPZmZzZXQpOwogICAgfSwKICAgIG50aExpbmU6IGZ1bmN0aW9uKG4pIHsKICAgICAgdmFyIGxpbmUgPSB0aGlzLmZpcnN0TGluZSgpOwogICAgICBmb3IgKDsgbiA+IDEgJiYgbGluZSAhPT0gZmFsc2U7IG4tLSkKICAgICAgICBsaW5lID0gdGhpcy5uZXh0TGluZShsaW5lKTsKICAgICAgcmV0dXJuIGxpbmU7CiAgICB9LAogICAgbGluZU51bWJlcjogZnVuY3Rpb24obGluZSkgewogICAgICB2YXIgbnVtID0gMDsKICAgICAgd2hpbGUgKGxpbmUgIT09IGZhbHNlKSB7CiAgICAgICAgbnVtKys7CiAgICAgICAgbGluZSA9IHRoaXMucHJldkxpbmUobGluZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bTsKICAgIH0sCgogICAgLy8gT2xkIG51bWJlci1iYXNlZCBsaW5lIGludGVyZmFjZQogICAganVtcFRvTGluZTogZnVuY3Rpb24obikgewogICAgICB0aGlzLnNlbGVjdExpbmVzKHRoaXMubnRoTGluZShuKSwgMCk7CiAgICAgIHRoaXMud2luLmZvY3VzKCk7CiAgICB9LAogICAgY3VycmVudExpbmU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5saW5lTnVtYmVyKHRoaXMuY3Vyc29yUG9zaXRpb24oKS5saW5lKTsKICAgIH0sCgogICAgYWN0aXZhdGVMaW5lTnVtYmVyczogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBmcmFtZSA9IHRoaXMuZnJhbWUsIHdpbiA9IGZyYW1lLmNvbnRlbnRXaW5kb3csIGRvYyA9IHdpbi5kb2N1bWVudCwgYm9keSA9IGRvYy5ib2R5LAogICAgICAgICAgbnVtcyA9IHRoaXMubGluZU51bWJlcnMsIHNjcm9sbGVyID0gbnVtcy5maXJzdENoaWxkLCBzZWxmID0gdGhpczsKICAgICAgdmFyIGJhcldpZHRoID0gbnVsbDsKCiAgICAgIGZ1bmN0aW9uIHNpemVCYXIoKSB7CiAgICAgICAgZm9yICh2YXIgcm9vdCA9IGZyYW1lOyByb290LnBhcmVudE5vZGU7IHJvb3QgPSByb290LnBhcmVudE5vZGUpOwogICAgICAgIGlmICghbnVtcy5wYXJlbnROb2RlIHx8IHJvb3QgIT0gZG9jdW1lbnQgfHwgIXdpbi5FZGl0b3IpIHsKICAgICAgICAgIC8vIENsZWFyIGV2ZW50IGhhbmRsZXJzICh0aGVpciBub2RlcyBtaWdodCBhbHJlYWR5IGJlIGNvbGxlY3RlZCwgc28gdHJ5L2NhdGNoKQogICAgICAgICAgdHJ5e2NsZWFyKCk7fWNhdGNoKGUpe30KICAgICAgICAgIGNsZWFySW50ZXJ2YWwoc2l6ZUludGVydmFsKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChudW1zLm9mZnNldFdpZHRoICE9IGJhcldpZHRoKSB7CiAgICAgICAgICBiYXJXaWR0aCA9IG51bXMub2Zmc2V0V2lkdGg7CiAgICAgICAgICBudW1zLnN0eWxlLmxlZnQgPSAiLSIgKyAoZnJhbWUucGFyZW50Tm9kZS5zdHlsZS5tYXJnaW5MZWZ0ID0gYmFyV2lkdGggKyAicHgiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZG9TY3JvbGwoKSB7CiAgICAgICAgbnVtcy5zY3JvbGxUb3AgPSBib2R5LnNjcm9sbFRvcCB8fCBkb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCAwOwogICAgICB9CiAgICAgIC8vIENsZWFudXAgZnVuY3Rpb24sIHJlZ2lzdGVyZWQgYnkgbm9uV3JhcHBpbmcgYW5kIHdyYXBwaW5nLgogICAgICB2YXIgY2xlYXIgPSBmdW5jdGlvbigpe307CiAgICAgIHNpemVCYXIoKTsKICAgICAgc2l6ZUludGVydmFsID0gc2V0SW50ZXJ2YWwoc2l6ZUJhciwgNTAwKTsKCiAgICAgIGZ1bmN0aW9uIG5vbldyYXBwaW5nKCkgewogICAgICAgIHZhciBuZXh0TnVtID0gMTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGUoKSB7CiAgICAgICAgICB2YXIgdGFyZ2V0ID0gNTAgKyBNYXRoLm1heChib2R5Lm9mZnNldEhlaWdodCwgZnJhbWUub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIHdoaWxlIChzY3JvbGxlci5vZmZzZXRIZWlnaHQgPCB0YXJnZXQpIHsKICAgICAgICAgICAgc2Nyb2xsZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIikpOwogICAgICAgICAgICBzY3JvbGxlci5sYXN0Q2hpbGQuaW5uZXJIVE1MID0gbmV4dE51bSsrOwogICAgICAgICAgfQogICAgICAgICAgZG9TY3JvbGwoKTsKICAgICAgICB9CiAgICAgICAgdmFyIG9uU2Nyb2xsID0gd2luLmFkZEV2ZW50SGFuZGxlcih3aW4sICJzY3JvbGwiLCB1cGRhdGUsIHRydWUpLAogICAgICAgICAgICBvblJlc2l6ZSA9IHdpbi5hZGRFdmVudEhhbmRsZXIod2luLCAicmVzaXplIiwgdXBkYXRlLCB0cnVlKTsKICAgICAgICBjbGVhciA9IGZ1bmN0aW9uKCl7b25TY3JvbGwoKTsgb25SZXNpemUoKTt9OwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHdyYXBwaW5nKCkgewogICAgICAgIHZhciBub2RlLCBsaW5lTnVtLCBuZXh0LCBwb3M7CgogICAgICAgIGZ1bmN0aW9uIGFkZE51bShuKSB7CiAgICAgICAgICBpZiAoIWxpbmVOdW0pIGxpbmVOdW0gPSBzY3JvbGxlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSk7CiAgICAgICAgICBsaW5lTnVtLmlubmVySFRNTCA9IG47CiAgICAgICAgICBwb3MgPSBsaW5lTnVtLm9mZnNldEhlaWdodCArIGxpbmVOdW0ub2Zmc2V0VG9wOwogICAgICAgICAgbGluZU51bSA9IGxpbmVOdW0ubmV4dFNpYmxpbmc7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHdvcmsoKSB7CiAgICAgICAgICBpZiAoIXNjcm9sbGVyLnBhcmVudE5vZGUgfHwgc2Nyb2xsZXIucGFyZW50Tm9kZSAhPSBzZWxmLmxpbmVOdW1iZXJzKSByZXR1cm47CgogICAgICAgICAgdmFyIGVuZFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHNlbGYub3B0aW9ucy5saW5lTnVtYmVyVGltZTsKICAgICAgICAgIHdoaWxlIChub2RlKSB7CiAgICAgICAgICAgIGFkZE51bShuZXh0KyspOwogICAgICAgICAgICBmb3IgKDsgbm9kZSAmJiAhd2luLmlzQlIobm9kZSk7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgICAgdmFyIGJvdHQgPSBub2RlLm9mZnNldFRvcCArIG5vZGUub2Zmc2V0SGVpZ2h0OwogICAgICAgICAgICAgIHdoaWxlIChib3R0IC0gMyA+IHBvcykgYWRkTnVtKCImbmJzcDsiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobm9kZSkgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CiAgICAgICAgICAgIGlmIChuZXcgRGF0ZSgpLmdldFRpbWUoKSA+IGVuZFRpbWUpIHsKICAgICAgICAgICAgICBwZW5kaW5nID0gc2V0VGltZW91dCh3b3JrLCBzZWxmLm9wdGlvbnMubGluZU51bWJlckRlbGF5KTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIC8vIFdoaWxlIHRoZXJlIGFyZSB1bi1wcm9jZXNzZWQgbnVtYmVyIERJVnMsIG9yIHRoZSBzY3JvbGxlciBpcyBzbWFsbGVyIHRoYW4gdGhlIGZyYW1lLi4uCiAgICAgICAgICB2YXIgdGFyZ2V0ID0gNTAgKyBNYXRoLm1heChib2R5Lm9mZnNldEhlaWdodCwgZnJhbWUub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIHdoaWxlIChsaW5lTnVtIHx8IHNjcm9sbGVyLm9mZnNldEhlaWdodCA8IHRhcmdldCkgYWRkTnVtKG5leHQrKyk7CiAgICAgICAgICBkb1Njcm9sbCgpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBzdGFydCgpIHsKICAgICAgICAgIGRvU2Nyb2xsKCk7CiAgICAgICAgICBub2RlID0gYm9keS5maXJzdENoaWxkOwogICAgICAgICAgbGluZU51bSA9IHNjcm9sbGVyLmZpcnN0Q2hpbGQ7CiAgICAgICAgICBwb3MgPSAwOwogICAgICAgICAgbmV4dCA9IDE7CiAgICAgICAgICB3b3JrKCk7CiAgICAgICAgfQoKICAgICAgICBzdGFydCgpOwogICAgICAgIHZhciBwZW5kaW5nID0gbnVsbDsKICAgICAgICBmdW5jdGlvbiB1cGRhdGUoKSB7CiAgICAgICAgICBpZiAocGVuZGluZykgY2xlYXJUaW1lb3V0KHBlbmRpbmcpOwogICAgICAgICAgc3RhcnQoKTsKICAgICAgICB9CiAgICAgICAgc2VsZi51cGRhdGVOdW1iZXJzID0gdXBkYXRlOwogICAgICAgIHZhciBvblNjcm9sbCA9IHdpbi5hZGRFdmVudEhhbmRsZXIod2luLCAic2Nyb2xsIiwgZG9TY3JvbGwsIHRydWUpLAogICAgICAgICAgICBvblJlc2l6ZSA9IHdpbi5hZGRFdmVudEhhbmRsZXIod2luLCAicmVzaXplIiwgdXBkYXRlLCB0cnVlKTsKICAgICAgICBjbGVhciA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICBpZiAocGVuZGluZykgY2xlYXJUaW1lb3V0KHBlbmRpbmcpOwogICAgICAgICAgaWYgKHNlbGYudXBkYXRlTnVtYmVycyA9PSB1cGRhdGUpIHNlbGYudXBkYXRlTnVtYmVycyA9IG51bGw7CiAgICAgICAgICBvblNjcm9sbCgpOwogICAgICAgICAgb25SZXNpemUoKTsKICAgICAgICB9OwogICAgICB9CiAgICAgICh0aGlzLm9wdGlvbnMudGV4dFdyYXBwaW5nID8gd3JhcHBpbmcgOiBub25XcmFwcGluZykoKTsKICAgIH0KICB9OwoKICBDb2RlTWlycm9yLkludmFsaWRMaW5lSGFuZGxlID0ge3RvU3RyaW5nOiBmdW5jdGlvbigpe3JldHVybiAiQ29kZU1pcnJvci5JbnZhbGlkTGluZUhhbmRsZSI7fX07CgogIENvZGVNaXJyb3IucmVwbGFjZSA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PSAic3RyaW5nIikKICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQpOwogICAgcmV0dXJuIGZ1bmN0aW9uKG5ld0VsZW1lbnQpIHsKICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdFbGVtZW50LCBlbGVtZW50KTsKICAgIH07CiAgfTsKCiAgQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEgPSBmdW5jdGlvbihhcmVhLCBvcHRpb25zKSB7CiAgICBpZiAodHlwZW9mIGFyZWEgPT0gInN0cmluZyIpCiAgICAgIGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhcmVhKTsKCiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgIGlmIChhcmVhLnN0eWxlLndpZHRoICYmIG9wdGlvbnMud2lkdGggPT0gbnVsbCkKICAgICAgb3B0aW9ucy53aWR0aCA9IGFyZWEuc3R5bGUud2lkdGg7CiAgICBpZiAoYXJlYS5zdHlsZS5oZWlnaHQgJiYgb3B0aW9ucy5oZWlnaHQgPT0gbnVsbCkKICAgICAgb3B0aW9ucy5oZWlnaHQgPSBhcmVhLnN0eWxlLmhlaWdodDsKICAgIGlmIChvcHRpb25zLmNvbnRlbnQgPT0gbnVsbCkgb3B0aW9ucy5jb250ZW50ID0gYXJlYS52YWx1ZTsKCiAgICBpZiAoYXJlYS5mb3JtKSB7CiAgICAgIGZ1bmN0aW9uIHVwZGF0ZUZpZWxkKCkgewogICAgICAgIGFyZWEudmFsdWUgPSBtaXJyb3IuZ2V0Q29kZSgpOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgYXJlYS5mb3JtLmFkZEV2ZW50TGlzdGVuZXIgPT0gImZ1bmN0aW9uIikKICAgICAgICBhcmVhLmZvcm0uYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgdXBkYXRlRmllbGQsIGZhbHNlKTsKICAgICAgZWxzZQogICAgICAgIGFyZWEuZm9ybS5hdHRhY2hFdmVudCgib25zdWJtaXQiLCB1cGRhdGVGaWVsZCk7CiAgICB9CgogICAgZnVuY3Rpb24gaW5zZXJ0KGZyYW1lKSB7CiAgICAgIGlmIChhcmVhLm5leHRTaWJsaW5nKQogICAgICAgIGFyZWEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZnJhbWUsIGFyZWEubmV4dFNpYmxpbmcpOwogICAgICBlbHNlCiAgICAgICAgYXJlYS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGZyYW1lKTsKICAgIH0KCiAgICBhcmVhLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICB2YXIgbWlycm9yID0gbmV3IENvZGVNaXJyb3IoaW5zZXJ0LCBvcHRpb25zKTsKICAgIHJldHVybiBtaXJyb3I7CiAgfTsKCiAgQ29kZU1pcnJvci5pc1Byb2JhYmx5U3VwcG9ydGVkID0gZnVuY3Rpb24oKSB7CiAgICAvLyBUaGlzIGlzIHJhdGhlciBhd2Z1bCwgYnV0IGNhbiBiZSB1c2VmdWwuCiAgICB2YXIgbWF0Y2g7CiAgICBpZiAod2luZG93Lm9wZXJhKQogICAgICByZXR1cm4gTnVtYmVyKHdpbmRvdy5vcGVyYS52ZXJzaW9uKCkpID49IDkuNTI7CiAgICBlbHNlIGlmICgvQXBwbGUgQ29tcHV0ZXJzLCBJbmMvLnRlc3QobmF2aWdhdG9yLnZlbmRvcikgJiYgKG1hdGNoID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvVmVyc2lvblwvKFxkKyg/OlwuXGQrKT8pXC4vKSkpCiAgICAgIHJldHVybiBOdW1iZXIobWF0Y2hbMV0pID49IDM7CiAgICBlbHNlIGlmIChkb2N1bWVudC5zZWxlY3Rpb24gJiYgd2luZG93LkFjdGl2ZVhPYmplY3QgJiYgKG1hdGNoID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTVNJRSAoXGQrKD86XC5cZCopPylcYi8pKSkKICAgICAgcmV0dXJuIE51bWJlcihtYXRjaFsxXSkgPj0gNjsKICAgIGVsc2UgaWYgKG1hdGNoID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvZ2Vja29cLyhcZHs4fSkvaSkpCiAgICAgIHJldHVybiBOdW1iZXIobWF0Y2hbMV0pID49IDIwMDUwOTAxOwogICAgZWxzZSBpZiAobWF0Y2ggPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvKFxkKykvKSkKICAgICAgcmV0dXJuIE51bWJlcihtYXRjaFsxXSkgPj0gNTI1OwogICAgZWxzZQogICAgICByZXR1cm4gbnVsbDsKICB9OwoKICByZXR1cm4gQ29kZU1pcnJvcjsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/editor.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogVGhlIEVkaXRvciBvYmplY3QgbWFuYWdlcyB0aGUgY29udGVudCBvZiB0aGUgZWRpdGFibGUgZnJhbWUuIEl0CiAqIGNhdGNoZXMgZXZlbnRzLCBjb2xvdXJzIG5vZGVzLCBhbmQgaW5kZW50cyBsaW5lcy4gVGhpcyBmaWxlIGFsc28KICogaG9sZHMgc29tZSBmdW5jdGlvbnMgZm9yIHRyYW5zZm9ybWluZyBhcmJpdHJhcnkgRE9NIHN0cnVjdHVyZXMgaW50bwogKiBwbGFpbiBzZXF1ZW5jZXMgb2YgPHNwYW4+IGFuZCA8YnI+IGVsZW1lbnRzCiAqLwoKLy8gTWFrZSBzdXJlIGEgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gdHdvIGNvbnNlY3V0aXZlICdjb2xsYXBzZWFibGUnCi8vIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KZnVuY3Rpb24gbWFrZVdoaXRlU3BhY2UobikgewogIHZhciBidWZmZXIgPSBbXSwgbmIgPSB0cnVlOwogIGZvciAoOyBuID4gMDsgbi0tKSB7CiAgICBidWZmZXIucHVzaCgobmIgfHwgbiA9PSAxKSA/IG5ic3AgOiAiICIpOwogICAgbmIgPSAhbmI7CiAgfQogIHJldHVybiBidWZmZXIuam9pbigiIik7Cn0KCi8vIENyZWF0ZSBhIHNldCBvZiB3aGl0ZS1zcGFjZSBjaGFyYWN0ZXJzIHRoYXQgd2lsbCBub3QgYmUgY29sbGFwc2VkCi8vIGJ5IHRoZSBicm93c2VyLCBidXQgd2lsbCBub3QgYnJlYWsgdGV4dC13cmFwcGluZyBlaXRoZXIuCmZ1bmN0aW9uIGZpeFNwYWNlcyhzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmNoYXJBdCgwKSA9PSAiICIpIHN0cmluZyA9IG5ic3AgKyBzdHJpbmcuc2xpY2UoMSk7CiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cdC9nLCBmdW5jdGlvbigpe3JldHVybiBtYWtlV2hpdGVTcGFjZShpbmRlbnRVbml0KTt9KQogICAgLnJlcGxhY2UoL1sgXHUwMGEwXXsyLH0vZywgZnVuY3Rpb24ocykge3JldHVybiBtYWtlV2hpdGVTcGFjZShzLmxlbmd0aCk7fSk7Cn0KCmZ1bmN0aW9uIGNsZWFuVGV4dCh0ZXh0KSB7CiAgcmV0dXJuIHRleHQucmVwbGFjZSgvXHUwMGEwL2csICIgIikucmVwbGFjZSgvXHUyMDBiL2csICIiKTsKfQoKLy8gQ3JlYXRlIGEgU1BBTiBub2RlIHdpdGggdGhlIGV4cGVjdGVkIHByb3BlcnRpZXMgZm9yIGRvY3VtZW50IHBhcnQKLy8gc3BhbnMuCmZ1bmN0aW9uIG1ha2VQYXJ0U3Bhbih2YWx1ZSwgZG9jKSB7CiAgdmFyIHRleHQgPSB2YWx1ZTsKICBpZiAodmFsdWUubm9kZVR5cGUgPT0gMykgdGV4dCA9IHZhbHVlLm5vZGVWYWx1ZTsKICBlbHNlIHZhbHVlID0gZG9jLmNyZWF0ZVRleHROb2RlKHRleHQpOwoKICB2YXIgc3BhbiA9IGRvYy5jcmVhdGVFbGVtZW50KCJTUEFOIik7CiAgc3Bhbi5pc1BhcnQgPSB0cnVlOwogIHNwYW4uYXBwZW5kQ2hpbGQodmFsdWUpOwogIHNwYW4uY3VycmVudFRleHQgPSB0ZXh0OwogIHJldHVybiBzcGFuOwp9CgovLyBPbiB3ZWJraXQsIHdoZW4gdGhlIGxhc3QgQlIgb2YgdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUgdGV4dAovLyBiZWhpbmQgaXQsIHRoZSBjdXJzb3IgY2FuIG5vdCBiZSBwdXQgb24gdGhlIGxpbmUgYWZ0ZXIgaXQuIFRoaXMKLy8gbWFrZXMgcHJlc3NpbmcgZW50ZXIgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQgb2NjYXNpb25hbGx5IGRvCi8vIG5vdGhpbmcgKG9yIGF0IGxlYXN0IHNlZW0gdG8gZG8gbm90aGluZykuIFRvIHdvcmsgYXJvdW5kIGl0LCB0aGlzCi8vIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhlIGRvY3VtZW50IGVuZHMgd2l0aCBhIHNwYW4gY29udGFpbmluZyBhCi8vIHplcm8td2lkdGggc3BhY2UgY2hhcmFjdGVyLiBUaGUgdHJhdmVyc2VET00gaXRlcmF0b3IgZmlsdGVycyBzdWNoCi8vIGNoYXJhY3RlciBvdXQgYWdhaW4sIHNvIHRoYXQgdGhlIHBhcnNlcnMgd29uJ3Qgc2VlIHRoZW0uIFRoaXMKLy8gZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYSBmZXcgc3RyYXRlZ2ljIHBsYWNlcyB0byBtYWtlIHN1cmUgdGhlCi8vIHp3c3AgaXMgcmVzdG9yZWQgYWZ0ZXIgdGhlIGhpZ2hsaWdodGluZyBwcm9jZXNzIGVhdHMgaXQuCnZhciB3ZWJraXRMYXN0TGluZUhhY2sgPSB3ZWJraXQgPwogIGZ1bmN0aW9uKGNvbnRhaW5lcikgewogICAgdmFyIGxhc3QgPSBjb250YWluZXIubGFzdENoaWxkOwogICAgaWYgKCFsYXN0IHx8ICFsYXN0LmlzUGFydCB8fCBsYXN0LnRleHRDb250ZW50ICE9ICJcdTIwMGIiKQogICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobWFrZVBhcnRTcGFuKCJcdTIwMGIiLCBjb250YWluZXIub3duZXJEb2N1bWVudCkpOwogIH0gOiBmdW5jdGlvbigpIHt9OwoKdmFyIEVkaXRvciA9IChmdW5jdGlvbigpewogIC8vIFRoZSBIVE1MIGVsZW1lbnRzIHdob3NlIGNvbnRlbnQgc2hvdWxkIGJlIHN1ZmZpeGVkIGJ5IGEgbmV3bGluZQogIC8vIHdoZW4gY29udmVydGluZyB0aGVtIHRvIGZsYXQgdGV4dC4KICB2YXIgbmV3bGluZUVsZW1lbnRzID0geyJQIjogdHJ1ZSwgIkRJViI6IHRydWUsICJMSSI6IHRydWV9OwoKICBmdW5jdGlvbiBhc0VkaXRvckxpbmVzKHN0cmluZykgewogICAgdmFyIHRhYiA9IG1ha2VXaGl0ZVNwYWNlKGluZGVudFVuaXQpOwogICAgcmV0dXJuIG1hcChzdHJpbmcucmVwbGFjZSgvXHQvZywgdGFiKS5yZXBsYWNlKC9cdTAwYTAvZywgIiAiKS5yZXBsYWNlKC9cclxuPy9nLCAiXG4iKS5zcGxpdCgiXG4iKSwgZml4U3BhY2VzKTsKICB9CgogIC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgdHJhdmVyc2VET00uIEZsYXR0ZW5zIGFuIGFyYml0cmFyeSBET00gbm9kZQogIC8vIGludG8gYW4gYXJyYXkgb2YgdGV4dG5vZGVzIGFuZCA8YnI+IHRhZ3MuCiAgZnVuY3Rpb24gc2ltcGxpZnlET00ocm9vdCwgYXRFbmQpIHsKICAgIHZhciBkb2MgPSByb290Lm93bmVyRG9jdW1lbnQ7CiAgICB2YXIgcmVzdWx0ID0gW107CiAgICB2YXIgbGVhdmluZyA9IHRydWU7CgogICAgZnVuY3Rpb24gc2ltcGxpZnlOb2RlKG5vZGUsIHRvcCkgewogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7CiAgICAgICAgdmFyIHRleHQgPSBub2RlLm5vZGVWYWx1ZSA9IGZpeFNwYWNlcyhub2RlLm5vZGVWYWx1ZS5yZXBsYWNlKC9bXHJcdTIwMGJdL2csICIiKS5yZXBsYWNlKC9cbi9nLCAiICIpKTsKICAgICAgICBpZiAodGV4dC5sZW5ndGgpIGxlYXZpbmcgPSBmYWxzZTsKICAgICAgICByZXN1bHQucHVzaChub2RlKTsKICAgICAgfQogICAgICBlbHNlIGlmIChpc0JSKG5vZGUpICYmIG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPT0gMCkgewogICAgICAgIGxlYXZpbmcgPSB0cnVlOwogICAgICAgIHJlc3VsdC5wdXNoKG5vZGUpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGZvckVhY2gobm9kZS5jaGlsZE5vZGVzLCBzaW1wbGlmeU5vZGUpOwogICAgICAgIGlmICghbGVhdmluZyAmJiBuZXdsaW5lRWxlbWVudHMuaGFzT3duUHJvcGVydHkobm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpKSkgewogICAgICAgICAgbGVhdmluZyA9IHRydWU7CiAgICAgICAgICBpZiAoIWF0RW5kIHx8ICF0b3ApCiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRvYy5jcmVhdGVFbGVtZW50KCJCUiIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBzaW1wbGlmeU5vZGUocm9vdCwgdHJ1ZSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gQ3JlYXRlcyBhIE1vY2hpS2l0LXN0eWxlIGl0ZXJhdG9yIHRoYXQgZ29lcyBvdmVyIGEgc2VyaWVzIG9mIERPTQogIC8vIG5vZGVzLiBUaGUgdmFsdWVzIGl0IHlpZWxkcyBhcmUgc3RyaW5ncywgdGhlIHRleHR1YWwgY29udGVudCBvZgogIC8vIHRoZSBub2Rlcy4gSXQgbWFrZXMgc3VyZSB0aGF0IGFsbCBub2RlcyB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZQogIC8vIG9uZSB3aG9zZSB0ZXh0IGlzIGJlaW5nIHlpZWxkZWQgaGF2ZSBiZWVuICdub3JtYWxpemVkJyB0byBiZSBqdXN0CiAgLy8gPHNwYW4+IGFuZCA8YnI+IGVsZW1lbnRzLgogIC8vIFNlZSB0aGUgc3RvcnkuaHRtbCBmaWxlIGZvciBzb21lIHNob3J0IHJlbWFya3MgYWJvdXQgdGhlIHVzZSBvZgogIC8vIGNvbnRpbnVhdGlvbi1wYXNzaW5nIHN0eWxlIGluIHRoaXMgaXRlcmF0b3IuCiAgZnVuY3Rpb24gdHJhdmVyc2VET00oc3RhcnQpewogICAgZnVuY3Rpb24geWllbGQodmFsdWUsIGMpe2NjID0gYzsgcmV0dXJuIHZhbHVlO30KICAgIGZ1bmN0aW9uIHB1c2goZnVuLCBhcmcsIGMpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBmdW4oYXJnLCBjKTt9O30KICAgIGZ1bmN0aW9uIHN0b3AoKXtjYyA9IHN0b3A7IHRocm93IFN0b3BJdGVyYXRpb247fTsKICAgIHZhciBjYyA9IHB1c2goc2Nhbk5vZGUsIHN0YXJ0LCBzdG9wKTsKICAgIHZhciBvd25lciA9IHN0YXJ0Lm93bmVyRG9jdW1lbnQ7CiAgICB2YXIgbm9kZVF1ZXVlID0gW107CgogICAgLy8gQ3JlYXRlIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBpbnNlcnQgbm9kZXMgYWZ0ZXIgdGhlCiAgICAvLyBvbmUgZ2l2ZW4gYXMgYXJndW1lbnQuCiAgICBmdW5jdGlvbiBwb2ludEF0KG5vZGUpewogICAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlOwogICAgICB2YXIgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmc7CiAgICAgIHJldHVybiBmdW5jdGlvbihuZXdub2RlKSB7CiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShuZXdub2RlLCBuZXh0KTsKICAgICAgfTsKICAgIH0KICAgIHZhciBwb2ludCA9IG51bGw7CgogICAgLy8gVGhpcyBhbiBPcGVyYS1zcGVjaWZpYyBoYWNrIC0tIGFsd2F5cyBpbnNlcnQgYW4gZW1wdHkgc3BhbgogICAgLy8gYmV0d2VlbiB0d28gQlJzLCBiZWNhdXNlIE9wZXJhJ3MgY3Vyc29yIGNvZGUgZ2V0cyB0ZXJyaWJseQogICAgLy8gY29uZnVzZWQgd2hlbiB0aGUgY3Vyc29yIGlzIGJldHdlZW4gdHdvIEJScy4KICAgIHZhciBhZnRlckJSID0gdHJ1ZTsKCiAgICAvLyBJbnNlcnQgYSBub3JtYWxpemVkIG5vZGUgYXQgdGhlIGN1cnJlbnQgcG9pbnQuIElmIGl0IGlzIGEgdGV4dAogICAgLy8gbm9kZSwgd3JhcCBpdCBpbiBhIDxzcGFuPiwgYW5kIGdpdmUgdGhhdCBzcGFuIGEgY3VycmVudFRleHQKICAgIC8vIHByb3BlcnR5IC0tIHRoaXMgaXMgdXNlZCB0byBjYWNoZSB0aGUgbm9kZVZhbHVlLCBiZWNhdXNlCiAgICAvLyBkaXJlY3RseSBhY2Nlc3Npbmcgbm9kZVZhbHVlIGlzIGhvcnJpYmx5IHNsb3cgb24gc29tZSBicm93c2Vycy4KICAgIC8vIFRoZSBkaXJ0eSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IHRoZSBoaWdobGlnaHRlciB0byBkZXRlcm1pbmUKICAgIC8vIHdoaWNoIHBhcnRzIG9mIHRoZSBkb2N1bWVudCBoYXZlIHRvIGJlIHJlLWhpZ2hsaWdodGVkLgogICAgZnVuY3Rpb24gaW5zZXJ0UGFydChwYXJ0KXsKICAgICAgdmFyIHRleHQgPSAiXG4iOwogICAgICBpZiAocGFydC5ub2RlVHlwZSA9PSAzKSB7CiAgICAgICAgc2VsZWN0LnNuYXBzaG90Q2hhbmdlZCgpOwogICAgICAgIHBhcnQgPSBtYWtlUGFydFNwYW4ocGFydCwgb3duZXIpOwogICAgICAgIHRleHQgPSBwYXJ0LmN1cnJlbnRUZXh0OwogICAgICAgIGFmdGVyQlIgPSBmYWxzZTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBpZiAoYWZ0ZXJCUiAmJiB3aW5kb3cub3BlcmEpCiAgICAgICAgICBwb2ludChtYWtlUGFydFNwYW4oIiIsIG93bmVyKSk7CiAgICAgICAgYWZ0ZXJCUiA9IHRydWU7CiAgICAgIH0KICAgICAgcGFydC5kaXJ0eSA9IHRydWU7CiAgICAgIG5vZGVRdWV1ZS5wdXNoKHBhcnQpOwogICAgICBwb2ludChwYXJ0KTsKICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CgogICAgLy8gRXh0cmFjdCB0aGUgdGV4dCBhbmQgbmV3bGluZXMgZnJvbSBhIERPTSBub2RlLCBpbnNlcnQgdGhlbSBpbnRvCiAgICAvLyB0aGUgZG9jdW1lbnQsIGFuZCB5aWVsZCB0aGUgdGV4dHVhbCBjb250ZW50LiBVc2VkIHRvIHJlcGxhY2UKICAgIC8vIG5vbi1ub3JtYWxpemVkIG5vZGVzLgogICAgZnVuY3Rpb24gd3JpdGVOb2RlKG5vZGUsIGMsIGVuZCkgewogICAgICB2YXIgdG9ZaWVsZCA9IFtdOwogICAgICBmb3JFYWNoKHNpbXBsaWZ5RE9NKG5vZGUsIGVuZCksIGZ1bmN0aW9uKHBhcnQpIHsKICAgICAgICB0b1lpZWxkLnB1c2goaW5zZXJ0UGFydChwYXJ0KSk7CiAgICAgIH0pOwogICAgICByZXR1cm4geWllbGQodG9ZaWVsZC5qb2luKCIiKSwgYyk7CiAgICB9CgogICAgLy8gQ2hlY2sgd2hldGhlciBhIG5vZGUgaXMgYSBub3JtYWxpemVkIDxzcGFuPiBlbGVtZW50LgogICAgZnVuY3Rpb24gcGFydE5vZGUobm9kZSl7CiAgICAgIGlmIChub2RlLmlzUGFydCAmJiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID09IDEgJiYgbm9kZS5maXJzdENoaWxkLm5vZGVUeXBlID09IDMpIHsKICAgICAgICBub2RlLmN1cnJlbnRUZXh0ID0gbm9kZS5maXJzdENoaWxkLm5vZGVWYWx1ZTsKICAgICAgICByZXR1cm4gIS9bXG5cdFxyXS8udGVzdChub2RlLmN1cnJlbnRUZXh0KTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gSGFuZGxlIGEgbm9kZS4gQWRkIGl0cyBzdWNjZXNzb3IgdG8gdGhlIGNvbnRpbnVhdGlvbiBpZiB0aGVyZQogICAgLy8gaXMgb25lLCBmaW5kIG91dCB3aGV0aGVyIHRoZSBub2RlIGlzIG5vcm1hbGl6ZWQuIElmIGl0IGlzLAogICAgLy8geWllbGQgaXRzIGNvbnRlbnQsIG90aGVyd2lzZSwgbm9ybWFsaXplIGl0ICh3cml0ZU5vZGUgd2lsbCB0YWtlCiAgICAvLyBjYXJlIG9mIHlpZWxkaW5nKS4KICAgIGZ1bmN0aW9uIHNjYW5Ob2RlKG5vZGUsIGMpewogICAgICBpZiAobm9kZS5uZXh0U2libGluZykKICAgICAgICBjID0gcHVzaChzY2FuTm9kZSwgbm9kZS5uZXh0U2libGluZywgYyk7CgogICAgICBpZiAocGFydE5vZGUobm9kZSkpewogICAgICAgIG5vZGVRdWV1ZS5wdXNoKG5vZGUpOwogICAgICAgIGFmdGVyQlIgPSBmYWxzZTsKICAgICAgICByZXR1cm4geWllbGQobm9kZS5jdXJyZW50VGV4dCwgYyk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoaXNCUihub2RlKSkgewogICAgICAgIGlmIChhZnRlckJSICYmIHdpbmRvdy5vcGVyYSkKICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobWFrZVBhcnRTcGFuKCIiLCBvd25lciksIG5vZGUpOwogICAgICAgIG5vZGVRdWV1ZS5wdXNoKG5vZGUpOwogICAgICAgIGFmdGVyQlIgPSB0cnVlOwogICAgICAgIHJldHVybiB5aWVsZCgiXG4iLCBjKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICB2YXIgZW5kID0gIW5vZGUubmV4dFNpYmxpbmc7CiAgICAgICAgcG9pbnQgPSBwb2ludEF0KG5vZGUpOwogICAgICAgIHJlbW92ZUVsZW1lbnQobm9kZSk7CiAgICAgICAgcmV0dXJuIHdyaXRlTm9kZShub2RlLCBjLCBlbmQpOwogICAgICB9CiAgICB9CgogICAgLy8gTW9jaGlLaXQgaXRlcmF0b3JzIGFyZSBvYmplY3RzIHdpdGggYSBuZXh0IGZ1bmN0aW9uIHRoYXQKICAgIC8vIHJldHVybnMgdGhlIG5leHQgdmFsdWUgb3IgdGhyb3dzIFN0b3BJdGVyYXRpb24gd2hlbiB0aGVyZSBhcmUKICAgIC8vIG5vIG1vcmUgdmFsdWVzLgogICAgcmV0dXJuIHtuZXh0OiBmdW5jdGlvbigpe3JldHVybiBjYygpO30sIG5vZGVzOiBub2RlUXVldWV9OwogIH0KCiAgLy8gRGV0ZXJtaW5lIHRoZSB0ZXh0IHNpemUgb2YgYSBwcm9jZXNzZWQgbm9kZS4KICBmdW5jdGlvbiBub2RlU2l6ZShub2RlKSB7CiAgICByZXR1cm4gaXNCUihub2RlKSA/IDEgOiBub2RlLmN1cnJlbnRUZXh0Lmxlbmd0aDsKICB9CgogIC8vIFNlYXJjaCBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdG9wLWxldmVsIG5vZGVzIHVudGlsIHRoZSBuZXh0IEJSIG9yCiAgLy8gdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZS4KICBmdW5jdGlvbiBzdGFydE9mTGluZShub2RlKSB7CiAgICB3aGlsZSAobm9kZSAmJiAhaXNCUihub2RlKSkgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nOwogICAgcmV0dXJuIG5vZGU7CiAgfQogIGZ1bmN0aW9uIGVuZE9mTGluZShub2RlLCBjb250YWluZXIpIHsKICAgIGlmICghbm9kZSkgbm9kZSA9IGNvbnRhaW5lci5maXJzdENoaWxkOwogICAgZWxzZSBpZiAoaXNCUihub2RlKSkgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CgogICAgd2hpbGUgKG5vZGUgJiYgIWlzQlIobm9kZSkpIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBmdW5jdGlvbiB0aW1lKCkge3JldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTt9CgogIC8vIENsaWVudCBpbnRlcmZhY2UgZm9yIHNlYXJjaGluZyB0aGUgY29udGVudCBvZiB0aGUgZWRpdG9yLiBDcmVhdGUKICAvLyB0aGVzZSBieSBjYWxsaW5nIENvZGVNaXJyb3IuZ2V0U2VhcmNoQ3Vyc29yLiBUbyB1c2UsIGNhbGwKICAvLyBmaW5kTmV4dCBvbiB0aGUgcmVzdWx0aW5nIG9iamVjdCAtLSB0aGlzIHJldHVybnMgYSBib29sZWFuCiAgLy8gaW5kaWNhdGluZyB3aGV0aGVyIGFueXRoaW5nIHdhcyBmb3VuZCwgYW5kIGNhbiBiZSBjYWxsZWQgYWdhaW4gdG8KICAvLyBza2lwIHRvIHRoZSBuZXh0IGZpbmQuIFVzZSB0aGUgc2VsZWN0IGFuZCByZXBsYWNlIG1ldGhvZHMgdG8KICAvLyBhY3R1YWxseSBkbyBzb21ldGhpbmcgd2l0aCB0aGUgZm91bmQgbG9jYXRpb25zLgogIGZ1bmN0aW9uIFNlYXJjaEN1cnNvcihlZGl0b3IsIHN0cmluZywgZnJvbUN1cnNvciwgY2FzZUZvbGQpIHsKICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yOwogICAgdGhpcy5jYXNlRm9sZCA9IGNhc2VGb2xkOwogICAgaWYgKGNhc2VGb2xkKSBzdHJpbmcgPSBzdHJpbmcudG9Mb3dlckNhc2UoKTsKICAgIHRoaXMuaGlzdG9yeSA9IGVkaXRvci5oaXN0b3J5OwogICAgdGhpcy5oaXN0b3J5LmNvbW1pdCgpOwoKICAgIC8vIEFyZSB3ZSBjdXJyZW50bHkgYXQgYW4gb2NjdXJyZW5jZSBvZiB0aGUgc2VhcmNoIHN0cmluZz8KICAgIHRoaXMuYXRPY2N1cnJlbmNlID0gZmFsc2U7CiAgICAvLyBUaGUgb2JqZWN0IHN0b3JlcyBhIHNldCBvZiBub2RlcyBjb21pbmcgYWZ0ZXIgaXRzIGN1cnJlbnQKICAgIC8vIHBvc2l0aW9uLCBzbyB0aGF0IHdoZW4gdGhlIGN1cnJlbnQgcG9pbnQgaXMgdGFrZW4gb3V0IG9mIHRoZQogICAgLy8gRE9NIHRyZWUsIHdlIGNhbiBzdGlsbCB0cnkgdG8gY29udGludWUuCiAgICB0aGlzLmZhbGxiYWNrU2l6ZSA9IDE1OwogICAgdmFyIGN1cnNvcjsKICAgIC8vIFN0YXJ0IGZyb20gdGhlIGN1cnNvciB3aGVuIHNwZWNpZmllZCBhbmQgYSBjdXJzb3IgY2FuIGJlIGZvdW5kLgogICAgaWYgKGZyb21DdXJzb3IgJiYgKGN1cnNvciA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5lZGl0b3IuY29udGFpbmVyKSkpIHsKICAgICAgdGhpcy5saW5lID0gY3Vyc29yLm5vZGU7CiAgICAgIHRoaXMub2Zmc2V0ID0gY3Vyc29yLm9mZnNldDsKICAgIH0KICAgIGVsc2UgewogICAgICB0aGlzLmxpbmUgPSBudWxsOwogICAgICB0aGlzLm9mZnNldCA9IDA7CiAgICB9CiAgICB0aGlzLnZhbGlkID0gISFzdHJpbmc7CgogICAgLy8gQ3JlYXRlIGEgbWF0Y2hlciBmdW5jdGlvbiBiYXNlZCBvbiB0aGUga2luZCBvZiBzdHJpbmcgd2UgaGF2ZS4KICAgIHZhciB0YXJnZXQgPSBzdHJpbmcuc3BsaXQoIlxuIiksIHNlbGYgPSB0aGlzOwogICAgdGhpcy5tYXRjaGVzID0gKHRhcmdldC5sZW5ndGggPT0gMSkgPwogICAgICAvLyBGb3Igb25lLWxpbmUgc3RyaW5ncywgc2VhcmNoaW5nIGNhbiBiZSBkb25lIHNpbXBseSBieSBjYWxsaW5nCiAgICAgIC8vIGluZGV4T2Ygb24gdGhlIGN1cnJlbnQgbGluZS4KICAgICAgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGxpbmUgPSBjbGVhblRleHQoc2VsZi5oaXN0b3J5LnRleHRBZnRlcihzZWxmLmxpbmUpLnNsaWNlKHNlbGYub2Zmc2V0KSk7CiAgICAgICAgdmFyIG1hdGNoID0gKHNlbGYuY2FzZUZvbGQgPyBsaW5lLnRvTG93ZXJDYXNlKCkgOiBsaW5lKS5pbmRleE9mKHN0cmluZyk7CiAgICAgICAgaWYgKG1hdGNoID4gLTEpCiAgICAgICAgICByZXR1cm4ge2Zyb206IHtub2RlOiBzZWxmLmxpbmUsIG9mZnNldDogc2VsZi5vZmZzZXQgKyBtYXRjaH0sCiAgICAgICAgICAgICAgICAgIHRvOiB7bm9kZTogc2VsZi5saW5lLCBvZmZzZXQ6IHNlbGYub2Zmc2V0ICsgbWF0Y2ggKyBzdHJpbmcubGVuZ3RofX07CiAgICAgIH0gOgogICAgICAvLyBNdWx0aS1saW5lIHN0cmluZ3MgcmVxdWlyZSBpbnRlcm5hbCBpdGVyYXRpb24gb3ZlciBsaW5lcywgYW5kCiAgICAgIC8vIHNvbWUgY2x1bmt5IGNoZWNrcyB0byBtYWtlIHN1cmUgdGhlIGZpcnN0IG1hdGNoIGVuZHMgYXQgdGhlCiAgICAgIC8vIGVuZCBvZiB0aGUgbGluZSBhbmQgdGhlIGxhc3QgbWF0Y2ggc3RhcnRzIGF0IHRoZSBzdGFydC4KICAgICAgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGZpcnN0TGluZSA9IGNsZWFuVGV4dChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKHNlbGYubGluZSkuc2xpY2Uoc2VsZi5vZmZzZXQpKTsKICAgICAgICB2YXIgbWF0Y2ggPSAoc2VsZi5jYXNlRm9sZCA/IGZpcnN0TGluZS50b0xvd2VyQ2FzZSgpIDogZmlyc3RMaW5lKS5sYXN0SW5kZXhPZih0YXJnZXRbMF0pOwogICAgICAgIGlmIChtYXRjaCA9PSAtMSB8fCBtYXRjaCAhPSBmaXJzdExpbmUubGVuZ3RoIC0gdGFyZ2V0WzBdLmxlbmd0aCkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB2YXIgc3RhcnRPZmZzZXQgPSBzZWxmLm9mZnNldCArIG1hdGNoOwoKICAgICAgICB2YXIgbGluZSA9IHNlbGYuaGlzdG9yeS5ub2RlQWZ0ZXIoc2VsZi5saW5lKTsKICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRhcmdldC5sZW5ndGggLSAxOyBpKyspIHsKICAgICAgICAgIHZhciBsaW5lID0gY2xlYW5UZXh0KHNlbGYuaGlzdG9yeS50ZXh0QWZ0ZXIobGluZSkpOwogICAgICAgICAgaWYgKChzZWxmLmNhc2VGb2xkID8gbGluZS50b0xvd2VyQ2FzZSgpIDogbGluZSkgIT0gdGFyZ2V0W2ldKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICBsaW5lID0gc2VsZi5oaXN0b3J5Lm5vZGVBZnRlcihsaW5lKTsKICAgICAgICB9CgogICAgICAgIHZhciBsYXN0TGluZSA9IGNsZWFuVGV4dChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKGxpbmUpKTsKICAgICAgICBpZiAoKHNlbGYuY2FzZUZvbGQgPyBsYXN0TGluZS50b0xvd2VyQ2FzZSgpIDogbGFzdExpbmUpLmluZGV4T2YodGFyZ2V0W3RhcmdldC5sZW5ndGggLSAxXSkgIT0gMCkKICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgcmV0dXJuIHtmcm9tOiB7bm9kZTogc2VsZi5saW5lLCBvZmZzZXQ6IHN0YXJ0T2Zmc2V0fSwKICAgICAgICAgICAgICAgIHRvOiB7bm9kZTogbGluZSwgb2Zmc2V0OiB0YXJnZXRbdGFyZ2V0Lmxlbmd0aCAtIDFdLmxlbmd0aH19OwogICAgICB9OwogIH0KCiAgU2VhcmNoQ3Vyc29yLnByb3RvdHlwZSA9IHsKICAgIGZpbmROZXh0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCF0aGlzLnZhbGlkKSByZXR1cm4gZmFsc2U7CiAgICAgIHRoaXMuYXRPY2N1cnJlbmNlID0gZmFsc2U7CiAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgIC8vIEdvIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudCBpZiB0aGUgY3VycmVudCBsaW5lIGlzCiAgICAgIC8vIG5vIGxvbmdlciBpbiB0aGUgRE9NIHRyZWUuCiAgICAgIGlmICh0aGlzLmxpbmUgJiYgIXRoaXMubGluZS5wYXJlbnROb2RlKSB7CiAgICAgICAgdGhpcy5saW5lID0gbnVsbDsKICAgICAgICB0aGlzLm9mZnNldCA9IDA7CiAgICAgIH0KCiAgICAgIC8vIFNldCB0aGUgY3Vyc29yJ3MgcG9zaXRpb24gb25lIGNoYXJhY3RlciBhZnRlciB0aGUgZ2l2ZW4KICAgICAgLy8gcG9zaXRpb24uCiAgICAgIGZ1bmN0aW9uIHNhdmVBZnRlcihwb3MpIHsKICAgICAgICBpZiAoc2VsZi5oaXN0b3J5LnRleHRBZnRlcihwb3Mubm9kZSkubGVuZ3RoID4gcG9zLm9mZnNldCkgewogICAgICAgICAgc2VsZi5saW5lID0gcG9zLm5vZGU7CiAgICAgICAgICBzZWxmLm9mZnNldCA9IHBvcy5vZmZzZXQgKyAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHNlbGYubGluZSA9IHNlbGYuaGlzdG9yeS5ub2RlQWZ0ZXIocG9zLm5vZGUpOwogICAgICAgICAgc2VsZi5vZmZzZXQgPSAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICB2YXIgbWF0Y2ggPSB0aGlzLm1hdGNoZXMoKTsKICAgICAgICAvLyBGb3VuZCB0aGUgc2VhcmNoIHN0cmluZy4KICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgIHRoaXMuYXRPY2N1cnJlbmNlID0gbWF0Y2g7CiAgICAgICAgICBzYXZlQWZ0ZXIobWF0Y2guZnJvbSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5saW5lID0gdGhpcy5oaXN0b3J5Lm5vZGVBZnRlcih0aGlzLmxpbmUpOwogICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKICAgICAgICAvLyBFbmQgb2YgZG9jdW1lbnQuCiAgICAgICAgaWYgKCF0aGlzLmxpbmUpIHsKICAgICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgc2VsZWN0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuYXRPY2N1cnJlbmNlKSB7CiAgICAgICAgc2VsZWN0LnNldEN1cnNvclBvcyh0aGlzLmVkaXRvci5jb250YWluZXIsIHRoaXMuYXRPY2N1cnJlbmNlLmZyb20sIHRoaXMuYXRPY2N1cnJlbmNlLnRvKTsKICAgICAgICBzZWxlY3Quc2Nyb2xsVG9DdXJzb3IodGhpcy5lZGl0b3IuY29udGFpbmVyKTsKICAgICAgfQogICAgfSwKCiAgICByZXBsYWNlOiBmdW5jdGlvbihzdHJpbmcpIHsKICAgICAgaWYgKHRoaXMuYXRPY2N1cnJlbmNlKSB7CiAgICAgICAgdmFyIGVuZCA9IHRoaXMuZWRpdG9yLnJlcGxhY2VSYW5nZSh0aGlzLmF0T2NjdXJyZW5jZS5mcm9tLCB0aGlzLmF0T2NjdXJyZW5jZS50bywgc3RyaW5nKTsKICAgICAgICB0aGlzLmxpbmUgPSBlbmQubm9kZTsKICAgICAgICB0aGlzLm9mZnNldCA9IGVuZC5vZmZzZXQ7CiAgICAgICAgdGhpcy5hdE9jY3VycmVuY2UgPSBmYWxzZTsKICAgICAgfQogICAgfQogIH07CgogIC8vIFRoZSBFZGl0b3Igb2JqZWN0IGlzIHRoZSBtYWluIGluc2lkZS10aGUtaWZyYW1lIGludGVyZmFjZS4KICBmdW5jdGlvbiBFZGl0b3Iob3B0aW9ucykgewogICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIHdpbmRvdy5pbmRlbnRVbml0ID0gb3B0aW9ucy5pbmRlbnRVbml0OwogICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICB0aGlzLmRvYyA9IGRvY3VtZW50OwogICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyID0gdGhpcy5kb2MuYm9keTsKICAgIHRoaXMud2luID0gd2luZG93OwogICAgdGhpcy5oaXN0b3J5ID0gbmV3IEhpc3RvcnkoY29udGFpbmVyLCBvcHRpb25zLnVuZG9EZXB0aCwgb3B0aW9ucy51bmRvRGVsYXksIHRoaXMpOwogICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgIGlmICghRWRpdG9yLlBhcnNlcikKICAgICAgdGhyb3cgIk5vIHBhcnNlciBsb2FkZWQuIjsKICAgIGlmIChvcHRpb25zLnBhcnNlckNvbmZpZyAmJiBFZGl0b3IuUGFyc2VyLmNvbmZpZ3VyZSkKICAgICAgRWRpdG9yLlBhcnNlci5jb25maWd1cmUob3B0aW9ucy5wYXJzZXJDb25maWcpOwoKICAgIGlmICghb3B0aW9ucy5yZWFkT25seSkKICAgICAgc2VsZWN0LnNldEN1cnNvclBvcyhjb250YWluZXIsIHtub2RlOiBudWxsLCBvZmZzZXQ6IDB9KTsKCiAgICB0aGlzLmRpcnR5ID0gW107CiAgICBpZiAob3B0aW9ucy5jb250ZW50KQogICAgICB0aGlzLmltcG9ydENvZGUob3B0aW9ucy5jb250ZW50KTsKICAgIHRoaXMuaGlzdG9yeS5vbkNoYW5nZSA9IG9wdGlvbnMub25DaGFuZ2U7CgogICAgaWYgKCFvcHRpb25zLnJlYWRPbmx5KSB7CiAgICAgIGlmIChvcHRpb25zLmNvbnRpbnVvdXNTY2FubmluZyAhPT0gZmFsc2UpIHsKICAgICAgICB0aGlzLnNjYW5uZXIgPSB0aGlzLmRvY3VtZW50U2Nhbm5lcihvcHRpb25zLnBhc3NUaW1lKTsKICAgICAgICB0aGlzLmRlbGF5U2Nhbm5pbmcoKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2V0RWRpdGFibGUoKSB7CiAgICAgICAgLy8gSW4gSUUsIGRlc2lnbk1vZGUgZnJhbWVzIGNhbiBub3QgcnVuIGFueSBzY3JpcHRzLCBzbyB3ZSB1c2UKICAgICAgICAvLyBjb250ZW50RWRpdGFibGUgaW5zdGVhZC4KICAgICAgICBpZiAoZG9jdW1lbnQuYm9keS5jb250ZW50RWRpdGFibGUgIT0gdW5kZWZpbmVkICYmIGludGVybmV0RXhwbG9yZXIpCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNvbnRlbnRFZGl0YWJsZSA9ICJ0cnVlIjsKICAgICAgICBlbHNlCiAgICAgICAgICBkb2N1bWVudC5kZXNpZ25Nb2RlID0gIm9uIjsKCiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmJvcmRlcldpZHRoID0gIjAiOwogICAgICAgIGlmICghb3B0aW9ucy50ZXh0V3JhcHBpbmcpCiAgICAgICAgICBjb250YWluZXIuc3R5bGUud2hpdGVTcGFjZSA9ICJub3dyYXAiOwogICAgICB9CgogICAgICAvLyBJZiBzZXR0aW5nIHRoZSBmcmFtZSBlZGl0YWJsZSBmYWlscywgdHJ5IGFnYWluIHdoZW4gdGhlIHVzZXIKICAgICAgLy8gZm9jdXMgaXQgKGhhcHBlbnMgd2hlbiB0aGUgZnJhbWUgaXMgbm90IHZpc2libGUgb24KICAgICAgLy8gaW5pdGlhbGlzYXRpb24sIGluIEZpcmVmb3gpLgogICAgICB0cnkgewogICAgICAgIHNldEVkaXRhYmxlKCk7CiAgICAgIH0KICAgICAgY2F0Y2goZSkgewogICAgICAgIHZhciBmb2N1c0V2ZW50ID0gYWRkRXZlbnRIYW5kbGVyKGRvY3VtZW50LCAiZm9jdXMiLCBmdW5jdGlvbigpIHsKICAgICAgICAgIGZvY3VzRXZlbnQoKTsKICAgICAgICAgIHNldEVkaXRhYmxlKCk7CiAgICAgICAgfSwgdHJ1ZSk7CiAgICAgIH0KCiAgICAgIGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudCwgImtleWRvd24iLCBtZXRob2QodGhpcywgImtleURvd24iKSk7CiAgICAgIGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudCwgImtleXByZXNzIiwgbWV0aG9kKHRoaXMsICJrZXlQcmVzcyIpKTsKICAgICAgYWRkRXZlbnRIYW5kbGVyKGRvY3VtZW50LCAia2V5dXAiLCBtZXRob2QodGhpcywgImtleVVwIikpOwoKICAgICAgZnVuY3Rpb24gY3Vyc29yQWN0aXZpdHkoKSB7c2VsZi5jdXJzb3JBY3Rpdml0eShmYWxzZSk7fQogICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQuYm9keSwgIm1vdXNldXAiLCBjdXJzb3JBY3Rpdml0eSk7CiAgICAgIGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudC5ib2R5LCAiY3V0IiwgY3Vyc29yQWN0aXZpdHkpOwoKICAgICAgYWRkRXZlbnRIYW5kbGVyKGRvY3VtZW50LmJvZHksICJwYXN0ZSIsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgY3Vyc29yQWN0aXZpdHkoKTsKICAgICAgICB2YXIgdGV4dCA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciBjbGlwYm9hcmREYXRhID0gZXZlbnQuY2xpcGJvYXJkRGF0YSB8fCB3aW5kb3cuY2xpcGJvYXJkRGF0YTsKICAgICAgICAgIGlmIChjbGlwYm9hcmREYXRhKSB0ZXh0ID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKCdUZXh0Jyk7CiAgICAgICAgfQogICAgICAgIGNhdGNoKGUpIHt9CiAgICAgICAgaWYgKHRleHQgIT09IG51bGwpIHsKICAgICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgICAgIHNlbGYucmVwbGFjZVNlbGVjdGlvbih0ZXh0KTsKICAgICAgICAgIHNlbGVjdC5zY3JvbGxUb0N1cnNvcih0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b01hdGNoUGFyZW5zKQogICAgICAgIGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudC5ib2R5LCAiY2xpY2siLCBtZXRob2QodGhpcywgInNjaGVkdWxlUGFyZW5IaWdobGlnaHQiKSk7CiAgICB9CiAgICBlbHNlIGlmICghb3B0aW9ucy50ZXh0V3JhcHBpbmcpIHsKICAgICAgY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSAibm93cmFwIjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzU2FmZUtleShjb2RlKSB7CiAgICByZXR1cm4gKGNvZGUgPj0gMTYgJiYgY29kZSA8PSAxOCkgfHwgLy8gc2hpZnQsIGNvbnRyb2wsIGFsdAogICAgICAgICAgIChjb2RlID49IDMzICYmIGNvZGUgPD0gNDApOyAvLyBhcnJvd3MsIGhvbWUsIGVuZAogIH0KCiAgRWRpdG9yLnByb3RvdHlwZSA9IHsKICAgIC8vIEltcG9ydCBhIHBpZWNlIG9mIGNvZGUgaW50byB0aGUgZWRpdG9yLgogICAgaW1wb3J0Q29kZTogZnVuY3Rpb24oY29kZSkgewogICAgICB0aGlzLmhpc3RvcnkucHVzaChudWxsLCBudWxsLCBhc0VkaXRvckxpbmVzKGNvZGUpKTsKICAgICAgdGhpcy5oaXN0b3J5LnJlc2V0KCk7CiAgICB9LAoKICAgIC8vIEV4dHJhY3QgdGhlIGNvZGUgZnJvbSB0aGUgZWRpdG9yLgogICAgZ2V0Q29kZTogZnVuY3Rpb24oKSB7CiAgICAgIGlmICghdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCkKICAgICAgICByZXR1cm4gIiI7CgogICAgICB2YXIgYWNjdW0gPSBbXTsKICAgICAgc2VsZWN0Lm1hcmtTZWxlY3Rpb24odGhpcy53aW4pOwogICAgICBmb3JFYWNoKHRyYXZlcnNlRE9NKHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpLCBtZXRob2QoYWNjdW0sICJwdXNoIikpOwogICAgICB3ZWJraXRMYXN0TGluZUhhY2sodGhpcy5jb250YWluZXIpOwogICAgICBzZWxlY3Quc2VsZWN0TWFya2VkKCk7CiAgICAgIHJldHVybiBjbGVhblRleHQoYWNjdW0uam9pbigiIikpOwogICAgfSwKCiAgICBjaGVja0xpbmU6IGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgaWYgKG5vZGUgPT09IGZhbHNlIHx8ICEobm9kZSA9PSBudWxsIHx8IG5vZGUucGFyZW50Tm9kZSA9PSB0aGlzLmNvbnRhaW5lcikpCiAgICAgICAgdGhyb3cgcGFyZW50LkNvZGVNaXJyb3IuSW52YWxpZExpbmVIYW5kbGU7CiAgICB9LAoKICAgIGN1cnNvclBvc2l0aW9uOiBmdW5jdGlvbihzdGFydCkgewogICAgICBpZiAoc3RhcnQgPT0gbnVsbCkgc3RhcnQgPSB0cnVlOwogICAgICB2YXIgcG9zID0gc2VsZWN0LmN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwgc3RhcnQpOwogICAgICBpZiAocG9zKSByZXR1cm4ge2xpbmU6IHBvcy5ub2RlLCBjaGFyYWN0ZXI6IHBvcy5vZmZzZXR9OwogICAgICBlbHNlIHJldHVybiB7bGluZTogbnVsbCwgY2hhcmFjdGVyOiAwfTsKICAgIH0sCgogICAgZmlyc3RMaW5lOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9LAoKICAgIGxhc3RMaW5lOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuY29udGFpbmVyLmxhc3RDaGlsZCkgcmV0dXJuIHN0YXJ0T2ZMaW5lKHRoaXMuY29udGFpbmVyLmxhc3RDaGlsZCk7CiAgICAgIGVsc2UgcmV0dXJuIG51bGw7CiAgICB9LAoKICAgIG5leHRMaW5lOiBmdW5jdGlvbihsaW5lKSB7CiAgICAgIHRoaXMuY2hlY2tMaW5lKGxpbmUpOwogICAgICB2YXIgZW5kID0gZW5kT2ZMaW5lKGxpbmUsIHRoaXMuY29udGFpbmVyKTsKICAgICAgcmV0dXJuIGVuZCB8fCBmYWxzZTsKICAgIH0sCgogICAgcHJldkxpbmU6IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdGhpcy5jaGVja0xpbmUobGluZSk7CiAgICAgIGlmIChsaW5lID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgcmV0dXJuIHN0YXJ0T2ZMaW5lKGxpbmUucHJldmlvdXNTaWJsaW5nKTsKICAgIH0sCgogICAgc2VsZWN0TGluZXM6IGZ1bmN0aW9uKHN0YXJ0TGluZSwgc3RhcnRPZmZzZXQsIGVuZExpbmUsIGVuZE9mZnNldCkgewogICAgICB0aGlzLmNoZWNrTGluZShzdGFydExpbmUpOwogICAgICB2YXIgc3RhcnQgPSB7bm9kZTogc3RhcnRMaW5lLCBvZmZzZXQ6IHN0YXJ0T2Zmc2V0fSwgZW5kID0gbnVsbDsKICAgICAgaWYgKGVuZE9mZnNldCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhpcy5jaGVja0xpbmUoZW5kTGluZSk7CiAgICAgICAgZW5kID0ge25vZGU6IGVuZExpbmUsIG9mZnNldDogZW5kT2Zmc2V0fTsKICAgICAgfQogICAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCBzdGFydCwgZW5kKTsKICAgICAgc2VsZWN0LnNjcm9sbFRvQ3Vyc29yKHRoaXMuY29udGFpbmVyKTsKICAgIH0sCgogICAgbGluZUNvbnRlbnQ6IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdGhpcy5jaGVja0xpbmUobGluZSk7CiAgICAgIHZhciBhY2N1bSA9IFtdOwogICAgICBmb3IgKGxpbmUgPSBsaW5lID8gbGluZS5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgICAgICAgbGluZSAmJiAhaXNCUihsaW5lKTsgbGluZSA9IGxpbmUubmV4dFNpYmxpbmcpCiAgICAgICAgYWNjdW0ucHVzaChub2RlVGV4dChsaW5lKSk7CiAgICAgIHJldHVybiBjbGVhblRleHQoYWNjdW0uam9pbigiIikpOwogICAgfSwKCiAgICBzZXRMaW5lQ29udGVudDogZnVuY3Rpb24obGluZSwgY29udGVudCkgewogICAgICB0aGlzLmhpc3RvcnkuY29tbWl0KCk7CiAgICAgIHRoaXMucmVwbGFjZVJhbmdlKHtub2RlOiBsaW5lLCBvZmZzZXQ6IDB9LAogICAgICAgICAgICAgICAgICAgICAgICB7bm9kZTogbGluZSwgb2Zmc2V0OiB0aGlzLmhpc3RvcnkudGV4dEFmdGVyKGxpbmUpLmxlbmd0aH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQpOwogICAgICB0aGlzLmFkZERpcnR5Tm9kZShsaW5lKTsKICAgICAgdGhpcy5zY2hlZHVsZUhpZ2hsaWdodCgpOwogICAgfSwKCiAgICBpbnNlcnRJbnRvTGluZTogZnVuY3Rpb24obGluZSwgcG9zaXRpb24sIGNvbnRlbnQpIHsKICAgICAgdmFyIGJlZm9yZSA9IG51bGw7CiAgICAgIGlmIChwb3NpdGlvbiA9PSAiZW5kIikgewogICAgICAgIGJlZm9yZSA9IGVuZE9mTGluZShsaW5lLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgZm9yICh2YXIgY3VyID0gbGluZSA/IGxpbmUubmV4dFNpYmxpbmcgOiB0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkOyBjdXI7IGN1ciA9IGN1ci5uZXh0U2libGluZykgewogICAgICAgICAgaWYgKHBvc2l0aW9uID09IDApIHsKICAgICAgICAgICAgYmVmb3JlID0gY3VyOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHZhciB0ZXh0ID0gbm9kZVRleHQoY3VyKTsKICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA+IHBvc2l0aW9uKSB7CiAgICAgICAgICAgIGJlZm9yZSA9IGN1ci5uZXh0U2libGluZzsKICAgICAgICAgICAgY29udGVudCA9IHRleHQuc2xpY2UoMCwgcG9zaXRpb24pICsgY29udGVudCArIHRleHQuc2xpY2UocG9zaXRpb24pOwogICAgICAgICAgICByZW1vdmVFbGVtZW50KGN1cik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgcG9zaXRpb24gLT0gdGV4dC5sZW5ndGg7CiAgICAgICAgfQogICAgICB9CgogICAgICB2YXIgbGluZXMgPSBhc0VkaXRvckxpbmVzKGNvbnRlbnQpLCBkb2MgPSB0aGlzLmNvbnRhaW5lci5vd25lckRvY3VtZW50OwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGkgPiAwKSB0aGlzLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUoZG9jLmNyZWF0ZUVsZW1lbnQoIkJSIiksIGJlZm9yZSk7CiAgICAgICAgdGhpcy5jb250YWluZXIuaW5zZXJ0QmVmb3JlKG1ha2VQYXJ0U3BhbihsaW5lc1tpXSwgZG9jKSwgYmVmb3JlKTsKICAgICAgfQogICAgICB0aGlzLmFkZERpcnR5Tm9kZShsaW5lKTsKICAgICAgdGhpcy5zY2hlZHVsZUhpZ2hsaWdodCgpOwogICAgfSwKCiAgICAvLyBSZXRyaWV2ZSB0aGUgc2VsZWN0ZWQgdGV4dC4KICAgIHNlbGVjdGVkVGV4dDogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBoID0gdGhpcy5oaXN0b3J5OwogICAgICBoLmNvbW1pdCgpOwoKICAgICAgdmFyIHN0YXJ0ID0gc2VsZWN0LmN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwgdHJ1ZSksCiAgICAgICAgICBlbmQgPSBzZWxlY3QuY3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCBmYWxzZSk7CiAgICAgIGlmICghc3RhcnQgfHwgIWVuZCkgcmV0dXJuICIiOwoKICAgICAgaWYgKHN0YXJ0Lm5vZGUgPT0gZW5kLm5vZGUpCiAgICAgICAgcmV0dXJuIGgudGV4dEFmdGVyKHN0YXJ0Lm5vZGUpLnNsaWNlKHN0YXJ0Lm9mZnNldCwgZW5kLm9mZnNldCk7CgogICAgICB2YXIgdGV4dCA9IFtoLnRleHRBZnRlcihzdGFydC5ub2RlKS5zbGljZShzdGFydC5vZmZzZXQpXTsKICAgICAgZm9yICh2YXIgcG9zID0gaC5ub2RlQWZ0ZXIoc3RhcnQubm9kZSk7IHBvcyAhPSBlbmQubm9kZTsgcG9zID0gaC5ub2RlQWZ0ZXIocG9zKSkKICAgICAgICB0ZXh0LnB1c2goaC50ZXh0QWZ0ZXIocG9zKSk7CiAgICAgIHRleHQucHVzaChoLnRleHRBZnRlcihlbmQubm9kZSkuc2xpY2UoMCwgZW5kLm9mZnNldCkpOwogICAgICByZXR1cm4gY2xlYW5UZXh0KHRleHQuam9pbigiXG4iKSk7CiAgICB9LAoKICAgIC8vIFJlcGxhY2UgdGhlIHNlbGVjdGlvbiB3aXRoIGFub3RoZXIgcGllY2Ugb2YgdGV4dC4KICAgIHJlcGxhY2VTZWxlY3Rpb246IGZ1bmN0aW9uKHRleHQpIHsKICAgICAgdGhpcy5oaXN0b3J5LmNvbW1pdCgpOwoKICAgICAgdmFyIHN0YXJ0ID0gc2VsZWN0LmN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwgdHJ1ZSksCiAgICAgICAgICBlbmQgPSBzZWxlY3QuY3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCBmYWxzZSk7CiAgICAgIGlmICghc3RhcnQgfHwgIWVuZCkgcmV0dXJuOwoKICAgICAgZW5kID0gdGhpcy5yZXBsYWNlUmFuZ2Uoc3RhcnQsIGVuZCwgdGV4dCk7CiAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3ModGhpcy5jb250YWluZXIsIGVuZCk7CiAgICAgIHdlYmtpdExhc3RMaW5lSGFjayh0aGlzLmNvbnRhaW5lcik7CiAgICB9LAoKICAgIHJlcm91dGVQYXN0ZUV2ZW50OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuY2FwdHVyaW5nUGFzdGUgfHwgd2luZG93Lm9wZXJhKSByZXR1cm47CiAgICAgIHRoaXMuY2FwdHVyaW5nUGFzdGUgPSB0cnVlOwogICAgICB2YXIgdGUgPSBwYXJlbnQuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEVYVEFSRUEiKTsKICAgICAgdGUuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICB0ZS5zdHlsZS5sZWZ0ID0gIi0xMDAwMHB4IjsKICAgICAgdGUuc3R5bGUud2lkdGggPSAiMTBweCI7CiAgICAgIHRlLnN0eWxlLnRvcCA9IG5vZGVUb3AoZnJhbWVFbGVtZW50KSArICJweCI7CiAgICAgIHdpbmRvdy5mcmFtZUVsZW1lbnQuQ29kZU1pcnJvci53cmFwcGluZy5hcHBlbmRDaGlsZCh0ZSk7CiAgICAgIHBhcmVudC5mb2N1cygpOwogICAgICB0ZS5mb2N1cygpOwoKICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICB0aGlzLnBhcmVudC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHNlbGYuY2FwdHVyaW5nUGFzdGUgPSBmYWxzZTsKICAgICAgICBzZWxmLndpbi5mb2N1cygpOwogICAgICAgIGlmIChzZWxmLnNlbGVjdGlvblNuYXBzaG90KSAvLyBJRSBoYWNrCiAgICAgICAgICBzZWxmLndpbi5zZWxlY3Quc2V0Qm9va21hcmsoc2VsZi5jb250YWluZXIsIHNlbGYuc2VsZWN0aW9uU25hcHNob3QpOwogICAgICAgIHZhciB0ZXh0ID0gdGUudmFsdWU7CiAgICAgICAgaWYgKHRleHQpIHsKICAgICAgICAgIHNlbGYucmVwbGFjZVNlbGVjdGlvbih0ZXh0KTsKICAgICAgICAgIHNlbGVjdC5zY3JvbGxUb0N1cnNvcihzZWxmLmNvbnRhaW5lcik7CiAgICAgICAgfQogICAgICAgIHJlbW92ZUVsZW1lbnQodGUpOwogICAgICB9LCAxMCk7CiAgICB9LAoKICAgIHJlcGxhY2VSYW5nZTogZnVuY3Rpb24oZnJvbSwgdG8sIHRleHQpIHsKICAgICAgdmFyIGxpbmVzID0gYXNFZGl0b3JMaW5lcyh0ZXh0KTsKICAgICAgbGluZXNbMF0gPSB0aGlzLmhpc3RvcnkudGV4dEFmdGVyKGZyb20ubm9kZSkuc2xpY2UoMCwgZnJvbS5vZmZzZXQpICsgbGluZXNbMF07CiAgICAgIHZhciBsYXN0TGluZSA9IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdOwogICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9IGxhc3RMaW5lICsgdGhpcy5oaXN0b3J5LnRleHRBZnRlcih0by5ub2RlKS5zbGljZSh0by5vZmZzZXQpOwogICAgICB2YXIgZW5kID0gdGhpcy5oaXN0b3J5Lm5vZGVBZnRlcih0by5ub2RlKTsKICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZnJvbS5ub2RlLCBlbmQsIGxpbmVzKTsKICAgICAgcmV0dXJuIHtub2RlOiB0aGlzLmhpc3Rvcnkubm9kZUJlZm9yZShlbmQpLAogICAgICAgICAgICAgIG9mZnNldDogbGFzdExpbmUubGVuZ3RofTsKICAgIH0sCgogICAgZ2V0U2VhcmNoQ3Vyc29yOiBmdW5jdGlvbihzdHJpbmcsIGZyb21DdXJzb3IsIGNhc2VGb2xkKSB7CiAgICAgIHJldHVybiBuZXcgU2VhcmNoQ3Vyc29yKHRoaXMsIHN0cmluZywgZnJvbUN1cnNvciwgY2FzZUZvbGQpOwogICAgfSwKCiAgICAvLyBSZS1pbmRlbnQgdGhlIHdob2xlIGJ1ZmZlcgogICAgcmVpbmRlbnQ6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCkKICAgICAgICB0aGlzLmluZGVudFJlZ2lvbihudWxsLCB0aGlzLmNvbnRhaW5lci5sYXN0Q2hpbGQpOwogICAgfSwKCiAgICByZWluZGVudFNlbGVjdGlvbjogZnVuY3Rpb24oZGlyZWN0aW9uKSB7CiAgICAgIGlmICghc2VsZWN0LnNvbWV0aGluZ1NlbGVjdGVkKHRoaXMud2luKSkgewogICAgICAgIHRoaXMuaW5kZW50QXRDdXJzb3IoZGlyZWN0aW9uKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICB2YXIgc3RhcnQgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lciwgdHJ1ZSksCiAgICAgICAgICAgIGVuZCA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCBmYWxzZSk7CiAgICAgICAgaWYgKHN0YXJ0ID09PSBmYWxzZSB8fCBlbmQgPT09IGZhbHNlKSByZXR1cm47CiAgICAgICAgdGhpcy5pbmRlbnRSZWdpb24oc3RhcnQsIGVuZCwgZGlyZWN0aW9uKTsKICAgICAgfQogICAgfSwKCiAgICBncmFiS2V5czogZnVuY3Rpb24oZXZlbnRIYW5kbGVyLCBmaWx0ZXIpIHsKICAgICAgdGhpcy5mcm96ZW4gPSBldmVudEhhbmRsZXI7CiAgICAgIHRoaXMua2V5RmlsdGVyID0gZmlsdGVyOwogICAgfSwKICAgIHVuZ3JhYktleXM6IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLmZyb3plbiA9ICJsZWF2ZSI7CiAgICAgIHRoaXMua2V5RmlsdGVyID0gbnVsbDsKICAgIH0sCgogICAgc2V0UGFyc2VyOiBmdW5jdGlvbihuYW1lKSB7CiAgICAgIEVkaXRvci5QYXJzZXIgPSB3aW5kb3dbbmFtZV07CiAgICAgIGlmICh0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKSB7CiAgICAgICAgZm9yRWFjaCh0aGlzLmNvbnRhaW5lci5jaGlsZE5vZGVzLCBmdW5jdGlvbihuKSB7CiAgICAgICAgICBpZiAobi5ub2RlVHlwZSAhPSAzKSBuLmRpcnR5ID0gdHJ1ZTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLmFkZERpcnR5Tm9kZSh0aGlzLmZpcnN0Q2hpbGQpOwogICAgICAgIHRoaXMuc2NoZWR1bGVIaWdobGlnaHQoKTsKICAgICAgfQogICAgfSwKCiAgICAvLyBJbnRlcmNlcHQgZW50ZXIgYW5kIHRhYiwgYW5kIGFzc2lnbiB0aGVpciBuZXcgZnVuY3Rpb25zLgogICAga2V5RG93bjogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgaWYgKHRoaXMuZnJvemVuID09ICJsZWF2ZSIpIHRoaXMuZnJvemVuID0gbnVsbDsKICAgICAgaWYgKHRoaXMuZnJvemVuICYmICghdGhpcy5rZXlGaWx0ZXIgfHwgdGhpcy5rZXlGaWx0ZXIoZXZlbnQua2V5Q29kZSkpKSB7CiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICAgIHRoaXMuZnJvemVuKGV2ZW50KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciBjb2RlID0gZXZlbnQua2V5Q29kZTsKICAgICAgLy8gRG9uJ3Qgc2NhbiB3aGVuIHRoZSB1c2VyIGlzIHR5cGluZy4KICAgICAgdGhpcy5kZWxheVNjYW5uaW5nKCk7CiAgICAgIC8vIFNjaGVkdWxlIGEgcGFyZW4taGlnaGxpZ2h0IGV2ZW50LCBpZiBjb25maWd1cmVkLgogICAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9NYXRjaFBhcmVucykKICAgICAgICB0aGlzLnNjaGVkdWxlUGFyZW5IaWdobGlnaHQoKTsKCiAgICAgIC8vIFRoZSB2YXJpb3VzIGNoZWNrcyBmb3IgIWFsdEtleSBhcmUgdGhlcmUgYmVjYXVzZSBBbHRHciBzZXRzIGJvdGgKICAgICAgLy8gY3RybEtleSBhbmQgYWx0S2V5IHRvIHRydWUsIGFuZCBzaG91bGQgbm90IGJlIHJlY29nbmlzZWQgYXMKICAgICAgLy8gQ29udHJvbC4KICAgICAgaWYgKGNvZGUgPT0gMTMpIHsgLy8gZW50ZXIKICAgICAgICBpZiAoZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7CiAgICAgICAgICB0aGlzLnJlcGFyc2VCdWZmZXIoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBzZWxlY3QuaW5zZXJ0TmV3bGluZUF0Q3Vyc29yKHRoaXMud2luKTsKICAgICAgICAgIHRoaXMuaW5kZW50QXRDdXJzb3IoKTsKICAgICAgICAgIHNlbGVjdC5zY3JvbGxUb0N1cnNvcih0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgfQogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjb2RlID09IDkgJiYgdGhpcy5vcHRpb25zLnRhYk1vZGUgIT0gImRlZmF1bHQiICYmICFldmVudC5jdHJsS2V5KSB7IC8vIHRhYgogICAgICAgIHRoaXMuaGFuZGxlVGFiKCFldmVudC5zaGlmdEtleSk7CiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMzIgJiYgZXZlbnQuc2hpZnRLZXkgJiYgdGhpcy5vcHRpb25zLnRhYk1vZGUgPT0gImRlZmF1bHQiKSB7IC8vIHNwYWNlCiAgICAgICAgdGhpcy5oYW5kbGVUYWIodHJ1ZSk7CiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMzYgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5jdHJsS2V5KSB7IC8vIGhvbWUKICAgICAgICBpZiAodGhpcy5ob21lKCkpIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjb2RlID09IDM1ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuY3RybEtleSkgeyAvLyBlbmQKICAgICAgICBpZiAodGhpcy5lbmQoKSkgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKChjb2RlID09IDIxOSB8fCBjb2RlID09IDIyMSkgJiYgZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7IC8vIFssIF0KICAgICAgICB0aGlzLmhpZ2hsaWdodFBhcmVucyhldmVudC5zaGlmdEtleSwgdHJ1ZSk7CiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmIChjb2RlID09IDM3IHx8IGNvZGUgPT0gMzkpKSB7IC8vIE1ldGEtbGVmdC9yaWdodAogICAgICAgIHZhciBjdXJzb3IgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgaWYgKGN1cnNvciA9PT0gZmFsc2UgfHwgIXRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpIHJldHVybjsKCiAgICAgICAgaWYgKGNvZGUgPT0gMzcpIHNlbGVjdC5mb2N1c0FmdGVyTm9kZShzdGFydE9mTGluZShjdXJzb3IpLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIgZW5kID0gZW5kT2ZMaW5lKGN1cnNvciwgdGhpcy5jb250YWluZXIpOwogICAgICAgICAgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlKGVuZCA/IGVuZC5wcmV2aW91c1NpYmxpbmcgOiB0aGlzLmNvbnRhaW5lci5sYXN0Q2hpbGQsIHRoaXMuY29udGFpbmVyKTsKICAgICAgICB9CiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmICFldmVudC5hbHRLZXkpIHsKICAgICAgICBpZiAoKGV2ZW50LnNoaWZ0S2V5ICYmIGNvZGUgPT0gOTApIHx8IGNvZGUgPT0gODkpIHsgLy8gc2hpZnQtWiwgWQogICAgICAgICAgc2VsZWN0LnNjcm9sbFRvTm9kZSh0aGlzLmhpc3RvcnkucmVkbygpKTsKICAgICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY29kZSA9PSA5MCB8fCAoc2FmYXJpICYmIGNvZGUgPT0gOCkpIHsgLy8gWiwgYmFja3NwYWNlCiAgICAgICAgICBzZWxlY3Quc2Nyb2xsVG9Ob2RlKHRoaXMuaGlzdG9yeS51bmRvKCkpOwogICAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjb2RlID09IDgzICYmIHRoaXMub3B0aW9ucy5zYXZlRnVuY3Rpb24pIHsgLy8gUwogICAgICAgICAgdGhpcy5vcHRpb25zLnNhdmVGdW5jdGlvbigpOwogICAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChpbnRlcm5ldEV4cGxvcmVyICYmIGNvZGUgPT0gODYpIHsKICAgICAgICAgIHRoaXMucmVyb3V0ZVBhc3RlRXZlbnQoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgLy8gQ2hlY2sgZm9yIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgcmUtaW5kZW50IHRoZSBjdXJyZW50IGxpbmUsCiAgICAvLyBhbmQgcHJldmVudCBPcGVyYSBmcm9tIGhhbmRsaW5nIGVudGVyIGFuZCB0YWIgYW55d2F5LgogICAga2V5UHJlc3M6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIHZhciBlbGVjdHJpYyA9IEVkaXRvci5QYXJzZXIuZWxlY3RyaWNDaGFycywgc2VsZiA9IHRoaXM7CiAgICAgIC8vIEhhY2sgZm9yIE9wZXJhLCBhbmQgRmlyZWZveCBvbiBPUyBYLCBpbiB3aGljaCBzdG9wcGluZyBhCiAgICAgIC8vIGtleWRvd24gZXZlbnQgZG9lcyBub3QgcHJldmVudCB0aGUgYXNzb2NpYXRlZCBrZXlwcmVzcyBldmVudAogICAgICAvLyBmcm9tIGhhcHBlbmluZywgc28gd2UgaGF2ZSB0byBjYW5jZWwgZW50ZXIgYW5kIHRhYiBhZ2FpbgogICAgICAvLyBoZXJlLgogICAgICBpZiAoKHRoaXMuZnJvemVuICYmICghdGhpcy5rZXlGaWx0ZXIgfHwgdGhpcy5rZXlGaWx0ZXIoZXZlbnQua2V5Q29kZSkpKSB8fAogICAgICAgICAgZXZlbnQuY29kZSA9PSAxMyB8fCAoZXZlbnQuY29kZSA9PSA5ICYmIHRoaXMub3B0aW9ucy50YWJNb2RlICE9ICJkZWZhdWx0IikgfHwKICAgICAgICAgIChldmVudC5rZXlDb2RlID09IDMyICYmIGV2ZW50LnNoaWZ0S2V5ICYmIHRoaXMub3B0aW9ucy50YWJNb2RlID09ICJkZWZhdWx0IikpCiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICBlbHNlIGlmIChlbGVjdHJpYyAmJiBlbGVjdHJpYy5pbmRleE9mKGV2ZW50LmNoYXJhY3RlcikgIT0gLTEpCiAgICAgICAgdGhpcy5wYXJlbnQuc2V0VGltZW91dChmdW5jdGlvbigpe3NlbGYuaW5kZW50QXRDdXJzb3IobnVsbCk7fSwgMCk7CiAgICAgIGVsc2UgaWYgKChldmVudC5jaGFyYWN0ZXIgPT0gInYiIHx8IGV2ZW50LmNoYXJhY3RlciA9PSAiViIpCiAgICAgICAgICAgICAgICYmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmICFldmVudC5hbHRLZXkpIC8vIGN0cmwtVgogICAgICAgIHRoaXMucmVyb3V0ZVBhc3RlRXZlbnQoKTsKICAgIH0sCgogICAgLy8gTWFyayB0aGUgbm9kZSBhdCB0aGUgY3Vyc29yIGRpcnR5IHdoZW4gYSBub24tc2FmZSBrZXkgaXMKICAgIC8vIHJlbGVhc2VkLgogICAga2V5VXA6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIHRoaXMuY3Vyc29yQWN0aXZpdHkoaXNTYWZlS2V5KGV2ZW50LmtleUNvZGUpKTsKICAgIH0sCgogICAgLy8gSW5kZW50IHRoZSBsaW5lIGZvbGxvd2luZyBhIGdpdmVuIDxicj4sIG9yIG51bGwgZm9yIHRoZSBmaXJzdAogICAgLy8gbGluZS4gSWYgZ2l2ZW4gYSA8YnI+IGVsZW1lbnQsIHRoaXMgbXVzdCBoYXZlIGJlZW4gaGlnaGxpZ2h0ZWQKICAgIC8vIHNvIHRoYXQgaXQgaGFzIGFuIGluZGVudGF0aW9uIG1ldGhvZC4gUmV0dXJucyB0aGUgd2hpdGVzcGFjZQogICAgLy8gZWxlbWVudCB0aGF0IGhhcyBiZWVuIG1vZGlmaWVkIG9yIGNyZWF0ZWQgKGlmIGFueSkuCiAgICBpbmRlbnRMaW5lQWZ0ZXI6IGZ1bmN0aW9uKHN0YXJ0LCBkaXJlY3Rpb24pIHsKICAgICAgLy8gd2hpdGVTcGFjZSBpcyB0aGUgd2hpdGVzcGFjZSBzcGFuIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSwKICAgICAgLy8gb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIG5vZGUuCiAgICAgIHZhciB3aGl0ZVNwYWNlID0gc3RhcnQgPyBzdGFydC5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgIGlmICh3aGl0ZVNwYWNlICYmICFoYXNDbGFzcyh3aGl0ZVNwYWNlLCAid2hpdGVzcGFjZSIpKQogICAgICAgIHdoaXRlU3BhY2UgPSBudWxsOwoKICAgICAgLy8gU29tZXRpbWVzIHRoZSBzdGFydCBvZiB0aGUgbGluZSBjYW4gaW5mbHVlbmNlIHRoZSBjb3JyZWN0CiAgICAgIC8vIGluZGVudGF0aW9uLCBzbyB3ZSByZXRyaWV2ZSBpdC4KICAgICAgdmFyIGZpcnN0VGV4dCA9IHdoaXRlU3BhY2UgPyB3aGl0ZVNwYWNlLm5leHRTaWJsaW5nIDogKHN0YXJ0ID8gc3RhcnQubmV4dFNpYmxpbmcgOiB0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKTsKICAgICAgdmFyIG5leHRDaGFycyA9IChzdGFydCAmJiBmaXJzdFRleHQgJiYgZmlyc3RUZXh0LmN1cnJlbnRUZXh0KSA/IGZpcnN0VGV4dC5jdXJyZW50VGV4dCA6ICIiOwoKICAgICAgLy8gQXNrIHRoZSBsZXhpY2FsIGNvbnRleHQgZm9yIHRoZSBjb3JyZWN0IGluZGVudGF0aW9uLCBhbmQKICAgICAgLy8gY29tcHV0ZSBob3cgbXVjaCB0aGlzIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCBpbmRlbnRhdGlvbi4KICAgICAgdmFyIG5ld0luZGVudCA9IDAsIGN1ckluZGVudCA9IHdoaXRlU3BhY2UgPyB3aGl0ZVNwYWNlLmN1cnJlbnRUZXh0Lmxlbmd0aCA6IDA7CiAgICAgIGlmIChkaXJlY3Rpb24gIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMudGFiTW9kZSA9PSAic2hpZnQiKQogICAgICAgIG5ld0luZGVudCA9IGRpcmVjdGlvbiA/IGN1ckluZGVudCArIGluZGVudFVuaXQgOiBNYXRoLm1heCgwLCBjdXJJbmRlbnQgLSBpbmRlbnRVbml0KQogICAgICBlbHNlIGlmIChzdGFydCkKICAgICAgICBuZXdJbmRlbnQgPSBzdGFydC5pbmRlbnRhdGlvbihuZXh0Q2hhcnMsIGN1ckluZGVudCwgZGlyZWN0aW9uKTsKICAgICAgZWxzZSBpZiAoRWRpdG9yLlBhcnNlci5maXJzdEluZGVudGF0aW9uKQogICAgICAgIG5ld0luZGVudCA9IEVkaXRvci5QYXJzZXIuZmlyc3RJbmRlbnRhdGlvbihuZXh0Q2hhcnMsIGN1ckluZGVudCwgZGlyZWN0aW9uKTsKICAgICAgdmFyIGluZGVudERpZmYgPSBuZXdJbmRlbnQgLSBjdXJJbmRlbnQ7CgogICAgICAvLyBJZiB0aGVyZSBpcyB0b28gbXVjaCwgdGhpcyBpcyBqdXN0IGEgbWF0dGVyIG9mIHNocmlua2luZyBhIHNwYW4uCiAgICAgIGlmIChpbmRlbnREaWZmIDwgMCkgewogICAgICAgIGlmIChuZXdJbmRlbnQgPT0gMCkgewogICAgICAgICAgaWYgKGZpcnN0VGV4dCkgc2VsZWN0LnNuYXBzaG90TW92ZSh3aGl0ZVNwYWNlLmZpcnN0Q2hpbGQsIGZpcnN0VGV4dC5maXJzdENoaWxkLCAwKTsKICAgICAgICAgIHJlbW92ZUVsZW1lbnQod2hpdGVTcGFjZSk7CiAgICAgICAgICB3aGl0ZVNwYWNlID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBzZWxlY3Quc25hcHNob3RNb3ZlKHdoaXRlU3BhY2UuZmlyc3RDaGlsZCwgd2hpdGVTcGFjZS5maXJzdENoaWxkLCBpbmRlbnREaWZmLCB0cnVlKTsKICAgICAgICAgIHdoaXRlU3BhY2UuY3VycmVudFRleHQgPSBtYWtlV2hpdGVTcGFjZShuZXdJbmRlbnQpOwogICAgICAgICAgd2hpdGVTcGFjZS5maXJzdENoaWxkLm5vZGVWYWx1ZSA9IHdoaXRlU3BhY2UuY3VycmVudFRleHQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIE5vdCBlbm91Z2guLi4KICAgICAgZWxzZSBpZiAoaW5kZW50RGlmZiA+IDApIHsKICAgICAgICAvLyBJZiB0aGVyZSBpcyB3aGl0ZXNwYWNlLCB3ZSBncm93IGl0LgogICAgICAgIGlmICh3aGl0ZVNwYWNlKSB7CiAgICAgICAgICB3aGl0ZVNwYWNlLmN1cnJlbnRUZXh0ID0gbWFrZVdoaXRlU3BhY2UobmV3SW5kZW50KTsKICAgICAgICAgIHdoaXRlU3BhY2UuZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSB3aGl0ZVNwYWNlLmN1cnJlbnRUZXh0OwogICAgICAgIH0KICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgdG8gYWRkIGEgbmV3IHdoaXRlc3BhY2Ugbm9kZS4KICAgICAgICBlbHNlIHsKICAgICAgICAgIHdoaXRlU3BhY2UgPSBtYWtlUGFydFNwYW4obWFrZVdoaXRlU3BhY2UobmV3SW5kZW50KSwgdGhpcy5kb2MpOwogICAgICAgICAgd2hpdGVTcGFjZS5jbGFzc05hbWUgPSAid2hpdGVzcGFjZSI7CiAgICAgICAgICBpZiAoc3RhcnQpIGluc2VydEFmdGVyKHdoaXRlU3BhY2UsIHN0YXJ0KTsKICAgICAgICAgIGVsc2UgdGhpcy5jb250YWluZXIuaW5zZXJ0QmVmb3JlKHdoaXRlU3BhY2UsIHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpOwogICAgICAgIH0KICAgICAgICBpZiAoZmlyc3RUZXh0KSBzZWxlY3Quc25hcHNob3RNb3ZlKGZpcnN0VGV4dC5maXJzdENoaWxkLCB3aGl0ZVNwYWNlLmZpcnN0Q2hpbGQsIGN1ckluZGVudCwgZmFsc2UsIHRydWUpOwogICAgICB9CiAgICAgIGlmIChpbmRlbnREaWZmICE9IDApIHRoaXMuYWRkRGlydHlOb2RlKHN0YXJ0KTsKICAgICAgcmV0dXJuIHdoaXRlU3BhY2U7CiAgICB9LAoKICAgIC8vIFJlLWhpZ2hsaWdodCB0aGUgc2VsZWN0ZWQgcGFydCBvZiB0aGUgZG9jdW1lbnQuCiAgICBoaWdobGlnaHRBdEN1cnNvcjogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBwb3MgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lciwgdHJ1ZSk7CiAgICAgIHZhciB0byA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCBmYWxzZSk7CiAgICAgIGlmIChwb3MgPT09IGZhbHNlIHx8IHRvID09PSBmYWxzZSkgcmV0dXJuOwoKICAgICAgc2VsZWN0Lm1hcmtTZWxlY3Rpb24odGhpcy53aW4pOwogICAgICBpZiAodGhpcy5oaWdobGlnaHQocG9zLCBlbmRPZkxpbmUodG8sIHRoaXMuY29udGFpbmVyKSwgdHJ1ZSwgMjApID09PSBmYWxzZSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIHNlbGVjdC5zZWxlY3RNYXJrZWQoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9LAoKICAgIC8vIFdoZW4gdGFiIGlzIHByZXNzZWQgd2l0aCB0ZXh0IHNlbGVjdGVkLCB0aGUgd2hvbGUgc2VsZWN0aW9uIGlzCiAgICAvLyByZS1pbmRlbnRlZCwgd2hlbiBub3RoaW5nIGlzIHNlbGVjdGVkLCB0aGUgbGluZSB3aXRoIHRoZSBjdXJzb3IKICAgIC8vIGlzIHJlLWluZGVudGVkLgogICAgaGFuZGxlVGFiOiBmdW5jdGlvbihkaXJlY3Rpb24pIHsKICAgICAgaWYgKHRoaXMub3B0aW9ucy50YWJNb2RlID09ICJzcGFjZXMiKQogICAgICAgIHNlbGVjdC5pbnNlcnRUYWJBdEN1cnNvcih0aGlzLndpbik7CiAgICAgIGVsc2UKICAgICAgICB0aGlzLnJlaW5kZW50U2VsZWN0aW9uKGRpcmVjdGlvbik7CiAgICB9LAoKICAgIC8vIEN1c3RvbSBob21lIGJlaGF2aW91ciB0aGF0IGRvZXNuJ3QgbGFuZCB0aGUgY3Vyc29yIGluIGZyb250IG9mCiAgICAvLyBsZWFkaW5nIHdoaXRlc3BhY2UgdW5sZXNzIHByZXNzZWQgdHdpY2UuCiAgICBob21lOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGN1ciA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCB0cnVlKSwgc3RhcnQgPSBjdXI7CiAgICAgIGlmIChjdXIgPT09IGZhbHNlIHx8ICEoIWN1ciB8fCBjdXIuaXNQYXJ0IHx8IGlzQlIoY3VyKSkgfHwgIXRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpCiAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgd2hpbGUgKGN1ciAmJiAhaXNCUihjdXIpKSBjdXIgPSBjdXIucHJldmlvdXNTaWJsaW5nOwogICAgICB2YXIgbmV4dCA9IGN1ciA/IGN1ci5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgIGlmIChuZXh0ICYmIG5leHQgIT0gc3RhcnQgJiYgbmV4dC5pc1BhcnQgJiYgaGFzQ2xhc3MobmV4dCwgIndoaXRlc3BhY2UiKSkKICAgICAgICBzZWxlY3QuZm9jdXNBZnRlck5vZGUobmV4dCwgdGhpcy5jb250YWluZXIpOwogICAgICBlbHNlCiAgICAgICAgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlKGN1ciwgdGhpcy5jb250YWluZXIpOwoKICAgICAgc2VsZWN0LnNjcm9sbFRvQ3Vyc29yKHRoaXMuY29udGFpbmVyKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9LAoKICAgIC8vIFNvbWUgYnJvd3NlcnMgKE9wZXJhKSBkb24ndCBtYW5hZ2UgdG8gaGFuZGxlIHRoZSBlbmQga2V5CiAgICAvLyBwcm9wZXJseSBpbiB0aGUgZmFjZSBvZiB2ZXJ0aWNhbCBzY3JvbGxpbmcuCiAgICBlbmQ6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgY3VyID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIHRydWUpOwogICAgICBpZiAoY3VyID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlOwogICAgICBjdXIgPSBlbmRPZkxpbmUoY3VyLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgIGlmICghY3VyKSByZXR1cm4gZmFsc2U7CiAgICAgIHNlbGVjdC5mb2N1c0FmdGVyTm9kZShjdXIucHJldmlvdXNTaWJsaW5nLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgIHNlbGVjdC5zY3JvbGxUb0N1cnNvcih0aGlzLmNvbnRhaW5lcik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSwKCiAgICAvLyBEZWxheSAob3IgaW5pdGlhdGUpIHRoZSBuZXh0IHBhcmVuIGhpZ2hsaWdodCBldmVudC4KICAgIHNjaGVkdWxlUGFyZW5IaWdobGlnaHQ6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5wYXJlbkV2ZW50KSB0aGlzLnBhcmVudC5jbGVhclRpbWVvdXQodGhpcy5wYXJlbkV2ZW50KTsKICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICB0aGlzLnBhcmVuRXZlbnQgPSB0aGlzLnBhcmVudC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VsZi5oaWdobGlnaHRQYXJlbnMoKTt9LCAzMDApOwogICAgfSwKCiAgICAvLyBUYWtlIHRoZSB0b2tlbiBiZWZvcmUgdGhlIGN1cnNvci4gSWYgaXQgY29udGFpbnMgYSBjaGFyYWN0ZXIgaW4KICAgIC8vICcoKVtde30nLCBzZWFyY2ggZm9yIHRoZSBtYXRjaGluZyBwYXJlbi9icmFjZS9icmFja2V0LCBhbmQKICAgIC8vIGhpZ2hsaWdodCB0aGVtIGluIGdyZWVuIGZvciBhIG1vbWVudCwgb3IgcmVkIGlmIG5vIHByb3BlciBtYXRjaAogICAgLy8gd2FzIGZvdW5kLgogICAgaGlnaGxpZ2h0UGFyZW5zOiBmdW5jdGlvbihqdW1wLCBmcm9tS2V5KSB7CiAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgLy8gZ2l2ZSB0aGUgcmVsZXZhbnQgbm9kZXMgYSBjb2xvdXIuCiAgICAgIGZ1bmN0aW9uIGhpZ2hsaWdodChub2RlLCBvaykgewogICAgICAgIGlmICghbm9kZSkgcmV0dXJuOwogICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWFya1BhcmVuKSB7CiAgICAgICAgICBzZWxmLm9wdGlvbnMubWFya1BhcmVuKG5vZGUsIG9rKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBub2RlLnN0eWxlLmZvbnRXZWlnaHQgPSAiYm9sZCI7CiAgICAgICAgICBub2RlLnN0eWxlLmNvbG9yID0gb2sgPyAiIzhGOCIgOiAiI0Y4OCI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIHVuaGlnaGxpZ2h0KG5vZGUpIHsKICAgICAgICBpZiAoIW5vZGUpIHJldHVybjsKICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVubWFya1BhcmVuKSB7CiAgICAgICAgICBzZWxmLm9wdGlvbnMudW5tYXJrUGFyZW4obm9kZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgbm9kZS5zdHlsZS5mb250V2VpZ2h0ID0gIiI7CiAgICAgICAgICBub2RlLnN0eWxlLmNvbG9yID0gIiI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghZnJvbUtleSAmJiBzZWxmLmhpZ2hsaWdodGVkKSB7CiAgICAgICAgdW5oaWdobGlnaHQoc2VsZi5oaWdobGlnaHRlZFswXSk7CiAgICAgICAgdW5oaWdobGlnaHQoc2VsZi5oaWdobGlnaHRlZFsxXSk7CiAgICAgIH0KCiAgICAgIGlmICghd2luZG93LnNlbGVjdCkgcmV0dXJuOwogICAgICAvLyBDbGVhciB0aGUgZXZlbnQgcHJvcGVydHkuCiAgICAgIGlmICh0aGlzLnBhcmVuRXZlbnQpIHRoaXMucGFyZW50LmNsZWFyVGltZW91dCh0aGlzLnBhcmVuRXZlbnQpOwogICAgICB0aGlzLnBhcmVuRXZlbnQgPSBudWxsOwoKICAgICAgLy8gRXh0cmFjdCBhICdwYXJlbicgZnJvbSBhIHBpZWNlIG9mIHRleHQuCiAgICAgIGZ1bmN0aW9uIHBhcmVuKG5vZGUpIHsKICAgICAgICBpZiAobm9kZS5jdXJyZW50VGV4dCkgewogICAgICAgICAgdmFyIG1hdGNoID0gbm9kZS5jdXJyZW50VGV4dC5tYXRjaCgvXltcc1x1MDBhMF0qKFtcKFwpXFtcXXt9XSlbXHNcdTAwYTBdKiQvKTsKICAgICAgICAgIHJldHVybiBtYXRjaCAmJiBtYXRjaFsxXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBkaXJlY3Rpb24gYSBwYXJlbiBpcyBmYWNpbmcuCiAgICAgIGZ1bmN0aW9uIGZvcndhcmQoY2gpIHsKICAgICAgICByZXR1cm4gL1tcKFxbXHtdLy50ZXN0KGNoKTsKICAgICAgfQoKICAgICAgdmFyIGNoLCBjdXJzb3IgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lciwgdHJ1ZSk7CiAgICAgIGlmICghY3Vyc29yIHx8ICF0aGlzLmhpZ2hsaWdodEF0Q3Vyc29yKCkpIHJldHVybjsKICAgICAgY3Vyc29yID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIHRydWUpOwogICAgICBpZiAoIShjdXJzb3IgJiYgKChjaCA9IHBhcmVuKGN1cnNvcikpIHx8IChjdXJzb3IgPSBjdXJzb3IubmV4dFNpYmxpbmcpICYmIChjaCA9IHBhcmVuKGN1cnNvcikpKSkpCiAgICAgICAgcmV0dXJuOwogICAgICAvLyBXZSBvbmx5IGxvb2sgZm9yIHRva2VucyB3aXRoIHRoZSBzYW1lIGNsYXNzTmFtZS4KICAgICAgdmFyIGNsYXNzTmFtZSA9IGN1cnNvci5jbGFzc05hbWUsIGRpciA9IGZvcndhcmQoY2gpLCBtYXRjaCA9IG1hdGNoaW5nW2NoXTsKCiAgICAgIC8vIFNpbmNlIHBhcnRzIG9mIHRoZSBkb2N1bWVudCBtaWdodCBub3QgaGF2ZSBiZWVuIHByb3Blcmx5CiAgICAgIC8vIGhpZ2hsaWdodGVkLCBhbmQgaXQgaXMgaGFyZCB0byBrbm93IGluIGFkdmFuY2Ugd2hpY2ggcGFydCB3ZQogICAgICAvLyBoYXZlIHRvIHNjYW4sIHdlIGp1c3QgdHJ5LCBhbmQgd2hlbiB3ZSBmaW5kIGRpcnR5IG5vZGVzIHdlCiAgICAgIC8vIGFib3J0LCBwYXJzZSB0aGVtLCBhbmQgcmUtdHJ5LgogICAgICBmdW5jdGlvbiB0cnlGaW5kTWF0Y2goKSB7CiAgICAgICAgdmFyIHN0YWNrID0gW10sIGNoLCBvayA9IHRydWU7OwogICAgICAgIGZvciAodmFyIHJ1bm5lciA9IGN1cnNvcjsgcnVubmVyOyBydW5uZXIgPSBkaXIgPyBydW5uZXIubmV4dFNpYmxpbmcgOiBydW5uZXIucHJldmlvdXNTaWJsaW5nKSB7CiAgICAgICAgICBpZiAocnVubmVyLmNsYXNzTmFtZSA9PSBjbGFzc05hbWUgJiYgaXNTcGFuKHJ1bm5lcikgJiYgKGNoID0gcGFyZW4ocnVubmVyKSkpIHsKICAgICAgICAgICAgaWYgKGZvcndhcmQoY2gpID09IGRpcikKICAgICAgICAgICAgICBzdGFjay5wdXNoKGNoKTsKICAgICAgICAgICAgZWxzZSBpZiAoIXN0YWNrLmxlbmd0aCkKICAgICAgICAgICAgICBvayA9IGZhbHNlOwogICAgICAgICAgICBlbHNlIGlmIChzdGFjay5wb3AoKSAhPSBtYXRjaGluZ1tjaF0pCiAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzdGFjay5sZW5ndGgpIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZiAocnVubmVyLmRpcnR5IHx8ICFpc1NwYW4ocnVubmVyKSAmJiAhaXNCUihydW5uZXIpKSB7CiAgICAgICAgICAgIHJldHVybiB7bm9kZTogcnVubmVyLCBzdGF0dXM6ICJkaXJ0eSJ9OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4ge25vZGU6IHJ1bm5lciwgc3RhdHVzOiBydW5uZXIgJiYgb2t9OwogICAgICB9CgogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIHZhciBmb3VuZCA9IHRyeUZpbmRNYXRjaCgpOwogICAgICAgIGlmIChmb3VuZC5zdGF0dXMgPT0gImRpcnR5IikgewogICAgICAgICAgdGhpcy5oaWdobGlnaHQoZm91bmQubm9kZSwgZW5kT2ZMaW5lKGZvdW5kLm5vZGUpKTsKICAgICAgICAgIC8vIE5lZWRlZCBiZWNhdXNlIGluIHNvbWUgY29ybmVyIGNhc2VzIGEgaGlnaGxpZ2h0IGRvZXMgbm90CiAgICAgICAgICAvLyByZWFjaCBhIG5vZGUuCiAgICAgICAgICBmb3VuZC5ub2RlLmRpcnR5ID0gZmFsc2U7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBoaWdobGlnaHQoY3Vyc29yLCBmb3VuZC5zdGF0dXMpOwogICAgICAgICAgaGlnaGxpZ2h0KGZvdW5kLm5vZGUsIGZvdW5kLnN0YXR1cyk7CiAgICAgICAgICBpZiAoZnJvbUtleSkKICAgICAgICAgICAgc2VsZi5wYXJlbnQuc2V0VGltZW91dChmdW5jdGlvbigpIHt1bmhpZ2hsaWdodChjdXJzb3IpOyB1bmhpZ2hsaWdodChmb3VuZC5ub2RlKTt9LCA1MDApOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBzZWxmLmhpZ2hsaWdodGVkID0gW2N1cnNvciwgZm91bmQubm9kZV07CiAgICAgICAgICBpZiAoanVtcCAmJiBmb3VuZC5ub2RlKQogICAgICAgICAgICBzZWxlY3QuZm9jdXNBZnRlck5vZGUoZm91bmQubm9kZS5wcmV2aW91c1NpYmxpbmcsIHRoaXMuY29udGFpbmVyKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICAvLyBBZGp1c3QgdGhlIGFtb3VudCBvZiB3aGl0ZXNwYWNlIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSB0aGF0CiAgICAvLyB0aGUgY3Vyc29yIGlzIG9uIHNvIHRoYXQgaXQgaXMgaW5kZW50ZWQgcHJvcGVybHkuCiAgICBpbmRlbnRBdEN1cnNvcjogZnVuY3Rpb24oZGlyZWN0aW9uKSB7CiAgICAgIGlmICghdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCkgcmV0dXJuOwogICAgICAvLyBUaGUgbGluZSBoYXMgdG8gaGF2ZSB1cC10by1kYXRlIGxleGljYWwgaW5mb3JtYXRpb24sIHNvIHdlCiAgICAgIC8vIGhpZ2hsaWdodCBpdCBmaXJzdC4KICAgICAgaWYgKCF0aGlzLmhpZ2hsaWdodEF0Q3Vyc29yKCkpIHJldHVybjsKICAgICAgdmFyIGN1cnNvciA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCBmYWxzZSk7CiAgICAgIC8vIElmIHdlIGNvdWxkbid0IGRldGVybWluZSB0aGUgcGxhY2Ugb2YgdGhlIGN1cnNvciwKICAgICAgLy8gdGhlcmUncyBub3RoaW5nIHRvIGluZGVudC4KICAgICAgaWYgKGN1cnNvciA9PT0gZmFsc2UpCiAgICAgICAgcmV0dXJuOwogICAgICB2YXIgbGluZVN0YXJ0ID0gc3RhcnRPZkxpbmUoY3Vyc29yKTsKICAgICAgdmFyIHdoaXRlU3BhY2UgPSB0aGlzLmluZGVudExpbmVBZnRlcihsaW5lU3RhcnQsIGRpcmVjdGlvbik7CiAgICAgIGlmIChjdXJzb3IgPT0gbGluZVN0YXJ0ICYmIHdoaXRlU3BhY2UpCiAgICAgICAgICBjdXJzb3IgPSB3aGl0ZVNwYWNlOwogICAgICAvLyBUaGlzIG1lYW5zIHRoZSBpbmRlbnRhdGlvbiBoYXMgcHJvYmFibHkgbWVzc2VkIHVwIHRoZSBjdXJzb3IuCiAgICAgIGlmIChjdXJzb3IgPT0gd2hpdGVTcGFjZSkKICAgICAgICBzZWxlY3QuZm9jdXNBZnRlck5vZGUoY3Vyc29yLCB0aGlzLmNvbnRhaW5lcik7CiAgICB9LAoKICAgIC8vIEluZGVudCBhbGwgbGluZXMgd2hvc2Ugc3RhcnQgZmFsbHMgaW5zaWRlIG9mIHRoZSBjdXJyZW50CiAgICAvLyBzZWxlY3Rpb24uCiAgICBpbmRlbnRSZWdpb246IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIGRpcmVjdGlvbikgewogICAgICB2YXIgY3VycmVudCA9IChzdGFydCA9IHN0YXJ0T2ZMaW5lKHN0YXJ0KSksIGJlZm9yZSA9IHN0YXJ0ICYmIHN0YXJ0T2ZMaW5lKHN0YXJ0LnByZXZpb3VzU2libGluZyk7CiAgICAgIGlmICghaXNCUihlbmQpKSBlbmQgPSBlbmRPZkxpbmUoZW5kLCB0aGlzLmNvbnRhaW5lcik7CgogICAgICBkbyB7CiAgICAgICAgdmFyIG5leHQgPSBlbmRPZkxpbmUoY3VycmVudCwgdGhpcy5jb250YWluZXIpOwogICAgICAgIGlmIChjdXJyZW50KSB0aGlzLmhpZ2hsaWdodChiZWZvcmUsIG5leHQsIHRydWUpOwogICAgICAgIHRoaXMuaW5kZW50TGluZUFmdGVyKGN1cnJlbnQsIGRpcmVjdGlvbik7CiAgICAgICAgYmVmb3JlID0gY3VycmVudDsKICAgICAgICBjdXJyZW50ID0gbmV4dDsKICAgICAgfSB3aGlsZSAoY3VycmVudCAhPSBlbmQpOwogICAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCB7bm9kZTogc3RhcnQsIG9mZnNldDogMH0sIHtub2RlOiBlbmQsIG9mZnNldDogMH0pOwogICAgfSwKCiAgICAvLyBGaW5kIHRoZSBub2RlIHRoYXQgdGhlIGN1cnNvciBpcyBpbiwgbWFyayBpdCBhcyBkaXJ0eSwgYW5kIG1ha2UKICAgIC8vIHN1cmUgYSBoaWdobGlnaHQgcGFzcyBpcyBzY2hlZHVsZWQuCiAgICBjdXJzb3JBY3Rpdml0eTogZnVuY3Rpb24oc2FmZSkgewogICAgICBpZiAoaW50ZXJuZXRFeHBsb3JlcikgewogICAgICAgIHRoaXMuY29udGFpbmVyLmNyZWF0ZVRleHRSYW5nZSgpLmV4ZWNDb21tYW5kKCJ1bmxpbmsiKTsKICAgICAgICB0aGlzLnNlbGVjdGlvblNuYXBzaG90ID0gc2VsZWN0LmdldEJvb2ttYXJrKHRoaXMuY29udGFpbmVyKTsKICAgICAgfQoKICAgICAgdmFyIGFjdGl2aXR5ID0gdGhpcy5vcHRpb25zLmN1cnNvckFjdGl2aXR5OwogICAgICBpZiAoIXNhZmUgfHwgYWN0aXZpdHkpIHsKICAgICAgICB2YXIgY3Vyc29yID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgICBpZiAoY3Vyc29yID09PSBmYWxzZSB8fCAhdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCkgcmV0dXJuOwogICAgICAgIGN1cnNvciA9IGN1cnNvciB8fCB0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkOwogICAgICAgIGlmIChhY3Rpdml0eSkgYWN0aXZpdHkoY3Vyc29yKTsKICAgICAgICBpZiAoIXNhZmUpIHsKICAgICAgICAgIHRoaXMuc2NoZWR1bGVIaWdobGlnaHQoKTsKICAgICAgICAgIHRoaXMuYWRkRGlydHlOb2RlKGN1cnNvcik7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIHJlcGFyc2VCdWZmZXI6IGZ1bmN0aW9uKCkgewogICAgICBmb3JFYWNoKHRoaXMuY29udGFpbmVyLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKG5vZGUpIHtub2RlLmRpcnR5ID0gdHJ1ZTt9KTsKICAgICAgaWYgKHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpCiAgICAgICAgdGhpcy5hZGREaXJ0eU5vZGUodGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCk7CiAgICB9LAoKICAgIC8vIEFkZCBhIG5vZGUgdG8gdGhlIHNldCBvZiBkaXJ0eSBub2RlcywgaWYgaXQgaXNuJ3QgYWxyZWFkeSBpbgogICAgLy8gdGhlcmUuCiAgICBhZGREaXJ0eU5vZGU6IGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgbm9kZSA9IG5vZGUgfHwgdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgaWYgKCFub2RlKSByZXR1cm47CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlydHkubGVuZ3RoOyBpKyspCiAgICAgICAgaWYgKHRoaXMuZGlydHlbaV0gPT0gbm9kZSkgcmV0dXJuOwoKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMykKICAgICAgICBub2RlLmRpcnR5ID0gdHJ1ZTsKICAgICAgdGhpcy5kaXJ0eS5wdXNoKG5vZGUpOwogICAgfSwKCiAgICAvLyBDYXVzZSBhIGhpZ2hsaWdodCBwYXNzIHRvIGhhcHBlbiBpbiBvcHRpb25zLnBhc3NEZWxheQogICAgLy8gbWlsbGlzZWNvbmRzLiBDbGVhciB0aGUgZXhpc3RpbmcgdGltZW91dCwgaWYgb25lIGV4aXN0cy4gVGhpcwogICAgLy8gd2F5LCB0aGUgcGFzc2VzIGRvIG5vdCBoYXBwZW4gd2hpbGUgdGhlIHVzZXIgaXMgdHlwaW5nLCBhbmQKICAgIC8vIHNob3VsZCBhcyB1bm9idHJ1c2l2ZSBhcyBwb3NzaWJsZS4KICAgIHNjaGVkdWxlSGlnaGxpZ2h0OiBmdW5jdGlvbigpIHsKICAgICAgLy8gVGltZW91dHMgYXJlIHJvdXRlZCB0aHJvdWdoIHRoZSBwYXJlbnQgd2luZG93LCBiZWNhdXNlIG9uCiAgICAgIC8vIHNvbWUgYnJvd3NlcnMgZGVzaWduTW9kZSB3aW5kb3dzIGRvIG5vdCBmaXJlIHRpbWVvdXRzLgogICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgIHRoaXMucGFyZW50LmNsZWFyVGltZW91dCh0aGlzLmhpZ2hsaWdodFRpbWVvdXQpOwogICAgICB0aGlzLmhpZ2hsaWdodFRpbWVvdXQgPSB0aGlzLnBhcmVudC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VsZi5oaWdobGlnaHREaXJ0eSgpO30sIHRoaXMub3B0aW9ucy5wYXNzRGVsYXkpOwogICAgfSwKCiAgICAvLyBGZXRjaCBvbmUgZGlydHkgbm9kZSwgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBkaXJ0eSBzZXQuCiAgICBnZXREaXJ0eU5vZGU6IGZ1bmN0aW9uKCkgewogICAgICB3aGlsZSAodGhpcy5kaXJ0eS5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIGZvdW5kID0gdGhpcy5kaXJ0eS5wb3AoKTsKICAgICAgICAvLyBJRTggc29tZXRpbWVzIHRocm93cyBhbiB1bmV4cGxhaW5hYmxlICdpbnZhbGlkIGFyZ3VtZW50JwogICAgICAgIC8vIGV4Y2VwdGlvbiBmb3IgZm91bmQucGFyZW50Tm9kZQogICAgICAgIHRyeSB7CiAgICAgICAgICAvLyBJZiB0aGUgbm9kZSBoYXMgYmVlbiBjb2xvdXJlZCBpbiB0aGUgbWVhbnRpbWUsIG9yIGlzIG5vCiAgICAgICAgICAvLyBsb25nZXIgaW4gdGhlIGRvY3VtZW50LCBpdCBzaG91bGQgbm90IGJlIHJldHVybmVkLgogICAgICAgICAgd2hpbGUgKGZvdW5kICYmIGZvdW5kLnBhcmVudE5vZGUgIT0gdGhpcy5jb250YWluZXIpCiAgICAgICAgICAgIGZvdW5kID0gZm91bmQucGFyZW50Tm9kZTsKICAgICAgICAgIGlmIChmb3VuZCAmJiAoZm91bmQuZGlydHkgfHwgZm91bmQubm9kZVR5cGUgPT0gMykpCiAgICAgICAgICAgIHJldHVybiBmb3VuZDsKICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfSwKCiAgICAvLyBQaWNrIGRpcnR5IG5vZGVzLCBhbmQgaGlnaGxpZ2h0IHRoZW0sIHVudGlsIG9wdGlvbnMucGFzc1RpbWUKICAgIC8vIG1pbGxpc2Vjb25kcyBoYXZlIGdvbmUgYnkuIFRoZSBoaWdobGlnaHQgbWV0aG9kIHdpbGwgY29udGludWUKICAgIC8vIHRvIG5leHQgbGluZXMgYXMgbG9uZyBhcyBpdCBmaW5kcyBkaXJ0eSBub2Rlcy4gSXQgcmV0dXJucwogICAgLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBsYWNlIHdoZXJlIGl0IHN0b3BwZWQuIElmIHRoZXJlIGFyZQogICAgLy8gZGlydHkgbm9kZXMgbGVmdCBhZnRlciB0aGlzIGZ1bmN0aW9uIGhhcyBzcGVudCBhbGwgaXRzIGxpbmVzLAogICAgLy8gaXQgc2hlZHVsZXMgYW5vdGhlciBoaWdobGlnaHQgdG8gZmluaXNoIHRoZSBqb2IuCiAgICBoaWdobGlnaHREaXJ0eTogZnVuY3Rpb24oZm9yY2UpIHsKICAgICAgLy8gUHJldmVudCBGRiBmcm9tIHJhaXNpbmcgYW4gZXJyb3Igd2hlbiBpdCBpcyBmaXJpbmcgdGltZW91dHMKICAgICAgLy8gb24gYSBwYWdlIHRoYXQncyBubyBsb25nZXIgbG9hZGVkLgogICAgICBpZiAoIXdpbmRvdy5zZWxlY3QpIHJldHVybjsKCiAgICAgIGlmICghdGhpcy5vcHRpb25zLnJlYWRPbmx5KSBzZWxlY3QubWFya1NlbGVjdGlvbih0aGlzLndpbik7CiAgICAgIHZhciBzdGFydCwgZW5kVGltZSA9IGZvcmNlID8gbnVsbCA6IHRpbWUoKSArIHRoaXMub3B0aW9ucy5wYXNzVGltZTsKICAgICAgd2hpbGUgKCh0aW1lKCkgPCBlbmRUaW1lIHx8IGZvcmNlKSAmJiAoc3RhcnQgPSB0aGlzLmdldERpcnR5Tm9kZSgpKSkgewogICAgICAgIHZhciByZXN1bHQgPSB0aGlzLmhpZ2hsaWdodChzdGFydCwgZW5kVGltZSk7CiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQubm9kZSAmJiByZXN1bHQuZGlydHkpCiAgICAgICAgICB0aGlzLmFkZERpcnR5Tm9kZShyZXN1bHQubm9kZSk7CiAgICAgIH0KICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucmVhZE9ubHkpIHNlbGVjdC5zZWxlY3RNYXJrZWQoKTsKICAgICAgaWYgKHN0YXJ0KSB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICAgIHJldHVybiB0aGlzLmRpcnR5Lmxlbmd0aCA9PSAwOwogICAgfSwKCiAgICAvLyBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQgdGhyb3VnaCBhIHRpbWVvdXQsIHdpbGwKICAgIC8vIGNvbnRpbnVvdXNseSByZS1wYXJzZSB0aGUgZG9jdW1lbnQuCiAgICBkb2N1bWVudFNjYW5uZXI6IGZ1bmN0aW9uKHBhc3NUaW1lKSB7CiAgICAgIHZhciBzZWxmID0gdGhpcywgcG9zID0gbnVsbDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIC8vIEZGIHRpbWVvdXQgd2VpcmRuZXNzIHdvcmthcm91bmQuCiAgICAgICAgaWYgKCF3aW5kb3cuc2VsZWN0KSByZXR1cm47CiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgbm9kZSBpcyBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50Li4uIG9oCiAgICAgICAgLy8gd2VsbCwgd2Ugc3RhcnQgb3Zlci4KICAgICAgICBpZiAocG9zICYmIHBvcy5wYXJlbnROb2RlICE9IHNlbGYuY29udGFpbmVyKQogICAgICAgICAgcG9zID0gbnVsbDsKICAgICAgICBzZWxlY3QubWFya1NlbGVjdGlvbihzZWxmLndpbik7CiAgICAgICAgdmFyIHJlc3VsdCA9IHNlbGYuaGlnaGxpZ2h0KHBvcywgdGltZSgpICsgcGFzc1RpbWUsIHRydWUpOwogICAgICAgIHNlbGVjdC5zZWxlY3RNYXJrZWQoKTsKICAgICAgICB2YXIgbmV3UG9zID0gcmVzdWx0ID8gKHJlc3VsdC5ub2RlICYmIHJlc3VsdC5ub2RlLm5leHRTaWJsaW5nKSA6IG51bGw7CiAgICAgICAgcG9zID0gKHBvcyA9PSBuZXdQb3MpID8gbnVsbCA6IG5ld1BvczsKICAgICAgICBzZWxmLmRlbGF5U2Nhbm5pbmcoKTsKICAgICAgfTsKICAgIH0sCgogICAgLy8gU3RhcnRzIHRoZSBjb250aW51b3VzIHNjYW5uaW5nIHByb2Nlc3MgZm9yIHRoaXMgZG9jdW1lbnQgYWZ0ZXIKICAgIC8vIGEgZ2l2ZW4gaW50ZXJ2YWwuCiAgICBkZWxheVNjYW5uaW5nOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuc2Nhbm5lcikgewogICAgICAgIHRoaXMucGFyZW50LmNsZWFyVGltZW91dCh0aGlzLmRvY3VtZW50U2Nhbik7CiAgICAgICAgdGhpcy5kb2N1bWVudFNjYW4gPSB0aGlzLnBhcmVudC5zZXRUaW1lb3V0KHRoaXMuc2Nhbm5lciwgdGhpcy5vcHRpb25zLmNvbnRpbnVvdXNTY2FubmluZyk7CiAgICAgIH0KICAgIH0sCgogICAgLy8gVGhlIGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGUgYWN0dWFsIGhpZ2hsaWdodGluZy9jb2xvdXJpbmcgKHdpdGgKICAgIC8vIGhlbHAgZnJvbSB0aGUgcGFyc2VyIGFuZCB0aGUgRE9NIG5vcm1hbGl6ZXIpLiBJdHMgaW50ZXJmYWNlIGlzCiAgICAvLyByYXRoZXIgb3ZlcmNvbXBsaWNhdGVkLCBiZWNhdXNlIGl0IGlzIHVzZWQgaW4gZGlmZmVyZW50CiAgICAvLyBzaXR1YXRpb25zOiBlbnN1cmluZyB0aGF0IGEgY2VydGFpbiBsaW5lIGlzIGhpZ2hsaWdodGVkLCBvcgogICAgLy8gaGlnaGxpZ2h0aW5nIHVwIHRvIFggbWlsbGlzZWNvbmRzIHN0YXJ0aW5nIGZyb20gYSBjZXJ0YWluCiAgICAvLyBwb2ludC4gVGhlICdmcm9tJyBhcmd1bWVudCBnaXZlcyB0aGUgbm9kZSBhdCB3aGljaCBpdCBzaG91bGQKICAgIC8vIHN0YXJ0LiBJZiB0aGlzIGlzIG51bGwsIGl0IHdpbGwgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKICAgIC8vIGRvY3VtZW50LiBXaGVuIGEgdGltZXN0YW1wIGlzIGdpdmVuIHdpdGggdGhlICd0YXJnZXQnIGFyZ3VtZW50LAogICAgLy8gaXQgd2lsbCBzdG9wIGhpZ2hsaWdodGluZyBhdCB0aGF0IHRpbWUuIElmIHRoaXMgYXJndW1lbnQgaG9sZHMKICAgIC8vIGEgRE9NIG5vZGUsIGl0IHdpbGwgaGlnaGxpZ2h0IHVudGlsIGl0IHJlYWNoZXMgdGhhdCBub2RlLiBJZiBhdAogICAgLy8gYW55IHRpbWUgaXQgY29tZXMgYWNyb3NzIHR3byAnY2xlYW4nIGxpbmVzIChubyBkaXJ0eSBub2RlcyksIGl0CiAgICAvLyB3aWxsIHN0b3AsIGV4Y2VwdCB3aGVuICdjbGVhbkxpbmVzJyBpcyB0cnVlLiBtYXhCYWNrdHJhY2sgaXMKICAgIC8vIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBiYWNrdHJhY2sgdG8gZmluZCBhbiBleGlzdGluZwogICAgLy8gcGFyc2VyIGluc3RhbmNlLiBUaGlzIGlzIHVzZWQgdG8gZ2l2ZSB1cCBpbiBzaXR1YXRpb25zIHdoZXJlIGEKICAgIC8vIGhpZ2hsaWdodCB3b3VsZCB0YWtlIHRvbyBsb25nIGFuZCBmcmVlemUgdGhlIGJyb3dzZXIgaW50ZXJmYWNlLgogICAgaGlnaGxpZ2h0OiBmdW5jdGlvbihmcm9tLCB0YXJnZXQsIGNsZWFuTGluZXMsIG1heEJhY2t0cmFjayl7CiAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lciwgc2VsZiA9IHRoaXMsIGFjdGl2ZSA9IHRoaXMub3B0aW9ucy5hY3RpdmVUb2tlbnM7CiAgICAgIHZhciBlbmRUaW1lID0gKHR5cGVvZiB0YXJnZXQgPT0gIm51bWJlciIgPyB0YXJnZXQgOiBudWxsKTsKCiAgICAgIGlmICghY29udGFpbmVyLmZpcnN0Q2hpbGQpCiAgICAgICAgcmV0dXJuOwogICAgICAvLyBCYWNrdHJhY2sgdG8gdGhlIGZpcnN0IG5vZGUgYmVmb3JlIGZyb20gdGhhdCBoYXMgYSBwYXJ0aWFsCiAgICAgIC8vIHBhcnNlIHN0b3JlZC4KICAgICAgd2hpbGUgKGZyb20gJiYgKCFmcm9tLnBhcnNlckZyb21IZXJlIHx8IGZyb20uZGlydHkpKSB7CiAgICAgICAgaWYgKG1heEJhY2t0cmFjayAhPSBudWxsICYmIGlzQlIoZnJvbSkgJiYgKC0tbWF4QmFja3RyYWNrKSA8IDApCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgZnJvbSA9IGZyb20ucHJldmlvdXNTaWJsaW5nOwogICAgICB9CiAgICAgIC8vIElmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudCwgZG8gbm90aGluZy4KICAgICAgaWYgKGZyb20gJiYgIWZyb20ubmV4dFNpYmxpbmcpCiAgICAgICAgcmV0dXJuOwoKICAgICAgLy8gQ2hlY2sgd2hldGhlciBhIHBhcnQgKDxzcGFuPiBub2RlKSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdG9rZW4KICAgICAgLy8gbWF0Y2guCiAgICAgIGZ1bmN0aW9uIGNvcnJlY3RQYXJ0KHRva2VuLCBwYXJ0KXsKICAgICAgICByZXR1cm4gIXBhcnQucmVkdWNlZCAmJiBwYXJ0LmN1cnJlbnRUZXh0ID09IHRva2VuLnZhbHVlICYmIHBhcnQuY2xhc3NOYW1lID09IHRva2VuLnN0eWxlOwogICAgICB9CiAgICAgIC8vIFNob3J0ZW4gdGhlIHRleHQgYXNzb2NpYXRlZCB3aXRoIGEgcGFydCBieSBjaG9wcGluZyBvZmYKICAgICAgLy8gY2hhcmFjdGVycyBmcm9tIHRoZSBmcm9udC4gTm90ZSB0aGF0IG9ubHkgdGhlIGN1cnJlbnRUZXh0CiAgICAgIC8vIHByb3BlcnR5IGdldHMgY2hhbmdlZC4gRm9yIGVmZmljaWVuY3kgcmVhc29ucywgd2UgbGVhdmUgdGhlCiAgICAgIC8vIG5vZGVWYWx1ZSBhbG9uZSAtLSB3ZSBzZXQgdGhlIHJlZHVjZWQgZmxhZyB0byBpbmRpY2F0ZSB0aGF0CiAgICAgIC8vIHRoaXMgcGFydCBtdXN0IGJlIHJlcGxhY2VkLgogICAgICBmdW5jdGlvbiBzaG9ydGVuUGFydChwYXJ0LCBtaW51cyl7CiAgICAgICAgcGFydC5jdXJyZW50VGV4dCA9IHBhcnQuY3VycmVudFRleHQuc3Vic3RyaW5nKG1pbnVzKTsKICAgICAgICBwYXJ0LnJlZHVjZWQgPSB0cnVlOwogICAgICB9CiAgICAgIC8vIENyZWF0ZSBhIHBhcnQgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHRva2VuLgogICAgICBmdW5jdGlvbiB0b2tlblBhcnQodG9rZW4pewogICAgICAgIHZhciBwYXJ0ID0gbWFrZVBhcnRTcGFuKHRva2VuLnZhbHVlLCBzZWxmLmRvYyk7ICAgICAKICAgICAgICBwYXJ0LmNsYXNzTmFtZSA9IHRva2VuLnN0eWxlOwogICAgICAgIHJldHVybiBwYXJ0OwogICAgICB9CgogICAgICBmdW5jdGlvbiBtYXliZVRvdWNoKG5vZGUpIHsKICAgICAgICBpZiAobm9kZSkgewogICAgICAgICAgdmFyIG9sZCA9IG5vZGUub2xkTmV4dFNpYmxpbmc7CiAgICAgICAgICBpZiAobGluZURpcnR5IHx8IG9sZCA9PT0gdW5kZWZpbmVkIHx8IG5vZGUubmV4dFNpYmxpbmcgIT0gb2xkKQogICAgICAgICAgICBzZWxmLmhpc3RvcnkudG91Y2gobm9kZSk7CiAgICAgICAgICBub2RlLm9sZE5leHRTaWJsaW5nID0gbm9kZS5uZXh0U2libGluZzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIgb2xkID0gc2VsZi5jb250YWluZXIub2xkRmlyc3RDaGlsZDsKICAgICAgICAgIGlmIChsaW5lRGlydHkgfHwgb2xkID09PSB1bmRlZmluZWQgfHwgc2VsZi5jb250YWluZXIuZmlyc3RDaGlsZCAhPSBvbGQpCiAgICAgICAgICAgIHNlbGYuaGlzdG9yeS50b3VjaChudWxsKTsKICAgICAgICAgIHNlbGYuY29udGFpbmVyLm9sZEZpcnN0Q2hpbGQgPSBzZWxmLmNvbnRhaW5lci5maXJzdENoaWxkOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gR2V0IHRoZSB0b2tlbiBzdHJlYW0uIElmIGZyb20gaXMgbnVsbCwgd2Ugc3RhcnQgd2l0aCBhIG5ldwogICAgICAvLyBwYXJzZXIgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZyYW1lLCBvdGhlcndpc2UgYSBwYXJ0aWFsIHBhcnNlCiAgICAgIC8vIGlzIHJlc3VtZWQuCiAgICAgIHZhciB0cmF2ZXJzYWwgPSB0cmF2ZXJzZURPTShmcm9tID8gZnJvbS5uZXh0U2libGluZyA6IGNvbnRhaW5lci5maXJzdENoaWxkKSwKICAgICAgICAgIHN0cmVhbSA9IHN0cmluZ1N0cmVhbSh0cmF2ZXJzYWwpLAogICAgICAgICAgcGFyc2VkID0gZnJvbSA/IGZyb20ucGFyc2VyRnJvbUhlcmUoc3RyZWFtKSA6IEVkaXRvci5QYXJzZXIubWFrZShzdHJlYW0pOwoKICAgICAgZnVuY3Rpb24gc3Vycm91bmRlZEJ5QlJzKG5vZGUpIHsKICAgICAgICByZXR1cm4gKG5vZGUucHJldmlvdXNTaWJsaW5nID09IG51bGwgfHwgaXNCUihub2RlLnByZXZpb3VzU2libGluZykpICYmCiAgICAgICAgICAgICAgIChub2RlLm5leHRTaWJsaW5nID09IG51bGwgfHwgaXNCUihub2RlLm5leHRTaWJsaW5nKSk7CiAgICAgIH0KCiAgICAgIC8vIHBhcnRzIGlzIGFuIGludGVyZmFjZSB0byBtYWtlIGl0IHBvc3NpYmxlIHRvICdkZWxheScgZmV0Y2hpbmcKICAgICAgLy8gdGhlIG5leHQgRE9NIG5vZGUgdW50aWwgd2UgYXJlIGNvbXBsZXRlbHkgZG9uZSB3aXRoIHRoZSBvbmUKICAgICAgLy8gYmVmb3JlIGl0LiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9mdGVuIHRoZSBuZXh0IG5vZGUgaXMKICAgICAgLy8gbm90IHlldCBhdmFpbGFibGUgd2hlbiB3ZSB3YW50IHRvIHByb2NlZWQgcGFzdCB0aGUgY3VycmVudAogICAgICAvLyBvbmUuCiAgICAgIHZhciBwYXJ0cyA9IHsKICAgICAgICBjdXJyZW50OiBudWxsLAogICAgICAgIC8vIEZldGNoIGN1cnJlbnQgbm9kZS4KICAgICAgICBnZXQ6IGZ1bmN0aW9uKCl7CiAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudCkKICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdHJhdmVyc2FsLm5vZGVzLnNoaWZ0KCk7CiAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50OwogICAgICAgIH0sCiAgICAgICAgLy8gQWR2YW5jZSB0byB0aGUgbmV4dCBwYXJ0IChkbyBub3QgZmV0Y2ggaXQgeWV0KS4KICAgICAgICBuZXh0OiBmdW5jdGlvbigpewogICAgICAgICAgdGhpcy5jdXJyZW50ID0gbnVsbDsKICAgICAgICB9LAogICAgICAgIC8vIFJlbW92ZSB0aGUgY3VycmVudCBwYXJ0IGZyb20gdGhlIERPTSB0cmVlLCBhbmQgbW92ZSB0byB0aGUKICAgICAgICAvLyBuZXh0LgogICAgICAgIHJlbW92ZTogZnVuY3Rpb24oKXsKICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZCh0aGlzLmdldCgpKTsKICAgICAgICAgIHRoaXMuY3VycmVudCA9IG51bGw7CiAgICAgICAgfSwKICAgICAgICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHBhcnQgdGhhdCBpcyBub3QgZW1wdHksIGRpc2NhcmRpbmcgZW1wdHkKICAgICAgICAvLyBwYXJ0cy4KICAgICAgICBnZXROb25FbXB0eTogZnVuY3Rpb24oKXsKICAgICAgICAgIHZhciBwYXJ0ID0gdGhpcy5nZXQoKTsKICAgICAgICAgIC8vIEFsbG93IGVtcHR5IG5vZGVzIHdoZW4gdGhleSBhcmUgYWxvbmUgb24gYSBsaW5lLCBuZWVkZWQKICAgICAgICAgIC8vIGZvciB0aGUgRkYgY3Vyc29yIGJ1ZyB3b3JrYXJvdW5kIChzZWUgc2VsZWN0LmpzLAogICAgICAgICAgLy8gaW5zZXJ0TmV3bGluZUF0Q3Vyc29yKS4KICAgICAgICAgIHdoaWxlIChwYXJ0ICYmIGlzU3BhbihwYXJ0KSAmJiBwYXJ0LmN1cnJlbnRUZXh0ID09ICIiKSB7CiAgICAgICAgICAgIC8vIExlYXZlIGVtcHR5IG5vZGVzIHRoYXQgYXJlIGFsb25lIG9uIGEgbGluZSBhbG9uZSBpbgogICAgICAgICAgICAvLyBPcGVyYSwgc2luY2UgdGhhdCBicm93c2VycyBkb2Vzbid0IGRlYWwgd2VsbCB3aXRoCiAgICAgICAgICAgIC8vIGhhdmluZyAyIEJScyBpbiBhIHJvdy4KICAgICAgICAgICAgaWYgKHdpbmRvdy5vcGVyYSAmJiBzdXJyb3VuZGVkQnlCUnMocGFydCkpIHsKICAgICAgICAgICAgICB0aGlzLm5leHQoKTsKICAgICAgICAgICAgICBwYXJ0ID0gdGhpcy5nZXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICB2YXIgb2xkID0gcGFydDsKICAgICAgICAgICAgICB0aGlzLnJlbW92ZSgpOwogICAgICAgICAgICAgIHBhcnQgPSB0aGlzLmdldCgpOwogICAgICAgICAgICAgIC8vIEFkanVzdCBzZWxlY3Rpb24gaW5mb3JtYXRpb24sIGlmIGFueS4gU2VlIHNlbGVjdC5qcyBmb3IgZGV0YWlscy4KICAgICAgICAgICAgICBzZWxlY3Quc25hcHNob3RNb3ZlKG9sZC5maXJzdENoaWxkLCBwYXJ0ICYmIChwYXJ0LmZpcnN0Q2hpbGQgfHwgcGFydCksIDApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHJldHVybiBwYXJ0OwogICAgICAgIH0KICAgICAgfTsKCiAgICAgIHZhciBsaW5lRGlydHkgPSBmYWxzZSwgcHJldkxpbmVEaXJ0eSA9IHRydWUsIGxpbmVOb2RlcyA9IDA7CgogICAgICAvLyBUaGlzIGZvckVhY2ggbG9vcHMgb3ZlciB0aGUgdG9rZW5zIGZyb20gdGhlIHBhcnNlZCBzdHJlYW0sIGFuZAogICAgICAvLyBhdCB0aGUgc2FtZSB0aW1lIHVzZXMgdGhlIHBhcnRzIG9iamVjdCB0byBwcm9jZWVkIHRocm91Z2ggdGhlCiAgICAgIC8vIGNvcnJlc3BvbmRpbmcgRE9NIG5vZGVzLgogICAgICBmb3JFYWNoKHBhcnNlZCwgZnVuY3Rpb24odG9rZW4pewogICAgICAgIHZhciBwYXJ0ID0gcGFydHMuZ2V0Tm9uRW1wdHkoKTsKCiAgICAgICAgaWYgKHRva2VuLnZhbHVlID09ICJcbiIpewogICAgICAgICAgLy8gVGhlIGlkZWEgb2YgdGhlIHR3byBzdHJlYW1zIGFjdHVhbGx5IHN0YXlpbmcgc3luY2hyb25pemVkCiAgICAgICAgICAvLyBpcyBzdWNoIGEgbG9uZyBzaG90IHRoYXQgd2UgZXhwbGljaXRseSBjaGVjay4KICAgICAgICAgIGlmICghaXNCUihwYXJ0KSkKICAgICAgICAgICAgdGhyb3cgIlBhcnNlciBvdXQgb2Ygc3luYy4gRXhwZWN0ZWQgQlIuIjsKCiAgICAgICAgICBpZiAocGFydC5kaXJ0eSB8fCAhcGFydC5pbmRlbnRhdGlvbikgbGluZURpcnR5ID0gdHJ1ZTsKICAgICAgICAgIG1heWJlVG91Y2goZnJvbSk7CiAgICAgICAgICBmcm9tID0gcGFydDsKCiAgICAgICAgICAvLyBFdmVyeSA8YnI+IGdldHMgYSBjb3B5IG9mIHRoZSBwYXJzZXIgc3RhdGUgYW5kIGEgbGV4aWNhbAogICAgICAgICAgLy8gY29udGV4dCBhc3NpZ25lZCB0byBpdC4gVGhlIGZpcnN0IGlzIHVzZWQgdG8gYmUgYWJsZSB0bwogICAgICAgICAgLy8gbGF0ZXIgcmVzdW1lIHBhcnNpbmcgZnJvbSB0aGlzIHBvaW50LCB0aGUgc2Vjb25kIGlzIHVzZWQKICAgICAgICAgIC8vIGZvciBpbmRlbnRhdGlvbi4KICAgICAgICAgIHBhcnQucGFyc2VyRnJvbUhlcmUgPSBwYXJzZWQuY29weSgpOwogICAgICAgICAgcGFydC5pbmRlbnRhdGlvbiA9IHRva2VuLmluZGVudGF0aW9uOwogICAgICAgICAgcGFydC5kaXJ0eSA9IGZhbHNlOwoKICAgICAgICAgIC8vIElmIHRoZSB0YXJnZXQgYXJndW1lbnQgd2Fzbid0IGFuIGludGVnZXIsIGdvIGF0IGxlYXN0CiAgICAgICAgICAvLyB1bnRpbCB0aGF0IG5vZGUuCiAgICAgICAgICBpZiAoZW5kVGltZSA9PSBudWxsICYmIHBhcnQgPT0gdGFyZ2V0KSB0aHJvdyBTdG9wSXRlcmF0aW9uOwoKICAgICAgICAgIC8vIEEgY2xlYW4gbGluZSB3aXRoIG1vcmUgdGhhbiBvbmUgbm9kZSBtZWFucyB3ZSBhcmUgZG9uZS4KICAgICAgICAgIC8vIFRocm93aW5nIGEgU3RvcEl0ZXJhdGlvbiBpcyB0aGUgd2F5IHRvIGJyZWFrIG91dCBvZiBhCiAgICAgICAgICAvLyBNb2NoaUtpdCBmb3JFYWNoIGxvb3AuCiAgICAgICAgICBpZiAoKGVuZFRpbWUgIT0gbnVsbCAmJiB0aW1lKCkgPj0gZW5kVGltZSkgfHwgKCFsaW5lRGlydHkgJiYgIXByZXZMaW5lRGlydHkgJiYgbGluZU5vZGVzID4gMSAmJiAhY2xlYW5MaW5lcykpCiAgICAgICAgICAgIHRocm93IFN0b3BJdGVyYXRpb247CiAgICAgICAgICBwcmV2TGluZURpcnR5ID0gbGluZURpcnR5OyBsaW5lRGlydHkgPSBmYWxzZTsgbGluZU5vZGVzID0gMDsKICAgICAgICAgIHBhcnRzLm5leHQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBpZiAoIWlzU3BhbihwYXJ0KSkKICAgICAgICAgICAgdGhyb3cgIlBhcnNlciBvdXQgb2Ygc3luYy4gRXhwZWN0ZWQgU1BBTi4iOwogICAgICAgICAgaWYgKHBhcnQuZGlydHkpCiAgICAgICAgICAgIGxpbmVEaXJ0eSA9IHRydWU7CiAgICAgICAgICBsaW5lTm9kZXMrKzsKCiAgICAgICAgICAvLyBJZiB0aGUgcGFydCBtYXRjaGVzIHRoZSB0b2tlbiwgd2UgY2FuIGxlYXZlIGl0IGFsb25lLgogICAgICAgICAgaWYgKGNvcnJlY3RQYXJ0KHRva2VuLCBwYXJ0KSl7CiAgICAgICAgICAgIHBhcnQuZGlydHkgPSBmYWxzZTsKICAgICAgICAgICAgcGFydHMubmV4dCgpOwogICAgICAgICAgfQogICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIGZpeCBpdC4KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBsaW5lRGlydHkgPSB0cnVlOwogICAgICAgICAgICAvLyBJbnNlcnQgdGhlIGNvcnJlY3QgcGFydC4KICAgICAgICAgICAgdmFyIG5ld1BhcnQgPSB0b2tlblBhcnQodG9rZW4pOwogICAgICAgICAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKG5ld1BhcnQsIHBhcnQpOwogICAgICAgICAgICBpZiAoYWN0aXZlKSBhY3RpdmUobmV3UGFydCwgdG9rZW4sIHNlbGYpOwogICAgICAgICAgICB2YXIgdG9rZW5zaXplID0gdG9rZW4udmFsdWUubGVuZ3RoOwogICAgICAgICAgICB2YXIgb2Zmc2V0ID0gMDsKICAgICAgICAgICAgLy8gRWF0IHVwIHBhcnRzIHVudGlsIHRoZSB0ZXh0IGZvciB0aGlzIHRva2VuIGhhcyBiZWVuCiAgICAgICAgICAgIC8vIHJlbW92ZWQsIGFkanVzdGluZyB0aGUgc3RvcmVkIHNlbGVjdGlvbiBpbmZvIChzZWUKICAgICAgICAgICAgLy8gc2VsZWN0LmpzKSBpbiB0aGUgcHJvY2Vzcy4KICAgICAgICAgICAgd2hpbGUgKHRva2Vuc2l6ZSA+IDApIHsKICAgICAgICAgICAgICBwYXJ0ID0gcGFydHMuZ2V0KCk7CiAgICAgICAgICAgICAgdmFyIHBhcnRzaXplID0gcGFydC5jdXJyZW50VGV4dC5sZW5ndGg7CiAgICAgICAgICAgICAgc2VsZWN0LnNuYXBzaG90UmVwbGFjZU5vZGUocGFydC5maXJzdENoaWxkLCBuZXdQYXJ0LmZpcnN0Q2hpbGQsIHRva2Vuc2l6ZSwgb2Zmc2V0KTsKICAgICAgICAgICAgICBpZiAocGFydHNpemUgPiB0b2tlbnNpemUpewogICAgICAgICAgICAgICAgc2hvcnRlblBhcnQocGFydCwgdG9rZW5zaXplKTsKICAgICAgICAgICAgICAgIHRva2Vuc2l6ZSA9IDA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdG9rZW5zaXplIC09IHBhcnRzaXplOwogICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHBhcnRzaXplOwogICAgICAgICAgICAgICAgcGFydHMucmVtb3ZlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgbWF5YmVUb3VjaChmcm9tKTsKICAgICAgd2Via2l0TGFzdExpbmVIYWNrKHRoaXMuY29udGFpbmVyKTsKCiAgICAgIC8vIFRoZSBmdW5jdGlvbiByZXR1cm5zIHNvbWUgc3RhdHVzIGluZm9ybWF0aW9uIHRoYXQgaXMgdXNlZCBieQogICAgICAvLyBoaWdodGxpZ2h0RGlydHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW5kIHdoZXJlIGl0IGhhcyB0bwogICAgICAvLyBjb250aW51ZS4KICAgICAgcmV0dXJuIHtub2RlOiBwYXJ0cy5nZXROb25FbXB0eSgpLAogICAgICAgICAgICAgIGRpcnR5OiBsaW5lRGlydHl9OwogICAgfQogIH07CgogIHJldHVybiBFZGl0b3I7Cn0pKCk7CgphZGRFdmVudEhhbmRsZXIod2luZG93LCAibG9hZCIsIGZ1bmN0aW9uKCkgewogIHZhciBDb2RlTWlycm9yID0gd2luZG93LmZyYW1lRWxlbWVudC5Db2RlTWlycm9yOwogIENvZGVNaXJyb3IuZWRpdG9yID0gbmV3IEVkaXRvcihDb2RlTWlycm9yLm9wdGlvbnMpOwogIHRoaXMucGFyZW50LnNldFRpbWVvdXQobWV0aG9kKENvZGVNaXJyb3IsICJpbml0IiksIDApOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/highlight.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gTWluaW1hbCBmcmFtaW5nIG5lZWRlZCB0byB1c2UgQ29kZU1pcnJvci1zdHlsZSBwYXJzZXJzIHRvIGhpZ2hsaWdodAovLyBjb2RlLiBMb2FkIHRoaXMgYWxvbmcgd2l0aCB0b2tlbml6ZS5qcywgc3RyaW5nc3RyZWFtLmpzLCBhbmQgeW91cgovLyBwYXJzZXIuIFRoZW4gY2FsbCBoaWdobGlnaHRUZXh0LCBwYXNzaW5nIGEgc3RyaW5nIGFzIHRoZSBmaXJzdAovLyBhcmd1bWVudCwgYW5kIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgZWl0aGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24KLy8gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGFycmF5IG9mIFNQQU4gbm9kZXMgZm9yIGV2ZXJ5IGxpbmUgaW4KLy8gdGhlIGNvZGUsIG9yIGEgRE9NIG5vZGUgdG8gd2hpY2ggdG8gYXBwZW5kIHRoZXNlIHNwYW5zLCBhbmQKLy8gb3B0aW9uYWxseSAobm90IG5lZWRlZCBpZiB5b3Ugb25seSBsb2FkZWQgb25lIHBhcnNlcikgYSBwYXJzZXIKLy8gb2JqZWN0LgoKLy8gU3R1ZmYgZnJvbSB1dGlsLmpzIHRoYXQgdGhlIHBhcnNlcnMgYXJlIHVzaW5nLgp2YXIgU3RvcEl0ZXJhdGlvbiA9IHt0b1N0cmluZzogZnVuY3Rpb24oKSB7cmV0dXJuICJTdG9wSXRlcmF0aW9uIn19OwoKdmFyIEVkaXRvciA9IHt9Owp2YXIgaW5kZW50VW5pdCA9IDI7CgooZnVuY3Rpb24oKXsKICBmdW5jdGlvbiBub3JtYWxpc2VTdHJpbmcoc3RyaW5nKSB7CiAgICB2YXIgdGFiID0gIiI7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluZGVudFVuaXQ7IGkrKykgdGFiICs9ICIgIjsKCiAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvXHQvZywgdGFiKS5yZXBsYWNlKC9cdTAwYTAvZywgIiAiKS5yZXBsYWNlKC9cclxuPy9nLCAiXG4iKTsKICAgIHZhciBwb3MgPSAwLCBwYXJ0cyA9IFtdLCBsaW5lcyA9IHN0cmluZy5zcGxpdCgiXG4iKTsKICAgIGZvciAodmFyIGxpbmUgPSAwOyBsaW5lIDwgbGluZXMubGVuZ3RoOyBsaW5lKyspIHsKICAgICAgaWYgKGxpbmUgIT0gMCkgcGFydHMucHVzaCgiXG4iKTsKICAgICAgcGFydHMucHVzaChsaW5lc1tsaW5lXSk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHBvcyA8IHBhcnRzLmxlbmd0aCkgcmV0dXJuIHBhcnRzW3BvcysrXTsKICAgICAgICBlbHNlIHRocm93IFN0b3BJdGVyYXRpb247CiAgICAgIH0KICAgIH07CiAgfQoKICB3aW5kb3cuaGlnaGxpZ2h0VGV4dCA9IGZ1bmN0aW9uKHN0cmluZywgY2FsbGJhY2ssIHBhcnNlcikgewogICAgdmFyIHBhcnNlciA9IChwYXJzZXIgfHwgRWRpdG9yLlBhcnNlcikubWFrZShzdHJpbmdTdHJlYW0obm9ybWFsaXNlU3RyaW5nKHN0cmluZykpKTsKICAgIHZhciBsaW5lID0gW107CiAgICBpZiAoY2FsbGJhY2subm9kZVR5cGUgPT0gMSkgewogICAgICB2YXIgbm9kZSA9IGNhbGxiYWNrOwogICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspCiAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGxpbmVbaV0pOwogICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiQlIiKSk7CiAgICAgIH07CiAgICB9CgogICAgdHJ5IHsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICB2YXIgdG9rZW4gPSBwYXJzZXIubmV4dCgpOwogICAgICAgIGlmICh0b2tlbi52YWx1ZSA9PSAiXG4iKSB7CiAgICAgICAgICBjYWxsYmFjayhsaW5lKTsKICAgICAgICAgIGxpbmUgPSBbXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlNQQU4iKTsKICAgICAgICAgIHNwYW4uY2xhc3NOYW1lID0gdG9rZW4uc3R5bGU7CiAgICAgICAgICBzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRva2VuLnZhbHVlKSk7CiAgICAgICAgICBsaW5lLnB1c2goc3Bhbik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjYXRjaCAoZSkgewogICAgICBpZiAoZSAhPSBTdG9wSXRlcmF0aW9uKSB0aHJvdyBlOwogICAgfQogICAgaWYgKGxpbmUubGVuZ3RoKSBjYWxsYmFjayhsaW5lKTsKICB9Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/mirrorframe.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogRGVtb25zdHJhdGlvbiBvZiBlbWJlZGRpbmcgQ29kZU1pcnJvciBpbiBhIGJpZ2dlciBhcHBsaWNhdGlvbi4gVGhlCiAqIGludGVyZmFjZSBkZWZpbmVkIGhlcmUgaXMgYSBtZXNzIG9mIHByb21wdHMgYW5kIGNvbmZpcm1zLCBhbmQKICogc2hvdWxkIHByb2JhYmx5IG5vdCBiZSB1c2VkIGluIGEgcmVhbCBwcm9qZWN0LgogKi8KCmZ1bmN0aW9uIE1pcnJvckZyYW1lKHBsYWNlLCBvcHRpb25zKSB7CiAgdGhpcy5ob21lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIik7CiAgaWYgKHBsYWNlLmFwcGVuZENoaWxkKQogICAgcGxhY2UuYXBwZW5kQ2hpbGQodGhpcy5ob21lKTsKICBlbHNlCiAgICBwbGFjZSh0aGlzLmhvbWUpOwoKICB2YXIgc2VsZiA9IHRoaXM7CiAgZnVuY3Rpb24gbWFrZUJ1dHRvbihuYW1lLCBhY3Rpb24pIHsKICAgIHZhciBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJJTlBVVCIpOwogICAgYnV0dG9uLnR5cGUgPSAiYnV0dG9uIjsKICAgIGJ1dHRvbi52YWx1ZSA9IG5hbWU7CiAgICBzZWxmLmhvbWUuYXBwZW5kQ2hpbGQoYnV0dG9uKTsKICAgIGJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24oKXtzZWxmW2FjdGlvbl0uY2FsbChzZWxmKTt9OwogIH0KCiAgbWFrZUJ1dHRvbigiU2VhcmNoIiwgInNlYXJjaCIpOwogIG1ha2VCdXR0b24oIlJlcGxhY2UiLCAicmVwbGFjZSIpOwogIG1ha2VCdXR0b24oIkN1cnJlbnQgbGluZSIsICJsaW5lIik7CiAgbWFrZUJ1dHRvbigiSnVtcCB0byBsaW5lIiwgImp1bXAiKTsKICBtYWtlQnV0dG9uKCJJbnNlcnQgY29uc3RydWN0b3IiLCAibWFjcm8iKTsKICBtYWtlQnV0dG9uKCJJbmRlbnQgYWxsIiwgInJlaW5kZW50Iik7CgogIHRoaXMubWlycm9yID0gbmV3IENvZGVNaXJyb3IodGhpcy5ob21lLCBvcHRpb25zKTsKfQoKTWlycm9yRnJhbWUucHJvdG90eXBlID0gewogIHNlYXJjaDogZnVuY3Rpb24oKSB7CiAgICB2YXIgdGV4dCA9IHByb21wdCgiRW50ZXIgc2VhcmNoIHRlcm06IiwgIiIpOwogICAgaWYgKCF0ZXh0KSByZXR1cm47CgogICAgdmFyIGZpcnN0ID0gdHJ1ZTsKICAgIGRvIHsKICAgICAgdmFyIGN1cnNvciA9IHRoaXMubWlycm9yLmdldFNlYXJjaEN1cnNvcih0ZXh0LCBmaXJzdCwgdHJ1ZSk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgIHdoaWxlIChjdXJzb3IuZmluZE5leHQoKSkgewogICAgICAgIGN1cnNvci5zZWxlY3QoKTsKICAgICAgICBpZiAoIWNvbmZpcm0oIlNlYXJjaCBhZ2Fpbj8iKSkKICAgICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSB3aGlsZSAoY29uZmlybSgiRW5kIG9mIGRvY3VtZW50IHJlYWNoZWQuIFN0YXJ0IG92ZXI/IikpOwogIH0sCgogIHJlcGxhY2U6IGZ1bmN0aW9uKCkgewogICAgLy8gVGhpcyBpcyBhIHJlcGxhY2UtYWxsLCBidXQgaXQgaXMgcG9zc2libGUgdG8gaW1wbGVtZW50IGEKICAgIC8vIHByb21wdGluZyByZXBsYWNlLgogICAgdmFyIGZyb20gPSBwcm9tcHQoIkVudGVyIHNlYXJjaCBzdHJpbmc6IiwgIiIpLCB0bzsKICAgIGlmIChmcm9tKSB0byA9IHByb21wdCgiV2hhdCBzaG91bGQgaXQgYmUgcmVwbGFjZWQgd2l0aD8iLCAiIik7CiAgICBpZiAodG8gPT0gbnVsbCkgcmV0dXJuOwoKICAgIHZhciBjdXJzb3IgPSB0aGlzLm1pcnJvci5nZXRTZWFyY2hDdXJzb3IoZnJvbSwgZmFsc2UpOwogICAgd2hpbGUgKGN1cnNvci5maW5kTmV4dCgpKQogICAgICBjdXJzb3IucmVwbGFjZSh0byk7CiAgfSwKCiAganVtcDogZnVuY3Rpb24oKSB7CiAgICB2YXIgbGluZSA9IHByb21wdCgiSnVtcCB0byBsaW5lOiIsICIiKTsKICAgIGlmIChsaW5lICYmICFpc05hTihOdW1iZXIobGluZSkpKQogICAgICB0aGlzLm1pcnJvci5qdW1wVG9MaW5lKE51bWJlcihsaW5lKSk7CiAgfSwKCiAgbGluZTogZnVuY3Rpb24oKSB7CiAgICBhbGVydCgiVGhlIGN1cnNvciBpcyBjdXJyZW50bHkgYXQgbGluZSAiICsgdGhpcy5taXJyb3IuY3VycmVudExpbmUoKSk7CiAgICB0aGlzLm1pcnJvci5mb2N1cygpOwogIH0sCgogIG1hY3JvOiBmdW5jdGlvbigpIHsKICAgIHZhciBuYW1lID0gcHJvbXB0KCJOYW1lIHlvdXIgY29uc3RydWN0b3I6IiwgIiIpOwogICAgaWYgKG5hbWUpCiAgICAgIHRoaXMubWlycm9yLnJlcGxhY2VTZWxlY3Rpb24oImZ1bmN0aW9uICIgKyBuYW1lICsgIigpIHtcbiAgXG59XG5cbiIgKyBuYW1lICsgIi5wcm90b3R5cGUgPSB7XG4gIFxufTtcbiIpOwogIH0sCgogIHJlaW5kZW50OiBmdW5jdGlvbigpIHsKICAgIHRoaXMubWlycm9yLnJlaW5kZW50KCk7CiAgfQp9Owo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsecss.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogU2ltcGxlIHBhcnNlciBmb3IgQ1NTICovCgp2YXIgQ1NTUGFyc2VyID0gRWRpdG9yLlBhcnNlciA9IChmdW5jdGlvbigpIHsKICB2YXIgdG9rZW5pemVDU1MgPSAoZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiBub3JtYWwoc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICBpZiAoY2ggPT0gIkAiKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1x3Lyk7CiAgICAgICAgcmV0dXJuICJjc3MtYXQiOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICIvIiAmJiBzb3VyY2UuZXF1YWxzKCIqIikpIHsKICAgICAgICBzZXRTdGF0ZShpbkNDb21tZW50KTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiPCIgJiYgc291cmNlLmVxdWFscygiISIpKSB7CiAgICAgICAgc2V0U3RhdGUoaW5TR01MQ29tbWVudCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIj0iKSB7CiAgICAgICAgcmV0dXJuICJjc3MtY29tcGFyZSI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoc291cmNlLmVxdWFscygiPSIpICYmIChjaCA9PSAifiIgfHwgY2ggPT0gInwiKSkgewogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgcmV0dXJuICJjc3MtY29tcGFyZSI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIlwiIiB8fCBjaCA9PSAiJyIpIHsKICAgICAgICBzZXRTdGF0ZShpblN0cmluZyhjaCkpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICIjIikgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9cdy8pOwogICAgICAgIHJldHVybiAiY3NzLWhhc2giOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICIhIikgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bIFx0XS8pOwogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9cdy8pOwogICAgICAgIHJldHVybiAiY3NzLWltcG9ydGFudCI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHcuJV0vKTsKICAgICAgICByZXR1cm4gImNzcy11bml0IjsKICAgICAgfQogICAgICBlbHNlIGlmICgvWywuKz4qXC9dLy50ZXN0KGNoKSkgewogICAgICAgIHJldHVybiAiY3NzLXNlbGVjdC1vcCI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoL1s7e306XFtcXV0vLnRlc3QoY2gpKSB7CiAgICAgICAgcmV0dXJuICJjc3MtcHVuY3R1YXRpb24iOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHdcXFwtX10vKTsKICAgICAgICByZXR1cm4gImNzcy1pZGVudGlmaWVyIjsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGluQ0NvbW1lbnQoc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZTsKICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKICAgICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICAgIGlmIChtYXliZUVuZCAmJiBjaCA9PSAiLyIpIHsKICAgICAgICAgIHNldFN0YXRlKG5vcm1hbCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgICAgfQogICAgICByZXR1cm4gImNzcy1jb21tZW50IjsKICAgIH0KCiAgICBmdW5jdGlvbiBpblNHTUxDb21tZW50KHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgdmFyIGRhc2hlcyA9IDA7CiAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgdmFyIGNoID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAoZGFzaGVzID49IDIgJiYgY2ggPT0gIj4iKSB7CiAgICAgICAgICBzZXRTdGF0ZShub3JtYWwpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGRhc2hlcyA9IChjaCA9PSAiLSIpID8gZGFzaGVzICsgMSA6IDA7CiAgICAgIH0KICAgICAgcmV0dXJuICJjc3MtY29tbWVudCI7CiAgICB9CgogICAgZnVuY3Rpb24gaW5TdHJpbmcocXVvdGUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlOwogICAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICAgICAgaWYgKGNoID09IHF1b3RlICYmICFlc2NhcGVkKQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBjaCA9PSAiXFwiOwogICAgICAgIH0KICAgICAgICBpZiAoIWVzY2FwZWQpCiAgICAgICAgICBzZXRTdGF0ZShub3JtYWwpOwogICAgICAgIHJldHVybiAiY3NzLXN0cmluZyI7CiAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc3RhcnRTdGF0ZSkgewogICAgICByZXR1cm4gdG9rZW5pemVyKHNvdXJjZSwgc3RhcnRTdGF0ZSB8fCBub3JtYWwpOwogICAgfTsKICB9KSgpOwoKICBmdW5jdGlvbiBpbmRlbnRDU1MoaW5CcmFjZXMsIGluUnVsZSwgYmFzZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKG5leHRDaGFycykgewogICAgICBpZiAoIWluQnJhY2VzIHx8IC9eXH0vLnRlc3QobmV4dENoYXJzKSkgcmV0dXJuIGJhc2U7CiAgICAgIGVsc2UgaWYgKGluUnVsZSkgcmV0dXJuIGJhc2UgKyBpbmRlbnRVbml0ICogMjsKICAgICAgZWxzZSByZXR1cm4gYmFzZSArIGluZGVudFVuaXQ7CiAgICB9OwogIH0KCiAgLy8gVGhpcyBpcyBhIHZlcnkgc2ltcGxpc3RpYyBwYXJzZXIgLS0gc2luY2UgQ1NTIGRvZXMgbm90IHJlYWxseQogIC8vIG5lc3QsIGl0IHdvcmtzIGFjY2VwdGFibHkgd2VsbCwgYnV0IHNvbWUgbmljZXIgY29sb3Vyb2luZyBjb3VsZAogIC8vIGJlIHByb3ZpZGVkIHdpdGggYSBtb3JlIGNvbXBsaWNhdGVkIHBhcnNlci4KICBmdW5jdGlvbiBwYXJzZUNTUyhzb3VyY2UsIGJhc2Vjb2x1bW4pIHsKICAgIGJhc2Vjb2x1bW4gPSBiYXNlY29sdW1uIHx8IDA7CiAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVDU1Moc291cmNlKTsKICAgIHZhciBpbkJyYWNlcyA9IGZhbHNlLCBpblJ1bGUgPSBmYWxzZTsKCiAgICB2YXIgaXRlciA9IHsKICAgICAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zLm5leHQoKSwgc3R5bGUgPSB0b2tlbi5zdHlsZSwgY29udGVudCA9IHRva2VuLmNvbnRlbnQ7CgogICAgICAgIGlmIChzdHlsZSA9PSAiY3NzLWlkZW50aWZpZXIiICYmIGluUnVsZSkKICAgICAgICAgIHRva2VuLnN0eWxlID0gImNzcy12YWx1ZSI7CiAgICAgICAgaWYgKHN0eWxlID09ICJjc3MtaGFzaCIpCiAgICAgICAgICB0b2tlbi5zdHlsZSA9ICBpblJ1bGUgPyAiY3NzLWNvbG9yY29kZSIgOiAiY3NzLWlkZW50aWZpZXIiOwoKICAgICAgICBpZiAoY29udGVudCA9PSAiXG4iKQogICAgICAgICAgdG9rZW4uaW5kZW50YXRpb24gPSBpbmRlbnRDU1MoaW5CcmFjZXMsIGluUnVsZSwgYmFzZWNvbHVtbik7CgogICAgICAgIGlmIChjb250ZW50ID09ICJ7IikKICAgICAgICAgIGluQnJhY2VzID0gdHJ1ZTsKICAgICAgICBlbHNlIGlmIChjb250ZW50ID09ICJ9IikKICAgICAgICAgIGluQnJhY2VzID0gaW5SdWxlID0gZmFsc2U7CiAgICAgICAgZWxzZSBpZiAoaW5CcmFjZXMgJiYgY29udGVudCA9PSAiOyIpCiAgICAgICAgICBpblJ1bGUgPSBmYWxzZTsKICAgICAgICBlbHNlIGlmIChpbkJyYWNlcyAmJiBzdHlsZSAhPSAiY3NzLWNvbW1lbnQiICYmIHN0eWxlICE9ICJ3aGl0ZXNwYWNlIikKICAgICAgICAgIGluUnVsZSA9IHRydWU7CgogICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgfSwKCiAgICAgIGNvcHk6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBfaW5CcmFjZXMgPSBpbkJyYWNlcywgX2luUnVsZSA9IGluUnVsZSwgX3Rva2VuU3RhdGUgPSB0b2tlbnMuc3RhdGU7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgICAgdG9rZW5zID0gdG9rZW5pemVDU1Moc291cmNlLCBfdG9rZW5TdGF0ZSk7CiAgICAgICAgICBpbkJyYWNlcyA9IF9pbkJyYWNlczsKICAgICAgICAgIGluUnVsZSA9IF9pblJ1bGU7CiAgICAgICAgICByZXR1cm4gaXRlcjsKICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGl0ZXI7CiAgfQoKICByZXR1cm4ge21ha2U6IHBhcnNlQ1NTLCBlbGVjdHJpY0NoYXJzOiAifSJ9Owp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsedummy.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIER1bW15UGFyc2VyID0gRWRpdG9yLlBhcnNlciA9IChmdW5jdGlvbigpIHsKICBmdW5jdGlvbiB0b2tlbml6ZUR1bW15KHNvdXJjZSkgewogICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHNvdXJjZS5uZXh0KCk7CiAgICByZXR1cm4gInRleHQiOwogIH0KICBmdW5jdGlvbiBwYXJzZUR1bW15KHNvdXJjZSkgewogICAgZnVuY3Rpb24gaW5kZW50VG8obikge3JldHVybiBmdW5jdGlvbigpIHtyZXR1cm4gbjt9fQogICAgc291cmNlID0gdG9rZW5pemVyKHNvdXJjZSwgdG9rZW5pemVEdW1teSk7CiAgICB2YXIgc3BhY2UgPSAwOwoKICAgIHZhciBpdGVyID0gewogICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdG9rID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAodG9rLnR5cGUgPT0gIndoaXRlc3BhY2UiKSB7CiAgICAgICAgICBpZiAodG9rLnZhbHVlID09ICJcbiIpIHRvay5pbmRlbnRhdGlvbiA9IGluZGVudFRvKHNwYWNlKTsKICAgICAgICAgIGVsc2Ugc3BhY2UgPSB0b2sudmFsdWUubGVuZ3RoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdG9rOwogICAgICB9LAogICAgICBjb3B5OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX3NwYWNlID0gc3BhY2U7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKF9zb3VyY2UpIHsKICAgICAgICAgIHNwYWNlID0gX3NwYWNlOwogICAgICAgICAgc291cmNlID0gdG9rZW5pemVyKF9zb3VyY2UsIHRva2VuaXplRHVtbXkpOwogICAgICAgICAgcmV0dXJuIGl0ZXI7CiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIHJldHVybiBpdGVyOwogIH0KICByZXR1cm4ge21ha2U6IHBhcnNlRHVtbXl9Owp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsehtmlmixed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIEhUTUxNaXhlZFBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgaWYgKCEoQ1NTUGFyc2VyICYmIEpTUGFyc2VyICYmIFhNTFBhcnNlcikpCiAgICB0aHJvdyBuZXcgRXJyb3IoIkNTUywgSlMsIGFuZCBYTUwgcGFyc2VycyBtdXN0IGJlIGxvYWRlZCBmb3IgSFRNTCBtaXhlZCBtb2RlIHRvIHdvcmsuIik7CiAgWE1MUGFyc2VyLmNvbmZpZ3VyZSh7dXNlSFRNTEtsdWRnZXM6IHRydWV9KTsKCiAgZnVuY3Rpb24gcGFyc2VNaXhlZChzdHJlYW0pIHsKICAgIHZhciBodG1sUGFyc2VyID0gWE1MUGFyc2VyLm1ha2Uoc3RyZWFtKSwgbG9jYWxQYXJzZXIgPSBudWxsLCBpblRhZyA9IGZhbHNlOwogICAgdmFyIGl0ZXIgPSB7bmV4dDogdG9wLCBjb3B5OiBjb3B5fTsKCiAgICBmdW5jdGlvbiB0b3AoKSB7CiAgICAgIHZhciB0b2tlbiA9IGh0bWxQYXJzZXIubmV4dCgpOwogICAgICBpZiAodG9rZW4uY29udGVudCA9PSAiPCIpCiAgICAgICAgaW5UYWcgPSB0cnVlOwogICAgICBlbHNlIGlmICh0b2tlbi5zdHlsZSA9PSAieG1sLXRhZ25hbWUiICYmIGluVGFnID09PSB0cnVlKQogICAgICAgIGluVGFnID0gdG9rZW4uY29udGVudC50b0xvd2VyQ2FzZSgpOwogICAgICBlbHNlIGlmICh0b2tlbi5jb250ZW50ID09ICI+IikgewogICAgICAgIGlmIChpblRhZyA9PSAic2NyaXB0IikKICAgICAgICAgIGl0ZXIubmV4dCA9IGxvY2FsKEpTUGFyc2VyLCAiPC9zY3JpcHQiKTsKICAgICAgICBlbHNlIGlmIChpblRhZyA9PSAic3R5bGUiKQogICAgICAgICAgaXRlci5uZXh0ID0gbG9jYWwoQ1NTUGFyc2VyLCAiPC9zdHlsZSIpOwogICAgICAgIGluVGFnID0gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRva2VuOwogICAgfQogICAgZnVuY3Rpb24gbG9jYWwocGFyc2VyLCB0YWcpIHsKICAgICAgdmFyIGJhc2VJbmRlbnQgPSBodG1sUGFyc2VyLmluZGVudGF0aW9uKCk7CiAgICAgIGxvY2FsUGFyc2VyID0gcGFyc2VyLm1ha2Uoc3RyZWFtLCBiYXNlSW5kZW50ICsgaW5kZW50VW5pdCk7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoc3RyZWFtLmxvb2tBaGVhZCh0YWcsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpIHsKICAgICAgICAgIGxvY2FsUGFyc2VyID0gbnVsbDsKICAgICAgICAgIGl0ZXIubmV4dCA9IHRvcDsKICAgICAgICAgIHJldHVybiB0b3AoKTsKICAgICAgICB9CgogICAgICAgIHZhciB0b2tlbiA9IGxvY2FsUGFyc2VyLm5leHQoKTsKICAgICAgICB2YXIgbHQgPSB0b2tlbi52YWx1ZS5sYXN0SW5kZXhPZigiPCIpLCBzeiA9IE1hdGgubWluKHRva2VuLnZhbHVlLmxlbmd0aCAtIGx0LCB0YWcubGVuZ3RoKTsKICAgICAgICBpZiAobHQgIT0gLTEgJiYgdG9rZW4udmFsdWUuc2xpY2UobHQsIGx0ICsgc3opLnRvTG93ZXJDYXNlKCkgPT0gdGFnLnNsaWNlKDAsIHN6KSAmJgogICAgICAgICAgICBzdHJlYW0ubG9va0FoZWFkKHRhZy5zbGljZShzeiksIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpIHsKICAgICAgICAgIHN0cmVhbS5wdXNoKHRva2VuLnZhbHVlLnNsaWNlKGx0KSk7CiAgICAgICAgICB0b2tlbi52YWx1ZSA9IHRva2VuLnZhbHVlLnNsaWNlKDAsIGx0KTsKICAgICAgICB9CgogICAgICAgIGlmICh0b2tlbi5pbmRlbnRhdGlvbikgewogICAgICAgICAgdmFyIG9sZEluZGVudCA9IHRva2VuLmluZGVudGF0aW9uOwogICAgICAgICAgdG9rZW4uaW5kZW50YXRpb24gPSBmdW5jdGlvbihjaGFycykgewogICAgICAgICAgICBpZiAoY2hhcnMgPT0gIjwvIikKICAgICAgICAgICAgICByZXR1cm4gYmFzZUluZGVudDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHJldHVybiBvbGRJbmRlbnQoY2hhcnMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvcHkoKSB7CiAgICAgIHZhciBfaHRtbCA9IGh0bWxQYXJzZXIuY29weSgpLCBfbG9jYWwgPSBsb2NhbFBhcnNlciAmJiBsb2NhbFBhcnNlci5jb3B5KCksCiAgICAgICAgICBfbmV4dCA9IGl0ZXIubmV4dCwgX2luVGFnID0gaW5UYWc7CiAgICAgIHJldHVybiBmdW5jdGlvbihfc3RyZWFtKSB7CiAgICAgICAgc3RyZWFtID0gX3N0cmVhbTsKICAgICAgICBodG1sUGFyc2VyID0gX2h0bWwoX3N0cmVhbSk7CiAgICAgICAgbG9jYWxQYXJzZXIgPSBfbG9jYWwgJiYgX2xvY2FsKF9zdHJlYW0pOwogICAgICAgIGl0ZXIubmV4dCA9IF9uZXh0OwogICAgICAgIGluVGFnID0gX2luVGFnOwogICAgICAgIHJldHVybiBpdGVyOwogICAgICB9OwogICAgfQogICAgcmV0dXJuIGl0ZXI7CiAgfQoKICByZXR1cm4ge21ha2U6IHBhcnNlTWl4ZWQsIGVsZWN0cmljQ2hhcnM6ICJ7fS86In07Cgp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsejavascript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogUGFyc2UgZnVuY3Rpb24gZm9yIEphdmFTY3JpcHQuIE1ha2VzIHVzZSBvZiB0aGUgdG9rZW5pemVyIGZyb20KICogdG9rZW5pemVqYXZhc2NyaXB0LmpzLiBOb3RlIHRoYXQgeW91ciBwYXJzZXJzIGRvIG5vdCBoYXZlIHRvIGJlCiAqIHRoaXMgY29tcGxpY2F0ZWQgLS0gaWYgeW91IGRvbid0IHdhbnQgdG8gcmVjb2duaXplIGxvY2FsIHZhcmlhYmxlcywKICogaW4gbWFueSBsYW5ndWFnZXMgaXQgaXMgZW5vdWdoIHRvIGp1c3QgbG9vayBmb3IgYnJhY2VzLCBzZW1pY29sb25zLAogKiBwYXJlbnRoZXNlcywgZXRjLCBhbmQga25vdyB3aGVuIHlvdSBhcmUgaW5zaWRlIGEgc3RyaW5nIG9yIGNvbW1lbnQuCiAqCiAqIFNlZSBtYW51YWwuaHRtbCBmb3IgbW9yZSBpbmZvIGFib3V0IHRoZSBwYXJzZXIgaW50ZXJmYWNlLgogKi8KCnZhciBKU1BhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgLy8gVG9rZW4gdHlwZXMgdGhhdCBjYW4gYmUgY29uc2lkZXJlZCB0byBiZSBhdG9tcy4KICB2YXIgYXRvbWljVHlwZXMgPSB7ImF0b20iOiB0cnVlLCAibnVtYmVyIjogdHJ1ZSwgInZhcmlhYmxlIjogdHJ1ZSwgInN0cmluZyI6IHRydWUsICJyZWdleHAiOiB0cnVlfTsKICAvLyBTZXR0aW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gaGF2ZSBKU09OIGRhdGEgaW5kZW50IHByb3Blcmx5LgogIHZhciBqc29uID0gZmFsc2U7CiAgLy8gQ29uc3RydWN0b3IgZm9yIHRoZSBsZXhpY2FsIGNvbnRleHQgb2JqZWN0cy4KICBmdW5jdGlvbiBKU0xleGljYWwoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYsIGluZm8pIHsKICAgIC8vIGluZGVudGF0aW9uIGF0IHN0YXJ0IG9mIHRoaXMgbGluZQogICAgdGhpcy5pbmRlbnRlZCA9IGluZGVudGVkOwogICAgLy8gY29sdW1uIGF0IHdoaWNoIHRoaXMgc2NvcGUgd2FzIG9wZW5lZAogICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICAvLyB0eXBlIG9mIHNjb3BlICgndmFyZGVmJywgJ3N0YXQnIChzdGF0ZW1lbnQpLCAnZm9ybScgKHNwZWNpYWwgZm9ybSksICdbJywgJ3snLCBvciAnKCcpCiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgLy8gJ1snLCAneycsIG9yICcoJyBibG9ja3MgdGhhdCBoYXZlIGFueSB0ZXh0IGFmdGVyIHRoZWlyIG9wZW5pbmcKICAgIC8vIGNoYXJhY3RlciBhcmUgc2FpZCB0byBiZSAnYWxpZ25lZCcgLS0gYW55IGxpbmVzIGJlbG93IGFyZQogICAgLy8gaW5kZW50ZWQgYWxsIHRoZSB3YXkgdG8gdGhlIG9wZW5pbmcgY2hhcmFjdGVyLgogICAgaWYgKGFsaWduICE9IG51bGwpCiAgICAgIHRoaXMuYWxpZ24gPSBhbGlnbjsKICAgIC8vIFBhcmVudCBzY29wZSwgaWYgYW55LgogICAgdGhpcy5wcmV2ID0gcHJldjsKICAgIHRoaXMuaW5mbyA9IGluZm87CiAgfQoKICAvLyBNeSBmYXZvdXJpdGUgSmF2YVNjcmlwdCBpbmRlbnRhdGlvbiBydWxlcy4KICBmdW5jdGlvbiBpbmRlbnRKUyhsZXhpY2FsKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oZmlyc3RDaGFycykgewogICAgICB2YXIgZmlyc3RDaGFyID0gZmlyc3RDaGFycyAmJiBmaXJzdENoYXJzLmNoYXJBdCgwKSwgdHlwZSA9IGxleGljYWwudHlwZTsKICAgICAgdmFyIGNsb3NpbmcgPSBmaXJzdENoYXIgPT0gdHlwZTsKICAgICAgaWYgKHR5cGUgPT0gInZhcmRlZiIpCiAgICAgICAgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyA0OwogICAgICBlbHNlIGlmICh0eXBlID09ICJmb3JtIiAmJiBmaXJzdENoYXIgPT0gInsiKQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkOwogICAgICBlbHNlIGlmICh0eXBlID09ICJzdGF0IiB8fCB0eXBlID09ICJmb3JtIikKICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIGluZGVudFVuaXQ7CiAgICAgIGVsc2UgaWYgKGxleGljYWwuaW5mbyA9PSAic3dpdGNoIiAmJiAhY2xvc2luZykKICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArICgvXig/OmNhc2V8ZGVmYXVsdClcYi8udGVzdChmaXJzdENoYXJzKSA/IGluZGVudFVuaXQgOiAyICogaW5kZW50VW5pdCk7CiAgICAgIGVsc2UgaWYgKGxleGljYWwuYWxpZ24pCiAgICAgICAgcmV0dXJuIGxleGljYWwuY29sdW1uIC0gKGNsb3NpbmcgPyAxIDogMCk7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfTsKICB9CgogIC8vIFRoZSBwYXJzZXItaXRlcmF0b3ItcHJvZHVjaW5nIGZ1bmN0aW9uIGl0c2VsZi4KICBmdW5jdGlvbiBwYXJzZUpTKGlucHV0LCBiYXNlY29sdW1uKSB7CiAgICAvLyBXcmFwIHRoZSBpbnB1dCBpbiBhIHRva2VuIHN0cmVhbQogICAgdmFyIHRva2VucyA9IHRva2VuaXplSmF2YVNjcmlwdChpbnB1dCk7CiAgICAvLyBUaGUgcGFyc2VyIHN0YXRlLiBjYyBpcyBhIHN0YWNrIG9mIGFjdGlvbnMgdGhhdCBoYXZlIHRvIGJlCiAgICAvLyBwZXJmb3JtZWQgdG8gZmluaXNoIHRoZSBjdXJyZW50IHN0YXRlbWVudC4gRm9yIGV4YW1wbGUgd2UgbWlnaHQKICAgIC8vIGtub3cgdGhhdCB3ZSBzdGlsbCBuZWVkIHRvIGZpbmQgYSBjbG9zaW5nIHBhcmVudGhlc2lzIGFuZCBhCiAgICAvLyBzZW1pY29sb24uIEFjdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RhY2sgZ28gZmlyc3QuIEl0IGlzCiAgICAvLyBpbml0aWFsaXplZCB3aXRoIGFuIGluZmluaXRlbHkgbG9vcGluZyBhY3Rpb24gdGhhdCBjb25zdW1lcwogICAgLy8gd2hvbGUgc3RhdGVtZW50cy4KICAgIHZhciBjYyA9IFtzdGF0ZW1lbnRzXTsKICAgIC8vIENvbnRleHQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgbG9jYWwgc2NvcGUsIHRoZQogICAgLy8gdmFyaWFibGVzIGRlZmluZWQgaW4gdGhhdCwgYW5kIHRoZSBzY29wZXMgYWJvdmUgaXQuCiAgICB2YXIgY29udGV4dCA9IG51bGw7CiAgICAvLyBUaGUgbGV4aWNhbCBzY29wZSwgdXNlZCBtb3N0bHkgZm9yIGluZGVudGF0aW9uLgogICAgdmFyIGxleGljYWwgPSBuZXcgSlNMZXhpY2FsKChiYXNlY29sdW1uIHx8IDApIC0gaW5kZW50VW5pdCwgMCwgImJsb2NrIiwgZmFsc2UpOwogICAgLy8gQ3VycmVudCBjb2x1bW4sIGFuZCB0aGUgaW5kZW50YXRpb24gYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50CiAgICAvLyBsaW5lLiBVc2VkIHRvIGNyZWF0ZSBsZXhpY2FsIHNjb3BlIG9iamVjdHMuCiAgICB2YXIgY29sdW1uID0gMDsKICAgIHZhciBpbmRlbnRlZCA9IDA7CiAgICAvLyBWYXJpYWJsZXMgd2hpY2ggYXJlIHVzZWQgYnkgdGhlIG1hcmssIGNvbnQsIGFuZCBwYXNzIGZ1bmN0aW9ucwogICAgLy8gYmVsb3cgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZHJpdmVyIGxvb3AgaW4gdGhlICduZXh0JwogICAgLy8gZnVuY3Rpb24uCiAgICB2YXIgY29uc3VtZSwgbWFya2VkOwogIAogICAgLy8gVGhlIGl0ZXJhdG9yIG9iamVjdC4KICAgIHZhciBwYXJzZXIgPSB7bmV4dDogbmV4dCwgY29weTogY29weX07CgogICAgZnVuY3Rpb24gbmV4dCgpewogICAgICAvLyBTdGFydCBieSBwZXJmb3JtaW5nIGFueSAnbGV4aWNhbCcgYWN0aW9ucyAoYWRqdXN0aW5nIHRoZQogICAgICAvLyBsZXhpY2FsIHZhcmlhYmxlKSwgb3IgdGhlIG9wZXJhdGlvbnMgYmVsb3cgd2lsbCBiZSB3b3JraW5nCiAgICAgIC8vIHdpdGggdGhlIHdyb25nIGxleGljYWwgc3RhdGUuCiAgICAgIHdoaWxlKGNjW2NjLmxlbmd0aCAtIDFdLmxleCkKICAgICAgICBjYy5wb3AoKSgpOwoKICAgICAgLy8gRmV0Y2ggYSB0b2tlbi4KICAgICAgdmFyIHRva2VuID0gdG9rZW5zLm5leHQoKTsKCiAgICAgIC8vIEFkanVzdCBjb2x1bW4gYW5kIGluZGVudGVkLgogICAgICBpZiAodG9rZW4udHlwZSA9PSAid2hpdGVzcGFjZSIgJiYgY29sdW1uID09IDApCiAgICAgICAgaW5kZW50ZWQgPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgIGNvbHVtbiArPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgIGlmICh0b2tlbi5jb250ZW50ID09ICJcbiIpewogICAgICAgIGluZGVudGVkID0gY29sdW1uID0gMDsKICAgICAgICAvLyBJZiB0aGUgbGV4aWNhbCBzY29wZSdzIGFsaWduIHByb3BlcnR5IGlzIHN0aWxsIHVuZGVmaW5lZCBhdAogICAgICAgIC8vIHRoZSBlbmQgb2YgdGhlIGxpbmUsIGl0IGlzIGFuIHVuLWFsaWduZWQgc2NvcGUuCiAgICAgICAgaWYgKCEoImFsaWduIiBpbiBsZXhpY2FsKSkKICAgICAgICAgIGxleGljYWwuYWxpZ24gPSBmYWxzZTsKICAgICAgICAvLyBOZXdsaW5lIHRva2VucyBnZXQgYW4gaW5kZW50YXRpb24gZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoCiAgICAgICAgLy8gdGhlbS4KICAgICAgICB0b2tlbi5pbmRlbnRhdGlvbiA9IGluZGVudEpTKGxleGljYWwpOwogICAgICB9CiAgICAgIC8vIE5vIG1vcmUgcHJvY2Vzc2luZyBmb3IgbWVhbmluZ2xlc3MgdG9rZW5zLgogICAgICBpZiAodG9rZW4udHlwZSA9PSAid2hpdGVzcGFjZSIgfHwgdG9rZW4udHlwZSA9PSAiY29tbWVudCIpCiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAvLyBXaGVuIGEgbWVhbmluZ2Z1bCB0b2tlbiBpcyBmb3VuZCBhbmQgdGhlIGxleGljYWwgc2NvcGUncwogICAgICAvLyBhbGlnbiBpcyB1bmRlZmluZWQsIGl0IGlzIGFuIGFsaWduZWQgc2NvcGUuCiAgICAgIGlmICghKCJhbGlnbiIgaW4gbGV4aWNhbCkpCiAgICAgICAgbGV4aWNhbC5hbGlnbiA9IHRydWU7CgogICAgICAvLyBFeGVjdXRlIGFjdGlvbnMgdW50aWwgb25lICdjb25zdW1lcycgdGhlIHRva2VuIGFuZCB3ZSBjYW4KICAgICAgLy8gcmV0dXJuIGl0LgogICAgICB3aGlsZSh0cnVlKSB7CiAgICAgICAgY29uc3VtZSA9IG1hcmtlZCA9IGZhbHNlOwogICAgICAgIC8vIFRha2UgYW5kIGV4ZWN1dGUgdGhlIHRvcG1vc3QgYWN0aW9uLgogICAgICAgIGNjLnBvcCgpKHRva2VuLnR5cGUsIHRva2VuLmNvbnRlbnQpOwogICAgICAgIGlmIChjb25zdW1lKXsKICAgICAgICAgIC8vIE1hcmtlZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgc3R5bGUgb2YgdGhlIGN1cnJlbnQgdG9rZW4uCiAgICAgICAgICBpZiAobWFya2VkKQogICAgICAgICAgICB0b2tlbi5zdHlsZSA9IG1hcmtlZDsKICAgICAgICAgIC8vIEhlcmUgd2UgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGxvY2FsIGFuZCBnbG9iYWwgdmFyaWFibGVzLgogICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAidmFyaWFibGUiICYmIGluU2NvcGUodG9rZW4uY29udGVudCkpCiAgICAgICAgICAgIHRva2VuLnN0eWxlID0gImpzLWxvY2FsdmFyaWFibGUiOwogICAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIFRoaXMgbWFrZXMgYSBjb3B5IG9mIHRoZSBwYXJzZXIgc3RhdGUuIEl0IHN0b3JlcyBhbGwgdGhlCiAgICAvLyBzdGF0ZWZ1bCB2YXJpYWJsZXMgaW4gYSBjbG9zdXJlLCBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQKICAgIC8vIHdpbGwgcmVzdG9yZSB0aGVtIHdoZW4gY2FsbGVkIHdpdGggYSBuZXcgaW5wdXQgc3RyZWFtLiBOb3RlCiAgICAvLyB0aGF0IHRoZSBjYyBhcnJheSBoYXMgdG8gYmUgY29waWVkLCBiZWNhdXNlIGl0IGlzIGNvbnRhbnRseQogICAgLy8gYmVpbmcgbW9kaWZpZWQuIExleGljYWwgb2JqZWN0cyBhcmUgbm90IG11dGF0ZWQsIGFuZCBjb250ZXh0CiAgICAvLyBvYmplY3RzIGFyZSBub3QgbXV0YXRlZCBpbiBhIGhhcm1mdWwgd2F5LCBzbyB0aGV5IGNhbiBiZSBzaGFyZWQKICAgIC8vIGJldHdlZW4gcnVucyBvZiB0aGUgcGFyc2VyLgogICAgZnVuY3Rpb24gY29weSgpewogICAgICB2YXIgX2NvbnRleHQgPSBjb250ZXh0LCBfbGV4aWNhbCA9IGxleGljYWwsIF9jYyA9IGNjLmNvbmNhdChbXSksIF90b2tlblN0YXRlID0gdG9rZW5zLnN0YXRlOwogIAogICAgICByZXR1cm4gZnVuY3Rpb24gY29weVBhcnNlcihpbnB1dCl7CiAgICAgICAgY29udGV4dCA9IF9jb250ZXh0OwogICAgICAgIGxleGljYWwgPSBfbGV4aWNhbDsKICAgICAgICBjYyA9IF9jYy5jb25jYXQoW10pOyAvLyBjb3BpZXMgdGhlIGFycmF5CiAgICAgICAgY29sdW1uID0gaW5kZW50ZWQgPSAwOwogICAgICAgIHRva2VucyA9IHRva2VuaXplSmF2YVNjcmlwdChpbnB1dCwgX3Rva2VuU3RhdGUpOwogICAgICAgIHJldHVybiBwYXJzZXI7CiAgICAgIH07CiAgICB9CgogICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBwdXNoaW5nIGEgbnVtYmVyIG9mIGFjdGlvbnMgb250byB0aGUgY2MKICAgIC8vIHN0YWNrIGluIHJldmVyc2Ugb3JkZXIuCiAgICBmdW5jdGlvbiBwdXNoKGZzKXsKICAgICAgZm9yICh2YXIgaSA9IGZzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQogICAgICAgIGNjLnB1c2goZnNbaV0pOwogICAgfQogICAgLy8gY29udCBhbmQgcGFzcyBhcmUgdXNlZCBieSB0aGUgYWN0aW9uIGZ1bmN0aW9ucyB0byBhZGQgb3RoZXIKICAgIC8vIGFjdGlvbnMgdG8gdGhlIHN0YWNrLiBjb250IHdpbGwgY2F1c2UgdGhlIGN1cnJlbnQgdG9rZW4gdG8gYmUKICAgIC8vIGNvbnN1bWVkLCBwYXNzIHdpbGwgbGVhdmUgaXQgZm9yIHRoZSBuZXh0IGFjdGlvbi4KICAgIGZ1bmN0aW9uIGNvbnQoKXsKICAgICAgcHVzaChhcmd1bWVudHMpOwogICAgICBjb25zdW1lID0gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhc3MoKXsKICAgICAgcHVzaChhcmd1bWVudHMpOwogICAgICBjb25zdW1lID0gZmFsc2U7CiAgICB9CiAgICAvLyBVc2VkIHRvIGNoYW5nZSB0aGUgc3R5bGUgb2YgdGhlIGN1cnJlbnQgdG9rZW4uCiAgICBmdW5jdGlvbiBtYXJrKHN0eWxlKXsKICAgICAgbWFya2VkID0gc3R5bGU7CiAgICB9CgogICAgLy8gUHVzaCBhIG5ldyBzY29wZS4gV2lsbCBhdXRvbWF0aWNhbGx5IGxpbmsgdGhlIGN1cnJlbnQgc2NvcGUuCiAgICBmdW5jdGlvbiBwdXNoY29udGV4dCgpewogICAgICBjb250ZXh0ID0ge3ByZXY6IGNvbnRleHQsIHZhcnM6IHsidGhpcyI6IHRydWUsICJhcmd1bWVudHMiOiB0cnVlfX07CiAgICB9CiAgICAvLyBQb3Agb2ZmIHRoZSBjdXJyZW50IHNjb3BlLgogICAgZnVuY3Rpb24gcG9wY29udGV4dCgpewogICAgICBjb250ZXh0ID0gY29udGV4dC5wcmV2OwogICAgfQogICAgLy8gUmVnaXN0ZXIgYSB2YXJpYWJsZSBpbiB0aGUgY3VycmVudCBzY29wZS4KICAgIGZ1bmN0aW9uIHJlZ2lzdGVyKHZhcm5hbWUpewogICAgICBpZiAoY29udGV4dCl7CiAgICAgICAgbWFyaygianMtdmFyaWFibGVkZWYiKTsKICAgICAgICBjb250ZXh0LnZhcnNbdmFybmFtZV0gPSB0cnVlOwogICAgICB9CiAgICB9CiAgICAvLyBDaGVjayB3aGV0aGVyIGEgdmFyaWFibGUgaXMgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBzY29wZS4KICAgIGZ1bmN0aW9uIGluU2NvcGUodmFybmFtZSl7CiAgICAgIHZhciBjdXJzb3IgPSBjb250ZXh0OwogICAgICB3aGlsZSAoY3Vyc29yKSB7CiAgICAgICAgaWYgKGN1cnNvci52YXJzW3Zhcm5hbWVdKQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgY3Vyc29yID0gY3Vyc29yLnByZXY7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIAogICAgLy8gUHVzaCBhIG5ldyBsZXhpY2FsIGNvbnRleHQgb2YgdGhlIGdpdmVuIHR5cGUuCiAgICBmdW5jdGlvbiBwdXNobGV4KHR5cGUsIGluZm8pIHsKICAgICAgdmFyIHJlc3VsdCA9IGZ1bmN0aW9uKCl7CiAgICAgICAgbGV4aWNhbCA9IG5ldyBKU0xleGljYWwoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgbnVsbCwgbGV4aWNhbCwgaW5mbykKICAgICAgfTsKICAgICAgcmVzdWx0LmxleCA9IHRydWU7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvLyBQb3Agb2ZmIHRoZSBjdXJyZW50IGxleGljYWwgY29udGV4dC4KICAgIGZ1bmN0aW9uIHBvcGxleCgpewogICAgICBsZXhpY2FsID0gbGV4aWNhbC5wcmV2OwogICAgfQogICAgcG9wbGV4LmxleCA9IHRydWU7CiAgICAvLyBUaGUgJ2xleCcgZmxhZyBvbiB0aGVzZSBhY3Rpb25zIGlzIHVzZWQgYnkgdGhlICduZXh0JyBmdW5jdGlvbgogICAgLy8gdG8ga25vdyB0aGV5IGNhbiAoYW5kIGhhdmUgdG8pIGJlIHJhbiBiZWZvcmUgbW92aW5nIG9uIHRvIHRoZQogICAgLy8gbmV4dCB0b2tlbi4KICAKICAgIC8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgZGlzY2FyZHMgdG9rZW5zIHVudGlsIGl0IGZpbmRzIG9uZSBvZgogICAgLy8gdGhlIGdpdmVuIHR5cGUuCiAgICBmdW5jdGlvbiBleHBlY3Qod2FudGVkKXsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIGV4cGVjdGluZyh0eXBlKXsKICAgICAgICBpZiAodHlwZSA9PSB3YW50ZWQpIGNvbnQoKTsKICAgICAgICBlbHNlIGNvbnQoYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgIH07CiAgICB9CgogICAgLy8gTG9va3MgZm9yIGEgc3RhdGVtZW50LCBhbmQgdGhlbiBjYWxscyBpdHNlbGYuCiAgICBmdW5jdGlvbiBzdGF0ZW1lbnRzKHR5cGUpewogICAgICByZXR1cm4gcGFzcyhzdGF0ZW1lbnQsIHN0YXRlbWVudHMpOwogICAgfQogICAgLy8gRGlzcGF0Y2hlcyB2YXJpb3VzIHR5cGVzIG9mIHN0YXRlbWVudHMgYmFzZWQgb24gdGhlIHR5cGUgb2YgdGhlCiAgICAvLyBjdXJyZW50IHRva2VuLgogICAgZnVuY3Rpb24gc3RhdGVtZW50KHR5cGUpewogICAgICBpZiAodHlwZSA9PSAidmFyIikgY29udChwdXNobGV4KCJ2YXJkZWYiKSwgdmFyZGVmMSwgZXhwZWN0KCI7IiksIHBvcGxleCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImtleXdvcmQgYSIpIGNvbnQocHVzaGxleCgiZm9ybSIpLCBleHByZXNzaW9uLCBzdGF0ZW1lbnQsIHBvcGxleCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImtleXdvcmQgYiIpIGNvbnQocHVzaGxleCgiZm9ybSIpLCBzdGF0ZW1lbnQsIHBvcGxleCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInsiICYmIGpzb24pIGNvbnQocHVzaGxleCgifSIpLCBjb21tYXNlcChvYmpwcm9wLCAifSIpLCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJ7IikgY29udChwdXNobGV4KCJ9IiksIGJsb2NrLCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmdW5jdGlvbiIpIGNvbnQoZnVuY3Rpb25kZWYpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmb3IiKSBjb250KHB1c2hsZXgoImZvcm0iKSwgZXhwZWN0KCIoIiksIHB1c2hsZXgoIikiKSwgZm9yc3BlYzEsIGV4cGVjdCgiKSIpLCBwb3BsZXgsIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAidmFyaWFibGUiKSBjb250KHB1c2hsZXgoInN0YXQiKSwgbWF5YmVsYWJlbCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInN3aXRjaCIpIGNvbnQocHVzaGxleCgiZm9ybSIpLCBleHByZXNzaW9uLCBwdXNobGV4KCJ9IiwgInN3aXRjaCIpLCBleHBlY3QoInsiKSwgYmxvY2ssIHBvcGxleCwgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiY2FzZSIpIGNvbnQoZXhwcmVzc2lvbiwgZXhwZWN0KCI6IikpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJkZWZhdWx0IikgY29udChleHBlY3QoIjoiKSk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImNhdGNoIikgY29udChwdXNobGV4KCJmb3JtIiksIHB1c2hjb250ZXh0LCBleHBlY3QoIigiKSwgZnVuYXJnLCBleHBlY3QoIikiKSwgc3RhdGVtZW50LCBwb3BsZXgsIHBvcGNvbnRleHQpOwogICAgICBlbHNlIHBhc3MocHVzaGxleCgic3RhdCIpLCBleHByZXNzaW9uLCBleHBlY3QoIjsiKSwgcG9wbGV4KTsKICAgIH0KICAgIC8vIERpc3BhdGNoIGV4cHJlc3Npb24gdHlwZXMuCiAgICBmdW5jdGlvbiBleHByZXNzaW9uKHR5cGUpewogICAgICBpZiAoYXRvbWljVHlwZXMuaGFzT3duUHJvcGVydHkodHlwZSkpIGNvbnQobWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImZ1bmN0aW9uIikgY29udChmdW5jdGlvbmRlZik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImtleXdvcmQgYyIpIGNvbnQoZXhwcmVzc2lvbik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIigiKSBjb250KHB1c2hsZXgoIikiKSwgZXhwcmVzc2lvbiwgZXhwZWN0KCIpIiksIHBvcGxleCwgbWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIm9wZXJhdG9yIikgY29udChleHByZXNzaW9uKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiWyIpIGNvbnQocHVzaGxleCgiXSIpLCBjb21tYXNlcChleHByZXNzaW9uLCAiXSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJ7IikgY29udChwdXNobGV4KCJ9IiksIGNvbW1hc2VwKG9ianByb3AsICJ9IiksIHBvcGxleCwgbWF5YmVvcGVyYXRvcik7CiAgICB9CiAgICAvLyBDYWxsZWQgZm9yIHBsYWNlcyB3aGVyZSBvcGVyYXRvcnMsIGZ1bmN0aW9uIGNhbGxzLCBvcgogICAgLy8gc3Vic2NyaXB0cyBhcmUgdmFsaWQuIFdpbGwgc2tpcCBvbiB0byB0aGUgbmV4dCBhY3Rpb24gaWYgbm9uZQogICAgLy8gaXMgZm91bmQuCiAgICBmdW5jdGlvbiBtYXliZW9wZXJhdG9yKHR5cGUpewogICAgICBpZiAodHlwZSA9PSAib3BlcmF0b3IiKSBjb250KGV4cHJlc3Npb24pOwogICAgICBlbHNlIGlmICh0eXBlID09ICIoIikgY29udChwdXNobGV4KCIpIiksIGV4cHJlc3Npb24sIGNvbW1hc2VwKGV4cHJlc3Npb24sICIpIiksIHBvcGxleCwgbWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIi4iKSBjb250KHByb3BlcnR5LCBtYXliZW9wZXJhdG9yKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiWyIpIGNvbnQocHVzaGxleCgiXSIpLCBleHByZXNzaW9uLCBleHBlY3QoIl0iKSwgcG9wbGV4LCBtYXliZW9wZXJhdG9yKTsKICAgIH0KICAgIC8vIFdoZW4gYSBzdGF0ZW1lbnQgc3RhcnRzIHdpdGggYSB2YXJpYWJsZSBuYW1lLCBpdCBtaWdodCBiZSBhCiAgICAvLyBsYWJlbC4gSWYgbm8gY29sb24gZm9sbG93cywgaXQncyBhIHJlZ3VsYXIgc3RhdGVtZW50LgogICAgZnVuY3Rpb24gbWF5YmVsYWJlbCh0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gIjoiKSBjb250KHBvcGxleCwgc3RhdGVtZW50KTsKICAgICAgZWxzZSBwYXNzKG1heWJlb3BlcmF0b3IsIGV4cGVjdCgiOyIpLCBwb3BsZXgpOwogICAgfQogICAgLy8gUHJvcGVydHkgbmFtZXMgbmVlZCB0byBoYXZlIHRoZWlyIHN0eWxlIGFkanVzdGVkIC0tIHRoZQogICAgLy8gdG9rZW5pemVyIHRoaW5rcyB0aGV5IGFyZSB2YXJpYWJsZXMuCiAgICBmdW5jdGlvbiBwcm9wZXJ0eSh0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikge21hcmsoImpzLXByb3BlcnR5Iik7IGNvbnQoKTt9CiAgICB9CiAgICAvLyBUaGlzIHBhcnNlcyBhIHByb3BlcnR5IGFuZCBpdHMgdmFsdWUgaW4gYW4gb2JqZWN0IGxpdGVyYWwuCiAgICBmdW5jdGlvbiBvYmpwcm9wKHR5cGUpewogICAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKSBtYXJrKCJqcy1wcm9wZXJ0eSIpOwogICAgICBpZiAoYXRvbWljVHlwZXMuaGFzT3duUHJvcGVydHkodHlwZSkpIGNvbnQoZXhwZWN0KCI6IiksIGV4cHJlc3Npb24pOwogICAgfQogICAgLy8gUGFyc2VzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHRoaW5ncyB0aGF0IGFyZSByZWNvZ25pemVkCiAgICAvLyBieSB0aGUgJ3doYXQnIGFyZ3VtZW50LgogICAgZnVuY3Rpb24gY29tbWFzZXAod2hhdCwgZW5kKXsKICAgICAgZnVuY3Rpb24gcHJvY2VlZCh0eXBlKSB7CiAgICAgICAgaWYgKHR5cGUgPT0gIiwiKSBjb250KHdoYXQsIHByb2NlZWQpOwogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gZW5kKSBjb250KCk7CiAgICAgICAgZWxzZSBjb250KGV4cGVjdChlbmQpKTsKICAgICAgfTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbW1hU2VwYXJhdGVkKHR5cGUpIHsKICAgICAgICBpZiAodHlwZSA9PSBlbmQpIGNvbnQoKTsKICAgICAgICBlbHNlIHBhc3Mod2hhdCwgcHJvY2VlZCk7CiAgICAgIH07CiAgICB9CiAgICAvLyBMb29rIGZvciBzdGF0ZW1lbnRzIHVudGlsIGEgY2xvc2luZyBicmFjZSBpcyBmb3VuZC4KICAgIGZ1bmN0aW9uIGJsb2NrKHR5cGUpewogICAgICBpZiAodHlwZSA9PSAifSIpIGNvbnQoKTsKICAgICAgZWxzZSBwYXNzKHN0YXRlbWVudCwgYmxvY2spOwogICAgfQogICAgLy8gVmFyaWFibGUgZGVmaW5pdGlvbnMgYXJlIHNwbGl0IGludG8gdHdvIGFjdGlvbnMgLS0gMSBsb29rcyBmb3IKICAgIC8vIGEgbmFtZSBvciB0aGUgZW5kIG9mIHRoZSBkZWZpbml0aW9uLCAyIGxvb2tzIGZvciBhbiAnPScgc2lnbiBvcgogICAgLy8gYSBjb21tYS4KICAgIGZ1bmN0aW9uIHZhcmRlZjEodHlwZSwgdmFsdWUpewogICAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKXtyZWdpc3Rlcih2YWx1ZSk7IGNvbnQodmFyZGVmMik7fQogICAgICBlbHNlIGNvbnQoKTsKICAgIH0KICAgIGZ1bmN0aW9uIHZhcmRlZjIodHlwZSwgdmFsdWUpewogICAgICBpZiAodmFsdWUgPT0gIj0iKSBjb250KGV4cHJlc3Npb24sIHZhcmRlZjIpOwogICAgICBlbHNlIGlmICh0eXBlID09ICIsIikgY29udCh2YXJkZWYxKTsKICAgIH0KICAgIC8vIEZvciBsb29wcy4KICAgIGZ1bmN0aW9uIGZvcnNwZWMxKHR5cGUpewogICAgICBpZiAodHlwZSA9PSAidmFyIikgY29udCh2YXJkZWYxLCBmb3JzcGVjMik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIjsiKSBwYXNzKGZvcnNwZWMyKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAidmFyaWFibGUiKSBjb250KGZvcm1heWJlaW4pOwogICAgICBlbHNlIHBhc3MoZm9yc3BlYzIpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF5YmVpbih0eXBlLCB2YWx1ZSl7CiAgICAgIGlmICh2YWx1ZSA9PSAiaW4iKSBjb250KGV4cHJlc3Npb24pOwogICAgICBlbHNlIGNvbnQobWF5YmVvcGVyYXRvciwgZm9yc3BlYzIpOwogICAgfQogICAgZnVuY3Rpb24gZm9yc3BlYzIodHlwZSwgdmFsdWUpewogICAgICBpZiAodHlwZSA9PSAiOyIpIGNvbnQoZm9yc3BlYzMpOwogICAgICBlbHNlIGlmICh2YWx1ZSA9PSAiaW4iKSBjb250KGV4cHJlc3Npb24pOwogICAgICBlbHNlIGNvbnQoZXhwcmVzc2lvbiwgZXhwZWN0KCI7IiksIGZvcnNwZWMzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcnNwZWMzKHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT0gIikiKSBwYXNzKCk7CiAgICAgIGVsc2UgY29udChleHByZXNzaW9uKTsKICAgIH0KICAgIC8vIEEgZnVuY3Rpb24gZGVmaW5pdGlvbiBjcmVhdGVzIGEgbmV3IGNvbnRleHQsIGFuZCB0aGUgdmFyaWFibGVzCiAgICAvLyBpbiBpdHMgYXJndW1lbnQgbGlzdCBoYXZlIHRvIGJlIGFkZGVkIHRvIHRoaXMgY29udGV4dC4KICAgIGZ1bmN0aW9uIGZ1bmN0aW9uZGVmKHR5cGUsIHZhbHVlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIil7cmVnaXN0ZXIodmFsdWUpOyBjb250KGZ1bmN0aW9uZGVmKTt9CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIigiKSBjb250KHB1c2hjb250ZXh0LCBjb21tYXNlcChmdW5hcmcsICIpIiksIHN0YXRlbWVudCwgcG9wY29udGV4dCk7CiAgICB9CiAgICBmdW5jdGlvbiBmdW5hcmcodHlwZSwgdmFsdWUpewogICAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKXtyZWdpc3Rlcih2YWx1ZSk7IGNvbnQoKTt9CiAgICB9CiAgCiAgICByZXR1cm4gcGFyc2VyOwogIH0KCiAgcmV0dXJuIHsKICAgIG1ha2U6IHBhcnNlSlMsCiAgICBlbGVjdHJpY0NoYXJzOiAie306IiwKICAgIGNvbmZpZ3VyZTogZnVuY3Rpb24ob2JqKSB7CiAgICAgIGlmIChvYmouanNvbiAhPSBudWxsKSBqc29uID0gb2JqLmpzb247CiAgICB9CiAgfTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsesparql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIFNwYXJxbFBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gd29yZFJlZ2V4cCh3b3JkcykgewogICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgd29yZHMuam9pbigifCIpICsgIikkIiwgImkiKTsKICB9CiAgdmFyIG9wcyA9IHdvcmRSZWdleHAoWyJzdHIiLCAibGFuZyIsICJsYW5nbWF0Y2hlcyIsICJkYXRhdHlwZSIsICJib3VuZCIsICJzYW1ldGVybSIsICJpc2lyaSIsICJpc3VyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpc2JsYW5rIiwgImlzbGl0ZXJhbCIsICJ1bmlvbiIsICJhIl0pOwogIHZhciBrZXl3b3JkcyA9IHdvcmRSZWdleHAoWyJiYXNlIiwgInByZWZpeCIsICJzZWxlY3QiLCAiZGlzdGluY3QiLCAicmVkdWNlZCIsICJjb25zdHJ1Y3QiLCAiZGVzY3JpYmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhc2siLCAiZnJvbSIsICJuYW1lZCIsICJ3aGVyZSIsICJvcmRlciIsICJsaW1pdCIsICJvZmZzZXQiLCAiZmlsdGVyIiwgIm9wdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JhcGgiLCAiYnkiLCAiYXNjIiwgImRlc2MiLCBdKTsKICB2YXIgb3BlcmF0b3JDaGFycyA9IC9bKitcLTw+PSZ8XS87CgogIHZhciB0b2tlbml6ZVNwYXJxbCA9IChmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIG5vcm1hbChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PSAiJCIgfHwgY2ggPT0gIj8iKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1tcd1xkXS8pOwogICAgICAgIHJldHVybiAic3AtdmFyIjsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiPCIgJiYgIXNvdXJjZS5tYXRjaGVzKC9bXHNcdTAwYTA9XS8pKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1teXHNcdTAwYTA+XS8pOwogICAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCI+IikpIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgcmV0dXJuICJzcC11cmkiOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICJcIiIgfHwgY2ggPT0gIiciKSB7CiAgICAgICAgc2V0U3RhdGUoaW5MaXRlcmFsKGNoKSk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoL1t7fVwoXCksXC47XFtcXV0vLnRlc3QoY2gpKSB7CiAgICAgICAgcmV0dXJuICJzcC1wdW5jIjsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiIyIpIHsKICAgICAgICB3aGlsZSAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgc291cmNlLm5leHQoKTsKICAgICAgICByZXR1cm4gInNwLWNvbW1lbnQiOwogICAgICB9CiAgICAgIGVsc2UgaWYgKG9wZXJhdG9yQ2hhcnMudGVzdChjaCkpIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhvcGVyYXRvckNoYXJzKTsKICAgICAgICByZXR1cm4gInNwLW9wZXJhdG9yIjsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiOiIpIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW1x3XGRcLl9cLV0vKTsKICAgICAgICByZXR1cm4gInNwLXByZWZpeGVkIjsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW19cd1xkXS8pOwogICAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCI6IikpIHsKICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW1x3XGRfXC1dLyk7CiAgICAgICAgICByZXR1cm4gInNwLXByZWZpeGVkIjsKICAgICAgICB9CiAgICAgICAgdmFyIHdvcmQgPSBzb3VyY2UuZ2V0KCksIHR5cGU7CiAgICAgICAgaWYgKG9wcy50ZXN0KHdvcmQpKQogICAgICAgICAgdHlwZSA9ICJzcC1vcGVyYXRvciI7CiAgICAgICAgZWxzZSBpZiAoa2V5d29yZHMudGVzdCh3b3JkKSkKICAgICAgICAgIHR5cGUgPSAic3Ata2V5d29yZCI7CiAgICAgICAgZWxzZQogICAgICAgICAgdHlwZSA9ICJzcC13b3JkIjsKICAgICAgICByZXR1cm4ge3N0eWxlOiB0eXBlLCBjb250ZW50OiB3b3JkfTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGluTGl0ZXJhbChxdW90ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKICAgICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpIHsKICAgICAgICAgICAgc2V0U3RhdGUobm9ybWFsKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJzcC1saXRlcmFsIjsKICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzdGFydFN0YXRlKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZXIoc291cmNlLCBzdGFydFN0YXRlIHx8IG5vcm1hbCk7CiAgICB9OwogIH0pKCk7CgogIGZ1bmN0aW9uIGluZGVudFNwYXJxbChjb250ZXh0KSB7CiAgICByZXR1cm4gZnVuY3Rpb24obmV4dENoYXJzKSB7CiAgICAgIHZhciBmaXJzdENoYXIgPSBuZXh0Q2hhcnMgJiYgbmV4dENoYXJzLmNoYXJBdCgwKTsKICAgICAgaWYgKC9bXF1cfV0vLnRlc3QoZmlyc3RDaGFyKSkKICAgICAgICB3aGlsZSAoY29udGV4dCAmJiBjb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iKSBjb250ZXh0ID0gY29udGV4dC5wcmV2OwoKICAgICAgdmFyIGNsb3NpbmcgPSBjb250ZXh0ICYmIGZpcnN0Q2hhciA9PSBtYXRjaGluZ1tjb250ZXh0LnR5cGVdOwogICAgICBpZiAoIWNvbnRleHQpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGVsc2UgaWYgKGNvbnRleHQudHlwZSA9PSAicGF0dGVybiIpCiAgICAgICAgcmV0dXJuIGNvbnRleHQuY29sOwogICAgICBlbHNlIGlmIChjb250ZXh0LmFsaWduKQogICAgICAgIHJldHVybiBjb250ZXh0LmNvbCAtIChjbG9zaW5nID8gY29udGV4dC53aWR0aCA6IDApOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIGNvbnRleHQuaW5kZW50ICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXJzZVNwYXJxbChzb3VyY2UpIHsKICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZVNwYXJxbChzb3VyY2UpOwogICAgdmFyIGNvbnRleHQgPSBudWxsLCBpbmRlbnQgPSAwLCBjb2wgPSAwOwogICAgZnVuY3Rpb24gcHVzaENvbnRleHQodHlwZSwgd2lkdGgpIHsKICAgICAgY29udGV4dCA9IHtwcmV2OiBjb250ZXh0LCBpbmRlbnQ6IGluZGVudCwgY29sOiBjb2wsIHR5cGU6IHR5cGUsIHdpZHRoOiB3aWR0aH07CiAgICB9CiAgICBmdW5jdGlvbiBwb3BDb250ZXh0KCkgewogICAgICBjb250ZXh0ID0gY29udGV4dC5wcmV2OwogICAgfQoKICAgIHZhciBpdGVyID0gewogICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnMubmV4dCgpLCB0eXBlID0gdG9rZW4uc3R5bGUsIGNvbnRlbnQgPSB0b2tlbi5jb250ZW50LCB3aWR0aCA9IHRva2VuLnZhbHVlLmxlbmd0aDsKCiAgICAgICAgaWYgKGNvbnRlbnQgPT0gIlxuIikgewogICAgICAgICAgdG9rZW4uaW5kZW50YXRpb24gPSBpbmRlbnRTcGFycWwoY29udGV4dCk7CiAgICAgICAgICBpbmRlbnQgPSBjb2wgPSAwOwogICAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5hbGlnbiA9PSBudWxsKSBjb250ZXh0LmFsaWduID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIndoaXRlc3BhY2UiICYmIGNvbCA9PSAwKSB7CiAgICAgICAgICBpbmRlbnQgPSB3aWR0aDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZSAhPSAic3AtY29tbWVudCIgJiYgY29udGV4dCAmJiBjb250ZXh0LmFsaWduID09IG51bGwpIHsKICAgICAgICAgIGNvbnRleHQuYWxpZ24gPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbnRlbnQgIT0gIlxuIikgY29sICs9IHdpZHRoOwoKICAgICAgICBpZiAoL1tcW1x7XChdLy50ZXN0KGNvbnRlbnQpKSB7CiAgICAgICAgICBwdXNoQ29udGV4dChjb250ZW50LCB3aWR0aCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKC9bXF1cfVwpXS8udGVzdChjb250ZW50KSkgewogICAgICAgICAgd2hpbGUgKGNvbnRleHQgJiYgY29udGV4dC50eXBlID09ICJwYXR0ZXJuIikKICAgICAgICAgICAgcG9wQ29udGV4dCgpOwogICAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGVudCA9PSBtYXRjaGluZ1tjb250ZXh0LnR5cGVdKQogICAgICAgICAgICBwb3BDb250ZXh0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNvbnRlbnQgPT0gIi4iICYmIGNvbnRleHQgJiYgY29udGV4dC50eXBlID09ICJwYXR0ZXJuIikgewogICAgICAgICAgcG9wQ29udGV4dCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgodHlwZSA9PSAic3Atd29yZCIgfHwgdHlwZSA9PSAic3AtcHJlZml4ZWQiIHx8IHR5cGUgPT0gInNwLXVyaSIgfHwgdHlwZSA9PSAic3AtdmFyIiB8fCB0eXBlID09ICJzcC1saXRlcmFsIikgJiYKICAgICAgICAgICAgICAgICBjb250ZXh0ICYmIC9bXHtcW10vLnRlc3QoY29udGV4dC50eXBlKSkgewogICAgICAgICAgcHVzaENvbnRleHQoInBhdHRlcm4iLCB3aWR0aCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH0sCgogICAgICBjb3B5OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2NvbnRleHQgPSBjb250ZXh0LCBfaW5kZW50ID0gaW5kZW50LCBfY29sID0gY29sLCBfdG9rZW5TdGF0ZSA9IHRva2Vucy5zdGF0ZTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgICB0b2tlbnMgPSB0b2tlbml6ZVNwYXJxbChzb3VyY2UsIF90b2tlblN0YXRlKTsKICAgICAgICAgIGNvbnRleHQgPSBfY29udGV4dDsKICAgICAgICAgIGluZGVudCA9IF9pbmRlbnQ7CiAgICAgICAgICBjb2wgPSBfY29sOwogICAgICAgICAgcmV0dXJuIGl0ZXI7CiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIHJldHVybiBpdGVyOwogIH0KCiAgcmV0dXJuIHttYWtlOiBwYXJzZVNwYXJxbCwgZWxlY3RyaWNDaGFyczogIn1dIn07Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsexml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogVGhpcyBmaWxlIGRlZmluZXMgYW4gWE1MIHBhcnNlciwgd2l0aCBhIGZldyBrbHVkZ2VzIHRvIG1ha2UgaXQKICogdXNlYWJsZSBmb3IgSFRNTC4gYXV0b1NlbGZDbG9zZXJzIGRlZmluZXMgYSBzZXQgb2YgdGFnIG5hbWVzIHRoYXQKICogYXJlIGV4cGVjdGVkIHRvIG5vdCBoYXZlIGEgY2xvc2luZyB0YWcsIGFuZCBkb05vdEluZGVudCBzcGVjaWZpZXMKICogdGhlIHRhZ3MgaW5zaWRlIG9mIHdoaWNoIG5vIGluZGVudGF0aW9uIHNob3VsZCBoYXBwZW4gKHNlZSBDb25maWcKICogb2JqZWN0KS4gVGhlc2UgY2FuIGJlIGRpc2FibGVkIGJ5IHBhc3NpbmcgdGhlIGVkaXRvciBhbiBvYmplY3QgbGlrZQogKiB7dXNlSFRNTEtsdWRnZXM6IGZhbHNlfSBhcyBwYXJzZXJDb25maWcgb3B0aW9uLgogKi8KCnZhciBYTUxQYXJzZXIgPSBFZGl0b3IuUGFyc2VyID0gKGZ1bmN0aW9uKCkgewogIHZhciBLbHVkZ2VzID0gewogICAgYXV0b1NlbGZDbG9zZXJzOiB7ImJyIjogdHJ1ZSwgImltZyI6IHRydWUsICJociI6IHRydWUsICJsaW5rIjogdHJ1ZSwgImlucHV0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICJtZXRhIjogdHJ1ZSwgImNvbCI6IHRydWUsICJmcmFtZSI6IHRydWUsICJiYXNlIjogdHJ1ZSwgImFyZWEiOiB0cnVlfSwKICAgIGRvTm90SW5kZW50OiB7InByZSI6IHRydWUsICIhY2RhdGEiOiB0cnVlfQogIH07CiAgdmFyIE5vS2x1ZGdlcyA9IHthdXRvU2VsZkNsb3NlcnM6IHt9LCBkb05vdEluZGVudDogeyIhY2RhdGEiOiB0cnVlfX07CiAgdmFyIFVzZUtsdWRnZXMgPSBLbHVkZ2VzOwogIHZhciBhbGlnbkNEQVRBID0gZmFsc2U7CgogIC8vIFNpbXBsZSBzdGF0ZWZ1bCB0b2tlbml6ZXIgZm9yIFhNTCBkb2N1bWVudHMuIFJldHVybnMgYQogIC8vIE1vY2hpS2l0LXN0eWxlIGl0ZXJhdG9yLCB3aXRoIGEgc3RhdGUgcHJvcGVydHkgdGhhdCBjb250YWlucyBhCiAgLy8gZnVuY3Rpb24gZW5jYXBzdWxhdGluZyB0aGUgY3VycmVudCBzdGF0ZS4gU2VlIHRva2VuaXplLmpzLgogIHZhciB0b2tlbml6ZVhNTCA9IChmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIGluVGV4dChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PSAiPCIpIHsKICAgICAgICBpZiAoc291cmNlLmVxdWFscygiISIpKSB7CiAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoIlsiKSkgewogICAgICAgICAgICBpZiAoc291cmNlLmxvb2tBaGVhZCgiW0NEQVRBWyIsIHRydWUpKSB7CiAgICAgICAgICAgICAgc2V0U3RhdGUoaW5CbG9jaygieG1sLWNkYXRhIiwgIl1dPiIpKTsKICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4gInhtbC10ZXh0IjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZiAoc291cmNlLmxvb2tBaGVhZCgiLS0iLCB0cnVlKSkgewogICAgICAgICAgICBzZXRTdGF0ZShpbkJsb2NrKCJ4bWwtY29tbWVudCIsICItLT4iKSk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAieG1sLXRleHQiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzb3VyY2UuZXF1YWxzKCI/IikpIHsKICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW1x3XC5fXC1dLyk7CiAgICAgICAgICBzZXRTdGF0ZShpbkJsb2NrKCJ4bWwtcHJvY2Vzc2luZyIsICI/PiIpKTsKICAgICAgICAgIHJldHVybiAieG1sLXByb2Nlc3NpbmciOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCIvIikpIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBzZXRTdGF0ZShpblRhZyk7CiAgICAgICAgICByZXR1cm4gInhtbC1wdW5jdHVhdGlvbiI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICImIikgewogICAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgICBpZiAoc291cmNlLm5leHQoKSA9PSAiOyIpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gInhtbC1lbnRpdHkiOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXiY8XG5dLyk7CiAgICAgICAgcmV0dXJuICJ4bWwtdGV4dCI7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpblRhZyhzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PSAiPiIpIHsKICAgICAgICBzZXRTdGF0ZShpblRleHQpOwogICAgICAgIHJldHVybiAieG1sLXB1bmN0dWF0aW9uIjsKICAgICAgfQogICAgICBlbHNlIGlmICgvWz9cL10vLnRlc3QoY2gpICYmIHNvdXJjZS5lcXVhbHMoIj4iKSkgewogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgc2V0U3RhdGUoaW5UZXh0KTsKICAgICAgICByZXR1cm4gInhtbC1wdW5jdHVhdGlvbiI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIj0iKSB7CiAgICAgICAgcmV0dXJuICJ4bWwtcHVuY3R1YXRpb24iOwogICAgICB9CiAgICAgIGVsc2UgaWYgKC9bXCdcIl0vLnRlc3QoY2gpKSB7CiAgICAgICAgc2V0U3RhdGUoaW5BdHRyaWJ1dGUoY2gpKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW15cc1x1MDBhMD08PlwiXCdcLz9dLyk7CiAgICAgICAgcmV0dXJuICJ4bWwtbmFtZSI7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbkF0dHJpYnV0ZShxdW90ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgICBpZiAoc291cmNlLm5leHQoKSA9PSBxdW90ZSkgewogICAgICAgICAgICBzZXRTdGF0ZShpblRhZyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gInhtbC1hdHRyaWJ1dGUiOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGluQmxvY2soc3R5bGUsIHRlcm1pbmF0b3IpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgICB3aGlsZSAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgewogICAgICAgICAgaWYgKHNvdXJjZS5sb29rQWhlYWQodGVybWluYXRvciwgdHJ1ZSkpIHsKICAgICAgICAgICAgc2V0U3RhdGUoaW5UZXh0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc3RhcnRTdGF0ZSkgewogICAgICByZXR1cm4gdG9rZW5pemVyKHNvdXJjZSwgc3RhcnRTdGF0ZSB8fCBpblRleHQpOwogICAgfTsKICB9KSgpOwoKICAvLyBUaGUgcGFyc2VyLiBUaGUgc3RydWN0dXJlIG9mIHRoaXMgZnVuY3Rpb24gbGFyZ2VseSBmb2xsb3dzIHRoYXQgb2YKICAvLyBwYXJzZUphdmFTY3JpcHQgaW4gcGFyc2VqYXZhc2NyaXB0LmpzICh0aGVyZSBpcyBhY3R1YWxseSBhIGJpdCBtb3JlCiAgLy8gc2hhcmVkIGNvZGUgdGhhbiBJJ2QgbGlrZSksIGJ1dCBpdCBpcyBxdWl0ZSBhIGJpdCBzaW1wbGVyLgogIGZ1bmN0aW9uIHBhcnNlWE1MKHNvdXJjZSkgewogICAgdmFyIHRva2VucyA9IHRva2VuaXplWE1MKHNvdXJjZSk7CiAgICB2YXIgY2MgPSBbYmFzZV07CiAgICB2YXIgdG9rZW5OciA9IDAsIGluZGVudGVkID0gMDsKICAgIHZhciBjdXJyZW50VGFnID0gbnVsbCwgY29udGV4dCA9IG51bGw7CiAgICB2YXIgY29uc3VtZSwgbWFya2VkOwogICAgCiAgICBmdW5jdGlvbiBwdXNoKGZzKSB7CiAgICAgIGZvciAodmFyIGkgPSBmcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKICAgICAgICBjYy5wdXNoKGZzW2ldKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnQoKSB7CiAgICAgIHB1c2goYXJndW1lbnRzKTsKICAgICAgY29uc3VtZSA9IHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBwYXNzKCkgewogICAgICBwdXNoKGFyZ3VtZW50cyk7CiAgICAgIGNvbnN1bWUgPSBmYWxzZTsKICAgIH0KCiAgICBmdW5jdGlvbiBtYXJrKHN0eWxlKSB7CiAgICAgIG1hcmtlZCA9IHN0eWxlOwogICAgfQogICAgZnVuY3Rpb24gZXhwZWN0KHRleHQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0eWxlLCBjb250ZW50KSB7CiAgICAgICAgaWYgKGNvbnRlbnQgPT0gdGV4dCkgY29udCgpOwogICAgICAgIGVsc2UgbWFyaygieG1sLWVycm9yIikgfHwgY29udChhcmd1bWVudHMuY2FsbGVlKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBwdXNoQ29udGV4dCh0YWduYW1lLCBzdGFydE9mTGluZSkgewogICAgICB2YXIgbm9JbmRlbnQgPSBVc2VLbHVkZ2VzLmRvTm90SW5kZW50Lmhhc093blByb3BlcnR5KHRhZ25hbWUpIHx8IChjb250ZXh0ICYmIGNvbnRleHQubm9JbmRlbnQpOwogICAgICBjb250ZXh0ID0ge3ByZXY6IGNvbnRleHQsIG5hbWU6IHRhZ25hbWUsIGluZGVudDogaW5kZW50ZWQsIHN0YXJ0T2ZMaW5lOiBzdGFydE9mTGluZSwgbm9JbmRlbnQ6IG5vSW5kZW50fTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvcENvbnRleHQoKSB7CiAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICB9CiAgICBmdW5jdGlvbiBjb21wdXRlSW5kZW50YXRpb24oYmFzZUNvbnRleHQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKG5leHRDaGFycywgY3VycmVudCkgewogICAgICAgIHZhciBjb250ZXh0ID0gYmFzZUNvbnRleHQ7CiAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5ub0luZGVudCkKICAgICAgICAgIHJldHVybiBjdXJyZW50OwogICAgICAgIGlmIChhbGlnbkNEQVRBICYmIC88IVxbQ0RBVEFcWy8udGVzdChuZXh0Q2hhcnMpKQogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKGNvbnRleHQgJiYgL148XC8vLnRlc3QobmV4dENoYXJzKSkKICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICAgICAgd2hpbGUgKGNvbnRleHQgJiYgIWNvbnRleHQuc3RhcnRPZkxpbmUpCiAgICAgICAgICBjb250ZXh0ID0gY29udGV4dC5wcmV2OwogICAgICAgIGlmIChjb250ZXh0KQogICAgICAgICAgcmV0dXJuIGNvbnRleHQuaW5kZW50ICsgaW5kZW50VW5pdDsKICAgICAgICBlbHNlCiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBiYXNlKCkgewogICAgICByZXR1cm4gcGFzcyhlbGVtZW50LCBiYXNlKTsKICAgIH0KICAgIHZhciBoYXJtbGVzc1Rva2VucyA9IHsieG1sLXRleHQiOiB0cnVlLCAieG1sLWVudGl0eSI6IHRydWUsICJ4bWwtY29tbWVudCI6IHRydWUsICJ4bWwtcHJvY2Vzc2luZyI6IHRydWV9OwogICAgZnVuY3Rpb24gZWxlbWVudChzdHlsZSwgY29udGVudCkgewogICAgICBpZiAoY29udGVudCA9PSAiPCIpIGNvbnQodGFnbmFtZSwgYXR0cmlidXRlcywgZW5kdGFnKHRva2VuTnIgPT0gMSkpOwogICAgICBlbHNlIGlmIChjb250ZW50ID09ICI8LyIpIGNvbnQoY2xvc2V0YWduYW1lLCBleHBlY3QoIj4iKSk7CiAgICAgIGVsc2UgaWYgKHN0eWxlID09ICJ4bWwtY2RhdGEiKSB7CiAgICAgICAgaWYgKCFjb250ZXh0IHx8IGNvbnRleHQubmFtZSAhPSAiIWNkYXRhIikgcHVzaENvbnRleHQoIiFjZGF0YSIpOwogICAgICAgIGlmICgvXF1cXT4kLy50ZXN0KGNvbnRlbnQpKSBwb3BDb250ZXh0KCk7CiAgICAgICAgY29udCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGhhcm1sZXNzVG9rZW5zLmhhc093blByb3BlcnR5KHN0eWxlKSkgY29udCgpOwogICAgICBlbHNlIG1hcmsoInhtbC1lcnJvciIpIHx8IGNvbnQoKTsKICAgIH0KICAgIGZ1bmN0aW9uIHRhZ25hbWUoc3R5bGUsIGNvbnRlbnQpIHsKICAgICAgaWYgKHN0eWxlID09ICJ4bWwtbmFtZSIpIHsKICAgICAgICBjdXJyZW50VGFnID0gY29udGVudC50b0xvd2VyQ2FzZSgpOwogICAgICAgIG1hcmsoInhtbC10YWduYW1lIik7CiAgICAgICAgY29udCgpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGN1cnJlbnRUYWcgPSBudWxsOwogICAgICAgIHBhc3MoKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gY2xvc2V0YWduYW1lKHN0eWxlLCBjb250ZW50KSB7CiAgICAgIGlmIChzdHlsZSA9PSAieG1sLW5hbWUiICYmIGNvbnRleHQgJiYgY29udGVudC50b0xvd2VyQ2FzZSgpID09IGNvbnRleHQubmFtZSkgewogICAgICAgIHBvcENvbnRleHQoKTsKICAgICAgICBtYXJrKCJ4bWwtdGFnbmFtZSIpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIG1hcmsoInhtbC1lcnJvciIpOwogICAgICB9CiAgICAgIGNvbnQoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGVuZHRhZyhzdGFydE9mTGluZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc3R5bGUsIGNvbnRlbnQpIHsKICAgICAgICBpZiAoY29udGVudCA9PSAiLz4iIHx8IChjb250ZW50ID09ICI+IiAmJiBVc2VLbHVkZ2VzLmF1dG9TZWxmQ2xvc2Vycy5oYXNPd25Qcm9wZXJ0eShjdXJyZW50VGFnKSkpIGNvbnQoKTsKICAgICAgICBlbHNlIGlmIChjb250ZW50ID09ICI+IikgcHVzaENvbnRleHQoY3VycmVudFRhZywgc3RhcnRPZkxpbmUpIHx8IGNvbnQoKTsKICAgICAgICBlbHNlIG1hcmsoInhtbC1lcnJvciIpIHx8IGNvbnQoYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBhdHRyaWJ1dGVzKHN0eWxlKSB7CiAgICAgIGlmIChzdHlsZSA9PSAieG1sLW5hbWUiKSBtYXJrKCJ4bWwtYXR0bmFtZSIpIHx8IGNvbnQoYXR0cmlidXRlLCBhdHRyaWJ1dGVzKTsKICAgICAgZWxzZSBwYXNzKCk7CiAgICB9CiAgICBmdW5jdGlvbiBhdHRyaWJ1dGUoc3R5bGUsIGNvbnRlbnQpIHsKICAgICAgaWYgKGNvbnRlbnQgPT0gIj0iKSBjb250KHZhbHVlKTsKICAgICAgZWxzZSBpZiAoY29udGVudCA9PSAiPiIgfHwgY29udGVudCA9PSAiLz4iKSBwYXNzKGVuZHRhZyk7CiAgICAgIGVsc2UgcGFzcygpOwogICAgfQogICAgZnVuY3Rpb24gdmFsdWUoc3R5bGUpIHsKICAgICAgaWYgKHN0eWxlID09ICJ4bWwtYXR0cmlidXRlIikgY29udCh2YWx1ZSk7CiAgICAgIGVsc2UgcGFzcygpOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgIGluZGVudGF0aW9uOiBmdW5jdGlvbigpIHtyZXR1cm4gaW5kZW50ZWQ7fSwKCiAgICAgIG5leHQ6IGZ1bmN0aW9uKCl7CiAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zLm5leHQoKTsKICAgICAgICBpZiAodG9rZW4uc3R5bGUgPT0gIndoaXRlc3BhY2UiICYmIHRva2VuTnIgPT0gMCkKICAgICAgICAgIGluZGVudGVkID0gdG9rZW4udmFsdWUubGVuZ3RoOwogICAgICAgIGVsc2UKICAgICAgICAgIHRva2VuTnIrKzsKICAgICAgICBpZiAodG9rZW4uY29udGVudCA9PSAiXG4iKSB7CiAgICAgICAgICBpbmRlbnRlZCA9IHRva2VuTnIgPSAwOwogICAgICAgICAgdG9rZW4uaW5kZW50YXRpb24gPSBjb21wdXRlSW5kZW50YXRpb24oY29udGV4dCk7CiAgICAgICAgfQoKICAgICAgICBpZiAodG9rZW4uc3R5bGUgPT0gIndoaXRlc3BhY2UiIHx8IHRva2VuLnR5cGUgPT0gInhtbC1jb21tZW50IikKICAgICAgICAgIHJldHVybiB0b2tlbjsKCiAgICAgICAgd2hpbGUodHJ1ZSl7CiAgICAgICAgICBjb25zdW1lID0gbWFya2VkID0gZmFsc2U7CiAgICAgICAgICBjYy5wb3AoKSh0b2tlbi5zdHlsZSwgdG9rZW4uY29udGVudCk7CiAgICAgICAgICBpZiAoY29uc3VtZSl7CiAgICAgICAgICAgIGlmIChtYXJrZWQpCiAgICAgICAgICAgICAgdG9rZW4uc3R5bGUgPSBtYXJrZWQ7CiAgICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCgogICAgICBjb3B5OiBmdW5jdGlvbigpewogICAgICAgIHZhciBfY2MgPSBjYy5jb25jYXQoW10pLCBfdG9rZW5TdGF0ZSA9IHRva2Vucy5zdGF0ZSwgX2NvbnRleHQgPSBjb250ZXh0OwogICAgICAgIHZhciBwYXJzZXIgPSB0aGlzOwogICAgICAgIAogICAgICAgIHJldHVybiBmdW5jdGlvbihpbnB1dCl7CiAgICAgICAgICBjYyA9IF9jYy5jb25jYXQoW10pOwogICAgICAgICAgdG9rZW5OciA9IGluZGVudGVkID0gMDsKICAgICAgICAgIGNvbnRleHQgPSBfY29udGV4dDsKICAgICAgICAgIHRva2VucyA9IHRva2VuaXplWE1MKGlucHV0LCBfdG9rZW5TdGF0ZSk7CiAgICAgICAgICByZXR1cm4gcGFyc2VyOwogICAgICAgIH07CiAgICAgIH0KICAgIH07CiAgfQoKICByZXR1cm4gewogICAgbWFrZTogcGFyc2VYTUwsCiAgICBlbGVjdHJpY0NoYXJzOiAiLyIsCiAgICBjb25maWd1cmU6IGZ1bmN0aW9uKGNvbmZpZykgewogICAgICBpZiAoY29uZmlnLnVzZUhUTUxLbHVkZ2VzICE9IG51bGwpCiAgICAgICAgVXNlS2x1ZGdlcyA9IGNvbmZpZy51c2VIVE1MS2x1ZGdlcyA/IEtsdWRnZXMgOiBOb0tsdWRnZXM7CiAgICAgIGlmIChjb25maWcuYWxpZ25DREFUQSkKICAgICAgICBhbGlnbkNEQVRBID0gY29uZmlnLmFsaWduQ0RBVEE7CiAgICB9CiAgfTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/select.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogRnVuY3Rpb25hbGl0eSBmb3IgZmluZGluZywgc3RvcmluZywgYW5kIHJlc3RvcmluZyBzZWxlY3Rpb25zCiAqCiAqIFRoaXMgZG9lcyBub3QgcHJvdmlkZSBhIGdlbmVyaWMgQVBJLCBqdXN0IHRoZSBtaW5pbWFsIGZ1bmN0aW9uYWxpdHkKICogcmVxdWlyZWQgYnkgdGhlIENvZGVNaXJyb3Igc3lzdGVtLgogKi8KCi8vIE5hbWVzcGFjZSBvYmplY3QuCnZhciBzZWxlY3QgPSB7fTsKCihmdW5jdGlvbigpIHsKICBzZWxlY3QuaWVfc2VsZWN0aW9uID0gZG9jdW1lbnQuc2VsZWN0aW9uICYmIGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZUNvbGxlY3Rpb247CgogIC8vIEZpbmQgdGhlICd0b3AtbGV2ZWwnIChkZWZpbmVkIGFzICdhIGRpcmVjdCBjaGlsZCBvZiB0aGUgbm9kZQogIC8vIHBhc3NlZCBhcyB0aGUgdG9wIGFyZ3VtZW50Jykgbm9kZSB0aGF0IHRoZSBnaXZlbiBub2RlIGlzCiAgLy8gY29udGFpbmVkIGluLiBSZXR1cm4gbnVsbCBpZiB0aGUgZ2l2ZW4gbm9kZSBpcyBub3QgaW5zaWRlIHRoZSB0b3AKICAvLyBub2RlLgogIGZ1bmN0aW9uIHRvcExldmVsTm9kZUF0KG5vZGUsIHRvcCkgewogICAgd2hpbGUgKG5vZGUgJiYgbm9kZS5wYXJlbnROb2RlICE9IHRvcCkKICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgLy8gRmluZCB0aGUgdG9wLWxldmVsIG5vZGUgdGhhdCBjb250YWlucyB0aGUgbm9kZSBiZWZvcmUgdGhpcyBvbmUuCiAgZnVuY3Rpb24gdG9wTGV2ZWxOb2RlQmVmb3JlKG5vZGUsIHRvcCkgewogICAgd2hpbGUgKCFub2RlLnByZXZpb3VzU2libGluZyAmJiBub2RlLnBhcmVudE5vZGUgIT0gdG9wKQogICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlOwogICAgcmV0dXJuIHRvcExldmVsTm9kZUF0KG5vZGUucHJldmlvdXNTaWJsaW5nLCB0b3ApOwogIH0KCiAgdmFyIGZvdXJTcGFjZXMgPSAiXHUwMGEwXHUwMGEwXHUwMGEwXHUwMGEwIjsKCiAgc2VsZWN0LnNjcm9sbFRvTm9kZSA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIGlmICghZWxlbWVudCkgcmV0dXJuOwogICAgdmFyIGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudCwgYm9keSA9IGRvYy5ib2R5LAogICAgICAgIHdpbiA9IChkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdyksCiAgICAgICAgaHRtbCA9IGRvYy5kb2N1bWVudEVsZW1lbnQsCiAgICAgICAgYXRFbmQgPSAhZWxlbWVudC5uZXh0U2libGluZyB8fCAhZWxlbWVudC5uZXh0U2libGluZy5uZXh0U2libGluZwogICAgICAgICAgICAgICAgfHwgIWVsZW1lbnQubmV4dFNpYmxpbmcubmV4dFNpYmxpbmcubmV4dFNpYmxpbmc7CiAgICAvLyBJbiBPcGVyYSAoYW5kIHJlY2VudCBXZWJraXQgdmVyc2lvbnMpLCBCUiBlbGVtZW50cyAqYWx3YXlzKgogICAgLy8gaGF2ZSBhIG9mZnNldFRvcCBwcm9wZXJ0eSBvZiB6ZXJvLgogICAgdmFyIGNvbXBlbnNhdGVIYWNrID0gMDsKICAgIHdoaWxlIChlbGVtZW50ICYmICFlbGVtZW50Lm9mZnNldFRvcCkgewogICAgICBjb21wZW5zYXRlSGFjaysrOwogICAgICBlbGVtZW50ID0gZWxlbWVudC5wcmV2aW91c1NpYmxpbmc7CiAgICB9CiAgICAvLyBhdEVuZCBpcyBhbm90aGVyIGtsdWRnZSBmb3IgdGhlc2UgYnJvd3NlcnMgLS0gaWYgdGhlIGN1cnNvciBpcwogICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsIGFuZCB0aGUgbm9kZSBkb2Vzbid0IGhhdmUgYW4KICAgIC8vIG9mZnNldCwganVzdCBzY3JvbGwgdG8gdGhlIGVuZC4KICAgIGlmIChjb21wZW5zYXRlSGFjayA9PSAwKSBhdEVuZCA9IGZhbHNlOwoKICAgIHZhciB5ID0gY29tcGVuc2F0ZUhhY2sgKiAoZWxlbWVudCA/IGVsZW1lbnQub2Zmc2V0SGVpZ2h0IDogMCksIHggPSAwLCBwb3MgPSBlbGVtZW50OwogICAgd2hpbGUgKHBvcyAmJiBwb3Mub2Zmc2V0UGFyZW50KSB7CiAgICAgIHkgKz0gcG9zLm9mZnNldFRvcDsKICAgICAgLy8gRG9uJ3QgY291bnQgWCBvZmZzZXQgZm9yIDxicj4gbm9kZXMKICAgICAgaWYgKCFpc0JSKHBvcykpCiAgICAgICAgeCArPSBwb3Mub2Zmc2V0TGVmdDsKICAgICAgcG9zID0gcG9zLm9mZnNldFBhcmVudDsKICAgIH0KCiAgICB2YXIgc2Nyb2xsX3ggPSBib2R5LnNjcm9sbExlZnQgfHwgaHRtbC5zY3JvbGxMZWZ0IHx8IDAsCiAgICAgICAgc2Nyb2xsX3kgPSBib2R5LnNjcm9sbFRvcCB8fCBodG1sLnNjcm9sbFRvcCB8fCAwLAogICAgICAgIHNjcmVlbl94ID0geCAtIHNjcm9sbF94LCBzY3JlZW5feSA9IHkgLSBzY3JvbGxfeSwgc2Nyb2xsID0gZmFsc2U7CgogICAgaWYgKHNjcmVlbl94IDwgMCB8fCBzY3JlZW5feCA+ICh3aW4uaW5uZXJXaWR0aCB8fCBodG1sLmNsaWVudFdpZHRoIHx8IDApKSB7CiAgICAgIHNjcm9sbF94ID0geDsKICAgICAgc2Nyb2xsID0gdHJ1ZTsKICAgIH0KICAgIGlmIChzY3JlZW5feSA8IDAgfHwgYXRFbmQgfHwgc2NyZWVuX3kgPiAod2luLmlubmVySGVpZ2h0IHx8IGh0bWwuY2xpZW50SGVpZ2h0IHx8IDApIC0gNTApIHsKICAgICAgc2Nyb2xsX3kgPSBhdEVuZCA/IDFlNiA6IHk7CiAgICAgIHNjcm9sbCA9IHRydWU7CiAgICB9CiAgICBpZiAoc2Nyb2xsKSB3aW4uc2Nyb2xsVG8oc2Nyb2xsX3gsIHNjcm9sbF95KTsKICB9OwoKICBzZWxlY3Quc2Nyb2xsVG9DdXJzb3IgPSBmdW5jdGlvbihjb250YWluZXIpIHsKICAgIHNlbGVjdC5zY3JvbGxUb05vZGUoc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUoY29udGFpbmVyLCB0cnVlKSB8fCBjb250YWluZXIuZmlyc3RDaGlsZCk7CiAgfTsKCiAgLy8gVXNlZCB0byBwcmV2ZW50IHJlc3RvcmluZyBhIHNlbGVjdGlvbiB3aGVuIHdlIGRvIG5vdCBuZWVkIHRvLgogIHZhciBjdXJyZW50U2VsZWN0aW9uID0gbnVsbDsKCiAgc2VsZWN0LnNuYXBzaG90Q2hhbmdlZCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGN1cnJlbnRTZWxlY3Rpb24pIGN1cnJlbnRTZWxlY3Rpb24uY2hhbmdlZCA9IHRydWU7CiAgfTsKCiAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGNvZGUgaW4gZWRpdG9yLmpzIHdoZW5ldmVyIGl0IGlzIHJlcGxhY2luZwogIC8vIGEgdGV4dCBub2RlLiBUaGUgZnVuY3Rpb24gc2VlcyB3aGV0aGVyIHRoZSBnaXZlbiBvbGROb2RlIGlzIHBhcnQKICAvLyBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24sIGFuZCB1cGRhdGVzIHRoaXMgc2VsZWN0aW9uIGlmIGl0IGlzLgogIC8vIEJlY2F1c2Ugbm9kZXMgYXJlIG9mdGVuIG9ubHkgcGFydGlhbGx5IHJlcGxhY2VkLCB0aGUgbGVuZ3RoIG9mCiAgLy8gdGhlIHBhcnQgdGhhdCBnZXRzIHJlcGxhY2VkIGhhcyB0byBiZSB0YWtlbiBpbnRvIGFjY291bnQgLS0gdGhlCiAgLy8gc2VsZWN0aW9uIG1pZ2h0IHN0YXkgaW4gdGhlIG9sZE5vZGUgaWYgdGhlIG5ld05vZGUgaXMgc21hbGxlcgogIC8vIHRoYW4gdGhlIHNlbGVjdGlvbidzIG9mZnNldC4gVGhlIG9mZnNldCBhcmd1bWVudCBpcyBuZWVkZWQgaW4KICAvLyBjYXNlIHRoZSBzZWxlY3Rpb24gZG9lcyBtb3ZlIHRvIHRoZSBuZXcgb2JqZWN0LCBhbmQgdGhlIGdpdmVuCiAgLy8gbGVuZ3RoIGlzIG5vdCB0aGUgd2hvbGUgbGVuZ3RoIG9mIHRoZSBuZXcgbm9kZSAocGFydCBvZiBpdCBtaWdodAogIC8vIGhhdmUgYmVlbiB1c2VkIHRvIHJlcGxhY2UgYW5vdGhlciBub2RlKS4KICBzZWxlY3Quc25hcHNob3RSZXBsYWNlTm9kZSA9IGZ1bmN0aW9uKGZyb20sIHRvLCBsZW5ndGgsIG9mZnNldCkgewogICAgaWYgKCFjdXJyZW50U2VsZWN0aW9uKSByZXR1cm47CgogICAgZnVuY3Rpb24gcmVwbGFjZShwb2ludCkgewogICAgICBpZiAoZnJvbSA9PSBwb2ludC5ub2RlKSB7CiAgICAgICAgY3VycmVudFNlbGVjdGlvbi5jaGFuZ2VkID0gdHJ1ZTsKICAgICAgICBpZiAobGVuZ3RoICYmIHBvaW50Lm9mZnNldCA+IGxlbmd0aCkgewogICAgICAgICAgcG9pbnQub2Zmc2V0IC09IGxlbmd0aDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBwb2ludC5ub2RlID0gdG87CiAgICAgICAgICBwb2ludC5vZmZzZXQgKz0gKG9mZnNldCB8fCAwKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJlcGxhY2UoY3VycmVudFNlbGVjdGlvbi5zdGFydCk7CiAgICByZXBsYWNlKGN1cnJlbnRTZWxlY3Rpb24uZW5kKTsKICB9OwoKICBzZWxlY3Quc25hcHNob3RNb3ZlID0gZnVuY3Rpb24oZnJvbSwgdG8sIGRpc3RhbmNlLCByZWxhdGl2ZSwgaWZBdFN0YXJ0KSB7CiAgICBpZiAoIWN1cnJlbnRTZWxlY3Rpb24pIHJldHVybjsKCiAgICBmdW5jdGlvbiBtb3ZlKHBvaW50KSB7CiAgICAgIGlmIChmcm9tID09IHBvaW50Lm5vZGUgJiYgKCFpZkF0U3RhcnQgfHwgcG9pbnQub2Zmc2V0ID09IDApKSB7CiAgICAgICAgY3VycmVudFNlbGVjdGlvbi5jaGFuZ2VkID0gdHJ1ZTsKICAgICAgICBwb2ludC5ub2RlID0gdG87CiAgICAgICAgaWYgKHJlbGF0aXZlKSBwb2ludC5vZmZzZXQgPSBNYXRoLm1heCgwLCBwb2ludC5vZmZzZXQgKyBkaXN0YW5jZSk7CiAgICAgICAgZWxzZSBwb2ludC5vZmZzZXQgPSBkaXN0YW5jZTsKICAgICAgfQogICAgfQogICAgbW92ZShjdXJyZW50U2VsZWN0aW9uLnN0YXJ0KTsKICAgIG1vdmUoY3VycmVudFNlbGVjdGlvbi5lbmQpOwogIH07CgogIC8vIE1vc3QgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluIHR3byB3YXlzLCBvbmUgZm9yIHRoZSBJRSBzZWxlY3Rpb24KICAvLyBtb2RlbCwgb25lIGZvciB0aGUgVzNDIG9uZS4KICBpZiAoc2VsZWN0LmllX3NlbGVjdGlvbikgewogICAgZnVuY3Rpb24gc2VsZWN0aW9uTm9kZSh3aW4sIHN0YXJ0KSB7CiAgICAgIHZhciByYW5nZSA9IHdpbi5kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsKICAgICAgcmFuZ2UuY29sbGFwc2Uoc3RhcnQpOwoKICAgICAgZnVuY3Rpb24gbm9kZUFmdGVyKG5vZGUpIHsKICAgICAgICB2YXIgZm91bmQgPSBudWxsOwogICAgICAgIHdoaWxlICghZm91bmQgJiYgbm9kZSkgewogICAgICAgICAgZm91bmQgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vZGVBdFN0YXJ0T2YoZm91bmQpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBub2RlQXRTdGFydE9mKG5vZGUpIHsKICAgICAgICB3aGlsZSAobm9kZSAmJiBub2RlLmZpcnN0Q2hpbGQpIG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7CiAgICAgICAgcmV0dXJuIHtub2RlOiBub2RlLCBvZmZzZXQ6IDB9OwogICAgICB9CgogICAgICB2YXIgY29udGFpbmluZyA9IHJhbmdlLnBhcmVudEVsZW1lbnQoKTsKICAgICAgaWYgKCFpc0FuY2VzdG9yKHdpbi5kb2N1bWVudC5ib2R5LCBjb250YWluaW5nKSkgcmV0dXJuIG51bGw7CiAgICAgIGlmICghY29udGFpbmluZy5maXJzdENoaWxkKSByZXR1cm4gbm9kZUF0U3RhcnRPZihjb250YWluaW5nKTsKCiAgICAgIHZhciB3b3JraW5nID0gcmFuZ2UuZHVwbGljYXRlKCk7CiAgICAgIHdvcmtpbmcubW92ZVRvRWxlbWVudFRleHQoY29udGFpbmluZyk7CiAgICAgIHdvcmtpbmcuY29sbGFwc2UodHJ1ZSk7CiAgICAgIGZvciAodmFyIGN1ciA9IGNvbnRhaW5pbmcuZmlyc3RDaGlsZDsgY3VyOyBjdXIgPSBjdXIubmV4dFNpYmxpbmcpIHsKICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09IDMpIHsKICAgICAgICAgIHZhciBzaXplID0gY3VyLm5vZGVWYWx1ZS5sZW5ndGg7CiAgICAgICAgICB3b3JraW5nLm1vdmUoImNoYXJhY3RlciIsIHNpemUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHdvcmtpbmcubW92ZVRvRWxlbWVudFRleHQoY3VyKTsKICAgICAgICAgIHdvcmtpbmcuY29sbGFwc2UoZmFsc2UpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGRpciA9IHJhbmdlLmNvbXBhcmVFbmRQb2ludHMoIlN0YXJ0VG9TdGFydCIsIHdvcmtpbmcpOwogICAgICAgIGlmIChkaXIgPT0gMCkgcmV0dXJuIG5vZGVBZnRlcihjdXIpOwogICAgICAgIGlmIChkaXIgPT0gMSkgY29udGludWU7CiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSAhPSAzKSByZXR1cm4gbm9kZUF0U3RhcnRPZihjdXIpOwoKICAgICAgICB3b3JraW5nLnNldEVuZFBvaW50KCJTdGFydFRvRW5kIiwgcmFuZ2UpOwogICAgICAgIHJldHVybiB7bm9kZTogY3VyLCBvZmZzZXQ6IHNpemUgLSB3b3JraW5nLnRleHQubGVuZ3RofTsKICAgICAgfQogICAgICByZXR1cm4gbm9kZUFmdGVyKGNvbnRhaW5pbmcpOwogICAgfQoKICAgIHNlbGVjdC5tYXJrU2VsZWN0aW9uID0gZnVuY3Rpb24od2luKSB7CiAgICAgIGN1cnJlbnRTZWxlY3Rpb24gPSBudWxsOwogICAgICB2YXIgc2VsID0gd2luLmRvY3VtZW50LnNlbGVjdGlvbjsKICAgICAgaWYgKCFzZWwpIHJldHVybjsKICAgICAgdmFyIHN0YXJ0ID0gc2VsZWN0aW9uTm9kZSh3aW4sIHRydWUpLAogICAgICAgICAgZW5kID0gc2VsZWN0aW9uTm9kZSh3aW4sIGZhbHNlKTsKICAgICAgaWYgKCFzdGFydCB8fCAhZW5kKSByZXR1cm47CiAgICAgIGN1cnJlbnRTZWxlY3Rpb24gPSB7c3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCwgd2luZG93OiB3aW4sIGNoYW5nZWQ6IGZhbHNlfTsKICAgIH07CgogICAgc2VsZWN0LnNlbGVjdE1hcmtlZCA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAoIWN1cnJlbnRTZWxlY3Rpb24gfHwgIWN1cnJlbnRTZWxlY3Rpb24uY2hhbmdlZCkgcmV0dXJuOwogICAgICB2YXIgd2luID0gY3VycmVudFNlbGVjdGlvbi53aW5kb3csIGRvYyA9IHdpbi5kb2N1bWVudDsKCiAgICAgIGZ1bmN0aW9uIG1ha2VSYW5nZShwb2ludCkgewogICAgICAgIHZhciByYW5nZSA9IGRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpLAogICAgICAgICAgICBub2RlID0gcG9pbnQubm9kZTsKICAgICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgIHJhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KGN1cnJlbnRTZWxlY3Rpb24ud2luZG93LmRvY3VtZW50LmJvZHkpOwogICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHsKICAgICAgICAgIHJhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KG5vZGUucGFyZW50Tm9kZSk7CiAgICAgICAgICB2YXIgb2Zmc2V0ID0gcG9pbnQub2Zmc2V0OwogICAgICAgICAgd2hpbGUgKG5vZGUucHJldmlvdXNTaWJsaW5nKSB7CiAgICAgICAgICAgIG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZzsKICAgICAgICAgICAgb2Zmc2V0ICs9IChub2RlLmlubmVyVGV4dCB8fCAiIikubGVuZ3RoOwogICAgICAgICAgfQogICAgICAgICAgcmFuZ2UubW92ZSgiY2hhcmFjdGVyIiwgb2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICByYW5nZS5tb3ZlVG9FbGVtZW50VGV4dChub2RlKTsKICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgIH0KCiAgICAgIHZhciBzdGFydCA9IG1ha2VSYW5nZShjdXJyZW50U2VsZWN0aW9uLnN0YXJ0KSwgZW5kID0gbWFrZVJhbmdlKGN1cnJlbnRTZWxlY3Rpb24uZW5kKTsKICAgICAgc3RhcnQuc2V0RW5kUG9pbnQoIlN0YXJ0VG9FbmQiLCBlbmQpOwogICAgICBzdGFydC5zZWxlY3QoKTsKICAgIH07CgogICAgLy8gR2V0IHRoZSB0b3AtbGV2ZWwgbm9kZSB0aGF0IG9uZSBlbmQgb2YgdGhlIGN1cnNvciBpcyBpbnNpZGUgb3IKICAgIC8vIGFmdGVyLiBOb3RlIHRoYXQgdGhpcyByZXR1cm5zIGZhbHNlIGZvciAnbm8gY3Vyc29yJywgYW5kIG51bGwKICAgIC8vIGZvciAnc3RhcnQgb2YgZG9jdW1lbnQnLgogICAgc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUgPSBmdW5jdGlvbihjb250YWluZXIsIHN0YXJ0KSB7CiAgICAgIHZhciBzZWxlY3Rpb24gPSBjb250YWluZXIub3duZXJEb2N1bWVudC5zZWxlY3Rpb247CiAgICAgIGlmICghc2VsZWN0aW9uKSByZXR1cm4gZmFsc2U7CgogICAgICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKSwgcmFuZ2UyID0gcmFuZ2UuZHVwbGljYXRlKCk7CiAgICAgIHJhbmdlLmNvbGxhcHNlKHN0YXJ0KTsKICAgICAgdmFyIGFyb3VuZCA9IHJhbmdlLnBhcmVudEVsZW1lbnQoKTsKICAgICAgaWYgKGFyb3VuZCAmJiBpc0FuY2VzdG9yKGNvbnRhaW5lciwgYXJvdW5kKSkgewogICAgICAgIC8vIE9ubHkgdXNlIHRoaXMgbm9kZSBpZiB0aGUgc2VsZWN0aW9uIGlzIG5vdCBhdCBpdHMgc3RhcnQuCiAgICAgICAgcmFuZ2UyLm1vdmVUb0VsZW1lbnRUZXh0KGFyb3VuZCk7CiAgICAgICAgaWYgKHJhbmdlLmNvbXBhcmVFbmRQb2ludHMoIlN0YXJ0VG9TdGFydCIsIHJhbmdlMikgPT0gMSkKICAgICAgICAgIHJldHVybiB0b3BMZXZlbE5vZGVBdChhcm91bmQsIGNvbnRhaW5lcik7CiAgICAgIH0KCiAgICAgIC8vIE1vdmUgdGhlIHN0YXJ0IG9mIGEgcmFuZ2UgdG8gdGhlIHN0YXJ0IG9mIGEgbm9kZSwKICAgICAgLy8gY29tcGVuc2F0aW5nIGZvciB0aGUgZmFjdCB0aGF0IHlvdSBjYW4ndCBjYWxsCiAgICAgIC8vIG1vdmVUb0VsZW1lbnRUZXh0IHdpdGggdGV4dCBub2Rlcy4KICAgICAgZnVuY3Rpb24gbW92ZVRvTm9kZVN0YXJ0KHJhbmdlLCBub2RlKSB7CiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykgewogICAgICAgICAgdmFyIGNvdW50ID0gMCwgY3VyID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgICB3aGlsZSAoY3VyICYmIGN1ci5ub2RlVHlwZSA9PSAzKSB7CiAgICAgICAgICAgIGNvdW50ICs9IGN1ci5ub2RlVmFsdWUubGVuZ3RoOwogICAgICAgICAgICBjdXIgPSBjdXIucHJldmlvdXNTaWJsaW5nOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGN1cikgewogICAgICAgICAgICB0cnl7cmFuZ2UubW92ZVRvRWxlbWVudFRleHQoY3VyKTt9CiAgICAgICAgICAgIGNhdGNoKGUpe3JldHVybiBmYWxzZTt9CiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgcmFuZ2UubW92ZVRvRWxlbWVudFRleHQobm9kZS5wYXJlbnROb2RlKTsKICAgICAgICAgIGlmIChjb3VudCkgcmFuZ2UubW92ZSgiY2hhcmFjdGVyIiwgY291bnQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHRyeXtyYW5nZS5tb3ZlVG9FbGVtZW50VGV4dChub2RlKTt9CiAgICAgICAgICBjYXRjaChlKXtyZXR1cm4gZmFsc2U7fQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgICAgLy8gRG8gYSBiaW5hcnkgc2VhcmNoIHRocm91Z2ggdGhlIGNvbnRhaW5lciBvYmplY3QsIGNvbXBhcmluZwogICAgICAvLyB0aGUgc3RhcnQgb2YgZWFjaCBub2RlIHRvIHRoZSBzZWxlY3Rpb24KICAgICAgdmFyIHN0YXJ0ID0gMCwgZW5kID0gY29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoIC0gMTsKICAgICAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7CiAgICAgICAgdmFyIG1pZGRsZSA9IE1hdGguY2VpbCgoZW5kICsgc3RhcnQpIC8gMiksIG5vZGUgPSBjb250YWluZXIuY2hpbGROb2Rlc1ttaWRkbGVdOwogICAgICAgIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlOyAvLyBEb24ndCBhc2suIElFNiBtYW5hZ2VzIHRoaXMgc29tZXRpbWVzLgogICAgICAgIGlmICghbW92ZVRvTm9kZVN0YXJ0KHJhbmdlMiwgbm9kZSkpIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAocmFuZ2UuY29tcGFyZUVuZFBvaW50cygiU3RhcnRUb1N0YXJ0IiwgcmFuZ2UyKSA9PSAxKQogICAgICAgICAgc3RhcnQgPSBtaWRkbGU7CiAgICAgICAgZWxzZQogICAgICAgICAgZW5kID0gbWlkZGxlIC0gMTsKICAgICAgfQogICAgICByZXR1cm4gY29udGFpbmVyLmNoaWxkTm9kZXNbc3RhcnRdIHx8IG51bGw7CiAgICB9OwoKICAgIC8vIFBsYWNlIHRoZSBjdXJzb3IgYWZ0ZXIgdGhpcy5zdGFydC4gVGhpcyBpcyBvbmx5IHVzZWZ1bCB3aGVuCiAgICAvLyBtYW51YWxseSBtb3ZpbmcgdGhlIGN1cnNvciBpbnN0ZWFkIG9mIHJlc3RvcmluZyBpdCB0byBpdHMgb2xkCiAgICAvLyBwb3NpdGlvbi4KICAgIHNlbGVjdC5mb2N1c0FmdGVyTm9kZSA9IGZ1bmN0aW9uKG5vZGUsIGNvbnRhaW5lcikgewogICAgICB2YXIgcmFuZ2UgPSBjb250YWluZXIub3duZXJEb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOwogICAgICByYW5nZS5tb3ZlVG9FbGVtZW50VGV4dChub2RlIHx8IGNvbnRhaW5lcik7CiAgICAgIHJhbmdlLmNvbGxhcHNlKCFub2RlKTsKICAgICAgcmFuZ2Uuc2VsZWN0KCk7CiAgICB9OwoKICAgIHNlbGVjdC5zb21ldGhpbmdTZWxlY3RlZCA9IGZ1bmN0aW9uKHdpbikgewogICAgICB2YXIgc2VsID0gd2luLmRvY3VtZW50LnNlbGVjdGlvbjsKICAgICAgcmV0dXJuIHNlbCAmJiAoc2VsLmNyZWF0ZVJhbmdlKCkudGV4dCAhPSAiIik7CiAgICB9OwoKICAgIGZ1bmN0aW9uIGluc2VydEF0Q3Vyc29yKHdpbmRvdywgaHRtbCkgewogICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmRvY3VtZW50LnNlbGVjdGlvbjsKICAgICAgaWYgKHNlbGVjdGlvbikgewogICAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwogICAgICAgIHJhbmdlLnBhc3RlSFRNTChodG1sKTsKICAgICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7CiAgICAgICAgcmFuZ2Uuc2VsZWN0KCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBVc2VkIHRvIG5vcm1hbGl6ZSB0aGUgZWZmZWN0IG9mIHRoZSBlbnRlciBrZXksIHNpbmNlIGJyb3dzZXJzCiAgICAvLyBkbyB3aWRlbHkgZGlmZmVyZW50IHRoaW5ncyB3aGVuIHByZXNzaW5nIGVudGVyIGluIGRlc2lnbk1vZGUuCiAgICBzZWxlY3QuaW5zZXJ0TmV3bGluZUF0Q3Vyc29yID0gZnVuY3Rpb24od2luZG93KSB7CiAgICAgIGluc2VydEF0Q3Vyc29yKHdpbmRvdywgIjxicj4iKTsKICAgIH07CgogICAgc2VsZWN0Lmluc2VydFRhYkF0Q3Vyc29yID0gZnVuY3Rpb24od2luZG93KSB7CiAgICAgIGluc2VydEF0Q3Vyc29yKHdpbmRvdywgZm91clNwYWNlcyk7CiAgICB9OwoKICAgIC8vIEdldCB0aGUgQlIgbm9kZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgb24gd2hpY2ggdGhlIGN1cnNvcgogICAgLy8gY3VycmVudGx5IGlzLCBhbmQgdGhlIG9mZnNldCBpbnRvIHRoZSBsaW5lLiBSZXR1cm5zIG51bGwgYXMKICAgIC8vIG5vZGUgaWYgY3Vyc29yIGlzIG9uIGZpcnN0IGxpbmUuCiAgICBzZWxlY3QuY3Vyc29yUG9zID0gZnVuY3Rpb24oY29udGFpbmVyLCBzdGFydCkgewogICAgICB2YXIgc2VsZWN0aW9uID0gY29udGFpbmVyLm93bmVyRG9jdW1lbnQuc2VsZWN0aW9uOwogICAgICBpZiAoIXNlbGVjdGlvbikgcmV0dXJuIG51bGw7CgogICAgICB2YXIgdG9wTm9kZSA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKGNvbnRhaW5lciwgc3RhcnQpOwogICAgICB3aGlsZSAodG9wTm9kZSAmJiAhaXNCUih0b3BOb2RlKSkKICAgICAgICB0b3BOb2RlID0gdG9wTm9kZS5wcmV2aW91c1NpYmxpbmc7CgogICAgICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKSwgcmFuZ2UyID0gcmFuZ2UuZHVwbGljYXRlKCk7CiAgICAgIHJhbmdlLmNvbGxhcHNlKHN0YXJ0KTsKICAgICAgaWYgKHRvcE5vZGUpIHsKICAgICAgICByYW5nZTIubW92ZVRvRWxlbWVudFRleHQodG9wTm9kZSk7CiAgICAgICAgcmFuZ2UyLmNvbGxhcHNlKGZhbHNlKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAvLyBXaGVuIG5vdGhpbmcgaXMgc2VsZWN0ZWQsIHdlIGNhbiBnZXQgYWxsIGtpbmRzIG9mIGZ1bmt5IGVycm9ycyBoZXJlLgogICAgICAgIHRyeSB7IHJhbmdlMi5tb3ZlVG9FbGVtZW50VGV4dChjb250YWluZXIpOyB9CiAgICAgICAgY2F0Y2ggKGUpIHsgcmV0dXJuIG51bGw7IH0KICAgICAgICByYW5nZTIuY29sbGFwc2UodHJ1ZSk7CiAgICAgIH0KICAgICAgcmFuZ2Uuc2V0RW5kUG9pbnQoIlN0YXJ0VG9TdGFydCIsIHJhbmdlMik7CgogICAgICByZXR1cm4ge25vZGU6IHRvcE5vZGUsIG9mZnNldDogcmFuZ2UudGV4dC5sZW5ndGh9OwogICAgfTsKCiAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zID0gZnVuY3Rpb24oY29udGFpbmVyLCBmcm9tLCB0bykgewogICAgICBmdW5jdGlvbiByYW5nZUF0KHBvcykgewogICAgICAgIHZhciByYW5nZSA9IGNvbnRhaW5lci5vd25lckRvY3VtZW50LmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7CiAgICAgICAgaWYgKCFwb3Mubm9kZSkgewogICAgICAgICAgcmFuZ2UubW92ZVRvRWxlbWVudFRleHQoY29udGFpbmVyKTsKICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHJhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KHBvcy5ub2RlKTsKICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgcmFuZ2UubW92ZSgiY2hhcmFjdGVyIiwgcG9zLm9mZnNldCk7CiAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICB9CgogICAgICB2YXIgcmFuZ2UgPSByYW5nZUF0KGZyb20pOwogICAgICBpZiAodG8gJiYgdG8gIT0gZnJvbSkKICAgICAgICByYW5nZS5zZXRFbmRQb2ludCgiRW5kVG9FbmQiLCByYW5nZUF0KHRvKSk7CiAgICAgIHJhbmdlLnNlbGVjdCgpOwogICAgfQoKICAgIC8vIFNvbWUgaGFja3MgZm9yIHN0b3JpbmcgYW5kIHJlLXN0b3JpbmcgdGhlIHNlbGVjdGlvbiB3aGVuIHRoZSBlZGl0b3IgbG9zZXMgYW5kIHJlZ2FpbnMgZm9jdXMuCiAgICBzZWxlY3QuZ2V0Qm9va21hcmsgPSBmdW5jdGlvbiAoY29udGFpbmVyKSB7CiAgICAgIHZhciBmcm9tID0gc2VsZWN0LmN1cnNvclBvcyhjb250YWluZXIsIHRydWUpLCB0byA9IHNlbGVjdC5jdXJzb3JQb3MoY29udGFpbmVyLCBmYWxzZSk7CiAgICAgIGlmIChmcm9tICYmIHRvKSByZXR1cm4ge2Zyb206IGZyb20sIHRvOiB0b307CiAgICB9OwoKICAgIC8vIFJlc3RvcmUgYSBzdG9yZWQgc2VsZWN0aW9uLgogICAgc2VsZWN0LnNldEJvb2ttYXJrID0gZnVuY3Rpb24oY29udGFpbmVyLCBtYXJrKSB7CiAgICAgIGlmICghbWFyaykgcmV0dXJuOwogICAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zKGNvbnRhaW5lciwgbWFyay5mcm9tLCBtYXJrLnRvKTsKICAgIH07CiAgfQogIC8vIFczQyBtb2RlbAogIGVsc2UgewogICAgLy8gU3RvcmUgc3RhcnQgYW5kIGVuZCBub2RlcywgYW5kIG9mZnNldHMgd2l0aGluIHRoZXNlLCBhbmQgcmVmZXIKICAgIC8vIGJhY2sgdG8gdGhlIHNlbGVjdGlvbiBvYmplY3QgZnJvbSB0aG9zZSBub2Rlcywgc28gdGhhdCB0aGlzCiAgICAvLyBvYmplY3QgY2FuIGJlIHVwZGF0ZWQgd2hlbiB0aGUgbm9kZXMgYXJlIHJlcGxhY2VkIGJlZm9yZSB0aGUKICAgIC8vIHNlbGVjdGlvbiBpcyByZXN0b3JlZC4KICAgIHNlbGVjdC5tYXJrU2VsZWN0aW9uID0gZnVuY3Rpb24gKHdpbikgewogICAgICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpOwogICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PSAwKQogICAgICAgIHJldHVybiAoY3VycmVudFNlbGVjdGlvbiA9IG51bGwpOwogICAgICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKCiAgICAgIGN1cnJlbnRTZWxlY3Rpb24gPSB7CiAgICAgICAgc3RhcnQ6IHtub2RlOiByYW5nZS5zdGFydENvbnRhaW5lciwgb2Zmc2V0OiByYW5nZS5zdGFydE9mZnNldH0sCiAgICAgICAgZW5kOiB7bm9kZTogcmFuZ2UuZW5kQ29udGFpbmVyLCBvZmZzZXQ6IHJhbmdlLmVuZE9mZnNldH0sCiAgICAgICAgd2luZG93OiB3aW4sCiAgICAgICAgY2hhbmdlZDogZmFsc2UKICAgICAgfTsKCiAgICAgIC8vIFdlIHdhbnQgdGhlIG5vZGVzIHJpZ2h0IGF0IHRoZSBjdXJzb3IsIG5vdCBvbmUgb2YgdGhlaXIKICAgICAgLy8gYW5jZXN0b3JzIHdpdGggYSBzdWl0YWJsZSBvZmZzZXQuIFRoaXMgZ29lcyBkb3duIHRoZSBET00gdHJlZQogICAgICAvLyB1bnRpbCBhICdsZWFmJyBpcyByZWFjaGVkIChvciBpcyBpdCAqdXAqIHRoZSBET00gdHJlZT8pLgogICAgICBmdW5jdGlvbiBub3JtYWxpemUocG9pbnQpewogICAgICAgIHdoaWxlIChwb2ludC5ub2RlLm5vZGVUeXBlICE9IDMgJiYgIWlzQlIocG9pbnQubm9kZSkpIHsKICAgICAgICAgIHZhciBuZXdOb2RlID0gcG9pbnQubm9kZS5jaGlsZE5vZGVzW3BvaW50Lm9mZnNldF0gfHwgcG9pbnQubm9kZS5uZXh0U2libGluZzsKICAgICAgICAgIHBvaW50Lm9mZnNldCA9IDA7CiAgICAgICAgICB3aGlsZSAoIW5ld05vZGUgJiYgcG9pbnQubm9kZS5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgIHBvaW50Lm5vZGUgPSBwb2ludC5ub2RlLnBhcmVudE5vZGU7CiAgICAgICAgICAgIG5ld05vZGUgPSBwb2ludC5ub2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgfQogICAgICAgICAgcG9pbnQubm9kZSA9IG5ld05vZGU7CiAgICAgICAgICBpZiAoIW5ld05vZGUpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQoKICAgICAgbm9ybWFsaXplKGN1cnJlbnRTZWxlY3Rpb24uc3RhcnQpOwogICAgICBub3JtYWxpemUoY3VycmVudFNlbGVjdGlvbi5lbmQpOwogICAgfTsKCiAgICBzZWxlY3Quc2VsZWN0TWFya2VkID0gZnVuY3Rpb24gKCkgewogICAgICB2YXIgY3MgPSBjdXJyZW50U2VsZWN0aW9uOwogICAgICBpZiAoIShjcyAmJiAoY3MuY2hhbmdlZCB8fCAod2Via2l0ICYmIGNzLnN0YXJ0Lm5vZGUgPT0gY3MuZW5kLm5vZGUpKSkpIHJldHVybjsKICAgICAgdmFyIHdpbiA9IGNzLndpbmRvdywgcmFuZ2UgPSB3aW4uZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKCiAgICAgIGZ1bmN0aW9uIHNldFBvaW50KHBvaW50LCB3aGljaCkgewogICAgICAgIGlmIChwb2ludC5ub2RlKSB7CiAgICAgICAgICAvLyBTb21lIG1hZ2ljIHRvIGdlbmVyYWxpemUgdGhlIHNldHRpbmcgb2YgdGhlIHN0YXJ0IGFuZCBlbmQKICAgICAgICAgIC8vIG9mIGEgcmFuZ2UuCiAgICAgICAgICBpZiAocG9pbnQub2Zmc2V0ID09IDApCiAgICAgICAgICAgIHJhbmdlWyJzZXQiICsgd2hpY2ggKyAiQmVmb3JlIl0ocG9pbnQubm9kZSk7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHJhbmdlWyJzZXQiICsgd2hpY2hdKHBvaW50Lm5vZGUsIHBvaW50Lm9mZnNldCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcih3aW4uZG9jdW1lbnQuYm9keS5sYXN0Q2hpbGQgfHwgd2luLmRvY3VtZW50LmJvZHkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgc2V0UG9pbnQoY3MuZW5kLCAiRW5kIik7CiAgICAgIHNldFBvaW50KGNzLnN0YXJ0LCAiU3RhcnQiKTsKICAgICAgc2VsZWN0UmFuZ2UocmFuZ2UsIHdpbik7CiAgICB9OwoKICAgIC8vIEhlbHBlciBmb3Igc2VsZWN0aW5nIGEgcmFuZ2Ugb2JqZWN0LgogICAgZnVuY3Rpb24gc2VsZWN0UmFuZ2UocmFuZ2UsIHdpbmRvdykgewogICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7CiAgICB9OwogICAgZnVuY3Rpb24gc2VsZWN0aW9uUmFuZ2Uod2luZG93KSB7CiAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09IDApCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgfQoKICAgIC8vIEZpbmRpbmcgdGhlIHRvcC1sZXZlbCBub2RlIGF0IHRoZSBjdXJzb3IgaW4gdGhlIFczQyBpcywgYXMgeW91CiAgICAvLyBjYW4gc2VlLCBxdWl0ZSBhbiBpbnZvbHZlZCBwcm9jZXNzLgogICAgc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUgPSBmdW5jdGlvbihjb250YWluZXIsIHN0YXJ0KSB7CiAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvblJhbmdlKGNvbnRhaW5lci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KTsKICAgICAgaWYgKCFyYW5nZSkgcmV0dXJuIGZhbHNlOwoKICAgICAgdmFyIG5vZGUgPSBzdGFydCA/IHJhbmdlLnN0YXJ0Q29udGFpbmVyIDogcmFuZ2UuZW5kQ29udGFpbmVyOwogICAgICB2YXIgb2Zmc2V0ID0gc3RhcnQgPyByYW5nZS5zdGFydE9mZnNldCA6IHJhbmdlLmVuZE9mZnNldDsKICAgICAgLy8gV29yayBhcm91bmQgKHlldCBhbm90aGVyKSBidWcgaW4gT3BlcmEncyBzZWxlY3Rpb24gbW9kZWwuCiAgICAgIGlmICh3aW5kb3cub3BlcmEgJiYgIXN0YXJ0ICYmIHJhbmdlLmVuZENvbnRhaW5lciA9PSBjb250YWluZXIgJiYgcmFuZ2UuZW5kT2Zmc2V0ID09IHJhbmdlLnN0YXJ0T2Zmc2V0ICsgMSAmJgogICAgICAgICAgY29udGFpbmVyLmNoaWxkTm9kZXNbcmFuZ2Uuc3RhcnRPZmZzZXRdICYmIGlzQlIoY29udGFpbmVyLmNoaWxkTm9kZXNbcmFuZ2Uuc3RhcnRPZmZzZXRdKSkKICAgICAgICBvZmZzZXQtLTsKCiAgICAgIC8vIEZvciB0ZXh0IG5vZGVzLCB3ZSBsb29rIGF0IHRoZSBub2RlIGl0c2VsZiBpZiB0aGUgY3Vyc29yIGlzCiAgICAgIC8vIGluc2lkZSwgb3IgYXQgdGhlIG5vZGUgYmVmb3JlIGl0IGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlCiAgICAgIC8vIHN0YXJ0LgogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKXsKICAgICAgICBpZiAob2Zmc2V0ID4gMCkKICAgICAgICAgIHJldHVybiB0b3BMZXZlbE5vZGVBdChub2RlLCBjb250YWluZXIpOwogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiB0b3BMZXZlbE5vZGVCZWZvcmUobm9kZSwgY29udGFpbmVyKTsKICAgICAgfQogICAgICAvLyBPY2Nhc2lvbmFsbHksIGJyb3dzZXJzIHdpbGwgcmV0dXJuIHRoZSBIVE1MIG5vZGUgYXMKICAgICAgLy8gc2VsZWN0aW9uLiBJZiB0aGUgb2Zmc2V0IGlzIDAsIHdlIHRha2UgdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZQogICAgICAvLyAoJ2FmdGVyIG51bGwnKSwgb3RoZXJ3aXNlLCB3ZSB0YWtlIHRoZSBsYXN0IG5vZGUuCiAgICAgIGVsc2UgaWYgKG5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PSAiSFRNTCIpIHsKICAgICAgICByZXR1cm4gKG9mZnNldCA9PSAxID8gbnVsbCA6IGNvbnRhaW5lci5sYXN0Q2hpbGQpOwogICAgICB9CiAgICAgIC8vIElmIHRoZSBnaXZlbiBub2RlIGlzIG91ciAnY29udGFpbmVyJywgd2UganVzdCBsb29rIHVwIHRoZQogICAgICAvLyBjb3JyZWN0IG5vZGUgYnkgdXNpbmcgdGhlIG9mZnNldC4KICAgICAgZWxzZSBpZiAobm9kZSA9PSBjb250YWluZXIpIHsKICAgICAgICByZXR1cm4gKG9mZnNldCA9PSAwKSA/IG51bGwgOiBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07CiAgICAgIH0KICAgICAgLy8gSW4gYW55IG90aGVyIGNhc2UsIHdlIGhhdmUgYSByZWd1bGFyIG5vZGUuIElmIHRoZSBjdXJzb3IgaXMKICAgICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgbm9kZSwgd2UgdXNlIHRoZSBub2RlIGl0c2VsZiwgaWYgaXQgaXMgYXQKICAgICAgLy8gdGhlIHN0YXJ0LCB3ZSB1c2UgdGhlIG5vZGUgYmVmb3JlIGl0LCBhbmQgaW4gYW55IG90aGVyCiAgICAgIC8vIGNhc2UsIHdlIGxvb2sgdXAgdGhlIGNoaWxkIGJlZm9yZSB0aGUgY3Vyc29yIGFuZCB1c2UgdGhhdC4KICAgICAgZWxzZSB7CiAgICAgICAgaWYgKG9mZnNldCA9PSBub2RlLmNoaWxkTm9kZXMubGVuZ3RoKQogICAgICAgICAgcmV0dXJuIHRvcExldmVsTm9kZUF0KG5vZGUsIGNvbnRhaW5lcik7CiAgICAgICAgZWxzZSBpZiAob2Zmc2V0ID09IDApCiAgICAgICAgICByZXR1cm4gdG9wTGV2ZWxOb2RlQmVmb3JlKG5vZGUsIGNvbnRhaW5lcik7CiAgICAgICAgZWxzZQogICAgICAgICAgcmV0dXJuIHRvcExldmVsTm9kZUF0KG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXSwgY29udGFpbmVyKTsKICAgICAgfQogICAgfTsKCiAgICBzZWxlY3QuZm9jdXNBZnRlck5vZGUgPSBmdW5jdGlvbihub2RlLCBjb250YWluZXIpIHsKICAgICAgdmFyIHdpbiA9IGNvbnRhaW5lci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LAogICAgICAgICAgcmFuZ2UgPSB3aW4uZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgcmFuZ2Uuc2V0U3RhcnRCZWZvcmUoY29udGFpbmVyLmZpcnN0Q2hpbGQgfHwgY29udGFpbmVyKTsKICAgICAgLy8gSW4gT3BlcmEsIHNldHRpbmcgdGhlIGVuZCBvZiBhIHJhbmdlIGF0IHRoZSBlbmQgb2YgYSBsaW5lCiAgICAgIC8vIChiZWZvcmUgYSBCUikgd2lsbCBjYXVzZSB0aGUgY3Vyc29yIHRvIGFwcGVhciBvbiB0aGUgbmV4dAogICAgICAvLyBsaW5lLCBzbyB3ZSBzZXQgdGhlIGVuZCBpbnNpZGUgb2YgdGhlIHN0YXJ0IG5vZGUgd2hlbgogICAgICAvLyBwb3NzaWJsZS4KICAgICAgaWYgKG5vZGUgJiYgIW5vZGUuZmlyc3RDaGlsZCkKICAgICAgICByYW5nZS5zZXRFbmRBZnRlcihub2RlKTsKICAgICAgZWxzZSBpZiAobm9kZSkKICAgICAgICByYW5nZS5zZXRFbmQobm9kZSwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCk7CiAgICAgIGVsc2UKICAgICAgICByYW5nZS5zZXRFbmRCZWZvcmUoY29udGFpbmVyLmZpcnN0Q2hpbGQgfHwgY29udGFpbmVyKTsKICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpOwogICAgICBzZWxlY3RSYW5nZShyYW5nZSwgd2luKTsKICAgIH07CgogICAgc2VsZWN0LnNvbWV0aGluZ1NlbGVjdGVkID0gZnVuY3Rpb24od2luKSB7CiAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvblJhbmdlKHdpbik7CiAgICAgIHJldHVybiByYW5nZSAmJiAhcmFuZ2UuY29sbGFwc2VkOwogICAgfTsKCiAgICBmdW5jdGlvbiBpbnNlcnROb2RlQXRDdXJzb3Iod2luZG93LCBub2RlKSB7CiAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvblJhbmdlKHdpbmRvdyk7CiAgICAgIGlmICghcmFuZ2UpIHJldHVybjsKCiAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7CiAgICAgIHJhbmdlLmluc2VydE5vZGUobm9kZSk7CiAgICAgIHdlYmtpdExhc3RMaW5lSGFjayh3aW5kb3cuZG9jdW1lbnQuYm9keSk7CiAgICAgIHJhbmdlID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgIHJhbmdlLnNlbGVjdE5vZGUobm9kZSk7CiAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTsKICAgICAgc2VsZWN0UmFuZ2UocmFuZ2UsIHdpbmRvdyk7CiAgICB9CgogICAgc2VsZWN0Lmluc2VydE5ld2xpbmVBdEN1cnNvciA9IGZ1bmN0aW9uKHdpbmRvdykgewogICAgICBpbnNlcnROb2RlQXRDdXJzb3Iod2luZG93LCB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiQlIiKSk7CiAgICB9OwoKICAgIHNlbGVjdC5pbnNlcnRUYWJBdEN1cnNvciA9IGZ1bmN0aW9uKHdpbmRvdykgewogICAgICBpbnNlcnROb2RlQXRDdXJzb3Iod2luZG93LCB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZm91clNwYWNlcykpOwogICAgfTsKCiAgICBzZWxlY3QuY3Vyc29yUG9zID0gZnVuY3Rpb24oY29udGFpbmVyLCBzdGFydCkgewogICAgICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb25SYW5nZSh3aW5kb3cpOwogICAgICBpZiAoIXJhbmdlKSByZXR1cm47CgogICAgICB2YXIgdG9wTm9kZSA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKGNvbnRhaW5lciwgc3RhcnQpOwogICAgICB3aGlsZSAodG9wTm9kZSAmJiAhaXNCUih0b3BOb2RlKSkKICAgICAgICB0b3BOb2RlID0gdG9wTm9kZS5wcmV2aW91c1NpYmxpbmc7CgogICAgICByYW5nZSA9IHJhbmdlLmNsb25lUmFuZ2UoKTsKICAgICAgcmFuZ2UuY29sbGFwc2Uoc3RhcnQpOwogICAgICBpZiAodG9wTm9kZSkKICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHRvcE5vZGUpOwogICAgICBlbHNlCiAgICAgICAgcmFuZ2Uuc2V0U3RhcnRCZWZvcmUoY29udGFpbmVyKTsKICAgICAgcmV0dXJuIHtub2RlOiB0b3BOb2RlLCBvZmZzZXQ6IHJhbmdlLnRvU3RyaW5nKCkubGVuZ3RofTsKICAgIH07CgogICAgc2VsZWN0LnNldEN1cnNvclBvcyA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgZnJvbSwgdG8pIHsKICAgICAgdmFyIHdpbiA9IGNvbnRhaW5lci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LAogICAgICAgICAgcmFuZ2UgPSB3aW4uZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKCiAgICAgIGZ1bmN0aW9uIHNldFBvaW50KG5vZGUsIG9mZnNldCwgc2lkZSkgewogICAgICAgIGlmICghbm9kZSkKICAgICAgICAgIG5vZGUgPSBjb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgICBlbHNlCiAgICAgICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZzsKCiAgICAgICAgaWYgKCFub2RlKQogICAgICAgICAgcmV0dXJuOwoKICAgICAgICBpZiAob2Zmc2V0ID09IDApIHsKICAgICAgICAgIHJhbmdlWyJzZXQiICsgc2lkZSArICJCZWZvcmUiXShub2RlKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgdmFyIGJhY2tsb2cgPSBbXQogICAgICAgIGZ1bmN0aW9uIGRlY29tcG9zZShub2RlKSB7CiAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKQogICAgICAgICAgICBiYWNrbG9nLnB1c2gobm9kZSk7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGZvckVhY2gobm9kZS5jaGlsZE5vZGVzLCBkZWNvbXBvc2UpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgd2hpbGUgKG5vZGUgJiYgIWJhY2tsb2cubGVuZ3RoKSB7CiAgICAgICAgICAgIGRlY29tcG9zZShub2RlKTsKICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgY3VyID0gYmFja2xvZy5zaGlmdCgpOwogICAgICAgICAgaWYgKCFjdXIpIHJldHVybiBmYWxzZTsKCiAgICAgICAgICB2YXIgbGVuZ3RoID0gY3VyLm5vZGVWYWx1ZS5sZW5ndGg7CiAgICAgICAgICBpZiAobGVuZ3RoID49IG9mZnNldCkgewogICAgICAgICAgICByYW5nZVsic2V0IiArIHNpZGVdKGN1ciwgb2Zmc2V0KTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBvZmZzZXQgLT0gbGVuZ3RoOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdG8gPSB0byB8fCBmcm9tOwogICAgICBpZiAoc2V0UG9pbnQodG8ubm9kZSwgdG8ub2Zmc2V0LCAiRW5kIikgJiYgc2V0UG9pbnQoZnJvbS5ub2RlLCBmcm9tLm9mZnNldCwgIlN0YXJ0IikpCiAgICAgICAgc2VsZWN0UmFuZ2UocmFuZ2UsIHdpbik7CiAgICB9OwogIH0KfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/stringstream.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogU3RyaW5nIHN0cmVhbXMgYXJlIHRoZSB0aGluZ3MgZmVkIHRvIHBhcnNlcnMgKHdoaWNoIGNhbiBmZWVkIHRoZW0KICogdG8gYSB0b2tlbml6ZXIgaWYgdGhleSB3YW50KS4gVGhleSBwcm92aWRlIHBlZWsgYW5kIG5leHQgbWV0aG9kcwogKiBmb3IgbG9va2luZyBhdCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgKG5leHQgJ2NvbnN1bWVzJyB0aGlzCiAqIGNoYXJhY3RlciwgcGVlayBkb2VzIG5vdCksIGFuZCBhIGdldCBtZXRob2QgZm9yIHJldHJpZXZpbmcgYWxsIHRoZQogKiB0ZXh0IHRoYXQgd2FzIGNvbnN1bWVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgZ2V0IHdhcyBjYWxsZWQuCiAqCiAqIEFuIGVhc3kgbWlzdGFrZSB0byBtYWtlIGlzIHRvIGxldCBhIFN0b3BJdGVyYXRpb24gZXhjZXB0aW9uIGZpbmlzaAogKiB0aGUgdG9rZW4gc3RyZWFtIHdoaWxlIHRoZXJlIGFyZSBzdGlsbCBjaGFyYWN0ZXJzIHBlbmRpbmcgaW4gdGhlCiAqIHN0cmluZyBzdHJlYW0gKGhpdHRpbmcgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdoaWxlIHBhcnNpbmcgYQogKiB0b2tlbikuIFRvIG1ha2UgaXQgZWFzaWVyIHRvIGRldGVjdCBzdWNoIGVycm9ycywgdGhlIHN0cmluZ3N0cmVhbXMKICogdGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gdGhpcyBoYXBwZW5zLgogKi8KCi8vIE1ha2UgYSBzdHJpbmdzdHJlYW0gc3RyZWFtIG91dCBvZiBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgc3RyaW5ncy4KLy8gVGhpcyBpcyBhcHBsaWVkIHRvIHRoZSByZXN1bHQgb2YgdHJhdmVyc2VET00gKHNlZSBjb2RlbWlycm9yLmpzKSwKLy8gYW5kIHRoZSByZXN1bHRpbmcgc3RyZWFtIGlzIGZlZCB0byB0aGUgcGFyc2VyLgp3aW5kb3cuc3RyaW5nU3RyZWFtID0gZnVuY3Rpb24oc291cmNlKXsKICAvLyBTdHJpbmcgdGhhdCdzIGN1cnJlbnRseSBiZWluZyBpdGVyYXRlZCBvdmVyLgogIHZhciBjdXJyZW50ID0gIiI7CiAgLy8gUG9zaXRpb24gaW4gdGhhdCBzdHJpbmcuCiAgdmFyIHBvcyA9IDA7CiAgLy8gQWNjdW11bGF0b3IgZm9yIHN0cmluZ3MgdGhhdCBoYXZlIGJlZW4gaXRlcmF0ZWQgb3ZlciBidXQgbm90CiAgLy8gZ2V0KCktZWQgeWV0LgogIHZhciBhY2N1bSA9ICIiOwogIC8vIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbW9yZSBjaGFyYWN0ZXJzIHJlYWR5LCBvciB0aHJvdwogIC8vIFN0b3BJdGVyYXRpb24uCiAgZnVuY3Rpb24gZW5zdXJlQ2hhcnMoKSB7CiAgICB3aGlsZSAocG9zID09IGN1cnJlbnQubGVuZ3RoKSB7CiAgICAgIGFjY3VtICs9IGN1cnJlbnQ7CiAgICAgIGN1cnJlbnQgPSAiIjsgLy8gSW4gY2FzZSBzb3VyY2UubmV4dCgpIHRocm93cwogICAgICBwb3MgPSAwOwogICAgICB0cnkge2N1cnJlbnQgPSBzb3VyY2UubmV4dCgpO30KICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICBpZiAoZSAhPSBTdG9wSXRlcmF0aW9uKSB0aHJvdyBlOwogICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHJldHVybiB7CiAgICAvLyBSZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSBzdHJlYW0uCiAgICBwZWVrOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCFlbnN1cmVDaGFycygpKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuIGN1cnJlbnQuY2hhckF0KHBvcyk7CiAgICB9LAogICAgLy8gR2V0IHRoZSBuZXh0IGNoYXJhY3RlciwgdGhyb3cgU3RvcEl0ZXJhdGlvbiBpZiBhdCBlbmQsIGNoZWNrCiAgICAvLyBmb3IgdW51c2VkIGNvbnRlbnQuCiAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCFlbnN1cmVDaGFycygpKSB7CiAgICAgICAgaWYgKGFjY3VtLmxlbmd0aCA+IDApCiAgICAgICAgICB0aHJvdyAiRW5kIG9mIHN0cmluZ3N0cmVhbSByZWFjaGVkIHdpdGhvdXQgZW1wdHlpbmcgYnVmZmVyICgnIiArIGFjY3VtICsgIicpLiI7CiAgICAgICAgZWxzZQogICAgICAgICAgdGhyb3cgU3RvcEl0ZXJhdGlvbjsKICAgICAgfQogICAgICByZXR1cm4gY3VycmVudC5jaGFyQXQocG9zKyspOwogICAgfSwKICAgIC8vIFJldHVybiB0aGUgY2hhcmFjdGVycyBpdGVyYXRlZCBvdmVyIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8KICAgIC8vIC5nZXQoKS4KICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHZhciB0ZW1wID0gYWNjdW07CiAgICAgIGFjY3VtID0gIiI7CiAgICAgIGlmIChwb3MgPiAwKXsKICAgICAgICB0ZW1wICs9IGN1cnJlbnQuc2xpY2UoMCwgcG9zKTsKICAgICAgICBjdXJyZW50ID0gY3VycmVudC5zbGljZShwb3MpOwogICAgICAgIHBvcyA9IDA7CiAgICAgIH0KICAgICAgcmV0dXJuIHRlbXA7CiAgICB9LAogICAgLy8gUHVzaCBhIHN0cmluZyBiYWNrIGludG8gdGhlIHN0cmVhbS4KICAgIHB1c2g6IGZ1bmN0aW9uKHN0cikgewogICAgICBjdXJyZW50ID0gY3VycmVudC5zbGljZSgwLCBwb3MpICsgc3RyICsgY3VycmVudC5zbGljZShwb3MpOwogICAgfSwKICAgIGxvb2tBaGVhZDogZnVuY3Rpb24oc3RyLCBjb25zdW1lLCBza2lwU3BhY2VzLCBjYXNlSW5zZW5zaXRpdmUpIHsKICAgICAgZnVuY3Rpb24gY2FzZWQoc3RyKSB7cmV0dXJuIGNhc2VJbnNlbnNpdGl2ZSA/IHN0ci50b0xvd2VyQ2FzZSgpIDogc3RyO30KICAgICAgc3RyID0gY2FzZWQoc3RyKTsKICAgICAgdmFyIGZvdW5kID0gZmFsc2U7CgogICAgICB2YXIgX2FjY3VtID0gYWNjdW0sIF9wb3MgPSBwb3M7CiAgICAgIGlmIChza2lwU3BhY2VzKSB0aGlzLm5leHRXaGlsZU1hdGNoZXMoL1tcc1x1MDBhMF0vKTsKCiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdmFyIGVuZCA9IHBvcyArIHN0ci5sZW5ndGgsIGxlZnQgPSBjdXJyZW50Lmxlbmd0aCAtIHBvczsKICAgICAgICBpZiAoZW5kIDw9IGN1cnJlbnQubGVuZ3RoKSB7CiAgICAgICAgICBmb3VuZCA9IHN0ciA9PSBjYXNlZChjdXJyZW50LnNsaWNlKHBvcywgZW5kKSk7CiAgICAgICAgICBwb3MgPSBlbmQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc3RyLnNsaWNlKDAsIGxlZnQpID09IGNhc2VkKGN1cnJlbnQuc2xpY2UocG9zKSkpIHsKICAgICAgICAgIGFjY3VtICs9IGN1cnJlbnQ7IGN1cnJlbnQgPSAiIjsKICAgICAgICAgIHRyeSB7Y3VycmVudCA9IHNvdXJjZS5uZXh0KCk7fQogICAgICAgICAgY2F0Y2ggKGUpIHticmVhazt9CiAgICAgICAgICBwb3MgPSAwOwogICAgICAgICAgc3RyID0gc3RyLnNsaWNlKGxlZnQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKCEoZm91bmQgJiYgY29uc3VtZSkpIHsKICAgICAgICBjdXJyZW50ID0gYWNjdW0uc2xpY2UoX2FjY3VtLmxlbmd0aCkgKyBjdXJyZW50OwogICAgICAgIHBvcyA9IF9wb3M7CiAgICAgICAgYWNjdW0gPSBfYWNjdW07CiAgICAgIH0KCiAgICAgIHJldHVybiBmb3VuZDsKICAgIH0sCgogICAgLy8gVXRpbHMgYnVpbHQgb24gdG9wIG9mIHRoZSBhYm92ZQogICAgbW9yZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLnBlZWsoKSAhPT0gbnVsbDsKICAgIH0sCiAgICBhcHBsaWVzOiBmdW5jdGlvbih0ZXN0KSB7CiAgICAgIHZhciBuZXh0ID0gdGhpcy5wZWVrKCk7CiAgICAgIHJldHVybiAobmV4dCAhPT0gbnVsbCAmJiB0ZXN0KG5leHQpKTsKICAgIH0sCiAgICBuZXh0V2hpbGU6IGZ1bmN0aW9uKHRlc3QpIHsKICAgICAgdmFyIG5leHQ7CiAgICAgIHdoaWxlICgobmV4dCA9IHRoaXMucGVlaygpKSAhPT0gbnVsbCAmJiB0ZXN0KG5leHQpKQogICAgICAgIHRoaXMubmV4dCgpOwogICAgfSwKICAgIG1hdGNoZXM6IGZ1bmN0aW9uKHJlKSB7CiAgICAgIHZhciBuZXh0ID0gdGhpcy5wZWVrKCk7CiAgICAgIHJldHVybiAobmV4dCAhPT0gbnVsbCAmJiByZS50ZXN0KG5leHQpKTsKICAgIH0sCiAgICBuZXh0V2hpbGVNYXRjaGVzOiBmdW5jdGlvbihyZSkgewogICAgICB2YXIgbmV4dDsKICAgICAgd2hpbGUgKChuZXh0ID0gdGhpcy5wZWVrKCkpICE9PSBudWxsICYmIHJlLnRlc3QobmV4dCkpCiAgICAgICAgdGhpcy5uZXh0KCk7CiAgICB9LAogICAgZXF1YWxzOiBmdW5jdGlvbihjaCkgewogICAgICByZXR1cm4gY2ggPT09IHRoaXMucGVlaygpOwogICAgfSwKICAgIGVuZE9mTGluZTogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBuZXh0ID0gdGhpcy5wZWVrKCk7CiAgICAgIHJldHVybiBuZXh0ID09IG51bGwgfHwgbmV4dCA9PSAiXG4iOwogICAgfQogIH07Cn07Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/tokenize.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQSBmcmFtZXdvcmsgZm9yIHNpbXBsZSB0b2tlbml6ZXJzLiBUYWtlcyBjYXJlIG9mIG5ld2xpbmVzIGFuZAovLyB3aGl0ZS1zcGFjZSwgYW5kIG9mIGdldHRpbmcgdGhlIHRleHQgZnJvbSB0aGUgc291cmNlIHN0cmVhbSBpbnRvCi8vIHRoZSB0b2tlbiBvYmplY3QuIEEgc3RhdGUgaXMgYSBmdW5jdGlvbiBvZiB0d28gYXJndW1lbnRzIC0tIGEKLy8gc3RyaW5nIHN0cmVhbSBhbmQgYSBzZXRTdGF0ZSBmdW5jdGlvbi4gVGhlIHNlY29uZCBjYW4gYmUgdXNlZCB0bwovLyBjaGFuZ2UgdGhlIHRva2VuaXplcidzIHN0YXRlLCBhbmQgY2FuIGJlIGlnbm9yZWQgZm9yIHN0YXRlbGVzcwovLyB0b2tlbml6ZXJzLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhZHZhbmNlIHRoZSBzdHJlYW0gb3ZlciBhIHRva2VuCi8vIGFuZCByZXR1cm4gYSBzdHJpbmcgb3Igb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5leHQKLy8gdG9rZW4sIG9yIG51bGwgdG8gcGFzcyBhbmQgaGF2ZSB0aGUgKG5ldykgc3RhdGUgYmUgY2FsbGVkIHRvIGZpbmlzaAovLyB0aGUgdG9rZW4uIFdoZW4gYSBzdHJpbmcgaXMgZ2l2ZW4sIGl0IGlzIHdyYXBwZWQgaW4gYSB7c3R5bGUsIHR5cGV9Ci8vIG9iamVjdC4gSW4gdGhlIHJlc3VsdGluZyBvYmplY3QsIHRoZSBjaGFyYWN0ZXJzIGNvbnN1bWVkIGFyZSBzdG9yZWQKLy8gdW5kZXIgdGhlIGNvbnRlbnQgcHJvcGVydHkuIEFueSB3aGl0ZXNwYWNlIGZvbGxvd2luZyB0aGVtIGlzIGFsc28KLy8gYXV0b21hdGljYWxseSBjb25zdW1lZCwgYW5kIGFkZGVkIHRvIHRoZSB2YWx1ZSBwcm9wZXJ0eS4gKFRodXMsCi8vIGNvbnRlbnQgaXMgdGhlIGFjdHVhbCBtZWFuaW5nZnVsIHBhcnQgb2YgdGhlIHRva2VuLCB3aGlsZSB2YWx1ZQovLyBjb250YWlucyBhbGwgdGhlIHRleHQgaXQgc3BhbnMuKQoKZnVuY3Rpb24gdG9rZW5pemVyKHNvdXJjZSwgc3RhdGUpIHsKICAvLyBOZXdsaW5lcyBhcmUgYWx3YXlzIGEgc2VwYXJhdGUgdG9rZW4uCiAgZnVuY3Rpb24gaXNXaGl0ZVNwYWNlKGNoKSB7CiAgICAvLyBUaGUgbWVzc3kgcmVnZXhwIGlzIGJlY2F1c2UgSUUncyByZWdleHAgbWF0Y2hlciBpcyBvZiB0aGUKICAgIC8vIG9waW5pb24gdGhhdCBub24tYnJlYWtpbmcgc3BhY2VzIGFyZSBubyB3aGl0ZXNwYWNlLgogICAgcmV0dXJuIGNoICE9ICJcbiIgJiYgL15bXHNcdTAwYTBdKiQvLnRlc3QoY2gpOwogIH0KCiAgdmFyIHRva2VuaXplciA9IHsKICAgIHN0YXRlOiBzdGF0ZSwKCiAgICB0YWtlOiBmdW5jdGlvbih0eXBlKSB7CiAgICAgIGlmICh0eXBlb2YodHlwZSkgPT0gInN0cmluZyIpCiAgICAgICAgdHlwZSA9IHtzdHlsZTogdHlwZSwgdHlwZTogdHlwZX07CgogICAgICB0eXBlLmNvbnRlbnQgPSAodHlwZS5jb250ZW50IHx8ICIiKSArIHNvdXJjZS5nZXQoKTsKICAgICAgaWYgKCEvXG4kLy50ZXN0KHR5cGUuY29udGVudCkpCiAgICAgICAgc291cmNlLm5leHRXaGlsZShpc1doaXRlU3BhY2UpOwogICAgICB0eXBlLnZhbHVlID0gdHlwZS5jb250ZW50ICsgc291cmNlLmdldCgpOwogICAgICByZXR1cm4gdHlwZTsKICAgIH0sCgogICAgbmV4dDogZnVuY3Rpb24gKCkgewogICAgICBpZiAoIXNvdXJjZS5tb3JlKCkpIHRocm93IFN0b3BJdGVyYXRpb247CgogICAgICB2YXIgdHlwZTsKICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoIlxuIikpIHsKICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgIHJldHVybiB0aGlzLnRha2UoIndoaXRlc3BhY2UiKTsKICAgICAgfQogICAgICAKICAgICAgaWYgKHNvdXJjZS5hcHBsaWVzKGlzV2hpdGVTcGFjZSkpCiAgICAgICAgdHlwZSA9ICJ3aGl0ZXNwYWNlIjsKICAgICAgZWxzZQogICAgICAgIHdoaWxlICghdHlwZSkKICAgICAgICAgIHR5cGUgPSB0aGlzLnN0YXRlKHNvdXJjZSwgZnVuY3Rpb24ocykge3Rva2VuaXplci5zdGF0ZSA9IHM7fSk7CgogICAgICByZXR1cm4gdGhpcy50YWtlKHR5cGUpOwogICAgfQogIH07CiAgcmV0dXJuIHRva2VuaXplcjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/tokenizejavascript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogVG9rZW5pemVyIGZvciBKYXZhU2NyaXB0IGNvZGUgKi8KCnZhciB0b2tlbml6ZUphdmFTY3JpcHQgPSAoZnVuY3Rpb24oKSB7CiAgLy8gQWR2YW5jZSB0aGUgc3RyZWFtIHVudGlsIHRoZSBnaXZlbiBjaGFyYWN0ZXIgKG5vdCBwcmVjZWRlZCBieSBhCiAgLy8gYmFja3NsYXNoKSBpcyBlbmNvdW50ZXJlZCwgb3IgdGhlIGVuZCBvZiB0aGUgbGluZSBpcyByZWFjaGVkLgogIGZ1bmN0aW9uIG5leHRVbnRpbFVuZXNjYXBlZChzb3VyY2UsIGVuZCkgewogICAgdmFyIGVzY2FwZWQgPSBmYWxzZTsKICAgIHZhciBuZXh0OwogICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKICAgICAgdmFyIG5leHQgPSBzb3VyY2UubmV4dCgpOwogICAgICBpZiAobmV4dCA9PSBlbmQgJiYgIWVzY2FwZWQpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgfQogICAgcmV0dXJuIGVzY2FwZWQ7CiAgfQoKICAvLyBBIG1hcCBvZiBKYXZhU2NyaXB0J3Mga2V5d29yZHMuIFRoZSBhL2IvYyBrZXl3b3JkIGRpc3RpbmN0aW9uIGlzCiAgLy8gdmVyeSByb3VnaCwgYnV0IGl0IGdpdmVzIHRoZSBwYXJzZXIgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHBhcnNlCiAgLy8gY29ycmVjdCBjb2RlIGNvcnJlY3RseSAod2UgZG9uJ3QgY2FyZSB0aGF0IG11Y2ggaG93IHdlIHBhcnNlCiAgLy8gaW5jb3JyZWN0IGNvZGUpLiBUaGUgc3R5bGUgaW5mb3JtYXRpb24gaW5jbHVkZWQgaW4gdGhlc2Ugb2JqZWN0cwogIC8vIGlzIHVzZWQgYnkgdGhlIGhpZ2hsaWdodGVyIHRvIHBpY2sgdGhlIGNvcnJlY3QgQ1NTIHN0eWxlIGZvciBhCiAgLy8gdG9rZW4uCiAgdmFyIGtleXdvcmRzID0gZnVuY3Rpb24oKXsKICAgIGZ1bmN0aW9uIHJlc3VsdCh0eXBlLCBzdHlsZSl7CiAgICAgIHJldHVybiB7dHlwZTogdHlwZSwgc3R5bGU6ICJqcy0iICsgc3R5bGV9OwogICAgfQogICAgLy8ga2V5d29yZHMgdGhhdCB0YWtlIGEgcGFyZW50aGlzZWQgZXhwcmVzc2lvbiwgYW5kIHRoZW4gYQogICAgLy8gc3RhdGVtZW50IChpZikKICAgIHZhciBrZXl3b3JkQSA9IHJlc3VsdCgia2V5d29yZCBhIiwgImtleXdvcmQiKTsKICAgIC8vIGtleXdvcmRzIHRoYXQgdGFrZSBqdXN0IGEgc3RhdGVtZW50IChlbHNlKQogICAgdmFyIGtleXdvcmRCID0gcmVzdWx0KCJrZXl3b3JkIGIiLCAia2V5d29yZCIpOwogICAgLy8ga2V5d29yZHMgdGhhdCBvcHRpb25hbGx5IHRha2UgYW4gZXhwcmVzc2lvbiwgYW5kIGZvcm0gYQogICAgLy8gc3RhdGVtZW50IChyZXR1cm4pCiAgICB2YXIga2V5d29yZEMgPSByZXN1bHQoImtleXdvcmQgYyIsICJrZXl3b3JkIik7CiAgICB2YXIgb3BlcmF0b3IgPSByZXN1bHQoIm9wZXJhdG9yIiwgImtleXdvcmQiKTsKICAgIHZhciBhdG9tID0gcmVzdWx0KCJhdG9tIiwgImF0b20iKTsKICAgIHJldHVybiB7CiAgICAgICJpZiI6IGtleXdvcmRBLCAid2hpbGUiOiBrZXl3b3JkQSwgIndpdGgiOiBrZXl3b3JkQSwKICAgICAgImVsc2UiOiBrZXl3b3JkQiwgImRvIjoga2V5d29yZEIsICJ0cnkiOiBrZXl3b3JkQiwgImZpbmFsbHkiOiBrZXl3b3JkQiwKICAgICAgInJldHVybiI6IGtleXdvcmRDLCAiYnJlYWsiOiBrZXl3b3JkQywgImNvbnRpbnVlIjoga2V5d29yZEMsICJuZXciOiBrZXl3b3JkQywgImRlbGV0ZSI6IGtleXdvcmRDLCAidGhyb3ciOiBrZXl3b3JkQywKICAgICAgImluIjogb3BlcmF0b3IsICJ0eXBlb2YiOiBvcGVyYXRvciwgImluc3RhbmNlb2YiOiBvcGVyYXRvciwKICAgICAgInZhciI6IHJlc3VsdCgidmFyIiwgImtleXdvcmQiKSwgImZ1bmN0aW9uIjogcmVzdWx0KCJmdW5jdGlvbiIsICJrZXl3b3JkIiksICJjYXRjaCI6IHJlc3VsdCgiY2F0Y2giLCAia2V5d29yZCIpLAogICAgICAiZm9yIjogcmVzdWx0KCJmb3IiLCAia2V5d29yZCIpLCAic3dpdGNoIjogcmVzdWx0KCJzd2l0Y2giLCAia2V5d29yZCIpLAogICAgICAiY2FzZSI6IHJlc3VsdCgiY2FzZSIsICJrZXl3b3JkIiksICJkZWZhdWx0IjogcmVzdWx0KCJkZWZhdWx0IiwgImtleXdvcmQiKSwKICAgICAgInRydWUiOiBhdG9tLCAiZmFsc2UiOiBhdG9tLCAibnVsbCI6IGF0b20sICJ1bmRlZmluZWQiOiBhdG9tLCAiTmFOIjogYXRvbSwgIkluZmluaXR5IjogYXRvbQogICAgfTsKICB9KCk7CgogIC8vIFNvbWUgaGVscGVyIHJlZ2V4cHMKICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWytcLSomJT08PiE/fF0vOwogIHZhciBpc0hleERpZ2l0ID0gL1swLTlBLUZhLWZdLzsKICB2YXIgaXNXb3JkQ2hhciA9IC9bXHdcJF9dLzsKCiAgLy8gV3JhcHBlciBhcm91bmQganNUb2tlbiB0aGF0IGhlbHBzIG1haW50YWluIHBhcnNlciBzdGF0ZSAod2hldGhlcgogIC8vIHdlIGFyZSBpbnNpZGUgb2YgYSBtdWx0aS1saW5lIGNvbW1lbnQgYW5kIHdoZXRoZXIgdGhlIG5leHQgdG9rZW4KICAvLyBjb3VsZCBiZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbikuCiAgZnVuY3Rpb24ganNUb2tlblN0YXRlKGluc2lkZSwgcmVnZXhwKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgbmV3SW5zaWRlID0gaW5zaWRlOwogICAgICB2YXIgdHlwZSA9IGpzVG9rZW4oaW5zaWRlLCByZWdleHAsIHNvdXJjZSwgZnVuY3Rpb24oYykge25ld0luc2lkZSA9IGM7fSk7CiAgICAgIHZhciBuZXdSZWdleHAgPSB0eXBlLnR5cGUgPT0gIm9wZXJhdG9yIiB8fCB0eXBlLnR5cGUgPT0gImtleXdvcmQgYyIgfHwgdHlwZS50eXBlLm1hdGNoKC9eW1xbe31cKCw7Ol0kLyk7CiAgICAgIGlmIChuZXdSZWdleHAgIT0gcmVnZXhwIHx8IG5ld0luc2lkZSAhPSBpbnNpZGUpCiAgICAgICAgc2V0U3RhdGUoanNUb2tlblN0YXRlKG5ld0luc2lkZSwgbmV3UmVnZXhwKSk7CiAgICAgIHJldHVybiB0eXBlOwogICAgfTsKICB9CgogIC8vIFRoZSB0b2tlbiByZWFkZXIsIGludGVkZWQgdG8gYmUgdXNlZCBieSB0aGUgdG9rZW5pemVyIGZyb20KICAvLyB0b2tlbml6ZS5qcyAodGhyb3VnaCBqc1Rva2VuU3RhdGUpLiBBZHZhbmNlcyB0aGUgc291cmNlIHN0cmVhbQogIC8vIG92ZXIgYSB0b2tlbiwgYW5kIHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHR5cGUgYW5kIHN0eWxlCiAgLy8gb2YgdGhhdCB0b2tlbi4KICBmdW5jdGlvbiBqc1Rva2VuKGluc2lkZSwgcmVnZXhwLCBzb3VyY2UsIHNldEluc2lkZSkgewogICAgZnVuY3Rpb24gcmVhZEhleE51bWJlcigpewogICAgICBzb3VyY2UubmV4dCgpOyAvLyBza2lwIHRoZSAneCcKICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoaXNIZXhEaWdpdCk7CiAgICAgIHJldHVybiB7dHlwZTogIm51bWJlciIsIHN0eWxlOiAianMtYXRvbSJ9OwogICAgfQoKICAgIGZ1bmN0aW9uIHJlYWROdW1iZXIoKSB7CiAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bMC05XS8pOwogICAgICBpZiAoc291cmNlLmVxdWFscygiLiIpKXsKICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bMC05XS8pOwogICAgICB9CiAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCJlIikgfHwgc291cmNlLmVxdWFscygiRSIpKXsKICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCItIikpCiAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bMC05XS8pOwogICAgICB9CiAgICAgIHJldHVybiB7dHlwZTogIm51bWJlciIsIHN0eWxlOiAianMtYXRvbSJ9OwogICAgfQogICAgLy8gUmVhZCBhIHdvcmQsIGxvb2sgaXQgdXAgaW4ga2V5d29yZHMuIElmIG5vdCBmb3VuZCwgaXQgaXMgYQogICAgLy8gdmFyaWFibGUsIG90aGVyd2lzZSBpdCBpcyBhIGtleXdvcmQgb2YgdGhlIHR5cGUgZm91bmQuCiAgICBmdW5jdGlvbiByZWFkV29yZCgpIHsKICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoaXNXb3JkQ2hhcik7CiAgICAgIHZhciB3b3JkID0gc291cmNlLmdldCgpOwogICAgICB2YXIga25vd24gPSBrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSAmJiBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSAmJiBrZXl3b3Jkc1t3b3JkXTsKICAgICAgcmV0dXJuIGtub3duID8ge3R5cGU6IGtub3duLnR5cGUsIHN0eWxlOiBrbm93bi5zdHlsZSwgY29udGVudDogd29yZH0gOgogICAgICB7dHlwZTogInZhcmlhYmxlIiwgc3R5bGU6ICJqcy12YXJpYWJsZSIsIGNvbnRlbnQ6IHdvcmR9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZFJlZ2V4cCgpIHsKICAgICAgbmV4dFVudGlsVW5lc2NhcGVkKHNvdXJjZSwgIi8iKTsKICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1tnaV0vKTsKICAgICAgcmV0dXJuIHt0eXBlOiAicmVnZXhwIiwgc3R5bGU6ICJqcy1zdHJpbmcifTsKICAgIH0KICAgIC8vIE11dGxpLWxpbmUgY29tbWVudHMgYXJlIHRyaWNreS4gV2Ugd2FudCB0byByZXR1cm4gdGhlIG5ld2xpbmVzCiAgICAvLyBlbWJlZGRlZCBpbiB0aGVtIGFzIHJlZ3VsYXIgbmV3bGluZSB0b2tlbnMsIGFuZCB0aGVuIGNvbnRpbnVlCiAgICAvLyByZXR1cm5pbmcgYSBjb21tZW50IHRva2VuIGZvciBldmVyeSBsaW5lIG9mIHRoZSBjb21tZW50LiBTbwogICAgLy8gc29tZSBzdGF0ZSBoYXMgdG8gYmUgc2F2ZWQgKGluc2lkZSkgdG8gaW5kaWNhdGUgd2hldGhlciB3ZSBhcmUKICAgIC8vIGluc2lkZSBhIC8qICovIHNlcXVlbmNlLgogICAgZnVuY3Rpb24gcmVhZE11bHRpbGluZUNvbW1lbnQoc3RhcnQpewogICAgICB2YXIgbmV3SW5zaWRlID0gIi8qIjsKICAgICAgdmFyIG1heWJlRW5kID0gKHN0YXJ0ID09ICIqIik7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5lbmRPZkxpbmUoKSkKICAgICAgICAgIGJyZWFrOwogICAgICAgIHZhciBuZXh0ID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAobmV4dCA9PSAiLyIgJiYgbWF5YmVFbmQpewogICAgICAgICAgbmV3SW5zaWRlID0gbnVsbDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBtYXliZUVuZCA9IChuZXh0ID09ICIqIik7CiAgICAgIH0KICAgICAgc2V0SW5zaWRlKG5ld0luc2lkZSk7CiAgICAgIHJldHVybiB7dHlwZTogImNvbW1lbnQiLCBzdHlsZTogImpzLWNvbW1lbnQifTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRPcGVyYXRvcigpIHsKICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoaXNPcGVyYXRvckNoYXIpOwogICAgICByZXR1cm4ge3R5cGU6ICJvcGVyYXRvciIsIHN0eWxlOiAianMtb3BlcmF0b3IifTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRTdHJpbmcocXVvdGUpIHsKICAgICAgdmFyIGVuZEJhY2tTbGFzaCA9IG5leHRVbnRpbFVuZXNjYXBlZChzb3VyY2UsIHF1b3RlKTsKICAgICAgc2V0SW5zaWRlKGVuZEJhY2tTbGFzaCA/IHF1b3RlIDogbnVsbCk7CiAgICAgIHJldHVybiB7dHlwZTogInN0cmluZyIsIHN0eWxlOiAianMtc3RyaW5nIn07CiAgICB9CgogICAgLy8gRmV0Y2ggdGhlIG5leHQgdG9rZW4uIERpc3BhdGNoZXMgb24gZmlyc3QgY2hhcmFjdGVyIGluIHRoZQogICAgLy8gc3RyZWFtLCBvciBmaXJzdCB0d28gY2hhcmFjdGVycyB3aGVuIHRoZSBmaXJzdCBpcyBhIHNsYXNoLgogICAgaWYgKGluc2lkZSA9PSAiXCIiIHx8IGluc2lkZSA9PSAiJyIpCiAgICAgIHJldHVybiByZWFkU3RyaW5nKGluc2lkZSk7CiAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgaWYgKGluc2lkZSA9PSAiLyoiKQogICAgICByZXR1cm4gcmVhZE11bHRpbGluZUNvbW1lbnQoY2gpOwogICAgZWxzZSBpZiAoY2ggPT0gIlwiIiB8fCBjaCA9PSAiJyIpCiAgICAgIHJldHVybiByZWFkU3RyaW5nKGNoKTsKICAgIC8vIHdpdGggcHVuY3R1YXRpb24sIHRoZSB0eXBlIG9mIHRoZSB0b2tlbiBpcyB0aGUgc3ltYm9sIGl0c2VsZgogICAgZWxzZSBpZiAoL1tcW1xde31cKFwpLDtcOlwuXS8udGVzdChjaCkpCiAgICAgIHJldHVybiB7dHlwZTogY2gsIHN0eWxlOiAianMtcHVuY3R1YXRpb24ifTsKICAgIGVsc2UgaWYgKGNoID09ICIwIiAmJiAoc291cmNlLmVxdWFscygieCIpIHx8IHNvdXJjZS5lcXVhbHMoIlgiKSkpCiAgICAgIHJldHVybiByZWFkSGV4TnVtYmVyKCk7CiAgICBlbHNlIGlmICgvWzAtOV0vLnRlc3QoY2gpKQogICAgICByZXR1cm4gcmVhZE51bWJlcigpOwogICAgZWxzZSBpZiAoY2ggPT0gIi8iKXsKICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoIioiKSkKICAgICAgeyBzb3VyY2UubmV4dCgpOyByZXR1cm4gcmVhZE11bHRpbGluZUNvbW1lbnQoY2gpOyB9CiAgICAgIGVsc2UgaWYgKHNvdXJjZS5lcXVhbHMoIi8iKSkKICAgICAgeyBuZXh0VW50aWxVbmVzY2FwZWQoc291cmNlLCBudWxsKTsgcmV0dXJuIHt0eXBlOiAiY29tbWVudCIsIHN0eWxlOiAianMtY29tbWVudCJ9O30KICAgICAgZWxzZSBpZiAocmVnZXhwKQogICAgICAgIHJldHVybiByZWFkUmVnZXhwKCk7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gcmVhZE9wZXJhdG9yKCk7CiAgICB9CiAgICBlbHNlIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkKICAgICAgcmV0dXJuIHJlYWRPcGVyYXRvcigpOwogICAgZWxzZQogICAgICByZXR1cm4gcmVhZFdvcmQoKTsKICB9CgogIC8vIFRoZSBleHRlcm5hbCBpbnRlcmZhY2UgdG8gdGhlIHRva2VuaXplci4KICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzdGFydFN0YXRlKSB7CiAgICByZXR1cm4gdG9rZW5pemVyKHNvdXJjZSwgc3RhcnRTdGF0ZSB8fCBqc1Rva2VuU3RhdGUoZmFsc2UsIHRydWUpKTsKICB9Owp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/undo.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFN0b3JhZ2UgYW5kIGNvbnRyb2wgZm9yIHVuZG8gaW5mb3JtYXRpb24gd2l0aGluIGEgQ29kZU1pcnJvcgogKiBlZGl0b3IuICdXaHkgb24gZWFydGggaXMgc3VjaCBhIGNvbXBsaWNhdGVkIG1lc3MgcmVxdWlyZWQgZm9yCiAqIHRoYXQ/JywgSSBoZWFyIHlvdSBhc2suIFRoZSBnb2FsLCBpbiBpbXBsZW1lbnRpbmcgdGhpcywgd2FzIHRvIG1ha2UKICogdGhlIGNvbXBsZXhpdHkgb2Ygc3RvcmluZyBhbmQgcmV2ZXJ0aW5nIHVuZG8gaW5mb3JtYXRpb24gZGVwZW5kCiAqIG9ubHkgb24gdGhlIHNpemUgb2YgdGhlIGVkaXRlZCBvciByZXN0b3JlZCBjb250ZW50LCBub3Qgb24gdGhlIHNpemUKICogb2YgdGhlIHdob2xlIGRvY3VtZW50LiBUaGlzIG1ha2VzIGl0IG5lY2Vzc2FyeSB0byB1c2UgYSBraW5kIG9mCiAqICdkaWZmJyBzeXN0ZW0sIHdoaWNoLCB3aGVuIGFwcGxpZWQgdG8gYSBET00gdHJlZSwgY2F1c2VzIHNvbWUKICogY29tcGxleGl0eSBhbmQgaGFja2VyeS4KICoKICogSW4gc2hvcnQsIHRoZSBlZGl0b3IgJ3RvdWNoZXMnIEJSIGVsZW1lbnRzIGFzIGl0IHBhcnNlcyB0aGVtLCBhbmQKICogdGhlIEhpc3Rvcnkgc3RvcmVzIHRoZXNlLiBXaGVuIG5vdGhpbmcgaXMgdG91Y2hlZCBpbiBjb21taXREZWxheQogKiBtaWxsaXNlY29uZHMsIHRoZSBjaGFuZ2VzIGFyZSBjb21taXR0ZWQ6IEl0IGdvZXMgb3ZlciBhbGwgdG91Y2hlZAogKiBub2RlcywgdGhyb3dzIG91dCB0aGUgb25lcyB0aGF0IGRpZCBub3QgY2hhbmdlIHNpbmNlIGxhc3QgY29tbWl0IG9yCiAqIGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50LCBhbmQgYXNzZW1ibGVzIHRoZSByZXN0IGludG8gemVybyBvcgogKiBtb3JlICdjaGFpbnMnIC0tIGFycmF5cyBvZiBhZGphY2VudCBsaW5lcy4gTGlua3MgYmFjayB0byB0aGVzZQogKiBjaGFpbnMgYXJlIGFkZGVkIHRvIHRoZSBCUiBub2Rlcywgd2hpbGUgdGhlIGNoYWluIHRoYXQgcHJldmlvdXNseQogKiBzcGFubmVkIHRoZXNlIG5vZGVzIGlzIGFkZGVkIHRvIHRoZSB1bmRvIGhpc3RvcnkuIFVuZG9pbmcgYSBjaGFuZ2UKICogbWVhbnMgdGFraW5nIHN1Y2ggYSBjaGFpbiBvZmYgdGhlIHVuZG8gaGlzdG9yeSwgcmVzdG9yaW5nIGl0cwogKiBjb250ZW50ICh0ZXh0IGlzIHNhdmVkIHBlciBsaW5lKSBhbmQgbGlua2luZyBpdCBiYWNrIGludG8gdGhlCiAqIGRvY3VtZW50LgogKi8KCi8vIEEgaGlzdG9yeSBvYmplY3QgbmVlZHMgdG8ga25vdyBhYm91dCB0aGUgRE9NIGNvbnRhaW5lciBob2xkaW5nIHRoZQovLyBkb2N1bWVudCwgdGhlIG1heGltdW0gYW1vdW50IG9mIHVuZG8gbGV2ZWxzIGl0IHNob3VsZCBzdG9yZSwgdGhlCi8vIGRlbGF5IChvZiBubyBpbnB1dCkgYWZ0ZXIgd2hpY2ggaXQgY29tbWl0cyBhIHNldCBvZiBjaGFuZ2VzLCBhbmQsCi8vIHVuZm9ydHVuYXRlbHksIHRoZSAncGFyZW50JyB3aW5kb3cgLS0gYSB3aW5kb3cgdGhhdCBpcyBub3QgaW4KLy8gZGVzaWduTW9kZSwgYW5kIG9uIHdoaWNoIHNldFRpbWVvdXQgd29ya3MgaW4gZXZlcnkgYnJvd3Nlci4KZnVuY3Rpb24gSGlzdG9yeShjb250YWluZXIsIG1heERlcHRoLCBjb21taXREZWxheSwgZWRpdG9yKSB7CiAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CiAgdGhpcy5tYXhEZXB0aCA9IG1heERlcHRoOyB0aGlzLmNvbW1pdERlbGF5ID0gY29tbWl0RGVsYXk7CiAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7IHRoaXMucGFyZW50ID0gZWRpdG9yLnBhcmVudDsKICAvLyBUaGlzIGxpbmUgb2JqZWN0IHJlcHJlc2VudHMgdGhlIGluaXRpYWwsIGVtcHR5IGVkaXRvci4KICB2YXIgaW5pdGlhbCA9IHt0ZXh0OiAiIiwgZnJvbTogbnVsbCwgdG86IG51bGx9OwogIC8vIEFzIHRoZSBib3JkZXJzIGJldHdlZW4gbGluZXMgYXJlIHJlcHJlc2VudGVkIGJ5IEJSIGVsZW1lbnRzLCB0aGUKICAvLyBzdGFydCBvZiB0aGUgZmlyc3QgbGluZSBhbmQgdGhlIGVuZCBvZiB0aGUgbGFzdCBvbmUgYXJlCiAgLy8gcmVwcmVzZW50ZWQgYnkgbnVsbC4gU2luY2UgeW91IGNhbiBub3Qgc3RvcmUgYW55IHByb3BlcnRpZXMKICAvLyAobGlua3MgdG8gbGluZSBvYmplY3RzKSBpbiBudWxsLCB0aGVzZSBwcm9wZXJ0aWVzIGFyZSB1c2VkIGluCiAgLy8gdGhvc2UgY2FzZXMuCiAgdGhpcy5maXJzdCA9IGluaXRpYWw7IHRoaXMubGFzdCA9IGluaXRpYWw7CiAgLy8gU2ltaWxhcmx5LCBhICdoaXN0b3J5VG91Y2hlZCcgcHJvcGVydHkgaXMgYWRkZWQgdG8gdGhlIEJSIGluCiAgLy8gZnJvbnQgb2YgbGluZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiB0b3VjaGVkLCBhbmQgJ2ZpcnN0VG91Y2hlZCcKICAvLyBpcyB1c2VkIGZvciB0aGUgZmlyc3QgbGluZS4KICB0aGlzLmZpcnN0VG91Y2hlZCA9IGZhbHNlOwogIC8vIEhpc3RvcnkgaXMgdGhlIHNldCBvZiBjb21taXR0ZWQgY2hhbmdlcywgdG91Y2hlZCBpcyB0aGUgc2V0IG9mCiAgLy8gbm9kZXMgdG91Y2hlZCBzaW5jZSB0aGUgbGFzdCBjb21taXQuCiAgdGhpcy5oaXN0b3J5ID0gW107IHRoaXMucmVkb0hpc3RvcnkgPSBbXTsgdGhpcy50b3VjaGVkID0gW107Cn0KCkhpc3RvcnkucHJvdG90eXBlID0gewogIC8vIFNjaGVkdWxlIGEgY29tbWl0IChpZiBubyBvdGhlciB0b3VjaGVzIGNvbWUgaW4gZm9yIGNvbW1pdERlbGF5CiAgLy8gbWlsbGlzZWNvbmRzKS4KICBzY2hlZHVsZUNvbW1pdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB0aGlzLnBhcmVudC5jbGVhclRpbWVvdXQodGhpcy5jb21taXRUaW1lb3V0KTsKICAgIHRoaXMuY29tbWl0VGltZW91dCA9IHRoaXMucGFyZW50LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtzZWxmLnRyeUNvbW1pdCgpO30sIHRoaXMuY29tbWl0RGVsYXkpOwogIH0sCgogIC8vIE1hcmsgYSBub2RlIGFzIHRvdWNoZWQuIE51bGwgaXMgYSB2YWxpZCBhcmd1bWVudC4KICB0b3VjaDogZnVuY3Rpb24obm9kZSkgewogICAgdGhpcy5zZXRUb3VjaGVkKG5vZGUpOwogICAgdGhpcy5zY2hlZHVsZUNvbW1pdCgpOwogIH0sCgogIC8vIFVuZG8gdGhlIGxhc3QgY2hhbmdlLgogIHVuZG86IGZ1bmN0aW9uKCkgewogICAgLy8gTWFrZSBzdXJlIHBlbmRpbmcgY2hhbmdlcyBoYXZlIGJlZW4gY29tbWl0dGVkLgogICAgdGhpcy5jb21taXQoKTsKCiAgICBpZiAodGhpcy5oaXN0b3J5Lmxlbmd0aCkgewogICAgICAvLyBUYWtlIHRoZSB0b3AgZGlmZiBmcm9tIHRoZSBoaXN0b3J5LCBhcHBseSBpdCwgYW5kIHN0b3JlIGl0cwogICAgICAvLyBzaGFkb3cgaW4gdGhlIHJlZG8gaGlzdG9yeS4KICAgICAgdmFyIGl0ZW0gPSB0aGlzLmhpc3RvcnkucG9wKCk7CiAgICAgIHRoaXMucmVkb0hpc3RvcnkucHVzaCh0aGlzLnVwZGF0ZVRvKGl0ZW0sICJhcHBseUNoYWluIikpOwogICAgICB0aGlzLm5vdGlmeUVudmlyb25tZW50KCk7CiAgICAgIHJldHVybiB0aGlzLmNoYWluTm9kZShpdGVtKTsKICAgIH0KICB9LAoKICAvLyBSZWRvIHRoZSBsYXN0IHVuZG9uZSBjaGFuZ2UuCiAgcmVkbzogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmNvbW1pdCgpOwogICAgaWYgKHRoaXMucmVkb0hpc3RvcnkubGVuZ3RoKSB7CiAgICAgIC8vIFRoZSBpbnZlcnNlIG9mIHVuZG8sIGJhc2ljYWxseS4KICAgICAgdmFyIGl0ZW0gPSB0aGlzLnJlZG9IaXN0b3J5LnBvcCgpOwogICAgICB0aGlzLmFkZFVuZG9MZXZlbCh0aGlzLnVwZGF0ZVRvKGl0ZW0sICJhcHBseUNoYWluIikpOwogICAgICB0aGlzLm5vdGlmeUVudmlyb25tZW50KCk7CiAgICAgIHJldHVybiB0aGlzLmNoYWluTm9kZShpdGVtKTsKICAgIH0KICB9LAoKICBjbGVhcjogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmhpc3RvcnkgPSBbXTsKICAgIHRoaXMucmVkb0hpc3RvcnkgPSBbXTsKICB9LAoKICAvLyBBc2sgZm9yIHRoZSBzaXplIG9mIHRoZSB1bi9yZWRvIGhpc3Rvcmllcy4KICBoaXN0b3J5U2l6ZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4ge3VuZG86IHRoaXMuaGlzdG9yeS5sZW5ndGgsIHJlZG86IHRoaXMucmVkb0hpc3RvcnkubGVuZ3RofTsKICB9LAoKICAvLyBQdXNoIGEgY2hhbmdlc2V0IGludG8gdGhlIGRvY3VtZW50LgogIHB1c2g6IGZ1bmN0aW9uKGZyb20sIHRvLCBsaW5lcykgewogICAgdmFyIGNoYWluID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBlbmQgPSAoaSA9PSBsaW5lcy5sZW5ndGggLSAxKSA/IHRvIDogdGhpcy5jb250YWluZXIub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJCUiIpOwogICAgICBjaGFpbi5wdXNoKHtmcm9tOiBmcm9tLCB0bzogZW5kLCB0ZXh0OiBjbGVhblRleHQobGluZXNbaV0pfSk7CiAgICAgIGZyb20gPSBlbmQ7CiAgICB9CiAgICB0aGlzLnB1c2hDaGFpbnMoW2NoYWluXSwgZnJvbSA9PSBudWxsICYmIHRvID09IG51bGwpOwogICAgdGhpcy5ub3RpZnlFbnZpcm9ubWVudCgpOwogIH0sCgogIHB1c2hDaGFpbnM6IGZ1bmN0aW9uKGNoYWlucywgZG9Ob3RIaWdobGlnaHQpIHsKICAgIHRoaXMuY29tbWl0KGRvTm90SGlnaGxpZ2h0KTsKICAgIHRoaXMuYWRkVW5kb0xldmVsKHRoaXMudXBkYXRlVG8oY2hhaW5zLCAiYXBwbHlDaGFpbiIpKTsKICAgIHRoaXMucmVkb0hpc3RvcnkgPSBbXTsKICB9LAoKICAvLyBSZXRyaWV2ZSBhIERPTSBub2RlIGZyb20gYSBjaGFpbiAoZm9yIHNjcm9sbGluZyB0byBpdCBhZnRlciB1bmRvL3JlZG8pLgogIGNoYWluTm9kZTogZnVuY3Rpb24oY2hhaW5zKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYWlucy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgc3RhcnQgPSBjaGFpbnNbaV1bMF0sIG5vZGUgPSBzdGFydCAmJiAoc3RhcnQuZnJvbSB8fCBzdGFydC50byk7CiAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZTsKICAgIH0KICB9LAoKICAvLyBDbGVhciB0aGUgdW5kbyBoaXN0b3J5LCBtYWtlIHRoZSBjdXJyZW50IGRvY3VtZW50IHRoZSBzdGFydAogIC8vIHBvc2l0aW9uLgogIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuaGlzdG9yeSA9IFtdOyB0aGlzLnJlZG9IaXN0b3J5ID0gW107CiAgfSwKCiAgdGV4dEFmdGVyOiBmdW5jdGlvbihicikgewogICAgcmV0dXJuIHRoaXMuYWZ0ZXIoYnIpLnRleHQ7CiAgfSwKCiAgbm9kZUFmdGVyOiBmdW5jdGlvbihicikgewogICAgcmV0dXJuIHRoaXMuYWZ0ZXIoYnIpLnRvOwogIH0sCgogIG5vZGVCZWZvcmU6IGZ1bmN0aW9uKGJyKSB7CiAgICByZXR1cm4gdGhpcy5iZWZvcmUoYnIpLmZyb207CiAgfSwKCiAgLy8gQ29tbWl0IHVubGVzcyB0aGVyZSBhcmUgcGVuZGluZyBkaXJ0eSBub2Rlcy4KICB0cnlDb21taXQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKCF3aW5kb3cuSGlzdG9yeSkgcmV0dXJuOyAvLyBTdG9wIHdoZW4gZnJhbWUgaGFzIGJlZW4gdW5sb2FkZWQKICAgIGlmICh0aGlzLmVkaXRvci5oaWdobGlnaHREaXJ0eSgpKSB0aGlzLmNvbW1pdCh0cnVlKTsKICAgIGVsc2UgdGhpcy5zY2hlZHVsZUNvbW1pdCgpOwogIH0sCgogIC8vIENoZWNrIHdoZXRoZXIgdGhlIHRvdWNoZWQgbm9kZXMgaG9sZCBhbnkgY2hhbmdlcywgaWYgc28sIGNvbW1pdAogIC8vIHRoZW0uCiAgY29tbWl0OiBmdW5jdGlvbihkb05vdEhpZ2hsaWdodCkgewogICAgdGhpcy5wYXJlbnQuY2xlYXJUaW1lb3V0KHRoaXMuY29tbWl0VGltZW91dCk7CiAgICAvLyBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHBlbmRpbmcgZGlydHkgbm9kZXMuCiAgICBpZiAoIWRvTm90SGlnaGxpZ2h0KSB0aGlzLmVkaXRvci5oaWdobGlnaHREaXJ0eSh0cnVlKTsKICAgIC8vIEJ1aWxkIHNldCBvZiBjaGFpbnMuCiAgICB2YXIgY2hhaW5zID0gdGhpcy50b3VjaGVkQ2hhaW5zKCksIHNlbGYgPSB0aGlzOwoKICAgIGlmIChjaGFpbnMubGVuZ3RoKSB7CiAgICAgIHRoaXMuYWRkVW5kb0xldmVsKHRoaXMudXBkYXRlVG8oY2hhaW5zLCAibGlua0NoYWluIikpOwogICAgICB0aGlzLnJlZG9IaXN0b3J5ID0gW107CiAgICAgIHRoaXMubm90aWZ5RW52aXJvbm1lbnQoKTsKICAgIH0KICB9LAoKICAvLyBbIGVuZCBvZiBwdWJsaWMgaW50ZXJmYWNlIF0KCiAgLy8gVXBkYXRlIHRoZSBkb2N1bWVudCB3aXRoIGEgZ2l2ZW4gc2V0IG9mIGNoYWlucywgcmV0dXJuIGl0cwogIC8vIHNoYWRvdy4gdXBkYXRlRnVuYyBzaG91bGQgYmUgImFwcGx5Q2hhaW4iIG9yICJsaW5rQ2hhaW4iLiBJbiB0aGUKICAvLyBzZWNvbmQgY2FzZSwgdGhlIGNoYWlucyBhcmUgdGFrZW4gdG8gY29ycmVzcG9uZCB0aGUgdGhlIGN1cnJlbnQKICAvLyBkb2N1bWVudCwgYW5kIG9ubHkgdGhlIHN0YXRlIG9mIHRoZSBsaW5lIGRhdGEgaXMgdXBkYXRlZC4gSW4gdGhlCiAgLy8gZmlyc3QgY2FzZSwgdGhlIGNvbnRlbnQgb2YgdGhlIGNoYWlucyBpcyBhbHNvIHB1c2hlZCBpaW50byB0aGUKICAvLyBkb2N1bWVudC4KICB1cGRhdGVUbzogZnVuY3Rpb24oY2hhaW5zLCB1cGRhdGVGdW5jKSB7CiAgICB2YXIgc2hhZG93cyA9IFtdLCBkaXJ0eSA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFpbnMubGVuZ3RoOyBpKyspIHsKICAgICAgc2hhZG93cy5wdXNoKHRoaXMuc2hhZG93Q2hhaW4oY2hhaW5zW2ldKSk7CiAgICAgIGRpcnR5LnB1c2godGhpc1t1cGRhdGVGdW5jXShjaGFpbnNbaV0pKTsKICAgIH0KICAgIGlmICh1cGRhdGVGdW5jID09ICJhcHBseUNoYWluIikKICAgICAgdGhpcy5ub3RpZnlEaXJ0eShkaXJ0eSk7CiAgICByZXR1cm4gc2hhZG93czsKICB9LAoKICAvLyBOb3RpZnkgdGhlIGVkaXRvciB0aGF0IHNvbWUgbm9kZXMgaGF2ZSBjaGFuZ2VkLgogIG5vdGlmeURpcnR5OiBmdW5jdGlvbihub2RlcykgewogICAgZm9yRWFjaChub2RlcywgbWV0aG9kKHRoaXMuZWRpdG9yLCAiYWRkRGlydHlOb2RlIikpCiAgICB0aGlzLmVkaXRvci5zY2hlZHVsZUhpZ2hsaWdodCgpOwogIH0sCgogIG5vdGlmeUVudmlyb25tZW50OiBmdW5jdGlvbigpIHsKICAgIC8vIFVzZWQgYnkgdGhlIGxpbmUtd3JhcHBpbmcgbGluZS1udW1iZXJpbmcgY29kZS4KICAgIGlmICh3aW5kb3cuZnJhbWVFbGVtZW50ICYmIHdpbmRvdy5mcmFtZUVsZW1lbnQuQ29kZU1pcnJvci51cGRhdGVOdW1iZXJzKQogICAgICB3aW5kb3cuZnJhbWVFbGVtZW50LkNvZGVNaXJyb3IudXBkYXRlTnVtYmVycygpOwogICAgaWYgKHRoaXMub25DaGFuZ2UpIHRoaXMub25DaGFuZ2UoKTsKICB9LAoKICAvLyBMaW5rIGEgY2hhaW4gaW50byB0aGUgRE9NIG5vZGVzIChvciB0aGUgZmlyc3QvbGFzdCBsaW5rcyBmb3IgbnVsbAogIC8vIG5vZGVzKS4KICBsaW5rQ2hhaW46IGZ1bmN0aW9uKGNoYWluKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBsaW5lID0gY2hhaW5baV07CiAgICAgIGlmIChsaW5lLmZyb20pIGxpbmUuZnJvbS5oaXN0b3J5QWZ0ZXIgPSBsaW5lOwogICAgICBlbHNlIHRoaXMuZmlyc3QgPSBsaW5lOwogICAgICBpZiAobGluZS50bykgbGluZS50by5oaXN0b3J5QmVmb3JlID0gbGluZTsKICAgICAgZWxzZSB0aGlzLmxhc3QgPSBsaW5lOwogICAgfQogIH0sCgogIC8vIEdldCB0aGUgbGluZSBvYmplY3QgYWZ0ZXIvYmVmb3JlIGEgZ2l2ZW4gbm9kZS4KICBhZnRlcjogZnVuY3Rpb24obm9kZSkgewogICAgcmV0dXJuIG5vZGUgPyBub2RlLmhpc3RvcnlBZnRlciA6IHRoaXMuZmlyc3Q7CiAgfSwKICBiZWZvcmU6IGZ1bmN0aW9uKG5vZGUpIHsKICAgIHJldHVybiBub2RlID8gbm9kZS5oaXN0b3J5QmVmb3JlIDogdGhpcy5sYXN0OwogIH0sCgogIC8vIE1hcmsgYSBub2RlIGFzIHRvdWNoZWQgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gbWFya2VkLgogIHNldFRvdWNoZWQ6IGZ1bmN0aW9uKG5vZGUpIHsKICAgIGlmIChub2RlKSB7CiAgICAgIGlmICghbm9kZS5oaXN0b3J5VG91Y2hlZCkgewogICAgICAgIHRoaXMudG91Y2hlZC5wdXNoKG5vZGUpOwogICAgICAgIG5vZGUuaGlzdG9yeVRvdWNoZWQgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgdGhpcy5maXJzdFRvdWNoZWQgPSB0cnVlOwogICAgfQogIH0sCgogIC8vIFN0b3JlIGEgbmV3IHNldCBvZiB1bmRvIGluZm8sIHRocm93IGF3YXkgaW5mbyBpZiB0aGVyZSBpcyBtb3JlIG9mCiAgLy8gaXQgdGhhbiBhbGxvd2VkLgogIGFkZFVuZG9MZXZlbDogZnVuY3Rpb24oZGlmZnMpIHsKICAgIHRoaXMuaGlzdG9yeS5wdXNoKGRpZmZzKTsKICAgIGlmICh0aGlzLmhpc3RvcnkubGVuZ3RoID4gdGhpcy5tYXhEZXB0aCkKICAgICAgdGhpcy5oaXN0b3J5LnNoaWZ0KCk7CiAgfSwKCiAgLy8gQnVpbGQgY2hhaW5zIGZyb20gYSBzZXQgb2YgdG91Y2hlZCBub2Rlcy4KICB0b3VjaGVkQ2hhaW5zOiBmdW5jdGlvbigpIHsKICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAvLyBUaGUgdGVtcCBzeXN0ZW0gaXMgYSBjcnVtbXkgaGFjayB0byBzcGVlZCB1cCBkZXRlcm1pbmluZwogICAgLy8gd2hldGhlciBhIChjdXJyZW50bHkgdG91Y2hlZCkgbm9kZSBoYXMgYSBsaW5lIG9iamVjdCBhc3NvY2lhdGVkCiAgICAvLyB3aXRoIGl0LiBudWxsVGVtcCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBvYmplY3QgZm9yIHRoZSBmaXJzdAogICAgLy8gbGluZSwgb3RoZXIgbm9kZXMgZ2V0IGl0IHN0b3JlZCBpbiB0aGVpciBoaXN0b3J5VGVtcCBwcm9wZXJ0eS4KICAgIHZhciBudWxsVGVtcCA9IG51bGw7CiAgICBmdW5jdGlvbiB0ZW1wKG5vZGUpIHtyZXR1cm4gbm9kZSA/IG5vZGUuaGlzdG9yeVRlbXAgOiBudWxsVGVtcDt9CiAgICBmdW5jdGlvbiBzZXRUZW1wKG5vZGUsIGxpbmUpIHsKICAgICAgaWYgKG5vZGUpIG5vZGUuaGlzdG9yeVRlbXAgPSBsaW5lOwogICAgICBlbHNlIG51bGxUZW1wID0gbGluZTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZExpbmUobm9kZSkgewogICAgICB2YXIgdGV4dCA9IFtdOwogICAgICBmb3IgKHZhciBjdXIgPSBub2RlID8gbm9kZS5uZXh0U2libGluZyA6IHNlbGYuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgICAgICAgY3VyICYmICFpc0JSKGN1cik7IGN1ciA9IGN1ci5uZXh0U2libGluZykKICAgICAgICBpZiAoY3VyLmN1cnJlbnRUZXh0KSB0ZXh0LnB1c2goY3VyLmN1cnJlbnRUZXh0KTsKICAgICAgcmV0dXJuIHtmcm9tOiBub2RlLCB0bzogY3VyLCB0ZXh0OiBjbGVhblRleHQodGV4dC5qb2luKCIiKSl9OwogICAgfQoKICAgIC8vIEZpbHRlciBvdXQgdW5jaGFuZ2VkIGxpbmVzIGFuZCBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlCiAgICAvLyBkb2N1bWVudC4gQnVpbGQgdXAgbGluZSBvYmplY3RzIGZvciByZW1haW5pbmcgbm9kZXMuCiAgICB2YXIgbGluZXMgPSBbXTsKICAgIGlmIChzZWxmLmZpcnN0VG91Y2hlZCkgc2VsZi50b3VjaGVkLnB1c2gobnVsbCk7CiAgICBmb3JFYWNoKHNlbGYudG91Y2hlZCwgZnVuY3Rpb24obm9kZSkgewogICAgICBpZiAobm9kZSAmJiBub2RlLnBhcmVudE5vZGUgIT0gc2VsZi5jb250YWluZXIpIHJldHVybjsKCiAgICAgIGlmIChub2RlKSBub2RlLmhpc3RvcnlUb3VjaGVkID0gZmFsc2U7CiAgICAgIGVsc2Ugc2VsZi5maXJzdFRvdWNoZWQgPSBmYWxzZTsKCiAgICAgIHZhciBsaW5lID0gYnVpbGRMaW5lKG5vZGUpLCBzaGFkb3cgPSBzZWxmLmFmdGVyKG5vZGUpOwogICAgICBpZiAoIXNoYWRvdyB8fCBzaGFkb3cudGV4dCAhPSBsaW5lLnRleHQgfHwgc2hhZG93LnRvICE9IGxpbmUudG8pIHsKICAgICAgICBsaW5lcy5wdXNoKGxpbmUpOwogICAgICAgIHNldFRlbXAobm9kZSwgbGluZSk7CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIEdldCB0aGUgQlIgZWxlbWVudCBhZnRlci9iZWZvcmUgdGhlIGdpdmVuIG5vZGUuCiAgICBmdW5jdGlvbiBuZXh0QlIobm9kZSwgZGlyKSB7CiAgICAgIHZhciBsaW5rID0gZGlyICsgIlNpYmxpbmciLCBzZWFyY2ggPSBub2RlW2xpbmtdOwogICAgICB3aGlsZSAoc2VhcmNoICYmICFpc0JSKHNlYXJjaCkpCiAgICAgICAgc2VhcmNoID0gc2VhcmNoW2xpbmtdOwogICAgICByZXR1cm4gc2VhcmNoOwogICAgfQoKICAgIC8vIEFzc2VtYmxlIGxpbmUgb2JqZWN0cyBpbnRvIGNoYWlucyBieSBzY2FubmluZyB0aGUgRE9NIHRyZWUKICAgIC8vIGFyb3VuZCB0aGVtLgogICAgdmFyIGNoYWlucyA9IFtdOyBzZWxmLnRvdWNoZWQgPSBbXTsKICAgIGZvckVhY2gobGluZXMsIGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgbWFrZXMgdGhlIGxvb3Agc2tpcCBsaW5lIG9iamVjdHMgdGhhdCBoYXZlCiAgICAgIC8vIGJlZW4gcHVsbGVkIGludG8gY2hhaW5zIGJ5IGxpbmVzIGJlZm9yZSB0aGVtLgogICAgICBpZiAoIXRlbXAobGluZS5mcm9tKSkgcmV0dXJuOwoKICAgICAgdmFyIGNoYWluID0gW10sIGN1ck5vZGUgPSBsaW5lLmZyb20sIHNhZmUgPSB0cnVlOwogICAgICAvLyBQdXQgYW55IGxpbmUgb2JqZWN0cyAocmVmZXJyZWQgdG8gYnkgdGVtcCBpbmZvKSBiZWZvcmUgdGhpcwogICAgICAvLyBvbmUgb24gdGhlIGZyb250IG9mIHRoZSBhcnJheS4KICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICB2YXIgY3VyTGluZSA9IHRlbXAoY3VyTm9kZSk7CiAgICAgICAgaWYgKCFjdXJMaW5lKSB7CiAgICAgICAgICBpZiAoc2FmZSkgYnJlYWs7CiAgICAgICAgICBlbHNlIGN1ckxpbmUgPSBidWlsZExpbmUoY3VyTm9kZSk7CiAgICAgICAgfQogICAgICAgIGNoYWluLnVuc2hpZnQoY3VyTGluZSk7CiAgICAgICAgc2V0VGVtcChjdXJOb2RlLCBudWxsKTsKICAgICAgICBpZiAoIWN1ck5vZGUpIGJyZWFrOwogICAgICAgIHNhZmUgPSBzZWxmLmFmdGVyKGN1ck5vZGUpOwogICAgICAgIGN1ck5vZGUgPSBuZXh0QlIoY3VyTm9kZSwgInByZXZpb3VzIik7CiAgICAgIH0KICAgICAgY3VyTm9kZSA9IGxpbmUudG87IHNhZmUgPSBzZWxmLmJlZm9yZShsaW5lLmZyb20pOwogICAgICAvLyBBZGQgbGluZXMgYWZ0ZXIgdGhpcyBvbmUgYXQgZW5kIG9mIGFycmF5LgogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGlmICghY3VyTm9kZSkgYnJlYWs7CiAgICAgICAgdmFyIGN1ckxpbmUgPSB0ZW1wKGN1ck5vZGUpOwogICAgICAgIGlmICghY3VyTGluZSkgewogICAgICAgICAgaWYgKHNhZmUpIGJyZWFrOwogICAgICAgICAgZWxzZSBjdXJMaW5lID0gYnVpbGRMaW5lKGN1ck5vZGUpOwogICAgICAgIH0KICAgICAgICBjaGFpbi5wdXNoKGN1ckxpbmUpOwogICAgICAgIHNldFRlbXAoY3VyTm9kZSwgbnVsbCk7CiAgICAgICAgc2FmZSA9IHNlbGYuYmVmb3JlKGN1ck5vZGUpOwogICAgICAgIGN1ck5vZGUgPSBuZXh0QlIoY3VyTm9kZSwgIm5leHQiKTsKICAgICAgfQogICAgICBjaGFpbnMucHVzaChjaGFpbik7CiAgICB9KTsKCiAgICByZXR1cm4gY2hhaW5zOwogIH0sCgogIC8vIEZpbmQgdGhlICdzaGFkb3cnIG9mIGEgZ2l2ZW4gY2hhaW4gYnkgZm9sbG93aW5nIHRoZSBsaW5rcyBpbiB0aGUKICAvLyBET00gbm9kZXMgYXQgaXRzIHN0YXJ0IGFuZCBlbmQuCiAgc2hhZG93Q2hhaW46IGZ1bmN0aW9uKGNoYWluKSB7CiAgICB2YXIgc2hhZG93cyA9IFtdLCBuZXh0ID0gdGhpcy5hZnRlcihjaGFpblswXS5mcm9tKSwgZW5kID0gY2hhaW5bY2hhaW4ubGVuZ3RoIC0gMV0udG87CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBzaGFkb3dzLnB1c2gobmV4dCk7CiAgICAgIHZhciBuZXh0Tm9kZSA9IG5leHQudG87CiAgICAgIGlmICghbmV4dE5vZGUgfHwgbmV4dE5vZGUgPT0gZW5kKQogICAgICAgIGJyZWFrOwogICAgICBlbHNlCiAgICAgICAgbmV4dCA9IG5leHROb2RlLmhpc3RvcnlBZnRlciB8fCB0aGlzLmJlZm9yZShlbmQpOwogICAgICAvLyAoVGhlIHRoaXMuYmVmb3JlKGVuZCkgaXMgYSBoYWNrIC0tIEZGIHNvbWV0aW1lcyByZW1vdmVzCiAgICAgIC8vIHByb3BlcnRpZXMgZnJvbSBCUiBub2RlcywgaW4gd2hpY2ggY2FzZSB0aGUgYmVzdCB3ZSBjYW4gaG9wZQogICAgICAvLyBmb3IgaXMgdG8gbm90IGJyZWFrLikKICAgIH0KICAgIHJldHVybiBzaGFkb3dzOwogIH0sCgogIC8vIFVwZGF0ZSB0aGUgRE9NIHRyZWUgdG8gY29udGFpbiB0aGUgbGluZXMgc3BlY2lmaWVkIGluIGEgZ2l2ZW4KICAvLyBjaGFpbiwgbGluayB0aGlzIGNoYWluIGludG8gdGhlIERPTSBub2Rlcy4KICBhcHBseUNoYWluOiBmdW5jdGlvbihjaGFpbikgewogICAgLy8gU29tZSBhdHRlbXB0IGlzIG1hZGUgdG8gcHJldmVudCB0aGUgY3Vyc29yIGZyb20ganVtcGluZwogICAgLy8gcmFuZG9tbHkgd2hlbiBhbiB1bmRvIG9yIHJlZG8gaGFwcGVucy4gSXQgc3RpbGwgYmVoYXZlcyBhIGJpdAogICAgLy8gc3RyYW5nZSBzb21ldGltZXMuCiAgICB2YXIgY3Vyc29yID0gc2VsZWN0LmN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwgZmFsc2UpLCBzZWxmID0gdGhpczsKCiAgICAvLyBSZW1vdmUgYWxsIG5vZGVzIGluIHRoZSBET00gdHJlZSBiZXR3ZWVuIGZyb20gYW5kIHRvIChudWxsIGZvcgogICAgLy8gc3RhcnQvZW5kIG9mIGNvbnRhaW5lcikuCiAgICBmdW5jdGlvbiByZW1vdmVSYW5nZShmcm9tLCB0bykgewogICAgICB2YXIgcG9zID0gZnJvbSA/IGZyb20ubmV4dFNpYmxpbmcgOiBzZWxmLmNvbnRhaW5lci5maXJzdENoaWxkOwogICAgICB3aGlsZSAocG9zICE9IHRvKSB7CiAgICAgICAgdmFyIHRlbXAgPSBwb3MubmV4dFNpYmxpbmc7CiAgICAgICAgcmVtb3ZlRWxlbWVudChwb3MpOwogICAgICAgIHBvcyA9IHRlbXA7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgc3RhcnQgPSBjaGFpblswXS5mcm9tLCBlbmQgPSBjaGFpbltjaGFpbi5sZW5ndGggLSAxXS50bzsKICAgIC8vIENsZWFyIHRoZSBzcGFjZSB3aGVyZSB0aGlzIGNoYW5nZSBoYXMgdG8gYmUgbWFkZS4KICAgIHJlbW92ZVJhbmdlKHN0YXJ0LCBlbmQpOwoKICAgIC8vIEluc2VydCB0aGUgY29udGVudCBzcGVjaWZpZWQgYnkgdGhlIGNoYWluIGludG8gdGhlIERPTSB0cmVlLgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFpbi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgbGluZSA9IGNoYWluW2ldOwogICAgICAvLyBUaGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgc3BhY2UgYXJlIGFscmVhZHkgY29ycmVjdCwgYnV0IEJSCiAgICAgIC8vIHRhZ3MgaW5zaWRlIGl0IGhhdmUgdG8gYmUgcHV0IGJhY2suCiAgICAgIGlmIChpID4gMCkKICAgICAgICBzZWxmLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUobGluZS5mcm9tLCBlbmQpOwoKICAgICAgLy8gQWRkIHRoZSB0ZXh0LgogICAgICB2YXIgbm9kZSA9IG1ha2VQYXJ0U3BhbihmaXhTcGFjZXMobGluZS50ZXh0KSwgdGhpcy5jb250YWluZXIub3duZXJEb2N1bWVudCk7CiAgICAgIHNlbGYuY29udGFpbmVyLmluc2VydEJlZm9yZShub2RlLCBlbmQpOwogICAgICAvLyBTZWUgaWYgdGhlIGN1cnNvciB3YXMgb24gdGhpcyBsaW5lLiBQdXQgaXQgYmFjaywgYWRqdXN0aW5nCiAgICAgIC8vIGZvciBjaGFuZ2VkIGxpbmUgbGVuZ3RoLCBpZiBpdCB3YXMuCiAgICAgIGlmIChjdXJzb3IgJiYgY3Vyc29yLm5vZGUgPT0gbGluZS5mcm9tKSB7CiAgICAgICAgdmFyIGN1cnNvcmRpZmYgPSAwOwogICAgICAgIHZhciBwcmV2ID0gdGhpcy5hZnRlcihsaW5lLmZyb20pOwogICAgICAgIGlmIChwcmV2ICYmIGkgPT0gY2hhaW4ubGVuZ3RoIC0gMSkgewogICAgICAgICAgLy8gT25seSBhZGp1c3QgaWYgdGhlIGN1cnNvciBpcyBhZnRlciB0aGUgdW5jaGFuZ2VkIHBhcnQgb2YKICAgICAgICAgIC8vIHRoZSBsaW5lLgogICAgICAgICAgZm9yICh2YXIgbWF0Y2ggPSAwOyBtYXRjaCA8IGN1cnNvci5vZmZzZXQgJiYKICAgICAgICAgICAgICAgbGluZS50ZXh0LmNoYXJBdChtYXRjaCkgPT0gcHJldi50ZXh0LmNoYXJBdChtYXRjaCk7IG1hdGNoKyspOwogICAgICAgICAgaWYgKGN1cnNvci5vZmZzZXQgPiBtYXRjaCkKICAgICAgICAgICAgY3Vyc29yZGlmZiA9IGxpbmUudGV4dC5sZW5ndGggLSBwcmV2LnRleHQubGVuZ3RoOwogICAgICAgIH0KICAgICAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCB7bm9kZTogbGluZS5mcm9tLCBvZmZzZXQ6IE1hdGgubWF4KDAsIGN1cnNvci5vZmZzZXQgKyBjdXJzb3JkaWZmKX0pOwogICAgICB9CiAgICAgIC8vIEN1cnNvciB3YXMgaW4gcmVtb3ZlZCBsaW5lLCB0aGlzIGlzIGxhc3QgbmV3IGxpbmUuCiAgICAgIGVsc2UgaWYgKGN1cnNvciAmJiAoaSA9PSBjaGFpbi5sZW5ndGggLSAxKSAmJiBjdXJzb3Iubm9kZSAmJiBjdXJzb3Iubm9kZS5wYXJlbnROb2RlICE9IHRoaXMuY29udGFpbmVyKSB7CiAgICAgICAgc2VsZWN0LnNldEN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwge25vZGU6IGxpbmUuZnJvbSwgb2Zmc2V0OiBsaW5lLnRleHQubGVuZ3RofSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBBbmNob3IgdGhlIGNoYWluIGluIHRoZSBET00gdHJlZS4KICAgIHRoaXMubGlua0NoYWluKGNoYWluKTsKICAgIHJldHVybiBzdGFydDsKICB9Cn07Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/util.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQSBmZXcgdXNlZnVsIHV0aWxpdHkgZnVuY3Rpb25zLiAqLwoKdmFyIGludGVybmV0RXhwbG9yZXIgPSBkb2N1bWVudC5zZWxlY3Rpb24gJiYgd2luZG93LkFjdGl2ZVhPYmplY3QgJiYgL01TSUUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CnZhciB3ZWJraXQgPSAvQXBwbGVXZWJLaXQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CnZhciBzYWZhcmkgPSAvQXBwbGUgQ29tcHV0ZXJzLCBJbmMvLnRlc3QobmF2aWdhdG9yLnZlbmRvcik7CgovLyBDYXB0dXJlIGEgbWV0aG9kIG9uIGFuIG9iamVjdC4KZnVuY3Rpb24gbWV0aG9kKG9iaiwgbmFtZSkgewogIHJldHVybiBmdW5jdGlvbigpIHtvYmpbbmFtZV0uYXBwbHkob2JqLCBhcmd1bWVudHMpO307Cn0KCi8vIFRoZSB2YWx1ZSB1c2VkIHRvIHNpZ25hbCB0aGUgZW5kIG9mIGEgc2VxdWVuY2UgaW4gaXRlcmF0b3JzLgp2YXIgU3RvcEl0ZXJhdGlvbiA9IHt0b1N0cmluZzogZnVuY3Rpb24oKSB7cmV0dXJuICJTdG9wSXRlcmF0aW9uIn19OwoKLy8gQXBwbHkgYSBmdW5jdGlvbiB0byBlYWNoIGVsZW1lbnQgaW4gYSBzZXF1ZW5jZS4KZnVuY3Rpb24gZm9yRWFjaChpdGVyLCBmKSB7CiAgaWYgKGl0ZXIubmV4dCkgewogICAgdHJ5IHt3aGlsZSAodHJ1ZSkgZihpdGVyLm5leHQoKSk7fQogICAgY2F0Y2ggKGUpIHtpZiAoZSAhPSBTdG9wSXRlcmF0aW9uKSB0aHJvdyBlO30KICB9CiAgZWxzZSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZXIubGVuZ3RoOyBpKyspCiAgICAgIGYoaXRlcltpXSk7CiAgfQp9CgovLyBNYXAgYSBmdW5jdGlvbiBvdmVyIGEgc2VxdWVuY2UsIHByb2R1Y2luZyBhbiBhcnJheSBvZiByZXN1bHRzLgpmdW5jdGlvbiBtYXAoaXRlciwgZikgewogIHZhciBhY2N1bSA9IFtdOwogIGZvckVhY2goaXRlciwgZnVuY3Rpb24odmFsKSB7YWNjdW0ucHVzaChmKHZhbCkpO30pOwogIHJldHVybiBhY2N1bTsKfQoKLy8gQ3JlYXRlIGEgcHJlZGljYXRlIGZ1bmN0aW9uIHRoYXQgdGVzdHMgYSBzdHJpbmcgYWdhaW5zdHMgYSBnaXZlbgovLyByZWd1bGFyIGV4cHJlc3Npb24uIE5vIGxvbmdlciB1c2VkIGJ1dCBtaWdodCBiZSB1c2VkIGJ5IDNyZCBwYXJ0eQovLyBwYXJzZXJzLgpmdW5jdGlvbiBtYXRjaGVyKHJlZ2V4cCl7CiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gcmVnZXhwLnRlc3QodmFsdWUpO307Cn0KCi8vIFRlc3Qgd2hldGhlciBhIERPTSBub2RlIGhhcyBhIGNlcnRhaW4gQ1NTIGNsYXNzLiBNdWNoIGZhc3RlciB0aGFuCi8vIHRoZSBNb2NoaUtpdCBlcXVpdmFsZW50LCBmb3Igc29tZSByZWFzb24uCmZ1bmN0aW9uIGhhc0NsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSl7CiAgdmFyIGNsYXNzZXMgPSBlbGVtZW50LmNsYXNzTmFtZTsKICByZXR1cm4gY2xhc3NlcyAmJiBuZXcgUmVnRXhwKCIoXnwgKSIgKyBjbGFzc05hbWUgKyAiKCR8ICkiKS50ZXN0KGNsYXNzZXMpOwp9CgovLyBJbnNlcnQgYSBET00gbm9kZSBhZnRlciBhbm90aGVyIG5vZGUuCmZ1bmN0aW9uIGluc2VydEFmdGVyKG5ld05vZGUsIG9sZE5vZGUpIHsKICB2YXIgcGFyZW50ID0gb2xkTm9kZS5wYXJlbnROb2RlOwogIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgb2xkTm9kZS5uZXh0U2libGluZyk7CiAgcmV0dXJuIG5ld05vZGU7Cn0KCmZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQobm9kZSkgewogIGlmIChub2RlLnBhcmVudE5vZGUpCiAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7Cn0KCmZ1bmN0aW9uIGNsZWFyRWxlbWVudChub2RlKSB7CiAgd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkKICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5maXJzdENoaWxkKTsKfQoKLy8gQ2hlY2sgd2hldGhlciBhIG5vZGUgaXMgY29udGFpbmVkIGluIGFub3RoZXIgb25lLgpmdW5jdGlvbiBpc0FuY2VzdG9yKG5vZGUsIGNoaWxkKSB7CiAgd2hpbGUgKGNoaWxkID0gY2hpbGQucGFyZW50Tm9kZSkgewogICAgaWYgKG5vZGUgPT0gY2hpbGQpCiAgICAgIHJldHVybiB0cnVlOwogIH0KICByZXR1cm4gZmFsc2U7Cn0KCi8vIFRoZSBub24tYnJlYWtpbmcgc3BhY2UgY2hhcmFjdGVyLgp2YXIgbmJzcCA9ICJcdTAwYTAiOwp2YXIgbWF0Y2hpbmcgPSB7InsiOiAifSIsICJbIjogIl0iLCAiKCI6ICIpIiwKICAgICAgICAgICAgICAgICJ9IjogInsiLCAiXSI6ICJbIiwgIikiOiAiKCJ9OwoKLy8gU3RhbmRhcmRpemUgYSBmZXcgdW5wb3J0YWJsZSBldmVudCBwcm9wZXJ0aWVzLgpmdW5jdGlvbiBub3JtYWxpemVFdmVudChldmVudCkgewogIGlmICghZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB7CiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbigpIHt0aGlzLmNhbmNlbEJ1YmJsZSA9IHRydWU7fTsKICAgIGV2ZW50LnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKSB7dGhpcy5yZXR1cm5WYWx1ZSA9IGZhbHNlO307CiAgfQogIGlmICghZXZlbnQuc3RvcCkgewogICAgZXZlbnQuc3RvcCA9IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICB0aGlzLnByZXZlbnREZWZhdWx0KCk7CiAgICB9OwogIH0KCiAgaWYgKGV2ZW50LnR5cGUgPT0gImtleXByZXNzIikgewogICAgZXZlbnQuY29kZSA9IChldmVudC5jaGFyQ29kZSA9PSBudWxsKSA/IGV2ZW50LmtleUNvZGUgOiBldmVudC5jaGFyQ29kZTsKICAgIGV2ZW50LmNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY29kZSk7CiAgfQogIHJldHVybiBldmVudDsKfQoKLy8gUG9ydGFibHkgcmVnaXN0ZXIgZXZlbnQgaGFuZGxlcnMuCmZ1bmN0aW9uIGFkZEV2ZW50SGFuZGxlcihub2RlLCB0eXBlLCBoYW5kbGVyLCByZW1vdmVGdW5jKSB7CiAgZnVuY3Rpb24gd3JhcEhhbmRsZXIoZXZlbnQpIHsKICAgIGhhbmRsZXIobm9ybWFsaXplRXZlbnQoZXZlbnQgfHwgd2luZG93LmV2ZW50KSk7CiAgfQogIGlmICh0eXBlb2Ygbm9kZS5hZGRFdmVudExpc3RlbmVyID09ICJmdW5jdGlvbiIpIHsKICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCB3cmFwSGFuZGxlciwgZmFsc2UpOwogICAgaWYgKHJlbW92ZUZ1bmMpIHJldHVybiBmdW5jdGlvbigpIHtub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgd3JhcEhhbmRsZXIsIGZhbHNlKTt9OwogIH0KICBlbHNlIHsKICAgIG5vZGUuYXR0YWNoRXZlbnQoIm9uIiArIHR5cGUsIHdyYXBIYW5kbGVyKTsKICAgIGlmIChyZW1vdmVGdW5jKSByZXR1cm4gZnVuY3Rpb24oKSB7bm9kZS5kZXRhY2hFdmVudCgib24iICsgdHlwZSwgd3JhcEhhbmRsZXIpO307CiAgfQp9CgpmdW5jdGlvbiBub2RlVGV4dChub2RlKSB7CiAgcmV0dXJuIG5vZGUudGV4dENvbnRlbnQgfHwgbm9kZS5pbm5lclRleHQgfHwgbm9kZS5ub2RlVmFsdWUgfHwgIiI7Cn0KCmZ1bmN0aW9uIG5vZGVUb3Aobm9kZSkgewogIHZhciB0b3AgPSAwOwogIHdoaWxlIChub2RlLm9mZnNldFBhcmVudCkgewogICAgdG9wICs9IG5vZGUub2Zmc2V0VG9wOwogICAgbm9kZSA9IG5vZGUub2Zmc2V0UGFyZW50OwogIH0KICByZXR1cm4gdG9wOwp9CgpmdW5jdGlvbiBpc0JSKG5vZGUpIHsKICB2YXIgbm4gPSBub2RlLm5vZGVOYW1lOwogIHJldHVybiBubiA9PSAiQlIiIHx8IG5uID09ICJiciI7Cn0KZnVuY3Rpb24gaXNTcGFuKG5vZGUpIHsKICB2YXIgbm4gPSBub2RlLm5vZGVOYW1lOwogIHJldHVybiBubiA9PSAiU1BBTiIgfHwgbm4gPT0gInNwYW4iOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/jstest.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ianMvbWlycm9yZnJhbWUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogSmF2YVNjcmlwdCBkZW1vbnN0cmF0aW9uPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNzcy9kb2NzLmNzcyIvPgogIDwvaGVhZD4KICA8Ym9keSBzdHlsZT0icGFkZGluZzogMjBweDsiPgoKPHA+VGhpcyBwYWdlIGRlbW9uc3RyYXRlcyA8YSBocmVmPSJpbmRleC5odG1sIj5Db2RlTWlycm9yPC9hPidzCkphdmFTY3JpcHQgcGFyc2VyLiBOb3RlIHRoYXQgdGhlIHVnbHkgYnV0dG9ucyBhdCB0aGUgdG9wIGFyZSBub3QgYXJlCm5vdCBwYXJ0IG9mIENvZGVNaXJyb3IgcHJvcGVyIC0tIHRoZXkgZGVtb25zdHJhdGUgdGhlIHdheSBpdCBjYW4gYmUKZW1iZWRkZWQgaW4gYSB3ZWItYXBwbGljYXRpb24uPC9wPgoKPGRpdiBjbGFzcz0iYm9yZGVyIj4KPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMjAiIHJvd3M9IjMwIj4KLy8gSGVyZSB5b3Ugc2VlIHNvbWUgSmF2YVNjcmlwdCBjb2RlLiBNZXNzIGFyb3VuZCB3aXRoIGl0IHRvIGdldAovLyBhY3F1YWludGVkIHdpdGggQ29kZU1pcnJvcidzIGZlYXR1cmVzLgoKLy8gUHJlc3MgZW50ZXIgaW5zaWRlIHRoZSBvYmplY3QgYW5kIHlvdXIgbmV3IGxpbmUgd2lsbCBiZSBzdWl0YWJseQovLyBpbmRlbnRlZC4KdmFyIGtleUJpbmRpbmdzID0gewogIGVudGVyOiAibmV3bGluZS1hbmQtaW5kZW50IiwKICB0YWI6ICJyZWluZGVudC1zZWxlY3Rpb24iLAogIGN0cmxfejogInVuZG8iLAogIGN0cmxfeTogInJlZG8iLAogIGN0cmxfYmFja3NwYWNlOiAidW5kby1mb3Itc2FmYXJpICh3aGljaCBibG9ja3MgY3RybC16KSIsCiAgY3RybF9icmFja2V0OiAiaGlnaGxpZ2h0LWJyYWNrZXRzIiwKICBjdHJsX3NoaWZ0X2JyYWNrZXQ6ICJqdW1wLXRvLW1hdGNoaW5nLWJyYWNrZXQiCn07CgovLyBQcmVzcyB0YWIgb24gdGhlIG5leHQgbGluZSBhbmQgdGhlIHdyb25nIGluZGVudGF0aW9uIHdpbGwgYmUgZml4ZWQuCiAgICAgIHZhciByZWdleCA9IC9mb298YmFyL2k7CgpmdW5jdGlvbiBleGFtcGxlKHgpIHsKICAvLyBMb2NhbCB2YXJpYWJsZXMgZ2V0IGEgZGlmZmVyZW50IGNvbG91ciB0aGFuIGdsb2JhbCBvbmVzLgogIHZhciB5ID0gNDQuNDsKICByZXR1cm4geCArIHkgLSB6Owp9CjwvdGV4dGFyZWE+CjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogIHZhciB0ZXh0YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2RlJyk7CiAgdmFyIGVkaXRvciA9IG5ldyBNaXJyb3JGcmFtZShDb2RlTWlycm9yLnJlcGxhY2UodGV4dGFyZWEpLCB7CiAgICBoZWlnaHQ6ICIzNTBweCIsCiAgICBjb250ZW50OiB0ZXh0YXJlYS52YWx1ZSwKICAgIHBhcnNlcmZpbGU6IFsidG9rZW5pemVqYXZhc2NyaXB0LmpzIiwgInBhcnNlamF2YXNjcmlwdC5qcyJdLAogICAgc3R5bGVzaGVldDogImNzcy9qc2NvbG9ycy5jc3MiLAogICAgcGF0aDogImpzLyIsCiAgICBhdXRvTWF0Y2hQYXJlbnM6IHRydWUKICB9KTsKPC9zY3JpcHQ+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IENvcHlyaWdodCAoYykgMjAwNy0yMDA5IE1hcmlqbiBIYXZlcmJla2UKCiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueQogZGFtYWdlcyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgoKIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogcHVycG9zZSwgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kCiByZWRpc3RyaWJ1dGUgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgoKIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3QKICAgIG5vdCBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcwogICAgc29mdHdhcmUgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdAogICAgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgoKIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3QKICAgIG5vdCBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCgogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlCiAgICBkaXN0cmlidXRpb24uCgogTWFyaWpuIEhhdmVyYmVrZQogbWFyaWpuaCBhdCBnbWFpbAo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/manual.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHRpdGxlPkNvZGVNaXJyb3IgdXNlciBtYW51YWw8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL2RvY3MuY3NzIi8+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxIGNsYXNzPSJ1bmRlcmxpbmUiPkNvZGVNaXJyb3IgdXNlciBtYW51YWw8L2gxPgoKICAgIDxoMj5Db250ZW50czwvaDI+CgogICAgPHVsPgogICAgICA8bGk+PGEgaHJlZj0iI3VzZWFnZSI+QmFzaWMgVXNlYWdlPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjY29uZmlndXJhdGlvbiI+Q29uZmlndXJhdGlvbjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iI3BhcnNlcnMiPlBhcnNlcnM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9IiNwcm9ncmFtbWluZyI+UHJvZ3JhbW1pbmcgSW50ZXJmYWNlPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjd3JpdGVwYXJzZXIiPldyaXRpbmcgYSBQYXJzZXI8L2E+PC9saT4KICAgIDwvdWw+CgogICAgPGgyIGlkPSJ1c2VhZ2UiPkJhc2ljIFVzYWdlPC9oMj4KCiAgICA8cD5JbnNpZGUgdGhlIGVkaXRvciwgdGhlIHRhYiBrZXkgaXMgdXNlZCB0byByZS1pbmRlbnQgdGhlIGN1cnJlbnQKICAgIHNlbGVjdGlvbiAob3IgdGhlIGN1cnJlbnQgbGluZSB3aGVuIG5vdGhpbmcgaXMgc2VsZWN0ZWQpLCBhbmQKICAgIHByZXNzaW5nIGVudGVyIHdpbGwsIGFwYXJ0IGZyb20gaW5zZXJ0aW5nIGEgbGluZSBicmVhaywKICAgIGF1dG9tYXRpY2FsbHkgaW5kZW50IHRoZSBuZXcgbGluZS4gUHJlc3NpbmcgY29udHJvbC1lbnRlciB3aWxsCiAgICBjYXVzZSB0aGUgd2hvbGUgYnVmZmVyIHRvIGJlIHJlLWNvbG91cmVkLCB3aGljaCBjYW4gYmUgaGVscGZ1bAogICAgd2hlbiBzb21lIGNvbG91cmluZyBoYXMgYmVjb21lIG91dC1vZi1kYXRlIHdpdGhvdXQgdGhlIGVkaXRvcgogICAgbm90aWNpbmcgaXQuPC9wPgoKICAgIDxwPlRoZSBlZGl0b3Igc3BvcnRzIGFuIHVuZG8vcmVkbyBzeXN0ZW0sIGFjY2Vzc2libGUgd2l0aAogICAgY29udHJvbC16ICh1bmRvKSBhbmQgY29udHJvbC15IChyZWRvKS4gU2FmYXJpIHdpbGwgbm90IGFsbG93CiAgICBjbGllbnQgc2NyaXB0cyB0byBjYXB0dXJlIGNvbnRyb2wteiBwcmVzc2VzLCBidXQgeW91IGNhbiB1c2UKICAgIGNvbnRyb2wtYmFja3NwYWNlIGluc3RlYWQgb24gdGhhdCBicm93c2VyLjwvcD4KCiAgICA8cD5UaGUga2V5LWNvbWJpbmF0aW9uIGNvbnRyb2wtWyB0cmlnZ2VycyBhIHBhcmVuLWJsaW5rOiBJZiB0aGUKICAgIGN1cnNvciBpcyBkaXJlY3RseSBhZnRlciBhICcoJywgJyknLCAnWycsICddJywgJ3snLCBvciAnfScsIHRoZQogICAgZWRpdG9yIGxvb2tzIGZvciB0aGUgbWF0Y2hpbmcgY2hhcmFjdGVyLCBhbmQgaGlnaGxpZ2h0cyB0aGVzZQogICAgY2hhcmFjdGVycyBmb3IgYSBtb21lbnQuIFRoZXJlIGlzIGFuIG9wdGlvbiB0byBlbmFibGUgdGhpcyB0bwogICAgaGFwcGVuIGFueSB0aW1lIHRoZSB1c2VyIHR5cGVzIHNvbWV0aGluZyBvciBtb3ZlcyB0aGUgY3Vyc29yLjwvcD4KCiAgICA8cD5UbyB1c2UgQ29kZU1pcnJvciBpbiBhIGRvY3VtZW50LCB5b3Ugc2hvdWxkIGFkZCBhIHNjcmlwdCB0YWcgdG8KICAgIGxvYWQgPGEgaHJlZj0ianMvY29kZW1pcnJvci5qcyI+PGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT48L2E+LiBUaGlzCiAgICBhZGRzIHR3byBvYmplY3RzIHRvIHlvdXIgZW52aXJvbm1lbnQsIDxjb2RlPkNvZGVNaXJyb3I8L2NvZGU+IGFuZAogICAgPGNvZGU+Q29kZU1pcnJvckNvbmZpZzwvY29kZT4uIFRoZSBmaXJzdCBpcyB0aGUgaW50ZXJmYWNlIHRvIHRoZQogICAgZWRpdG9yLCB0aGUgc2Vjb25kIGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBpdC4gKE5vdGUgdGhhdCB0aGlzIGlzCiAgICB0aGUgb25seSBuYW1lLXNwYWNlIHBvbGx1dGlvbiB5b3UgY2FuIGV4cGVjdCBmcm9tIENvZGVNaXJyb3IgLS0KICAgIGFsbCBvdGhlciBjcnVmdCBpcyBrZXB0IGluc2lkZSB0aGUgSUZSQU1FcyB0aGF0IGl0IGNyZWF0ZXMgd2hlbgogICAgeW91IG9wZW4gYW4gZWRpdG9yLik8L3A+CgogICAgPHA+VG8gYWRkIGFuIGVkaXRvciB0byBhIGRvY3VtZW50LCB5b3UgbXVzdCBjaG9vc2UgYSBwbGFjZSwgYQogICAgcGFyc2VyLCBhbmQgYSBzdHlsZS1zaGVldCBmb3IgaXQuIEZvciBleGFtcGxlLCB0byBhcHBlbmQgYW4KICAgIFhNTCBlZGl0b3IgdG8gdGhlIGJvZHkgb2YgdGhlIGRvY3VtZW50LCB5b3UgZG86PC9wPgoKICAgIDxwcmUgY2xhc3M9ImNvZGUiPnZhciBlZGl0b3IgPSBuZXcgQ29kZU1pcnJvcihkb2N1bWVudC5ib2R5LCB7CiAgcGFyc2VyZmlsZTogInBhcnNleG1sLmpzIiwKICBzdHlsZXNoZWV0OiAieG1sY29sb3JzLmNzcyIKfSk7PC9wcmU+CgogICAgPHA+VGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSA8Y29kZT5Db2RlTWlycm9yPC9jb2RlPiBjb25zdHJ1Y3RvcgogICAgY2FuIGJlIGEgRE9NIG5vZGUsIGluIHdoaWNoIGNhc2UgdGhlIGVkaXRvciBnZXRzIGFwcGVuZGVkIHRvIHRoYXQKICAgIG5vZGUsIG9yIGEgZnVuY3Rpb24sIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIElGUkFNRSBub2RlIGFzCiAgICBhcmd1bWVudCwgYW5kIHdoaWNoIGlzIGV4cGVjdGVkIHRvIHBsYWNlIHRoYXQgbm9kZSBzb21ld2hlcmUgaW4KICAgIHRoZSBkb2N1bWVudC48L3A+CgogICAgPHA+VGhlIHNlY29uZCAob3B0aW9uYWwpIGFyZ3VtZW50IGlzIGFuIG9iamVjdCB0aGF0IHNwZWNpZmllcwogICAgb3B0aW9ucy4gQSBzZXQgb2YgZGVmYXVsdCBvcHRpb25zIChzZWUgYmVsb3cpIGlzIHByZXNlbnQgaW4gdGhlCiAgICA8Y29kZT5Db2RlTWlycm9yQ29uZmlnPC9jb2RlPiBvYmplY3QsIGJ1dCBlYWNoIGluc3RhbmNlIG9mIHRoZQogICAgZWRpdG9yIGNhbiBiZSBnaXZlbiBhIHNldCBvZiBzcGVjaWZpYyBvcHRpb25zIHRvIG92ZXJyaWRlIHRoZXNlCiAgICBkZWZhdWx0cy4gSW4gdGhpcyBjYXNlLCB3ZSBzcGVjaWZpZWQgdGhhdCB0aGUgcGFyc2VyIHNob3VsZCBiZQogICAgbG9hZGVkIGZyb20gdGhlIDxhCiAgICBocmVmPSJqcy9wYXJzZXhtbC5qcyI+PGNvZGU+InBhcnNleG1sLmpzIjwvY29kZT48L2E+IGZpbGUsIGFuZAogICAgdGhhdCA8YSBocmVmPSJjc3MveG1sY29sb3JzLmNzcyI+PGNvZGU+InhtbGNvbG9ycy5jc3MiPC9jb2RlPjwvYT4KICAgIHNob3VsZCBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbG91cnMgb2YgdGhlIGNvZGUuPC9wPgoKICAgIDxwPkFub3RoZXIgZXhhbXBsZTo8L3A+CgogICAgPHByZSBjbGFzcz0iY29kZSI+dmFyIGVkaXRvciA9IG5ldyBDb2RlTWlycm9yKENvZGVNaXJyb3IucmVwbGFjZSgiaW5wdXRmaWVsZCIpLCB7CiAgcGFyc2VyZmlsZTogWyJ0b2tlbml6ZWphdmFzY3JpcHQuanMiLCAicGFyc2VqYXZhc2NyaXB0LmpzIl0sCiAgcGF0aDogImxpYi9jb2RlbWlycm9yL2pzLyIsCiAgc3R5bGVzaGVldDogImxpYi9jb2RlbWlycm9yL2Nzcy9qc2NvbG9ycy5jc3MiLAogIGNvbnRlbnQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpbnB1dGZpZWxkIikudmFsdWUKfSk7PC9wcmU+CgogICAgPHA+SGVyZSB3ZSB1c2UgdGhlIHV0aWxpdHkgZnVuY3Rpb24KICAgIDxjb2RlPkNvZGVNaXJyb3IucmVwbGFjZTwvY29kZT4gdG8gY3JlYXRlIGEgZnVuY3Rpb24gdGhhdCB3aWxsCiAgICByZXBsYWNlIGEgbm9kZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudCAoZ2l2ZW4gZWl0aGVyIGRpcmVjdGx5IG9yCiAgICBieSBJRCkgd2l0aCB0aGUgZWRpdG9yLiBXZSBhbHNvIHNlbGVjdCB0aGUgSmF2YVNjcmlwdCBwYXJzZXIgdGhpcwogICAgdGltZSwgYW5kIGdpdmUgYSA8Y29kZT5wYXRoPC9jb2RlPiBvcHRpb24gdG8gdGVsbCB0aGUgZWRpdG9yIHRoYXQKICAgIGl0cyBmaWxlcyBhcmUgbm90IGxvY2F0ZWQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjdXJyZW50CiAgICBIVE1MIHBhZ2UsIGJ1dCBpbiA8Y29kZT4ibGliL2NvZGVtaXJyb3IvIjwvY29kZT4uPC9wPgoKICAgIDxwPlRoZXJlIGlzIGEgZnVuY3Rpb24KICAgIDxjb2RlPkNvZGVNaXJyb3IuaXNQcm9iYWJseVN1cHBvcnRlZCgpPC9jb2RlPiB0aGF0IGNhdXNlcyBzb21lCiAgICAxOTk4LXN0eWxlIGJyb3dzZXIgZGV0ZWN0aW9uIHRvIGhhcHBlbiwgcmV0dXJuaW5nCiAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgQ29kZU1pcnJvciBpcyBwcm9iYWJseSBub3Qgc3VwcG9ydGVkIG9uIHRoZQogICAgYnJvd3NlciwgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgcHJvYmFibHkgaXMsIGFuZAogICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaGFzIG5vIGlkZWEuIEFzIHRoZSBuYW1lIHN1Z2dlc3RzLCB0aGlzIGlzCiAgICBub3Qgc29tZXRoaW5nIHlvdSBjYW4gcmVseSBvbiwgYnV0IGl0J3MgdXN1YWxseSBiZXR0ZXIgdGhhbgogICAgbm90aGluZy48L3A+CgogICAgPHA+QW5vdGhlciB1dGlsaXR5IGZ1bmN0aW9uLCA8Y29kZT5Db2RlTWlycm9yLmZyb21UZXh0QXJlYTwvY29kZT4sCiAgICB3aWxsLCBnaXZlbiBhIHRleHRhcmVhIG5vZGUgb3IgdGhlIGlkIG9mIHN1Y2ggYSBub2RlLCBoaWRlIHRoZQogICAgdGV4dGFyZWEgYW5kIHJlcGxhY2UgaXQgd2l0aCBhIENvZGVNaXJyb3IgZnJhbWUuIElmIHRoZSB0ZXh0YXJlYQogICAgd2FzIHBhcnQgb2YgYSBmb3JtLCBhbiA8Y29kZT5vbnN1Ym1pdDwvY29kZT4gaGFuZGxlciB3aWxsIGJlCiAgICByZWdpc3RlcmVkIHdpdGggdGhpcyBmb3JtLCB3aGljaCB3aWxsIGxvYWQgdGhlIGNvbnRlbnQgb2YgdGhlCiAgICBlZGl0b3IgaW50byB0aGUgdGV4dGFyZWEsIHNvIHRoYXQgaXQgY2FuIGJlIHN1Ym1pdHRlZCBhcyBub3JtYWwuCiAgICBUaGlzIGZ1bmN0aW9uIG9wdGlvbmFsbHkgdGFrZXMgYSBjb25maWd1cmF0aW9uIG9iamVjdCBhcyBzZWNvbmQKICAgIGFyZ3VtZW50LjwvcD4KCiAgICA8cHJlIGNsYXNzPSJjb2RlIj52YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoImlucHV0ZmllbGQiLCB7CiAgcGFyc2VyZmlsZTogWyJ0b2tlbml6ZWphdmFzY3JpcHQuanMiLCAicGFyc2VqYXZhc2NyaXB0LmpzIl0sCiAgcGF0aDogImxpYi9jb2RlbWlycm9yL2pzLyIsCiAgc3R5bGVzaGVldDogImxpYi9jb2RlbWlycm9yL2Nzcy9qc2NvbG9ycy5jc3MiCn0pOzwvcHJlPgoKICAgIDxwPlRoZSByZWFzb24gdGhhdCB0aGUgc2NyaXB0IHBhdGggaGFzIHRvIGJlIGNvbmZpZ3VyZWQgaXMgdGhhdAogICAgQ29kZU1pcnJvciB3aWxsIGxvYWQgaW4gYSBidW5jaCBvZiBleHRyYSBmaWxlcyB3aGVuIGFuIGVkaXRvciBpcwogICAgY3JlYXRlZCAodGhlIHBhcnNlciBzY3JpcHQsIGFtb25nIG90aGVycykuIFRvIGJlIGFibGUgdG8gZG8gdGhpcywKICAgIGl0IGhhcyB0byBrbm93IHdoZXJlIHRvIGZpbmQgdGhlbS4gVGhlc2UgYXJlIGFsbCB0aGUgSmF2YVNjcmlwdAogICAgZmlsZXMgdGhhdCBhcmUgcGFydCBvZiBDb2RlTWlycm9yIGl0c2VsZjo8L3A+CgogICAgPGRsPgogICAgICA8ZHQ+PGEgaHJlZj0ianMvY29kZW1pcnJvci5qcyI+PGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPk1haW4gaW50ZXJmYWNlLCB0YWtlcyBjYXJlIG9mIGRlZmF1bHQgY29uZmlndXJhdGlvbiBhbmQgdGhlCiAgICAgIGRlZmluaXRpb24gb2YgZWRpdG9yIGZyYW1lcy4gSW5jbHVkZSB0aGlzIGluIHlvdXIgSFRNTAogICAgICBkb2N1bWVudC48L2RkPgogICAgICA8ZHQ+PGEgaHJlZj0ianMvZWRpdG9yLmpzIj48Y29kZT5lZGl0b3IuanM8L2NvZGU+PC9hPjwvZHQ+IDxkZD5UaGUKICAgICAgY29kZSB0aGF0IHRha2VzIGNhcmUgb2YgcmVhY3RpbmcgdG8gdXNlciBpbnB1dCwgY29sb3VyaW5nIHRleHQsCiAgICAgIGFuZCBpbmRlbnRpbmcgbGluZXMuPC9kZD4KICAgICAgPGR0PjxhIGhyZWY9ImpzL3V0aWwuanMiPjxjb2RlPnV0aWwuanM8L2NvZGU+PC9hPjwvZHQ+IDxkZD5BIGZldwogICAgICBnZW5lcmljIHV0aWxpdHkgZnVuY3Rpb25zLjwvZGQ+CiAgICAgIDxkdD48YQogICAgICBocmVmPSJqcy91bmRvLmpzIj48Y29kZT51bmRvLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+SW1wbGVtZW50cyB0aGUgdW5kbyBoaXN0b3J5IGZvciB0aGUgZWRpdG9yLjwvZGQ+CiAgICAgIDxkdD48YQogICAgICBocmVmPSJqcy9zdHJpbmdzdHJlYW0uanMiPjxjb2RlPnN0cmluZ3N0cmVhbS5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPk9iamVjdHMgZm9yIHdyYXBwaW5nIHRoZSB0ZXh0dWFsIGlucHV0IHRvIHRoZSBwYXJzZXIuPC9kZD4KICAgICAgPGR0PjxhIGhyZWY9ImpzL3NlbGVjdC5qcyI+PGNvZGU+c2VsZWN0LmpzPC9jb2RlPjwvYT48L2R0PiA8ZGQ+U29tZQogICAgICBoZWxwZXIgdXRpbGl0aWVzIGZvciB3b3JraW5nIHdpdGggc2VsZWN0ZWQgdGV4dCBhbmQgY3Vyc29yCiAgICAgIHBvc2l0aW9ucy48L2RkPgogICAgICA8ZHQ+PGEgaHJlZj0ianMvdG9rZW5pemUuanMiPjxjb2RlPnRva2VuaXplLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+SGVscGVyIGZyYW1ld29yayBmb3Igd3JpdGluZyB0b2tlbmlzZXJzLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxwPk1vc3Qgb2YgdGhlc2UgYXJlIHJhdGhlciBmdWxsIG9mIGNvbW1lbnRzLCB3aGljaCBjYW4gYmUgdXNlZnVsCiAgICB3aGVuIHlvdSBhcmUgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgaG93IHRoZXkgd29yaywgYnV0IHdhc3RlcyBhIGxvdAogICAgb2YgYmFuZHdpZHRoIGluIGEgcHJvZHVjdGlvbiBzeXN0ZW0uIFRha2UgYSBsb29rIGF0IHRoZQogICAgZGVzY3JpcHRpb24gb2YgdGhlIDxjb2RlPmJhc2VmaWxlczwvY29kZT4gb3B0aW9uIGJlbG93IGlmIHlvdSB3YW50CiAgICB0byBjb25jYXRlbmF0ZSBhbmQgbWluaW1pc2UgdGhlIGxpYnJhcnkuPC9wPgoKICAgIDxwPkFwYXJ0IGZyb20gdGhlc2UsIHRoZXJlIGFyZSBmaWxlcyB0aGF0IGltcGxlbWVudCB0aGUgdmFyaW91cwogICAgcGFyc2Vycy4gVGhlc2UgYWxsIHN0YXJ0IHdpdGggZWl0aGVyIDxjb2RlPnBhcnNlPC9jb2RlPiBvcgogICAgPGNvZGU+dG9rZW5pemU8L2NvZGU+LjwvcD4KCiAgICA8aDIgaWQ9ImNvbmZpZ3VyYXRpb24iPkNvbmZpZ3VyYXRpb248L2gyPgoKICAgIDxwPlRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGNvbmZpZ3VyZSBDb2RlTWlycm9yOjwvcD4KCiAgICA8dWw+CiAgICAgIDxsaT5JZiB5b3UgZGVmaW5lIGEgZ2xvYmFsIDxjb2RlPkNvZGVNaXJyb3JDb25maWc8L2NvZGU+IG9iamVjdAogICAgICBiZWZvcmUgbG9hZGluZyA8YQogICAgICBocmVmPSJqcy9jb2RlbWlycm9yLmpzIj48Y29kZT5jb2RlbWlycm9yLmpzPC9jb2RlPjwvYT4sIHRoZQogICAgICBjb25maWd1cmF0aW9uIG9wdGlvbnMgaW4gdGhhdCBvYmplY3Qgd2lsbCBvdmVycmlkZSB0aGUKICAgICAgZGVmYXVsdHMuPC9saT4KICAgICAgPGxpPkJ5IGFzc2lnbmluZyB0byB0aGUgcHJvcGVydGllcyBvZiB0aGUKICAgICAgPGNvZGU+Q29kZU1pcnJvckNvbmZpZzwvY29kZT4gb2JqZWN0LCBjb25maWd1cmF0aW9uIGRlZmF1bHRzIGNhbgogICAgICBiZSBvdmVycmlkZGVuIGFmdGVyIGxvYWRpbmcgPGEKICAgICAgaHJlZj0ianMvY29kZW1pcnJvci5qcyI+PGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT48L2E+LjwvbGk+CiAgICAgIDxsaT5UaGUgPGNvZGU+Q29kZU1pcnJvcjwvY29kZT4gY29uc3RydWN0b3IgY2FuIGJlIGdpdmVuIGEgc2Vjb25kCiAgICAgIGFyZ3VtZW50LCBhbiBvYmplY3QsIHdoaWNoIHdpbGwgb3ZlcnJpZGUgc29tZSBvcHRpb25zIGZvciBqdXN0CiAgICAgIHRoYXQgZWRpdG9yLiBPcHRpb25zIG5vdCBtZW50aW9uZWQgaW4gdGhpcyBvYmplY3Qgd2lsbCBkZWZhdWx0IHRvCiAgICAgIHRoZSB2YWx1ZXMgaW4gdGhlIDxjb2RlPkNvZGVNaXJyb3JDb25maWc8L2NvZGU+IG9iamVjdC48L2xpPgogICAgPC91bD4KCiAgICA8cD5UaGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgYXJlIHRoZXNlIChtb3N0IGhhdmUgc2Vuc2libGUKICAgIGRlZmF1bHRzIHNwZWNpZmllZCBpbiA8YQogICAgaHJlZj0ianMvY29kZW1pcnJvci5qcyI+PGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT48L2E+KTo8L3A+CgogICAgPGRsPgoKICAgICAgPGR0Pjxjb2RlPnN0eWxlc2hlZXQ8L2NvZGU+PC9kdD48ZGQ+VGhlIGZpbGUgbmFtZSBvZiB0aGUgc3R5bGUtc2hlZXQKICAgICAgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjb2xvdXIgdGhlIGNvZGUgaW4gdGhlIGVkaXRvciBmcmFtZS4gU2VlIDxhCiAgICAgIGhyZWY9ImNzcy9qc2NvbG9ycy5jc3MiPjxjb2RlPmpzY29sb3JzLmNzczwvY29kZT48L2E+IGZvciBhbgogICAgICBleGFtcGxlLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+cGF0aDwvY29kZT48L2R0PjxkZD5UaGUgcGF0aCB0aGF0IGlzIHByZWZpeGVkIHRvCiAgICAgIHNjcmlwdCBmaWxlIG5hbWVzIHdoZW4gdGhleSBhcmUgbG9hZGVkIGludG8gYW4gSUZSQU1FLiAoTm90ZSB0aGF0CiAgICAgIHRoaXMgaXMgbm90IGFwcGxpZWQgdG8gdGhlIHN0eWxlLXNoZWV0IGZpbGUgbmFtZS4pPC9kZD4KCiAgICAgIDxkdD48Y29kZT5wYXJzZXJmaWxlPC9jb2RlPjwvZHQ+PGRkPkEgZmlsZSBuYW1lIHN0cmluZywgb3IgYW4KICAgICAgYXJyYXkgb2Ygc3RyaW5ncyB0aGF0IG5hbWUgdGhlIGZpbGVzIGNvbnRhaW5pbmcgdGhlIHBhcnNlci4gU2VlCiAgICAgIGJlbG93IGZvciB0aGUgaW50ZXJmYWNlIHRoYXQgc3VjaCBhIHBhcnNlciBzaG91bGQKICAgICAgaW1wbGVtZW50LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+YmFzZWZpbGVzPC9jb2RlPjwvZHQ+PGRkPkFuIGFycmF5IG9mIHN0cmluZ3MgbmFtaW5nCiAgICAgIHRoZSBmaWxlcyBjb250YWluaW5nIHRoZSBiYXNlIENvZGVNaXJyb3IgZnVuY3Rpb25hbGl0eS4gRGVmYXVsdHMKICAgICAgdG8gPGNvZGU+WyJ1dGlsLmpzIiwgInN0cmluZ3N0cmVhbS5qcyIsICJzZWxlY3QuanMiLCAidW5kby5qcyIsCiAgICAgICJlZGl0b3IuanMiLCAidG9rZW5pemUuanMiXTwvY29kZT4sIGJ1dCBpZiB5b3UgcHV0IHRoZW0gYWxsIGludG8KICAgICAgYSBzaW5nbGUgZmlsZSB0byByZWR1Y2UgbGF0ZW5jeSwgb3IgYWRkIHNvbWUgZnVuY3Rpb25hbGl0eSwgeW91CiAgICAgIG1pZ2h0IGhhdmUgdG8gYWRqdXN0IHRoYXQuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5pZnJhbWVDbGFzczwvY29kZT48L2R0PjxkZD5TZXQgdGhpcyB0byBhIHN0cmluZyB0bwogICAgICBnaXZlIHRoZSBJRlJBTUUgbm9kZSBjcmVhdGVkIGZvciB0aGUgZWRpdG9yIGEgY3VzdG9tIENTUyBjbGFzcy4KICAgICAgRGVmYXVsdHMgdG8gPGNvZGU+bnVsbDwvY29kZT4uPC9kZD4KICAgICAgCiAgICAgIDxkdD48Y29kZT5wYXNzRGVsYXk8L2NvZGU+PC9kdD48ZGQ+R2l2ZXMgdGhlIGFtb3VudCBvZgogICAgICBtaWxsaXNlY29uZHMgYmV0d2VlbiBjb2xvdXJpbmcgcGFzc2VzLiBEZWZhdWx0cyB0byAyMDAuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5wYXNzVGltZTwvY29kZT48L2R0PjxkZD5TcGVjaWZpZXMgdGhlIG1heGltdW0gYW1vdW50CiAgICAgIG9mIHRpbWUgdGhhdCB0aGUgaGlnaGxpZ2h0ZXIgd2lsbCBzcGVuZCBpbiBvbmUgc2hvdC4gU2V0dGluZwogICAgICB0aGlzIHRvbyBoaWdoIHdpbGwgY2F1c2UgdGhlIGVkaXRvciB0byAnZnJlZXplJyB0aGUgYnJvd3NlciBmb3IKICAgICAgbm90aWNlYWJsZSBpbnRlcnZhbHMuIERlZmF1bHRzIHRvIDUwLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+Y29udGludW91c1NjYW5uaW5nPC9jb2RlPjwvZHQ+PGRkPkNvbmZpZ3VyZSBjb250aW51b3VzCiAgICAgIHNjYW5uaW5nIG9mIHRoZSBkb2N1bWVudC4gV2hlbiA8Y29kZT5mYWxzZTwvY29kZT4sIHNjYW5uaW5nIGlzCiAgICAgIGRpc2FibGVkLiBXaGVuIHNldCB0byBhIG51bWJlciwgc2F5IDxjb2RlPk48L2NvZGU+LCBhCiAgICAgICdiYWNrZ3JvdW5kJyBwcm9jZXNzIHdpbGwgc2NhbiB0aGUgZG9jdW1lbnQgZm9yCiAgICAgIDxjb2RlPnBhc3NUaW1lPC9jb2RlPiAoc2VlIGFib3ZlKSBtaWxsaXNlY29uZHMgZXZlcnkKICAgICAgPGNvZGU+TjwvY29kZT4gbWlsbGlzZWNvbmRzLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55dGhpbmcKICAgICAgY2hhbmdlZC4gVGhpcyBtYWtlcyBzdXJlIG5vbi1sb2NhbCBjaGFuZ2VzIHByb3BhZ2F0ZSB0aHJvdWdoIHRoZQogICAgICBkb2N1bWVudCwgYW5kIHdpbGwgaGVscCBrZWVwIGV2ZXJ5dGhpbmcgY29uc2lzdGVudC4gSXQgZG9lcyBhZGQKICAgICAgZXh0cmEgcHJvY2Vzc2luZyBjb3N0LCBldmVuIGZvciBhbiBpZGxlIGVkaXRvci4gRGVmYXVsdCB2YWx1ZSBpcwogICAgICA8Y29kZT5mYWxzZTwvY29kZT4uPC9kZD4KCiAgICAgIDxkdD48Y29kZT5hdXRvTWF0Y2hQYXJlbnM8L2NvZGU+PC9kdD48ZGQ+V2hlbiA8Y29kZT50cnVlPC9jb2RlPiwKICAgICAgd2lsbCBjYXVzZSBwYXJlbnMgdG8gYmUgbWF0Y2hlZCBldmVyeSB0aW1lIGEga2V5IGlzIHByZXNzZWQgb3IKICAgICAgdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBkb2N1bWVudC4gRGVmYXVsdHMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LgogICAgICBNaWdodCBiZSBleHBlbnNpdmUgZm9yIGJpZyBkb2N1bWVudHMuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5tYXJrUGFyZW48L2NvZGU+LAogICAgICA8Y29kZT51bm1hcmtQYXJlbjwvY29kZT48L2R0PjxkZD5GdW5jdGlvbnMuIENhbiBiZSB1c2VkIHRvCiAgICAgIGN1c3RvbWlzZSB0aGUgd2F5IGJyYWNrZXRzIGFyZSBtYXJrZWQgKGFuZCB1bm1hcmtlZCkgd2hlbgogICAgICBtYXRjaGVkLiBCb3RoIHRha2UgdGhlIGJyYWNrZXQncyA8Y29kZT5TUEFOPC9jb2RlPiBub2RlIGFzIHRoZWlyCiAgICAgIGZpcnN0IGFyZ3VtZW50LCBhbmQgPGNvZGU+bWFya1BhcmVuPC9jb2RlPiB0YWtlcyBhIHNlY29uZAogICAgICBib29sZWFuIGFyZ3VtZW50IGluZGljYXRpbmcgd2hldGhlciBhIHN1Y2Nlc3NmdWwgbWF0Y2ggd2FzCiAgICAgIGZvdW5kLiBUaGUgZGVmYXVsdCBpcyB0byBtYWtlIHRoZSBicmFja2V0cyBib2xkIGFuZCBncmVlbiAob3IKICAgICAgcmVkLCBpZiBub3QgbWF0Y2hlZCkuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5zYXZlRnVuY3Rpb248L2NvZGU+PC9kdD48ZGQ+SWYgZ2l2ZW4gYSBmdW5jdGlvbgogICAgICB2YWx1ZSwgdGhhdCBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgdXNlciBwcmVzc2VzCiAgICAgIGNvbnRyb2wtcy4gWW91IHNob3VsZCBhZHZpc2UgeW91ciBPcGVyYSB1c2VycyB0byB1c2UKICAgICAgY29udHJvbC1zaGlmdC1zIGluc3RlYWQsIHNpbmNlIHBsYWluIGNvbnRyb2wtcyB3aWxsIGJyaW5nIHVwIHRoZQogICAgICAnc2F2ZSBwYWdlJyBkaWFsb2cuIERlZmF1bHRzIHRvIDxjb2RlPm51bGw8L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+dW5kb0RlcHRoPC9jb2RlPjwvZHQ+PGRkPk1heGltdW0gbGVuZ3RoIG9mIHRoZSB1bmRvCiAgICAgIGhpc3RvcnkuIERlZmF1bHQgaXMgNTAuIFRoaXMgc2V0dGluZyBpcyBjaGFuZ2VhYmxlIHdpdGggdGhlCiAgICAgIDxjb2RlPnNldFVuZG9EZXB0aChkZXB0aCk8L2NvZGU+IG1ldGhvZCBvbiBDb2RlTWlycm9yCiAgICAgIGluc3RhbmNlcy48L2RkPgoKICAgICAgPGR0Pjxjb2RlPm9uQ2hhbmdlPC9jb2RlPjwvZHQ+PGRkPkFuIG9wdGlvbmFsIGZ1bmN0aW9uIG9mIHplcm8KICAgICAgYXJndW1lbnRzIHRoYXQgZ2V0cyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGRvY3VtZW50IGlzIGNoYW5nZWQuCiAgICAgIEhhcHBlbnMgYXQgdW5kby1jb21taXQgdGltZSwgbm90IGluc3RhbnRhbmlvdXNseS48L2RkPgoKICAgICAgPGR0Pjxjb2RlPnVuZG9EZWxheTwvY29kZT48L2R0PjxkZD5XaGVuIG5vdGhpbmcgaXMgZG9uZSBpbiB0aGUKICAgICAgZWRpdG9yIGZvciB0aGlzIGFtb3VudCBvZiBtaWxsaXNlY29uZHMsIHBlbmRpbmcgY2hhbmdlcyBnZXQKICAgICAgYWRkZWQgdG8gdGhlIHVuZG8gaGlzdG9yeS4gU2V0dGluZyB0aGlzIGxvd2VyIHdpbGwgZ2l2ZSB0aGUgdW5kbwogICAgICBmdW5jdGlvbmFsaXR5IGEgZmluZXIgZ3JhbnVsYXJpdHkuIERlZmF1bHRzIHRvIDgwMC48L2RkPgoKICAgICAgPGR0Pjxjb2RlPndpZHRoPC9jb2RlPiwgPGNvZGU+aGVpZ2h0PC9jb2RlPjwvZHQ+PGRkPlRoZSBzaXplIG9mCiAgICAgIHRoZSBlZGl0b3IgZnJhbWUsIGdpdmVuIGFzIGEgc3R5bGUtc2hlZXQgcXVhbnRpdGllcyAoZm9yIGV4YW1wbGUKICAgICAgPGNvZGU+IjYwMHB4IjwvY29kZT4gb3IgPGNvZGU+IjEwMCUiPC9jb2RlPikuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5kaXNhYmxlU3BlbGxjaGVjazwvY29kZT48L2R0PjxkZD5TaG91bGQgdGhlIGVkaXRvcgogICAgICBkaXNhYmxlIHNwZWxsLWNoZWNraW5nIG9uIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBpdCAoRmlyZWZveCAyKykuCiAgICAgIERlZmF1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIHNpbmNlIGZvciBtb3N0IGNvZGUgc3BlbGwtY2hlY2tpbmcKICAgICAgaXMgdXNlbGVzcy4gQ2FuIGJlIGNoYW5nZWQgd2l0aCB0aGUKICAgICAgPGNvZGU+c2V0U3BlbGxDaGVjayhvbik8L2NvZGU+IG1ldGhvZC48L2RkPgoKICAgICAgPGR0Pjxjb2RlPnRleHRXcmFwcGluZzwvY29kZT48L2R0PjxkZD5DYW4gYmUgdXNlZCB0byBkaXNhYmxlIG9yCiAgICAgIGVuYWJsZSB0ZXh0LXdyYXBwaW5nIGluIHRoZSBlZGl0b3IgZnJhbWUuIERlZmF1bHQgaXMKICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4uIENoYW5nZWFibGUgd2l0aCB0aGUKICAgICAgPGNvZGU+c2V0VGV4dFdyYXBwaW5nKG9uKTwvY29kZT4gbWV0aG9kLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+bGluZU51bWJlcnM8L2NvZGU+PC9kdD48ZGQ+U2hvdyBsaW5lIG51bWJlcnMgdG8gdGhlCiAgICAgIGxlZnQgb2YgdGhlIGVkaXRvci4gVGhpcyByZXF1aXJlcyB5b3UgdG8gc3BlY2lmeSBhIHN0eWxlIGZvciB0aGUKICAgICAgPGNvZGU+Q29kZU1pcnJvci1saW5lLW51bWJlcnM8L2NvZGU+IENTUyBjbGFzcyAoaW4gdGhlIG91dGVyCiAgICAgIGRvY3VtZW50KSB0byBjb25maWd1cmUgdGhlIHdpZHRoLCBmb250LCBjb2xvcnMsIGV0Y2V0ZXJhIGZvciB0aGUKICAgICAgbGluZS1udW1iZXIgRElWLiBZb3UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCBsaW5lcyBpbiB0aGUKICAgICAgbnVtYmVyaW5nIGVsZW1lbnQgaGF2ZSB0aGUgc2FtZSBoZWlnaHQgYXMgbGluZXMgaW4gdGhlIGVkaXRvci4KICAgICAgVGhpcyBpcyBtb3N0IGVhc2lseSBkb25lIGJ5IGdpdmluZyB0aGVtIGJvdGggdGhlIHNhbWUgZm9udCBhbmQKICAgICAgYW4gYWJzb2x1dGUgKCdwdCcgb3IgJ3B4JykgZm9udCBzaXplLiBUaGlzIG9wdGlvbiBkZWZhdWx0cyB0bwogICAgICA8Y29kZT5mYWxzZTwvY29kZT4uIENoYW5nZWFibGUgd2l0aCB0aGUKICAgICAgPGNvZGU+c2V0TGluZU51bWJlcnMob24pPC9jb2RlPiBtZXRob2QuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5saW5lTnVtYmVyRGVsYXk8L2NvZGU+LAogICAgICA8Y29kZT5saW5lTnVtYmVyVGltZTwvY29kZT48L2R0PjxkZD5XaGVuIGJvdGggbGluZSBudW1iZXJzIGFyZQogICAgICBhbmQgdGV4dCB3cmFwcGluZyBhcmUgdHVybmVkIG9uLCB1cGRhdGluZyBsaW5lIG51bWJlcnMgY2FuIGJlCiAgICAgIGV4cGVuc2l2ZS4gVGhlc2Ugc2V0dGluZ3MgY2FuIGJlIHVzZWQgdG8gY29udHJvbCBob3cgZmFzdCB0aGUKICAgICAgdXBkYXRpbmcgaGFwcGVucyAmI3gyMDE1OyB0aGV5IHdvcmsgaW4gdGhlIHNhbWUgd2F5IGFzCiAgICAgIDxjb2RlPnBhc3NEZWxheTwvY29kZT4gYW5kIDxjb2RlPnBhc3NUaW1lPC9jb2RlPi48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmluZGVudFVuaXQ8L2NvZGU+PC9kdD48ZGQ+QW4gaW50ZWdlciB0aGF0IHNwZWNpZmllcwogICAgICB0aGUgYW1vdW50IG9mIHNwYWNlcyBvbmUgJ2xldmVsJyBvZiBpbmRlbnRhdGlvbiBzaG91bGQgYWRkLgogICAgICBEZWZhdWx0IGlzIDxjb2RlPjI8L2NvZGU+LiBDaGFuZ2VhYmxlIGluIGEgcnVubmluZyBlZGl0b3IgdXNpbmcKICAgICAgdGhlIDxjb2RlPnNldEluZGVudFVuaXQoc3BhY2VzKTwvY29kZT4gbWV0aG9kLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+dGFiTW9kZTwvY29kZT48L2R0PjxkZD5EZXRlcm1pbmVzIHdoYXQgdGhlIGVmZmVjdCBvZgogICAgICBwcmVzc2luZyB0YWIgaXMuIFBvc3NpYmlsaXRpZXMgYXJlOgogICAgICA8ZGw+CiAgICAgICAgPGR0Pjxjb2RlPiJpbmRlbnQiPC9jb2RlPjwvZHQ+PGRkPlRoZSBkZWZhdWx0LiBDYXVzZXMgdGFiIHRvCiAgICAgICAgYWRqdXN0IHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgc2VsZWN0aW9uIG9yIGN1cnJlbnQgbGluZSB1c2luZwogICAgICAgIHRoZSBwYXJzZXIncyBydWxlcy48L2RkPgogICAgICAgIDxkdD48Y29kZT4ic3BhY2VzIjwvY29kZT48L2R0PjxkZD5QcmVzc2luZyB0YWIgc2ltcGx5IGluc2VydHMKICAgICAgICBmb3VyIHNwYWNlcy48L2RkPgogICAgICAgIDxkdD48Y29kZT4iZGVmYXVsdCI8L2NvZGU+PC9kdD48ZGQ+Q29kZU1pcnJvciBkb2VzIG5vdAogICAgICAgIGludGVyZmVyZSB3aXRoIHRoZSB0YWIga2V5LCBidXQgbGVhdmVzIGl0IHRvIHRoZSBicm93c2VyIHRvCiAgICAgICAgaGFuZGxlIGl0LiBCaW5kcyBzaGlmdC1zcGFjZSB0byByZWd1bGFyIGluZGVudGF0aW9uCiAgICAgICAgYmVoYXZpb3VyLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPiJzaGlmdCI8L2NvZGU+PC9kdD48ZGQ+UHJlc3NpbmcgdGFiIGluZGVudHMgdGhlCiAgICAgICAgY3VycmVudCBsaW5lIChvciBzZWxlY3Rpb24pIG9uZSA8Y29kZT5pbmRlbnRVbml0PC9jb2RlPgogICAgICAgIGRlZXBlciwgcHJlc3Npbmcgc2hpZnQtdGFiLCB1bi1pbmRlbnRzIGl0LjwvZGQ+CiAgICAgIDwvZGw+CiAgICAgIFRoaXMgb3B0aW9uIGNhbiBiZSBjaGFuZ2VkIGF0IHJ1bi10aW1lIHVzaW5nIHRoZQogICAgICA8Y29kZT5zZXRUYWJNb2RlKG1vZGUpPC9jb2RlPiBtZXRob2QuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5yZWluZGVudE9uTG9hZDwvY29kZT48L2R0PjxkZD5XaGVuIDxjb2RlPnRydWU8L2NvZGU+LAogICAgICB0aGlzIGNhdXNlcyB0aGUgY29udGVudCBvZiB0aGUgZWRpdG9yIHRvIGJlIHJlaW5kZW50ZWQKICAgICAgaW1tZWRpYXRlbHkgd2hlbiB0aGUgZWRpdG9yIGxvYWRzLiBEZWZhdWx0cyB0bwogICAgICA8Y29kZT5mYWxzZTwvY29kZT4uPC9kZD4KCiAgICAgIDxkdD48Y29kZT5yZWFkT25seTwvY29kZT48L2R0PjxkZD5XaGVuIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwKICAgICAgdGhlIGRvY3VtZW50IGlzIG5vdCBlZGl0YWJsZS48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmluaXRDYWxsYmFjazwvY29kZT48L2R0PjxkZD5JZiBzZXQgdG8gYSBmdW5jdGlvbiwgdGhpcwogICAgICB3aWxsIGJlIGNhbGxlZCAod2l0aCB0aGUgZWRpdG9yIG9iamVjdCBhcyBpdHMgYXJndW1lbnQpIGFmdGVyCiAgICAgIHRoZSBlZGl0b3IgaGFzIGZpbmlzaGVkIGluaXRpYWxpc2luZy48L2RkPgogICAgICAKICAgICAgPGR0Pjxjb2RlPmN1cnNvckFjdGl2aXR5PC9jb2RlPjwvZHQ+PGRkPkEgZnVuY3Rpb24gdGhhdCBpcwogICAgICBjYWxsZWQgZXZlcnkgdGltZSB0aGUgY3Vyc29yIG1vdmVzLCB3aXRoIHRoZSB0b3AtbGV2ZWwgbm9kZSB0aGF0CiAgICAgIHRoZSBjdXJzb3IgaXMgaW5zaWRlIG9yIG5leHQgdG8gYXMgYW4gYXJndW1lbnQuIENhbiBiZSB1c2VkIHRvCiAgICAgIGhhdmUgc29tZSBjb250cm9scyByZWFjdCB0byB0aGUgY29udGV4dCBvZiB0aGUgY3Vyc29yLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+YWN0aXZlVG9rZW5zPC9jb2RlPjwvZHQ+PGRkPkNhbiBiZSBzZXQgdG8gYSBmdW5jdGlvbgogICAgICB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggPGNvZGU+KHNwYW5Ob2RlLCB0b2tlbk9iamVjdCwKICAgICAgZWRpdG9yKTwvY29kZT4gYXJndW1lbnRzIHdoZW5ldmVyIGEgbmV3IHRva2VuIG5vZGUgaXMgYmVpbmcKICAgICAgYWRkZWQgdG8gdGhlIGRvY3VtZW50LiBDYW4gYmUgdXNlZCB0byBkbyB0aGluZ3MgbGlrZSBhZGQgZXZlbnQKICAgICAgaGFuZGxlcnMgdG8gbm9kZXMuIFNob3VsZCA8ZW0+bm90PC9lbT4gY2hhbmdlIHRoZSBET00gc3RydWN0dXJlCiAgICAgIG9mIHRoZSBub2RlIChzbyBubyB0dXJuaW5nIHRoZSBzcGFuIGludG8gYSBsaW5rKSwgc2luY2UgdGhpcwogICAgICB3aWxsIGdyZWF0bHkgY29uZnVzZSB0aGUgZWRpdG9yLjwvZGQ+CgogICAgICA8ZHQgaWQ9InBhcnNlckNvbmZpZyI+PGNvZGU+cGFyc2VyQ29uZmlnPC9jb2RlPjwvZHQ+PGRkPkFuCiAgICAgIG9iamVjdCB2YWx1ZSB0aGF0IGlzIHBhc3NlZCBhbG9uZyB0byB0aGUgcGFyc2VyIHRvIGNvbmZpZ3VyZSBpdC4KICAgICAgV2hhdCB0aGlzIG9iamVjdCBzaG91bGQgbG9vayBsaWtlIGRlcGVuZHMgb24gdGhlIHBhcnNlcgogICAgICB1c2VkLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+Y29udGVudDwvY29kZT48L2R0PjxkZD5UaGUgc3RhcnRpbmcgY29udGVudCBvZiB0aGUKICAgICAgZWRpdG9yLiBZb3UnbGwgcHJvYmFibHkgbm90IHdhbnQgdG8gcHJvdmlkZSBhIGdsb2JhbCBkZWZhdWx0IGZvcgogICAgICB0aGlzLCBidXQgYWRkIGl0IHRvIHRoZSA8Y29kZT5vcHRpb25zPC9jb2RlPiBvYmplY3QgcGFzc2VkIHRvCiAgICAgIGluZGl2aWR1YWwgZWRpdG9ycyBhcyB0aGV5IGFyZSBjcmVhdGVkLjwvZGQ+CgogICAgPC9kbD4KCiAgICA8aDIgaWQ9InBhcnNlcnMiPlBhcnNlcnM8L2gyPgoKICAgIDxwPihJZiB5b3Ugd2FudCB0byB1c2UgYSBDb2RlTWlycm9yIHBhcnNlciB0byBoaWdobGlnaHQgYSBwaWVjZSBvZgogICAgdGV4dCwgd2l0aG91dCBjcmVhdGluZyBhbiBlZGl0b3IsIHNlZSA8YQogICAgaHJlZj0iaGlnaGxpZ2h0Lmh0bWwiPnRoaXMgZXhhbXBsZTwvYT4sIGFuZCB0aGUgPGNvZGU+PGEKICAgIGhyZWY9ImpzL2hpZ2hsaWdodC5qcyI+aGlnaGxpZ2h0LmpzPC9hPjwvY29kZT4gc2NyaXB0Lik8L3A+CgogICAgPHA+VGhlIGZvbGxvd2luZyBwYXJzZXJzIGNvbWUgd2l0aCB0aGUgZGlzdHJpYnV0aW9uIG9mIENvZGVNaXJyb3I6PC9wPgoKICAgIDxkbD4KICAgICAgPGR0Pjxjb2RlPjxhIGhyZWY9ImpzL3BhcnNleG1sLmpzIj5wYXJzZXhtbC5qczwvYT48L2NvZGU+ICg8YQogICAgICBocmVmPSJodG1sdGVzdC5odG1sIj5kZW1vPC9hPik8L2R0PjxkZD5BIEhUTUwvWE1MIHBhcnNlci4gVGFrZXMKICAgICAgYSA8Y29kZT51c2VIVE1MS2x1ZGdlczwvY29kZT4gY29uZmlndXJhdGlvbiBvcHRpb24gKHNlZSB0aGUKICAgICAgPGNvZGU+PGEgaHJlZj0iI3BhcnNlckNvbmZpZyI+cGFyc2VyQ29uZmlnPC9hPjwvY29kZT4gb3B0aW9uCiAgICAgIGFib3ZlKSwgd2hpY2ggc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNvbnRlbnQgb2YgdGhlIGVkaXRvciBpcwogICAgICBIVE1MIG9yIFhNTCwgYW5kIHRoaW5ncyBsaWtlIHNlbGYtY2xvc2luZyB0YWdzICg8Y29kZT5icjwvY29kZT4sCiAgICAgIDxjb2RlPmltZzwvY29kZT4pIGV4aXN0LiBUaGlzIGRlZmF1bHRzIHRvIDxjb2RlPnRydWU8L2NvZGU+LgogICAgICBFeGFtcGxlIGNvbG91cnMgZm9yIHRoZSBzdHlsZXMgdGhhdCB0aGlzIHBhcnNlciB1c2VzIGFyZSBkZWZpbmVkCiAgICAgIGluIDxjb2RlPjxhCiAgICAgIGhyZWY9ImNzcy94bWxjb2xvcnMuY3NzIj5jc3MveG1sY29sb3JzLmNzczwvYT48L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+PGEKICAgICAgaHJlZj0ianMvdG9rZW5pemVqYXZhc2NyaXB0LmpzIj50b2tlbml6ZWphdmFzY3JpcHQuanM8L2E+PC9jb2RlPiwKICAgICAgPGNvZGU+PGEKICAgICAgaHJlZj0ianMvcGFyc2VqYXZhc2NyaXB0LmpzIj5wYXJzZWVqYXZhc2NyaXB0LmpzPC9hPjwvY29kZT4gKDxhCiAgICAgIGhyZWY9ImpzdGVzdC5odG1sIj5kZW1vPC9hPik8L2R0PjxkZD5UaGUgSmF2YVNjcmlwdCBwYXJzZXIuCiAgICAgIEV4YW1wbGUgY29sb3VycyBpbiA8Y29kZT48YQogICAgICBocmVmPSJjc3MvanNjb2xvcnMuY3NzIj5jc3MvanNjb2xvcnMuY3NzPC9hPjwvY29kZT4uIFRha2VzIG9uZQogICAgICBjb25maWd1cmF0aW9uIG9wdGlvbiwgPGNvZGU+anNvbjwvY29kZT4sIHRoYXQgY2FuIGJlIHNldCB3aGVuCiAgICAgIHRoZSBlZGl0b3IgY29udGVudCBpcyBKU09OIGRhdGEuIEl0IGNhdXNlcyBldmVyeSBvcGVuaW5nIGJyYWNlCiAgICAgIHRvIGJlIHRyZWF0ZWQgYXMgdGhlIHN0YXJ0IG9mIGFuIG9iamVjdCwgcmF0aGVyIHRoYW4gYQogICAgICBibG9jay48L2RkPgoKICAgICAgPGR0Pjxjb2RlPjxhIGhyZWY9ImpzL3BhcnNlY3NzLmpzIj5wYXJzZWNzcy5qczwvYT48L2NvZGU+ICg8YQogICAgICBocmVmPSJjc3N0ZXN0Lmh0bWwiPmRlbW88L2E+KTwvZHQ+PGRkPkEgQ1NTIHBhcnNlci4gU3R5bGVzIGluCiAgICAgIDxjb2RlPjxhCiAgICAgIGhyZWY9ImNzcy9jc3Njb2xvcnMuY3NzIj5jc3MvY3NzY29sb3JzLmNzczwvYT48L2NvZGU+PC9kZD4KCiAgICAgIDxkdD48Y29kZT48YQogICAgICBocmVmPSJqcy9wYXJzZWh0bWxtaXhlZC5qcyI+cGFyc2VodG1sbWl4ZWQuanM8L2E+PC9jb2RlPiAoPGEKICAgICAgaHJlZj0ibWl4ZWR0ZXN0Lmh0bWwiPmRlbW88L2E+KTwvZHQ+PGRkPkEgbWl4ZWQtbW9kZSBIVE1MCiAgICAgIHBhcnNlci4gUmVxdWlyZXMgdGhlIFhNTCwgSmF2YVNjcmlwdCwgYW5kIENTUyBwYXJzZXJzIHRvIGFsc28gYmUKICAgICAgbG9hZGVkLCBzbyB5b3VyIDxjb2RlPnBhcnNlcmZpbGU8L2NvZGU+IG9wdGlvbiBsb29rcyBzb21ldGhpbmcKICAgICAgbGlrZSA8Y29kZT5bInBhcnNleG1sLmpzIiwgInBhcnNlY3NzLmpzIiwKICAgICAgInRva2VuaXplamF2YXNjcmlwdC5qcyIsICJwYXJzZWphdmFzY3JpcHQuanMiLAogICAgICAicGFyc2VodG1sbWl4ZWQuanMiXTwvY29kZT4uPC9kZD4KCiAgICAgIDxkdD48Y29kZT48YSBocmVmPSJqcy9wYXJzZXNwYXJxbC5qcyI+cGFyc2VzcGFycWwuanM8L2E+PC9jb2RlPgogICAgICAoPGEgaHJlZj0ic3BhcnFsdGVzdC5odG1sIj5kZW1vPC9hPik8L2R0PjxkZD5QYXJzZXMgdGhlIDxhCiAgICAgIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU1BBUlFMIj5TUEFSUUw8L2E+IHF1ZXJ5CiAgICAgIGxhbmd1YWdlLiBFeGFtcGxlIHN0eWxlcyBpbiA8Y29kZT48YQogICAgICBocmVmPSJjc3Mvc3BhcnFsY29sb3JzLmNzcyI+Y3NzL3NwYXJxbGNvbG9ycy5jc3M8L2E+PC9jb2RlPjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+PGEKICAgICAgaHJlZj0ianMvcGFyc2VkdW1teS5qcyI+cGFyc2VkdW1teS5qczwvYT48L2NvZGU+PC9kdD48ZGQ+QQogICAgICAnZHVtbXknIHBhcnNlciB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGVkaXQgcGxhaW4gdGV4dCwgb3IKICAgICAgZG9jdW1lbnRzIGZvciB3aGljaCBubyBzdWl0YWJsZSBwYXJzZXIgZXhpc3RzLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+PGEKICAgICAgaHJlZj0iY29udHJpYi9waHAvanMvcGFyc2VwaHAuanMiPmNvbnRyaWIvcGhwL2pzL3BhcnNlcGhwLmpzPC9hPjwvY29kZT4KICAgICAgKDxhIGhyZWY9ImNvbnRyaWIvcGhwL2luZGV4Lmh0bWwiPmRlbW88L2E+KTwvZHQ+PGRkPlBIUAogICAgICBwYXJzZXIuPC9kZD4KCiAgICAgIDxkdD48Y29kZT48YQogICAgICBocmVmPSJjb250cmliL3B5dGhvbi9qcy9wYXJzZXB5dGhvbi5qcyI+Y29udHJpYi9weXRob24vanMvcGFyc2VweXRob24uanM8L2E+PC9jb2RlPgogICAgICAoPGEgaHJlZj0iY29udHJpYi9weXRob24vaW5kZXguaHRtbCI+ZGVtbzwvYT4pPC9kdD48ZGQ+UHl0aG9uCiAgICAgIHBhcnNlci48L2RkPgoKICAgICAgPGR0Pjxjb2RlPjxhIGhyZWY9ImNvbnRyaWIvbHVhL2pzL3BhcnNlbHVhLmpzIj5jb250cmliL2x1YS9qcy9wYXJzZWx1YS5qczwvYT48L2NvZGU+CiAgICAgICg8YSBocmVmPSJjb250cmliL2x1YS9pbmRleC5odG1sIj5kZW1vPC9hPik8L2R0PjxkZD5MdWEKICAgICAgcGFyc2VyLjwvZGQ+CgogICAgPC9kbD4KCiAgICA8aDIgaWQ9InByb2dyYW1taW5nIj5Qcm9ncmFtbWluZyBJbnRlcmZhY2U8L2gyPgoKICAgIDxwPlRvIGJlIGFzIGZsZXhpYmxlIGFzIHBvc3NpYmxlLCBDb2RlTWlycm9yIGltcGxlbWVudHMgYSB2ZXJ5CiAgICBwbGFpbiBlZGl0YWJsZSBmaWVsZCwgd2l0aG91dCBhbnkgYWNjb21wYW55aW5nIGJ1dHRvbnMsIGJlbGxzLCBhbmQKICAgIHdoaXN0bGVzLiA8Y29kZT5Db2RlTWlycm9yPC9jb2RlPiBvYmplY3RzIGRvLCBob3dldmVyLCBwcm92aWRlIGEKICAgIG51bWJlciBvZiBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgbWFrZSBpdCBwb3NzaWJsZSB0byBhZGQKICAgIGV4dHJhIGZ1bmN0aW9uYWxpdHkgYXJvdW5kIHRoZSBlZGl0b3IuIDxhCiAgICBocmVmPSJqcy9taXJyb3JmcmFtZS5qcyI+PGNvZGU+bWlycm9yZnJhbWUuanM8L2NvZGU+PC9hPiBwcm92aWRlcwogICAgYSBiYXNpYyBleGFtcGxlIG9mIHRoZWlyIHVzYWdlLjwvcD4KCiAgICA8aDM+UHJvcGVydGllczwvaDM+CgogICAgPGRsPgogICAgICA8ZHQ+PGNvZGU+ZnJhbWU8L2NvZGU+PC9kdD48ZGQ+VGhlIGVkaXRhYmxlIGZyYW1lLjwvZGQ+CiAgICAgIDxkdD48Y29kZT53aW48L2NvZGU+PC9kdD48ZGQ+VGhlIHdpbmRvdyBvZiB0aGUgZWRpdGFibGUgZnJhbWUuCiAgICAgIE1vc3RseSB1c2VmdWwgZm9yIGF0dGFjaGluZyBldmVudCBoYW5kbGVycy48L2RkPgogICAgICA8ZHQ+PGNvZGU+d3JhcHBpbmc8L2NvZGU+PC9kdD48ZGQ+VGhlIDxjb2RlPkRJVjwvY29kZT4gZWxlbWVudAogICAgICB3cmFwcGVkIGFyb3VuZCB0aGUgZnJhbWUuIFRoaXMgYWx3YXlzIGhhcyBhIENTUyBjbGFzcyBvZgogICAgICA8Y29kZT5Db2RlTWlycm9yLXdyYXBwaW5nPC9jb2RlPi48L2RkPgogICAgPC9kbD4KCiAgICA8aDM+TWV0aG9kczwvaDM+CgogICAgPGRsPgogICAgICA8ZHQ+PGNvZGU+Z2V0Q29kZSgpPC9jb2RlPiAmIzg1OTQ7CiAgICAgIDxjb2RlPnN0cmluZzwvY29kZT48L2R0PjxkZD5SZXR1cm5zIHRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlCiAgICAgIGVkaXRvciwgYXMgYSBzdHJpbmcuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5zZXRDb2RlKHN0cmluZyk8L2NvZGU+PC9kdD48ZGQ+UmVwbGFjZXMgdGhlIGN1cnJlbnQKICAgICAgY29udGVudCBvZiB0aGUgZWRpdG9yIHdpdGggdGhlIGdpdmVuIHZhbHVlLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+Zm9jdXMoKTwvY29kZT48L2R0PjxkZD5HaXZlcyBmb2N1cyB0byB0aGUgZWRpdG9yCiAgICAgIGZyYW1lLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+Y3VycmVudExpbmUoKTwvY29kZT4gJiM4NTk0OwogICAgICA8Y29kZT5udW1iZXI8L2NvZGU+PC9kdD48ZGQ+UmV0dXJucyB0aGUgbGluZSBvbiB3aGljaCB0aGUgY3Vyc29yCiAgICAgIGlzIGN1cnJlbnRseSBzaXR0aW5nLiA8c3BhbiBjbGFzcz0id2FybiI+KERlcHJlY2F0ZWQsIHNlZSB0aGUKICAgICAgbGluZS1iYXNlZCBpbnRlcmZhY2UgYmVsb3cpPC9zcGFuPjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+anVtcFRvTGluZShudW1iZXIpPC9jb2RlPjwvZHQ+PGRkPk1vdmVzIHRoZSBjdXJzb3IgdG8KICAgICAgdGhlIHN0YXJ0IG9mIHRoZSBnaXZlbiBsaW5lLiA8c3BhbgogICAgICBjbGFzcz0id2FybiI+KERlcHJlY2F0ZWQpPC9zcGFuPjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+c2VsZWN0aW9uKCk8L2NvZGU+ICYjODU5NDsKICAgICAgPGNvZGU+c3RyaW5nPC9jb2RlPjwvZHQ+PGRkPlJldHVybnMgdGhlIHRleHQgdGhhdCBpcyBjdXJyZW50bHkKICAgICAgc2VsZWN0ZWQgaW4gdGhlIGVkaXRvci48L2RkPgoKICAgICAgPGR0Pjxjb2RlPnJlcGxhY2VTZWxlY3Rpb24oc3RyaW5nKTwvY29kZT48L2R0PjxkZD5SZXBsYWNlcyB0aGUKICAgICAgY3VycmVudGx5IHNlbGVjdGVkIHRleHQgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLiBXaWxsIGFsc28gY2F1c2UKICAgICAgdGhlIGVkaXRvciBmcmFtZSB0byBnYWluIGZvY3VzLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+cmVpbmRlbnQoKTwvY29kZT48L2R0PjxkZD5BdXRvbWF0aWNhbGx5IHJlLWluZGVudCB0aGUKICAgICAgd2hvbGUgZG9jdW1lbnQuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5yZWluZGVudFNlbGVjdGlvbigpPC9jb2RlPjwvZHQ+PGRkPkF1dG9tYXRpY2FsbHkKICAgICAgcmUtaW5kZW50IHRoZSBzZWxlY3RlZCBsaW5lcy48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmdldFNlYXJjaEN1cnNvcihzdHJpbmcsIGF0Q3Vyc29yLCBjYXNlRm9sZCk8L2NvZGU+CiAgICAgICYjODU5NDsgPGNvZGU+Y3Vyc29yPC9jb2RlPjwvZHQ+PGRkPlRoZSBmaXJzdCBhcmd1bWVudCBpbmRpY2F0ZXMKICAgICAgdGhlIHN0cmluZyB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZCBmb3IsIGFuZCB0aGUgc2Vjb25kIGluZGljYXRlcwogICAgICB3aGV0aGVyIHNlYXJjaGluZyBzaG91bGQgc3RhcnQgYXQgdGhlIGN1cnNvciAoPGNvZGU+dHJ1ZTwvY29kZT4pCiAgICAgIG9yIGF0IHRoZSBzdGFydCBvZiB0aGUgZG9jdW1lbnQgKDxjb2RlPmZhbHNlPC9jb2RlPikuIFdoZW4KICAgICAgPGNvZGU+Y2FzZUZvbGQ8L2NvZGU+IGlzIHRydWUsIHRoZSBzZWFyY2ggd2lsbCBiZQogICAgICBjYXNlLWluc2Vuc2l2aXZlLiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFuIGludGVyZmFjZQogICAgICBmb3Igc2VhcmNoaW5nLiBDYWxsIGl0cyA8Y29kZT5maW5kTmV4dCgpPC9jb2RlPiBtZXRob2QgdG8gc2VhcmNoCiAgICAgIGZvciBhbiBvY2N1cnJlbmNlIG9mIHRoZSBnaXZlbiBzdHJpbmcuIFRoaXMgcmV0dXJucwogICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiBzb21ldGhpbmcgaXMgZm91bmQsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPgogICAgICBpZiB0aGUgZW5kIG9mIGRvY3VtZW50IGlzIHJlYWNoZWQuIFdoZW4gYW4gb2NjdXJyZW5jZSBoYXMgYmVlbgogICAgICBmb3VuZCwgeW91IGNhbiBjYWxsIDxjb2RlPnNlbGVjdCgpPC9jb2RlPiB0byBzZWxlY3QgaXQsIG9yCiAgICAgIDxjb2RlPnJlcGxhY2Uoc3RyaW5nKTwvY29kZT4gdG8gcmVwbGFjZSBpdCB3aXRoIGEgZ2l2ZW4gc3RyaW5nLgogICAgICBOb3RlIHRoYXQgbGV0dGluZyB0aGUgdXNlciBjaGFuZ2UgdGhlIGRvY3VtZW50LCBvcgogICAgICBwcm9ncmFtbWF0aWNhbGx5IGNoYW5naW5nIGl0IGluIGFueSB3YXkgZXhjZXB0IGZvciBjYWxsaW5nCiAgICAgIDxjb2RlPnJlcGxhY2U8L2NvZGU+IG9uIHRoZSBjdXJzb3IgaXRzZWxmLCBtaWdodCBjYXVzZSBhIGN1cnNvcgogICAgICBvYmplY3QgdG8gc2tpcCBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+dW5kbygpPC9jb2RlPjwvZHQ+PGRkPlVuZG8gb25lIGNoYW5nZXNldCwgaWYgYXZhaWxhYmxlLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5yZWRvKCk8L2NvZGU+PC9kdD48ZGQ+UmVkbyBvbmUgY2hhbmdlc2V0LCBpZiBhdmFpbGFibGUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPmhpc3RvcnlTaXplKCkgJiM4NTk0OyBvYmplY3Q8L2NvZGU+PC9kdD48ZGQ+R2V0IGEKICAgICAgPGNvZGU+e3VuZG8sIHJlZG99PC9jb2RlPiBvYmplY3QgaG9sZGluZyB0aGUgc2l6ZXMgb2YgdGhlIHVuZG8KICAgICAgYW5kIHJlZG8gaGlzdG9yaWVzLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5jbGVhckhpc3RvcnkoKTwvY29kZT48L2R0PjxkZD5Ecm9wIGFsbCBoaXN0b3J5CiAgICAgIGluZm9ybWF0aW9uLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+Z3JhYktleXMoY2FsbGJhY2ssIGZpbHRlcik8L2NvZGU+PC9kdD48ZGQ+Um91dGUKICAgICAga2V5Ym9hcmQgaW5wdXQgaW4gdGhlIGVkaXRvciB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uLiBUaGlzCiAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGEgc2xpZ2h0bHkgbm9ybWFsaXNlZCAoc2VlCiAgICAgIDxjb2RlPm5vcm1hbGl6ZUV2ZW50PC9jb2RlPiBpbiA8YQogICAgICBocmVmPSJqcy91dGlsLmpzIj48Y29kZT51dGlsLmpzPC9jb2RlPjwvYT4pIDxjb2RlPmtleWRvd248L2NvZGU+CiAgICAgIGV2ZW50IG9iamVjdC4gSWYgYSBzZWNvbmQgYXJndW1lbnQgaXMgZ2l2ZW4sIHRoaXMgd2lsbCBiZSB1c2VkCiAgICAgIHRvIGRldGVybWluZSB3aGljaCBldmVudHMgdG8gYXBwbHkgdGhlIGNhbGxiYWNrIHRvLiBJdCBzaG91bGQKICAgICAgdGFrZSBhIGtleSBjb2RlIChhcyBpbiA8Y29kZT5ldmVudC5rZXlDb2RlPC9jb2RlPiksIGFuZCByZXR1cm4gYQogICAgICBib29sZWFuLCB3aGVyZSA8Y29kZT50cnVlPC9jb2RlPiBtZWFucyB0aGUgZXZlbnQgc2hvdWxkIGJlCiAgICAgIHJvdXRlZCB0byB0aGUgY2FsbGJhY2ssIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gbGVhdmVzIHRoZSBrZXkgdG8KICAgICAgcGVyZm9ybSBpdHMgbm9ybWFsIGJlaGF2aW91ci48L2RkPgogICAgICA8ZHQ+PGNvZGU+dW5ncmFiS2V5cygpPC9jb2RlPjwvZHQ+PGRkPlJldmVydCB0aGUgZWZmZWN0IG9mCiAgICAgIDxjb2RlPmdyYWJLZXlzPC9jb2RlPi48L2RkPgoKICAgICAgPGR0Pjxjb2RlPnNldFBhcnNlcihuYW1lKTwvY29kZT48L2R0PjxkZD5DaGFuZ2UgdGhlIGFjdGl2ZQogICAgICBwYXJzZXIuIFRvIHVzZSB0aGlzIHlvdSdsbCBoYXZlIHRvIGxvYWQgbW9yZSB0aGFuIG9uZSBwYXJzZXIKICAgICAgKHB1dCB0aGUgb25lIHlvdSB3YW50IHRvIHVzZSBhcyBkZWZhdWx0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QpLgogICAgICBUaGVuIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlCiAgICAgIHBhcnNlciB5b3Ugd2FudCB0byBzd2l0Y2ggdG8gKHNlZSB0aGUgcGFyc2VyIHNjcmlwdCBmaWxlIHRvIGZpbmQKICAgICAgdGhlIG5hbWUsIGl0J2xsIGJlIHNvbWV0aGluZyBsaWtlIDxjb2RlPkNTU1BhcnNlcjwvY29kZT4pLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxwPkZvciBkZXRhaWxlZCBpbnRlcmFjdGlvbiB3aXRoIHRoZSBjb250ZW50IG9mIHRoZSBlZGl0b3IsCiAgICBDb2RlTWlycm9yIGV4cG9zZXMgYSBsaW5lLW9yaWVudGVkIGludGVyZmFjZSwgd2hpY2ggYWxsb3dzIHlvdSB0bwogICAgaW5zcGVjdCBhbmQgbWFuaXB1bGF0ZSB0aGUgZG9jdW1lbnQgbGluZSBieSBsaW5lLiBMaW5lIGhhbmRsZXMKICAgIHNob3VsZCBiZSBjb25zaWRlcmVkIG9wYXF1ZSAodGhleSBhcmUgaW4gZmFjdCB0aGUgPGNvZGU+QlI8L2NvZGU+CiAgICBub2RlcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUpLCBleGNlcHQgdGhhdCB0aGUgdmFsdWUKICAgIDxjb2RlPmZhbHNlPC9jb2RlPiAoYnV0IDxlbT5ub3Q8L2VtPiA8Y29kZT5udWxsPC9jb2RlPikgYWx3YXlzCiAgICBkZW5vdGVzIGFuIGludmFsaWQgdmFsdWUuIFNpbmNlIGNoYW5naW5nIHRoZSBkb2N1bWVudCBtaWdodCBjYXVzZQogICAgc29tZSBsaW5lIGhhbmRsZXMgdG8gYmVjb21lIGludmFsaWQsIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgdGFrZXMKICAgIHRoZW0gYXMgYXJndW1lbnQgY2FuIHRocm93CiAgICA8Y29kZT5Db2RlTWlycm9yLkludmFsaWRMaW5lSGFuZGxlPC9jb2RlPi4gVGhlc2UgYXJlIHRoZSByZWxldmFudAogICAgbWV0aG9kczo8L3A+CgogICAgPGRsPgogICAgICA8ZHQ+PGNvZGU+Y3Vyc29yUG9zaXRpb24oc3RhcnQpPC9jb2RlPiAmIzg1OTQ7CiAgICAgIDxjb2RlPm9iamVjdDwvY29kZT48L2R0PjxkZD5SZXRyaWV2ZSBhIDxjb2RlPntsaW5lLAogICAgICBjaGFyYWN0ZXJ9PC9jb2RlPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjdXJzb3IgcG9zaXRpb24uCiAgICAgIDxjb2RlPnN0YXJ0PC9jb2RlPiBkZWZhdWx0cyB0byA8Y29kZT50cnVlPC9jb2RlPiBhbmQgZGV0ZXJtaW5lcwogICAgICBpZiB0aGUgc3RhcnRwb2ludCBvciB0aGUgZW5kcG9pbnQgb2YgdGhlIHNlbGVjdGlvbiBpcyB1c2VkLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5maXJzdExpbmUoKTwvY29kZT4gJiM4NTk0OwogICAgICA8Y29kZT5oYW5kbGU8L2NvZGU+PC9kdD48ZGQ+R2V0IHRoZSBmaXJzdCBsaW5lIG9mIHRoZQogICAgICBkb2N1bWVudC48L2RkPgogICAgICA8ZHQ+PGNvZGU+bGFzdExpbmUoKTwvY29kZT4gJiM4NTk0OwogICAgICA8Y29kZT5oYW5kbGU8L2NvZGU+PC9kdD48ZGQ+VGhlIGxhc3QgbGluZS48L2RkPgogICAgICA8ZHQ+PGNvZGU+bmV4dExpbmUoaGFuZGxlKTwvY29kZT4gJiM4NTk0OwogICAgICA8Y29kZT5oYW5kbGU8L2NvZGU+PC9kdD48ZGQ+R2V0IHRoZSBsaW5lIGFmdGVyIHRoZSBnaXZlbiBvbmUsIG9yCiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGF0IHdhcyB0aGUgbGFzdCBsaW5lLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5wcmV2TGluZShoYW5kbGUpPC9jb2RlPiAmIzg1OTQ7CiAgICAgIDxjb2RlPmhhbmRsZTwvY29kZT48L2R0PjxkZD5GaW5kIHRoZSBsaW5lIGJlZm9yZSB0aGUgZ2l2ZW4gb25lLAogICAgICByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoYXQgd2FzIHRoZSBmaXJzdCBsaW5lLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5udGhMaW5lKG51bWJlcik8L2NvZGU+ICYjODU5NDsKICAgICAgPGNvZGU+aGFuZGxlPC9jb2RlPjwvZHQ+PGRkPkZpbmQgdGhlIE50aCBsaW5lIG9mIHRoZSBkb2N1bWVudC4KICAgICAgTm90ZSB0aGF0IHRoZSBmaXJzdCBsaW5lIGNvdW50cyBhcyBvbmUsIG5vdCB6ZXJvLiBSZXR1cm5zCiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzdWNoIGxpbmUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPmxpbmVDb250ZW50KGhhbmRsZSk8L2NvZGU+ICYjODU5NDsKICAgICAgPGNvZGU+c3RyaW5nPC9jb2RlPjwvZHQ+PGRkPlJldHJpZXZlIHRoZSBjb250ZW50IG9mIHRoZQogICAgICBsaW5lLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5zZXRMaW5lQ29udGVudChoYW5kbGUsIHN0cmluZyk8L2NvZGU+PC9kdD48ZGQ+UmVwbGFjZQogICAgICB0aGUgY29udGVudCBvZiB0aGUgbGluZSB3aXRoIHRoZSBnaXZlbiBzdHJpbmcuPC9kZD4KICAgICAgPGR0Pjxjb2RlPmxpbmVOdW1iZXIoaGFuZGxlKTwvY29kZT4gJiM4NTk0OwogICAgICA8Y29kZT5udW1iZXI8L2NvZGU+PC9kdD48ZGQ+QXNrIHdoaWNoIGxpbmUgb2YgdGhlIGRvY3VtZW50CiAgICAgICgxLWJhc2VkKSB0aGUgZ2l2ZW4gbGluZSBpcy48L2RkPgogICAgICA8ZHQ+PGNvZGU+c2VsZWN0TGluZXMoc3RhcnRIYW5kbGUsIHN0YXJ0T2Zmc2V0LAogICAgICBlbmRIYW5kbGUsIGVuZE9mZnNldCk8L2NvZGU+PC9kdD48ZGQ+TW92ZSB0aGUgc2VsZWN0aW9uIHRvIGEKICAgICAgc3BlY2lmaWMgcG9pbnQuIDxjb2RlPmVuZEhhbmRsZTwvY29kZT4gYW5kCiAgICAgIDxjb2RlPmVuZE9mZnNldDwvY29kZT4gY2FuIGJlIG9taXR0ZWQgdG8ganVzdCBwbGFjZSB0aGUgY3Vyc29yCiAgICAgIHNvbWV3aGVyZSB3aXRob3V0IHNlbGVjdGluZyBhbnkgdGV4dC48L2RkPgogICAgICA8ZHQ+PGNvZGU+aW5zZXJ0SW50b0xpbmUoaGFuZGxlLCBwb3NpdGlvbiwKICAgICAgdGV4dCk8L2NvZGU+PC9kdD48ZGQ+SW5zZXJ0IGEgcGllY2Ugb2YgdGV4dCBpbnRvIGEgbGluZS4KICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+IGNhbiBiZSBhbiBpbnRlZ2VyLCBzcGVjaWZ5aW5nIHRoZSBwb3NpdGlvbgogICAgICBpbiB0aGUgbGluZSB3aGVyZSB0aGUgdGV4dCBzaG91bGQgYmUgaW5zZXJ0ZWQsIG9yIHRoZSBzdHJpbmcKICAgICAgPGNvZGU+ImVuZCI8L2NvZGU+LCBmb3IgdGhlIGVuZCBvZiB0aGUgbGluZS48L2RkPgogICAgPC9kbD4KCiAgICA8aDIgaWQ9IndyaXRlcGFyc2VyIj5Xcml0aW5nIGEgUGFyc2VyPC9oMj4KCiAgICA8cD5BIHBhcnNlciBpcyBpbXBsZW1lbnRlZCBieSBvbmUgb3IgbW9yZSBmaWxlcyAoc2VlCiAgICA8Y29kZT5wYXJzZXJmaWxlPC9jb2RlPiBhYm92ZSkgd2hpY2gsIHdoZW4gbG9hZGVkLCBhZGQgYQogICAgPGNvZGU+UGFyc2VyPC9jb2RlPiBwcm9wZXJ0eSB0byB0aGUgPGNvZGU+RWRpdG9yPC9jb2RlPiBvYmplY3QKICAgIGRlZmluZWQgYnkgPGEgaHJlZj0ianMvZWRpdG9yLmpzIj48Y29kZT5lZGl0b3IuanM8L2NvZGU+PC9hPi4gVGhpcwogICAgb2JqZWN0IG11c3Qgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGludGVyZmFjZTo8L3A+CgogICAgPGRsPgoKICAgICAgPGR0Pjxjb2RlPm1ha2Uoc3RyZWFtKTwvY29kZT48L2R0PjxkZD5BIGZ1bmN0aW9uIHRoYXQsIGdpdmVuIGEKICAgICAgc3RyaW5nIHN0cmVhbSAoc2VlIDxhCiAgICAgIGhyZWY9ImpzL3N0cmluZ3N0cmVhbS5qcyI+PGNvZGU+c3RyaW5nc3RyZWFtLmpzPC9jb2RlPjwvYT4pLAogICAgICBjcmVhdGVzIGEgcGFyc2VyLiBUaGUgYmVoYXZpb3VyIG9mIHRoaXMgcGFyc2VyIGlzIGRlc2NyaWJlZAogICAgICBiZWxvdy48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmVsZWN0cmljQ2hhcnM8L2NvZGU+PC9kdD48ZGQ+QW4gb3B0aW9uYWwgc3RyaW5nCiAgICAgIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlcnMgdGhhdCwgd2hlbiB0eXBlZCwgc2hvdWxkIGNhdXNlIHRoZQogICAgICBpbmRlbnRhdGlvbiBvZiB0aGUgY3VycmVudCBsaW5lIHRvIGJlIHJlY29tcHV0ZWQgKGZvciBleGFtcGxlCiAgICAgIDxjb2RlPiJ7fSI8L2NvZGU+IGZvciBjLWxpa2UgbGFuZ3VhZ2VzKS48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmNvbmZpZ3VyZShvYmplY3QpPC9jb2RlPjwvZHQ+PGRkPkFuIG9wdGlvbmFsIGZ1bmN0aW9uCiAgICAgIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBwYXJzZXIuIElmIGl0IGV4aXN0cywgYW5kIGFuCiAgICAgIGVkaXRvciBpcyBnaXZlbiBhIDxjb2RlPnBhcnNlckNvbmZpZzwvY29kZT4gb3B0aW9uLCBpdCB3aWxsIGJlCiAgICAgIGNhbGxlZCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGF0IG9wdGlvbi48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmZpcnN0SW5kZW50YXRpb24oY2hhcnMsIGN1cnJlbnQsCiAgICAgIGRpcmVjdGlvbik8L2NvZGU+PC9kdD48ZGQ+QW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIHRvCiAgICAgIGRldGVybWluZSB0aGUgcHJvcGVyIGluZGVudGF0aW9uIG9mIHRoZSBmaXJzdCBsaW5lIG9mIGEKICAgICAgZG9jdW1lbnQuIFdoZW4gbm90IHByb3ZpZGVkLCA8Y29kZT4wPC9jb2RlPiBpcyB1c2VkLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxwPldoZW4gdGhlIDxjb2RlPm1ha2U8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhIHN0cmluZwogICAgc3RyZWFtLCBpdCBzaG91bGQgcmV0dXJuIGEgTW9jaGlLaXQtc3R5bGUgaXRlcmF0b3I6IGFuIG9iamVjdCB3aXRoCiAgICBhIDxjb2RlPm5leHQ8L2NvZGU+IG1ldGhvZCwgd2hpY2ggd2lsbCByYWlzZQogICAgPGNvZGU+U3RvcEl0ZXJhdGlvbjwvY29kZT4gd2hlbiBpdCBpcyBhdCBpdHMgZW5kIChzZWUgPGEKICAgIGhyZWY9Imh0dHA6Ly9ib2IucHl0aG9ubWFjLm9yZy9hcmNoaXZlcy8yMDA1LzA3LzA2L2l0ZXJhdGlvbi1pbi1qYXZhc2NyaXB0LyI+dGhpczwvYT4KICAgIGZvciBkZXRhaWxzKS4gVGhpcyBpdGVyYXRvciwgd2hlbiBjYWxsZWQsIHdpbGwgY29uc3VtZSBpbnB1dCBmcm9tCiAgICB0aGUgc3RyaW5nIHN0cmVhbSwgYW5kIHByb2R1Y2UgYSB0b2tlbiBvYmplY3QuPC9wPgoKICAgIDxwPlRva2VuIG9iamVjdHMgcmVwcmVzZW50IGEgc2luZ2xlIHNpZ25pZmljYW50IHBpZWNlIG9mIHRoZSB0ZXh0CiAgICB0aGF0IGlzIGJlaW5nIGVkaXRlZC4gQSB0b2tlbiBvYmplY3QgbXVzdCBoYXZlIGEKICAgIDxjb2RlPnZhbHVlPC9jb2RlPiBwcm9wZXJ0eSBob2xkaW5nIHRoZSB0ZXh0IGl0IHN0YW5kcyBmb3IsIGFuZCBhCiAgICA8Y29kZT5zdHlsZTwvY29kZT4gcHJvcGVydHkgd2l0aCB0aGUgQ1NTIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHVzZWQKICAgIHRvIGNvbG91ciB0aGlzIGVsZW1lbnQuIFRoaXMgY2FuIGJlIGFueXRoaW5nLCBleGNlcHQgdGhhdCBhbnkKICAgIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZSBzaG91bGQgPGVtPmFsd2F5czwvZW0+IGhhdmUKICAgIGNsYXNzIDxjb2RlPiJ3aGl0ZXNwYWNlIjwvY29kZT46IFRoZSBlZGl0b3IgbXVzdCBiZSBhYmxlIHRvCiAgICByZWNvZ25pemUgdGhlc2Ugd2hlbiBpdCBpbmRlbnRzIGxpbmVzLiBGdXJ0aGVybW9yZSwgZWFjaCBuZXdsaW5lCiAgICBjaGFyYWN0ZXIgPGVtPm11c3Q8L2VtPiBoYXZlIGl0cyBvd24gc2VwYXJhdGUgdG9rZW4sIHdoaWNoIGhhcyBhbgogICAgPGNvZGU+aW5kZW50YXRpb248L2NvZGU+IHByb3BlcnR5IGhvbGRpbmcgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZQogICAgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHByb3BlciBpbmRlbnRhdGlvbiBsZXZlbCBmb3IgdGhlIG5leHQgbGluZS4KICAgIFRoaXMgZnVuY3Rpb24gb3B0aW9uYWxseSB0YWtlcyB0aGUgdGV4dCBpbiB0aGUgZmlyc3QgdG9rZW4gb2YgdGhlCiAgICBuZXh0IGxpbmUsIHRoZSBjdXJyZW50IGluZGVudGF0aW9uIG9mIHRoZSBsaW5lLCBhbmQgdGhlCiAgICAnZGlyZWN0aW9uJyBvZiB0aGUgaW5kZW50YXRpb24gYXMgYXJndW1lbnRzLCB3aGljaCBpdCBjYW4gdXNlIHRvCiAgICBhZGp1c3QgdGhlIGluZGVudGF0aW9uIGxldmVsLiBUaGUgZGlyZWN0aW9uIGFyZ3VtZW50IGlzIG9ubHkKICAgIHVzZWZ1bCBmb3IgbW9kZXMgaW4gd2hpY2ggbGluZXMgZG8gbm90IGhhdmUgYSBmaXhlZCBpbmRlbnRhdGlvbiwKICAgIGFuZCBjYW4gYmUgbW9kaWZpZWQgYnkgbXVsdGlwbGUgdGFiIHByZXNzZXMuIEl0IGlzCiAgICA8Y29kZT5udWxsPC9jb2RlPiBmb3IgJ2RlZmF1bHQnIGluZGVudGF0aW9ucyAobGlrZSB3aGF0IGhhcHBlbnMKICAgIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBlbnRlciksIDxjb2RlPnRydWU8L2NvZGU+IGZvciByZWd1bGFyIHRhYgogICAgcHJlc3NlcywgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IgY29udHJvbC10YWIgb3Igc2hpZnQtdGFiLjwvcD4KCiAgICA8cD5TbyBmYXIgdGhpcyBzaG91bGQgYmUgcHJldHR5IGVhc3kuIFRoZSBoYXJkIHBhcnQgaXMgdGhhdCB0aGlzCiAgICBpdGVyYXRvciBtdXN0IGFsc28gaGF2ZSBhIDxjb2RlPmNvcHk8L2NvZGU+IG1ldGhvZC4gVGhpcyBtZXRob2QsCiAgICBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsIHJldHVybnMgYSBmdW5jdGlvbiByZXByZXNlbnRpbmcgdGhlCiAgICBjdXJyZW50IHN0YXRlIG9mIHRoZSBwYXJzZXIuIFdoZW4gdGhpcyBzdGF0ZSBmdW5jdGlvbiBpcyBsYXRlcgogICAgY2FsbGVkIHdpdGggYSBzdHJpbmcgc3RyZWFtIGFzIGl0cyBhcmd1bWVudCwgaXQgcmV0dXJucyBhIHBhcnNlcgogICAgb2JqZWN0IHRoYXQgcmVzdW1lcyBwYXJzaW5nIHVzaW5nIHRoZSBvbGQgc3RhdGUgYW5kIHRoZSBuZXcgaW5wdXQKICAgIHN0cmVhbS4gSXQgbWF5IGFzc3VtZSB0aGF0IG9ubHkgb25lIHBhcnNlciBpcyBhY3RpdmUgYXQgYSB0aW1lLAogICAgYW5kIGNhbiBjbG9iYmVyIHRoZSBzdGF0ZSBvZiB0aGUgb2xkIHBhcnNlciBpZiBpdCB3YW50cy48L3A+CgogICAgPHA+Rm9yIGV4YW1wbGVzLCBzZWUgPGEKICAgIGhyZWY9ImpzL3BhcnNlamF2YXNjcmlwdC5qcyI+PGNvZGU+cGFyc2VqYXZhc2NyaXB0LmpzPC9jb2RlPjwvYT4sCiAgICA8YSBocmVmPSJqcy9wYXJzZXhtbC5qcyI+PGNvZGU+cGFyc2V4bWwuanM8L2NvZGU+PC9hPiwgYW5kIDxhCiAgICBocmVmPSJqcy9wYXJzZWNzcy5qcyI+PGNvZGU+cGFyc2Vjc3MuanM8L2NvZGU+PC9hPi48L3A+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/mixedtest.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogSFRNTCBtaXhlZC1tb2RlIGRlbW9uc3RyYXRpb248L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL2RvY3MuY3NzIi8+CiAgPC9oZWFkPgogIDxib2R5IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyI+Cgo8cD5UaGlzIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgdGhlIEhUTUwgbWl4ZWQtbW9kZSBpbmRlbnRhdGlvbgptb2R1bGUgZm9yIDxhIGhyZWY9ImluZGV4Lmh0bWwiPkNvZGVNaXJyb3I8L2E+LiBTY3JpcHQgdGFncyB1c2UgdGhlIEpTCnBhcnNlciwgc3R5bGUgdGFncyB1c2UgdGhlIENTUyBwYXJzZXIuPC9wPgoKPGRpdiBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7IHBhZGRpbmc6IDNweDsiPgo8dGV4dGFyZWEgaWQ9ImNvZGUiIGNvbHM9IjEyMCIgcm93cz0iMzAiPgombHQ7aHRtbD4KICAmbHQ7aGVhZD4KICAgICZsdDt0aXRsZT5IVE1MIEV4YW1wbGUmbHQ7L3RpdGxlPgogICAgJmx0O3NjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICBmdW5jdGlvbiBmb28oYmFyLCBiYXopIHsKICAgICAgICBhbGVydCgicXV1eCIpOwogICAgICAgIHJldHVybiBiYXIgKyBiYXogKyAxOwogICAgICB9CiAgICAmbHQ7L3NjcmlwdD4KICAgICZsdDtzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIGRpdi5ib3JkZXIgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOwogICAgICAgIHBhZGRpbmc6IDNweDsKICAgICAgfQogICAgICAjZm9vIGNvZGUgewogICAgICAgIGZvbnQtZmFtaWx5OiBjb3VyaWVyLCBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiA4MCU7CiAgICAgICAgY29sb3I6ICM0NDg4ODg7CiAgICAgIH0KICAgICZsdDsvc3R5bGU+CiAgJmx0Oy9oZWFkPgogICZsdDtib2R5PgogICAgJmx0O3A+RHVoJmx0Oy9wPgogICZsdDsvYm9keT4KJmx0Oy9odG1sPgo8L3RleHRhcmVhPgo8L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoJ2NvZGUnLCB7CiAgICBoZWlnaHQ6ICIzNTBweCIsCiAgICBwYXJzZXJmaWxlOiBbInBhcnNleG1sLmpzIiwgInBhcnNlY3NzLmpzIiwgInRva2VuaXplamF2YXNjcmlwdC5qcyIsICJwYXJzZWphdmFzY3JpcHQuanMiLCAicGFyc2VodG1sbWl4ZWQuanMiXSwKICAgIHN0eWxlc2hlZXQ6IFsiY3NzL3htbGNvbG9ycy5jc3MiLCAiY3NzL2pzY29sb3JzLmNzcyIsICJjc3MvY3NzY29sb3JzLmNzcyJdLAogICAgcGF0aDogImpzLyIKICB9KTsKPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/sparqltest.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogU3BhcnFsIGRlbW9uc3RyYXRpb248L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL2RvY3MuY3NzIi8+CiAgPC9oZWFkPgogIDxib2R5IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyI+Cgo8cD5EZW1vbnN0cmF0aW9uIG9mIDxhIGhyZWY9ImluZGV4Lmh0bWwiPkNvZGVNaXJyb3I8L2E+J3MgU3BhcnFsCmhpZ2hsaWdodGVyLjwvcD4KCjxkaXYgY2xhc3M9ImJvcmRlciI+Cjx0ZXh0YXJlYSBpZD0iY29kZSIgY29scz0iMTIwIiByb3dzPSIzMCI+ClBSRUZJWCBhOiAmbHQ7aHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9hbm5vdGF0aW9uLW5zIz4KUFJFRklYIGRjOiAmbHQ7aHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8+ClBSRUZJWCBmb2FmOiAmbHQ7aHR0cDovL3htbG5zLmNvbS9mb2FmLzAuMS8+CgojIENvbW1lbnQhCgpTRUxFQ1QgP2dpdmVuID9mYW1pbHkKV0hFUkUgewogID9hbm5vdCBhOmFubm90YXRlcyAmbHQ7aHR0cDovL3d3dy53My5vcmcvVFIvcmRmLXNwYXJxbC1xdWVyeS8+IC4KICA/YW5ub3QgZGM6Y3JlYXRvciA/YyAuCiAgT1BUSU9OQUwgez9jIGZvYWY6Z2l2ZW4gP2dpdmVuIDsKICAgICAgICAgICAgICAgZm9hZjpmYW1pbHkgP2ZhbWlseSB9IC4KICBGSUxURVIgaXNCbGFuayg/YykKfQo8L3RleHRhcmVhPgo8L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoJ2NvZGUnLCB7CiAgICBoZWlnaHQ6ICIyNTBweCIsCiAgICBwYXJzZXJmaWxlOiAicGFyc2VzcGFycWwuanMiLAogICAgc3R5bGVzaGVldDogImNzcy9zcGFycWxjb2xvcnMuY3NzIiwKICAgIHBhdGg6ICJqcy8iCiAgfSk7Cjwvc2NyaXB0PgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror/story.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHRpdGxlPkltcGxlbWVudGluZyBhIHN5bnRheC1oaWdsaWdodGluZyBKYXZhU2NyaXB0IGVkaXRvciBpbiBKYXZhU2NyaXB0PC90aXRsZT4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIGJvZHkgewogICAgICAgIHBhZGRpbmc6IDNlbSA2ZW07CiAgICAgICAgbWF4LXdpZHRoOiA1MGVtOwogICAgICB9CiAgICAgIGgxIHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CiAgICAgIGgyIHsKICAgICAgICBmb250LXNpemU6IDEzMCU7CiAgICAgIH0KICAgICAgY29kZSB7CiAgICAgICAgZm9udC1mYW1pbHk6IGNvdXJpZXIsIG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDgwJTsKICAgICAgICBjb2xvcjogIzE0NDsKICAgICAgfQogICAgICBwIHsKICAgICAgICBtYXJnaW46IDFlbSAwOwogICAgICB9CiAgICAgIHByZS5jb2RlIHsKICAgICAgICBtaW4td2lkdGg6IDU1ZW07CiAgICAgICAgbWFyZ2luOiAxLjFlbSAxMnB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7CiAgICAgICAgcGFkZGluZzogLjRlbTsKICAgICAgICBmb250LWZhbWlseTogY291cmllciwgbW9ub3NwYWNlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL2pzY29sb3JzLmNzcyIvPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMSBzdHlsZT0iZm9udC1zaXplOiAxODAlOyI+SW1wbGVtZW50aW5nIGEgc3ludGF4LWhpZ2xpZ2h0aW5nIEphdmFTY3JpcHQgZWRpdG9yIGluIEphdmFTY3JpcHQ8L2gxPgogICAgPGgxIHN0eWxlPSJmb250LXNpemU6IDExMCU7Ij5vcjwvaDE+CiAgICA8aDEgc3R5bGU9ImZvbnQtc2l6ZTogMTMwJTsgbWFyZ2luLWJvdHRvbTogM2VtOyI+QSBicnV0YWwgb2R5c3NleSB0byB0aGUgZGFyayBzaWRlIG9mIHRoZSBET00gdHJlZTwvaDE+CgogICAgPHAgc3R5bGU9ImZvbnQtc2l6ZTogODAlIj4KICAgICAgPGI+VG9waWM8L2I+OiBKYXZhU2NyaXB0LCBhZHZhbmNlZCBicm93c2VyIHdlaXJkbmVzcywgY29vbCBwcm9ncmFtbWluZyB0ZWNobmlxdWVzPGJyLz4KICAgICAgPGI+QXVkaWVuY2U8L2I+OiBQcm9ncmFtbWVycywgZXNwZWNpYWxseSBKYXZhU2NyaXB0IHByb2dyYW1tZXJzPGJyLz4KICAgICAgPGI+QXV0aG9yPC9iPjogTWFyaWpuIEhhdmVyYmVrZTxici8+CiAgICAgIDxiPkRhdGU8L2I+OiBNYXkgMjR0aCAyMDA3CiAgICA8L3A+CgogICAgPHAgc3R5bGU9ImNvbG9yOiAjODExOyBmb250LXNpemU6IDkwJTsgZm9udC1zdHlsZTogaXRhbGljIj5Ob3RlOiBzb21lIG9mIHRoZSBkZXRhaWxzIGdpdmVuIGhlcmUgbm8KICAgIGxvbmdlciBhcHBseSB0byB0aGUgY3VycmVudCA8YQogICAgaHJlZj0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvciI+Q29kZU1pcnJvcjwvYT4KICAgIGNvZGViYXNlLCB3aGljaCBoYXMgZXZvbHZlZCBxdWl0ZSBhIGJpdCBpbiB0aGUgbWVhbnRpbWUuPC9wPgoKICAgIDxwPkluIG9uZSBvZiBoaXMgKHZlcnkgaW5mb3JtYXRpdmUpIDxhCiAgICBocmVmPSJodHRwOi8vd3d3LmxlYXJud2ViZGVzaWdub25saW5lLmNvbS92aWRlb3MvcHJvZ3JhbW1pbmcvamF2YXNjcmlwdC95YWhvby1kb3VnbGFzLWNyb2NrZm9yZCI+dmlkZW8KICAgIGxlY3R1cmVzPC9hPiwgRG91Z2xhcyBDcm9ja2ZvcmQgcmVtYXJrcyB0aGF0IHdyaXRpbmcgSmF2YVNjcmlwdAogICAgZm9yIHRoZSB3ZWIgaXMgJ3Byb2dyYW1taW5nIGluIGEgaG9zdGlsZSBlbnZpcm9ubWVudCcuIEkgaGFkIGRvbmUKICAgIG15IGZhaXIgc2hhcmUgb2Ygd2VpcmQgd29ya2Fyb3VuZHMsIGFuZCBldmVuIG9jY2Fzb25hbGx5IGdhdmUgdXAKICAgIGFuIG9uIGlkZWEgZW50aXJlbHkgYmVjYXVzZSBicm93c2VycyBqdXN0IHdvdWxkbid0IHN1cHBvcnQgaXQsIGJ1dAogICAgYmVmb3JlIHRoaXMgcHJvamVjdCBJIG5ldmVyIHJlYWxseSByZWFsaXplZCBqdXN0IGhvdyBwb3dlcmxlc3MgYQogICAgcHJvZ3JhbW1lciBjYW4gYmUgaW4gdGhlIGZhY2Ugb2YgYnVnZ3ksIGluY29tcGF0aWJsZSwgYW5kIHBvb3JseQogICAgZGVzaWduZWQgcGxhdGZvcm1zLjwvcD4KCiAgICA8cD5UaGUgcGxhbiB3YXMgbm90IHJpZGljdWxvdXNseSBhbWJpdGlvdXMuIEkgd2FudGVkIHRvICdlbmhhbmNlJyBhCiAgICB0ZXh0YXJlYSB0byB0aGUgcG9pbnQgd2hlcmUgd3JpdGluZyBjb2RlIGluIGl0IGlzIHBsZWFzYW50LiBUaGlzIG1lYW50CiAgICBhdXRvbWF0aWMgaW5kZW50YXRpb24gYW5kLCBpZiBwb3NzaWJsZSBhdCBhbGwsIHN5bnRheCBoaWdobGlnaHRpbmcuPC9wPgoKICAgIDxwPkluIHRoaXMgZG9jdW1lbnQgSSBkZXNjcmliZSB0aGUgc3Rvcnkgb2YgaW1wbGVtZW50aW5nIHRoaXMsIGZvciB5b3VyCiAgICBlZHVjYXRpb24gYW5kIGFtdXNlbWVudC4gQSBkZW1vbnN0cmF0aW9uIG9mIHRoZSByZXN1bHRpbmcgcHJvZ3JhbSwKICAgIGFsb25nIHdpdGggdGhlIHNvdXJjZSBjb2RlLCBjYW4gYmUgZm91bmQgYXQgPGEKICAgIGhyZWY9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IiPm15IHdlYnNpdGU8L2E+LjwvcD4KCiAgICA8aDI+VGFrZSBvbmU6IE9ubHkgaW5kZW50YXRpb248L2gyPgoKICAgIDxwPlRoZSB2ZXJ5IGZpcnN0IGF0dGVtcHQgbWVyZWx5IGFkZGVkIGF1dG8taW5kZW50YXRpb24gdG8gYSB0ZXh0YXJlYQogICAgZWxlbWVudC4gSXQgd291bGQgc2NhbiBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgY29udGVudCBvZiB0aGUgYXJlYSwKICAgIHN0YXJ0aW5nIGZyb20gdGhlIGN1cnNvciwgdW50aWwgaXQgaGFkIGVub3VnaCBpbmZvcm1hdGlvbiB0byBkZWNpZGUKICAgIGhvdyB0byBpbmRlbnQgdGhlIGN1cnJlbnQgbGluZS4gSXQgdG9vayBtZSBhIHdoaWxlIHRvIGZpZ3VyZSBvdXQgYQogICAgZGVjZW50IG1vZGVsIGZvciBpbmRlbnRpbmcgSmF2YVNjcmlwdCBjb2RlLCBidXQgaW4gdGhlIGVuZCB0aGlzIHNlZW1zCiAgICB0byB3b3JrOjwvcD4KCiAgICA8dWw+CiAgICAgIDxsaT5Db2RlIHRoYXQgc2l0cyBpbnNpZGUgYSBibG9jayBpcyBpbmRlbnRlZCBvbmUgdW5pdCAoZ2VuZXJhbGx5IHR3bwogICAgICBzcGFjZXMpIG1vcmUgdGhhbiB0aGUgc3RhdGVtZW50IG9yIGJyYWNlIHRoYXQgb3BlbmVkIHRoZSBibG9jay48L2xpPgogICAgICA8bGk+QSBzdGF0ZW1lbnQgdGhhdCBpcyBjb250aW51ZWQgdG8gdGhlIG5leHQgbGluZSBpcyBpbmRlbnRlZCBvbmUgdW5pdAogICAgICBtb3JlIHRoYW4gdGhlIGxpbmUgdGhhdCBzdGFydHMgdGhlIHN0YXRlbWVudC48L2xpPgogICAgICA8bGk+V2hlbiBkZWFsaW5nIHdpdGggbGlzdHMgb2YgYXJndW1lbnRzIG9yIHRoZSBjb250ZW50IG9mIGFycmF5IGFuZAogICAgICBvYmplY3QgbGl0ZXJhbHMgdGhlcmUgYXJlIHR3byBwb3NzaWJsZSBtb2RlbHMuIElmIHRoZXJlIGlzIGFueSB0ZXh0CiAgICAgIGRpcmVjdGx5IGFmdGVyIHRoZSBvcGVuaW5nIGJyYWNlLCBicmFja2V0LCBvciBwYXJlbnRoZXNpcywKICAgICAgc3Vic2VxdWVudCBsaW5lcyBhcmUgYWxpZ25lZCB3aXRoIHRoaXMgb3BlbmluZyBjaGFyYWN0ZXIuIElmIHRoZQogICAgICBvcGVuaW5nIGNoYXJhY3RlciBpcyBmb2xsb3dlZCBieSBhIG5ld2xpbmUgKG9wdGlvbmFsbHkgd2l0aCB3aGl0ZXNwYWNlCiAgICAgIG9yIGNvbW1lbnRzIGJlZm9yZSBpdCksIHRoZSBuZXh0IGxpbmUgaXMgaW5kZW50ZWQgb25lIHVuaXQgZnVydGhlcgogICAgICB0aGFuIHRoZSBsaW5lIHRoYXQgc3RhcnRlZCB0aGUgbGlzdC48L2xpPgogICAgICA8bGk+QW5kLCBvYnZpb3VzbHksIGlmIGEgc3RhdGVtZW50IGZvbGxvd3MgYW5vdGhlciBzdGF0ZW1lbnQgaXQgaXMKICAgICAgaW5kZW50ZWQgdGhlIHNhbWUgYW1vdW50IGFzIHRoZSBvbmUgYmVmb3JlIGl0LjwvbGk+CiAgICA8L3VsPgoKICAgIDxwPldoZW4gc2Nhbm5pbmcgYmFja3dhcmRzIHRocm91Z2ggY29kZSBvbmUgaGFzIHRvIHRha2Ugc3RyaW5nIHZhbHVlcywKICAgIGNvbW1lbnRzLCBhbmQgcmVndWxhciBleHByZXNzaW9ucyAod2hpY2ggYXJlIGRlbGltaXRlZCBieSBzbGFzaGVzKQogICAgaW50byBhY2NvdW50LCBiZWNhdXNlIGJyYWNlcyBhbmQgc2VtaWNvbG9ucyBhbmQgc3VjaCBhcmUgbm90CiAgICBzaWduaWZpY2FudCB3aGVuIHRoZXkgYXBwZWFyIGluc2lkZSB0aGVtLiBTaW5nbGUtbGluZSAoJy8vJykgY29tbWVudHMKICAgIHR1cm5lZCBvdXQgdG8gYmUgcmF0aGVyIGluZWZmaWNpZW50IHRvIGNoZWNrIGZvciB3aGVuIGRvaW5nIGEKICAgIGJhY2t3YXJkcyBzY2FuLCBzaW5jZSBldmVyeSB0aW1lIHlvdSBlbmNvdW50ZXIgYSBuZXdsaW5lIHlvdSBoYXZlIHRvCiAgICBnbyBvbiB0byB0aGUgbmV4dCBuZXdsaW5lIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgbGluZSBlbmRzIGluIGEKICAgIGNvbW1lbnQgb3Igbm90LiBSZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBldmVuIHdvcnNlICYjeDIwMTU7IHdpdGhvdXQKICAgIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gdGhleSBhcmUgaW1wb3NzaWJsZSB0byBkaXN0aW5ndWlzaCBmcm9tIHRoZQogICAgZGl2aXNpb24gb3BlcmF0b3IsIGFuZCBJIGRpZG4ndCBnZXQgdGhlbSB3b3JraW5nIGluIHRoaXMgZmlyc3QKICAgIHZlcnNpb24uPC9wPgoKICAgIDxwPlRvIGZpbmQgb3V0IHdoaWNoIGxpbmUgdG8gaW5kZW50LCBhbmQgdG8gbWFrZSBzdXJlIHRoYXQgYWRkaW5nIG9yCiAgICByZW1vdmluZyB3aGl0ZXNwYWNlIGRvZXNuJ3QgY2F1c2UgdGhlIGN1cnNvciB0byBqdW1wIGluIHN0cmFuZ2Ugd2F5cywKICAgIGl0IGlzIG5lY2Vzc2FyeSB0byBkZXRlcm1pbmUgd2hpY2ggdGV4dCB0aGUgdXNlciBoYXMgc2VsZWN0ZWQuIEV2ZW4KICAgIHRob3VnaCBJIHdhcyB3b3JraW5nIHdpdGgganVzdCBhIHNpbXBsZSB0ZXh0YXJlYSBhdCB0aGlzIHBvaW50LCB0aGlzCiAgICB3YXMgYWxyZWFkeSBhIGJpdCBvZiBhIGhlYWRhY2hlLjwvcD4KCiAgICA8cD5PbiBXM0Mtc3RhbmRhcmRzLXJlc3BlY3RpbmcgYnJvd3NlcnMsIHRleHRhcmVhIG5vZGVzIGhhdmUKICAgIDxjb2RlPnNlbGVjdGlvblN0YXJ0PC9jb2RlPiBhbmQgPGNvZGU+c2VsZWN0aW9uRW5kPC9jb2RlPgogICAgcHJvcGVydGllcyB3aGljaCBuaWNlbHkgZ2l2ZSB5b3UgdGhlIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJlZm9yZQogICAgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHNlbGVjdGlvbi4gR3JlYXQhPC9wPgoKICAgIDxwPlRoZW4sIHRoZXJlIGlzIEludGVybmV0IEV4cGxvcmVyLiBJbnRlcm5ldCBFeHBsb3JlciBhbHNvIGhhcyBhbiBBUEkKICAgIGZvciBsb29raW5nIGF0IGFuZCBtYW5pcHVsYXRpbmcgc2VsZWN0aW9ucy4gSXQgZ2l2ZXMgeW91IGluZm9ybWF0aW9uCiAgICBzdWNoIGFzIGEgZGV0YWlsZWQgbWFwIG9mIHRoZSBzcGFjZSB0aGUgc2VsZWN0ZWQgbGluZXMgdGFrZSB1cCBvbiB0aGUKICAgIHNjcmVlbiwgaW4gcGl4ZWxzLCBhbmQgb2YgY291cnNlIHRoZSB0ZXh0IGluc2lkZSB0aGUgc2VsZWN0aW9uLiBJdAogICAgZG9lcywgaG93ZXZlciwgbm90IGdpdmUgeW91IG11Y2ggb2YgYSBjbHVlIG9uIHdoZXJlIHRoZSBzZWxlY3Rpb24gaXMKICAgIGxvY2F0ZWQgaW4gdGhlIGRvY3VtZW50LjwvcD4KCiAgICA8cD5BZnRlciBzb21lIGV4cGVyaW1lbnRhdGlvbiBJIG1hbmFnZWQgdG8gd29yayBvdXQgYW4gZWxhYm9yYXRlCiAgICBtZXRob2QgZm9yIGdldHRpbmcgc29tZXRoaW5nIHNpbWlsYXIgdG8gdGhlCiAgICA8Y29kZT5zZWxlY3Rpb25TdGFydDwvY29kZT4gYW5kIDxjb2RlPnNlbGVjdGlvbkVuZDwvY29kZT4gdmFsdWVzCiAgICBpbiBvdGhlciBicm93c2Vycy4gSXQgd29ya2VkIGxpa2UgdGhpczo8L3A+CgogICAgPHVsPgogICAgICA8bGk+R2V0IHRoZSA8Y29kZT5UZXh0UmFuZ2U8L2NvZGU+IG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWxlY3Rpb24uPC9saT4KICAgICAgPGxpPlJlY29yZCB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IGluc2lkZSBpdC48L2xpPgogICAgICA8bGk+TWFrZSBhbm90aGVyIDxjb2RlPlRleHRSYW5nZTwvY29kZT4gdGhhdCBjb3ZlcnMgdGhlIHdob2xlIHRleHRhcmVhIGVsZW1lbnQuPC9saT4KICAgICAgPGxpPlNldCB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IDxjb2RlPlRleHRSYW5nZTwvY29kZT4gdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWNvbmQgb25lLjwvbGk+CiAgICAgIDxsaT5BZ2FpbiBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCBpbiB0aGUgZmlyc3Qgb2JqZWN0LjwvbGk+CiAgICAgIDxsaT5Ob3cgPGNvZGU+c2VsZWN0aW9uRW5kPC9jb2RlPiBpcyB0aGUgc2Vjb25kIGxlbmd0aCwgYW5kIDxjb2RlPnNlbGVjdGlvblN0YXJ0PC9jb2RlPiBpcwogICAgICB0aGUgc2Vjb25kIG1pbnVzIHRoZSBmaXJzdCBvbmUuPC9saT4KICAgIDwvdWw+CgogICAgPHA+VGhhdCBzZWVtZWQgdG8gd29yaywgYnV0IHdoZW4gcmVzZXR0aW5nIHRoZSBzZWxlY3Rpb24gYWZ0ZXIgbW9kaWZ5aW5nCiAgICB0aGUgY29udGVudCBvZiB0aGUgdGV4dGFyZWEgSSByYW4gaW50byBhbm90aGVyIGludGVyZXN0aW5nIGZlYXR1cmUgb2YKICAgIHRoZXNlIDxjb2RlPlRleHRSYW5nZTwvY29kZT5zOiBZb3UgY2FuIG1vdmUgdGhlaXIgZW5kcG9pbnRzIGJ5IGEgZ2l2ZW4gbnVtYmVyIG9mCiAgICBjaGFyYWN0ZXJzLCB3aGljaCBpcyB1c2VmdWwgd2hlbiB0cnlpbmcgdG8gc2V0IGEgY3Vyc29yIGF0IHRoZSBOdGgKICAgIGNoYXJhY3RlciBvZiBhIHRleHRhcmVhLCBidXQgaW4gdGhpcyBjb250ZXh0LCBuZXdsaW5lcyBhcmUgPGVtPm5vdDwvZW0+CiAgICBjb25zaWRlcmVkIHRvIGJlIGNoYXJhY3RlcnMsIHNvIHlvdSdsbCBhbHdheXMgZW5kIHVwIG9uZSBjaGFyYWN0ZXIgdG9vCiAgICBmYXIgZm9yIGV2ZXJ5IG5ld2xpbmUgeW91IHBhc3NlZC4gT2YgY291cnNlLCB5b3UgY2FuIGNvdW50IG5ld2xpbmVzCiAgICBhbmQgY29tcGVuc2F0ZSBmb3IgdGhpcyAodGhvdWdoIGl0IGlzIHN0aWxsIG5vdCBwb3NzaWJsZSB0byBwb3NpdGlvbgogICAgdGhlIGN1cnNvciByaWdodCBpbiBmcm9udCBvZiBhIG5ld2xpbmUpLiBTaGVlc2guPC9wPgoKICAgIDxwPkFmdGVyIHJhZ2dpbmcgb24gSW50ZXJuZXQgRXhwbG9yZXIgZm9yIGEgd2hpbGUsIGxldCB1cyBtb3ZlIG9uIGFuZCByYWcKICAgIG9uIEZpcmVmb3ggYSBiaXQuIEl0IHR1cm5zIG91dCB0aGF0LCBpbiBGaXJlZm94LCBnZXR0aW5nIGFuZCBzZXR0aW5nCiAgICB0aGUgdGV4dCBjb250ZW50IG9mIGEgRE9NIGVsZW1lbnQgaXMgdW5leHBsYWluYWJseSBleHBlbnNpdmUsCiAgICBlc3BlY2lhbGx5IHdoZW4gdGhlcmUgaXMgYSBsb3Qgb2YgdGV4dCBpbnZvbHZlZC4gQXMgc29vbiBhcyBJIHRyaWVkIHRvCiAgICB1c2UgbXkgaW5kZW50YXRpb24gY29kZSB0byBpbmRlbnQgaXRzZWxmIChzb21lIDQwMCBsaW5lcyksIEkgZm91bmQKICAgIG15c2VsZiB3YWl0aW5nIGZvciBvdmVyIGZvdXIgc2Vjb25kcyBldmVyeSB0aW1lIEkgcHJlc3NlZCBlbnRlci4gVGhhdAogICAgc2VlbWVkIGEgbGl0dGxlIHNsb3cuPC9wPgoKICAgIDxoMj5kZXNpZ25Nb2RlIGl0IGlzPC9oMj4KCiAgICA8cD5UaGUgc29sdXRpb24gd2FzIG9idmlvdXM6IFNpbmNlIHRoZSB0ZXh0IGluc2lkZSBhIHRleHRhcmVhIGNhbiBvbmx5IGJlCiAgICBtYW5pcHVsYXRlZCBhcyBvbmUgc2luZ2xlIGJpZyBzdHJpbmcsIEkgaGFkIHRvIHNwcmVhZCBpdCBvdXQgb3ZlcgogICAgbXVsdGlwbGUgbm9kZXMuIEhvdyBkbyB5b3Ugc3ByZWFkIGVkaXRhYmxlIGNvbnRlbnQgb3ZlciBtdWx0aXBsZQogICAgbm9kZXM/IFJpZ2h0ISA8Y29kZT5kZXNpZ25Nb2RlPC9jb2RlPiBvciA8Y29kZT5jb250ZW50RWRpdGFibGU8L2NvZGU+LjwvcD4KCiAgICA8cD5Ob3cgSSB3YXNuJ3QgZW50aXJlbHkgbmFpdmUgYWJvdXQgPGNvZGU+ZGVzaWduTW9kZTwvY29kZT4sIEkgaGFkIGJlZW4gbG9va2luZwogICAgaW50byB3cml0aW5nIGEgbm9uLW1lc3N5IFdZU0lXWUcgZWRpdG9yIGJlZm9yZSwgYW5kIGF0IHRoYXQgdGltZSBJIGhhZAogICAgY29uY2x1ZGVkIHR3byB0aGluZ3M6PC9wPgoKICAgIDx1bD4KICAgICAgPGxpPkl0IGlzIGltcG9zc2libGUgdG8gcHJldmVudCB0aGUgdXNlciBmcm9tIGluc2VydGluZyB3aGljaGV2ZXIgSFRNTAogICAgICBqdW5rIGhlIHdhbnRzIGludG8gdGhlIGRvY3VtZW50LjwvbGk+CiAgICAgIDxsaT5JbiBJbnRlcm5ldCBFeHBsb3JlciwgaXQgaXMgZXh0ZW1lbHkgaGFyZCB0byBnZXQgYSBnb29kIHZpZXcKICAgICAgb24gd2hhdCBub2RlcyB0aGUgdXNlciBoYXMgc2VsZWN0ZWQuPC9saT4KICAgIDwvdWw+CgogICAgPHA+QmFzaWNhbGx5LCB0aGUgZ29vZCBmb2xrcyBhdCBNaWNyb3NvZnQgZGVzaWduZWQgYSByZWFsbHkgYmFkIGludGVyZmFjZQogICAgZm9yIHB1dHRpbmcgZWRpdGFibGUgZG9jdW1lbnRzIGluIHBhZ2VzLCBhbmQgdGhlIG90aGVyIGJyb3dzZXJzLCBub3QKICAgIHdhbnRpbmcgdG8gYmUgbGVmdCBiZWhpbmQsIG1vcmUgb3IgbGVzcyBjb3BpZWQgdGhhdC4gQW5kIHRoZXJlIGlzbid0CiAgICBtdWNoIGhvcGUgZm9yIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzIGFwcGVhcmluZyBhbnl0aW1lIHNvb24uIFdpc2UKICAgIHBlb3BsZSBwcm9iYWJseSB1c2UgYSBGbGFzaCBtb3ZpZSBvciAoR29kIGZvcmJpZCkgYSBKYXZhIGFwcGxldCBmb3IKICAgIHRoZXNlIGtpbmQgb2YgdGhpbmdzLCB0aG91Z2ggdGhvc2UgYXJlIG5vdCB3aXRob3V0IGRyYXdiYWNrcyBlaXRoZXIuPC9wPgoKICAgIDxwPkFueXdheSwgc2VlaW5nIGhvdyB1c2luZyBhbiBlZGl0YWJsZSBkb2N1bWVudCB3b3VsZCBhbHNvIG1ha2Ugc3ludGF4CiAgICBoaWdobGlnaHRpbmcgcG9zc2libGUsIEkgZm9vbGlzaGx5IHdlbnQgYWhlYWQuIFRoZXJlIGlzIHNvbWV0aGluZwogICAgcGVydmVyc2VseSBmYXNjaW5hdGluZyBhYm91dCB0cnlpbmcgdG8gYnVpbGQgYSBjb21wbGljYXRlZCBzeXN0ZW0gb24gYQogICAgbG91c3ksIHVuc3VpdGFibGUgcGxhdGZvcm0uPC9wPgoKICAgIDxoMj5BIHBhcnNlcjwvaDI+CgogICAgPHA+SG93IGRvZXMgb25lIGRvIGRlY2VudCBzeW50YXggaGlnaGxpZ2h0aW5nPyBBIHZlcnkgc2ltcGxlIHNjYW5uaW5nIGNhbgogICAgdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0cmluZ3MsIGNvbW1lbnRzLCBrZXl3b3JkcywgYW5kIG90aGVyCiAgICBjb2RlLiBCdXQgdGhpcyB0aW1lIEkgd2FudGVkIHRvIGFjdHVhbGx5IGJlIGFibGUgdG8gcmVjb2duaXplIHJlZ3VsYXIKICAgIGV4cHJlc3Npb25zLCBzbyB0aGF0IEkgZGlkbid0IGhhdmUgYW55IGJsYXRhbnQgaW5jb3JyZWN0IGJlaGF2aW91cgogICAgYW55bW9yZS48L3A+CgogICAgPHA+VGhhdCBicm91Z2h0IG1lIHRvIHRoZSBpZGVhIG9mIGRvaW5nIGEgc2VyaW91cyBwYXJzZSBvbiB0aGUgY29kZS4gVGhpcwogICAgd291bGQgbm90IG9ubHkgbWFrZSBkZXRlY3RpbmcgcmVndWxhciBleHByZXNzaW9ucyBtdWNoIGVhc2llciwgaXQKICAgIHdvdWxkIGFsc28gZ2l2ZSBtZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZSwgd2hpY2ggY2FuIGJlCiAgICB1c2VkIHRvIGRldGVybWluZSBwcm9wZXIgaW5kZW50YXRpb24gbGV2ZWxzLCBhbmQgdG8gbWFrZSBzdWJ0bGUKICAgIGRpc3RpbmN0aW9ucyBpbiBjb2xvdXJpbmcsIGZvciBleGFtcGxlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdmFyaWFibGUKICAgIG5hbWVzIGFuZCBwcm9wZXJ0eSBuYW1lcy48L3A+CgogICAgPHA+QW5kIGhleSwgd2hlbiB3ZSdyZSBwYXJzaW5nIHRoZSB3aG9sZSB0aGluZywgaXQgd291bGQgZXZlbiBiZSBwb3NzaWJsZQogICAgdG8gbWFrZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gbG9jYWwgYW5kIGdsb2JhbCB2YXJpYWJsZXMsIGFuZCBjb2xvdXIKICAgIHRoZW0gZGlmZmVyZW50bHkuIElmIHlvdSd2ZSBldmVyIHByb2dyYW1tZWQgSmF2YVNjcmlwdCB5b3UgY2FuCiAgICBwcm9iYWJseSBpbWFnaW5lIGhvdyB1c2VmdWwgdGhpcyB3b3VsZCBiZSAmI3gyMDE1OyBpdCBpcyByaWRpY3Vsb3VzbHkgZWFzeQogICAgdG8gYWNjaWRlbnRhbGx5IGNyZWF0ZSBnbG9iYWwgaW5zdGVhZCBvZiBsb2NhbCB2YXJpYWJsZXMuIEkgZG9uJ3QKICAgIGNvbnNpZGVyIG15c2VsZiBhIEphdmFTY3JpcHQgcm9va2llIGFueW1vcmUsIGJ1dCBpdCB3YXMgKGVtYmFycmFzaW5nbHkKICAgIGVub3VnaCkgb25seSB0aGlzIHdlZWsgdGhhdCBJIHJlYWxpemVkIHRoYXQgbXkgaGFiaXQgb2YgdHlwaW5nIDxjb2RlPmZvcgogICAgKG5hbWUgaW4gb2JqZWN0KSAuLi48L2NvZGU+IHdhcyBjcmVhdGluZyBhIGdsb2JhbCB2YXJpYWJsZSA8Y29kZT5uYW1lPC9jb2RlPiwgYW5kIHRoYXQKICAgIEkgc2hvdWxkIGJlIHR5cGluZyA8Y29kZT5mb3IgKHZhciBuYW1lIGluIG9iamVjdCkgLi4uPC9jb2RlPiBpbnN0ZWFkLjwvcD4KCiAgICA8cD5SZS1wYXJzaW5nIGFsbCB0aGUgY29kZSB0aGUgdXNlciBoYXMgdHlwZWQgaW4gZXZlcnkgdGltZSBoZSBoaXRzIGEga2V5CiAgICBpcyBvYnZpb3VzbHkgbm90IGZlYXNpYmxlLiBTbyBob3cgZG9lcyBvbmUgY29tYmluZSBvbi10aGUtZmx5CiAgICBoaWdobGlnaHRpbmcgd2l0aCBhIHNlcmlvdXMgcGFyc2VyPyBPbmUgb3B0aW9uIHdvdWxkIGJlIHRvIHNwbGl0IHRoZQogICAgY29kZSBpbnRvIHRvcC1sZXZlbCBzdGF0ZW1lbnRzIChmdW5jdGlvbnMsIHZhcmlhYmxlIGRlZmluaXRpb25zLCBldGMuKQogICAgYW5kIHBhcnNlIHRoZXNlIHNlcGFyYXRlbHkuIFRoaXMgaXMgaG9ycmlibHkgY2x1bmt5IHRob3VnaCwgZXNwZWNpYWxseQogICAgY29uc2lkZXJpbmcgdGhlIGZhY3QgdGhhdCBtb2Rlcm4gSmF2YVNjcmlwdGVycyBvZnRlbiBwdXQgYWxsIHRoZSBjb2RlCiAgICBpbiBhIGZpbGUgaW4gYSBzaW5nbGUgYmlnIG9iamVjdCBvciBmdW5jdGlvbiB0byBwcmV2ZW50IG5hbWVzcGFjZQogICAgcG9sbHV0aW9uLjwvcD4KCiAgICA8cD5JIGhhdmUgYWx3YXlzIGxpa2VkIGNvbnRpbnVhdGlvbi1wYXNzaW5nIHN0eWxlIGFuZCBnZW5lcmF0b3JzLiBTbyB0aGUKICAgIGlkZWEgSSBjYW1lIHVwIHdpdGggaXMgdGhpczogQW4gaW50ZXJydXB0YWJsZSwgcmVzdW1hYmxlIHBhcnNlci4gVGhpcwogICAgaXMgYSBwYXJzZXIgdGhhdCBkb2VzIG5vdCBydW4gdGhyb3VnaCBhIHdob2xlIGRvY3VtZW50IGF0IG9uY2UsIGJ1dAogICAgcGFyc2VzIG9uLWRlbWFuZCwgYSBsaXR0bGUgYml0IGF0IGEgdGltZS4gQXQgYW55IG1vbWVudCB5b3UgY2FuIGNyZWF0ZQogICAgYSBjb3B5IG9mIGl0cyBjdXJyZW50IHN0YXRlLCB3aGljaCBjYW4gYmUgcmVzdW1lZCBsYXRlci4gWW91IHN0YXJ0CiAgICBwYXJzaW5nIGF0IHRoZSB0b3Agb2YgdGhlIGNvZGUsIGFuZCBrZWVwIGdvaW5nIGFzIGxvbmcgYXMgeW91IGxpa2UsCiAgICBidXQgdGhyb3VnaG91dCB0aGUgZG9jdW1lbnQsIGZvciBleGFtcGxlIGF0IGV2ZXJ5IGVuZCBvZiBsaW5lLCB5b3UKICAgIHN0b3JlIGEgY29weSBvZiB0aGUgY3VycmVudCBwYXJzZXIgc3RhdGUuIExhdGVyIG9uLCB3aGVuIGxpbmUgMTA2CiAgICBjaGFuZ2VzLCB5b3UgZ3JhYiB0aGUgaW50ZXJydXB0ZWQgcGFyc2VyIHRoYXQgd2FzIHN0b3JlZCBhdCB0aGUgZW5kIG9mCiAgICBsaW5lIDEwNSwgYW5kIHVzZSBpdCB0byByZS1wYXJzZSBsaW5lIDEwNi4gSXQgc3RpbGwga25vd3MgZXhhY3RseSB3aGF0CiAgICB0aGUgY29udGV4dCB3YXMgYXQgdGhhdCBwb2ludCwgd2hpY2ggbG9jYWwgdmFyaWFibGVzIHdlcmUgZGVmaW5lZCwKICAgIHdoaWNoIHVuZmluaXNoZWQgc3RhdGVtZW50cyB3ZXJlIGVuY291bnRlcmVkLCBhbmQgc28gb24uPC9wPgoKICAgIDxwPkJ1dCB0aGF0LCB1bmZvcnR1bmF0ZWx5LCB0dXJuZWQgb3V0IHRvIGJlIG5vdCBxdWl0ZSBhcyBlYXN5IGFzIGl0CiAgICBzb3VuZHMuPC9wPgoKICAgIDxoMj5UaGUgRE9NIG5vZGVzIHVuZGVyZm9vdDwvaDI+CgogICAgPHA+T2YgY291cnNlLCB3aGVuIHdvcmtpbmcgaW5zaWRlIGFuIGVkaXRhYmxlIGZyYW1lIHdlIGRvbid0IGp1c3QKICAgIGhhdmUgdG8gZGVhbCB3aXRoIHRleHQuIFRoZSBjb2RlIHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkgc29tZSBraW5kCiAgICBvZiBET00gdHJlZS4gTXkgZmlyc3QgaWRlYSB3YXMgdG8gc2V0IHRoZSA8Y29kZT53aGl0ZS1zcGFjZToKICAgIHByZTwvY29kZT4gc3R5bGUgZm9yIHRoZSBmcmFtZSBhbmQgdHJ5IHRvIHdvcmsgd2l0aCBtb3N0bHkgdGV4dCwKICAgIHdpdGggdGhlIG9jY2FzaW9uYWwgY29sb3VyZWQgPGNvZGU+c3BhbjwvY29kZT4gZWxlbWVudC4gSXQgdHVybmVkCiAgICBvdXQgdGhhdCBzdXBwb3J0IGZvciA8Y29kZT53aGl0ZS1zcGFjZTogcHJlPC9jb2RlPiBpbiBicm93c2VycywKICAgIGVzcGVjaWFsbHkgaW4gZWRpdGFibGUgZnJhbWVzLCBpcyBzbyBob3BlbGVzc2x5IGdsaXRjaHkgdGhhdCB0aGlzCiAgICB3YXMgdW53b3JrYWJsZS48L3A+CgogICAgPHA+TmV4dCBJIHRyaWVkIGEgc2VyaWVzIG9mIDxjb2RlPmRpdjwvY29kZT4gZWxlbWVudHMsIG9uZSBwZXIKICAgIGxpbmUsIHdpdGggPGNvZGU+c3BhbjwvY29kZT4gZWxlbWVudHMgaW5zaWRlIHRoZW0uIFRoaXMgc2VlbWVkIHRvCiAgICBuaWNlbHkgcmVmbGVjdCB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluIGEgc2hhbGxvd2x5CiAgICBoaWVyYXJjaGljYWwgd2F5LiBJIHNvb24gcmVhbGl6ZWQsIGhvd2V2ZXIsIHRoYXQgbXkgY29kZSB3b3VsZCBiZQogICAgbXVjaCBtb3JlIHN0cmFpZ2h0Zm93YXJkIHdoZW4gdXNpbmcgbm8gaGllcmFyY2h5IHdoYXRzb2V2ZXIKICAgICYjeDIwMTU7IGEgc2VyaWVzIG9mIDxjb2RlPnNwYW48L2NvZGU+cywgd2l0aCA8Y29kZT5icjwvY29kZT4gdGFncwogICAgYXQgdGhlIGVuZCBvZiBldmVyeSBsaW5lLiBUaGlzIHdheSwgdGhlIERPTSBub2RlcyBmb3JtIGEgZmxhdAogICAgc2VxdWVuY2UgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc2VxdWVuY2Ugb2YgdGhlIHRleHQgJiN4MjAxNTsKICAgIGp1c3QgZXh0cmFjdCB0ZXh0IGZyb20gPGNvZGU+c3BhbjwvY29kZT4gbm9kZXMgYW5kIHN1YnN0aXR1dGUKICAgIG5ld2xpbmVzIGZvciA8Y29kZT5icjwvY29kZT4gbm9kZXMuPC9wPgoKICAgIDxwPkl0IHdvdWxkIGJlIGEgc2hhbWUgaWYgdGhlIGVkaXRvciB3b3VsZCBmYWxsIGFwYXJ0IGFzIHNvb24gYXMKICAgIHNvbWVvbmUgcGFzdGVzIHNvbWUgY29tcGxpY2F0ZWQgSFRNTCBpbnRvIGl0LiBJIHdhbnRlZCBpdCB0byBiZQogICAgYWJsZSB0byBkZWFsIHdpdGggd2hhdGV2ZXIgbWVzcyBpdCBmaW5kcy4gVGhpcyBtZWFucyB1c2luZyBzb21lCiAgICBraW5kIG9mIEhUTUwtbm9ybWFsaXplciB0aGF0IHRha2VzIGFyYml0cmFyeSBIVE1MIGFuZCBmbGF0dGVucyBpdAogICAgaW50byBhIHNlcmllcyBvZiA8Y29kZT5icjwvY29kZT5zIGFuZCA8Y29kZT5zcGFuPC9jb2RlPiBlbGVtZW50cwogICAgdGhhdCBjb250YWluIGEgc2luZ2xlIHRleHQgbm9kZS4gSnVzdCBsaWtlIHRoZSBwYXJzaW5nIHByb2Nlc3MsIGl0CiAgICB3b3VsZCBiZSBiZXN0IGlmIHRoaXMgZGlkIG5vdCBoYXZlIHRvIGRvbmUgdG8gdGhlIGVudGlyZSBidWZmZXIKICAgIGV2ZXJ5IHRpbWUgc29tZXRoaW5nIGNoYW5nZXMuPC9wPgoKICAgIDxwPkl0IHRvb2sgc29tZSBiYW5naW5nIG15IGhlYWQgYWdhaW5zdCBteSBrZXlib2FyZCwgYnV0IEkgZm91bmQgYSB2ZXJ5CiAgICBuaWNlIHdheSB0byBtb2RlbCB0aGlzLiBJdCBtYWtlcyBoZWF2eSB1c2Ugb2YgZ2VuZXJhdG9ycywgZm9yIHdoaWNoIEkKICAgIHVzZWQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb2NoaWtpdC5jb20iPk1vY2hpS2l0PC9hPidzIGl0ZXJhdG9yCiAgICBmcmFtZXdvcmsuIEJvYiBJcHBvbGl0byBleHBsYWlucyB0aGUgY29uY2VwdHMgaW4gdGhpcyBsaWJyYXJ5IHZlcnkKICAgIHdlbGwgaW4gaGlzIDxhCiAgICBocmVmPSJodHRwOi8vYm9iLnB5dGhvbm1hYy5vcmcvYXJjaGl2ZXMvMjAwNS8wNy8wNi9pdGVyYXRpb24taW4tamF2YXNjcmlwdC8iPmJsb2cKICAgIHBvc3Q8L2E+IGFib3V0IGl0LiAoQWxzbyBub3RpY2Ugc29tZSBvZiB0aGUgZGlzbWlzc2l2ZSBjb21tZW50cyBhdCB0aGUKICAgIGJvdHRvbSBvZiB0aGF0IHBvc3QuIFRoZXkgc2F5ICJJIGRvbid0IHRoaW5rIEkgcmVhbGx5IHdhbnQgdG8gbGVhcm4KICAgIHRoaXMsIHNvIEknbGwgbWFrZSB1cCBzb21lIHNpbGx5IHJlYXNvbiB0byBjb25kZW1uIGl0LiIpPC9wPgoKICAgIDxwPlRoZSBoaWdobGlnaHRpbmcgcHJvY2VzcyBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnRzOgogICAgbm9ybWFsaXppbmcgdGhlIERPTSB0cmVlLCBleHRyYWN0aW5nIHRoZSB0ZXh0IGZyb20gdGhlIERPTSB0cmVlLAogICAgdG9rZW5pemluZyB0aGlzIHRleHQsIHBhcnNpbmcgdGhlIHRva2VucywgYW5kIGZpbmFsbHkgYWRqdXN0aW5nIHRoZQogICAgRE9NIG5vZGVzIHRvIHJlZmxlY3QgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZS48L3A+CgogICAgPHA+VGhlIGZpcnN0IHR3bywgSSBwdXQgaW50byBhIHNpbmdsZSBnZW5lcmF0b3IuIEl0IHNjYW5zIHRoZSBET00KICAgIHRyZWUsIGZpeGluZyBhbnl0aGluZyB0aGF0IGlzIG5vdCBhIHNpbXBsZSB0b3AtbGV2ZWwKICAgIDxjb2RlPnNwYW48L2NvZGU+IG9yIDxjb2RlPmJyPC9jb2RlPiwgYW5kIGl0IHByb2R1Y2VzIHRoZSB0ZXh0CiAgICBjb250ZW50IG9mIHRoZSBub2RlcyAob3IgYSBuZXdsaW5lIGluIGNhc2Ugb2YgYSA8Y29kZT5icjwvY29kZT4pCiAgICBhcyBpdHMgb3V0cHV0ICYjeDIwMTU7IGVhY2ggdGltZSBpdCBpcyBjYWxsZWQsIGl0IHlpZWxkcyBhIHN0cmluZy4KICAgIENvbnRpbnVhdGlvbiBwYXNzaW5nIHN0eWxlIHdhcyBhIGdvb2Qgd2F5IHRvIG1vZGVsIHRoaXMgcHJvY2VzcyBpbgogICAgYW4gaXRlcmF0b3IsIHdoaWNoIGhhcyB0byBiZSBwcm9jZXNzZWQgb25lIHN0ZXAgYXQgYSB0aW1lLiBMb29rIGF0CiAgICB0aGlzIHNpbXBsaWZpZWQgdmVyc2lvbjo8L3A+CgogICAgPHByZSBjbGFzcz0iY29kZSI+PHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmZ1bmN0aW9uPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPnRyYXZlcnNlRE9NPC9zcGFuPig8c3BhbiBjbGFzcz0ianMtdmFyaWFibGVkZWYiPnN0YXJ0PC9zcGFuPil7CiAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPnZhcjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj5jYzwvc3Bhbj4gPSA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZnVuY3Rpb248L3NwYW4+KCl7PHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5zY2FuTm9kZTwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPnN0YXJ0PC9zcGFuPiwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5zdG9wPC9zcGFuPik7fTsKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZnVuY3Rpb248L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+c3RvcDwvc3Bhbj4oKXsKICAgIDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj5jYzwvc3Bhbj4gPSA8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+c3RvcDwvc3Bhbj47CiAgICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+dGhyb3c8L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+U3RvcEl0ZXJhdGlvbjwvc3Bhbj47CiAgfQogIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5mdW5jdGlvbjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj55aWVsZDwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj52YWx1ZTwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+Yzwvc3Bhbj4pewogICAgPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPmNjPC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj5jPC9zcGFuPjsKICAgIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5yZXR1cm48L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj52YWx1ZTwvc3Bhbj47CiAgfQoKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZnVuY3Rpb248L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+c2Nhbk5vZGU8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+bm9kZTwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+Yzwvc3Bhbj4pewogICAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPm5vZGU8L3NwYW4+LjxzcGFuIGNsYXNzPSJqcy1wcm9wZXJ0eSI+bmV4dFNpYmxpbmc8L3NwYW4+KQogICAgICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+dmFyPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGVkZWYiPm5leHRjPC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5mdW5jdGlvbjwvc3Bhbj4oKXs8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+c2Nhbk5vZGU8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj5ub2RlPC9zcGFuPi48c3BhbiBjbGFzcz0ianMtcHJvcGVydHkiPm5leHRTaWJsaW5nPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPmM8L3NwYW4+KTt9OwogICAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmVsc2U8L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj52YXI8L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+bmV4dGM8L3NwYW4+ID0gPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPmM8L3NwYW4+OwoKICAgIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5pZjwvc3Bhbj4gKDxzcGFuIGNsYXNzPSJqcy1jb21tZW50Ij4vKiBub2RlIGlzIHByb3BlciBzcGFuIGVsZW1lbnQgKi88L3NwYW4+KQogICAgICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+cmV0dXJuPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+eWllbGQ8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj5ub2RlPC9zcGFuPi48c3BhbiBjbGFzcz0ianMtcHJvcGVydHkiPmZpcnN0Q2hpbGQ8L3NwYW4+LjxzcGFuIGNsYXNzPSJqcy1wcm9wZXJ0eSI+bm9kZVZhbHVlPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPm5leHRjPC9zcGFuPik7CiAgICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZWxzZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWNvbW1lbnQiPi8qIG5vZGUgaXMgcHJvcGVyIGJyIGVsZW1lbnQgKi88L3NwYW4+KQogICAgICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+cmV0dXJuPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+eWllbGQ8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O1xuJnF1b3Q7PC9zcGFuPiwgPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPm5leHRjPC9zcGFuPik7CiAgICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZWxzZTwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImpzLWNvbW1lbnQiPi8qIGZsYXR0ZW4gbm9kZSwgeWllbGQgaXRzIHRleHR1YWwgY29udGVudCAqLzwvc3Bhbj47CiAgfQoKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+cmV0dXJuPC9zcGFuPiB7PHNwYW4gY2xhc3M9ImpzLXByb3BlcnR5Ij5uZXh0PC9zcGFuPjogPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmZ1bmN0aW9uPC9zcGFuPigpezxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5yZXR1cm48L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj5jYzwvc3Bhbj4oKTt9fTsKfTwvcHJlPgoKICAgIDxwPlRoZSB2YXJpYWJsZSA8Y29kZT5jPC9jb2RlPiBzdGFuZHMgZm9yICdjb250aW51YXRpb24nLCBhbmQgPGNvZGU+Y2M8L2NvZGU+IGZvciAnY3VycmVudAogICAgY29udGludWF0aW9uJyAmI3gyMDE1OyB0aGF0IGxhc3QgdmFyaWFibGUgaXMgdXNlZCB0byBzdG9yZSB0aGUgZnVuY3Rpb24gdG8KICAgIGNvbnRpbnVlIHdpdGgsIHdoZW4geWllbGRpbmcgYSB2YWx1ZSB0byB0aGUgb3V0c2lkZSB3b3JsZC4gRXZlcnkgdGltZQogICAgY29udHJvbCBsZWF2ZXMgdGhpcyBmdW5jdGlvbiwgaXQgaGFzIHRvIG1ha2Ugc3VyZSB0aGF0IDxjb2RlPmNjPC9jb2RlPiBpcyBzZXQgdG8KICAgIGEgc3VpdGFibGUgdmFsdWUsIHdoaWNoIGlzIHdoYXQgPGNvZGU+eWllbGQ8L2NvZGU+IGFuZCA8Y29kZT5zdG9wPC9jb2RlPiB0YWtlIGNhcmUgb2YuPC9wPgoKICAgIDxwPlRoZSBvYmplY3QgdGhhdCBpcyByZXR1cm5lZCBjb250YWlucyBhIDxjb2RlPm5leHQ8L2NvZGU+IG1ldGhvZCwgd2hpY2ggaXMKICAgIE1vY2hpS2l0J3MgaWRlYSBvZiBhbiBpdGVyYXRvciwgYW5kIHRoZSBpbml0aWFsIGNvbnRpbnVhdGlvbiBqdXN0CiAgICB0aHJvd3MgYSA8Y29kZT5TdG9wSXRlcmF0aW9uPC9jb2RlPiwgd2hpY2ggaXMgaG93IE1vY2hpS2l0IHNpZ25hbHMgdGhhdCBhbgogICAgaXRlcmF0b3IgaGFzIHJlYWNoZWQgaXRzIGVuZC48L3A+CgogICAgPHA+VGhlIGZpcnN0IGxpbmVzIG9mIDxjb2RlPnNjYW5Ob2RlPC9jb2RlPiBleHRlbmQgdGhlIGNvbnRpbnVhdGlvbiB3aXRoIHRoZSB0YXNrIG9mCiAgICBzY2FubmluZyB0aGUgbmV4dCBub2RlLCBpZiB0aGVyZSBpcyBhIG5leHQgbm9kZS4gVGhlIHJlc3Qgb2YgdGhlCiAgICBmdW5jdGlvbiBkZWNpZGVzIHdoYXQga2luZCBvZiB2YWx1ZSB0byA8Y29kZT55aWVsZDwvY29kZT4uIE5vdGUgdGhhdCB0aGlzIGlzIGEKICAgIHJhdGhlciB0cml2aWFsIGV4YW1wbGUgb2YgdGhpcyB0ZWNobmlxdWUsIHNpbmNlIHRoZSBwcm9jZXNzIG9mIGdvaW5nCiAgICB0aHJvdWdoIHRoZXNlIG5vZGVzIGlzIGJhc2ljYWxseSBsaW5lYXIgKGl0IHdhcyBtdWNoLCBtdWNoIG1vcmUKICAgIGNvbXBsZXggaW4gZWFybGllciB2ZXJzaW9ucyksIGJ1dCBzdGlsbCB0aGUgdHJpY2sgd2l0aCB0aGUKICAgIGNvbnRpbnVhdGlvbnMgbWFrZXMgdGhlIGNvZGUgc2hvcnRlciBhbmQsIGZvciB0aG9zZSBpbiB0aGUga25vdywKICAgIGNsZWFyZXIgdGhhbiB0aGUgZXF1aXZhbGVudCAnc3RvcmluZyB0aGUgaXRlcmF0b3Igc3RhdGUgaW4gdmFyaWFibGVzJwogICAgYXBwcm9hY2guPC9wPgoKICAgIDxwPlRoZSBuZXh0IGl0ZXJhdG9yIHRoYXQgdGhlIGlucHV0IHBhc3NlcyB0aHJvdWdoIGlzIHRoZQogICAgdG9rZW5pemVyLiBXZWxsLCBhY3R1YWxseSwgdGhlcmUgaXMgYW5vdGhlciBpdGVyYXRvciBpbiBiZXR3ZWVuCiAgICB0aGF0IGlzb2xhdGVzIHRoZSB0b2tlbml6ZXIgZnJvbSB0aGUgZmFjdCB0aGF0IHRoZSBET00gdHJhdmVyc2FsCiAgICB5aWVsZHMgYSBidW5jaCBvZiBzZXBhcmF0ZSBzdHJpbmdzLCBhbmQgcHJlc2VudHMgdGhlbSBhcyBhIHNpbmdsZQogICAgY2hhcmFjdGVyIHN0cmVhbSAod2l0aCBhIGNvbnZlbmllbnQgPGNvZGU+cGVlazwvY29kZT4gb3BlcmF0aW9uKSwKICAgIGJ1dCB0aGlzIGlzIG5vdCBhIHZlcnkgaW50ZXJlc3Rpbmcgb25lLiBXaGF0IHRoZSB0b2tlbml6ZXIgcmV0dXJucwogICAgaXMgYSBzdHJlYW0gb2YgdG9rZW4gb2JqZWN0cywgZWFjaCBvZiB3aGljaCBoYXMgYQogICAgPGNvZGU+dmFsdWU8L2NvZGU+LCBpdHMgdGV4dHVhbCBjb250ZW50LCBhIDxjb2RlPnR5cGU8L2NvZGU+LCBsaWtlCiAgICA8Y29kZT4idmFyaWFibGUiPC9jb2RlPiwgPGNvZGU+Im9wZXJhdG9yIjwvY29kZT4sIG9yIGp1c3QgaXRzZWxmLAogICAgPGNvZGU+InsiPC9jb2RlPiBmb3IgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2Ygc2lnbmlmaWNhbnQKICAgIHB1bmN0dWF0aW9uIG9yIHNwZWNpYWwga2V5d29yZHMuIFRoZXkgYWxzbyBoYXZlIGEKICAgIDxjb2RlPnN0eWxlPC9jb2RlPiwgd2hpY2ggaXMgdXNlZCBsYXRlciBieSB0aGUgaGlnaGxpZ2h0ZXIgdG8gZ2l2ZQogICAgdGhlaXIgPGNvZGU+c3BhbjwvY29kZT4gZWxlbWVudHMgYSBjbGFzcyBuYW1lICh0aGUgcGFyc2VyIHdpbGwKICAgIHN0aWxsIGFkanVzdCB0aGlzIGluIHNvbWUgY2FzZXMpLjwvcD4KCiAgICA8cD5BdCBmaXJzdCBJIGFzc3VtZWQgdGhlIHBhcnNlciB3b3VsZCBoYXZlIHRvIHRhbGsgYmFjayB0byB0aGUKICAgIHRva2VuaXplciBhYm91dCB0aGUgY3VycmVudCBjb250ZXh0LCBpbiBvcmRlciB0byBiZSBhYmxlIHRvCiAgICBkaXN0aW5ndWlzaCB0aG9zZSBhY2N1cnNlZCByZWd1bGFyIGV4cHJlc3Npb25zIGZyb20gZGl2aXNpb25zLCBidXQKICAgIGl0IHNlZW1zIHRoYXQgcmVndWxhciBleHByZXNzaW9ucyBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBwcmV2aW91cwogICAgKG5vbi13aGl0ZXNwYWNlLCBub24tY29tbWVudCkgdG9rZW4gd2FzIGVpdGhlciBhbiBvcGVyYXRvciwgYQogICAga2V5d29yZCBsaWtlIDxjb2RlPm5ldzwvY29kZT4gb3IgPGNvZGU+dGhyb3c8L2NvZGU+LCBvciBhIHNwZWNpZmljCiAgICBraW5kIG9mIHB1bmN0dWF0aW9uICg8Y29kZT4iW3t9KCw7OiI8L2NvZGU+KSB0aGF0IGluZGljYXRlcyBhIG5ldwogICAgZXhwcmVzc2lvbiBjYW4gYmUgc3RhcnRlZCBoZXJlLiBUaGlzIG1hZGUgdGhpbmdzIGNvbnNpZGVyYWJseQogICAgZWFzaWVyLCBzaW5jZSB0aGUgJ3JlZ2V4cCBvciBubyByZWdleHAnIHF1ZXN0aW9uIGNvdWxkIHN0YXkKICAgIGVudGlyZWx5IHdpdGhpbiB0aGUgdG9rZW5pemVyLjwvcD4KCiAgICA8cD5UaGUgbmV4dCBzdGVwLCB0aGVuLCBpcyB0aGUgcGFyc2VyLiBJdCBkb2VzIG5vdCBkbyBhIHZlcnkKICAgIHRob3JvdWdoIGpvYiBiZWNhdXNlLCBmaXJzdGx5LCBpdCBoYXMgdG8gYmUgZmFzdCwgYW5kIHNlY29uZGx5LCBpdAogICAgc2hvdWxkIG5vdCBnbyB0byBwaWVjZXMgd2hlbiBmZWQgYW4gaW5jb3JyZWN0IHByb2dyYW0uIFNvIG9ubHkKICAgIHN1cGVyZmljaWFsIGNvbnN0cnVjdHMgYXJlIHJlY29nbml6ZWQsIGtleXdvcmRzIHRoYXQgcmVzZW1ibGUgZWFjaAogICAgb3RoZXIgaW4gc3ludGF4LCBzdWNoIGFzIDxjb2RlPndoaWxlPC9jb2RlPiBhbmQgPGNvZGU+aWY8L2NvZGU+LAogICAgYXJlIHRyZWF0ZWQgaW4gcHJlY2lzZWx5IHRoZSBzYW1lIHdheSwgYXMgYXJlIDxjb2RlPnRyeTwvY29kZT4gYW5kCiAgICA8Y29kZT5lbHNlPC9jb2RlPiAmI3gyMDE1OyB0aGUgcGFyc2VyIGRvZXNuJ3QgbWluZCBpZiBhbgogICAgPGNvZGU+ZWxzZTwvY29kZT4gYXBwZWFycyB3aXRob3V0IGFuIDxjb2RlPmlmPC9jb2RlPi4gU3R1ZmYgdGhhdAogICAgYmluZHMgdmFyaWFibGVzLCA8Y29kZT52YXI8L2NvZGU+LCA8Y29kZT5mdW5jdGlvbjwvY29kZT4sIGFuZAogICAgPGNvZGU+Y2F0Y2g8L2NvZGU+IHRvIGJlIHByZWNpc2UsIGlzIHRyZWF0ZWQgd2l0aCBtb3JlIGNhcmUsCiAgICBiZWNhdXNlIHRoZSBwYXJzZXIgd2FudHMgdG8ga25vdyBhYm91dCBsb2NhbCB2YXJpYWJsZXMuPC9wPgoKICAgIDxwPkluc2lkZSB0aGUgcGFyc2VyLCB0aHJlZSBraW5kcyBvZiBjb250ZXh0IGFyZSBzdG9yZWQuIEZpcnN0bHksIGEgc2V0CiAgICBvZiBrbm93biBsb2NhbCB2YXJpYWJsZXMsIHdoaWNoIGlzIHVzZWQgdG8gYWRqdXN0IHRoZSBzdHlsZSBvZgogICAgdmFyaWFibGUgdG9rZW5zLiBFdmVyeSB0aW1lIHRoZSBwYXJzZXIgZW50ZXJzIGEgZnVuY3Rpb24sIGEgbmV3IHNldCBvZgogICAgdmFyaWFibGVzIGlzIGNyZWF0ZWQuIElmIHRoZXJlIHdhcyBhbHJlYWR5IHN1Y2ggYSBzZXQgKGVudGVyaW5nIGFuCiAgICBpbm5lciBmdW5jdGlvbiksIGEgcG9pbnRlciB0byB0aGUgb2xkIG9uZSBpcyBzdG9yZWQgaW4gdGhlIG5ldyBvbmUuIEF0CiAgICB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiwgdGhlIGN1cnJlbnQgdmFyaWFibGUgc2V0IGlzICdwb3BwZWQnIG9mZiBhbmQKICAgIHRoZSBwcmV2aW91cyBvbmUgaXMgcmVzdG9yZWQuPC9wPgoKICAgIDxwPlRoZSBzZWNvbmQga2luZCBvZiBjb250ZXh0IGlzIHRoZSBsZXhpY2FsIGNvbnRleHQsIHRoaXMga2VlcHMgdHJhY2sgb2YKICAgIHdoZXRoZXIgd2UgYXJlIGluc2lkZSBhIHN0YXRlbWVudCwgYmxvY2ssIG9yIGxpc3QuIExpa2UgdGhlIHZhcmlhYmxlCiAgICBjb250ZXh0LCBpdCBhbHNvIGZvcm1zIGEgc3RhY2sgb2YgY29udGV4dHMsIHdpdGggZWFjaCBvbmUgY29udGFpbmluZyBhCiAgICBwb2ludGVyIHRvIHRoZSBwcmV2aW91cyBvbmVzIHNvIHRoYXQgdGhleSBjYW4gYmUgcG9wcGVkIG9mZiBhZ2FpbiB3aGVuCiAgICB0aGV5IGFyZSBmaW5pc2hlZC4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGZvciBpbmRlbnRhdGlvbi4gRXZlcnkKICAgIHRpbWUgdGhlIHBhcnNlciBlbmNvdW50ZXJzIGEgbmV3bGluZSB0b2tlbiwgaXQgYXR0YWNoZXMgdGhlIGN1cnJlbnQKICAgIGxleGljYWwgY29udGV4dCBhbmQgYSAnY29weScgb2YgaXRzZWxmIChtb3JlIGFib3V0IHRoYXQgbGF0ZXIpIHRvIHRoaXMKICAgIHRva2VuLjwvcD4KCiAgICA8cD5UaGUgdGhpcmQgY29udGV4dCBpcyBhIGNvbnRpbnVhdGlvbiBjb250ZXh0LiBUaGlzIHBhcnNlciBkb2VzIG5vdCB1c2UKICAgIHN0cmFpZ2h0IGNvbnRpbnVhdGlvbiBzdHlsZSwgaW5zdGVhZCBpdCB1c2VzIGEgc3RhY2sgb2YgYWN0aW9ucyB0aGF0CiAgICBoYXZlIHRvIGJlIHBlcmZvcm1lZC4gVGhlc2UgYWN0aW9ucyBhcmUgc2ltcGxlIGZ1bmN0aW9ucywgYSBraW5kIG9mCiAgICBtaW5pbGFuZ3VhZ2UsIHRoZXkgYWN0IG9uIHRva2VucywgYW5kIGRlY2lkZSB3aGF0IGtpbmQgb2YgbmV3IGFjdGlvbnMKICAgIHNob3VsZCBiZSBwdXNoZWQgb250byB0aGUgc3RhY2suIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6PC9wPgoKPHByZSBjbGFzcz0iY29kZSI+PHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmZ1bmN0aW9uPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmV4cHJlc3Npb248L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+dHlwZTwvc3Bhbj4pewogIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5pZjwvc3Bhbj4gKDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj50eXBlPC9zcGFuPiBpbiA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmF0b21pY1R5cGVzPC9zcGFuPikgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5jb250PC9zcGFuPig8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPm1heWJlb3BlcmF0b3I8L3NwYW4+KTsKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZWxzZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPnR5cGU8L3NwYW4+ID09IDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O2Z1bmN0aW9uJnF1b3Q7PC9zcGFuPikgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5jb250PC9zcGFuPig8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmZ1bmN0aW9uZGVmPC9zcGFuPik7CiAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmVsc2U8L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5pZjwvc3Bhbj4gKDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj50eXBlPC9zcGFuPiA9PSA8c3BhbiBjbGFzcz0ianMtc3RyaW5nIj4mcXVvdDsoJnF1b3Q7PC9zcGFuPikgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5jb250PC9zcGFuPig8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPnB1c2hsZXg8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O2xpc3QmcXVvdDs8L3NwYW4+KSwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5leHByZXNzaW9uPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5leHBlY3Q8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90OykmcXVvdDs8L3NwYW4+KSwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5wb3BsZXg8L3NwYW4+KTsKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZWxzZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPnR5cGU8L3NwYW4+ID09IDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O29wZXJhdG9yJnF1b3Q7PC9zcGFuPikgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5jb250PC9zcGFuPig8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmV4cHJlc3Npb248L3NwYW4+KTsKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZWxzZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPnR5cGU8L3NwYW4+ID09IDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O1smcXVvdDs8L3NwYW4+KSA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvbnQ8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+cHVzaGxleDwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXN0cmluZyI+JnF1b3Q7bGlzdCZxdW90Ozwvc3Bhbj4pLCA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvbW1hc2VwPC9zcGFuPig8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmV4cHJlc3Npb248L3NwYW4+KSwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5leHBlY3Q8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O10mcXVvdDs8L3NwYW4+KSwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5wb3BsZXg8L3NwYW4+KTsKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZWxzZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPnR5cGU8L3NwYW4+ID09IDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O3smcXVvdDs8L3NwYW4+KSA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvbnQ8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+cHVzaGxleDwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXN0cmluZyI+JnF1b3Q7bGlzdCZxdW90Ozwvc3Bhbj4pLCA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvbW1hc2VwPC9zcGFuPig8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPm9ianByb3A8L3NwYW4+KSwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5leHBlY3Q8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O30mcXVvdDs8L3NwYW4+KSwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5wb3BsZXg8L3NwYW4+KTsKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZWxzZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPnR5cGU8L3NwYW4+ID09IDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O2tleXdvcmQgYyZxdW90Ozwvc3Bhbj4pIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+Y29udDwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5leHByZXNzaW9uPC9zcGFuPik7Cn0KCjxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5mdW5jdGlvbjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5ibG9jazwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj50eXBlPC9zcGFuPil7CiAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPnR5cGU8L3NwYW4+ID09IDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O30mcXVvdDs8L3NwYW4+KSA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvbnQ8L3NwYW4+KCk7CiAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmVsc2U8L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+cGFzczwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5zdGF0ZW1lbnQ8L3NwYW4+LCA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmJsb2NrPC9zcGFuPik7Cn08L3ByZT4KCiAgICA8cD5UaGUgZnVuY3Rpb24gPGNvZGU+Y29udDwvY29kZT4gKGZvciBjb250aW51ZSksIHdpbGwgcHVzaCB0aGUgYWN0aW9ucyBpdCBpcyBnaXZlbgogICAgb250byB0aGUgc3RhY2sgKGluIHJldmVyc2Ugb3JkZXIsIHNvIHRoYXQgdGhlIGZpcnN0IG9uZSB3aWxsIGJlIHBvcHBlZAogICAgZmlyc3QpLiBBY3Rpb25zIHN1Y2ggYXMgPGNvZGU+cHVzaGxleDwvY29kZT4gYW5kIDxjb2RlPnBvcGxleDwvY29kZT4gbWVyZWx5IGFkanVzdCB0aGUKICAgIGxleGljYWwgZW52aXJvbm1lbnQsIHdoaWxlIG90aGVycywgc3VjaCBhcyA8Y29kZT5leHByZXNzaW9uPC9jb2RlPiBpdHNlbGYsIGRvCiAgICBhY3R1YWwgcGFyc2luZy4gPGNvZGU+cGFzczwvY29kZT4sIGFzIHNlZW4gaW4gPGNvZGU+YmxvY2s8L2NvZGU+LCBpcyBzaW1pbGFyIHRvIDxjb2RlPmNvbnQ8L2NvZGU+LCBidXQKICAgIGl0IGRvZXMgbm90ICdjb25zdW1lJyB0aGUgY3VycmVudCB0b2tlbiwgc28gdGhlIG5leHQgYWN0aW9uIHdpbGwgYWdhaW4KICAgIHNlZSB0aGlzIHNhbWUgdG9rZW4uIEluIDxjb2RlPmJsb2NrPC9jb2RlPiwgdGhpcyBoYXBwZW5zIHdoZW4gdGhlIGZ1bmN0aW9uCiAgICBkZXRlcm1pbmVzIHRoYXQgd2UgYXJlIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBibG9jayB5ZXQsIHNvIGl0IHB1c2hlcwogICAgdGhlIDxjb2RlPnN0YXRlbWVudDwvY29kZT4gZnVuY3Rpb24gd2hpY2ggd2lsbCBpbnRlcnByZXQgdGhlIGN1cnJlbnQgdG9rZW4gYXMgdGhlCiAgICBzdGFydCBvZiBhIHN0YXRlbWVudC48L3A+CgogICAgPHA+VGhlc2UgYWN0aW9ucyBhcmUgY2FsbGVkIGJ5IGEgJ2RyaXZlcicgZnVuY3Rpb24sIHdoaWNoIGZpbHRlcnMgb3V0IHRoZQogICAgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMsIHNvIHRoYXQgdGhlIHBhcnNlciBhY3Rpb25zIGRvIG5vdCBoYXZlIHRvCiAgICB0aGluayBhYm91dCB0aG9zZSwgYW5kIGtlZXBzIHRyYWNrIG9mIHNvbWUgdGhpbmdzIGxpa2UgdGhlIGluZGVudGF0aW9uCiAgICBvZiB0aGUgY3VycmVudCBsaW5lIGFuZCB0aGUgY29sdW1uIGF0IHdoaWNoIHRoZSBjdXJyZW50IHRva2VuIGVuZHMsCiAgICB3aGljaCBhcmUgc3RvcmVkIGluIHRoZSBsZXhpY2FsIGNvbnRleHQgYW5kIHVzZWQgZm9yIGluZGVudGF0aW9uLgogICAgQWZ0ZXIgY2FsbGluZyBhbiBhY3Rpb24sIGlmIHRoZSBhY3Rpb24gY2FsbGVkIDxjb2RlPmNvbnQ8L2NvZGU+LCB0aGlzIGRyaXZlcgogICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIGN1cnJlbnQgdG9rZW4sIGlmIDxjb2RlPnBhc3M8L2NvZGU+IChvciBub3RoaW5nKSB3YXMKICAgIGNhbGxlZCwgaXQgd2lsbCBpbW1lZGlhdGVseSBjb250aW51ZSB3aXRoIHRoZSBuZXh0IGFjdGlvbi48L3A+CgogICAgPHA+VGhpcyBnb2VzIHRvIHNob3cgdGhhdCBpdCBpcyB2aWFibGUgdG8gd3JpdGUgYSBxdWl0ZSBlbGFib3JhdGUKICAgIG1pbmlsYW5ndWFnZSBpbiBhIG1hY3JvLWxlc3MgbGFuZ3VhZ2UgbGlrZSBKYXZhU2NyaXB0LiBJIGRvbid0IHRoaW5rCiAgICBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBkbyBzb21ldGhpbmcgbGlrZSB0aGlzIHdpdGhvdXQgY2xvc3VyZXMgKG9yCiAgICBzaW1pbGFybHkgcG93ZXJmdWwgYWJzdHJhY3Rpb24pIHRob3VnaCwgSSd2ZSBjZXJ0YWlubHkgbmV2ZXIgc2VlbgogICAgYW55dGhpbmcgbGlrZSBpdCBpbiBKYXZhIGNvZGUuPC9wPgoKICAgIDxwPlRoZSB3YXkgYSAnY29weScgb2YgdGhlIHBhcnNlciB3YXMgcHJvZHVjZWQgc2hvd3MgYSBuaWNlIHVzYWdlCiAgICBvZiBjbG9zdXJlcy4gTGlrZSB3aXRoIHRoZSBET00gdHJhbnNmb3JtZXIgc2hvd24gYWJvdmUsIG1vc3Qgb2YKICAgIHRoZSBsb2NhbCBzdGF0ZSBvZiB0aGUgcGFyc2VyIGlzIGhlbGQgaW4gYSBjbG9zdXJlIHByb2R1Y2VkIGJ5CiAgICBjYWxsaW5nIDxjb2RlPnBhcnNlKHN0cmVhbSk8L2NvZGU+LiBUaGUgZnVuY3Rpb24KICAgIDxjb2RlPmNvcHk8L2NvZGU+LCB3aGljaCBpcyBsb2NhbCB0byB0aGUgcGFyc2VyIGZ1bmN0aW9uLCBwcm9kdWNlcwogICAgYSBuZXcgY2xvc3VyZSwgd2l0aCBjb3BpZXMgb2YgYWxsIHRoZSByZWxldmFudCB2YXJpYWJsZXM6PC9wPgoKPHByZSBjbGFzcz0iY29kZSI+PHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmZ1bmN0aW9uPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvcHk8L3NwYW4+KCl7CiAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPnZhcjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj5fY29udGV4dDwvc3Bhbj4gPSA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvbnRleHQ8L3NwYW4+LCA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGVkZWYiPl9sZXhpY2FsPC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+bGV4aWNhbDwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+X2FjdGlvbnM8L3NwYW4+ID0gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5jb3B5QXJyYXk8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+YWN0aW9uczwvc3Bhbj4pOwoKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+cmV0dXJuPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZnVuY3Rpb248L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+X3Rva2Vuczwvc3Bhbj4pewogICAgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5jb250ZXh0PC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj5fY29udGV4dDwvc3Bhbj47CiAgICA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmxleGljYWw8L3NwYW4+ID0gPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPl9sZXhpY2FsPC9zcGFuPjsKICAgIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+YWN0aW9uczwvc3Bhbj4gPSA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvcHlBcnJheTwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPl9hY3Rpb25zPC9zcGFuPik7CiAgICA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPnRva2Vuczwvc3Bhbj4gPSA8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+X3Rva2Vuczwvc3Bhbj47CiAgICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+cmV0dXJuPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPnBhcnNlcjwvc3Bhbj47CiAgfTsKfTwvcHJlPgoKICAgIDxwPldoZXJlIDxjb2RlPnBhcnNlcjwvY29kZT4gaXMgdGhlIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSA8Y29kZT5uZXh0PC9jb2RlPiAoZHJpdmVyKQogICAgZnVuY3Rpb24sIGFuZCBhIHJlZmVyZW5jZSB0byB0aGlzIDxjb2RlPmNvcHk8L2NvZGU+IGZ1bmN0aW9uLiBXaGVuIHRoZSBmdW5jdGlvbgogICAgdGhhdCA8Y29kZT5jb3B5PC9jb2RlPiBwcm9kdWNlcyBpcyBjYWxsZWQgd2l0aCBhIHRva2VuIHN0cmVhbSBhcyBhcmd1bWVudCwgaXQKICAgIHVwZGF0ZXMgdGhlIGxvY2FsIHZhcmlhYmxlcyBpbiB0aGUgcGFyc2VyIGNsb3N1cmUsIGFuZCByZXR1cm5zIHRoZQogICAgY29ycmVzcG9uZGluZyBpdGVyYXRvciBvYmplY3QuPC9wPgoKICAgIDxwPk1vdmluZyBvbiwgd2UgZ2V0IHRvIHRoZSBsYXN0IHN0b3AgaW4gdGhpcyBjaGFpbiBvZiBnZW5lcmF0b3JzLCB0aGUKICAgIGFjdHVhbCBoaWdobGlnaHRlci4gWW91IGNhbiB2aWV3IHRoaXMgb25lIGFzIHRha2luZyB0d28gc3RyZWFtcyBhcwogICAgaW5wdXQsIG9uIHRoZSBvbmUgaGFuZCB0aGVyZSBpcyB0aGUgc3RyZWFtIG9mIHRva2VucyBmcm9tIHRoZSBwYXJzZXIsCiAgICBhbmQgb24gdGhlIG90aGVyIGhhbmQgdGhlcmUgaXMgdGhlIERPTSB0cmVlIGFzIGxlZnQgYnkgdGhlIERPTQogICAgdHJhbnNmb3JtZXIuIElmIGV2ZXJ5dGhpbmcgd2VudCBjb3JyZWN0bHksIHRoZXNlIHR3byBzaG91bGQgYmUKICAgIHN5bmNocm9uaXplZC4gVGhlIGhpZ2hsaWdodGVyIGNhbiBsb29rIGF0IHRoZSBjdXJyZW50IHRva2VuLCBzZWUgaWYKICAgIHRoZSA8Y29kZT5zcGFuPC9jb2RlPiBpbiB0aGUgRE9NIHRyZWUgY29ycmVzcG9uZHMgdG8gaXQgKGhhcyB0aGUgc2FtZSB0ZXh0CiAgICBjb250ZW50LCBhbmQgdGhlIGNvcnJlY3QgY2xhc3MpLCBhbmQgaWYgbm90IGl0IGNhbiBjaG9wIHVwIHRoZSBET00KICAgIG5vZGVzIHRvIGNvbmZvcm0gdG8gdGhlIHRva2Vucy48L3A+CgogICAgPHA+RXZlcnkgdGltZSB0aGUgcGFyc2VyIHlpZWxkcyBhIG5ld2xpbmUgdG9rZW4sIHRoZSBoaWdobGlnaGVyCiAgICBlbmNvdW50ZXJzIGEgPGNvZGU+YnI8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIERPTSBzdHJlYW0uIEl0IHRha2VzIHRoZSBjb3B5IG9mIHRoZQogICAgcGFyc2VyIGFuZCB0aGUgbGV4aWNhbCBjb250ZXh0IGZyb20gdGhpcyB0b2tlbiBhbmQgYXR0YWNoZXMgdGhlbSB0bwogICAgdGhlIERPTSBub2RlLiBUaGlzIHdheSwgYSBuZXcgaGlnaGxpZ2h0aW5nIHByb2Nlc3MgY2FuIGJlIHN0YXJ0ZWQgZnJvbQogICAgdGhhdCBub2RlIGJ5IHJlLXN0YXJ0aW5nIHRoZSBjb3B5IG9mIHRoZSBwYXJzZXIgd2l0aCBhIG5ldyB0b2tlbgogICAgc3RyZWFtLCB3aGljaCByZWFkcyB0b2tlbnMgZnJvbSB0aGUgRE9NIG5vZGVzIHN0YXJ0aW5nIGF0IHRoYXQgPGNvZGU+YnI8L2NvZGU+CiAgICBlbGVtZW50LCBhbmQgdGhlIGluZGVudGF0aW9uIGNvZGUgY2FuIHVzZSB0aGUgbGV4aWNhbCBjb250ZXh0CiAgICBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgaW5kZW50YXRpb24gYXQgdGhhdCBwb2ludC48L3A+CgogICAgPGgyPlNlbGVjdGlvbiB3b2VzPC9oMj4KCiAgICA8cD5BbGwgdGhlIGFib3ZlIGNhbiBiZSBkb25lIHVzaW5nIHRoZSBET00gaW50ZXJmYWNlIHRoYXQgYWxsIG1ham9yCiAgICBicm93c2VycyBoYXZlIGluIGNvbW1vbiwgYW5kIHdoaWNoIGlzIHJlbGF0aXZlbHkgZnJlZSBvZiB3ZWlyZCBidWdzCiAgICBhbmQgYWJiZXJyYXRpb25zLiBIb3dldmVyLCB3aGVuIHRoZSB1c2VyIGlzIHR5cGluZyBpbiBuZXcgY29kZSwgdGhpcwogICAgbXVzdCBhbHNvIGJlIGhpZ2hsaWdodGVkLiBGb3IgdGhpcyB0byBoYXBwZW4sIHRoZSBwcm9ncmFtIG11c3Qga25vdwogICAgd2hlcmUgdGhlIGN1cnNvciBjdXJyZW50bHkgaXMsIGFuZCBiZWNhdXNlIGl0IG11Y2tzIHVwIHRoZSBET00gdHJlZSwKICAgIGl0IGhhcyB0byByZXN0b3JlIHRoaXMgY3Vyc29yIHBvc2l0aW9uIGFmdGVyIGRvaW5nIHRoZSBoaWdobGlnaHRpbmcuPC9wPgoKICAgIDxwPlJlLWhpZ2hsaWdodGluZyBhbHdheXMgaGFwcGVucyBwZXIgbGluZSwgYmVjYXVzZSB0aGUgY29weSBvZiB0aGUKICAgIHBhcnNlciBpcyBzdG9yZWQgb25seSBhdCB0aGUgZW5kIG9mIGxpbmVzLiBEb2luZyB0aGlzIGV2ZXJ5IHRpbWUgdGhlCiAgICB1c2VyIHByZXNzZXMgYSBrZXkgaXMgdGVycmlibHkgc2xvdyBhbmQgb2Jub3hpb3VzLCBzbyB3aGF0IEkgZGlkIHdhcwogICAga2VlcCBhIGxpc3Qgb2YgJ2RpcnR5JyBub2RlcywgYW5kIGFzIHNvb24gYXMgdGhlIHVzZXIgZGlkbid0IHR5cGUKICAgIGFueXRpbmcgZm9yIDMwMCBtaWxsaXNlY29uZHMgdGhlIHByb2dyYW0gc3RhcnRzIHJlLWhpZ2hsaWdodGluZyB0aGVzZQogICAgbm9kZXMuIElmIGl0IGZpbmRzIG1vcmUgdGhhbiB0ZW4gbGluZXMgbXVzdCBiZSByZS1wYXJzZWQsIGl0IGRvZXMgb25seQogICAgdGVuIGFuZCB3YWl0cyBhbm90aGVyIDMwMCBtaWxsaXNlY29uZHMgYmVmb3JlIGl0IGNvbnRpbnVlcywgdGhpcyB3YXkKICAgIHRoZSBicm93c2VyIG5ldmVyIGZyZWV6ZXMgdXAgZW50aXJlbHkuPC9wPgoKICAgIDxwPkFzIG1lbnRpb25lZCBlYXJsaWVyLCBJbnRlcm5ldCBFeHBsb3JlcidzIHNlbGVjdGlvbiBtb2RlbCBpcyBub3QgdGhlCiAgICBtb3N0IHByYWN0aWNhbCBvbmUuIE15IGF0dGVtcHRzIHRvIGJ1aWxkIGEgd3JhcHBlciB0aGF0IG1ha2VzIGl0IGxvb2sKICAgIGxpa2UgdGhlIFczQyBtb2RlbCBhbGwgc3RyYW5kZWQuIEluIHRoZSBlbmQgSSBjYW1lIHRvIHRoZSBjb25jbHVzaW9uCiAgICB0aGF0IEkgb25seSBuZWVkZWQgdHdvIG9wZXJhdGlvbnM6PC9wPgoKICAgIDx1bD4KICAgICAgPGxpPkNyZWF0aW5nIGEgc2VsZWN0aW9uICdzbmFwc2hvdCcgdGhhdCBjYW4gYmUgcmVzdG9yZWQgYWZ0ZXIKICAgICAgaGlnaGxpZ2h0aW5nLCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgc3RpbGwgd29ya3MgaWYgc29tZSBvZiB0aGUgbm9kZXMKICAgICAgdGhhdCB3ZXJlIHNlbGVjdGVkIGFyZSByZXBsYWNlZCBieSBvdGhlciBub2RlcyB3aXRoIHRoZSBzYW1lCiAgICAgIHNpemUgYnV0IGEgZGlmZmVyZW50IHN0cnVjdHVyZS48L2xpPgogICAgICA8bGk+RmluZGluZyB0aGUgdG9wLWxldmVsIG5vZGUgYXJvdW5kIG9yIGJlZm9yZSB0aGUgY3Vyc29yLCB0byBtYXJrIGl0CiAgICAgIGRpcnR5IG9yIHRvIGluc2VydCBpbmRlbnRhdGlvbiB3aGl0ZXNwYWNlIGF0IHRoZSBzdGFydCBvZiB0aGF0IGxpbmUuPC9saT4KICAgIDwvdWw+CgogICAgPHA+SXQgdHVybnMgb3V0IHRoYXQgdGhlIHBpeGVsLWJhc2VkIHNlbGVjdGlvbiBtb2RlbCB0aGF0IEludGVybmV0CiAgICBFeHBsb3JlciB1c2VzLCB3aGljaCBhbHdheXMgc2VlbWVkIGNvbXBsZXRlbHkgbHVkcmljcm91cyB0byBtZSwgaXMKICAgIHBlcmZlY3QgZm9yIHRoZSBmaXJzdCBjYXNlLiBTaW5jZSB0aGUgRE9NIHRyYW5zZm9ybWF0aW9uIChnZW5lcmFsbHkpCiAgICBkb2VzIG5vdCBjaGFuZ2UgdGhlIHBvc2l0aW9uIG9mIHRoaW5ncywgc3RvcmluZyB0aGUgcGl4ZWwgb2Zmc2V0cyBvZgogICAgdGhlIHNlbGVjdGlvbiBtYWtlcyBpdCBwb3NzaWJsZSB0byByZXN0b3JlIHRoYXQgc2FtZSBzZWxlY3Rpb24sIG5ldmVyCiAgICBtaW5kIHdoYXQgaGFwcGVuZWQgdG8gdGhlIHVuZGVybHlpbmcgRE9NIHN0cnVjdHVyZS48L3A+CgogICAgPHA+W0xhdGVyIGFkZGl0aW9uOiBOb3RlIHRoYXQgdGhpcywgZHVlIHRvIHRoZSB2ZXJ5IHJhbmRvbSBkZXNpZ24KICAgIG9mIHRoZSA8YQogICAgaHJlZj0iaHR0cDovL21zZG4yLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczUzNTg3MihWUy44NSkuYXNweCMiPlRleHRSYW5nZQogICAgaW50ZXJmYWNlPC9hPiwgb25seSByZWFsbHkgd29ya3Mgd2hlbiB0aGUgd2hvbGUgc2VsZWN0aW9uIGZhbGxzCiAgICB3aXRoaW4gdGhlIHZpc2libGUgcGFydCBvZiB0aGUgZG9jdW1lbnQuXTwvcD4KCiAgICA8cD5Eb2luZyB0aGUgc2FtZSB3aXRoIHRoZSBXM0Mgc2VsZWN0aW9uIG1vZGVsIGlzIGEgbG90IGhhcmRlci4gV2hhdCBJCiAgICBlbmRlZCB1cCB3aXRoIHdhcyB0aGlzOjwvcD4KCiAgICA8dWw+CiAgICAgIDxsaT5DcmVhdGUgYW4gb2JqZWN0IHBvaW50aW5nIHRvIHRoZSBub2RlcyBhdCB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUKICAgICAgc2VsZWN0aW9uLCBhbmQgdGhlIG9mZnNldCB3aXRoaW4gdGhvc2Ugbm9kZXMuIFRoaXMgaXMgYmFzaWNhbGx5IHRoZQogICAgICBpbmZvcm1hdGlvbiB0aGF0IHRoZSA8Y29kZT5SYW5nZTwvY29kZT4gb2JqZWN0IGdpdmVzIHlvdS48L2xpPgogICAgICA8bGk+TWFrZSByZWZlcmVuY2VzIGZyb20gdGhlc2Ugbm9kZXMgYmFjayB0byB0aGF0IG9iamVjdC48L2xpPgogICAgICA8bGk+V2hlbiByZXBsYWNpbmcgKHBhcnQgb2YpIGEgbm9kZSB3aXRoIGFub3RoZXIgb25lLCBjaGVjayBmb3Igc3VjaCBhCiAgICAgIHJlZmVyZW5jZSwgYW5kIHdoZW4gaXQgaXMgcHJlc2VudCwgY2hlY2sgd2hldGhlciB0aGlzIG5ldyBub2RlIHdpbGwKICAgICAgZ2V0IHRoZSBzZWxlY3Rpb24uIElmIGl0IGRvZXMsIG1vdmUgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBvbGQgdG8gdGhlCiAgICAgIG5ldyBub2RlLCBpZiBpdCBkb2VzIG5vdCwgYWRqdXN0IHRoZSBvZmZzZXQgaW4gdGhlIHNlbGVjdGlvbiBvYmplY3QgdG8KICAgICAgcmVmbGVjdCB0aGUgZmFjdCB0aGF0IHBhcnQgb2YgdGhlIG9sZCBub2RlIGhhcyBiZWVuIHJlcGxhY2VkLjwvbGk+CiAgICA8L3VsPgoKICAgIDxwPk5vdyBpbiB0aGUgc2Vjb25kIGNhc2UgKGdldHRpbmcgdGhlIHRvcC1sZXZlbCBub2RlIGF0IHRoZQogICAgY3Vyc29yKSB0aGUgSW50ZXJuZXQgRXhwbG9yZXIgY2hlYXQgZG9lcyBub3Qgd29yay4gSW4gdGhlIFczQwogICAgbW9kZWwgdGhpcyBpcyByYXRoZXIgZWFzeSwgeW91IGhhdmUgdG8gZG8gc29tZSBjcmVhdGl2ZSBwYXJlbnQtCiAgICBhbmQgc2libGluZy1wb2ludGVyIGZvbGxvd2luZyB0byBhcnJpdmUgYXQgdGhlIGNvcnJlY3QgdG9wLWxldmVsCiAgICBub2RlLCBidXQgbm90aGluZyB3ZWlyZC4gSW4gSW50ZXJuZXQgRXhwbG9yZXIsIGFsbCB3ZSBoYXZlIHRvIGdvCiAgICBvbiBpcyB0aGUgPGNvZGU+cGFyZW50RWxlbWVudDwvY29kZT4gbWV0aG9kIG9uIGEKICAgIDxjb2RlPlRleHRSYW5nZTwvY29kZT4sIHdoaWNoIGdpdmVzIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQKICAgIGNvbXBsZXRlbHkgZW52ZWxvcHMgdGhlIHNlbGVjdGlvbi4gSWYgdGhlIGN1cnNvciBpcyBpbnNpZGUgYSB0ZXh0CiAgICBub2RlLCB0aGlzIGlzIGdvb2QsIHRoYXQgdGV4dCBub2RlIHRlbGxzIHVzIHdoZXJlIHdlIGFyZS4gSWYgdGhlCiAgICBjdXJzb3IgaXMgYmV0d2VlbiBub2RlcywgZm9yIGV4YW1wbGUgYmV0d2VlbiB0d28gPGNvZGU+YnI8L2NvZGU+CiAgICBub2RlcywgeW91IGdldCB0byB0b3AtbGV2ZWwgbm9kZSBpdHNlbGYgYmFjaywgd2hpY2ggaXMgcmVtYXJrYWJseQogICAgdXNlbGVzcy4gSW4gY2FzZXMgbGlrZSB0aGlzIEkgc3Rvb3AgdG8gYSByYXRoZXIgdWdseSBoYWNrICh3aGljaAogICAgZm9ydHVuYXRlbHkgdHVybmVkIG91dCB0byBiZSBhY2NlcHRhYmx5IGZhc3QpICYjeDIwMTU7IEkgY3JlYXRlIGEKICAgIHRlbXBvcmFyeSBlbXB0eSA8Y29kZT5zcGFuPC9jb2RlPiB3aXRoIGFuIElEIGluc2lkZSB0aGUgc2VsZWN0aW9uLAogICAgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoaXMgPGNvZGU+c3BhbjwvY29kZT4gYnkgSUQsIHRha2UgaXRzCiAgICA8Y29kZT5wcmV2aW91c1NpYmxpbmc8L2NvZGU+LCBhbmQgcmVtb3ZlIGl0IGFnYWluLjwvcD4KCiAgICA8cD5VbmZvcnR1bmF0ZWx5LCBPcGVyYSdzIHNlbGVjdGlvbiBpbXBsZW1lbnRhdGlvbiBpcyBidWdneSwgYW5kIGl0CiAgICB3aWxsIGdpdmUgd2lsZGx5IGluY29ycmVjdCA8Y29kZT5SYW5nZTwvY29kZT4gb2JqZWN0cyB3aGVuIHRoZSBjdXJzb3IKICAgIGlzIGJldHdlZW4gdHdvIG5vZGVzLiBUaGlzIGlzIGEgYml0IG9mIGEgc2hvd3N0b3BwZXIsIGFuZCB1bnRpbCBJIGZpbmQKICAgIGEgd29ya2Fyb3VuZCBmb3IgdGhhdCBvciBpdCBnZXRzIGZpeGVkLCB0aGUgaGlnaGxpZ2h0ZXIgZG9lc24ndCB3b3JrCiAgICBwcm9wZXJseSBpbiBPcGVyYS48L3A+CgogICAgPHA+QWxzbywgd2hlbiBvbmUgcHJlc3NlcyBlbnRlciBpbiBhIDxjb2RlPmRlc2lnbk1vZGU8L2NvZGU+CiAgICBkb2N1bWVudCBpbiBGaXJlZm94IG9yIE9wZXJhLCBhIDxjb2RlPmJyPC9jb2RlPiB0YWcgaXMgaW5zZXJ0ZWQuCiAgICBJbiBJbnRlcm5ldCBFeHBsb3JlciwgcHJlc3NpbmcgZW50ZXIgY2F1c2VzIHNvbWUgbWFuaWFjYWwgZ25vbWUgdG8KICAgIGNvbWUgb3V0IGFuZCBzdGFydCB3cmFwcGluZyBhbGwgdGhlIGNvbnRlbnQgYmVmb3JlIGFuZCBhZnRlciB0aGUKICAgIGN1cnNvciBpbiA8Y29kZT5wPC9jb2RlPiB0YWdzLiBJIHN1cHBvc2UgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGJlCiAgICBzYWlkIGZvciB0aGF0LCBpbiBwcmluY2lwbGUsIHRob3VnaCBpZiB5b3Ugc2F3IHRoZSB0YWcgc291cCBvZgogICAgPGNvZGU+Zm9udDwvY29kZT5zIGFuZCBuZXN0ZWQgcGFyYWdyYXBocyBJbnRlcm5ldCBFeHBsb3JlcgogICAgZ2VuZXJhdGVzIHlvdSB3b3VsZCBzb29uIGVub3VnaCBmb3JnZXQgYWxsIGFib3V0IHByaW5jaXBsZS4KICAgIEFueXdheSwgZ2V0dGluZyB1bndhbnRlZCA8Y29kZT5wPC9jb2RlPiB0YWdzIHNsb3dlZCB0aGUKICAgIGhpZ2hsaWdodGVyIGRvd24gdGVycmlibHkgJiN4MjAxNTsgaXQgaGFkIHRvIG92ZXJoYXVsIHRoZSB3aG9sZQogICAgRE9NIHRyZWUgdG8gcmVtb3ZlIHRoZW0gYWdhaW4sIGV2ZXJ5IHRpbWUgdGhlIHVzZXIgcHJlc3NlZCBlbnRlci4KICAgIEZvcnR1bmF0ZWx5IEkgY291bGQgZml4IHRoaXMgYnkgY2FwdHVyaW5nIHRoZSBlbnRlciBwcmVzc2VzIGFuZAogICAgbWFudWFsbHkgaW5zZXJ0aW5nIGEgPGNvZGU+YnI8L2NvZGU+IHRhZyBhdCB0aGUgY3Vyc29yLjwvcD4KCiAgICA8cD5PbiB0aGUgc3ViamVjdCBvZiBJbnRlcm5ldCBFeHBsb3JlcidzIHRhZyBzb3VwLCBoZXJlIGlzIGFuIGludGVyZXN0aW5nCiAgICBhbmVjZG90ZTogT25lIHRpbWUsIHdoZW4gdGVzdGluZyB0aGUgZWZmZWN0IHRoYXQgbW9kaWZ5aW5nIHRoZSBjb250ZW50CiAgICBvZiBhIHNlbGVjdGlvbiBoYWQsIEkgaW5zcGVjdGVkIHRoZSBET00gdHJlZSBhbmQgZm91bmQgYSA8Y29kZT4iL0IiPC9jb2RlPgogICAgZWxlbWVudC4gVGhpcyB3YXMgbm90IGEgY2xvc2luZyB0YWcsIHRoZXJlIGFyZSBubyBjbG9zaW5nIHRhZ3MgaW4gdGhlCiAgICBET00gdHJlZSwganVzdCBlbGVtZW50cy4gVGhlIDxjb2RlPm5vZGVOYW1lPC9jb2RlPiBvZiB0aGlzIGVsZW1lbnQgd2FzIGFjdHVhbGx5CiAgICA8Y29kZT4iL0IiPC9jb2RlPi4gVGhhdCB3YXMgd2hlbiBJIGdhdmUgdXAgYW55IG5vdGlvbnMgb2YgZXZlciB1bmRlcnN0YW5kaW5nIHRoZQogICAgcHJvZm91bmQgbXlzdGVyeSB0aGF0IGlzIEludGVybmV0IEV4cGxvcmVyLjwvcD4KCiAgICA8aDI+Q2xvc2luZyB0aG91Z2h0czwvaDI+CgogICAgPHA+V2VsbCwgSSBkZXNwYWlyZWQgYXQgdGltZXMsIGJ1dCBJIGRpZCBlbmQgdXAgd2l0aCBhIHdvcmtpbmcgSmF2YVNjcmlwdAogICAgZWRpdG9yLiBJIGRpZCBub3Qga2VlcCB0cmFjayBvZiB0aGUgYW1vdW50IG9mIHRpbWUgSSB3YXN0ZWQgb24gdGhpcywKICAgIGJ1dCBJIHdvdWxkIGVzdGltYXRlIGl0IHRvIGJlIGFyb3VuZCBmaWZ0eSBob3Vycy4gRmluZGluZyB3b3JrYXJvdW5kcwogICAgZm9yIGJyb3dzZXIgYnVncyBjYW4gYmUgYSB0ZXJyaWJseSBub25saW5lYXIgcHJvY2Vzcy4gSSBqdXN0IHNwZW50CiAgICBoYWxmIGEgZGF5IHdvcmtpbmcgb24gYSB3ZWlyZCBnbGl0Y2ggaW4gRmlyZWZveCB0aGF0IGNhdXNlZCB0aGUgY3Vyc29yCiAgICBpbiB0aGUgZWRpdGFibGUgZnJhbWUgdG8gYmUgZGlzcGxheWVkIDMvNCBsaW5lIHRvbyBoaWdoIHdoZW4gaXQgd2FzIGF0CiAgICB0aGUgdmVyeSBlbmQgb2YgdGhlIGRvY3VtZW50LiBUaGVuIEkgZm91bmQgb3V0IHRoYXQgc2V0dGluZyB0aGUKICAgIHN0eWxlLmRpc3BsYXkgb2YgdGhlIGlmcmFtZSB0byAiYmxvY2siIGZpeGVkIHRoaXMgKHdoeSBub3Q/KS4gSSdtCiAgICBhbWF6ZWQgaG93IG9mdGVuIGlzc3VlcyB0aGF0IHNlZW0gaG9wZWxlc3MgZG8gdHVybiBvdXQgdG8gYmUKICAgIGF2b2lkYWJsZSwgZXZlbiBpZiBpdCB0YWtlcyBob3VycyBvZiBzY3Jld2luZyBhcm91bmQgYW5kIHNvbWUgdHJ1bHkKICAgIG5vbi1vYnZpb3VzIGlkZWFzLjwvcD4KCiAgICA8cD5Gb3IgYSBsb3Qgb2YgdGhpbmdzLCBKYXZhU2NyaXB0ICsgRE9NIGVsZW1lbnRzIGFyZSBhIHN1cnByaXNpbmdseQogICAgcG93ZXJmdWwgcGxhdGZvcm0uIFNpbXBsZSBpbnRlcmFjdGl2ZSBkb2N1bWVudHMgYW5kIGZvcm1zIGNhbiBiZQogICAgd3JpdHRlbiBpbiBicm93c2VycyB3aXRoIHZlcnkgbGl0dGxlIGVmZm9ydCwgZ2VuZXJhbGx5IGxlc3MgdGhhbiB3aXRoCiAgICBtb3N0ICd0cmFkaXRpb25hbCcgcGxhdGZvcm1zIChKYXZhLCBXaW4zMiwgdGhpbmdzIGxpa2UgV3hXaWRnZXRzKS4KICAgIExpYnJhcmllcyBsaWtlIERvam8gKGFuZCBhIHNpbWlsYXIgbW9uc3RlciBJIG9uY2Ugd3JvdGUgbXlzZWxmKSBldmVuCiAgICBtYWtlIGNvbXBsZXgsIGNvbXBvc2l0ZSB3aWRnZXRzIHdvcmthYmxlLiBIb3dldmVyLCB3aGVuIGFwcGxpY2F0aW9ucwogICAgZ28gc3VmZmljaWVudGx5IGJleW9uZCB0aGUgdGhpbmdzIHRoYXQgYnJvd3NlcnMgd2VyZSBkZXNpZ25lZCBmb3IsIHRoZQogICAgYXZhaWxhYmxlIEFQSXMgZG8gbm90IGdpdmUgZW5vdWdoIGNvbnRyb2wsIGFyZSBub25zdGFuZGFyZCBhbmQgYnVnZ3ksCiAgICBhbmQgYXJlIG9mdGVuIHBvb3JseSBkZXNpZ25lZC4gQmVjYXVzZSBvZiB0aGlzLCB3cml0aW5nIHN1Y2gKICAgIGFwcGxpY2F0aW9ucywgd2hlbiBpdCBpcyBldmVuIHBvc3NpYmxlLCBpcyA8ZW0+cGFpbmZ1bDwvZW0+IHByb2Nlc3MuPC9wPgoKICAgIDxwPkFuZCB3aG8gbGlrZXMgcGFpbj8gU3VyZSwgd2hlbiBmaW5kaW5nIHRoYXQgY3Jhenkgd29ya2Fyb3VuZCwKICAgIHN1YmR1ZWluZyB0aGUgZGFtbiBicm93c2VyLCBhbmQgZ2V0dGluZyBldmVyeXRoaW5nIHRvIHdvcmssIHRoZXJlCiAgICBpcyBhIGNlcnRhaW4gbWFjaG8gdGhyaWxsLiBCdXQgb25lIGNhbid0IGhlbHAgd29uZGVyaW5nIGhvdyBtdWNoCiAgICBlYXNpZXIgdGhpbmdzIGxpa2UgcHJldmVudGluZyB0aGUgdXNlciBmcm9tIHBhc3RpbmcgcGljdHVyZXMgaW4KICAgIGhpcyBzb3VyY2UgY29kZSB3b3VsZCBiZSBvbiBhbm90aGVyIHBsYXRmb3JtLiBNYXliZSBzb21ldGhpbmcgbGlrZQogICAgU2lsdmVybGlnaHQgb3Igd2hhdGV2ZXIgb3RoZXIgbmV3IGJyb3dzZXIgcGx1Z2luIGdpem1vcyBwZW9wbGUgYXJlCiAgICBwdXNoaW5nIHRoZXNlIGRheXMgd2lsbCBiZWNvbWUgdGhlIHdheSB0byBzb2x2ZSB0aGluZ3MgbGlrZSB0aGlzCiAgICBpbiB0aGUgZnV0dXJlLiBCdXQsIHBlcnNvbmFsbHksIEkgd291bGQgcHJlZmVyIGZvciB0aG9zZSBicm93c2VyCiAgICBjb21wYW5pZXMgdG8gcHV0IHNvbWUgcmVhbCBlZmZvcnQgaW50byB0aGluZ3MgbGlrZSBjbGVhbmluZyB1cCBhbmQKICAgIHN0YW5kYXJkaXNpbmcgc2hhZHkgdGhpbmdzIGxpa2UgPGNvZGU+ZGVzaWduTW9kZTwvY29kZT4sIGZpeGluZwogICAgdGhlaXIgYnVncywgYW5kIGdldHRpbmcgc2VyaW91cyBhYm91dCBFQ01BU2NyaXB0IDQuPC9wPgoKICAgIDxwPldoaWNoIGlzIHByb2JhYmx5IG5vdCByZWFsaXN0aWNhbGx5IGdvaW5nIHRvIGhhcHBlbiBhbnl0aW1lIHNvb24uPC9wPgoKICAgIDxoci8+CgogICAgPHA+U29tZSBpbnRlcmVzdGluZyBwcm9qZWN0cyBzaW1pbGFyIHRvIHRoaXM6PC9wPgoKICAgIDx1bD4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cueW1hY3Mub3JnIj5ZbWFjczwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2dwbC5pbnRlcm5ldGNvbm5lY3Rpb24ubmV0L3ZpLyI+dmkgY2xvbmU8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9yb2Jyb2hhbi5jb20vcHJvamVjdHMvOW5lLyI+RW1hY3MgY2xvbmU8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlcHJlc3Muc291cmNlZm9yZ2UubmV0LyI+Q29kZVByZXNzPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmNvZGVpZGUuY29tIj5Db2RlSURFPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmNkb2xpdmV0Lm5ldC9lZGl0YXJlYSI+RWRpdEFyZWE8L2E+PC9saT4KICAgIDwvdWw+CgogICAgPGhyLz4KCiAgICA8cD5JZiB5b3UgaGF2ZSBhbnkgcmVtYXJrcywgY3JpdGljaXNtLCBvciBoaW50cyByZWxhdGVkIHRvIHRoZQogICAgYWJvdmUsIGRyb3AgbWUgYW4gZS1tYWlsIGF0IDxhCiAgICBocmVmPSJtYWlsdG86bWFyaWpuaEBnbWFpbC5jb20iPm1hcmlqbmhAZ21haWwuY29tPC9hPi4gSWYgeW91IHNheQogICAgc29tZXRoaW5nIGdlbmVyYWxseSBpbnRlcmVzdGluZywgSSdsbCBpbmNsdWRlIHlvdXIgcmVhY3Rpb24gaGVyZQogICAgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIHBhZ2UuPC9wPgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbImZyaWVuZGx5bmFtZSJdPSJDb2RlTWlycm9yIHN5bnRheGhpZ2hsaWdodGluZyBlZGl0b3IiOwoKJGxhbmdbInBvc3RpbnN0YWxsIl09IlRoZSBDb2RlTWlycm9yIG1vZHVsZSB3YXMgc3VjZXNzZnVsbHkgaW5zdGFsbGVkIjsKJGxhbmdbIm5lZWRwZXJtaXNzaW9uIl09IidZb3UgbmVlZCB0aGUgJyVzJyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhhdCBmdW5jdGlvbi4iOwoKJGxhbmdbInNldHRpbmdzdGFiIl09IlNldHRpbmdzIjsKJGxhbmdbInNhdmVzZXR0aW5ncyJdPSJTYXZlIHNldHRpbmdzIjsKJGxhbmdbInNldHRpbmdzc2F2ZWQiXT0iU2V0dGluZ3Mgc2F2ZWQiOwoKJGxhbmdbImh0bWx0ZXN0Il09IkhUTUwgc3ludGF4IHRlc3QiOwokbGFuZ1siY3NzdGVzdCJdPSJDU1Mgc3ludGF4IHRlc3QiOwokbGFuZ1sicGhwdGVzdCJdPSJQSFAgc3ludGF4IHRlc3QiOwoKJGxhbmdbInNob3dsaW5lbnVtYmVycyJdPSJTaG93IGxpbmVudW1iZXJzIjsKJGxhbmdbInRleHR3cmFwcGluZyJdPSJXcmFwIGxvbmcgbGluZXMiOwoKJGxhbmdbImhlbHAiXT0iPHN0cm9uZz5XaGF0IGRvZXMgdGhpcyBtb2R1bGUgZG8/PC9zdHJvbmc+Cjxici8+ClRoZSBDb2RlTWlycm9yIG1vZHVsZSBhbGxvd3MgeW91IHRvIGVkaXQgY29udGVudCwgdGVtcGxhdGVzIGFuZCBzdHlsZXNoZWV0cyB1c2luZyBhIHN5bnRheGhpZ2hsaWdodGluZyBlZGl0b3IgaW5zaWRlIHlvdXIgYnJvd3Nlci4KSXQgY2FuIGJvdGggcmVwbGFjZSBhIHd5c2l3eWctbW9kdWxlLCBhbmQgYWN0IHN0YW5kYWxvbmUgZm9yIHRlbXBsYXRlL3N0eWxlc2hlZXQgZWRpdGluZyAob25seSBzdXBwb3J0ZWQgaW4gQ01TbXMgMS4xKykKPGJyLz48YnIvPgo8c3Ryb25nPkhvdyBkbyBJIHVzZSB0aGlzIG1vZHVsZT88L3N0cm9uZz4KWW91IHNpbXBseSBpbnN0YWxsIGl0LCBhbmQgY2hvb3NlIGl0IGluIHlvdXIgYWRtaW4gdXNlciBwcmVmZXJlbmNlcy4gTm90ZSwgdGhhdCBpZiB5b3UgdXNlIENNU21zIDEuMSBvciBhYm92ZSB5b3UgY2FuCnNlbGVjdCBDb2RlTWlycm9yIGJvdGggYXMgYSBXWVNJV1lHIGFuZCBhcyBhIHN5bnRheCBoaWdobGlnaHRpbmcgZWRpdG9yLiI7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/da_DK.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3IgLSBlbiBzeW50YWtzLWZyZW1oJmFlbGlnO3ZlbmRlIGVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0NvZGVNaXJyb3IgbW9kdWxldCBibGV2IGtvcnJla3QgaW5zdGFsbGVyZXQnOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICcmIzAzOTtZb3UgbmVlZCB0aGUgJiMwMzk7JXMmIzAzOTsgcGVybWlzc2lvbiB0byBwZXJmb3JtIHRoYXQgZnVuY3Rpb24uJzsKJGxhbmdbJ3NldHRpbmdzdGFiJ10gPSAnSW5kc3RpbGxpbmdlcic7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdHZW0gaW5kc3RpbGxpbmdlcic7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnSW5kc3RpbGxpbmdlcm5lIGJsZXYgZ2VtdCc7CiRsYW5nWydodG1sdGVzdCddID0gJ0hUTUwgc3ludGFrcyB0ZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1Mgc3ludGFrcyB0ZXN0JzsKJGxhbmdbJ3BocHRlc3QnXSA9ICdQSFAgc3ludGFrYSB0ZXN0JzsKJGxhbmdbJ3Nob3dsaW5lbnVtYmVycyddID0gJ1ZpcyBsaW5pZW51bXJlJzsKJGxhbmdbJ2hlbHAnXSA9ICc8c3Ryb25nPkh2YWQgZyZvc2xhc2g7ciBkZXR0ZSBtb2R1bD88L3N0cm9uZz4NCjxici8+DQpUaGUgQ29kZU1pcnJvciBtb2R1bGUgYWxsb3dzIHlvdSB0byBlZGl0IGNvbnRlbnQsIHRlbXBsYXRlcyBhbmQgc3R5bGVzaGVldHMgdXNpbmcgYSBzeW50YXhoaWdobGlnaHRpbmcgZWRpdG9yIGluc2lkZSB5b3VyIGJyb3dzZXIuDQpJdCBjYW4gYm90aCByZXBsYWNlIGEgd3lzaXd5Zy1tb2R1bGUsIGFuZCBhY3Qgc3RhbmRhbG9uZSBmb3IgdGVtcGxhdGUvc3R5bGVzaGVldCBlZGl0aW5nIChvbmx5IHN1cHBvcnRlZCBpbiBDTVNtcyAxLjErKQ0KPGJyLz48YnIvPg0KPHN0cm9uZz5Ib3cgZG8gSSB1c2UgdGhpcyBtb2R1bGU/PC9zdHJvbmc+DQpZb3Ugc2ltcGx5IGluc3RhbGwgaXQsIGFuZCBjaG9vc2UgaXQgaW4geW91ciBhZG1pbiB1c2VyIHByZWZlcmVuY2VzLiBOb3RlLCB0aGF0IGlmIHlvdSB1c2UgQ01TbXMgMS4xIG9yIGFib3ZlIHlvdSBjYW4NCnNlbGVjdCBDb2RlTWlycm9yIGJvdGggYXMgYSBXWVNJV1lHIGFuZCBhcyBhIHN5bnRheCBoaWdobGlnaHRpbmcgZWRpdG9yLic7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjIwMzk4ODY1ODUuMTIzMTcxMzYxOC4xMjQzODQxMDMyLjEyNDM4NjY1NTIuMzknOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjQyNzgwNDYzLjM1LjgudXRtY3NyPWZvcnVtLmNtc21hZGVzaW1wbGUub3JnfHV0bWNjbj0ocmVmZXJyYWwpfHV0bWNtZD1yZWZlcnJhbHx1dG1jY3Q9L2luZGV4LnBocC9ib2FyZCw5LjAuaHRtbCc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKPz4=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/de_DE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3IgU3ludGF4LUhpZ2hsaWdodGluZy1FZGl0b3IgJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnRGFzIE1vZHVsIENvZGVNaXJyb3Igd3VyZGUgZXJmb2xncmVpY2ggaW5zdGFsbGllcnQuJzsKJGxhbmdbJ25lZWRwZXJtaXNzaW9uJ10gPSAnU2llIGJlc2l0emVuIG5pY2h0ICBkaWUgJiMwMzk7JXMmIzAzOTstQmVyZWNodGlndW5nIGYmdXVtbDtyIGRpZXNlIEZ1bmt0aW9uLic7CiRsYW5nWydzZXR0aW5nc3RhYiddID0gJ0VpbnN0ZWxsdW5nZW4nOwokbGFuZ1snc2F2ZXNldHRpbmdzJ10gPSAnRWluc3RlbGx1bmdlbiBzcGVpY2hlcm4nOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ0VpbnN0ZWxsdW5nZW4gZ2VzcGVpY2hlcnQnOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdIVE1MLVN5bnRheC1UZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1MtU3ludGF4LVRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUC1TeW50YXgtVGVzdCc7CiRsYW5nWydzaG93bGluZW51bWJlcnMnXSA9ICdaZWlsZW5udW1tZXJuIGFuemVpZ2VuJzsKJGxhbmdbJ2hlbHAnXSA9ICc8c3Ryb25nPldhcyBtYWNodCBkaWVzZXMgTW9kdWw/PC9zdHJvbmc+DQo8YnIvPg0KRGFzIENvZGVNaXJyb3ItTW9kdWxlIGlzdCBlaW4gRWRpdG9yICBtaXQgU3ludGF4LUhpZ2hsaWdodGluZywgbWl0IGRlbSBTaWUgb25saW5lIEluaGFsdCwgVGVtcGxhdGVzIHVuZCBTdHlsZXNoZWV0cyBiZWFyYmVpdGVuIGsmb3VtbDtubmVuLjxiciAvPg0KRGFzIE1vZHVsIGthbm4gZGllV1lTSVdZRy1FZGl0b3JlbiBlcnNldHplbiwgYWJlciBhdWNoIDxpPnN0YW5kYWxvbmU8L2k+IHp1bSBFZGl0aWVyZW4gZGVyIFRlbXBsYXRlcyB1bmQgU3R5bGVzaGVldHMgZ2VudXR6dCB3ZXJkZW4gKGVyc3QgYWIgQ01TbXMgMS4xIHVuZCBoJm91bWw7aGVyKS4NCjxici8+PGJyLz4NCjxzdHJvbmc+V2llIHdpcmQgZXMgZWluZ2VzZXR6dD88L3N0cm9uZz4NCkluc3RhbGxpZXJlbiBTaWUgZGFzIE1vZHVsIHVuZCBha3RpdmllcmVuIFNpZSBlcyBpbiBkZW4gYmVudXR6ZXJzcGV6aWZpc2NoZW4gRWluc3RlbGx1bmdlbi48YnIgLz4NCkJlYWNodGVuIFNpZSwgZGFzcyBTaWUgYWIgQ01TbXMgMS4xIHVuZCBoJm91bWw7aGVyIDxiPkNvZGVNaXJyb3I8L2I+IGFscyBXWVNJV1lHLUVkaXRvciB1bmQgYWxzIFN5bnRheC1IaWdobGlnaHRpbmctRWRpdG9yIGVpbnNldHplbiBrJm91bWw7bm5lbi4nOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4xNjAzMTU4OTc4LjEyNDQ4NDI5MDYuMTI0NTU2NzQ1NC4xMjQ1NTk1Mzk2LjEzJzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTI0NTU5NTM5Ni4xMy45LnV0bWNjbj0ocmVmZXJyYWwpfHV0bWNzcj1mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZ3x1dG1jY3Q9L2luZGV4LnBocC90b3BpYywyNzI3MS4wLmh0bWx8dXRtY21kPXJlZmVycmFsJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/es_ES.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0VkaXRvciBkZSByZXNhbHRhZG8gZGUgc2ludGF4aXMgQ29kZU1pcnJvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0VsIG0mYW1wO29hY3V0ZTtkdWxvIENvZGVNaXJyb3IgZnVlIHNhdGlzZmFjdG9yaWFtZW50ZSBpbnN0YWxhZG8nOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICcmIzAzOTtTZSBuZWNlc2l0YSBlbCBwZXJtaXNvIGRlICYjMDM5OyVzJiMwMzk7IHBhcmEgcmVhbGl6YXIgZXN0YSBmdW5jaSZhbXA7b2FjdXRlO24uJzsKJGxhbmdbJ3NldHRpbmdzdGFiJ10gPSAnQWp1c3Rlcyc7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdTYWx2YXIgYWp1c3Rlcyc7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnQWp1c3RlcyBndWFyZGFkb3MnOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdQcnVlYmEgZGUgc2ludGF4aXMgSFRNTCc7CiRsYW5nWydjc3N0ZXN0J10gPSAnUHJ1ZWJhIGRlIHNpbnRheGlzIENTUyc7CiRsYW5nWydwaHB0ZXN0J10gPSAnUHJ1ZWJhIGRlIHNpbnRheGlzIFBIUCc7CiRsYW5nWydzaG93bGluZW51bWJlcnMnXSA9ICdNb3N0YXIgZWwgbiZhbXA7dWFjdXRlO21lcm8gZGUgbCZhbXA7aWFjdXRlO25lYXMnOwokbGFuZ1snaGVscCddID0gJzxzdHJvbmc+UXUmYW1wO2VhY3V0ZTsgaGFjZSBlc3RlIG0mYW1wO29hY3V0ZTtkdWxvPzwvc3Ryb25nPg0KPGJyLz4NCkVsIG0mYW1wO29hY3V0ZTtkdWxvIENvZGVNaXJyb3IgbGUgcGVybWl0ZSBlZGl0YXIgY29udGVuaWRvLCBwbGFudGlsbGFzIHkgaG9qYXMgZGUgZXN0aWxvIHVzYW5kbyB1biBlZGl0b3IgZGUgcmVzYWx0YWRvIGRlIHNpbnRheGlzIGRlbnRybyBkZSBzdSBuYXZlZ2Fkb3IuDQpFc3RlIHRhbWJpdSZhbXA7ZWFjdXRlO24gcHVlZGUgIHJlZW1wbGF6YXIgZWwgbSZhbXA7b2FjdXRlO2R1bG8gZGUgd3lzaXd5ZywgeSBhY3R1YXIgc29sbyBwYXJhIGVkaWNpJmFtcDtvYWN1dGU7biBkZSBwbGFudGlsbGFzL2hvamFzIGRlIGVzdGlsbyB0ZW1wbGF0ZS9zdHlsZXNoZWV0ICAoc29sbyBzb3BvcnRhZG8gZW4gQ01TbXMgMS4xKykNCjxici8+PGJyLz4NCjxzdHJvbmc+QyZhbXA7b2FjdXRlO21vIHVzbyBlc3RlIG0mYW1wO29hY3V0ZTtkdWxvPzwvc3Ryb25nPg0KVXN0ZWQgc2ltcGxlbWVudGUgbG8gaW5zdGFsYSwgeSBsbyBzZWxlY2Npb25hIGVuIGxhcyBwcmVmZXJlY2lhcyBkZSBsYSBhZG1pbmlzdHJhY2kmYW1wO29hY3V0ZTtuLiBOb3RlIHF1ZSwgc2kgdXN0ZWQgdXNhIENNU21zIDEuMSBvIHN1cGVyaW9yIGEgZXN0ZSB1c3RlZCBwdWVkZSBzZWxlY2Npb25hciBDb2RlTWlycm9yIGp1bnRvIGNvbiBXWVNJV1lHIHBhcmEgZWwgcmVzYWx0YWRvIGRlIHNpbnRheGlzLic7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjQxNTMxMzg1MzE4MzAyMTQwMDAuMTI0NTc5MTUyNi4xMjQ3NDkzOTI4LjEyNDg4NzcyODMuMTYnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjQ4ODc3MjgzLjE2LjkudXRtY3NyPWZvcnVtLmNtc21hZGVzaW1wbGUub3JnfHV0bWNjbj0ocmVmZXJyYWwpfHV0bWNtZD1yZWZlcnJhbHx1dG1jY3Q9L2luZGV4LnBocCc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzLjEuMTAuMTI0ODg3NzI4Myc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKPz4=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/fr_FR.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0VkaXRldXIgZGUgc3ludGF4ZSBjb2xvciZlYWN1dGU7IENvZGVNaXJyb3InOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdMZSBtb2R1bGUgQ29kZU1pcnJvciBhICZlYWN1dGU7dCZlYWN1dGU7IGluc3RhbGwmZWFjdXRlOyBhdmVjIHN1Y2MmZWdyYXZlO3MnOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICcmIzAzOTtWb3VzIGF2ZXogYmVzb2luIGRlIGwmIzAzOTthdXRvcmlzYXRpb24gJiMwMzk7JXMmIzAzOTsgIHBvdXIgY2V0dGUgZm9uY3Rpb24nOwokbGFuZ1snc2V0dGluZ3N0YWInXSA9ICdQYXJhbSZlZ3JhdmU7dHJlcyc7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdTYXV2ZWdhcmRlciBsZXMgcGFyYW0mZWdyYXZlO3RyZXMnOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ1BhcmFtJmVncmF2ZTt0cmVzIHNhdXZlZ2FyZCZlYWN1dGU7cyc7CiRsYW5nWydodG1sdGVzdCddID0gJ1Rlc3QgZGUgc3ludGF4ZSBIVE1MICc7CiRsYW5nWydjc3N0ZXN0J10gPSAnVGVzdCBkZSBzeW50YXhlIENTUyAnOwokbGFuZ1sncGhwdGVzdCddID0gJ1Rlc3QgZGUgc3ludGF4ZSBQSFAnOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnQWZmaWNoZXIgbGUgbm9tYnJlIGRlIGxpZ25lcyc7CiRsYW5nWydoZWxwJ10gPSAnPHN0cm9uZz5RdWUgZmFpdCBjZSBtb2R1bGUmbmJzcDs/PC9zdHJvbmc+DQo8YnIvPg0KTGUgbW9kdWxlIENvZGVNaXJyb3Igdm91cyBwZXJtZXQgZGUgbW9kaWZpZXIgbGUgY29udGVudSwgbGVzIGdhYmFyaXRzIGV0IGxlcyBmZXVpbGxlcyBkZSBzdHlsZSBlbiB1dGlsaXNhbnQgdW4gJmVhY3V0ZTtkaXRldXIgZGUgc3ludGF4ZSBjb2xvciZlYWN1dGU7IGwmIzAzOTtpbnQmZWFjdXRlO3JpZXVyIGRlIHZvdHJlIG5hdmlnYXRldXIuIA0KSWwgcGV1dCBhdXNzaSBiaWVuIHJlbXBsYWNlciBsJiMwMzk7JmVhY3V0ZTtkaXRldXIgV1lTSVdZRywgZXQgcGVybWV0dHJlIGRlIHZpc3VhbGlzZXItJmVhY3V0ZTtkaXRlciBsZXMgZ2FiYXJpdHMsIGZldWlsbGVzIGRlIHN0eWxlLiAoVW5pcXVlbWVudCBwb3VyIHZlcnNpb24gQ01TTVMgMS4xIG91IHBsdXMpDQo8YnIvPjxici8+DQo8c3Ryb25nPkNvbW1lbnQgbCYjMDM5O3V0aWxpc2VyJm5ic3A7Pzwvc3Ryb25nPjxici8+DQpJbCB2b3VzIHN1ZmZpdCBkZSBsJiMwMzk7aW5zdGFsbGVyLCBldCBkYW5zICZxdW90O01lcyBwciZlYWN1dGU7ZiZlYWN1dGU7cmVuY2VzIC8gUHImZWFjdXRlO2YmZWFjdXRlO3JlbmNlcyBkZSBsJiMwMzk7dXRpbGlzYXRldXImcXVvdDsgY2hvaXNpciBhdmVjIGxlIG1lbnUgZCZlYWN1dGU7cm91bGFudCBDb2RlTWlycm9yIGRhbnMgJnF1b3Q7UyZlYWN1dGU7bGVjdGlvbm5lciBsYSBzeW50YXhlIHN1cmxpZ24mZWFjdXRlO2UmcXVvdDsgZXQvb3UgJmVhY3V0ZTt2ZW50dWVsbGVtZW50IGRhbnMgJnF1b3Q7UyZlYWN1dGU7bGVjdGlvbiBkdSBXWVNJV1lHICZhZ3JhdmU7IHV0aWxpc2VyJnF1b3Q7Lg0KJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuMjAwODA0NjI0MS4xMjQzOTU0OTc2LjEyNDM5NTQ5NzYuMTI0Mzk1NDk3Ni4xJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjQzOTU0OTc2LjEuMS51dG1jY249KGRpcmVjdCl8dXRtY3NyPShkaXJlY3QpfHV0bWNtZD0obm9uZSknOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nb_NO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3Igc3ludGFrc2ZyZW1oZXZpbmdzcmVkaWdlcmVyJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnQ29kZU1pcnJvciBtb2R1bGVuIGJsZSBpbnN0YWxsZXJ0JzsKJGxhbmdbJ25lZWRwZXJtaXNzaW9uJ10gPSAnRHUgdHJlbmdlciAmIzAzOTslcyYjMDM5OyB0aWxsYXRlbHNlIGZvciAmYXJpbmc7IHV0ZiZvc2xhc2g7cmUgZGVubmUgZnVua3Nqb25lbi4nOwokbGFuZ1snc2V0dGluZ3N0YWInXSA9ICdJbm5zdGlsbGluZ2VyJzsKJGxhbmdbJ3NhdmVzZXR0aW5ncyddID0gJ0xhZ3JlIGlubnN0aWxsaW5nZXInOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ0lubnN0aWxsaW5nZXIgbGFncmV0JzsKJGxhbmdbJ2h0bWx0ZXN0J10gPSAnSFRNTCBzeW50YWtzIHRlc3QnOwokbGFuZ1snY3NzdGVzdCddID0gJ0NTUyBzeW50YWtzIHRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBzeW50YWtzIHRlc3QnOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnVmlzIGxpbmplbnVtbWVyJzsKJGxhbmdbJ2hlbHAnXSA9ICc8c3Ryb25nPldoYXQgZG9lcyB0aGlzIG1vZHVsZSBkbz88L3N0cm9uZz4NCjxici8+DQpUaGUgQ29kZU1pcnJvciBtb2R1bGUgYWxsb3dzIHlvdSB0byBlZGl0IGNvbnRlbnQsIHRlbXBsYXRlcyBhbmQgc3R5bGVzaGVldHMgdXNpbmcgYSBzeW50YXhoaWdobGlnaHRpbmcgZWRpdG9yIGluc2lkZSB5b3VyIGJyb3dzZXIuDQpJdCBjYW4gYm90aCByZXBsYWNlIGEgd3lzaXd5Zy1tb2R1bGUsIGFuZCBhY3Qgc3RhbmRhbG9uZSBmb3IgdGVtcGxhdGUvc3R5bGVzaGVldCBlZGl0aW5nIChvbmx5IHN1cHBvcnRlZCBpbiBDTVNtcyAxLjErKQ0KPGJyLz48YnIvPg0KPHN0cm9uZz5Ib3cgZG8gSSB1c2UgdGhpcyBtb2R1bGU/PC9zdHJvbmc+DQpZb3Ugc2ltcGx5IGluc3RhbGwgaXQsIGFuZCBjaG9vc2UgaXQgaW4geW91ciBhZG1pbiB1c2VyIHByZWZlcmVuY2VzLiBOb3RlLCB0aGF0IGlmIHlvdSB1c2UgQ01TbXMgMS4xIG9yIGFib3ZlIHlvdSBjYW4NCnNlbGVjdCBDb2RlQXJlYSBib3RoIGFzIGEgV1lTSVdZRyBhbmQgYXMgYSBzeW50YXggaGlnaGxpZ2h0aW5nIGVkaXRvci4nOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjM3NTkzODc2LjEwNDkuMjgudXRtY2NuPShyZWZlcnJhbCl8dXRtY3NyPWZvcnVtLmNtc21hZGVzaW1wbGUub3JnfHV0bWNjdD0vaW5kZXgucGhwL3RvcGljLDE4MTMxLjAuaHRtbHx1dG1jbWQ9cmVmZXJyYWwnOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4xNzkwNTI2MjMwODQxMTAxMDAuMTIxMDQyMzU3Ny4xMjM3OTMzNDk5LjEyMzgwMTg2ODAuMTA2NSc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bWInXSA9ICcxNTY4NjEzNTMnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nl_NL.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3IgU3ludGF4aGlnaGxpZ2h0aW5nIEVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0RlIENvZGVNaXJyb3IgTW9kdWxlIGlzIGdlJml1bWw7bnN0YWxsZWVyZCc7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJ1UgaGVlZnQgJiMwMzk7JXMmIzAzOTsgcmVjaHRlbiBub2RpZyBvbSBkZXplIGZ1bmN0aWUgdGUgZ2VicnVpa2VuLic7CiRsYW5nWydzZXR0aW5nc3RhYiddID0gJ0luc3RlbGxpbmdlbic7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdJbnN0ZWxsaW5nZW4gb3BzbGFhbic7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnSW5zdGVsbGluZ2VuIG9wZ2VzbGFnZW4nOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdIVE1MIFN5bnRheCBUZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1MgU3ludGF4IFRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBTeW50YXggVGVzdCc7CiRsYW5nWydzaG93bGluZW51bWJlcnMnXSA9ICdSZWdlbG51bW1lcnMgdG9uZW4nOwokbGFuZ1snaGVscCddID0gJzxzdHJvbmc+V2hhdCBkb2VzIHRoaXMgbW9kdWxlIGRvPyA8L3N0cm9uZz4NCjxici8+DQpUaGUgQ29kZU1pcnJvciBtb2R1bGUgYWxsb3dzIHlvdSB0byBlZGl0IGNvbnRlbnQsIHRlbXBsYXRlcyBhbmQgc3R5bGVzaGVldHMgdXNpbmcgYSBzeW50YXhoaWdobGlnaHRpbmcgZWRpdG9yIGluc2lkZSB5b3VyIGJyb3dzZXIuDQpJdCBjYW4gYm90aCByZXBsYWNlIGEgd3lzaXd5Zy1tb2R1bGUsIGFuZCBhY3Qgc3RhbmRhbG9uZSBmb3IgdGVtcGxhdGUvc3R5bGVzaGVldCBlZGl0aW5nIChvbmx5IHN1cHBvcnRlZCBpbiBDTVNtcyAxLjErKQ0KPGJyLz48YnIvPg0KPHN0cm9uZz5Ib3cgZG8gSSB1c2UgdGhpcyBtb2R1bGU/PC9zdHJvbmc+DQpZb3Ugc2ltcGx5IGluc3RhbGwgaXQsIGFuZCBjaG9vc2UgaXQgaW4geW91ciBhZG1pbiB1c2VyIHByZWZlcmVuY2VzLiBOb3RlLCB0aGF0IGlmIHlvdSB1c2UgQ01TbXMgMS4xIG9yIGFib3ZlIHlvdSBjYW4NCnNlbGVjdCBDb2RlQXJlYSBib3RoIGFzIGEgV1lTSVdZRyBhbmQgYXMgYSBzeW50YXggaGlnaGxpZ2h0aW5nIGVkaXRvci4nOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My43OTk5NjkwNTAuMTIyNTAyNDA1Ni4xMjM3OTk4ODk5LjEyMzgwNTI5NjUuOTcnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjM3OTg2MTM2Ljk0LjkudXRtY3NyPWZvcnVtLmNtc21hZGVzaW1wbGUub3JnfHV0bWNjbj0ocmVmZXJyYWwpfHV0bWNtZD1yZWZlcnJhbHx1dG1jY3Q9L2luZGV4LnBocCc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/ro_RO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0VkaXRvcnVsIENvZGVNaXJyb3IgY3UgZXZpZGVudGlhdG9yIGRlIHNpbnRheGEnOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdNb2R1bHVsIENvZGVNaXJyb3IgYSBmb3N0IGluc3RhbGF0IGN1IHN1Y2Nlcyc7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJ0F2ZXRpIG5ldm9pZSBkZSBwZXJtaXNpdW5lYSAmIzAzOTslcyYjMDM5OyBwZW50cnUgYWNlYXN0YSBmdW5jdGllLic7CiRsYW5nWydzZXR0aW5nc3RhYiddID0gJ1NldGFyaSc7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdTYWx2YXJlIHNldGFyaSc7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnU2V0YXJpbGUgYXUgZm9zdCBzYWx2YXRlJzsKJGxhbmdbJ2h0bWx0ZXN0J10gPSAndGVzdCBzaW50YXhhIEhUTUwnOwokbGFuZ1snY3NzdGVzdCddID0gJ3Rlc3Qgc2ludGF4YSBDU1MnOwokbGFuZ1sncGhwdGVzdCddID0gJ3Rlc3Qgc2ludGF4YSBQSFAnOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnQWZpc2FyZSBudW1lcmUgZGUgbGluaWUnOwokbGFuZ1snaGVscCddID0gJzxzdHJvbmc+Q2UgZmFjZSBhY2VzdCBtb2R1bD88L3N0cm9uZz4NCjxici8+DQpNb2R1bHVsIENvZGVNaXJyb3IgdmEgcGVybWl0ZSBzYSBlZGl0YXRpIGNvbnRpbnV0LCB0ZW1wbGF0ZS11cmkgc2kgc3R5bGVzaGVldC11cmkgZm9sb3NpbmQgdW4gZWRpdG9yIGN1IGV2aWRlbnRpYXRvciBkZSBzaW50YXhhIGRpbiBicm93c2VyLg0KUG9hdGUgaW5sb2N1aSBhdGF0IHVuIG1vZHVsIHd5c2l3eWcsIHNpIHNhIGZ1bmN0aW9uZXplIGRlIHNpbmUgc3RhdGF0b3IgcGVudHJ1IGVkaXRhcmUgZGUgdGVtcGxhdGUvc3R5bGVzaGVldC4NCjxici8+PGJyLz4NCjxzdHJvbmc+Q3VtIHNlIGZvbG9zZXNlIGFjZXN0IG1vZHVsPzwvc3Ryb25nPg0KSW5zdGFsYXRpLWwsIHNpIGFsZWdldGktbCBpbiBwcmVmZXJpbnRlbGUgZGUgdXRpbGl6YXRvciBkaW4gYWRtaW4uJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4zNTczODQzNzE3NzA4OTkyNTAwLjEyNTAwNTYyNjcuMTI1MDY4NTUyNy4xMjUwNjg5MzEyLjI5JzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTI1MDYwNzkxNS4yMC40LnV0bWNzcj1kZXYuY21zbWFkZXNpbXBsZS5vcmd8dXRtY2NuPShyZWZlcnJhbCl8dXRtY21kPXJlZmVycmFsfHV0bWNjdD0vcHJvamVjdC9maWxlcy82JzsKJGxhbmdbJ3FjYSddID0gJzEyNDk5ODA4MzUtOTI1OTM0OTItNzk1Njc2MDgnOwokbGFuZ1sncWNiJ10gPSAnMTkxMjQzODI2Nic7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzJzsKPz4=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/sv_SE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3Igc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0NvZGVNaXJyb3ItbW9kdWxlbiBpbnN0YWxsZXJhZGVzIHV0YW4gbiZhcmluZztncmEgcHJvYmxlbSc7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJyYjMDM5O1lvdSBuZWVkIHRoZSAmIzAzOTslcyYjMDM5OyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhhdCBmdW5jdGlvbi4nOwokbGFuZ1snc2V0dGluZ3N0YWInXSA9ICdJbnN0JmF1bWw7bGxuaW5nYXInOwokbGFuZ1snc2F2ZXNldHRpbmdzJ10gPSAnU3BhcmEgaW5zdCZhdW1sO2xsbmluZ2FyJzsKJGxhbmdbJ3NldHRpbmdzc2F2ZWQnXSA9ICdJbnN0JmF1bWw7bGxuaW5nYXIgc3BhcmFkZXMnOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdIVE1MIHN5bnRheCB0ZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1Mgc3ludGF4IHRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBzeW50YXggdGVzdCc7CiRsYW5nWydzaG93bGluZW51bWJlcnMnXSA9ICdWaXNhIHJhZG51bW1lcic7CiRsYW5nWydoZWxwJ10gPSAnPHN0cm9uZz5XaGF0IGRvZXMgdGhpcyBtb2R1bGUgZG8/PC9zdHJvbmc+DQo8YnIvPg0KVGhlIENvZGVNaXJyb3IgbW9kdWxlIGFsbG93cyB5b3UgdG8gZWRpdCBjb250ZW50LCB0ZW1wbGF0ZXMgYW5kIHN0eWxlc2hlZXRzIHVzaW5nIGEgc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvciBpbnNpZGUgeW91ciBicm93c2VyLg0KSXQgY2FuIGJvdGggcmVwbGFjZSBhIHd5c2l3eWctbW9kdWxlLCBhbmQgYWN0IHN0YW5kYWxvbmUgZm9yIHRlbXBsYXRlL3N0eWxlc2hlZXQgZWRpdGluZyAob25seSBzdXBwb3J0ZWQgaW4gQ01TbXMgMS4xKykNCjxici8+PGJyLz4NCjxzdHJvbmc+SG93IGRvIEkgdXNlIHRoaXMgbW9kdWxlPzwvc3Ryb25nPg0KWW91IHNpbXBseSBpbnN0YWxsIGl0LCBhbmQgY2hvb3NlIGl0IGluIHlvdXIgYWRtaW4gdXNlciBwcmVmZXJlbmNlcy4gTm90ZSwgdGhhdCBpZiB5b3UgdXNlIENNU21zIDEuMSBvciBhYm92ZSB5b3UgY2FuDQpzZWxlY3QgQ29kZUFyZWEgYm90aCBhcyBhIFdZU0lXWUcgYW5kIGFzIGEgc3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IuJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuNDMzMjc1NDgwMjc5OTY2ODUwLjEyNDE2NDEyODUuMTI0MTY0MTI4NS4xMjQxNjQxMjg1LjEnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1My4xLjEwLjEyNDE2NDEyODUnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEyNDE2NDEyODUuMS4xLnV0bWNzcj1nb29nbGV8dXRtY2NuPShvcmdhbmljKXx1dG1jbWQ9b3JnYW5pY3x1dG1jdHI9Y21zbXMnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgic2hvd2xpbmVudW1iZXJzIiwxKTsNCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInVzZWF1dG9jb21wbGV0ZSIsMSk7Cj8+]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgpOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICAvL1JlbW92ZSBvbGQgc3BlY2lmaWsgcGVybWlzc2lvbgogICR0aGlzLT5SZW1vdmVQZXJtaXNzaW9uKCJtb2RpZnllZGl0YXJlYXNldHRpbmdzIik7Cj8+]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/changelog.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgo8bGk+MC4xLjMgLSBVcGRhdGVkIHRvIENNIDAuNjUsIGFkZGVkIG9wdGlvbiB0byB0b2dnZWwgd29yZHdyYXA8L2xpPgo8bGk+MC4xLjIgLSBVcGRhdGVkIHRvIENNIDAuNjM8L2xpPgo8bGk+MC4xLjEgLSBVcGRhdGVkIHRvIENNIDAuNjIsIGZpeGVkIGV4YW1wbGVzIGFuZCBwcm9iYWJseSBmdW5jdGlvbmFsaXR5IGFzIHdlbGw8L2xpPgo8bGk+MC4xLjAgLSBJbml0aWFsIHJlbGVhc2UgPC9saT4KPC91bD4=]]></data>
	</file>
	<file>
	  <filename>/templates/codemirrorarea.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCBibGFjazsiPgo8dGV4dGFyZWEgaWQ9InskdGV4dGFyZWFpZH0iIG5hbWU9InskdGV4dGFyZWFuYW1lfSI+eyRjb250ZW50fTwvdGV4dGFyZWE+CjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogIHZhciBlZGl0b3J7JGlkfSA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKCd7JHRleHRhcmVhaWR9Jywge2xpdGVyYWx9e3svbGl0ZXJhbH0KICAgIHtpZiAkaGVpZ2h0IT0nJ31oZWlnaHQ6ICJ7JGhlaWdodH0iLAogICAgey9pZn0KICAgIGhlaWdodDogIjM1MHB4IiwKICAgIHBhcnNlcmZpbGU6IHskcGFyc2VyZmlsZX0sCiAgICBzdHlsZXNoZWV0OiB7JGNzc2ZpbGV9LAogICAgbGluZU51bWJlcnM6IHskbGluZW51bWJlcnN9LAogICAgdGV4dFdyYXBwaW5nOiB7JHRleHR3cmFwcGluZ30sCiAgICBwYXRoOiAieyRyb290X3VybH0vbW9kdWxlcy9Db2RlTWlycm9yL2NvZGVtaXJyb3IvanMvIgoKICB7bGl0ZXJhbH19KTt7L2xpdGVyYWx9Cjwvc2NyaXB0Pgo=]]></data>
	</file>
	<file>
	  <filename>/templates/settings.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRzdGFydGZvcm19CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHNob3dsaW5lbnVtYmVyc3RleHR9PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskc2hvd2xpbmVudW1iZXJzaW5wdXR9PC9wPgoJPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRleHR3cmFwcGluZ3RleHR9PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskdGV4dHdyYXBwaW5naW5wdXR9PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskc3VibWl0fTwvcD4KCTwvZGl2Pgp7JGVuZGZvcm19Cg==]]></data>
	</file>
</module>
