<?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.7</version>
  <mincmsversion>1.8</mincmsversion>
	<help><![CDATA[PHN0cm9uZz5XaGF0IGRvZXMgdGhpcyBtb2R1bGUgZG8/PC9zdHJvbmc+Cjxici8+ClRoZSBDb2RlTWlycm9yIG1vZHVsZSBhbGxvd3MgeW91IHRvIGVkaXQgY29udGVudCwgdGVtcGxhdGVzIGFuZCBzdHlsZXNoZWV0cyB1c2luZyBhIHN5bnRheGhpZ2hsaWdodGluZyBlZGl0b3IgaW5zaWRlIHlvdXIgYnJvd3Nlci4KSXQgY2FuIGJvdGggcmVwbGFjZSBhIHd5c2l3eWctbW9kdWxlLCBhbmQgYWN0IHN0YW5kYWxvbmUgZm9yIHRlbXBsYXRlL3N0eWxlc2hlZXQgZWRpdGluZyAob25seSBzdXBwb3J0ZWQgaW4gQ01TbXMgMS4xKykKPGJyLz48YnIvPgo8c3Ryb25nPkhvdyBkbyBJIHVzZSB0aGlzIG1vZHVsZT88L3N0cm9uZz4KWW91IHNpbXBseSBpbnN0YWxsIGl0LCBhbmQgY2hvb3NlIGl0IGluIHlvdXIgYWRtaW4gdXNlciBwcmVmZXJlbmNlcy4gTm90ZSwgdGhhdCBpZiB5b3UgdXNlIENNU21zIDEuMSBvciBhYm92ZSB5b3UgY2FuCnNlbGVjdCBDb2RlTWlycm9yIGJvdGggYXMgYSBXWVNJV1lHIGFuZCBhcyBhIHN5bnRheCBoaWdobGlnaHRpbmcgZWRpdG9yLjxoMz5QYXJhbWV0ZXJzPC9oMz48dWw+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbGFuZz0iZW5fVVMiIC0gUGFyYW1ldGVyIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGF0IGxhbmd1YWdlIHRvIHVzZSBmb3IgZGlzcGxheSBvbiB0aGUgZnJvbnRlbmQuIE5vdCBhbGwgbW9kdWxlcyBzdXBwb3J0IG9yIG5lZWQgdGhpcy48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBNb3J0ZW4gUG91bHNlbiAmbHQ7Jmx0O21vcnRlbkBwb3Vsc2VuLm9yZyZndDsmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMC4xLjc8YnIgLz48YnIgLz5DaGFuZ2UgSGlzdG9yeTo8YnIgLz48dWw+CiAgPGxpPjAuMS43IC0gVXBkYXRlZCB0byBDTSAwLjgwPC9saT4KICA8bGk+MC4xLjYgLSBVcGRhdGVkIHRvIENNIDAuNzAsIEFkZGVkIG9wdGlvbiB0byBtYXRjaCBwYXJlbnRoZXNpczwvbGk+CiAgPGxpPjAuMS41IC0gVXBkYXRlZCB0byBDTSAwLjY2LCByZW1vdmVkIGEgc3RyYW5nZSBcbiBjaGFyIGZyb20gaGVhZGVyb3V0cHV0LCBtYWRlIHRhYmJpbmcgd29yazwvbGk+CiAgPGxpPjAuMS40IC0gRml4ZWQgQ1BVIGhvZ2dpbmcgcHJvYmxlbXMgYnkgcmV3cml0aW5nIHRlc3RhcmVhLWNvZGU8L2xpPgogIDxsaT4wLjEuMyAtIFVwZGF0ZWQgdG8gQ00gMC42NSwgYWRkZWQgb3B0aW9uIHRvIHRvZ2dsZSB3b3Jkd3JhcDwvbGk+CiAgPGxpPjAuMS4yIC0gVXBkYXRlZCB0byBDTSAwLjYzPC9saT4KICA8bGk+MC4xLjEgLSBVcGRhdGVkIHRvIENNIDAuNjIsIGZpeGVkIGV4YW1wbGVzIGFuZCBwcm9iYWJseSBmdW5jdGlvbmFsaXR5IGFzIHdlbGw8L2xpPgogIDxsaT4wLjEuMCAtIEluaXRpYWwgcmVsZWFzZSA8L2xpPgo8L3VsPjxiciAvPg==]]></about>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OwoKaWYgKCEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpKSB7CiAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnbmVlZHBlcm1pc3Npb24nLCBhcnJheSgnTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkpOwogIHJldHVybjsKfQoKaWYgKGlzc2V0KCRwYXJhbXNbImV4YW1wbGVzeW50YXgiXSkpIHsKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgiZXhhbXBsZXN5bnRheCIsJHBhcmFtc1siZXhhbXBsZXN5bnRheCJdKTsKfQoKZWNobyAkdGhpcy0+U3RhcnRUYWJIZWFkZXJzKCk7CmVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigic2V0dGluZ3MiLCR0aGlzLT5MYW5nKCJzZXR0aW5nc3RhYiIpKTsKCmVjaG8gJHRoaXMtPkVuZFRhYkhlYWRlcnMoKTsKZWNobyAkdGhpcy0+U3RhcnRUYWJDb250ZW50KCk7CgoKZWNobyAkdGhpcy0+U3RhcnRUYWIoInNldHRpbmdzIik7CiR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsICdzYXZlc2V0dGluZ3MnLCAkcmV0dXJuaWQpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlbmRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CgokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Nob3dsaW5lbnVtYmVyc3RleHQnLCAkdGhpcy0+TGFuZygic2hvd2xpbmVudW1iZXJzIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Nob3dsaW5lbnVtYmVyc2lucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCJzaG93bGluZW51bWJlcnMiLDEsJHRoaXMtPkdldFByZWZlcmVuY2UoInNob3dsaW5lbnVtYmVycyIsMSkpKTsKCiR0aGlzLT5zbWFydHktPmFzc2lnbigndGV4dHdyYXBwaW5ndGV4dCcsICR0aGlzLT5MYW5nKCJ0ZXh0d3JhcHBpbmciKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbigndGV4dHdyYXBwaW5naW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCgkaWQsInRleHR3cmFwcGluZyIsMSwkdGhpcy0+R2V0UHJlZmVyZW5jZSgidGV4dHdyYXBwaW5nIiwxKSkpOwoKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhdXRvbWF0Y2hwYXJlbnN0ZXh0JywgJHRoaXMtPkxhbmcoImF1dG9tYXRjaHBhcmVucyIpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhdXRvbWF0Y2hwYXJlbnNpbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCRpZCwiYXV0b21hdGNocGFyZW5zIiwiMSIsJHRoaXMtPkdldFByZWZlcmVuY2UoImF1dG9tYXRjaHBhcmVucyIsIjAiKSkpOwoKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnc3VibWl0JywgJHRoaXMtPkxhbmcoJ3NhdmVzZXR0aW5ncycpKSk7CgplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ3NldHRpbmdzLnRwbCcpOwoKZWNobyAkdGhpcy0+RW5kVGFiKCk7CmVjaG8gJHRoaXMtPkVuZFRhYkNvbnRlbnQoKTsKCiRjb250ZW50PSIiOwpzd2l0Y2ggKCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJleGFtcGxlc3ludGF4IiwiaHRtbCIpKSB7CiAgY2FzZSAiaHRtbCIgOiB7CiAgICAkY29udGVudD0iCjxodG1sPgogIDxoZWFkPgogICAgPHRpdGxlPlRlc3RpbmcgaHRtbC1zeW50YXg8L3RpdGxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIEFuZCBkb2luZyBhYnNvbHV0ZWx5IG5vdGhpbmcgZWxzZQogIDwvYm9keT4KPC9odG1sPgoiOwogIGJyZWFrOwogIH0KICBjYXNlICJjc3MiIDogewogICAgJGNvbnRlbnQ9IgoudGVzdGNzcyB7CiAgZm9udC13ZWlnaHQ6Ym9sZDsKICBoZWlnaHQ6IDEwcHg7Cn0KIjsKICBicmVhazsKICB9CiAgY2FzZSAicGhwIiA6IHsKICAgICRjb250ZW50PSIKPD9waHAKICBmdW5jdGlvbiB0ZXN0UEhQKFwkc29tZXBhcmFtKSB7CiAgICBlY2hvICdEbyB5b3UgdGhpbmsgdGhpcyBsb29rcyBuaWNlPyc7CiAgfQo/PgoiOwogIGJyZWFrOwogIH0KICBjYXNlICJqcyIgOiB7CiAgICAkY29udGVudD0nCmZ1bmN0aW9uIG15anNmdW50aW9uKHBhcmFtcykgewogIHZhciBtc2cgPSAiVGhpcyBqYXZhc2NyaXB0IGlzIGZhbnRhc3RpYyEiCiAgZm9yICh2YXIgaT0wOyBpPDk5OTk7IGkrKykgewogICAgYWxlcnQobXNnKTsKICAgIC8qVGhpcyBtdXN0IGJlIHRoZSBtb3N0IGFubm95aW5nIGZ1bmN0aW9uIGV2ZXIhKi8KICB9CiAgcmV0dXJuIHRydWUKfQonOwogIGJyZWFrOwogIH0KfQoKZWNobyAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwiZGVmYXVsdGFkbWluIik7CmVjaG8gJHRoaXMtPkxhbmcoImV4YW1wbGVzeW50YXgiKS4iOiAiOwokc3ludGF4ZXM9YXJyYXkoJHRoaXMtPkxhbmcoImh0bWx0ZXN0Iik9PiJodG1sIiwkdGhpcy0+TGFuZygiY3NzdGVzdCIpPT4iY3NzIiwkdGhpcy0+TGFuZygicGhwdGVzdCIpPT4icGhwIiwkdGhpcy0+TGFuZygianN0ZXN0Iik9PiJqcyIpOwplY2hvICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKCRpZCwiZXhhbXBsZXN5bnRheCIsJHN5bnRheGVzLC0xLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJleGFtcGxlc3ludGF4IiwiaHRtbCIpKTsKZWNobyAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCJleGFtcGxlc3VibWl0IiwkdGhpcy0+TGFuZygiY2hhbmdlIikpOwplY2hvICI8YnIvPiI7CmVjaG8gJHRoaXMtPkNyZWF0ZVRleHRBcmVhKGZhbHNlLCRpZCwkY29udGVudCwidGVzdGFyZWExIiwnJywnJywnJywnJywnJywnJywnQ29kZU1pcnJvcicsJHRoaXMtPkdldFByZWZlcmVuY2UoImV4YW1wbGVzeW50YXgiLCJodG1sIikpOwplY2hvICR0aGlzLT5DcmVhdGVGb3JtRW5kKCk7CgoKCgoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.savesettings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OwoKaWYgKCEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpKSB7CiAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnbmVlZHBlcm1pc3Npb24nLCBhcnJheSgnTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkpOwogIHJldHVybjsKfQoKaWYoaXNzZXQoJHBhcmFtc1sic2hvd2xpbmVudW1iZXJzIl0pKSAKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgic2hvd2xpbmVudW1iZXJzIiwgJHBhcmFtc1sic2hvd2xpbmVudW1iZXJzIl0pOwplbHNlCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInNob3dsaW5lbnVtYmVycyIsICcwJyk7CgppZihpc3NldCgkcGFyYW1zWyJ0ZXh0d3JhcHBpbmciXSkpCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInRleHR3cmFwcGluZyIsICRwYXJhbXNbInRleHR3cmFwcGluZyJdKTsKZWxzZQogICR0aGlzLT5TZXRQcmVmZXJlbmNlKCJ0ZXh0d3JhcHBpbmciLCAnMCcpOwogIAppZihpc3NldCgkcGFyYW1zWyJhdXRvbWF0Y2hwYXJlbnMiXSkpCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoImF1dG9tYXRjaHBhcmVucyIsICRwYXJhbXNbImF1dG9tYXRjaHBhcmVucyJdKTsKZWxzZQogICR0aGlzLT5TZXRQcmVmZXJlbmNlKCJhdXRvbWF0Y2hwYXJlbnMiLCAnMCcpOwoKCiR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAkcmV0dXJuaWQsYXJyYXkoIm1vZHVsZV9tZXNzYWdlIj0+JHRoaXMtPkxhbmcoInNldHRpbmdzc2F2ZWQiKSwidGFiIj0+InNldHRpbmdzIikpOwo/Pg==]]></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+TGFuZygiaGVscCIpOw0KCX0NCg0KCWZ1bmN0aW9uIEdldEF1dGhvcigpIHsNCgkJcmV0dXJuICdNb3J0ZW4gUG91bHNlbic7DQoJfQ0KDQoJZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKSB7DQoJCXJldHVybiAnJmx0O21vcnRlbkBwb3Vsc2VuLm9yZyZndDsnOw0KCX0NCg0KCWZ1bmN0aW9uIEdldENoYW5nZUxvZygpIHsNCgkJcmV0dXJuICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2NoYW5nZWxvZy50cGwnKTsNCgl9DQoNCglmdW5jdGlvbiBHZXRWZXJzaW9uKCkgew0KCQlyZXR1cm4gJzAuMS43JzsNCgl9DQoJDQoJZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKSB7DQoJCXJldHVybiAiMS44IjsNCgl9DQoNCiAgZnVuY3Rpb24gSGFzQ2FwYWJpbGl0eSgkY2FwYWJpbGl0eSwgJHBhcmFtcz1hcnJheSgpKSB7DQogICAgaWYgKCRjYXBhYmlsaXR5PT0id3lzaXd5ZyIpIHJldHVybiB0cnVlOw0KICAgIGlmICgkY2FwYWJpbGl0eT09InN5bnRheGhpZ2hsaWdodGluZyIpIHJldHVybiB0cnVlOw0KICAgIHJldHVybiBmYWxzZTsNCiAgfQ0KDQoJZnVuY3Rpb24gSXNXWVNJV1lHKCkgew0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoNCglmdW5jdGlvbiBJc1N5bnRheEhpZ2hsaWdodGVyKCkgew0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoNCglmdW5jdGlvbiBWaXNpYmxlVG9BZG1pblVzZXIoKSB7DQoJCXJldHVybiAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpOw0KCX0NCg0KCWZ1bmN0aW9uIFN5bnRheFBhZ2VGb3JtU3VibWl0KCkgew0KCQlyZXR1cm4gImZvciAodmFyIGNudEVkaXRvciA9IDA7IGNudEVkaXRvciA8IG51bUNvZGVQcmVzc0FyZWFzOyBjbnRFZGl0b3IrKykge1xuIg0KCQkuICJcdFx0dmFyIGlkID0gZXZhbCgnY29kZXByZXNzJyArIGNudEVkaXRvcik7XG4iDQoJCS4gIlx0XHRpZC50ZXh0YXJlYS52YWx1ZSA9IGlkLmdldENvZGUoKTtcbiINCgkJLiAiXHR9XG4iOw0KCX0NCgkNCglmdW5jdGlvbiBXWVNJV1lHUGFnZUZvcm1TdWJtaXQoKSB7DQoJCXJldHVybiAkdGhpcy0+U3ludGF4UGFnZUZvcm1TdWJtaXQoKTsNCgl9DQoNCglmdW5jdGlvbiBXWVNJV1lHVGV4dEFyZWEoJG5hbWU9J3RleHRhcmVhJywkY29sdW1ucz0nODAnLCRyb3dzPScxNScsJGVuY29kaW5nPScnLCRjb250ZW50PScnLCRzdHlsZXNoZWV0PScnLCRhZGR0ZXh0PScnKSB7DQoJCSR0aGlzLT53eXNpd3lnYWN0aXZlPXRydWU7DQoJCXJldHVybiAkdGhpcy0+U3ludGF4VGV4dGFyZWEoJG5hbWUsImh0bWwiLCRjb2x1bW5zLCRyb3dzLCRlbmNvZGluZywkY29udGVudCk7DQoJfQ0KDQoJZnVuY3Rpb24gU3ludGF4VGV4dGFyZWEoJG5hbWU9J3RleHRhcmVhJywkc3ludGF4PSJodG1sIiwkY29sdW1ucz0nODAnLCRyb3dzPScxNScsJGVuY29kaW5nPScnLCRjb250ZW50PScnLCRzdHlsZXNoZWV0PScnLCRhZGR0ZXh0PScnKSB7DQoJCSR0ZXh0YXJlYT0iIjsNCgkJJHRoaXMtPnN5bnRheGFjdGl2ZT10cnVlOwkNCgkJLyppZiAoJHRoaXMtPkdldFByZWZlcmVuY2UoInVzZWF1dG9jb21wbGV0ZSIsIjEiKT09IjAiKSAkY2xhc3MuPSIgYXV0b2NvbXBsZXRlLW9mZiI7DQoJCWlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgic2hvd2xpbmVudW1iZXJzIiwiMSIpPT0iMCIpICRjbGFzcy49IiBsaW5lbnVtYmVycy1vZmYiOw0KCQkqLw0KICAgICAgLyppZiAoJHRoaXMtPkdldFByZWZlcmVuY2UoInNob3d0b2dnbGVzeW50YXgiLCIxIik9PSIxIikgew0KICAgICANCgkJCSR0ZXh0YXJlYS49Ijxici8+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBjaGVja2VkPScxJyBvbmNsaWNrPSdjb2RlcHJlc3MiLiR0aGlzLT5ub2VkaXRvcnMuIi50b2dnbGVFZGl0b3IoKTsnIGNoZWNrZWQ9J2NoZWNrZWQnIGlkPSdjb2RlcHJlc3NjaGVjayIuJHRoaXMtPm5vZWRpdG9ycy4iJz48bGFiZWwgZm9yPSdjb2RlcHJlc3NjaGVjayIuJHRoaXMtPm5vZWRpdG9ycy4iJz4iLiR0aGlzLT5MYW5nKCJ0b2dnbGVzeW50YXgiKS4iPC9sYWJlbD4iOw0KCQl9Ki8NCiAgICBpZiAoJHRoaXMtPkdldFByZWZlcmVuY2UoInNob3dsaW5lbnVtYmVycyIsIjEiKT09IjEiKXsNCiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbGluZW51bWJlcnMnLCAidHJ1ZSIpOw0KICAgIH0gZWxzZSB7DQogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2xpbmVudW1iZXJzJywgImZhbHNlIik7DQogICAgfQ0KICAgIGlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgidGV4dHdyYXBwaW5nIiwiMSIpPT0iMSIpew0KICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0ZXh0d3JhcHBpbmcnLCAidHJ1ZSIpOw0KICAgIH0gZWxzZSB7DQogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RleHR3cmFwcGluZycsICJmYWxzZSIpOw0KICAgIH0NCiAgICBpZiAoJHRoaXMtPkdldFByZWZlcmVuY2UoImF1dG9tYXRjaHBhcmVucyIsIjAiKT09IjEiKXsNCiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignYXV0b21hdGNocGFyZW5zJywgInRydWUiKTsNCiAgICB9IGVsc2Ugew0KICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhdXRvbWF0Y2hwYXJlbnMnLCAiZmFsc2UiKTsNCiAgICB9DQogICAgLy9saW5lTnVtYmVyczogdHJ1ZSwNCiAgICAkY29uZmlnPSR0aGlzLT5HZXRDb25maWcoKTsNCg0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndGV4dGFyZWFpZCcsICJjb2RlbWlycm9yYXJlYSIuJHRoaXMtPm5vZWRpdG9ycyk7DQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0ZXh0YXJlYW5hbWUnLCAkbmFtZSk7DQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjb250ZW50JywgJGNvbnRlbnQpOw0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaWQnLCAkdGhpcy0+bm9lZGl0b3JzKTsNCiAgICAkcGFyc2VyZmlsZT0iIjsgJGNzc2ZpbGU9IiI7DQogICAgJGNtZGlyPSRjb25maWdbInJvb3RfdXJsIl0uJy9tb2R1bGVzL0NvZGVNaXJyb3IvY29kZW1pcnJvcic7DQogICAgc3dpdGNoKCRzeW50YXgpIHsNCiAgICAgIA0KICAgICAgY2FzZSAiaHRtbCIgOiANCiAgICAgICAgJHBhcnNlcmZpbGU9JyJwYXJzZXhtbC5qcyInOyANCiAgICAgICAgJGNzc2ZpbGU9JyInLiRjbWRpci4nL2Nzcy94bWxjb2xvcnMuY3NzIic7DQogICAgICAgIGJyZWFrOw0KICAgICAgY2FzZSAiY3NzIiA6DQogICAgICAgICRwYXJzZXJmaWxlPScicGFyc2Vjc3MuanMiJzsNCiAgICAgICAgJGNzc2ZpbGU9JyInLiRjbWRpci4nL2Nzcy9jc3Njb2xvcnMuY3NzIic7DQogICAgICAgIGJyZWFrOw0KICAgICAgY2FzZSAiamF2YXNjcmlwdCIgOg0KICAgICAgY2FzZSAianMiIDoNCiAgICAgICAgJHBhcnNlcmZpbGU9J1sidG9rZW5pemVqYXZhc2NyaXB0LmpzIiwgInBhcnNlamF2YXNjcmlwdC5qcyJdJzsNCiAgICAgICAgJGNzc2ZpbGU9JyInLiRjbWRpci4nL2Nzcy9qc2NvbG9ycy5jc3MiJzsNCiAgICAgICAgYnJlYWs7DQogICAgICBjYXNlICJwaHAiIDoNCiAgICAgICAgJHBhcnNlcmZpbGU9J1sicGFyc2V4bWwuanMiLCAicGFyc2Vjc3MuanMiLCAidG9rZW5pemVqYXZhc2NyaXB0LmpzIiwgInBhcnNlamF2YXNjcmlwdC5qcyIsICJwYXJzZWh0bWxtaXhlZC5qcyIsIi4uL2NvbnRyaWIvcGhwL2pzL3Rva2VuaXplcGhwLmpzIiwgIi4uL2NvbnRyaWIvcGhwL2pzL3BhcnNlcGhwLmpzIiwgICAgICAgICAgICAgICAgICAgICAiLi4vY29udHJpYi9waHAvanMvcGFyc2VwaHBodG1sbWl4ZWQuanMiXSc7DQogICAgICAgICRjc3NmaWxlPSdbIicuJGNtZGlyLicvY3NzL3htbGNvbG9ycy5jc3MiLCInLiRjbWRpci4nL2Nzcy9qc2NvbG9ycy5jc3MiLCInLiRjbWRpci4nL2Nzcy9jc3Njb2xvcnMuY3NzIiwiJy4kY21kaXIuJy9jb250cmliL3BocC9jc3MvcGhwY29sb3JzLmNzcyJdJzsNCiAgICAgICAgYnJlYWs7DQogICAgfQ0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncGFyc2VyZmlsZScsICRwYXJzZXJmaWxlKTsNCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Nzc2ZpbGUnLCAkY3NzZmlsZSk7DQogICAgDQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdyb290X3VybCcsICRjb25maWdbInJvb3RfdXJsIl0pOw0KDQoNCiAgICAkdGV4dGFyZWE9JHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnY29kZW1pcnJvcmFyZWEudHBsJyk7DQoNCgkJJHRoaXMtPm5vZWRpdG9ycysrOw0KDQoJCXJldHVybiAkdGV4dGFyZWE7DQoJfQ0KDQoJZnVuY3Rpb24gV1lTSVdZR0dlbmVyYXRlSGVhZGVyKCRodG1scmVzdWx0PScnKSB7DQoJCXJldHVybiAkdGhpcy0+U3ludGF4R2VuZXJhdGVIZWFkZXIoKTsNCgl9DQoNCglmdW5jdGlvbiBTeW50YXhHZW5lcmF0ZUhlYWRlcigkaHRtbHJlc3VsdD0nJykgew0KCQlpZiAoJHRoaXMtPmhlYWRlcmluZm9zZW50KSByZXR1cm4gIiI7DQoJCWlmICgkdGhpcy0+bm9lZGl0b3JzPT0wKSByZXR1cm4gJyc7DQoJCS8vJEdMT0JBTFNbImNvbmZpZyJdWyJyb290X3BhdGgiXS4NCg0KCQkkc2NyaXB0cGF0aD0kR0xPQkFMU1siY29uZmlnIl1bInJvb3RfdXJsIl0uIi9tb2R1bGVzL0NvZGVNaXJyb3IvY29kZW1pcnJvci9qcy9jb2RlbWlycm9yLmpzIjsNCgkJJGhlYWRlcj0iIjsNCgkJJGhlYWRlci49JzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInLiRzY3JpcHRwYXRoLiciPjwvc2NyaXB0Pic7DQogICAgJGhlYWRlci49JzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicuJEdMT0JBTFNbImNvbmZpZyJdWyJyb290X3VybCJdLicvbW9kdWxlcy9Db2RlTWlycm9yL2NvZGVtaXJyb3IuY3NzIi8+JzsNCgkJJHRoaXMtPmhlYWRlcmluZm9zZW50PXRydWU7DQoJCXJldHVybiAkaGVhZGVyOw0KCX0NCn0NCg0KPz4=]]></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/compress.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFNjcmlwdCBDb21wcmVzc2lvbjwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjc3MvZG9jcy5jc3MiLz4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuZmllbGQge2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nOiAuNGVtO30KICAgICAgYnV0dG9uIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazsgYmFja2dyb3VuZC1jb2xvcjogI2VlZTt9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxkaXYgY2xhc3M9InRvcCB1bmRlcmxpbmUiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgogICAgICA8aDEgc3R5bGU9Im1hcmdpbi1ib3R0b206IDA7Ij48YSBocmVmPSJpbmRleC5odG1sIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBub25lOyBjb2xvcjogYmxhY2s7Ij5Db2RlTWlycm9yPC9hPjwvaDE+CiAgICAgIDxoMiBzdHlsZT0ibWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogLjNlbTsiPlNjcmlwdCBDb21wcmVzc2lvbjwvaDI+CiAgICA8L2Rpdj4KCiAgICA8cD5UaGUgQ29kZU1pcnJvciBzY3JpcHRzLCBhcyBkaXN0cmlidXRlZCwgYXJlIG1hbnksIGFuZCBmdWxsIG9mCiAgICBjb21tZW50cy4gVG8gb3B0aW1pemUgcGFnZSBsb2FkaW5nLCBpdCBpcyByZWNvbW1lbmRlZCB0bwogICAgY29uY2F0ZW5hdGUgdGhlIHNjcmlwdHMgbG9hZGVkIGluIHRoZSBDb2RlTWlycm9yIGZyYW1lLCBhbmQKICAgIGNvbXByZXNzIHRoZW0uIFRoaXMgcGFnZSBtYXkgYmUgdXNlZnVsIGlmIHlvdSBpbnRlbmQgdG8gZG8gdGhpczoKICAgIGl0IHByb3ZpZGVzIGFuIGludGVyZmFjZSBnbyBHb29nbGUncyA8YQogICAgaHJlZj0iaHR0cDovL2Nsb3N1cmUtY29tcGlsZXIuYXBwc3BvdC5jb20vIj5DbG9zdXJlIGNvbXBpbGVyPC9hPiwKICAgIGFsbG93aW5nIHlvdSB0byBlYXNpbHkgbG9hZCBpbiBDb2RlTWlycm9yIHNjcmlwdHMuPC9wPgoKICAgIDxwPllvdSB3aWxsIGhhdmUgdG8gY29tcHJlc3MgPGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT4KICAgIHNlcGFyYXRlbHksIHNpbmNlIHRoYXQgd2lsbCBiZSBsb2FkZWQgaW50byB0aGUgdG9wLWxldmVsIHBhZ2UgZnJvbQogICAgd2hpY2ggeW91IHVzZSBDb2RlTWlycm9yLiBJbnNpZGUgdGhlIGZyYW1lLCB0aGUKICAgIDxjb2RlPnBhcnNlcmZpbGU8L2NvZGU+IGFuZCA8Y29kZT5iYXNlZmlsZXM8L2NvZGU+IG9wdGlvbnMgY29udHJvbAogICAgd2hpY2ggZmlsZXMgYXJlIGxvYWRlZC4gSWYgeW91IGNvbWJpbmUgdGhlIHBhcnNlcihzKSB5b3UgbmVlZCB3aXRoCiAgICB0aGUgYmFzZWZpbGVzLCB5b3UgY2FuIHNldCA8Y29kZT5iYXNlZmlsZXM8L2NvZGU+IHRvIHBvaW50IGF0IHlvdXIKICAgIGNvbXByZXNzZWQgZmlsZSwgYW5kIGxlYXZlIDxjb2RlPnBhcnNlcmZpbGVzPC9jb2RlPiBhdAogICAgPGNvZGU+W108L2NvZGU+LjwvcD4KCiAgICA8cD5Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYSBwYWdlIHRoYXQgdXNlcyBDb2RlTWlycm9yIHRvIGVkaXQgc29tZQogICAgSmF2YVNjcmlwdCBjb2RlLiBZb3UgY291bGQgc2F2ZSBhIG1pbmltaXplZCB2ZXJzaW9uIG9mCiAgICA8Y29kZT5jb2RlbWlycm9yLmpzPC9jb2RlPiBhcyA8Y29kZT5jb2RlbWlycm9yX21pbi5qczwvY29kZT4sIGFuZAogICAgaW5jbHVkZSB0aGF0ICh3aXRoIGEgPGNvZGU+Jmx0O3NjcmlwdD48L2NvZGU+IHRhZykgaW4geW91ciBwYWdlLgogICAgTmV4dCwgeW91IGNvbXByZXNzIGFsbCB0aGUgZmlsZXMgdW5kZXIgIkluLWZyYW1lIGJhc2UgY29kZSIsIHBsdXMKICAgIDxjb2RlPnRva2VuaXplamF2YXNjcmlwdC5qczwvY29kZT4gYW5kCiAgICA8Y29kZT5wYXJzZWphdmFzY3JpcHQuanM8L2NvZGU+IGludG8KICAgIDxjb2RlPmNvZGVtaXJyb3JfYmFzZS5qczwvY29kZT4sIGFuZCBsb2FkIHRoZSBlZGl0b3IgbGlrZQogICAgdGhpczo8L3A+CgogICAgPHByZSBjbGFzcz0iY29kZSI+Q29kZU1pcnJvci5mcm9tVGV4dEFyZWEoIm15dGV4dGFyZWEiLCB7CiAgYmFzZWZpbGVzOiBbImpzL2NvZGVtaXJyb3JfYmFzZS5qcyJdLAogIGxpbmVOdW1iZXJzOiB0cnVlCn0pOzwvcHJlPgoKICAgIDxwPkNsaWNraW5nIHRoZSAiQ29tcHJlc3MiIGJ1dHRvbnMgYmVsb3cgd2lsbCB0YWtlIHlvdSB0byBhIGZpbGUKICAgIGNvbnRhaW5pbmcgdGhlIGNvbXByZXNzZWQgY29kZS4gQ29weS1wYXN0ZSB0aGlzIGludG8geW91ciBzY3JpcHQKICAgIGZpbGUuICgiU2F2ZSBhcyIgZm9yIHRoYXQgcGFnZSBpcyBicm9rZW4gb24gc29tZSBicm93c2Vycywgc28gYmUKICAgIGNhcmVmdWwpLjwvcD4KCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgIGZ1bmN0aW9uIHNldFZlcnNpb24odmVyKSB7CiAgICAgICAgdmFyIHVybHByZWZpeCA9IHZlci5vcHRpb25zW3Zlci5zZWxlY3RlZEluZGV4XS52YWx1ZTsKICAgICAgICBjb25zb2xlLmxvZyh1cmxwcmVmaXgpOwogICAgICAgIHZhciBzZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZmlsZXMiKSwgbTsKICAgICAgICBmb3IgKHZhciBvcHRnciA9IHNlbGVjdC5maXJzdENoaWxkOyBvcHRncjsgb3B0Z3IgPSBvcHRnci5uZXh0U2libGluZykKICAgICAgICAgIGZvciAodmFyIG9wdCA9IG9wdGdyLmZpcnN0Q2hpbGQ7IG9wdDsgb3B0ID0gb3B0Lm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIGlmIChvcHQubm9kZU5hbWUgIT0gIk9QVElPTiIpCiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGVsc2UgaWYgKG0gPSBvcHQudmFsdWUubWF0Y2goL15odHRwOlwvXC9tYXJpam4uaGF2ZXJiZWtlLm5sXC9jb2RlbWlycm9yXC8oLiopJC8pKQogICAgICAgICAgICAgIG9wdC52YWx1ZSA9IHVybHByZWZpeCArIG1bMV07CiAgICAgICAgICAgIGVsc2UgaWYgKG0gPSBvcHQudmFsdWUubWF0Y2goL2h0dHA6XC9cL21hcmlqbi5oYXZlcmJla2UubmxcL2dpdFwvY29kZW1pcnJvclw/YT1ibG9iX3BsYWluO2hiPVteO10rO2Y9KC4qKSQvKSkKICAgICAgICAgICAgICBvcHQudmFsdWUgPSB1cmxwcmVmaXggKyBtWzFdOwogICAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIHZlcmlmeSgpIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3V0cHV0IikudmFsdWU9Indhcm5pbmdzIjsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZm9ybSIpLnN1Ym1pdCgpOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRwdXQiKS52YWx1ZT0iY29tcGlsZWRfY29kZSI7CiAgICAgIH0KICAgIDwvc2NyaXB0PgoKICAgIDxmb3JtIGlkPSJmb3JtIiBhY3Rpb249Imh0dHA6Ly9jbG9zdXJlLWNvbXBpbGVyLmFwcHNwb3QuY29tL2NvbXBpbGUiIG1ldGhvZD0icG9zdCIgaWQ9ImZvcm0iPgogICAgICA8cD5WZXJzaW9uOiA8c2VsZWN0IGlkPSJ2ZXJzaW9uIiBvbmNoYW5nZT0ic2V0VmVyc2lvbih0aGlzKTsiIGNsYXNzPSJmaWVsZCIgc3R5bGU9InBhZGRpbmc6IDFweCI+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci8iIHNlbGVjdGVkPkRldmVsb3BtZW50IGhlYWQ8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djAuODtmPSI+djAuODwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12MC43O2Y9Ij52MC43PC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYwLjY3O2Y9Ij52MC42Nzwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12MC42NjtmPSI+djAuNjY8L29wdGlvbj4KICAgICAgPC9zZWxlY3Q+PC9wPgoKICAgICAgPHA+PGlucHV0IHR5cGU9ImhpZGRlbiIgdmFsdWU9ImNvbXBpbGVkX2NvZGUiIG5hbWU9Im91dHB1dF9pbmZvIiBpZD0ib3V0cHV0Ii8+CgogICAgICA8c2VsZWN0IG11bHRpcGxlPSJtdWx0aXBsZSIgbmFtZT0iY29kZV91cmwiIHN0eWxlPSJ3aWR0aDogNDBlbTsiIGNsYXNzPSJmaWVsZCIgaWQ9ImZpbGVzIj4KICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9IkNvZGVNaXJyb3IgTGlicmFyeSI+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yL2pzL2NvZGVtaXJyb3IuanMiPmNvZGVtaXJyb3IuanM8L29wdGlvbj4KICAgICAgICA8L29wdGdyb3VwPgogICAgICAgIDxvcHRncm91cCBsYWJlbD0iSW4tZnJhbWUgYmFzZSBmaWxlcyI+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yL2pzL3V0aWwuanMiPnV0aWwuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvanMvc3RyaW5nc3RyZWFtLmpzIj5zdHJpbmdzdHJlYW0uanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvanMvc2VsZWN0LmpzIj5zZWxlY3QuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvanMvdW5kby5qcyI+dW5kby5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci9qcy9lZGl0b3IuanMiPmVkaXRvci5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci9qcy90b2tlbml6ZS5qcyI+dG9rZW5pemUuanM8L29wdGlvbj4KICAgICAgICA8L29wdGdyb3VwPgogICAgICAgIDxvcHRncm91cCBsYWJlbD0iUGFyc2VycyI+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yL2pzL3Rva2VuaXplamF2YXNjcmlwdC5qcyI+dG9rZW5pemVqYXZhc2NyaXB0LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yL2pzL3BhcnNlamF2YXNjcmlwdC5qcyI+cGFyc2VqYXZhc2NyaXB0LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yL2pzL3BhcnNleG1sLmpzIj5wYXJzZXhtbC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci9qcy9wYXJzZWNzcy5qcyI+cGFyc2Vjc3MuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvanMvcGFyc2VzcGFycWwuanMiPnBhcnNlc3BhcnFsLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yL2pzL3BhcnNlaHRtbG1peGVkLmpzIj5wYXJzZWh0bWxtaXhlZC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci9qcy9wYXJzZWR1bW15LmpzIj5wYXJzZWR1bW15LmpzPC9vcHRpb24+CiAgICAgICAgPC9vcHRncm91cD4KICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9IkNvbnRyaWJ1dGVkIHBhcnNlcnMiPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci9jb250cmliL2x1YS9qcy9wYXJzZWx1YS5qcyI+cGFyc2VsdWEuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvY29udHJpYi9weXRob24vanMvcGFyc2VweXRob24uanMiPnBhcnNlcHl0aG9uLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yL2NvbnRyaWIvcGhwL2pzL3Rva2VuaXplcGhwLmpzIj50b2tlbml6ZXBocC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci9jb250cmliL3BocC9qcy9wYXJzZXBocC5qcyI+cGFyc2VwaHAuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvY29udHJpYi9waHAvanMvcGFyc2VwaHBodG1sbWl4ZWQuanMiPnBhcnNlcGhwaHRtbG1peGVkLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yL2NvbnRyaWIvY3NoYXJwL2pzL3Rva2VuaXplY3NoYXJwLmpzIj50b2tlbml6ZWNzaGFycC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci9jb250cmliL2NzaGFycC9qcy9wYXJzZWNzaGFycC5qcyI+cGFyc2Vjc2hhcnAuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvY29udHJpYi9zcWwvanMvcGFyc2VzcWwuanMiPnBhcnNlc3FsLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yL2NvbnRyaWIvcGxzcWwvanMvcGFyc2VwbHNxbC5qcyI+cGFyc2VwbHNxbC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL3N2bi5leG9wbGF0Zm9ybS5vcmcvcHJvamVjdHMvZ3d0L3RydW5rL2V4by5nd3RmcmFtZXdvcmsuZWRpdG9yL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZXhvcGxhdGZvcm0vZ3d0ZnJhbWV3b3JrL2VkaXRvci9wdWJsaWMvY29kZW1pcnJvci9qcy90b2tlbml6ZWdyb292eS5qcyI+dG9rZW5pemVncm9vdnkuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9zdm4uZXhvcGxhdGZvcm0ub3JnL3Byb2plY3RzL2d3dC90cnVuay9leG8uZ3d0ZnJhbWV3b3JrLmVkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2V4b3BsYXRmb3JtL2d3dGZyYW1ld29yay9lZGl0b3IvcHVibGljL2NvZGVtaXJyb3IvanMvcGFyc2Vncm9vdnkuanMiPnBhcnNlZ3Jvb3Z5LmpzPC9vcHRpb24+CiAgICAgICAgPC9vcHRncm91cD4KICAgICAgPC9zZWxlY3Q+PC9wPgoKICAgICAgPHA+PGJ1dHRvbiB0eXBlPSJzdWJtaXQiPkNvbXByZXNzITwvYnV0dG9uPiA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0idmVyaWZ5KCk7Ij5DaGVjayBmb3IgZXJyb3JzPC9idXR0b24+PC9wPgoKICAgICAgPHA+Q3VzdG9tIGNvZGUgdG8gYWRkIHRvIHRoZSBjb21wcmVzc2VkIGZpbGU6PHRleHRhcmVhIG5hbWU9ImpzX2NvZGUiIHN0eWxlPSJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAxNWVtOyIgY2xhc3M9ImZpZWxkIj48L3RleHRhcmVhPjwvcD4KICAgIDwvZm9ybT4KCiAgPC9ib2R5Pgo8L2h0bWw+]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/csharp/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/csharp/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/csharp/css/csharpcolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aHRtbCB7CiAgY3Vyc29yOiB0ZXh0Owp9CgouZWRpdGJveCB7CiAgbWFyZ2luOiAuNGVtOwogIHBhZGRpbmc6IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgY29sb3I6IGJsYWNrOwp9CgpwcmUuY29kZSwgLmVkaXRib3ggewogIGNvbG9yOiAjNjY2NjY2Owp9CgouZWRpdGJveCBwIHsKICBtYXJnaW46IDA7Cn0KCnNwYW4uY3NoYXJwLXB1bmN0dWF0aW9uIHsKICBjb2xvcjogZ3JlZW47Cn0KCnNwYW4uY3NoYXJwLW9wZXJhdG9yIHsKICBjb2xvcjogcHVycGxlOwp9CgpzcGFuLmNzaGFycC1rZXl3b3JkIHsKICBjb2xvcjogYmx1ZTsKfQoKc3Bhbi5jc2hhcnAtYXRvbSB7CiAgY29sb3I6IGJyb3duOwp9CgpzcGFuLmNzaGFycC12YXJpYWJsZSB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLmNzaGFycC12YXJpYWJsZWRlZiB7CiAgY29sb3I6ICMwMDAwRkY7Cn0KCnNwYW4uY3NoYXJwLWxvY2FsdmFyaWFibGUgewogIGNvbG9yOiAjMDA0NDk5Owp9CgpzcGFuLmNzaGFycC1wcm9wZXJ0eSB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLmNzaGFycC1jb21tZW50IHsKICBjb2xvcjogZ3JlZW47Cn0KCnNwYW4uY3NoYXJwLXN0cmluZyB7CiAgY29sb3I6IHJlZDsKfQoK]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/csharp/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2pzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogQyMgZGVtb25zdHJhdGlvbjwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9jc3MvZG9jcy5jc3MiLz4KICA8L2hlYWQ+CiAgPGJvZHkgc3R5bGU9InBhZGRpbmc6IDIwcHg7Ij4KCjxwPkRlbW9uc3RyYXRpb24gb2YgPGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+Q29kZU1pcnJvcjwvYT4ncyBDIyBoaWdobGlnaHRlci48L3A+Cgo8cD5Xcml0dGVuIGJ5IDxhIGhyZWY9Imh0dHA6Ly9za2lsbHRlc3RpbmcuY29tLyI+Qm9yaXMgR2FiZXIgYW5kIENocmlzdG9waGVyIEJ1Y2hpbm88L2E+ICg8YQpocmVmPSJodHRwOi8vc2tpbGx0ZXN0aW5nLmNvbS9jb2RlbWlycm9yLXBhcnNlci1saWNlbnNlLyI+bGljZW5zZTwvYT4pLjwvcD4KCjxkaXYgY2xhc3M9ImJvcmRlciI+Cjx0ZXh0YXJlYSBpZD0iY29kZSIgY29scz0iMTIwIiByb3dzPSI1MCI+CnVzaW5nIFN5c3RlbTsKCm5hbWVzcGFjZSBFeGFtcGxlCnsKICAgIC8vLyAmbHQ7c3VtbWFyeT4KICAgIC8vLyBSZXByZXNlbnRzIGEgcGVyc29uIGVtcGxveWVkIGF0IHRoZSBjb21wYW55CiAgICAvLy8gJmx0Oy9zdW1tYXJ5PgogICAgcHVibGljIGNsYXNzIEVtcGxveWVlIDogUGVyc29uCiAgICB7CiAgICAgICAgI3JlZ2lvbiBQcm9wZXJ0aWVzCiAgICAgICAgCiAgICAgICAgLy8vICZsdDtzdW1tYXJ5PgogICAgICAgIC8vLyBHZXRzIG9yIHNldHMgdGhlIGZpcnN0IG5hbWUuCiAgICAgICAgLy8vICZsdDsvc3VtbWFyeT4KICAgICAgICAvLy8gJmx0O3ZhbHVlPlRoZSBmaXJzdCBuYW1lLiZsdDsvdmFsdWU+CiAgICAgICAgcHVibGljIHN0cmluZyBGaXJzdE5hbWUgeyBnZXQ7IHNldDsgfQoKICAgICAgICAjZW5kcmVnaW9uCgogICAgICAgIC8vLyAmbHQ7c3VtbWFyeT4KICAgICAgICAvLy8gQ2FsY3VsYXRlcyB0aGUgc2FsYXJ5LgogICAgICAgIC8vLyAmbHQ7L3N1bW1hcnk+CiAgICAgICAgLy8vICZsdDtwYXJhbSBuYW1lPSJncmFkZSI+VGhlIGdyYWRlLiZsdDsvcGFyYW0+CiAgICAgICAgLy8vICZsdDtyZXR1cm5zPiZsdDsvcmV0dXJucz4KICAgICAgICBwdWJsaWMgZGVjaW1hbCBDYWxjdWxhdGVTYWxhcnkoaW50IGdyYWRlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGdyYWRlID4gMTApCiAgICAgICAgICAgICAgICByZXR1cm4gMTAwMDsKICAgICAgICAgICAgcmV0dXJuIDUwMDsKICAgICAgICB9CiAgICB9Cn0KPC90ZXh0YXJlYT4KPC9kaXY+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKCdjb2RlJywgewogICAgcGFyc2VyZmlsZTogWyIuLi9jb250cmliL2NzaGFycC9qcy90b2tlbml6ZWNzaGFycC5qcyIsICIuLi9jb250cmliL2NzaGFycC9qcy9wYXJzZWNzaGFycC5qcyJdLAogICAgc3R5bGVzaGVldDogImNzcy9jc2hhcnBjb2xvcnMuY3NzIiwKICAgIHBhdGg6ICIuLi8uLi9qcy8iLAogICAgaGVpZ2h0OiAiNTAwcHgiCiAgfSk7Cjwvc2NyaXB0PgoKPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/csharp/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/csharp/js/parsecsharp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogUGFyc2UgZnVuY3Rpb24gZm9yIEphdmFTY3JpcHQuIE1ha2VzIHVzZSBvZiB0aGUgdG9rZW5pemVyIGZyb20KICogdG9rZW5pemVjc2hhcnAuanMuIE5vdGUgdGhhdCB5b3VyIHBhcnNlcnMgZG8gbm90IGhhdmUgdG8gYmUKICogdGhpcyBjb21wbGljYXRlZCAtLSBpZiB5b3UgZG9uJ3Qgd2FudCB0byByZWNvZ25pemUgbG9jYWwgdmFyaWFibGVzLAogKiBpbiBtYW55IGxhbmd1YWdlcyBpdCBpcyBlbm91Z2ggdG8ganVzdCBsb29rIGZvciBicmFjZXMsIHNlbWljb2xvbnMsCiAqIHBhcmVudGhlc2VzLCBldGMsIGFuZCBrbm93IHdoZW4geW91IGFyZSBpbnNpZGUgYSBzdHJpbmcgb3IgY29tbWVudC4KICoKICogU2VlIG1hbnVhbC5odG1sIGZvciBtb3JlIGluZm8gYWJvdXQgdGhlIHBhcnNlciBpbnRlcmZhY2UuCiAqLwoKdmFyIEpTUGFyc2VyID0gRWRpdG9yLlBhcnNlciA9IChmdW5jdGlvbigpIHsKICAvLyBUb2tlbiB0eXBlcyB0aGF0IGNhbiBiZSBjb25zaWRlcmVkIHRvIGJlIGF0b21zLgogIHZhciBhdG9taWNUeXBlcyA9IHsiYXRvbSI6IHRydWUsICJudW1iZXIiOiB0cnVlLCAidmFyaWFibGUiOiB0cnVlLCAic3RyaW5nIjogdHJ1ZSwgInJlZ2V4cCI6IHRydWV9OwogIC8vIFNldHRpbmcgdGhhdCBjYW4gYmUgdXNlZCB0byBoYXZlIEpTT04gZGF0YSBpbmRlbnQgcHJvcGVybHkuCiAgdmFyIGpzb24gPSBmYWxzZTsKICAvLyBDb25zdHJ1Y3RvciBmb3IgdGhlIGxleGljYWwgY29udGV4dCBvYmplY3RzLgogIGZ1bmN0aW9uIENTaGFycExleGljYWwoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYsIGluZm8pIHsKICAgIC8vIGluZGVudGF0aW9uIGF0IHN0YXJ0IG9mIHRoaXMgbGluZQogICAgdGhpcy5pbmRlbnRlZCA9IGluZGVudGVkOwogICAgLy8gY29sdW1uIGF0IHdoaWNoIHRoaXMgc2NvcGUgd2FzIG9wZW5lZAogICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICAvLyB0eXBlIG9mIHNjb3BlICgndmFyZGVmJywgJ3N0YXQnIChzdGF0ZW1lbnQpLCAnZm9ybScgKHNwZWNpYWwgZm9ybSksICdbJywgJ3snLCBvciAnKCcpCiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgLy8gJ1snLCAneycsIG9yICcoJyBibG9ja3MgdGhhdCBoYXZlIGFueSB0ZXh0IGFmdGVyIHRoZWlyIG9wZW5pbmcKICAgIC8vIGNoYXJhY3RlciBhcmUgc2FpZCB0byBiZSAnYWxpZ25lZCcgLS0gYW55IGxpbmVzIGJlbG93IGFyZQogICAgLy8gaW5kZW50ZWQgYWxsIHRoZSB3YXkgdG8gdGhlIG9wZW5pbmcgY2hhcmFjdGVyLgogICAgaWYgKGFsaWduICE9IG51bGwpCiAgICAgIHRoaXMuYWxpZ24gPSBhbGlnbjsKICAgIC8vIFBhcmVudCBzY29wZSwgaWYgYW55LgogICAgdGhpcy5wcmV2ID0gcHJldjsKICAgIHRoaXMuaW5mbyA9IGluZm87CiAgfQoKICAvLyBDU2hhcnAgaW5kZW50YXRpb24gcnVsZXMuCiAgZnVuY3Rpb24gaW5kZW50Q1NoYXJwKGxleGljYWwpIHsKICAgIHJldHVybiBmdW5jdGlvbihmaXJzdENoYXJzKSB7CiAgICAgIHZhciBmaXJzdENoYXIgPSBmaXJzdENoYXJzICYmIGZpcnN0Q2hhcnMuY2hhckF0KDApLCB0eXBlID0gbGV4aWNhbC50eXBlOwogICAgICB2YXIgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSB0eXBlOwogICAgICBpZiAodHlwZSA9PSAidmFyZGVmIikKICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIDQ7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImZvcm0iICYmIGZpcnN0Q2hhciA9PSAieyIpCiAgICAgICAgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQ7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInN0YXQiIHx8IHR5cGUgPT0gImZvcm0iKQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgaW5kZW50VW5pdDsKICAgICAgZWxzZSBpZiAobGV4aWNhbC5pbmZvID09ICJzd2l0Y2giICYmICFjbG9zaW5nKQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKC9eKD86Y2FzZXxkZWZhdWx0KVxiLy50ZXN0KGZpcnN0Q2hhcnMpID8gaW5kZW50VW5pdCA6IDIgKiBpbmRlbnRVbml0KTsKICAgICAgZWxzZSBpZiAobGV4aWNhbC5hbGlnbikKICAgICAgICByZXR1cm4gbGV4aWNhbC5jb2x1bW4gLSAoY2xvc2luZyA/IDEgOiAwKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICB9OwogIH0KCiAgLy8gVGhlIHBhcnNlci1pdGVyYXRvci1wcm9kdWNpbmcgZnVuY3Rpb24gaXRzZWxmLgogIGZ1bmN0aW9uIHBhcnNlQ1NoYXJwKGlucHV0LCBiYXNlY29sdW1uKSB7CiAgICAvLyBXcmFwIHRoZSBpbnB1dCBpbiBhIHRva2VuIHN0cmVhbQogICAgdmFyIHRva2VucyA9IHRva2VuaXplQ1NoYXJwKGlucHV0KTsKICAgIC8vIFRoZSBwYXJzZXIgc3RhdGUuIGNjIGlzIGEgc3RhY2sgb2YgYWN0aW9ucyB0aGF0IGhhdmUgdG8gYmUKICAgIC8vIHBlcmZvcm1lZCB0byBmaW5pc2ggdGhlIGN1cnJlbnQgc3RhdGVtZW50LiBGb3IgZXhhbXBsZSB3ZSBtaWdodAogICAgLy8ga25vdyB0aGF0IHdlIHN0aWxsIG5lZWQgdG8gZmluZCBhIGNsb3NpbmcgcGFyZW50aGVzaXMgYW5kIGEKICAgIC8vIHNlbWljb2xvbi4gQWN0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBzdGFjayBnbyBmaXJzdC4gSXQgaXMKICAgIC8vIGluaXRpYWxpemVkIHdpdGggYW4gaW5maW5pdGVseSBsb29waW5nIGFjdGlvbiB0aGF0IGNvbnN1bWVzCiAgICAvLyB3aG9sZSBzdGF0ZW1lbnRzLgogICAgdmFyIGNjID0gW3N0YXRlbWVudHNdOwogICAgLy8gVGhlIGxleGljYWwgc2NvcGUsIHVzZWQgbW9zdGx5IGZvciBpbmRlbnRhdGlvbi4KICAgIHZhciBsZXhpY2FsID0gbmV3IENTaGFycExleGljYWwoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAiYmxvY2siLCBmYWxzZSk7CiAgICAvLyBDdXJyZW50IGNvbHVtbiwgYW5kIHRoZSBpbmRlbnRhdGlvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQKICAgIC8vIGxpbmUuIFVzZWQgdG8gY3JlYXRlIGxleGljYWwgc2NvcGUgb2JqZWN0cy4KICAgIHZhciBjb2x1bW4gPSAwOwogICAgdmFyIGluZGVudGVkID0gMDsKICAgIC8vIFZhcmlhYmxlcyB3aGljaCBhcmUgdXNlZCBieSB0aGUgbWFyaywgY29udCwgYW5kIHBhc3MgZnVuY3Rpb25zCiAgICAvLyBiZWxvdyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBkcml2ZXIgbG9vcCBpbiB0aGUgJ25leHQnCiAgICAvLyBmdW5jdGlvbi4KICAgIHZhciBjb25zdW1lLCBtYXJrZWQ7CiAgCiAgICAvLyBUaGUgaXRlcmF0b3Igb2JqZWN0LgogICAgdmFyIHBhcnNlciA9IHtuZXh0OiBuZXh0LCBjb3B5OiBjb3B5fTsKCiAgICBmdW5jdGlvbiBuZXh0KCl7CiAgICAgIC8vIFN0YXJ0IGJ5IHBlcmZvcm1pbmcgYW55ICdsZXhpY2FsJyBhY3Rpb25zIChhZGp1c3RpbmcgdGhlCiAgICAgIC8vIGxleGljYWwgdmFyaWFibGUpLCBvciB0aGUgb3BlcmF0aW9ucyBiZWxvdyB3aWxsIGJlIHdvcmtpbmcKICAgICAgLy8gd2l0aCB0aGUgd3JvbmcgbGV4aWNhbCBzdGF0ZS4KICAgICAgd2hpbGUoY2NbY2MubGVuZ3RoIC0gMV0ubGV4KQogICAgICAgIGNjLnBvcCgpKCk7CgogICAgICAvLyBGZXRjaCBhIHRva2VuLgogICAgICB2YXIgdG9rZW4gPSB0b2tlbnMubmV4dCgpOwoKICAgICAgLy8gQWRqdXN0IGNvbHVtbiBhbmQgaW5kZW50ZWQuCiAgICAgIGlmICh0b2tlbi50eXBlID09ICJ3aGl0ZXNwYWNlIiAmJiBjb2x1bW4gPT0gMCkKICAgICAgICBpbmRlbnRlZCA9IHRva2VuLnZhbHVlLmxlbmd0aDsKICAgICAgY29sdW1uICs9IHRva2VuLnZhbHVlLmxlbmd0aDsKICAgICAgaWYgKHRva2VuLmNvbnRlbnQgPT0gIlxuIil7CiAgICAgICAgaW5kZW50ZWQgPSBjb2x1bW4gPSAwOwogICAgICAgIC8vIElmIHRoZSBsZXhpY2FsIHNjb3BlJ3MgYWxpZ24gcHJvcGVydHkgaXMgc3RpbGwgdW5kZWZpbmVkIGF0CiAgICAgICAgLy8gdGhlIGVuZCBvZiB0aGUgbGluZSwgaXQgaXMgYW4gdW4tYWxpZ25lZCBzY29wZS4KICAgICAgICBpZiAoISgiYWxpZ24iIGluIGxleGljYWwpKQogICAgICAgICAgbGV4aWNhbC5hbGlnbiA9IGZhbHNlOwogICAgICAgIC8vIE5ld2xpbmUgdG9rZW5zIGdldCBhbiBpbmRlbnRhdGlvbiBmdW5jdGlvbiBhc3NvY2lhdGVkIHdpdGgKICAgICAgICAvLyB0aGVtLgogICAgICAgIHRva2VuLmluZGVudGF0aW9uID0gaW5kZW50Q1NoYXJwKGxleGljYWwpOwogICAgICB9CiAgICAgIC8vIE5vIG1vcmUgcHJvY2Vzc2luZyBmb3IgbWVhbmluZ2xlc3MgdG9rZW5zLgogICAgICBpZiAodG9rZW4udHlwZSA9PSAid2hpdGVzcGFjZSIgfHwgdG9rZW4udHlwZSA9PSAiY29tbWVudCIpCiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAvLyBXaGVuIGEgbWVhbmluZ2Z1bCB0b2tlbiBpcyBmb3VuZCBhbmQgdGhlIGxleGljYWwgc2NvcGUncwogICAgICAvLyBhbGlnbiBpcyB1bmRlZmluZWQsIGl0IGlzIGFuIGFsaWduZWQgc2NvcGUuCiAgICAgIGlmICghKCJhbGlnbiIgaW4gbGV4aWNhbCkpCiAgICAgICAgbGV4aWNhbC5hbGlnbiA9IHRydWU7CgogICAgICAvLyBFeGVjdXRlIGFjdGlvbnMgdW50aWwgb25lICdjb25zdW1lcycgdGhlIHRva2VuIGFuZCB3ZSBjYW4KICAgICAgLy8gcmV0dXJuIGl0LgogICAgICB3aGlsZSh0cnVlKSB7CiAgICAgICAgY29uc3VtZSA9IG1hcmtlZCA9IGZhbHNlOwogICAgICAgIC8vIFRha2UgYW5kIGV4ZWN1dGUgdGhlIHRvcG1vc3QgYWN0aW9uLgogICAgICAgIGNjLnBvcCgpKHRva2VuLnR5cGUsIHRva2VuLmNvbnRlbnQpOwogICAgICAgIGlmIChjb25zdW1lKXsKICAgICAgICAgIC8vIE1hcmtlZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgc3R5bGUgb2YgdGhlIGN1cnJlbnQgdG9rZW4uCiAgICAgICAgICBpZiAobWFya2VkKQogICAgICAgICAgICB0b2tlbi5zdHlsZSA9IG1hcmtlZDsKICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBUaGlzIG1ha2VzIGEgY29weSBvZiB0aGUgcGFyc2VyIHN0YXRlLiBJdCBzdG9yZXMgYWxsIHRoZQogICAgLy8gc3RhdGVmdWwgdmFyaWFibGVzIGluIGEgY2xvc3VyZSwgYW5kIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0CiAgICAvLyB3aWxsIHJlc3RvcmUgdGhlbSB3aGVuIGNhbGxlZCB3aXRoIGEgbmV3IGlucHV0IHN0cmVhbS4gTm90ZQogICAgLy8gdGhhdCB0aGUgY2MgYXJyYXkgaGFzIHRvIGJlIGNvcGllZCwgYmVjYXVzZSBpdCBpcyBjb250YW50bHkKICAgIC8vIGJlaW5nIG1vZGlmaWVkLiBMZXhpY2FsIG9iamVjdHMgYXJlIG5vdCBtdXRhdGVkLCBhbmQgY29udGV4dAogICAgLy8gb2JqZWN0cyBhcmUgbm90IG11dGF0ZWQgaW4gYSBoYXJtZnVsIHdheSwgc28gdGhleSBjYW4gYmUgc2hhcmVkCiAgICAvLyBiZXR3ZWVuIHJ1bnMgb2YgdGhlIHBhcnNlci4KICAgIGZ1bmN0aW9uIGNvcHkoKXsKICAgICAgdmFyIF9sZXhpY2FsID0gbGV4aWNhbCwgX2NjID0gY2MuY29uY2F0KFtdKSwgX3Rva2VuU3RhdGUgPSB0b2tlbnMuc3RhdGU7CiAgCiAgICAgIHJldHVybiBmdW5jdGlvbiBjb3B5UGFyc2VyKGlucHV0KXsKICAgICAgICBsZXhpY2FsID0gX2xleGljYWw7CiAgICAgICAgY2MgPSBfY2MuY29uY2F0KFtdKTsgLy8gY29waWVzIHRoZSBhcnJheQogICAgICAgIGNvbHVtbiA9IGluZGVudGVkID0gMDsKICAgICAgICB0b2tlbnMgPSB0b2tlbml6ZUNTaGFycChpbnB1dCwgX3Rva2VuU3RhdGUpOwogICAgICAgIHJldHVybiBwYXJzZXI7CiAgICAgIH07CiAgICB9CgogICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBwdXNoaW5nIGEgbnVtYmVyIG9mIGFjdGlvbnMgb250byB0aGUgY2MKICAgIC8vIHN0YWNrIGluIHJldmVyc2Ugb3JkZXIuCiAgICBmdW5jdGlvbiBwdXNoKGZzKXsKICAgICAgZm9yICh2YXIgaSA9IGZzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQogICAgICAgIGNjLnB1c2goZnNbaV0pOwogICAgfQogICAgLy8gY29udCBhbmQgcGFzcyBhcmUgdXNlZCBieSB0aGUgYWN0aW9uIGZ1bmN0aW9ucyB0byBhZGQgb3RoZXIKICAgIC8vIGFjdGlvbnMgdG8gdGhlIHN0YWNrLiBjb250IHdpbGwgY2F1c2UgdGhlIGN1cnJlbnQgdG9rZW4gdG8gYmUKICAgIC8vIGNvbnN1bWVkLCBwYXNzIHdpbGwgbGVhdmUgaXQgZm9yIHRoZSBuZXh0IGFjdGlvbi4KICAgIGZ1bmN0aW9uIGNvbnQoKXsKICAgICAgcHVzaChhcmd1bWVudHMpOwogICAgICBjb25zdW1lID0gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhc3MoKXsKICAgICAgcHVzaChhcmd1bWVudHMpOwogICAgICBjb25zdW1lID0gZmFsc2U7CiAgICB9CiAgICAvLyBVc2VkIHRvIGNoYW5nZSB0aGUgc3R5bGUgb2YgdGhlIGN1cnJlbnQgdG9rZW4uCiAgICBmdW5jdGlvbiBtYXJrKHN0eWxlKXsKICAgICAgbWFya2VkID0gc3R5bGU7CiAgICB9CgogICAgLy8gUHVzaCBhIG5ldyBsZXhpY2FsIGNvbnRleHQgb2YgdGhlIGdpdmVuIHR5cGUuCiAgICBmdW5jdGlvbiBwdXNobGV4KHR5cGUsIGluZm8pIHsKICAgICAgdmFyIHJlc3VsdCA9IGZ1bmN0aW9uKCl7CiAgICAgICAgbGV4aWNhbCA9IG5ldyBDU2hhcnBMZXhpY2FsKGluZGVudGVkLCBjb2x1bW4sIHR5cGUsIG51bGwsIGxleGljYWwsIGluZm8pCiAgICAgIH07CiAgICAgIHJlc3VsdC5sZXggPSB0cnVlOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgLy8gUG9wIG9mZiB0aGUgY3VycmVudCBsZXhpY2FsIGNvbnRleHQuCiAgICBmdW5jdGlvbiBwb3BsZXgoKXsKICAgICAgbGV4aWNhbCA9IGxleGljYWwucHJldjsKICAgIH0KICAgIHBvcGxleC5sZXggPSB0cnVlOwogICAgLy8gVGhlICdsZXgnIGZsYWcgb24gdGhlc2UgYWN0aW9ucyBpcyB1c2VkIGJ5IHRoZSAnbmV4dCcgZnVuY3Rpb24KICAgIC8vIHRvIGtub3cgdGhleSBjYW4gKGFuZCBoYXZlIHRvKSBiZSByYW4gYmVmb3JlIG1vdmluZyBvbiB0byB0aGUKICAgIC8vIG5leHQgdG9rZW4uCiAgCiAgICAvLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IGRpc2NhcmRzIHRva2VucyB1bnRpbCBpdCBmaW5kcyBvbmUgb2YKICAgIC8vIHRoZSBnaXZlbiB0eXBlLgogICAgZnVuY3Rpb24gZXhwZWN0KHdhbnRlZCl7CiAgICAgIHJldHVybiBmdW5jdGlvbiBleHBlY3RpbmcodHlwZSl7CiAgICAgICAgaWYgKHR5cGUgPT0gd2FudGVkKSBjb250KCk7CiAgICAgICAgZWxzZSBjb250KGFyZ3VtZW50cy5jYWxsZWUpOwogICAgICB9OwogICAgfQoKICAgIC8vIExvb2tzIGZvciBhIHN0YXRlbWVudCwgYW5kIHRoZW4gY2FsbHMgaXRzZWxmLgogICAgZnVuY3Rpb24gc3RhdGVtZW50cyh0eXBlKXsKICAgICAgcmV0dXJuIHBhc3Moc3RhdGVtZW50LCBzdGF0ZW1lbnRzKTsKICAgIH0KICAgIC8vIERpc3BhdGNoZXMgdmFyaW91cyB0eXBlcyBvZiBzdGF0ZW1lbnRzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRoZQogICAgLy8gY3VycmVudCB0b2tlbi4KICAgIGZ1bmN0aW9uIHN0YXRlbWVudCh0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhciIpIGNvbnQocHVzaGxleCgidmFyZGVmIiksIHZhcmRlZjEsIGV4cGVjdCgiOyIpLCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJrZXl3b3JkIGEiKSBjb250KHB1c2hsZXgoImZvcm0iKSwgZXhwcmVzc2lvbiwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJrZXl3b3JkIGIiKSBjb250KHB1c2hsZXgoImZvcm0iKSwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJ7IiAmJiBqc29uKSBjb250KHB1c2hsZXgoIn0iKSwgY29tbWFzZXAob2JqcHJvcCwgIn0iKSwgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAieyIpIGNvbnQocHVzaGxleCgifSIpLCBibG9jaywgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiZnVuY3Rpb24iKSBjb250KGZ1bmN0aW9uZGVmKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiZm9yIikgY29udChwdXNobGV4KCJmb3JtIiksIGV4cGVjdCgiKCIpLCBwdXNobGV4KCIpIiksIGZvcnNwZWMxLCBleHBlY3QoIikiKSwgcG9wbGV4LCBzdGF0ZW1lbnQsIHBvcGxleCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgY29udChwdXNobGV4KCJzdGF0IiksIG1heWJlbGFiZWwpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJzd2l0Y2giKSBjb250KHB1c2hsZXgoImZvcm0iKSwgZXhwcmVzc2lvbiwgcHVzaGxleCgifSIsICJzd2l0Y2giKSwgZXhwZWN0KCJ7IiksIGJsb2NrLCBwb3BsZXgsIHBvcGxleCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImNhc2UiKSBjb250KGV4cHJlc3Npb24sIGV4cGVjdCgiOiIpKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiZGVmYXVsdCIpIGNvbnQoZXhwZWN0KCI6IikpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJjYXRjaCIpIGNvbnQocHVzaGxleCgiZm9ybSIpLCBleHBlY3QoIigiKSwgZnVuYXJnLCBleHBlY3QoIikiKSwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICAKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiY2xhc3MiKSBjb250KGNsYXNzZGVmKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAia2V5d29yZCBkIikgY29udChzdGF0ZW1lbnQpOwogICAgICAKICAgICAgZWxzZSBwYXNzKHB1c2hsZXgoInN0YXQiKSwgZXhwcmVzc2lvbiwgZXhwZWN0KCI7IiksIHBvcGxleCk7CiAgICB9CiAgICAvLyBEaXNwYXRjaCBleHByZXNzaW9uIHR5cGVzLgogICAgZnVuY3Rpb24gZXhwcmVzc2lvbih0eXBlKXsKICAgICAgaWYgKGF0b21pY1R5cGVzLmhhc093blByb3BlcnR5KHR5cGUpKSBjb250KG1heWJlb3BlcmF0b3IpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmdW5jdGlvbiIpIGNvbnQoZnVuY3Rpb25kZWYpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJrZXl3b3JkIGMiKSBjb250KGV4cHJlc3Npb24pOwogICAgICBlbHNlIGlmICh0eXBlID09ICIoIikgY29udChwdXNobGV4KCIpIiksIGV4cHJlc3Npb24sIGV4cGVjdCgiKSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJvcGVyYXRvciIpIGNvbnQoZXhwcmVzc2lvbik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIlsiKSBjb250KHB1c2hsZXgoIl0iKSwgY29tbWFzZXAoZXhwcmVzc2lvbiwgIl0iKSwgcG9wbGV4LCBtYXliZW9wZXJhdG9yKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAieyIpIGNvbnQocHVzaGxleCgifSIpLCBjb21tYXNlcChvYmpwcm9wLCAifSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgfQogICAgLy8gQ2FsbGVkIGZvciBwbGFjZXMgd2hlcmUgb3BlcmF0b3JzLCBmdW5jdGlvbiBjYWxscywgb3IKICAgIC8vIHN1YnNjcmlwdHMgYXJlIHZhbGlkLiBXaWxsIHNraXAgb24gdG8gdGhlIG5leHQgYWN0aW9uIGlmIG5vbmUKICAgIC8vIGlzIGZvdW5kLgogICAgZnVuY3Rpb24gbWF5YmVvcGVyYXRvcih0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gIm9wZXJhdG9yIikgY29udChleHByZXNzaW9uKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiKCIpIGNvbnQocHVzaGxleCgiKSIpLCBleHByZXNzaW9uLCBjb21tYXNlcChleHByZXNzaW9uLCAiKSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgICBlbHNlIGlmICh0eXBlID09ICIuIikgY29udChwcm9wZXJ0eSwgbWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIlsiKSBjb250KHB1c2hsZXgoIl0iKSwgZXhwcmVzc2lvbiwgZXhwZWN0KCJdIiksIHBvcGxleCwgbWF5YmVvcGVyYXRvcik7CiAgICB9CiAgICAvLyBXaGVuIGEgc3RhdGVtZW50IHN0YXJ0cyB3aXRoIGEgdmFyaWFibGUgbmFtZSwgaXQgbWlnaHQgYmUgYQogICAgLy8gbGFiZWwuIElmIG5vIGNvbG9uIGZvbGxvd3MsIGl0J3MgYSByZWd1bGFyIHN0YXRlbWVudC4KICAgIGZ1bmN0aW9uIG1heWJlbGFiZWwodHlwZSl7CiAgICAgIGlmICh0eXBlID09ICI6IikgY29udChwb3BsZXgsIHN0YXRlbWVudCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIigiKSBjb250KGNvbW1hc2VwKGZ1bmFyZywgIikiKSwgcG9wbGV4LCBzdGF0ZW1lbnQpOyAvLyBtZXRob2QgZGVmaW5pdGlvbgogICAgICBlbHNlIGlmICh0eXBlID09ICJ7IikgY29udChwb3BsZXgsIHB1c2hsZXgoIn0iKSwgYmxvY2ssIHBvcGxleCk7IC8vIHByb3BlcnR5IGRlZmluaXRpb24KICAgICAgZWxzZSBwYXNzKG1heWJlb3BlcmF0b3IsIGV4cGVjdCgiOyIpLCBwb3BsZXgpOwogICAgfQogICAgLy8gUHJvcGVydHkgbmFtZXMgbmVlZCB0byBoYXZlIHRoZWlyIHN0eWxlIGFkanVzdGVkIC0tIHRoZQogICAgLy8gdG9rZW5pemVyIHRoaW5rcyB0aGV5IGFyZSB2YXJpYWJsZXMuCiAgICBmdW5jdGlvbiBwcm9wZXJ0eSh0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikge21hcmsoImNzaGFycC1wcm9wZXJ0eSIpOyBjb250KCk7fQogICAgfQogICAgLy8gVGhpcyBwYXJzZXMgYSBwcm9wZXJ0eSBhbmQgaXRzIHZhbHVlIGluIGFuIG9iamVjdCBsaXRlcmFsLgogICAgZnVuY3Rpb24gb2JqcHJvcCh0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgbWFyaygiY3NoYXJwLXByb3BlcnR5Iik7CiAgICAgIGlmIChhdG9taWNUeXBlcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgY29udChleHBlY3QoIjoiKSwgZXhwcmVzc2lvbik7CiAgICB9CiAgICAvLyBQYXJzZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgdGhpbmdzIHRoYXQgYXJlIHJlY29nbml6ZWQKICAgIC8vIGJ5IHRoZSAnd2hhdCcgYXJndW1lbnQuCiAgICBmdW5jdGlvbiBjb21tYXNlcCh3aGF0LCBlbmQpewogICAgICBmdW5jdGlvbiBwcm9jZWVkKHR5cGUpIHsKICAgICAgICBpZiAodHlwZSA9PSAiLCIpIGNvbnQod2hhdCwgcHJvY2VlZCk7CiAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBlbmQpIGNvbnQoKTsKICAgICAgICBlbHNlIGNvbnQoZXhwZWN0KGVuZCkpOwogICAgICB9OwogICAgICByZXR1cm4gZnVuY3Rpb24gY29tbWFTZXBhcmF0ZWQodHlwZSkgewogICAgICAgIGlmICh0eXBlID09IGVuZCkgY29udCgpOwogICAgICAgIGVsc2UgcGFzcyh3aGF0LCBwcm9jZWVkKTsKICAgICAgfTsKICAgIH0KICAgIC8vIExvb2sgZm9yIHN0YXRlbWVudHMgdW50aWwgYSBjbG9zaW5nIGJyYWNlIGlzIGZvdW5kLgogICAgZnVuY3Rpb24gYmxvY2sodHlwZSl7CiAgICAgIGlmICh0eXBlID09ICJ9IikgY29udCgpOwogICAgICBlbHNlIHBhc3Moc3RhdGVtZW50LCBibG9jayk7CiAgICB9CiAgICAvLyBWYXJpYWJsZSBkZWZpbml0aW9ucyBhcmUgc3BsaXQgaW50byB0d28gYWN0aW9ucyAtLSAxIGxvb2tzIGZvcgogICAgLy8gYSBuYW1lIG9yIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24sIDIgbG9va3MgZm9yIGFuICc9JyBzaWduIG9yCiAgICAvLyBhIGNvbW1hLgogICAgZnVuY3Rpb24gdmFyZGVmMSh0eXBlLCB2YWx1ZSl7CiAgICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpe2NvbnQodmFyZGVmMik7fQogICAgICBlbHNlIGNvbnQoKTsKICAgIH0KICAgIGZ1bmN0aW9uIHZhcmRlZjIodHlwZSwgdmFsdWUpewogICAgICBpZiAodmFsdWUgPT0gIj0iKSBjb250KGV4cHJlc3Npb24sIHZhcmRlZjIpOwogICAgICBlbHNlIGlmICh0eXBlID09ICIsIikgY29udCh2YXJkZWYxKTsKICAgIH0KICAgIC8vIEZvciBsb29wcy4KICAgIGZ1bmN0aW9uIGZvcnNwZWMxKHR5cGUpewogICAgICBpZiAodHlwZSA9PSAidmFyIikgY29udCh2YXJkZWYxLCBmb3JzcGVjMik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIjsiKSBwYXNzKGZvcnNwZWMyKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAidmFyaWFibGUiKSBjb250KGZvcm1heWJlaW4pOwogICAgICBlbHNlIHBhc3MoZm9yc3BlYzIpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF5YmVpbih0eXBlLCB2YWx1ZSl7CiAgICAgIGlmICh2YWx1ZSA9PSAiaW4iKSBjb250KGV4cHJlc3Npb24pOwogICAgICBlbHNlIGNvbnQobWF5YmVvcGVyYXRvciwgZm9yc3BlYzIpOwogICAgfQogICAgZnVuY3Rpb24gZm9yc3BlYzIodHlwZSwgdmFsdWUpewogICAgICBpZiAodHlwZSA9PSAiOyIpIGNvbnQoZm9yc3BlYzMpOwogICAgICBlbHNlIGlmICh2YWx1ZSA9PSAiaW4iKSBjb250KGV4cHJlc3Npb24pOwogICAgICBlbHNlIGNvbnQoZXhwcmVzc2lvbiwgZXhwZWN0KCI7IiksIGZvcnNwZWMzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcnNwZWMzKHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT0gIikiKSBwYXNzKCk7CiAgICAgIGVsc2UgY29udChleHByZXNzaW9uKTsKICAgIH0KICAgIC8vIEEgZnVuY3Rpb24gZGVmaW5pdGlvbiBjcmVhdGVzIGEgbmV3IGNvbnRleHQsIGFuZCB0aGUgdmFyaWFibGVzCiAgICAvLyBpbiBpdHMgYXJndW1lbnQgbGlzdCBoYXZlIHRvIGJlIGFkZGVkIHRvIHRoaXMgY29udGV4dC4KICAgIGZ1bmN0aW9uIGZ1bmN0aW9uZGVmKHR5cGUsIHZhbHVlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgY29udChmdW5jdGlvbmRlZik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIigiKSBjb250KGNvbW1hc2VwKGZ1bmFyZywgIikiKSwgc3RhdGVtZW50KTsKICAgIH0KICAgIGZ1bmN0aW9uIGZ1bmFyZyh0eXBlLCB2YWx1ZSl7CiAgICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpe2NvbnQoKTt9CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGNsYXNzZGVmKHR5cGUpIHsKICAgICAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKSBjb250KGNsYXNzZGVmLCBzdGF0ZW1lbnQpOwogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIjoiKSBjb250KGNsYXNzZGVmLCBzdGF0ZW1lbnQpOwogICAgfQogIAogICAgcmV0dXJuIHBhcnNlcjsKICB9CgogIHJldHVybiB7CiAgICBtYWtlOiBwYXJzZUNTaGFycCwKICAgIGVsZWN0cmljQ2hhcnM6ICJ7fToiLAogICAgY29uZmlndXJlOiBmdW5jdGlvbihvYmopIHsKICAgICAgaWYgKG9iai5qc29uICE9IG51bGwpIGpzb24gPSBvYmouanNvbjsKICAgIH0KICB9Owp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/csharp/js/tokenizecsharp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogVG9rZW5pemVyIGZvciBDU2hhcnAgY29kZSAqLwoKdmFyIHRva2VuaXplQ1NoYXJwID0gKGZ1bmN0aW9uKCkgewogIC8vIEFkdmFuY2UgdGhlIHN0cmVhbSB1bnRpbCB0aGUgZ2l2ZW4gY2hhcmFjdGVyIChub3QgcHJlY2VkZWQgYnkgYQogIC8vIGJhY2tzbGFzaCkgaXMgZW5jb3VudGVyZWQsIG9yIHRoZSBlbmQgb2YgdGhlIGxpbmUgaXMgcmVhY2hlZC4KICBmdW5jdGlvbiBuZXh0VW50aWxVbmVzY2FwZWQoc291cmNlLCBlbmQpIHsKICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CiAgICB2YXIgbmV4dDsKICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgIHZhciBuZXh0ID0gc291cmNlLm5leHQoKTsKICAgICAgaWYgKG5leHQgPT0gZW5kICYmICFlc2NhcGVkKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgIH0KICAgIHJldHVybiBlc2NhcGVkOwogIH0KCiAgLy8gQSBtYXAgb2YgSmF2YVNjcmlwdCdzIGtleXdvcmRzLiBUaGUgYS9iL2Mga2V5d29yZCBkaXN0aW5jdGlvbiBpcwogIC8vIHZlcnkgcm91Z2gsIGJ1dCBpdCBnaXZlcyB0aGUgcGFyc2VyIGVub3VnaCBpbmZvcm1hdGlvbiB0byBwYXJzZQogIC8vIGNvcnJlY3QgY29kZSBjb3JyZWN0bHkgKHdlIGRvbid0IGNhcmUgdGhhdCBtdWNoIGhvdyB3ZSBwYXJzZQogIC8vIGluY29ycmVjdCBjb2RlKS4gVGhlIHN0eWxlIGluZm9ybWF0aW9uIGluY2x1ZGVkIGluIHRoZXNlIG9iamVjdHMKICAvLyBpcyB1c2VkIGJ5IHRoZSBoaWdobGlnaHRlciB0byBwaWNrIHRoZSBjb3JyZWN0IENTUyBzdHlsZSBmb3IgYQogIC8vIHRva2VuLgogIHZhciBrZXl3b3JkcyA9IGZ1bmN0aW9uKCl7CiAgICBmdW5jdGlvbiByZXN1bHQodHlwZSwgc3R5bGUpewogICAgICByZXR1cm4ge3R5cGU6IHR5cGUsIHN0eWxlOiAiY3NoYXJwLSIgKyBzdHlsZX07CiAgICB9CiAgICAvLyBrZXl3b3JkcyB0aGF0IHRha2UgYSBwYXJlbnRoaXNlZCBleHByZXNzaW9uLCBhbmQgdGhlbiBhCiAgICAvLyBzdGF0ZW1lbnQgKGlmKQogICAgdmFyIGtleXdvcmRBID0gcmVzdWx0KCJrZXl3b3JkIGEiLCAia2V5d29yZCIpOwogICAgLy8ga2V5d29yZHMgdGhhdCB0YWtlIGp1c3QgYSBzdGF0ZW1lbnQgKGVsc2UpCiAgICB2YXIga2V5d29yZEIgPSByZXN1bHQoImtleXdvcmQgYiIsICJrZXl3b3JkIik7CiAgICAvLyBrZXl3b3JkcyB0aGF0IG9wdGlvbmFsbHkgdGFrZSBhbiBleHByZXNzaW9uLCBhbmQgZm9ybSBhCiAgICAvLyBzdGF0ZW1lbnQgKHJldHVybikKICAgIHZhciBrZXl3b3JkQyA9IHJlc3VsdCgia2V5d29yZCBjIiwgImtleXdvcmQiKTsKICAgIHZhciBvcGVyYXRvciA9IHJlc3VsdCgib3BlcmF0b3IiLCAia2V5d29yZCIpOwogICAgdmFyIGF0b20gPSByZXN1bHQoImF0b20iLCAiYXRvbSIpOwogICAgLy8ganVzdCBhIGtleXdvcmQgd2l0aCBubyBpbmRlbnRhdGlvbiBpbXBsaWNhdGlvbnMKICAgIHZhciBrZXl3b3JkRCA9IHJlc3VsdCgia2V5d29yZCBkIiwgImtleXdvcmQiKTsgCiAgICAKICAgIHJldHVybiB7CiAgICAgICJpZiI6IGtleXdvcmRBLCAid2hpbGUiOiBrZXl3b3JkQSwgIndpdGgiOiBrZXl3b3JkQSwKICAgICAgImVsc2UiOiBrZXl3b3JkQiwgImRvIjoga2V5d29yZEIsICJ0cnkiOiBrZXl3b3JkQiwgImZpbmFsbHkiOiBrZXl3b3JkQiwKICAgICAgInJldHVybiI6IGtleXdvcmRDLCAiYnJlYWsiOiBrZXl3b3JkQywgImNvbnRpbnVlIjoga2V5d29yZEMsICJuZXciOiBrZXl3b3JkQywgImRlbGV0ZSI6IGtleXdvcmRDLCAidGhyb3ciOiBrZXl3b3JkQywKICAgICAgImluIjogb3BlcmF0b3IsICJ0eXBlb2YiOiBvcGVyYXRvciwgImluc3RhbmNlb2YiOiBvcGVyYXRvciwKICAgICAgInZhciI6IHJlc3VsdCgidmFyIiwgImtleXdvcmQiKSwgImZ1bmN0aW9uIjogcmVzdWx0KCJmdW5jdGlvbiIsICJrZXl3b3JkIiksICJjYXRjaCI6IHJlc3VsdCgiY2F0Y2giLCAia2V5d29yZCIpLAogICAgICAiZm9yIjogcmVzdWx0KCJmb3IiLCAia2V5d29yZCIpLCAic3dpdGNoIjogcmVzdWx0KCJzd2l0Y2giLCAia2V5d29yZCIpLAogICAgICAiY2FzZSI6IHJlc3VsdCgiY2FzZSIsICJrZXl3b3JkIiksICJkZWZhdWx0IjogcmVzdWx0KCJkZWZhdWx0IiwgImtleXdvcmQiKSwKICAgICAgInRydWUiOiBhdG9tLCAiZmFsc2UiOiBhdG9tLCAibnVsbCI6IGF0b20sCiAgICAgIAogICAgICAiY2xhc3MiOiByZXN1bHQoImNsYXNzIiwgImtleXdvcmQiKSwgIm5hbWVzcGFjZSI6IHJlc3VsdCgiY2xhc3MiLCAia2V5d29yZCIpLAogICAgICAKICAgICAgInB1YmxpYyI6IGtleXdvcmRELCAicHJpdmF0ZSI6IGtleXdvcmRELCAicHJvdGVjdGVkIjoga2V5d29yZEQsICJpbnRlcm5hbCI6IGtleXdvcmRELAogICAgICAiZXh0ZXJuIjoga2V5d29yZEQsICJvdmVycmlkZSI6IGtleXdvcmRELCAidmlydHVhbCI6IGtleXdvcmRELCAiYWJzdHJhY3QiOiBrZXl3b3JkRCwgCiAgICAgICJzdGF0aWMiOiBrZXl3b3JkRCwgIm91dCI6IGtleXdvcmRELCAicmVmIjoga2V5d29yZEQsICJjb25zdCI6IGtleXdvcmRELAogICAgICAKICAgICAgImZvcmVhY2giOiByZXN1bHQoImZvciIsICJrZXl3b3JkIiksICJ1c2luZyI6IGtleXdvcmRDLAogICAgICAKICAgICAgImludCI6IGtleXdvcmRELCAiZG91YmxlIjoga2V5d29yZEQsICJsb25nIjoga2V5d29yZEQsICJib29sIjoga2V5d29yZEQsICJjaGFyIjoga2V5d29yZEQsIAogICAgICAidm9pZCI6IGtleXdvcmRELCAic3RyaW5nIjoga2V5d29yZEQsICJieXRlIjoga2V5d29yZEQsICJzYnl0ZSI6IGtleXdvcmRELCAiZGVjaW1hbCI6IGtleXdvcmRELAogICAgICAiZmxvYXQiOiBrZXl3b3JkRCwgInVpbnQiOiBrZXl3b3JkRCwgInVsb25nIjoga2V5d29yZEQsICJvYmplY3QiOiBrZXl3b3JkRCwKICAgICAgInNob3J0Ijoga2V5d29yZEQsICJ1c2hvcnQiOiBrZXl3b3JkRCwKICAgICAgCiAgICAgICJnZXQiOiBrZXl3b3JkRCwgInNldCI6IGtleXdvcmRELCAidmFsdWUiOiBrZXl3b3JkRCAgICAgIAogICAgfTsKICB9KCk7CgogIC8vIFNvbWUgaGVscGVyIHJlZ2V4cHMKICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWytcLSomJT08PiE/fF0vOwogIHZhciBpc0hleERpZ2l0ID0gL1swLTlBLUZhLWZdLzsKICB2YXIgaXNXb3JkQ2hhciA9IC9bXHdcJF9dLzsKCiAgLy8gV3JhcHBlciBhcm91bmQganNUb2tlbiB0aGF0IGhlbHBzIG1haW50YWluIHBhcnNlciBzdGF0ZSAod2hldGhlcgogIC8vIHdlIGFyZSBpbnNpZGUgb2YgYSBtdWx0aS1saW5lIGNvbW1lbnQgYW5kIHdoZXRoZXIgdGhlIG5leHQgdG9rZW4KICAvLyBjb3VsZCBiZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbikuCiAgZnVuY3Rpb24ganNUb2tlblN0YXRlKGluc2lkZSwgcmVnZXhwKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgbmV3SW5zaWRlID0gaW5zaWRlOwogICAgICB2YXIgdHlwZSA9IGpzVG9rZW4oaW5zaWRlLCByZWdleHAsIHNvdXJjZSwgZnVuY3Rpb24oYykge25ld0luc2lkZSA9IGM7fSk7CiAgICAgIHZhciBuZXdSZWdleHAgPSB0eXBlLnR5cGUgPT0gIm9wZXJhdG9yIiB8fCB0eXBlLnR5cGUgPT0gImtleXdvcmQgYyIgfHwgdHlwZS50eXBlLm1hdGNoKC9eW1xbe31cKCw7Ol0kLyk7CiAgICAgIGlmIChuZXdSZWdleHAgIT0gcmVnZXhwIHx8IG5ld0luc2lkZSAhPSBpbnNpZGUpCiAgICAgICAgc2V0U3RhdGUoanNUb2tlblN0YXRlKG5ld0luc2lkZSwgbmV3UmVnZXhwKSk7CiAgICAgIHJldHVybiB0eXBlOwogICAgfTsKICB9CgogIC8vIFRoZSB0b2tlbiByZWFkZXIsIGludGVkZWQgdG8gYmUgdXNlZCBieSB0aGUgdG9rZW5pemVyIGZyb20KICAvLyB0b2tlbml6ZS5qcyAodGhyb3VnaCBqc1Rva2VuU3RhdGUpLiBBZHZhbmNlcyB0aGUgc291cmNlIHN0cmVhbQogIC8vIG92ZXIgYSB0b2tlbiwgYW5kIHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHR5cGUgYW5kIHN0eWxlCiAgLy8gb2YgdGhhdCB0b2tlbi4KICBmdW5jdGlvbiBqc1Rva2VuKGluc2lkZSwgcmVnZXhwLCBzb3VyY2UsIHNldEluc2lkZSkgewogICAgZnVuY3Rpb24gcmVhZEhleE51bWJlcigpewogICAgICBzb3VyY2UubmV4dCgpOyAvLyBza2lwIHRoZSAneCcKICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoaXNIZXhEaWdpdCk7CiAgICAgIHJldHVybiB7dHlwZTogIm51bWJlciIsIHN0eWxlOiAiY3NoYXJwLWF0b20ifTsKICAgIH0KCiAgICBmdW5jdGlvbiByZWFkTnVtYmVyKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvWzAtOV0vKTsKICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoIi4iKSl7CiAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvWzAtOV0vKTsKICAgICAgfQogICAgICBpZiAoc291cmNlLmVxdWFscygiZSIpIHx8IHNvdXJjZS5lcXVhbHMoIkUiKSl7CiAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICBpZiAoc291cmNlLmVxdWFscygiLSIpKQogICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvWzAtOV0vKTsKICAgICAgfQogICAgICByZXR1cm4ge3R5cGU6ICJudW1iZXIiLCBzdHlsZTogImNzaGFycC1hdG9tIn07CiAgICB9CiAgICAvLyBSZWFkIGEgd29yZCwgbG9vayBpdCB1cCBpbiBrZXl3b3Jkcy4gSWYgbm90IGZvdW5kLCBpdCBpcyBhCiAgICAvLyB2YXJpYWJsZSwgb3RoZXJ3aXNlIGl0IGlzIGEga2V5d29yZCBvZiB0aGUgdHlwZSBmb3VuZC4KICAgIGZ1bmN0aW9uIHJlYWRXb3JkKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc1dvcmRDaGFyKTsKICAgICAgdmFyIHdvcmQgPSBzb3VyY2UuZ2V0KCk7CiAgICAgIHZhciBrbm93biA9IGtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpICYmIGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpICYmIGtleXdvcmRzW3dvcmRdOwogICAgICByZXR1cm4ga25vd24gPyB7dHlwZToga25vd24udHlwZSwgc3R5bGU6IGtub3duLnN0eWxlLCBjb250ZW50OiB3b3JkfSA6CiAgICAgIHt0eXBlOiAidmFyaWFibGUiLCBzdHlsZTogImNzaGFycC12YXJpYWJsZSIsIGNvbnRlbnQ6IHdvcmR9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZFJlZ2V4cCgpIHsKICAgICAgbmV4dFVudGlsVW5lc2NhcGVkKHNvdXJjZSwgIi8iKTsKICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1tnaV0vKTsKICAgICAgcmV0dXJuIHt0eXBlOiAicmVnZXhwIiwgc3R5bGU6ICJjc2hhcnAtc3RyaW5nIn07CiAgICB9CiAgICAvLyBNdXRsaS1saW5lIGNvbW1lbnRzIGFyZSB0cmlja3kuIFdlIHdhbnQgdG8gcmV0dXJuIHRoZSBuZXdsaW5lcwogICAgLy8gZW1iZWRkZWQgaW4gdGhlbSBhcyByZWd1bGFyIG5ld2xpbmUgdG9rZW5zLCBhbmQgdGhlbiBjb250aW51ZQogICAgLy8gcmV0dXJuaW5nIGEgY29tbWVudCB0b2tlbiBmb3IgZXZlcnkgbGluZSBvZiB0aGUgY29tbWVudC4gU28KICAgIC8vIHNvbWUgc3RhdGUgaGFzIHRvIGJlIHNhdmVkIChpbnNpZGUpIHRvIGluZGljYXRlIHdoZXRoZXIgd2UgYXJlCiAgICAvLyBpbnNpZGUgYSAvKiAqLyBzZXF1ZW5jZS4KICAgIGZ1bmN0aW9uIHJlYWRNdWx0aWxpbmVDb21tZW50KHN0YXJ0KXsKICAgICAgdmFyIG5ld0luc2lkZSA9ICIvKiI7CiAgICAgIHZhciBtYXliZUVuZCA9IChzdGFydCA9PSAiKiIpOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGlmIChzb3VyY2UuZW5kT2ZMaW5lKCkpCiAgICAgICAgICBicmVhazsKICAgICAgICB2YXIgbmV4dCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgaWYgKG5leHQgPT0gIi8iICYmIG1heWJlRW5kKXsKICAgICAgICAgIG5ld0luc2lkZSA9IG51bGw7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgbWF5YmVFbmQgPSAobmV4dCA9PSAiKiIpOwogICAgICB9CiAgICAgIHNldEluc2lkZShuZXdJbnNpZGUpOwogICAgICByZXR1cm4ge3R5cGU6ICJjb21tZW50Iiwgc3R5bGU6ICJjc2hhcnAtY29tbWVudCJ9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZE9wZXJhdG9yKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc09wZXJhdG9yQ2hhcik7CiAgICAgIHJldHVybiB7dHlwZTogIm9wZXJhdG9yIiwgc3R5bGU6ICJjc2hhcnAtb3BlcmF0b3IifTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRTdHJpbmcocXVvdGUpIHsKICAgICAgdmFyIGVuZEJhY2tTbGFzaCA9IG5leHRVbnRpbFVuZXNjYXBlZChzb3VyY2UsIHF1b3RlKTsKICAgICAgc2V0SW5zaWRlKGVuZEJhY2tTbGFzaCA/IHF1b3RlIDogbnVsbCk7CiAgICAgIHJldHVybiB7dHlwZTogInN0cmluZyIsIHN0eWxlOiAiY3NoYXJwLXN0cmluZyJ9OwogICAgfQoKICAgIC8vIEZldGNoIHRoZSBuZXh0IHRva2VuLiBEaXNwYXRjaGVzIG9uIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUKICAgIC8vIHN0cmVhbSwgb3IgZmlyc3QgdHdvIGNoYXJhY3RlcnMgd2hlbiB0aGUgZmlyc3QgaXMgYSBzbGFzaC4KICAgIGlmIChpbnNpZGUgPT0gIlwiIiB8fCBpbnNpZGUgPT0gIiciKQogICAgICByZXR1cm4gcmVhZFN0cmluZyhpbnNpZGUpOwogICAgdmFyIGNoID0gc291cmNlLm5leHQoKTsKICAgIGlmIChpbnNpZGUgPT0gIi8qIikKICAgICAgcmV0dXJuIHJlYWRNdWx0aWxpbmVDb21tZW50KGNoKTsKICAgIGVsc2UgaWYgKGNoID09ICJcIiIgfHwgY2ggPT0gIiciKQogICAgICByZXR1cm4gcmVhZFN0cmluZyhjaCk7CiAgICAvLyB3aXRoIHB1bmN0dWF0aW9uLCB0aGUgdHlwZSBvZiB0aGUgdG9rZW4gaXMgdGhlIHN5bWJvbCBpdHNlbGYKICAgIGVsc2UgaWYgKC9bXFtcXXt9XChcKSw7XDpcLl0vLnRlc3QoY2gpKQogICAgICByZXR1cm4ge3R5cGU6IGNoLCBzdHlsZTogImNzaGFycC1wdW5jdHVhdGlvbiJ9OwogICAgZWxzZSBpZiAoY2ggPT0gIjAiICYmIChzb3VyY2UuZXF1YWxzKCJ4IikgfHwgc291cmNlLmVxdWFscygiWCIpKSkKICAgICAgcmV0dXJuIHJlYWRIZXhOdW1iZXIoKTsKICAgIGVsc2UgaWYgKC9bMC05XS8udGVzdChjaCkpCiAgICAgIHJldHVybiByZWFkTnVtYmVyKCk7CiAgICBlbHNlIGlmIChjaCA9PSAiLyIpewogICAgICBpZiAoc291cmNlLmVxdWFscygiKiIpKQogICAgICB7IHNvdXJjZS5uZXh0KCk7IHJldHVybiByZWFkTXVsdGlsaW5lQ29tbWVudChjaCk7IH0KICAgICAgZWxzZSBpZiAoc291cmNlLmVxdWFscygiLyIpKQogICAgICB7IG5leHRVbnRpbFVuZXNjYXBlZChzb3VyY2UsIG51bGwpOyByZXR1cm4ge3R5cGU6ICJjb21tZW50Iiwgc3R5bGU6ICJjc2hhcnAtY29tbWVudCJ9O30KICAgICAgZWxzZSBpZiAocmVnZXhwKQogICAgICAgIHJldHVybiByZWFkUmVnZXhwKCk7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gcmVhZE9wZXJhdG9yKCk7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiIyIpIHsgIC8vIHRyZWF0IGMjIHJlZ2lvbnMgbGlrZSBjb21tZW50cwogICAgICAgIG5leHRVbnRpbFVuZXNjYXBlZChzb3VyY2UsIG51bGwpOyByZXR1cm4ge3R5cGU6ICJjb21tZW50Iiwgc3R5bGU6ICJjc2hhcnAtY29tbWVudCJ9OwogICAgfQogICAgZWxzZSBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpCiAgICAgIHJldHVybiByZWFkT3BlcmF0b3IoKTsKICAgIGVsc2UKICAgICAgcmV0dXJuIHJlYWRXb3JkKCk7CiAgfQoKICAvLyBUaGUgZXh0ZXJuYWwgaW50ZXJmYWNlIHRvIHRoZSB0b2tlbml6ZXIuCiAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc3RhcnRTdGF0ZSkgewogICAgcmV0dXJuIHRva2VuaXplcihzb3VyY2UsIHN0YXJ0U3RhdGUgfHwganNUb2tlblN0YXRlKGZhbHNlLCB0cnVlKSk7CiAgfTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/groovy/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/groovy/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KICA8aGVhZD4NCiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vanMvY29kZW1pcnJvci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4NCiAgICA8dGl0bGU+Q29kZU1pcnJvcjogR3Jvb3Z5IGRlbW9uc3RyYXRpb248L3RpdGxlPg0KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL2Nzcy9kb2NzLmNzcyIvPg0KICA8L2hlYWQ+DQogIDxib2R5IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyI+DQoNCjxwPkRlbW9uc3RyYXRpb24gb2YgPGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+Q29kZU1pcnJvcjwvYT4ncyBHcm9vdnkgaGlnaGxpZ2h0ZXIuPC9wPg0KDQo8cD5DcmVhdGVkIGJ5IGVYbyBQbGF0Zm9ybSBTQVMgKDxhIGhyZWY9Imh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC0yLjEucGhwIj5saWNlbnNlPC9hPikuPC9wPg0KDQo8cD5Ob3RlIHRoYXQgdGhlIGZpbGVzIGZvciB0aGlzIHBhcnNlciBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIENvZGVNaXJyb3IgcmVwb3NpdG9yeSwgYnV0IGhhdmUgdG8gZmV0Y2hlZCBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9zdm4uZXhvcGxhdGZvcm0ub3JnLyI+c3ZuLmV4b3BsYXRmb3JtLm9yZzwvYT46PC9wPg0KDQo8dWw+DQogPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdm4uZXhvcGxhdGZvcm0ub3JnL3Byb2plY3RzL2d3dC90cnVuay9leG8uZ3d0ZnJhbWV3b3JrLmVkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2V4b3BsYXRmb3JtL2d3dGZyYW1ld29yay9lZGl0b3IvcHVibGljL2NvZGVtaXJyb3IvanMvdG9rZW5pemVncm9vdnkuanMiPnRva2VuaXplZ3Jvb3Z5LmpzPC9hPjwvbGk+DQogPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdm4uZXhvcGxhdGZvcm0ub3JnL3Byb2plY3RzL2d3dC90cnVuay9leG8uZ3d0ZnJhbWV3b3JrLmVkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2V4b3BsYXRmb3JtL2d3dGZyYW1ld29yay9lZGl0b3IvcHVibGljL2NvZGVtaXJyb3IvanMvcGFyc2Vncm9vdnkuanMiPnBhcnNlZ3Jvb3Z5LmpzPC9hPjwvbGk+DQogPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdm4uZXhvcGxhdGZvcm0ub3JnL3Byb2plY3RzL2d3dC90cnVuay9leG8uZ3d0ZnJhbWV3b3JrLmVkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2V4b3BsYXRmb3JtL2d3dGZyYW1ld29yay9lZGl0b3IvcHVibGljL2NvZGVtaXJyb3IvY3NzL2dyb292eWNvbG9ycy5jc3MiPmdyb292eS5jb2xvcnMuY3NzPC9hPjwvbGk+DQo8L3VsPg0KDQo8ZGl2IGNsYXNzPSJib3JkZXIiPg0KPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMjAiIHJvd3M9IjUwIj4NCi8vIHNpbXBsZSBncm9vdnkgc2NyaXB0DQppbXBvcnQgamF2YXgud3MucnMuUGF0aA0KaW1wb3J0IGphdmF4LndzLnJzLkdFVA0KaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbQ0KaW1wb3J0IGphdmF4LndzLnJzLlBPU1QNCg0KQFBhdGgoIi8iKQ0KcHVibGljIGNsYXNzIEhlbGxvV29ybGQgew0KICBAR0VUDQogIEBQYXRoKCJoZWxsb3dvcmxkL3tuYW1lfSIpDQogIHB1YmxpYyBTdHJpbmcgaGVsbG8oQFBhdGhQYXJhbSgibmFtZSIpIFN0cmluZyBuYW1lKSB7DQogICAgcmV0dXJuICJIZWxsbyAiICsgbmFtZQ0KICB9DQogIA0KICBAUE9TVA0KICBAUGF0aCgiaGVsbG93b3JsZC97bmFtZX0iKQ0KICBwdWJsaWMgU3RyaW5nIGhlbGxvMihAUGF0aFBhcmFtKCJuYW1lIikgU3RyaW5nIG5hbWUpIHsNCiAgICByZXR1cm4gIkhlbGxvICIgKyBuYW1lDQogIH0NCn0NCjwvdGV4dGFyZWE+DQo8L2Rpdj4NCg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoJ2NvZGUnLCB7DQogICAgaGVpZ2h0OiAiNDUwcHgiLA0KICAgIHBhcnNlcmZpbGU6IFsiaHR0cDovL3N2bi5leG9wbGF0Zm9ybS5vcmcvcHJvamVjdHMvZ3d0L3RydW5rL2V4by5nd3RmcmFtZXdvcmsuZWRpdG9yL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZXhvcGxhdGZvcm0vZ3d0ZnJhbWV3b3JrL2VkaXRvci9wdWJsaWMvY29kZW1pcnJvci9qcy9wYXJzZWdyb292eS5qcyIsICJodHRwOi8vc3ZuLmV4b3BsYXRmb3JtLm9yZy9wcm9qZWN0cy9nd3QvdHJ1bmsvZXhvLmd3dGZyYW1ld29yay5lZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL29yZy9leG9wbGF0Zm9ybS9nd3RmcmFtZXdvcmsvZWRpdG9yL3B1YmxpYy9jb2RlbWlycm9yL2pzL3Rva2VuaXplZ3Jvb3Z5LmpzIl0sDQogICAgc3R5bGVzaGVldDogImh0dHA6Ly9zdm4uZXhvcGxhdGZvcm0ub3JnL3Byb2plY3RzL2d3dC90cnVuay9leG8uZ3d0ZnJhbWV3b3JrLmVkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2V4b3BsYXRmb3JtL2d3dGZyYW1ld29yay9lZGl0b3IvcHVibGljL2NvZGVtaXJyb3IvY3NzL2dyb292eWNvbG9ycy5jc3MiLA0KICAgIHBhdGg6ICIuLi8uLi9qcy8iLA0KICAgIHRleHRXcmFwcGluZzogZmFsc2UNCiAgfSk7DQo8L3NjcmlwdD4NCg0KPC9ib2R5Pg0KPC9odG1sPg0K]]></data>
	</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[aHRtbCB7CiAgY3Vyc29yOiB0ZXh0Owp9CgouZWRpdGJveCB7CiAgbWFyZ2luOiAuNGVtOwogIHBhZGRpbmc6IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgY29sb3I6IGJsYWNrOwp9CgpwcmUuY29kZSwgLmVkaXRib3ggewogIGNvbG9yOiAjNjY2NjY2Owp9CgouZWRpdGJveCBwIHsKICBtYXJnaW46IDA7Cn0KCnNwYW4ubHVhLWNvbW1lbnQgewogIGNvbG9yOiAjQkI5OTc3Owp9CgpzcGFuLmx1YS1rZXl3b3JkIHsKICBmb250LXdlaWdodDogYm9sZDsKICBjb2xvcjogYmx1ZTsKfQoKc3Bhbi5sdWEtc3RyaW5nIHsKICBjb2xvcjogI0FBMjIyMjsKfQoKc3Bhbi5sdWEtc3RkZnVuYyB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgY29sb3I6ICMwNzc7Cn0Kc3Bhbi5sdWEtY3VzdG9tZnVuYyB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgY29sb3I6ICMwQUE7Cn0KCgpzcGFuLmx1YS1pZGVudGlmaWVyIHsKICBjb2xvcjogYmxhY2s7Cn0KCnNwYW4ubHVhLW51bWJlciB7CiAgY29sb3I6ICMzQTM7Cn0KCnNwYW4ubHVhLXRva2VuIHsKICBjb2xvcjogIzE1MTsKfQoKc3Bhbi5sdWEtZXJyb3IgewogIGNvbG9yOiAjRkZGOwogIGJhY2tncm91bmQtY29sb3I6ICNGMDA7Cn0KCgoKCg==]]></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+IiB8fCBjaCA9PSAiPCIgfHwgY2ggPT0gIigiIHx8IGNoID09ICIpIiB8fCBjaCA9PSAieyIgfHwgY2ggPT0gIn0iIHx8IGNoID09ICJbIiApIHsKICAgICAgICByZXR1cm4gImx1YS10b2tlbiI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIl0iIHx8IGNoID09ICI7IiB8fCBjaCA9PSAiOiIgfHwgY2ggPT0gIiwiKSB7CiAgICAgICAgcmV0dXJuICJsdWEtdG9rZW4iOwogICAgICB9CiAgICAgIGVsc2UgaWYgKHNvdXJjZS5lcXVhbHMoIj0iKSAmJiAoY2ggPT0gIn4iIHx8IGNoID09ICI8IiB8fCBjaCA9PSAiPiIpKSB7CiAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICByZXR1cm4gImx1YS10b2tlbiI7CiAgICAgIH0KCiAgICAgZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHcuJV0vKTsKICAgICAgICByZXR1cm4gImx1YS1udW1iZXIiOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHdcXFwtXy5dLyk7CiAgICAgICAgcmV0dXJuICJsdWEtaWRlbnRpZmllciI7CiAgICAgIH0KICAgIH0KIApmdW5jdGlvbiBpblNMQ29tbWVudChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBzdGFydCA9IHRydWU7Cgl2YXIgY291bnQ9MDsKICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKCSAJdmFyIGNoID0gc291cmNlLm5leHQoKTsKCQl2YXIgbGV2ZWwgPSAwOwoJCWlmICgoY2ggPT0iWyIpICYmIHN0YXJ0KXsKCQkJd2hpbGUoc291cmNlLmVxdWFscygiPSIpKXsKCQkJc291cmNlLm5leHQoKTsKCQkJbGV2ZWwrKzsKCQkJfQoJCQlpZiAoc291cmNlLmVxdWFscygiWyIpKXsKICAgICAgIAkJCQlzZXRTdGF0ZShpbk1MU29tZXRoaW5nKGxldmVsLCJsdWEtY29tbWVudCIpKTsKICAgICAgICAJCQlyZXR1cm4gbnVsbDsKICAJCQkJfQoJCSB9CgkJIHN0YXJ0ID0gZmFsc2U7CQoJfQoJc2V0U3RhdGUobm9ybWFsKTsgICAgICAJCQogICAgIHJldHVybiAibHVhLWNvbW1lbnQiOwoJCiAgICB9CgogICAgZnVuY3Rpb24gaW5NTFNvbWV0aGluZyhsZXZlbCx3aGF0KSB7CgkvL3dhdCBzaG9sdWQgYmUgImx1YS1zdHJpbmciIG9yICJsdWEtY29tbWVudCIsIGxldmVsIGlzIHRoZSBudW1iZXIgb2YgIj0iIGluIG9wZW5pbmcgbWFyay4KCXJldHVybiBmdW5jdGlvbihzb3VyY2UsIHNldFN0YXRlKXsKICAgICAgdmFyIGRhc2hlcyA9IDA7CiAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgdmFyIGNoID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAoZGFzaGVzID09IGxldmVsKzEgJiYgY2ggPT0gIl0iICkgewogICAgICAgICAgc2V0U3RhdGUobm9ybWFsKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCQlpZiAoZGFzaGVzID09IDApIAoJCQlkYXNoZXMgPSAoY2ggPT0gIl0iKSA/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+CiovCgpodG1sIHsKICBjdXJzb3I6IHRleHQ7Cn0KCi5lZGl0Ym94IHsKICBtYXJnaW46IC40ZW07CiAgcGFkZGluZzogMDsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMTBwdDsKfQoKLypXZSBzaG91bGQgZGVmaW5lIHNwZWNpZmljIHN0eWxlcyBmb3IgZXZlcnkgZWxlbWVudCBvZiB0aGUgc3ludGF4LgogIHRoZSBzZXR0aW5nIGJlbG93IHdpbGwgY2F1c2Ugc29tZSBhbm5veWluZyBjb2xvciB0byBzaG93IHRocm91Z2ggaWYgd2UgbWlzc2VkCiAgZGVmaW5pbmcgYSBzdHlsZSBmb3IgYSB0b2tlbi4gVGhpcyBpcyBhbHNvIHRoZSAiY29sb3IiIG9mIHRoZSB3aGl0ZXNwYWNlIGFuZAogIG9mIHRoZSBjdXJzb3IuCiovCnByZS5jb2RlLCAuZWRpdGJveCB7CiAgY29sb3I6IHJlZDsKfQoKLmVkaXRib3ggcCB7CiAgbWFyZ2luOiAwOwp9CgpzcGFuLnBocC1wdW5jdHVhdGlvbiB7CiAgY29sb3I6IGJsdWU7Cn0KCnNwYW4ucGhwLWtleXdvcmQgewogIGNvbG9yOiAjNzcwMDg4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgpzcGFuLnBocC1vcGVyYXRvciB7CiAgY29sb3I6IGJsdWU7Cn0KCi8qIF9fRklMRV9fIGV0Yy47IGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9yZXNlcnZlZC5waHAgKi8Kc3Bhbi5waHAtY29tcGlsZS10aW1lLWNvbnN0YW50IHsKICBjb2xvcjogIzc3NjA4ODsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLyogb3V0cHV0IG9mIGdldF9kZWZpbmVkX2NvbnN0YW50cygpLiBEaWZmZXJzIGZyb20gaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL3Jlc2VydmVkLmNvbnN0YW50cy5waHAgKi8Kc3Bhbi5waHAtcHJlZGVmaW5lZC1jb25zdGFudCB7CiAgY29sb3I6IGRhcmtncmVlbjsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLyogUEhQIHJlc2VydmVkICJsYW5ndWFnZSBjb25zdHJ1Y3RzIi4uLiBlY2hvKCkgZXRjLjsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL3Jlc2VydmVkLnBocCAqLwpzcGFuLnBocC1yZXNlcnZlZC1sYW5ndWFnZS1jb25zdHJ1Y3QgewogIGNvbG9yOiBncmVlbjsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLyogUEhQIGJ1aWx0LWluIGZ1bmN0aW9uczogZ2xvYigpLCBjaHIoKSBldGMuOyBvdXRwdXQgb2YgZ2V0X2RlZmluZWRfZnVuY3Rpb25zKClbImludGVybmFsIl0gKi8Kc3Bhbi5waHAtcHJlZGVmaW5lZC1mdW5jdGlvbiB7CiAgY29sb3I6IGdyZWVuOwp9CgovKiBQSFAgcHJlZGVmaW5lZCBjbGFzc2VzOiBQRE8sIEV4Y2VwdGlvbiBldGMuOyBvdXRwdXQgb2YgZ2V0X2RlY2xhcmVkX2NsYXNzZXMoKSBhbmQgZGlmZmVyZW50IGZyb20gaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL3Jlc2VydmVkLmNsYXNzZXMucGhwICovCnNwYW4ucGhwLXByZWRlZmluZWQtY2xhc3MgewogIGNvbG9yOiBncmVlbjsKfQoKc3Bhbi5waHAtYXRvbSB7CiAgY29sb3I6ICMyMjg4MTE7Cn0KCi8qIGNsYXNzLCBpbnRlcmZhY2UsIG5hbWVzcGFjZSBvciBmdW5jdGlvbiBuYW1lcywgYnV0IG5vdCAkdmFyaWFibGVzICovCnNwYW4ucGhwLXRfc3RyaW5nIHsKICBjb2xvcjogYmxhY2s7Cn0KCnNwYW4ucGhwLXZhcmlhYmxlIHsKICBjb2xvcjogYmxhY2s7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCgpzcGFuLmpzLWxvY2FsdmFyaWFibGUgewogIGNvbG9yOiAjMDA0NDk5Owp9CgpzcGFuLnBocC1jb21tZW50IHsKICBjb2xvcjogI0FBNzcwMDsKICBmb250LXN0cmV0Y2g6IGNvbmRlbnNlZDsKLyogIGZvbnQtc3R5bGU6IGl0YWxpYzsgIFRoaXMgY2F1c2VzIGxpbmUgaGVpZ2h0IHRvIHNsaWdodGx5IGNoYW5nZSwgZ2V0dGluZyBsaW5lIG51bWJlcnMgb3V0IG9mIHN5bmMgKi8KfQoKc3Bhbi5waHAtc3RyaW5nLXNpbmdsZS1xdW90ZWQgewogIGNvbG9yOiAjQUEyMjIyOwp9Ci8qIGRvdWJsZSBxdW90ZWQgc3RyaW5ncyBhbGxvdyBpbnRlcnBvbGF0aW9uICovCnNwYW4ucGhwLXN0cmluZy1kb3VibGUtcXVvdGVkIHsKICBjb2xvcjogI0FBMjIyMjsKICBmb250LXdlaWdodDogYm9sZDsKfQoKc3Bhbi5zeW50YXgtZXJyb3IgewogIGJhY2tncm91bmQtY29sb3I6IHJlZDsKfQoKc3Bhbi5kZXByZWNhdGVkIHsKICBmb250LXNpemU6IHNtYWxsZXI7Cn0K]]></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+dHJhbnMrbXlmdW5jKF9fTUVUSE9EX18pOwogICAgICAgICAgICAvKgogICAgICAgICAgICBlY2hvICdUaGlzIGlzIGEgdGVzdCc7IC8qIFRoaXMgY29tbWVudCB3aWxsIGNhdXNlIGEgcHJvYmxlbSAqLwogICAgICAgICAgICAqLwogICAgICAgIH0KICAgICAgICBzd2l0Y2goICR0eXBlICkgewogICAgICAgICAgICBjYXNlICJyM2NvcmVfQWRkVGVtcGxhdGVUb1RhcmdldEV2ZW50IjoKICAgICAgICAgICAgICAgICR0aGlzLT5ub3RpZnlBZGRUZW1wbGF0ZVRvVGFyZ2V0KCAkZ2VuZXZlbnQgKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJyM2NvcmVfR2VuZXJhdGVUYXJnZXRFdmVudCIgJHRoaXM6CiAgICAgICAgICAgICAgICBmb3IoJGk9MDsgJGk8PXRoaXMtPm1ldGhvZCgpOyAkaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgZWNobyAnU3ludGF4ICJoaWdobGlnaHRpbmciJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkYXJyYXkgeG9yICRsb2FkZXItPnBhcnNlX2ZuKCRmaWxlbmFtZSkgYXMgJGtleSA9PiB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgcjM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uICRlICkgewogICAgICAgICAgICAgICAgICAgIC8qKiByZXN0b3JlIHRoZSBiYWNrdXAKICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5sb2FkQWxsKCR0bXAsICRldmVudCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgLy8gYHBocCAtbGAgZG9lc24ndCBjb21wbGFpbiBhdCBhbGwgYXQgdGhpcyAoaXQgYXNzdW1lcyBzdHJpbmcgY29uc3RhbnRzKToKICAgICAgICAgICAgICAgICAgICB0aGlzICsgbWFrZXMgKiBubyAtIHNlbnNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZGVmYXVsdCBtb286CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcjNfdXRpbF9FeGNlcHRpb24oIGdldF9jbGFzcyggJGdlbmV2ZW50ICkgLiAiIGRvZXMgbm90IG1hcCIgKTsKICAgICAgICB9CgoKICAgIH07CiAgICAKICAgIGlmKCRzb21ldGhpbmc9PXRydWUpOgogICAgCSR0ZXN0ID0gJ3NvbWV0aGluZyc7CiAgICBlbmRpZjsKICAgIAogICAgZm9yKCRpPTA7JGk8MjAwMDskaSsrKToKICAgIAllY2hvICRpOwogICAgCSRrID0gJGsgKyAxOwogICAgZW5kZm9yOwogICAgCiAgICBmb3JlYWNoKGFycmF5KCdvbmUnLCd0d28nKSBhcyAka2V5ID0+ICR2YWx1ZSk6CiAgICAJZWNobyAkbnVtYmVyIC4gJyA9ICcuICRrZXk7CiAgICBlbmRmb3JlYWNoOwoKICAgIC8qIGZhaWxzIGlmIG5lc3RlZCAqLwogICAgaWYoJG5lc3RlZCA8IDApOgogICAgCWlmKCRmYWlsID4gMSk6CiAgICAJCWVjaG8gJ1RoaXMgZmFpbHMuLi4uJzsKICAgIAllbmRpZjsKICAgIGVuZGlmOwogICAgPz4KCiAgICA8cjM6Y3BocD4KICAgICAgICBwaHAoIndvcmtzIiwgJGhlcmUsIDIpOwogICAgPC9yMzpjcGhwPgoKICAgIDxyNDpjcGhwPgogICAgY2xhc3MgZm9vIHsKICAgICAgICAvLyBhIGNvbW1lbnQKICAgICAgICB2YXIgJGE7CiAgICAgICAgdmFyICRiOwogICAgfTsKICAgIDwvcjQ6Y3BocD4KCiAgPGgxPlRoaXMgaXMgYW4gPD9waHAgIyBlY2hvICdzaW1wbGUnOz8+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/IE1hdGguY2VpbChmcm9tKQogICAgICAgICA6IE1hdGguZmxvb3IoZnJvbSk7CiAgICBpZiAoZnJvbSA8IDApCiAgICAgIGZyb20gKz0gbGVuOwoKICAgIGZvciAoOyBmcm9tIDwgbGVuOyBmcm9tKyspCiAgICB7CiAgICAgIGlmIChmcm9tIGluIHRoaXMgJiYKICAgICAgICAgIHRoaXNbZnJvbV0gPT09IGVsdCkKICAgICAgICByZXR1cm4gZnJvbTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9Owp9CgoKdmFyIFBIUFBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgLy8gVG9rZW4gdHlwZXMgdGhhdCBjYW4gYmUgY29uc2lkZXJlZCB0byBiZSBhdG9tcywgcGFydCBvZiBvcGVyYXRvciBleHByZXNzaW9ucwogIHZhciBhdG9taWNUeXBlcyA9IHsKICAgICJhdG9tIjogdHJ1ZSwgIm51bWJlciI6IHRydWUsICJ2YXJpYWJsZSI6IHRydWUsICJzdHJpbmciOiB0cnVlCiAgfTsKICAvLyBDb25zdHJ1Y3RvciBmb3IgdGhlIGxleGljYWwgY29udGV4dCBvYmplY3RzLgogIGZ1bmN0aW9uIFBIUExleGljYWwoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYsIGluZm8pIHsKICAgIC8vIGluZGVudGF0aW9uIGF0IHN0YXJ0IG9mIHRoaXMgbGluZQogICAgdGhpcy5pbmRlbnRlZCA9IGluZGVudGVkOwogICAgLy8gY29sdW1uIGF0IHdoaWNoIHRoaXMgc2NvcGUgd2FzIG9wZW5lZAogICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICAvLyB0eXBlIG9mIHNjb3BlICgnc3RhdCcgKHN0YXRlbWVudCksICdmb3JtJyAoc3BlY2lhbCBmb3JtKSwgJ1snLCAneycsIG9yICcoJykKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICAvLyAnWycsICd7Jywgb3IgJygnIGJsb2NrcyB0aGF0IGhhdmUgYW55IHRleHQgYWZ0ZXIgdGhlaXIgb3BlbmluZwogICAgLy8gY2hhcmFjdGVyIGFyZSBzYWlkIHRvIGJlICdhbGlnbmVkJyAtLSBhbnkgbGluZXMgYmVsb3cgYXJlCiAgICAvLyBpbmRlbnRlZCBhbGwgdGhlIHdheSB0byB0aGUgb3BlbmluZyBjaGFyYWN0ZXIuCiAgICBpZiAoYWxpZ24gIT0gbnVsbCkKICAgICAgdGhpcy5hbGlnbiA9IGFsaWduOwogICAgLy8gUGFyZW50IHNjb3BlLCBpZiBhbnkuCiAgICB0aGlzLnByZXYgPSBwcmV2OwogICAgdGhpcy5pbmZvID0gaW5mbzsKICB9CgogIC8vIFBIUCBpbmRlbnRhdGlvbiBydWxlcwogIGZ1bmN0aW9uIGluZGVudFBIUChsZXhpY2FsKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oZmlyc3RDaGFycykgewogICAgICB2YXIgZmlyc3RDaGFyID0gZmlyc3RDaGFycyAmJiBmaXJzdENoYXJzLmNoYXJBdCgwKSwgdHlwZSA9IGxleGljYWwudHlwZTsKICAgICAgdmFyIGNsb3NpbmcgPSBmaXJzdENoYXIgPT0gdHlwZTsKICAgICAgaWYgKHR5cGUgPT0gImZvcm0iICYmIGZpcnN0Q2hhciA9PSAieyIpCiAgICAgICAgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQ7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInN0YXQiIHx8IHR5cGUgPT0gImZvcm0iKQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgaW5kZW50VW5pdDsKICAgICAgZWxzZSBpZiAobGV4aWNhbC5pbmZvID09ICJzd2l0Y2giICYmICFjbG9zaW5nKQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKC9eKD86Y2FzZXxkZWZhdWx0KVxiLy50ZXN0KGZpcnN0Q2hhcnMpID8gaW5kZW50VW5pdCA6IDIgKiBpbmRlbnRVbml0KTsKICAgICAgZWxzZSBpZiAobGV4aWNhbC5hbGlnbikKICAgICAgICByZXR1cm4gbGV4aWNhbC5jb2x1bW4gLSAoY2xvc2luZyA/IDEgOiAwKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICB9OwogIH0KCiAgLy8gVGhlIHBhcnNlci1pdGVyYXRvci1wcm9kdWNpbmcgZnVuY3Rpb24gaXRzZWxmLgogIGZ1bmN0aW9uIHBhcnNlUEhQKGlucHV0LCBiYXNlY29sdW1uKSB7CiAgICAvLyBXcmFwIHRoZSBpbnB1dCBpbiBhIHRva2VuIHN0cmVhbQogICAgdmFyIHRva2VucyA9IHRva2VuaXplUEhQKGlucHV0KTsKICAgIC8vIFRoZSBwYXJzZXIgc3RhdGUuIGNjIGlzIGEgc3RhY2sgb2YgYWN0aW9ucyB0aGF0IGhhdmUgdG8gYmUKICAgIC8vIHBlcmZvcm1lZCB0byBmaW5pc2ggdGhlIGN1cnJlbnQgc3RhdGVtZW50LiBGb3IgZXhhbXBsZSB3ZSBtaWdodAogICAgLy8ga25vdyB0aGF0IHdlIHN0aWxsIG5lZWQgdG8gZmluZCBhIGNsb3NpbmcgcGFyZW50aGVzaXMgYW5kIGEKICAgIC8vIHNlbWljb2xvbi4gQWN0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBzdGFjayBnbyBmaXJzdC4gSXQgaXMKICAgIC8vIGluaXRpYWxpemVkIHdpdGggYW4gaW5maW5pdGVseSBsb29waW5nIGFjdGlvbiB0aGF0IGNvbnN1bWVzCiAgICAvLyB3aG9sZSBzdGF0ZW1lbnRzLgogICAgdmFyIGNjID0gW3N0YXRlbWVudHNdOwogICAgLy8gVGhlIGxleGljYWwgc2NvcGUsIHVzZWQgbW9zdGx5IGZvciBpbmRlbnRhdGlvbi4KICAgIHZhciBsZXhpY2FsID0gbmV3IFBIUExleGljYWwoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAiYmxvY2siLCBmYWxzZSk7CiAgICAvLyBDdXJyZW50IGNvbHVtbiwgYW5kIHRoZSBpbmRlbnRhdGlvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQKICAgIC8vIGxpbmUuIFVzZWQgdG8gY3JlYXRlIGxleGljYWwgc2NvcGUgb2JqZWN0cy4KICAgIHZhciBjb2x1bW4gPSAwOwogICAgdmFyIGluZGVudGVkID0gMDsKICAgIC8vIFZhcmlhYmxlcyB3aGljaCBhcmUgdXNlZCBieSB0aGUgbWFyaywgY29udCwgYW5kIHBhc3MgZnVuY3Rpb25zCiAgICAvLyBiZWxvdyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBkcml2ZXIgbG9vcCBpbiB0aGUgJ25leHQnIGZ1bmN0aW9uLgogICAgdmFyIGNvbnN1bWUsIG1hcmtlZDsKCiAgICAvLyBUaGUgaXRlcmF0b3Igb2JqZWN0LgogICAgdmFyIHBhcnNlciA9IHtuZXh0OiBuZXh0LCBjb3B5OiBjb3B5fTsKCiAgICAvLyBwYXJzaW5nIGlzIGFjY29tcGxpc2hlZCBieSBjYWxsaW5nIG5leHQoKSByZXBlYXRlZGx5CiAgICBmdW5jdGlvbiBuZXh0KCl7CiAgICAgIC8vIFN0YXJ0IGJ5IHBlcmZvcm1pbmcgYW55ICdsZXhpY2FsJyBhY3Rpb25zIChhZGp1c3RpbmcgdGhlCiAgICAgIC8vIGxleGljYWwgdmFyaWFibGUpLCBvciB0aGUgb3BlcmF0aW9ucyBiZWxvdyB3aWxsIGJlIHdvcmtpbmcKICAgICAgLy8gd2l0aCB0aGUgd3JvbmcgbGV4aWNhbCBzdGF0ZS4KICAgICAgd2hpbGUoY2NbY2MubGVuZ3RoIC0gMV0ubGV4KQogICAgICAgIGNjLnBvcCgpKCk7CgogICAgICAvLyBGZXRjaCB0aGUgbmV4dCB0b2tlbi4KICAgICAgdmFyIHRva2VuID0gdG9rZW5zLm5leHQoKTsKCiAgICAgIC8vIEFkanVzdCBjb2x1bW4gYW5kIGluZGVudGVkLgogICAgICBpZiAodG9rZW4udHlwZSA9PSAid2hpdGVzcGFjZSIgJiYgY29sdW1uID09IDApCiAgICAgICAgaW5kZW50ZWQgPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgIGNvbHVtbiArPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgIGlmICh0b2tlbi5jb250ZW50ID09ICJcbiIpewogICAgICAgIGluZGVudGVkID0gY29sdW1uID0gMDsKICAgICAgICAvLyBJZiB0aGUgbGV4aWNhbCBzY29wZSdzIGFsaWduIHByb3BlcnR5IGlzIHN0aWxsIHVuZGVmaW5lZCBhdAogICAgICAgIC8vIHRoZSBlbmQgb2YgdGhlIGxpbmUsIGl0IGlzIGFuIHVuLWFsaWduZWQgc2NvcGUuCiAgICAgICAgaWYgKCEoImFsaWduIiBpbiBsZXhpY2FsKSkKICAgICAgICAgIGxleGljYWwuYWxpZ24gPSBmYWxzZTsKICAgICAgICAvLyBOZXdsaW5lIHRva2VucyBnZXQgYW4gaW5kZW50YXRpb24gZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoCiAgICAgICAgLy8gdGhlbS4KICAgICAgICB0b2tlbi5pbmRlbnRhdGlvbiA9IGluZGVudFBIUChsZXhpY2FsKTsKICAgICAgfQogICAgICAvLyBObyBtb3JlIHByb2Nlc3NpbmcgZm9yIG1lYW5pbmdsZXNzIHRva2Vucy4KICAgICAgaWYgKHRva2VuLnR5cGUgPT0gIndoaXRlc3BhY2UiIHx8IHRva2VuLnR5cGUgPT0gImNvbW1lbnQiCiAgICAgICAgfHwgdG9rZW4udHlwZSA9PSAic3RyaW5nX25vdF90ZXJtaW5hdGVkIiApCiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAvLyBXaGVuIGEgbWVhbmluZ2Z1bCB0b2tlbiBpcyBmb3VuZCBhbmQgdGhlIGxleGljYWwgc2NvcGUncwogICAgICAvLyBhbGlnbiBpcyB1bmRlZmluZWQsIGl0IGlzIGFuIGFsaWduZWQgc2NvcGUuCiAgICAgIGlmICghKCJhbGlnbiIgaW4gbGV4aWNhbCkpCiAgICAgICAgbGV4aWNhbC5hbGlnbiA9IHRydWU7CgogICAgICAvLyBFeGVjdXRlIGFjdGlvbnMgdW50aWwgb25lICdjb25zdW1lcycgdGhlIHRva2VuIGFuZCB3ZSBjYW4KICAgICAgLy8gcmV0dXJuIGl0LiAnbWFya2VkJyBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgc3R5bGUgb2YgdGhlIGN1cnJlbnQgdG9rZW4uCiAgICAgIHdoaWxlKHRydWUpIHsKICAgICAgICBjb25zdW1lID0gbWFya2VkID0gZmFsc2U7CiAgICAgICAgLy8gVGFrZSBhbmQgZXhlY3V0ZSB0aGUgdG9wbW9zdCBhY3Rpb24uCiAgICAgICAgdmFyIGFjdGlvbiA9IGNjLnBvcCgpOwogICAgICAgIGFjdGlvbih0b2tlbik7CgogICAgICAgIGlmIChjb25zdW1lKXsKICAgICAgICAgIGlmIChtYXJrZWQpCiAgICAgICAgICAgIHRva2VuLnN0eWxlID0gbWFya2VkOwogICAgICAgICAgLy8gSGVyZSB3ZSBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbG9jYWwgYW5kIGdsb2JhbCB2YXJpYWJsZXMuCiAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAxOyAvLyBGaXJlYnVnIHdvcmthcm91bmQgZm9yIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9mYnVnL2lzc3Vlcy9kZXRhaWw/aWQ9MTIzOSNjMQogICAgfQoKICAgIC8vIFRoaXMgbWFrZXMgYSBjb3B5IG9mIHRoZSBwYXJzZXIgc3RhdGUuIEl0IHN0b3JlcyBhbGwgdGhlCiAgICAvLyBzdGF0ZWZ1bCB2YXJpYWJsZXMgaW4gYSBjbG9zdXJlLCBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQKICAgIC8vIHdpbGwgcmVzdG9yZSB0aGVtIHdoZW4gY2FsbGVkIHdpdGggYSBuZXcgaW5wdXQgc3RyZWFtLiBOb3RlCiAgICAvLyB0aGF0IHRoZSBjYyBhcnJheSBoYXMgdG8gYmUgY29waWVkLCBiZWNhdXNlIGl0IGlzIGNvbnRhbnRseQogICAgLy8gYmVpbmcgbW9kaWZpZWQuIExleGljYWwgb2JqZWN0cyBhcmUgbm90IG11dGF0ZWQsIHNvIHRoZXkgY2FuCiAgICAvLyBiZSBzaGFyZWQgYmV0d2VlbiBydW5zIG9mIHRoZSBwYXJzZXIuCiAgICBmdW5jdGlvbiBjb3B5KCl7CiAgICAgIHZhciBfbGV4aWNhbCA9IGxleGljYWwsIF9jYyA9IGNjLmNvbmNhdChbXSksIF90b2tlblN0YXRlID0gdG9rZW5zLnN0YXRlOwoKICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvcHlQYXJzZXIoaW5wdXQpewogICAgICAgIGxleGljYWwgPSBfbGV4aWNhbDsKICAgICAgICBjYyA9IF9jYy5jb25jYXQoW10pOyAvLyBjb3BpZXMgdGhlIGFycmF5CiAgICAgICAgY29sdW1uID0gaW5kZW50ZWQgPSAwOwogICAgICAgIHRva2VucyA9IHRva2VuaXplUEhQKGlucHV0LCBfdG9rZW5TdGF0ZSk7CiAgICAgICAgcmV0dXJuIHBhcnNlcjsKICAgICAgfTsKICAgIH0KCiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHB1c2hpbmcgYSBudW1iZXIgb2YgYWN0aW9ucyBvbnRvIHRoZSBjYwogICAgLy8gc3RhY2sgaW4gcmV2ZXJzZSBvcmRlci4KICAgIGZ1bmN0aW9uIHB1c2goZnMpewogICAgICBmb3IgKHZhciBpID0gZnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgICAgY2MucHVzaChmc1tpXSk7CiAgICB9CiAgICAvLyBjb250IGFuZCBwYXNzIGFyZSB1c2VkIGJ5IHRoZSBhY3Rpb24gZnVuY3Rpb25zIHRvIGFkZCBvdGhlcgogICAgLy8gYWN0aW9ucyB0byB0aGUgc3RhY2suIGNvbnQgd2lsbCBjYXVzZSB0aGUgY3VycmVudCB0b2tlbiB0byBiZQogICAgLy8gY29uc3VtZWQsIHBhc3Mgd2lsbCBsZWF2ZSBpdCBmb3IgdGhlIG5leHQgYWN0aW9uLgogICAgZnVuY3Rpb24gY29udCgpewogICAgICBwdXNoKGFyZ3VtZW50cyk7CiAgICAgIGNvbnN1bWUgPSB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gcGFzcygpewogICAgICBwdXNoKGFyZ3VtZW50cyk7CiAgICAgIGNvbnN1bWUgPSBmYWxzZTsKICAgIH0KICAgIC8vIFVzZWQgdG8gY2hhbmdlIHRoZSBzdHlsZSBvZiB0aGUgY3VycmVudCB0b2tlbi4KICAgIGZ1bmN0aW9uIG1hcmsoc3R5bGUpewogICAgICBtYXJrZWQgPSBzdHlsZTsKICAgIH0KICAgIC8vIEFkZCBhIGx5ZXIgb2Ygc3R5bGUgdG8gdGhlIGN1cnJlbnQgdG9rZW4sIGZvciBleGFtcGxlIHN5bnRheC1lcnJvcgogICAgZnVuY3Rpb24gbWFya19hZGQoc3R5bGUpewogICAgICBtYXJrZWQgPSBtYXJrZWQgKyAnICcgKyBzdHlsZTsKICAgIH0KCiAgICAvLyBQdXNoIGEgbmV3IGxleGljYWwgY29udGV4dCBvZiB0aGUgZ2l2ZW4gdHlwZS4KICAgIGZ1bmN0aW9uIHB1c2hsZXgodHlwZSwgaW5mbykgewogICAgICB2YXIgcmVzdWx0ID0gZnVuY3Rpb24gcHVzaGxleGluZygpIHsKICAgICAgICBsZXhpY2FsID0gbmV3IFBIUExleGljYWwoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgbnVsbCwgbGV4aWNhbCwgaW5mbykKICAgICAgfTsKICAgICAgcmVzdWx0LmxleCA9IHRydWU7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvLyBQb3Agb2ZmIHRoZSBjdXJyZW50IGxleGljYWwgY29udGV4dC4KICAgIGZ1bmN0aW9uIHBvcGxleCgpewogICAgICBsZXhpY2FsID0gbGV4aWNhbC5wcmV2OwogICAgfQogICAgcG9wbGV4LmxleCA9IHRydWU7CiAgICAvLyBUaGUgJ2xleCcgZmxhZyBvbiB0aGVzZSBhY3Rpb25zIGlzIHVzZWQgYnkgdGhlICduZXh0JyBmdW5jdGlvbgogICAgLy8gdG8ga25vdyB0aGV5IGNhbiAoYW5kIGhhdmUgdG8pIGJlIHJhbiBiZWZvcmUgbW92aW5nIG9uIHRvIHRoZQogICAgLy8gbmV4dCB0b2tlbi4KCiAgICAvLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IGRpc2NhcmRzIHRva2VucyB1bnRpbCBpdCBmaW5kcyBvbmUgb2YKICAgIC8vIHRoZSBnaXZlbiB0eXBlLiBUaGlzIHdpbGwgaWdub3JlIChhbmQgcmVjb3ZlciBmcm9tKSBzeW50YXggZXJyb3JzLgogICAgZnVuY3Rpb24gZXhwZWN0KHdhbnRlZCl7CiAgICAgIHJldHVybiBmdW5jdGlvbiBleHBlY3RpbmcodG9rZW4pewogICAgICAgIGlmICh0b2tlbi50eXBlID09IHdhbnRlZCkgY29udCgpOyAgLy8gY29uc3VtZSB0aGUgdG9rZW4KICAgICAgICBlbHNlIHsKICAgICAgICAgIGNvbnQoYXJndW1lbnRzLmNhbGxlZSk7ICAvLyBjb250aW51ZSBleHBlY3RpbmcoKSAtIGNhbGwgaXRzZWxmCiAgICAgICAgfQogICAgICB9OwogICAgfQoKICAgIC8vIFJlcXVpcmUgYSBzcGVjaWZpYyB0b2tlbiB0eXBlLCBvciBvbmUgb2YgdGhlIHRva2VucyBwYXNzZWQgaW4gdGhlICd3YW50ZWQnIGFycmF5CiAgICAvLyBVc2VkIHRvIGRldGVjdCBibGF0YW50IHN5bnRheCBlcnJvcnMuICdleGVjdXRlJyBpcyB1c2VkIHRvIHBhc3MgZXh0cmEgY29kZQogICAgLy8gdG8gYmUgZXhlY3V0ZWQgaWYgdGhlIHRva2VuIGlzIG1hdGNoZWQuIEZvciBleGFtcGxlLCBhICcoJyBtYXRjaCBjb3VsZAogICAgLy8gJ2V4ZWN1dGUnIGEgY29udCggY29tcGFzZXAoZnVuY2FyZyksIHJlcXVpcmUoIikiKSApCiAgICBmdW5jdGlvbiByZXF1aXJlKHdhbnRlZCwgZXhlY3V0ZSl7CiAgICAgIHJldHVybiBmdW5jdGlvbiByZXF1aXJpbmcodG9rZW4pewogICAgICAgIHZhciBvazsKICAgICAgICB2YXIgdHlwZSA9IHRva2VuLnR5cGU7CiAgICAgICAgaWYgKHR5cGVvZih3YW50ZWQpID09ICJzdHJpbmciKQogICAgICAgICAgb2sgPSAodHlwZSA9PSB3YW50ZWQpIC0xOwogICAgICAgIGVsc2UKICAgICAgICAgIG9rID0gd2FudGVkLmluZGV4T2YodHlwZSk7CiAgICAgICAgaWYgKG9rID49IDApIHsKICAgICAgICAgIGlmIChleGVjdXRlICYmIHR5cGVvZihleGVjdXRlW29rXSkgPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgZXhlY3V0ZVtva10odG9rZW4pOwogICAgICAgICAgICBjb250KCk7ICAvLyBqdXN0IGNvbnN1bWUgdGhlIHRva2VuCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgaWYgKCFtYXJrZWQpIG1hcmsodG9rZW4uc3R5bGUpOwogICAgICAgICAgbWFya19hZGQoInN5bnRheC1lcnJvciIpOwogICAgICAgICAgY29udChhcmd1bWVudHMuY2FsbGVlKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgLy8gTG9va3MgZm9yIGEgc3RhdGVtZW50LCBhbmQgdGhlbiBjYWxscyBpdHNlbGYuCiAgICBmdW5jdGlvbiBzdGF0ZW1lbnRzKHRva2VuKXsKICAgICAgcmV0dXJuIHBhc3Moc3RhdGVtZW50LCBzdGF0ZW1lbnRzKTsKICAgIH0KICAgIC8vIERpc3BhdGNoZXMgdmFyaW91cyB0eXBlcyBvZiBzdGF0ZW1lbnRzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IHRva2VuLgogICAgZnVuY3Rpb24gc3RhdGVtZW50KHRva2VuKXsKICAgICAgdmFyIHR5cGUgPSB0b2tlbi50eXBlOwogICAgICBpZiAodHlwZSA9PSAia2V5d29yZCBhIikgY29udChwdXNobGV4KCJmb3JtIiksIGV4cHJlc3Npb24sIGFsdHN5bnRheCwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJrZXl3b3JkIGIiKSBjb250KHB1c2hsZXgoImZvcm0iKSwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJ7IikgY29udChwdXNobGV4KCJ9IiksIGJsb2NrLCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmdW5jdGlvbiIpIGZ1bmNkZWYoKTsKICAgICAgLy8gdGVjaG5pY2FsbHksICJjbGFzcyBpbXBsb2RlIHsuLi59IiBpcyBjb3JyZWN0LCBidXQgd2UnbGwgZmxhZyB0aGF0IGFzIGFuIGVycm9yIGJlY2F1c2UgaXQgb3ZlcnJpZGVzIGEgcHJlZGVmaW5lZCBmdW5jdGlvbgogICAgICBlbHNlIGlmICh0eXBlID09ICJjbGFzcyIpIGNsYXNzZGVmKCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImZvcmVhY2giKSBjb250KHB1c2hsZXgoImZvcm0iKSwgcmVxdWlyZSgiKCIpLCBwdXNobGV4KCIpIiksIGV4cHJlc3Npb24sIHJlcXVpcmUoImFzIiksIHJlcXVpcmUoInZhcmlhYmxlIiksIC8qID0+ICR2YWx1ZSAqLyBleHBlY3QoIikiKSwgYWx0c3ludGF4LCBwb3BsZXgsIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiZm9yIikgY29udChwdXNobGV4KCJmb3JtIiksIHJlcXVpcmUoIigiKSwgcHVzaGxleCgiKSIpLCBleHByZXNzaW9uLCByZXF1aXJlKCI7IiksIGV4cHJlc3Npb24sIHJlcXVpcmUoIjsiKSwgZXhwcmVzc2lvbiwgcmVxdWlyZSgiKSIpLCBhbHRzeW50YXgsIHBvcGxleCwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICAvLyBwdWJsaWMgZmluYWwgZnVuY3Rpb24gZm9vKCksIHByb3RlY3RlZCBzdGF0aWMgJGJhcjsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAibW9kaWZpZXIiKSBjb250KHJlcXVpcmUoWyJtb2RpZmllciIsICJ2YXJpYWJsZSIsICJmdW5jdGlvbiIsICJhYnN0cmFjdCJdLCBbbnVsbCwgbnVsbCwgZnVuY2RlZiwgYWJzZnVuXSkpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJhYnN0cmFjdCIpIGFicygpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJzd2l0Y2giKSBjb250KHB1c2hsZXgoImZvcm0iKSwgcmVxdWlyZSgiKCIpLCBleHByZXNzaW9uLCByZXF1aXJlKCIpIiksIHB1c2hsZXgoIn0iLCAic3dpdGNoIiksIHJlcXVpcmUoWyI6IiwgInsiXSksIGJsb2NrLCBwb3BsZXgsIHBvcGxleCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImNhc2UiKSBjb250KGV4cHJlc3Npb24sIHJlcXVpcmUoIjoiKSk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImRlZmF1bHQiKSBjb250KHJlcXVpcmUoIjoiKSk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImNhdGNoIikgY29udChwdXNobGV4KCJmb3JtIiksIHJlcXVpcmUoIigiKSwgcmVxdWlyZSgidF9zdHJpbmciKSwgcmVxdWlyZSgidmFyaWFibGUiKSwgcmVxdWlyZSgiKSIpLCBzdGF0ZW1lbnQsIHBvcGxleCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImNvbnN0IikgY29udChyZXF1aXJlKCJ0X3N0cmluZyIpKTsgIC8vICdjb25zdCBzdGF0aWMgeD01JyBpcyBhIHN5bnRheCBlcnJvcgogICAgICAvLyB0ZWNobmljYWxseSwgIm5hbWVzcGFjZSBpbXBsb2RlIHsuLi59IiBpcyBjb3JyZWN0LCBidXQgd2UnbGwgZmxhZyB0aGF0IGFzIGFuIGVycm9yIGJlY2F1c2UgaXQgb3ZlcnJpZGVzIGEgcHJlZGVmaW5lZCBmdW5jdGlvbgogICAgICBlbHNlIGlmICh0eXBlID09ICJuYW1lc3BhY2UiKSBjb250KG5hbWVzcGFjZWRlZiwgcmVxdWlyZSgiOyIpKTsKICAgICAgLy8gJHZhcmlhYmxlcyBtYXkgYmUgZm9sbG93ZWQgYnkgb3BlcmF0b3JzLCAoKSBmb3IgdmFyaWFibGUgZnVuY3Rpb24gY2FsbHMsIG9yIFtdIHN1YnNjcmlwdHMKICAgICAgZWxzZSBwYXNzKHB1c2hsZXgoInN0YXQiKSwgZXhwcmVzc2lvbiwgcmVxdWlyZSgiOyIpLCBwb3BsZXgpOwogICAgfQogICAgLy8gRGlzcGF0Y2ggZXhwcmVzc2lvbiB0eXBlcy4KICAgIGZ1bmN0aW9uIGV4cHJlc3Npb24odG9rZW4pewogICAgICB2YXIgdHlwZSA9IHRva2VuLnR5cGU7CiAgICAgIGlmIChhdG9taWNUeXBlcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgY29udChtYXliZW9wZXJhdG9yKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiPDw8IikgY29udChyZXF1aXJlKCJzdHJpbmciKSwgbWF5YmVvcGVyYXRvcik7ICAvLyBoZXJlZG9jL25vd2RvYwogICAgICBlbHNlIGlmICh0eXBlID09ICJ0X3N0cmluZyIpIGNvbnQobWF5YmVfZG91YmxlX2NvbG9uLCBtYXliZW9wZXJhdG9yKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAia2V5d29yZCBjIiB8fCB0eXBlID09ICJvcGVyYXRvciIpIGNvbnQoZXhwcmVzc2lvbik7CiAgICAgIC8vIGxhbWJkYQogICAgICBlbHNlIGlmICh0eXBlID09ICJmdW5jdGlvbiIpIGxhbWJkYWRlZigpOwogICAgICAvLyBmdW5jdGlvbiBjYWxsIG9yIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbjogJGEgPSAoJGIgKyAxKSAqIDI7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIigiKSBjb250KHB1c2hsZXgoIikiKSwgY29tbWFzZXAoZXhwcmVzc2lvbiksIHJlcXVpcmUoIikiKSwgcG9wbGV4LCBtYXliZW9wZXJhdG9yKTsKICAgIH0KICAgIC8vIENhbGxlZCBmb3IgcGxhY2VzIHdoZXJlIG9wZXJhdG9ycywgZnVuY3Rpb24gY2FsbHMsIG9yIHN1YnNjcmlwdHMgYXJlCiAgICAvLyB2YWxpZC4gV2lsbCBza2lwIG9uIHRvIHRoZSBuZXh0IGFjdGlvbiBpZiBub25lIGlzIGZvdW5kLgogICAgZnVuY3Rpb24gbWF5YmVvcGVyYXRvcih0b2tlbil7CiAgICAgIHZhciB0eXBlID0gdG9rZW4udHlwZTsKICAgICAgaWYgKHR5cGUgPT0gIm9wZXJhdG9yIikgewogICAgICAgIGlmICh0b2tlbi5jb250ZW50ID09ICI/IikgY29udChleHByZXNzaW9uLCByZXF1aXJlKCI6IiksIGV4cHJlc3Npb24pOyAgLy8gdGVybmFyeSBvcGVyYXRvcgogICAgICAgIGVsc2UgY29udChleHByZXNzaW9uKTsKICAgICAgfQogICAgICBlbHNlIGlmICh0eXBlID09ICIoIikgY29udChwdXNobGV4KCIpIiksIGV4cHJlc3Npb24sIGNvbW1hc2VwKGV4cHJlc3Npb24pLCByZXF1aXJlKCIpIiksIHBvcGxleCwgbWF5YmVvcGVyYXRvciAvKiAkdmFyZnVuYygpICsgMyAqLyk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIlsiKSBjb250KHB1c2hsZXgoIl0iKSwgZXhwcmVzc2lvbiwgcmVxdWlyZSgiXSIpLCBtYXliZW9wZXJhdG9yIC8qIGZvciBtdWx0aWRpbWVuc2lvbmFsIGFycmF5cywgb3IgJGZ1bmNbJGldKCkgKi8sIHBvcGxleCk7CiAgICB9CiAgICAvLyBBIHJlZ3VsYXIgdXNlIG9mIHRoZSBkb3VibGUgY29sb24gdG8gc3BlY2lmeSBhIGNsYXNzLCBhcyBpbiBzZWxmOjpmdW5jKCkgb3IgbXljbGFzczo6JHZhcjsKICAgIC8vIERpZmZlcnMgZnJvbSBgbmFtZXNwYWNlYCBvciBgdXNlYCBpbiB0aGF0IG9ubHkgb25lIGNsYXNzIGNhbiBiZSB0aGUgcGFyZW50OyBjaGFpbnMgKEE6OkI6OiR2YXIpIGFyZSBhIHN5bnRheCBlcnJvci4KICAgIGZ1bmN0aW9uIG1heWJlX2RvdWJsZV9jb2xvbih0b2tlbikgewogICAgICBpZiAodG9rZW4udHlwZSA9PSAidF9kb3VibGVfY29sb24iKQogICAgICAgIC8vIEE6OiR2YXIsIEE6OmZ1bmMoKSwgQTo6Y29uc3QKICAgICAgICBjb250KHJlcXVpcmUoWyJ0X3N0cmluZyIsICJ2YXJpYWJsZSJdKSwgbWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgewogICAgICAgIC8vIGEgdF9zdHJpbmcgd2Fzbid0IGZvbGxvd2VkIGJ5IDo6LCBzdWNoIGFzIGluIGEgZnVuY3Rpb24gY2FsbDogZm9vKCkKICAgICAgICBwYXNzKGV4cHJlc3Npb24pCiAgICAgIH0KICAgIH0KICAgIC8vIHRoZSBkZWNsYXJhdGlvbiBvciBkZWZpbml0aW9uIG9mIGEgZnVuY3Rpb24KICAgIGZ1bmN0aW9uIGZ1bmNkZWYoKSB7CiAgICAgIGNvbnQocmVxdWlyZSgidF9zdHJpbmciKSwgcmVxdWlyZSgiKCIpLCBwdXNobGV4KCIpIiksIGNvbW1hc2VwKGZ1bmNhcmcpLCByZXF1aXJlKCIpIiksIHBvcGxleCwgYmxvY2spOwogICAgfQogICAgLy8gdGhlIGRlY2xhcmF0aW9uIG9yIGRlZmluaXRpb24gb2YgYSBsYW1iZGEKICAgIGZ1bmN0aW9uIGxhbWJkYWRlZigpIHsKICAgICAgY29udChyZXF1aXJlKCIoIiksIHB1c2hsZXgoIikiKSwgY29tbWFzZXAoZnVuY2FyZyksIHJlcXVpcmUoIikiKSwgbWF5YmVfbGFtYmRhX3VzZSwgcG9wbGV4LCByZXF1aXJlKCJ7IiksIHB1c2hsZXgoIn0iKSwgYmxvY2ssIHBvcGxleCk7CiAgICB9CiAgICAvLyBvcHRpb25hbCBsYW1iZGEgJ3VzZScgc3RhdGVtZW50CiAgICBmdW5jdGlvbiBtYXliZV9sYW1iZGFfdXNlKHRva2VuKSB7CiAgICAgIGlmKHRva2VuLnR5cGUgPT0gIm5hbWVzcGFjZSIpIHsKICAgICAgICBjb250KHJlcXVpcmUoJygnKSwgY29tbWFzZXAoZnVuY2FyZyksIHJlcXVpcmUoJyknKSk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgcGFzcyhleHByZXNzaW9uKTsKICAgICAgfQogICAgfQogICAgLy8gdGhlIGRlZmluaXRpb24gb2YgYSBjbGFzcwogICAgZnVuY3Rpb24gY2xhc3NkZWYoKSB7CiAgICAgIGNvbnQocmVxdWlyZSgidF9zdHJpbmciKSwgZXhwZWN0KCJ7IiksIHB1c2hsZXgoIn0iKSwgYmxvY2ssIHBvcGxleCk7CiAgICB9CiAgICAvLyBlaXRoZXIgZnVuY2RlZiBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyAiZnVuY3Rpb24iLCBvciB0aGUga2V5d29yZCAiZnVuY3Rpb24iICsgZnVuY2RlZgogICAgZnVuY3Rpb24gYWJzZnVuKHRva2VuKSB7CiAgICAgIGlmKHRva2VuLnR5cGUgPT0gImZ1bmN0aW9uIikgZnVuY2RlZigpOwogICAgICBlbHNlIGNvbnQocmVxdWlyZShbImZ1bmN0aW9uIl0sIFtmdW5jZGVmXSkpOwogICAgfQogICAgLy8gdGhlIGFic3RyYWN0IGNsYXNzIG9yIGZ1bmN0aW9uICh3aXRoIG9wdGlvbmFsIG1vZGlmaWVyKQogICAgZnVuY3Rpb24gYWJzKHRva2VuKSB7CiAgICAgIGNvbnQocmVxdWlyZShbIm1vZGlmaWVyIiwgImZ1bmN0aW9uIiwgImNsYXNzIl0sIFthYnNmdW4sIGZ1bmNkZWYsIGNsYXNzZGVmXSkpOwogICAgfQogICAgLy8gUGFyc2VzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHRoaW5ncyB0aGF0IGFyZSByZWNvZ25pemVkCiAgICAvLyBieSB0aGUgJ3doYXQnIGFyZ3VtZW50LgogICAgZnVuY3Rpb24gY29tbWFzZXAod2hhdCl7CiAgICAgIGZ1bmN0aW9uIHByb2NlZWQodG9rZW4pIHsKICAgICAgICBpZiAodG9rZW4udHlwZSA9PSAiLCIpIGNvbnQod2hhdCwgcHJvY2VlZCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbW1hU2VwYXJhdGVkKCkgewogICAgICAgIHBhc3Mod2hhdCwgcHJvY2VlZCk7CiAgICAgIH07CiAgICB9CiAgICAvLyBMb29rIGZvciBzdGF0ZW1lbnRzIHVudGlsIGEgY2xvc2luZyBicmFjZSBpcyBmb3VuZC4KICAgIGZ1bmN0aW9uIGJsb2NrKHRva2VuKSB7CiAgICAgIGlmICh0b2tlbi50eXBlID09ICJ9IikgY29udCgpOwogICAgICBlbHNlIHBhc3Moc3RhdGVtZW50LCBibG9jayk7CiAgICB9CiAgICBmdW5jdGlvbiBlbXB0eV9wYXJlbnNfaWZfYXJyYXkodG9rZW4pIHsKICAgICAgaWYodG9rZW4uY29udGVudCA9PSAiYXJyYXkiKQogICAgICAgIGNvbnQocmVxdWlyZSgiKCIpLCByZXF1aXJlKCIpIikpOwogICAgfQogICAgZnVuY3Rpb24gbWF5YmVkZWZhdWx0cGFyYW1ldGVyKHRva2VuKXsKICAgICAgaWYgKHRva2VuLmNvbnRlbnQgPT0gIj0iKSBjb250KHJlcXVpcmUoWyJ0X3N0cmluZyIsICJzdHJpbmciLCAibnVtYmVyIl0sIFtlbXB0eV9wYXJlbnNfaWZfYXJyYXksIG51bGwsIG51bGxdKSk7CiAgICB9CiAgICBmdW5jdGlvbiB2YXJfb3JfcmVmZXJlbmNlKHRva2VuKSB7CiAgICAgIGlmKHRva2VuLnR5cGUgPT0gInZhcmlhYmxlIikgY29udChtYXliZWRlZmF1bHRwYXJhbWV0ZXIpOwogICAgICBlbHNlIGlmKHRva2VuLmNvbnRlbnQgPT0gIiYiKSBjb250KHJlcXVpcmUoInZhcmlhYmxlIiksIG1heWJlZGVmYXVsdHBhcmFtZXRlcik7CiAgICB9CiAgICAvLyBzdXBwb3J0IGZvciBkZWZhdWx0IGFyZ3VtZW50czogaHR0cDovL3VzLnBocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9ucy5hcmd1bWVudHMucGhwI2Z1bmN0aW9ucy5hcmd1bWVudHMuZGVmYXVsdAogICAgZnVuY3Rpb24gZnVuY2FyZyh0b2tlbil7CiAgICAgIC8vIGZ1bmN0aW9uIGZvbyhteWNsYXNzICRvYmopIHsuLi59IG9yIGZ1bmN0aW9uIGZvbyhteWNsYXNzICZvYmpyZWYpIHsuLi59CiAgICAgIGlmICh0b2tlbi50eXBlID09ICJ0X3N0cmluZyIpIGNvbnQodmFyX29yX3JlZmVyZW5jZSk7CiAgICAgIC8vIGZ1bmN0aW9uIGZvbygkdmFyKSB7Li4ufSBvciBmdW5jdGlvbiBmb28oJiRyZWYpIHsuLi59CiAgICAgIGVsc2UgdmFyX29yX3JlZmVyZW5jZSh0b2tlbik7CiAgICB9CgogICAgLy8gQSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBvciB1c2UKICAgIGZ1bmN0aW9uIG1heWJlX2RvdWJsZV9jb2xvbl9kZWYodG9rZW4pIHsKICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInRfZG91YmxlX2NvbG9uIikKICAgICAgICBjb250KG5hbWVzcGFjZWRlZik7CiAgICB9CiAgICBmdW5jdGlvbiBuYW1lc3BhY2VkZWYodG9rZW4pIHsKICAgICAgcGFzcyhyZXF1aXJlKCJ0X3N0cmluZyIpLCBtYXliZV9kb3VibGVfY29sb25fZGVmKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gYWx0c3ludGF4KHRva2VuKXsKICAgIAlpZih0b2tlbi5jb250ZW50PT0nOicpCiAgICAJCWNvbnQoYWx0c3ludGF4QmxvY2sscG9wbGV4KTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gYWx0c3ludGF4QmxvY2sodG9rZW4pewogICAgCWlmICh0b2tlbi50eXBlID09ICJhbHRzeW50YXhlbmQiKSBjb250KHJlcXVpcmUoJzsnKSk7CiAgICAgIGVsc2UgcGFzcyhzdGF0ZW1lbnQsIGFsdHN5bnRheEJsb2NrKTsKICAgIH0KCgogICAgcmV0dXJuIHBhcnNlcjsKICB9CgogIHJldHVybiB7bWFrZTogcGFyc2VQSFAsIGVsZWN0cmljQ2hhcnM6ICJ7fToifTsKCn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/js/parsephphtmlmixed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhlIGNvcHlyaWdodHMgZW1ib2RpZWQgaW4gdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGFyZSBsaWNlbnNlZCBieQpZYWhvbyEgSW5jLiB1bmRlciB0aGUgQlNEIChyZXZpc2VkKSBvcGVuIHNvdXJjZSBsaWNlbnNlCgpAYXV0aG9yIERhbiBWbGFkIERhc2NhbGVzY3UgPGRhbmR2QHlhaG9vLWluYy5jb20+CgpCYXNlZCBvbiBwYXJzZWh0bWxtaXhlZC5qcyBieSBNYXJpam4gSGF2ZXJiZWtlLgoqLwoKdmFyIFBIUEhUTUxNaXhlZFBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgdmFyIHByb2Nlc3NpbmdJbnN0cnVjdGlvbnMgPSBbIjw/cGhwIl07CgogIGlmICghKFBIUFBhcnNlciAmJiBDU1NQYXJzZXIgJiYgSlNQYXJzZXIgJiYgWE1MUGFyc2VyKSkKICAgIHRocm93IG5ldyBFcnJvcigiUEhQLCBDU1MsIEpTLCBhbmQgWE1MIHBhcnNlcnMgbXVzdCBiZSBsb2FkZWQgZm9yIFBIUCtIVE1MIG1peGVkIG1vZGUgdG8gd29yay4iKTsKICBYTUxQYXJzZXIuY29uZmlndXJlKHt1c2VIVE1MS2x1ZGdlczogdHJ1ZX0pOwoKICBmdW5jdGlvbiBwYXJzZU1peGVkKHN0cmVhbSkgewogICAgdmFyIGh0bWxQYXJzZXIgPSBYTUxQYXJzZXIubWFrZShzdHJlYW0pLCBsb2NhbFBhcnNlciA9IG51bGwsIGluVGFnID0gZmFsc2UsIHBocFBhcnNlclN0YXRlID0gbnVsbDsKICAgIHZhciBpdGVyID0ge25leHQ6IHRvcCwgY29weTogY29weX07CgogICAgZnVuY3Rpb24gdG9wKCkgewogICAgICB2YXIgdG9rZW4gPSBodG1sUGFyc2VyLm5leHQoKTsKICAgICAgaWYgKHRva2VuLmNvbnRlbnQgPT0gIjwiKQogICAgICAgIGluVGFnID0gdHJ1ZTsKICAgICAgZWxzZSBpZiAodG9rZW4uc3R5bGUgPT0gInhtbC10YWduYW1lIiAmJiBpblRhZyA9PT0gdHJ1ZSkKICAgICAgICBpblRhZyA9IHRva2VuLmNvbnRlbnQudG9Mb3dlckNhc2UoKTsKICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAieG1sLXByb2Nlc3NpbmciKSB7CiAgICAgICAgLy8gc2VlIGlmIHRoaXMgb3BlbnMgYSBQSFAgYmxvY2sKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb2Nlc3NpbmdJbnN0cnVjdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICBpZiAocHJvY2Vzc2luZ0luc3RydWN0aW9uc1tpXSA9PSB0b2tlbi5jb250ZW50KSB7CiAgICAgICAgICAgIGl0ZXIubmV4dCA9IGxvY2FsKFBIUFBhcnNlciwgIj8+Iik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICB9CiAgICAgIC8vICJ4bWwtcHJvY2Vzc2luZyIgdG9rZW5zIGFyZSBpZ25vcmVkLCBiZWNhdXNlIHRoZXkgc2hvdWxkIGJlIGhhbmRsZWQgYnkgYSBzcGVjaWZpYyBsb2NhbCBwYXJzZXIKICAgICAgZWxzZSBpZiAodG9rZW4uY29udGVudCA9PSAiPiIpIHsKICAgICAgICBpZiAoaW5UYWcgPT0gInNjcmlwdCIpCiAgICAgICAgICBpdGVyLm5leHQgPSBsb2NhbChKU1BhcnNlciwgIjwvc2NyaXB0Iik7CiAgICAgICAgZWxzZSBpZiAoaW5UYWcgPT0gInN0eWxlIikKICAgICAgICAgIGl0ZXIubmV4dCA9IGxvY2FsKENTU1BhcnNlciwgIjwvc3R5bGUiKTsKICAgICAgICBpblRhZyA9IGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0KICAgIGZ1bmN0aW9uIGxvY2FsKHBhcnNlciwgdGFnKSB7CiAgICAgIHZhciBiYXNlSW5kZW50ID0gaHRtbFBhcnNlci5pbmRlbnRhdGlvbigpOwogICAgICBpZiAocGFyc2VyID09IFBIUFBhcnNlciAmJiBwaHBQYXJzZXJTdGF0ZSkKICAgICAgICBsb2NhbFBhcnNlciA9IHBocFBhcnNlclN0YXRlKHN0cmVhbSk7CiAgICAgIGVsc2UKICAgICAgICBsb2NhbFBhcnNlciA9IHBhcnNlci5tYWtlKHN0cmVhbSwgYmFzZUluZGVudCArIGluZGVudFVuaXQpOwoKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChzdHJlYW0ubG9va0FoZWFkKHRhZywgZmFsc2UsIGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgaWYgKHBhcnNlciA9PSBQSFBQYXJzZXIpIHBocFBhcnNlclN0YXRlID0gbG9jYWxQYXJzZXIuY29weSgpOwogICAgICAgICAgbG9jYWxQYXJzZXIgPSBudWxsOwogICAgICAgICAgaXRlci5uZXh0ID0gdG9wOwogICAgICAgICAgcmV0dXJuIHRvcCgpOyAgLy8gcGFzcyB0aGUgZW5kaW5nIHRhZyB0byB0aGUgZW5jbG9zaW5nIHBhcnNlcgogICAgICAgIH0KCiAgICAgICAgdmFyIHRva2VuID0gbG9jYWxQYXJzZXIubmV4dCgpOwogICAgICAgIHZhciBsdCA9IHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCI8IiksIHN6ID0gTWF0aC5taW4odG9rZW4udmFsdWUubGVuZ3RoIC0gbHQsIHRhZy5sZW5ndGgpOwogICAgICAgIGlmIChsdCAhPSAtMSAmJiB0b2tlbi52YWx1ZS5zbGljZShsdCwgbHQgKyBzeikudG9Mb3dlckNhc2UoKSA9PSB0YWcuc2xpY2UoMCwgc3opICYmCiAgICAgICAgICAgIHN0cmVhbS5sb29rQWhlYWQodGFnLnNsaWNlKHN6KSwgZmFsc2UsIGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgc3RyZWFtLnB1c2godG9rZW4udmFsdWUuc2xpY2UobHQpKTsKICAgICAgICAgIHRva2VuLnZhbHVlID0gdG9rZW4udmFsdWUuc2xpY2UoMCwgbHQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRva2VuLmluZGVudGF0aW9uKSB7CiAgICAgICAgICB2YXIgb2xkSW5kZW50ID0gdG9rZW4uaW5kZW50YXRpb247CiAgICAgICAgICB0b2tlbi5pbmRlbnRhdGlvbiA9IGZ1bmN0aW9uKGNoYXJzKSB7CiAgICAgICAgICAgIGlmIChjaGFycyA9PSAiPC8iKQogICAgICAgICAgICAgIHJldHVybiBiYXNlSW5kZW50OwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgcmV0dXJuIG9sZEluZGVudChjaGFycyk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY29weSgpIHsKICAgICAgdmFyIF9odG1sID0gaHRtbFBhcnNlci5jb3B5KCksIF9sb2NhbCA9IGxvY2FsUGFyc2VyICYmIGxvY2FsUGFyc2VyLmNvcHkoKSwKICAgICAgICAgIF9uZXh0ID0gaXRlci5uZXh0LCBfaW5UYWcgPSBpblRhZywgX3BocCA9IHBocFBhcnNlclN0YXRlOwogICAgICByZXR1cm4gZnVuY3Rpb24oX3N0cmVhbSkgewogICAgICAgIHN0cmVhbSA9IF9zdHJlYW07CiAgICAgICAgaHRtbFBhcnNlciA9IF9odG1sKF9zdHJlYW0pOwogICAgICAgIGxvY2FsUGFyc2VyID0gX2xvY2FsICYmIF9sb2NhbChfc3RyZWFtKTsKICAgICAgICBwaHBQYXJzZXJTdGF0ZSA9IF9waHA7CiAgICAgICAgaXRlci5uZXh0ID0gX25leHQ7CiAgICAgICAgaW5UYWcgPSBfaW5UYWc7CiAgICAgICAgcmV0dXJuIGl0ZXI7CiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gaXRlcjsKICB9CgogIHJldHVybiB7CiAgICBtYWtlOiBwYXJzZU1peGVkLAogICAgZWxlY3RyaWNDaGFyczogInt9LzoiLAogICAgY29uZmlndXJlOiBmdW5jdGlvbihjb25mKSB7CiAgICAgIGlmIChjb25mLm9wZW5pbmcgIT0gbnVsbCkgcHJvY2Vzc2luZ0luc3RydWN0aW9ucyA9IGNvbmYub3BlbmluZzsKICAgIH0KICB9OwoKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/js/tokenizephp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgWWFob28hIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuClRoZSBjb3B5cmlnaHRzIGVtYm9kaWVkIGluIHRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBhcmUgbGljZW5zZWQgYnkKWWFob28hIEluYy4gdW5kZXIgdGhlIEJTRCAocmV2aXNlZCkgb3BlbiBzb3VyY2UgbGljZW5zZQoKQGF1dGhvciBWbGFkIERhbiBEYXNjYWxlc2N1IDxkYW5kdkB5YWhvby1pbmMuY29tPgoKClRva2VuaXplciBmb3IgUEhQIGNvZGUKClJlZmVyZW5jZXM6CiAgKyBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vcmVzZXJ2ZWQucGhwCiAgKyBodHRwOi8vcGhwLm5ldC90b2tlbnMKICArIGdldF9kZWZpbmVkX2NvbnN0YW50cygpLCBnZXRfZGVmaW5lZF9mdW5jdGlvbnMoKSwgZ2V0X2RlY2xhcmVkX2NsYXNzZXMoKQogICAgICBleGVjdXRlZCBvbiBhIHJlYWxpc3RpYyAobm90IHZhbmlsbGEpIFBIUCBpbnN0YWxsYXRpb24gd2l0aCB0eXBpY2FsIExBTVAgbW9kdWxlcy4KICAgICAgU3BlY2lmaWNhbGx5LCB0aGUgUEhQIGJ1bmRsZWQgd2l0aCB0aGUgVW5pZm9ybSBXZWIgU2VydmVyICh3d3cudW5pZm9ybXNlcnZlci5jb20pLgoKKi8KCgovLyBhZGQgdGhlIGZvckVhY2ggbWV0aG9kIGZvciBKUyBlbmdpbmVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCAoZS5nLiBJRSkKLy8gY29kZSBmcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL0VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlOk9iamVjdHM6QXJyYXk6Zm9yRWFjaAppZiAoIUFycmF5LnByb3RvdHlwZS5mb3JFYWNoKQp7CiAgQXJyYXkucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihmdW4gLyosIHRoaXNwKi8pCiAgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgaWYgKHR5cGVvZiBmdW4gIT0gImZ1bmN0aW9uIikKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOwoKICAgIHZhciB0aGlzcCA9IGFyZ3VtZW50c1sxXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspCiAgICB7CiAgICAgIGlmIChpIGluIHRoaXMpCiAgICAgICAgZnVuLmNhbGwodGhpc3AsIHRoaXNbaV0sIGksIHRoaXMpOwogICAgfQogIH07Cn0KCgp2YXIgdG9rZW5pemVQSFAgPSAoZnVuY3Rpb24oKSB7CiAgLyogQSBtYXAgb2YgUEhQJ3MgcmVzZXJ2ZWQgd29yZHMgKGtleXdvcmRzLCBwcmVkZWZpbmVkIGNsYXNzZXMsIGZ1bmN0aW9ucyBhbmQKICAgICBjb25zdGFudHMuIEVhY2ggdG9rZW4gaGFzIGEgdHlwZSAoJ2tleXdvcmQnLCAnb3BlcmF0b3InIGV0Yy4pIGFuZCBhIHN0eWxlLgogICAgIFRoZSBzdHlsZSBjb3JyZXNwb25kcyB0byB0aGUgQ1NTIHNwYW4gY2xhc3MgaW4gcGhwY29sb3JzLmNzcy4KCiAgICAgS2V5d29yZHMgY2FuIGJlIG9mIHRocmVlIHR5cGVzOgogICAgIGEgLSB0YWtlcyBhbiBleHByZXNzaW9uIGFuZCBmb3JtcyBhIHN0YXRlbWVudCAtIGUuZy4gaWYKICAgICBiIC0gdGFrZXMganVzdCBhIHN0YXRlbWVudCAtIGUuZy4gZWxzZQogICAgIGMgLSB0YWtlcyBhbiBvcHRpbm9hbCBleHByZXNzaW9uLCBidXQgbm8gc3RhdGVtZW50IC0gZS5nLiByZXR1cm4KICAgICBUaGlzIGRpc3RpbmN0aW9uIGdpdmVzIHRoZSBwYXJzZXIgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHBhcnNlCiAgICAgY29ycmVjdCBjb2RlIGNvcnJlY3RseSAod2UgZG9uJ3QgY2FyZSB0aGF0IG11Y2ggaG93IHdlIHBhcnNlCiAgICAgaW5jb3JyZWN0IGNvZGUpLgoKICAgICBSZWZlcmVuY2U6IGh0dHA6Ly91cy5waHAubmV0L21hbnVhbC9lbi9yZXNlcnZlZC5waHAKICAqLwogIHZhciBrZXl3b3JkcyA9IGZ1bmN0aW9uKCl7CiAgICBmdW5jdGlvbiB0b2tlbih0eXBlLCBzdHlsZSl7CiAgICAgIHJldHVybiB7dHlwZTogdHlwZSwgc3R5bGU6IHN0eWxlfTsKICAgIH0KICAgIHZhciByZXN1bHQgPSB7fTsKCiAgICAvLyBmb3IgZWFjaCh2YXIgZWxlbWVudCBpbiBbIi4uLiIsICIuLi4iXSkgY2FuIHBpY2sgdXAgZWxlbWVudHMgYWRkZWQgdG8KICAgIC8vIEFycmF5LnByb3RvdHlwZSwgc28gd2UnbGwgdXNlIHRoZSBsb29wIHN0cnVjdHVyZSBiZWxvdy4gU2VlIGFsc28KICAgIC8vIGh0dHA6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vQ29yZV9KYXZhU2NyaXB0XzEuNV9SZWZlcmVuY2UvU3RhdGVtZW50cy9mb3JfZWFjaC4uLmluCgogICAgLy8ga2V5d29yZHMgdGhhdCB0YWtlIGFuIGV4cHJlc3Npb24gYW5kIGZvcm0gYSBzdGF0ZW1lbnQKICAgIFsiaWYiLCAiZWxzZWlmIiwgIndoaWxlIiwgImRlY2xhcmUiXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigia2V5d29yZCBhIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICAvLyBrZXl3b3JkcyB0aGF0IHRha2UganVzdCBhIHN0YXRlbWVudAogICAgWyJkbyIsICJlbHNlIiwgInRyeSIgXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigia2V5d29yZCBiIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICAvLyBrZXl3b3JkcyB0aGF0IHRha2UgYW4gb3B0aW9uYWwgZXhwcmVzc2lvbiwgYnV0IG5vIHN0YXRlbWVudAogICAgWyJyZXR1cm4iLCAiYnJlYWsiLCAiY29udGludWUiLCAgLy8gdGhlIGV4cHJlc3Npb24gaXMgb3B0aW9uYWwKICAgICAgIm5ldyIsICJjbG9uZSIsICJ0aHJvdyIgIC8vIHRoZSBleHByZXNzaW9uIGlzIG1hbmRhdG9yeQogICAgXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigia2V5d29yZCBjIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICBbIl9fQ0xBU1NfXyIsICJfX0RJUl9fIiwgIl9fRklMRV9fIiwgIl9fRlVOQ1RJT05fXyIsICJfX01FVEhPRF9fIiwgIl9fTkFNRVNQQUNFX18iXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigiYXRvbSIsICJwaHAtY29tcGlsZS10aW1lLWNvbnN0YW50Iik7CiAgICB9KTsKCiAgICBbInRydWUiLCAiZmFsc2UiLCAibnVsbCJdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJhdG9tIiwgInBocC1hdG9tIik7CiAgICB9KTsKCiAgICBbImFuZCIsICJvciIsICJ4b3IiLCAiaW5zdGFuY2VvZiJdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJvcGVyYXRvciIsICJwaHAta2V5d29yZCBwaHAtb3BlcmF0b3IiKTsKICAgIH0pOwoKICAgIFsiY2xhc3MiLCAiaW50ZXJmYWNlIl0uZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCwgYXJyYXkpIHsKICAgICAgcmVzdWx0W2VsZW1lbnRdID0gdG9rZW4oImNsYXNzIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKICAgIFsibmFtZXNwYWNlIiwgInVzZSIsICJleHRlbmRzIiwgImltcGxlbWVudHMiXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigibmFtZXNwYWNlIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICAvLyByZXNlcnZlZCAibGFuZ3VhZ2UgY29uc3RydWN0cyIuLi4gaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL3Jlc2VydmVkLnBocAogICAgWyAiZGllIiwgImVjaG8iLCAiZW1wdHkiLCAiZXhpdCIsICJldmFsIiwgImluY2x1ZGUiLCAiaW5jbHVkZV9vbmNlIiwgImlzc2V0IiwKICAgICAgImxpc3QiLCAicmVxdWlyZSIsICJyZXF1aXJlX29uY2UiLCAicmV0dXJuIiwgInByaW50IiwgInVuc2V0IiwKICAgICAgImFycmF5IiAvLyBhIGtleXdvcmQgcmF0aGVyLCBidXQgbWFuZGF0ZXMgYSBwYXJlbnRoZXNpemVkIHBhcmFtZXRlciBsaXN0CiAgICBdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJ0X3N0cmluZyIsICJwaHAtcmVzZXJ2ZWQtbGFuZ3VhZ2UtY29uc3RydWN0Iik7CiAgICB9KTsKCiAgICByZXN1bHRbInN3aXRjaCJdID0gdG9rZW4oInN3aXRjaCIsICJwaHAta2V5d29yZCIpOwogICAgcmVzdWx0WyJjYXNlIl0gPSB0b2tlbigiY2FzZSIsICJwaHAta2V5d29yZCIpOwogICAgcmVzdWx0WyJkZWZhdWx0Il0gPSB0b2tlbigiZGVmYXVsdCIsICJwaHAta2V5d29yZCIpOwogICAgcmVzdWx0WyJjYXRjaCJdID0gdG9rZW4oImNhdGNoIiwgInBocC1rZXl3b3JkIik7CiAgICByZXN1bHRbImZ1bmN0aW9uIl0gPSB0b2tlbigiZnVuY3Rpb24iLCAicGhwLWtleXdvcmQiKTsKCiAgICAvLyBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vY29udHJvbC1zdHJ1Y3R1cmVzLmFsdGVybmF0aXZlLXN5bnRheC5waHAgbXVzdCBiZSBmb2xsb3dlZCBieSBhICc6JwogICAgWyJlbmRpZiIsICJlbmR3aGlsZSIsICJlbmRmb3IiLCAiZW5kZm9yZWFjaCIsICJlbmRzd2l0Y2giLCAiZW5kZGVjbGFyZSJdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJhbHRzeW50YXhlbmQiLCAicGhwLWtleXdvcmQiKTsKICAgIH0pOwoKICAgIHJlc3VsdFsiY29uc3QiXSA9IHRva2VuKCJjb25zdCIsICJwaHAta2V5d29yZCIpOwoKICAgIFsiZmluYWwiLCAicHJpdmF0ZSIsICJwcm90ZWN0ZWQiLCAicHVibGljIiwgImdsb2JhbCIsICJzdGF0aWMiXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigibW9kaWZpZXIiLCAicGhwLWtleXdvcmQiKTsKICAgIH0pOwogICAgcmVzdWx0WyJ2YXIiXSA9IHRva2VuKCJtb2RpZmllciIsICJwaHAta2V5d29yZCBkZXByZWNhdGVkIik7CiAgICByZXN1bHRbImFic3RyYWN0Il0gPSB0b2tlbigiYWJzdHJhY3QiLCAicGhwLWtleXdvcmQiKTsKCiAgICByZXN1bHRbImZvcmVhY2giXSA9IHRva2VuKCJmb3JlYWNoIiwgInBocC1rZXl3b3JkIik7CiAgICByZXN1bHRbImFzIl0gPSB0b2tlbigiYXMiLCAicGhwLWtleXdvcmQiKTsKICAgIHJlc3VsdFsiZm9yIl0gPSB0b2tlbigiZm9yIiwgInBocC1rZXl3b3JkIik7CgogICAgLy8gUEhQIGJ1aWx0LWluIGZ1bmN0aW9ucyAtIG91dHB1dCBvZiBnZXRfZGVmaW5lZF9mdW5jdGlvbnMoKVsiaW50ZXJuYWwiXQogICAgWyAiemVuZF92ZXJzaW9uIiwgImZ1bmNfbnVtX2FyZ3MiLCAiZnVuY19nZXRfYXJnIiwgImZ1bmNfZ2V0X2FyZ3MiLCAic3RybGVuIiwKICAgICAgInN0cmNtcCIsICJzdHJuY21wIiwgInN0cmNhc2VjbXAiLCAic3RybmNhc2VjbXAiLCAiZWFjaCIsICJlcnJvcl9yZXBvcnRpbmciLAogICAgICAiZGVmaW5lIiwgImRlZmluZWQiLCAiZ2V0X2NsYXNzIiwgImdldF9wYXJlbnRfY2xhc3MiLCAibWV0aG9kX2V4aXN0cyIsCiAgICAgICJwcm9wZXJ0eV9leGlzdHMiLCAiY2xhc3NfZXhpc3RzIiwgImludGVyZmFjZV9leGlzdHMiLCAiZnVuY3Rpb25fZXhpc3RzIiwKICAgICAgImdldF9pbmNsdWRlZF9maWxlcyIsICJnZXRfcmVxdWlyZWRfZmlsZXMiLCAiaXNfc3ViY2xhc3Nfb2YiLCAiaXNfYSIsCiAgICAgICJnZXRfY2xhc3NfdmFycyIsICJnZXRfb2JqZWN0X3ZhcnMiLCAiZ2V0X2NsYXNzX21ldGhvZHMiLCAidHJpZ2dlcl9lcnJvciIsCiAgICAgICJ1c2VyX2Vycm9yIiwgInNldF9lcnJvcl9oYW5kbGVyIiwgInJlc3RvcmVfZXJyb3JfaGFuZGxlciIsCiAgICAgICJzZXRfZXhjZXB0aW9uX2hhbmRsZXIiLCAicmVzdG9yZV9leGNlcHRpb25faGFuZGxlciIsICJnZXRfZGVjbGFyZWRfY2xhc3NlcyIsCiAgICAgICJnZXRfZGVjbGFyZWRfaW50ZXJmYWNlcyIsICJnZXRfZGVmaW5lZF9mdW5jdGlvbnMiLCAiZ2V0X2RlZmluZWRfdmFycyIsCiAgICAgICJjcmVhdGVfZnVuY3Rpb24iLCAiZ2V0X3Jlc291cmNlX3R5cGUiLCAiZ2V0X2xvYWRlZF9leHRlbnNpb25zIiwKICAgICAgImV4dGVuc2lvbl9sb2FkZWQiLCAiZ2V0X2V4dGVuc2lvbl9mdW5jcyIsICJnZXRfZGVmaW5lZF9jb25zdGFudHMiLAogICAgICAiZGVidWdfYmFja3RyYWNlIiwgImRlYnVnX3ByaW50X2JhY2t0cmFjZSIsICJiY2FkZCIsICJiY3N1YiIsICJiY211bCIsICJiY2RpdiIsCiAgICAgICJiY21vZCIsICJiY3BvdyIsICJiY3NxcnQiLCAiYmNzY2FsZSIsICJiY2NvbXAiLCAiYmNwb3dtb2QiLCAiamR0b2dyZWdvcmlhbiIsCiAgICAgICJncmVnb3JpYW50b2pkIiwgImpkdG9qdWxpYW4iLCAianVsaWFudG9qZCIsICJqZHRvamV3aXNoIiwgImpld2lzaHRvamQiLAogICAgICAiamR0b2ZyZW5jaCIsICJmcmVuY2h0b2pkIiwgImpkZGF5b2Z3ZWVrIiwgImpkbW9udGhuYW1lIiwgImVhc3Rlcl9kYXRlIiwKICAgICAgImVhc3Rlcl9kYXlzIiwgInVuaXh0b2pkIiwgImpkdG91bml4IiwgImNhbF90b19qZCIsICJjYWxfZnJvbV9qZCIsCiAgICAgICJjYWxfZGF5c19pbl9tb250aCIsICJjYWxfaW5mbyIsICJ2YXJpYW50X3NldCIsICJ2YXJpYW50X2FkZCIsICJ2YXJpYW50X2NhdCIsCiAgICAgICJ2YXJpYW50X3N1YiIsICJ2YXJpYW50X211bCIsICJ2YXJpYW50X2FuZCIsICJ2YXJpYW50X2RpdiIsICJ2YXJpYW50X2VxdiIsCiAgICAgICJ2YXJpYW50X2lkaXYiLCAidmFyaWFudF9pbXAiLCAidmFyaWFudF9tb2QiLCAidmFyaWFudF9vciIsICJ2YXJpYW50X3BvdyIsCiAgICAgICJ2YXJpYW50X3hvciIsICJ2YXJpYW50X2FicyIsICJ2YXJpYW50X2ZpeCIsICJ2YXJpYW50X2ludCIsICJ2YXJpYW50X25lZyIsCiAgICAgICJ2YXJpYW50X25vdCIsICJ2YXJpYW50X3JvdW5kIiwgInZhcmlhbnRfY21wIiwgInZhcmlhbnRfZGF0ZV90b190aW1lc3RhbXAiLAogICAgICAidmFyaWFudF9kYXRlX2Zyb21fdGltZXN0YW1wIiwgInZhcmlhbnRfZ2V0X3R5cGUiLCAidmFyaWFudF9zZXRfdHlwZSIsCiAgICAgICJ2YXJpYW50X2Nhc3QiLCAiY29tX2NyZWF0ZV9ndWlkIiwgImNvbV9ldmVudF9zaW5rIiwgImNvbV9wcmludF90eXBlaW5mbyIsCiAgICAgICJjb21fbWVzc2FnZV9wdW1wIiwgImNvbV9sb2FkX3R5cGVsaWIiLCAiY29tX2dldF9hY3RpdmVfb2JqZWN0IiwgImN0eXBlX2FsbnVtIiwKICAgICAgImN0eXBlX2FscGhhIiwgImN0eXBlX2NudHJsIiwgImN0eXBlX2RpZ2l0IiwgImN0eXBlX2xvd2VyIiwgImN0eXBlX2dyYXBoIiwKICAgICAgImN0eXBlX3ByaW50IiwgImN0eXBlX3B1bmN0IiwgImN0eXBlX3NwYWNlIiwgImN0eXBlX3VwcGVyIiwgImN0eXBlX3hkaWdpdCIsCiAgICAgICJzdHJ0b3RpbWUiLCAiZGF0ZSIsICJpZGF0ZSIsICJnbWRhdGUiLCAibWt0aW1lIiwgImdtbWt0aW1lIiwgImNoZWNrZGF0ZSIsCiAgICAgICJzdHJmdGltZSIsICJnbXN0cmZ0aW1lIiwgInRpbWUiLCAibG9jYWx0aW1lIiwgImdldGRhdGUiLCAiZGF0ZV9jcmVhdGUiLAogICAgICAiZGF0ZV9wYXJzZSIsICJkYXRlX2Zvcm1hdCIsICJkYXRlX21vZGlmeSIsICJkYXRlX3RpbWV6b25lX2dldCIsCiAgICAgICJkYXRlX3RpbWV6b25lX3NldCIsICJkYXRlX29mZnNldF9nZXQiLCAiZGF0ZV90aW1lX3NldCIsICJkYXRlX2RhdGVfc2V0IiwKICAgICAgImRhdGVfaXNvZGF0ZV9zZXQiLCAidGltZXpvbmVfb3BlbiIsICJ0aW1lem9uZV9uYW1lX2dldCIsCiAgICAgICJ0aW1lem9uZV9uYW1lX2Zyb21fYWJiciIsICJ0aW1lem9uZV9vZmZzZXRfZ2V0IiwgInRpbWV6b25lX3RyYW5zaXRpb25zX2dldCIsCiAgICAgICJ0aW1lem9uZV9pZGVudGlmaWVyc19saXN0IiwgInRpbWV6b25lX2FiYnJldmlhdGlvbnNfbGlzdCIsCiAgICAgICJkYXRlX2RlZmF1bHRfdGltZXpvbmVfc2V0IiwgImRhdGVfZGVmYXVsdF90aW1lem9uZV9nZXQiLCAiZGF0ZV9zdW5yaXNlIiwKICAgICAgImRhdGVfc3Vuc2V0IiwgImRhdGVfc3VuX2luZm8iLCAiZmlsdGVyX2lucHV0IiwgImZpbHRlcl92YXIiLAogICAgICAiZmlsdGVyX2lucHV0X2FycmF5IiwgImZpbHRlcl92YXJfYXJyYXkiLCAiZmlsdGVyX2xpc3QiLCAiZmlsdGVyX2hhc192YXIiLAogICAgICAiZmlsdGVyX2lkIiwgImZ0cF9jb25uZWN0IiwgImZ0cF9sb2dpbiIsICJmdHBfcHdkIiwgImZ0cF9jZHVwIiwgImZ0cF9jaGRpciIsCiAgICAgICJmdHBfZXhlYyIsICJmdHBfcmF3IiwgImZ0cF9ta2RpciIsICJmdHBfcm1kaXIiLCAiZnRwX2NobW9kIiwgImZ0cF9hbGxvYyIsCiAgICAgICJmdHBfbmxpc3QiLCAiZnRwX3Jhd2xpc3QiLCAiZnRwX3N5c3R5cGUiLCAiZnRwX3Bhc3YiLCAiZnRwX2dldCIsICJmdHBfZmdldCIsCiAgICAgICJmdHBfcHV0IiwgImZ0cF9mcHV0IiwgImZ0cF9zaXplIiwgImZ0cF9tZHRtIiwgImZ0cF9yZW5hbWUiLCAiZnRwX2RlbGV0ZSIsCiAgICAgICJmdHBfc2l0ZSIsICJmdHBfY2xvc2UiLCAiZnRwX3NldF9vcHRpb24iLCAiZnRwX2dldF9vcHRpb24iLCAiZnRwX25iX2ZnZXQiLAogICAgICAiZnRwX25iX2dldCIsICJmdHBfbmJfY29udGludWUiLCAiZnRwX25iX3B1dCIsICJmdHBfbmJfZnB1dCIsICJmdHBfcXVpdCIsCiAgICAgICJoYXNoIiwgImhhc2hfZmlsZSIsICJoYXNoX2htYWMiLCAiaGFzaF9obWFjX2ZpbGUiLCAiaGFzaF9pbml0IiwgImhhc2hfdXBkYXRlIiwKICAgICAgImhhc2hfdXBkYXRlX3N0cmVhbSIsICJoYXNoX3VwZGF0ZV9maWxlIiwgImhhc2hfZmluYWwiLCAiaGFzaF9hbGdvcyIsICJpY29udiIsCiAgICAgICJvYl9pY29udl9oYW5kbGVyIiwgImljb252X2dldF9lbmNvZGluZyIsICJpY29udl9zZXRfZW5jb2RpbmciLCAiaWNvbnZfc3RybGVuIiwKICAgICAgImljb252X3N1YnN0ciIsICJpY29udl9zdHJwb3MiLCAiaWNvbnZfc3RycnBvcyIsICJpY29udl9taW1lX2VuY29kZSIsCiAgICAgICJpY29udl9taW1lX2RlY29kZSIsICJpY29udl9taW1lX2RlY29kZV9oZWFkZXJzIiwgImpzb25fZW5jb2RlIiwgImpzb25fZGVjb2RlIiwKICAgICAgIm9kYmNfYXV0b2NvbW1pdCIsICJvZGJjX2Jpbm1vZGUiLCAib2RiY19jbG9zZSIsICJvZGJjX2Nsb3NlX2FsbCIsCiAgICAgICJvZGJjX2NvbHVtbnMiLCAib2RiY19jb21taXQiLCAib2RiY19jb25uZWN0IiwgIm9kYmNfY3Vyc29yIiwKICAgICAgIm9kYmNfZGF0YV9zb3VyY2UiLCAib2RiY19leGVjdXRlIiwgIm9kYmNfZXJyb3IiLCAib2RiY19lcnJvcm1zZyIsICJvZGJjX2V4ZWMiLAogICAgICAib2RiY19mZXRjaF9hcnJheSIsICJvZGJjX2ZldGNoX29iamVjdCIsICJvZGJjX2ZldGNoX3JvdyIsICJvZGJjX2ZldGNoX2ludG8iLAogICAgICAib2RiY19maWVsZF9sZW4iLCAib2RiY19maWVsZF9zY2FsZSIsICJvZGJjX2ZpZWxkX25hbWUiLCAib2RiY19maWVsZF90eXBlIiwKICAgICAgIm9kYmNfZmllbGRfbnVtIiwgIm9kYmNfZnJlZV9yZXN1bHQiLCAib2RiY19nZXR0eXBlaW5mbyIsICJvZGJjX2xvbmdyZWFkbGVuIiwKICAgICAgIm9kYmNfbmV4dF9yZXN1bHQiLCAib2RiY19udW1fZmllbGRzIiwgIm9kYmNfbnVtX3Jvd3MiLCAib2RiY19wY29ubmVjdCIsCiAgICAgICJvZGJjX3ByZXBhcmUiLCAib2RiY19yZXN1bHQiLCAib2RiY19yZXN1bHRfYWxsIiwgIm9kYmNfcm9sbGJhY2siLAogICAgICAib2RiY19zZXRvcHRpb24iLCAib2RiY19zcGVjaWFsY29sdW1ucyIsICJvZGJjX3N0YXRpc3RpY3MiLCAib2RiY190YWJsZXMiLAogICAgICAib2RiY19wcmltYXJ5a2V5cyIsICJvZGJjX2NvbHVtbnByaXZpbGVnZXMiLCAib2RiY190YWJsZXByaXZpbGVnZXMiLAogICAgICAib2RiY19mb3JlaWdua2V5cyIsICJvZGJjX3Byb2NlZHVyZXMiLCAib2RiY19wcm9jZWR1cmVjb2x1bW5zIiwgIm9kYmNfZG8iLAogICAgICAib2RiY19maWVsZF9wcmVjaXNpb24iLCAicHJlZ19tYXRjaCIsICJwcmVnX21hdGNoX2FsbCIsICJwcmVnX3JlcGxhY2UiLAogICAgICAicHJlZ19yZXBsYWNlX2NhbGxiYWNrIiwgInByZWdfc3BsaXQiLCAicHJlZ19xdW90ZSIsICJwcmVnX2dyZXAiLAogICAgICAicHJlZ19sYXN0X2Vycm9yIiwgInNlc3Npb25fbmFtZSIsICJzZXNzaW9uX21vZHVsZV9uYW1lIiwgInNlc3Npb25fc2F2ZV9wYXRoIiwKICAgICAgInNlc3Npb25faWQiLCAic2Vzc2lvbl9yZWdlbmVyYXRlX2lkIiwgInNlc3Npb25fZGVjb2RlIiwgInNlc3Npb25fcmVnaXN0ZXIiLAogICAgICAic2Vzc2lvbl91bnJlZ2lzdGVyIiwgInNlc3Npb25faXNfcmVnaXN0ZXJlZCIsICJzZXNzaW9uX2VuY29kZSIsCiAgICAgICJzZXNzaW9uX3N0YXJ0IiwgInNlc3Npb25fZGVzdHJveSIsICJzZXNzaW9uX3Vuc2V0IiwKICAgICAgInNlc3Npb25fc2V0X3NhdmVfaGFuZGxlciIsICJzZXNzaW9uX2NhY2hlX2xpbWl0ZXIiLCAic2Vzc2lvbl9jYWNoZV9leHBpcmUiLAogICAgICAic2Vzc2lvbl9zZXRfY29va2llX3BhcmFtcyIsICJzZXNzaW9uX2dldF9jb29raWVfcGFyYW1zIiwKICAgICAgInNlc3Npb25fd3JpdGVfY2xvc2UiLCAic2Vzc2lvbl9jb21taXQiLCAic3BsX2NsYXNzZXMiLCAic3BsX2F1dG9sb2FkIiwKICAgICAgInNwbF9hdXRvbG9hZF9leHRlbnNpb25zIiwgInNwbF9hdXRvbG9hZF9yZWdpc3RlciIsICJzcGxfYXV0b2xvYWRfdW5yZWdpc3RlciIsCiAgICAgICJzcGxfYXV0b2xvYWRfZnVuY3Rpb25zIiwgInNwbF9hdXRvbG9hZF9jYWxsIiwgImNsYXNzX3BhcmVudHMiLAogICAgICAiY2xhc3NfaW1wbGVtZW50cyIsICJzcGxfb2JqZWN0X2hhc2giLCAiaXRlcmF0b3JfdG9fYXJyYXkiLCAiaXRlcmF0b3JfY291bnQiLAogICAgICAiaXRlcmF0b3JfYXBwbHkiLCAiY29uc3RhbnQiLCAiYmluMmhleCIsICJzbGVlcCIsICJ1c2xlZXAiLCAiZmx1c2giLAogICAgICAid29yZHdyYXAiLCAiaHRtbHNwZWNpYWxjaGFycyIsICJodG1sZW50aXRpZXMiLCAiaHRtbF9lbnRpdHlfZGVjb2RlIiwKICAgICAgImh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlIiwgImdldF9odG1sX3RyYW5zbGF0aW9uX3RhYmxlIiwgInNoYTEiLCAic2hhMV9maWxlIiwKICAgICAgIm1kNSIsICJtZDVfZmlsZSIsICJjcmMzMiIsICJpcHRjcGFyc2UiLCAiaXB0Y2VtYmVkIiwgImdldGltYWdlc2l6ZSIsCiAgICAgICJpbWFnZV90eXBlX3RvX21pbWVfdHlwZSIsICJpbWFnZV90eXBlX3RvX2V4dGVuc2lvbiIsICJwaHBpbmZvIiwgInBocHZlcnNpb24iLAogICAgICAicGhwY3JlZGl0cyIsICJwaHBfbG9nb19ndWlkIiwgInBocF9yZWFsX2xvZ29fZ3VpZCIsICJwaHBfZWdnX2xvZ29fZ3VpZCIsCiAgICAgICJ6ZW5kX2xvZ29fZ3VpZCIsICJwaHBfc2FwaV9uYW1lIiwgInBocF91bmFtZSIsICJwaHBfaW5pX3NjYW5uZWRfZmlsZXMiLAogICAgICAic3RybmF0Y21wIiwgInN0cm5hdGNhc2VjbXAiLCAic3Vic3RyX2NvdW50IiwgInN0cnNwbiIsICJzdHJjc3BuIiwgInN0cnRvayIsCiAgICAgICJzdHJ0b3VwcGVyIiwgInN0cnRvbG93ZXIiLCAic3RycG9zIiwgInN0cmlwb3MiLCAic3RycnBvcyIsICJzdHJyaXBvcyIsCiAgICAgICJzdHJyZXYiLCAiaGVicmV2IiwgImhlYnJldmMiLCAibmwyYnIiLCAiYmFzZW5hbWUiLCAiZGlybmFtZSIsICJwYXRoaW5mbyIsCiAgICAgICJzdHJpcHNsYXNoZXMiLCAic3RyaXBjc2xhc2hlcyIsICJzdHJzdHIiLCAic3RyaXN0ciIsICJzdHJyY2hyIiwgInN0cl9zaHVmZmxlIiwKICAgICAgInN0cl93b3JkX2NvdW50IiwgInN0cl9zcGxpdCIsICJzdHJwYnJrIiwgInN1YnN0cl9jb21wYXJlIiwgInN0cmNvbGwiLAogICAgICAic3Vic3RyIiwgInN1YnN0cl9yZXBsYWNlIiwgInF1b3RlbWV0YSIsICJ1Y2ZpcnN0IiwgInVjd29yZHMiLCAic3RydHIiLAogICAgICAiYWRkc2xhc2hlcyIsICJhZGRjc2xhc2hlcyIsICJydHJpbSIsICJzdHJfcmVwbGFjZSIsICJzdHJfaXJlcGxhY2UiLAogICAgICAic3RyX3JlcGVhdCIsICJjb3VudF9jaGFycyIsICJjaHVua19zcGxpdCIsICJ0cmltIiwgImx0cmltIiwgInN0cmlwX3RhZ3MiLAogICAgICAic2ltaWxhcl90ZXh0IiwgImV4cGxvZGUiLCAiaW1wbG9kZSIsICJzZXRsb2NhbGUiLCAibG9jYWxlY29udiIsICJzb3VuZGV4IiwKICAgICAgImxldmVuc2h0ZWluIiwgImNociIsICJvcmQiLCAicGFyc2Vfc3RyIiwgInN0cl9wYWQiLCAiY2hvcCIsICJzdHJjaHIiLAogICAgICAic3ByaW50ZiIsICJwcmludGYiLCAidnByaW50ZiIsICJ2c3ByaW50ZiIsICJmcHJpbnRmIiwgInZmcHJpbnRmIiwgInNzY2FuZiIsCiAgICAgICJmc2NhbmYiLCAicGFyc2VfdXJsIiwgInVybGVuY29kZSIsICJ1cmxkZWNvZGUiLCAicmF3dXJsZW5jb2RlIiwKICAgICAgInJhd3VybGRlY29kZSIsICJodHRwX2J1aWxkX3F1ZXJ5IiwgInVubGluayIsICJleGVjIiwgInN5c3RlbSIsCiAgICAgICJlc2NhcGVzaGVsbGNtZCIsICJlc2NhcGVzaGVsbGFyZyIsICJwYXNzdGhydSIsICJzaGVsbF9leGVjIiwgInByb2Nfb3BlbiIsCiAgICAgICJwcm9jX2Nsb3NlIiwgInByb2NfdGVybWluYXRlIiwgInByb2NfZ2V0X3N0YXR1cyIsICJyYW5kIiwgInNyYW5kIiwKICAgICAgImdldHJhbmRtYXgiLCAibXRfcmFuZCIsICJtdF9zcmFuZCIsICJtdF9nZXRyYW5kbWF4IiwgImdldHNlcnZieW5hbWUiLAogICAgICAiZ2V0c2VydmJ5cG9ydCIsICJnZXRwcm90b2J5bmFtZSIsICJnZXRwcm90b2J5bnVtYmVyIiwgImdldG15dWlkIiwgImdldG15Z2lkIiwKICAgICAgImdldG15cGlkIiwgImdldG15aW5vZGUiLCAiZ2V0bGFzdG1vZCIsICJiYXNlNjRfZGVjb2RlIiwgImJhc2U2NF9lbmNvZGUiLAogICAgICAiY29udmVydF91dWVuY29kZSIsICJjb252ZXJ0X3V1ZGVjb2RlIiwgImFicyIsICJjZWlsIiwgImZsb29yIiwgInJvdW5kIiwgInNpbiIsCiAgICAgICJjb3MiLCAidGFuIiwgImFzaW4iLCAiYWNvcyIsICJhdGFuIiwgImF0YW4yIiwgInNpbmgiLCAiY29zaCIsICJ0YW5oIiwgInBpIiwKICAgICAgImlzX2Zpbml0ZSIsICJpc19uYW4iLCAiaXNfaW5maW5pdGUiLCAicG93IiwgImV4cCIsICJsb2ciLCAibG9nMTAiLCAic3FydCIsCiAgICAgICJoeXBvdCIsICJkZWcycmFkIiwgInJhZDJkZWciLCAiYmluZGVjIiwgImhleGRlYyIsICJvY3RkZWMiLCAiZGVjYmluIiwKICAgICAgImRlY29jdCIsICJkZWNoZXgiLCAiYmFzZV9jb252ZXJ0IiwgIm51bWJlcl9mb3JtYXQiLCAiZm1vZCIsICJpcDJsb25nIiwKICAgICAgImxvbmcyaXAiLCAiZ2V0ZW52IiwgInB1dGVudiIsICJtaWNyb3RpbWUiLCAiZ2V0dGltZW9mZGF5IiwgInVuaXFpZCIsCiAgICAgICJxdW90ZWRfcHJpbnRhYmxlX2RlY29kZSIsICJjb252ZXJ0X2N5cl9zdHJpbmciLCAiZ2V0X2N1cnJlbnRfdXNlciIsCiAgICAgICJzZXRfdGltZV9saW1pdCIsICJnZXRfY2ZnX3ZhciIsICJtYWdpY19xdW90ZXNfcnVudGltZSIsCiAgICAgICJzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUiLCAiZ2V0X21hZ2ljX3F1b3Rlc19ncGMiLCAiZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lIiwKICAgICAgImltcG9ydF9yZXF1ZXN0X3ZhcmlhYmxlcyIsICJlcnJvcl9sb2ciLCAiZXJyb3JfZ2V0X2xhc3QiLCAiY2FsbF91c2VyX2Z1bmMiLAogICAgICAiY2FsbF91c2VyX2Z1bmNfYXJyYXkiLCAiY2FsbF91c2VyX21ldGhvZCIsICJjYWxsX3VzZXJfbWV0aG9kX2FycmF5IiwKICAgICAgInNlcmlhbGl6ZSIsICJ1bnNlcmlhbGl6ZSIsICJ2YXJfZHVtcCIsICJ2YXJfZXhwb3J0IiwgImRlYnVnX3p2YWxfZHVtcCIsCiAgICAgICJwcmludF9yIiwgIm1lbW9yeV9nZXRfdXNhZ2UiLCAibWVtb3J5X2dldF9wZWFrX3VzYWdlIiwKICAgICAgInJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uIiwgInJlZ2lzdGVyX3RpY2tfZnVuY3Rpb24iLAogICAgICAidW5yZWdpc3Rlcl90aWNrX2Z1bmN0aW9uIiwgImhpZ2hsaWdodF9maWxlIiwgInNob3dfc291cmNlIiwKICAgICAgImhpZ2hsaWdodF9zdHJpbmciLCAicGhwX3N0cmlwX3doaXRlc3BhY2UiLCAiaW5pX2dldCIsICJpbmlfZ2V0X2FsbCIsCiAgICAgICJpbmlfc2V0IiwgImluaV9hbHRlciIsICJpbmlfcmVzdG9yZSIsICJnZXRfaW5jbHVkZV9wYXRoIiwgInNldF9pbmNsdWRlX3BhdGgiLAogICAgICAicmVzdG9yZV9pbmNsdWRlX3BhdGgiLCAic2V0Y29va2llIiwgInNldHJhd2Nvb2tpZSIsICJoZWFkZXIiLCAiaGVhZGVyc19zZW50IiwKICAgICAgImhlYWRlcnNfbGlzdCIsICJjb25uZWN0aW9uX2Fib3J0ZWQiLCAiY29ubmVjdGlvbl9zdGF0dXMiLCAiaWdub3JlX3VzZXJfYWJvcnQiLAogICAgICAicGFyc2VfaW5pX2ZpbGUiLCAiaXNfdXBsb2FkZWRfZmlsZSIsICJtb3ZlX3VwbG9hZGVkX2ZpbGUiLCAiZ2V0aG9zdGJ5YWRkciIsCiAgICAgICJnZXRob3N0YnluYW1lIiwgImdldGhvc3RieW5hbWVsIiwgImludHZhbCIsICJmbG9hdHZhbCIsICJkb3VibGV2YWwiLCAic3RydmFsIiwKICAgICAgImdldHR5cGUiLCAic2V0dHlwZSIsICJpc19udWxsIiwgImlzX3Jlc291cmNlIiwgImlzX2Jvb2wiLCAiaXNfbG9uZyIsCiAgICAgICJpc19mbG9hdCIsICJpc19pbnQiLCAiaXNfaW50ZWdlciIsICJpc19kb3VibGUiLCAiaXNfcmVhbCIsICJpc19udW1lcmljIiwKICAgICAgImlzX3N0cmluZyIsICJpc19hcnJheSIsICJpc19vYmplY3QiLCAiaXNfc2NhbGFyIiwgImlzX2NhbGxhYmxlIiwgImVyZWciLAogICAgICAiZXJlZ19yZXBsYWNlIiwgImVyZWdpIiwgImVyZWdpX3JlcGxhY2UiLCAic3BsaXQiLCAic3BsaXRpIiwgImpvaW4iLAogICAgICAic3FsX3JlZ2Nhc2UiLCAiZGwiLCAicGNsb3NlIiwgInBvcGVuIiwgInJlYWRmaWxlIiwgInJld2luZCIsICJybWRpciIsICJ1bWFzayIsCiAgICAgICJmY2xvc2UiLCAiZmVvZiIsICJmZ2V0YyIsICJmZ2V0cyIsICJmZ2V0c3MiLCAiZnJlYWQiLCAiZm9wZW4iLCAiZnBhc3N0aHJ1IiwKICAgICAgImZ0cnVuY2F0ZSIsICJmc3RhdCIsICJmc2VlayIsICJmdGVsbCIsICJmZmx1c2giLCAiZndyaXRlIiwgImZwdXRzIiwgIm1rZGlyIiwKICAgICAgInJlbmFtZSIsICJjb3B5IiwgInRlbXBuYW0iLCAidG1wZmlsZSIsICJmaWxlIiwgImZpbGVfZ2V0X2NvbnRlbnRzIiwKICAgICAgImZpbGVfcHV0X2NvbnRlbnRzIiwgInN0cmVhbV9zZWxlY3QiLCAic3RyZWFtX2NvbnRleHRfY3JlYXRlIiwKICAgICAgInN0cmVhbV9jb250ZXh0X3NldF9wYXJhbXMiLCAic3RyZWFtX2NvbnRleHRfc2V0X29wdGlvbiIsCiAgICAgICJzdHJlYW1fY29udGV4dF9nZXRfb3B0aW9ucyIsICJzdHJlYW1fY29udGV4dF9nZXRfZGVmYXVsdCIsCiAgICAgICJzdHJlYW1fZmlsdGVyX3ByZXBlbmQiLCAic3RyZWFtX2ZpbHRlcl9hcHBlbmQiLCAic3RyZWFtX2ZpbHRlcl9yZW1vdmUiLAogICAgICAic3RyZWFtX3NvY2tldF9jbGllbnQiLCAic3RyZWFtX3NvY2tldF9zZXJ2ZXIiLCAic3RyZWFtX3NvY2tldF9hY2NlcHQiLAogICAgICAic3RyZWFtX3NvY2tldF9nZXRfbmFtZSIsICJzdHJlYW1fc29ja2V0X3JlY3Zmcm9tIiwgInN0cmVhbV9zb2NrZXRfc2VuZHRvIiwKICAgICAgInN0cmVhbV9zb2NrZXRfZW5hYmxlX2NyeXB0byIsICJzdHJlYW1fc29ja2V0X3NodXRkb3duIiwKICAgICAgInN0cmVhbV9jb3B5X3RvX3N0cmVhbSIsICJzdHJlYW1fZ2V0X2NvbnRlbnRzIiwgImZnZXRjc3YiLCAiZnB1dGNzdiIsICJmbG9jayIsCiAgICAgICJnZXRfbWV0YV90YWdzIiwgInN0cmVhbV9zZXRfd3JpdGVfYnVmZmVyIiwgInNldF9maWxlX2J1ZmZlciIsCiAgICAgICJzZXRfc29ja2V0X2Jsb2NraW5nIiwgInN0cmVhbV9zZXRfYmxvY2tpbmciLCAic29ja2V0X3NldF9ibG9ja2luZyIsCiAgICAgICJzdHJlYW1fZ2V0X21ldGFfZGF0YSIsICJzdHJlYW1fZ2V0X2xpbmUiLCAic3RyZWFtX3dyYXBwZXJfcmVnaXN0ZXIiLAogICAgICAic3RyZWFtX3JlZ2lzdGVyX3dyYXBwZXIiLCAic3RyZWFtX3dyYXBwZXJfdW5yZWdpc3RlciIsCiAgICAgICJzdHJlYW1fd3JhcHBlcl9yZXN0b3JlIiwgInN0cmVhbV9nZXRfd3JhcHBlcnMiLCAic3RyZWFtX2dldF90cmFuc3BvcnRzIiwKICAgICAgImdldF9oZWFkZXJzIiwgInN0cmVhbV9zZXRfdGltZW91dCIsICJzb2NrZXRfc2V0X3RpbWVvdXQiLCAic29ja2V0X2dldF9zdGF0dXMiLAogICAgICAicmVhbHBhdGgiLCAiZnNvY2tvcGVuIiwgInBmc29ja29wZW4iLCAicGFjayIsICJ1bnBhY2siLCAiZ2V0X2Jyb3dzZXIiLAogICAgICAiY3J5cHQiLCAib3BlbmRpciIsICJjbG9zZWRpciIsICJjaGRpciIsICJnZXRjd2QiLCAicmV3aW5kZGlyIiwgInJlYWRkaXIiLAogICAgICAiZGlyIiwgInNjYW5kaXIiLCAiZ2xvYiIsICJmaWxlYXRpbWUiLCAiZmlsZWN0aW1lIiwgImZpbGVncm91cCIsICJmaWxlaW5vZGUiLAogICAgICAiZmlsZW10aW1lIiwgImZpbGVvd25lciIsICJmaWxlcGVybXMiLCAiZmlsZXNpemUiLCAiZmlsZXR5cGUiLCAiZmlsZV9leGlzdHMiLAogICAgICAiaXNfd3JpdGFibGUiLCAiaXNfd3JpdGVhYmxlIiwgImlzX3JlYWRhYmxlIiwgImlzX2V4ZWN1dGFibGUiLCAiaXNfZmlsZSIsCiAgICAgICJpc19kaXIiLCAiaXNfbGluayIsICJzdGF0IiwgImxzdGF0IiwgImNob3duIiwgImNoZ3JwIiwgImNobW9kIiwgInRvdWNoIiwKICAgICAgImNsZWFyc3RhdGNhY2hlIiwgImRpc2tfdG90YWxfc3BhY2UiLCAiZGlza19mcmVlX3NwYWNlIiwgImRpc2tmcmVlc3BhY2UiLAogICAgICAibWFpbCIsICJlem1sbV9oYXNoIiwgIm9wZW5sb2ciLCAic3lzbG9nIiwgImNsb3NlbG9nIiwKICAgICAgImRlZmluZV9zeXNsb2dfdmFyaWFibGVzIiwgImxjZ192YWx1ZSIsICJtZXRhcGhvbmUiLCAib2Jfc3RhcnQiLCAib2JfZmx1c2giLAogICAgICAib2JfY2xlYW4iLCAib2JfZW5kX2ZsdXNoIiwgIm9iX2VuZF9jbGVhbiIsICJvYl9nZXRfZmx1c2giLCAib2JfZ2V0X2NsZWFuIiwKICAgICAgIm9iX2dldF9sZW5ndGgiLCAib2JfZ2V0X2xldmVsIiwgIm9iX2dldF9zdGF0dXMiLCAib2JfZ2V0X2NvbnRlbnRzIiwKICAgICAgIm9iX2ltcGxpY2l0X2ZsdXNoIiwgIm9iX2xpc3RfaGFuZGxlcnMiLCAia3NvcnQiLCAia3Jzb3J0IiwgIm5hdHNvcnQiLAogICAgICAibmF0Y2FzZXNvcnQiLCAiYXNvcnQiLCAiYXJzb3J0IiwgInNvcnQiLCAicnNvcnQiLCAidXNvcnQiLCAidWFzb3J0IiwgInVrc29ydCIsCiAgICAgICJzaHVmZmxlIiwgImFycmF5X3dhbGsiLCAiYXJyYXlfd2Fsa19yZWN1cnNpdmUiLCAiY291bnQiLCAiZW5kIiwgInByZXYiLAogICAgICAibmV4dCIsICJyZXNldCIsICJjdXJyZW50IiwgImtleSIsICJtaW4iLCAibWF4IiwgImluX2FycmF5IiwgImFycmF5X3NlYXJjaCIsCiAgICAgICJleHRyYWN0IiwgImNvbXBhY3QiLCAiYXJyYXlfZmlsbCIsICJhcnJheV9maWxsX2tleXMiLCAicmFuZ2UiLAogICAgICAiYXJyYXlfbXVsdGlzb3J0IiwgImFycmF5X3B1c2giLCAiYXJyYXlfcG9wIiwgImFycmF5X3NoaWZ0IiwgImFycmF5X3Vuc2hpZnQiLAogICAgICAiYXJyYXlfc3BsaWNlIiwgImFycmF5X3NsaWNlIiwgImFycmF5X21lcmdlIiwgImFycmF5X21lcmdlX3JlY3Vyc2l2ZSIsCiAgICAgICJhcnJheV9rZXlzIiwgImFycmF5X3ZhbHVlcyIsICJhcnJheV9jb3VudF92YWx1ZXMiLCAiYXJyYXlfcmV2ZXJzZSIsCiAgICAgICJhcnJheV9yZWR1Y2UiLCAiYXJyYXlfcGFkIiwgImFycmF5X2ZsaXAiLCAiYXJyYXlfY2hhbmdlX2tleV9jYXNlIiwKICAgICAgImFycmF5X3JhbmQiLCAiYXJyYXlfdW5pcXVlIiwgImFycmF5X2ludGVyc2VjdCIsICJhcnJheV9pbnRlcnNlY3Rfa2V5IiwKICAgICAgImFycmF5X2ludGVyc2VjdF91a2V5IiwgImFycmF5X3VpbnRlcnNlY3QiLCAiYXJyYXlfaW50ZXJzZWN0X2Fzc29jIiwKICAgICAgImFycmF5X3VpbnRlcnNlY3RfYXNzb2MiLCAiYXJyYXlfaW50ZXJzZWN0X3Vhc3NvYyIsICJhcnJheV91aW50ZXJzZWN0X3Vhc3NvYyIsCiAgICAgICJhcnJheV9kaWZmIiwgImFycmF5X2RpZmZfa2V5IiwgImFycmF5X2RpZmZfdWtleSIsICJhcnJheV91ZGlmZiIsCiAgICAgICJhcnJheV9kaWZmX2Fzc29jIiwgImFycmF5X3VkaWZmX2Fzc29jIiwgImFycmF5X2RpZmZfdWFzc29jIiwKICAgICAgImFycmF5X3VkaWZmX3Vhc3NvYyIsICJhcnJheV9zdW0iLCAiYXJyYXlfcHJvZHVjdCIsICJhcnJheV9maWx0ZXIiLAogICAgICAiYXJyYXlfbWFwIiwgImFycmF5X2NodW5rIiwgImFycmF5X2NvbWJpbmUiLCAiYXJyYXlfa2V5X2V4aXN0cyIsICJwb3MiLAogICAgICAic2l6ZW9mIiwgImtleV9leGlzdHMiLCAiYXNzZXJ0IiwgImFzc2VydF9vcHRpb25zIiwgInZlcnNpb25fY29tcGFyZSIsCiAgICAgICJzdHJfcm90MTMiLCAic3RyZWFtX2dldF9maWx0ZXJzIiwgInN0cmVhbV9maWx0ZXJfcmVnaXN0ZXIiLAogICAgICAic3RyZWFtX2J1Y2tldF9tYWtlX3dyaXRlYWJsZSIsICJzdHJlYW1fYnVja2V0X3ByZXBlbmQiLAogICAgICAic3RyZWFtX2J1Y2tldF9hcHBlbmQiLCAic3RyZWFtX2J1Y2tldF9uZXciLCAib3V0cHV0X2FkZF9yZXdyaXRlX3ZhciIsCiAgICAgICJvdXRwdXRfcmVzZXRfcmV3cml0ZV92YXJzIiwgInN5c19nZXRfdGVtcF9kaXIiLCAidG9rZW5fZ2V0X2FsbCIsICJ0b2tlbl9uYW1lIiwKICAgICAgInJlYWRnemZpbGUiLCAiZ3pyZXdpbmQiLCAiZ3pjbG9zZSIsICJnemVvZiIsICJnemdldGMiLCAiZ3pnZXRzIiwgImd6Z2V0c3MiLAogICAgICAiZ3pyZWFkIiwgImd6b3BlbiIsICJnenBhc3N0aHJ1IiwgImd6c2VlayIsICJnenRlbGwiLCAiZ3p3cml0ZSIsICJnenB1dHMiLAogICAgICAiZ3pmaWxlIiwgImd6Y29tcHJlc3MiLCAiZ3p1bmNvbXByZXNzIiwgImd6ZGVmbGF0ZSIsICJnemluZmxhdGUiLCAiZ3plbmNvZGUiLAogICAgICAib2JfZ3poYW5kbGVyIiwgInpsaWJfZ2V0X2NvZGluZ190eXBlIiwgImxpYnhtbF9zZXRfc3RyZWFtc19jb250ZXh0IiwKICAgICAgImxpYnhtbF91c2VfaW50ZXJuYWxfZXJyb3JzIiwgImxpYnhtbF9nZXRfbGFzdF9lcnJvciIsICJsaWJ4bWxfY2xlYXJfZXJyb3JzIiwKICAgICAgImxpYnhtbF9nZXRfZXJyb3JzIiwgImRvbV9pbXBvcnRfc2ltcGxleG1sIiwgInNpbXBsZXhtbF9sb2FkX2ZpbGUiLAogICAgICAic2ltcGxleG1sX2xvYWRfc3RyaW5nIiwgInNpbXBsZXhtbF9pbXBvcnRfZG9tIiwgIndkZHhfc2VyaWFsaXplX3ZhbHVlIiwKICAgICAgIndkZHhfc2VyaWFsaXplX3ZhcnMiLCAid2RkeF9wYWNrZXRfc3RhcnQiLCAid2RkeF9wYWNrZXRfZW5kIiwgIndkZHhfYWRkX3ZhcnMiLAogICAgICAid2RkeF9kZXNlcmlhbGl6ZSIsICJ4bWxfcGFyc2VyX2NyZWF0ZSIsICJ4bWxfcGFyc2VyX2NyZWF0ZV9ucyIsCiAgICAgICJ4bWxfc2V0X29iamVjdCIsICJ4bWxfc2V0X2VsZW1lbnRfaGFuZGxlciIsICJ4bWxfc2V0X2NoYXJhY3Rlcl9kYXRhX2hhbmRsZXIiLAogICAgICAieG1sX3NldF9wcm9jZXNzaW5nX2luc3RydWN0aW9uX2hhbmRsZXIiLCAieG1sX3NldF9kZWZhdWx0X2hhbmRsZXIiLAogICAgICAieG1sX3NldF91bnBhcnNlZF9lbnRpdHlfZGVjbF9oYW5kbGVyIiwgInhtbF9zZXRfbm90YXRpb25fZGVjbF9oYW5kbGVyIiwKICAgICAgInhtbF9zZXRfZXh0ZXJuYWxfZW50aXR5X3JlZl9oYW5kbGVyIiwgInhtbF9zZXRfc3RhcnRfbmFtZXNwYWNlX2RlY2xfaGFuZGxlciIsCiAgICAgICJ4bWxfc2V0X2VuZF9uYW1lc3BhY2VfZGVjbF9oYW5kbGVyIiwgInhtbF9wYXJzZSIsICJ4bWxfcGFyc2VfaW50b19zdHJ1Y3QiLAogICAgICAieG1sX2dldF9lcnJvcl9jb2RlIiwgInhtbF9lcnJvcl9zdHJpbmciLCAieG1sX2dldF9jdXJyZW50X2xpbmVfbnVtYmVyIiwKICAgICAgInhtbF9nZXRfY3VycmVudF9jb2x1bW5fbnVtYmVyIiwgInhtbF9nZXRfY3VycmVudF9ieXRlX2luZGV4IiwKICAgICAgInhtbF9wYXJzZXJfZnJlZSIsICJ4bWxfcGFyc2VyX3NldF9vcHRpb24iLCAieG1sX3BhcnNlcl9nZXRfb3B0aW9uIiwKICAgICAgInV0ZjhfZW5jb2RlIiwgInV0ZjhfZGVjb2RlIiwgInhtbHdyaXRlcl9vcGVuX3VyaSIsICJ4bWx3cml0ZXJfb3Blbl9tZW1vcnkiLAogICAgICAieG1sd3JpdGVyX3NldF9pbmRlbnQiLCAieG1sd3JpdGVyX3NldF9pbmRlbnRfc3RyaW5nIiwKICAgICAgInhtbHdyaXRlcl9zdGFydF9jb21tZW50IiwgInhtbHdyaXRlcl9lbmRfY29tbWVudCIsCiAgICAgICJ4bWx3cml0ZXJfc3RhcnRfYXR0cmlidXRlIiwgInhtbHdyaXRlcl9lbmRfYXR0cmlidXRlIiwKICAgICAgInhtbHdyaXRlcl93cml0ZV9hdHRyaWJ1dGUiLCAieG1sd3JpdGVyX3N0YXJ0X2F0dHJpYnV0ZV9ucyIsCiAgICAgICJ4bWx3cml0ZXJfd3JpdGVfYXR0cmlidXRlX25zIiwgInhtbHdyaXRlcl9zdGFydF9lbGVtZW50IiwKICAgICAgInhtbHdyaXRlcl9lbmRfZWxlbWVudCIsICJ4bWx3cml0ZXJfZnVsbF9lbmRfZWxlbWVudCIsCiAgICAgICJ4bWx3cml0ZXJfc3RhcnRfZWxlbWVudF9ucyIsICJ4bWx3cml0ZXJfd3JpdGVfZWxlbWVudCIsCiAgICAgICJ4bWx3cml0ZXJfd3JpdGVfZWxlbWVudF9ucyIsICJ4bWx3cml0ZXJfc3RhcnRfcGkiLCAieG1sd3JpdGVyX2VuZF9waSIsCiAgICAgICJ4bWx3cml0ZXJfd3JpdGVfcGkiLCAieG1sd3JpdGVyX3N0YXJ0X2NkYXRhIiwgInhtbHdyaXRlcl9lbmRfY2RhdGEiLAogICAgICAieG1sd3JpdGVyX3dyaXRlX2NkYXRhIiwgInhtbHdyaXRlcl90ZXh0IiwgInhtbHdyaXRlcl93cml0ZV9yYXciLAogICAgICAieG1sd3JpdGVyX3N0YXJ0X2RvY3VtZW50IiwgInhtbHdyaXRlcl9lbmRfZG9jdW1lbnQiLAogICAgICAieG1sd3JpdGVyX3dyaXRlX2NvbW1lbnQiLCAieG1sd3JpdGVyX3N0YXJ0X2R0ZCIsICJ4bWx3cml0ZXJfZW5kX2R0ZCIsCiAgICAgICJ4bWx3cml0ZXJfd3JpdGVfZHRkIiwgInhtbHdyaXRlcl9zdGFydF9kdGRfZWxlbWVudCIsCiAgICAgICJ4bWx3cml0ZXJfZW5kX2R0ZF9lbGVtZW50IiwgInhtbHdyaXRlcl93cml0ZV9kdGRfZWxlbWVudCIsCiAgICAgICJ4bWx3cml0ZXJfc3RhcnRfZHRkX2F0dGxpc3QiLCAieG1sd3JpdGVyX2VuZF9kdGRfYXR0bGlzdCIsCiAgICAgICJ4bWx3cml0ZXJfd3JpdGVfZHRkX2F0dGxpc3QiLCAieG1sd3JpdGVyX3N0YXJ0X2R0ZF9lbnRpdHkiLAogICAgICAieG1sd3JpdGVyX2VuZF9kdGRfZW50aXR5IiwgInhtbHdyaXRlcl93cml0ZV9kdGRfZW50aXR5IiwKICAgICAgInhtbHdyaXRlcl9vdXRwdXRfbWVtb3J5IiwgInhtbHdyaXRlcl9mbHVzaCIsICJnZF9pbmZvIiwgImltYWdlYXJjIiwKICAgICAgImltYWdlZWxsaXBzZSIsICJpbWFnZWNoYXIiLCAiaW1hZ2VjaGFydXAiLCAiaW1hZ2Vjb2xvcmF0IiwKICAgICAgImltYWdlY29sb3JhbGxvY2F0ZSIsICJpbWFnZXBhbGV0dGVjb3B5IiwgImltYWdlY3JlYXRlZnJvbXN0cmluZyIsCiAgICAgICJpbWFnZWNvbG9yY2xvc2VzdCIsICJpbWFnZWNvbG9yZGVhbGxvY2F0ZSIsICJpbWFnZWNvbG9ycmVzb2x2ZSIsCiAgICAgICJpbWFnZWNvbG9yZXhhY3QiLCAiaW1hZ2Vjb2xvcnNldCIsICJpbWFnZWNvbG9ydHJhbnNwYXJlbnQiLAogICAgICAiaW1hZ2Vjb2xvcnN0b3RhbCIsICJpbWFnZWNvbG9yc2ZvcmluZGV4IiwgImltYWdlY29weSIsICJpbWFnZWNvcHltZXJnZSIsCiAgICAgICJpbWFnZWNvcHltZXJnZWdyYXkiLCAiaW1hZ2Vjb3B5cmVzaXplZCIsICJpbWFnZWNyZWF0ZSIsCiAgICAgICJpbWFnZWNyZWF0ZXRydWVjb2xvciIsICJpbWFnZWlzdHJ1ZWNvbG9yIiwgImltYWdldHJ1ZWNvbG9ydG9wYWxldHRlIiwKICAgICAgImltYWdlc2V0dGhpY2tuZXNzIiwgImltYWdlZmlsbGVkYXJjIiwgImltYWdlZmlsbGVkZWxsaXBzZSIsCiAgICAgICJpbWFnZWFscGhhYmxlbmRpbmciLCAiaW1hZ2VzYXZlYWxwaGEiLCAiaW1hZ2Vjb2xvcmFsbG9jYXRlYWxwaGEiLAogICAgICAiaW1hZ2Vjb2xvcnJlc29sdmVhbHBoYSIsICJpbWFnZWNvbG9yY2xvc2VzdGFscGhhIiwgImltYWdlY29sb3JleGFjdGFscGhhIiwKICAgICAgImltYWdlY29weXJlc2FtcGxlZCIsICJpbWFnZWdyYWJ3aW5kb3ciLCAiaW1hZ2VncmFic2NyZWVuIiwgImltYWdlcm90YXRlIiwKICAgICAgImltYWdlYW50aWFsaWFzIiwgImltYWdlc2V0dGlsZSIsICJpbWFnZXNldGJydXNoIiwgImltYWdlc2V0c3R5bGUiLAogICAgICAiaW1hZ2VjcmVhdGVmcm9tcG5nIiwgImltYWdlY3JlYXRlZnJvbWdpZiIsICJpbWFnZWNyZWF0ZWZyb21qcGVnIiwKICAgICAgImltYWdlY3JlYXRlZnJvbXdibXAiLCAiaW1hZ2VjcmVhdGVmcm9teGJtIiwgImltYWdlY3JlYXRlZnJvbWdkIiwKICAgICAgImltYWdlY3JlYXRlZnJvbWdkMiIsICJpbWFnZWNyZWF0ZWZyb21nZDJwYXJ0IiwgImltYWdlcG5nIiwgImltYWdlZ2lmIiwKICAgICAgImltYWdlanBlZyIsICJpbWFnZXdibXAiLCAiaW1hZ2VnZCIsICJpbWFnZWdkMiIsICJpbWFnZWRlc3Ryb3kiLAogICAgICAiaW1hZ2VnYW1tYWNvcnJlY3QiLCAiaW1hZ2VmaWxsIiwgImltYWdlZmlsbGVkcG9seWdvbiIsICJpbWFnZWZpbGxlZHJlY3RhbmdsZSIsCiAgICAgICJpbWFnZWZpbGx0b2JvcmRlciIsICJpbWFnZWZvbnR3aWR0aCIsICJpbWFnZWZvbnRoZWlnaHQiLCAiaW1hZ2VpbnRlcmxhY2UiLAogICAgICAiaW1hZ2VsaW5lIiwgImltYWdlbG9hZGZvbnQiLCAiaW1hZ2Vwb2x5Z29uIiwgImltYWdlcmVjdGFuZ2xlIiwKICAgICAgImltYWdlc2V0cGl4ZWwiLCAiaW1hZ2VzdHJpbmciLCAiaW1hZ2VzdHJpbmd1cCIsICJpbWFnZXN4IiwgImltYWdlc3kiLAogICAgICAiaW1hZ2VkYXNoZWRsaW5lIiwgImltYWdldHRmYmJveCIsICJpbWFnZXR0ZnRleHQiLCAiaW1hZ2VmdGJib3giLAogICAgICAiaW1hZ2VmdHRleHQiLCAiaW1hZ2Vwc2xvYWRmb250IiwgImltYWdlcHNmcmVlZm9udCIsICJpbWFnZXBzZW5jb2RlZm9udCIsCiAgICAgICJpbWFnZXBzZXh0ZW5kZm9udCIsICJpbWFnZXBzc2xhbnRmb250IiwgImltYWdlcHN0ZXh0IiwgImltYWdlcHNiYm94IiwKICAgICAgImltYWdldHlwZXMiLCAianBlZzJ3Ym1wIiwgInBuZzJ3Ym1wIiwgImltYWdlMndibXAiLCAiaW1hZ2VsYXllcmVmZmVjdCIsCiAgICAgICJpbWFnZWNvbG9ybWF0Y2giLCAiaW1hZ2V4Ym0iLCAiaW1hZ2VmaWx0ZXIiLCAiaW1hZ2Vjb252b2x1dGlvbiIsCiAgICAgICJtYl9jb252ZXJ0X2Nhc2UiLCAibWJfc3RydG91cHBlciIsICJtYl9zdHJ0b2xvd2VyIiwgIm1iX2xhbmd1YWdlIiwKICAgICAgIm1iX2ludGVybmFsX2VuY29kaW5nIiwgIm1iX2h0dHBfaW5wdXQiLCAibWJfaHR0cF9vdXRwdXQiLCAibWJfZGV0ZWN0X29yZGVyIiwKICAgICAgIm1iX3N1YnN0aXR1dGVfY2hhcmFjdGVyIiwgIm1iX3BhcnNlX3N0ciIsICJtYl9vdXRwdXRfaGFuZGxlciIsCiAgICAgICJtYl9wcmVmZXJyZWRfbWltZV9uYW1lIiwgIm1iX3N0cmxlbiIsICJtYl9zdHJwb3MiLCAibWJfc3RycnBvcyIsICJtYl9zdHJpcG9zIiwKICAgICAgIm1iX3N0cnJpcG9zIiwgIm1iX3N0cnN0ciIsICJtYl9zdHJyY2hyIiwgIm1iX3N0cmlzdHIiLCAibWJfc3RycmljaHIiLAogICAgICAibWJfc3Vic3RyX2NvdW50IiwgIm1iX3N1YnN0ciIsICJtYl9zdHJjdXQiLCAibWJfc3Ryd2lkdGgiLCAibWJfc3RyaW13aWR0aCIsCiAgICAgICJtYl9jb252ZXJ0X2VuY29kaW5nIiwgIm1iX2RldGVjdF9lbmNvZGluZyIsICJtYl9saXN0X2VuY29kaW5ncyIsCiAgICAgICJtYl9jb252ZXJ0X2thbmEiLCAibWJfZW5jb2RlX21pbWVoZWFkZXIiLCAibWJfZGVjb2RlX21pbWVoZWFkZXIiLAogICAgICAibWJfY29udmVydF92YXJpYWJsZXMiLCAibWJfZW5jb2RlX251bWVyaWNlbnRpdHkiLCAibWJfZGVjb2RlX251bWVyaWNlbnRpdHkiLAogICAgICAibWJfc2VuZF9tYWlsIiwgIm1iX2dldF9pbmZvIiwgIm1iX2NoZWNrX2VuY29kaW5nIiwgIm1iX3JlZ2V4X2VuY29kaW5nIiwKICAgICAgIm1iX3JlZ2V4X3NldF9vcHRpb25zIiwgIm1iX2VyZWciLCAibWJfZXJlZ2kiLCAibWJfZXJlZ19yZXBsYWNlIiwKICAgICAgIm1iX2VyZWdpX3JlcGxhY2UiLCAibWJfc3BsaXQiLCAibWJfZXJlZ19tYXRjaCIsICJtYl9lcmVnX3NlYXJjaCIsCiAgICAgICJtYl9lcmVnX3NlYXJjaF9wb3MiLCAibWJfZXJlZ19zZWFyY2hfcmVncyIsICJtYl9lcmVnX3NlYXJjaF9pbml0IiwKICAgICAgIm1iX2VyZWdfc2VhcmNoX2dldHJlZ3MiLCAibWJfZXJlZ19zZWFyY2hfZ2V0cG9zIiwgIm1iX2VyZWdfc2VhcmNoX3NldHBvcyIsCiAgICAgICJtYnJlZ2V4X2VuY29kaW5nIiwgIm1iZXJlZyIsICJtYmVyZWdpIiwgIm1iZXJlZ19yZXBsYWNlIiwgIm1iZXJlZ2lfcmVwbGFjZSIsCiAgICAgICJtYnNwbGl0IiwgIm1iZXJlZ19tYXRjaCIsICJtYmVyZWdfc2VhcmNoIiwgIm1iZXJlZ19zZWFyY2hfcG9zIiwKICAgICAgIm1iZXJlZ19zZWFyY2hfcmVncyIsICJtYmVyZWdfc2VhcmNoX2luaXQiLCAibWJlcmVnX3NlYXJjaF9nZXRyZWdzIiwKICAgICAgIm1iZXJlZ19zZWFyY2hfZ2V0cG9zIiwgIm1iZXJlZ19zZWFyY2hfc2V0cG9zIiwgIm15c3FsX2Nvbm5lY3QiLAogICAgICAibXlzcWxfcGNvbm5lY3QiLCAibXlzcWxfY2xvc2UiLCAibXlzcWxfc2VsZWN0X2RiIiwgIm15c3FsX3F1ZXJ5IiwKICAgICAgIm15c3FsX3VuYnVmZmVyZWRfcXVlcnkiLCAibXlzcWxfZGJfcXVlcnkiLCAibXlzcWxfbGlzdF9kYnMiLAogICAgICAibXlzcWxfbGlzdF90YWJsZXMiLCAibXlzcWxfbGlzdF9maWVsZHMiLCAibXlzcWxfbGlzdF9wcm9jZXNzZXMiLAogICAgICAibXlzcWxfZXJyb3IiLCAibXlzcWxfZXJybm8iLCAibXlzcWxfYWZmZWN0ZWRfcm93cyIsICJteXNxbF9pbnNlcnRfaWQiLAogICAgICAibXlzcWxfcmVzdWx0IiwgIm15c3FsX251bV9yb3dzIiwgIm15c3FsX251bV9maWVsZHMiLCAibXlzcWxfZmV0Y2hfcm93IiwKICAgICAgIm15c3FsX2ZldGNoX2FycmF5IiwgIm15c3FsX2ZldGNoX2Fzc29jIiwgIm15c3FsX2ZldGNoX29iamVjdCIsCiAgICAgICJteXNxbF9kYXRhX3NlZWsiLCAibXlzcWxfZmV0Y2hfbGVuZ3RocyIsICJteXNxbF9mZXRjaF9maWVsZCIsCiAgICAgICJteXNxbF9maWVsZF9zZWVrIiwgIm15c3FsX2ZyZWVfcmVzdWx0IiwgIm15c3FsX2ZpZWxkX25hbWUiLAogICAgICAibXlzcWxfZmllbGRfdGFibGUiLCAibXlzcWxfZmllbGRfbGVuIiwgIm15c3FsX2ZpZWxkX3R5cGUiLAogICAgICAibXlzcWxfZmllbGRfZmxhZ3MiLCAibXlzcWxfZXNjYXBlX3N0cmluZyIsICJteXNxbF9yZWFsX2VzY2FwZV9zdHJpbmciLAogICAgICAibXlzcWxfc3RhdCIsICJteXNxbF90aHJlYWRfaWQiLCAibXlzcWxfY2xpZW50X2VuY29kaW5nIiwgIm15c3FsX3BpbmciLAogICAgICAibXlzcWxfZ2V0X2NsaWVudF9pbmZvIiwgIm15c3FsX2dldF9ob3N0X2luZm8iLCAibXlzcWxfZ2V0X3Byb3RvX2luZm8iLAogICAgICAibXlzcWxfZ2V0X3NlcnZlcl9pbmZvIiwgIm15c3FsX2luZm8iLCAibXlzcWxfc2V0X2NoYXJzZXQiLCAibXlzcWwiLAogICAgICAibXlzcWxfZmllbGRuYW1lIiwgIm15c3FsX2ZpZWxkdGFibGUiLCAibXlzcWxfZmllbGRsZW4iLCAibXlzcWxfZmllbGR0eXBlIiwKICAgICAgIm15c3FsX2ZpZWxkZmxhZ3MiLCAibXlzcWxfc2VsZWN0ZGIiLCAibXlzcWxfZnJlZXJlc3VsdCIsICJteXNxbF9udW1maWVsZHMiLAogICAgICAibXlzcWxfbnVtcm93cyIsICJteXNxbF9saXN0ZGJzIiwgIm15c3FsX2xpc3R0YWJsZXMiLCAibXlzcWxfbGlzdGZpZWxkcyIsCiAgICAgICJteXNxbF9kYl9uYW1lIiwgIm15c3FsX2RibmFtZSIsICJteXNxbF90YWJsZW5hbWUiLCAibXlzcWxfdGFibGVfbmFtZSIsCiAgICAgICJteXNxbGlfYWZmZWN0ZWRfcm93cyIsICJteXNxbGlfYXV0b2NvbW1pdCIsICJteXNxbGlfY2hhbmdlX3VzZXIiLAogICAgICAibXlzcWxpX2NoYXJhY3Rlcl9zZXRfbmFtZSIsICJteXNxbGlfY2xvc2UiLCAibXlzcWxpX2NvbW1pdCIsICJteXNxbGlfY29ubmVjdCIsCiAgICAgICJteXNxbGlfY29ubmVjdF9lcnJubyIsICJteXNxbGlfY29ubmVjdF9lcnJvciIsICJteXNxbGlfZGF0YV9zZWVrIiwKICAgICAgIm15c3FsaV9kZWJ1ZyIsICJteXNxbGlfZGlzYWJsZV9yZWFkc19mcm9tX21hc3RlciIsICJteXNxbGlfZGlzYWJsZV9ycGxfcGFyc2UiLAogICAgICAibXlzcWxpX2R1bXBfZGVidWdfaW5mbyIsICJteXNxbGlfZW5hYmxlX3JlYWRzX2Zyb21fbWFzdGVyIiwKICAgICAgIm15c3FsaV9lbmFibGVfcnBsX3BhcnNlIiwgIm15c3FsaV9lbWJlZGRlZF9zZXJ2ZXJfZW5kIiwKICAgICAgIm15c3FsaV9lbWJlZGRlZF9zZXJ2ZXJfc3RhcnQiLCAibXlzcWxpX2Vycm5vIiwgIm15c3FsaV9lcnJvciIsCiAgICAgICJteXNxbGlfc3RtdF9leGVjdXRlIiwgIm15c3FsaV9leGVjdXRlIiwgIm15c3FsaV9mZXRjaF9maWVsZCIsCiAgICAgICJteXNxbGlfZmV0Y2hfZmllbGRzIiwgIm15c3FsaV9mZXRjaF9maWVsZF9kaXJlY3QiLCAibXlzcWxpX2ZldGNoX2xlbmd0aHMiLAogICAgICAibXlzcWxpX2ZldGNoX2FycmF5IiwgIm15c3FsaV9mZXRjaF9hc3NvYyIsICJteXNxbGlfZmV0Y2hfb2JqZWN0IiwKICAgICAgIm15c3FsaV9mZXRjaF9yb3ciLCAibXlzcWxpX2ZpZWxkX2NvdW50IiwgIm15c3FsaV9maWVsZF9zZWVrIiwKICAgICAgIm15c3FsaV9maWVsZF90ZWxsIiwgIm15c3FsaV9mcmVlX3Jlc3VsdCIsICJteXNxbGlfZ2V0X2NoYXJzZXQiLAogICAgICAibXlzcWxpX2dldF9jbGllbnRfaW5mbyIsICJteXNxbGlfZ2V0X2NsaWVudF92ZXJzaW9uIiwgIm15c3FsaV9nZXRfaG9zdF9pbmZvIiwKICAgICAgIm15c3FsaV9nZXRfcHJvdG9faW5mbyIsICJteXNxbGlfZ2V0X3NlcnZlcl9pbmZvIiwgIm15c3FsaV9nZXRfc2VydmVyX3ZlcnNpb24iLAogICAgICAibXlzcWxpX2dldF93YXJuaW5ncyIsICJteXNxbGlfaW5pdCIsICJteXNxbGlfaW5mbyIsICJteXNxbGlfaW5zZXJ0X2lkIiwKICAgICAgIm15c3FsaV9raWxsIiwgIm15c3FsaV9zZXRfbG9jYWxfaW5maWxlX2RlZmF1bHQiLAogICAgICAibXlzcWxpX3NldF9sb2NhbF9pbmZpbGVfaGFuZGxlciIsICJteXNxbGlfbWFzdGVyX3F1ZXJ5IiwKICAgICAgIm15c3FsaV9tb3JlX3Jlc3VsdHMiLCAibXlzcWxpX211bHRpX3F1ZXJ5IiwgIm15c3FsaV9uZXh0X3Jlc3VsdCIsCiAgICAgICJteXNxbGlfbnVtX2ZpZWxkcyIsICJteXNxbGlfbnVtX3Jvd3MiLCAibXlzcWxpX29wdGlvbnMiLCAibXlzcWxpX3BpbmciLAogICAgICAibXlzcWxpX3ByZXBhcmUiLCAibXlzcWxpX3JlcG9ydCIsICJteXNxbGlfcXVlcnkiLCAibXlzcWxpX3JlYWxfY29ubmVjdCIsCiAgICAgICJteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nIiwgIm15c3FsaV9yZWFsX3F1ZXJ5IiwgIm15c3FsaV9yb2xsYmFjayIsCiAgICAgICJteXNxbGlfcnBsX3BhcnNlX2VuYWJsZWQiLCAibXlzcWxpX3JwbF9wcm9iZSIsICJteXNxbGlfcnBsX3F1ZXJ5X3R5cGUiLAogICAgICAibXlzcWxpX3NlbGVjdF9kYiIsICJteXNxbGlfc2V0X2NoYXJzZXQiLCAibXlzcWxpX3N0bXRfYXR0cl9nZXQiLAogICAgICAibXlzcWxpX3N0bXRfYXR0cl9zZXQiLCAibXlzcWxpX3N0bXRfZmllbGRfY291bnQiLCAibXlzcWxpX3N0bXRfaW5pdCIsCiAgICAgICJteXNxbGlfc3RtdF9wcmVwYXJlIiwgIm15c3FsaV9zdG10X3Jlc3VsdF9tZXRhZGF0YSIsCiAgICAgICJteXNxbGlfc3RtdF9zZW5kX2xvbmdfZGF0YSIsICJteXNxbGlfc3RtdF9iaW5kX3BhcmFtIiwKICAgICAgIm15c3FsaV9zdG10X2JpbmRfcmVzdWx0IiwgIm15c3FsaV9zdG10X2ZldGNoIiwgIm15c3FsaV9zdG10X2ZyZWVfcmVzdWx0IiwKICAgICAgIm15c3FsaV9zdG10X2dldF93YXJuaW5ncyIsICJteXNxbGlfc3RtdF9pbnNlcnRfaWQiLCAibXlzcWxpX3N0bXRfcmVzZXQiLAogICAgICAibXlzcWxpX3N0bXRfcGFyYW1fY291bnQiLCAibXlzcWxpX3NlbmRfcXVlcnkiLCAibXlzcWxpX3NsYXZlX3F1ZXJ5IiwKICAgICAgIm15c3FsaV9zcWxzdGF0ZSIsICJteXNxbGlfc3NsX3NldCIsICJteXNxbGlfc3RhdCIsCiAgICAgICJteXNxbGlfc3RtdF9hZmZlY3RlZF9yb3dzIiwgIm15c3FsaV9zdG10X2Nsb3NlIiwgIm15c3FsaV9zdG10X2RhdGFfc2VlayIsCiAgICAgICJteXNxbGlfc3RtdF9lcnJubyIsICJteXNxbGlfc3RtdF9lcnJvciIsICJteXNxbGlfc3RtdF9udW1fcm93cyIsCiAgICAgICJteXNxbGlfc3RtdF9zcWxzdGF0ZSIsICJteXNxbGlfc3RvcmVfcmVzdWx0IiwgIm15c3FsaV9zdG10X3N0b3JlX3Jlc3VsdCIsCiAgICAgICJteXNxbGlfdGhyZWFkX2lkIiwgIm15c3FsaV90aHJlYWRfc2FmZSIsICJteXNxbGlfdXNlX3Jlc3VsdCIsCiAgICAgICJteXNxbGlfd2FybmluZ19jb3VudCIsICJteXNxbGlfYmluZF9wYXJhbSIsICJteXNxbGlfYmluZF9yZXN1bHQiLAogICAgICAibXlzcWxpX2NsaWVudF9lbmNvZGluZyIsICJteXNxbGlfZXNjYXBlX3N0cmluZyIsICJteXNxbGlfZmV0Y2giLAogICAgICAibXlzcWxpX3BhcmFtX2NvdW50IiwgIm15c3FsaV9nZXRfbWV0YWRhdGEiLCAibXlzcWxpX3NlbmRfbG9uZ19kYXRhIiwKICAgICAgIm15c3FsaV9zZXRfb3B0IiwgInBkb19kcml2ZXJzIiwgInNvY2tldF9zZWxlY3QiLCAic29ja2V0X2NyZWF0ZSIsCiAgICAgICJzb2NrZXRfY3JlYXRlX2xpc3RlbiIsICJzb2NrZXRfYWNjZXB0IiwgInNvY2tldF9zZXRfbm9uYmxvY2siLAogICAgICAic29ja2V0X3NldF9ibG9jayIsICJzb2NrZXRfbGlzdGVuIiwgInNvY2tldF9jbG9zZSIsICJzb2NrZXRfd3JpdGUiLAogICAgICAic29ja2V0X3JlYWQiLCAic29ja2V0X2dldHNvY2tuYW1lIiwgInNvY2tldF9nZXRwZWVybmFtZSIsICJzb2NrZXRfY29ubmVjdCIsCiAgICAgICJzb2NrZXRfc3RyZXJyb3IiLCAic29ja2V0X2JpbmQiLCAic29ja2V0X3JlY3YiLCAic29ja2V0X3NlbmQiLAogICAgICAic29ja2V0X3JlY3Zmcm9tIiwgInNvY2tldF9zZW5kdG8iLCAic29ja2V0X2dldF9vcHRpb24iLCAic29ja2V0X3NldF9vcHRpb24iLAogICAgICAic29ja2V0X3NodXRkb3duIiwgInNvY2tldF9sYXN0X2Vycm9yIiwgInNvY2tldF9jbGVhcl9lcnJvciIsICJzb2NrZXRfZ2V0b3B0IiwKICAgICAgInNvY2tldF9zZXRvcHQiLCAiZWFjY2VsZXJhdG9yX3B1dCIsICJlYWNjZWxlcmF0b3JfZ2V0IiwgImVhY2NlbGVyYXRvcl9ybSIsCiAgICAgICJlYWNjZWxlcmF0b3JfZ2MiLCAiZWFjY2VsZXJhdG9yX2xvY2siLCAiZWFjY2VsZXJhdG9yX3VubG9jayIsCiAgICAgICJlYWNjZWxlcmF0b3JfY2FjaGluZyIsICJlYWNjZWxlcmF0b3Jfb3B0aW1pemVyIiwgImVhY2NlbGVyYXRvcl9jbGVhciIsCiAgICAgICJlYWNjZWxlcmF0b3JfY2xlYW4iLCAiZWFjY2VsZXJhdG9yX2luZm8iLCAiZWFjY2VsZXJhdG9yX3B1cmdlIiwKICAgICAgImVhY2NlbGVyYXRvcl9jYWNoZWRfc2NyaXB0cyIsICJlYWNjZWxlcmF0b3JfcmVtb3ZlZF9zY3JpcHRzIiwKICAgICAgImVhY2NlbGVyYXRvcl9saXN0X2tleXMiLCAiZWFjY2VsZXJhdG9yX2VuY29kZSIsICJlYWNjZWxlcmF0b3JfbG9hZCIsCiAgICAgICJfZWFjY2VsZXJhdG9yX2xvYWRlcl9maWxlIiwgIl9lYWNjZWxlcmF0b3JfbG9hZGVyX2xpbmUiLAogICAgICAiZWFjY2VsZXJhdG9yX3NldF9zZXNzaW9uX2hhbmRsZXJzIiwgIl9lYWNjZWxlcmF0b3Jfb3V0cHV0X2hhbmRsZXIiLAogICAgICAiZWFjY2VsZXJhdG9yX2NhY2hlX3BhZ2UiLCAiZWFjY2VsZXJhdG9yX3JtX3BhZ2UiLCAiZWFjY2VsZXJhdG9yX2NhY2hlX291dHB1dCIsCiAgICAgICJlYWNjZWxlcmF0b3JfY2FjaGVfcmVzdWx0IiwgInhkZWJ1Z19nZXRfc3RhY2tfZGVwdGgiLAogICAgICAieGRlYnVnX2dldF9mdW5jdGlvbl9zdGFjayIsICJ4ZGVidWdfcHJpbnRfZnVuY3Rpb25fc3RhY2siLAogICAgICAieGRlYnVnX2dldF9kZWNsYXJlZF92YXJzIiwgInhkZWJ1Z19jYWxsX2NsYXNzIiwgInhkZWJ1Z19jYWxsX2Z1bmN0aW9uIiwKICAgICAgInhkZWJ1Z19jYWxsX2ZpbGUiLCAieGRlYnVnX2NhbGxfbGluZSIsICJ4ZGVidWdfdmFyX2R1bXAiLCAieGRlYnVnX2RlYnVnX3p2YWwiLAogICAgICAieGRlYnVnX2RlYnVnX3p2YWxfc3Rkb3V0IiwgInhkZWJ1Z19lbmFibGUiLCAieGRlYnVnX2Rpc2FibGUiLAogICAgICAieGRlYnVnX2lzX2VuYWJsZWQiLCAieGRlYnVnX2JyZWFrIiwgInhkZWJ1Z19zdGFydF90cmFjZSIsICJ4ZGVidWdfc3RvcF90cmFjZSIsCiAgICAgICJ4ZGVidWdfZ2V0X3RyYWNlZmlsZV9uYW1lIiwgInhkZWJ1Z19nZXRfcHJvZmlsZXJfZmlsZW5hbWUiLAogICAgICAieGRlYnVnX2R1bXBfYWdncl9wcm9maWxpbmdfZGF0YSIsICJ4ZGVidWdfY2xlYXJfYWdncl9wcm9maWxpbmdfZGF0YSIsCiAgICAgICJ4ZGVidWdfbWVtb3J5X3VzYWdlIiwgInhkZWJ1Z19wZWFrX21lbW9yeV91c2FnZSIsICJ4ZGVidWdfdGltZV9pbmRleCIsCiAgICAgICJ4ZGVidWdfc3RhcnRfZXJyb3JfY29sbGVjdGlvbiIsICJ4ZGVidWdfc3RvcF9lcnJvcl9jb2xsZWN0aW9uIiwKICAgICAgInhkZWJ1Z19nZXRfY29sbGVjdGVkX2Vycm9ycyIsICJ4ZGVidWdfc3RhcnRfY29kZV9jb3ZlcmFnZSIsCiAgICAgICJ4ZGVidWdfc3RvcF9jb2RlX2NvdmVyYWdlIiwgInhkZWJ1Z19nZXRfY29kZV9jb3ZlcmFnZSIsCiAgICAgICJ4ZGVidWdfZ2V0X2Z1bmN0aW9uX2NvdW50IiwgInhkZWJ1Z19kdW1wX3N1cGVyZ2xvYmFscyIsCiAgICAgICJfIiAvLyBhbGlhcyBmb3IgZ2V0dGV4dCgpCiAgICBdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJ0X3N0cmluZyIsICJwaHAtcHJlZGVmaW5lZC1mdW5jdGlvbiIpOwogICAgfSk7CgogICAgLy8gb3V0cHV0IG9mIGdldF9kZWZpbmVkX2NvbnN0YW50cygpLiBEaWZmZXJzIHNpZ25pZmljYW50bHkgZnJvbSBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vcmVzZXJ2ZWQuY29uc3RhbnRzLnBocAogICAgWyAiRV9FUlJPUiIsICJFX1JFQ09WRVJBQkxFX0VSUk9SIiwgIkVfV0FSTklORyIsICJFX1BBUlNFIiwgIkVfTk9USUNFIiwKICAgICAgIkVfU1RSSUNUIiwgIkVfQ09SRV9FUlJPUiIsICJFX0NPUkVfV0FSTklORyIsICJFX0NPTVBJTEVfRVJST1IiLAogICAgICAiRV9DT01QSUxFX1dBUk5JTkciLCAiRV9VU0VSX0VSUk9SIiwgIkVfVVNFUl9XQVJOSU5HIiwgIkVfVVNFUl9OT1RJQ0UiLAogICAgICAiRV9BTEwiLCAiVFJVRSIsICJGQUxTRSIsICJOVUxMIiwgIlpFTkRfVEhSRUFEX1NBRkUiLCAiUEhQX1ZFUlNJT04iLCAiUEhQX09TIiwKICAgICAgIlBIUF9TQVBJIiwgIkRFRkFVTFRfSU5DTFVERV9QQVRIIiwgIlBFQVJfSU5TVEFMTF9ESVIiLCAiUEVBUl9FWFRFTlNJT05fRElSIiwKICAgICAgIlBIUF9FWFRFTlNJT05fRElSIiwgIlBIUF9QUkVGSVgiLCAiUEhQX0JJTkRJUiIsICJQSFBfTElCRElSIiwgIlBIUF9EQVRBRElSIiwKICAgICAgIlBIUF9TWVNDT05GRElSIiwgIlBIUF9MT0NBTFNUQVRFRElSIiwgIlBIUF9DT05GSUdfRklMRV9QQVRIIiwKICAgICAgIlBIUF9DT05GSUdfRklMRV9TQ0FOX0RJUiIsICJQSFBfU0hMSUJfU1VGRklYIiwgIlBIUF9FT0wiLCAiUEhQX0VPTCIsCiAgICAgICJQSFBfSU5UX01BWCIsICJQSFBfSU5UX1NJWkUiLCAiUEhQX09VVFBVVF9IQU5ETEVSX1NUQVJUIiwKICAgICAgIlBIUF9PVVRQVVRfSEFORExFUl9DT05UIiwgIlBIUF9PVVRQVVRfSEFORExFUl9FTkQiLCAiVVBMT0FEX0VSUl9PSyIsCiAgICAgICJVUExPQURfRVJSX0lOSV9TSVpFIiwgIlVQTE9BRF9FUlJfRk9STV9TSVpFIiwgIlVQTE9BRF9FUlJfUEFSVElBTCIsCiAgICAgICJVUExPQURfRVJSX05PX0ZJTEUiLCAiVVBMT0FEX0VSUl9OT19UTVBfRElSIiwgIlVQTE9BRF9FUlJfQ0FOVF9XUklURSIsCiAgICAgICJVUExPQURfRVJSX0VYVEVOU0lPTiIsICJDQUxfR1JFR09SSUFOIiwgIkNBTF9KVUxJQU4iLCAiQ0FMX0pFV0lTSCIsCiAgICAgICJDQUxfRlJFTkNIIiwgIkNBTF9OVU1fQ0FMUyIsICJDQUxfRE9XX0RBWU5PIiwgIkNBTF9ET1dfU0hPUlQiLCAiQ0FMX0RPV19MT05HIiwKICAgICAgIkNBTF9NT05USF9HUkVHT1JJQU5fU0hPUlQiLCAiQ0FMX01PTlRIX0dSRUdPUklBTl9MT05HIiwKICAgICAgIkNBTF9NT05USF9KVUxJQU5fU0hPUlQiLCAiQ0FMX01PTlRIX0pVTElBTl9MT05HIiwgIkNBTF9NT05USF9KRVdJU0giLAogICAgICAiQ0FMX01PTlRIX0ZSRU5DSCIsICJDQUxfRUFTVEVSX0RFRkFVTFQiLCAiQ0FMX0VBU1RFUl9ST01BTiIsCiAgICAgICJDQUxfRUFTVEVSX0FMV0FZU19HUkVHT1JJQU4iLCAiQ0FMX0VBU1RFUl9BTFdBWVNfSlVMSUFOIiwKICAgICAgIkNBTF9KRVdJU0hfQUREX0FMQUZJTV9HRVJFU0giLCAiQ0FMX0pFV0lTSF9BRERfQUxBRklNIiwKICAgICAgIkNBTF9KRVdJU0hfQUREX0dFUkVTSEFZSU0iLCAiQ0xTQ1RYX0lOUFJPQ19TRVJWRVIiLCAiQ0xTQ1RYX0lOUFJPQ19IQU5ETEVSIiwKICAgICAgIkNMU0NUWF9MT0NBTF9TRVJWRVIiLCAiQ0xTQ1RYX1JFTU9URV9TRVJWRVIiLCAiQ0xTQ1RYX1NFUlZFUiIsICJDTFNDVFhfQUxMIiwKICAgICAgIlZUX05VTEwiLCAiVlRfRU1QVFkiLCAiVlRfVUkxIiwgIlZUX0kxIiwgIlZUX1VJMiIsICJWVF9JMiIsICJWVF9VSTQiLCAiVlRfSTQiLAogICAgICAiVlRfUjQiLCAiVlRfUjgiLCAiVlRfQk9PTCIsICJWVF9FUlJPUiIsICJWVF9DWSIsICJWVF9EQVRFIiwgIlZUX0JTVFIiLAogICAgICAiVlRfREVDSU1BTCIsICJWVF9VTktOT1dOIiwgIlZUX0RJU1BBVENIIiwgIlZUX1ZBUklBTlQiLCAiVlRfSU5UIiwgIlZUX1VJTlQiLAogICAgICAiVlRfQVJSQVkiLCAiVlRfQllSRUYiLCAiQ1BfQUNQIiwgIkNQX01BQ0NQIiwgIkNQX09FTUNQIiwgIkNQX1VURjciLCAiQ1BfVVRGOCIsCiAgICAgICJDUF9TWU1CT0wiLCAiQ1BfVEhSRUFEX0FDUCIsICJWQVJDTVBfTFQiLCAiVkFSQ01QX0VRIiwgIlZBUkNNUF9HVCIsCiAgICAgICJWQVJDTVBfTlVMTCIsICJOT1JNX0lHTk9SRUNBU0UiLCAiTk9STV9JR05PUkVOT05TUEFDRSIsICJOT1JNX0lHTk9SRVNZTUJPTFMiLAogICAgICAiTk9STV9JR05PUkVXSURUSCIsICJOT1JNX0lHTk9SRUtBTkFUWVBFIiwgIkRJU1BfRV9ESVZCWVpFUk8iLAogICAgICAiRElTUF9FX09WRVJGTE9XIiwgIkRJU1BfRV9CQURJTkRFWCIsICJNS19FX1VOQVZBSUxBQkxFIiwgIklOUFVUX1BPU1QiLAogICAgICAiSU5QVVRfR0VUIiwgIklOUFVUX0NPT0tJRSIsICJJTlBVVF9FTlYiLCAiSU5QVVRfU0VSVkVSIiwgIklOUFVUX1NFU1NJT04iLAogICAgICAiSU5QVVRfUkVRVUVTVCIsICJGSUxURVJfRkxBR19OT05FIiwgIkZJTFRFUl9SRVFVSVJFX1NDQUxBUiIsCiAgICAgICJGSUxURVJfUkVRVUlSRV9BUlJBWSIsICJGSUxURVJfRk9SQ0VfQVJSQVkiLCAiRklMVEVSX05VTExfT05fRkFJTFVSRSIsCiAgICAgICJGSUxURVJfVkFMSURBVEVfSU5UIiwgIkZJTFRFUl9WQUxJREFURV9CT09MRUFOIiwgIkZJTFRFUl9WQUxJREFURV9GTE9BVCIsCiAgICAgICJGSUxURVJfVkFMSURBVEVfUkVHRVhQIiwgIkZJTFRFUl9WQUxJREFURV9VUkwiLCAiRklMVEVSX1ZBTElEQVRFX0VNQUlMIiwKICAgICAgIkZJTFRFUl9WQUxJREFURV9JUCIsICJGSUxURVJfREVGQVVMVCIsICJGSUxURVJfVU5TQUZFX1JBVyIsCiAgICAgICJGSUxURVJfU0FOSVRJWkVfU1RSSU5HIiwgIkZJTFRFUl9TQU5JVElaRV9TVFJJUFBFRCIsCiAgICAgICJGSUxURVJfU0FOSVRJWkVfRU5DT0RFRCIsICJGSUxURVJfU0FOSVRJWkVfU1BFQ0lBTF9DSEFSUyIsCiAgICAgICJGSUxURVJfU0FOSVRJWkVfRU1BSUwiLCAiRklMVEVSX1NBTklUSVpFX1VSTCIsICJGSUxURVJfU0FOSVRJWkVfTlVNQkVSX0lOVCIsCiAgICAgICJGSUxURVJfU0FOSVRJWkVfTlVNQkVSX0ZMT0FUIiwgIkZJTFRFUl9TQU5JVElaRV9NQUdJQ19RVU9URVMiLAogICAgICAiRklMVEVSX0NBTExCQUNLIiwgIkZJTFRFUl9GTEFHX0FMTE9XX09DVEFMIiwgIkZJTFRFUl9GTEFHX0FMTE9XX0hFWCIsCiAgICAgICJGSUxURVJfRkxBR19TVFJJUF9MT1ciLCAiRklMVEVSX0ZMQUdfU1RSSVBfSElHSCIsICJGSUxURVJfRkxBR19FTkNPREVfTE9XIiwKICAgICAgIkZJTFRFUl9GTEFHX0VOQ09ERV9ISUdIIiwgIkZJTFRFUl9GTEFHX0VOQ09ERV9BTVAiLAogICAgICAiRklMVEVSX0ZMQUdfTk9fRU5DT0RFX1FVT1RFUyIsICJGSUxURVJfRkxBR19FTVBUWV9TVFJJTkdfTlVMTCIsCiAgICAgICJGSUxURVJfRkxBR19BTExPV19GUkFDVElPTiIsICJGSUxURVJfRkxBR19BTExPV19USE9VU0FORCIsCiAgICAgICJGSUxURVJfRkxBR19BTExPV19TQ0lFTlRJRklDIiwgIkZJTFRFUl9GTEFHX1NDSEVNRV9SRVFVSVJFRCIsCiAgICAgICJGSUxURVJfRkxBR19IT1NUX1JFUVVJUkVEIiwgIkZJTFRFUl9GTEFHX1BBVEhfUkVRVUlSRUQiLAogICAgICAiRklMVEVSX0ZMQUdfUVVFUllfUkVRVUlSRUQiLCAiRklMVEVSX0ZMQUdfSVBWNCIsICJGSUxURVJfRkxBR19JUFY2IiwKICAgICAgIkZJTFRFUl9GTEFHX05PX1JFU19SQU5HRSIsICJGSUxURVJfRkxBR19OT19QUklWX1JBTkdFIiwgIkZUUF9BU0NJSSIsCiAgICAgICJGVFBfVEVYVCIsICJGVFBfQklOQVJZIiwgIkZUUF9JTUFHRSIsICJGVFBfQVVUT1JFU1VNRSIsICJGVFBfVElNRU9VVF9TRUMiLAogICAgICAiRlRQX0FVVE9TRUVLIiwgIkZUUF9GQUlMRUQiLCAiRlRQX0ZJTklTSEVEIiwgIkZUUF9NT1JFREFUQSIsICJIQVNIX0hNQUMiLAogICAgICAiSUNPTlZfSU1QTCIsICJJQ09OVl9WRVJTSU9OIiwgIklDT05WX01JTUVfREVDT0RFX1NUUklDVCIsCiAgICAgICJJQ09OVl9NSU1FX0RFQ09ERV9DT05USU5VRV9PTl9FUlJPUiIsICJPREJDX1RZUEUiLCAiT0RCQ19CSU5NT0RFX1BBU1NUSFJVIiwKICAgICAgIk9EQkNfQklOTU9ERV9SRVRVUk4iLCAiT0RCQ19CSU5NT0RFX0NPTlZFUlQiLCAiU1FMX09EQkNfQ1VSU09SUyIsCiAgICAgICJTUUxfQ1VSX1VTRV9EUklWRVIiLCAiU1FMX0NVUl9VU0VfSUZfTkVFREVEIiwgIlNRTF9DVVJfVVNFX09EQkMiLAogICAgICAiU1FMX0NPTkNVUlJFTkNZIiwgIlNRTF9DT05DVVJfUkVBRF9PTkxZIiwgIlNRTF9DT05DVVJfTE9DSyIsCiAgICAgICJTUUxfQ09OQ1VSX1JPV1ZFUiIsICJTUUxfQ09OQ1VSX1ZBTFVFUyIsICJTUUxfQ1VSU09SX1RZUEUiLAogICAgICAiU1FMX0NVUlNPUl9GT1JXQVJEX09OTFkiLCAiU1FMX0NVUlNPUl9LRVlTRVRfRFJJVkVOIiwgIlNRTF9DVVJTT1JfRFlOQU1JQyIsCiAgICAgICJTUUxfQ1VSU09SX1NUQVRJQyIsICJTUUxfS0VZU0VUX1NJWkUiLCAiU1FMX0ZFVENIX0ZJUlNUIiwgIlNRTF9GRVRDSF9ORVhUIiwKICAgICAgIlNRTF9DSEFSIiwgIlNRTF9WQVJDSEFSIiwgIlNRTF9MT05HVkFSQ0hBUiIsICJTUUxfREVDSU1BTCIsICJTUUxfTlVNRVJJQyIsCiAgICAgICJTUUxfQklUIiwgIlNRTF9USU5ZSU5UIiwgIlNRTF9TTUFMTElOVCIsICJTUUxfSU5URUdFUiIsICJTUUxfQklHSU5UIiwKICAgICAgIlNRTF9SRUFMIiwgIlNRTF9GTE9BVCIsICJTUUxfRE9VQkxFIiwgIlNRTF9CSU5BUlkiLCAiU1FMX1ZBUkJJTkFSWSIsCiAgICAgICJTUUxfTE9OR1ZBUkJJTkFSWSIsICJTUUxfREFURSIsICJTUUxfVElNRSIsICJTUUxfVElNRVNUQU1QIiwKICAgICAgIlBSRUdfUEFUVEVSTl9PUkRFUiIsICJQUkVHX1NFVF9PUkRFUiIsICJQUkVHX09GRlNFVF9DQVBUVVJFIiwKICAgICAgIlBSRUdfU1BMSVRfTk9fRU1QVFkiLCAiUFJFR19TUExJVF9ERUxJTV9DQVBUVVJFIiwgIlBSRUdfU1BMSVRfT0ZGU0VUX0NBUFRVUkUiLAogICAgICAiUFJFR19HUkVQX0lOVkVSVCIsICJQUkVHX05PX0VSUk9SIiwgIlBSRUdfSU5URVJOQUxfRVJST1IiLAogICAgICAiUFJFR19CQUNLVFJBQ0tfTElNSVRfRVJST1IiLCAiUFJFR19SRUNVUlNJT05fTElNSVRfRVJST1IiLAogICAgICAiUFJFR19CQURfVVRGOF9FUlJPUiIsICJEQVRFX0FUT00iLCAiREFURV9DT09LSUUiLCAiREFURV9JU084NjAxIiwKICAgICAgIkRBVEVfUkZDODIyIiwgIkRBVEVfUkZDODUwIiwgIkRBVEVfUkZDMTAzNiIsICJEQVRFX1JGQzExMjMiLCAiREFURV9SRkMyODIyIiwKICAgICAgIkRBVEVfUkZDMzMzOSIsICJEQVRFX1JTUyIsICJEQVRFX1czQyIsICJTVU5GVU5DU19SRVRfVElNRVNUQU1QIiwKICAgICAgIlNVTkZVTkNTX1JFVF9TVFJJTkciLCAiU1VORlVOQ1NfUkVUX0RPVUJMRSIsICJMSUJYTUxfVkVSU0lPTiIsCiAgICAgICJMSUJYTUxfRE9UVEVEX1ZFUlNJT04iLCAiTElCWE1MX05PRU5UIiwgIkxJQlhNTF9EVERMT0FEIiwgIkxJQlhNTF9EVERBVFRSIiwKICAgICAgIkxJQlhNTF9EVERWQUxJRCIsICJMSUJYTUxfTk9FUlJPUiIsICJMSUJYTUxfTk9XQVJOSU5HIiwgIkxJQlhNTF9OT0JMQU5LUyIsCiAgICAgICJMSUJYTUxfWElOQ0xVREUiLCAiTElCWE1MX05TQ0xFQU4iLCAiTElCWE1MX05PQ0RBVEEiLCAiTElCWE1MX05PTkVUIiwKICAgICAgIkxJQlhNTF9DT01QQUNUIiwgIkxJQlhNTF9OT1hNTERFQ0wiLCAiTElCWE1MX05PRU1QVFlUQUciLCAiTElCWE1MX0VSUl9OT05FIiwKICAgICAgIkxJQlhNTF9FUlJfV0FSTklORyIsICJMSUJYTUxfRVJSX0VSUk9SIiwgIkxJQlhNTF9FUlJfRkFUQUwiLAogICAgICAiQ09OTkVDVElPTl9BQk9SVEVEIiwgIkNPTk5FQ1RJT05fTk9STUFMIiwgIkNPTk5FQ1RJT05fVElNRU9VVCIsICJJTklfVVNFUiIsCiAgICAgICJJTklfUEVSRElSIiwgIklOSV9TWVNURU0iLCAiSU5JX0FMTCIsICJQSFBfVVJMX1NDSEVNRSIsICJQSFBfVVJMX0hPU1QiLAogICAgICAiUEhQX1VSTF9QT1JUIiwgIlBIUF9VUkxfVVNFUiIsICJQSFBfVVJMX1BBU1MiLCAiUEhQX1VSTF9QQVRIIiwKICAgICAgIlBIUF9VUkxfUVVFUlkiLCAiUEhQX1VSTF9GUkFHTUVOVCIsICJNX0UiLCAiTV9MT0cyRSIsICJNX0xPRzEwRSIsICJNX0xOMiIsCiAgICAgICJNX0xOMTAiLCAiTV9QSSIsICJNX1BJXzIiLCAiTV9QSV80IiwgIk1fMV9QSSIsICJNXzJfUEkiLCAiTV9TUVJUUEkiLAogICAgICAiTV8yX1NRUlRQSSIsICJNX0xOUEkiLCAiTV9FVUxFUiIsICJNX1NRUlQyIiwgIk1fU1FSVDFfMiIsICJNX1NRUlQzIiwgIklORiIsCiAgICAgICJOQU4iLCAiSU5GT19HRU5FUkFMIiwgIklORk9fQ1JFRElUUyIsICJJTkZPX0NPTkZJR1VSQVRJT04iLCAiSU5GT19NT0RVTEVTIiwKICAgICAgIklORk9fRU5WSVJPTk1FTlQiLCAiSU5GT19WQVJJQUJMRVMiLCAiSU5GT19MSUNFTlNFIiwgIklORk9fQUxMIiwKICAgICAgIkNSRURJVFNfR1JPVVAiLCAiQ1JFRElUU19HRU5FUkFMIiwgIkNSRURJVFNfU0FQSSIsICJDUkVESVRTX01PRFVMRVMiLAogICAgICAiQ1JFRElUU19ET0NTIiwgIkNSRURJVFNfRlVMTFBBR0UiLCAiQ1JFRElUU19RQSIsICJDUkVESVRTX0FMTCIsCiAgICAgICJIVE1MX1NQRUNJQUxDSEFSUyIsICJIVE1MX0VOVElUSUVTIiwgIkVOVF9DT01QQVQiLCAiRU5UX1FVT1RFUyIsCiAgICAgICJFTlRfTk9RVU9URVMiLCAiU1RSX1BBRF9MRUZUIiwgIlNUUl9QQURfUklHSFQiLCAiU1RSX1BBRF9CT1RIIiwKICAgICAgIlBBVEhJTkZPX0RJUk5BTUUiLCAiUEFUSElORk9fQkFTRU5BTUUiLCAiUEFUSElORk9fRVhURU5TSU9OIiwKICAgICAgIlBBVEhJTkZPX0ZJTEVOQU1FIiwgIkNIQVJfTUFYIiwgIkxDX0NUWVBFIiwgIkxDX05VTUVSSUMiLCAiTENfVElNRSIsCiAgICAgICJMQ19DT0xMQVRFIiwgIkxDX01PTkVUQVJZIiwgIkxDX0FMTCIsICJTRUVLX1NFVCIsICJTRUVLX0NVUiIsICJTRUVLX0VORCIsCiAgICAgICJMT0NLX1NIIiwgIkxPQ0tfRVgiLCAiTE9DS19VTiIsICJMT0NLX05CIiwgIlNUUkVBTV9OT1RJRllfQ09OTkVDVCIsCiAgICAgICJTVFJFQU1fTk9USUZZX0FVVEhfUkVRVUlSRUQiLCAiU1RSRUFNX05PVElGWV9BVVRIX1JFU1VMVCIsCiAgICAgICJTVFJFQU1fTk9USUZZX01JTUVfVFlQRV9JUyIsICJTVFJFQU1fTk9USUZZX0ZJTEVfU0laRV9JUyIsCiAgICAgICJTVFJFQU1fTk9USUZZX1JFRElSRUNURUQiLCAiU1RSRUFNX05PVElGWV9QUk9HUkVTUyIsICJTVFJFQU1fTk9USUZZX0ZBSUxVUkUiLAogICAgICAiU1RSRUFNX05PVElGWV9DT01QTEVURUQiLCAiU1RSRUFNX05PVElGWV9SRVNPTFZFIiwKICAgICAgIlNUUkVBTV9OT1RJRllfU0VWRVJJVFlfSU5GTyIsICJTVFJFQU1fTk9USUZZX1NFVkVSSVRZX1dBUk4iLAogICAgICAiU1RSRUFNX05PVElGWV9TRVZFUklUWV9FUlIiLCAiU1RSRUFNX0ZJTFRFUl9SRUFEIiwgIlNUUkVBTV9GSUxURVJfV1JJVEUiLAogICAgICAiU1RSRUFNX0ZJTFRFUl9BTEwiLCAiU1RSRUFNX0NMSUVOVF9QRVJTSVNURU5UIiwgIlNUUkVBTV9DTElFTlRfQVNZTkNfQ09OTkVDVCIsCiAgICAgICJTVFJFQU1fQ0xJRU5UX0NPTk5FQ1QiLCAiU1RSRUFNX0NSWVBUT19NRVRIT0RfU1NMdjJfQ0xJRU5UIiwKICAgICAgIlNUUkVBTV9DUllQVE9fTUVUSE9EX1NTTHYzX0NMSUVOVCIsICJTVFJFQU1fQ1JZUFRPX01FVEhPRF9TU0x2MjNfQ0xJRU5UIiwKICAgICAgIlNUUkVBTV9DUllQVE9fTUVUSE9EX1RMU19DTElFTlQiLCAiU1RSRUFNX0NSWVBUT19NRVRIT0RfU1NMdjJfU0VSVkVSIiwKICAgICAgIlNUUkVBTV9DUllQVE9fTUVUSE9EX1NTTHYzX1NFUlZFUiIsICJTVFJFQU1fQ1JZUFRPX01FVEhPRF9TU0x2MjNfU0VSVkVSIiwKICAgICAgIlNUUkVBTV9DUllQVE9fTUVUSE9EX1RMU19TRVJWRVIiLCAiU1RSRUFNX1NIVVRfUkQiLCAiU1RSRUFNX1NIVVRfV1IiLAogICAgICAiU1RSRUFNX1NIVVRfUkRXUiIsICJTVFJFQU1fUEZfSU5FVCIsICJTVFJFQU1fUEZfSU5FVDYiLCAiU1RSRUFNX1BGX1VOSVgiLAogICAgICAiU1RSRUFNX0lQUFJPVE9fSVAiLCAiU1RSRUFNX0lQUFJPVE9fVENQIiwgIlNUUkVBTV9JUFBST1RPX1VEUCIsCiAgICAgICJTVFJFQU1fSVBQUk9UT19JQ01QIiwgIlNUUkVBTV9JUFBST1RPX1JBVyIsICJTVFJFQU1fU09DS19TVFJFQU0iLAogICAgICAiU1RSRUFNX1NPQ0tfREdSQU0iLCAiU1RSRUFNX1NPQ0tfUkFXIiwgIlNUUkVBTV9TT0NLX1NFUVBBQ0tFVCIsCiAgICAgICJTVFJFQU1fU09DS19SRE0iLCAiU1RSRUFNX1BFRUsiLCAiU1RSRUFNX09PQiIsICJTVFJFQU1fU0VSVkVSX0JJTkQiLAogICAgICAiU1RSRUFNX1NFUlZFUl9MSVNURU4iLCAiRklMRV9VU0VfSU5DTFVERV9QQVRIIiwgIkZJTEVfSUdOT1JFX05FV19MSU5FUyIsCiAgICAgICJGSUxFX1NLSVBfRU1QVFlfTElORVMiLCAiRklMRV9BUFBFTkQiLCAiRklMRV9OT19ERUZBVUxUX0NPTlRFWFQiLAogICAgICAiUFNGU19QQVNTX09OIiwgIlBTRlNfRkVFRF9NRSIsICJQU0ZTX0VSUl9GQVRBTCIsICJQU0ZTX0ZMQUdfTk9STUFMIiwKICAgICAgIlBTRlNfRkxBR19GTFVTSF9JTkMiLCAiUFNGU19GTEFHX0ZMVVNIX0NMT1NFIiwgIkNSWVBUX1NBTFRfTEVOR1RIIiwKICAgICAgIkNSWVBUX1NURF9ERVMiLCAiQ1JZUFRfRVhUX0RFUyIsICJDUllQVF9NRDUiLCAiQ1JZUFRfQkxPV0ZJU0giLAogICAgICAiRElSRUNUT1JZX1NFUEFSQVRPUiIsICJQQVRIX1NFUEFSQVRPUiIsICJHTE9CX0JSQUNFIiwgIkdMT0JfTUFSSyIsCiAgICAgICJHTE9CX05PU09SVCIsICJHTE9CX05PQ0hFQ0siLCAiR0xPQl9OT0VTQ0FQRSIsICJHTE9CX0VSUiIsICJHTE9CX09OTFlESVIiLAogICAgICAiTE9HX0VNRVJHIiwgIkxPR19BTEVSVCIsICJMT0dfQ1JJVCIsICJMT0dfRVJSIiwgIkxPR19XQVJOSU5HIiwgIkxPR19OT1RJQ0UiLAogICAgICAiTE9HX0lORk8iLCAiTE9HX0RFQlVHIiwgIkxPR19LRVJOIiwgIkxPR19VU0VSIiwgIkxPR19NQUlMIiwgIkxPR19EQUVNT04iLAogICAgICAiTE9HX0FVVEgiLCAiTE9HX1NZU0xPRyIsICJMT0dfTFBSIiwgIkxPR19ORVdTIiwgIkxPR19VVUNQIiwgIkxPR19DUk9OIiwKICAgICAgIkxPR19BVVRIUFJJViIsICJMT0dfUElEIiwgIkxPR19DT05TIiwgIkxPR19PREVMQVkiLCAiTE9HX05ERUxBWSIsCiAgICAgICJMT0dfTk9XQUlUIiwgIkxPR19QRVJST1IiLCAiRVhUUl9PVkVSV1JJVEUiLCAiRVhUUl9TS0lQIiwgIkVYVFJfUFJFRklYX1NBTUUiLAogICAgICAiRVhUUl9QUkVGSVhfQUxMIiwgIkVYVFJfUFJFRklYX0lOVkFMSUQiLCAiRVhUUl9QUkVGSVhfSUZfRVhJU1RTIiwKICAgICAgIkVYVFJfSUZfRVhJU1RTIiwgIkVYVFJfUkVGUyIsICJTT1JUX0FTQyIsICJTT1JUX0RFU0MiLCAiU09SVF9SRUdVTEFSIiwKICAgICAgIlNPUlRfTlVNRVJJQyIsICJTT1JUX1NUUklORyIsICJTT1JUX0xPQ0FMRV9TVFJJTkciLCAiQ0FTRV9MT1dFUiIsCiAgICAgICJDQVNFX1VQUEVSIiwgIkNPVU5UX05PUk1BTCIsICJDT1VOVF9SRUNVUlNJVkUiLCAiQVNTRVJUX0FDVElWRSIsCiAgICAgICJBU1NFUlRfQ0FMTEJBQ0siLCAiQVNTRVJUX0JBSUwiLCAiQVNTRVJUX1dBUk5JTkciLCAiQVNTRVJUX1FVSUVUX0VWQUwiLAogICAgICAiU1RSRUFNX1VTRV9QQVRIIiwgIlNUUkVBTV9JR05PUkVfVVJMIiwgIlNUUkVBTV9FTkZPUkNFX1NBRkVfTU9ERSIsCiAgICAgICJTVFJFQU1fUkVQT1JUX0VSUk9SUyIsICJTVFJFQU1fTVVTVF9TRUVLIiwgIlNUUkVBTV9VUkxfU1RBVF9MSU5LIiwKICAgICAgIlNUUkVBTV9VUkxfU1RBVF9RVUlFVCIsICJTVFJFQU1fTUtESVJfUkVDVVJTSVZFIiwgIklNQUdFVFlQRV9HSUYiLAogICAgICAiSU1BR0VUWVBFX0pQRUciLCAiSU1BR0VUWVBFX1BORyIsICJJTUFHRVRZUEVfU1dGIiwgIklNQUdFVFlQRV9QU0QiLAogICAgICAiSU1BR0VUWVBFX0JNUCIsICJJTUFHRVRZUEVfVElGRl9JSSIsICJJTUFHRVRZUEVfVElGRl9NTSIsICJJTUFHRVRZUEVfSlBDIiwKICAgICAgIklNQUdFVFlQRV9KUDIiLCAiSU1BR0VUWVBFX0pQWCIsICJJTUFHRVRZUEVfSkIyIiwgIklNQUdFVFlQRV9TV0MiLAogICAgICAiSU1BR0VUWVBFX0lGRiIsICJJTUFHRVRZUEVfV0JNUCIsICJJTUFHRVRZUEVfSlBFRzIwMDAiLCAiSU1BR0VUWVBFX1hCTSIsCiAgICAgICJUX0lOQ0xVREUiLCAiVF9JTkNMVURFX09OQ0UiLCAiVF9FVkFMIiwgIlRfUkVRVUlSRSIsICJUX1JFUVVJUkVfT05DRSIsCiAgICAgICJUX0xPR0lDQUxfT1IiLCAiVF9MT0dJQ0FMX1hPUiIsICJUX0xPR0lDQUxfQU5EIiwgIlRfUFJJTlQiLCAiVF9QTFVTX0VRVUFMIiwKICAgICAgIlRfTUlOVVNfRVFVQUwiLCAiVF9NVUxfRVFVQUwiLCAiVF9ESVZfRVFVQUwiLCAiVF9DT05DQVRfRVFVQUwiLCAiVF9NT0RfRVFVQUwiLAogICAgICAiVF9BTkRfRVFVQUwiLCAiVF9PUl9FUVVBTCIsICJUX1hPUl9FUVVBTCIsICJUX1NMX0VRVUFMIiwgIlRfU1JfRVFVQUwiLAogICAgICAiVF9CT09MRUFOX09SIiwgIlRfQk9PTEVBTl9BTkQiLCAiVF9JU19FUVVBTCIsICJUX0lTX05PVF9FUVVBTCIsCiAgICAgICJUX0lTX0lERU5USUNBTCIsICJUX0lTX05PVF9JREVOVElDQUwiLCAiVF9JU19TTUFMTEVSX09SX0VRVUFMIiwKICAgICAgIlRfSVNfR1JFQVRFUl9PUl9FUVVBTCIsICJUX1NMIiwgIlRfU1IiLCAiVF9JTkMiLCAiVF9ERUMiLCAiVF9JTlRfQ0FTVCIsCiAgICAgICJUX0RPVUJMRV9DQVNUIiwgIlRfU1RSSU5HX0NBU1QiLCAiVF9BUlJBWV9DQVNUIiwgIlRfT0JKRUNUX0NBU1QiLAogICAgICAiVF9CT09MX0NBU1QiLCAiVF9VTlNFVF9DQVNUIiwgIlRfTkVXIiwgIlRfRVhJVCIsICJUX0lGIiwgIlRfRUxTRUlGIiwgIlRfRUxTRSIsCiAgICAgICJUX0VORElGIiwgIlRfTE5VTUJFUiIsICJUX0ROVU1CRVIiLCAiVF9TVFJJTkciLCAiVF9TVFJJTkdfVkFSTkFNRSIsCiAgICAgICJUX1ZBUklBQkxFIiwgIlRfTlVNX1NUUklORyIsICJUX0lOTElORV9IVE1MIiwgIlRfQ0hBUkFDVEVSIiwKICAgICAgIlRfQkFEX0NIQVJBQ1RFUiIsICJUX0VOQ0FQU0VEX0FORF9XSElURVNQQUNFIiwgIlRfQ09OU1RBTlRfRU5DQVBTRURfU1RSSU5HIiwKICAgICAgIlRfRUNITyIsICJUX0RPIiwgIlRfV0hJTEUiLCAiVF9FTkRXSElMRSIsICJUX0ZPUiIsICJUX0VOREZPUiIsICJUX0ZPUkVBQ0giLAogICAgICAiVF9FTkRGT1JFQUNIIiwgIlRfREVDTEFSRSIsICJUX0VORERFQ0xBUkUiLCAiVF9BUyIsICJUX1NXSVRDSCIsICJUX0VORFNXSVRDSCIsCiAgICAgICJUX0NBU0UiLCAiVF9ERUZBVUxUIiwgIlRfQlJFQUsiLCAiVF9DT05USU5VRSIsICJUX0ZVTkNUSU9OIiwgIlRfQ09OU1QiLAogICAgICAiVF9SRVRVUk4iLCAiVF9VU0UiLCAiVF9HTE9CQUwiLCAiVF9TVEFUSUMiLCAiVF9WQVIiLCAiVF9VTlNFVCIsICJUX0lTU0VUIiwKICAgICAgIlRfRU1QVFkiLCAiVF9DTEFTUyIsICJUX0VYVEVORFMiLCAiVF9JTlRFUkZBQ0UiLCAiVF9JTVBMRU1FTlRTIiwKICAgICAgIlRfT0JKRUNUX09QRVJBVE9SIiwgIlRfRE9VQkxFX0FSUk9XIiwgIlRfTElTVCIsICJUX0FSUkFZIiwgIlRfQ0xBU1NfQyIsCiAgICAgICJUX0ZVTkNfQyIsICJUX01FVEhPRF9DIiwgIlRfTElORSIsICJUX0ZJTEUiLCAiVF9DT01NRU5UIiwgIlRfRE9DX0NPTU1FTlQiLAogICAgICAiVF9PUEVOX1RBRyIsICJUX09QRU5fVEFHX1dJVEhfRUNITyIsICJUX0NMT1NFX1RBRyIsICJUX1dISVRFU1BBQ0UiLAogICAgICAiVF9TVEFSVF9IRVJFRE9DIiwgIlRfRU5EX0hFUkVET0MiLCAiVF9ET0xMQVJfT1BFTl9DVVJMWV9CUkFDRVMiLAogICAgICAiVF9DVVJMWV9PUEVOIiwgIlRfUEFBTUFZSU1fTkVLVURPVEFZSU0iLCAiVF9ET1VCTEVfQ09MT04iLCAiVF9BQlNUUkFDVCIsCiAgICAgICJUX0NBVENIIiwgIlRfRklOQUwiLCAiVF9JTlNUQU5DRU9GIiwgIlRfUFJJVkFURSIsICJUX1BST1RFQ1RFRCIsICJUX1BVQkxJQyIsCiAgICAgICJUX1RIUk9XIiwgIlRfVFJZIiwgIlRfQ0xPTkUiLCAiVF9IQUxUX0NPTVBJTEVSIiwgIkZPUkNFX0daSVAiLAogICAgICAiRk9SQ0VfREVGTEFURSIsICJYTUxfRUxFTUVOVF9OT0RFIiwgIlhNTF9BVFRSSUJVVEVfTk9ERSIsICJYTUxfVEVYVF9OT0RFIiwKICAgICAgIlhNTF9DREFUQV9TRUNUSU9OX05PREUiLCAiWE1MX0VOVElUWV9SRUZfTk9ERSIsICJYTUxfRU5USVRZX05PREUiLAogICAgICAiWE1MX1BJX05PREUiLCAiWE1MX0NPTU1FTlRfTk9ERSIsICJYTUxfRE9DVU1FTlRfTk9ERSIsCiAgICAgICJYTUxfRE9DVU1FTlRfVFlQRV9OT0RFIiwgIlhNTF9ET0NVTUVOVF9GUkFHX05PREUiLCAiWE1MX05PVEFUSU9OX05PREUiLAogICAgICAiWE1MX0hUTUxfRE9DVU1FTlRfTk9ERSIsICJYTUxfRFREX05PREUiLCAiWE1MX0VMRU1FTlRfREVDTF9OT0RFIiwKICAgICAgIlhNTF9BVFRSSUJVVEVfREVDTF9OT0RFIiwgIlhNTF9FTlRJVFlfREVDTF9OT0RFIiwgIlhNTF9OQU1FU1BBQ0VfREVDTF9OT0RFIiwKICAgICAgIlhNTF9MT0NBTF9OQU1FU1BBQ0UiLCAiWE1MX0FUVFJJQlVURV9DREFUQSIsICJYTUxfQVRUUklCVVRFX0lEIiwKICAgICAgIlhNTF9BVFRSSUJVVEVfSURSRUYiLCAiWE1MX0FUVFJJQlVURV9JRFJFRlMiLCAiWE1MX0FUVFJJQlVURV9FTlRJVFkiLAogICAgICAiWE1MX0FUVFJJQlVURV9OTVRPS0VOIiwgIlhNTF9BVFRSSUJVVEVfTk1UT0tFTlMiLCAiWE1MX0FUVFJJQlVURV9FTlVNRVJBVElPTiIsCiAgICAgICJYTUxfQVRUUklCVVRFX05PVEFUSU9OIiwgIkRPTV9QSFBfRVJSIiwgIkRPTV9JTkRFWF9TSVpFX0VSUiIsCiAgICAgICJET01TVFJJTkdfU0laRV9FUlIiLCAiRE9NX0hJRVJBUkNIWV9SRVFVRVNUX0VSUiIsICJET01fV1JPTkdfRE9DVU1FTlRfRVJSIiwKICAgICAgIkRPTV9JTlZBTElEX0NIQVJBQ1RFUl9FUlIiLCAiRE9NX05PX0RBVEFfQUxMT1dFRF9FUlIiLAogICAgICAiRE9NX05PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiIsICJET01fTk9UX0ZPVU5EX0VSUiIsCiAgICAgICJET01fTk9UX1NVUFBPUlRFRF9FUlIiLCAiRE9NX0lOVVNFX0FUVFJJQlVURV9FUlIiLCAiRE9NX0lOVkFMSURfU1RBVEVfRVJSIiwKICAgICAgIkRPTV9TWU5UQVhfRVJSIiwgIkRPTV9JTlZBTElEX01PRElGSUNBVElPTl9FUlIiLCAiRE9NX05BTUVTUEFDRV9FUlIiLAogICAgICAiRE9NX0lOVkFMSURfQUNDRVNTX0VSUiIsICJET01fVkFMSURBVElPTl9FUlIiLCAiWE1MX0VSUk9SX05PTkUiLAogICAgICAiWE1MX0VSUk9SX05PX01FTU9SWSIsICJYTUxfRVJST1JfU1lOVEFYIiwgIlhNTF9FUlJPUl9OT19FTEVNRU5UUyIsCiAgICAgICJYTUxfRVJST1JfSU5WQUxJRF9UT0tFTiIsICJYTUxfRVJST1JfVU5DTE9TRURfVE9LRU4iLAogICAgICAiWE1MX0VSUk9SX1BBUlRJQUxfQ0hBUiIsICJYTUxfRVJST1JfVEFHX01JU01BVENIIiwKICAgICAgIlhNTF9FUlJPUl9EVVBMSUNBVEVfQVRUUklCVVRFIiwgIlhNTF9FUlJPUl9KVU5LX0FGVEVSX0RPQ19FTEVNRU5UIiwKICAgICAgIlhNTF9FUlJPUl9QQVJBTV9FTlRJVFlfUkVGIiwgIlhNTF9FUlJPUl9VTkRFRklORURfRU5USVRZIiwKICAgICAgIlhNTF9FUlJPUl9SRUNVUlNJVkVfRU5USVRZX1JFRiIsICJYTUxfRVJST1JfQVNZTkNfRU5USVRZIiwKICAgICAgIlhNTF9FUlJPUl9CQURfQ0hBUl9SRUYiLCAiWE1MX0VSUk9SX0JJTkFSWV9FTlRJVFlfUkVGIiwKICAgICAgIlhNTF9FUlJPUl9BVFRSSUJVVEVfRVhURVJOQUxfRU5USVRZX1JFRiIsICJYTUxfRVJST1JfTUlTUExBQ0VEX1hNTF9QSSIsCiAgICAgICJYTUxfRVJST1JfVU5LTk9XTl9FTkNPRElORyIsICJYTUxfRVJST1JfSU5DT1JSRUNUX0VOQ09ESU5HIiwKICAgICAgIlhNTF9FUlJPUl9VTkNMT1NFRF9DREFUQV9TRUNUSU9OIiwgIlhNTF9FUlJPUl9FWFRFUk5BTF9FTlRJVFlfSEFORExJTkciLAogICAgICAiWE1MX09QVElPTl9DQVNFX0ZPTERJTkciLCAiWE1MX09QVElPTl9UQVJHRVRfRU5DT0RJTkciLAogICAgICAiWE1MX09QVElPTl9TS0lQX1RBR1NUQVJUIiwgIlhNTF9PUFRJT05fU0tJUF9XSElURSIsICJYTUxfU0FYX0lNUEwiLCAiSU1HX0dJRiIsCiAgICAgICJJTUdfSlBHIiwgIklNR19KUEVHIiwgIklNR19QTkciLCAiSU1HX1dCTVAiLCAiSU1HX1hQTSIsICJJTUdfQ09MT1JfVElMRUQiLAogICAgICAiSU1HX0NPTE9SX1NUWUxFRCIsICJJTUdfQ09MT1JfQlJVU0hFRCIsICJJTUdfQ09MT1JfU1RZTEVEQlJVU0hFRCIsCiAgICAgICJJTUdfQ09MT1JfVFJBTlNQQVJFTlQiLCAiSU1HX0FSQ19ST1VOREVEIiwgIklNR19BUkNfUElFIiwgIklNR19BUkNfQ0hPUkQiLAogICAgICAiSU1HX0FSQ19OT0ZJTEwiLCAiSU1HX0FSQ19FREdFRCIsICJJTUdfR0QyX1JBVyIsICJJTUdfR0QyX0NPTVBSRVNTRUQiLAogICAgICAiSU1HX0VGRkVDVF9SRVBMQUNFIiwgIklNR19FRkZFQ1RfQUxQSEFCTEVORCIsICJJTUdfRUZGRUNUX05PUk1BTCIsCiAgICAgICJJTUdfRUZGRUNUX09WRVJMQVkiLCAiR0RfQlVORExFRCIsICJJTUdfRklMVEVSX05FR0FURSIsCiAgICAgICJJTUdfRklMVEVSX0dSQVlTQ0FMRSIsICJJTUdfRklMVEVSX0JSSUdIVE5FU1MiLCAiSU1HX0ZJTFRFUl9DT05UUkFTVCIsCiAgICAgICJJTUdfRklMVEVSX0NPTE9SSVpFIiwgIklNR19GSUxURVJfRURHRURFVEVDVCIsICJJTUdfRklMVEVSX0dBVVNTSUFOX0JMVVIiLAogICAgICAiSU1HX0ZJTFRFUl9TRUxFQ1RJVkVfQkxVUiIsICJJTUdfRklMVEVSX0VNQk9TUyIsICJJTUdfRklMVEVSX01FQU5fUkVNT1ZBTCIsCiAgICAgICJJTUdfRklMVEVSX1NNT09USCIsICJQTkdfTk9fRklMVEVSIiwgIlBOR19GSUxURVJfTk9ORSIsICJQTkdfRklMVEVSX1NVQiIsCiAgICAgICJQTkdfRklMVEVSX1VQIiwgIlBOR19GSUxURVJfQVZHIiwgIlBOR19GSUxURVJfUEFFVEgiLCAiUE5HX0FMTF9GSUxURVJTIiwKICAgICAgIk1CX09WRVJMT0FEX01BSUwiLCAiTUJfT1ZFUkxPQURfU1RSSU5HIiwgIk1CX09WRVJMT0FEX1JFR0VYIiwgIk1CX0NBU0VfVVBQRVIiLAogICAgICAiTUJfQ0FTRV9MT1dFUiIsICJNQl9DQVNFX1RJVExFIiwgIk1ZU1FMX0FTU09DIiwgIk1ZU1FMX05VTSIsICJNWVNRTF9CT1RIIiwKICAgICAgIk1ZU1FMX0NMSUVOVF9DT01QUkVTUyIsICJNWVNRTF9DTElFTlRfU1NMIiwgIk1ZU1FMX0NMSUVOVF9JTlRFUkFDVElWRSIsCiAgICAgICJNWVNRTF9DTElFTlRfSUdOT1JFX1NQQUNFIiwgIk1ZU1FMSV9SRUFEX0RFRkFVTFRfR1JPVVAiLAogICAgICAiTVlTUUxJX1JFQURfREVGQVVMVF9GSUxFIiwgIk1ZU1FMSV9PUFRfQ09OTkVDVF9USU1FT1VUIiwKICAgICAgIk1ZU1FMSV9PUFRfTE9DQUxfSU5GSUxFIiwgIk1ZU1FMSV9JTklUX0NPTU1BTkQiLCAiTVlTUUxJX0NMSUVOVF9TU0wiLAogICAgICAiTVlTUUxJX0NMSUVOVF9DT01QUkVTUyIsICJNWVNRTElfQ0xJRU5UX0lOVEVSQUNUSVZFIiwKICAgICAgIk1ZU1FMSV9DTElFTlRfSUdOT1JFX1NQQUNFIiwgIk1ZU1FMSV9DTElFTlRfTk9fU0NIRU1BIiwKICAgICAgIk1ZU1FMSV9DTElFTlRfRk9VTkRfUk9XUyIsICJNWVNRTElfU1RPUkVfUkVTVUxUIiwgIk1ZU1FMSV9VU0VfUkVTVUxUIiwKICAgICAgIk1ZU1FMSV9BU1NPQyIsICJNWVNRTElfTlVNIiwgIk1ZU1FMSV9CT1RIIiwKICAgICAgIk1ZU1FMSV9TVE1UX0FUVFJfVVBEQVRFX01BWF9MRU5HVEgiLCAiTVlTUUxJX1NUTVRfQVRUUl9DVVJTT1JfVFlQRSIsCiAgICAgICJNWVNRTElfQ1VSU09SX1RZUEVfTk9fQ1VSU09SIiwgIk1ZU1FMSV9DVVJTT1JfVFlQRV9SRUFEX09OTFkiLAogICAgICAiTVlTUUxJX0NVUlNPUl9UWVBFX0ZPUl9VUERBVEUiLCAiTVlTUUxJX0NVUlNPUl9UWVBFX1NDUk9MTEFCTEUiLAogICAgICAiTVlTUUxJX1NUTVRfQVRUUl9QUkVGRVRDSF9ST1dTIiwgIk1ZU1FMSV9OT1RfTlVMTF9GTEFHIiwKICAgICAgIk1ZU1FMSV9QUklfS0VZX0ZMQUciLCAiTVlTUUxJX1VOSVFVRV9LRVlfRkxBRyIsICJNWVNRTElfTVVMVElQTEVfS0VZX0ZMQUciLAogICAgICAiTVlTUUxJX0JMT0JfRkxBRyIsICJNWVNRTElfVU5TSUdORURfRkxBRyIsICJNWVNRTElfWkVST0ZJTExfRkxBRyIsCiAgICAgICJNWVNRTElfQVVUT19JTkNSRU1FTlRfRkxBRyIsICJNWVNRTElfVElNRVNUQU1QX0ZMQUciLCAiTVlTUUxJX1NFVF9GTEFHIiwKICAgICAgIk1ZU1FMSV9OVU1fRkxBRyIsICJNWVNRTElfUEFSVF9LRVlfRkxBRyIsICJNWVNRTElfR1JPVVBfRkxBRyIsCiAgICAgICJNWVNRTElfVFlQRV9ERUNJTUFMIiwgIk1ZU1FMSV9UWVBFX1RJTlkiLCAiTVlTUUxJX1RZUEVfU0hPUlQiLAogICAgICAiTVlTUUxJX1RZUEVfTE9ORyIsICJNWVNRTElfVFlQRV9GTE9BVCIsICJNWVNRTElfVFlQRV9ET1VCTEUiLAogICAgICAiTVlTUUxJX1RZUEVfTlVMTCIsICJNWVNRTElfVFlQRV9USU1FU1RBTVAiLCAiTVlTUUxJX1RZUEVfTE9OR0xPTkciLAogICAgICAiTVlTUUxJX1RZUEVfSU5UMjQiLCAiTVlTUUxJX1RZUEVfREFURSIsICJNWVNRTElfVFlQRV9USU1FIiwKICAgICAgIk1ZU1FMSV9UWVBFX0RBVEVUSU1FIiwgIk1ZU1FMSV9UWVBFX1lFQVIiLCAiTVlTUUxJX1RZUEVfTkVXREFURSIsCiAgICAgICJNWVNRTElfVFlQRV9FTlVNIiwgIk1ZU1FMSV9UWVBFX1NFVCIsICJNWVNRTElfVFlQRV9USU5ZX0JMT0IiLAogICAgICAiTVlTUUxJX1RZUEVfTUVESVVNX0JMT0IiLCAiTVlTUUxJX1RZUEVfTE9OR19CTE9CIiwgIk1ZU1FMSV9UWVBFX0JMT0IiLAogICAgICAiTVlTUUxJX1RZUEVfVkFSX1NUUklORyIsICJNWVNRTElfVFlQRV9TVFJJTkciLCAiTVlTUUxJX1RZUEVfQ0hBUiIsCiAgICAgICJNWVNRTElfVFlQRV9JTlRFUlZBTCIsICJNWVNRTElfVFlQRV9HRU9NRVRSWSIsICJNWVNRTElfVFlQRV9ORVdERUNJTUFMIiwKICAgICAgIk1ZU1FMSV9UWVBFX0JJVCIsICJNWVNRTElfUlBMX01BU1RFUiIsICJNWVNRTElfUlBMX1NMQVZFIiwgIk1ZU1FMSV9SUExfQURNSU4iLAogICAgICAiTVlTUUxJX05PX0RBVEEiLCAiTVlTUUxJX0RBVEFfVFJVTkNBVEVEIiwgIk1ZU1FMSV9SRVBPUlRfSU5ERVgiLAogICAgICAiTVlTUUxJX1JFUE9SVF9FUlJPUiIsICJNWVNRTElfUkVQT1JUX1NUUklDVCIsICJNWVNRTElfUkVQT1JUX0FMTCIsCiAgICAgICJNWVNRTElfUkVQT1JUX09GRiIsICJBRl9VTklYIiwgIkFGX0lORVQiLCAiQUZfSU5FVDYiLCAiU09DS19TVFJFQU0iLAogICAgICAiU09DS19ER1JBTSIsICJTT0NLX1JBVyIsICJTT0NLX1NFUVBBQ0tFVCIsICJTT0NLX1JETSIsICJNU0dfT09CIiwKICAgICAgIk1TR19XQUlUQUxMIiwgIk1TR19QRUVLIiwgIk1TR19ET05UUk9VVEUiLCAiU09fREVCVUciLCAiU09fUkVVU0VBRERSIiwKICAgICAgIlNPX0tFRVBBTElWRSIsICJTT19ET05UUk9VVEUiLCAiU09fTElOR0VSIiwgIlNPX0JST0FEQ0FTVCIsICJTT19PT0JJTkxJTkUiLAogICAgICAiU09fU05EQlVGIiwgIlNPX1JDVkJVRiIsICJTT19TTkRMT1dBVCIsICJTT19SQ1ZMT1dBVCIsICJTT19TTkRUSU1FTyIsCiAgICAgICJTT19SQ1ZUSU1FTyIsICJTT19UWVBFIiwgIlNPX0VSUk9SIiwgIlNPTF9TT0NLRVQiLCAiU09NQVhDT05OIiwKICAgICAgIlBIUF9OT1JNQUxfUkVBRCIsICJQSFBfQklOQVJZX1JFQUQiLCAiU09DS0VUX0VJTlRSIiwgIlNPQ0tFVF9FQkFERiIsCiAgICAgICJTT0NLRVRfRUFDQ0VTIiwgIlNPQ0tFVF9FRkFVTFQiLCAiU09DS0VUX0VJTlZBTCIsICJTT0NLRVRfRU1GSUxFIiwKICAgICAgIlNPQ0tFVF9FV09VTERCTE9DSyIsICJTT0NLRVRfRUlOUFJPR1JFU1MiLCAiU09DS0VUX0VBTFJFQURZIiwKICAgICAgIlNPQ0tFVF9FTk9UU09DSyIsICJTT0NLRVRfRURFU1RBRERSUkVRIiwgIlNPQ0tFVF9FTVNHU0laRSIsCiAgICAgICJTT0NLRVRfRVBST1RPVFlQRSIsICJTT0NLRVRfRU5PUFJPVE9PUFQiLCAiU09DS0VUX0VQUk9UT05PU1VQUE9SVCIsCiAgICAgICJTT0NLRVRfRVNPQ0tUTk9TVVBQT1JUIiwgIlNPQ0tFVF9FT1BOT1RTVVBQIiwgIlNPQ0tFVF9FUEZOT1NVUFBPUlQiLAogICAgICAiU09DS0VUX0VBRk5PU1VQUE9SVCIsICJTT0NLRVRfRUFERFJJTlVTRSIsICJTT0NLRVRfRUFERFJOT1RBVkFJTCIsCiAgICAgICJTT0NLRVRfRU5FVERPV04iLCAiU09DS0VUX0VORVRVTlJFQUNIIiwgIlNPQ0tFVF9FTkVUUkVTRVQiLAogICAgICAiU09DS0VUX0VDT05OQUJPUlRFRCIsICJTT0NLRVRfRUNPTk5SRVNFVCIsICJTT0NLRVRfRU5PQlVGUyIsICJTT0NLRVRfRUlTQ09OTiIsCiAgICAgICJTT0NLRVRfRU5PVENPTk4iLCAiU09DS0VUX0VTSFVURE9XTiIsICJTT0NLRVRfRVRPT01BTllSRUZTIiwKICAgICAgIlNPQ0tFVF9FVElNRURPVVQiLCAiU09DS0VUX0VDT05OUkVGVVNFRCIsICJTT0NLRVRfRUxPT1AiLAogICAgICAiU09DS0VUX0VOQU1FVE9PTE9ORyIsICJTT0NLRVRfRUhPU1RET1dOIiwgIlNPQ0tFVF9FSE9TVFVOUkVBQ0giLAogICAgICAiU09DS0VUX0VOT1RFTVBUWSIsICJTT0NLRVRfRVBST0NMSU0iLCAiU09DS0VUX0VVU0VSUyIsICJTT0NLRVRfRURRVU9UIiwKICAgICAgIlNPQ0tFVF9FU1RBTEUiLCAiU09DS0VUX0VSRU1PVEUiLCAiU09DS0VUX0VESVNDT04iLCAiU09DS0VUX1NZU05PVFJFQURZIiwKICAgICAgIlNPQ0tFVF9WRVJOT1RTVVBQT1JURUQiLCAiU09DS0VUX05PVElOSVRJQUxJU0VEIiwgIlNPQ0tFVF9IT1NUX05PVF9GT1VORCIsCiAgICAgICJTT0NLRVRfVFJZX0FHQUlOIiwgIlNPQ0tFVF9OT19SRUNPVkVSWSIsICJTT0NLRVRfTk9fREFUQSIsCiAgICAgICJTT0NLRVRfTk9fQUREUkVTUyIsICJTT0xfVENQIiwgIlNPTF9VRFAiLCAiRUFDQ0VMRVJBVE9SX1ZFUlNJT04iLAogICAgICAiRUFDQ0VMRVJBVE9SX1NITV9BTkRfRElTSyIsICJFQUNDRUxFUkFUT1JfU0hNIiwgIkVBQ0NFTEVSQVRPUl9TSE1fT05MWSIsCiAgICAgICJFQUNDRUxFUkFUT1JfRElTS19PTkxZIiwgIkVBQ0NFTEVSQVRPUl9OT05FIiwgIlhERUJVR19UUkFDRV9BUFBFTkQiLAogICAgICAiWERFQlVHX1RSQUNFX0NPTVBVVEVSSVpFRCIsICJYREVCVUdfVFJBQ0VfSFRNTCIsICJYREVCVUdfQ0NfVU5VU0VEIiwKICAgICAgIlhERUJVR19DQ19ERUFEX0NPREUiLCAiU1RESU4iLCAiU1RET1VUIiwgIlNUREVSUiIsCiAgICBdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJhdG9tIiwgInBocC1wcmVkZWZpbmVkLWNvbnN0YW50Iik7CiAgICB9KTsKCiAgICAvLyBQSFAgZGVjbGFyZWQgY2xhc3NlcyAtIG91dHB1dCBvZiBnZXRfZGVjbGFyZWRfY2xhc3NlcygpLiBEaWZmZXJzIGZyb20gaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL3Jlc2VydmVkLmNsYXNzZXMucGhwCiAgICBbICAic3RkQ2xhc3MiLCAiRXhjZXB0aW9uIiwgIkVycm9yRXhjZXB0aW9uIiwgIkNPTVBlcnNpc3RIZWxwZXIiLCAiY29tX2V4Y2VwdGlvbiIsCiAgICAgICJjb21fc2FmZWFycmF5X3Byb3h5IiwgInZhcmlhbnQiLCAiY29tIiwgImRvdG5ldCIsICJSZWZsZWN0aW9uRXhjZXB0aW9uIiwKICAgICAgIlJlZmxlY3Rpb24iLCAiUmVmbGVjdGlvbkZ1bmN0aW9uQWJzdHJhY3QiLCAiUmVmbGVjdGlvbkZ1bmN0aW9uIiwKICAgICAgIlJlZmxlY3Rpb25QYXJhbWV0ZXIiLCAiUmVmbGVjdGlvbk1ldGhvZCIsICJSZWZsZWN0aW9uQ2xhc3MiLAogICAgICAiUmVmbGVjdGlvbk9iamVjdCIsICJSZWZsZWN0aW9uUHJvcGVydHkiLCAiUmVmbGVjdGlvbkV4dGVuc2lvbiIsICJEYXRlVGltZSIsCiAgICAgICJEYXRlVGltZVpvbmUiLCAiTGliWE1MRXJyb3IiLCAiX19QSFBfSW5jb21wbGV0ZV9DbGFzcyIsICJwaHBfdXNlcl9maWx0ZXIiLAogICAgICAiRGlyZWN0b3J5IiwgIlNpbXBsZVhNTEVsZW1lbnQiLCAiRE9NRXhjZXB0aW9uIiwgIkRPTVN0cmluZ0xpc3QiLAogICAgICAiRE9NTmFtZUxpc3QiLCAiRE9NSW1wbGVtZW50YXRpb25MaXN0IiwgIkRPTUltcGxlbWVudGF0aW9uU291cmNlIiwKICAgICAgIkRPTUltcGxlbWVudGF0aW9uIiwgIkRPTU5vZGUiLCAiRE9NTmFtZVNwYWNlTm9kZSIsICJET01Eb2N1bWVudEZyYWdtZW50IiwKICAgICAgIkRPTURvY3VtZW50IiwgIkRPTU5vZGVMaXN0IiwgIkRPTU5hbWVkTm9kZU1hcCIsICJET01DaGFyYWN0ZXJEYXRhIiwgIkRPTUF0dHIiLAogICAgICAiRE9NRWxlbWVudCIsICJET01UZXh0IiwgIkRPTUNvbW1lbnQiLCAiRE9NVHlwZWluZm8iLCAiRE9NVXNlckRhdGFIYW5kbGVyIiwKICAgICAgIkRPTURvbUVycm9yIiwgIkRPTUVycm9ySGFuZGxlciIsICJET01Mb2NhdG9yIiwgIkRPTUNvbmZpZ3VyYXRpb24iLAogICAgICAiRE9NQ2RhdGFTZWN0aW9uIiwgIkRPTURvY3VtZW50VHlwZSIsICJET01Ob3RhdGlvbiIsICJET01FbnRpdHkiLAogICAgICAiRE9NRW50aXR5UmVmZXJlbmNlIiwgIkRPTVByb2Nlc3NpbmdJbnN0cnVjdGlvbiIsICJET01TdHJpbmdFeHRlbmQiLAogICAgICAiRE9NWFBhdGgiLCAiUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvciIsICJJdGVyYXRvckl0ZXJhdG9yIiwgIkZpbHRlckl0ZXJhdG9yIiwKICAgICAgIlJlY3Vyc2l2ZUZpbHRlckl0ZXJhdG9yIiwgIlBhcmVudEl0ZXJhdG9yIiwgIkxpbWl0SXRlcmF0b3IiLAogICAgICAiQ2FjaGluZ0l0ZXJhdG9yIiwgIlJlY3Vyc2l2ZUNhY2hpbmdJdGVyYXRvciIsICJOb1Jld2luZEl0ZXJhdG9yIiwKICAgICAgIkFwcGVuZEl0ZXJhdG9yIiwgIkluZmluaXRlSXRlcmF0b3IiLCAiUmVnZXhJdGVyYXRvciIsCiAgICAgICJSZWN1cnNpdmVSZWdleEl0ZXJhdG9yIiwgIkVtcHR5SXRlcmF0b3IiLCAiQXJyYXlPYmplY3QiLCAiQXJyYXlJdGVyYXRvciIsCiAgICAgICJSZWN1cnNpdmVBcnJheUl0ZXJhdG9yIiwgIlNwbEZpbGVJbmZvIiwgIkRpcmVjdG9yeUl0ZXJhdG9yIiwKICAgICAgIlJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yIiwgIlNwbEZpbGVPYmplY3QiLCAiU3BsVGVtcEZpbGVPYmplY3QiLAogICAgICAiU2ltcGxlWE1MSXRlcmF0b3IiLCAiTG9naWNFeGNlcHRpb24iLCAiQmFkRnVuY3Rpb25DYWxsRXhjZXB0aW9uIiwKICAgICAgIkJhZE1ldGhvZENhbGxFeGNlcHRpb24iLCAiRG9tYWluRXhjZXB0aW9uIiwgIkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiIsCiAgICAgICJMZW5ndGhFeGNlcHRpb24iLCAiT3V0T2ZSYW5nZUV4Y2VwdGlvbiIsICJSdW50aW1lRXhjZXB0aW9uIiwKICAgICAgIk91dE9mQm91bmRzRXhjZXB0aW9uIiwgIk92ZXJmbG93RXhjZXB0aW9uIiwgIlJhbmdlRXhjZXB0aW9uIiwKICAgICAgIlVuZGVyZmxvd0V4Y2VwdGlvbiIsICJVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24iLCAiU3BsT2JqZWN0U3RvcmFnZSIsCiAgICAgICJYTUxSZWFkZXIiLCAiWE1MV3JpdGVyIiwgIm15c3FsaV9zcWxfZXhjZXB0aW9uIiwgIm15c3FsaV9kcml2ZXIiLCAibXlzcWxpIiwKICAgICAgIm15c3FsaV93YXJuaW5nIiwgIm15c3FsaV9yZXN1bHQiLCAibXlzcWxpX3N0bXQiLCAiUERPRXhjZXB0aW9uIiwgIlBETyIsCiAgICAgICJQRE9TdGF0ZW1lbnQiLCAiUERPUm93IgogICAgXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigidF9zdHJpbmciLCAicGhwLXByZWRlZmluZWQtY2xhc3MiKTsKICAgIH0pOwoKICAgIHJldHVybiByZXN1bHQ7CgogIH0oKTsKCiAgLy8gSGVscGVyIHJlZ2V4cHMKICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWysqJiVcLz08PiE/LnwtXS87CiAgdmFyIGlzSGV4RGlnaXQgPSAvWzAtOUEtRmEtZl0vOwogIHZhciBpc1dvcmRDaGFyID0gL1tcd1wkX10vOwoKICAvLyBXcmFwcGVyIGFyb3VuZCBwaHBUb2tlbiB0aGF0IGhlbHBzIG1haW50YWluIHBhcnNlciBzdGF0ZSAod2hldGhlcgogIC8vIHdlIGFyZSBpbnNpZGUgb2YgYSBtdWx0aS1saW5lIGNvbW1lbnQpCiAgZnVuY3Rpb24gcGhwVG9rZW5TdGF0ZShpbnNpZGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBuZXdJbnNpZGUgPSBpbnNpZGU7CiAgICAgIHZhciB0eXBlID0gcGhwVG9rZW4oaW5zaWRlLCBzb3VyY2UsIGZ1bmN0aW9uKGMpIHtuZXdJbnNpZGUgPSBjO30pOwogICAgICBpZiAobmV3SW5zaWRlICE9IGluc2lkZSkKICAgICAgICBzZXRTdGF0ZShwaHBUb2tlblN0YXRlKG5ld0luc2lkZSkpOwogICAgICByZXR1cm4gdHlwZTsKICAgIH07CiAgfQoKICAvLyBUaGUgdG9rZW4gcmVhZGVyLCBpbnRlZGVkIHRvIGJlIHVzZWQgYnkgdGhlIHRva2VuaXplciBmcm9tCiAgLy8gdG9rZW5pemUuanMgKHRocm91Z2ggcGhwVG9rZW5TdGF0ZSkuIEFkdmFuY2VzIHRoZSBzb3VyY2Ugc3RyZWFtCiAgLy8gb3ZlciBhIHRva2VuLCBhbmQgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgdHlwZSBhbmQgc3R5bGUKICAvLyBvZiB0aGF0IHRva2VuLgogIGZ1bmN0aW9uIHBocFRva2VuKGluc2lkZSwgc291cmNlLCBzZXRJbnNpZGUpIHsKICAgIGZ1bmN0aW9uIHJlYWRIZXhOdW1iZXIoKXsKICAgICAgc291cmNlLm5leHQoKTsgIC8vIHNraXAgdGhlICd4JwogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc0hleERpZ2l0KTsKICAgICAgcmV0dXJuIHt0eXBlOiAibnVtYmVyIiwgc3R5bGU6ICJwaHAtYXRvbSJ9OwogICAgfQoKICAgIGZ1bmN0aW9uIHJlYWROdW1iZXIoKSB7CiAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bMC05XS8pOwogICAgICBpZiAoc291cmNlLmVxdWFscygiLiIpKXsKICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bMC05XS8pOwogICAgICB9CiAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCJlIikgfHwgc291cmNlLmVxdWFscygiRSIpKXsKICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCItIikpCiAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bMC05XS8pOwogICAgICB9CiAgICAgIHJldHVybiB7dHlwZTogIm51bWJlciIsIHN0eWxlOiAicGhwLWF0b20ifTsKICAgIH0KICAgIC8vIFJlYWQgYSB3b3JkIGFuZCBsb29rIGl0IHVwIGluIHRoZSBrZXl3b3JkcyBhcnJheS4gSWYgZm91bmQsIGl0J3MgYQogICAgLy8ga2V5d29yZCBvZiB0aGF0IHR5cGU7IG90aGVyd2lzZSBpdCdzIGEgUEhQIFRfU1RSSU5HLgogICAgZnVuY3Rpb24gcmVhZFdvcmQoKSB7CiAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKGlzV29yZENoYXIpOwogICAgICB2YXIgd29yZCA9IHNvdXJjZS5nZXQoKTsKICAgICAgdmFyIGtub3duID0ga2V5d29yZHMuaGFzT3duUHJvcGVydHkod29yZCkgJiYga2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUod29yZCkgJiYga2V5d29yZHNbd29yZF07CiAgICAgIC8vIHNpbmNlIHdlIGNhbGxlZCBnZXQoKSwgdG9rZW5pemU6OnRha2Ugd29uJ3QgZ2V0KCkgYW55dGhpbmcuIFRodXMsIHdlIG11c3Qgc2V0IHRva2VuLmNvbnRlbnQKICAgICAgcmV0dXJuIGtub3duID8ge3R5cGU6IGtub3duLnR5cGUsIHN0eWxlOiBrbm93bi5zdHlsZSwgY29udGVudDogd29yZH0gOgogICAgICB7dHlwZTogInRfc3RyaW5nIiwgc3R5bGU6ICJwaHAtdF9zdHJpbmciLCBjb250ZW50OiB3b3JkfTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRWYXJpYWJsZSgpIHsKICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoaXNXb3JkQ2hhcik7CiAgICAgIHZhciB3b3JkID0gc291cmNlLmdldCgpOwogICAgICAvLyBpbiBQSFAsICckdGhpcycgaXMgYSByZXNlcnZlZCB3b3JkLCBidXQgJ3RoaXMnIGlzbid0LiBZb3UgY2FuIGhhdmUgZnVuY3Rpb24gdGhpcygpIHsuLi59CiAgICAgIGlmICh3b3JkID09ICIkdGhpcyIpCiAgICAgICAgcmV0dXJuIHt0eXBlOiAidmFyaWFibGUiLCBzdHlsZTogInBocC1rZXl3b3JkIiwgY29udGVudDogd29yZH07CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4ge3R5cGU6ICJ2YXJpYWJsZSIsIHN0eWxlOiAicGhwLXZhcmlhYmxlIiwgY29udGVudDogd29yZH07CiAgICB9CgogICAgLy8gQWR2YW5jZSB0aGUgc3RyZWFtIHVudGlsIHRoZSBnaXZlbiBjaGFyYWN0ZXIgKG5vdCBwcmVjZWRlZCBieSBhCiAgICAvLyBiYWNrc2xhc2gpIGlzIGVuY291bnRlcmVkLCBvciB0aGUgZW5kIG9mIHRoZSBsaW5lIGlzIHJlYWNoZWQuCiAgICBmdW5jdGlvbiBuZXh0VW50aWxVbmVzY2FwZWQoc291cmNlLCBlbmQpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZTsKICAgICAgd2hpbGUoIXNvdXJjZS5lbmRPZkxpbmUoKSl7CiAgICAgICAgdmFyIG5leHQgPSBzb3VyY2UubmV4dCgpOwogICAgICAgIGlmIChuZXh0ID09IGVuZCAmJiAhZXNjYXBlZCkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBlc2NhcGVkID0gbmV4dCA9PSAiXFwiICYmICFlc2NhcGVkOwogICAgICB9CiAgICAgIHJldHVybiBlc2NhcGVkOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlYWRTaW5nbGVMaW5lQ29tbWVudCgpIHsKICAgICAgLy8gcmVhZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5lIG9yIHVudGlsID8+LCB3aGljaCB0ZXJtaW5hdGVzIHNpbmdsZS1saW5lIGNvbW1lbnRzCiAgICAgIC8vIGA8P3BocCBlY2hvIDE7IC8vIGNvbW1lbnQgPz4gZm9vYCB3aWxsIGRpc3BsYXkgIjEgZm9vIgogICAgICB3aGlsZSghc291cmNlLmxvb2tBaGVhZCgiPz4iKSAmJiAhc291cmNlLmVuZE9mTGluZSgpKQogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgIHJldHVybiB7dHlwZTogImNvbW1lbnQiLCBzdHlsZTogInBocC1jb21tZW50In07CiAgICB9CiAgICAvKiBGb3IgbXVsdGktbGluZSBjb21tZW50cywgd2Ugd2FudCB0byByZXR1cm4gYSBjb21tZW50IHRva2VuIGZvcgogICAgICAgZXZlcnkgbGluZSBvZiB0aGUgY29tbWVudCwgYnV0IHdlIGFsc28gd2FudCB0byByZXR1cm4gdGhlIG5ld2xpbmVzCiAgICAgICBpbiB0aGVtIGFzIHJlZ3VsYXIgbmV3bGluZSB0b2tlbnMuIFdlIHRoZXJlZm9yZSBuZWVkIHRvIHNhdmUgYQogICAgICAgc3RhdGUgdmFyaWFibGUgKCJpbnNpZGUiKSB0byBpbmRpY2F0ZSB3aGV0aGVyIHdlIGFyZSBpbnNpZGUgYQogICAgICAgbXVsdGktbGluZSBjb21tZW50LgogICAgKi8KCiAgICBmdW5jdGlvbiByZWFkTXVsdGlsaW5lQ29tbWVudChzdGFydCl7CiAgICAgIHZhciBuZXdJbnNpZGUgPSAiLyoiOwogICAgICB2YXIgbWF5YmVFbmQgPSAoc3RhcnQgPT0gIioiKTsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBpZiAoc291cmNlLmVuZE9mTGluZSgpKQogICAgICAgICAgYnJlYWs7CiAgICAgICAgdmFyIG5leHQgPSBzb3VyY2UubmV4dCgpOwogICAgICAgIGlmIChuZXh0ID09ICIvIiAmJiBtYXliZUVuZCl7CiAgICAgICAgICBuZXdJbnNpZGUgPSBudWxsOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIG1heWJlRW5kID0gKG5leHQgPT0gIioiKTsKICAgICAgfQogICAgICBzZXRJbnNpZGUobmV3SW5zaWRlKTsKICAgICAgcmV0dXJuIHt0eXBlOiAiY29tbWVudCIsIHN0eWxlOiAicGhwLWNvbW1lbnQifTsKICAgIH0KCiAgICAvLyBzaW1pbGFyIHRvIHJlYWRNdWx0aWxpbmVDb21tZW50IGFuZCBuZXh0VW50aWxVbmVzY2FwZWQKICAgIC8vIHVubGlrZSBjb21tZW50cywgc3RyaW5ncyBhcmUgbm90IHN0b3BwZWQgYnkgPz4KICAgIGZ1bmN0aW9uIHJlYWRNdWx0aWxpbmVTdHJpbmcoc3RhcnQpewogICAgICB2YXIgbmV3SW5zaWRlID0gc3RhcnQ7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5lbmRPZkxpbmUoKSkKICAgICAgICAgIGJyZWFrOwogICAgICAgIHZhciBuZXh0ID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAobmV4dCA9PSBzdGFydCAmJiAhZXNjYXBlZCl7CiAgICAgICAgICBuZXdJbnNpZGUgPSBudWxsOyAgLy8gd2UncmUgb3V0c2lkZSBvZiB0aGUgc3RyaW5nIG5vdwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVzY2FwZWQgPSAobmV4dCA9PSAiXFwiICYmICFlc2NhcGVkKTsKICAgICAgfQogICAgICBzZXRJbnNpZGUobmV3SW5zaWRlKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB0eXBlOiBuZXdJbnNpZGUgPT0gbnVsbD8gInN0cmluZyIgOiAic3RyaW5nX25vdF90ZXJtaW5hdGVkIiwKICAgICAgICBzdHlsZTogKHN0YXJ0ID09ICInIj8gInBocC1zdHJpbmctc2luZ2xlLXF1b3RlZCIgOiAicGhwLXN0cmluZy1kb3VibGUtcXVvdGVkIikKICAgICAgfTsKICAgIH0KCiAgICAvLyBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2UudHlwZXMuc3RyaW5nLnBocCNsYW5ndWFnZS50eXBlcy5zdHJpbmcuc3ludGF4LmhlcmVkb2MKICAgIC8vIFNlZSBhbHNvICdub3dkb2MnIG9uIHRoZSBwYWdlLiBIZXJlZG9jcyBhcmUgbm90IGludGVycnVwdGVkIGJ5IHRoZSAnPz4nIHRva2VuLgogICAgZnVuY3Rpb24gcmVhZEhlcmVkb2MoaWRlbnRpZmllcil7CiAgICAgIHZhciB0b2tlbiA9IHt9OwogICAgICBpZiAoaWRlbnRpZmllciA9PSAiPDw8IikgewogICAgICAgIC8vIG9uIG91ciBmaXJzdCBpbnZvY2F0aW9uIGFmdGVyIHJlYWRpbmcgdGhlIDw8PCwgd2UgbXVzdCBkZXRlcm1pbmUgdGhlIGNsb3NpbmcgaWRlbnRpZmllcgogICAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCInIikpIHsKICAgICAgICAgIC8vIG5vd2RvYwogICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoaXNXb3JkQ2hhcik7CiAgICAgICAgICBpZGVudGlmaWVyID0gIiciICsgc291cmNlLmdldCgpICsgIiciOwogICAgICAgICAgc291cmNlLm5leHQoKTsgIC8vIGNvbnN1bWUgdGhlIGNsb3NpbmcgIiciCiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UubWF0Y2hlcygvW0EtWmEtel9dLykpIHsKICAgICAgICAgIC8vIGhlcmVkb2MKICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKGlzV29yZENoYXIpOwogICAgICAgICAgaWRlbnRpZmllciA9IHNvdXJjZS5nZXQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gc3ludGF4IGVycm9yCiAgICAgICAgICBzZXRJbnNpZGUobnVsbCk7CiAgICAgICAgICByZXR1cm4geyB0eXBlOiAiZXJyb3IiLCBzdHlsZTogInN5bnRheC1lcnJvciIgfTsKICAgICAgICB9CiAgICAgICAgc2V0SW5zaWRlKGlkZW50aWZpZXIpOwogICAgICAgIHRva2VuLnR5cGUgPSAic3RyaW5nX25vdF90ZXJtaW5hdGVkIjsKICAgICAgICB0b2tlbi5zdHlsZSA9IGlkZW50aWZpZXIuY2hhckF0KDApID09ICInIj8gInBocC1zdHJpbmctc2luZ2xlLXF1b3RlZCIgOiAicGhwLXN0cmluZy1kb3VibGUtcXVvdGVkIjsKICAgICAgICB0b2tlbi5jb250ZW50ID0gaWRlbnRpZmllcjsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2tlbi5zdHlsZSA9IGlkZW50aWZpZXIuY2hhckF0KDApID09ICInIj8gInBocC1zdHJpbmctc2luZ2xlLXF1b3RlZCIgOiAicGhwLXN0cmluZy1kb3VibGUtcXVvdGVkIjsKICAgICAgICAvLyBjb25zdW1lIGEgbGluZSBvZiBoZXJlZG9jIGFuZCBjaGVjayBpZiBpdCBlcXVhbHMgdGhlIGNsb3NpbmcgaWRlbnRpZmllciBwbHVzIGFuIG9wdGlvbmFsIHNlbWljb2xvbgogICAgICAgIGlmIChzb3VyY2UubG9va0FoZWFkKGlkZW50aWZpZXIsIHRydWUpICYmIChzb3VyY2UubG9va0FoZWFkKCI7XG4iKSB8fCBzb3VyY2UuZW5kT2ZMaW5lKCkpKSB7CiAgICAgICAgICAvLyB0aGUgY2xvc2luZyBpZGVudGlmaWVyIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lCiAgICAgICAgICAvLyBub3RlIHRoYXQgZXZlbiB3aGl0ZXNwYWNlIGFmdGVyIHRoZSAiOyIgaXMgZm9yYmlkZGVuIGJ5IHRoZSBQSFAgaGVyZWRvYyBzeW50YXgKICAgICAgICAgIHRva2VuLnR5cGUgPSAic3RyaW5nIjsKICAgICAgICAgIHRva2VuLmNvbnRlbnQgPSBzb3VyY2UuZ2V0KCk7ICAvLyBkb24ndCBnZXQgdGhlICI7IiBpZiB0aGVyZSBpcyBvbmUKICAgICAgICAgIHNldEluc2lkZShudWxsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdG9rZW4udHlwZSA9ICJzdHJpbmdfbm90X3Rlcm1pbmF0ZWQiOwogICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1teXG5dLyk7CiAgICAgICAgICB0b2tlbi5jb250ZW50ID0gc291cmNlLmdldCgpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdG9rZW47CiAgICB9CgogICAgZnVuY3Rpb24gcmVhZE9wZXJhdG9yKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc09wZXJhdG9yQ2hhcik7CiAgICAgIHJldHVybiB7dHlwZTogIm9wZXJhdG9yIiwgc3R5bGU6ICJwaHAtb3BlcmF0b3IifTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRTdHJpbmdTaW5nbGVRdW90ZWQoKSB7CiAgICAgIHZhciBlbmRCYWNrU2xhc2ggPSBuZXh0VW50aWxVbmVzY2FwZWQoc291cmNlLCAiJyIsIGZhbHNlKTsKICAgICAgc2V0SW5zaWRlKGVuZEJhY2tTbGFzaCA/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/plsql/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/plsql/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/plsql/css/plsqlcolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aHRtbCB7CiAgY3Vyc29yOiB0ZXh0Owp9CgouZWRpdGJveCB7CiAgbWFyZ2luOiAuNGVtOwogIHBhZGRpbmc6IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgY29sb3I6IGJsYWNrOwp9CgouZWRpdGJveCBwIHsKICBtYXJnaW46IDA7Cn0KCnNwYW4ucGxzcWwta2V5d29yZCB7CiAgY29sb3I6IGJsdWU7Cn0KCnNwYW4ucGxzcWwtdmFyIHsKICBjb2xvcjogcmVkOwp9CgpzcGFuLnBsc3FsLWNvbW1lbnQgewogIGNvbG9yOiAjQUE3NzAwOwp9CgpzcGFuLnBsc3FsLWxpdGVyYWwgewogIGNvbG9yOiBncmVlbjsKfQoKc3Bhbi5wbHNxbC1vcGVyYXRvciB7CiAgY29sb3I6IGJsdWU7Cn0KCnNwYW4ucGxzcWwtd29yZCB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLnBsc3FsLWZ1bmN0aW9uIHsKICBjb2xvcjogZGFya29yYW5nZTsKfQoKc3Bhbi5wbHNxbC10eXBlIHsKICBjb2xvcjogcHVycGxlOwp9CgpzcGFuLnBsc3FsLXNlcGFyYXRvciB7CiAgY29sb3I6ICM2NjY2NjY7Cn0KCnNwYW4ucGxzcWwtbnVtYmVyIHsKICBjb2xvcjogZGFya2N5YW47Cn0KCgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/plsql/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2pzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogUExTUUwgZGVtb25zdHJhdGlvbjwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9jc3MvZG9jcy5jc3MiLz4KICA8L2hlYWQ+CiAgPGJvZHkgc3R5bGU9InBhZGRpbmc6IDIwcHg7Ij4KCjxwPkRlbW9uc3RyYXRpb24gb2YgPGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+Q29kZU1pcnJvcjwvYT4ncyBQTFNRTApoaWdobGlnaHRlci48L3A+Cgo8cD5Xcml0dGVuIGJ5IFBldGVyIFJhZ2FuaXRzY2ggKDxhIGhyZWY9IkxJQ0VOU0UiPmxpY2Vuc2U8L2E+KSwgYmFzZWQKb24gSm9obiBCZW5lZGlrdHNzb24gPGEgaHJlZj0iLi4vc3FsL2luZGV4Lmh0bWwiPlNRTCBwYXJzZXI8L2E+LjwvcD4KCjxkaXYgY2xhc3M9ImJvcmRlciI+Cjx0ZXh0YXJlYSBpZD0iY29kZSIgY29scz0iMTIwIiByb3dzPSI1MCI+ClBST0NFRFVSRSBnZW5lcmF0ZVJlc3VsdAogICggcFJvdXRpbmVUeXBlICAgSU4gVkFSQ0hBUjIKICAsIHBSZWZlcmVuY2VUeXBlIElOIFZBUkNIQVIyCiAgLCBwUmVmZXJlbmNlSWQgICBJTiBOVU1CRVIKICApCklTCiAgICBST1VUSU5FX05BTUUgICAgICBDT05TVEFOVCBWQVJDSEFSMigzMCkgOj0gJ2dlbmVyYXRlUmVzdWx0JzsKICAgIC0tCiAgICB2RGlzcGxheUFzICAgICAgICBBUEVYTElCX1ZfUEFHRV9JVEVNLkRJU1BMQVlfQVMgICAgICAlVFlQRTsKICAgIHZMb3ZRdWVyeSAgICAgICAgIEFQRVhMSUJfVl9QQUdFX0lURU0uTE9WX1FVRVJZICAgICAgICVUWVBFOwogICAgdkRpc3BsYXlOdWxsVmFsdWUgQVBFWExJQl9WX1BBR0VfSVRFTS5MT1ZfRElTUExBWV9OVUxMJVRZUEU7CiAgICB2TG92TnVsbFRleHQgICAgICBBUEVYTElCX1ZfUEFHRV9JVEVNLkxPVl9OVUxMX1RFWFQgICAlVFlQRTsKICAgIHZMb3ZOdWxsVmFsdWUgICAgIEFQRVhMSUJfVl9QQUdFX0lURU0uTE9WX05VTExfVkFMVUUgICVUWVBFOwogICAgdkFwcGxpY2F0aW9uSWQgICAgQVBFWExJQl9WX1BBR0VfSVRFTS5BUFBMSUNBVElPTl9JRCAgJVRZUEU7CiAgICB2UGFnZUlkICAgICAgICAgICBBUEVYTElCX1ZfUEFHRV9JVEVNLlBBR0VfSUQgICAgICAgICAlVFlQRTsKQkVHSU4KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC0tIERldGVybWluZSB3aGljaCByb3V0aW5lIHRvIGNhbGwgYW5kIHBhc3MgcGFyYW1ldGVycwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ0FTRSBwUm91dGluZVR5cGUKICAgIFdIRU4gJ0xPVicKICAgIFRIRU4KICAgICAgICBBcGV4TGliX0xvdi5nZW5lcmF0ZUxvdlJlc3VsdCggcFJlZmVyZW5jZVR5cGUsIHBSZWZlcmVuY2VJZCApOwogICAgLS0KICAgIFdIRU4gJ0NPTVBVVEFUSU9OJwogICAgVEhFTgogICAgICAgIEFwZXhMaWJfQ29tcHV0YXRpb24uZ2VuZXJhdGVDb21wdXRhdGlvblJlc3VsdCggcFJlZmVyZW5jZVR5cGUsIHBSZWZlcmVuY2VJZCApOwogICAgLS0KICAgIEVMU0UKICAgICAgICBBcGV4bGliX0Vycm9yLnJhaXNlSW1wbEVycm9yKCdVbnN1cHBvcnRlZCByb3V0aW5lIHR5cGUgIid8fHBSb3V0aW5lVHlwZXx8JyIhJyk7CiAgICBFTkQgQ0FTRTsKICAgIC0tCkVYQ0VQVElPTiBXSEVOIE9USEVSUyBUSEVOCiAgICBIVFAucHJuKCdFcnJvcjogJ3x8U1FMRVJSTSk7CiAgICAtLSBSQUlTRTsgbm8gcmFpc2UsIGJlY2F1c2UgQVBFWCBkb2Vzbid0IGNhcmUgYW55d2F5LgpFTkQgZ2VuZXJhdGVSZXN1bHQ7CjwvdGV4dGFyZWE+CjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSgnY29kZScsIHsKICAgIGhlaWdodDogIjQ1MHB4IiwKICAgIHBhcnNlcmZpbGU6ICIuLi9jb250cmliL3Bsc3FsL2pzL3BhcnNlcGxzcWwuanMiLAogICAgc3R5bGVzaGVldDogImNzcy9wbHNxbGNvbG9ycy5jc3MiLAogICAgcGF0aDogIi4uLy4uL2pzLyIsCiAgICB0ZXh0V3JhcHBpbmc6IGZhbHNlCiAgfSk7Cjwvc2NyaXB0PgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/plsql/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/plsql/js/parseplsql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIFBsc3FsUGFyc2VyID0gRWRpdG9yLlBhcnNlciA9IChmdW5jdGlvbigpIHsKCiAgZnVuY3Rpb24gd29yZFJlZ2V4cCh3b3JkcykgewogICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgd29yZHMuam9pbigifCIpICsgIikkIiwgImkiKTsKICB9CgogIHZhciBmdW5jdGlvbnMgPSB3b3JkUmVnZXhwKFsKImFicyIsImFjb3MiLCJhZGRfbW9udGhzIiwiYXNjaWkiLCJhc2luIiwiYXRhbiIsImF0YW4yIiwiYXZlcmFnZSIsCiJiZmlsZW5hbWUiLAoiY2VpbCIsImNoYXJ0b3Jvd2lkIiwiY2hyIiwiY29uY2F0IiwiY29udmVydCIsImNvcyIsImNvc2giLCJjb3VudCIsCiJkZWNvZGUiLCJkZXJlZiIsImR1YWwiLCJkdW1wIiwiZHVwX3ZhbF9vbl9pbmRleCIsCiJlbXB0eSIsImVycm9yIiwiZXhwIiwKImZhbHNlIiwiZmxvb3IiLCJmb3VuZCIsCiJnbGIiLCJncmVhdGVzdCIsCiJoZXh0b3JhdyIsCiJpbml0Y2FwIiwiaW5zdHIiLCJpbnN0cmIiLCJpc29wZW4iLAoibGFzdF9kYXkiLCJsZWFzdCIsImxlbmdodCIsImxlbmdodGIiLCJsbiIsImxvd2VyIiwibHBhZCIsImx0cmltIiwibHViIiwKIm1ha2VfcmVmIiwibWF4IiwibWluIiwibW9kIiwibW9udGhzX2JldHdlZW4iLAoibmV3X3RpbWUiLCJuZXh0X2RheSIsIm5leHR2YWwiLCJubHNfY2hhcnNldF9kZWNsX2xlbiIsIm5sc19jaGFyc2V0X2lkIiwibmxzX2NoYXJzZXRfbmFtZSIsIm5sc19pbml0Y2FwIiwibmxzX2xvd2VyIiwKIm5sc19zb3J0IiwibmxzX3VwcGVyIiwibmxzc29ydCIsIm5vX2RhdGFfZm91bmQiLCJub3Rmb3VuZCIsIm51bGwiLCJudmwiLAoib3RoZXJzIiwKInBvd2VyIiwKInJhd3RvaGV4IiwicmVmdG9oZXgiLCJyb3VuZCIsInJvd2NvdW50Iiwicm93aWR0b2NoYXIiLCJycGFkIiwicnRyaW0iLAoic2lnbiIsInNpbiIsInNpbmgiLCJzb3VuZGV4Iiwic3FsY29kZSIsInNxbGVycm0iLCJzcXJ0Iiwic3RkZGV2Iiwic3Vic3RyIiwic3Vic3RyYiIsInN1bSIsInN5c2RhdGUiLAoidGFuIiwidGFuaCIsInRvX2NoYXIiLCJ0b19kYXRlIiwidG9fbGFiZWwiLCJ0b19tdWx0aV9ieXRlIiwidG9fbnVtYmVyIiwidG9fc2luZ2xlX2J5dGUiLCJ0cmFuc2xhdGUiLCJ0cnVlIiwidHJ1bmMiLAoidWlkIiwidXBwZXIiLCJ1c2VyIiwidXNlcmVudiIsCiJ2YXJpYW5jZSIsInZzaXplIgoKICBdKTsKCiAgdmFyIGtleXdvcmRzID0gd29yZFJlZ2V4cChbCiJhYm9ydCIsImFjY2VwdCIsImFjY2VzcyIsImFkZCIsImFsbCIsImFsdGVyIiwiYW5kIiwiYW55IiwiYXJyYXkiLCJhcnJheWxlbiIsImFzIiwiYXNjIiwiYXNzZXJ0IiwiYXNzaWduIiwiYXQiLCJhdHRyaWJ1dGVzIiwiYXVkaXQiLAoiYXV0aG9yaXphdGlvbiIsImF2ZyIsCiJiYXNlX3RhYmxlIiwiYmVnaW4iLCJiZXR3ZWVuIiwiYmluYXJ5X2ludGVnZXIiLCJib2R5IiwiYm9vbGVhbiIsImJ5IiwKImNhc2UiLCJjYXN0IiwiY2hhciIsImNoYXJfYmFzZSIsImNoZWNrIiwiY2xvc2UiLCJjbHVzdGVyIiwiY2x1c3RlcnMiLCJjb2xhdXRoIiwiY29sdW1uIiwiY29tbWVudCIsImNvbW1pdCIsImNvbXByZXNzIiwiY29ubmVjdCIsCiJjb25uZWN0ZWQiLCJjb25zdGFudCIsImNvbnN0cmFpbnQiLCJjcmFzaCIsImNyZWF0ZSIsImN1cnJlbnQiLCJjdXJydmFsIiwiY3Vyc29yIiwKImRhdGFfYmFzZSIsImRhdGFiYXNlIiwiZGF0ZSIsImRiYSIsImRlYWxsb2NhdGUiLCJkZWJ1Z29mZiIsImRlYnVnb24iLCJkZWNpbWFsIiwiZGVjbGFyZSIsImRlZmF1bHQiLCJkZWZpbml0aW9uIiwiZGVsYXkiLCJkZWxldGUiLAoiZGVzYyIsImRpZ2l0cyIsImRpc3Bvc2UiLCJkaXN0aW5jdCIsImRvIiwiZHJvcCIsCiJlbHNlIiwiZWxzaWYiLCJlbmFibGUiLCJlbmQiLCJlbnRyeSIsImVzY2FwZSIsImV4Y2VwdGlvbiIsImV4Y2VwdGlvbl9pbml0IiwiZXhjaGFuZ2UiLCJleGNsdXNpdmUiLCJleGlzdHMiLCJleGl0IiwiZXh0ZXJuYWwiLAoiZmFzdCIsImZldGNoIiwiZmlsZSIsImZvciIsImZvcmNlIiwiZm9ybSIsImZyb20iLCJmdW5jdGlvbiIsCiJnZW5lcmljIiwiZ290byIsImdyYW50IiwiZ3JvdXAiLAoiaGF2aW5nIiwKImlkZW50aWZpZWQiLCJpZiIsImltbWVkaWF0ZSIsImluIiwiaW5jcmVtZW50IiwiaW5kZXgiLCJpbmRleGVzIiwiaW5kaWNhdG9yIiwiaW5pdGlhbCIsImluaXRyYW5zIiwiaW5zZXJ0IiwiaW50ZXJmYWNlIiwiaW50ZXJzZWN0IiwKImludG8iLCJpcyIsCiJrZXkiLAoibGV2ZWwiLCJsaWJyYXJ5IiwibGlrZSIsImxpbWl0ZWQiLCJsb2NhbCIsImxvY2siLCJsb2ciLCJsb2dnaW5nIiwibG9uZyIsImxvb3AiLAoibWFzdGVyIiwibWF4ZXh0ZW50cyIsIm1heHRyYW5zIiwibWVtYmVyIiwibWluZXh0ZW50cyIsIm1pbnVzIiwibWlzbGFiZWwiLCJtb2RlIiwibW9kaWZ5IiwibXVsdGlzZXQiLAoibmV3IiwibmV4dCIsIm5vIiwibm9hdWRpdCIsIm5vY29tcHJlc3MiLCJub2xvZ2dpbmciLCJub3BhcmFsbGVsIiwibm90Iiwibm93YWl0IiwibnVtYmVyX2Jhc2UiLAoib2JqZWN0Iiwib2YiLCJvZmYiLCJvZmZsaW5lIiwib24iLCJvbmxpbmUiLCJvbmx5Iiwib3BlbiIsIm9wdGlvbiIsIm9yIiwib3JkZXIiLCJvdXQiLAoicGFja2FnZSIsInBhcmFsbGVsIiwicGFydGl0aW9uIiwicGN0ZnJlZSIsInBjdGluY3JlYXNlIiwicGN0dXNlZCIsInBsc19pbnRlZ2VyIiwicG9zaXRpdmUiLCJwb3NpdGl2ZW4iLCJwcmFnbWEiLCJwcmltYXJ5IiwicHJpb3IiLAoicHJpdmF0ZSIsInByaXZpbGVnZXMiLCJwcm9jZWR1cmUiLCJwdWJsaWMiLAoicmFpc2UiLCJyYW5nZSIsInJhdyIsInJlYWQiLCJyZWJ1aWxkIiwicmVjb3JkIiwicmVmIiwicmVmZXJlbmNlcyIsInJlZnJlc2giLCJyZWxlYXNlIiwicmVuYW1lIiwicmVwbGFjZSIsInJlc291cmNlIiwicmVzdHJpY3QiLCJyZXR1cm4iLAoicmV0dXJuaW5nIiwicmV2ZXJzZSIsInJldm9rZSIsInJvbGxiYWNrIiwicm93Iiwicm93aWQiLCJyb3dsYWJlbCIsInJvd251bSIsInJvd3MiLCJydW4iLAoic2F2ZXBvaW50Iiwic2NoZW1hIiwic2VnbWVudCIsInNlbGVjdCIsInNlcGFyYXRlIiwic2Vzc2lvbiIsInNldCIsInNoYXJlIiwic25hcHNob3QiLCJzb21lIiwic3BhY2UiLCJzcGxpdCIsInNxbCIsInN0YXJ0Iiwic3RhdGVtZW50IiwKInN0b3JhZ2UiLCJzdWJ0eXBlIiwic3VjY2Vzc2Z1bCIsInN5bm9ueW0iLAoidGFiYXV0aCIsInRhYmxlIiwidGFibGVzIiwidGFibGVzcGFjZSIsInRhc2siLCJ0ZXJtaW5hdGUiLCJ0aGVuIiwidG8iLCJ0cmlnZ2VyIiwidHJ1bmNhdGUiLCJ0eXBlIiwKInVuaW9uIiwidW5pcXVlIiwidW5saW1pdGVkIiwidW5yZWNvdmVyYWJsZSIsInVudXNhYmxlIiwidXBkYXRlIiwidXNlIiwidXNpbmciLAoidmFsaWRhdGUiLCJ2YWx1ZSIsInZhbHVlcyIsInZhcmlhYmxlIiwidmlldyIsInZpZXdzIiwKIndoZW4iLCJ3aGVuZXZlciIsIndoZXJlIiwid2hpbGUiLCJ3aXRoIiwid29yayIKICBdKTsKCiAgdmFyIHR5cGVzID0gd29yZFJlZ2V4cChbCiJiZmlsZSIsImJsb2IiLAoiY2hhcmFjdGVyIiwiY2xvYiIsCiJkZWMiLAoiZmxvYXQiLAoiaW50IiwiaW50ZWdlciIsCiJtbHNsYWJlbCIsCiJuYXR1cmFsIiwibmF0dXJhbG4iLCJuY2hhciIsIm5jbG9iIiwibnVtYmVyIiwibnVtZXJpYyIsIm52YXJjaGFyMiIsCiJyZWFsIiwicm93dHlwZSIsCiJzaWdudHlwZSIsInNtYWxsaW50Iiwic3RyaW5nIiwKInZhcmNoYXIiLCJ2YXJjaGFyMiIKICBdKTsKCiAgdmFyIG9wZXJhdG9ycyA9IHdvcmRSZWdleHAoWwogICAgIjo9IiwgIjwiLCAiPD0iLCAiPT0iLCAiIT0iLCAiPD4iLCAiPiIsICI+PSIsICJsaWtlIiwgInJsaWtlIiwgImluIiwgInhvciIsICJiZXR3ZWVuIgogIF0pOwoKICB2YXIgb3BlcmF0b3JDaGFycyA9IC9bKitcLTw+PSZ8OlwvXS87CgogIHZhciB0b2tlbml6ZVNxbCA9IChmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIG5vcm1hbChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PSAiQCIgfHwgY2ggPT0gIiQiKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1tcd1xkXS8pOwogICAgICAgIHJldHVybiAicGxzcWwtdmFyIjsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiXCIiIHx8IGNoID09ICInIiB8fCBjaCA9PSAiYCIpIHsKICAgICAgICBzZXRTdGF0ZShpbkxpdGVyYWwoY2gpKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiLCIgfHwgY2ggPT0gIjsiKSB7CiAgICAgICAgcmV0dXJuICJwbHNxbC1zZXBhcmF0b3IiCiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gJy0nKSB7CiAgICAgICAgaWYgKHNvdXJjZS5wZWVrKCkgPT0gIi0iKSB7CiAgICAgICAgICB3aGlsZSAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgc291cmNlLm5leHQoKTsKICAgICAgICAgIHJldHVybiAicGxzcWwtY29tbWVudCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKC9cZC8udGVzdChzb3VyY2UucGVlaygpKSkgewogICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1xkLyk7CiAgICAgICAgICBpZiAoc291cmNlLnBlZWsoKSA9PSAnLicpIHsKICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1xkLyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gInBsc3FsLW51bWJlciI7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiAicGxzcWwtb3BlcmF0b3IiOwogICAgICB9CiAgICAgIGVsc2UgaWYgKG9wZXJhdG9yQ2hhcnMudGVzdChjaCkpIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhvcGVyYXRvckNoYXJzKTsKICAgICAgICByZXR1cm4gInBsc3FsLW9wZXJhdG9yIjsKICAgICAgfQogICAgICBlbHNlIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1xkLyk7CiAgICAgICAgaWYgKHNvdXJjZS5wZWVrKCkgPT0gJy4nKSB7CiAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1xkLyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAicGxzcWwtbnVtYmVyIjsKICAgICAgfQogICAgICBlbHNlIGlmICgvWygpXS8udGVzdChjaCkpIHsKICAgICAgICByZXR1cm4gInBsc3FsLXB1bmN0dWF0aW9uIjsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW19cd1xkXS8pOwogICAgICAgIHZhciB3b3JkID0gc291cmNlLmdldCgpLCB0eXBlOwogICAgICAgIGlmIChvcGVyYXRvcnMudGVzdCh3b3JkKSkKICAgICAgICAgIHR5cGUgPSAicGxzcWwtb3BlcmF0b3IiOwogICAgICAgIGVsc2UgaWYgKGtleXdvcmRzLnRlc3Qod29yZCkpCiAgICAgICAgICB0eXBlID0gInBsc3FsLWtleXdvcmQiOwogICAgICAgIGVsc2UgaWYgKGZ1bmN0aW9ucy50ZXN0KHdvcmQpKQogICAgICAgICAgdHlwZSA9ICJwbHNxbC1mdW5jdGlvbiI7CiAgICAgICAgZWxzZSBpZiAodHlwZXMudGVzdCh3b3JkKSkKICAgICAgICAgIHR5cGUgPSAicGxzcWwtdHlwZSI7CiAgICAgICAgZWxzZQogICAgICAgICAgdHlwZSA9ICJwbHNxbC13b3JkIjsKICAgICAgICByZXR1cm4ge3N0eWxlOiB0eXBlLCBjb250ZW50OiB3b3JkfTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGluTGl0ZXJhbChxdW90ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKICAgICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpIHsKICAgICAgICAgICAgc2V0U3RhdGUobm9ybWFsKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHF1b3RlID09ICJgIiA/ICJwbHNxbC13b3JkIiA6ICJwbHNxbC1saXRlcmFsIjsKICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzdGFydFN0YXRlKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZXIoc291cmNlLCBzdGFydFN0YXRlIHx8IG5vcm1hbCk7CiAgICB9OwogIH0pKCk7CgogIGZ1bmN0aW9uIGluZGVudFNxbChjb250ZXh0KSB7CiAgICByZXR1cm4gZnVuY3Rpb24obmV4dENoYXJzKSB7CiAgICAgIHZhciBmaXJzdENoYXIgPSBuZXh0Q2hhcnMgJiYgbmV4dENoYXJzLmNoYXJBdCgwKTsKICAgICAgdmFyIGNsb3NpbmcgPSBjb250ZXh0ICYmIGZpcnN0Q2hhciA9PSBjb250ZXh0LnR5cGU7CiAgICAgIGlmICghY29udGV4dCkKICAgICAgICByZXR1cm4gMDsKICAgICAgZWxzZSBpZiAoY29udGV4dC5hbGlnbikKICAgICAgICByZXR1cm4gY29udGV4dC5jb2wgLSAoY2xvc2luZyA/IGNvbnRleHQud2lkdGggOiAwKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBjb250ZXh0LmluZGVudCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcGFyc2VTcWwoc291cmNlKSB7CiAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVTcWwoc291cmNlKTsKICAgIHZhciBjb250ZXh0ID0gbnVsbCwgaW5kZW50ID0gMCwgY29sID0gMDsKICAgIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHR5cGUsIHdpZHRoLCBhbGlnbikgewogICAgICBjb250ZXh0ID0ge3ByZXY6IGNvbnRleHQsIGluZGVudDogaW5kZW50LCBjb2w6IGNvbCwgdHlwZTogdHlwZSwgd2lkdGg6IHdpZHRoLCBhbGlnbjogYWxpZ259OwogICAgfQogICAgZnVuY3Rpb24gcG9wQ29udGV4dCgpIHsKICAgICAgY29udGV4dCA9IGNvbnRleHQucHJldjsKICAgIH0KCiAgICB2YXIgaXRlciA9IHsKICAgICAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zLm5leHQoKTsKICAgICAgICB2YXIgdHlwZSA9IHRva2VuLnN0eWxlLCBjb250ZW50ID0gdG9rZW4uY29udGVudCwgd2lkdGggPSB0b2tlbi52YWx1ZS5sZW5ndGg7CgogICAgICAgIGlmIChjb250ZW50ID09ICJcbiIpIHsKICAgICAgICAgIHRva2VuLmluZGVudGF0aW9uID0gaW5kZW50U3FsKGNvbnRleHQpOwogICAgICAgICAgaW5kZW50ID0gY29sID0gMDsKICAgICAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuYWxpZ24gPT0gbnVsbCkgY29udGV4dC5hbGlnbiA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlID09ICJ3aGl0ZXNwYWNlIiAmJiBjb2wgPT0gMCkgewogICAgICAgICAgaW5kZW50ID0gd2lkdGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCFjb250ZXh0ICYmIHR5cGUgIT0gInBsc3FsLWNvbW1lbnQiKSB7CiAgICAgICAgICBwdXNoQ29udGV4dCgiOyIsIDAsIGZhbHNlKTsKICAgICAgICB9CgogICAgICAgIGlmIChjb250ZW50ICE9ICJcbiIpIGNvbCArPSB3aWR0aDsKCiAgICAgICAgaWYgKHR5cGUgPT0gInBsc3FsLXB1bmN0dWF0aW9uIikgewogICAgICAgICAgaWYgKGNvbnRlbnQgPT0gIigiKQogICAgICAgICAgICBwdXNoQ29udGV4dCgiKSIsIHdpZHRoKTsKICAgICAgICAgIGVsc2UgaWYgKGNvbnRlbnQgPT0gIikiKQogICAgICAgICAgICBwb3BDb250ZXh0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInBsc3FsLXNlcGFyYXRvciIgJiYgY29udGVudCA9PSAiOyIgJiYgY29udGV4dCAmJiAhY29udGV4dC5wcmV2KSB7CiAgICAgICAgICBwb3BDb250ZXh0KCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH0sCgogICAgICBjb3B5OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2NvbnRleHQgPSBjb250ZXh0LCBfaW5kZW50ID0gaW5kZW50LCBfY29sID0gY29sLCBfdG9rZW5TdGF0ZSA9IHRva2Vucy5zdGF0ZTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgICB0b2tlbnMgPSB0b2tlbml6ZVNxbChzb3VyY2UsIF90b2tlblN0YXRlKTsKICAgICAgICAgIGNvbnRleHQgPSBfY29udGV4dDsKICAgICAgICAgIGluZGVudCA9IF9pbmRlbnQ7CiAgICAgICAgICBjb2wgPSBfY29sOwogICAgICAgICAgcmV0dXJuIGl0ZXI7CiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIHJldHVybiBpdGVyOwogIH0KCiAgcmV0dXJuIHttYWtlOiBwYXJzZVNxbCwgZWxlY3RyaWNDaGFyczogIikifTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/plsql/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IENvcHlyaWdodCAoYykgMjAxMCBQZXRlciBSYWdhbml0c2NoCgogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkKIGRhbWFnZXMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KCiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKIHB1cnBvc2UsIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZAogcmVkaXN0cmlidXRlIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0CiAgICBub3QgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMKICAgIHNvZnR3YXJlIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QKICAgIGRvY3VtZW50YXRpb24gd291bGQgYmUgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KCiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0CiAgICBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgoKIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZQogICAgZGlzdHJpYnV0aW9uLgoKIFBldGVyIFJhZ2FuaXRzY2gK]]></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[aHRtbCB7CiAgY3Vyc29yOiB0ZXh0Owp9CgouZWRpdGJveCB7CiAgcGFkZGluZzogLjRlbTsKICBtYXJnaW46IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgbGluZS1oZWlnaHQ6IDEuMWVtOwogIGNvbG9yOiBibGFjazsKfQoKcHJlLmNvZGUsIC5lZGl0Ym94IHsKICBjb2xvcjogIzY2NjY2NjsKfQoKLmVkaXRib3ggcCB7CiAgbWFyZ2luOiAwOwp9CgpzcGFuLnB5LWRlbGltaXRlciwgc3Bhbi5weS1zcGVjaWFsIHsKICBjb2xvcjogIzY2NjY2NjsKfQoKc3Bhbi5weS1vcGVyYXRvciB7CiAgY29sb3I6ICM2NjY2NjY7Cn0KCnNwYW4ucHktZXJyb3IgewogIGJhY2tncm91bmQtY29sb3I6ICM2NjAwMDA7CiAgY29sb3I6ICNGRkZGRkY7Cn0KCnNwYW4ucHkta2V5d29yZCB7CiAgY29sb3I6ICM3NzAwODg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCnNwYW4ucHktbGl0ZXJhbCB7CiAgY29sb3I6ICMyMjg4MTE7Cn0KCnNwYW4ucHktaWRlbnRpZmllciwgc3Bhbi5weS1mdW5jICB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLnB5LXR5cGUsIHNwYW4ucHktZGVjb3JhdG9yIHsKICBjb2xvcjogIzAwMDBGRjsKfQoKc3Bhbi5weS1jb21tZW50IHsKICBjb2xvcjogI0FBNzcwMDsKfQoKc3Bhbi5weS1zdHJpbmcsIHNwYW4ucHktYnl0ZXMsIHNwYW4ucHktcmF3LCBzcGFuLnB5LXVuaWNvZGUgewogIGNvbG9yOiAjQUEyMjIyOwp9Cg==]]></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+Jyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHkgPSBweTI7CiAgICAgICAgICAgIHN0cmluZ1N0YXJ0ZXJzID0gL1tcJ1wiUlVydV0vOwogICAgICAgICAgICBzdHJpbmdUeXBlcyA9IC9bcnVdLzsKICAgICAgICB9CiAgICAgICAgY29uZmlnID0gY29uZjsKICAgICAgICBrZXl3b3JkcyA9IHdvcmRSZWdleHAoY29tbW9ua2V5d29yZHMuY29uY2F0KHB5LmtleXdvcmRzKSk7CiAgICAgICAgdHlwZXMgPSB3b3JkUmVnZXhwKGNvbW1vbnR5cGVzLmNvbmNhdChweS50eXBlcykpOwogICAgICAgIGRvdWJsZURlbGltaXRlcnMgPSB3b3JkUmVnZXhwKGRvdWJsZURlbGltaXRlcnMpOwogICAgfQoKICAgIHZhciB0b2tlbml6ZVB5dGhvbiA9IChmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBub3JtYWwoc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgICAgICB2YXIgc3RyaW5nRGVsaW0sIHRocmVlU3RyLCB0ZW1wLCB0eXBlLCB3b3JkLCBwb3NzaWJsZSA9IHt9OwogICAgICAgICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAKICAgICAgICAgICAgZnVuY3Rpb24gZmlsdGVyUG9zc2libGUodG9rZW4sIHN0eWxlSWZQb3NzaWJsZSkgewogICAgICAgICAgICAgICAgaWYgKCFwb3NzaWJsZS5zdHlsZSAmJiAhcG9zc2libGUuY29udGVudCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mKHRva2VuKSA9PSBTVFJJTkdDT05URVhUKSB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB7Y29udGVudDogc291cmNlLmdldCgpLCBzdHlsZTogdG9rZW59OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHBvc3NpYmxlLnN0eWxlIHx8IHN0eWxlSWZQb3NzaWJsZSkgewogICAgICAgICAgICAgICAgICAgIHRva2VuLnN0eWxlID0gc3R5bGVJZlBvc3NpYmxlID8gc3R5bGVJZlBvc3NpYmxlIDogcG9zc2libGUuc3R5bGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocG9zc2libGUuY29udGVudCkgewogICAgICAgICAgICAgICAgICAgIHRva2VuLmNvbnRlbnQgPSBwb3NzaWJsZS5jb250ZW50ICsgdG9rZW4uY29udGVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBvc3NpYmxlID0ge307CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEhhbmRsZSBjb21tZW50cwogICAgICAgICAgICBpZiAoY2ggPT0gJyMnKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgewogICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJ3B5LWNvbW1lbnQnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNoYXJzCiAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnKSB7CiAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgewogICAgICAgICAgICAgICAgICAgIHZhciB3aGl0ZXNwYWNlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZighKC9bXHNcdTAwYTBdLy50ZXN0KHNvdXJjZS5uZXh0KCkpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghd2hpdGVzcGFjZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JDTEFTUzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJ3B5LXNwZWNpYWwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEhhbmRsZSBvcGVyYXRvcnMgYW5kIGRlbGltaXRlcnMKICAgICAgICAgICAgaWYgKHNpbmdsZVN0YXJ0ZXJzLmluZGV4T2YoY2gpICE9IC0xIHx8IChjaCA9PSAiLiIgJiYgIXNvdXJjZS5tYXRjaGVzKC9cZC8pKSkgewogICAgICAgICAgICAgICAgaWYgKGRvdWJsZVN0YXJ0ZXJzLmluZGV4T2Yoc291cmNlLnBlZWsoKSkgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wID0gY2ggKyBzb3VyY2UucGVlaygpOwogICAgICAgICAgICAgICAgICAgIC8vIEl0IG11c3QgYmUgYSBkb3VibGUgZGVsaW1pdGVyIG9yIG9wZXJhdG9yIG9yIHRyaXBsZSBkZWxpbWl0ZXIKICAgICAgICAgICAgICAgICAgICBpZiAoZG91YmxlT3BlcmF0b3JzLnRlc3QodGVtcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRDaGFyID0gc291cmNlLnBlZWsoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFyICYmIHRyaXBsZURlbGltaXRlcnMudGVzdCh0ZW1wICsgbmV4dENoYXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFTElNSVRFUkNMQVNTOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QRVJBVE9SQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRvdWJsZURlbGltaXRlcnMudGVzdCh0ZW1wKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVMSU1JVEVSQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gSXQgbXVzdCBiZSBhIHNpbmdsZSBkZWxpbWl0ZXIgb3Igb3BlcmF0b3IKICAgICAgICAgICAgICAgIGlmIChzaW5nbGVPcGVyYXRvcnMuaW5kZXhPZihjaCkgIT0gLTEgfHwgY2ggPT0gIi4iKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QRVJBVE9SQ0xBU1M7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNpbmdsZURlbGltaXRlcnMuaW5kZXhPZihjaCkgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ0AnICYmIHNvdXJjZS5tYXRjaGVzKC9cdy8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHdcZF9dLyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7c3R5bGU6J3B5LWRlY29yYXRvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogc291cmNlLmdldCgpfTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVMSU1JVEVSQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JDTEFTUzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBIYW5kbGUgbnVtYmVyIGxpdGVyYWxzCiAgICAgICAgICAgIGlmICgvXGQvLnRlc3QoY2gpIHx8IChjaCA9PSAiLiIgJiYgc291cmNlLm1hdGNoZXMoL1xkLykpKSB7CiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICcwJyAmJiAhc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzb3VyY2UucGVlaygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ28nOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdPJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvWzAtN10vKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJQb3NzaWJsZShMSVRFUkFMQ0xBU1MsIEVSUk9SQ0xBU1MpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnWCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swLTlBLUZhLWZdLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyUG9zc2libGUoTElURVJBTENMQVNTLCBFUlJPUkNMQVNTKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYic6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0InOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bMDFdLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyUG9zc2libGUoTElURVJBTENMQVNTLCBFUlJPUkNMQVNTKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvXGQvKTsKICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnLicgJiYgc291cmNlLnBlZWsoKSA9PSAnLicpIHsKICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9cZC8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gR3JhYiBhbiBleHBvbmVudAogICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5tYXRjaGVzKC9lL2kpKSB7CiAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLnBlZWsoKSA9PSAnKycgfHwgc291cmNlLnBlZWsoKSA9PSAnLScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5tYXRjaGVzKC9cZC8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9cZC8pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJQb3NzaWJsZShFUlJPUkNMQVNTKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBHcmFiIGEgY29tcGxleCBudW1iZXIKICAgICAgICAgICAgICAgIGlmIChzb3VyY2UubWF0Y2hlcygvai9pKSkgewogICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlclBvc3NpYmxlKExJVEVSQUxDTEFTUyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSGFuZGxlIHN0cmluZ3MKICAgICAgICAgICAgaWYgKHN0cmluZ1N0YXJ0ZXJzLnRlc3QoY2gpKSB7CiAgICAgICAgICAgICAgICB2YXIgcGVlayA9IHNvdXJjZS5wZWVrKCk7CiAgICAgICAgICAgICAgICB2YXIgc3RyaW5nVHlwZSA9IFNUUklOR0NMQVNTOwogICAgICAgICAgICAgICAgaWYgKChzdHJpbmdUeXBlcy50ZXN0KGNoKSkgJiYgKHBlZWsgPT0gJyInIHx8IHBlZWsgPT0gIiciKSkgewogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY2gudG9Mb3dlckNhc2UoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdiJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1R5cGUgPSBCWVRFU0NMQVNTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVHlwZSA9IFJBV0NMQVNTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3UnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVHlwZSA9IFVOSUNPREVDTEFTUzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgc3RyaW5nRGVsaW0gPSBjaDsKICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLnBlZWsoKSAhPSBzdHJpbmdEZWxpbSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShpblN0cmluZyhzdHJpbmdUeXBlLCBzdHJpbmdEZWxpbSkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLnBlZWsoKSA9PSBzdHJpbmdEZWxpbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVlU3RyID0gc3RyaW5nRGVsaW0gKyBzdHJpbmdEZWxpbSArIHN0cmluZ0RlbGltOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoaW5TdHJpbmcoc3RyaW5nVHlwZSwgdGhyZWVTdHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1R5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICInIiB8fCBjaCA9PSAnIicpIHsKICAgICAgICAgICAgICAgICAgICBzdHJpbmdEZWxpbSA9IGNoOwogICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UucGVlaygpICE9IHN0cmluZ0RlbGltKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKGluU3RyaW5nKHN0cmluZ1R5cGUsIHN0cmluZ0RlbGltKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UucGVlaygpID09IHN0cmluZ0RlbGltKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWVTdHIgPSBzdHJpbmdEZWxpbSArIHN0cmluZ0RlbGltICsgc3RyaW5nRGVsaW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShpblN0cmluZyhzdHJpbmdUeXBlLCB0aHJlZVN0cikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBIYW5kbGUgSWRlbnRpZmllcgogICAgICAgICAgICBpZiAoaWRlbnRpZmllclN0YXJ0ZXJzLnRlc3QoY2gpKSB7CiAgICAgICAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW1x3XGRfXS8pOwogICAgICAgICAgICAgICAgd29yZCA9IHNvdXJjZS5nZXQoKTsKICAgICAgICAgICAgICAgIGlmICh3b3JkT3BlcmF0b3JzLnRlc3Qod29yZCkpIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gT1BFUkFUT1JDTEFTUzsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5d29yZHMudGVzdCh3b3JkKSkgewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSAncHkta2V5d29yZCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVzLnRlc3Qod29yZCkpIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ3B5LXR5cGUnOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gSURFTlRJRklFUkNMQVNTOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChzb3VyY2UucGVlaygpID09ICcuJykgewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLm1hdGNoZXMoaWRlbnRpZmllclN0YXJ0ZXJzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1tcd1xkXS8pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVSUk9SQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3b3JkID0gd29yZCArIHNvdXJjZS5nZXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJQb3NzaWJsZSh7c3R5bGU6IHR5cGUsIGNvbnRlbnQ6IHdvcmR9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUmVnaXN0ZXIgRG9sbGFyIHNpZ24gYW5kIFF1ZXN0aW9uIG1hcmsgYXMgZXJyb3JzLiBBbHdheXMhCiAgICAgICAgICAgIGlmICgvXCRcPy8udGVzdChjaCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJQb3NzaWJsZShFUlJPUkNMQVNTKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGZpbHRlclBvc3NpYmxlKEVSUk9SQ0xBU1MpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaW5TdHJpbmcoc3R5bGUsIHRlcm1pbmF0b3IpIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgICAgICAgICAgIHZhciBtYXRjaGVzID0gW107CiAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHdoaWxlICghZm91bmQgJiYgIXNvdXJjZS5lbmRPZkxpbmUoKSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCksIG5ld01hdGNoZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGVzY2FwZWQgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UucGVlaygpID09ICdcbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gdGVybWluYXRvci5jaGFyQXQoMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHRlcm1pbmF0b3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gbWF0Y2hlc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmNoYXJBdCgwKSA9PSBjaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUobm9ybWFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01hdGNoZXMucHVzaChtYXRjaC5zbGljZSgxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyA9IG5ld01hdGNoZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzdGFydFN0YXRlKSB7CiAgICAgICAgICAgIHJldHVybiB0b2tlbml6ZXIoc291cmNlLCBzdGFydFN0YXRlIHx8IG5vcm1hbCk7CiAgICAgICAgfTsKICAgIH0pKCk7CgogICAgZnVuY3Rpb24gcGFyc2VQeXRob24oc291cmNlLCBiYXNlY29sdW1uKSB7CiAgICAgICAgaWYgKCFrZXl3b3JkcykgewogICAgICAgICAgICBjb25maWd1cmUoe30pOwogICAgICAgIH0KICAgICAgICBiYXNlY29sdW1uID0gYmFzZWNvbHVtbiB8fCAwOwoKICAgICAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVQeXRob24oc291cmNlKTsKICAgICAgICB2YXIgbGFzdFRva2VuID0gbnVsbDsKICAgICAgICB2YXIgY29sdW1uID0gYmFzZWNvbHVtbjsKICAgICAgICB2YXIgY29udGV4dCA9IHtwcmV2OiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgIGVuZE9mU2NvcGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TmV3U2NvcGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBiYXNlY29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTk9STUFMQ09OVEVYVAogICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIHB1c2hDb250ZXh0KGxldmVsLCB0eXBlKSB7CiAgICAgICAgICAgIHR5cGUgPSB0eXBlID8gdHlwZSA6IE5PUk1BTENPTlRFWFQ7CiAgICAgICAgICAgIGNvbnRleHQgPSB7cHJldjogY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICBlbmRPZlNjb3BlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICBzdGFydE5ld1Njb3BlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgbmV4dDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlCiAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHBvcENvbnRleHQocmVtb3ZlKSB7CiAgICAgICAgICAgIHJlbW92ZSA9IHJlbW92ZSA/IHJlbW92ZSA6IGZhbHNlOwogICAgICAgICAgICBpZiAoY29udGV4dC5wcmV2KSB7CiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQucHJldjsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm5leHQgPSBudWxsOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnByZXYubmV4dCA9IGNvbnRleHQ7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQucHJldjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaW5kZW50UHl0aG9uKGNvbnRleHQpIHsKICAgICAgICAgICAgdmFyIHRlbXA7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihuZXh0Q2hhcnMsIGN1cnJlbnRMZXZlbCwgZGlyZWN0aW9uKSB7CiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBudWxsIHx8IGRpcmVjdGlvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFycykgewogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dC5uZXh0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmxldmVsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMZXZlbCA9PSBjb250ZXh0LmxldmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Lm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Lm5leHQubGV2ZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5sZXZlbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBjb250ZXh0OwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGVtcC5wcmV2ICYmIHRlbXAucHJldi5sZXZlbCA+IGN1cnJlbnRMZXZlbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAucHJldjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcC5sZXZlbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudExldmVsID4gY29udGV4dC5sZXZlbCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5sZXZlbDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQucHJldikgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gY29udGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRlbXAucHJldiAmJiB0ZW1wLnByZXYubGV2ZWwgPj0gY3VycmVudExldmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcC5wcmV2OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wLnByZXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wLnByZXYubGV2ZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcC5sZXZlbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmxldmVsOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgdmFyIGl0ZXIgPSB7CiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zLm5leHQoKTsKICAgICAgICAgICAgICAgIHZhciB0eXBlID0gdG9rZW4uc3R5bGU7CiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IHRva2VuLmNvbnRlbnQ7CgogICAgICAgICAgICAgICAgaWYgKGxhc3RUb2tlbikgewogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0VG9rZW4uY29udGVudCA9PSAnZGVmJyAmJiB0eXBlID09IElERU5USUZJRVJDTEFTUykgewogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5zdHlsZSA9ICdweS1mdW5jJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RUb2tlbi5jb250ZW50ID09ICdcbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBDdHggPSBjb250ZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgYSBkaWZmZXJlbnQgc2NvcGUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ3doaXRlc3BhY2UnICYmIGNvbnRleHQudHlwZSA9PSBOT1JNQUxDT05URVhUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udmFsdWUubGVuZ3RoIDwgY29udGV4dC5sZXZlbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0b2tlbi52YWx1ZS5sZW5ndGggPCBjb250ZXh0LmxldmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcENvbnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi52YWx1ZS5sZW5ndGggIT0gY29udGV4dC5sZXZlbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gdGVtcEN0eDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5zdHJpY3RFcnJvcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLnN0eWxlID0gRVJST1JDTEFTUzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQubmV4dCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubGV2ZWwgIT09IGJhc2Vjb2x1bW4gJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnR5cGUgPT0gTk9STUFMQ09OVEVYVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGJhc2Vjb2x1bW4gIT09IGNvbnRleHQubGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BDb250ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQubGV2ZWwgIT09IGJhc2Vjb2x1bW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gdGVtcEN0eDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnN0cmljdEVycm9ycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5zdHlsZSA9IEVSUk9SQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBTY29wZSBDaGFuZ2VzCiAgICAgICAgICAgICAgICBzd2l0Y2godHlwZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgU1RSSU5HQ0xBU1M6CiAgICAgICAgICAgICAgICAgICAgY2FzZSBCWVRFU0NMQVNTOgogICAgICAgICAgICAgICAgICAgIGNhc2UgUkFXQ0xBU1M6CiAgICAgICAgICAgICAgICAgICAgY2FzZSBVTklDT0RFQ0xBU1M6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LnR5cGUgIT09IFNUUklOR0NPTlRFWFQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hDb250ZXh0KGNvbnRleHQubGV2ZWwgKyAxLCBTVFJJTkdDT05URVhUKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC50eXBlID09PSBTVFJJTkdDT05URVhUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BDb250ZXh0KHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3dpdGNoKGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICcuJzoKICAgICAgICAgICAgICAgICAgICBjYXNlICdAJzoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgZGVsaW1pdGVycyBkb24ndCBhcHBlYXIgYnkgdGhlbXNlbHZlcwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAhPT0gdG9rZW4udmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLnN0eWxlID0gRVJST1JDTEFTUzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICc6JzoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29sb25zIG9ubHkgZGVsaW1pdCBzY29wZSBpbnNpZGUgYSBub3JtYWwgc2NvcGUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQudHlwZSA9PT0gTk9STUFMQ09OVEVYVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zdGFydE5ld1Njb3BlID0gY29udGV4dC5sZXZlbCtpbmRlbnRVbml0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJygnOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ1snOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3snOgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBzdGFydCBhIHNlcXVlbmNlIHNjb3BlCiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hDb250ZXh0KGNvbHVtbiArIGNvbnRlbnQubGVuZ3RoLCAnc2VxdWVuY2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnKSc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnXSc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnfSc6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGVuZCBhIHNlcXVlbmNlIHNjb3BlCiAgICAgICAgICAgICAgICAgICAgICAgIHBvcENvbnRleHQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Bhc3MnOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JldHVybic6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGVuZCBhIG5vcm1hbCBzY29wZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC50eXBlID09PSBOT1JNQUxDT05URVhUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVuZE9mU2NvcGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgb3VyIGNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBiYXNlY29sdW1uOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIGFueSBzY29wZSBjaGFuZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmVuZE9mU2NvcGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZW5kT2ZTY29wZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wQ29udGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQuc3RhcnROZXdTY29wZSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wID0gY29udGV4dC5zdGFydE5ld1Njb3BlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zdGFydE5ld1Njb3BlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoQ29udGV4dCh0ZW1wLCBOT1JNQUxDT05URVhUKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXdsaW5lcyByZXF1aXJlIGFuIGluZGVudGF0aW9uIGZ1bmN0aW9uIHdyYXBwZWQgaW4gYSBjbG9zdXJlIGZvciBwcm9wZXIgY29udGV4dC4KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uaW5kZW50YXRpb24gPSBpbmRlbnRQeXRob24oY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgY3VycmVudCBjb2x1bW4gZm9yIGNlcnRhaW4gc2NvcGVzLgogICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgIT0gJ1xuJykgewogICAgICAgICAgICAgICAgICAgIGNvbHVtbiArPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGFzdFRva2VuID0gdG9rZW47CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBjb3B5OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBfY29udGV4dCA9IGNvbnRleHQsIF90b2tlblN0YXRlID0gdG9rZW5zLnN0YXRlOwogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IHRva2VuaXplUHl0aG9uKHNvdXJjZSwgX3Rva2VuU3RhdGUpOwogICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPSBfY29udGV4dDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlcjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiBpdGVyOwogICAgfQoKICAgIHJldHVybiB7bWFrZTogcGFyc2VQeXRob24sCiAgICAgICAgICAgIGVsZWN0cmljQ2hhcnM6ICIiLAogICAgICAgICAgICBjb25maWd1cmU6IGNvbmZpZ3VyZX07Cn0pKCk7Cg==]]></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[aHRtbCB7CiAgY3Vyc29yOiB0ZXh0Owp9CgouZWRpdGJveCB7CiAgbWFyZ2luOiAuNGVtOwogIHBhZGRpbmc6IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgY29sb3I6IGJsYWNrOwp9CgouZWRpdGJveCBwIHsKICBtYXJnaW46IDA7Cn0KCnNwYW4uc3FsLWtleXdvcmQgewogIGNvbG9yOiBibHVlOwp9CgpzcGFuLnNxbC12YXIgewogIGNvbG9yOiByZWQ7Cn0KCnNwYW4uc3FsLWNvbW1lbnQgewogIGNvbG9yOiAjQUE3NzAwOwp9CgpzcGFuLnNxbC1saXRlcmFsIHsKICBjb2xvcjogZ3JlZW47Cn0KCnNwYW4uc3FsLW9wZXJhdG9yIHsKICBjb2xvcjogYmx1ZTsKfQoKc3Bhbi5zcWwtd29yZCB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLnNxbC1mdW5jdGlvbiB7CiAgY29sb3I6IGRhcmtvcmFuZ2U7Cn0KCnNwYW4uc3FsLXR5cGUgewogIGNvbG9yOiBwdXJwbGU7Cn0KCnNwYW4uc3FsLXNlcGFyYXRvciB7CiAgY29sb3I6ICM2NjY2NjY7Cn0KCnNwYW4uc3FsLW51bWJlciB7CiAgY29sb3I6IGRhcmtjeWFuOwp9CgoK]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/sql/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2pzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogU1FMIGRlbW9uc3RyYXRpb248L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vY3NzL2RvY3MuY3NzIi8+CiAgPC9oZWFkPgogIDxib2R5IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyI+Cgo8cD5EZW1vbnN0cmF0aW9uIG9mIDxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkNvZGVNaXJyb3I8L2E+J3MgU1FMCmhpZ2hsaWdodGVyLjwvcD4KCjxwPldyaXR0ZW4gYnkgSm9obiBCZW5lZGlrdHNzb24gKDxhIGhyZWY9IkxJQ0VOU0UiPmxpY2Vuc2U8L2E+KS48L3A+Cgo8ZGl2IGNsYXNzPSJib3JkZXIiPgo8dGV4dGFyZWEgaWQ9ImNvZGUiIGNvbHM9IjEyMCIgcm93cz0iNTAiPgpjcmVhdGUgdGFibGUgaWYgbm90IGV4aXN0cyB0YWJsZTEoCiAgYSAgYmlnaW50KDEzKSBub3QgbnVsbCBwcmltYXJ5IGtleSwKICBiICBjaGFyKDQpICAgIG5vdCBudWxsLAogIGMgIGNoYXIoNTApICAgbm90IG51bGwsCiAgZCAgaW50KDkpICAgICBub3QgbnVsbCwKKTsKCmluc2VydCBpbnRvIHRhYmxlMSB2YWx1ZXMgKDEyMzQ1Njc4OTAxMjMsICJiIiwgImMiLCAwKTsKCnNlbGVjdCBmcm9tX3VuaXh0aW1lKGEvMTAwMCksIGIsIGMsIG1pbihkKSBhcyBgdXNpbmdgCiAgZnJvbSB0YWJsZTEgdDEKICBsZWZ0IGpvaW4gdGFibGUyIHQyIHVzaW5nIChhKQogIC0tIGlubmVyIGpvaW4gdGFibGUzIHQzIG9uIHQzLl9hID0gdDEuYQogIGpvaW4gKAogICAgc2VsZWN0IGEsIGIsIGMKICAgIGZyb20gZGF0YQogICkgYXMgZm9vIG9uIGZvby5hID0gdDEuYQoKICB3aGVyZSBhICZndDsgMTAKICBhbmQgYiBsaWtlICclZm9vJwogIG9yIGMgPSAzLjE0MTU5CiAgYW5kIGQgJmx0OyAtMTUuNwogIG9yZGVyIGJ5IDEgZGVzYwo7CgpzZWxlY3QgQHRvdGFsIDo9IHN1bShkKSBmcm9tIGRhdGE7CjwvdGV4dGFyZWE+CjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSgnY29kZScsIHsKICAgIGhlaWdodDogIjQ1MHB4IiwKICAgIHBhcnNlcmZpbGU6ICIuLi9jb250cmliL3NxbC9qcy9wYXJzZXNxbC5qcyIsCiAgICBzdHlsZXNoZWV0OiAiY3NzL3NxbGNvbG9ycy5jc3MiLAogICAgcGF0aDogIi4uLy4uL2pzLyIsCiAgICB0ZXh0V3JhcHBpbmc6IGZhbHNlCiAgfSk7Cjwvc2NyaXB0PgoKICA8L2JvZHk+CjwvaHRtbD4K]]></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[dmFyIFNxbFBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CgogIGZ1bmN0aW9uIHdvcmRSZWdleHAod29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKD86IiArIHdvcmRzLmpvaW4oInwiKSArICIpJCIsICJpIik7CiAgfQoKICB2YXIgZnVuY3Rpb25zID0gd29yZFJlZ2V4cChbCiAgICAiYWJzIiwgImFjb3MiLCAiYWRkZGF0ZSIsICJhZXNfZW5jcnlwdCIsICJhZXNfZGVjcnlwdCIsICJhc2NpaSIsCiAgICAiYXNpbiIsICJhdGFuIiwgImF0YW4yIiwgImF2ZyIsICJiZW5jaG1hcmsiLCAiYmluIiwgImJpdF9hbmQiLAogICAgImJpdF9jb3VudCIsICJiaXRfbGVuZ3RoIiwgImJpdF9vciIsICJjYXN0IiwgImNlaWwiLCAiY2VpbGluZyIsCiAgICAiY2hhcl9sZW5ndGgiLCAiY2hhcmFjdGVyX2xlbmd0aCIsICJjb2FsZXNjZSIsICJjb25jYXQiLCAiY29uY2F0X3dzIiwKICAgICJjb25uZWN0aW9uX2lkIiwgImNvbnYiLCAiY29udmVydCIsICJjb3MiLCAiY290IiwgImNvdW50IiwgImN1cmRhdGUiLAogICAgImN1cnJlbnRfZGF0ZSIsICJjdXJyZW50X3RpbWUiLCAiY3VycmVudF90aW1lc3RhbXAiLCAiY3VycmVudF91c2VyIiwKICAgICJjdXJ0aW1lIiwgImRhdGFiYXNlIiwgImRhdGVfYWRkIiwgImRhdGVfZm9ybWF0IiwgImRhdGVfc3ViIiwKICAgICJkYXluYW1lIiwgImRheW9mbW9udGgiLCAiZGF5b2Z3ZWVrIiwgImRheW9meWVhciIsICJkZWNvZGUiLCAiZGVncmVlcyIsCiAgICAiZGVzX2VuY3J5cHQiLCAiZGVzX2RlY3J5cHQiLCAiZWx0IiwgImVuY29kZSIsICJlbmNyeXB0IiwgImV4cCIsCiAgICAiZXhwb3J0X3NldCIsICJleHRyYWN0IiwgImZpZWxkIiwgImZpbmRfaW5fc2V0IiwgImZsb29yIiwgImZvcm1hdCIsCiAgICAiZm91bmRfcm93cyIsICJmcm9tX2RheXMiLCAiZnJvbV91bml4dGltZSIsICJnZXRfbG9jayIsICJncmVhdGVzdCIsCiAgICAiZ3JvdXBfdW5pcXVlX3VzZXJzIiwgImhleCIsICJpZm51bGwiLCAiaW5ldF9hdG9uIiwgImluZXRfbnRvYSIsICJpbnN0ciIsCiAgICAiaW50ZXJ2YWwiLCAiaXNfZnJlZV9sb2NrIiwgImlzbnVsbCIsICJsYXN0X2luc2VydF9pZCIsICJsY2FzZSIsICJsZWFzdCIsCiAgICAibGVmdCIsICJsZW5ndGgiLCAibG4iLCAibG9hZF9maWxlIiwgImxvY2F0ZSIsICJsb2ciLCAibG9nMiIsICJsb2cxMCIsCiAgICAibG93ZXIiLCAibHBhZCIsICJsdHJpbSIsICJtYWtlX3NldCIsICJtYXN0ZXJfcG9zX3dhaXQiLCAibWF4IiwgIm1kNSIsCiAgICAibWlkIiwgIm1pbiIsICJtb2QiLCAibW9udGhuYW1lIiwgIm5vdyIsICJudWxsaWYiLCAib2N0IiwgIm9jdGV0X2xlbmd0aCIsCiAgICAib3JkIiwgInBhc3N3b3JkIiwgInBlcmlvZF9hZGQiLCAicGVyaW9kX2RpZmYiLCAicGkiLCAicG9zaXRpb24iLAogICAgInBvdyIsICJwb3dlciIsICJxdWFydGVyIiwgInF1b3RlIiwgInJhZGlhbnMiLCAicmFuZCIsICJyZWxlYXNlX2xvY2siLAogICAgInJlcGVhdCIsICJyZXZlcnNlIiwgInJpZ2h0IiwgInJvdW5kIiwgInJwYWQiLCAicnRyaW0iLCAic2VjX3RvX3RpbWUiLAogICAgInNlc3Npb25fdXNlciIsICJzaGEiLCAic2hhMSIsICJzaWduIiwgInNpbiIsICJzb3VuZGV4IiwgInNwYWNlIiwgInNxcnQiLAogICAgInN0ZCIsICJzdGRkZXYiLCAic3RyY21wIiwgInN1YmRhdGUiLCAic3Vic3RyaW5nIiwgInN1YnN0cmluZ19pbmRleCIsCiAgICAic3VtIiwgInN5c2RhdGUiLCAic3lzdGVtX3VzZXIiLCAidGFuIiwgInRpbWVfZm9ybWF0IiwgInRpbWVfdG9fc2VjIiwKICAgICJ0b19kYXlzIiwgInRyaW0iLCAidWNhc2UiLCAidW5pcXVlX3VzZXJzIiwgInVuaXhfdGltZXN0YW1wIiwgInVwcGVyIiwKICAgICJ1c2VyIiwgInZlcnNpb24iLCAid2VlayIsICJ3ZWVrZGF5IiwgInllYXJ3ZWVrIgogIF0pOwoKICB2YXIga2V5d29yZHMgPSB3b3JkUmVnZXhwKFsKICAgICJhbHRlciIsICJncmFudCIsICJyZXZva2UiLCAicHJpbWFyeSIsICJrZXkiLCAidGFibGUiLCAic3RhcnQiLCAidG9wIiwKICAgICJ0cmFuc2FjdGlvbiIsICJzZWxlY3QiLCAidXBkYXRlIiwgImluc2VydCIsICJkZWxldGUiLCAiY3JlYXRlIiwgImRlc2NyaWJlIiwKICAgICJmcm9tIiwgImludG8iLCAidmFsdWVzIiwgIndoZXJlIiwgImpvaW4iLCAiaW5uZXIiLCAibGVmdCIsICJuYXR1cmFsIiwgImFuZCIsCiAgICAib3IiLCAiaW4iLCAibm90IiwgInhvciIsICJsaWtlIiwgInVzaW5nIiwgIm9uIiwgIm9yZGVyIiwgImdyb3VwIiwgImJ5IiwKICAgICJhc2MiLCAiZGVzYyIsICJsaW1pdCIsICJvZmZzZXQiLCAidW5pb24iLCAiYWxsIiwgImFzIiwgImRpc3RpbmN0IiwgInNldCIsCiAgICAiY29tbWl0IiwgInJvbGxiYWNrIiwgInJlcGxhY2UiLCAidmlldyIsICJkYXRhYmFzZSIsICJzZXBhcmF0b3IiLCAiaWYiLAogICAgImV4aXN0cyIsICJudWxsIiwgInRydW5jYXRlIiwgInN0YXR1cyIsICJzaG93IiwgImxvY2siLCAidW5pcXVlIiwgImhhdmluZyIKICBdKTsKCiAgdmFyIHR5cGVzID0gd29yZFJlZ2V4cChbCiAgICAiYmlnaW50IiwgImJpbmFyeSIsICJiaXQiLCAiYmxvYiIsICJib29sIiwgImNoYXIiLCAiY2hhcmFjdGVyIiwgImRhdGUiLAogICAgImRhdGV0aW1lIiwgImRlYyIsICJkZWNpbWFsIiwgImRvdWJsZSIsICJlbnVtIiwgImZsb2F0IiwgImZsb2F0NCIsICJmbG9hdDgiLAogICAgImludCIsICJpbnQxIiwgImludDIiLCAiaW50MyIsICJpbnQ0IiwgImludDgiLCAiaW50ZWdlciIsICJsb25nIiwgImxvbmdibG9iIiwKICAgICJsb25ndGV4dCIsICJtZWRpdW1ibG9iIiwgIm1lZGl1bWludCIsICJtZWRpdW10ZXh0IiwgIm1pZGRsZWludCIsICJuY2hhciIsCiAgICAibnVtZXJpYyIsICJyZWFsIiwgInNldCIsICJzbWFsbGludCIsICJ0ZXh0IiwgInRpbWUiLCAidGltZXN0YW1wIiwgInRpbnlibG9iIiwKICAgICJ0aW55aW50IiwgInRpbnl0ZXh0IiwgInZhcmJpbmFyeSIsICJ2YXJjaGFyIiwgInllYXIiCiAgXSk7CgogIHZhciBvcGVyYXRvcnMgPSB3b3JkUmVnZXhwKFsKICAgICI6PSIsICI8IiwgIjw9IiwgIj09IiwgIjw+IiwgIj4iLCAiPj0iLCAibGlrZSIsICJybGlrZSIsICJpbiIsICJ4b3IiLCAiYmV0d2VlbiIKICBdKTsKCiAgdmFyIG9wZXJhdG9yQ2hhcnMgPSAvWyorXC08Pj0mfDpcL10vOwoKICB2YXIgdG9rZW5pemVTcWwgPSAoZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiBub3JtYWwoc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICBpZiAoY2ggPT0gIkAiIHx8IGNoID09ICIkIikgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHdcZF0vKTsKICAgICAgICByZXR1cm4gInNxbC12YXIiOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICJbIil7CgkgICAgc2V0U3RhdGUoaW5BbGlhcyhjaCkpCgkgIAlyZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiXCIiIHx8IGNoID09ICInIiB8fCBjaCA9PSAiYCIpIHsKICAgICAgICBzZXRTdGF0ZShpbkxpdGVyYWwoY2gpKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiLCIgfHwgY2ggPT0gIjsiKSB7CiAgICAgICAgcmV0dXJuICJzcWwtc2VwYXJhdG9yIgogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICctJykgewogICAgICAgIGlmIChzb3VyY2UucGVlaygpID09ICItIikgewogICAgICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICByZXR1cm4gInNxbC1jb21tZW50IjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoL1xkLy50ZXN0KHNvdXJjZS5wZWVrKCkpKSB7CiAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvXGQvKTsKICAgICAgICAgIGlmIChzb3VyY2UucGVlaygpID09ICcuJykgewogICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvXGQvKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAic3FsLW51bWJlciI7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiAic3FsLW9wZXJhdG9yIjsKICAgICAgfQogICAgICBlbHNlIGlmIChvcGVyYXRvckNoYXJzLnRlc3QoY2gpKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMob3BlcmF0b3JDaGFycyk7CiAgICAgICAgcmV0dXJuICJzcWwtb3BlcmF0b3IiOwogICAgICB9CiAgICAgIGVsc2UgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvXGQvKTsKICAgICAgICBpZiAoc291cmNlLnBlZWsoKSA9PSAnLicpIHsKICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvXGQvKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJzcWwtbnVtYmVyIjsKICAgICAgfQogICAgICBlbHNlIGlmICgvWygpXS8udGVzdChjaCkpIHsKICAgICAgICByZXR1cm4gInNxbC1wdW5jdHVhdGlvbiI7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1tfXHdcZF0vKTsKICAgICAgICB2YXIgd29yZCA9IHNvdXJjZS5nZXQoKSwgdHlwZTsKICAgICAgICBpZiAob3BlcmF0b3JzLnRlc3Qod29yZCkpCiAgICAgICAgICB0eXBlID0gInNxbC1vcGVyYXRvciI7CiAgICAgICAgZWxzZSBpZiAoa2V5d29yZHMudGVzdCh3b3JkKSkKICAgICAgICAgIHR5cGUgPSAic3FsLWtleXdvcmQiOwogICAgICAgIGVsc2UgaWYgKGZ1bmN0aW9ucy50ZXN0KHdvcmQpKQogICAgICAgICAgdHlwZSA9ICJzcWwtZnVuY3Rpb24iOwogICAgICAgIGVsc2UgaWYgKHR5cGVzLnRlc3Qod29yZCkpCiAgICAgICAgICB0eXBlID0gInNxbC10eXBlIjsKICAgICAgICBlbHNlCiAgICAgICAgICB0eXBlID0gInNxbC13b3JkIjsKICAgICAgICByZXR1cm4ge3N0eWxlOiB0eXBlLCBjb250ZW50OiB3b3JkfTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGluQWxpYXMocXVvdGUpIHsKCSAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc2V0U3RhdGUpIHsKCSAgICB3aGlsZSAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgewoJCSAgdmFyIGNoID0gc291cmNlLm5leHQoKTsKCQkgIGlmIChjaCA9PSAnXScpIHsKCQkgICAgc2V0U3RhdGUobm9ybWFsKTsKCQkgICAgYnJlYWs7CgkJICB9CgkgICAgfQoJICAgIHJldHVybiAic3FsLXdvcmQiOwoJICB9CiAgICB9CgogICAgZnVuY3Rpb24gaW5MaXRlcmFsKHF1b3RlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZTsKICAgICAgICB3aGlsZSAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgewogICAgICAgICAgdmFyIGNoID0gc291cmNlLm5leHQoKTsKICAgICAgICAgIGlmIChjaCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkgewogICAgICAgICAgICBzZXRTdGF0ZShub3JtYWwpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBjaCA9PSAiXFwiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcXVvdGUgPT0gImAiID8gInNxbC13b3JkIiA6ICJzcWwtbGl0ZXJhbCI7CiAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc3RhcnRTdGF0ZSkgewogICAgICByZXR1cm4gdG9rZW5pemVyKHNvdXJjZSwgc3RhcnRTdGF0ZSB8fCBub3JtYWwpOwogICAgfTsKICB9KSgpOwoKICBmdW5jdGlvbiBpbmRlbnRTcWwoY29udGV4dCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKG5leHRDaGFycykgewogICAgICB2YXIgZmlyc3RDaGFyID0gbmV4dENoYXJzICYmIG5leHRDaGFycy5jaGFyQXQoMCk7CiAgICAgIHZhciBjbG9zaW5nID0gY29udGV4dCAmJiBmaXJzdENoYXIgPT0gY29udGV4dC50eXBlOwogICAgICBpZiAoIWNvbnRleHQpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGVsc2UgaWYgKGNvbnRleHQuYWxpZ24pCiAgICAgICAgcmV0dXJuIGNvbnRleHQuY29sIC0gKGNsb3NpbmcgPyBjb250ZXh0LndpZHRoIDogMCk7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gY29udGV4dC5pbmRlbnQgKyAoY2xvc2luZyA/IDAgOiBpbmRlbnRVbml0KTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHBhcnNlU3FsKHNvdXJjZSkgewogICAgdmFyIHRva2VucyA9IHRva2VuaXplU3FsKHNvdXJjZSk7CiAgICB2YXIgY29udGV4dCA9IG51bGwsIGluZGVudCA9IDAsIGNvbCA9IDA7CiAgICBmdW5jdGlvbiBwdXNoQ29udGV4dCh0eXBlLCB3aWR0aCwgYWxpZ24pIHsKICAgICAgY29udGV4dCA9IHtwcmV2OiBjb250ZXh0LCBpbmRlbnQ6IGluZGVudCwgY29sOiBjb2wsIHR5cGU6IHR5cGUsIHdpZHRoOiB3aWR0aCwgYWxpZ246IGFsaWdufTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvcENvbnRleHQoKSB7CiAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICB9CgogICAgdmFyIGl0ZXIgPSB7CiAgICAgIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB0b2tlbiA9IHRva2Vucy5uZXh0KCk7CiAgICAgICAgdmFyIHR5cGUgPSB0b2tlbi5zdHlsZSwgY29udGVudCA9IHRva2VuLmNvbnRlbnQsIHdpZHRoID0gdG9rZW4udmFsdWUubGVuZ3RoOwoKICAgICAgICBpZiAoY29udGVudCA9PSAiXG4iKSB7CiAgICAgICAgICB0b2tlbi5pbmRlbnRhdGlvbiA9IGluZGVudFNxbChjb250ZXh0KTsKICAgICAgICAgIGluZGVudCA9IGNvbCA9IDA7CiAgICAgICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0LmFsaWduID09IG51bGwpIGNvbnRleHQuYWxpZ24gPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAid2hpdGVzcGFjZSIgJiYgY29sID09IDApIHsKICAgICAgICAgIGluZGVudCA9IHdpZHRoOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICghY29udGV4dCAmJiB0eXBlICE9ICJzcWwtY29tbWVudCIpIHsKICAgICAgICAgIHB1c2hDb250ZXh0KCI7IiwgMCwgZmFsc2UpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbnRlbnQgIT0gIlxuIikgY29sICs9IHdpZHRoOwoKICAgICAgICBpZiAodHlwZSA9PSAic3FsLXB1bmN0dWF0aW9uIikgewogICAgICAgICAgaWYgKGNvbnRlbnQgPT0gIigiKQogICAgICAgICAgICBwdXNoQ29udGV4dCgiKSIsIHdpZHRoKTsKICAgICAgICAgIGVsc2UgaWYgKGNvbnRlbnQgPT0gIikiKQogICAgICAgICAgICBwb3BDb250ZXh0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInNxbC1zZXBhcmF0b3IiICYmIGNvbnRlbnQgPT0gIjsiICYmIGNvbnRleHQgJiYgIWNvbnRleHQucHJldikgewogICAgICAgICAgcG9wQ29udGV4dCgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICB9LAoKICAgICAgY29weTogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIF9jb250ZXh0ID0gY29udGV4dCwgX2luZGVudCA9IGluZGVudCwgX2NvbCA9IGNvbCwgX3Rva2VuU3RhdGUgPSB0b2tlbnMuc3RhdGU7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgICAgdG9rZW5zID0gdG9rZW5pemVTcWwoc291cmNlLCBfdG9rZW5TdGF0ZSk7CiAgICAgICAgICBjb250ZXh0ID0gX2NvbnRleHQ7CiAgICAgICAgICBpbmRlbnQgPSBfaW5kZW50OwogICAgICAgICAgY29sID0gX2NvbDsKICAgICAgICAgIHJldHVybiBpdGVyOwogICAgICAgIH07CiAgICAgIH0KICAgIH07CiAgICByZXR1cm4gaXRlcjsKICB9CgogIHJldHVybiB7bWFrZTogcGFyc2VTcWwsIGVsZWN0cmljQ2hhcnM6ICIpIn07Cn0pKCk7Cg==]]></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[aHRtbCB7CiAgY3Vyc29yOiB0ZXh0Owp9CgouZWRpdGJveCB7CiAgbWFyZ2luOiAuNGVtOwogIHBhZGRpbmc6IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgY29sb3I6IGJsYWNrOwp9CgpwcmUuY29kZSwgLmVkaXRib3ggewogIGNvbG9yOiAjNjY2Owp9CgouZWRpdGJveCBwIHsKICBtYXJnaW46IDA7Cn0KCnNwYW4uY3NzLWF0IHsKICBjb2xvcjogIzcwODsKfQoKc3Bhbi5jc3MtdW5pdCB7CiAgY29sb3I6ICMyODE7Cn0KCnNwYW4uY3NzLXZhbHVlIHsKICBjb2xvcjogIzcwODsKfQoKc3Bhbi5jc3MtaWRlbnRpZmllciB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLmNzcy1zZWxlY3RvciB7CiAgY29sb3I6ICMxMUI7Cn0KCnNwYW4uY3NzLWltcG9ydGFudCB7CiAgY29sb3I6ICMwMEY7Cn0KCnNwYW4uY3NzLWNvbG9yY29kZSB7CiAgY29sb3I6ICMyOTk7Cn0KCnNwYW4uY3NzLWNvbW1lbnQgewogIGNvbG9yOiAjQTcwOwp9CgpzcGFuLmNzcy1zdHJpbmcgewogIGNvbG9yOiAjQTIyOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/docs.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ym9keSB7CiAgbWFyZ2luOiAwOwogIHBhZGRpbmc6IDNlbSA2ZW07CiAgY29sb3I6IGJsYWNrOwogIG1heC13aWR0aDogNTBlbTsKfQoKaDEgewogIGZvbnQtc2l6ZTogMjJwdDsKfQoKLnVuZGVybGluZSB7CiAgYm9yZGVyLWJvdHRvbTogM3B4IHNvbGlkICNDNDQ7Cn0KCmgyIHsKICBmb250LXNpemU6IDE0cHQ7Cn0KCmgzIHsKICBmb250LXNpemU6IDEycHQ7Cn0KCnAucmVsIHsKICBwYWRkaW5nLWxlZnQ6IDJlbTsKICB0ZXh0LWluZGVudDogLTJlbTsKfQoKZGl2LmJvcmRlciB7CiAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Cn0KCmNvZGUgewogIGZvbnQtZmFtaWx5OiBjb3VyaWVyLCBtb25vc3BhY2U7CiAgZm9udC1zaXplOiA5MCU7CiAgY29sb3I6ICMxNDQ7Cn0KCnByZS5jb2RlIHsKICBtYXJnaW46IDEuMWVtIDEycHg7CiAgYm9yZGVyOiAxcHggc29saWQgI0NDQ0NDQzsKICBjb2xvcjogYmxhY2s7CiAgcGFkZGluZzogLjRlbTsKICBmb250LWZhbWlseTogY291cmllciwgbW9ub3NwYWNlOwp9Cgoud2FybiB7CiAgY29sb3I6ICNDMDA7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/jscolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aHRtbCB7CiAgY3Vyc29yOiB0ZXh0Owp9CgouZWRpdGJveCB7CiAgbWFyZ2luOiAuNGVtOwogIHBhZGRpbmc6IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgY29sb3I6IGJsYWNrOwp9CgpwcmUuY29kZSwgLmVkaXRib3ggewogIGNvbG9yOiAjNjY2NjY2Owp9CgouZWRpdGJveCBwIHsKICBtYXJnaW46IDA7Cn0KCnNwYW4uanMtcHVuY3R1YXRpb24gewogIGNvbG9yOiAjNjY2NjY2Owp9CgpzcGFuLmpzLW9wZXJhdG9yIHsKICBjb2xvcjogIzY2NjY2NjsKfQoKc3Bhbi5qcy1rZXl3b3JkIHsKICBjb2xvcjogIzc3MDA4ODsKfQoKc3Bhbi5qcy1hdG9tIHsKICBjb2xvcjogIzIyODgxMTsKfQoKc3Bhbi5qcy12YXJpYWJsZSB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLmpzLXZhcmlhYmxlZGVmIHsKICBjb2xvcjogIzAwMDBGRjsKfQoKc3Bhbi5qcy1sb2NhbHZhcmlhYmxlIHsKICBjb2xvcjogIzAwNDQ5OTsKfQoKc3Bhbi5qcy1wcm9wZXJ0eSB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLmpzLWNvbW1lbnQgewogIGNvbG9yOiAjQUE3NzAwOwp9CgpzcGFuLmpzLXN0cmluZyB7CiAgY29sb3I6ICNBQTIyMjI7Cn0K]]></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[aHRtbCB7CiAgY3Vyc29yOiB0ZXh0Owp9CgouZWRpdGJveCB7CiAgbWFyZ2luOiAuNGVtOwogIHBhZGRpbmc6IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgY29sb3I6IGJsYWNrOwp9CgouZWRpdGJveCBwIHsKICBtYXJnaW46IDA7Cn0KCnNwYW4uc3Ata2V5d29yZCB7CiAgY29sb3I6ICM3MDg7Cn0KCnNwYW4uc3AtcHJlZml4ZWQgewogIGNvbG9yOiAjNWQxOwp9CgpzcGFuLnNwLXZhciB7CiAgY29sb3I6ICMwMGM7Cn0KCnNwYW4uc3AtY29tbWVudCB7CiAgY29sb3I6ICNhNzA7Cn0KCnNwYW4uc3AtbGl0ZXJhbCB7CiAgY29sb3I6ICNhMjI7Cn0KCnNwYW4uc3AtdXJpIHsKICBjb2xvcjogIzI5MjsKfQoKc3Bhbi5zcC1vcGVyYXRvciB7CiAgY29sb3I6ICMwODg7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/xmlcolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aHRtbCB7CiAgY3Vyc29yOiB0ZXh0Owp9CgouZWRpdGJveCB7CiAgbWFyZ2luOiAuNGVtOwogIHBhZGRpbmc6IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgY29sb3I6IGJsYWNrOwp9CgouZWRpdGJveCBwIHsKICBtYXJnaW46IDA7Cn0KCnNwYW4ueG1sLXRhZ25hbWUgewogIGNvbG9yOiAjQTBCOwp9CgpzcGFuLnhtbC1hdHRyaWJ1dGUgewogIGNvbG9yOiAjMjgxOwp9CgpzcGFuLnhtbC1wdW5jdHVhdGlvbiB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLnhtbC1hdHRuYW1lIHsKICBjb2xvcjogIzAwRjsKfQoKc3Bhbi54bWwtY29tbWVudCB7CiAgY29sb3I6ICNBNzA7Cn0KCnNwYW4ueG1sLWNkYXRhIHsKICBjb2xvcjogIzQ4QTsKfQoKc3Bhbi54bWwtcHJvY2Vzc2luZyB7CiAgY29sb3I6ICM5OTk7Cn0KCnNwYW4ueG1sLWVudGl0eSB7CiAgY29sb3I6ICNBMjI7Cn0KCnNwYW4ueG1sLWVycm9yIHsKIGNvbG9yOiAjRjAwICFpbXBvcnRhbnQ7Cn0KCnNwYW4ueG1sLXRleHQgewogIGNvbG9yOiBibGFjazsKfQo=]]></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/faq.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNzcy9kb2NzLmNzcyIvPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIGgzIHtmb250LXNpemU6IDEwMCU7fQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGNsYXNzPSJ0b3AgdW5kZXJsaW5lIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4KICAgICAgPGgxIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwOyI+PGEgaHJlZj0iaW5kZXguaHRtbCIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZTsgY29sb3I6IGJsYWNrOyI+Q29kZU1pcnJvcjwvYT48L2gxPgogICAgICA8aDIgc3R5bGU9Im1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IC4zZW07Ij5GcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvaDI+CiAgICA8L2Rpdj4KCiAgICA8aDMgaWQ9ImxpY2Vuc2UiPlE6IENhbiBJIHVzZSBDb2RlTWlycm9yIGluIG15IHN1Y2gtYW5kLXN1Y2ggcHJvamVjdD88L2gzPgoKICAgIDxwPkE6IFllcy4gVGhlIDxhIGhyZWY9IkxJQ0VOU0UiPmxpY2Vuc2U8L2E+IGlzIHNob3J0LCBzaW1wbGUsIGFuZAogICAgcGVybWlzc2l2ZS48L3A+CgogICAgPGgzIGlkPSJjYWNoZSI+UTogWW91IHNhaWQgeW91IGZpeGVkIHRoaXMtYW5kLXRoaXMgaXNzdWUsIGJ1dCBJJ20KICAgIHN0aWxsIHNlZWluZyBpdC48L2gzPgoKICAgIDxwPkE6IE9uZSBwb3NzaWJpbGl0eSBpcyB0aGF0IEkgc2NyZXdlZCB1cCwgYnV0IGEgdmVyeSByZWFsCiAgICBhbHRlcm5hdGl2ZSBpcyB0aGF0IHlvdSdyZSBsb29raW5nIGF0IGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlCiAgICBDb2RlTWlycm9yIHNjcmlwdHMuIEJlY2F1c2UgdGhlIHNjcmlwdHMgYXJlIGxvYWRlZCBpbnRvIGFuIGlmcmFtZSwKICAgIHRoZSBjdHJsLWY1IHlvdSBpc3N1ZWQgb24gdGhlIG91dGVyIHBhZ2UgZG9lc24ndCBhbHdheXMgY2F1c2UgdGhlbQogICAgdG8gYmUgcmVsb2FkZWQgKElFLCBPcGVyYSwgYW5kIEZpcmVmb3ggYXJlIHRoZSB3b3JzdCBvZmZlbmRlcnMKICAgIGhlcmUpLiBDbGVhciB5b3VyIGNhY2hlIGFuZCByZS10cnkuPC9wPgoKICAgIDxoMyBpZD0idGV4dGFyZWEiPlE6IEkgY2FuJ3QgcHV0IGNvbnRlbnQgY29udGFpbmluZwogICAgPGNvZGU+Jmx0Oy90ZXh0YXJlYT48L2NvZGU+IGludG8gQ29kZU1pcnJvciE8L2gzPgoKICAgIDxwPkE6IFtXZWItcHJvZ3JhbW1pbmcgMTAxXSBUaGUgZmlyc3QgPGNvZGU+Jmx0Oy90ZXh0YXJlYT48L2NvZGU+CiAgICBmb2xsb3dpbmcgYSA8Y29kZT4mbHQ7dGV4dGFyZWE+PC9jb2RlPiB0YWcgd2lsbCBjbG9zZSB0aGUKICAgIHRleHRhcmVhLiBUaGlzIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggQ29kZU1pcnJvci4gU2l0IGRvd24sIGFuZAogICAgc3BlbmQgdGVuIG1pbnV0ZXMgdGhpbmtpbmcgYWJvdXQgd2h5IEhUTUwtZXNjYXBpbmcgd2FzCiAgICBpbnZlbnRlZC48L3A+CgogICAgPGgzIGlkPSJkZWJ1ZyI+UTogSSBoYXZlIHRoaXMgaHVnZSBjaHVuayBvZiBjb2RlIHRoYXQgZG9lcyBub3QKICAgIHdvcmssIGNhbiB5b3UgZGVidWcgaXQgZm9yIG1lPzwvaDM+CgogICAgPHA+QTogTm9wZS4gSWYgeW91IGNhbid0IGJlIGJvdGhlcmVkIGlzb2xhdGUgeW91ciBwcm9ibGVtIGluIDIwCiAgICBsaW5lcyBvZiBjb2RlIG9yIGxlc3MsIEkgY2FuJ3QgYmUgYm90aGVyZWQgdG8gdGhpbmsgYWJvdXQgaXQuPC9wPgoKICAgIDxoMyBpZD0icGF0Y2giPlE6IEhvdyBkbyBJIHN1Ym1pdCBwYXRjaGVzIGZvciBDb2RlTWlycm9yPzwvaDM+CgogICAgPHA+QTogUHJlZmVycmVkIHdheSBpcyB0byBjcmVhdGUgYSBmb3JrIG9uIDxhCiAgICBocmVmPSJodHRwOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IiPmdpdGh1YjwvYT4sIGFkZCB5b3VyCiAgICBwYXRjaCwgYW5kIHNlbmQgbWUgYSBwdWxsIHJlcXVlc3QuIERpZmZzIChhZ2FpbnN0IHRoZSBsYXRlc3QKICAgIHZlcnNpb24hKSBieSBtYWlsIGFyZSBhbHNvIGNvb2wuPC9wPgoKICA8L2JvZHk+CjwvaHRtbD4K]]></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+CiAgPGJvZHkgc3R5bGU9InBhZGRpbmc6IDIwcHg7Ij4KCjxwPlRoaXMgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiB0aGUgWE1ML0hUTUwgaW5kZW50YXRpb24gbW9kdWxlCmZvciA8YSBocmVmPSJpbmRleC5odG1sIj5Db2RlTWlycm9yPC9hPi4gVGhlIDxhCmhyZWY9ImpzL3BhcnNleG1sLmpzIj5qYXZhc2NyaXB0PC9hPiBmaWxlIGNvbnRhaW5zIHNvbWUgY29tbWVudHMgd2l0aAptb3JlIGluZm9ybWF0aW9uLjwvcD4KCjxkaXYgY2xhc3M9ImJvcmRlciI+Cjx0ZXh0YXJlYSBpZD0iY29kZSIgY29scz0iMTIwIiByb3dzPSIzMCI+CiZsdDtodG1sIHN0eWxlPSJjb2xvcjogZ3JlZW4iJmd0OwogICZsdDshLS0gdGhpcyBpcyBhIGNvbW1lbnQgLS0mZ3Q7CiAgJmx0O2hlYWQmZ3Q7CiAgICAmbHQ7dGl0bGUmZ3Q7SFRNTCBFeGFtcGxlJmx0Oy90aXRsZSZndDsKICAmbHQ7L2hlYWQmZ3Q7CiAgJmx0O2JvZHkmZ3Q7CiAgICBUaGUgaW5kZW50YXRpb24gdHJpZXMgdG8gYmUgJmx0O2VtJmd0O3NvbWV3aGF0ICZhbXA7cXVvdDtkbyB3aGF0CiAgICBJIG1lYW4mYW1wO3F1b3Q7Jmx0Oy9lbSZndDsuLi4gYnV0IG1pZ2h0IG5vdCBtYXRjaCB5b3VyIHN0eWxlLgogICZsdDsvYm9keSZndDsKJmx0Oy9odG1sJmd0Owo8L3RleHRhcmVhPgo8L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoJ2NvZGUnLCB7CiAgICBoZWlnaHQ6ICIzNTBweCIsCiAgICBwYXJzZXJmaWxlOiAicGFyc2V4bWwuanMiLAogICAgc3R5bGVzaGVldDogImNzcy94bWxjb2xvcnMuY3NzIiwKICAgIHBhdGg6ICJqcy8iLAogICAgY29udGludW91c1NjYW5uaW5nOiA1MDAsCiAgICBsaW5lTnVtYmVyczogdHJ1ZQogIH0pOwo8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEluLWJyb3dzZXIgY29kZSBlZGl0aW5nPC90aXRsZT4KCiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjc3MvZG9jcy5jc3MiLz4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIGRpdi50b3Age3RleHQtYWxpZ246IGNlbnRlcjt9CiAgICAgIGRpdi50b3AgaDEge21hcmdpbi1ib3R0b206IDA7fQogICAgICBkaXYudG9wIGgyIHttYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAxLjVlbTt9CiAgICAgIGRpdi5kb25hdGUgc3BhbiB7Y3Vyc29yOiBwb2ludGVyOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTt9CiAgICAgIGRpdi5kb25hdGUge2ZvbnQtc2l6ZTogNzAlOyBtYXJnaW4tdG9wOiAxZW07IHdpZHRoOiAxNTVweDsgcGFkZGluZzogMTBweDsgYm9yZGVyOiAxcHggc29saWQgI2M0NDt9CiAgICA8L3N0eWxlPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz4KICA8L2hlYWQ+CiAgPGJvZHk+Cgo8ZGl2IGNsYXNzPSJ0b3AiPgogIDxoMT5Db2RlTWlycm9yPC9oMT4KICA8aDIgY2xhc3M9InVuZGVybGluZSI+SW4tYnJvd3NlciBjb2RlIGVkaXRpbmcgbWFkZSBhbG1vc3QgYmVhcmFibGU8L2gyPgo8L2Rpdj4KPGRpdiBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyBwYWRkaW5nLWxlZnQ6IDEwcHg7Ij4KICA8Zm9ybSBhY3Rpb249Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vY2dpLWJpbi93ZWJzY3IiIG1ldGhvZD0icG9zdCIgaWQ9InBheXBhbCI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjbWQiIHZhbHVlPSJfcy14Y2xpY2siLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Imhvc3RlZF9idXR0b25faWQiIHZhbHVlPSIzRlZIUzVGR1VZN0NDIi8+CiAgPC9mb3JtPgogIDxpbWcgc3JjPSJjc3MvcGVvcGxlLmpwZyIgYWx0PSIiLz48YnIvPgogIDxkaXYgY2xhc3M9ImRvbmF0ZSI+CiAgICBNYWtlIGEgZG9uYXRpb246CiAgICA8dWwgc3R5bGU9Im1hcmdpbjogMCAyZW07IHBhZGRpbmc6IDAiPgogICAgICA8bGk+PHNwYW4gb25jbGljaz0iZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BheXBhbCcpLnN1Ym1pdCgpOyI+UGF5cGFsPC9zcGFuPjwvbGk+CiAgICAgIDxsaT48c3BhbiBvbmNsaWNrPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFua2luZm8nKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsiPkJhbms8L3NwYW4+PC9saT4KICAgIDwvdWw+CiAgICA8ZGl2IGlkPSJiYW5raW5mbyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IGZvbnQtc2l6ZTogODAlOyI+CiAgICAgIEJhbms6IDxpPlJhYm9iYW5rPC9pPjxici8+CiAgICAgIENvdW50cnk6IDxpPk5ldGhlcmxhbmRzPC9pPjxici8+CiAgICAgIFNXSUZUOiA8aT5SQUJPTkwyVTwvaT48YnIvPgogICAgICBBY2NvdW50OiA8aT4xNDc4NTA3NzA8L2k+PGJyLz4KICAgICAgTmFtZTogPGk+TWFyaWpuIEhhdmVyYmVrZTwvaT48YnIvPgogICAgICBJQkFOOiA8aT5OTDI2IFJBQk8gMDE0NyA4NTA3IDcwPC9pPgogICAgPC9kaXY+CiAgPC9kaXY+CjwvZGl2PgoKPHA+Q29kZU1pcnJvciBpcyBhIEphdmFTY3JpcHQgbGlicmFyeSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhCnJlbGF0aXZlbHkgcGxlYXNhbnQgZWRpdG9yIGludGVyZmFjZSBmb3IgY29kZS1saWtlIGNvbnRlbnQgJiN4MjAxNTsKY29tcHV0ZXIgcHJvZ3JhbXMsIEhUTUwgbWFya3VwLCBhbmQgc2ltaWxhci4gSWYgYSBwYXJzZXIgaGFzIGJlZW4Kd3JpdHRlbiBmb3IgdGhlIGxhbmd1YWdlIHlvdSBhcmUgZWRpdGluZyAoc2VlIGJlbG93IGZvciBhIGxpc3Qgb2YKc3VwcG9ydGVkIGxhbmd1YWdlcyksIHRoZSBjb2RlIHdpbGwgYmUgY29sb3VyZWQsIGFuZCB0aGUgZWRpdG9yIHdpbGwKaGVscCB5b3Ugd2l0aCBpbmRlbnRhdGlvbi48L3A+Cgo8cD5UbyBnZXQgYSBsb29rIGF0IENvZGVNaXJyb3IsIHNlZSB0aGUgdGVzdCBwYWdlcyBmb3IgdGhlIHZhcmlvdXMKcGFyc2Vycy4uLjwvcD4KCjx1bD4KICA8bGk+PGEgaHJlZj0ianN0ZXN0Lmh0bWwiPkphdmFTY3JpcHQ8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iaHRtbHRlc3QuaHRtbCI+WE1ML0hUTUw8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iY3NzdGVzdC5odG1sIj5DU1M8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0ic3BhcnFsdGVzdC5odG1sIj5TUEFSUUw8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0ibWl4ZWR0ZXN0Lmh0bWwiPkhUTUwgbWl4ZWQtbW9kZTwvYT48L2xpPgogIDxsaT48YSBocmVmPSJjb250cmliL3BocC9pbmRleC5odG1sIj5IVE1MK1BIUCBtaXhlZC1tb2RlPC9hPiAoY291cnRlc3kgb2YgPGEgaHJlZj0iY29udHJpYi9waHAvTElDRU5TRSI+WWFob28hPC9hPik8L2xpPgogIDxsaT48YSBocmVmPSJjb250cmliL3B5dGhvbi9pbmRleC5odG1sIj5QeXRob248L2E+IChjb3VydGVzeSBvZiA8YSBocmVmPSJjb250cmliL3B5dGhvbi9MSUNFTlNFIj5UaW1vdGh5IEZhcnJlbGw8L2E+KTwvbGk+CiAgPGxpPjxhIGhyZWY9ImNvbnRyaWIvbHVhL2luZGV4Lmh0bWwiPkx1YTwvYT4gKGNvdXJ0ZXN5IG9mIDxhIGhyZWY9Imh0dHA6Ly9mcmFuY2lvLnBsLyI+RnJhbmNpc3playBXYXdyemFrPC9hPik8L2xpPgogIDxsaT48YSBocmVmPSJodHRwOi8vZ2l0aHViLmNvbS9oYWt1bmluL3J1YnktaW4tY29kZW1pcnJvci90cmVlL21hc3RlciI+UnVieTwvYT4gKGJ5IE1pY2hhbCBIYW50bCwgdW5maW5pc2hlZCk8L2xpPgogIDxsaT48YSBocmVmPSJjb250cmliL3NxbC9pbmRleC5odG1sIj5TUUw8L2E+IChjb3VydGVzeSBvZiBKb2huIEJlbmVkaWt0c3Nvbik8L2xpPgogIDxsaT48YSBocmVmPSJjb250cmliL3Bsc3FsL2luZGV4Lmh0bWwiPlBMU1FMPC9hPiAoY291cnRlc3kgb2YgPGEgaHJlZj0iaHR0cDovL3d3dy5vcmFjbGUtYW5kLWFwZXguY29tLyI+UGV0ZXIgUmFnYW5pdHNjaDwvYT4pPC9saT4KICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5saXJhbnVuYS5jb20vZGlmZi1wYXJzZXItZm9yLWNvZGVtaXJyb3IvIj5kaWZmPC9hPiAoY291cnRlc3kgb2YgPGEgaHJlZj0iaHR0cDovL3d3dy5saXJhbnVuYS5jb20iPkxpcmFuIE51bmE8L2E+KTwvbGk+CiAgPGxpPjxhIGhyZWY9ImNvbnRyaWIvZ3Jvb3Z5L2luZGV4Lmh0bWwiPkdyb292eTwvYT4gKGJ5IDxhIGhyZWY9Imh0dHA6Ly9leG9wbGF0Zm9ybS5vcmcvIj5lWG8gUGxhdGZvcm08L2E+KTwvbGk+CiAgPGxpPjxhIGhyZWY9ImNvbnRyaWIvY3NoYXJwL2luZGV4Lmh0bWwiPkMjPC9hPiAoYnkgPGEgaHJlZj0iaHR0cDovL3NraWxsdGVzdGluZy5jb20vIj5Cb3JpcyBHYWJlciBhbmQgQ2hyaXN0b3BoZXIgQnVjaGlubzwvYT4pPC9saT4KPC91bD4KCjxwPk9yIHRha2UgYSBsb29rIGF0IHNvbWUgcmVhbC13b3JsZCB1c2VzIG9mIHRoZSBzeXN0ZW0uLi48L3A+Cgo8dWw+CiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9rbWwtc2FtcGxlcy5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvaW50ZXJhY3RpdmUvaW5kZXguaHRtbCI+R29vZ2xlIEVhcnRoIEtNTCBzYW1wbGVyPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9lbG9xdWVudGphdmFzY3JpcHQubmV0L2NoYXB0ZXIxLmh0bWwiPkVsb3F1ZW50IEphdmFTY3JpcHQncyBjb25zb2xlPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9kZW1vLnFvb3hkb28ub3JnL2N1cnJlbnQvcGxheWdyb3VuZC8jSGVsbG9fV29ybGQiPlRoZSBxb294ZG9vIHBsYXlncm91bmQ8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iaHR0cDovL2JpbGxtaWxsLm9yZy9zdGF0aWMvY2FudmFzdHV0b3JpYWwvaW5kZXguaHRtbCI+QSBjb29sIHR1dG9yaWFsIGFib3V0IHRoZSAmbHQ7Y2FudmFzPiBlbGVtZW50PC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9vcmMuY3NyZXMudXRleGFzLmVkdS90cnlvcmMuc2h0bWwiPkFuIG9ubGluZSBJREUgZm9yIHRoZSBPcmMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2U8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hcGlzL2FqYXgvcGxheWdyb3VuZCI+R29vZ2xlJ3MgQVBJIHBsYXlncm91bmQ8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iaHR0cDovL2NyYWljLmNvbS90dXRvcmlhbHMvamF2YXNjcmlwdC9yYXBoYWVsX2xpdmUvcmFwaGFlbF9saXZlLmh0bWwiPlJhcGhhw6tsIExpdmU8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iaHR0cDovL2Rldi5mcmVlYmFzZWFwcHMuY29tLyI+RnJlZWJhc2UncyBBY3JlIElERTwvYT48L2xpPgogIDxsaT48YSBocmVmPSJodHRwOi8vanNiaW4uY29tLyI+SlMgQmluPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cucm9ja2V0dGhlbWUuY29tL2V4dGVuc2lvbnMtam9vbWxhL3Jva3BhZCI+VGhlIFJva1BhZCBwbHVnaW4gZm9yIEpvb21sYTwvYT48L2xpPgogIDxsaT48YSBocmVmPSJodHRwOi8vc2NyYXBlcndpa2kuY29tL2VkaXRvci8iPlRoZSBzY3JhcGVyd2lraSBlZGl0b3I8L2E+PC9saT4KPC91bD4KCjxoMj5SZWxlYXNlczwvaDI+Cgo8cCBjbGFzcz0icmVsIj48ZW0+MjItMDctMjAxMDwvZW0+OiA8YQpocmVmPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yL2NvZGVtaXJyb3ItMC44LnppcCI+VmVyc2lvbgowLjg8L2E+OjwvcD4KCjx1bCBjbGFzcz0icmVsIj4KICA8bGk+QWRkIGEgPGNvZGU+Y3Vyc29yQ29vcmRzPC9jb2RlPiBtZXRob2QgdG8gZmluZCB0aGUgc2NyZWVuCiAgY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnNvci48L2xpPgogIDxsaT5BIG51bWJlciBvZiBmaXhlcyBhbmQgc3VwcG9ydCBmb3IgbW9yZSBzeW50YXggaW4gdGhlIFBIUCBwYXJzZXIuPC9saT4KICA8bGk+Rml4IGluZGVudGF0aW9uIHByb2JsZW0gd2l0aCBKU09OLW1vZGUgSlMgcGFyc2VyIGluIFdlYmtpdC48L2xpPgogIDxsaT5BZGQgYSA8YSBocmVmPSJjb21wcmVzcy5odG1sIj5taW5pZmljYXRpb248L2E+IFVJLjwvbGk+CiAgPGxpPlN1cHBvcnQgYSA8Y29kZT5oZWlnaHQ6IGR5bmFtaWM8L2NvZGU+IG1vZGUsIHdoZXJlIHRoZSBlZGl0b3IncwogIGhlaWdodCB3aWxsIGFkanVzdCB0byB0aGUgc2l6ZSBvZiBpdHMgY29udGVudC48L2xpPgogIDxsaT5CZXR0ZXIgc3VwcG9ydCBmb3IgSU1FIGlucHV0IG1vZGUuPC9saT4KICA8bGk+Rml4IEphdmFTY3JpcHQgcGFyc2VyIGdldHRpbmcgY29uZnVzZWQgd2hlbiBzZWVpbmcgYSBuby1hcmd1bWVudAogIGZ1bmN0aW9uIGNhbGwuPC9saT4KICA8bGk+SGF2ZSBDU1MgcGFyc2VyIHNlZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHNlbGVjdG9ycyBhbmQgb3RoZXIKICBpZGVudGlmaWVycy48L2xpPgogIDxsaT5GaXggc2Nyb2xsaW5nIGJ1ZyB3aGVuIHBhc3RpbmcgaW4gYSBob3Jpem9udGFsbHktc2Nyb2xsZWQKICBlZGl0b3IuPC9saT4KICA8bGk+U3VwcG9ydCA8Y29kZT50b1RleHRBcmVhPC9jb2RlPiBtZXRob2QgaW4gaW5zdGFuY2VzIGNyZWF0ZWQgd2l0aAogIDxjb2RlPmZyb21UZXh0QXJlYTwvY29kZT4uPC9saT4KICA8bGk+V29yayBhcm91bmQgbmV3IE9wZXJhIGN1cnNvciBidWcgdGhhdCBjYXVzZXMgdGhlIGN1cnNvciB0byBqdW1wCiAgd2hlbiBwcmVzc2luZyBiYWNrc3BhY2UgYXQgdGhlIGVuZCBvZiBhIGxpbmUuPC9saT4KPC91bD4KCjxwIGNsYXNzPSJyZWwiPjxlbT4yMS0wNi0yMDEwPC9lbT46IDxhCmhyZWY9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvY29kZW1pcnJvci0wLjcuemlwIj5WZXJzaW9uCjAuNzwvYT46PC9wPgoKPHVsIGNsYXNzPSJyZWwiPgogIDxsaT5GaXhlcyBpc3N1ZSB3aGVyZSBjYWxsaW5nIDxjb2RlPi5zdWJtaXQoKTwvY29kZT4gb24gYSBmb3JtIHdpdGgKICBhIDxjb2RlPmZyb21UZXh0QXJlYTwvY29kZT4gQ29kZU1pcnJvciBmYWlsZWQgdG8gc3VibWl0IHRoZQogIGVkaXRlZCBjb250ZW50LjwvbGk+CiAgPGxpPkFkZCA8YSBocmVmPSJjb250cmliL2dyb292eS9pbmRleC5odG1sIj5Hcm9vdnk8L2E+IHBhcnNlciAoaG9zdGVkIGV4dGVybmFsbHkpLjwvbGk+CiAgPGxpPk1ha2UgbGluZS1udW1iZXJpbmcgbXVjaCwgbXVjaCBmYXN0ZXIuPC9saT4KICA8bGk+Rml4IG9jY2FzaW9uYWwgYnVnZ3kgYmVoYXZpb3VyIG9mIHRoZSBlbnRlciBrZXkgaW4gT3BlcmEuPC9saT4KICA8bGk+QWRkIGEgPGEgaHJlZj0iZmFxLmh0bWwiPkZBUTwvYT4gZG9jdW1lbnQuPC9saT4KICA8bGk+TWFrZSBzZWFyY2ggdXNlIGRvLXdoYXQtSS1tZWFuIEVtYWNzLWxpa2UgYmVoYXZpb3VyIHRvIGRldGVybWluZQogIGNhc2Utc2Vuc2l0aXZpdGl5IGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZC48L2xpPgogIDxsaT5BZGQgYSBDIyBwYXJzZXIgY29udHJpYiBtb2R1bGUuPC9saT4KICA8bGk+QSBudW1iZXIgb2YgYnVnZml4ZXMgYW5kIGV4dGVuc2lvbnMgdG8gdGhlIFBIUCBwYXJzZXIgKGxhbWJkYXMsCiAgYWJzdHJhY3QgY2xhc3NlcywgY29uZmlndXJhYmxlIG9wZW5pbmcgdGFncykuPC9saT4KICA8bGk+Rml4IG11bHRpbGluZSBjb21tZW50cyBpbiB0aGUgTHVhIHBhcnNlci48L2xpPgo8L3VsPgoKPHAgY2xhc3M9InJlbCI+PGVtPjI3LTA0LTIwMTA8L2VtPjogPGEKaHJlZj0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci9jb2RlbWlycm9yLTAuNjcuemlwIj5WZXJzaW9uCjAuNjc8L2E+OiBNb3JlIGNvbnNpc3RlbnQgcGFnZS11cC9wYWdlLWRvd24gYmVoYXZpb3VyIGFjcm9zcyBicm93c2Vycy4KRml4IHNvbWUgaXNzdWVzIHdpdGggaGlkZGVuIGVkaXRvcnMgbG9vcGluZyBmb3JldmVyIHdoZW4gbGluZS1udW1iZXJzCndlcmUgZW5hYmxlZC4gTWFrZSBQSFAgcGFyc2VyIHBhcnNlIDxjb2RlPiJcXCI8L2NvZGU+IGNvcnJlY3RseS4gSGF2ZQo8Y29kZT5qdW1wVG9MaW5lPC9jb2RlPiB3b3JrIG9uIGxpbmUgaGFuZGxlcywgYW5kIGFkZAo8Y29kZT5jdXJzb3JMaW5lPC9jb2RlPiBmdW5jdGlvbiB0byBmZXRjaCB0aGUgbGluZSBoYW5kbGUgd2hlcmUgdGhlCmN1cnNvciBjdXJyZW50bHkgaXMuIEFkZCBuZXcgPGNvZGU+c2V0U3R5bGVzaGVldDwvY29kZT4gZnVuY3Rpb24gdG8Kc3dpdGNoIHN0eWxlLXNoZWV0cyBpbiBhIHJ1bm5pbmcgZWRpdG9yLjwvcD4KCjxwIGNsYXNzPSJyZWwiPjxlbT4wMS0wMy0yMDEwPC9lbT46IDxhCmhyZWY9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvY29kZW1pcnJvci0wLjY2LnppcCI+VmVyc2lvbgowLjY2PC9hPjogQWRkcyA8Y29kZT5yZW1vdmVMaW5lPC9jb2RlPiBtZXRob2QgdG8gQVBJLiBJbnRyb2R1Y2VzIHRoZQo8YSBocmVmPSJjb250cmliL3Bsc3FsL2luZGV4Lmh0bWwiPlBMU1FMIHBhcnNlcjwvYT4uIE1hcmtzIFhNTCBlcnJvcnMKYnkgYWRkaW5nIChyYXRoZXIgdGhhbiByZXBsYWNpbmcpIGEgQ1NTIGNsYXNzLCBzbyB0aGF0IHRoZXkgY2FuIGJlCmRpc2FibGVkIGJ5IG1vZGlmeWluZyB0aGVpciBzdHlsZS4gRml4ZXMgc2V2ZXJhbCBzZWxlY3Rpb24gYnVncywgYW5kIGEKbnVtYmVyIG9mIHNtYWxsIGdsaXRjaGVzLjwvcD4KCjxwIGNsYXNzPSJyZWwiPjxlbT4xMi0xMS0yMDA5PC9lbT46IDxhCmhyZWY9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvY29kZW1pcnJvci0wLjY1LnppcCI+VmVyc2lvbgowLjY1PC9hPjogQWRkIHN1cHBvcnQgZm9yIGhhdmluZyBib3RoIGxpbmUtd3JhcHBpbmcgYW5kIGxpbmUtbnVtYmVycwp0dXJuZWQgb24sIG1ha2UgcGFyZW4taGlnaGxpZ2h0aW5nIHN0eWxlIGN1c3RvbWlzYWJsZQooPGNvZGU+bWFya1BhcmVuPC9jb2RlPiBhbmQgPGNvZGU+dW5tYXJrUGFyZW48L2NvZGU+IGNvbmZpZyBvcHRpb25zKSwKd29yayBhcm91bmQgYSBzZWxlY3Rpb24gYnVnIHRoYXQgT3BlcmEgPGVtPnJlPC9lbT5pbnRyb2R1Y2VkIGluCnZlcnNpb24gMTAuPC9wPgoKPHAgY2xhc3M9InJlbCI+PGVtPjIzLTEwLTIwMDk8L2VtPjogPGEKaHJlZj0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci9jb2RlbWlycm9yLTAuNjQuemlwIj5WZXJzaW9uCjAuNjQ8L2E+OiBTb2x2ZXMgc29tZSBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGUgcGFzdGUtaGFuZGxpbmcgY2hhbmdlcwpmcm9tIHRoZSBwcmV2aW91cyByZWxlYXNlLiBBZGRzIDxjb2RlPnNldFNwZWxsY2hlY2s8L2NvZGU+LAo8Y29kZT5zZXRUZXh0V3JhcHBpbmc8L2NvZGU+LCA8Y29kZT5zZXRJbmRlbnRVbml0PC9jb2RlPiwKPGNvZGU+c2V0VW5kb0RlcHRoPC9jb2RlPiwgPGNvZGU+c2V0VGFiTW9kZTwvY29kZT4sIGFuZAo8Y29kZT5zZXRMaW5lTnVtYmVyczwvY29kZT4gdG8gY3VzdG9taXNlIGEgcnVubmluZyBlZGl0b3IuIEludHJvZHVjZXMKYW4gPGEgaHJlZj0iY29udHJpYi9zcWwvaW5kZXguaHRtbCI+U1FMPC9hPiBwYXJzZXIuIEZpeGVzIGEgZmV3IHNtYWxsCnByb2JsZW1zIGluIHRoZSA8YSBocmVmPSJjb250cmliL3B5dGhvbi9pbmRleC5odG1sIj5QeXRob248L2E+IHBhcnNlci4KQW5kLCBhcyB1c3VhbCwgYWRkIHdvcmthcm91bmRzIGZvciB2YXJpb3VzIG5ld2x5IGRpc2NvdmVyZWQgYnJvd3NlcgppbmNvbXBhdGliaWxpdGllcy48L3A+Cgo8cCBjbGFzcz0icmVsIj48ZW0+MzEtMDgtMjAwOTwvZW0+OiA8YQpocmVmPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yL2NvZGVtaXJyb3ItMC42My56aXAiPlZlcnNpb24KMC42MzwvYT46IE92ZXJoYXVsIG9mIHBhc3RlLWhhbmRsaW5nIChsZXNzIGZyYWdpbGUpLCBmaXhlcyBmb3Igc2V2ZXJhbApzZXJpb3VzIElFOCBpc3N1ZXMgKGN1cnNvciBqdW1waW5nLCBlbmQtb2YtZG9jdW1lbnQgYnVncykgYW5kIGEgbnVtYmVyCm9mIHNtYWxsIHByb2JsZW1zLjwvcD4KCjxwIGNsYXNzPSJyZWwiPjxlbT4zMC0wNS0yMDA5PC9lbT46IDxhCmhyZWY9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvY29kZW1pcnJvci0wLjYyLnppcCI+VmVyc2lvbgowLjYyPC9hPjogSW50cm9kdWNlcyA8YSBocmVmPSJjb250cmliL3B5dGhvbi9pbmRleC5odG1sIj5QeXRob248L2E+CmFuZCA8YSBocmVmPSJjb250cmliL2x1YS9pbmRleC5odG1sIj5MdWE8L2E+IHBhcnNlcnMuIEFkZAo8Y29kZT5zZXRQYXJzZXI8L2NvZGU+IChvbi10aGUtZmx5IG1vZGUgY2hhbmdpbmcpIGFuZAo8Y29kZT5jbGVhckhpc3Rvcnk8L2NvZGU+IG1ldGhvZHMuIE1ha2UgcGFyc2luZyBwYXNzZXMgdGltZS1iYXNlZAppbnN0ZWFkIG9mIGxpbmVzLWJhc2VkIChzZWUgdGhlIDxjb2RlPnBhc3NUaW1lPC9jb2RlPiBvcHRpb24pLjwvcD4KCjxoMiBpZD0ic3VwcG9ydGVkIj5TdXBwb3J0ZWQgYnJvd3NlcnM8L2gyPgoKPHA+QXQgdGhpcyB0aW1lLCB0aGUgZm9sbG93aW5nIGJyb3dzZXJzIGFyZSBzdXBwb3J0ZWQ6PC9wPgoKPHVsPgogIDxsaT5GaXJlZm94IDEuNSBvciBoaWdoZXI8L2xpPgogIDxsaT5JbnRlcm5ldCBFeHBsb3JlciA2IG9yIGhpZ2hlcjwvbGk+CiAgPGxpPlNhZmFyaSAzIG9yIGhpZ2hlcjwvbGk+CiAgPGxpPk9wZXJhIDkuNTIgb3IgaGlnaGVyPC9saT4KICA8bGk+Q2hyb21lPC9saT4KPC91bD4KCjxwPk1ha2luZyBpdCB3b3JrIG9uIG90aGVyIGJyb3dzZXJzIHRoYXQgaGF2ZSBkZWNlbnQgc3VwcG9ydCBmb3IgdGhlClczQyBET00gbW9kZWwgc2hvdWxkIG5vdCBiZSB0b28gaGFyZCwgYnV0IEkgYW0gbm90IGFjdGl2ZWx5IHRlc3RpbmcKYWdhaW5zdCB0aG9zZS48L3A+Cgo8aDI+R2V0dGluZyB0aGUgY29kZTwvaDI+Cgo8cD5BbGwgb2YgQ29kZU1pcnJvciBpcyByZWxlYXNlZCB1bmRlciBhIDxhCmhyZWY9IkxJQ0VOU0UiPnpsaWItc3R5bGU8L2E+IGxpY2Vuc2UuIFRvIGdldCBpdCwgeW91IGNhbiBkb3dubG9hZCB0aGUKPGEgaHJlZj0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci9jb2RlbWlycm9yLnppcCI+bGF0ZXN0CnJlbGVhc2U8L2E+IG9yIHRoZSBjdXJyZW50IDxhCmhyZWY9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvY29kZW1pcnJvci1sYXRlc3QuemlwIj5kZXZlbG9wbWVudApzbmFwc2hvdDwvYT4gYXMgemlwIGZpbGVzLCB0cnkgdGhlIDxhIGhyZWY9ImNvbXByZXNzLmh0bWwiPmNvbXByZXNzaW9uCkFQSTwvYT4gdG8gY3JlYXRlIGEgY29tcHJlc3NlZCB2ZXJzaW9uLCBvciB1c2UgPGEKaHJlZj0iaHR0cDovL2dpdC1zY20uY29tLyI+Z2l0PC9hPiB0byBnZXQgdGhlIHJlcG9zaXRvcnk6PC9wPgoKPHByZSBjbGFzcz0iY29kZSI+Z2l0IGNsb25lIGh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvLmdpdDwvcHJlPgoKPHA+VGhpcyBzZWNvbmQgbWV0aG9kIGlzIHJlY29tbWVuZGVkIGlmIHlvdSBhcmUgcGxhbm5pbmcgdG8gaGFjayBvbgpDb2RlTWlycm9yICYjeDIwMTU7IGl0IG1ha2VzIGl0IGVhc3kgdG8gcmVjb3JkIHlvdXIgcGF0Y2hlcyBhbmQgc2hhcmUKdGhlbSB3aXRoIG1lLiBDb2RlTWlycm9yIGNhbiBhbHNvIGJlIGZvdW5kIG9uIEdpdEh1YjogPGEKaHJlZj0iaHR0cDovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yIj5odHRwOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3I8L2E+LjwvcD4KCjxoMj5TdXBwb3J0PC9oMj4KCjxwPlRoZXJlIGlzIGEgPGEKaHJlZj0iaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2NvZGVtaXJyb3IiPkdvb2dsZSBncm91cDwvYT4gKGEKc29ydCBvZiBtYWlsaW5nIGxpc3QvbmV3c2dyb3VwIHRoaW5neSkgZm9yIGRpc2N1c3Npb24gYW5kIG5ld3MgcmVsYXRlZAp0byBDb2RlTWlycm9yLiBQbGVhc2UgY2hlY2sgdGhlIDxhIGhyZWY9ImZhcS5odG1sIj5GQVE8L2E+IGJlZm9yZQphc2tpbmcgYSBxdWVzdG9pbi4gWW91IGNhbiBhbHNvIGUtbWFpbCBtZSBkaXJlY3RseTogPGEKaHJlZj0ibWFpbHRvOm1hcmlqbmhAZ21haWwuY29tIj5NYXJpam4gSGF2ZXJiZWtlPC9hPi48L3A+Cgo8aDI+RG9jdW1lbnRhdGlvbjwvaDI+Cgo8dWw+CiAgPGxpPlRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCI+bWFudWFsPC9hPiBpcyBhbGwgbW9zdCB1c2VycyB3aWxsIG5lZWQKICB0byByZWFkIChvciBza2ltKS48L2xpPgogIDxsaT5JZiB5b3UncmUgaW50ZXJlc3RlZCBpbiB3b3JraW5nIG9uIHRoZSBjb2RlLCA8YQogIGhyZWY9InN0b3J5Lmh0bWwiPnRoaXMgZG9jdW1lbnQ8L2E+IGFib3V0IENvZGVNaXJyb3IncyBhcmNoaXRlY3R1cmUKICB3aWxsIGJlIHVzZWZ1bC48L2xpPgogIDxsaT5UaGUgPGEgaHJlZj0iaHR0cDovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yIj5zb3VyY2UKICBjb2RlPC9hPiBpcywgZm9yIHRoZSBtb3N0IHBhcnQsIHJhdGhlciB3ZWxsIGNvbW1lbnRlZCwgc28gaWYgYWxsCiAgZWxzZSBmYWlscywgeW91IGNhbiB0cnkgcmVhZGluZyBpdC48L2xpPgo8L3VsPgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/js/codemirror.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQ29kZU1pcnJvciBtYWluIG1vZHVsZQogKgogKiBJbXBsZW1lbnRzIHRoZSBDb2RlTWlycm9yIGNvbnN0cnVjdG9yIGFuZCBwcm90b3R5cGUsIHdoaWNoIHRha2UgY2FyZQogKiBvZiBpbml0aWFsaXppbmcgdGhlIGVkaXRvciBmcmFtZSwgYW5kIHByb3ZpZGluZyB0aGUgb3V0c2lkZSBpbnRlcmZhY2UuCiAqLwoKLy8gVGhlIENvZGVNaXJyb3JDb25maWcgb2JqZWN0IGlzIHVzZWQgdG8gc3BlY2lmeSBhIGRlZmF1bHQKLy8gY29uZmlndXJhdGlvbi4gSWYgeW91IHNwZWNpZnkgc3VjaCBhbiBvYmplY3QgYmVmb3JlIGxvYWRpbmcgdGhpcwovLyBmaWxlLCB0aGUgdmFsdWVzIHlvdSBwdXQgaW50byBpdCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0cyBnaXZlbgovLyBiZWxvdy4gWW91IGNhbiBhbHNvIGFzc2lnbiB0byBpdCBhZnRlciBsb2FkaW5nLgp2YXIgQ29kZU1pcnJvckNvbmZpZyA9IHdpbmRvdy5Db2RlTWlycm9yQ29uZmlnIHx8IHt9OwoKdmFyIENvZGVNaXJyb3IgPSAoZnVuY3Rpb24oKXsKICBmdW5jdGlvbiBzZXREZWZhdWx0cyhvYmplY3QsIGRlZmF1bHRzKSB7CiAgICBmb3IgKHZhciBvcHRpb24gaW4gZGVmYXVsdHMpIHsKICAgICAgaWYgKCFvYmplY3QuaGFzT3duUHJvcGVydHkob3B0aW9uKSkKICAgICAgICBvYmplY3Rbb3B0aW9uXSA9IGRlZmF1bHRzW29wdGlvbl07CiAgICB9CiAgfQogIGZ1bmN0aW9uIGZvckVhY2goYXJyYXksIGFjdGlvbikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKICAgICAgYWN0aW9uKGFycmF5W2ldKTsKICB9CgogIC8vIFRoZXNlIGRlZmF1bHQgb3B0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwYXNzaW5nIGEgc2V0IG9mCiAgLy8gb3B0aW9ucyB0byBhIHNwZWNpZmljIENvZGVNaXJyb3IgY29uc3RydWN0b3IuIFNlZSBtYW51YWwuaHRtbCBmb3IKICAvLyB0aGVpciBtZWFuaW5nLgogIHNldERlZmF1bHRzKENvZGVNaXJyb3JDb25maWcsIHsKICAgIHN0eWxlc2hlZXQ6IFtdLAogICAgcGF0aDogIiIsCiAgICBwYXJzZXJmaWxlOiBbXSwKICAgIGJhc2VmaWxlczogWyJ1dGlsLmpzIiwgInN0cmluZ3N0cmVhbS5qcyIsICJzZWxlY3QuanMiLCAidW5kby5qcyIsICJlZGl0b3IuanMiLCAidG9rZW5pemUuanMiXSwKICAgIGlmcmFtZUNsYXNzOiBudWxsLAogICAgcGFzc0RlbGF5OiAyMDAsCiAgICBwYXNzVGltZTogNTAsCiAgICBsaW5lTnVtYmVyRGVsYXk6IDIwMCwKICAgIGxpbmVOdW1iZXJUaW1lOiA1MCwKICAgIGNvbnRpbnVvdXNTY2FubmluZzogZmFsc2UsCiAgICBzYXZlRnVuY3Rpb246IG51bGwsCiAgICBvbkNoYW5nZTogbnVsbCwKICAgIHVuZG9EZXB0aDogNTAsCiAgICB1bmRvRGVsYXk6IDgwMCwKICAgIGRpc2FibGVTcGVsbGNoZWNrOiB0cnVlLAogICAgdGV4dFdyYXBwaW5nOiB0cnVlLAogICAgcmVhZE9ubHk6IGZhbHNlLAogICAgd2lkdGg6ICIiLAogICAgaGVpZ2h0OiAiMzAwcHgiLAogICAgbWluSGVpZ2h0OiAxMDAsCiAgICBhdXRvTWF0Y2hQYXJlbnM6IGZhbHNlLAogICAgcGFyc2VyQ29uZmlnOiBudWxsLAogICAgdGFiTW9kZTogImluZGVudCIsIC8vIG9yICJzcGFjZXMiLCAiZGVmYXVsdCIsICJzaGlmdCIKICAgIHJlaW5kZW50T25Mb2FkOiBmYWxzZSwKICAgIGFjdGl2ZVRva2VuczogbnVsbCwKICAgIGN1cnNvckFjdGl2aXR5OiBudWxsLAogICAgbGluZU51bWJlcnM6IGZhbHNlLAogICAgaW5kZW50VW5pdDogMiwKICAgIGRvbWFpbjogbnVsbAogIH0pOwoKICBmdW5jdGlvbiBhZGRMaW5lTnVtYmVyRGl2KGNvbnRhaW5lcikgewogICAgdmFyIG51bXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSwKICAgICAgICBzY3JvbGxlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpOwogICAgbnVtcy5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICBudW1zLnN0eWxlLmhlaWdodCA9ICIxMDAlIjsKICAgIGlmIChudW1zLnN0eWxlLnNldEV4cHJlc3Npb24pIHsKICAgICAgdHJ5IHtudW1zLnN0eWxlLnNldEV4cHJlc3Npb24oImhlaWdodCIsICJ0aGlzLnByZXZpb3VzU2libGluZy5vZmZzZXRIZWlnaHQgKyAncHgnIik7fQogICAgICBjYXRjaChlKSB7fSAvLyBTZWVtcyB0byB0aHJvdyAnTm90IEltcGxlbWVudGVkJyBvbiBzb21lIElFOCB2ZXJzaW9ucwogICAgfQogICAgbnVtcy5zdHlsZS50b3AgPSAiMHB4IjsKICAgIG51bXMuc3R5bGUubGVmdCA9ICIwcHgiOwogICAgbnVtcy5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOwogICAgY29udGFpbmVyLmFwcGVuZENoaWxkKG51bXMpOwogICAgc2Nyb2xsZXIuY2xhc3NOYW1lID0gIkNvZGVNaXJyb3ItbGluZS1udW1iZXJzIjsKICAgIG51bXMuYXBwZW5kQ2hpbGQoc2Nyb2xsZXIpOwogICAgc2Nyb2xsZXIuaW5uZXJIVE1MID0gIjxkaXY+MTwvZGl2PiI7CiAgICByZXR1cm4gbnVtczsKICB9CgogIGZ1bmN0aW9uIGZyYW1lSFRNTChvcHRpb25zKSB7CiAgICBpZiAodHlwZW9mIG9wdGlvbnMucGFyc2VyZmlsZSA9PSAic3RyaW5nIikKICAgICAgb3B0aW9ucy5wYXJzZXJmaWxlID0gW29wdGlvbnMucGFyc2VyZmlsZV07CiAgICBpZiAodHlwZW9mIG9wdGlvbnMuc3R5bGVzaGVldCA9PSAic3RyaW5nIikKICAgICAgb3B0aW9ucy5zdHlsZXNoZWV0ID0gW29wdGlvbnMuc3R5bGVzaGVldF07CgogICAgdmFyIGh0bWwgPSBbIjwhRE9DVFlQRSBIVE1MIFBVQkxJQyBcIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU5cIiBcImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZFwiPjxodG1sPjxoZWFkPiJdOwogICAgLy8gSGFjayB0byB3b3JrIGFyb3VuZCBhIGJ1bmNoIG9mIElFOC1zcGVjaWZpYyBwcm9ibGVtcy4KICAgIGh0bWwucHVzaCgiPG1ldGEgaHR0cC1lcXVpdj1cIlgtVUEtQ29tcGF0aWJsZVwiIGNvbnRlbnQ9XCJJRT1FbXVsYXRlSUU3XCIvPiIpOwogICAgZm9yRWFjaChvcHRpb25zLnN0eWxlc2hlZXQsIGZ1bmN0aW9uKGZpbGUpIHsKICAgICAgaHRtbC5wdXNoKCI8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgaHJlZj1cIiIgKyBmaWxlICsgIlwiLz4iKTsKICAgIH0pOwogICAgZm9yRWFjaChvcHRpb25zLmJhc2VmaWxlcy5jb25jYXQob3B0aW9ucy5wYXJzZXJmaWxlKSwgZnVuY3Rpb24oZmlsZSkgewogICAgICBpZiAoIS9eaHR0cHM/Oi8udGVzdChmaWxlKSkgZmlsZSA9IG9wdGlvbnMucGF0aCArIGZpbGU7CiAgICAgIGh0bWwucHVzaCgiPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgc3JjPVwiIiArIGZpbGUgKyAiXCI+PCIgKyAiL3NjcmlwdD4iKTsKICAgIH0pOwogICAgaHRtbC5wdXNoKCI8L2hlYWQ+PGJvZHkgc3R5bGU9XCJib3JkZXItd2lkdGg6IDA7XCIgY2xhc3M9XCJlZGl0Ym94XCIgc3BlbGxjaGVjaz1cIiIgKwogICAgICAgICAgICAgIChvcHRpb25zLmRpc2FibGVTcGVsbGNoZWNrID8gImZhbHNlIiA6ICJ0cnVlIikgKyAiXCI+PC9ib2R5PjwvaHRtbD4iKTsKICAgIHJldHVybiBodG1sLmpvaW4oIiIpOwogIH0KCiAgdmFyIGludGVybmV0RXhwbG9yZXIgPSBkb2N1bWVudC5zZWxlY3Rpb24gJiYgd2luZG93LkFjdGl2ZVhPYmplY3QgJiYgL01TSUUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CgogIGZ1bmN0aW9uIENvZGVNaXJyb3IocGxhY2UsIG9wdGlvbnMpIHsKICAgIC8vIFVzZSBwYXNzZWQgb3B0aW9ucywgaWYgYW55LCB0byBvdmVycmlkZSBkZWZhdWx0cy4KICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgc2V0RGVmYXVsdHMob3B0aW9ucywgQ29kZU1pcnJvckNvbmZpZyk7CgogICAgLy8gQmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IgZGVwcmVjYXRlZCBvcHRpb25zLgogICAgaWYgKG9wdGlvbnMuZHVtYlRhYnMpIG9wdGlvbnMudGFiTW9kZSA9ICJzcGFjZXMiOwogICAgZWxzZSBpZiAob3B0aW9ucy5ub3JtYWxUYWIpIG9wdGlvbnMudGFiTW9kZSA9ICJkZWZhdWx0IjsKCiAgICB2YXIgZnJhbWUgPSB0aGlzLmZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiSUZSQU1FIik7CiAgICBpZiAob3B0aW9ucy5pZnJhbWVDbGFzcykgZnJhbWUuY2xhc3NOYW1lID0gb3B0aW9ucy5pZnJhbWVDbGFzczsKICAgIGZyYW1lLmZyYW1lQm9yZGVyID0gMDsKICAgIGZyYW1lLnN0eWxlLmJvcmRlciA9ICIwIjsKICAgIGZyYW1lLnN0eWxlLndpZHRoID0gJzEwMCUnOwogICAgZnJhbWUuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnOwogICAgLy8gZGlzcGxheTogYmxvY2sgb2NjYXNpb25hbGx5IHN1cHByZXNzZXMgc29tZSBGaXJlZm94IGJ1Z3MsIHNvIHdlCiAgICAvLyBhbHdheXMgYWRkIGl0LCByZWR1bmRhbnQgYXMgaXQgc291bmRzLgogICAgZnJhbWUuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CgogICAgdmFyIGRpdiA9IHRoaXMud3JhcHBpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKTsKICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CiAgICBkaXYuY2xhc3NOYW1lID0gIkNvZGVNaXJyb3Itd3JhcHBpbmciOwogICAgZGl2LnN0eWxlLndpZHRoID0gb3B0aW9ucy53aWR0aDsKICAgIGRpdi5zdHlsZS5oZWlnaHQgPSAob3B0aW9ucy5oZWlnaHQgPT0gImR5bmFtaWMiKSA/IG9wdGlvbnMubWluSGVpZ2h0ICsgInB4IiA6IG9wdGlvbnMuaGVpZ2h0OwogICAgLy8gVGhpcyBpcyB1c2VkIGJ5IEVkaXRvci5yZXJvdXRlUGFzdGVFdmVudAogICAgdmFyIHRlSGFjayA9IHRoaXMudGV4dGFyZWFIYWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEVYVEFSRUEiKTsKICAgIGRpdi5hcHBlbmRDaGlsZCh0ZUhhY2spOwogICAgdGVIYWNrLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgIHRlSGFjay5zdHlsZS5sZWZ0ID0gIi0xMDAwMHB4IjsKICAgIHRlSGFjay5zdHlsZS53aWR0aCA9ICIxMHB4IjsKCiAgICAvLyBMaW5rIGJhY2sgdG8gdGhpcyBvYmplY3QsIHNvIHRoYXQgdGhlIGVkaXRvciBjYW4gZmV0Y2ggb3B0aW9ucwogICAgLy8gYW5kIGFkZCBhIHJlZmVyZW5jZSB0byBpdHNlbGYuCiAgICBmcmFtZS5Db2RlTWlycm9yID0gdGhpczsKICAgIGlmIChvcHRpb25zLmRvbWFpbiAmJiBpbnRlcm5ldEV4cGxvcmVyKSB7CiAgICAgIHRoaXMuaHRtbCA9IGZyYW1lSFRNTChvcHRpb25zKTsKICAgICAgZnJhbWUuc3JjID0gImphdmFzY3JpcHQ6KGZ1bmN0aW9uKCl7ZG9jdW1lbnQub3BlbigpOyIgKwogICAgICAgIChvcHRpb25zLmRvbWFpbiA/ICJkb2N1bWVudC5kb21haW49XCIiICsgb3B0aW9ucy5kb21haW4gKyAiXCI7IiA6ICIiKSArCiAgICAgICAgImRvY3VtZW50LndyaXRlKHdpbmRvdy5mcmFtZUVsZW1lbnQuQ29kZU1pcnJvci5odG1sKTtkb2N1bWVudC5jbG9zZSgpO30pKCkiOwogICAgfQogICAgZWxzZSB7CiAgICAgIGZyYW1lLnNyYyA9ICJqYXZhc2NyaXB0OmZhbHNlIjsKICAgIH0KCiAgICBpZiAocGxhY2UuYXBwZW5kQ2hpbGQpIHBsYWNlLmFwcGVuZENoaWxkKGRpdik7CiAgICBlbHNlIHBsYWNlKGRpdik7CiAgICBkaXYuYXBwZW5kQ2hpbGQoZnJhbWUpOwogICAgaWYgKG9wdGlvbnMubGluZU51bWJlcnMpIHRoaXMubGluZU51bWJlcnMgPSBhZGRMaW5lTnVtYmVyRGl2KGRpdik7CgogICAgdGhpcy53aW4gPSBmcmFtZS5jb250ZW50V2luZG93OwogICAgaWYgKCFvcHRpb25zLmRvbWFpbiB8fCAhaW50ZXJuZXRFeHBsb3JlcikgewogICAgICB0aGlzLndpbi5kb2N1bWVudC5vcGVuKCk7CiAgICAgIHRoaXMud2luLmRvY3VtZW50LndyaXRlKGZyYW1lSFRNTChvcHRpb25zKSk7CiAgICAgIHRoaXMud2luLmRvY3VtZW50LmNsb3NlKCk7CiAgICB9CiAgfQoKICBDb2RlTWlycm9yLnByb3RvdHlwZSA9IHsKICAgIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5vcHRpb25zLmluaXRDYWxsYmFjaykgdGhpcy5vcHRpb25zLmluaXRDYWxsYmFjayh0aGlzKTsKICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW5lTnVtYmVycykgdGhpcy5hY3RpdmF0ZUxpbmVOdW1iZXJzKCk7CiAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVpbmRlbnRPbkxvYWQpIHRoaXMucmVpbmRlbnQoKTsKICAgICAgaWYgKHRoaXMub3B0aW9ucy5oZWlnaHQgPT0gImR5bmFtaWMiKSB0aGlzLnNldER5bmFtaWNIZWlnaHQoKTsKICAgIH0sCgogICAgZ2V0Q29kZTogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuZWRpdG9yLmdldENvZGUoKTt9LAogICAgc2V0Q29kZTogZnVuY3Rpb24oY29kZSkge3RoaXMuZWRpdG9yLmltcG9ydENvZGUoY29kZSk7fSwKICAgIHNlbGVjdGlvbjogZnVuY3Rpb24oKSB7dGhpcy5mb2N1c0lmSUUoKTsgcmV0dXJuIHRoaXMuZWRpdG9yLnNlbGVjdGVkVGV4dCgpO30sCiAgICByZWluZGVudDogZnVuY3Rpb24oKSB7dGhpcy5lZGl0b3IucmVpbmRlbnQoKTt9LAogICAgcmVpbmRlbnRTZWxlY3Rpb246IGZ1bmN0aW9uKCkge3RoaXMuZm9jdXNJZklFKCk7IHRoaXMuZWRpdG9yLnJlaW5kZW50U2VsZWN0aW9uKG51bGwpO30sCgogICAgZm9jdXNJZklFOiBmdW5jdGlvbigpIHsKICAgICAgLy8gaW4gSUUsIGEgbG90IG9mIHNlbGVjdGlvbi1yZWxhdGVkIGZ1bmN0aW9uYWxpdHkgb25seSB3b3JrcyB3aGVuIHRoZSBmcmFtZSBpcyBmb2N1c2VkCiAgICAgIGlmICh0aGlzLndpbi5zZWxlY3QuaWVfc2VsZWN0aW9uKSB0aGlzLmZvY3VzKCk7CiAgICB9LAogICAgZm9jdXM6IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLndpbi5mb2N1cygpOwogICAgICBpZiAodGhpcy5lZGl0b3Iuc2VsZWN0aW9uU25hcHNob3QpIC8vIElFIGhhY2sKICAgICAgICB0aGlzLndpbi5zZWxlY3Quc2V0Qm9va21hcmsodGhpcy53aW4uZG9jdW1lbnQuYm9keSwgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uU25hcHNob3QpOwogICAgfSwKICAgIHJlcGxhY2VTZWxlY3Rpb246IGZ1bmN0aW9uKHRleHQpIHsKICAgICAgdGhpcy5mb2N1cygpOwogICAgICB0aGlzLmVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKHRleHQpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0sCiAgICByZXBsYWNlQ2hhcnM6IGZ1bmN0aW9uKHRleHQsIHN0YXJ0LCBlbmQpIHsKICAgICAgdGhpcy5lZGl0b3IucmVwbGFjZUNoYXJzKHRleHQsIHN0YXJ0LCBlbmQpOwogICAgfSwKICAgIGdldFNlYXJjaEN1cnNvcjogZnVuY3Rpb24oc3RyaW5nLCBmcm9tQ3Vyc29yLCBjYXNlRm9sZCkgewogICAgICByZXR1cm4gdGhpcy5lZGl0b3IuZ2V0U2VhcmNoQ3Vyc29yKHN0cmluZywgZnJvbUN1cnNvciwgY2FzZUZvbGQpOwogICAgfSwKCiAgICB1bmRvOiBmdW5jdGlvbigpIHt0aGlzLmVkaXRvci5oaXN0b3J5LnVuZG8oKTt9LAogICAgcmVkbzogZnVuY3Rpb24oKSB7dGhpcy5lZGl0b3IuaGlzdG9yeS5yZWRvKCk7fSwKICAgIGhpc3RvcnlTaXplOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5lZGl0b3IuaGlzdG9yeS5oaXN0b3J5U2l6ZSgpO30sCiAgICBjbGVhckhpc3Rvcnk6IGZ1bmN0aW9uKCkge3RoaXMuZWRpdG9yLmhpc3RvcnkuY2xlYXIoKTt9LAoKICAgIGdyYWJLZXlzOiBmdW5jdGlvbihjYWxsYmFjaywgZmlsdGVyKSB7dGhpcy5lZGl0b3IuZ3JhYktleXMoY2FsbGJhY2ssIGZpbHRlcik7fSwKICAgIHVuZ3JhYktleXM6IGZ1bmN0aW9uKCkge3RoaXMuZWRpdG9yLnVuZ3JhYktleXMoKTt9LAoKICAgIHNldFBhcnNlcjogZnVuY3Rpb24obmFtZSwgcGFyc2VyQ29uZmlnKSB7dGhpcy5lZGl0b3Iuc2V0UGFyc2VyKG5hbWUsIHBhcnNlckNvbmZpZyk7fSwKICAgIHNldFNwZWxsY2hlY2s6IGZ1bmN0aW9uKG9uKSB7dGhpcy53aW4uZG9jdW1lbnQuYm9keS5zcGVsbGNoZWNrID0gb247fSwKICAgIHNldFN0eWxlc2hlZXQ6IGZ1bmN0aW9uKG5hbWVzKSB7CiAgICAgIGlmICh0eXBlb2YgbmFtZXMgPT09ICJzdHJpbmciKSBuYW1lcyA9IFtuYW1lc107CiAgICAgIHZhciBhY3RpdmVTdHlsZXNoZWV0cyA9IHt9OwogICAgICB2YXIgbWF0Y2hlZE5hbWVzID0ge307CiAgICAgIHZhciBsaW5rcyA9IHRoaXMud2luLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIik7CiAgICAgIC8vIENyZWF0ZSBoYXNoZXMgb2YgYWN0aXZlIHN0eWxlc2hlZXRzIGFuZCBtYXRjaGVkIG5hbWVzLgogICAgICAvLyBUaGlzIGlzIE8obl4yKSBidXQgbiBpcyBleHBlY3RlZCB0byBiZSB2ZXJ5IHNtYWxsLgogICAgICBmb3IgKHZhciB4ID0gMCwgbGluazsgbGluayA9IGxpbmtzW3hdOyB4KyspIHsKICAgICAgICBpZiAobGluay5yZWwuaW5kZXhPZigic3R5bGVzaGVldCIpICE9PSAtMSkgewogICAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCBuYW1lcy5sZW5ndGg7IHkrKykgewogICAgICAgICAgICB2YXIgbmFtZSA9IG5hbWVzW3ldOwogICAgICAgICAgICBpZiAobGluay5ocmVmLnN1YnN0cmluZyhsaW5rLmhyZWYubGVuZ3RoIC0gbmFtZS5sZW5ndGgpID09PSBuYW1lKSB7CiAgICAgICAgICAgICAgYWN0aXZlU3R5bGVzaGVldHNbbGluay5ocmVmXSA9IHRydWU7CiAgICAgICAgICAgICAgbWF0Y2hlZE5hbWVzW25hbWVdID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvLyBBY3RpdmF0ZSB0aGUgc2VsZWN0ZWQgc3R5bGVzaGVldHMgYW5kIGRpc2FibGUgdGhlIHJlc3QuCiAgICAgIGZvciAodmFyIHggPSAwLCBsaW5rOyBsaW5rID0gbGlua3NbeF07IHgrKykgewogICAgICAgIGlmIChsaW5rLnJlbC5pbmRleE9mKCJzdHlsZXNoZWV0IikgIT09IC0xKSB7CiAgICAgICAgICBsaW5rLmRpc2FibGVkID0gIShsaW5rLmhyZWYgaW4gYWN0aXZlU3R5bGVzaGVldHMpOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBDcmVhdGUgYW55IG5ldyBzdHlsZXNoZWV0cy4KICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCBuYW1lcy5sZW5ndGg7IHkrKykgewogICAgICAgIHZhciBuYW1lID0gbmFtZXNbeV07CiAgICAgICAgaWYgKCEobmFtZSBpbiBtYXRjaGVkTmFtZXMpKSB7CiAgICAgICAgICB2YXIgbGluayA9IHRoaXMud2luLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTsKICAgICAgICAgIGxpbmsucmVsID0gInN0eWxlc2hlZXQiOwogICAgICAgICAgbGluay50eXBlID0gInRleHQvY3NzIjsKICAgICAgICAgIGxpbmsuaHJlZiA9IG5hbWU7CiAgICAgICAgICB0aGlzLndpbi5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKGxpbmspOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIHNldFRleHRXcmFwcGluZzogZnVuY3Rpb24ob24pIHsKICAgICAgaWYgKG9uID09IHRoaXMub3B0aW9ucy50ZXh0V3JhcHBpbmcpIHJldHVybjsKICAgICAgdGhpcy53aW4uZG9jdW1lbnQuYm9keS5zdHlsZS53aGl0ZVNwYWNlID0gb24gPyAiIiA6ICJub3dyYXAiOwogICAgICB0aGlzLm9wdGlvbnMudGV4dFdyYXBwaW5nID0gb247CiAgICAgIGlmICh0aGlzLmxpbmVOdW1iZXJzKSB7CiAgICAgICAgdGhpcy5zZXRMaW5lTnVtYmVycyhmYWxzZSk7CiAgICAgICAgdGhpcy5zZXRMaW5lTnVtYmVycyh0cnVlKTsKICAgICAgfQogICAgfSwKICAgIHNldEluZGVudFVuaXQ6IGZ1bmN0aW9uKHVuaXQpIHt0aGlzLndpbi5pbmRlbnRVbml0ID0gdW5pdDt9LAogICAgc2V0VW5kb0RlcHRoOiBmdW5jdGlvbihkZXB0aCkge3RoaXMuZWRpdG9yLmhpc3RvcnkubWF4RGVwdGggPSBkZXB0aDt9LAogICAgc2V0VGFiTW9kZTogZnVuY3Rpb24obW9kZSkge3RoaXMub3B0aW9ucy50YWJNb2RlID0gbW9kZTt9LAogICAgc2V0TGluZU51bWJlcnM6IGZ1bmN0aW9uKG9uKSB7CiAgICAgIGlmIChvbiAmJiAhdGhpcy5saW5lTnVtYmVycykgewogICAgICAgIHRoaXMubGluZU51bWJlcnMgPSBhZGRMaW5lTnVtYmVyRGl2KHRoaXMud3JhcHBpbmcpOwogICAgICAgIHRoaXMuYWN0aXZhdGVMaW5lTnVtYmVycygpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKCFvbiAmJiB0aGlzLmxpbmVOdW1iZXJzKSB7CiAgICAgICAgdGhpcy53cmFwcGluZy5yZW1vdmVDaGlsZCh0aGlzLmxpbmVOdW1iZXJzKTsKICAgICAgICB0aGlzLndyYXBwaW5nLnN0eWxlLm1hcmdpbkxlZnQgPSAiIjsKICAgICAgICB0aGlzLmxpbmVOdW1iZXJzID0gbnVsbDsKICAgICAgfQogICAgfSwKCiAgICBjdXJzb3JQb3NpdGlvbjogZnVuY3Rpb24oc3RhcnQpIHt0aGlzLmZvY3VzSWZJRSgpOyByZXR1cm4gdGhpcy5lZGl0b3IuY3Vyc29yUG9zaXRpb24oc3RhcnQpO30sCiAgICBmaXJzdExpbmU6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmVkaXRvci5maXJzdExpbmUoKTt9LAogICAgbGFzdExpbmU6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmVkaXRvci5sYXN0TGluZSgpO30sCiAgICBuZXh0TGluZTogZnVuY3Rpb24obGluZSkge3JldHVybiB0aGlzLmVkaXRvci5uZXh0TGluZShsaW5lKTt9LAogICAgcHJldkxpbmU6IGZ1bmN0aW9uKGxpbmUpIHtyZXR1cm4gdGhpcy5lZGl0b3IucHJldkxpbmUobGluZSk7fSwKICAgIGxpbmVDb250ZW50OiBmdW5jdGlvbihsaW5lKSB7cmV0dXJuIHRoaXMuZWRpdG9yLmxpbmVDb250ZW50KGxpbmUpO30sCiAgICBzZXRMaW5lQ29udGVudDogZnVuY3Rpb24obGluZSwgY29udGVudCkge3RoaXMuZWRpdG9yLnNldExpbmVDb250ZW50KGxpbmUsIGNvbnRlbnQpO30sCiAgICByZW1vdmVMaW5lOiBmdW5jdGlvbihsaW5lKXt0aGlzLmVkaXRvci5yZW1vdmVMaW5lKGxpbmUpO30sCiAgICBpbnNlcnRJbnRvTGluZTogZnVuY3Rpb24obGluZSwgcG9zaXRpb24sIGNvbnRlbnQpIHt0aGlzLmVkaXRvci5pbnNlcnRJbnRvTGluZShsaW5lLCBwb3NpdGlvbiwgY29udGVudCk7fSwKICAgIHNlbGVjdExpbmVzOiBmdW5jdGlvbihzdGFydExpbmUsIHN0YXJ0T2Zmc2V0LCBlbmRMaW5lLCBlbmRPZmZzZXQpIHsKICAgICAgdGhpcy53aW4uZm9jdXMoKTsKICAgICAgdGhpcy5lZGl0b3Iuc2VsZWN0TGluZXMoc3RhcnRMaW5lLCBzdGFydE9mZnNldCwgZW5kTGluZSwgZW5kT2Zmc2V0KTsKICAgIH0sCiAgICBudGhMaW5lOiBmdW5jdGlvbihuKSB7CiAgICAgIHZhciBsaW5lID0gdGhpcy5maXJzdExpbmUoKTsKICAgICAgZm9yICg7IG4gPiAxICYmIGxpbmUgIT09IGZhbHNlOyBuLS0pCiAgICAgICAgbGluZSA9IHRoaXMubmV4dExpbmUobGluZSk7CiAgICAgIHJldHVybiBsaW5lOwogICAgfSwKICAgIGxpbmVOdW1iZXI6IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdmFyIG51bSA9IDA7CiAgICAgIHdoaWxlIChsaW5lICE9PSBmYWxzZSkgewogICAgICAgIG51bSsrOwogICAgICAgIGxpbmUgPSB0aGlzLnByZXZMaW5lKGxpbmUpOwogICAgICB9CiAgICAgIHJldHVybiBudW07CiAgICB9LAogICAganVtcFRvTGluZTogZnVuY3Rpb24obGluZSkgewogICAgICBpZiAodHlwZW9mIGxpbmUgPT0gIm51bWJlciIpIGxpbmUgPSB0aGlzLm50aExpbmUobGluZSk7CiAgICAgIHRoaXMuc2VsZWN0TGluZXMobGluZSwgMCk7CiAgICAgIHRoaXMud2luLmZvY3VzKCk7CiAgICB9LAogICAgY3VycmVudExpbmU6IGZ1bmN0aW9uKCkgeyAvLyBEZXByZWNhdGVkLCBidXQgc3RpbGwgdGhlcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICAgcmV0dXJuIHRoaXMubGluZU51bWJlcih0aGlzLmN1cnNvckxpbmUoKSk7CiAgICB9LAogICAgY3Vyc29yTGluZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLmN1cnNvclBvc2l0aW9uKCkubGluZTsKICAgIH0sCiAgICBjdXJzb3JDb29yZHM6IGZ1bmN0aW9uKHN0YXJ0KSB7cmV0dXJuIHRoaXMuZWRpdG9yLmN1cnNvckNvb3JkcyhzdGFydCk7fSwKCiAgICBhY3RpdmF0ZUxpbmVOdW1iZXJzOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGZyYW1lID0gdGhpcy5mcmFtZSwgd2luID0gZnJhbWUuY29udGVudFdpbmRvdywgZG9jID0gd2luLmRvY3VtZW50LCBib2R5ID0gZG9jLmJvZHksCiAgICAgICAgICBudW1zID0gdGhpcy5saW5lTnVtYmVycywgc2Nyb2xsZXIgPSBudW1zLmZpcnN0Q2hpbGQsIHNlbGYgPSB0aGlzOwogICAgICB2YXIgYmFyV2lkdGggPSBudWxsOwoKICAgICAgZnVuY3Rpb24gc2l6ZUJhcigpIHsKICAgICAgICBpZiAoZnJhbWUub2Zmc2V0V2lkdGggPT0gMCkgcmV0dXJuOwogICAgICAgIGZvciAodmFyIHJvb3QgPSBmcmFtZTsgcm9vdC5wYXJlbnROb2RlOyByb290ID0gcm9vdC5wYXJlbnROb2RlKTsKICAgICAgICBpZiAoIW51bXMucGFyZW50Tm9kZSB8fCByb290ICE9IGRvY3VtZW50IHx8ICF3aW4uRWRpdG9yKSB7CiAgICAgICAgICAvLyBDbGVhciBldmVudCBoYW5kbGVycyAodGhlaXIgbm9kZXMgbWlnaHQgYWxyZWFkeSBiZSBjb2xsZWN0ZWQsIHNvIHRyeS9jYXRjaCkKICAgICAgICAgIHRyeXtjbGVhcigpO31jYXRjaChlKXt9CiAgICAgICAgICBjbGVhckludGVydmFsKHNpemVJbnRlcnZhbCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAobnVtcy5vZmZzZXRXaWR0aCAhPSBiYXJXaWR0aCkgewogICAgICAgICAgYmFyV2lkdGggPSBudW1zLm9mZnNldFdpZHRoOwogICAgICAgICAgZnJhbWUucGFyZW50Tm9kZS5zdHlsZS5wYWRkaW5nTGVmdCA9IGJhcldpZHRoICsgInB4IjsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZG9TY3JvbGwoKSB7CiAgICAgICAgbnVtcy5zY3JvbGxUb3AgPSBib2R5LnNjcm9sbFRvcCB8fCBkb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCAwOwogICAgICB9CiAgICAgIC8vIENsZWFudXAgZnVuY3Rpb24sIHJlZ2lzdGVyZWQgYnkgbm9uV3JhcHBpbmcgYW5kIHdyYXBwaW5nLgogICAgICB2YXIgY2xlYXIgPSBmdW5jdGlvbigpe307CiAgICAgIHNpemVCYXIoKTsKICAgICAgdmFyIHNpemVJbnRlcnZhbCA9IHNldEludGVydmFsKHNpemVCYXIsIDUwMCk7CgogICAgICBmdW5jdGlvbiBlbnN1cmVFbm91Z2hMaW5lTnVtYmVycyhmaWxsKSB7CiAgICAgICAgdmFyIGxpbmVIZWlnaHQgPSBzY3JvbGxlci5maXJzdENoaWxkLm9mZnNldEhlaWdodDsKICAgICAgICBpZiAobGluZUhlaWdodCA9PSAwKSByZXR1cm47CiAgICAgICAgdmFyIHRhcmdldEhlaWdodCA9IDUwICsgTWF0aC5tYXgoYm9keS5vZmZzZXRIZWlnaHQsIE1hdGgubWF4KGZyYW1lLm9mZnNldEhlaWdodCwgYm9keS5zY3JvbGxIZWlnaHQgfHwgMCkpLAogICAgICAgICAgICBsYXN0TnVtYmVyID0gTWF0aC5jZWlsKHRhcmdldEhlaWdodCAvIGxpbmVIZWlnaHQpOwogICAgICAgIGZvciAodmFyIGkgPSBzY3JvbGxlci5jaGlsZE5vZGVzLmxlbmd0aDsgaSA8PSBsYXN0TnVtYmVyOyBpKyspIHsKICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKTsKICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShmaWxsID8gU3RyaW5nKGkgKyAxKSA6ICJcdTAwYTAiKSk7CiAgICAgICAgICBzY3JvbGxlci5hcHBlbmRDaGlsZChkaXYpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gbm9uV3JhcHBpbmcoKSB7CiAgICAgICAgZnVuY3Rpb24gdXBkYXRlKCkgewogICAgICAgICAgZW5zdXJlRW5vdWdoTGluZU51bWJlcnModHJ1ZSk7CiAgICAgICAgICBkb1Njcm9sbCgpOwogICAgICAgIH0KICAgICAgICBzZWxmLnVwZGF0ZU51bWJlcnMgPSB1cGRhdGU7CiAgICAgICAgdmFyIG9uU2Nyb2xsID0gd2luLmFkZEV2ZW50SGFuZGxlcih3aW4sICJzY3JvbGwiLCBkb1Njcm9sbCwgdHJ1ZSksCiAgICAgICAgICAgIG9uUmVzaXplID0gd2luLmFkZEV2ZW50SGFuZGxlcih3aW4sICJyZXNpemUiLCB1cGRhdGUsIHRydWUpOwogICAgICAgIGNsZWFyID0gZnVuY3Rpb24oKXsKICAgICAgICAgIG9uU2Nyb2xsKCk7IG9uUmVzaXplKCk7CiAgICAgICAgICBpZiAoc2VsZi51cGRhdGVOdW1iZXJzID09IHVwZGF0ZSkgc2VsZi51cGRhdGVOdW1iZXJzID0gbnVsbDsKICAgICAgICB9OwogICAgICAgIHVwZGF0ZSgpOwogICAgICB9CgogICAgICBmdW5jdGlvbiB3cmFwcGluZygpIHsKICAgICAgICB2YXIgbm9kZSwgbGluZU51bSwgbmV4dCwgcG9zLCBjaGFuZ2VzID0gW10sIHN0eWxlTnVtcyA9IHNlbGYub3B0aW9ucy5zdHlsZU51bWJlcnM7CgogICAgICAgIGZ1bmN0aW9uIHNldE51bShuLCBub2RlKSB7CiAgICAgICAgICAvLyBEb2VzIG5vdCB0eXBpY2FsbHkgaGFwcGVuIChidXQgY2FuLCBpZiB5b3UgbWVzcyB3aXRoIHRoZQogICAgICAgICAgLy8gZG9jdW1lbnQgZHVyaW5nIHRoZSBudW1iZXJpbmcpCiAgICAgICAgICBpZiAoIWxpbmVOdW0pIGxpbmVOdW0gPSBzY3JvbGxlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSk7CiAgICAgICAgICBpZiAoc3R5bGVOdW1zKSBzdHlsZU51bXMobGluZU51bSwgbm9kZSwgbik7CiAgICAgICAgICAvLyBDaGFuZ2VzIGFyZSBhY2N1bXVsYXRlZCwgc28gdGhhdCB0aGUgZG9jdW1lbnQgbGF5b3V0CiAgICAgICAgICAvLyBkb2Vzbid0IGhhdmUgdG8gYmUgcmVjb21wdXRlZCBkdXJpbmcgdGhlIHBhc3MKICAgICAgICAgIGNoYW5nZXMucHVzaChsaW5lTnVtKTsgY2hhbmdlcy5wdXNoKG4pOwogICAgICAgICAgcG9zID0gbGluZU51bS5vZmZzZXRIZWlnaHQgKyBsaW5lTnVtLm9mZnNldFRvcDsKICAgICAgICAgIGxpbmVOdW0gPSBsaW5lTnVtLm5leHRTaWJsaW5nOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjb21taXRDaGFuZ2VzKCkgewogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSArPSAyKQogICAgICAgICAgICBjaGFuZ2VzW2ldLmlubmVySFRNTCA9IGNoYW5nZXNbaSArIDFdOwogICAgICAgICAgY2hhbmdlcyA9IFtdOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiB3b3JrKCkgewogICAgICAgICAgaWYgKCFzY3JvbGxlci5wYXJlbnROb2RlIHx8IHNjcm9sbGVyLnBhcmVudE5vZGUgIT0gc2VsZi5saW5lTnVtYmVycykgcmV0dXJuOwoKICAgICAgICAgIHZhciBlbmRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgKyBzZWxmLm9wdGlvbnMubGluZU51bWJlclRpbWU7CiAgICAgICAgICB3aGlsZSAobm9kZSkgewogICAgICAgICAgICBzZXROdW0obmV4dCsrLCBub2RlLnByZXZpb3VzU2libGluZyk7CiAgICAgICAgICAgIGZvciAoOyBub2RlICYmICF3aW4uaXNCUihub2RlKTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpIHsKICAgICAgICAgICAgICB2YXIgYm90dCA9IG5vZGUub2Zmc2V0VG9wICsgbm9kZS5vZmZzZXRIZWlnaHQ7CiAgICAgICAgICAgICAgd2hpbGUgKHNjcm9sbGVyLm9mZnNldEhlaWdodCAmJiBib3R0IC0gMyA+IHBvcykgc2V0TnVtKCImbmJzcDsiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobm9kZSkgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CiAgICAgICAgICAgIGlmIChuZXcgRGF0ZSgpLmdldFRpbWUoKSA+IGVuZFRpbWUpIHsKICAgICAgICAgICAgICBjb21taXRDaGFuZ2VzKCk7CiAgICAgICAgICAgICAgcGVuZGluZyA9IHNldFRpbWVvdXQod29yaywgc2VsZi5vcHRpb25zLmxpbmVOdW1iZXJEZWxheSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAobGluZU51bSkgc2V0TnVtKG5leHQrKyk7CiAgICAgICAgICBjb21taXRDaGFuZ2VzKCk7CiAgICAgICAgICBkb1Njcm9sbCgpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBzdGFydChmaXJzdFRpbWUpIHsKICAgICAgICAgIGRvU2Nyb2xsKCk7CiAgICAgICAgICBlbnN1cmVFbm91Z2hMaW5lTnVtYmVycyhmaXJzdFRpbWUpOwogICAgICAgICAgbm9kZSA9IGJvZHkuZmlyc3RDaGlsZDsKICAgICAgICAgIGxpbmVOdW0gPSBzY3JvbGxlci5maXJzdENoaWxkOwogICAgICAgICAgcG9zID0gMDsKICAgICAgICAgIG5leHQgPSAxOwogICAgICAgICAgd29yaygpOwogICAgICAgIH0KCiAgICAgICAgc3RhcnQodHJ1ZSk7CiAgICAgICAgdmFyIHBlbmRpbmcgPSBudWxsOwogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZSgpIHsKICAgICAgICAgIGlmIChwZW5kaW5nKSBjbGVhclRpbWVvdXQocGVuZGluZyk7CiAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IuYWxsQ2xlYW4oKSkgc3RhcnQoKTsKICAgICAgICAgIGVsc2UgcGVuZGluZyA9IHNldFRpbWVvdXQodXBkYXRlLCAyMDApOwogICAgICAgIH0KICAgICAgICBzZWxmLnVwZGF0ZU51bWJlcnMgPSB1cGRhdGU7CiAgICAgICAgdmFyIG9uU2Nyb2xsID0gd2luLmFkZEV2ZW50SGFuZGxlcih3aW4sICJzY3JvbGwiLCBkb1Njcm9sbCwgdHJ1ZSksCiAgICAgICAgICAgIG9uUmVzaXplID0gd2luLmFkZEV2ZW50SGFuZGxlcih3aW4sICJyZXNpemUiLCB1cGRhdGUsIHRydWUpOwogICAgICAgIGNsZWFyID0gZnVuY3Rpb24oKXsKICAgICAgICAgIGlmIChwZW5kaW5nKSBjbGVhclRpbWVvdXQocGVuZGluZyk7CiAgICAgICAgICBpZiAoc2VsZi51cGRhdGVOdW1iZXJzID09IHVwZGF0ZSkgc2VsZi51cGRhdGVOdW1iZXJzID0gbnVsbDsKICAgICAgICAgIG9uU2Nyb2xsKCk7CiAgICAgICAgICBvblJlc2l6ZSgpOwogICAgICAgIH07CiAgICAgIH0KICAgICAgKHRoaXMub3B0aW9ucy50ZXh0V3JhcHBpbmcgfHwgdGhpcy5vcHRpb25zLnN0eWxlTnVtYmVycyA/IHdyYXBwaW5nIDogbm9uV3JhcHBpbmcpKCk7CiAgICB9LAoKICAgIHNldER5bmFtaWNIZWlnaHQ6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgc2VsZiA9IHRoaXMsIGFjdGl2aXR5ID0gc2VsZi5vcHRpb25zLmN1cnNvckFjdGl2aXR5LCB3aW4gPSBzZWxmLndpbiwgYm9keSA9IHdpbi5kb2N1bWVudC5ib2R5LAogICAgICAgICAgbGluZUhlaWdodCA9IG51bGwsIHRpbWVvdXQgPSBudWxsLCB2bWFyZ2luID0gMiAqIHNlbGYuZnJhbWUub2Zmc2V0VG9wOwogICAgICBib2R5LnN0eWxlLm92ZXJmbG93WSA9ICJoaWRkZW4iOwogICAgICB3aW4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9ICJoaWRkZW4iOwogICAgICB0aGlzLmZyYW1lLnNjcm9sbGluZyA9ICJubyI7CgogICAgICBmdW5jdGlvbiB1cGRhdGVIZWlnaHQoKSB7CiAgICAgICAgZm9yICh2YXIgc3BhbiA9IGJvZHkuZmlyc3RDaGlsZCwgc2F3QlIgPSBmYWxzZTsgc3Bhbjsgc3BhbiA9IHNwYW4ubmV4dFNpYmxpbmcpCiAgICAgICAgICBpZiAod2luLmlzU3BhbihzcGFuKSAmJiBzcGFuLm9mZnNldEhlaWdodCkgewogICAgICAgICAgICBsaW5lSGVpZ2h0ID0gc3Bhbi5vZmZzZXRIZWlnaHQ7CiAgICAgICAgICAgIGlmICghc2F3QlIpIHZtYXJnaW4gPSAyICogKHNlbGYuZnJhbWUub2Zmc2V0VG9wICsgc3Bhbi5vZmZzZXRUb3AgKyBib2R5Lm9mZnNldFRvcCArIChpbnRlcm5ldEV4cGxvcmVyID8gMTAgOiAwKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIGlmIChsaW5lSGVpZ2h0KQogICAgICAgICAgc2VsZi53cmFwcGluZy5zdHlsZS5oZWlnaHQgPSBNYXRoLm1heCh2bWFyZ2luICsgbGluZUhlaWdodCAqIChib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJCUiIpLmxlbmd0aCArIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWluSGVpZ2h0KSArICJweCI7CiAgICAgIH0KICAgICAgc2V0VGltZW91dCh1cGRhdGVIZWlnaHQsIDEwMCk7CiAgICAgIHNlbGYub3B0aW9ucy5jdXJzb3JBY3Rpdml0eSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICBpZiAoYWN0aXZpdHkpIGFjdGl2aXR5KHgpOwogICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTsKICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCh1cGRhdGVIZWlnaHQsIDIwMCk7CiAgICAgIH07CiAgICB9CiAgfTsKCiAgQ29kZU1pcnJvci5JbnZhbGlkTGluZUhhbmRsZSA9IHt0b1N0cmluZzogZnVuY3Rpb24oKXtyZXR1cm4gIkNvZGVNaXJyb3IuSW52YWxpZExpbmVIYW5kbGUiO319OwoKICBDb2RlTWlycm9yLnJlcGxhY2UgPSBmdW5jdGlvbihlbGVtZW50KSB7CiAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT0gInN0cmluZyIpCiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50KTsKICAgIHJldHVybiBmdW5jdGlvbihuZXdFbGVtZW50KSB7CiAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3RWxlbWVudCwgZWxlbWVudCk7CiAgICB9OwogIH07CgogIENvZGVNaXJyb3IuZnJvbVRleHRBcmVhID0gZnVuY3Rpb24oYXJlYSwgb3B0aW9ucykgewogICAgaWYgKHR5cGVvZiBhcmVhID09ICJzdHJpbmciKQogICAgICBhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYXJlYSk7CgogICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICBpZiAoYXJlYS5zdHlsZS53aWR0aCAmJiBvcHRpb25zLndpZHRoID09IG51bGwpCiAgICAgIG9wdGlvbnMud2lkdGggPSBhcmVhLnN0eWxlLndpZHRoOwogICAgaWYgKGFyZWEuc3R5bGUuaGVpZ2h0ICYmIG9wdGlvbnMuaGVpZ2h0ID09IG51bGwpCiAgICAgIG9wdGlvbnMuaGVpZ2h0ID0gYXJlYS5zdHlsZS5oZWlnaHQ7CiAgICBpZiAob3B0aW9ucy5jb250ZW50ID09IG51bGwpIG9wdGlvbnMuY29udGVudCA9IGFyZWEudmFsdWU7CgogICAgaWYgKGFyZWEuZm9ybSkgewogICAgICBmdW5jdGlvbiB1cGRhdGVGaWVsZCgpIHsKICAgICAgICBhcmVhLnZhbHVlID0gbWlycm9yLmdldENvZGUoKTsKICAgICAgfQogICAgICBpZiAodHlwZW9mIGFyZWEuZm9ybS5hZGRFdmVudExpc3RlbmVyID09ICJmdW5jdGlvbiIpCiAgICAgICAgYXJlYS5mb3JtLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIHVwZGF0ZUZpZWxkLCBmYWxzZSk7CiAgICAgIGVsc2UKICAgICAgICBhcmVhLmZvcm0uYXR0YWNoRXZlbnQoIm9uc3VibWl0IiwgdXBkYXRlRmllbGQpOwogICAgICB2YXIgcmVhbFN1Ym1pdCA9IGFyZWEuZm9ybS5zdWJtaXQ7CiAgICAgIGZ1bmN0aW9uIHdyYXBTdWJtaXQoKSB7CiAgICAgICAgdXBkYXRlRmllbGQoKTsKICAgICAgICAvLyBDYW4ndCB1c2UgcmVhbFN1Ym1pdC5hcHBseSBiZWNhdXNlIElFNiBpcyB0b28gc3R1cGlkCiAgICAgICAgYXJlYS5mb3JtLnN1Ym1pdCA9IHJlYWxTdWJtaXQ7CiAgICAgICAgYXJlYS5mb3JtLnN1Ym1pdCgpOwogICAgICAgIGFyZWEuZm9ybS5zdWJtaXQgPSB3cmFwU3VibWl0OwogICAgICB9CiAgICAgIGFyZWEuZm9ybS5zdWJtaXQgPSB3cmFwU3VibWl0OwogICAgfQoKICAgIGZ1bmN0aW9uIGluc2VydChmcmFtZSkgewogICAgICBpZiAoYXJlYS5uZXh0U2libGluZykKICAgICAgICBhcmVhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGZyYW1lLCBhcmVhLm5leHRTaWJsaW5nKTsKICAgICAgZWxzZQogICAgICAgIGFyZWEucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChmcmFtZSk7CiAgICB9CgogICAgYXJlYS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgdmFyIG1pcnJvciA9IG5ldyBDb2RlTWlycm9yKGluc2VydCwgb3B0aW9ucyk7CiAgICBtaXJyb3IudG9UZXh0QXJlYSA9IGZ1bmN0aW9uKCkgewogICAgICBhcmVhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobWlycm9yLndyYXBwaW5nKTsKICAgICAgYXJlYS5zdHlsZS5kaXNwbGF5ID0gIiI7CiAgICAgIGlmIChhcmVhLmZvcm0pIHsKICAgICAgICBhcmVhLmZvcm0uc3VibWl0ID0gcmVhbFN1Ym1pdDsKICAgICAgICBpZiAodHlwZW9mIGFyZWEuZm9ybS5yZW1vdmVFdmVudExpc3RlbmVyID09ICJmdW5jdGlvbiIpCiAgICAgICAgICBhcmVhLmZvcm0ucmVtb3ZlRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgdXBkYXRlRmllbGQsIGZhbHNlKTsKICAgICAgICBlbHNlCiAgICAgICAgICBhcmVhLmZvcm0uZGV0YWNoRXZlbnQoIm9uc3VibWl0IiwgdXBkYXRlRmllbGQpOwogICAgICB9CiAgICB9OwoKICAgIHJldHVybiBtaXJyb3I7CiAgfTsKCiAgQ29kZU1pcnJvci5pc1Byb2JhYmx5U3VwcG9ydGVkID0gZnVuY3Rpb24oKSB7CiAgICAvLyBUaGlzIGlzIHJhdGhlciBhd2Z1bCwgYnV0IGNhbiBiZSB1c2VmdWwuCiAgICB2YXIgbWF0Y2g7CiAgICBpZiAod2luZG93Lm9wZXJhKQogICAgICByZXR1cm4gTnVtYmVyKHdpbmRvdy5vcGVyYS52ZXJzaW9uKCkpID49IDkuNTI7CiAgICBlbHNlIGlmICgvQXBwbGUgQ29tcHV0ZXJzLCBJbmMvLnRlc3QobmF2aWdhdG9yLnZlbmRvcikgJiYgKG1hdGNoID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvVmVyc2lvblwvKFxkKyg/OlwuXGQrKT8pXC4vKSkpCiAgICAgIHJldHVybiBOdW1iZXIobWF0Y2hbMV0pID49IDM7CiAgICBlbHNlIGlmIChkb2N1bWVudC5zZWxlY3Rpb24gJiYgd2luZG93LkFjdGl2ZVhPYmplY3QgJiYgKG1hdGNoID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTVNJRSAoXGQrKD86XC5cZCopPylcYi8pKSkKICAgICAgcmV0dXJuIE51bWJlcihtYXRjaFsxXSkgPj0gNjsKICAgIGVsc2UgaWYgKG1hdGNoID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvZ2Vja29cLyhcZHs4fSkvaSkpCiAgICAgIHJldHVybiBOdW1iZXIobWF0Y2hbMV0pID49IDIwMDUwOTAxOwogICAgZWxzZSBpZiAobWF0Y2ggPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvKFxkKykvKSkKICAgICAgcmV0dXJuIE51bWJlcihtYXRjaFsxXSkgPj0gNTI1OwogICAgZWxzZQogICAgICByZXR1cm4gbnVsbDsKICB9OwoKICByZXR1cm4gQ29kZU1pcnJvcjsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/editor.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogVGhlIEVkaXRvciBvYmplY3QgbWFuYWdlcyB0aGUgY29udGVudCBvZiB0aGUgZWRpdGFibGUgZnJhbWUuIEl0CiAqIGNhdGNoZXMgZXZlbnRzLCBjb2xvdXJzIG5vZGVzLCBhbmQgaW5kZW50cyBsaW5lcy4gVGhpcyBmaWxlIGFsc28KICogaG9sZHMgc29tZSBmdW5jdGlvbnMgZm9yIHRyYW5zZm9ybWluZyBhcmJpdHJhcnkgRE9NIHN0cnVjdHVyZXMgaW50bwogKiBwbGFpbiBzZXF1ZW5jZXMgb2YgPHNwYW4+IGFuZCA8YnI+IGVsZW1lbnRzCiAqLwoKdmFyIGludGVybmV0RXhwbG9yZXIgPSBkb2N1bWVudC5zZWxlY3Rpb24gJiYgd2luZG93LkFjdGl2ZVhPYmplY3QgJiYgL01TSUUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CnZhciB3ZWJraXQgPSAvQXBwbGVXZWJLaXQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CnZhciBzYWZhcmkgPSAvQXBwbGUgQ29tcHV0ZXJzLCBJbmMvLnRlc3QobmF2aWdhdG9yLnZlbmRvcik7CnZhciBnZWNrbyA9IC9nZWNrb1wvKFxkezh9KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7Ci8vIFRPRE8gdGhpcyBpcyByZWxhdGVkIHRvIHRoZSBiYWNrc3BhY2UtYXQtZW5kLW9mLWxpbmUgYnVnLiBSZW1vdmUKLy8gdGhpcyBpZiBPcGVyYSBnZXRzIHRoZWlyIGFjdCB0b2dldGhlciwgbWFrZSB0aGUgdmVyc2lvbiBjaGVjayBtb3JlCi8vIGJyb2FkIGlmIHRoZXkgZG9uJ3QuCnZhciBicm9rZW5PcGVyYSA9IHdpbmRvdy5vcGVyYSAmJiAvVmVyc2lvblwvMTAuWzU2XS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKCi8vIE1ha2Ugc3VyZSBhIHN0cmluZyBkb2VzIG5vdCBjb250YWluIHR3byBjb25zZWN1dGl2ZSAnY29sbGFwc2VhYmxlJwovLyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCmZ1bmN0aW9uIG1ha2VXaGl0ZVNwYWNlKG4pIHsKICB2YXIgYnVmZmVyID0gW10sIG5iID0gdHJ1ZTsKICBmb3IgKDsgbiA+IDA7IG4tLSkgewogICAgYnVmZmVyLnB1c2goKG5iIHx8IG4gPT0gMSkgPyBuYnNwIDogIiAiKTsKICAgIG5iIF49IHRydWU7CiAgfQogIHJldHVybiBidWZmZXIuam9pbigiIik7Cn0KCi8vIENyZWF0ZSBhIHNldCBvZiB3aGl0ZS1zcGFjZSBjaGFyYWN0ZXJzIHRoYXQgd2lsbCBub3QgYmUgY29sbGFwc2VkCi8vIGJ5IHRoZSBicm93c2VyLCBidXQgd2lsbCBub3QgYnJlYWsgdGV4dC13cmFwcGluZyBlaXRoZXIuCmZ1bmN0aW9uIGZpeFNwYWNlcyhzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmNoYXJBdCgwKSA9PSAiICIpIHN0cmluZyA9IG5ic3AgKyBzdHJpbmcuc2xpY2UoMSk7CiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cdC9nLCBmdW5jdGlvbigpIHtyZXR1cm4gbWFrZVdoaXRlU3BhY2UoaW5kZW50VW5pdCk7fSkKICAgIC5yZXBsYWNlKC9bIFx1MDBhMF17Mix9L2csIGZ1bmN0aW9uKHMpIHtyZXR1cm4gbWFrZVdoaXRlU3BhY2Uocy5sZW5ndGgpO30pOwp9CgpmdW5jdGlvbiBjbGVhblRleHQodGV4dCkgewogIHJldHVybiB0ZXh0LnJlcGxhY2UoL1x1MDBhMC9nLCAiICIpOwp9CgovLyBDcmVhdGUgYSBTUEFOIG5vZGUgd2l0aCB0aGUgZXhwZWN0ZWQgcHJvcGVydGllcyBmb3IgZG9jdW1lbnQgcGFydAovLyBzcGFucy4KZnVuY3Rpb24gbWFrZVBhcnRTcGFuKHZhbHVlLCBkb2MpIHsKICB2YXIgdGV4dCA9IHZhbHVlOwogIGlmICh2YWx1ZS5ub2RlVHlwZSA9PSAzKSB0ZXh0ID0gdmFsdWUubm9kZVZhbHVlOwogIGVsc2UgdmFsdWUgPSBkb2MuY3JlYXRlVGV4dE5vZGUodGV4dCk7CgogIHZhciBzcGFuID0gZG9jLmNyZWF0ZUVsZW1lbnQoIlNQQU4iKTsKICBzcGFuLmlzUGFydCA9IHRydWU7CiAgc3Bhbi5hcHBlbmRDaGlsZCh2YWx1ZSk7CiAgc3Bhbi5jdXJyZW50VGV4dCA9IHRleHQ7CiAgcmV0dXJuIHNwYW47Cn0KCnZhciBFZGl0b3IgPSAoZnVuY3Rpb24oKXsKICAvLyBUaGUgSFRNTCBlbGVtZW50cyB3aG9zZSBjb250ZW50IHNob3VsZCBiZSBzdWZmaXhlZCBieSBhIG5ld2xpbmUKICAvLyB3aGVuIGNvbnZlcnRpbmcgdGhlbSB0byBmbGF0IHRleHQuCiAgdmFyIG5ld2xpbmVFbGVtZW50cyA9IHsiUCI6IHRydWUsICJESVYiOiB0cnVlLCAiTEkiOiB0cnVlfTsKCiAgZnVuY3Rpb24gYXNFZGl0b3JMaW5lcyhzdHJpbmcpIHsKICAgIHZhciB0YWIgPSBtYWtlV2hpdGVTcGFjZShpbmRlbnRVbml0KTsKICAgIHJldHVybiBtYXAoc3RyaW5nLnJlcGxhY2UoL1x0L2csIHRhYikucmVwbGFjZSgvXHUwMGEwL2csICIgIikucmVwbGFjZSgvXHJcbj8vZywgIlxuIikuc3BsaXQoIlxuIiksIGZpeFNwYWNlcyk7CiAgfQoKICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHRyYXZlcnNlRE9NLiBGbGF0dGVucyBhbiBhcmJpdHJhcnkgRE9NIG5vZGUKICAvLyBpbnRvIGFuIGFycmF5IG9mIHRleHRub2RlcyBhbmQgPGJyPiB0YWdzLgogIGZ1bmN0aW9uIHNpbXBsaWZ5RE9NKHJvb3QsIGF0RW5kKSB7CiAgICB2YXIgZG9jID0gcm9vdC5vd25lckRvY3VtZW50OwogICAgdmFyIHJlc3VsdCA9IFtdOwogICAgdmFyIGxlYXZpbmcgPSB0cnVlOwoKICAgIGZ1bmN0aW9uIHNpbXBsaWZ5Tm9kZShub2RlLCB0b3ApIHsKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykgewogICAgICAgIHZhciB0ZXh0ID0gbm9kZS5ub2RlVmFsdWUgPSBmaXhTcGFjZXMobm9kZS5ub2RlVmFsdWUucmVwbGFjZSgvXHIvZywgIiIpLnJlcGxhY2UoL1xuL2csICIgIikpOwogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCkgbGVhdmluZyA9IGZhbHNlOwogICAgICAgIHJlc3VsdC5wdXNoKG5vZGUpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGlzQlIobm9kZSkgJiYgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgbGVhdmluZyA9IHRydWU7CiAgICAgICAgcmVzdWx0LnB1c2gobm9kZSk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgZm9yICh2YXIgbiA9IG5vZGUuZmlyc3RDaGlsZDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcpIHNpbXBsaWZ5Tm9kZShuKTsKICAgICAgICBpZiAoIWxlYXZpbmcgJiYgbmV3bGluZUVsZW1lbnRzLmhhc093blByb3BlcnR5KG5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSkpIHsKICAgICAgICAgIGxlYXZpbmcgPSB0cnVlOwogICAgICAgICAgaWYgKCFhdEVuZCB8fCAhdG9wKQogICAgICAgICAgICByZXN1bHQucHVzaChkb2MuY3JlYXRlRWxlbWVudCgiQlIiKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgc2ltcGxpZnlOb2RlKHJvb3QsIHRydWUpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIENyZWF0ZXMgYSBNb2NoaUtpdC1zdHlsZSBpdGVyYXRvciB0aGF0IGdvZXMgb3ZlciBhIHNlcmllcyBvZiBET00KICAvLyBub2Rlcy4gVGhlIHZhbHVlcyBpdCB5aWVsZHMgYXJlIHN0cmluZ3MsIHRoZSB0ZXh0dWFsIGNvbnRlbnQgb2YKICAvLyB0aGUgbm9kZXMuIEl0IG1ha2VzIHN1cmUgdGhhdCBhbGwgbm9kZXMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUKICAvLyBvbmUgd2hvc2UgdGV4dCBpcyBiZWluZyB5aWVsZGVkIGhhdmUgYmVlbiAnbm9ybWFsaXplZCcgdG8gYmUganVzdAogIC8vIDxzcGFuPiBhbmQgPGJyPiBlbGVtZW50cy4KICBmdW5jdGlvbiB0cmF2ZXJzZURPTShzdGFydCl7CiAgICB2YXIgb3duZXIgPSBzdGFydC5vd25lckRvY3VtZW50OwogICAgdmFyIG5vZGVRdWV1ZSA9IFtdOwoKICAgIC8vIENyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5zZXJ0IG5vZGVzIGFmdGVyIHRoZQogICAgLy8gb25lIGdpdmVuIGFzIGFyZ3VtZW50LgogICAgZnVuY3Rpb24gcG9pbnRBdChub2RlKXsKICAgICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTsKICAgICAgdmFyIG5leHQgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICByZXR1cm4gZnVuY3Rpb24obmV3bm9kZSkgewogICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3bm9kZSwgbmV4dCk7CiAgICAgIH07CiAgICB9CiAgICB2YXIgcG9pbnQgPSBudWxsOwoKICAgIC8vIFRoaXMgYW4gT3BlcmEtc3BlY2lmaWMgaGFjayAtLSBhbHdheXMgaW5zZXJ0IGFuIGVtcHR5IHNwYW4KICAgIC8vIGJldHdlZW4gdHdvIEJScywgYmVjYXVzZSBPcGVyYSdzIGN1cnNvciBjb2RlIGdldHMgdGVycmlibHkKICAgIC8vIGNvbmZ1c2VkIHdoZW4gdGhlIGN1cnNvciBpcyBiZXR3ZWVuIHR3byBCUnMuCiAgICB2YXIgYWZ0ZXJCUiA9IHRydWU7CgogICAgLy8gSW5zZXJ0IGEgbm9ybWFsaXplZCBub2RlIGF0IHRoZSBjdXJyZW50IHBvaW50LiBJZiBpdCBpcyBhIHRleHQKICAgIC8vIG5vZGUsIHdyYXAgaXQgaW4gYSA8c3Bhbj4sIGFuZCBnaXZlIHRoYXQgc3BhbiBhIGN1cnJlbnRUZXh0CiAgICAvLyBwcm9wZXJ0eSAtLSB0aGlzIGlzIHVzZWQgdG8gY2FjaGUgdGhlIG5vZGVWYWx1ZSwgYmVjYXVzZQogICAgLy8gZGlyZWN0bHkgYWNjZXNzaW5nIG5vZGVWYWx1ZSBpcyBob3JyaWJseSBzbG93IG9uIHNvbWUgYnJvd3NlcnMuCiAgICAvLyBUaGUgZGlydHkgcHJvcGVydHkgaXMgdXNlZCBieSB0aGUgaGlnaGxpZ2h0ZXIgdG8gZGV0ZXJtaW5lCiAgICAvLyB3aGljaCBwYXJ0cyBvZiB0aGUgZG9jdW1lbnQgaGF2ZSB0byBiZSByZS1oaWdobGlnaHRlZC4KICAgIGZ1bmN0aW9uIGluc2VydFBhcnQocGFydCl7CiAgICAgIHZhciB0ZXh0ID0gIlxuIjsKICAgICAgaWYgKHBhcnQubm9kZVR5cGUgPT0gMykgewogICAgICAgIHNlbGVjdC5zbmFwc2hvdENoYW5nZWQoKTsKICAgICAgICBwYXJ0ID0gbWFrZVBhcnRTcGFuKHBhcnQsIG93bmVyKTsKICAgICAgICB0ZXh0ID0gcGFydC5jdXJyZW50VGV4dDsKICAgICAgICBhZnRlckJSID0gZmFsc2U7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgaWYgKGFmdGVyQlIgJiYgd2luZG93Lm9wZXJhKQogICAgICAgICAgcG9pbnQobWFrZVBhcnRTcGFuKCIiLCBvd25lcikpOwogICAgICAgIGFmdGVyQlIgPSB0cnVlOwogICAgICB9CiAgICAgIHBhcnQuZGlydHkgPSB0cnVlOwogICAgICBub2RlUXVldWUucHVzaChwYXJ0KTsKICAgICAgcG9pbnQocGFydCk7CiAgICAgIHJldHVybiB0ZXh0OwogICAgfQoKICAgIC8vIEV4dHJhY3QgdGhlIHRleHQgYW5kIG5ld2xpbmVzIGZyb20gYSBET00gbm9kZSwgaW5zZXJ0IHRoZW0gaW50bwogICAgLy8gdGhlIGRvY3VtZW50LCBhbmQgcmV0dXJuIHRoZSB0ZXh0dWFsIGNvbnRlbnQuIFVzZWQgdG8gcmVwbGFjZQogICAgLy8gbm9uLW5vcm1hbGl6ZWQgbm9kZXMuCiAgICBmdW5jdGlvbiB3cml0ZU5vZGUobm9kZSwgZW5kKSB7CiAgICAgIHZhciBzaW1wbGlmaWVkID0gc2ltcGxpZnlET00obm9kZSwgZW5kKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaW1wbGlmaWVkLmxlbmd0aDsgaSsrKQogICAgICAgIHNpbXBsaWZpZWRbaV0gPSBpbnNlcnRQYXJ0KHNpbXBsaWZpZWRbaV0pOwogICAgICByZXR1cm4gc2ltcGxpZmllZC5qb2luKCIiKTsKICAgIH0KCiAgICAvLyBDaGVjayB3aGV0aGVyIGEgbm9kZSBpcyBhIG5vcm1hbGl6ZWQgPHNwYW4+IGVsZW1lbnQuCiAgICBmdW5jdGlvbiBwYXJ0Tm9kZShub2RlKXsKICAgICAgaWYgKG5vZGUuaXNQYXJ0ICYmIG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPT0gMSAmJiBub2RlLmZpcnN0Q2hpbGQubm9kZVR5cGUgPT0gMykgewogICAgICAgIG5vZGUuY3VycmVudFRleHQgPSBub2RlLmZpcnN0Q2hpbGQubm9kZVZhbHVlOwogICAgICAgIHJldHVybiAhL1tcblx0XHJdLy50ZXN0KG5vZGUuY3VycmVudFRleHQpOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBBZHZhbmNlIHRvIG5leHQgbm9kZSwgcmV0dXJuIHN0cmluZyBmb3IgY3VycmVudCBub2RlLgogICAgZnVuY3Rpb24gbmV4dCgpIHsKICAgICAgaWYgKCFzdGFydCkgdGhyb3cgU3RvcEl0ZXJhdGlvbjsKICAgICAgdmFyIG5vZGUgPSBzdGFydDsKICAgICAgc3RhcnQgPSBub2RlLm5leHRTaWJsaW5nOwoKICAgICAgaWYgKHBhcnROb2RlKG5vZGUpKXsKICAgICAgICBub2RlUXVldWUucHVzaChub2RlKTsKICAgICAgICBhZnRlckJSID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIG5vZGUuY3VycmVudFRleHQ7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoaXNCUihub2RlKSkgewogICAgICAgIGlmIChhZnRlckJSICYmIHdpbmRvdy5vcGVyYSkKICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobWFrZVBhcnRTcGFuKCIiLCBvd25lciksIG5vZGUpOwogICAgICAgIG5vZGVRdWV1ZS5wdXNoKG5vZGUpOwogICAgICAgIGFmdGVyQlIgPSB0cnVlOwogICAgICAgIHJldHVybiAiXG4iOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHZhciBlbmQgPSAhbm9kZS5uZXh0U2libGluZzsKICAgICAgICBwb2ludCA9IHBvaW50QXQobm9kZSk7CiAgICAgICAgcmVtb3ZlRWxlbWVudChub2RlKTsKICAgICAgICByZXR1cm4gd3JpdGVOb2RlKG5vZGUsIGVuZCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBNb2NoaUtpdCBpdGVyYXRvcnMgYXJlIG9iamVjdHMgd2l0aCBhIG5leHQgZnVuY3Rpb24gdGhhdAogICAgLy8gcmV0dXJucyB0aGUgbmV4dCB2YWx1ZSBvciB0aHJvd3MgU3RvcEl0ZXJhdGlvbiB3aGVuIHRoZXJlIGFyZQogICAgLy8gbm8gbW9yZSB2YWx1ZXMuCiAgICByZXR1cm4ge25leHQ6IG5leHQsIG5vZGVzOiBub2RlUXVldWV9OwogIH0KCiAgLy8gRGV0ZXJtaW5lIHRoZSB0ZXh0IHNpemUgb2YgYSBwcm9jZXNzZWQgbm9kZS4KICBmdW5jdGlvbiBub2RlU2l6ZShub2RlKSB7CiAgICByZXR1cm4gaXNCUihub2RlKSA/IDEgOiBub2RlLmN1cnJlbnRUZXh0Lmxlbmd0aDsKICB9CgogIC8vIFNlYXJjaCBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdG9wLWxldmVsIG5vZGVzIHVudGlsIHRoZSBuZXh0IEJSIG9yCiAgLy8gdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZS4KICBmdW5jdGlvbiBzdGFydE9mTGluZShub2RlKSB7CiAgICB3aGlsZSAobm9kZSAmJiAhaXNCUihub2RlKSkgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nOwogICAgcmV0dXJuIG5vZGU7CiAgfQogIGZ1bmN0aW9uIGVuZE9mTGluZShub2RlLCBjb250YWluZXIpIHsKICAgIGlmICghbm9kZSkgbm9kZSA9IGNvbnRhaW5lci5maXJzdENoaWxkOwogICAgZWxzZSBpZiAoaXNCUihub2RlKSkgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CgogICAgd2hpbGUgKG5vZGUgJiYgIWlzQlIobm9kZSkpIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBmdW5jdGlvbiB0aW1lKCkge3JldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTt9CgogIC8vIENsaWVudCBpbnRlcmZhY2UgZm9yIHNlYXJjaGluZyB0aGUgY29udGVudCBvZiB0aGUgZWRpdG9yLiBDcmVhdGUKICAvLyB0aGVzZSBieSBjYWxsaW5nIENvZGVNaXJyb3IuZ2V0U2VhcmNoQ3Vyc29yLiBUbyB1c2UsIGNhbGwKICAvLyBmaW5kTmV4dCBvbiB0aGUgcmVzdWx0aW5nIG9iamVjdCAtLSB0aGlzIHJldHVybnMgYSBib29sZWFuCiAgLy8gaW5kaWNhdGluZyB3aGV0aGVyIGFueXRoaW5nIHdhcyBmb3VuZCwgYW5kIGNhbiBiZSBjYWxsZWQgYWdhaW4gdG8KICAvLyBza2lwIHRvIHRoZSBuZXh0IGZpbmQuIFVzZSB0aGUgc2VsZWN0IGFuZCByZXBsYWNlIG1ldGhvZHMgdG8KICAvLyBhY3R1YWxseSBkbyBzb21ldGhpbmcgd2l0aCB0aGUgZm91bmQgbG9jYXRpb25zLgogIGZ1bmN0aW9uIFNlYXJjaEN1cnNvcihlZGl0b3IsIHN0cmluZywgZnJvbUN1cnNvciwgY2FzZUZvbGQpIHsKICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yOwogICAgaWYgKGNhc2VGb2xkID09IHVuZGVmaW5lZCkgewogICAgICBjYXNlRm9sZCA9IChzdHJpbmcgPT0gc3RyaW5nLnRvTG93ZXJDYXNlKCkpOwogICAgfQogICAgdGhpcy5jYXNlRm9sZCA9IGNhc2VGb2xkOwogICAgaWYgKGNhc2VGb2xkKSBzdHJpbmcgPSBzdHJpbmcudG9Mb3dlckNhc2UoKTsKICAgIHRoaXMuaGlzdG9yeSA9IGVkaXRvci5oaXN0b3J5OwogICAgdGhpcy5oaXN0b3J5LmNvbW1pdCgpOwoKICAgIC8vIEFyZSB3ZSBjdXJyZW50bHkgYXQgYW4gb2NjdXJyZW5jZSBvZiB0aGUgc2VhcmNoIHN0cmluZz8KICAgIHRoaXMuYXRPY2N1cnJlbmNlID0gZmFsc2U7CiAgICAvLyBUaGUgb2JqZWN0IHN0b3JlcyBhIHNldCBvZiBub2RlcyBjb21pbmcgYWZ0ZXIgaXRzIGN1cnJlbnQKICAgIC8vIHBvc2l0aW9uLCBzbyB0aGF0IHdoZW4gdGhlIGN1cnJlbnQgcG9pbnQgaXMgdGFrZW4gb3V0IG9mIHRoZQogICAgLy8gRE9NIHRyZWUsIHdlIGNhbiBzdGlsbCB0cnkgdG8gY29udGludWUuCiAgICB0aGlzLmZhbGxiYWNrU2l6ZSA9IDE1OwogICAgdmFyIGN1cnNvcjsKICAgIC8vIFN0YXJ0IGZyb20gdGhlIGN1cnNvciB3aGVuIHNwZWNpZmllZCBhbmQgYSBjdXJzb3IgY2FuIGJlIGZvdW5kLgogICAgaWYgKGZyb21DdXJzb3IgJiYgKGN1cnNvciA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5lZGl0b3IuY29udGFpbmVyKSkpIHsKICAgICAgdGhpcy5saW5lID0gY3Vyc29yLm5vZGU7CiAgICAgIHRoaXMub2Zmc2V0ID0gY3Vyc29yLm9mZnNldDsKICAgIH0KICAgIGVsc2UgewogICAgICB0aGlzLmxpbmUgPSBudWxsOwogICAgICB0aGlzLm9mZnNldCA9IDA7CiAgICB9CiAgICB0aGlzLnZhbGlkID0gISFzdHJpbmc7CgogICAgLy8gQ3JlYXRlIGEgbWF0Y2hlciBmdW5jdGlvbiBiYXNlZCBvbiB0aGUga2luZCBvZiBzdHJpbmcgd2UgaGF2ZS4KICAgIHZhciB0YXJnZXQgPSBzdHJpbmcuc3BsaXQoIlxuIiksIHNlbGYgPSB0aGlzOwogICAgdGhpcy5tYXRjaGVzID0gKHRhcmdldC5sZW5ndGggPT0gMSkgPwogICAgICAvLyBGb3Igb25lLWxpbmUgc3RyaW5ncywgc2VhcmNoaW5nIGNhbiBiZSBkb25lIHNpbXBseSBieSBjYWxsaW5nCiAgICAgIC8vIGluZGV4T2Ygb24gdGhlIGN1cnJlbnQgbGluZS4KICAgICAgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGxpbmUgPSBjbGVhblRleHQoc2VsZi5oaXN0b3J5LnRleHRBZnRlcihzZWxmLmxpbmUpLnNsaWNlKHNlbGYub2Zmc2V0KSk7CiAgICAgICAgdmFyIG1hdGNoID0gKHNlbGYuY2FzZUZvbGQgPyBsaW5lLnRvTG93ZXJDYXNlKCkgOiBsaW5lKS5pbmRleE9mKHN0cmluZyk7CiAgICAgICAgaWYgKG1hdGNoID4gLTEpCiAgICAgICAgICByZXR1cm4ge2Zyb206IHtub2RlOiBzZWxmLmxpbmUsIG9mZnNldDogc2VsZi5vZmZzZXQgKyBtYXRjaH0sCiAgICAgICAgICAgICAgICAgIHRvOiB7bm9kZTogc2VsZi5saW5lLCBvZmZzZXQ6IHNlbGYub2Zmc2V0ICsgbWF0Y2ggKyBzdHJpbmcubGVuZ3RofX07CiAgICAgIH0gOgogICAgICAvLyBNdWx0aS1saW5lIHN0cmluZ3MgcmVxdWlyZSBpbnRlcm5hbCBpdGVyYXRpb24gb3ZlciBsaW5lcywgYW5kCiAgICAgIC8vIHNvbWUgY2x1bmt5IGNoZWNrcyB0byBtYWtlIHN1cmUgdGhlIGZpcnN0IG1hdGNoIGVuZHMgYXQgdGhlCiAgICAgIC8vIGVuZCBvZiB0aGUgbGluZSBhbmQgdGhlIGxhc3QgbWF0Y2ggc3RhcnRzIGF0IHRoZSBzdGFydC4KICAgICAgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGZpcnN0TGluZSA9IGNsZWFuVGV4dChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKHNlbGYubGluZSkuc2xpY2Uoc2VsZi5vZmZzZXQpKTsKICAgICAgICB2YXIgbWF0Y2ggPSAoc2VsZi5jYXNlRm9sZCA/IGZpcnN0TGluZS50b0xvd2VyQ2FzZSgpIDogZmlyc3RMaW5lKS5sYXN0SW5kZXhPZih0YXJnZXRbMF0pOwogICAgICAgIGlmIChtYXRjaCA9PSAtMSB8fCBtYXRjaCAhPSBmaXJzdExpbmUubGVuZ3RoIC0gdGFyZ2V0WzBdLmxlbmd0aCkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB2YXIgc3RhcnRPZmZzZXQgPSBzZWxmLm9mZnNldCArIG1hdGNoOwoKICAgICAgICB2YXIgbGluZSA9IHNlbGYuaGlzdG9yeS5ub2RlQWZ0ZXIoc2VsZi5saW5lKTsKICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRhcmdldC5sZW5ndGggLSAxOyBpKyspIHsKICAgICAgICAgIHZhciBsaW5lVGV4dCA9IGNsZWFuVGV4dChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKGxpbmUpKTsKICAgICAgICAgIGlmICgoc2VsZi5jYXNlRm9sZCA/IGxpbmVUZXh0LnRvTG93ZXJDYXNlKCkgOiBsaW5lVGV4dCkgIT0gdGFyZ2V0W2ldKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICBsaW5lID0gc2VsZi5oaXN0b3J5Lm5vZGVBZnRlcihsaW5lKTsKICAgICAgICB9CgogICAgICAgIHZhciBsYXN0TGluZSA9IGNsZWFuVGV4dChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKGxpbmUpKTsKICAgICAgICBpZiAoKHNlbGYuY2FzZUZvbGQgPyBsYXN0TGluZS50b0xvd2VyQ2FzZSgpIDogbGFzdExpbmUpLmluZGV4T2YodGFyZ2V0W3RhcmdldC5sZW5ndGggLSAxXSkgIT0gMCkKICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgcmV0dXJuIHtmcm9tOiB7bm9kZTogc2VsZi5saW5lLCBvZmZzZXQ6IHN0YXJ0T2Zmc2V0fSwKICAgICAgICAgICAgICAgIHRvOiB7bm9kZTogbGluZSwgb2Zmc2V0OiB0YXJnZXRbdGFyZ2V0Lmxlbmd0aCAtIDFdLmxlbmd0aH19OwogICAgICB9OwogIH0KCiAgU2VhcmNoQ3Vyc29yLnByb3RvdHlwZSA9IHsKICAgIGZpbmROZXh0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCF0aGlzLnZhbGlkKSByZXR1cm4gZmFsc2U7CiAgICAgIHRoaXMuYXRPY2N1cnJlbmNlID0gZmFsc2U7CiAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgIC8vIEdvIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudCBpZiB0aGUgY3VycmVudCBsaW5lIGlzCiAgICAgIC8vIG5vIGxvbmdlciBpbiB0aGUgRE9NIHRyZWUuCiAgICAgIGlmICh0aGlzLmxpbmUgJiYgIXRoaXMubGluZS5wYXJlbnROb2RlKSB7CiAgICAgICAgdGhpcy5saW5lID0gbnVsbDsKICAgICAgICB0aGlzLm9mZnNldCA9IDA7CiAgICAgIH0KCiAgICAgIC8vIFNldCB0aGUgY3Vyc29yJ3MgcG9zaXRpb24gb25lIGNoYXJhY3RlciBhZnRlciB0aGUgZ2l2ZW4KICAgICAgLy8gcG9zaXRpb24uCiAgICAgIGZ1bmN0aW9uIHNhdmVBZnRlcihwb3MpIHsKICAgICAgICBpZiAoc2VsZi5oaXN0b3J5LnRleHRBZnRlcihwb3Mubm9kZSkubGVuZ3RoID4gcG9zLm9mZnNldCkgewogICAgICAgICAgc2VsZi5saW5lID0gcG9zLm5vZGU7CiAgICAgICAgICBzZWxmLm9mZnNldCA9IHBvcy5vZmZzZXQgKyAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHNlbGYubGluZSA9IHNlbGYuaGlzdG9yeS5ub2RlQWZ0ZXIocG9zLm5vZGUpOwogICAgICAgICAgc2VsZi5vZmZzZXQgPSAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICB2YXIgbWF0Y2ggPSB0aGlzLm1hdGNoZXMoKTsKICAgICAgICAvLyBGb3VuZCB0aGUgc2VhcmNoIHN0cmluZy4KICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgIHRoaXMuYXRPY2N1cnJlbmNlID0gbWF0Y2g7CiAgICAgICAgICBzYXZlQWZ0ZXIobWF0Y2guZnJvbSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5saW5lID0gdGhpcy5oaXN0b3J5Lm5vZGVBZnRlcih0aGlzLmxpbmUpOwogICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKICAgICAgICAvLyBFbmQgb2YgZG9jdW1lbnQuCiAgICAgICAgaWYgKCF0aGlzLmxpbmUpIHsKICAgICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgc2VsZWN0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuYXRPY2N1cnJlbmNlKSB7CiAgICAgICAgc2VsZWN0LnNldEN1cnNvclBvcyh0aGlzLmVkaXRvci5jb250YWluZXIsIHRoaXMuYXRPY2N1cnJlbmNlLmZyb20sIHRoaXMuYXRPY2N1cnJlbmNlLnRvKTsKICAgICAgICBzZWxlY3Quc2Nyb2xsVG9DdXJzb3IodGhpcy5lZGl0b3IuY29udGFpbmVyKTsKICAgICAgfQogICAgfSwKCiAgICByZXBsYWNlOiBmdW5jdGlvbihzdHJpbmcpIHsKICAgICAgaWYgKHRoaXMuYXRPY2N1cnJlbmNlKSB7CiAgICAgICAgdmFyIGVuZCA9IHRoaXMuZWRpdG9yLnJlcGxhY2VSYW5nZSh0aGlzLmF0T2NjdXJyZW5jZS5mcm9tLCB0aGlzLmF0T2NjdXJyZW5jZS50bywgc3RyaW5nKTsKICAgICAgICB0aGlzLmxpbmUgPSBlbmQubm9kZTsKICAgICAgICB0aGlzLm9mZnNldCA9IGVuZC5vZmZzZXQ7CiAgICAgICAgdGhpcy5hdE9jY3VycmVuY2UgPSBmYWxzZTsKICAgICAgfQogICAgfQogIH07CgogIC8vIFRoZSBFZGl0b3Igb2JqZWN0IGlzIHRoZSBtYWluIGluc2lkZS10aGUtaWZyYW1lIGludGVyZmFjZS4KICBmdW5jdGlvbiBFZGl0b3Iob3B0aW9ucykgewogICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIHdpbmRvdy5pbmRlbnRVbml0ID0gb3B0aW9ucy5pbmRlbnRVbml0OwogICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICB0aGlzLmRvYyA9IGRvY3VtZW50OwogICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyID0gdGhpcy5kb2MuYm9keTsKICAgIHRoaXMud2luID0gd2luZG93OwogICAgdGhpcy5oaXN0b3J5ID0gbmV3IFVuZG9IaXN0b3J5KGNvbnRhaW5lciwgb3B0aW9ucy51bmRvRGVwdGgsIG9wdGlvbnMudW5kb0RlbGF5LCB0aGlzKTsKICAgIHZhciBzZWxmID0gdGhpczsKCiAgICBpZiAoIUVkaXRvci5QYXJzZXIpCiAgICAgIHRocm93ICJObyBwYXJzZXIgbG9hZGVkLiI7CiAgICBpZiAob3B0aW9ucy5wYXJzZXJDb25maWcgJiYgRWRpdG9yLlBhcnNlci5jb25maWd1cmUpCiAgICAgIEVkaXRvci5QYXJzZXIuY29uZmlndXJlKG9wdGlvbnMucGFyc2VyQ29uZmlnKTsKCiAgICBpZiAoIW9wdGlvbnMucmVhZE9ubHkpCiAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3MoY29udGFpbmVyLCB7bm9kZTogbnVsbCwgb2Zmc2V0OiAwfSk7CgogICAgdGhpcy5kaXJ0eSA9IFtdOwogICAgdGhpcy5pbXBvcnRDb2RlKG9wdGlvbnMuY29udGVudCB8fCAiIik7CiAgICB0aGlzLmhpc3Rvcnkub25DaGFuZ2UgPSBvcHRpb25zLm9uQ2hhbmdlOwoKICAgIGlmICghb3B0aW9ucy5yZWFkT25seSkgewogICAgICBpZiAob3B0aW9ucy5jb250aW51b3VzU2Nhbm5pbmcgIT09IGZhbHNlKSB7CiAgICAgICAgdGhpcy5zY2FubmVyID0gdGhpcy5kb2N1bWVudFNjYW5uZXIob3B0aW9ucy5wYXNzVGltZSk7CiAgICAgICAgdGhpcy5kZWxheVNjYW5uaW5nKCk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNldEVkaXRhYmxlKCkgewogICAgICAgIC8vIFVzZSBjb250ZW50RWRpdGFibGUgaW5zdGVhZCBvZiBkZXNpZ25Nb2RlIG9uIElFLCBzaW5jZSBkZXNpZ25Nb2RlIGZyYW1lcwogICAgICAgIC8vIGNhbiBub3QgcnVuIGFueSBzY3JpcHRzLiBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIHVzZSBjb250ZW50RWRpdGFibGUKICAgICAgICAvLyBldmVyeXdoZXJlLCBidXQgaXQgaXMgc2lnbmlmaWNhbnRseSBmbGFraWVyIHRoYW4gZGVzaWduTW9kZSBvbiBldmVyeQogICAgICAgIC8vIHNpbmdsZSBub24tSUUgYnJvd3Nlci4KICAgICAgICBpZiAoZG9jdW1lbnQuYm9keS5jb250ZW50RWRpdGFibGUgIT0gdW5kZWZpbmVkICYmIGludGVybmV0RXhwbG9yZXIpCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNvbnRlbnRFZGl0YWJsZSA9ICJ0cnVlIjsKICAgICAgICBlbHNlCiAgICAgICAgICBkb2N1bWVudC5kZXNpZ25Nb2RlID0gIm9uIjsKCiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmJvcmRlcldpZHRoID0gIjAiOwogICAgICAgIGlmICghb3B0aW9ucy50ZXh0V3JhcHBpbmcpCiAgICAgICAgICBjb250YWluZXIuc3R5bGUud2hpdGVTcGFjZSA9ICJub3dyYXAiOwogICAgICB9CgogICAgICAvLyBJZiBzZXR0aW5nIHRoZSBmcmFtZSBlZGl0YWJsZSBmYWlscywgdHJ5IGFnYWluIHdoZW4gdGhlIHVzZXIKICAgICAgLy8gZm9jdXMgaXQgKGhhcHBlbnMgd2hlbiB0aGUgZnJhbWUgaXMgbm90IHZpc2libGUgb24KICAgICAgLy8gaW5pdGlhbGlzYXRpb24sIGluIEZpcmVmb3gpLgogICAgICB0cnkgewogICAgICAgIHNldEVkaXRhYmxlKCk7CiAgICAgIH0KICAgICAgY2F0Y2goZSkgewogICAgICAgIHZhciBmb2N1c0V2ZW50ID0gYWRkRXZlbnRIYW5kbGVyKGRvY3VtZW50LCAiZm9jdXMiLCBmdW5jdGlvbigpIHsKICAgICAgICAgIGZvY3VzRXZlbnQoKTsKICAgICAgICAgIHNldEVkaXRhYmxlKCk7CiAgICAgICAgfSwgdHJ1ZSk7CiAgICAgIH0KCiAgICAgIGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudCwgImtleWRvd24iLCBtZXRob2QodGhpcywgImtleURvd24iKSk7CiAgICAgIGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudCwgImtleXByZXNzIiwgbWV0aG9kKHRoaXMsICJrZXlQcmVzcyIpKTsKICAgICAgYWRkRXZlbnRIYW5kbGVyKGRvY3VtZW50LCAia2V5dXAiLCBtZXRob2QodGhpcywgImtleVVwIikpOwoKICAgICAgZnVuY3Rpb24gY3Vyc29yQWN0aXZpdHkoKSB7c2VsZi5jdXJzb3JBY3Rpdml0eShmYWxzZSk7fQogICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQuYm9keSwgIm1vdXNldXAiLCBjdXJzb3JBY3Rpdml0eSk7CiAgICAgIGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudC5ib2R5LCAiY3V0IiwgY3Vyc29yQWN0aXZpdHkpOwoKICAgICAgLy8gd29ya2Fyb3VuZCBmb3IgYSBnZWNrbyBidWcgWz9dIHdoZXJlIGdvaW5nIGZvcndhcmQgYW5kIHRoZW4KICAgICAgLy8gYmFjayBhZ2FpbiBicmVha3MgZGVzaWdubW9kZSAobm8gbW9yZSBjdXJzb3IpCiAgICAgIGlmIChnZWNrbykKICAgICAgICBhZGRFdmVudEhhbmRsZXIodGhpcy53aW4sICJwYWdlaGlkZSIsIGZ1bmN0aW9uKCl7c2VsZi51bmxvYWRlZCA9IHRydWU7fSk7CgogICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQuYm9keSwgInBhc3RlIiwgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBjdXJzb3JBY3Rpdml0eSgpOwogICAgICAgIHZhciB0ZXh0ID0gbnVsbDsKICAgICAgICB0cnkgewogICAgICAgICAgdmFyIGNsaXBib2FyZERhdGEgPSBldmVudC5jbGlwYm9hcmREYXRhIHx8IHdpbmRvdy5jbGlwYm9hcmREYXRhOwogICAgICAgICAgaWYgKGNsaXBib2FyZERhdGEpIHRleHQgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoJ1RleHQnKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2goZSkge30KICAgICAgICBpZiAodGV4dCAhPT0gbnVsbCkgewogICAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICAgICAgc2VsZi5yZXBsYWNlU2VsZWN0aW9uKHRleHQpOwogICAgICAgICAgc2VsZWN0LnNjcm9sbFRvQ3Vyc29yKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9CiAgICAgIH0pOwoKICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvTWF0Y2hQYXJlbnMpCiAgICAgICAgYWRkRXZlbnRIYW5kbGVyKGRvY3VtZW50LmJvZHksICJjbGljayIsIG1ldGhvZCh0aGlzLCAic2NoZWR1bGVQYXJlbkhpZ2hsaWdodCIpKTsKICAgIH0KICAgIGVsc2UgaWYgKCFvcHRpb25zLnRleHRXcmFwcGluZykgewogICAgICBjb250YWluZXIuc3R5bGUud2hpdGVTcGFjZSA9ICJub3dyYXAiOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaXNTYWZlS2V5KGNvZGUpIHsKICAgIHJldHVybiAoY29kZSA+PSAxNiAmJiBjb2RlIDw9IDE4KSB8fCAvLyBzaGlmdCwgY29udHJvbCwgYWx0CiAgICAgICAgICAgKGNvZGUgPj0gMzMgJiYgY29kZSA8PSA0MCk7IC8vIGFycm93cywgaG9tZSwgZW5kCiAgfQoKICBFZGl0b3IucHJvdG90eXBlID0gewogICAgLy8gSW1wb3J0IGEgcGllY2Ugb2YgY29kZSBpbnRvIHRoZSBlZGl0b3IuCiAgICBpbXBvcnRDb2RlOiBmdW5jdGlvbihjb2RlKSB7CiAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKG51bGwsIG51bGwsIGFzRWRpdG9yTGluZXMoY29kZSkpOwogICAgICB0aGlzLmhpc3RvcnkucmVzZXQoKTsKICAgIH0sCgogICAgLy8gRXh0cmFjdCB0aGUgY29kZSBmcm9tIHRoZSBlZGl0b3IuCiAgICBnZXRDb2RlOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKQogICAgICAgIHJldHVybiAiIjsKCiAgICAgIHZhciBhY2N1bSA9IFtdOwogICAgICBzZWxlY3QubWFya1NlbGVjdGlvbih0aGlzLndpbik7CiAgICAgIGZvckVhY2godHJhdmVyc2VET00odGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCksIG1ldGhvZChhY2N1bSwgInB1c2giKSk7CiAgICAgIHNlbGVjdC5zZWxlY3RNYXJrZWQoKTsKICAgICAgcmV0dXJuIGNsZWFuVGV4dChhY2N1bS5qb2luKCIiKSk7CiAgICB9LAoKICAgIGNoZWNrTGluZTogZnVuY3Rpb24obm9kZSkgewogICAgICBpZiAobm9kZSA9PT0gZmFsc2UgfHwgIShub2RlID09IG51bGwgfHwgbm9kZS5wYXJlbnROb2RlID09IHRoaXMuY29udGFpbmVyKSkKICAgICAgICB0aHJvdyBwYXJlbnQuQ29kZU1pcnJvci5JbnZhbGlkTGluZUhhbmRsZTsKICAgIH0sCgogICAgY3Vyc29yUG9zaXRpb246IGZ1bmN0aW9uKHN0YXJ0KSB7CiAgICAgIGlmIChzdGFydCA9PSBudWxsKSBzdGFydCA9IHRydWU7CiAgICAgIHZhciBwb3MgPSBzZWxlY3QuY3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCBzdGFydCk7CiAgICAgIGlmIChwb3MpIHJldHVybiB7bGluZTogcG9zLm5vZGUsIGNoYXJhY3RlcjogcG9zLm9mZnNldH07CiAgICAgIGVsc2UgcmV0dXJuIHtsaW5lOiBudWxsLCBjaGFyYWN0ZXI6IDB9OwogICAgfSwKCiAgICBmaXJzdExpbmU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0sCgogICAgbGFzdExpbmU6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5jb250YWluZXIubGFzdENoaWxkKSByZXR1cm4gc3RhcnRPZkxpbmUodGhpcy5jb250YWluZXIubGFzdENoaWxkKTsKICAgICAgZWxzZSByZXR1cm4gbnVsbDsKICAgIH0sCgogICAgbmV4dExpbmU6IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdGhpcy5jaGVja0xpbmUobGluZSk7CiAgICAgIHZhciBlbmQgPSBlbmRPZkxpbmUobGluZSwgdGhpcy5jb250YWluZXIpOwogICAgICByZXR1cm4gZW5kIHx8IGZhbHNlOwogICAgfSwKCiAgICBwcmV2TGluZTogZnVuY3Rpb24obGluZSkgewogICAgICB0aGlzLmNoZWNrTGluZShsaW5lKTsKICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gc3RhcnRPZkxpbmUobGluZS5wcmV2aW91c1NpYmxpbmcpOwogICAgfSwKCiAgICB2aXNpYmxlTGluZUNvdW50OiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGxpbmUgPSB0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkOwogICAgICB3aGlsZSAobGluZSAmJiBpc0JSKGxpbmUpKSBsaW5lID0gbGluZS5uZXh0U2libGluZzsgLy8gQlIgaGVpZ2h0cyBhcmUgdW5yZWxpYWJsZQogICAgICBpZiAoIWxpbmUpIHJldHVybiBmYWxzZTsKICAgICAgdmFyIGlubmVySGVpZ2h0ID0gKHdpbmRvdy5pbm5lckhlaWdodAogICAgICAgICAgICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodAogICAgICAgICAgICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQpOwogICAgICByZXR1cm4gTWF0aC5mbG9vcihpbm5lckhlaWdodCAvIGxpbmUub2Zmc2V0SGVpZ2h0KTsKICAgIH0sCgogICAgc2VsZWN0TGluZXM6IGZ1bmN0aW9uKHN0YXJ0TGluZSwgc3RhcnRPZmZzZXQsIGVuZExpbmUsIGVuZE9mZnNldCkgewogICAgICB0aGlzLmNoZWNrTGluZShzdGFydExpbmUpOwogICAgICB2YXIgc3RhcnQgPSB7bm9kZTogc3RhcnRMaW5lLCBvZmZzZXQ6IHN0YXJ0T2Zmc2V0fSwgZW5kID0gbnVsbDsKICAgICAgaWYgKGVuZE9mZnNldCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhpcy5jaGVja0xpbmUoZW5kTGluZSk7CiAgICAgICAgZW5kID0ge25vZGU6IGVuZExpbmUsIG9mZnNldDogZW5kT2Zmc2V0fTsKICAgICAgfQogICAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCBzdGFydCwgZW5kKTsKICAgICAgc2VsZWN0LnNjcm9sbFRvQ3Vyc29yKHRoaXMuY29udGFpbmVyKTsKICAgIH0sCgogICAgbGluZUNvbnRlbnQ6IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdmFyIGFjY3VtID0gW107CiAgICAgIGZvciAobGluZSA9IGxpbmUgPyBsaW5lLm5leHRTaWJsaW5nIDogdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgICAgICBsaW5lICYmICFpc0JSKGxpbmUpOyBsaW5lID0gbGluZS5uZXh0U2libGluZykKICAgICAgICBhY2N1bS5wdXNoKG5vZGVUZXh0KGxpbmUpKTsKICAgICAgcmV0dXJuIGNsZWFuVGV4dChhY2N1bS5qb2luKCIiKSk7CiAgICB9LAoKICAgIHNldExpbmVDb250ZW50OiBmdW5jdGlvbihsaW5lLCBjb250ZW50KSB7CiAgICAgIHRoaXMuaGlzdG9yeS5jb21taXQoKTsKICAgICAgdGhpcy5yZXBsYWNlUmFuZ2Uoe25vZGU6IGxpbmUsIG9mZnNldDogMH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHtub2RlOiBsaW5lLCBvZmZzZXQ6IHRoaXMuaGlzdG9yeS50ZXh0QWZ0ZXIobGluZSkubGVuZ3RofSwKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCk7CiAgICAgIHRoaXMuYWRkRGlydHlOb2RlKGxpbmUpOwogICAgICB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICB9LAoKICAgIHJlbW92ZUxpbmU6IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdmFyIG5vZGUgPSBsaW5lID8gbGluZS5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgIHdoaWxlIChub2RlKSB7CiAgICAgICAgdmFyIG5leHQgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICAgIHJlbW92ZUVsZW1lbnQobm9kZSk7CiAgICAgICAgaWYgKGlzQlIobm9kZSkpIGJyZWFrOwogICAgICAgIG5vZGUgPSBuZXh0OwogICAgICB9CiAgICAgIHRoaXMuYWRkRGlydHlOb2RlKGxpbmUpOwogICAgICB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICB9LAoKICAgIGluc2VydEludG9MaW5lOiBmdW5jdGlvbihsaW5lLCBwb3NpdGlvbiwgY29udGVudCkgewogICAgICB2YXIgYmVmb3JlID0gbnVsbDsKICAgICAgaWYgKHBvc2l0aW9uID09ICJlbmQiKSB7CiAgICAgICAgYmVmb3JlID0gZW5kT2ZMaW5lKGxpbmUsIHRoaXMuY29udGFpbmVyKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBmb3IgKHZhciBjdXIgPSBsaW5lID8gbGluZS5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7IGN1cjsgY3VyID0gY3VyLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICBpZiAocG9zaXRpb24gPT0gMCkgewogICAgICAgICAgICBiZWZvcmUgPSBjdXI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHRleHQgPSBub2RlVGV4dChjdXIpOwogICAgICAgICAgaWYgKHRleHQubGVuZ3RoID4gcG9zaXRpb24pIHsKICAgICAgICAgICAgYmVmb3JlID0gY3VyLm5leHRTaWJsaW5nOwogICAgICAgICAgICBjb250ZW50ID0gdGV4dC5zbGljZSgwLCBwb3NpdGlvbikgKyBjb250ZW50ICsgdGV4dC5zbGljZShwb3NpdGlvbik7CiAgICAgICAgICAgIHJlbW92ZUVsZW1lbnQoY3VyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBwb3NpdGlvbiAtPSB0ZXh0Lmxlbmd0aDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBsaW5lcyA9IGFzRWRpdG9yTGluZXMoY29udGVudCksIGRvYyA9IHRoaXMuY29udGFpbmVyLm93bmVyRG9jdW1lbnQ7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoaSA+IDApIHRoaXMuY29udGFpbmVyLmluc2VydEJlZm9yZShkb2MuY3JlYXRlRWxlbWVudCgiQlIiKSwgYmVmb3JlKTsKICAgICAgICB0aGlzLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUobWFrZVBhcnRTcGFuKGxpbmVzW2ldLCBkb2MpLCBiZWZvcmUpOwogICAgICB9CiAgICAgIHRoaXMuYWRkRGlydHlOb2RlKGxpbmUpOwogICAgICB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICB9LAoKICAgIC8vIFJldHJpZXZlIHRoZSBzZWxlY3RlZCB0ZXh0LgogICAgc2VsZWN0ZWRUZXh0OiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGggPSB0aGlzLmhpc3Rvcnk7CiAgICAgIGguY29tbWl0KCk7CgogICAgICB2YXIgc3RhcnQgPSBzZWxlY3QuY3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCB0cnVlKSwKICAgICAgICAgIGVuZCA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgaWYgKCFzdGFydCB8fCAhZW5kKSByZXR1cm4gIiI7CgogICAgICBpZiAoc3RhcnQubm9kZSA9PSBlbmQubm9kZSkKICAgICAgICByZXR1cm4gaC50ZXh0QWZ0ZXIoc3RhcnQubm9kZSkuc2xpY2Uoc3RhcnQub2Zmc2V0LCBlbmQub2Zmc2V0KTsKCiAgICAgIHZhciB0ZXh0ID0gW2gudGV4dEFmdGVyKHN0YXJ0Lm5vZGUpLnNsaWNlKHN0YXJ0Lm9mZnNldCldOwogICAgICBmb3IgKHZhciBwb3MgPSBoLm5vZGVBZnRlcihzdGFydC5ub2RlKTsgcG9zICE9IGVuZC5ub2RlOyBwb3MgPSBoLm5vZGVBZnRlcihwb3MpKQogICAgICAgIHRleHQucHVzaChoLnRleHRBZnRlcihwb3MpKTsKICAgICAgdGV4dC5wdXNoKGgudGV4dEFmdGVyKGVuZC5ub2RlKS5zbGljZSgwLCBlbmQub2Zmc2V0KSk7CiAgICAgIHJldHVybiBjbGVhblRleHQodGV4dC5qb2luKCJcbiIpKTsKICAgIH0sCgogICAgLy8gUmVwbGFjZSB0aGUgc2VsZWN0aW9uIHdpdGggYW5vdGhlciBwaWVjZSBvZiB0ZXh0LgogICAgcmVwbGFjZVNlbGVjdGlvbjogZnVuY3Rpb24odGV4dCkgewogICAgICB0aGlzLmhpc3RvcnkuY29tbWl0KCk7CgogICAgICB2YXIgc3RhcnQgPSBzZWxlY3QuY3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCB0cnVlKSwKICAgICAgICAgIGVuZCA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgaWYgKCFzdGFydCB8fCAhZW5kKSByZXR1cm47CgogICAgICBlbmQgPSB0aGlzLnJlcGxhY2VSYW5nZShzdGFydCwgZW5kLCB0ZXh0KTsKICAgICAgc2VsZWN0LnNldEN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwgZW5kKTsKICAgIH0sCgogICAgY3Vyc29yQ29vcmRzOiBmdW5jdGlvbihzdGFydCkgewogICAgICB2YXIgc2VsID0gc2VsZWN0LmN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwgc3RhcnQpOwogICAgICBpZiAoIXNlbCkgcmV0dXJuIG51bGw7CiAgICAgIHZhciBvZmYgPSBzZWwub2Zmc2V0LCBub2RlID0gc2VsLm5vZGUsIGRvYyA9IHRoaXMud2luLmRvY3VtZW50LCBzZWxmID0gdGhpczsKICAgICAgZnVuY3Rpb24gbWVhc3VyZUZyb21Ob2RlKG5vZGUsIHhPZmZzZXQpIHsKICAgICAgICB2YXIgeSA9IC0oc2VsZi53aW4uZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgfHwgc2VsZi53aW4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCAwKSwKICAgICAgICAgICAgeCA9IC0oc2VsZi53aW4uZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0IHx8IHNlbGYud2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0IHx8IDApICsgeE9mZnNldDsKICAgICAgICBmb3JFYWNoKFtub2RlLCBzZWxmLndpbi5mcmFtZUVsZW1lbnRdLCBmdW5jdGlvbihuKSB7CiAgICAgICAgICB3aGlsZSAobikge3ggKz0gbi5vZmZzZXRMZWZ0OyB5ICs9IG4ub2Zmc2V0VG9wO24gPSBuLm9mZnNldFBhcmVudDt9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHt4OiB4LCB5OiB5LCB5Qm90OiB5ICsgbm9kZS5vZmZzZXRIZWlnaHR9OwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHdpdGhUZW1wTm9kZSh0ZXh0LCBmKSB7CiAgICAgICAgdmFyIG5vZGUgPSBkb2MuY3JlYXRlRWxlbWVudCgiU1BBTiIpOwogICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKHRleHQpKTsKICAgICAgICB0cnkge3JldHVybiBmKG5vZGUpO30KICAgICAgICBmaW5hbGx5IHtpZiAobm9kZS5wYXJlbnROb2RlKSBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7fQogICAgICB9CgogICAgICB3aGlsZSAob2ZmKSB7CiAgICAgICAgbm9kZSA9IG5vZGUgPyBub2RlLm5leHRTaWJsaW5nIDogdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgICB2YXIgdHh0ID0gbm9kZVRleHQobm9kZSk7CiAgICAgICAgaWYgKG9mZiA8IHR4dC5sZW5ndGgpCiAgICAgICAgICByZXR1cm4gd2l0aFRlbXBOb2RlKHR4dC5zdWJzdHIoMCwgb2ZmKSwgZnVuY3Rpb24odG1wKSB7CiAgICAgICAgICAgIHRtcC5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7IHRtcC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHRtcC5jbGFzc05hbWUgPSBub2RlLmNsYXNzTmFtZTsKICAgICAgICAgICAgc2VsZi5jb250YWluZXIuYXBwZW5kQ2hpbGQodG1wKTsKICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmVGcm9tTm9kZShub2RlLCB0bXAub2Zmc2V0V2lkdGgpOwogICAgICAgICAgfSk7CiAgICAgICAgb2ZmIC09IHR4dC5sZW5ndGg7CiAgICAgIH0KICAgICAgaWYgKG5vZGUgJiYgaXNTcGFuKG5vZGUpKQogICAgICAgIHJldHVybiBtZWFzdXJlRnJvbU5vZGUobm9kZSwgbm9kZS5vZmZzZXRXaWR0aCk7CiAgICAgIGVsc2UgaWYgKG5vZGUgJiYgbm9kZS5uZXh0U2libGluZyAmJiBpc1NwYW4obm9kZS5uZXh0U2libGluZykpCiAgICAgICAgcmV0dXJuIG1lYXN1cmVGcm9tTm9kZShub2RlLm5leHRTaWJsaW5nLCAwKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiB3aXRoVGVtcE5vZGUoIlx1MjAwYiIsIGZ1bmN0aW9uKHRtcCkgewogICAgICAgICAgaWYgKG5vZGUpIG5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodG1wLCBub2RlLm5leHRTaWJsaW5nKTsKICAgICAgICAgIGVsc2Ugc2VsZi5jb250YWluZXIuaW5zZXJ0QmVmb3JlKHRtcCwgc2VsZi5jb250YWluZXIuZmlyc3RDaGlsZCk7CiAgICAgICAgICByZXR1cm4gbWVhc3VyZUZyb21Ob2RlKHRtcCwgMCk7CiAgICAgICAgfSk7CiAgICB9LAoKICAgIHJlcm91dGVQYXN0ZUV2ZW50OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuY2FwdHVyaW5nUGFzdGUgfHwgd2luZG93Lm9wZXJhKSByZXR1cm47CiAgICAgIHRoaXMuY2FwdHVyaW5nUGFzdGUgPSB0cnVlOwogICAgICB2YXIgdGUgPSB3aW5kb3cuZnJhbWVFbGVtZW50LkNvZGVNaXJyb3IudGV4dGFyZWFIYWNrOwogICAgICBwYXJlbnQuZm9jdXMoKTsKICAgICAgdGUudmFsdWUgPSAiIjsKICAgICAgdGUuZm9jdXMoKTsKCiAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgdGhpcy5wYXJlbnQuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBzZWxmLmNhcHR1cmluZ1Bhc3RlID0gZmFsc2U7CiAgICAgICAgc2VsZi53aW4uZm9jdXMoKTsKICAgICAgICBpZiAoc2VsZi5zZWxlY3Rpb25TbmFwc2hvdCkgLy8gSUUgaGFjawogICAgICAgICAgc2VsZi53aW4uc2VsZWN0LnNldEJvb2ttYXJrKHNlbGYuY29udGFpbmVyLCBzZWxmLnNlbGVjdGlvblNuYXBzaG90KTsKICAgICAgICB2YXIgdGV4dCA9IHRlLnZhbHVlOwogICAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgICBzZWxmLnJlcGxhY2VTZWxlY3Rpb24odGV4dCk7CiAgICAgICAgICBzZWxlY3Quc2Nyb2xsVG9DdXJzb3Ioc2VsZi5jb250YWluZXIpOwogICAgICAgIH0KICAgICAgfSwgMTApOwogICAgfSwKCiAgICByZXBsYWNlUmFuZ2U6IGZ1bmN0aW9uKGZyb20sIHRvLCB0ZXh0KSB7CiAgICAgIHZhciBsaW5lcyA9IGFzRWRpdG9yTGluZXModGV4dCk7CiAgICAgIGxpbmVzWzBdID0gdGhpcy5oaXN0b3J5LnRleHRBZnRlcihmcm9tLm5vZGUpLnNsaWNlKDAsIGZyb20ub2Zmc2V0KSArIGxpbmVzWzBdOwogICAgICB2YXIgbGFzdExpbmUgPSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXTsKICAgICAgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPSBsYXN0TGluZSArIHRoaXMuaGlzdG9yeS50ZXh0QWZ0ZXIodG8ubm9kZSkuc2xpY2UodG8ub2Zmc2V0KTsKICAgICAgdmFyIGVuZCA9IHRoaXMuaGlzdG9yeS5ub2RlQWZ0ZXIodG8ubm9kZSk7CiAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGZyb20ubm9kZSwgZW5kLCBsaW5lcyk7CiAgICAgIHJldHVybiB7bm9kZTogdGhpcy5oaXN0b3J5Lm5vZGVCZWZvcmUoZW5kKSwKICAgICAgICAgICAgICBvZmZzZXQ6IGxhc3RMaW5lLmxlbmd0aH07CiAgICB9LAoKICAgIGdldFNlYXJjaEN1cnNvcjogZnVuY3Rpb24oc3RyaW5nLCBmcm9tQ3Vyc29yLCBjYXNlRm9sZCkgewogICAgICByZXR1cm4gbmV3IFNlYXJjaEN1cnNvcih0aGlzLCBzdHJpbmcsIGZyb21DdXJzb3IsIGNhc2VGb2xkKTsKICAgIH0sCgogICAgLy8gUmUtaW5kZW50IHRoZSB3aG9sZSBidWZmZXIKICAgIHJlaW5kZW50OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpCiAgICAgICAgdGhpcy5pbmRlbnRSZWdpb24obnVsbCwgdGhpcy5jb250YWluZXIubGFzdENoaWxkKTsKICAgIH0sCgogICAgcmVpbmRlbnRTZWxlY3Rpb246IGZ1bmN0aW9uKGRpcmVjdGlvbikgewogICAgICBpZiAoIXNlbGVjdC5zb21ldGhpbmdTZWxlY3RlZCh0aGlzLndpbikpIHsKICAgICAgICB0aGlzLmluZGVudEF0Q3Vyc29yKGRpcmVjdGlvbik7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgdmFyIHN0YXJ0ID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIHRydWUpLAogICAgICAgICAgICBlbmQgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lciwgZmFsc2UpOwogICAgICAgIGlmIChzdGFydCA9PT0gZmFsc2UgfHwgZW5kID09PSBmYWxzZSkgcmV0dXJuOwogICAgICAgIHRoaXMuaW5kZW50UmVnaW9uKHN0YXJ0LCBlbmQsIGRpcmVjdGlvbik7CiAgICAgIH0KICAgIH0sCgogICAgZ3JhYktleXM6IGZ1bmN0aW9uKGV2ZW50SGFuZGxlciwgZmlsdGVyKSB7CiAgICAgIHRoaXMuZnJvemVuID0gZXZlbnRIYW5kbGVyOwogICAgICB0aGlzLmtleUZpbHRlciA9IGZpbHRlcjsKICAgIH0sCiAgICB1bmdyYWJLZXlzOiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5mcm96ZW4gPSAibGVhdmUiOwogICAgfSwKCiAgICBzZXRQYXJzZXI6IGZ1bmN0aW9uKG5hbWUsIHBhcnNlckNvbmZpZykgewogICAgICBFZGl0b3IuUGFyc2VyID0gd2luZG93W25hbWVdOwogICAgICBwYXJzZXJDb25maWcgPSBwYXJzZXJDb25maWcgfHwgdGhpcy5vcHRpb25zLnBhcnNlckNvbmZpZzsKICAgICAgaWYgKHBhcnNlckNvbmZpZyAmJiBFZGl0b3IuUGFyc2VyLmNvbmZpZ3VyZSkKICAgICAgICBFZGl0b3IuUGFyc2VyLmNvbmZpZ3VyZShwYXJzZXJDb25maWcpOwoKICAgICAgaWYgKHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpIHsKICAgICAgICBmb3JFYWNoKHRoaXMuY29udGFpbmVyLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKG4pIHsKICAgICAgICAgIGlmIChuLm5vZGVUeXBlICE9IDMpIG4uZGlydHkgPSB0cnVlOwogICAgICAgIH0pOwogICAgICAgIHRoaXMuYWRkRGlydHlOb2RlKHRoaXMuZmlyc3RDaGlsZCk7CiAgICAgICAgdGhpcy5zY2hlZHVsZUhpZ2hsaWdodCgpOwogICAgICB9CiAgICB9LAoKICAgIC8vIEludGVyY2VwdCBlbnRlciBhbmQgdGFiLCBhbmQgYXNzaWduIHRoZWlyIG5ldyBmdW5jdGlvbnMuCiAgICBrZXlEb3duOiBmdW5jdGlvbihldmVudCkgewogICAgICBpZiAodGhpcy5mcm96ZW4gPT0gImxlYXZlIikge3RoaXMuZnJvemVuID0gbnVsbDsgdGhpcy5rZXlGaWx0ZXIgPSBudWxsO30KICAgICAgaWYgKHRoaXMuZnJvemVuICYmICghdGhpcy5rZXlGaWx0ZXIgfHwgdGhpcy5rZXlGaWx0ZXIoZXZlbnQua2V5Q29kZSwgZXZlbnQpKSkgewogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgICB0aGlzLmZyb3plbihldmVudCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB2YXIgY29kZSA9IHRoaXMubGFzdEtleURvd25Db2RlID0gZXZlbnQua2V5Q29kZTsKICAgICAgLy8gRG9uJ3Qgc2NhbiB3aGVuIHRoZSB1c2VyIGlzIHR5cGluZy4KICAgICAgdGhpcy5kZWxheVNjYW5uaW5nKCk7CiAgICAgIC8vIFNjaGVkdWxlIGEgcGFyZW4taGlnaGxpZ2h0IGV2ZW50LCBpZiBjb25maWd1cmVkLgogICAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9NYXRjaFBhcmVucykKICAgICAgICB0aGlzLnNjaGVkdWxlUGFyZW5IaWdobGlnaHQoKTsKCiAgICAgIC8vIFRoZSB2YXJpb3VzIGNoZWNrcyBmb3IgIWFsdEtleSBhcmUgdGhlcmUgYmVjYXVzZSBBbHRHciBzZXRzIGJvdGgKICAgICAgLy8gY3RybEtleSBhbmQgYWx0S2V5IHRvIHRydWUsIGFuZCBzaG91bGQgbm90IGJlIHJlY29nbmlzZWQgYXMKICAgICAgLy8gQ29udHJvbC4KICAgICAgaWYgKGNvZGUgPT0gMTMpIHsgLy8gZW50ZXIKICAgICAgICBpZiAoZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7CiAgICAgICAgICB0aGlzLnJlcGFyc2VCdWZmZXIoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBzZWxlY3QuaW5zZXJ0TmV3bGluZUF0Q3Vyc29yKHRoaXMud2luKTsKICAgICAgICAgIHRoaXMuaW5kZW50QXRDdXJzb3IoKTsKICAgICAgICAgIHNlbGVjdC5zY3JvbGxUb0N1cnNvcih0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgfQogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjb2RlID09IDkgJiYgdGhpcy5vcHRpb25zLnRhYk1vZGUgIT0gImRlZmF1bHQiICYmICFldmVudC5jdHJsS2V5KSB7IC8vIHRhYgogICAgICAgIHRoaXMuaGFuZGxlVGFiKCFldmVudC5zaGlmdEtleSk7CiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMzIgJiYgZXZlbnQuc2hpZnRLZXkgJiYgdGhpcy5vcHRpb25zLnRhYk1vZGUgPT0gImRlZmF1bHQiKSB7IC8vIHNwYWNlCiAgICAgICAgdGhpcy5oYW5kbGVUYWIodHJ1ZSk7CiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMzYgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5jdHJsS2V5KSB7IC8vIGhvbWUKICAgICAgICBpZiAodGhpcy5ob21lKCkpIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjb2RlID09IDM1ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuY3RybEtleSkgeyAvLyBlbmQKICAgICAgICBpZiAodGhpcy5lbmQoKSkgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIC8vIE9ubHkgaW4gRmlyZWZveCBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgUGdVcC9QZ0RuIGNvcnJlY3QuCiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMzMgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFnZWNrbykgeyAvLyBQZ1VwCiAgICAgICAgaWYgKHRoaXMucGFnZVVwKCkpIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjb2RlID09IDM0ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZ2Vja28pIHsgIC8vIFBnRG4KICAgICAgICBpZiAodGhpcy5wYWdlRG93bigpKSBldmVudC5zdG9wKCk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoKGNvZGUgPT0gMjE5IHx8IGNvZGUgPT0gMjIxKSAmJiBldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkpIHsgLy8gWywgXQogICAgICAgIHRoaXMuaGlnaGxpZ2h0UGFyZW5zKGV2ZW50LnNoaWZ0S2V5LCB0cnVlKTsKICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoZXZlbnQubWV0YUtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgKGNvZGUgPT0gMzcgfHwgY29kZSA9PSAzOSkpIHsgLy8gTWV0YS1sZWZ0L3JpZ2h0CiAgICAgICAgdmFyIGN1cnNvciA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyKTsKICAgICAgICBpZiAoY3Vyc29yICE9PSBmYWxzZSAmJiB0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKSB7CiAgICAgICAgICBpZiAoY29kZSA9PSAzNykgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlKHN0YXJ0T2ZMaW5lKGN1cnNvciksIHRoaXMuY29udGFpbmVyKTsKICAgICAgICAgIGVsc2UgewogICAgICAgICAgICB2YXIgZW5kID0gZW5kT2ZMaW5lKGN1cnNvciwgdGhpcy5jb250YWluZXIpOwogICAgICAgICAgICBzZWxlY3QuZm9jdXNBZnRlck5vZGUoZW5kID8gZW5kLnByZXZpb3VzU2libGluZyA6IHRoaXMuY29udGFpbmVyLmxhc3RDaGlsZCwgdGhpcy5jb250YWluZXIpOwogICAgICAgICAgfQogICAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiAhZXZlbnQuYWx0S2V5KSB7CiAgICAgICAgaWYgKChldmVudC5zaGlmdEtleSAmJiBjb2RlID09IDkwKSB8fCBjb2RlID09IDg5KSB7IC8vIHNoaWZ0LVosIFkKICAgICAgICAgIHNlbGVjdC5zY3JvbGxUb05vZGUodGhpcy5oaXN0b3J5LnJlZG8oKSk7CiAgICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNvZGUgPT0gOTAgfHwgKHNhZmFyaSAmJiBjb2RlID09IDgpKSB7IC8vIFosIGJhY2tzcGFjZQogICAgICAgICAgc2VsZWN0LnNjcm9sbFRvTm9kZSh0aGlzLmhpc3RvcnkudW5kbygpKTsKICAgICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY29kZSA9PSA4MyAmJiB0aGlzLm9wdGlvbnMuc2F2ZUZ1bmN0aW9uKSB7IC8vIFMKICAgICAgICAgIHRoaXMub3B0aW9ucy5zYXZlRnVuY3Rpb24oKTsKICAgICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoaW50ZXJuZXRFeHBsb3JlciAmJiBjb2RlID09IDg2KSB7CiAgICAgICAgICB0aGlzLnJlcm91dGVQYXN0ZUV2ZW50KCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMua2V5VXBPclByZXNzQWZ0ZXJMYXN0S2V5RG93biA9IGZhbHNlOwogICAgfSwKCiAgICAvLyBDaGVjayBmb3IgY2hhcmFjdGVycyB0aGF0IHNob3VsZCByZS1pbmRlbnQgdGhlIGN1cnJlbnQgbGluZSwKICAgIC8vIGFuZCBwcmV2ZW50IE9wZXJhIGZyb20gaGFuZGxpbmcgZW50ZXIgYW5kIHRhYiBhbnl3YXkuCiAgICBrZXlQcmVzczogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgdGhpcy5rZXlVcE9yUHJlc3NBZnRlckxhc3RLZXlEb3duID0gdHJ1ZTsKICAgICAgdmFyIGVsZWN0cmljID0gRWRpdG9yLlBhcnNlci5lbGVjdHJpY0NoYXJzLCBzZWxmID0gdGhpczsKICAgICAgLy8gSGFjayBmb3IgT3BlcmEsIGFuZCBGaXJlZm94IG9uIE9TIFgsIGluIHdoaWNoIHN0b3BwaW5nIGEKICAgICAgLy8ga2V5ZG93biBldmVudCBkb2VzIG5vdCBwcmV2ZW50IHRoZSBhc3NvY2lhdGVkIGtleXByZXNzIGV2ZW50CiAgICAgIC8vIGZyb20gaGFwcGVuaW5nLCBzbyB3ZSBoYXZlIHRvIGNhbmNlbCBlbnRlciBhbmQgdGFiIGFnYWluCiAgICAgIC8vIGhlcmUuCiAgICAgIGlmICgodGhpcy5mcm96ZW4gJiYgKCF0aGlzLmtleUZpbHRlciB8fCB0aGlzLmtleUZpbHRlcihldmVudC5rZXlDb2RlIHx8IGV2ZW50LmNvZGUsIGV2ZW50KSkpIHx8CiAgICAgICAgICBldmVudC5jb2RlID09IDEzIHx8IChldmVudC5jb2RlID09IDkgJiYgdGhpcy5vcHRpb25zLnRhYk1vZGUgIT0gImRlZmF1bHQiKSB8fAogICAgICAgICAgKGV2ZW50LmNvZGUgPT0gMzIgJiYgZXZlbnQuc2hpZnRLZXkgJiYgdGhpcy5vcHRpb25zLnRhYk1vZGUgPT0gImRlZmF1bHQiKSkKICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgIGVsc2UgaWYgKGVsZWN0cmljICYmIGVsZWN0cmljLmluZGV4T2YoZXZlbnQuY2hhcmFjdGVyKSAhPSAtMSkKICAgICAgICB0aGlzLnBhcmVudC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VsZi5pbmRlbnRBdEN1cnNvcihudWxsKTt9LCAwKTsKICAgICAgZWxzZSBpZiAoKGV2ZW50LmNoYXJhY3RlciA9PSAidiIgfHwgZXZlbnQuY2hhcmFjdGVyID09ICJWIikKICAgICAgICAgICAgICAgJiYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgIWV2ZW50LmFsdEtleSkgLy8gY3RybC1WCiAgICAgICAgdGhpcy5yZXJvdXRlUGFzdGVFdmVudCgpOwogICAgICAvLyBXb3JrIGFyb3VuZCBhIGJ1ZyB3aGVyZSBwcmVzc2luZyBiYWNrc3BhY2UgYXQgdGhlIGVuZCBvZiBhCiAgICAgIC8vIGxpbmUgb2Z0ZW4gY2F1c2VzIHRoZSBjdXJzb3IgdG8ganVtcCB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUKICAgICAgLy8gaW4gT3BlcmEgMTAuNjAuCiAgICAgIGVsc2UgaWYgKGJyb2tlbk9wZXJhICYmIGV2ZW50LmNvZGUgPT0gOCkgewogICAgICAgIHZhciBzZWwgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lciksIHNlbGYgPSB0aGlzLAogICAgICAgICAgICBuZXh0ID0gc2VsID8gc2VsLm5leHRTaWJsaW5nIDogdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgICBpZiAoc2VsICE9PSBmYWxzZSAmJiBuZXh0ICYmIGlzQlIobmV4dCkpCiAgICAgICAgICB0aGlzLnBhcmVudC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGlmIChzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZShzZWxmLmNvbnRhaW5lcikgPT0gbmV4dCkKICAgICAgICAgICAgICBzZWxlY3QuZm9jdXNBZnRlck5vZGUobmV4dC5wcmV2aW91c1NpYmxpbmcsIHNlbGYuY29udGFpbmVyKTsKICAgICAgICAgIH0sIDIwKTsKICAgICAgfQogICAgfSwKCiAgICAvLyBNYXJrIHRoZSBub2RlIGF0IHRoZSBjdXJzb3IgZGlydHkgd2hlbiBhIG5vbi1zYWZlIGtleSBpcwogICAgLy8gcmVsZWFzZWQuCiAgICBrZXlVcDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgdGhpcy5rZXlVcE9yUHJlc3NBZnRlckxhc3RLZXlEb3duID0gdHJ1ZTsKICAgICAgdGhpcy5jdXJzb3JBY3Rpdml0eShpc1NhZmVLZXkoZXZlbnQua2V5Q29kZSkpOwogICAgfSwKCiAgICAvLyBJbmRlbnQgdGhlIGxpbmUgZm9sbG93aW5nIGEgZ2l2ZW4gPGJyPiwgb3IgbnVsbCBmb3IgdGhlIGZpcnN0CiAgICAvLyBsaW5lLiBJZiBnaXZlbiBhIDxicj4gZWxlbWVudCwgdGhpcyBtdXN0IGhhdmUgYmVlbiBoaWdobGlnaHRlZAogICAgLy8gc28gdGhhdCBpdCBoYXMgYW4gaW5kZW50YXRpb24gbWV0aG9kLiBSZXR1cm5zIHRoZSB3aGl0ZXNwYWNlCiAgICAvLyBlbGVtZW50IHRoYXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgY3JlYXRlZCAoaWYgYW55KS4KICAgIGluZGVudExpbmVBZnRlcjogZnVuY3Rpb24oc3RhcnQsIGRpcmVjdGlvbikgewogICAgICAvLyB3aGl0ZVNwYWNlIGlzIHRoZSB3aGl0ZXNwYWNlIHNwYW4gYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLAogICAgICAvLyBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggbm9kZS4KICAgICAgdmFyIHdoaXRlU3BhY2UgPSBzdGFydCA/IHN0YXJ0Lm5leHRTaWJsaW5nIDogdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgaWYgKHdoaXRlU3BhY2UgJiYgIWhhc0NsYXNzKHdoaXRlU3BhY2UsICJ3aGl0ZXNwYWNlIikpCiAgICAgICAgd2hpdGVTcGFjZSA9IG51bGw7CgogICAgICAvLyBTb21ldGltZXMgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGNhbiBpbmZsdWVuY2UgdGhlIGNvcnJlY3QKICAgICAgLy8gaW5kZW50YXRpb24sIHNvIHdlIHJldHJpZXZlIGl0LgogICAgICB2YXIgZmlyc3RUZXh0ID0gd2hpdGVTcGFjZSA/IHdoaXRlU3BhY2UubmV4dFNpYmxpbmcgOiAoc3RhcnQgPyBzdGFydC5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpOwogICAgICB2YXIgbmV4dENoYXJzID0gKHN0YXJ0ICYmIGZpcnN0VGV4dCAmJiBmaXJzdFRleHQuY3VycmVudFRleHQpID8gZmlyc3RUZXh0LmN1cnJlbnRUZXh0IDogIiI7CgogICAgICAvLyBBc2sgdGhlIGxleGljYWwgY29udGV4dCBmb3IgdGhlIGNvcnJlY3QgaW5kZW50YXRpb24sIGFuZAogICAgICAvLyBjb21wdXRlIGhvdyBtdWNoIHRoaXMgZGlmZmVycyBmcm9tIHRoZSBjdXJyZW50IGluZGVudGF0aW9uLgogICAgICB2YXIgbmV3SW5kZW50ID0gMCwgY3VySW5kZW50ID0gd2hpdGVTcGFjZSA/IHdoaXRlU3BhY2UuY3VycmVudFRleHQubGVuZ3RoIDogMDsKICAgICAgaWYgKGRpcmVjdGlvbiAhPSBudWxsICYmIHRoaXMub3B0aW9ucy50YWJNb2RlID09ICJzaGlmdCIpCiAgICAgICAgbmV3SW5kZW50ID0gZGlyZWN0aW9uID8gY3VySW5kZW50ICsgaW5kZW50VW5pdCA6IE1hdGgubWF4KDAsIGN1ckluZGVudCAtIGluZGVudFVuaXQpCiAgICAgIGVsc2UgaWYgKHN0YXJ0KQogICAgICAgIG5ld0luZGVudCA9IHN0YXJ0LmluZGVudGF0aW9uKG5leHRDaGFycywgY3VySW5kZW50LCBkaXJlY3Rpb24pOwogICAgICBlbHNlIGlmIChFZGl0b3IuUGFyc2VyLmZpcnN0SW5kZW50YXRpb24pCiAgICAgICAgbmV3SW5kZW50ID0gRWRpdG9yLlBhcnNlci5maXJzdEluZGVudGF0aW9uKG5leHRDaGFycywgY3VySW5kZW50LCBkaXJlY3Rpb24pOwogICAgICB2YXIgaW5kZW50RGlmZiA9IG5ld0luZGVudCAtIGN1ckluZGVudDsKCiAgICAgIC8vIElmIHRoZXJlIGlzIHRvbyBtdWNoLCB0aGlzIGlzIGp1c3QgYSBtYXR0ZXIgb2Ygc2hyaW5raW5nIGEgc3Bhbi4KICAgICAgaWYgKGluZGVudERpZmYgPCAwKSB7CiAgICAgICAgaWYgKG5ld0luZGVudCA9PSAwKSB7CiAgICAgICAgICBpZiAoZmlyc3RUZXh0KSBzZWxlY3Quc25hcHNob3RNb3ZlKHdoaXRlU3BhY2UuZmlyc3RDaGlsZCwgZmlyc3RUZXh0LmZpcnN0Q2hpbGQsIDApOwogICAgICAgICAgcmVtb3ZlRWxlbWVudCh3aGl0ZVNwYWNlKTsKICAgICAgICAgIHdoaXRlU3BhY2UgPSBudWxsOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHNlbGVjdC5zbmFwc2hvdE1vdmUod2hpdGVTcGFjZS5maXJzdENoaWxkLCB3aGl0ZVNwYWNlLmZpcnN0Q2hpbGQsIGluZGVudERpZmYsIHRydWUpOwogICAgICAgICAgd2hpdGVTcGFjZS5jdXJyZW50VGV4dCA9IG1ha2VXaGl0ZVNwYWNlKG5ld0luZGVudCk7CiAgICAgICAgICB3aGl0ZVNwYWNlLmZpcnN0Q2hpbGQubm9kZVZhbHVlID0gd2hpdGVTcGFjZS5jdXJyZW50VGV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gTm90IGVub3VnaC4uLgogICAgICBlbHNlIGlmIChpbmRlbnREaWZmID4gMCkgewogICAgICAgIC8vIElmIHRoZXJlIGlzIHdoaXRlc3BhY2UsIHdlIGdyb3cgaXQuCiAgICAgICAgaWYgKHdoaXRlU3BhY2UpIHsKICAgICAgICAgIHdoaXRlU3BhY2UuY3VycmVudFRleHQgPSBtYWtlV2hpdGVTcGFjZShuZXdJbmRlbnQpOwogICAgICAgICAgd2hpdGVTcGFjZS5maXJzdENoaWxkLm5vZGVWYWx1ZSA9IHdoaXRlU3BhY2UuY3VycmVudFRleHQ7CiAgICAgICAgICBzZWxlY3Quc25hcHNob3RNb3ZlKHdoaXRlU3BhY2UuZmlyc3RDaGlsZCwgd2hpdGVTcGFjZS5maXJzdENoaWxkLCBpbmRlbnREaWZmLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIGFkZCBhIG5ldyB3aGl0ZXNwYWNlIG5vZGUuCiAgICAgICAgZWxzZSB7CiAgICAgICAgICB3aGl0ZVNwYWNlID0gbWFrZVBhcnRTcGFuKG1ha2VXaGl0ZVNwYWNlKG5ld0luZGVudCksIHRoaXMuZG9jKTsKICAgICAgICAgIHdoaXRlU3BhY2UuY2xhc3NOYW1lID0gIndoaXRlc3BhY2UiOwogICAgICAgICAgaWYgKHN0YXJ0KSBpbnNlcnRBZnRlcih3aGl0ZVNwYWNlLCBzdGFydCk7CiAgICAgICAgICBlbHNlIHRoaXMuY29udGFpbmVyLmluc2VydEJlZm9yZSh3aGl0ZVNwYWNlLCB0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKTsKICAgICAgICAgIHNlbGVjdC5zbmFwc2hvdE1vdmUoZmlyc3RUZXh0ICYmIChmaXJzdFRleHQuZmlyc3RDaGlsZCB8fCBmaXJzdFRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlLmZpcnN0Q2hpbGQsIG5ld0luZGVudCwgZmFsc2UsIHRydWUpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaW5kZW50RGlmZiAhPSAwKSB0aGlzLmFkZERpcnR5Tm9kZShzdGFydCk7CiAgICB9LAoKICAgIC8vIFJlLWhpZ2hsaWdodCB0aGUgc2VsZWN0ZWQgcGFydCBvZiB0aGUgZG9jdW1lbnQuCiAgICBoaWdobGlnaHRBdEN1cnNvcjogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBwb3MgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lciwgdHJ1ZSk7CiAgICAgIHZhciB0byA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCBmYWxzZSk7CiAgICAgIGlmIChwb3MgPT09IGZhbHNlIHx8IHRvID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlOwoKICAgICAgc2VsZWN0Lm1hcmtTZWxlY3Rpb24odGhpcy53aW4pOwogICAgICBpZiAodGhpcy5oaWdobGlnaHQocG9zLCBlbmRPZkxpbmUodG8sIHRoaXMuY29udGFpbmVyKSwgdHJ1ZSwgMjApID09PSBmYWxzZSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIHNlbGVjdC5zZWxlY3RNYXJrZWQoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9LAoKICAgIC8vIFdoZW4gdGFiIGlzIHByZXNzZWQgd2l0aCB0ZXh0IHNlbGVjdGVkLCB0aGUgd2hvbGUgc2VsZWN0aW9uIGlzCiAgICAvLyByZS1pbmRlbnRlZCwgd2hlbiBub3RoaW5nIGlzIHNlbGVjdGVkLCB0aGUgbGluZSB3aXRoIHRoZSBjdXJzb3IKICAgIC8vIGlzIHJlLWluZGVudGVkLgogICAgaGFuZGxlVGFiOiBmdW5jdGlvbihkaXJlY3Rpb24pIHsKICAgICAgaWYgKHRoaXMub3B0aW9ucy50YWJNb2RlID09ICJzcGFjZXMiKQogICAgICAgIHNlbGVjdC5pbnNlcnRUYWJBdEN1cnNvcih0aGlzLndpbik7CiAgICAgIGVsc2UKICAgICAgICB0aGlzLnJlaW5kZW50U2VsZWN0aW9uKGRpcmVjdGlvbik7CiAgICB9LAoKICAgIC8vIEN1c3RvbSBob21lIGJlaGF2aW91ciB0aGF0IGRvZXNuJ3QgbGFuZCB0aGUgY3Vyc29yIGluIGZyb250IG9mCiAgICAvLyBsZWFkaW5nIHdoaXRlc3BhY2UgdW5sZXNzIHByZXNzZWQgdHdpY2UuCiAgICBob21lOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGN1ciA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCB0cnVlKSwgc3RhcnQgPSBjdXI7CiAgICAgIGlmIChjdXIgPT09IGZhbHNlIHx8ICEoIWN1ciB8fCBjdXIuaXNQYXJ0IHx8IGlzQlIoY3VyKSkgfHwgIXRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpCiAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgd2hpbGUgKGN1ciAmJiAhaXNCUihjdXIpKSBjdXIgPSBjdXIucHJldmlvdXNTaWJsaW5nOwogICAgICB2YXIgbmV4dCA9IGN1ciA/IGN1ci5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgIGlmIChuZXh0ICYmIG5leHQgIT0gc3RhcnQgJiYgbmV4dC5pc1BhcnQgJiYgaGFzQ2xhc3MobmV4dCwgIndoaXRlc3BhY2UiKSkKICAgICAgICBzZWxlY3QuZm9jdXNBZnRlck5vZGUobmV4dCwgdGhpcy5jb250YWluZXIpOwogICAgICBlbHNlCiAgICAgICAgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlKGN1ciwgdGhpcy5jb250YWluZXIpOwoKICAgICAgc2VsZWN0LnNjcm9sbFRvQ3Vyc29yKHRoaXMuY29udGFpbmVyKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9LAoKICAgIC8vIFNvbWUgYnJvd3NlcnMgKE9wZXJhKSBkb24ndCBtYW5hZ2UgdG8gaGFuZGxlIHRoZSBlbmQga2V5CiAgICAvLyBwcm9wZXJseSBpbiB0aGUgZmFjZSBvZiB2ZXJ0aWNhbCBzY3JvbGxpbmcuCiAgICBlbmQ6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgY3VyID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIHRydWUpOwogICAgICBpZiAoY3VyID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlOwogICAgICBjdXIgPSBlbmRPZkxpbmUoY3VyLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgIGlmICghY3VyKSByZXR1cm4gZmFsc2U7CiAgICAgIHNlbGVjdC5mb2N1c0FmdGVyTm9kZShjdXIucHJldmlvdXNTaWJsaW5nLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgIHNlbGVjdC5zY3JvbGxUb0N1cnNvcih0aGlzLmNvbnRhaW5lcik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSwKCiAgICBwYWdlVXA6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgbGluZSA9IHRoaXMuY3Vyc29yUG9zaXRpb24oKS5saW5lLCBzY3JvbGxBbW91bnQgPSB0aGlzLnZpc2libGVMaW5lQ291bnQoKTsKICAgICAgaWYgKGxpbmUgPT09IGZhbHNlIHx8IHNjcm9sbEFtb3VudCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTsKICAgICAgLy8gVHJ5IHRvIGtlZXAgb25lIGxpbmUgb24gdGhlIHNjcmVlbi4KICAgICAgc2Nyb2xsQW1vdW50IC09IDI7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2Nyb2xsQW1vdW50OyBpKyspIHsKICAgICAgICBsaW5lID0gdGhpcy5wcmV2TGluZShsaW5lKTsKICAgICAgICBpZiAobGluZSA9PT0gZmFsc2UpIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChpID09IDApIHJldHVybiBmYWxzZTsgLy8gQWxyZWFkeSBhdCBmaXJzdCBsaW5lCiAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHtub2RlOiBsaW5lLCBvZmZzZXQ6IDB9KTsKICAgICAgc2VsZWN0LnNjcm9sbFRvQ3Vyc29yKHRoaXMuY29udGFpbmVyKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9LAoKICAgIHBhZ2VEb3duOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGxpbmUgPSB0aGlzLmN1cnNvclBvc2l0aW9uKCkubGluZSwgc2Nyb2xsQW1vdW50ID0gdGhpcy52aXNpYmxlTGluZUNvdW50KCk7CiAgICAgIGlmIChsaW5lID09PSBmYWxzZSB8fCBzY3JvbGxBbW91bnQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7CiAgICAgIC8vIFRyeSB0byBtb3ZlIHRvIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGN1cnJlbnQgcGFnZS4KICAgICAgc2Nyb2xsQW1vdW50IC09IDI7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2Nyb2xsQW1vdW50OyBpKyspIHsKICAgICAgICB2YXIgbmV4dExpbmUgPSB0aGlzLm5leHRMaW5lKGxpbmUpOwogICAgICAgIGlmIChuZXh0TGluZSA9PT0gZmFsc2UpIGJyZWFrOwogICAgICAgIGxpbmUgPSBuZXh0TGluZTsKICAgICAgfQogICAgICBpZiAoaSA9PSAwKSByZXR1cm4gZmFsc2U7IC8vIEFscmVhZHkgYXQgbGFzdCBsaW5lCiAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHtub2RlOiBsaW5lLCBvZmZzZXQ6IDB9KTsKICAgICAgc2VsZWN0LnNjcm9sbFRvQ3Vyc29yKHRoaXMuY29udGFpbmVyKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9LAoKICAgIC8vIERlbGF5IChvciBpbml0aWF0ZSkgdGhlIG5leHQgcGFyZW4gaGlnaGxpZ2h0IGV2ZW50LgogICAgc2NoZWR1bGVQYXJlbkhpZ2hsaWdodDogZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLnBhcmVuRXZlbnQpIHRoaXMucGFyZW50LmNsZWFyVGltZW91dCh0aGlzLnBhcmVuRXZlbnQpOwogICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgIHRoaXMucGFyZW5FdmVudCA9IHRoaXMucGFyZW50LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtzZWxmLmhpZ2hsaWdodFBhcmVucygpO30sIDMwMCk7CiAgICB9LAoKICAgIC8vIFRha2UgdGhlIHRva2VuIGJlZm9yZSB0aGUgY3Vyc29yLiBJZiBpdCBjb250YWlucyBhIGNoYXJhY3RlciBpbgogICAgLy8gJygpW117fScsIHNlYXJjaCBmb3IgdGhlIG1hdGNoaW5nIHBhcmVuL2JyYWNlL2JyYWNrZXQsIGFuZAogICAgLy8gaGlnaGxpZ2h0IHRoZW0gaW4gZ3JlZW4gZm9yIGEgbW9tZW50LCBvciByZWQgaWYgbm8gcHJvcGVyIG1hdGNoCiAgICAvLyB3YXMgZm91bmQuCiAgICBoaWdobGlnaHRQYXJlbnM6IGZ1bmN0aW9uKGp1bXAsIGZyb21LZXkpIHsKICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAvLyBnaXZlIHRoZSByZWxldmFudCBub2RlcyBhIGNvbG91ci4KICAgICAgZnVuY3Rpb24gaGlnaGxpZ2h0KG5vZGUsIG9rKSB7CiAgICAgICAgaWYgKCFub2RlKSByZXR1cm47CiAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXJrUGFyZW4pIHsKICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXJrUGFyZW4obm9kZSwgb2spOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIG5vZGUuc3R5bGUuZm9udFdlaWdodCA9ICJib2xkIjsKICAgICAgICAgIG5vZGUuc3R5bGUuY29sb3IgPSBvayA/ICIjOEY4IiA6ICIjRjg4IjsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gdW5oaWdobGlnaHQobm9kZSkgewogICAgICAgIGlmICghbm9kZSkgcmV0dXJuOwogICAgICAgIGlmIChzZWxmLm9wdGlvbnMudW5tYXJrUGFyZW4pIHsKICAgICAgICAgIHNlbGYub3B0aW9ucy51bm1hcmtQYXJlbihub2RlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBub2RlLnN0eWxlLmZvbnRXZWlnaHQgPSAiIjsKICAgICAgICAgIG5vZGUuc3R5bGUuY29sb3IgPSAiIjsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFmcm9tS2V5ICYmIHNlbGYuaGlnaGxpZ2h0ZWQpIHsKICAgICAgICB1bmhpZ2hsaWdodChzZWxmLmhpZ2hsaWdodGVkWzBdKTsKICAgICAgICB1bmhpZ2hsaWdodChzZWxmLmhpZ2hsaWdodGVkWzFdKTsKICAgICAgfQoKICAgICAgaWYgKCF3aW5kb3cuc2VsZWN0KSByZXR1cm47CiAgICAgIC8vIENsZWFyIHRoZSBldmVudCBwcm9wZXJ0eS4KICAgICAgaWYgKHRoaXMucGFyZW5FdmVudCkgdGhpcy5wYXJlbnQuY2xlYXJUaW1lb3V0KHRoaXMucGFyZW5FdmVudCk7CiAgICAgIHRoaXMucGFyZW5FdmVudCA9IG51bGw7CgogICAgICAvLyBFeHRyYWN0IGEgJ3BhcmVuJyBmcm9tIGEgcGllY2Ugb2YgdGV4dC4KICAgICAgZnVuY3Rpb24gcGFyZW4obm9kZSkgewogICAgICAgIGlmIChub2RlLmN1cnJlbnRUZXh0KSB7CiAgICAgICAgICB2YXIgbWF0Y2ggPSBub2RlLmN1cnJlbnRUZXh0Lm1hdGNoKC9eW1xzXHUwMGEwXSooW1woXClcW1xde31dKVtcc1x1MDBhMF0qJC8pOwogICAgICAgICAgcmV0dXJuIG1hdGNoICYmIG1hdGNoWzFdOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBEZXRlcm1pbmUgdGhlIGRpcmVjdGlvbiBhIHBhcmVuIGlzIGZhY2luZy4KICAgICAgZnVuY3Rpb24gZm9yd2FyZChjaCkgewogICAgICAgIHJldHVybiAvW1woXFtce10vLnRlc3QoY2gpOwogICAgICB9CgogICAgICB2YXIgY2gsIGN1cnNvciA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCB0cnVlKTsKICAgICAgaWYgKCFjdXJzb3IgfHwgIXRoaXMuaGlnaGxpZ2h0QXRDdXJzb3IoKSkgcmV0dXJuOwogICAgICBjdXJzb3IgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lciwgdHJ1ZSk7CiAgICAgIGlmICghKGN1cnNvciAmJiAoKGNoID0gcGFyZW4oY3Vyc29yKSkgfHwgKGN1cnNvciA9IGN1cnNvci5uZXh0U2libGluZykgJiYgKGNoID0gcGFyZW4oY3Vyc29yKSkpKSkKICAgICAgICByZXR1cm47CiAgICAgIC8vIFdlIG9ubHkgbG9vayBmb3IgdG9rZW5zIHdpdGggdGhlIHNhbWUgY2xhc3NOYW1lLgogICAgICB2YXIgY2xhc3NOYW1lID0gY3Vyc29yLmNsYXNzTmFtZSwgZGlyID0gZm9yd2FyZChjaCksIG1hdGNoID0gbWF0Y2hpbmdbY2hdOwoKICAgICAgLy8gU2luY2UgcGFydHMgb2YgdGhlIGRvY3VtZW50IG1pZ2h0IG5vdCBoYXZlIGJlZW4gcHJvcGVybHkKICAgICAgLy8gaGlnaGxpZ2h0ZWQsIGFuZCBpdCBpcyBoYXJkIHRvIGtub3cgaW4gYWR2YW5jZSB3aGljaCBwYXJ0IHdlCiAgICAgIC8vIGhhdmUgdG8gc2Nhbiwgd2UganVzdCB0cnksIGFuZCB3aGVuIHdlIGZpbmQgZGlydHkgbm9kZXMgd2UKICAgICAgLy8gYWJvcnQsIHBhcnNlIHRoZW0sIGFuZCByZS10cnkuCiAgICAgIGZ1bmN0aW9uIHRyeUZpbmRNYXRjaCgpIHsKICAgICAgICB2YXIgc3RhY2sgPSBbXSwgY2gsIG9rID0gdHJ1ZTsKICAgICAgICBmb3IgKHZhciBydW5uZXIgPSBjdXJzb3I7IHJ1bm5lcjsgcnVubmVyID0gZGlyID8gcnVubmVyLm5leHRTaWJsaW5nIDogcnVubmVyLnByZXZpb3VzU2libGluZykgewogICAgICAgICAgaWYgKHJ1bm5lci5jbGFzc05hbWUgPT0gY2xhc3NOYW1lICYmIGlzU3BhbihydW5uZXIpICYmIChjaCA9IHBhcmVuKHJ1bm5lcikpKSB7CiAgICAgICAgICAgIGlmIChmb3J3YXJkKGNoKSA9PSBkaXIpCiAgICAgICAgICAgICAgc3RhY2sucHVzaChjaCk7CiAgICAgICAgICAgIGVsc2UgaWYgKCFzdGFjay5sZW5ndGgpCiAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKICAgICAgICAgICAgZWxzZSBpZiAoc3RhY2sucG9wKCkgIT0gbWF0Y2hpbmdbY2hdKQogICAgICAgICAgICAgIG9rID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKHJ1bm5lci5kaXJ0eSB8fCAhaXNTcGFuKHJ1bm5lcikgJiYgIWlzQlIocnVubmVyKSkgewogICAgICAgICAgICByZXR1cm4ge25vZGU6IHJ1bm5lciwgc3RhdHVzOiAiZGlydHkifTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHtub2RlOiBydW5uZXIsIHN0YXR1czogcnVubmVyICYmIG9rfTsKICAgICAgfQoKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICB2YXIgZm91bmQgPSB0cnlGaW5kTWF0Y2goKTsKICAgICAgICBpZiAoZm91bmQuc3RhdHVzID09ICJkaXJ0eSIpIHsKICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0KGZvdW5kLm5vZGUsIGVuZE9mTGluZShmb3VuZC5ub2RlKSk7CiAgICAgICAgICAvLyBOZWVkZWQgYmVjYXVzZSBpbiBzb21lIGNvcm5lciBjYXNlcyBhIGhpZ2hsaWdodCBkb2VzIG5vdAogICAgICAgICAgLy8gcmVhY2ggYSBub2RlLgogICAgICAgICAgZm91bmQubm9kZS5kaXJ0eSA9IGZhbHNlOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgaGlnaGxpZ2h0KGN1cnNvciwgZm91bmQuc3RhdHVzKTsKICAgICAgICAgIGhpZ2hsaWdodChmb3VuZC5ub2RlLCBmb3VuZC5zdGF0dXMpOwogICAgICAgICAgaWYgKGZyb21LZXkpCiAgICAgICAgICAgIHNlbGYucGFyZW50LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7dW5oaWdobGlnaHQoY3Vyc29yKTsgdW5oaWdobGlnaHQoZm91bmQubm9kZSk7fSwgNTAwKTsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgc2VsZi5oaWdobGlnaHRlZCA9IFtjdXJzb3IsIGZvdW5kLm5vZGVdOwogICAgICAgICAgaWYgKGp1bXAgJiYgZm91bmQubm9kZSkKICAgICAgICAgICAgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlKGZvdW5kLm5vZGUucHJldmlvdXNTaWJsaW5nLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgLy8gQWRqdXN0IHRoZSBhbW91bnQgb2Ygd2hpdGVzcGFjZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgdGhhdAogICAgLy8gdGhlIGN1cnNvciBpcyBvbiBzbyB0aGF0IGl0IGlzIGluZGVudGVkIHByb3Blcmx5LgogICAgaW5kZW50QXRDdXJzb3I6IGZ1bmN0aW9uKGRpcmVjdGlvbikgewogICAgICBpZiAoIXRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpIHJldHVybjsKICAgICAgLy8gVGhlIGxpbmUgaGFzIHRvIGhhdmUgdXAtdG8tZGF0ZSBsZXhpY2FsIGluZm9ybWF0aW9uLCBzbyB3ZQogICAgICAvLyBoaWdobGlnaHQgaXQgZmlyc3QuCiAgICAgIGlmICghdGhpcy5oaWdobGlnaHRBdEN1cnNvcigpKSByZXR1cm47CiAgICAgIHZhciBjdXJzb3IgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lciwgZmFsc2UpOwogICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBkZXRlcm1pbmUgdGhlIHBsYWNlIG9mIHRoZSBjdXJzb3IsCiAgICAgIC8vIHRoZXJlJ3Mgbm90aGluZyB0byBpbmRlbnQuCiAgICAgIGlmIChjdXJzb3IgPT09IGZhbHNlKQogICAgICAgIHJldHVybjsKICAgICAgc2VsZWN0Lm1hcmtTZWxlY3Rpb24odGhpcy53aW4pOwogICAgICB0aGlzLmluZGVudExpbmVBZnRlcihzdGFydE9mTGluZShjdXJzb3IpLCBkaXJlY3Rpb24pOwogICAgICBzZWxlY3Quc2VsZWN0TWFya2VkKCk7CiAgICB9LAoKICAgIC8vIEluZGVudCBhbGwgbGluZXMgd2hvc2Ugc3RhcnQgZmFsbHMgaW5zaWRlIG9mIHRoZSBjdXJyZW50CiAgICAvLyBzZWxlY3Rpb24uCiAgICBpbmRlbnRSZWdpb246IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIGRpcmVjdGlvbikgewogICAgICB2YXIgY3VycmVudCA9IChzdGFydCA9IHN0YXJ0T2ZMaW5lKHN0YXJ0KSksIGJlZm9yZSA9IHN0YXJ0ICYmIHN0YXJ0T2ZMaW5lKHN0YXJ0LnByZXZpb3VzU2libGluZyk7CiAgICAgIGlmICghaXNCUihlbmQpKSBlbmQgPSBlbmRPZkxpbmUoZW5kLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgIHRoaXMuYWRkRGlydHlOb2RlKHN0YXJ0KTsKCiAgICAgIGRvIHsKICAgICAgICB2YXIgbmV4dCA9IGVuZE9mTGluZShjdXJyZW50LCB0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgaWYgKGN1cnJlbnQpIHRoaXMuaGlnaGxpZ2h0KGJlZm9yZSwgbmV4dCwgdHJ1ZSk7CiAgICAgICAgdGhpcy5pbmRlbnRMaW5lQWZ0ZXIoY3VycmVudCwgZGlyZWN0aW9uKTsKICAgICAgICBiZWZvcmUgPSBjdXJyZW50OwogICAgICAgIGN1cnJlbnQgPSBuZXh0OwogICAgICB9IHdoaWxlIChjdXJyZW50ICE9IGVuZCk7CiAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHtub2RlOiBzdGFydCwgb2Zmc2V0OiAwfSwge25vZGU6IGVuZCwgb2Zmc2V0OiAwfSk7CiAgICB9LAoKICAgIC8vIEZpbmQgdGhlIG5vZGUgdGhhdCB0aGUgY3Vyc29yIGlzIGluLCBtYXJrIGl0IGFzIGRpcnR5LCBhbmQgbWFrZQogICAgLy8gc3VyZSBhIGhpZ2hsaWdodCBwYXNzIGlzIHNjaGVkdWxlZC4KICAgIGN1cnNvckFjdGl2aXR5OiBmdW5jdGlvbihzYWZlKSB7CiAgICAgIC8vIHBhZ2VoaWRlIGV2ZW50IGhhY2sgYWJvdmUKICAgICAgaWYgKHRoaXMudW5sb2FkZWQpIHsKICAgICAgICB0aGlzLndpbi5kb2N1bWVudC5kZXNpZ25Nb2RlID0gIm9mZiI7CiAgICAgICAgdGhpcy53aW4uZG9jdW1lbnQuZGVzaWduTW9kZSA9ICJvbiI7CiAgICAgICAgdGhpcy51bmxvYWRlZCA9IGZhbHNlOwogICAgICB9CgogICAgICBpZiAoaW50ZXJuZXRFeHBsb3JlcikgewogICAgICAgIHRoaXMuY29udGFpbmVyLmNyZWF0ZVRleHRSYW5nZSgpLmV4ZWNDb21tYW5kKCJ1bmxpbmsiKTsKICAgICAgICB0aGlzLnNlbGVjdGlvblNuYXBzaG90ID0gc2VsZWN0LmdldEJvb2ttYXJrKHRoaXMuY29udGFpbmVyKTsKICAgICAgfQoKICAgICAgdmFyIGFjdGl2aXR5ID0gdGhpcy5vcHRpb25zLmN1cnNvckFjdGl2aXR5OwogICAgICBpZiAoIXNhZmUgfHwgYWN0aXZpdHkpIHsKICAgICAgICB2YXIgY3Vyc29yID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgICBpZiAoY3Vyc29yID09PSBmYWxzZSB8fCAhdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCkgcmV0dXJuOwogICAgICAgIGN1cnNvciA9IGN1cnNvciB8fCB0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkOwogICAgICAgIGlmIChhY3Rpdml0eSkgYWN0aXZpdHkoY3Vyc29yKTsKICAgICAgICBpZiAoIXNhZmUpIHsKICAgICAgICAgIHRoaXMuc2NoZWR1bGVIaWdobGlnaHQoKTsKICAgICAgICAgIHRoaXMuYWRkRGlydHlOb2RlKGN1cnNvcik7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIHJlcGFyc2VCdWZmZXI6IGZ1bmN0aW9uKCkgewogICAgICBmb3JFYWNoKHRoaXMuY29udGFpbmVyLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKG5vZGUpIHtub2RlLmRpcnR5ID0gdHJ1ZTt9KTsKICAgICAgaWYgKHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpCiAgICAgICAgdGhpcy5hZGREaXJ0eU5vZGUodGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCk7CiAgICB9LAoKICAgIC8vIEFkZCBhIG5vZGUgdG8gdGhlIHNldCBvZiBkaXJ0eSBub2RlcywgaWYgaXQgaXNuJ3QgYWxyZWFkeSBpbgogICAgLy8gdGhlcmUuCiAgICBhZGREaXJ0eU5vZGU6IGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgbm9kZSA9IG5vZGUgfHwgdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgaWYgKCFub2RlKSByZXR1cm47CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlydHkubGVuZ3RoOyBpKyspCiAgICAgICAgaWYgKHRoaXMuZGlydHlbaV0gPT0gbm9kZSkgcmV0dXJuOwoKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMykKICAgICAgICBub2RlLmRpcnR5ID0gdHJ1ZTsKICAgICAgdGhpcy5kaXJ0eS5wdXNoKG5vZGUpOwogICAgfSwKCiAgICBhbGxDbGVhbjogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiAhdGhpcy5kaXJ0eS5sZW5ndGg7CiAgICB9LAoKICAgIC8vIENhdXNlIGEgaGlnaGxpZ2h0IHBhc3MgdG8gaGFwcGVuIGluIG9wdGlvbnMucGFzc0RlbGF5CiAgICAvLyBtaWxsaXNlY29uZHMuIENsZWFyIHRoZSBleGlzdGluZyB0aW1lb3V0LCBpZiBvbmUgZXhpc3RzLiBUaGlzCiAgICAvLyB3YXksIHRoZSBwYXNzZXMgZG8gbm90IGhhcHBlbiB3aGlsZSB0aGUgdXNlciBpcyB0eXBpbmcsIGFuZAogICAgLy8gc2hvdWxkIGFzIHVub2J0cnVzaXZlIGFzIHBvc3NpYmxlLgogICAgc2NoZWR1bGVIaWdobGlnaHQ6IGZ1bmN0aW9uKCkgewogICAgICAvLyBUaW1lb3V0cyBhcmUgcm91dGVkIHRocm91Z2ggdGhlIHBhcmVudCB3aW5kb3csIGJlY2F1c2Ugb24KICAgICAgLy8gc29tZSBicm93c2VycyBkZXNpZ25Nb2RlIHdpbmRvd3MgZG8gbm90IGZpcmUgdGltZW91dHMuCiAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgdGhpcy5wYXJlbnQuY2xlYXJUaW1lb3V0KHRoaXMuaGlnaGxpZ2h0VGltZW91dCk7CiAgICAgIHRoaXMuaGlnaGxpZ2h0VGltZW91dCA9IHRoaXMucGFyZW50LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtzZWxmLmhpZ2hsaWdodERpcnR5KCk7fSwgdGhpcy5vcHRpb25zLnBhc3NEZWxheSk7CiAgICB9LAoKICAgIC8vIEZldGNoIG9uZSBkaXJ0eSBub2RlLCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGRpcnR5IHNldC4KICAgIGdldERpcnR5Tm9kZTogZnVuY3Rpb24oKSB7CiAgICAgIHdoaWxlICh0aGlzLmRpcnR5Lmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgZm91bmQgPSB0aGlzLmRpcnR5LnBvcCgpOwogICAgICAgIC8vIElFOCBzb21ldGltZXMgdGhyb3dzIGFuIHVuZXhwbGFpbmFibGUgJ2ludmFsaWQgYXJndW1lbnQnCiAgICAgICAgLy8gZXhjZXB0aW9uIGZvciBmb3VuZC5wYXJlbnROb2RlCiAgICAgICAgdHJ5IHsKICAgICAgICAgIC8vIElmIHRoZSBub2RlIGhhcyBiZWVuIGNvbG91cmVkIGluIHRoZSBtZWFudGltZSwgb3IgaXMgbm8KICAgICAgICAgIC8vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQsIGl0IHNob3VsZCBub3QgYmUgcmV0dXJuZWQuCiAgICAgICAgICB3aGlsZSAoZm91bmQgJiYgZm91bmQucGFyZW50Tm9kZSAhPSB0aGlzLmNvbnRhaW5lcikKICAgICAgICAgICAgZm91bmQgPSBmb3VuZC5wYXJlbnROb2RlOwogICAgICAgICAgaWYgKGZvdW5kICYmIChmb3VuZC5kaXJ0eSB8fCBmb3VuZC5ub2RlVHlwZSA9PSAzKSkKICAgICAgICAgICAgcmV0dXJuIGZvdW5kOwogICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9LAoKICAgIC8vIFBpY2sgZGlydHkgbm9kZXMsIGFuZCBoaWdobGlnaHQgdGhlbSwgdW50aWwgb3B0aW9ucy5wYXNzVGltZQogICAgLy8gbWlsbGlzZWNvbmRzIGhhdmUgZ29uZSBieS4gVGhlIGhpZ2hsaWdodCBtZXRob2Qgd2lsbCBjb250aW51ZQogICAgLy8gdG8gbmV4dCBsaW5lcyBhcyBsb25nIGFzIGl0IGZpbmRzIGRpcnR5IG5vZGVzLiBJdCByZXR1cm5zCiAgICAvLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGxhY2Ugd2hlcmUgaXQgc3RvcHBlZC4gSWYgdGhlcmUgYXJlCiAgICAvLyBkaXJ0eSBub2RlcyBsZWZ0IGFmdGVyIHRoaXMgZnVuY3Rpb24gaGFzIHNwZW50IGFsbCBpdHMgbGluZXMsCiAgICAvLyBpdCBzaGVkdWxlcyBhbm90aGVyIGhpZ2hsaWdodCB0byBmaW5pc2ggdGhlIGpvYi4KICAgIGhpZ2hsaWdodERpcnR5OiBmdW5jdGlvbihmb3JjZSkgewogICAgICAvLyBQcmV2ZW50IEZGIGZyb20gcmFpc2luZyBhbiBlcnJvciB3aGVuIGl0IGlzIGZpcmluZyB0aW1lb3V0cwogICAgICAvLyBvbiBhIHBhZ2UgdGhhdCdzIG5vIGxvbmdlciBsb2FkZWQuCiAgICAgIGlmICghd2luZG93LnNlbGVjdCkgcmV0dXJuIGZhbHNlOwoKICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucmVhZE9ubHkpIHNlbGVjdC5tYXJrU2VsZWN0aW9uKHRoaXMud2luKTsKICAgICAgdmFyIHN0YXJ0LCBlbmRUaW1lID0gZm9yY2UgPyBudWxsIDogdGltZSgpICsgdGhpcy5vcHRpb25zLnBhc3NUaW1lOwogICAgICB3aGlsZSAoKHRpbWUoKSA8IGVuZFRpbWUgfHwgZm9yY2UpICYmIChzdGFydCA9IHRoaXMuZ2V0RGlydHlOb2RlKCkpKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuaGlnaGxpZ2h0KHN0YXJ0LCBlbmRUaW1lKTsKICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5ub2RlICYmIHJlc3VsdC5kaXJ0eSkKICAgICAgICAgIHRoaXMuYWRkRGlydHlOb2RlKHJlc3VsdC5ub2RlKTsKICAgICAgfQogICAgICBpZiAoIXRoaXMub3B0aW9ucy5yZWFkT25seSkgc2VsZWN0LnNlbGVjdE1hcmtlZCgpOwogICAgICBpZiAoc3RhcnQpIHRoaXMuc2NoZWR1bGVIaWdobGlnaHQoKTsKICAgICAgcmV0dXJuIHRoaXMuZGlydHkubGVuZ3RoID09IDA7CiAgICB9LAoKICAgIC8vIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCB0aHJvdWdoIGEgdGltZW91dCwgd2lsbAogICAgLy8gY29udGludW91c2x5IHJlLXBhcnNlIHRoZSBkb2N1bWVudC4KICAgIGRvY3VtZW50U2Nhbm5lcjogZnVuY3Rpb24ocGFzc1RpbWUpIHsKICAgICAgdmFyIHNlbGYgPSB0aGlzLCBwb3MgPSBudWxsOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gRkYgdGltZW91dCB3ZWlyZG5lc3Mgd29ya2Fyb3VuZC4KICAgICAgICBpZiAoIXdpbmRvdy5zZWxlY3QpIHJldHVybjsKICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBub2RlIGlzIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQuLi4gb2gKICAgICAgICAvLyB3ZWxsLCB3ZSBzdGFydCBvdmVyLgogICAgICAgIGlmIChwb3MgJiYgcG9zLnBhcmVudE5vZGUgIT0gc2VsZi5jb250YWluZXIpCiAgICAgICAgICBwb3MgPSBudWxsOwogICAgICAgIHNlbGVjdC5tYXJrU2VsZWN0aW9uKHNlbGYud2luKTsKICAgICAgICB2YXIgcmVzdWx0ID0gc2VsZi5oaWdobGlnaHQocG9zLCB0aW1lKCkgKyBwYXNzVGltZSwgdHJ1ZSk7CiAgICAgICAgc2VsZWN0LnNlbGVjdE1hcmtlZCgpOwogICAgICAgIHZhciBuZXdQb3MgPSByZXN1bHQgPyAocmVzdWx0Lm5vZGUgJiYgcmVzdWx0Lm5vZGUubmV4dFNpYmxpbmcpIDogbnVsbDsKICAgICAgICBwb3MgPSAocG9zID09IG5ld1BvcykgPyBudWxsIDogbmV3UG9zOwogICAgICAgIHNlbGYuZGVsYXlTY2FubmluZygpOwogICAgICB9OwogICAgfSwKCiAgICAvLyBTdGFydHMgdGhlIGNvbnRpbnVvdXMgc2Nhbm5pbmcgcHJvY2VzcyBmb3IgdGhpcyBkb2N1bWVudCBhZnRlcgogICAgLy8gYSBnaXZlbiBpbnRlcnZhbC4KICAgIGRlbGF5U2Nhbm5pbmc6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5zY2FubmVyKSB7CiAgICAgICAgdGhpcy5wYXJlbnQuY2xlYXJUaW1lb3V0KHRoaXMuZG9jdW1lbnRTY2FuKTsKICAgICAgICB0aGlzLmRvY3VtZW50U2NhbiA9IHRoaXMucGFyZW50LnNldFRpbWVvdXQodGhpcy5zY2FubmVyLCB0aGlzLm9wdGlvbnMuY29udGludW91c1NjYW5uaW5nKTsKICAgICAgfQogICAgfSwKCiAgICBpc0lNRU9uOiBmdW5jdGlvbigpIHsKICAgICAgLy8gY2hyb21lOiAga2V5RG93biBrZXlDb2RlIGlzIDIyOSB3aGlsZSBJTUUgb24KICAgICAgLy8gZmlyZWZveDogbm8ga2V5VXBzIG9yIGtleVByZXNzZXMgZmlyZXMgYWZ0ZXIgZmlyc3Qga2V5RG93biB3aGlsZSBJTUUgb24KICAgICAgcmV0dXJuIHRoaXMubGFzdEtleURvd25Db2RlID09IDIyOSB8fCB0aGlzLmtleVVwT3JQcmVzc0FmdGVyTGFzdEtleURvd24gPT09IGZhbHNlOwogICAgfSwKCiAgICAvLyBUaGUgZnVuY3Rpb24gdGhhdCBkb2VzIHRoZSBhY3R1YWwgaGlnaGxpZ2h0aW5nL2NvbG91cmluZyAod2l0aAogICAgLy8gaGVscCBmcm9tIHRoZSBwYXJzZXIgYW5kIHRoZSBET00gbm9ybWFsaXplcikuIEl0cyBpbnRlcmZhY2UgaXMKICAgIC8vIHJhdGhlciBvdmVyY29tcGxpY2F0ZWQsIGJlY2F1c2UgaXQgaXMgdXNlZCBpbiBkaWZmZXJlbnQKICAgIC8vIHNpdHVhdGlvbnM6IGVuc3VyaW5nIHRoYXQgYSBjZXJ0YWluIGxpbmUgaXMgaGlnaGxpZ2h0ZWQsIG9yCiAgICAvLyBoaWdobGlnaHRpbmcgdXAgdG8gWCBtaWxsaXNlY29uZHMgc3RhcnRpbmcgZnJvbSBhIGNlcnRhaW4KICAgIC8vIHBvaW50LiBUaGUgJ2Zyb20nIGFyZ3VtZW50IGdpdmVzIHRoZSBub2RlIGF0IHdoaWNoIGl0IHNob3VsZAogICAgLy8gc3RhcnQuIElmIHRoaXMgaXMgbnVsbCwgaXQgd2lsbCBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQogICAgLy8gZG9jdW1lbnQuIFdoZW4gYSB0aW1lc3RhbXAgaXMgZ2l2ZW4gd2l0aCB0aGUgJ3RhcmdldCcgYXJndW1lbnQsCiAgICAvLyBpdCB3aWxsIHN0b3AgaGlnaGxpZ2h0aW5nIGF0IHRoYXQgdGltZS4gSWYgdGhpcyBhcmd1bWVudCBob2xkcwogICAgLy8gYSBET00gbm9kZSwgaXQgd2lsbCBoaWdobGlnaHQgdW50aWwgaXQgcmVhY2hlcyB0aGF0IG5vZGUuIElmIGF0CiAgICAvLyBhbnkgdGltZSBpdCBjb21lcyBhY3Jvc3MgdHdvICdjbGVhbicgbGluZXMgKG5vIGRpcnR5IG5vZGVzKSwgaXQKICAgIC8vIHdpbGwgc3RvcCwgZXhjZXB0IHdoZW4gJ2NsZWFuTGluZXMnIGlzIHRydWUuIG1heEJhY2t0cmFjayBpcwogICAgLy8gdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIGJhY2t0cmFjayB0byBmaW5kIGFuIGV4aXN0aW5nCiAgICAvLyBwYXJzZXIgaW5zdGFuY2UuIFRoaXMgaXMgdXNlZCB0byBnaXZlIHVwIGluIHNpdHVhdGlvbnMgd2hlcmUgYQogICAgLy8gaGlnaGxpZ2h0IHdvdWxkIHRha2UgdG9vIGxvbmcgYW5kIGZyZWV6ZSB0aGUgYnJvd3NlciBpbnRlcmZhY2UuCiAgICBoaWdobGlnaHQ6IGZ1bmN0aW9uKGZyb20sIHRhcmdldCwgY2xlYW5MaW5lcywgbWF4QmFja3RyYWNrKXsKICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLCBzZWxmID0gdGhpcywgYWN0aXZlID0gdGhpcy5vcHRpb25zLmFjdGl2ZVRva2VuczsKICAgICAgdmFyIGVuZFRpbWUgPSAodHlwZW9mIHRhcmdldCA9PSAibnVtYmVyIiA/IHRhcmdldCA6IG51bGwpOwoKICAgICAgaWYgKCFjb250YWluZXIuZmlyc3RDaGlsZCB8fCB0aGlzLmlzSU1FT24oKSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIC8vIEJhY2t0cmFjayB0byB0aGUgZmlyc3Qgbm9kZSBiZWZvcmUgZnJvbSB0aGF0IGhhcyBhIHBhcnRpYWwKICAgICAgLy8gcGFyc2Ugc3RvcmVkLgogICAgICB3aGlsZSAoZnJvbSAmJiAoIWZyb20ucGFyc2VyRnJvbUhlcmUgfHwgZnJvbS5kaXJ0eSkpIHsKICAgICAgICBpZiAobWF4QmFja3RyYWNrICE9IG51bGwgJiYgaXNCUihmcm9tKSAmJiAoLS1tYXhCYWNrdHJhY2spIDwgMCkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBmcm9tID0gZnJvbS5wcmV2aW91c1NpYmxpbmc7CiAgICAgIH0KICAgICAgLy8gSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LCBkbyBub3RoaW5nLgogICAgICBpZiAoZnJvbSAmJiAhZnJvbS5uZXh0U2libGluZykKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAvLyBDaGVjayB3aGV0aGVyIGEgcGFydCAoPHNwYW4+IG5vZGUpIGFuZCB0aGUgY29ycmVzcG9uZGluZyB0b2tlbgogICAgICAvLyBtYXRjaC4KICAgICAgZnVuY3Rpb24gY29ycmVjdFBhcnQodG9rZW4sIHBhcnQpewogICAgICAgIHJldHVybiAhcGFydC5yZWR1Y2VkICYmIHBhcnQuY3VycmVudFRleHQgPT0gdG9rZW4udmFsdWUgJiYgcGFydC5jbGFzc05hbWUgPT0gdG9rZW4uc3R5bGU7CiAgICAgIH0KICAgICAgLy8gU2hvcnRlbiB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0IGJ5IGNob3BwaW5nIG9mZgogICAgICAvLyBjaGFyYWN0ZXJzIGZyb20gdGhlIGZyb250LiBOb3RlIHRoYXQgb25seSB0aGUgY3VycmVudFRleHQKICAgICAgLy8gcHJvcGVydHkgZ2V0cyBjaGFuZ2VkLiBGb3IgZWZmaWNpZW5jeSByZWFzb25zLCB3ZSBsZWF2ZSB0aGUKICAgICAgLy8gbm9kZVZhbHVlIGFsb25lIC0tIHdlIHNldCB0aGUgcmVkdWNlZCBmbGFnIHRvIGluZGljYXRlIHRoYXQKICAgICAgLy8gdGhpcyBwYXJ0IG11c3QgYmUgcmVwbGFjZWQuCiAgICAgIGZ1bmN0aW9uIHNob3J0ZW5QYXJ0KHBhcnQsIG1pbnVzKXsKICAgICAgICBwYXJ0LmN1cnJlbnRUZXh0ID0gcGFydC5jdXJyZW50VGV4dC5zdWJzdHJpbmcobWludXMpOwogICAgICAgIHBhcnQucmVkdWNlZCA9IHRydWU7CiAgICAgIH0KICAgICAgLy8gQ3JlYXRlIGEgcGFydCBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gdG9rZW4uCiAgICAgIGZ1bmN0aW9uIHRva2VuUGFydCh0b2tlbil7CiAgICAgICAgdmFyIHBhcnQgPSBtYWtlUGFydFNwYW4odG9rZW4udmFsdWUsIHNlbGYuZG9jKTsgICAgIAogICAgICAgIHBhcnQuY2xhc3NOYW1lID0gdG9rZW4uc3R5bGU7CiAgICAgICAgcmV0dXJuIHBhcnQ7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1heWJlVG91Y2gobm9kZSkgewogICAgICAgIGlmIChub2RlKSB7CiAgICAgICAgICB2YXIgb2xkID0gbm9kZS5vbGROZXh0U2libGluZzsKICAgICAgICAgIGlmIChsaW5lRGlydHkgfHwgb2xkID09PSB1bmRlZmluZWQgfHwgbm9kZS5uZXh0U2libGluZyAhPSBvbGQpCiAgICAgICAgICAgIHNlbGYuaGlzdG9yeS50b3VjaChub2RlKTsKICAgICAgICAgIG5vZGUub2xkTmV4dFNpYmxpbmcgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciBvbGQgPSBzZWxmLmNvbnRhaW5lci5vbGRGaXJzdENoaWxkOwogICAgICAgICAgaWYgKGxpbmVEaXJ0eSB8fCBvbGQgPT09IHVuZGVmaW5lZCB8fCBzZWxmLmNvbnRhaW5lci5maXJzdENoaWxkICE9IG9sZCkKICAgICAgICAgICAgc2VsZi5oaXN0b3J5LnRvdWNoKG51bGwpOwogICAgICAgICAgc2VsZi5jb250YWluZXIub2xkRmlyc3RDaGlsZCA9IHNlbGYuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBHZXQgdGhlIHRva2VuIHN0cmVhbS4gSWYgZnJvbSBpcyBudWxsLCB3ZSBzdGFydCB3aXRoIGEgbmV3CiAgICAgIC8vIHBhcnNlciBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZnJhbWUsIG90aGVyd2lzZSBhIHBhcnRpYWwgcGFyc2UKICAgICAgLy8gaXMgcmVzdW1lZC4KICAgICAgdmFyIHRyYXZlcnNhbCA9IHRyYXZlcnNlRE9NKGZyb20gPyBmcm9tLm5leHRTaWJsaW5nIDogY29udGFpbmVyLmZpcnN0Q2hpbGQpLAogICAgICAgICAgc3RyZWFtID0gc3RyaW5nU3RyZWFtKHRyYXZlcnNhbCksCiAgICAgICAgICBwYXJzZWQgPSBmcm9tID8gZnJvbS5wYXJzZXJGcm9tSGVyZShzdHJlYW0pIDogRWRpdG9yLlBhcnNlci5tYWtlKHN0cmVhbSk7CgogICAgICBmdW5jdGlvbiBzdXJyb3VuZGVkQnlCUnMobm9kZSkgewogICAgICAgIHJldHVybiAobm9kZS5wcmV2aW91c1NpYmxpbmcgPT0gbnVsbCB8fCBpc0JSKG5vZGUucHJldmlvdXNTaWJsaW5nKSkgJiYKICAgICAgICAgICAgICAgKG5vZGUubmV4dFNpYmxpbmcgPT0gbnVsbCB8fCBpc0JSKG5vZGUubmV4dFNpYmxpbmcpKTsKICAgICAgfQoKICAgICAgLy8gcGFydHMgaXMgYW4gaW50ZXJmYWNlIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gJ2RlbGF5JyBmZXRjaGluZwogICAgICAvLyB0aGUgbmV4dCBET00gbm9kZSB1bnRpbCB3ZSBhcmUgY29tcGxldGVseSBkb25lIHdpdGggdGhlIG9uZQogICAgICAvLyBiZWZvcmUgaXQuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb2Z0ZW4gdGhlIG5leHQgbm9kZSBpcwogICAgICAvLyBub3QgeWV0IGF2YWlsYWJsZSB3aGVuIHdlIHdhbnQgdG8gcHJvY2VlZCBwYXN0IHRoZSBjdXJyZW50CiAgICAgIC8vIG9uZS4KICAgICAgdmFyIHBhcnRzID0gewogICAgICAgIGN1cnJlbnQ6IG51bGwsCiAgICAgICAgLy8gRmV0Y2ggY3VycmVudCBub2RlLgogICAgICAgIGdldDogZnVuY3Rpb24oKXsKICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50KQogICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB0cmF2ZXJzYWwubm9kZXMuc2hpZnQoKTsKICAgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQ7CiAgICAgICAgfSwKICAgICAgICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHBhcnQgKGRvIG5vdCBmZXRjaCBpdCB5ZXQpLgogICAgICAgIG5leHQ6IGZ1bmN0aW9uKCl7CiAgICAgICAgICB0aGlzLmN1cnJlbnQgPSBudWxsOwogICAgICAgIH0sCiAgICAgICAgLy8gUmVtb3ZlIHRoZSBjdXJyZW50IHBhcnQgZnJvbSB0aGUgRE9NIHRyZWUsIGFuZCBtb3ZlIHRvIHRoZQogICAgICAgIC8vIG5leHQuCiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbigpewogICAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMuZ2V0KCkpOwogICAgICAgICAgdGhpcy5jdXJyZW50ID0gbnVsbDsKICAgICAgICB9LAogICAgICAgIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgcGFydCB0aGF0IGlzIG5vdCBlbXB0eSwgZGlzY2FyZGluZyBlbXB0eQogICAgICAgIC8vIHBhcnRzLgogICAgICAgIGdldE5vbkVtcHR5OiBmdW5jdGlvbigpewogICAgICAgICAgdmFyIHBhcnQgPSB0aGlzLmdldCgpOwogICAgICAgICAgLy8gQWxsb3cgZW1wdHkgbm9kZXMgd2hlbiB0aGV5IGFyZSBhbG9uZSBvbiBhIGxpbmUsIG5lZWRlZAogICAgICAgICAgLy8gZm9yIHRoZSBGRiBjdXJzb3IgYnVnIHdvcmthcm91bmQgKHNlZSBzZWxlY3QuanMsCiAgICAgICAgICAvLyBpbnNlcnROZXdsaW5lQXRDdXJzb3IpLgogICAgICAgICAgd2hpbGUgKHBhcnQgJiYgaXNTcGFuKHBhcnQpICYmIHBhcnQuY3VycmVudFRleHQgPT0gIiIpIHsKICAgICAgICAgICAgLy8gTGVhdmUgZW1wdHkgbm9kZXMgdGhhdCBhcmUgYWxvbmUgb24gYSBsaW5lIGFsb25lIGluCiAgICAgICAgICAgIC8vIE9wZXJhLCBzaW5jZSB0aGF0IGJyb3dzZXJzIGRvZXNuJ3QgZGVhbCB3ZWxsIHdpdGgKICAgICAgICAgICAgLy8gaGF2aW5nIDIgQlJzIGluIGEgcm93LgogICAgICAgICAgICBpZiAod2luZG93Lm9wZXJhICYmIHN1cnJvdW5kZWRCeUJScyhwYXJ0KSkgewogICAgICAgICAgICAgIHRoaXMubmV4dCgpOwogICAgICAgICAgICAgIHBhcnQgPSB0aGlzLmdldCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIHZhciBvbGQgPSBwYXJ0OwogICAgICAgICAgICAgIHRoaXMucmVtb3ZlKCk7CiAgICAgICAgICAgICAgcGFydCA9IHRoaXMuZ2V0KCk7CiAgICAgICAgICAgICAgLy8gQWRqdXN0IHNlbGVjdGlvbiBpbmZvcm1hdGlvbiwgaWYgYW55LiBTZWUgc2VsZWN0LmpzIGZvciBkZXRhaWxzLgogICAgICAgICAgICAgIHNlbGVjdC5zbmFwc2hvdE1vdmUob2xkLmZpcnN0Q2hpbGQsIHBhcnQgJiYgKHBhcnQuZmlyc3RDaGlsZCB8fCBwYXJ0KSwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIHBhcnQ7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgdmFyIGxpbmVEaXJ0eSA9IGZhbHNlLCBwcmV2TGluZURpcnR5ID0gdHJ1ZSwgbGluZU5vZGVzID0gMDsKCiAgICAgIC8vIFRoaXMgZm9yRWFjaCBsb29wcyBvdmVyIHRoZSB0b2tlbnMgZnJvbSB0aGUgcGFyc2VkIHN0cmVhbSwgYW5kCiAgICAgIC8vIGF0IHRoZSBzYW1lIHRpbWUgdXNlcyB0aGUgcGFydHMgb2JqZWN0IHRvIHByb2NlZWQgdGhyb3VnaCB0aGUKICAgICAgLy8gY29ycmVzcG9uZGluZyBET00gbm9kZXMuCiAgICAgIGZvckVhY2gocGFyc2VkLCBmdW5jdGlvbih0b2tlbil7CiAgICAgICAgdmFyIHBhcnQgPSBwYXJ0cy5nZXROb25FbXB0eSgpOwoKICAgICAgICBpZiAodG9rZW4udmFsdWUgPT0gIlxuIil7CiAgICAgICAgICAvLyBUaGUgaWRlYSBvZiB0aGUgdHdvIHN0cmVhbXMgYWN0dWFsbHkgc3RheWluZyBzeW5jaHJvbml6ZWQKICAgICAgICAgIC8vIGlzIHN1Y2ggYSBsb25nIHNob3QgdGhhdCB3ZSBleHBsaWNpdGx5IGNoZWNrLgogICAgICAgICAgaWYgKCFpc0JSKHBhcnQpKQogICAgICAgICAgICB0aHJvdyAiUGFyc2VyIG91dCBvZiBzeW5jLiBFeHBlY3RlZCBCUi4iOwoKICAgICAgICAgIGlmIChwYXJ0LmRpcnR5IHx8ICFwYXJ0LmluZGVudGF0aW9uKSBsaW5lRGlydHkgPSB0cnVlOwogICAgICAgICAgbWF5YmVUb3VjaChmcm9tKTsKICAgICAgICAgIGZyb20gPSBwYXJ0OwoKICAgICAgICAgIC8vIEV2ZXJ5IDxicj4gZ2V0cyBhIGNvcHkgb2YgdGhlIHBhcnNlciBzdGF0ZSBhbmQgYSBsZXhpY2FsCiAgICAgICAgICAvLyBjb250ZXh0IGFzc2lnbmVkIHRvIGl0LiBUaGUgZmlyc3QgaXMgdXNlZCB0byBiZSBhYmxlIHRvCiAgICAgICAgICAvLyBsYXRlciByZXN1bWUgcGFyc2luZyBmcm9tIHRoaXMgcG9pbnQsIHRoZSBzZWNvbmQgaXMgdXNlZAogICAgICAgICAgLy8gZm9yIGluZGVudGF0aW9uLgogICAgICAgICAgcGFydC5wYXJzZXJGcm9tSGVyZSA9IHBhcnNlZC5jb3B5KCk7CiAgICAgICAgICBwYXJ0LmluZGVudGF0aW9uID0gdG9rZW4uaW5kZW50YXRpb247CiAgICAgICAgICBwYXJ0LmRpcnR5ID0gZmFsc2U7CgogICAgICAgICAgLy8gSWYgdGhlIHRhcmdldCBhcmd1bWVudCB3YXNuJ3QgYW4gaW50ZWdlciwgZ28gYXQgbGVhc3QKICAgICAgICAgIC8vIHVudGlsIHRoYXQgbm9kZS4KICAgICAgICAgIGlmIChlbmRUaW1lID09IG51bGwgJiYgcGFydCA9PSB0YXJnZXQpIHRocm93IFN0b3BJdGVyYXRpb247CgogICAgICAgICAgLy8gQSBjbGVhbiBsaW5lIHdpdGggbW9yZSB0aGFuIG9uZSBub2RlIG1lYW5zIHdlIGFyZSBkb25lLgogICAgICAgICAgLy8gVGhyb3dpbmcgYSBTdG9wSXRlcmF0aW9uIGlzIHRoZSB3YXkgdG8gYnJlYWsgb3V0IG9mIGEKICAgICAgICAgIC8vIE1vY2hpS2l0IGZvckVhY2ggbG9vcC4KICAgICAgICAgIGlmICgoZW5kVGltZSAhPSBudWxsICYmIHRpbWUoKSA+PSBlbmRUaW1lKSB8fCAoIWxpbmVEaXJ0eSAmJiAhcHJldkxpbmVEaXJ0eSAmJiBsaW5lTm9kZXMgPiAxICYmICFjbGVhbkxpbmVzKSkKICAgICAgICAgICAgdGhyb3cgU3RvcEl0ZXJhdGlvbjsKICAgICAgICAgIHByZXZMaW5lRGlydHkgPSBsaW5lRGlydHk7IGxpbmVEaXJ0eSA9IGZhbHNlOyBsaW5lTm9kZXMgPSAwOwogICAgICAgICAgcGFydHMubmV4dCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGlmICghaXNTcGFuKHBhcnQpKQogICAgICAgICAgICB0aHJvdyAiUGFyc2VyIG91dCBvZiBzeW5jLiBFeHBlY3RlZCBTUEFOLiI7CiAgICAgICAgICBpZiAocGFydC5kaXJ0eSkKICAgICAgICAgICAgbGluZURpcnR5ID0gdHJ1ZTsKICAgICAgICAgIGxpbmVOb2RlcysrOwoKICAgICAgICAgIC8vIElmIHRoZSBwYXJ0IG1hdGNoZXMgdGhlIHRva2VuLCB3ZSBjYW4gbGVhdmUgaXQgYWxvbmUuCiAgICAgICAgICBpZiAoY29ycmVjdFBhcnQodG9rZW4sIHBhcnQpKXsKICAgICAgICAgICAgcGFydC5kaXJ0eSA9IGZhbHNlOwogICAgICAgICAgICBwYXJ0cy5uZXh0KCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgdG8gZml4IGl0LgogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGxpbmVEaXJ0eSA9IHRydWU7CiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgY29ycmVjdCBwYXJ0LgogICAgICAgICAgICB2YXIgbmV3UGFydCA9IHRva2VuUGFydCh0b2tlbik7CiAgICAgICAgICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUobmV3UGFydCwgcGFydCk7CiAgICAgICAgICAgIGlmIChhY3RpdmUpIGFjdGl2ZShuZXdQYXJ0LCB0b2tlbiwgc2VsZik7CiAgICAgICAgICAgIHZhciB0b2tlbnNpemUgPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgIHZhciBvZmZzZXQgPSAwOwogICAgICAgICAgICAvLyBFYXQgdXAgcGFydHMgdW50aWwgdGhlIHRleHQgZm9yIHRoaXMgdG9rZW4gaGFzIGJlZW4KICAgICAgICAgICAgLy8gcmVtb3ZlZCwgYWRqdXN0aW5nIHRoZSBzdG9yZWQgc2VsZWN0aW9uIGluZm8gKHNlZQogICAgICAgICAgICAvLyBzZWxlY3QuanMpIGluIHRoZSBwcm9jZXNzLgogICAgICAgICAgICB3aGlsZSAodG9rZW5zaXplID4gMCkgewogICAgICAgICAgICAgIHBhcnQgPSBwYXJ0cy5nZXQoKTsKICAgICAgICAgICAgICB2YXIgcGFydHNpemUgPSBwYXJ0LmN1cnJlbnRUZXh0Lmxlbmd0aDsKICAgICAgICAgICAgICBzZWxlY3Quc25hcHNob3RSZXBsYWNlTm9kZShwYXJ0LmZpcnN0Q2hpbGQsIG5ld1BhcnQuZmlyc3RDaGlsZCwgdG9rZW5zaXplLCBvZmZzZXQpOwogICAgICAgICAgICAgIGlmIChwYXJ0c2l6ZSA+IHRva2Vuc2l6ZSl7CiAgICAgICAgICAgICAgICBzaG9ydGVuUGFydChwYXJ0LCB0b2tlbnNpemUpOwogICAgICAgICAgICAgICAgdG9rZW5zaXplID0gMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0b2tlbnNpemUgLT0gcGFydHNpemU7CiAgICAgICAgICAgICAgICBvZmZzZXQgKz0gcGFydHNpemU7CiAgICAgICAgICAgICAgICBwYXJ0cy5yZW1vdmUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBtYXliZVRvdWNoKGZyb20pOwoKICAgICAgLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgc29tZSBzdGF0dXMgaW5mb3JtYXRpb24gdGhhdCBpcyB1c2VkIGJ5CiAgICAgIC8vIGhpZ2h0bGlnaHREaXJ0eSB0byBkZXRlcm1pbmUgd2hldGhlciBhbmQgd2hlcmUgaXQgaGFzIHRvCiAgICAgIC8vIGNvbnRpbnVlLgogICAgICByZXR1cm4ge25vZGU6IHBhcnRzLmdldE5vbkVtcHR5KCksCiAgICAgICAgICAgICAgZGlydHk6IGxpbmVEaXJ0eX07CiAgICB9CiAgfTsKCiAgcmV0dXJuIEVkaXRvcjsKfSkoKTsKCmFkZEV2ZW50SGFuZGxlcih3aW5kb3csICJsb2FkIiwgZnVuY3Rpb24oKSB7CiAgdmFyIENvZGVNaXJyb3IgPSB3aW5kb3cuZnJhbWVFbGVtZW50LkNvZGVNaXJyb3I7CiAgdmFyIGUgPSBDb2RlTWlycm9yLmVkaXRvciA9IG5ldyBFZGl0b3IoQ29kZU1pcnJvci5vcHRpb25zKTsKICB0aGlzLnBhcmVudC5zZXRUaW1lb3V0KG1ldGhvZChDb2RlTWlycm9yLCAiaW5pdCIpLCAwKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/highlight.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gTWluaW1hbCBmcmFtaW5nIG5lZWRlZCB0byB1c2UgQ29kZU1pcnJvci1zdHlsZSBwYXJzZXJzIHRvIGhpZ2hsaWdodAovLyBjb2RlLiBMb2FkIHRoaXMgYWxvbmcgd2l0aCB0b2tlbml6ZS5qcywgc3RyaW5nc3RyZWFtLmpzLCBhbmQgeW91cgovLyBwYXJzZXIuIFRoZW4gY2FsbCBoaWdobGlnaHRUZXh0LCBwYXNzaW5nIGEgc3RyaW5nIGFzIHRoZSBmaXJzdAovLyBhcmd1bWVudCwgYW5kIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgZWl0aGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24KLy8gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGFycmF5IG9mIFNQQU4gbm9kZXMgZm9yIGV2ZXJ5IGxpbmUgaW4KLy8gdGhlIGNvZGUsIG9yIGEgRE9NIG5vZGUgdG8gd2hpY2ggdG8gYXBwZW5kIHRoZXNlIHNwYW5zLCBhbmQKLy8gb3B0aW9uYWxseSAobm90IG5lZWRlZCBpZiB5b3Ugb25seSBsb2FkZWQgb25lIHBhcnNlcikgYSBwYXJzZXIKLy8gb2JqZWN0LgoKLy8gU3R1ZmYgZnJvbSB1dGlsLmpzIHRoYXQgdGhlIHBhcnNlcnMgYXJlIHVzaW5nLgp2YXIgU3RvcEl0ZXJhdGlvbiA9IHt0b1N0cmluZzogZnVuY3Rpb24oKSB7cmV0dXJuICJTdG9wSXRlcmF0aW9uIn19OwoKdmFyIEVkaXRvciA9IHt9Owp2YXIgaW5kZW50VW5pdCA9IDI7CgooZnVuY3Rpb24oKXsKICBmdW5jdGlvbiBub3JtYWxpc2VTdHJpbmcoc3RyaW5nKSB7CiAgICB2YXIgdGFiID0gIiI7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluZGVudFVuaXQ7IGkrKykgdGFiICs9ICIgIjsKCiAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvXHQvZywgdGFiKS5yZXBsYWNlKC9cdTAwYTAvZywgIiAiKS5yZXBsYWNlKC9cclxuPy9nLCAiXG4iKTsKICAgIHZhciBwb3MgPSAwLCBwYXJ0cyA9IFtdLCBsaW5lcyA9IHN0cmluZy5zcGxpdCgiXG4iKTsKICAgIGZvciAodmFyIGxpbmUgPSAwOyBsaW5lIDwgbGluZXMubGVuZ3RoOyBsaW5lKyspIHsKICAgICAgaWYgKGxpbmUgIT0gMCkgcGFydHMucHVzaCgiXG4iKTsKICAgICAgcGFydHMucHVzaChsaW5lc1tsaW5lXSk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHBvcyA8IHBhcnRzLmxlbmd0aCkgcmV0dXJuIHBhcnRzW3BvcysrXTsKICAgICAgICBlbHNlIHRocm93IFN0b3BJdGVyYXRpb247CiAgICAgIH0KICAgIH07CiAgfQoKICB3aW5kb3cuaGlnaGxpZ2h0VGV4dCA9IGZ1bmN0aW9uKHN0cmluZywgY2FsbGJhY2ssIHBhcnNlcikgewogICAgcGFyc2VyID0gKHBhcnNlciB8fCBFZGl0b3IuUGFyc2VyKS5tYWtlKHN0cmluZ1N0cmVhbShub3JtYWxpc2VTdHJpbmcoc3RyaW5nKSkpOwogICAgdmFyIGxpbmUgPSBbXTsKICAgIGlmIChjYWxsYmFjay5ub2RlVHlwZSA9PSAxKSB7CiAgICAgIHZhciBub2RlID0gY2FsbGJhY2s7CiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24obGluZSkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKykKICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQobGluZVtpXSk7CiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJCUiIpKTsKICAgICAgfTsKICAgIH0KCiAgICB0cnkgewogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIHZhciB0b2tlbiA9IHBhcnNlci5uZXh0KCk7CiAgICAgICAgaWYgKHRva2VuLnZhbHVlID09ICJcbiIpIHsKICAgICAgICAgIGNhbGxiYWNrKGxpbmUpOwogICAgICAgICAgbGluZSA9IFtdOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiU1BBTiIpOwogICAgICAgICAgc3Bhbi5jbGFzc05hbWUgPSB0b2tlbi5zdHlsZTsKICAgICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodG9rZW4udmFsdWUpKTsKICAgICAgICAgIGxpbmUucHVzaChzcGFuKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNhdGNoIChlKSB7CiAgICAgIGlmIChlICE9IFN0b3BJdGVyYXRpb24pIHRocm93IGU7CiAgICB9CiAgICBpZiAobGluZS5sZW5ndGgpIGNhbGxiYWNrKGxpbmUpOwogIH0KfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/mirrorframe.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogRGVtb25zdHJhdGlvbiBvZiBlbWJlZGRpbmcgQ29kZU1pcnJvciBpbiBhIGJpZ2dlciBhcHBsaWNhdGlvbi4gVGhlCiAqIGludGVyZmFjZSBkZWZpbmVkIGhlcmUgaXMgYSBtZXNzIG9mIHByb21wdHMgYW5kIGNvbmZpcm1zLCBhbmQKICogc2hvdWxkIHByb2JhYmx5IG5vdCBiZSB1c2VkIGluIGEgcmVhbCBwcm9qZWN0LgogKi8KCmZ1bmN0aW9uIE1pcnJvckZyYW1lKHBsYWNlLCBvcHRpb25zKSB7CiAgdGhpcy5ob21lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIik7CiAgaWYgKHBsYWNlLmFwcGVuZENoaWxkKQogICAgcGxhY2UuYXBwZW5kQ2hpbGQodGhpcy5ob21lKTsKICBlbHNlCiAgICBwbGFjZSh0aGlzLmhvbWUpOwoKICB2YXIgc2VsZiA9IHRoaXM7CiAgZnVuY3Rpb24gbWFrZUJ1dHRvbihuYW1lLCBhY3Rpb24pIHsKICAgIHZhciBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJJTlBVVCIpOwogICAgYnV0dG9uLnR5cGUgPSAiYnV0dG9uIjsKICAgIGJ1dHRvbi52YWx1ZSA9IG5hbWU7CiAgICBzZWxmLmhvbWUuYXBwZW5kQ2hpbGQoYnV0dG9uKTsKICAgIGJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24oKXtzZWxmW2FjdGlvbl0uY2FsbChzZWxmKTt9OwogIH0KCiAgbWFrZUJ1dHRvbigiU2VhcmNoIiwgInNlYXJjaCIpOwogIG1ha2VCdXR0b24oIlJlcGxhY2UiLCAicmVwbGFjZSIpOwogIG1ha2VCdXR0b24oIkN1cnJlbnQgbGluZSIsICJsaW5lIik7CiAgbWFrZUJ1dHRvbigiSnVtcCB0byBsaW5lIiwgImp1bXAiKTsKICBtYWtlQnV0dG9uKCJJbnNlcnQgY29uc3RydWN0b3IiLCAibWFjcm8iKTsKICBtYWtlQnV0dG9uKCJJbmRlbnQgYWxsIiwgInJlaW5kZW50Iik7CgogIHRoaXMubWlycm9yID0gbmV3IENvZGVNaXJyb3IodGhpcy5ob21lLCBvcHRpb25zKTsKfQoKTWlycm9yRnJhbWUucHJvdG90eXBlID0gewogIHNlYXJjaDogZnVuY3Rpb24oKSB7CiAgICB2YXIgdGV4dCA9IHByb21wdCgiRW50ZXIgc2VhcmNoIHRlcm06IiwgIiIpOwogICAgaWYgKCF0ZXh0KSByZXR1cm47CgogICAgdmFyIGZpcnN0ID0gdHJ1ZTsKICAgIGRvIHsKICAgICAgdmFyIGN1cnNvciA9IHRoaXMubWlycm9yLmdldFNlYXJjaEN1cnNvcih0ZXh0LCBmaXJzdCk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgIHdoaWxlIChjdXJzb3IuZmluZE5leHQoKSkgewogICAgICAgIGN1cnNvci5zZWxlY3QoKTsKICAgICAgICBpZiAoIWNvbmZpcm0oIlNlYXJjaCBhZ2Fpbj8iKSkKICAgICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSB3aGlsZSAoY29uZmlybSgiRW5kIG9mIGRvY3VtZW50IHJlYWNoZWQuIFN0YXJ0IG92ZXI/IikpOwogIH0sCgogIHJlcGxhY2U6IGZ1bmN0aW9uKCkgewogICAgLy8gVGhpcyBpcyBhIHJlcGxhY2UtYWxsLCBidXQgaXQgaXMgcG9zc2libGUgdG8gaW1wbGVtZW50IGEKICAgIC8vIHByb21wdGluZyByZXBsYWNlLgogICAgdmFyIGZyb20gPSBwcm9tcHQoIkVudGVyIHNlYXJjaCBzdHJpbmc6IiwgIiIpLCB0bzsKICAgIGlmIChmcm9tKSB0byA9IHByb21wdCgiV2hhdCBzaG91bGQgaXQgYmUgcmVwbGFjZWQgd2l0aD8iLCAiIik7CiAgICBpZiAodG8gPT0gbnVsbCkgcmV0dXJuOwoKICAgIHZhciBjdXJzb3IgPSB0aGlzLm1pcnJvci5nZXRTZWFyY2hDdXJzb3IoZnJvbSwgZmFsc2UpOwogICAgd2hpbGUgKGN1cnNvci5maW5kTmV4dCgpKQogICAgICBjdXJzb3IucmVwbGFjZSh0byk7CiAgfSwKCiAganVtcDogZnVuY3Rpb24oKSB7CiAgICB2YXIgbGluZSA9IHByb21wdCgiSnVtcCB0byBsaW5lOiIsICIiKTsKICAgIGlmIChsaW5lICYmICFpc05hTihOdW1iZXIobGluZSkpKQogICAgICB0aGlzLm1pcnJvci5qdW1wVG9MaW5lKE51bWJlcihsaW5lKSk7CiAgfSwKCiAgbGluZTogZnVuY3Rpb24oKSB7CiAgICBhbGVydCgiVGhlIGN1cnNvciBpcyBjdXJyZW50bHkgYXQgbGluZSAiICsgdGhpcy5taXJyb3IuY3VycmVudExpbmUoKSk7CiAgICB0aGlzLm1pcnJvci5mb2N1cygpOwogIH0sCgogIG1hY3JvOiBmdW5jdGlvbigpIHsKICAgIHZhciBuYW1lID0gcHJvbXB0KCJOYW1lIHlvdXIgY29uc3RydWN0b3I6IiwgIiIpOwogICAgaWYgKG5hbWUpCiAgICAgIHRoaXMubWlycm9yLnJlcGxhY2VTZWxlY3Rpb24oImZ1bmN0aW9uICIgKyBuYW1lICsgIigpIHtcbiAgXG59XG5cbiIgKyBuYW1lICsgIi5wcm90b3R5cGUgPSB7XG4gIFxufTtcbiIpOwogIH0sCgogIHJlaW5kZW50OiBmdW5jdGlvbigpIHsKICAgIHRoaXMubWlycm9yLnJlaW5kZW50KCk7CiAgfQp9Owo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsecss.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogU2ltcGxlIHBhcnNlciBmb3IgQ1NTICovCgp2YXIgQ1NTUGFyc2VyID0gRWRpdG9yLlBhcnNlciA9IChmdW5jdGlvbigpIHsKICB2YXIgdG9rZW5pemVDU1MgPSAoZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiBub3JtYWwoc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICBpZiAoY2ggPT0gIkAiKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1x3Lyk7CiAgICAgICAgcmV0dXJuICJjc3MtYXQiOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICIvIiAmJiBzb3VyY2UuZXF1YWxzKCIqIikpIHsKICAgICAgICBzZXRTdGF0ZShpbkNDb21tZW50KTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiPCIgJiYgc291cmNlLmVxdWFscygiISIpKSB7CiAgICAgICAgc2V0U3RhdGUoaW5TR01MQ29tbWVudCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIj0iKSB7CiAgICAgICAgcmV0dXJuICJjc3MtY29tcGFyZSI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoc291cmNlLmVxdWFscygiPSIpICYmIChjaCA9PSAifiIgfHwgY2ggPT0gInwiKSkgewogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgcmV0dXJuICJjc3MtY29tcGFyZSI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIlwiIiB8fCBjaCA9PSAiJyIpIHsKICAgICAgICBzZXRTdGF0ZShpblN0cmluZyhjaCkpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICIjIikgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9cdy8pOwogICAgICAgIHJldHVybiAiY3NzLWhhc2giOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICIhIikgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bIFx0XS8pOwogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9cdy8pOwogICAgICAgIHJldHVybiAiY3NzLWltcG9ydGFudCI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHcuJV0vKTsKICAgICAgICByZXR1cm4gImNzcy11bml0IjsKICAgICAgfQogICAgICBlbHNlIGlmICgvWywuKz4qXC9dLy50ZXN0KGNoKSkgewogICAgICAgIHJldHVybiAiY3NzLXNlbGVjdC1vcCI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoL1s7e306XFtcXV0vLnRlc3QoY2gpKSB7CiAgICAgICAgcmV0dXJuICJjc3MtcHVuY3R1YXRpb24iOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHdcXFwtX10vKTsKICAgICAgICByZXR1cm4gImNzcy1pZGVudGlmaWVyIjsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGluQ0NvbW1lbnQoc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZTsKICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKICAgICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICAgIGlmIChtYXliZUVuZCAmJiBjaCA9PSAiLyIpIHsKICAgICAgICAgIHNldFN0YXRlKG5vcm1hbCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgICAgfQogICAgICByZXR1cm4gImNzcy1jb21tZW50IjsKICAgIH0KCiAgICBmdW5jdGlvbiBpblNHTUxDb21tZW50KHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgdmFyIGRhc2hlcyA9IDA7CiAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgdmFyIGNoID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAoZGFzaGVzID49IDIgJiYgY2ggPT0gIj4iKSB7CiAgICAgICAgICBzZXRTdGF0ZShub3JtYWwpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGRhc2hlcyA9IChjaCA9PSAiLSIpID8gZGFzaGVzICsgMSA6IDA7CiAgICAgIH0KICAgICAgcmV0dXJuICJjc3MtY29tbWVudCI7CiAgICB9CgogICAgZnVuY3Rpb24gaW5TdHJpbmcocXVvdGUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlOwogICAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICAgICAgaWYgKGNoID09IHF1b3RlICYmICFlc2NhcGVkKQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBjaCA9PSAiXFwiOwogICAgICAgIH0KICAgICAgICBpZiAoIWVzY2FwZWQpCiAgICAgICAgICBzZXRTdGF0ZShub3JtYWwpOwogICAgICAgIHJldHVybiAiY3NzLXN0cmluZyI7CiAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc3RhcnRTdGF0ZSkgewogICAgICByZXR1cm4gdG9rZW5pemVyKHNvdXJjZSwgc3RhcnRTdGF0ZSB8fCBub3JtYWwpOwogICAgfTsKICB9KSgpOwoKICBmdW5jdGlvbiBpbmRlbnRDU1MoaW5CcmFjZXMsIGluUnVsZSwgYmFzZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKG5leHRDaGFycykgewogICAgICBpZiAoIWluQnJhY2VzIHx8IC9eXH0vLnRlc3QobmV4dENoYXJzKSkgcmV0dXJuIGJhc2U7CiAgICAgIGVsc2UgaWYgKGluUnVsZSkgcmV0dXJuIGJhc2UgKyBpbmRlbnRVbml0ICogMjsKICAgICAgZWxzZSByZXR1cm4gYmFzZSArIGluZGVudFVuaXQ7CiAgICB9OwogIH0KCiAgLy8gVGhpcyBpcyBhIHZlcnkgc2ltcGxpc3RpYyBwYXJzZXIgLS0gc2luY2UgQ1NTIGRvZXMgbm90IHJlYWxseQogIC8vIG5lc3QsIGl0IHdvcmtzIGFjY2VwdGFibHkgd2VsbCwgYnV0IHNvbWUgbmljZXIgY29sb3Vyb2luZyBjb3VsZAogIC8vIGJlIHByb3ZpZGVkIHdpdGggYSBtb3JlIGNvbXBsaWNhdGVkIHBhcnNlci4KICBmdW5jdGlvbiBwYXJzZUNTUyhzb3VyY2UsIGJhc2Vjb2x1bW4pIHsKICAgIGJhc2Vjb2x1bW4gPSBiYXNlY29sdW1uIHx8IDA7CiAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVDU1Moc291cmNlKTsKICAgIHZhciBpbkJyYWNlcyA9IGZhbHNlLCBpblJ1bGUgPSBmYWxzZSwgaW5EZWNsID0gZmFsc2U7OwoKICAgIHZhciBpdGVyID0gewogICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnMubmV4dCgpLCBzdHlsZSA9IHRva2VuLnN0eWxlLCBjb250ZW50ID0gdG9rZW4uY29udGVudDsKCiAgICAgICAgaWYgKHN0eWxlID09ICJjc3MtaGFzaCIpCiAgICAgICAgICBzdHlsZSA9IHRva2VuLnN0eWxlID0gIGluUnVsZSA/ICJjc3MtY29sb3Jjb2RlIiA6ICJjc3MtaWRlbnRpZmllciI7CiAgICAgICAgaWYgKHN0eWxlID09ICJjc3MtaWRlbnRpZmllciIpIHsKICAgICAgICAgIGlmIChpblJ1bGUpIHRva2VuLnN0eWxlID0gImNzcy12YWx1ZSI7CiAgICAgICAgICBlbHNlIGlmICghaW5CcmFjZXMgJiYgIWluRGVjbCkgdG9rZW4uc3R5bGUgPSAiY3NzLXNlbGVjdG9yIjsKICAgICAgICB9CgogICAgICAgIGlmIChjb250ZW50ID09ICJcbiIpCiAgICAgICAgICB0b2tlbi5pbmRlbnRhdGlvbiA9IGluZGVudENTUyhpbkJyYWNlcywgaW5SdWxlLCBiYXNlY29sdW1uKTsKCiAgICAgICAgaWYgKGNvbnRlbnQgPT0gInsiKQogICAgICAgICAgaW5CcmFjZXMgPSB0cnVlOwogICAgICAgIGVsc2UgaWYgKGNvbnRlbnQgPT0gIn0iKQogICAgICAgICAgaW5CcmFjZXMgPSBpblJ1bGUgPSBpbkRlY2wgPSBmYWxzZTsKICAgICAgICBlbHNlIGlmIChjb250ZW50ID09ICI7IikKICAgICAgICAgIGluUnVsZSA9IGluRGVjbCA9IGZhbHNlOwogICAgICAgIGVsc2UgaWYgKGluQnJhY2VzICYmIHN0eWxlICE9ICJjc3MtY29tbWVudCIgJiYgc3R5bGUgIT0gIndoaXRlc3BhY2UiKQogICAgICAgICAgaW5SdWxlID0gdHJ1ZTsKICAgICAgICBlbHNlIGlmICghaW5CcmFjZXMgJiYgc3R5bGUgPT0gImNzcy1hdCIpCiAgICAgICAgICBpbkRlY2wgPSB0cnVlOwoKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH0sCgogICAgICBjb3B5OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2luQnJhY2VzID0gaW5CcmFjZXMsIF9pblJ1bGUgPSBpblJ1bGUsIF90b2tlblN0YXRlID0gdG9rZW5zLnN0YXRlOwogICAgICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UpIHsKICAgICAgICAgIHRva2VucyA9IHRva2VuaXplQ1NTKHNvdXJjZSwgX3Rva2VuU3RhdGUpOwogICAgICAgICAgaW5CcmFjZXMgPSBfaW5CcmFjZXM7CiAgICAgICAgICBpblJ1bGUgPSBfaW5SdWxlOwogICAgICAgICAgcmV0dXJuIGl0ZXI7CiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIHJldHVybiBpdGVyOwogIH0KCiAgcmV0dXJuIHttYWtlOiBwYXJzZUNTUywgZWxlY3RyaWNDaGFyczogIn0ifTsKfSkoKTsK]]></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/IGluZGVudFVuaXQgOiAyICogaW5kZW50VW5pdCk7CiAgICAgIGVsc2UgaWYgKGxleGljYWwuYWxpZ24pCiAgICAgICAgcmV0dXJuIGxleGljYWwuY29sdW1uIC0gKGNsb3NpbmcgPyAxIDogMCk7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfTsKICB9CgogIC8vIFRoZSBwYXJzZXItaXRlcmF0b3ItcHJvZHVjaW5nIGZ1bmN0aW9uIGl0c2VsZi4KICBmdW5jdGlvbiBwYXJzZUpTKGlucHV0LCBiYXNlY29sdW1uKSB7CiAgICAvLyBXcmFwIHRoZSBpbnB1dCBpbiBhIHRva2VuIHN0cmVhbQogICAgdmFyIHRva2VucyA9IHRva2VuaXplSmF2YVNjcmlwdChpbnB1dCk7CiAgICAvLyBUaGUgcGFyc2VyIHN0YXRlLiBjYyBpcyBhIHN0YWNrIG9mIGFjdGlvbnMgdGhhdCBoYXZlIHRvIGJlCiAgICAvLyBwZXJmb3JtZWQgdG8gZmluaXNoIHRoZSBjdXJyZW50IHN0YXRlbWVudC4gRm9yIGV4YW1wbGUgd2UgbWlnaHQKICAgIC8vIGtub3cgdGhhdCB3ZSBzdGlsbCBuZWVkIHRvIGZpbmQgYSBjbG9zaW5nIHBhcmVudGhlc2lzIGFuZCBhCiAgICAvLyBzZW1pY29sb24uIEFjdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RhY2sgZ28gZmlyc3QuIEl0IGlzCiAgICAvLyBpbml0aWFsaXplZCB3aXRoIGFuIGluZmluaXRlbHkgbG9vcGluZyBhY3Rpb24gdGhhdCBjb25zdW1lcwogICAgLy8gd2hvbGUgc3RhdGVtZW50cy4KICAgIHZhciBjYyA9IFtqc29uID8gZXhwcmVzc2lvbnMgOiBzdGF0ZW1lbnRzXTsKICAgIC8vIENvbnRleHQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgbG9jYWwgc2NvcGUsIHRoZQogICAgLy8gdmFyaWFibGVzIGRlZmluZWQgaW4gdGhhdCwgYW5kIHRoZSBzY29wZXMgYWJvdmUgaXQuCiAgICB2YXIgY29udGV4dCA9IG51bGw7CiAgICAvLyBUaGUgbGV4aWNhbCBzY29wZSwgdXNlZCBtb3N0bHkgZm9yIGluZGVudGF0aW9uLgogICAgdmFyIGxleGljYWwgPSBuZXcgSlNMZXhpY2FsKChiYXNlY29sdW1uIHx8IDApIC0gaW5kZW50VW5pdCwgMCwgImJsb2NrIiwgZmFsc2UpOwogICAgLy8gQ3VycmVudCBjb2x1bW4sIGFuZCB0aGUgaW5kZW50YXRpb24gYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50CiAgICAvLyBsaW5lLiBVc2VkIHRvIGNyZWF0ZSBsZXhpY2FsIHNjb3BlIG9iamVjdHMuCiAgICB2YXIgY29sdW1uID0gMDsKICAgIHZhciBpbmRlbnRlZCA9IDA7CiAgICAvLyBWYXJpYWJsZXMgd2hpY2ggYXJlIHVzZWQgYnkgdGhlIG1hcmssIGNvbnQsIGFuZCBwYXNzIGZ1bmN0aW9ucwogICAgLy8gYmVsb3cgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZHJpdmVyIGxvb3AgaW4gdGhlICduZXh0JwogICAgLy8gZnVuY3Rpb24uCiAgICB2YXIgY29uc3VtZSwgbWFya2VkOwogIAogICAgLy8gVGhlIGl0ZXJhdG9yIG9iamVjdC4KICAgIHZhciBwYXJzZXIgPSB7bmV4dDogbmV4dCwgY29weTogY29weX07CgogICAgZnVuY3Rpb24gbmV4dCgpewogICAgICAvLyBTdGFydCBieSBwZXJmb3JtaW5nIGFueSAnbGV4aWNhbCcgYWN0aW9ucyAoYWRqdXN0aW5nIHRoZQogICAgICAvLyBsZXhpY2FsIHZhcmlhYmxlKSwgb3IgdGhlIG9wZXJhdGlvbnMgYmVsb3cgd2lsbCBiZSB3b3JraW5nCiAgICAgIC8vIHdpdGggdGhlIHdyb25nIGxleGljYWwgc3RhdGUuCiAgICAgIHdoaWxlKGNjW2NjLmxlbmd0aCAtIDFdLmxleCkKICAgICAgICBjYy5wb3AoKSgpOwoKICAgICAgLy8gRmV0Y2ggYSB0b2tlbi4KICAgICAgdmFyIHRva2VuID0gdG9rZW5zLm5leHQoKTsKCiAgICAgIC8vIEFkanVzdCBjb2x1bW4gYW5kIGluZGVudGVkLgogICAgICBpZiAodG9rZW4udHlwZSA9PSAid2hpdGVzcGFjZSIgJiYgY29sdW1uID09IDApCiAgICAgICAgaW5kZW50ZWQgPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgIGNvbHVtbiArPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgIGlmICh0b2tlbi5jb250ZW50ID09ICJcbiIpewogICAgICAgIGluZGVudGVkID0gY29sdW1uID0gMDsKICAgICAgICAvLyBJZiB0aGUgbGV4aWNhbCBzY29wZSdzIGFsaWduIHByb3BlcnR5IGlzIHN0aWxsIHVuZGVmaW5lZCBhdAogICAgICAgIC8vIHRoZSBlbmQgb2YgdGhlIGxpbmUsIGl0IGlzIGFuIHVuLWFsaWduZWQgc2NvcGUuCiAgICAgICAgaWYgKCEoImFsaWduIiBpbiBsZXhpY2FsKSkKICAgICAgICAgIGxleGljYWwuYWxpZ24gPSBmYWxzZTsKICAgICAgICAvLyBOZXdsaW5lIHRva2VucyBnZXQgYW4gaW5kZW50YXRpb24gZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoCiAgICAgICAgLy8gdGhlbS4KICAgICAgICB0b2tlbi5pbmRlbnRhdGlvbiA9IGluZGVudEpTKGxleGljYWwpOwogICAgICB9CiAgICAgIC8vIE5vIG1vcmUgcHJvY2Vzc2luZyBmb3IgbWVhbmluZ2xlc3MgdG9rZW5zLgogICAgICBpZiAodG9rZW4udHlwZSA9PSAid2hpdGVzcGFjZSIgfHwgdG9rZW4udHlwZSA9PSAiY29tbWVudCIpCiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAvLyBXaGVuIGEgbWVhbmluZ2Z1bCB0b2tlbiBpcyBmb3VuZCBhbmQgdGhlIGxleGljYWwgc2NvcGUncwogICAgICAvLyBhbGlnbiBpcyB1bmRlZmluZWQsIGl0IGlzIGFuIGFsaWduZWQgc2NvcGUuCiAgICAgIGlmICghKCJhbGlnbiIgaW4gbGV4aWNhbCkpCiAgICAgICAgbGV4aWNhbC5hbGlnbiA9IHRydWU7CgogICAgICAvLyBFeGVjdXRlIGFjdGlvbnMgdW50aWwgb25lICdjb25zdW1lcycgdGhlIHRva2VuIGFuZCB3ZSBjYW4KICAgICAgLy8gcmV0dXJuIGl0LgogICAgICB3aGlsZSh0cnVlKSB7CiAgICAgICAgY29uc3VtZSA9IG1hcmtlZCA9IGZhbHNlOwogICAgICAgIC8vIFRha2UgYW5kIGV4ZWN1dGUgdGhlIHRvcG1vc3QgYWN0aW9uLgogICAgICAgIGNjLnBvcCgpKHRva2VuLnR5cGUsIHRva2VuLmNvbnRlbnQpOwogICAgICAgIGlmIChjb25zdW1lKXsKICAgICAgICAgIC8vIE1hcmtlZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgc3R5bGUgb2YgdGhlIGN1cnJlbnQgdG9rZW4uCiAgICAgICAgICBpZiAobWFya2VkKQogICAgICAgICAgICB0b2tlbi5zdHlsZSA9IG1hcmtlZDsKICAgICAgICAgIC8vIEhlcmUgd2UgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGxvY2FsIGFuZCBnbG9iYWwgdmFyaWFibGVzLgogICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAidmFyaWFibGUiICYmIGluU2NvcGUodG9rZW4uY29udGVudCkpCiAgICAgICAgICAgIHRva2VuLnN0eWxlID0gImpzLWxvY2FsdmFyaWFibGUiOwogICAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIFRoaXMgbWFrZXMgYSBjb3B5IG9mIHRoZSBwYXJzZXIgc3RhdGUuIEl0IHN0b3JlcyBhbGwgdGhlCiAgICAvLyBzdGF0ZWZ1bCB2YXJpYWJsZXMgaW4gYSBjbG9zdXJlLCBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQKICAgIC8vIHdpbGwgcmVzdG9yZSB0aGVtIHdoZW4gY2FsbGVkIHdpdGggYSBuZXcgaW5wdXQgc3RyZWFtLiBOb3RlCiAgICAvLyB0aGF0IHRoZSBjYyBhcnJheSBoYXMgdG8gYmUgY29waWVkLCBiZWNhdXNlIGl0IGlzIGNvbnRhbnRseQogICAgLy8gYmVpbmcgbW9kaWZpZWQuIExleGljYWwgb2JqZWN0cyBhcmUgbm90IG11dGF0ZWQsIGFuZCBjb250ZXh0CiAgICAvLyBvYmplY3RzIGFyZSBub3QgbXV0YXRlZCBpbiBhIGhhcm1mdWwgd2F5LCBzbyB0aGV5IGNhbiBiZSBzaGFyZWQKICAgIC8vIGJldHdlZW4gcnVucyBvZiB0aGUgcGFyc2VyLgogICAgZnVuY3Rpb24gY29weSgpewogICAgICB2YXIgX2NvbnRleHQgPSBjb250ZXh0LCBfbGV4aWNhbCA9IGxleGljYWwsIF9jYyA9IGNjLmNvbmNhdChbXSksIF90b2tlblN0YXRlID0gdG9rZW5zLnN0YXRlOwogIAogICAgICByZXR1cm4gZnVuY3Rpb24gY29weVBhcnNlcihpbnB1dCl7CiAgICAgICAgY29udGV4dCA9IF9jb250ZXh0OwogICAgICAgIGxleGljYWwgPSBfbGV4aWNhbDsKICAgICAgICBjYyA9IF9jYy5jb25jYXQoW10pOyAvLyBjb3BpZXMgdGhlIGFycmF5CiAgICAgICAgY29sdW1uID0gaW5kZW50ZWQgPSAwOwogICAgICAgIHRva2VucyA9IHRva2VuaXplSmF2YVNjcmlwdChpbnB1dCwgX3Rva2VuU3RhdGUpOwogICAgICAgIHJldHVybiBwYXJzZXI7CiAgICAgIH07CiAgICB9CgogICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBwdXNoaW5nIGEgbnVtYmVyIG9mIGFjdGlvbnMgb250byB0aGUgY2MKICAgIC8vIHN0YWNrIGluIHJldmVyc2Ugb3JkZXIuCiAgICBmdW5jdGlvbiBwdXNoKGZzKXsKICAgICAgZm9yICh2YXIgaSA9IGZzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQogICAgICAgIGNjLnB1c2goZnNbaV0pOwogICAgfQogICAgLy8gY29udCBhbmQgcGFzcyBhcmUgdXNlZCBieSB0aGUgYWN0aW9uIGZ1bmN0aW9ucyB0byBhZGQgb3RoZXIKICAgIC8vIGFjdGlvbnMgdG8gdGhlIHN0YWNrLiBjb250IHdpbGwgY2F1c2UgdGhlIGN1cnJlbnQgdG9rZW4gdG8gYmUKICAgIC8vIGNvbnN1bWVkLCBwYXNzIHdpbGwgbGVhdmUgaXQgZm9yIHRoZSBuZXh0IGFjdGlvbi4KICAgIGZ1bmN0aW9uIGNvbnQoKXsKICAgICAgcHVzaChhcmd1bWVudHMpOwogICAgICBjb25zdW1lID0gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhc3MoKXsKICAgICAgcHVzaChhcmd1bWVudHMpOwogICAgICBjb25zdW1lID0gZmFsc2U7CiAgICB9CiAgICAvLyBVc2VkIHRvIGNoYW5nZSB0aGUgc3R5bGUgb2YgdGhlIGN1cnJlbnQgdG9rZW4uCiAgICBmdW5jdGlvbiBtYXJrKHN0eWxlKXsKICAgICAgbWFya2VkID0gc3R5bGU7CiAgICB9CgogICAgLy8gUHVzaCBhIG5ldyBzY29wZS4gV2lsbCBhdXRvbWF0aWNhbGx5IGxpbmsgdGhlIGN1cnJlbnQgc2NvcGUuCiAgICBmdW5jdGlvbiBwdXNoY29udGV4dCgpewogICAgICBjb250ZXh0ID0ge3ByZXY6IGNvbnRleHQsIHZhcnM6IHsidGhpcyI6IHRydWUsICJhcmd1bWVudHMiOiB0cnVlfX07CiAgICB9CiAgICAvLyBQb3Agb2ZmIHRoZSBjdXJyZW50IHNjb3BlLgogICAgZnVuY3Rpb24gcG9wY29udGV4dCgpewogICAgICBjb250ZXh0ID0gY29udGV4dC5wcmV2OwogICAgfQogICAgLy8gUmVnaXN0ZXIgYSB2YXJpYWJsZSBpbiB0aGUgY3VycmVudCBzY29wZS4KICAgIGZ1bmN0aW9uIHJlZ2lzdGVyKHZhcm5hbWUpewogICAgICBpZiAoY29udGV4dCl7CiAgICAgICAgbWFyaygianMtdmFyaWFibGVkZWYiKTsKICAgICAgICBjb250ZXh0LnZhcnNbdmFybmFtZV0gPSB0cnVlOwogICAgICB9CiAgICB9CiAgICAvLyBDaGVjayB3aGV0aGVyIGEgdmFyaWFibGUgaXMgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBzY29wZS4KICAgIGZ1bmN0aW9uIGluU2NvcGUodmFybmFtZSl7CiAgICAgIHZhciBjdXJzb3IgPSBjb250ZXh0OwogICAgICB3aGlsZSAoY3Vyc29yKSB7CiAgICAgICAgaWYgKGN1cnNvci52YXJzW3Zhcm5hbWVdKQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgY3Vyc29yID0gY3Vyc29yLnByZXY7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIAogICAgLy8gUHVzaCBhIG5ldyBsZXhpY2FsIGNvbnRleHQgb2YgdGhlIGdpdmVuIHR5cGUuCiAgICBmdW5jdGlvbiBwdXNobGV4KHR5cGUsIGluZm8pIHsKICAgICAgdmFyIHJlc3VsdCA9IGZ1bmN0aW9uKCl7CiAgICAgICAgbGV4aWNhbCA9IG5ldyBKU0xleGljYWwoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgbnVsbCwgbGV4aWNhbCwgaW5mbykKICAgICAgfTsKICAgICAgcmVzdWx0LmxleCA9IHRydWU7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvLyBQb3Agb2ZmIHRoZSBjdXJyZW50IGxleGljYWwgY29udGV4dC4KICAgIGZ1bmN0aW9uIHBvcGxleCgpewogICAgICBsZXhpY2FsID0gbGV4aWNhbC5wcmV2OwogICAgfQogICAgcG9wbGV4LmxleCA9IHRydWU7CiAgICAvLyBUaGUgJ2xleCcgZmxhZyBvbiB0aGVzZSBhY3Rpb25zIGlzIHVzZWQgYnkgdGhlICduZXh0JyBmdW5jdGlvbgogICAgLy8gdG8ga25vdyB0aGV5IGNhbiAoYW5kIGhhdmUgdG8pIGJlIHJhbiBiZWZvcmUgbW92aW5nIG9uIHRvIHRoZQogICAgLy8gbmV4dCB0b2tlbi4KICAKICAgIC8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgZGlzY2FyZHMgdG9rZW5zIHVudGlsIGl0IGZpbmRzIG9uZSBvZgogICAgLy8gdGhlIGdpdmVuIHR5cGUuCiAgICBmdW5jdGlvbiBleHBlY3Qod2FudGVkKXsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIGV4cGVjdGluZyh0eXBlKXsKICAgICAgICBpZiAodHlwZSA9PSB3YW50ZWQpIGNvbnQoKTsKICAgICAgICBlbHNlIGNvbnQoYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgIH07CiAgICB9CgogICAgLy8gTG9va3MgZm9yIGEgc3RhdGVtZW50LCBhbmQgdGhlbiBjYWxscyBpdHNlbGYuCiAgICBmdW5jdGlvbiBzdGF0ZW1lbnRzKHR5cGUpewogICAgICByZXR1cm4gcGFzcyhzdGF0ZW1lbnQsIHN0YXRlbWVudHMpOwogICAgfQogICAgZnVuY3Rpb24gZXhwcmVzc2lvbnModHlwZSl7CiAgICAgIHJldHVybiBwYXNzKGV4cHJlc3Npb24sIGV4cHJlc3Npb25zKTsKICAgIH0KICAgIC8vIERpc3BhdGNoZXMgdmFyaW91cyB0eXBlcyBvZiBzdGF0ZW1lbnRzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRoZQogICAgLy8gY3VycmVudCB0b2tlbi4KICAgIGZ1bmN0aW9uIHN0YXRlbWVudCh0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhciIpIGNvbnQocHVzaGxleCgidmFyZGVmIiksIHZhcmRlZjEsIGV4cGVjdCgiOyIpLCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJrZXl3b3JkIGEiKSBjb250KHB1c2hsZXgoImZvcm0iKSwgZXhwcmVzc2lvbiwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJrZXl3b3JkIGIiKSBjb250KHB1c2hsZXgoImZvcm0iKSwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJ7IikgY29udChwdXNobGV4KCJ9IiksIGJsb2NrLCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmdW5jdGlvbiIpIGNvbnQoZnVuY3Rpb25kZWYpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmb3IiKSBjb250KHB1c2hsZXgoImZvcm0iKSwgZXhwZWN0KCIoIiksIHB1c2hsZXgoIikiKSwgZm9yc3BlYzEsIGV4cGVjdCgiKSIpLCBwb3BsZXgsIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAidmFyaWFibGUiKSBjb250KHB1c2hsZXgoInN0YXQiKSwgbWF5YmVsYWJlbCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInN3aXRjaCIpIGNvbnQocHVzaGxleCgiZm9ybSIpLCBleHByZXNzaW9uLCBwdXNobGV4KCJ9IiwgInN3aXRjaCIpLCBleHBlY3QoInsiKSwgYmxvY2ssIHBvcGxleCwgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiY2FzZSIpIGNvbnQoZXhwcmVzc2lvbiwgZXhwZWN0KCI6IikpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJkZWZhdWx0IikgY29udChleHBlY3QoIjoiKSk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImNhdGNoIikgY29udChwdXNobGV4KCJmb3JtIiksIHB1c2hjb250ZXh0LCBleHBlY3QoIigiKSwgZnVuYXJnLCBleHBlY3QoIikiKSwgc3RhdGVtZW50LCBwb3BsZXgsIHBvcGNvbnRleHQpOwogICAgICBlbHNlIHBhc3MocHVzaGxleCgic3RhdCIpLCBleHByZXNzaW9uLCBleHBlY3QoIjsiKSwgcG9wbGV4KTsKICAgIH0KICAgIC8vIERpc3BhdGNoIGV4cHJlc3Npb24gdHlwZXMuCiAgICBmdW5jdGlvbiBleHByZXNzaW9uKHR5cGUpewogICAgICBpZiAoYXRvbWljVHlwZXMuaGFzT3duUHJvcGVydHkodHlwZSkpIGNvbnQobWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImZ1bmN0aW9uIikgY29udChmdW5jdGlvbmRlZik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImtleXdvcmQgYyIpIGNvbnQoZXhwcmVzc2lvbik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIigiKSBjb250KHB1c2hsZXgoIikiKSwgZXhwcmVzc2lvbiwgZXhwZWN0KCIpIiksIHBvcGxleCwgbWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIm9wZXJhdG9yIikgY29udChleHByZXNzaW9uKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiWyIpIGNvbnQocHVzaGxleCgiXSIpLCBjb21tYXNlcChleHByZXNzaW9uLCAiXSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJ7IikgY29udChwdXNobGV4KCJ9IiksIGNvbW1hc2VwKG9ianByb3AsICJ9IiksIHBvcGxleCwgbWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgY29udCgpOwogICAgfQogICAgLy8gQ2FsbGVkIGZvciBwbGFjZXMgd2hlcmUgb3BlcmF0b3JzLCBmdW5jdGlvbiBjYWxscywgb3IKICAgIC8vIHN1YnNjcmlwdHMgYXJlIHZhbGlkLiBXaWxsIHNraXAgb24gdG8gdGhlIG5leHQgYWN0aW9uIGlmIG5vbmUKICAgIC8vIGlzIGZvdW5kLgogICAgZnVuY3Rpb24gbWF5YmVvcGVyYXRvcih0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gIm9wZXJhdG9yIikgY29udChleHByZXNzaW9uKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiKCIpIGNvbnQocHVzaGxleCgiKSIpLCBjb21tYXNlcChleHByZXNzaW9uLCAiKSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgICBlbHNlIGlmICh0eXBlID09ICIuIikgY29udChwcm9wZXJ0eSwgbWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIlsiKSBjb250KHB1c2hsZXgoIl0iKSwgZXhwcmVzc2lvbiwgZXhwZWN0KCJdIiksIHBvcGxleCwgbWF5YmVvcGVyYXRvcik7CiAgICB9CiAgICAvLyBXaGVuIGEgc3RhdGVtZW50IHN0YXJ0cyB3aXRoIGEgdmFyaWFibGUgbmFtZSwgaXQgbWlnaHQgYmUgYQogICAgLy8gbGFiZWwuIElmIG5vIGNvbG9uIGZvbGxvd3MsIGl0J3MgYSByZWd1bGFyIHN0YXRlbWVudC4KICAgIGZ1bmN0aW9uIG1heWJlbGFiZWwodHlwZSl7CiAgICAgIGlmICh0eXBlID09ICI6IikgY29udChwb3BsZXgsIHN0YXRlbWVudCk7CiAgICAgIGVsc2UgcGFzcyhtYXliZW9wZXJhdG9yLCBleHBlY3QoIjsiKSwgcG9wbGV4KTsKICAgIH0KICAgIC8vIFByb3BlcnR5IG5hbWVzIG5lZWQgdG8gaGF2ZSB0aGVpciBzdHlsZSBhZGp1c3RlZCAtLSB0aGUKICAgIC8vIHRva2VuaXplciB0aGlua3MgdGhleSBhcmUgdmFyaWFibGVzLgogICAgZnVuY3Rpb24gcHJvcGVydHkodHlwZSl7CiAgICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHttYXJrKCJqcy1wcm9wZXJ0eSIpOyBjb250KCk7fQogICAgfQogICAgLy8gVGhpcyBwYXJzZXMgYSBwcm9wZXJ0eSBhbmQgaXRzIHZhbHVlIGluIGFuIG9iamVjdCBsaXRlcmFsLgogICAgZnVuY3Rpb24gb2JqcHJvcCh0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgbWFyaygianMtcHJvcGVydHkiKTsKICAgICAgaWYgKGF0b21pY1R5cGVzLmhhc093blByb3BlcnR5KHR5cGUpKSBjb250KGV4cGVjdCgiOiIpLCBleHByZXNzaW9uKTsKICAgIH0KICAgIC8vIFBhcnNlcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSB0aGluZ3MgdGhhdCBhcmUgcmVjb2duaXplZAogICAgLy8gYnkgdGhlICd3aGF0JyBhcmd1bWVudC4KICAgIGZ1bmN0aW9uIGNvbW1hc2VwKHdoYXQsIGVuZCl7CiAgICAgIGZ1bmN0aW9uIHByb2NlZWQodHlwZSkgewogICAgICAgIGlmICh0eXBlID09ICIsIikgY29udCh3aGF0LCBwcm9jZWVkKTsKICAgICAgICBlbHNlIGlmICh0eXBlID09IGVuZCkgY29udCgpOwogICAgICAgIGVsc2UgY29udChleHBlY3QoZW5kKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbW1hU2VwYXJhdGVkKHR5cGUpIHsKICAgICAgICBpZiAodHlwZSA9PSBlbmQpIGNvbnQoKTsKICAgICAgICBlbHNlIHBhc3Mod2hhdCwgcHJvY2VlZCk7CiAgICAgIH07CiAgICB9CiAgICAvLyBMb29rIGZvciBzdGF0ZW1lbnRzIHVudGlsIGEgY2xvc2luZyBicmFjZSBpcyBmb3VuZC4KICAgIGZ1bmN0aW9uIGJsb2NrKHR5cGUpewogICAgICBpZiAodHlwZSA9PSAifSIpIGNvbnQoKTsKICAgICAgZWxzZSBwYXNzKHN0YXRlbWVudCwgYmxvY2spOwogICAgfQogICAgLy8gVmFyaWFibGUgZGVmaW5pdGlvbnMgYXJlIHNwbGl0IGludG8gdHdvIGFjdGlvbnMgLS0gMSBsb29rcyBmb3IKICAgIC8vIGEgbmFtZSBvciB0aGUgZW5kIG9mIHRoZSBkZWZpbml0aW9uLCAyIGxvb2tzIGZvciBhbiAnPScgc2lnbiBvcgogICAgLy8gYSBjb21tYS4KICAgIGZ1bmN0aW9uIHZhcmRlZjEodHlwZSwgdmFsdWUpewogICAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKXtyZWdpc3Rlcih2YWx1ZSk7IGNvbnQodmFyZGVmMik7fQogICAgICBlbHNlIGNvbnQoKTsKICAgIH0KICAgIGZ1bmN0aW9uIHZhcmRlZjIodHlwZSwgdmFsdWUpewogICAgICBpZiAodmFsdWUgPT0gIj0iKSBjb250KGV4cHJlc3Npb24sIHZhcmRlZjIpOwogICAgICBlbHNlIGlmICh0eXBlID09ICIsIikgY29udCh2YXJkZWYxKTsKICAgIH0KICAgIC8vIEZvciBsb29wcy4KICAgIGZ1bmN0aW9uIGZvcnNwZWMxKHR5cGUpewogICAgICBpZiAodHlwZSA9PSAidmFyIikgY29udCh2YXJkZWYxLCBmb3JzcGVjMik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIjsiKSBwYXNzKGZvcnNwZWMyKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAidmFyaWFibGUiKSBjb250KGZvcm1heWJlaW4pOwogICAgICBlbHNlIHBhc3MoZm9yc3BlYzIpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF5YmVpbih0eXBlLCB2YWx1ZSl7CiAgICAgIGlmICh2YWx1ZSA9PSAiaW4iKSBjb250KGV4cHJlc3Npb24pOwogICAgICBlbHNlIGNvbnQobWF5YmVvcGVyYXRvciwgZm9yc3BlYzIpOwogICAgfQogICAgZnVuY3Rpb24gZm9yc3BlYzIodHlwZSwgdmFsdWUpewogICAgICBpZiAodHlwZSA9PSAiOyIpIGNvbnQoZm9yc3BlYzMpOwogICAgICBlbHNlIGlmICh2YWx1ZSA9PSAiaW4iKSBjb250KGV4cHJlc3Npb24pOwogICAgICBlbHNlIGNvbnQoZXhwcmVzc2lvbiwgZXhwZWN0KCI7IiksIGZvcnNwZWMzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcnNwZWMzKHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT0gIikiKSBwYXNzKCk7CiAgICAgIGVsc2UgY29udChleHByZXNzaW9uKTsKICAgIH0KICAgIC8vIEEgZnVuY3Rpb24gZGVmaW5pdGlvbiBjcmVhdGVzIGEgbmV3IGNvbnRleHQsIGFuZCB0aGUgdmFyaWFibGVzCiAgICAvLyBpbiBpdHMgYXJndW1lbnQgbGlzdCBoYXZlIHRvIGJlIGFkZGVkIHRvIHRoaXMgY29udGV4dC4KICAgIGZ1bmN0aW9uIGZ1bmN0aW9uZGVmKHR5cGUsIHZhbHVlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIil7cmVnaXN0ZXIodmFsdWUpOyBjb250KGZ1bmN0aW9uZGVmKTt9CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIigiKSBjb250KHB1c2hjb250ZXh0LCBjb21tYXNlcChmdW5hcmcsICIpIiksIHN0YXRlbWVudCwgcG9wY29udGV4dCk7CiAgICB9CiAgICBmdW5jdGlvbiBmdW5hcmcodHlwZSwgdmFsdWUpewogICAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKXtyZWdpc3Rlcih2YWx1ZSk7IGNvbnQoKTt9CiAgICB9CiAgCiAgICByZXR1cm4gcGFyc2VyOwogIH0KCiAgcmV0dXJuIHsKICAgIG1ha2U6IHBhcnNlSlMsCiAgICBlbGVjdHJpY0NoYXJzOiAie306IiwKICAgIGNvbmZpZ3VyZTogZnVuY3Rpb24ob2JqKSB7CiAgICAgIGlmIChvYmouanNvbiAhPSBudWxsKSBqc29uID0gb2JqLmpzb247CiAgICB9CiAgfTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsesparql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIFNwYXJxbFBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gd29yZFJlZ2V4cCh3b3JkcykgewogICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgd29yZHMuam9pbigifCIpICsgIikkIiwgImkiKTsKICB9CiAgdmFyIG9wcyA9IHdvcmRSZWdleHAoWyJzdHIiLCAibGFuZyIsICJsYW5nbWF0Y2hlcyIsICJkYXRhdHlwZSIsICJib3VuZCIsICJzYW1ldGVybSIsICJpc2lyaSIsICJpc3VyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpc2JsYW5rIiwgImlzbGl0ZXJhbCIsICJ1bmlvbiIsICJhIl0pOwogIHZhciBrZXl3b3JkcyA9IHdvcmRSZWdleHAoWyJiYXNlIiwgInByZWZpeCIsICJzZWxlY3QiLCAiZGlzdGluY3QiLCAicmVkdWNlZCIsICJjb25zdHJ1Y3QiLCAiZGVzY3JpYmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhc2siLCAiZnJvbSIsICJuYW1lZCIsICJ3aGVyZSIsICJvcmRlciIsICJsaW1pdCIsICJvZmZzZXQiLCAiZmlsdGVyIiwgIm9wdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JhcGgiLCAiYnkiLCAiYXNjIiwgImRlc2MiXSk7CiAgdmFyIG9wZXJhdG9yQ2hhcnMgPSAvWyorXC08Pj0mfF0vOwoKICB2YXIgdG9rZW5pemVTcGFycWwgPSAoZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiBub3JtYWwoc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICBpZiAoY2ggPT0gIiQiIHx8IGNoID09ICI/IikgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHdcZF0vKTsKICAgICAgICByZXR1cm4gInNwLXZhciI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIjwiICYmICFzb3VyY2UubWF0Y2hlcygvW1xzXHUwMGEwPV0vKSkgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXlxzXHUwMGEwPl0vKTsKICAgICAgICBpZiAoc291cmNlLmVxdWFscygiPiIpKSBzb3VyY2UubmV4dCgpOwogICAgICAgIHJldHVybiAic3AtdXJpIjsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiXCIiIHx8IGNoID09ICInIikgewogICAgICAgIHNldFN0YXRlKGluTGl0ZXJhbChjaCkpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGVsc2UgaWYgKC9be31cKFwpLFwuO1xbXF1dLy50ZXN0KGNoKSkgewogICAgICAgIHJldHVybiAic3AtcHVuYyI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIiMiKSB7CiAgICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgcmV0dXJuICJzcC1jb21tZW50IjsKICAgICAgfQogICAgICBlbHNlIGlmIChvcGVyYXRvckNoYXJzLnRlc3QoY2gpKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMob3BlcmF0b3JDaGFycyk7CiAgICAgICAgcmV0dXJuICJzcC1vcGVyYXRvciI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIjoiKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1tcd1xkXC5fXC1dLyk7CiAgICAgICAgcmV0dXJuICJzcC1wcmVmaXhlZCI7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1tfXHdcZF0vKTsKICAgICAgICBpZiAoc291cmNlLmVxdWFscygiOiIpKSB7CiAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1tcd1xkX1wtXS8pOwogICAgICAgICAgcmV0dXJuICJzcC1wcmVmaXhlZCI7CiAgICAgICAgfQogICAgICAgIHZhciB3b3JkID0gc291cmNlLmdldCgpLCB0eXBlOwogICAgICAgIGlmIChvcHMudGVzdCh3b3JkKSkKICAgICAgICAgIHR5cGUgPSAic3Atb3BlcmF0b3IiOwogICAgICAgIGVsc2UgaWYgKGtleXdvcmRzLnRlc3Qod29yZCkpCiAgICAgICAgICB0eXBlID0gInNwLWtleXdvcmQiOwogICAgICAgIGVsc2UKICAgICAgICAgIHR5cGUgPSAic3Atd29yZCI7CiAgICAgICAgcmV0dXJuIHtzdHlsZTogdHlwZSwgY29udGVudDogd29yZH07CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbkxpdGVyYWwocXVvdGUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlOwogICAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICAgICAgaWYgKGNoID09IHF1b3RlICYmICFlc2NhcGVkKSB7CiAgICAgICAgICAgIHNldFN0YXRlKG5vcm1hbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIGNoID09ICJcXCI7CiAgICAgICAgfQogICAgICAgIHJldHVybiAic3AtbGl0ZXJhbCI7CiAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc3RhcnRTdGF0ZSkgewogICAgICByZXR1cm4gdG9rZW5pemVyKHNvdXJjZSwgc3RhcnRTdGF0ZSB8fCBub3JtYWwpOwogICAgfTsKICB9KSgpOwoKICBmdW5jdGlvbiBpbmRlbnRTcGFycWwoY29udGV4dCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKG5leHRDaGFycykgewogICAgICB2YXIgZmlyc3RDaGFyID0gbmV4dENoYXJzICYmIG5leHRDaGFycy5jaGFyQXQoMCk7CiAgICAgIGlmICgvW1xdXH1dLy50ZXN0KGZpcnN0Q2hhcikpCiAgICAgICAgd2hpbGUgKGNvbnRleHQgJiYgY29udGV4dC50eXBlID09ICJwYXR0ZXJuIikgY29udGV4dCA9IGNvbnRleHQucHJldjsKCiAgICAgIHZhciBjbG9zaW5nID0gY29udGV4dCAmJiBmaXJzdENoYXIgPT0gbWF0Y2hpbmdbY29udGV4dC50eXBlXTsKICAgICAgaWYgKCFjb250ZXh0KQogICAgICAgIHJldHVybiAwOwogICAgICBlbHNlIGlmIChjb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iKQogICAgICAgIHJldHVybiBjb250ZXh0LmNvbDsKICAgICAgZWxzZSBpZiAoY29udGV4dC5hbGlnbikKICAgICAgICByZXR1cm4gY29udGV4dC5jb2wgLSAoY2xvc2luZyA/IGNvbnRleHQud2lkdGggOiAwKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBjb250ZXh0LmluZGVudCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcGFyc2VTcGFycWwoc291cmNlKSB7CiAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVTcGFycWwoc291cmNlKTsKICAgIHZhciBjb250ZXh0ID0gbnVsbCwgaW5kZW50ID0gMCwgY29sID0gMDsKICAgIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHR5cGUsIHdpZHRoKSB7CiAgICAgIGNvbnRleHQgPSB7cHJldjogY29udGV4dCwgaW5kZW50OiBpbmRlbnQsIGNvbDogY29sLCB0eXBlOiB0eXBlLCB3aWR0aDogd2lkdGh9OwogICAgfQogICAgZnVuY3Rpb24gcG9wQ29udGV4dCgpIHsKICAgICAgY29udGV4dCA9IGNvbnRleHQucHJldjsKICAgIH0KCiAgICB2YXIgaXRlciA9IHsKICAgICAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zLm5leHQoKSwgdHlwZSA9IHRva2VuLnN0eWxlLCBjb250ZW50ID0gdG9rZW4uY29udGVudCwgd2lkdGggPSB0b2tlbi52YWx1ZS5sZW5ndGg7CgogICAgICAgIGlmIChjb250ZW50ID09ICJcbiIpIHsKICAgICAgICAgIHRva2VuLmluZGVudGF0aW9uID0gaW5kZW50U3BhcnFsKGNvbnRleHQpOwogICAgICAgICAgaW5kZW50ID0gY29sID0gMDsKICAgICAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuYWxpZ24gPT0gbnVsbCkgY29udGV4dC5hbGlnbiA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlID09ICJ3aGl0ZXNwYWNlIiAmJiBjb2wgPT0gMCkgewogICAgICAgICAgaW5kZW50ID0gd2lkdGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGUgIT0gInNwLWNvbW1lbnQiICYmIGNvbnRleHQgJiYgY29udGV4dC5hbGlnbiA9PSBudWxsKSB7CiAgICAgICAgICBjb250ZXh0LmFsaWduID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmIChjb250ZW50ICE9ICJcbiIpIGNvbCArPSB3aWR0aDsKCiAgICAgICAgaWYgKC9bXFtce1woXS8udGVzdChjb250ZW50KSkgewogICAgICAgICAgcHVzaENvbnRleHQoY29udGVudCwgd2lkdGgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgvW1xdXH1cKV0vLnRlc3QoY29udGVudCkpIHsKICAgICAgICAgIHdoaWxlIChjb250ZXh0ICYmIGNvbnRleHQudHlwZSA9PSAicGF0dGVybiIpCiAgICAgICAgICAgIHBvcENvbnRleHQoKTsKICAgICAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRlbnQgPT0gbWF0Y2hpbmdbY29udGV4dC50eXBlXSkKICAgICAgICAgICAgcG9wQ29udGV4dCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjb250ZW50ID09ICIuIiAmJiBjb250ZXh0ICYmIGNvbnRleHQudHlwZSA9PSAicGF0dGVybiIpIHsKICAgICAgICAgIHBvcENvbnRleHQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoKHR5cGUgPT0gInNwLXdvcmQiIHx8IHR5cGUgPT0gInNwLXByZWZpeGVkIiB8fCB0eXBlID09ICJzcC11cmkiIHx8IHR5cGUgPT0gInNwLXZhciIgfHwgdHlwZSA9PSAic3AtbGl0ZXJhbCIpICYmCiAgICAgICAgICAgICAgICAgY29udGV4dCAmJiAvW1x7XFtdLy50ZXN0KGNvbnRleHQudHlwZSkpIHsKICAgICAgICAgIHB1c2hDb250ZXh0KCJwYXR0ZXJuIiwgd2lkdGgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICB9LAoKICAgICAgY29weTogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIF9jb250ZXh0ID0gY29udGV4dCwgX2luZGVudCA9IGluZGVudCwgX2NvbCA9IGNvbCwgX3Rva2VuU3RhdGUgPSB0b2tlbnMuc3RhdGU7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgICAgdG9rZW5zID0gdG9rZW5pemVTcGFycWwoc291cmNlLCBfdG9rZW5TdGF0ZSk7CiAgICAgICAgICBjb250ZXh0ID0gX2NvbnRleHQ7CiAgICAgICAgICBpbmRlbnQgPSBfaW5kZW50OwogICAgICAgICAgY29sID0gX2NvbDsKICAgICAgICAgIHJldHVybiBpdGVyOwogICAgICAgIH07CiAgICAgIH0KICAgIH07CiAgICByZXR1cm4gaXRlcjsKICB9CgogIHJldHVybiB7bWFrZTogcGFyc2VTcGFycWwsIGVsZWN0cmljQ2hhcnM6ICJ9XSJ9Owp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsexml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogVGhpcyBmaWxlIGRlZmluZXMgYW4gWE1MIHBhcnNlciwgd2l0aCBhIGZldyBrbHVkZ2VzIHRvIG1ha2UgaXQKICogdXNlYWJsZSBmb3IgSFRNTC4gYXV0b1NlbGZDbG9zZXJzIGRlZmluZXMgYSBzZXQgb2YgdGFnIG5hbWVzIHRoYXQKICogYXJlIGV4cGVjdGVkIHRvIG5vdCBoYXZlIGEgY2xvc2luZyB0YWcsIGFuZCBkb05vdEluZGVudCBzcGVjaWZpZXMKICogdGhlIHRhZ3MgaW5zaWRlIG9mIHdoaWNoIG5vIGluZGVudGF0aW9uIHNob3VsZCBoYXBwZW4gKHNlZSBDb25maWcKICogb2JqZWN0KS4gVGhlc2UgY2FuIGJlIGRpc2FibGVkIGJ5IHBhc3NpbmcgdGhlIGVkaXRvciBhbiBvYmplY3QgbGlrZQogKiB7dXNlSFRNTEtsdWRnZXM6IGZhbHNlfSBhcyBwYXJzZXJDb25maWcgb3B0aW9uLgogKi8KCnZhciBYTUxQYXJzZXIgPSBFZGl0b3IuUGFyc2VyID0gKGZ1bmN0aW9uKCkgewogIHZhciBLbHVkZ2VzID0gewogICAgYXV0b1NlbGZDbG9zZXJzOiB7ImJyIjogdHJ1ZSwgImltZyI6IHRydWUsICJociI6IHRydWUsICJsaW5rIjogdHJ1ZSwgImlucHV0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICJtZXRhIjogdHJ1ZSwgImNvbCI6IHRydWUsICJmcmFtZSI6IHRydWUsICJiYXNlIjogdHJ1ZSwgImFyZWEiOiB0cnVlfSwKICAgIGRvTm90SW5kZW50OiB7InByZSI6IHRydWUsICIhY2RhdGEiOiB0cnVlfQogIH07CiAgdmFyIE5vS2x1ZGdlcyA9IHthdXRvU2VsZkNsb3NlcnM6IHt9LCBkb05vdEluZGVudDogeyIhY2RhdGEiOiB0cnVlfX07CiAgdmFyIFVzZUtsdWRnZXMgPSBLbHVkZ2VzOwogIHZhciBhbGlnbkNEQVRBID0gZmFsc2U7CgogIC8vIFNpbXBsZSBzdGF0ZWZ1bCB0b2tlbml6ZXIgZm9yIFhNTCBkb2N1bWVudHMuIFJldHVybnMgYQogIC8vIE1vY2hpS2l0LXN0eWxlIGl0ZXJhdG9yLCB3aXRoIGEgc3RhdGUgcHJvcGVydHkgdGhhdCBjb250YWlucyBhCiAgLy8gZnVuY3Rpb24gZW5jYXBzdWxhdGluZyB0aGUgY3VycmVudCBzdGF0ZS4gU2VlIHRva2VuaXplLmpzLgogIHZhciB0b2tlbml6ZVhNTCA9IChmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIGluVGV4dChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PSAiPCIpIHsKICAgICAgICBpZiAoc291cmNlLmVxdWFscygiISIpKSB7CiAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoIlsiKSkgewogICAgICAgICAgICBpZiAoc291cmNlLmxvb2tBaGVhZCgiW0NEQVRBWyIsIHRydWUpKSB7CiAgICAgICAgICAgICAgc2V0U3RhdGUoaW5CbG9jaygieG1sLWNkYXRhIiwgIl1dPiIpKTsKICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4gInhtbC10ZXh0IjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZiAoc291cmNlLmxvb2tBaGVhZCgiLS0iLCB0cnVlKSkgewogICAgICAgICAgICBzZXRTdGF0ZShpbkJsb2NrKCJ4bWwtY29tbWVudCIsICItLT4iKSk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAieG1sLXRleHQiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzb3VyY2UuZXF1YWxzKCI/IikpIHsKICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW1x3XC5fXC1dLyk7CiAgICAgICAgICBzZXRTdGF0ZShpbkJsb2NrKCJ4bWwtcHJvY2Vzc2luZyIsICI/PiIpKTsKICAgICAgICAgIHJldHVybiAieG1sLXByb2Nlc3NpbmciOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCIvIikpIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBzZXRTdGF0ZShpblRhZyk7CiAgICAgICAgICByZXR1cm4gInhtbC1wdW5jdHVhdGlvbiI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICImIikgewogICAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgICBpZiAoc291cmNlLm5leHQoKSA9PSAiOyIpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gInhtbC1lbnRpdHkiOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXiY8XG5dLyk7CiAgICAgICAgcmV0dXJuICJ4bWwtdGV4dCI7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpblRhZyhzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PSAiPiIpIHsKICAgICAgICBzZXRTdGF0ZShpblRleHQpOwogICAgICAgIHJldHVybiAieG1sLXB1bmN0dWF0aW9uIjsKICAgICAgfQogICAgICBlbHNlIGlmICgvWz9cL10vLnRlc3QoY2gpICYmIHNvdXJjZS5lcXVhbHMoIj4iKSkgewogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgc2V0U3RhdGUoaW5UZXh0KTsKICAgICAgICByZXR1cm4gInhtbC1wdW5jdHVhdGlvbiI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIj0iKSB7CiAgICAgICAgcmV0dXJuICJ4bWwtcHVuY3R1YXRpb24iOwogICAgICB9CiAgICAgIGVsc2UgaWYgKC9bXCdcIl0vLnRlc3QoY2gpKSB7CiAgICAgICAgc2V0U3RhdGUoaW5BdHRyaWJ1dGUoY2gpKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW15cc1x1MDBhMD08PlwiXCdcLz9dLyk7CiAgICAgICAgcmV0dXJuICJ4bWwtbmFtZSI7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbkF0dHJpYnV0ZShxdW90ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgICBpZiAoc291cmNlLm5leHQoKSA9PSBxdW90ZSkgewogICAgICAgICAgICBzZXRTdGF0ZShpblRhZyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gInhtbC1hdHRyaWJ1dGUiOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGluQmxvY2soc3R5bGUsIHRlcm1pbmF0b3IpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgICB3aGlsZSAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgewogICAgICAgICAgaWYgKHNvdXJjZS5sb29rQWhlYWQodGVybWluYXRvciwgdHJ1ZSkpIHsKICAgICAgICAgICAgc2V0U3RhdGUoaW5UZXh0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc3RhcnRTdGF0ZSkgewogICAgICByZXR1cm4gdG9rZW5pemVyKHNvdXJjZSwgc3RhcnRTdGF0ZSB8fCBpblRleHQpOwogICAgfTsKICB9KSgpOwoKICAvLyBUaGUgcGFyc2VyLiBUaGUgc3RydWN0dXJlIG9mIHRoaXMgZnVuY3Rpb24gbGFyZ2VseSBmb2xsb3dzIHRoYXQgb2YKICAvLyBwYXJzZUphdmFTY3JpcHQgaW4gcGFyc2VqYXZhc2NyaXB0LmpzICh0aGVyZSBpcyBhY3R1YWxseSBhIGJpdCBtb3JlCiAgLy8gc2hhcmVkIGNvZGUgdGhhbiBJJ2QgbGlrZSksIGJ1dCBpdCBpcyBxdWl0ZSBhIGJpdCBzaW1wbGVyLgogIGZ1bmN0aW9uIHBhcnNlWE1MKHNvdXJjZSkgewogICAgdmFyIHRva2VucyA9IHRva2VuaXplWE1MKHNvdXJjZSksIHRva2VuOwogICAgdmFyIGNjID0gW2Jhc2VdOwogICAgdmFyIHRva2VuTnIgPSAwLCBpbmRlbnRlZCA9IDA7CiAgICB2YXIgY3VycmVudFRhZyA9IG51bGwsIGNvbnRleHQgPSBudWxsOwogICAgdmFyIGNvbnN1bWU7CiAgICAKICAgIGZ1bmN0aW9uIHB1c2goZnMpIHsKICAgICAgZm9yICh2YXIgaSA9IGZzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQogICAgICAgIGNjLnB1c2goZnNbaV0pOwogICAgfQogICAgZnVuY3Rpb24gY29udCgpIHsKICAgICAgcHVzaChhcmd1bWVudHMpOwogICAgICBjb25zdW1lID0gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhc3MoKSB7CiAgICAgIHB1c2goYXJndW1lbnRzKTsKICAgICAgY29uc3VtZSA9IGZhbHNlOwogICAgfQoKICAgIGZ1bmN0aW9uIG1hcmtFcnIoKSB7CiAgICAgIHRva2VuLnN0eWxlICs9ICIgeG1sLWVycm9yIjsKICAgIH0KICAgIGZ1bmN0aW9uIGV4cGVjdCh0ZXh0KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzdHlsZSwgY29udGVudCkgewogICAgICAgIGlmIChjb250ZW50ID09IHRleHQpIGNvbnQoKTsKICAgICAgICBlbHNlIHttYXJrRXJyKCk7IGNvbnQoYXJndW1lbnRzLmNhbGxlZSk7fQogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHRhZ25hbWUsIHN0YXJ0T2ZMaW5lKSB7CiAgICAgIHZhciBub0luZGVudCA9IFVzZUtsdWRnZXMuZG9Ob3RJbmRlbnQuaGFzT3duUHJvcGVydHkodGFnbmFtZSkgfHwgKGNvbnRleHQgJiYgY29udGV4dC5ub0luZGVudCk7CiAgICAgIGNvbnRleHQgPSB7cHJldjogY29udGV4dCwgbmFtZTogdGFnbmFtZSwgaW5kZW50OiBpbmRlbnRlZCwgc3RhcnRPZkxpbmU6IHN0YXJ0T2ZMaW5lLCBub0luZGVudDogbm9JbmRlbnR9OwogICAgfQogICAgZnVuY3Rpb24gcG9wQ29udGV4dCgpIHsKICAgICAgY29udGV4dCA9IGNvbnRleHQucHJldjsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbXB1dGVJbmRlbnRhdGlvbihiYXNlQ29udGV4dCkgewogICAgICByZXR1cm4gZnVuY3Rpb24obmV4dENoYXJzLCBjdXJyZW50KSB7CiAgICAgICAgdmFyIGNvbnRleHQgPSBiYXNlQ29udGV4dDsKICAgICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Lm5vSW5kZW50KQogICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgaWYgKGFsaWduQ0RBVEEgJiYgLzwhXFtDREFUQVxbLy50ZXN0KG5leHRDaGFycykpCiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAoY29udGV4dCAmJiAvXjxcLy8udGVzdChuZXh0Q2hhcnMpKQogICAgICAgICAgY29udGV4dCA9IGNvbnRleHQucHJldjsKICAgICAgICB3aGlsZSAoY29udGV4dCAmJiAhY29udGV4dC5zdGFydE9mTGluZSkKICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICAgICAgaWYgKGNvbnRleHQpCiAgICAgICAgICByZXR1cm4gY29udGV4dC5pbmRlbnQgKyBpbmRlbnRVbml0OwogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiAwOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGJhc2UoKSB7CiAgICAgIHJldHVybiBwYXNzKGVsZW1lbnQsIGJhc2UpOwogICAgfQogICAgdmFyIGhhcm1sZXNzVG9rZW5zID0geyJ4bWwtdGV4dCI6IHRydWUsICJ4bWwtZW50aXR5IjogdHJ1ZSwgInhtbC1jb21tZW50IjogdHJ1ZSwgInhtbC1wcm9jZXNzaW5nIjogdHJ1ZX07CiAgICBmdW5jdGlvbiBlbGVtZW50KHN0eWxlLCBjb250ZW50KSB7CiAgICAgIGlmIChjb250ZW50ID09ICI8IikgY29udCh0YWduYW1lLCBhdHRyaWJ1dGVzLCBlbmR0YWcodG9rZW5OciA9PSAxKSk7CiAgICAgIGVsc2UgaWYgKGNvbnRlbnQgPT0gIjwvIikgY29udChjbG9zZXRhZ25hbWUsIGV4cGVjdCgiPiIpKTsKICAgICAgZWxzZSBpZiAoc3R5bGUgPT0gInhtbC1jZGF0YSIpIHsKICAgICAgICBpZiAoIWNvbnRleHQgfHwgY29udGV4dC5uYW1lICE9ICIhY2RhdGEiKSBwdXNoQ29udGV4dCgiIWNkYXRhIik7CiAgICAgICAgaWYgKC9cXVxdPiQvLnRlc3QoY29udGVudCkpIHBvcENvbnRleHQoKTsKICAgICAgICBjb250KCk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoaGFybWxlc3NUb2tlbnMuaGFzT3duUHJvcGVydHkoc3R5bGUpKSBjb250KCk7CiAgICAgIGVsc2Uge21hcmtFcnIoKTsgY29udCgpO30KICAgIH0KICAgIGZ1bmN0aW9uIHRhZ25hbWUoc3R5bGUsIGNvbnRlbnQpIHsKICAgICAgaWYgKHN0eWxlID09ICJ4bWwtbmFtZSIpIHsKICAgICAgICBjdXJyZW50VGFnID0gY29udGVudC50b0xvd2VyQ2FzZSgpOwogICAgICAgIHRva2VuLnN0eWxlID0gInhtbC10YWduYW1lIjsKICAgICAgICBjb250KCk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgY3VycmVudFRhZyA9IG51bGw7CiAgICAgICAgcGFzcygpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjbG9zZXRhZ25hbWUoc3R5bGUsIGNvbnRlbnQpIHsKICAgICAgaWYgKHN0eWxlID09ICJ4bWwtbmFtZSIpIHsKICAgICAgICB0b2tlbi5zdHlsZSA9ICJ4bWwtdGFnbmFtZSI7CiAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGVudC50b0xvd2VyQ2FzZSgpID09IGNvbnRleHQubmFtZSkgcG9wQ29udGV4dCgpOwogICAgICAgIGVsc2UgbWFya0VycigpOwogICAgICB9CiAgICAgIGNvbnQoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGVuZHRhZyhzdGFydE9mTGluZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc3R5bGUsIGNvbnRlbnQpIHsKICAgICAgICBpZiAoY29udGVudCA9PSAiLz4iIHx8IChjb250ZW50ID09ICI+IiAmJiBVc2VLbHVkZ2VzLmF1dG9TZWxmQ2xvc2Vycy5oYXNPd25Qcm9wZXJ0eShjdXJyZW50VGFnKSkpIGNvbnQoKTsKICAgICAgICBlbHNlIGlmIChjb250ZW50ID09ICI+Iikge3B1c2hDb250ZXh0KGN1cnJlbnRUYWcsIHN0YXJ0T2ZMaW5lKTsgY29udCgpO30KICAgICAgICBlbHNlIHttYXJrRXJyKCk7IGNvbnQoYXJndW1lbnRzLmNhbGxlZSk7fQogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gYXR0cmlidXRlcyhzdHlsZSkgewogICAgICBpZiAoc3R5bGUgPT0gInhtbC1uYW1lIikge3Rva2VuLnN0eWxlID0gInhtbC1hdHRuYW1lIjsgY29udChhdHRyaWJ1dGUsIGF0dHJpYnV0ZXMpO30KICAgICAgZWxzZSBwYXNzKCk7CiAgICB9CiAgICBmdW5jdGlvbiBhdHRyaWJ1dGUoc3R5bGUsIGNvbnRlbnQpIHsKICAgICAgaWYgKGNvbnRlbnQgPT0gIj0iKSBjb250KHZhbHVlKTsKICAgICAgZWxzZSBpZiAoY29udGVudCA9PSAiPiIgfHwgY29udGVudCA9PSAiLz4iKSBwYXNzKGVuZHRhZyk7CiAgICAgIGVsc2UgcGFzcygpOwogICAgfQogICAgZnVuY3Rpb24gdmFsdWUoc3R5bGUpIHsKICAgICAgaWYgKHN0eWxlID09ICJ4bWwtYXR0cmlidXRlIikgY29udCh2YWx1ZSk7CiAgICAgIGVsc2UgcGFzcygpOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgIGluZGVudGF0aW9uOiBmdW5jdGlvbigpIHtyZXR1cm4gaW5kZW50ZWQ7fSwKCiAgICAgIG5leHQ6IGZ1bmN0aW9uKCl7CiAgICAgICAgdG9rZW4gPSB0b2tlbnMubmV4dCgpOwogICAgICAgIGlmICh0b2tlbi5zdHlsZSA9PSAid2hpdGVzcGFjZSIgJiYgdG9rZW5OciA9PSAwKQogICAgICAgICAgaW5kZW50ZWQgPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgICAgZWxzZQogICAgICAgICAgdG9rZW5OcisrOwogICAgICAgIGlmICh0b2tlbi5jb250ZW50ID09ICJcbiIpIHsKICAgICAgICAgIGluZGVudGVkID0gdG9rZW5OciA9IDA7CiAgICAgICAgICB0b2tlbi5pbmRlbnRhdGlvbiA9IGNvbXB1dGVJbmRlbnRhdGlvbihjb250ZXh0KTsKICAgICAgICB9CgogICAgICAgIGlmICh0b2tlbi5zdHlsZSA9PSAid2hpdGVzcGFjZSIgfHwgdG9rZW4udHlwZSA9PSAieG1sLWNvbW1lbnQiKQogICAgICAgICAgcmV0dXJuIHRva2VuOwoKICAgICAgICB3aGlsZSh0cnVlKXsKICAgICAgICAgIGNvbnN1bWUgPSBmYWxzZTsKICAgICAgICAgIGNjLnBvcCgpKHRva2VuLnN0eWxlLCB0b2tlbi5jb250ZW50KTsKICAgICAgICAgIGlmIChjb25zdW1lKSByZXR1cm4gdG9rZW47CiAgICAgICAgfQogICAgICB9LAoKICAgICAgY29weTogZnVuY3Rpb24oKXsKICAgICAgICB2YXIgX2NjID0gY2MuY29uY2F0KFtdKSwgX3Rva2VuU3RhdGUgPSB0b2tlbnMuc3RhdGUsIF9jb250ZXh0ID0gY29udGV4dDsKICAgICAgICB2YXIgcGFyc2VyID0gdGhpczsKICAgICAgICAKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaW5wdXQpewogICAgICAgICAgY2MgPSBfY2MuY29uY2F0KFtdKTsKICAgICAgICAgIHRva2VuTnIgPSBpbmRlbnRlZCA9IDA7CiAgICAgICAgICBjb250ZXh0ID0gX2NvbnRleHQ7CiAgICAgICAgICB0b2tlbnMgPSB0b2tlbml6ZVhNTChpbnB1dCwgX3Rva2VuU3RhdGUpOwogICAgICAgICAgcmV0dXJuIHBhcnNlcjsKICAgICAgICB9OwogICAgICB9CiAgICB9OwogIH0KCiAgcmV0dXJuIHsKICAgIG1ha2U6IHBhcnNlWE1MLAogICAgZWxlY3RyaWNDaGFyczogIi8iLAogICAgY29uZmlndXJlOiBmdW5jdGlvbihjb25maWcpIHsKICAgICAgaWYgKGNvbmZpZy51c2VIVE1MS2x1ZGdlcyAhPSBudWxsKQogICAgICAgIFVzZUtsdWRnZXMgPSBjb25maWcudXNlSFRNTEtsdWRnZXMgPyBLbHVkZ2VzIDogTm9LbHVkZ2VzOwogICAgICBpZiAoY29uZmlnLmFsaWduQ0RBVEEpCiAgICAgICAgYWxpZ25DREFUQSA9IGNvbmZpZy5hbGlnbkNEQVRBOwogICAgfQogIH07Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/select.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogRnVuY3Rpb25hbGl0eSBmb3IgZmluZGluZywgc3RvcmluZywgYW5kIHJlc3RvcmluZyBzZWxlY3Rpb25zCiAqCiAqIFRoaXMgZG9lcyBub3QgcHJvdmlkZSBhIGdlbmVyaWMgQVBJLCBqdXN0IHRoZSBtaW5pbWFsIGZ1bmN0aW9uYWxpdHkKICogcmVxdWlyZWQgYnkgdGhlIENvZGVNaXJyb3Igc3lzdGVtLgogKi8KCi8vIE5hbWVzcGFjZSBvYmplY3QuCnZhciBzZWxlY3QgPSB7fTsKCihmdW5jdGlvbigpIHsKICBzZWxlY3QuaWVfc2VsZWN0aW9uID0gZG9jdW1lbnQuc2VsZWN0aW9uICYmIGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZUNvbGxlY3Rpb247CgogIC8vIEZpbmQgdGhlICd0b3AtbGV2ZWwnIChkZWZpbmVkIGFzICdhIGRpcmVjdCBjaGlsZCBvZiB0aGUgbm9kZQogIC8vIHBhc3NlZCBhcyB0aGUgdG9wIGFyZ3VtZW50Jykgbm9kZSB0aGF0IHRoZSBnaXZlbiBub2RlIGlzCiAgLy8gY29udGFpbmVkIGluLiBSZXR1cm4gbnVsbCBpZiB0aGUgZ2l2ZW4gbm9kZSBpcyBub3QgaW5zaWRlIHRoZSB0b3AKICAvLyBub2RlLgogIGZ1bmN0aW9uIHRvcExldmVsTm9kZUF0KG5vZGUsIHRvcCkgewogICAgd2hpbGUgKG5vZGUgJiYgbm9kZS5wYXJlbnROb2RlICE9IHRvcCkKICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgLy8gRmluZCB0aGUgdG9wLWxldmVsIG5vZGUgdGhhdCBjb250YWlucyB0aGUgbm9kZSBiZWZvcmUgdGhpcyBvbmUuCiAgZnVuY3Rpb24gdG9wTGV2ZWxOb2RlQmVmb3JlKG5vZGUsIHRvcCkgewogICAgd2hpbGUgKCFub2RlLnByZXZpb3VzU2libGluZyAmJiBub2RlLnBhcmVudE5vZGUgIT0gdG9wKQogICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlOwogICAgcmV0dXJuIHRvcExldmVsTm9kZUF0KG5vZGUucHJldmlvdXNTaWJsaW5nLCB0b3ApOwogIH0KCiAgdmFyIGZvdXJTcGFjZXMgPSAiXHUwMGEwXHUwMGEwXHUwMGEwXHUwMGEwIjsKCiAgc2VsZWN0LnNjcm9sbFRvTm9kZSA9IGZ1bmN0aW9uKG5vZGUsIGN1cnNvcikgewogICAgaWYgKCFub2RlKSByZXR1cm47CiAgICB2YXIgZWxlbWVudCA9IG5vZGUsCiAgICAgICAgZG9jID0gZWxlbWVudC5vd25lckRvY3VtZW50LCBib2R5ID0gZG9jLmJvZHksCiAgICAgICAgd2luID0gKGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93KSwKICAgICAgICBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudCwKICAgICAgICBhdEVuZCA9ICFlbGVtZW50Lm5leHRTaWJsaW5nIHx8ICFlbGVtZW50Lm5leHRTaWJsaW5nLm5leHRTaWJsaW5nCiAgICAgICAgICAgICAgICB8fCAhZWxlbWVudC5uZXh0U2libGluZy5uZXh0U2libGluZy5uZXh0U2libGluZzsKICAgIC8vIEluIE9wZXJhIChhbmQgcmVjZW50IFdlYmtpdCB2ZXJzaW9ucyksIEJSIGVsZW1lbnRzICphbHdheXMqCiAgICAvLyBoYXZlIGEgb2Zmc2V0VG9wIHByb3BlcnR5IG9mIHplcm8uCiAgICB2YXIgY29tcGVuc2F0ZUhhY2sgPSAwOwogICAgd2hpbGUgKGVsZW1lbnQgJiYgIWVsZW1lbnQub2Zmc2V0VG9wKSB7CiAgICAgIGNvbXBlbnNhdGVIYWNrKys7CiAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnByZXZpb3VzU2libGluZzsKICAgIH0KICAgIC8vIGF0RW5kIGlzIGFub3RoZXIga2x1ZGdlIGZvciB0aGVzZSBicm93c2VycyAtLSBpZiB0aGUgY3Vyc29yIGlzCiAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudCwgYW5kIHRoZSBub2RlIGRvZXNuJ3QgaGF2ZSBhbgogICAgLy8gb2Zmc2V0LCBqdXN0IHNjcm9sbCB0byB0aGUgZW5kLgogICAgaWYgKGNvbXBlbnNhdGVIYWNrID09IDApIGF0RW5kID0gZmFsc2U7CgogICAgLy8gV2ViS2l0IGhhcyBhIGJhZCBoYWJpdCBvZiAoc29tZXRpbWVzKSBoYXBwaWx5IHJldHVybmluZyBib2d1cwogICAgLy8gb2Zmc2V0cyB3aGVuIHRoZSBkb2N1bWVudCBoYXMganVzdCBiZWVuIGNoYW5nZWQuIFRoaXMgc2VlbXMgdG8KICAgIC8vIGFsd2F5cyBiZSA1LzUsIHNvIHdlIGRvbid0IHVzZSB0aG9zZS4KICAgIGlmICh3ZWJraXQgJiYgZWxlbWVudCAmJiBlbGVtZW50Lm9mZnNldFRvcCA9PSA1ICYmIGVsZW1lbnQub2Zmc2V0TGVmdCA9PSA1KQogICAgICByZXR1cm47CgogICAgdmFyIHkgPSBjb21wZW5zYXRlSGFjayAqIChlbGVtZW50ID8gZWxlbWVudC5vZmZzZXRIZWlnaHQgOiAwKSwgeCA9IDAsCiAgICAgICAgd2lkdGggPSAobm9kZSA/IG5vZGUub2Zmc2V0V2lkdGggOiAwKSwgcG9zID0gZWxlbWVudDsKICAgIHdoaWxlIChwb3MgJiYgcG9zLm9mZnNldFBhcmVudCkgewogICAgICB5ICs9IHBvcy5vZmZzZXRUb3A7CiAgICAgIC8vIERvbid0IGNvdW50IFggb2Zmc2V0IGZvciA8YnI+IG5vZGVzCiAgICAgIGlmICghaXNCUihwb3MpKQogICAgICAgIHggKz0gcG9zLm9mZnNldExlZnQ7CiAgICAgIHBvcyA9IHBvcy5vZmZzZXRQYXJlbnQ7CiAgICB9CgogICAgdmFyIHNjcm9sbF94ID0gYm9keS5zY3JvbGxMZWZ0IHx8IGh0bWwuc2Nyb2xsTGVmdCB8fCAwLAogICAgICAgIHNjcm9sbF95ID0gYm9keS5zY3JvbGxUb3AgfHwgaHRtbC5zY3JvbGxUb3AgfHwgMCwKICAgICAgICBzY3JvbGwgPSBmYWxzZSwgc2NyZWVuX3dpZHRoID0gd2luLmlubmVyV2lkdGggfHwgaHRtbC5jbGllbnRXaWR0aCB8fCAwOwoKICAgIGlmIChjdXJzb3IgfHwgd2lkdGggPCBzY3JlZW5fd2lkdGgpIHsKICAgICAgaWYgKGN1cnNvcikgewogICAgICAgIHZhciBvZmYgPSBzZWxlY3Qub2Zmc2V0SW5Ob2RlKHdpbiwgbm9kZSksIHNpemUgPSBub2RlVGV4dChub2RlKS5sZW5ndGg7CiAgICAgICAgaWYgKHNpemUpIHggKz0gd2lkdGggKiAob2ZmIC8gc2l6ZSk7CiAgICAgIH0KICAgICAgdmFyIHNjcmVlbl94ID0geCAtIHNjcm9sbF94OwogICAgICBpZiAoc2NyZWVuX3ggPCAwIHx8IHNjcmVlbl94ID4gc2NyZWVuX3dpZHRoKSB7CiAgICAgICAgc2Nyb2xsX3ggPSB4OwogICAgICAgIHNjcm9sbCA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHZhciBzY3JlZW5feSA9IHkgLSBzY3JvbGxfeTsKICAgIGlmIChzY3JlZW5feSA8IDAgfHwgYXRFbmQgfHwgc2NyZWVuX3kgPiAod2luLmlubmVySGVpZ2h0IHx8IGh0bWwuY2xpZW50SGVpZ2h0IHx8IDApIC0gNTApIHsKICAgICAgc2Nyb2xsX3kgPSBhdEVuZCA/IDFlNiA6IHk7CiAgICAgIHNjcm9sbCA9IHRydWU7CiAgICB9CiAgICBpZiAoc2Nyb2xsKSB3aW4uc2Nyb2xsVG8oc2Nyb2xsX3gsIHNjcm9sbF95KTsKICB9OwoKICBzZWxlY3Quc2Nyb2xsVG9DdXJzb3IgPSBmdW5jdGlvbihjb250YWluZXIpIHsKICAgIHNlbGVjdC5zY3JvbGxUb05vZGUoc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUoY29udGFpbmVyLCB0cnVlKSB8fCBjb250YWluZXIuZmlyc3RDaGlsZCwgdHJ1ZSk7CiAgfTsKCiAgLy8gVXNlZCB0byBwcmV2ZW50IHJlc3RvcmluZyBhIHNlbGVjdGlvbiB3aGVuIHdlIGRvIG5vdCBuZWVkIHRvLgogIHZhciBjdXJyZW50U2VsZWN0aW9uID0gbnVsbDsKCiAgc2VsZWN0LnNuYXBzaG90Q2hhbmdlZCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGN1cnJlbnRTZWxlY3Rpb24pIGN1cnJlbnRTZWxlY3Rpb24uY2hhbmdlZCA9IHRydWU7CiAgfTsKCiAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGNvZGUgaW4gZWRpdG9yLmpzIHdoZW5ldmVyIGl0IGlzIHJlcGxhY2luZwogIC8vIGEgdGV4dCBub2RlLiBUaGUgZnVuY3Rpb24gc2VlcyB3aGV0aGVyIHRoZSBnaXZlbiBvbGROb2RlIGlzIHBhcnQKICAvLyBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24sIGFuZCB1cGRhdGVzIHRoaXMgc2VsZWN0aW9uIGlmIGl0IGlzLgogIC8vIEJlY2F1c2Ugbm9kZXMgYXJlIG9mdGVuIG9ubHkgcGFydGlhbGx5IHJlcGxhY2VkLCB0aGUgbGVuZ3RoIG9mCiAgLy8gdGhlIHBhcnQgdGhhdCBnZXRzIHJlcGxhY2VkIGhhcyB0byBiZSB0YWtlbiBpbnRvIGFjY291bnQgLS0gdGhlCiAgLy8gc2VsZWN0aW9uIG1pZ2h0IHN0YXkgaW4gdGhlIG9sZE5vZGUgaWYgdGhlIG5ld05vZGUgaXMgc21hbGxlcgogIC8vIHRoYW4gdGhlIHNlbGVjdGlvbidzIG9mZnNldC4gVGhlIG9mZnNldCBhcmd1bWVudCBpcyBuZWVkZWQgaW4KICAvLyBjYXNlIHRoZSBzZWxlY3Rpb24gZG9lcyBtb3ZlIHRvIHRoZSBuZXcgb2JqZWN0LCBhbmQgdGhlIGdpdmVuCiAgLy8gbGVuZ3RoIGlzIG5vdCB0aGUgd2hvbGUgbGVuZ3RoIG9mIHRoZSBuZXcgbm9kZSAocGFydCBvZiBpdCBtaWdodAogIC8vIGhhdmUgYmVlbiB1c2VkIHRvIHJlcGxhY2UgYW5vdGhlciBub2RlKS4KICBzZWxlY3Quc25hcHNob3RSZXBsYWNlTm9kZSA9IGZ1bmN0aW9uKGZyb20sIHRvLCBsZW5ndGgsIG9mZnNldCkgewogICAgaWYgKCFjdXJyZW50U2VsZWN0aW9uKSByZXR1cm47CgogICAgZnVuY3Rpb24gcmVwbGFjZShwb2ludCkgewogICAgICBpZiAoZnJvbSA9PSBwb2ludC5ub2RlKSB7CiAgICAgICAgY3VycmVudFNlbGVjdGlvbi5jaGFuZ2VkID0gdHJ1ZTsKICAgICAgICBpZiAobGVuZ3RoICYmIHBvaW50Lm9mZnNldCA+IGxlbmd0aCkgewogICAgICAgICAgcG9pbnQub2Zmc2V0IC09IGxlbmd0aDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBwb2ludC5ub2RlID0gdG87CiAgICAgICAgICBwb2ludC5vZmZzZXQgKz0gKG9mZnNldCB8fCAwKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJlcGxhY2UoY3VycmVudFNlbGVjdGlvbi5zdGFydCk7CiAgICByZXBsYWNlKGN1cnJlbnRTZWxlY3Rpb24uZW5kKTsKICB9OwoKICBzZWxlY3Quc25hcHNob3RNb3ZlID0gZnVuY3Rpb24oZnJvbSwgdG8sIGRpc3RhbmNlLCByZWxhdGl2ZSwgaWZBdFN0YXJ0KSB7CiAgICBpZiAoIWN1cnJlbnRTZWxlY3Rpb24pIHJldHVybjsKCiAgICBmdW5jdGlvbiBtb3ZlKHBvaW50KSB7CiAgICAgIGlmIChmcm9tID09IHBvaW50Lm5vZGUgJiYgKCFpZkF0U3RhcnQgfHwgcG9pbnQub2Zmc2V0ID09IDApKSB7CiAgICAgICAgY3VycmVudFNlbGVjdGlvbi5jaGFuZ2VkID0gdHJ1ZTsKICAgICAgICBwb2ludC5ub2RlID0gdG87CiAgICAgICAgaWYgKHJlbGF0aXZlKSBwb2ludC5vZmZzZXQgPSBNYXRoLm1heCgwLCBwb2ludC5vZmZzZXQgKyBkaXN0YW5jZSk7CiAgICAgICAgZWxzZSBwb2ludC5vZmZzZXQgPSBkaXN0YW5jZTsKICAgICAgfQogICAgfQogICAgbW92ZShjdXJyZW50U2VsZWN0aW9uLnN0YXJ0KTsKICAgIG1vdmUoY3VycmVudFNlbGVjdGlvbi5lbmQpOwogIH07CgogIC8vIE1vc3QgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluIHR3byB3YXlzLCBvbmUgZm9yIHRoZSBJRSBzZWxlY3Rpb24KICAvLyBtb2RlbCwgb25lIGZvciB0aGUgVzNDIG9uZS4KICBpZiAoc2VsZWN0LmllX3NlbGVjdGlvbikgewogICAgZnVuY3Rpb24gc2VsZWN0aW9uTm9kZSh3aW4sIHN0YXJ0KSB7CiAgICAgIHZhciByYW5nZSA9IHdpbi5kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsKICAgICAgcmFuZ2UuY29sbGFwc2Uoc3RhcnQpOwoKICAgICAgZnVuY3Rpb24gbm9kZUFmdGVyKG5vZGUpIHsKICAgICAgICB2YXIgZm91bmQgPSBudWxsOwogICAgICAgIHdoaWxlICghZm91bmQgJiYgbm9kZSkgewogICAgICAgICAgZm91bmQgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vZGVBdFN0YXJ0T2YoZm91bmQpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBub2RlQXRTdGFydE9mKG5vZGUpIHsKICAgICAgICB3aGlsZSAobm9kZSAmJiBub2RlLmZpcnN0Q2hpbGQpIG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7CiAgICAgICAgcmV0dXJuIHtub2RlOiBub2RlLCBvZmZzZXQ6IDB9OwogICAgICB9CgogICAgICB2YXIgY29udGFpbmluZyA9IHJhbmdlLnBhcmVudEVsZW1lbnQoKTsKICAgICAgaWYgKCFpc0FuY2VzdG9yKHdpbi5kb2N1bWVudC5ib2R5LCBjb250YWluaW5nKSkgcmV0dXJuIG51bGw7CiAgICAgIGlmICghY29udGFpbmluZy5maXJzdENoaWxkKSByZXR1cm4gbm9kZUF0U3RhcnRPZihjb250YWluaW5nKTsKCiAgICAgIHZhciB3b3JraW5nID0gcmFuZ2UuZHVwbGljYXRlKCk7CiAgICAgIHdvcmtpbmcubW92ZVRvRWxlbWVudFRleHQoY29udGFpbmluZyk7CiAgICAgIHdvcmtpbmcuY29sbGFwc2UodHJ1ZSk7CiAgICAgIGZvciAodmFyIGN1ciA9IGNvbnRhaW5pbmcuZmlyc3RDaGlsZDsgY3VyOyBjdXIgPSBjdXIubmV4dFNpYmxpbmcpIHsKICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09IDMpIHsKICAgICAgICAgIHZhciBzaXplID0gY3VyLm5vZGVWYWx1ZS5sZW5ndGg7CiAgICAgICAgICB3b3JraW5nLm1vdmUoImNoYXJhY3RlciIsIHNpemUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHdvcmtpbmcubW92ZVRvRWxlbWVudFRleHQoY3VyKTsKICAgICAgICAgIHdvcmtpbmcuY29sbGFwc2UoZmFsc2UpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGRpciA9IHJhbmdlLmNvbXBhcmVFbmRQb2ludHMoIlN0YXJ0VG9TdGFydCIsIHdvcmtpbmcpOwogICAgICAgIGlmIChkaXIgPT0gMCkgcmV0dXJuIG5vZGVBZnRlcihjdXIpOwogICAgICAgIGlmIChkaXIgPT0gMSkgY29udGludWU7CiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSAhPSAzKSByZXR1cm4gbm9kZUF0U3RhcnRPZihjdXIpOwoKICAgICAgICB3b3JraW5nLnNldEVuZFBvaW50KCJTdGFydFRvRW5kIiwgcmFuZ2UpOwogICAgICAgIHJldHVybiB7bm9kZTogY3VyLCBvZmZzZXQ6IHNpemUgLSB3b3JraW5nLnRleHQubGVuZ3RofTsKICAgICAgfQogICAgICByZXR1cm4gbm9kZUFmdGVyKGNvbnRhaW5pbmcpOwogICAgfQoKICAgIHNlbGVjdC5tYXJrU2VsZWN0aW9uID0gZnVuY3Rpb24od2luKSB7CiAgICAgIGN1cnJlbnRTZWxlY3Rpb24gPSBudWxsOwogICAgICB2YXIgc2VsID0gd2luLmRvY3VtZW50LnNlbGVjdGlvbjsKICAgICAgaWYgKCFzZWwpIHJldHVybjsKICAgICAgdmFyIHN0YXJ0ID0gc2VsZWN0aW9uTm9kZSh3aW4sIHRydWUpLAogICAgICAgICAgZW5kID0gc2VsZWN0aW9uTm9kZSh3aW4sIGZhbHNlKTsKICAgICAgaWYgKCFzdGFydCB8fCAhZW5kKSByZXR1cm47CiAgICAgIGN1cnJlbnRTZWxlY3Rpb24gPSB7c3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCwgd2luZG93OiB3aW4sIGNoYW5nZWQ6IGZhbHNlfTsKICAgIH07CgogICAgc2VsZWN0LnNlbGVjdE1hcmtlZCA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAoIWN1cnJlbnRTZWxlY3Rpb24gfHwgIWN1cnJlbnRTZWxlY3Rpb24uY2hhbmdlZCkgcmV0dXJuOwogICAgICB2YXIgd2luID0gY3VycmVudFNlbGVjdGlvbi53aW5kb3csIGRvYyA9IHdpbi5kb2N1bWVudDsKCiAgICAgIGZ1bmN0aW9uIG1ha2VSYW5nZShwb2ludCkgewogICAgICAgIHZhciByYW5nZSA9IGRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpLAogICAgICAgICAgICBub2RlID0gcG9pbnQubm9kZTsKICAgICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgIHJhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KGN1cnJlbnRTZWxlY3Rpb24ud2luZG93LmRvY3VtZW50LmJvZHkpOwogICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHsKICAgICAgICAgIHJhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KG5vZGUucGFyZW50Tm9kZSk7CiAgICAgICAgICB2YXIgb2Zmc2V0ID0gcG9pbnQub2Zmc2V0OwogICAgICAgICAgd2hpbGUgKG5vZGUucHJldmlvdXNTaWJsaW5nKSB7CiAgICAgICAgICAgIG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZzsKICAgICAgICAgICAgb2Zmc2V0ICs9IChub2RlLmlubmVyVGV4dCB8fCAiIikubGVuZ3RoOwogICAgICAgICAgfQogICAgICAgICAgcmFuZ2UubW92ZSgiY2hhcmFjdGVyIiwgb2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICByYW5nZS5tb3ZlVG9FbGVtZW50VGV4dChub2RlKTsKICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgIH0KCiAgICAgIHZhciBzdGFydCA9IG1ha2VSYW5nZShjdXJyZW50U2VsZWN0aW9uLnN0YXJ0KSwgZW5kID0gbWFrZVJhbmdlKGN1cnJlbnRTZWxlY3Rpb24uZW5kKTsKICAgICAgc3RhcnQuc2V0RW5kUG9pbnQoIlN0YXJ0VG9FbmQiLCBlbmQpOwogICAgICBzdGFydC5zZWxlY3QoKTsKICAgIH07CgogICAgc2VsZWN0Lm9mZnNldEluTm9kZSA9IGZ1bmN0aW9uKHdpbiwgbm9kZSkgewogICAgICB2YXIgc2VsID0gd2luLmRvY3VtZW50LnNlbGVjdGlvbjsKICAgICAgaWYgKCFzZWwpIHJldHVybiAwOwogICAgICB2YXIgcmFuZ2UgPSBzZWwuY3JlYXRlUmFuZ2UoKSwgcmFuZ2UyID0gcmFuZ2UuZHVwbGljYXRlKCk7CiAgICAgIHRyeSB7cmFuZ2UyLm1vdmVUb0VsZW1lbnRUZXh0KG5vZGUpO30gY2F0Y2goZSl7cmV0dXJuIDA7fQogICAgICByYW5nZS5zZXRFbmRQb2ludCgiU3RhcnRUb1N0YXJ0IiwgcmFuZ2UyKTsKICAgICAgcmV0dXJuIHJhbmdlLnRleHQubGVuZ3RoOwogICAgfTsKCiAgICAvLyBHZXQgdGhlIHRvcC1sZXZlbCBub2RlIHRoYXQgb25lIGVuZCBvZiB0aGUgY3Vyc29yIGlzIGluc2lkZSBvcgogICAgLy8gYWZ0ZXIuIE5vdGUgdGhhdCB0aGlzIHJldHVybnMgZmFsc2UgZm9yICdubyBjdXJzb3InLCBhbmQgbnVsbAogICAgLy8gZm9yICdzdGFydCBvZiBkb2N1bWVudCcuCiAgICBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgc3RhcnQpIHsKICAgICAgdmFyIHNlbGVjdGlvbiA9IGNvbnRhaW5lci5vd25lckRvY3VtZW50LnNlbGVjdGlvbjsKICAgICAgaWYgKCFzZWxlY3Rpb24pIHJldHVybiBmYWxzZTsKCiAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLCByYW5nZTIgPSByYW5nZS5kdXBsaWNhdGUoKTsKICAgICAgcmFuZ2UuY29sbGFwc2Uoc3RhcnQpOwogICAgICB2YXIgYXJvdW5kID0gcmFuZ2UucGFyZW50RWxlbWVudCgpOwogICAgICBpZiAoYXJvdW5kICYmIGlzQW5jZXN0b3IoY29udGFpbmVyLCBhcm91bmQpKSB7CiAgICAgICAgLy8gT25seSB1c2UgdGhpcyBub2RlIGlmIHRoZSBzZWxlY3Rpb24gaXMgbm90IGF0IGl0cyBzdGFydC4KICAgICAgICByYW5nZTIubW92ZVRvRWxlbWVudFRleHQoYXJvdW5kKTsKICAgICAgICBpZiAocmFuZ2UuY29tcGFyZUVuZFBvaW50cygiU3RhcnRUb1N0YXJ0IiwgcmFuZ2UyKSA9PSAxKQogICAgICAgICAgcmV0dXJuIHRvcExldmVsTm9kZUF0KGFyb3VuZCwgY29udGFpbmVyKTsKICAgICAgfQoKICAgICAgLy8gTW92ZSB0aGUgc3RhcnQgb2YgYSByYW5nZSB0byB0aGUgc3RhcnQgb2YgYSBub2RlLAogICAgICAvLyBjb21wZW5zYXRpbmcgZm9yIHRoZSBmYWN0IHRoYXQgeW91IGNhbid0IGNhbGwKICAgICAgLy8gbW92ZVRvRWxlbWVudFRleHQgd2l0aCB0ZXh0IG5vZGVzLgogICAgICBmdW5jdGlvbiBtb3ZlVG9Ob2RlU3RhcnQocmFuZ2UsIG5vZGUpIHsKICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7CiAgICAgICAgICB2YXIgY291bnQgPSAwLCBjdXIgPSBub2RlLnByZXZpb3VzU2libGluZzsKICAgICAgICAgIHdoaWxlIChjdXIgJiYgY3VyLm5vZGVUeXBlID09IDMpIHsKICAgICAgICAgICAgY291bnQgKz0gY3VyLm5vZGVWYWx1ZS5sZW5ndGg7CiAgICAgICAgICAgIGN1ciA9IGN1ci5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY3VyKSB7CiAgICAgICAgICAgIHRyeXtyYW5nZS5tb3ZlVG9FbGVtZW50VGV4dChjdXIpO30KICAgICAgICAgICAgY2F0Y2goZSl7cmV0dXJuIGZhbHNlO30KICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSByYW5nZS5tb3ZlVG9FbGVtZW50VGV4dChub2RlLnBhcmVudE5vZGUpOwogICAgICAgICAgaWYgKGNvdW50KSByYW5nZS5tb3ZlKCJjaGFyYWN0ZXIiLCBjb3VudCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgdHJ5e3JhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KG5vZGUpO30KICAgICAgICAgIGNhdGNoKGUpe3JldHVybiBmYWxzZTt9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICAvLyBEbyBhIGJpbmFyeSBzZWFyY2ggdGhyb3VnaCB0aGUgY29udGFpbmVyIG9iamVjdCwgY29tcGFyaW5nCiAgICAgIC8vIHRoZSBzdGFydCBvZiBlYWNoIG5vZGUgdG8gdGhlIHNlbGVjdGlvbgogICAgICB2YXIgc3RhcnQgPSAwLCBlbmQgPSBjb250YWluZXIuY2hpbGROb2Rlcy5sZW5ndGggLSAxOwogICAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHsKICAgICAgICB2YXIgbWlkZGxlID0gTWF0aC5jZWlsKChlbmQgKyBzdGFydCkgLyAyKSwgbm9kZSA9IGNvbnRhaW5lci5jaGlsZE5vZGVzW21pZGRsZV07CiAgICAgICAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7IC8vIERvbid0IGFzay4gSUU2IG1hbmFnZXMgdGhpcyBzb21ldGltZXMuCiAgICAgICAgaWYgKCFtb3ZlVG9Ob2RlU3RhcnQocmFuZ2UyLCBub2RlKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChyYW5nZS5jb21wYXJlRW5kUG9pbnRzKCJTdGFydFRvU3RhcnQiLCByYW5nZTIpID09IDEpCiAgICAgICAgICBzdGFydCA9IG1pZGRsZTsKICAgICAgICBlbHNlCiAgICAgICAgICBlbmQgPSBtaWRkbGUgLSAxOwogICAgICB9CiAgICAgIHJldHVybiBjb250YWluZXIuY2hpbGROb2Rlc1tzdGFydF0gfHwgbnVsbDsKICAgIH07CgogICAgLy8gUGxhY2UgdGhlIGN1cnNvciBhZnRlciB0aGlzLnN0YXJ0LiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4KICAgIC8vIG1hbnVhbGx5IG1vdmluZyB0aGUgY3Vyc29yIGluc3RlYWQgb2YgcmVzdG9yaW5nIGl0IHRvIGl0cyBvbGQKICAgIC8vIHBvc2l0aW9uLgogICAgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlID0gZnVuY3Rpb24obm9kZSwgY29udGFpbmVyKSB7CiAgICAgIHZhciByYW5nZSA9IGNvbnRhaW5lci5vd25lckRvY3VtZW50LmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7CiAgICAgIHJhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KG5vZGUgfHwgY29udGFpbmVyKTsKICAgICAgcmFuZ2UuY29sbGFwc2UoIW5vZGUpOwogICAgICByYW5nZS5zZWxlY3QoKTsKICAgIH07CgogICAgc2VsZWN0LnNvbWV0aGluZ1NlbGVjdGVkID0gZnVuY3Rpb24od2luKSB7CiAgICAgIHZhciBzZWwgPSB3aW4uZG9jdW1lbnQuc2VsZWN0aW9uOwogICAgICByZXR1cm4gc2VsICYmIChzZWwuY3JlYXRlUmFuZ2UoKS50ZXh0ICE9ICIiKTsKICAgIH07CgogICAgZnVuY3Rpb24gaW5zZXJ0QXRDdXJzb3Iod2luZG93LCBodG1sKSB7CiAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZG9jdW1lbnQuc2VsZWN0aW9uOwogICAgICBpZiAoc2VsZWN0aW9uKSB7CiAgICAgICAgdmFyIHJhbmdlID0gc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CiAgICAgICAgcmFuZ2UucGFzdGVIVE1MKGh0bWwpOwogICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTsKICAgICAgICByYW5nZS5zZWxlY3QoKTsKICAgICAgfQogICAgfQoKICAgIC8vIFVzZWQgdG8gbm9ybWFsaXplIHRoZSBlZmZlY3Qgb2YgdGhlIGVudGVyIGtleSwgc2luY2UgYnJvd3NlcnMKICAgIC8vIGRvIHdpZGVseSBkaWZmZXJlbnQgdGhpbmdzIHdoZW4gcHJlc3NpbmcgZW50ZXIgaW4gZGVzaWduTW9kZS4KICAgIHNlbGVjdC5pbnNlcnROZXdsaW5lQXRDdXJzb3IgPSBmdW5jdGlvbih3aW5kb3cpIHsKICAgICAgaW5zZXJ0QXRDdXJzb3Iod2luZG93LCAiPGJyPiIpOwogICAgfTsKCiAgICBzZWxlY3QuaW5zZXJ0VGFiQXRDdXJzb3IgPSBmdW5jdGlvbih3aW5kb3cpIHsKICAgICAgaW5zZXJ0QXRDdXJzb3Iod2luZG93LCBmb3VyU3BhY2VzKTsKICAgIH07CgogICAgLy8gR2V0IHRoZSBCUiBub2RlIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSBvbiB3aGljaCB0aGUgY3Vyc29yCiAgICAvLyBjdXJyZW50bHkgaXMsIGFuZCB0aGUgb2Zmc2V0IGludG8gdGhlIGxpbmUuIFJldHVybnMgbnVsbCBhcwogICAgLy8gbm9kZSBpZiBjdXJzb3IgaXMgb24gZmlyc3QgbGluZS4KICAgIHNlbGVjdC5jdXJzb3JQb3MgPSBmdW5jdGlvbihjb250YWluZXIsIHN0YXJ0KSB7CiAgICAgIHZhciBzZWxlY3Rpb24gPSBjb250YWluZXIub3duZXJEb2N1bWVudC5zZWxlY3Rpb247CiAgICAgIGlmICghc2VsZWN0aW9uKSByZXR1cm4gbnVsbDsKCiAgICAgIHZhciB0b3BOb2RlID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUoY29udGFpbmVyLCBzdGFydCk7CiAgICAgIHdoaWxlICh0b3BOb2RlICYmICFpc0JSKHRvcE5vZGUpKQogICAgICAgIHRvcE5vZGUgPSB0b3BOb2RlLnByZXZpb3VzU2libGluZzsKCiAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLCByYW5nZTIgPSByYW5nZS5kdXBsaWNhdGUoKTsKICAgICAgcmFuZ2UuY29sbGFwc2Uoc3RhcnQpOwogICAgICBpZiAodG9wTm9kZSkgewogICAgICAgIHJhbmdlMi5tb3ZlVG9FbGVtZW50VGV4dCh0b3BOb2RlKTsKICAgICAgICByYW5nZTIuY29sbGFwc2UoZmFsc2UpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIC8vIFdoZW4gbm90aGluZyBpcyBzZWxlY3RlZCwgd2UgY2FuIGdldCBhbGwga2luZHMgb2YgZnVua3kgZXJyb3JzIGhlcmUuCiAgICAgICAgdHJ5IHsgcmFuZ2UyLm1vdmVUb0VsZW1lbnRUZXh0KGNvbnRhaW5lcik7IH0KICAgICAgICBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQogICAgICAgIHJhbmdlMi5jb2xsYXBzZSh0cnVlKTsKICAgICAgfQogICAgICByYW5nZS5zZXRFbmRQb2ludCgiU3RhcnRUb1N0YXJ0IiwgcmFuZ2UyKTsKCiAgICAgIHJldHVybiB7bm9kZTogdG9wTm9kZSwgb2Zmc2V0OiByYW5nZS50ZXh0Lmxlbmd0aH07CiAgICB9OwoKICAgIHNlbGVjdC5zZXRDdXJzb3JQb3MgPSBmdW5jdGlvbihjb250YWluZXIsIGZyb20sIHRvKSB7CiAgICAgIGZ1bmN0aW9uIHJhbmdlQXQocG9zKSB7CiAgICAgICAgdmFyIHJhbmdlID0gY29udGFpbmVyLm93bmVyRG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsKICAgICAgICBpZiAoIXBvcy5ub2RlKSB7CiAgICAgICAgICByYW5nZS5tb3ZlVG9FbGVtZW50VGV4dChjb250YWluZXIpOwogICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgcmFuZ2UubW92ZVRvRWxlbWVudFRleHQocG9zLm5vZGUpOwogICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpOwogICAgICAgIH0KICAgICAgICByYW5nZS5tb3ZlKCJjaGFyYWN0ZXIiLCBwb3Mub2Zmc2V0KTsKICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgIH0KCiAgICAgIHZhciByYW5nZSA9IHJhbmdlQXQoZnJvbSk7CiAgICAgIGlmICh0byAmJiB0byAhPSBmcm9tKQogICAgICAgIHJhbmdlLnNldEVuZFBvaW50KCJFbmRUb0VuZCIsIHJhbmdlQXQodG8pKTsKICAgICAgcmFuZ2Uuc2VsZWN0KCk7CiAgICB9CgogICAgLy8gU29tZSBoYWNrcyBmb3Igc3RvcmluZyBhbmQgcmUtc3RvcmluZyB0aGUgc2VsZWN0aW9uIHdoZW4gdGhlIGVkaXRvciBsb3NlcyBhbmQgcmVnYWlucyBmb2N1cy4KICAgIHNlbGVjdC5nZXRCb29rbWFyayA9IGZ1bmN0aW9uIChjb250YWluZXIpIHsKICAgICAgdmFyIGZyb20gPSBzZWxlY3QuY3Vyc29yUG9zKGNvbnRhaW5lciwgdHJ1ZSksIHRvID0gc2VsZWN0LmN1cnNvclBvcyhjb250YWluZXIsIGZhbHNlKTsKICAgICAgaWYgKGZyb20gJiYgdG8pIHJldHVybiB7ZnJvbTogZnJvbSwgdG86IHRvfTsKICAgIH07CgogICAgLy8gUmVzdG9yZSBhIHN0b3JlZCBzZWxlY3Rpb24uCiAgICBzZWxlY3Quc2V0Qm9va21hcmsgPSBmdW5jdGlvbihjb250YWluZXIsIG1hcmspIHsKICAgICAgaWYgKCFtYXJrKSByZXR1cm47CiAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3MoY29udGFpbmVyLCBtYXJrLmZyb20sIG1hcmsudG8pOwogICAgfTsKICB9CiAgLy8gVzNDIG1vZGVsCiAgZWxzZSB7CiAgICAvLyBGaW5kIHRoZSBub2RlIHJpZ2h0IGF0IHRoZSBjdXJzb3IsIG5vdCBvbmUgb2YgaXRzCiAgICAvLyBhbmNlc3RvcnMgd2l0aCBhIHN1aXRhYmxlIG9mZnNldC4gVGhpcyBnb2VzIGRvd24gdGhlIERPTSB0cmVlCiAgICAvLyB1bnRpbCBhICdsZWFmJyBpcyByZWFjaGVkIChvciBpcyBpdCAqdXAqIHRoZSBET00gdHJlZT8pLgogICAgZnVuY3Rpb24gaW5uZXJOb2RlKG5vZGUsIG9mZnNldCkgewogICAgICB3aGlsZSAobm9kZS5ub2RlVHlwZSAhPSAzICYmICFpc0JSKG5vZGUpKSB7CiAgICAgICAgdmFyIG5ld05vZGUgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XSB8fCBub2RlLm5leHRTaWJsaW5nOwogICAgICAgIG9mZnNldCA9IDA7CiAgICAgICAgd2hpbGUgKCFuZXdOb2RlICYmIG5vZGUucGFyZW50Tm9kZSkgewogICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKICAgICAgICAgIG5ld05vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICAgIH0KICAgICAgICBub2RlID0gbmV3Tm9kZTsKICAgICAgICBpZiAoIW5ld05vZGUpIGJyZWFrOwogICAgICB9CiAgICAgIHJldHVybiB7bm9kZTogbm9kZSwgb2Zmc2V0OiBvZmZzZXR9OwogICAgfQoKICAgIC8vIFN0b3JlIHN0YXJ0IGFuZCBlbmQgbm9kZXMsIGFuZCBvZmZzZXRzIHdpdGhpbiB0aGVzZSwgYW5kIHJlZmVyCiAgICAvLyBiYWNrIHRvIHRoZSBzZWxlY3Rpb24gb2JqZWN0IGZyb20gdGhvc2Ugbm9kZXMsIHNvIHRoYXQgdGhpcwogICAgLy8gb2JqZWN0IGNhbiBiZSB1cGRhdGVkIHdoZW4gdGhlIG5vZGVzIGFyZSByZXBsYWNlZCBiZWZvcmUgdGhlCiAgICAvLyBzZWxlY3Rpb24gaXMgcmVzdG9yZWQuCiAgICBzZWxlY3QubWFya1NlbGVjdGlvbiA9IGZ1bmN0aW9uICh3aW4pIHsKICAgICAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24oKTsKICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT0gMCkKICAgICAgICByZXR1cm4gKGN1cnJlbnRTZWxlY3Rpb24gPSBudWxsKTsKICAgICAgdmFyIHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7CgogICAgICBjdXJyZW50U2VsZWN0aW9uID0gewogICAgICAgIHN0YXJ0OiBpbm5lck5vZGUocmFuZ2Uuc3RhcnRDb250YWluZXIsIHJhbmdlLnN0YXJ0T2Zmc2V0KSwKICAgICAgICBlbmQ6IGlubmVyTm9kZShyYW5nZS5lbmRDb250YWluZXIsIHJhbmdlLmVuZE9mZnNldCksCiAgICAgICAgd2luZG93OiB3aW4sCiAgICAgICAgY2hhbmdlZDogZmFsc2UKICAgICAgfTsKICAgIH07CgogICAgc2VsZWN0LnNlbGVjdE1hcmtlZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIGNzID0gY3VycmVudFNlbGVjdGlvbjsKICAgICAgLy8gb24gd2Via2l0LWJhc2VkIGJyb3dzZXJzLCBpdCBpcyBhcHBhcmVudGx5IHBvc3NpYmxlIHRoYXQgdGhlCiAgICAgIC8vIHNlbGVjdGlvbiBnZXRzIHJlc2V0IGV2ZW4gd2hlbiBhIG5vZGUgdGhhdCBpcyBub3Qgb25lIG9mIHRoZQogICAgICAvLyBlbmRwb2ludHMgZ2V0IG1lc3NlZCB3aXRoLiB0aGUgbW9zdCBjb21tb24gc2l0dWF0aW9uIHdoZXJlCiAgICAgIC8vIHRoaXMgb2NjdXJzIGlzIHdoZW4gYSBzZWxlY3Rpb24gaXMgZGVsZXRlZCBvciBvdmVyd2l0dGVuLiB3ZQogICAgICAvLyBjaGVjayBmb3IgdGhhdCBoZXJlLgogICAgICBmdW5jdGlvbiBmb2N1c0lzc3VlKCkgewogICAgICAgIGlmIChjcy5zdGFydC5ub2RlID09IGNzLmVuZC5ub2RlICYmIGNzLnN0YXJ0Lm9mZnNldCA9PSBjcy5lbmQub2Zmc2V0KSB7CiAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gY3Mud2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT0gMCkgcmV0dXJuIHRydWU7CiAgICAgICAgICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKSwgcG9pbnQgPSBpbm5lck5vZGUocmFuZ2Uuc3RhcnRDb250YWluZXIsIHJhbmdlLnN0YXJ0T2Zmc2V0KTsKICAgICAgICAgIHJldHVybiBjcy5zdGFydC5ub2RlICE9IHBvaW50Lm5vZGUgfHwgY3Muc3RhcnQub2Zmc2V0ICE9IHBvaW50Lm9mZnNldDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFjcyB8fCAhKGNzLmNoYW5nZWQgfHwgKHdlYmtpdCAmJiBmb2N1c0lzc3VlKCkpKSkgcmV0dXJuOwogICAgICB2YXIgd2luID0gY3Mud2luZG93LCByYW5nZSA9IHdpbi5kb2N1bWVudC5jcmVhdGVSYW5nZSgpOwoKICAgICAgZnVuY3Rpb24gc2V0UG9pbnQocG9pbnQsIHdoaWNoKSB7CiAgICAgICAgaWYgKHBvaW50Lm5vZGUpIHsKICAgICAgICAgIC8vIFNvbWUgbWFnaWMgdG8gZ2VuZXJhbGl6ZSB0aGUgc2V0dGluZyBvZiB0aGUgc3RhcnQgYW5kIGVuZAogICAgICAgICAgLy8gb2YgYSByYW5nZS4KICAgICAgICAgIGlmIChwb2ludC5vZmZzZXQgPT0gMCkKICAgICAgICAgICAgcmFuZ2VbInNldCIgKyB3aGljaCArICJCZWZvcmUiXShwb2ludC5ub2RlKTsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgcmFuZ2VbInNldCIgKyB3aGljaF0ocG9pbnQubm9kZSwgcG9pbnQub2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHdpbi5kb2N1bWVudC5ib2R5Lmxhc3RDaGlsZCB8fCB3aW4uZG9jdW1lbnQuYm9keSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBzZXRQb2ludChjcy5lbmQsICJFbmQiKTsKICAgICAgc2V0UG9pbnQoY3Muc3RhcnQsICJTdGFydCIpOwogICAgICBzZWxlY3RSYW5nZShyYW5nZSwgd2luKTsKICAgIH07CgogICAgLy8gSGVscGVyIGZvciBzZWxlY3RpbmcgYSByYW5nZSBvYmplY3QuCiAgICBmdW5jdGlvbiBzZWxlY3RSYW5nZShyYW5nZSwgd2luZG93KSB7CiAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgIGlmICghc2VsZWN0aW9uKSByZXR1cm47CiAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTsKICAgIH0KICAgIGZ1bmN0aW9uIHNlbGVjdGlvblJhbmdlKHdpbmRvdykgewogICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PSAwKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgIH0KCiAgICAvLyBGaW5kaW5nIHRoZSB0b3AtbGV2ZWwgbm9kZSBhdCB0aGUgY3Vyc29yIGluIHRoZSBXM0MgaXMsIGFzIHlvdQogICAgLy8gY2FuIHNlZSwgcXVpdGUgYW4gaW52b2x2ZWQgcHJvY2Vzcy4KICAgIHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlID0gZnVuY3Rpb24oY29udGFpbmVyLCBzdGFydCkgewogICAgICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb25SYW5nZShjb250YWluZXIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldyk7CiAgICAgIGlmICghcmFuZ2UpIHJldHVybiBmYWxzZTsKCiAgICAgIHZhciBub2RlID0gc3RhcnQgPyByYW5nZS5zdGFydENvbnRhaW5lciA6IHJhbmdlLmVuZENvbnRhaW5lcjsKICAgICAgdmFyIG9mZnNldCA9IHN0YXJ0ID8gcmFuZ2Uuc3RhcnRPZmZzZXQgOiByYW5nZS5lbmRPZmZzZXQ7CiAgICAgIC8vIFdvcmsgYXJvdW5kICh5ZXQgYW5vdGhlcikgYnVnIGluIE9wZXJhJ3Mgc2VsZWN0aW9uIG1vZGVsLgogICAgICBpZiAod2luZG93Lm9wZXJhICYmICFzdGFydCAmJiByYW5nZS5lbmRDb250YWluZXIgPT0gY29udGFpbmVyICYmIHJhbmdlLmVuZE9mZnNldCA9PSByYW5nZS5zdGFydE9mZnNldCArIDEgJiYKICAgICAgICAgIGNvbnRhaW5lci5jaGlsZE5vZGVzW3JhbmdlLnN0YXJ0T2Zmc2V0XSAmJiBpc0JSKGNvbnRhaW5lci5jaGlsZE5vZGVzW3JhbmdlLnN0YXJ0T2Zmc2V0XSkpCiAgICAgICAgb2Zmc2V0LS07CgogICAgICAvLyBGb3IgdGV4dCBub2Rlcywgd2UgbG9vayBhdCB0aGUgbm9kZSBpdHNlbGYgaWYgdGhlIGN1cnNvciBpcwogICAgICAvLyBpbnNpZGUsIG9yIGF0IHRoZSBub2RlIGJlZm9yZSBpdCBpZiB0aGUgY3Vyc29yIGlzIGF0IHRoZQogICAgICAvLyBzdGFydC4KICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMyl7CiAgICAgICAgaWYgKG9mZnNldCA+IDApCiAgICAgICAgICByZXR1cm4gdG9wTGV2ZWxOb2RlQXQobm9kZSwgY29udGFpbmVyKTsKICAgICAgICBlbHNlCiAgICAgICAgICByZXR1cm4gdG9wTGV2ZWxOb2RlQmVmb3JlKG5vZGUsIGNvbnRhaW5lcik7CiAgICAgIH0KICAgICAgLy8gT2NjYXNpb25hbGx5LCBicm93c2VycyB3aWxsIHJldHVybiB0aGUgSFRNTCBub2RlIGFzCiAgICAgIC8vIHNlbGVjdGlvbi4gSWYgdGhlIG9mZnNldCBpcyAwLCB3ZSB0YWtlIHRoZSBzdGFydCBvZiB0aGUgZnJhbWUKICAgICAgLy8gKCdhZnRlciBudWxsJyksIG90aGVyd2lzZSwgd2UgdGFrZSB0aGUgbGFzdCBub2RlLgogICAgICBlbHNlIGlmIChub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT0gIkhUTUwiKSB7CiAgICAgICAgcmV0dXJuIChvZmZzZXQgPT0gMSA/IG51bGwgOiBjb250YWluZXIubGFzdENoaWxkKTsKICAgICAgfQogICAgICAvLyBJZiB0aGUgZ2l2ZW4gbm9kZSBpcyBvdXIgJ2NvbnRhaW5lcicsIHdlIGp1c3QgbG9vayB1cCB0aGUKICAgICAgLy8gY29ycmVjdCBub2RlIGJ5IHVzaW5nIHRoZSBvZmZzZXQuCiAgICAgIGVsc2UgaWYgKG5vZGUgPT0gY29udGFpbmVyKSB7CiAgICAgICAgcmV0dXJuIChvZmZzZXQgPT0gMCkgPyBudWxsIDogbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdOwogICAgICB9CiAgICAgIC8vIEluIGFueSBvdGhlciBjYXNlLCB3ZSBoYXZlIGEgcmVndWxhciBub2RlLiBJZiB0aGUgY3Vyc29yIGlzCiAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIG5vZGUsIHdlIHVzZSB0aGUgbm9kZSBpdHNlbGYsIGlmIGl0IGlzIGF0CiAgICAgIC8vIHRoZSBzdGFydCwgd2UgdXNlIHRoZSBub2RlIGJlZm9yZSBpdCwgYW5kIGluIGFueSBvdGhlcgogICAgICAvLyBjYXNlLCB3ZSBsb29rIHVwIHRoZSBjaGlsZCBiZWZvcmUgdGhlIGN1cnNvciBhbmQgdXNlIHRoYXQuCiAgICAgIGVsc2UgewogICAgICAgIGlmIChvZmZzZXQgPT0gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCkKICAgICAgICAgIHJldHVybiB0b3BMZXZlbE5vZGVBdChub2RlLCBjb250YWluZXIpOwogICAgICAgIGVsc2UgaWYgKG9mZnNldCA9PSAwKQogICAgICAgICAgcmV0dXJuIHRvcExldmVsTm9kZUJlZm9yZShub2RlLCBjb250YWluZXIpOwogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiB0b3BMZXZlbE5vZGVBdChub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV0sIGNvbnRhaW5lcik7CiAgICAgIH0KICAgIH07CgogICAgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlID0gZnVuY3Rpb24obm9kZSwgY29udGFpbmVyKSB7CiAgICAgIHZhciB3aW4gPSBjb250YWluZXIub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldywKICAgICAgICAgIHJhbmdlID0gd2luLmRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgIHJhbmdlLnNldFN0YXJ0QmVmb3JlKGNvbnRhaW5lci5maXJzdENoaWxkIHx8IGNvbnRhaW5lcik7CiAgICAgIC8vIEluIE9wZXJhLCBzZXR0aW5nIHRoZSBlbmQgb2YgYSByYW5nZSBhdCB0aGUgZW5kIG9mIGEgbGluZQogICAgICAvLyAoYmVmb3JlIGEgQlIpIHdpbGwgY2F1c2UgdGhlIGN1cnNvciB0byBhcHBlYXIgb24gdGhlIG5leHQKICAgICAgLy8gbGluZSwgc28gd2Ugc2V0IHRoZSBlbmQgaW5zaWRlIG9mIHRoZSBzdGFydCBub2RlIHdoZW4KICAgICAgLy8gcG9zc2libGUuCiAgICAgIGlmIChub2RlICYmICFub2RlLmZpcnN0Q2hpbGQpCiAgICAgICAgcmFuZ2Uuc2V0RW5kQWZ0ZXIobm9kZSk7CiAgICAgIGVsc2UgaWYgKG5vZGUpCiAgICAgICAgcmFuZ2Uuc2V0RW5kKG5vZGUsIG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpOwogICAgICBlbHNlCiAgICAgICAgcmFuZ2Uuc2V0RW5kQmVmb3JlKGNvbnRhaW5lci5maXJzdENoaWxkIHx8IGNvbnRhaW5lcik7CiAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTsKICAgICAgc2VsZWN0UmFuZ2UocmFuZ2UsIHdpbik7CiAgICB9OwoKICAgIHNlbGVjdC5zb21ldGhpbmdTZWxlY3RlZCA9IGZ1bmN0aW9uKHdpbikgewogICAgICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb25SYW5nZSh3aW4pOwogICAgICByZXR1cm4gcmFuZ2UgJiYgIXJhbmdlLmNvbGxhcHNlZDsKICAgIH07CgogICAgc2VsZWN0Lm9mZnNldEluTm9kZSA9IGZ1bmN0aW9uKHdpbiwgbm9kZSkgewogICAgICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb25SYW5nZSh3aW4pOwogICAgICBpZiAoIXJhbmdlKSByZXR1cm4gMDsKICAgICAgcmFuZ2UgPSByYW5nZS5jbG9uZVJhbmdlKCk7CiAgICAgIHJhbmdlLnNldFN0YXJ0QmVmb3JlKG5vZGUpOwogICAgICByZXR1cm4gcmFuZ2UudG9TdHJpbmcoKS5sZW5ndGg7CiAgICB9OwoKICAgIGZ1bmN0aW9uIGluc2VydE5vZGVBdEN1cnNvcih3aW5kb3csIG5vZGUpIHsKICAgICAgdmFyIHJhbmdlID0gc2VsZWN0aW9uUmFuZ2Uod2luZG93KTsKICAgICAgaWYgKCFyYW5nZSkgcmV0dXJuOwoKICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTsKICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShub2RlKTsKCiAgICAgIC8vIHdvcmsgYXJvdW5kIHdlaXJkbmVzcyB3aGVyZSBPcGVyYSB3aWxsIG1hZ2ljYWxseSBpbnNlcnQgYSBuZXcKICAgICAgLy8gQlIgbm9kZSB3aGVuIGEgQlIgbm9kZSBpbnNpZGUgYSBzcGFuIGlzIG1vdmVkIGFyb3VuZC4gbWFrZXMKICAgICAgLy8gc3VyZSB0aGUgQlIgZW5kcyB1cCBvdXRzaWRlIG9mIHNwYW5zLgogICAgICBpZiAod2luZG93Lm9wZXJhICYmIGlzQlIobm9kZSkgJiYgaXNTcGFuKG5vZGUucGFyZW50Tm9kZSkpIHsKICAgICAgICB2YXIgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmcsIHAgPSBub2RlLnBhcmVudE5vZGUsIG91dGVyID0gcC5wYXJlbnROb2RlOwogICAgICAgIG91dGVyLmluc2VydEJlZm9yZShub2RlLCBwLm5leHRTaWJsaW5nKTsKICAgICAgICB2YXIgdGV4dEFmdGVyID0gIiI7CiAgICAgICAgZm9yICg7IG5leHQgJiYgbmV4dC5ub2RlVHlwZSA9PSAzOyBuZXh0ID0gbmV4dC5uZXh0U2libGluZykgewogICAgICAgICAgdGV4dEFmdGVyICs9IG5leHQubm9kZVZhbHVlOwogICAgICAgICAgcmVtb3ZlRWxlbWVudChuZXh0KTsKICAgICAgICB9CiAgICAgICAgb3V0ZXIuaW5zZXJ0QmVmb3JlKG1ha2VQYXJ0U3Bhbih0ZXh0QWZ0ZXIsIHdpbmRvdy5kb2N1bWVudCksIG5vZGUubmV4dFNpYmxpbmcpOwogICAgICB9CiAgICAgIHJhbmdlID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgIHJhbmdlLnNlbGVjdE5vZGUobm9kZSk7CiAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTsKICAgICAgc2VsZWN0UmFuZ2UocmFuZ2UsIHdpbmRvdyk7CiAgICB9CgogICAgc2VsZWN0Lmluc2VydE5ld2xpbmVBdEN1cnNvciA9IGZ1bmN0aW9uKHdpbmRvdykgewogICAgICBpZiAod2Via2l0KQogICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRMaW5lQnJlYWsnKTsKICAgICAgZWxzZQogICAgICAgIGluc2VydE5vZGVBdEN1cnNvcih3aW5kb3csIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJCUiIpKTsKICAgIH07CgogICAgc2VsZWN0Lmluc2VydFRhYkF0Q3Vyc29yID0gZnVuY3Rpb24od2luZG93KSB7CiAgICAgIGluc2VydE5vZGVBdEN1cnNvcih3aW5kb3csIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShmb3VyU3BhY2VzKSk7CiAgICB9OwoKICAgIHNlbGVjdC5jdXJzb3JQb3MgPSBmdW5jdGlvbihjb250YWluZXIsIHN0YXJ0KSB7CiAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvblJhbmdlKHdpbmRvdyk7CiAgICAgIGlmICghcmFuZ2UpIHJldHVybjsKCiAgICAgIHZhciB0b3BOb2RlID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUoY29udGFpbmVyLCBzdGFydCk7CiAgICAgIHdoaWxlICh0b3BOb2RlICYmICFpc0JSKHRvcE5vZGUpKQogICAgICAgIHRvcE5vZGUgPSB0b3BOb2RlLnByZXZpb3VzU2libGluZzsKCiAgICAgIHJhbmdlID0gcmFuZ2UuY2xvbmVSYW5nZSgpOwogICAgICByYW5nZS5jb2xsYXBzZShzdGFydCk7CiAgICAgIGlmICh0b3BOb2RlKQogICAgICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIodG9wTm9kZSk7CiAgICAgIGVsc2UKICAgICAgICByYW5nZS5zZXRTdGFydEJlZm9yZShjb250YWluZXIpOwoKICAgICAgcmV0dXJuIHtub2RlOiB0b3BOb2RlLCBvZmZzZXQ6IHJhbmdlLnRvU3RyaW5nKCkubGVuZ3RofTsKICAgIH07CgogICAgc2VsZWN0LnNldEN1cnNvclBvcyA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgZnJvbSwgdG8pIHsKICAgICAgdmFyIHdpbiA9IGNvbnRhaW5lci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LAogICAgICAgICAgcmFuZ2UgPSB3aW4uZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKCiAgICAgIGZ1bmN0aW9uIHNldFBvaW50KG5vZGUsIG9mZnNldCwgc2lkZSkgewogICAgICAgIGlmIChvZmZzZXQgPT0gMCAmJiBub2RlICYmICFub2RlLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICByYW5nZVsic2V0IiArIHNpZGUgKyAiQWZ0ZXIiXShub2RlKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFub2RlKQogICAgICAgICAgbm9kZSA9IGNvbnRhaW5lci5maXJzdENoaWxkOwogICAgICAgIGVsc2UKICAgICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwoKICAgICAgICBpZiAoIW5vZGUpIHJldHVybjsKCiAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7CiAgICAgICAgICByYW5nZVsic2V0IiArIHNpZGUgKyAiQmVmb3JlIl0obm9kZSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHZhciBiYWNrbG9nID0gW10KICAgICAgICBmdW5jdGlvbiBkZWNvbXBvc2Uobm9kZSkgewogICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykKICAgICAgICAgICAgYmFja2xvZy5wdXNoKG5vZGUpOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBmb3JFYWNoKG5vZGUuY2hpbGROb2RlcywgZGVjb21wb3NlKTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgIHdoaWxlIChub2RlICYmICFiYWNrbG9nLmxlbmd0aCkgewogICAgICAgICAgICBkZWNvbXBvc2Uobm9kZSk7CiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGN1ciA9IGJhY2tsb2cuc2hpZnQoKTsKICAgICAgICAgIGlmICghY3VyKSByZXR1cm4gZmFsc2U7CgogICAgICAgICAgdmFyIGxlbmd0aCA9IGN1ci5ub2RlVmFsdWUubGVuZ3RoOwogICAgICAgICAgaWYgKGxlbmd0aCA+PSBvZmZzZXQpIHsKICAgICAgICAgICAgcmFuZ2VbInNldCIgKyBzaWRlXShjdXIsIG9mZnNldCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgb2Zmc2V0IC09IGxlbmd0aDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRvID0gdG8gfHwgZnJvbTsKICAgICAgaWYgKHNldFBvaW50KHRvLm5vZGUsIHRvLm9mZnNldCwgIkVuZCIpICYmIHNldFBvaW50KGZyb20ubm9kZSwgZnJvbS5vZmZzZXQsICJTdGFydCIpKQogICAgICAgIHNlbGVjdFJhbmdlKHJhbmdlLCB3aW4pOwogICAgfTsKICB9Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/stringstream.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogU3RyaW5nIHN0cmVhbXMgYXJlIHRoZSB0aGluZ3MgZmVkIHRvIHBhcnNlcnMgKHdoaWNoIGNhbiBmZWVkIHRoZW0KICogdG8gYSB0b2tlbml6ZXIgaWYgdGhleSB3YW50KS4gVGhleSBwcm92aWRlIHBlZWsgYW5kIG5leHQgbWV0aG9kcwogKiBmb3IgbG9va2luZyBhdCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgKG5leHQgJ2NvbnN1bWVzJyB0aGlzCiAqIGNoYXJhY3RlciwgcGVlayBkb2VzIG5vdCksIGFuZCBhIGdldCBtZXRob2QgZm9yIHJldHJpZXZpbmcgYWxsIHRoZQogKiB0ZXh0IHRoYXQgd2FzIGNvbnN1bWVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgZ2V0IHdhcyBjYWxsZWQuCiAqCiAqIEFuIGVhc3kgbWlzdGFrZSB0byBtYWtlIGlzIHRvIGxldCBhIFN0b3BJdGVyYXRpb24gZXhjZXB0aW9uIGZpbmlzaAogKiB0aGUgdG9rZW4gc3RyZWFtIHdoaWxlIHRoZXJlIGFyZSBzdGlsbCBjaGFyYWN0ZXJzIHBlbmRpbmcgaW4gdGhlCiAqIHN0cmluZyBzdHJlYW0gKGhpdHRpbmcgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdoaWxlIHBhcnNpbmcgYQogKiB0b2tlbikuIFRvIG1ha2UgaXQgZWFzaWVyIHRvIGRldGVjdCBzdWNoIGVycm9ycywgdGhlIHN0cmluZ3N0cmVhbXMKICogdGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gdGhpcyBoYXBwZW5zLgogKi8KCi8vIE1ha2UgYSBzdHJpbmdzdHJlYW0gc3RyZWFtIG91dCBvZiBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgc3RyaW5ncy4KLy8gVGhpcyBpcyBhcHBsaWVkIHRvIHRoZSByZXN1bHQgb2YgdHJhdmVyc2VET00gKHNlZSBjb2RlbWlycm9yLmpzKSwKLy8gYW5kIHRoZSByZXN1bHRpbmcgc3RyZWFtIGlzIGZlZCB0byB0aGUgcGFyc2VyLgp2YXIgc3RyaW5nU3RyZWFtID0gZnVuY3Rpb24oc291cmNlKXsKICAvLyBTdHJpbmcgdGhhdCdzIGN1cnJlbnRseSBiZWluZyBpdGVyYXRlZCBvdmVyLgogIHZhciBjdXJyZW50ID0gIiI7CiAgLy8gUG9zaXRpb24gaW4gdGhhdCBzdHJpbmcuCiAgdmFyIHBvcyA9IDA7CiAgLy8gQWNjdW11bGF0b3IgZm9yIHN0cmluZ3MgdGhhdCBoYXZlIGJlZW4gaXRlcmF0ZWQgb3ZlciBidXQgbm90CiAgLy8gZ2V0KCktZWQgeWV0LgogIHZhciBhY2N1bSA9ICIiOwogIC8vIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbW9yZSBjaGFyYWN0ZXJzIHJlYWR5LCBvciB0aHJvdwogIC8vIFN0b3BJdGVyYXRpb24uCiAgZnVuY3Rpb24gZW5zdXJlQ2hhcnMoKSB7CiAgICB3aGlsZSAocG9zID09IGN1cnJlbnQubGVuZ3RoKSB7CiAgICAgIGFjY3VtICs9IGN1cnJlbnQ7CiAgICAgIGN1cnJlbnQgPSAiIjsgLy8gSW4gY2FzZSBzb3VyY2UubmV4dCgpIHRocm93cwogICAgICBwb3MgPSAwOwogICAgICB0cnkge2N1cnJlbnQgPSBzb3VyY2UubmV4dCgpO30KICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICBpZiAoZSAhPSBTdG9wSXRlcmF0aW9uKSB0aHJvdyBlOwogICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHJldHVybiB7CiAgICAvLyBSZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSBzdHJlYW0uCiAgICBwZWVrOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCFlbnN1cmVDaGFycygpKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuIGN1cnJlbnQuY2hhckF0KHBvcyk7CiAgICB9LAogICAgLy8gR2V0IHRoZSBuZXh0IGNoYXJhY3RlciwgdGhyb3cgU3RvcEl0ZXJhdGlvbiBpZiBhdCBlbmQsIGNoZWNrCiAgICAvLyBmb3IgdW51c2VkIGNvbnRlbnQuCiAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCFlbnN1cmVDaGFycygpKSB7CiAgICAgICAgaWYgKGFjY3VtLmxlbmd0aCA+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[LyogVG9rZW5pemVyIGZvciBKYXZhU2NyaXB0IGNvZGUgKi8KCnZhciB0b2tlbml6ZUphdmFTY3JpcHQgPSAoZnVuY3Rpb24oKSB7CiAgLy8gQWR2YW5jZSB0aGUgc3RyZWFtIHVudGlsIHRoZSBnaXZlbiBjaGFyYWN0ZXIgKG5vdCBwcmVjZWRlZCBieSBhCiAgLy8gYmFja3NsYXNoKSBpcyBlbmNvdW50ZXJlZCwgb3IgdGhlIGVuZCBvZiB0aGUgbGluZSBpcyByZWFjaGVkLgogIGZ1bmN0aW9uIG5leHRVbnRpbFVuZXNjYXBlZChzb3VyY2UsIGVuZCkgewogICAgdmFyIGVzY2FwZWQgPSBmYWxzZTsKICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgIHZhciBuZXh0ID0gc291cmNlLm5leHQoKTsKICAgICAgaWYgKG5leHQgPT0gZW5kICYmICFlc2NhcGVkKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgIH0KICAgIHJldHVybiBlc2NhcGVkOwogIH0KCiAgLy8gQSBtYXAgb2YgSmF2YVNjcmlwdCdzIGtleXdvcmRzLiBUaGUgYS9iL2Mga2V5d29yZCBkaXN0aW5jdGlvbiBpcwogIC8vIHZlcnkgcm91Z2gsIGJ1dCBpdCBnaXZlcyB0aGUgcGFyc2VyIGVub3VnaCBpbmZvcm1hdGlvbiB0byBwYXJzZQogIC8vIGNvcnJlY3QgY29kZSBjb3JyZWN0bHkgKHdlIGRvbid0IGNhcmUgdGhhdCBtdWNoIGhvdyB3ZSBwYXJzZQogIC8vIGluY29ycmVjdCBjb2RlKS4gVGhlIHN0eWxlIGluZm9ybWF0aW9uIGluY2x1ZGVkIGluIHRoZXNlIG9iamVjdHMKICAvLyBpcyB1c2VkIGJ5IHRoZSBoaWdobGlnaHRlciB0byBwaWNrIHRoZSBjb3JyZWN0IENTUyBzdHlsZSBmb3IgYQogIC8vIHRva2VuLgogIHZhciBrZXl3b3JkcyA9IGZ1bmN0aW9uKCl7CiAgICBmdW5jdGlvbiByZXN1bHQodHlwZSwgc3R5bGUpewogICAgICByZXR1cm4ge3R5cGU6IHR5cGUsIHN0eWxlOiAianMtIiArIHN0eWxlfTsKICAgIH0KICAgIC8vIGtleXdvcmRzIHRoYXQgdGFrZSBhIHBhcmVudGhpc2VkIGV4cHJlc3Npb24sIGFuZCB0aGVuIGEKICAgIC8vIHN0YXRlbWVudCAoaWYpCiAgICB2YXIga2V5d29yZEEgPSByZXN1bHQoImtleXdvcmQgYSIsICJrZXl3b3JkIik7CiAgICAvLyBrZXl3b3JkcyB0aGF0IHRha2UganVzdCBhIHN0YXRlbWVudCAoZWxzZSkKICAgIHZhciBrZXl3b3JkQiA9IHJlc3VsdCgia2V5d29yZCBiIiwgImtleXdvcmQiKTsKICAgIC8vIGtleXdvcmRzIHRoYXQgb3B0aW9uYWxseSB0YWtlIGFuIGV4cHJlc3Npb24sIGFuZCBmb3JtIGEKICAgIC8vIHN0YXRlbWVudCAocmV0dXJuKQogICAgdmFyIGtleXdvcmRDID0gcmVzdWx0KCJrZXl3b3JkIGMiLCAia2V5d29yZCIpOwogICAgdmFyIG9wZXJhdG9yID0gcmVzdWx0KCJvcGVyYXRvciIsICJrZXl3b3JkIik7CiAgICB2YXIgYXRvbSA9IHJlc3VsdCgiYXRvbSIsICJhdG9tIik7CiAgICByZXR1cm4gewogICAgICAiaWYiOiBrZXl3b3JkQSwgIndoaWxlIjoga2V5d29yZEEsICJ3aXRoIjoga2V5d29yZEEsCiAgICAgICJlbHNlIjoga2V5d29yZEIsICJkbyI6IGtleXdvcmRCLCAidHJ5Ijoga2V5d29yZEIsICJmaW5hbGx5Ijoga2V5d29yZEIsCiAgICAgICJyZXR1cm4iOiBrZXl3b3JkQywgImJyZWFrIjoga2V5d29yZEMsICJjb250aW51ZSI6IGtleXdvcmRDLCAibmV3Ijoga2V5d29yZEMsICJkZWxldGUiOiBrZXl3b3JkQywgInRocm93Ijoga2V5d29yZEMsCiAgICAgICJpbiI6IG9wZXJhdG9yLCAidHlwZW9mIjogb3BlcmF0b3IsICJpbnN0YW5jZW9mIjogb3BlcmF0b3IsCiAgICAgICJ2YXIiOiByZXN1bHQoInZhciIsICJrZXl3b3JkIiksICJmdW5jdGlvbiI6IHJlc3VsdCgiZnVuY3Rpb24iLCAia2V5d29yZCIpLCAiY2F0Y2giOiByZXN1bHQoImNhdGNoIiwgImtleXdvcmQiKSwKICAgICAgImZvciI6IHJlc3VsdCgiZm9yIiwgImtleXdvcmQiKSwgInN3aXRjaCI6IHJlc3VsdCgic3dpdGNoIiwgImtleXdvcmQiKSwKICAgICAgImNhc2UiOiByZXN1bHQoImNhc2UiLCAia2V5d29yZCIpLCAiZGVmYXVsdCI6IHJlc3VsdCgiZGVmYXVsdCIsICJrZXl3b3JkIiksCiAgICAgICJ0cnVlIjogYXRvbSwgImZhbHNlIjogYXRvbSwgIm51bGwiOiBhdG9tLCAidW5kZWZpbmVkIjogYXRvbSwgIk5hTiI6IGF0b20sICJJbmZpbml0eSI6IGF0b20KICAgIH07CiAgfSgpOwoKICAvLyBTb21lIGhlbHBlciByZWdleHBzCiAgdmFyIGlzT3BlcmF0b3JDaGFyID0gL1srXC0qJiU9PD4hP3xdLzsKICB2YXIgaXNIZXhEaWdpdCA9IC9bMC05QS1GYS1mXS87CiAgdmFyIGlzV29yZENoYXIgPSAvW1x3XCRfXS87CgogIC8vIFdyYXBwZXIgYXJvdW5kIGpzVG9rZW4gdGhhdCBoZWxwcyBtYWludGFpbiBwYXJzZXIgc3RhdGUgKHdoZXRoZXIKICAvLyB3ZSBhcmUgaW5zaWRlIG9mIGEgbXVsdGktbGluZSBjb21tZW50IGFuZCB3aGV0aGVyIHRoZSBuZXh0IHRva2VuCiAgLy8gY291bGQgYmUgYSByZWd1bGFyIGV4cHJlc3Npb24pLgogIGZ1bmN0aW9uIGpzVG9rZW5TdGF0ZShpbnNpZGUsIHJlZ2V4cCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgdmFyIG5ld0luc2lkZSA9IGluc2lkZTsKICAgICAgdmFyIHR5cGUgPSBqc1Rva2VuKGluc2lkZSwgcmVnZXhwLCBzb3VyY2UsIGZ1bmN0aW9uKGMpIHtuZXdJbnNpZGUgPSBjO30pOwogICAgICB2YXIgbmV3UmVnZXhwID0gdHlwZS50eXBlID09ICJvcGVyYXRvciIgfHwgdHlwZS50eXBlID09ICJrZXl3b3JkIGMiIHx8IHR5cGUudHlwZS5tYXRjaCgvXltcW3t9XCgsOzpdJC8pOwogICAgICBpZiAobmV3UmVnZXhwICE9IHJlZ2V4cCB8fCBuZXdJbnNpZGUgIT0gaW5zaWRlKQogICAgICAgIHNldFN0YXRlKGpzVG9rZW5TdGF0ZShuZXdJbnNpZGUsIG5ld1JlZ2V4cCkpOwogICAgICByZXR1cm4gdHlwZTsKICAgIH07CiAgfQoKICAvLyBUaGUgdG9rZW4gcmVhZGVyLCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHRoZSB0b2tlbml6ZXIgZnJvbQogIC8vIHRva2VuaXplLmpzICh0aHJvdWdoIGpzVG9rZW5TdGF0ZSkuIEFkdmFuY2VzIHRoZSBzb3VyY2Ugc3RyZWFtCiAgLy8gb3ZlciBhIHRva2VuLCBhbmQgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgdHlwZSBhbmQgc3R5bGUKICAvLyBvZiB0aGF0IHRva2VuLgogIGZ1bmN0aW9uIGpzVG9rZW4oaW5zaWRlLCByZWdleHAsIHNvdXJjZSwgc2V0SW5zaWRlKSB7CiAgICBmdW5jdGlvbiByZWFkSGV4TnVtYmVyKCl7CiAgICAgIHNvdXJjZS5uZXh0KCk7IC8vIHNraXAgdGhlICd4JwogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc0hleERpZ2l0KTsKICAgICAgcmV0dXJuIHt0eXBlOiAibnVtYmVyIiwgc3R5bGU6ICJqcy1hdG9tIn07CiAgICB9CgogICAgZnVuY3Rpb24gcmVhZE51bWJlcigpIHsKICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swLTldLyk7CiAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCIuIikpewogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swLTldLyk7CiAgICAgIH0KICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoImUiKSB8fCBzb3VyY2UuZXF1YWxzKCJFIikpewogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoIi0iKSkKICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swLTldLyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHt0eXBlOiAibnVtYmVyIiwgc3R5bGU6ICJqcy1hdG9tIn07CiAgICB9CiAgICAvLyBSZWFkIGEgd29yZCwgbG9vayBpdCB1cCBpbiBrZXl3b3Jkcy4gSWYgbm90IGZvdW5kLCBpdCBpcyBhCiAgICAvLyB2YXJpYWJsZSwgb3RoZXJ3aXNlIGl0IGlzIGEga2V5d29yZCBvZiB0aGUgdHlwZSBmb3VuZC4KICAgIGZ1bmN0aW9uIHJlYWRXb3JkKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc1dvcmRDaGFyKTsKICAgICAgdmFyIHdvcmQgPSBzb3VyY2UuZ2V0KCk7CiAgICAgIHZhciBrbm93biA9IGtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpICYmIGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpICYmIGtleXdvcmRzW3dvcmRdOwogICAgICByZXR1cm4ga25vd24gPyB7dHlwZToga25vd24udHlwZSwgc3R5bGU6IGtub3duLnN0eWxlLCBjb250ZW50OiB3b3JkfSA6CiAgICAgIHt0eXBlOiAidmFyaWFibGUiLCBzdHlsZTogImpzLXZhcmlhYmxlIiwgY29udGVudDogd29yZH07CiAgICB9CiAgICBmdW5jdGlvbiByZWFkUmVnZXhwKCkgewogICAgICBuZXh0VW50aWxVbmVzY2FwZWQoc291cmNlLCAiLyIpOwogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW2dpXS8pOwogICAgICByZXR1cm4ge3R5cGU6ICJyZWdleHAiLCBzdHlsZTogImpzLXN0cmluZyJ9OwogICAgfQogICAgLy8gTXV0bGktbGluZSBjb21tZW50cyBhcmUgdHJpY2t5LiBXZSB3YW50IHRvIHJldHVybiB0aGUgbmV3bGluZXMKICAgIC8vIGVtYmVkZGVkIGluIHRoZW0gYXMgcmVndWxhciBuZXdsaW5lIHRva2VucywgYW5kIHRoZW4gY29udGludWUKICAgIC8vIHJldHVybmluZyBhIGNvbW1lbnQgdG9rZW4gZm9yIGV2ZXJ5IGxpbmUgb2YgdGhlIGNvbW1lbnQuIFNvCiAgICAvLyBzb21lIHN0YXRlIGhhcyB0byBiZSBzYXZlZCAoaW5zaWRlKSB0byBpbmRpY2F0ZSB3aGV0aGVyIHdlIGFyZQogICAgLy8gaW5zaWRlIGEgLyogKi8gc2VxdWVuY2UuCiAgICBmdW5jdGlvbiByZWFkTXVsdGlsaW5lQ29tbWVudChzdGFydCl7CiAgICAgIHZhciBuZXdJbnNpZGUgPSAiLyoiOwogICAgICB2YXIgbWF5YmVFbmQgPSAoc3RhcnQgPT0gIioiKTsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBpZiAoc291cmNlLmVuZE9mTGluZSgpKQogICAgICAgICAgYnJlYWs7CiAgICAgICAgdmFyIG5leHQgPSBzb3VyY2UubmV4dCgpOwogICAgICAgIGlmIChuZXh0ID09ICIvIiAmJiBtYXliZUVuZCl7CiAgICAgICAgICBuZXdJbnNpZGUgPSBudWxsOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIG1heWJlRW5kID0gKG5leHQgPT0gIioiKTsKICAgICAgfQogICAgICBzZXRJbnNpZGUobmV3SW5zaWRlKTsKICAgICAgcmV0dXJuIHt0eXBlOiAiY29tbWVudCIsIHN0eWxlOiAianMtY29tbWVudCJ9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZE9wZXJhdG9yKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc09wZXJhdG9yQ2hhcik7CiAgICAgIHJldHVybiB7dHlwZTogIm9wZXJhdG9yIiwgc3R5bGU6ICJqcy1vcGVyYXRvciJ9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZFN0cmluZyhxdW90ZSkgewogICAgICB2YXIgZW5kQmFja1NsYXNoID0gbmV4dFVudGlsVW5lc2NhcGVkKHNvdXJjZSwgcXVvdGUpOwogICAgICBzZXRJbnNpZGUoZW5kQmFja1NsYXNoID8gcXVvdGUgOiBudWxsKTsKICAgICAgcmV0dXJuIHt0eXBlOiAic3RyaW5nIiwgc3R5bGU6ICJqcy1zdHJpbmcifTsKICAgIH0KCiAgICAvLyBGZXRjaCB0aGUgbmV4dCB0b2tlbi4gRGlzcGF0Y2hlcyBvbiBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlCiAgICAvLyBzdHJlYW0sIG9yIGZpcnN0IHR3byBjaGFyYWN0ZXJzIHdoZW4gdGhlIGZpcnN0IGlzIGEgc2xhc2guCiAgICBpZiAoaW5zaWRlID09ICJcIiIgfHwgaW5zaWRlID09ICInIikKICAgICAgcmV0dXJuIHJlYWRTdHJpbmcoaW5zaWRlKTsKICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICBpZiAoaW5zaWRlID09ICIvKiIpCiAgICAgIHJldHVybiByZWFkTXVsdGlsaW5lQ29tbWVudChjaCk7CiAgICBlbHNlIGlmIChjaCA9PSAiXCIiIHx8IGNoID09ICInIikKICAgICAgcmV0dXJuIHJlYWRTdHJpbmcoY2gpOwogICAgLy8gd2l0aCBwdW5jdHVhdGlvbiwgdGhlIHR5cGUgb2YgdGhlIHRva2VuIGlzIHRoZSBzeW1ib2wgaXRzZWxmCiAgICBlbHNlIGlmICgvW1xbXF17fVwoXCksO1w6XC5dLy50ZXN0KGNoKSkKICAgICAgcmV0dXJuIHt0eXBlOiBjaCwgc3R5bGU6ICJqcy1wdW5jdHVhdGlvbiJ9OwogICAgZWxzZSBpZiAoY2ggPT0gIjAiICYmIChzb3VyY2UuZXF1YWxzKCJ4IikgfHwgc291cmNlLmVxdWFscygiWCIpKSkKICAgICAgcmV0dXJuIHJlYWRIZXhOdW1iZXIoKTsKICAgIGVsc2UgaWYgKC9bMC05XS8udGVzdChjaCkpCiAgICAgIHJldHVybiByZWFkTnVtYmVyKCk7CiAgICBlbHNlIGlmIChjaCA9PSAiLyIpewogICAgICBpZiAoc291cmNlLmVxdWFscygiKiIpKQogICAgICB7IHNvdXJjZS5uZXh0KCk7IHJldHVybiByZWFkTXVsdGlsaW5lQ29tbWVudChjaCk7IH0KICAgICAgZWxzZSBpZiAoc291cmNlLmVxdWFscygiLyIpKQogICAgICB7IG5leHRVbnRpbFVuZXNjYXBlZChzb3VyY2UsIG51bGwpOyByZXR1cm4ge3R5cGU6ICJjb21tZW50Iiwgc3R5bGU6ICJqcy1jb21tZW50In07fQogICAgICBlbHNlIGlmIChyZWdleHApCiAgICAgICAgcmV0dXJuIHJlYWRSZWdleHAoKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiByZWFkT3BlcmF0b3IoKTsKICAgIH0KICAgIGVsc2UgaWYgKGlzT3BlcmF0b3JDaGFyLnRlc3QoY2gpKQogICAgICByZXR1cm4gcmVhZE9wZXJhdG9yKCk7CiAgICBlbHNlCiAgICAgIHJldHVybiByZWFkV29yZCgpOwogIH0KCiAgLy8gVGhlIGV4dGVybmFsIGludGVyZmFjZSB0byB0aGUgdG9rZW5pemVyLgogIHJldHVybiBmdW5jdGlvbihzb3VyY2UsIHN0YXJ0U3RhdGUpIHsKICAgIHJldHVybiB0b2tlbml6ZXIoc291cmNlLCBzdGFydFN0YXRlIHx8IGpzVG9rZW5TdGF0ZShmYWxzZSwgdHJ1ZSkpOwogIH07Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/undo.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFN0b3JhZ2UgYW5kIGNvbnRyb2wgZm9yIHVuZG8gaW5mb3JtYXRpb24gd2l0aGluIGEgQ29kZU1pcnJvcgogKiBlZGl0b3IuICdXaHkgb24gZWFydGggaXMgc3VjaCBhIGNvbXBsaWNhdGVkIG1lc3MgcmVxdWlyZWQgZm9yCiAqIHRoYXQ/JywgSSBoZWFyIHlvdSBhc2suIFRoZSBnb2FsLCBpbiBpbXBsZW1lbnRpbmcgdGhpcywgd2FzIHRvIG1ha2UKICogdGhlIGNvbXBsZXhpdHkgb2Ygc3RvcmluZyBhbmQgcmV2ZXJ0aW5nIHVuZG8gaW5mb3JtYXRpb24gZGVwZW5kCiAqIG9ubHkgb24gdGhlIHNpemUgb2YgdGhlIGVkaXRlZCBvciByZXN0b3JlZCBjb250ZW50LCBub3Qgb24gdGhlIHNpemUKICogb2YgdGhlIHdob2xlIGRvY3VtZW50LiBUaGlzIG1ha2VzIGl0IG5lY2Vzc2FyeSB0byB1c2UgYSBraW5kIG9mCiAqICdkaWZmJyBzeXN0ZW0sIHdoaWNoLCB3aGVuIGFwcGxpZWQgdG8gYSBET00gdHJlZSwgY2F1c2VzIHNvbWUKICogY29tcGxleGl0eSBhbmQgaGFja2VyeS4KICoKICogSW4gc2hvcnQsIHRoZSBlZGl0b3IgJ3RvdWNoZXMnIEJSIGVsZW1lbnRzIGFzIGl0IHBhcnNlcyB0aGVtLCBhbmQKICogdGhlIFVuZG9IaXN0b3J5IHN0b3JlcyB0aGVzZS4gV2hlbiBub3RoaW5nIGlzIHRvdWNoZWQgaW4gY29tbWl0RGVsYXkKICogbWlsbGlzZWNvbmRzLCB0aGUgY2hhbmdlcyBhcmUgY29tbWl0dGVkOiBJdCBnb2VzIG92ZXIgYWxsIHRvdWNoZWQKICogbm9kZXMsIHRocm93cyBvdXQgdGhlIG9uZXMgdGhhdCBkaWQgbm90IGNoYW5nZSBzaW5jZSBsYXN0IGNvbW1pdCBvcgogKiBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCwgYW5kIGFzc2VtYmxlcyB0aGUgcmVzdCBpbnRvIHplcm8gb3IKICogbW9yZSAnY2hhaW5zJyAtLSBhcnJheXMgb2YgYWRqYWNlbnQgbGluZXMuIExpbmtzIGJhY2sgdG8gdGhlc2UKICogY2hhaW5zIGFyZSBhZGRlZCB0byB0aGUgQlIgbm9kZXMsIHdoaWxlIHRoZSBjaGFpbiB0aGF0IHByZXZpb3VzbHkKICogc3Bhbm5lZCB0aGVzZSBub2RlcyBpcyBhZGRlZCB0byB0aGUgdW5kbyBoaXN0b3J5LiBVbmRvaW5nIGEgY2hhbmdlCiAqIG1lYW5zIHRha2luZyBzdWNoIGEgY2hhaW4gb2ZmIHRoZSB1bmRvIGhpc3RvcnksIHJlc3RvcmluZyBpdHMKICogY29udGVudCAodGV4dCBpcyBzYXZlZCBwZXIgbGluZSkgYW5kIGxpbmtpbmcgaXQgYmFjayBpbnRvIHRoZQogKiBkb2N1bWVudC4KICovCgovLyBBIGhpc3Rvcnkgb2JqZWN0IG5lZWRzIHRvIGtub3cgYWJvdXQgdGhlIERPTSBjb250YWluZXIgaG9sZGluZyB0aGUKLy8gZG9jdW1lbnQsIHRoZSBtYXhpbXVtIGFtb3VudCBvZiB1bmRvIGxldmVscyBpdCBzaG91bGQgc3RvcmUsIHRoZQovLyBkZWxheSAob2Ygbm8gaW5wdXQpIGFmdGVyIHdoaWNoIGl0IGNvbW1pdHMgYSBzZXQgb2YgY2hhbmdlcywgYW5kLAovLyB1bmZvcnR1bmF0ZWx5LCB0aGUgJ3BhcmVudCcgd2luZG93IC0tIGEgd2luZG93IHRoYXQgaXMgbm90IGluCi8vIGRlc2lnbk1vZGUsIGFuZCBvbiB3aGljaCBzZXRUaW1lb3V0IHdvcmtzIGluIGV2ZXJ5IGJyb3dzZXIuCmZ1bmN0aW9uIFVuZG9IaXN0b3J5KGNvbnRhaW5lciwgbWF4RGVwdGgsIGNvbW1pdERlbGF5LCBlZGl0b3IpIHsKICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKICB0aGlzLm1heERlcHRoID0gbWF4RGVwdGg7IHRoaXMuY29tbWl0RGVsYXkgPSBjb21taXREZWxheTsKICB0aGlzLmVkaXRvciA9IGVkaXRvcjsgdGhpcy5wYXJlbnQgPSBlZGl0b3IucGFyZW50OwogIC8vIFRoaXMgbGluZSBvYmplY3QgcmVwcmVzZW50cyB0aGUgaW5pdGlhbCwgZW1wdHkgZWRpdG9yLgogIHZhciBpbml0aWFsID0ge3RleHQ6ICIiLCBmcm9tOiBudWxsLCB0bzogbnVsbH07CiAgLy8gQXMgdGhlIGJvcmRlcnMgYmV0d2VlbiBsaW5lcyBhcmUgcmVwcmVzZW50ZWQgYnkgQlIgZWxlbWVudHMsIHRoZQogIC8vIHN0YXJ0IG9mIHRoZSBmaXJzdCBsaW5lIGFuZCB0aGUgZW5kIG9mIHRoZSBsYXN0IG9uZSBhcmUKICAvLyByZXByZXNlbnRlZCBieSBudWxsLiBTaW5jZSB5b3UgY2FuIG5vdCBzdG9yZSBhbnkgcHJvcGVydGllcwogIC8vIChsaW5rcyB0byBsaW5lIG9iamVjdHMpIGluIG51bGwsIHRoZXNlIHByb3BlcnRpZXMgYXJlIHVzZWQgaW4KICAvLyB0aG9zZSBjYXNlcy4KICB0aGlzLmZpcnN0ID0gaW5pdGlhbDsgdGhpcy5sYXN0ID0gaW5pdGlhbDsKICAvLyBTaW1pbGFybHksIGEgJ2hpc3RvcnlUb3VjaGVkJyBwcm9wZXJ0eSBpcyBhZGRlZCB0byB0aGUgQlIgaW4KICAvLyBmcm9udCBvZiBsaW5lcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHRvdWNoZWQsIGFuZCAnZmlyc3RUb3VjaGVkJwogIC8vIGlzIHVzZWQgZm9yIHRoZSBmaXJzdCBsaW5lLgogIHRoaXMuZmlyc3RUb3VjaGVkID0gZmFsc2U7CiAgLy8gSGlzdG9yeSBpcyB0aGUgc2V0IG9mIGNvbW1pdHRlZCBjaGFuZ2VzLCB0b3VjaGVkIGlzIHRoZSBzZXQgb2YKICAvLyBub2RlcyB0b3VjaGVkIHNpbmNlIHRoZSBsYXN0IGNvbW1pdC4KICB0aGlzLmhpc3RvcnkgPSBbXTsgdGhpcy5yZWRvSGlzdG9yeSA9IFtdOyB0aGlzLnRvdWNoZWQgPSBbXTsKfQoKVW5kb0hpc3RvcnkucHJvdG90eXBlID0gewogIC8vIFNjaGVkdWxlIGEgY29tbWl0IChpZiBubyBvdGhlciB0b3VjaGVzIGNvbWUgaW4gZm9yIGNvbW1pdERlbGF5CiAgLy8gbWlsbGlzZWNvbmRzKS4KICBzY2hlZHVsZUNvbW1pdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB0aGlzLnBhcmVudC5jbGVhclRpbWVvdXQodGhpcy5jb21taXRUaW1lb3V0KTsKICAgIHRoaXMuY29tbWl0VGltZW91dCA9IHRoaXMucGFyZW50LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtzZWxmLnRyeUNvbW1pdCgpO30sIHRoaXMuY29tbWl0RGVsYXkpOwogIH0sCgogIC8vIE1hcmsgYSBub2RlIGFzIHRvdWNoZWQuIE51bGwgaXMgYSB2YWxpZCBhcmd1bWVudC4KICB0b3VjaDogZnVuY3Rpb24obm9kZSkgewogICAgdGhpcy5zZXRUb3VjaGVkKG5vZGUpOwogICAgdGhpcy5zY2hlZHVsZUNvbW1pdCgpOwogIH0sCgogIC8vIFVuZG8gdGhlIGxhc3QgY2hhbmdlLgogIHVuZG86IGZ1bmN0aW9uKCkgewogICAgLy8gTWFrZSBzdXJlIHBlbmRpbmcgY2hhbmdlcyBoYXZlIGJlZW4gY29tbWl0dGVkLgogICAgdGhpcy5jb21taXQoKTsKCiAgICBpZiAodGhpcy5oaXN0b3J5Lmxlbmd0aCkgewogICAgICAvLyBUYWtlIHRoZSB0b3AgZGlmZiBmcm9tIHRoZSBoaXN0b3J5LCBhcHBseSBpdCwgYW5kIHN0b3JlIGl0cwogICAgICAvLyBzaGFkb3cgaW4gdGhlIHJlZG8gaGlzdG9yeS4KICAgICAgdmFyIGl0ZW0gPSB0aGlzLmhpc3RvcnkucG9wKCk7CiAgICAgIHRoaXMucmVkb0hpc3RvcnkucHVzaCh0aGlzLnVwZGF0ZVRvKGl0ZW0sICJhcHBseUNoYWluIikpOwogICAgICB0aGlzLm5vdGlmeUVudmlyb25tZW50KCk7CiAgICAgIHJldHVybiB0aGlzLmNoYWluTm9kZShpdGVtKTsKICAgIH0KICB9LAoKICAvLyBSZWRvIHRoZSBsYXN0IHVuZG9uZSBjaGFuZ2UuCiAgcmVkbzogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmNvbW1pdCgpOwogICAgaWYgKHRoaXMucmVkb0hpc3RvcnkubGVuZ3RoKSB7CiAgICAgIC8vIFRoZSBpbnZlcnNlIG9mIHVuZG8sIGJhc2ljYWxseS4KICAgICAgdmFyIGl0ZW0gPSB0aGlzLnJlZG9IaXN0b3J5LnBvcCgpOwogICAgICB0aGlzLmFkZFVuZG9MZXZlbCh0aGlzLnVwZGF0ZVRvKGl0ZW0sICJhcHBseUNoYWluIikpOwogICAgICB0aGlzLm5vdGlmeUVudmlyb25tZW50KCk7CiAgICAgIHJldHVybiB0aGlzLmNoYWluTm9kZShpdGVtKTsKICAgIH0KICB9LAoKICBjbGVhcjogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmhpc3RvcnkgPSBbXTsKICAgIHRoaXMucmVkb0hpc3RvcnkgPSBbXTsKICB9LAoKICAvLyBBc2sgZm9yIHRoZSBzaXplIG9mIHRoZSB1bi9yZWRvIGhpc3Rvcmllcy4KICBoaXN0b3J5U2l6ZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4ge3VuZG86IHRoaXMuaGlzdG9yeS5sZW5ndGgsIHJlZG86IHRoaXMucmVkb0hpc3RvcnkubGVuZ3RofTsKICB9LAoKICAvLyBQdXNoIGEgY2hhbmdlc2V0IGludG8gdGhlIGRvY3VtZW50LgogIHB1c2g6IGZ1bmN0aW9uKGZyb20sIHRvLCBsaW5lcykgewogICAgdmFyIGNoYWluID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBlbmQgPSAoaSA9PSBsaW5lcy5sZW5ndGggLSAxKSA/IHRvIDogdGhpcy5jb250YWluZXIub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJCUiIpOwogICAgICBjaGFpbi5wdXNoKHtmcm9tOiBmcm9tLCB0bzogZW5kLCB0ZXh0OiBjbGVhblRleHQobGluZXNbaV0pfSk7CiAgICAgIGZyb20gPSBlbmQ7CiAgICB9CiAgICB0aGlzLnB1c2hDaGFpbnMoW2NoYWluXSwgZnJvbSA9PSBudWxsICYmIHRvID09IG51bGwpOwogICAgdGhpcy5ub3RpZnlFbnZpcm9ubWVudCgpOwogIH0sCgogIHB1c2hDaGFpbnM6IGZ1bmN0aW9uKGNoYWlucywgZG9Ob3RIaWdobGlnaHQpIHsKICAgIHRoaXMuY29tbWl0KGRvTm90SGlnaGxpZ2h0KTsKICAgIHRoaXMuYWRkVW5kb0xldmVsKHRoaXMudXBkYXRlVG8oY2hhaW5zLCAiYXBwbHlDaGFpbiIpKTsKICAgIHRoaXMucmVkb0hpc3RvcnkgPSBbXTsKICB9LAoKICAvLyBSZXRyaWV2ZSBhIERPTSBub2RlIGZyb20gYSBjaGFpbiAoZm9yIHNjcm9sbGluZyB0byBpdCBhZnRlciB1bmRvL3JlZG8pLgogIGNoYWluTm9kZTogZnVuY3Rpb24oY2hhaW5zKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYWlucy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgc3RhcnQgPSBjaGFpbnNbaV1bMF0sIG5vZGUgPSBzdGFydCAmJiAoc3RhcnQuZnJvbSB8fCBzdGFydC50byk7CiAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZTsKICAgIH0KICB9LAoKICAvLyBDbGVhciB0aGUgdW5kbyBoaXN0b3J5LCBtYWtlIHRoZSBjdXJyZW50IGRvY3VtZW50IHRoZSBzdGFydAogIC8vIHBvc2l0aW9uLgogIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuaGlzdG9yeSA9IFtdOyB0aGlzLnJlZG9IaXN0b3J5ID0gW107CiAgfSwKCiAgdGV4dEFmdGVyOiBmdW5jdGlvbihicikgewogICAgcmV0dXJuIHRoaXMuYWZ0ZXIoYnIpLnRleHQ7CiAgfSwKCiAgbm9kZUFmdGVyOiBmdW5jdGlvbihicikgewogICAgcmV0dXJuIHRoaXMuYWZ0ZXIoYnIpLnRvOwogIH0sCgogIG5vZGVCZWZvcmU6IGZ1bmN0aW9uKGJyKSB7CiAgICByZXR1cm4gdGhpcy5iZWZvcmUoYnIpLmZyb207CiAgfSwKCiAgLy8gQ29tbWl0IHVubGVzcyB0aGVyZSBhcmUgcGVuZGluZyBkaXJ0eSBub2Rlcy4KICB0cnlDb21taXQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKCF3aW5kb3cuVW5kb0hpc3RvcnkpIHJldHVybjsgLy8gU3RvcCB3aGVuIGZyYW1lIGhhcyBiZWVuIHVubG9hZGVkCiAgICBpZiAodGhpcy5lZGl0b3IuaGlnaGxpZ2h0RGlydHkoKSkgdGhpcy5jb21taXQodHJ1ZSk7CiAgICBlbHNlIHRoaXMuc2NoZWR1bGVDb21taXQoKTsKICB9LAoKICAvLyBDaGVjayB3aGV0aGVyIHRoZSB0b3VjaGVkIG5vZGVzIGhvbGQgYW55IGNoYW5nZXMsIGlmIHNvLCBjb21taXQKICAvLyB0aGVtLgogIGNvbW1pdDogZnVuY3Rpb24oZG9Ob3RIaWdobGlnaHQpIHsKICAgIHRoaXMucGFyZW50LmNsZWFyVGltZW91dCh0aGlzLmNvbW1pdFRpbWVvdXQpOwogICAgLy8gTWFrZSBzdXJlIHRoZXJlIGFyZSBubyBwZW5kaW5nIGRpcnR5IG5vZGVzLgogICAgaWYgKCFkb05vdEhpZ2hsaWdodCkgdGhpcy5lZGl0b3IuaGlnaGxpZ2h0RGlydHkodHJ1ZSk7CiAgICAvLyBCdWlsZCBzZXQgb2YgY2hhaW5zLgogICAgdmFyIGNoYWlucyA9IHRoaXMudG91Y2hlZENoYWlucygpLCBzZWxmID0gdGhpczsKCiAgICBpZiAoY2hhaW5zLmxlbmd0aCkgewogICAgICB0aGlzLmFkZFVuZG9MZXZlbCh0aGlzLnVwZGF0ZVRvKGNoYWlucywgImxpbmtDaGFpbiIpKTsKICAgICAgdGhpcy5yZWRvSGlzdG9yeSA9IFtdOwogICAgICB0aGlzLm5vdGlmeUVudmlyb25tZW50KCk7CiAgICB9CiAgfSwKCiAgLy8gWyBlbmQgb2YgcHVibGljIGludGVyZmFjZSBdCgogIC8vIFVwZGF0ZSB0aGUgZG9jdW1lbnQgd2l0aCBhIGdpdmVuIHNldCBvZiBjaGFpbnMsIHJldHVybiBpdHMKICAvLyBzaGFkb3cuIHVwZGF0ZUZ1bmMgc2hvdWxkIGJlICJhcHBseUNoYWluIiBvciAibGlua0NoYWluIi4gSW4gdGhlCiAgLy8gc2Vjb25kIGNhc2UsIHRoZSBjaGFpbnMgYXJlIHRha2VuIHRvIGNvcnJlc3BvbmQgdGhlIHRoZSBjdXJyZW50CiAgLy8gZG9jdW1lbnQsIGFuZCBvbmx5IHRoZSBzdGF0ZSBvZiB0aGUgbGluZSBkYXRhIGlzIHVwZGF0ZWQuIEluIHRoZQogIC8vIGZpcnN0IGNhc2UsIHRoZSBjb250ZW50IG9mIHRoZSBjaGFpbnMgaXMgYWxzbyBwdXNoZWQgaWludG8gdGhlCiAgLy8gZG9jdW1lbnQuCiAgdXBkYXRlVG86IGZ1bmN0aW9uKGNoYWlucywgdXBkYXRlRnVuYykgewogICAgdmFyIHNoYWRvd3MgPSBbXSwgZGlydHkgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhaW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgIHNoYWRvd3MucHVzaCh0aGlzLnNoYWRvd0NoYWluKGNoYWluc1tpXSkpOwogICAgICBkaXJ0eS5wdXNoKHRoaXNbdXBkYXRlRnVuY10oY2hhaW5zW2ldKSk7CiAgICB9CiAgICBpZiAodXBkYXRlRnVuYyA9PSAiYXBwbHlDaGFpbiIpCiAgICAgIHRoaXMubm90aWZ5RGlydHkoZGlydHkpOwogICAgcmV0dXJuIHNoYWRvd3M7CiAgfSwKCiAgLy8gTm90aWZ5IHRoZSBlZGl0b3IgdGhhdCBzb21lIG5vZGVzIGhhdmUgY2hhbmdlZC4KICBub3RpZnlEaXJ0eTogZnVuY3Rpb24obm9kZXMpIHsKICAgIGZvckVhY2gobm9kZXMsIG1ldGhvZCh0aGlzLmVkaXRvciwgImFkZERpcnR5Tm9kZSIpKQogICAgdGhpcy5lZGl0b3Iuc2NoZWR1bGVIaWdobGlnaHQoKTsKICB9LAoKICBub3RpZnlFbnZpcm9ubWVudDogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5vbkNoYW5nZSkgdGhpcy5vbkNoYW5nZSgpOwogICAgLy8gVXNlZCBieSB0aGUgbGluZS13cmFwcGluZyBsaW5lLW51bWJlcmluZyBjb2RlLgogICAgaWYgKHdpbmRvdy5mcmFtZUVsZW1lbnQgJiYgd2luZG93LmZyYW1lRWxlbWVudC5Db2RlTWlycm9yLnVwZGF0ZU51bWJlcnMpCiAgICAgIHdpbmRvdy5mcmFtZUVsZW1lbnQuQ29kZU1pcnJvci51cGRhdGVOdW1iZXJzKCk7CiAgfSwKCiAgLy8gTGluayBhIGNoYWluIGludG8gdGhlIERPTSBub2RlcyAob3IgdGhlIGZpcnN0L2xhc3QgbGlua3MgZm9yIG51bGwKICAvLyBub2RlcykuCiAgbGlua0NoYWluOiBmdW5jdGlvbihjaGFpbikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFpbi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgbGluZSA9IGNoYWluW2ldOwogICAgICBpZiAobGluZS5mcm9tKSBsaW5lLmZyb20uaGlzdG9yeUFmdGVyID0gbGluZTsKICAgICAgZWxzZSB0aGlzLmZpcnN0ID0gbGluZTsKICAgICAgaWYgKGxpbmUudG8pIGxpbmUudG8uaGlzdG9yeUJlZm9yZSA9IGxpbmU7CiAgICAgIGVsc2UgdGhpcy5sYXN0ID0gbGluZTsKICAgIH0KICB9LAoKICAvLyBHZXQgdGhlIGxpbmUgb2JqZWN0IGFmdGVyL2JlZm9yZSBhIGdpdmVuIG5vZGUuCiAgYWZ0ZXI6IGZ1bmN0aW9uKG5vZGUpIHsKICAgIHJldHVybiBub2RlID8gbm9kZS5oaXN0b3J5QWZ0ZXIgOiB0aGlzLmZpcnN0OwogIH0sCiAgYmVmb3JlOiBmdW5jdGlvbihub2RlKSB7CiAgICByZXR1cm4gbm9kZSA/IG5vZGUuaGlzdG9yeUJlZm9yZSA6IHRoaXMubGFzdDsKICB9LAoKICAvLyBNYXJrIGEgbm9kZSBhcyB0b3VjaGVkIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIG1hcmtlZC4KICBzZXRUb3VjaGVkOiBmdW5jdGlvbihub2RlKSB7CiAgICBpZiAobm9kZSkgewogICAgICBpZiAoIW5vZGUuaGlzdG9yeVRvdWNoZWQpIHsKICAgICAgICB0aGlzLnRvdWNoZWQucHVzaChub2RlKTsKICAgICAgICBub2RlLmhpc3RvcnlUb3VjaGVkID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgIHRoaXMuZmlyc3RUb3VjaGVkID0gdHJ1ZTsKICAgIH0KICB9LAoKICAvLyBTdG9yZSBhIG5ldyBzZXQgb2YgdW5kbyBpbmZvLCB0aHJvdyBhd2F5IGluZm8gaWYgdGhlcmUgaXMgbW9yZSBvZgogIC8vIGl0IHRoYW4gYWxsb3dlZC4KICBhZGRVbmRvTGV2ZWw6IGZ1bmN0aW9uKGRpZmZzKSB7CiAgICB0aGlzLmhpc3RvcnkucHVzaChkaWZmcyk7CiAgICBpZiAodGhpcy5oaXN0b3J5Lmxlbmd0aCA+IHRoaXMubWF4RGVwdGgpCiAgICAgIHRoaXMuaGlzdG9yeS5zaGlmdCgpOwogIH0sCgogIC8vIEJ1aWxkIGNoYWlucyBmcm9tIGEgc2V0IG9mIHRvdWNoZWQgbm9kZXMuCiAgdG91Y2hlZENoYWluczogZnVuY3Rpb24oKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgLy8gVGhlIHRlbXAgc3lzdGVtIGlzIGEgY3J1bW15IGhhY2sgdG8gc3BlZWQgdXAgZGV0ZXJtaW5pbmcKICAgIC8vIHdoZXRoZXIgYSAoY3VycmVudGx5IHRvdWNoZWQpIG5vZGUgaGFzIGEgbGluZSBvYmplY3QgYXNzb2NpYXRlZAogICAgLy8gd2l0aCBpdC4gbnVsbFRlbXAgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGZvciB0aGUgZmlyc3QKICAgIC8vIGxpbmUsIG90aGVyIG5vZGVzIGdldCBpdCBzdG9yZWQgaW4gdGhlaXIgaGlzdG9yeVRlbXAgcHJvcGVydHkuCiAgICB2YXIgbnVsbFRlbXAgPSBudWxsOwogICAgZnVuY3Rpb24gdGVtcChub2RlKSB7cmV0dXJuIG5vZGUgPyBub2RlLmhpc3RvcnlUZW1wIDogbnVsbFRlbXA7fQogICAgZnVuY3Rpb24gc2V0VGVtcChub2RlLCBsaW5lKSB7CiAgICAgIGlmIChub2RlKSBub2RlLmhpc3RvcnlUZW1wID0gbGluZTsKICAgICAgZWxzZSBudWxsVGVtcCA9IGxpbmU7CiAgICB9CgogICAgZnVuY3Rpb24gYnVpbGRMaW5lKG5vZGUpIHsKICAgICAgdmFyIHRleHQgPSBbXTsKICAgICAgZm9yICh2YXIgY3VyID0gbm9kZSA/IG5vZGUubmV4dFNpYmxpbmcgOiBzZWxmLmNvbnRhaW5lci5maXJzdENoaWxkOwogICAgICAgICAgIGN1ciAmJiAhaXNCUihjdXIpOyBjdXIgPSBjdXIubmV4dFNpYmxpbmcpCiAgICAgICAgaWYgKGN1ci5jdXJyZW50VGV4dCkgdGV4dC5wdXNoKGN1ci5jdXJyZW50VGV4dCk7CiAgICAgIHJldHVybiB7ZnJvbTogbm9kZSwgdG86IGN1ciwgdGV4dDogY2xlYW5UZXh0KHRleHQuam9pbigiIikpfTsKICAgIH0KCiAgICAvLyBGaWx0ZXIgb3V0IHVuY2hhbmdlZCBsaW5lcyBhbmQgbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZQogICAgLy8gZG9jdW1lbnQuIEJ1aWxkIHVwIGxpbmUgb2JqZWN0cyBmb3IgcmVtYWluaW5nIG5vZGVzLgogICAgdmFyIGxpbmVzID0gW107CiAgICBpZiAoc2VsZi5maXJzdFRvdWNoZWQpIHNlbGYudG91Y2hlZC5wdXNoKG51bGwpOwogICAgZm9yRWFjaChzZWxmLnRvdWNoZWQsIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgaWYgKG5vZGUgJiYgbm9kZS5wYXJlbnROb2RlICE9IHNlbGYuY29udGFpbmVyKSByZXR1cm47CgogICAgICBpZiAobm9kZSkgbm9kZS5oaXN0b3J5VG91Y2hlZCA9IGZhbHNlOwogICAgICBlbHNlIHNlbGYuZmlyc3RUb3VjaGVkID0gZmFsc2U7CgogICAgICB2YXIgbGluZSA9IGJ1aWxkTGluZShub2RlKSwgc2hhZG93ID0gc2VsZi5hZnRlcihub2RlKTsKICAgICAgaWYgKCFzaGFkb3cgfHwgc2hhZG93LnRleHQgIT0gbGluZS50ZXh0IHx8IHNoYWRvdy50byAhPSBsaW5lLnRvKSB7CiAgICAgICAgbGluZXMucHVzaChsaW5lKTsKICAgICAgICBzZXRUZW1wKG5vZGUsIGxpbmUpOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBHZXQgdGhlIEJSIGVsZW1lbnQgYWZ0ZXIvYmVmb3JlIHRoZSBnaXZlbiBub2RlLgogICAgZnVuY3Rpb24gbmV4dEJSKG5vZGUsIGRpcikgewogICAgICB2YXIgbGluayA9IGRpciArICJTaWJsaW5nIiwgc2VhcmNoID0gbm9kZVtsaW5rXTsKICAgICAgd2hpbGUgKHNlYXJjaCAmJiAhaXNCUihzZWFyY2gpKQogICAgICAgIHNlYXJjaCA9IHNlYXJjaFtsaW5rXTsKICAgICAgcmV0dXJuIHNlYXJjaDsKICAgIH0KCiAgICAvLyBBc3NlbWJsZSBsaW5lIG9iamVjdHMgaW50byBjaGFpbnMgYnkgc2Nhbm5pbmcgdGhlIERPTSB0cmVlCiAgICAvLyBhcm91bmQgdGhlbS4KICAgIHZhciBjaGFpbnMgPSBbXTsgc2VsZi50b3VjaGVkID0gW107CiAgICBmb3JFYWNoKGxpbmVzLCBmdW5jdGlvbihsaW5lKSB7CiAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG1ha2VzIHRoZSBsb29wIHNraXAgbGluZSBvYmplY3RzIHRoYXQgaGF2ZQogICAgICAvLyBiZWVuIHB1bGxlZCBpbnRvIGNoYWlucyBieSBsaW5lcyBiZWZvcmUgdGhlbS4KICAgICAgaWYgKCF0ZW1wKGxpbmUuZnJvbSkpIHJldHVybjsKCiAgICAgIHZhciBjaGFpbiA9IFtdLCBjdXJOb2RlID0gbGluZS5mcm9tLCBzYWZlID0gdHJ1ZTsKICAgICAgLy8gUHV0IGFueSBsaW5lIG9iamVjdHMgKHJlZmVycmVkIHRvIGJ5IHRlbXAgaW5mbykgYmVmb3JlIHRoaXMKICAgICAgLy8gb25lIG9uIHRoZSBmcm9udCBvZiB0aGUgYXJyYXkuCiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdmFyIGN1ckxpbmUgPSB0ZW1wKGN1ck5vZGUpOwogICAgICAgIGlmICghY3VyTGluZSkgewogICAgICAgICAgaWYgKHNhZmUpIGJyZWFrOwogICAgICAgICAgZWxzZSBjdXJMaW5lID0gYnVpbGRMaW5lKGN1ck5vZGUpOwogICAgICAgIH0KICAgICAgICBjaGFpbi51bnNoaWZ0KGN1ckxpbmUpOwogICAgICAgIHNldFRlbXAoY3VyTm9kZSwgbnVsbCk7CiAgICAgICAgaWYgKCFjdXJOb2RlKSBicmVhazsKICAgICAgICBzYWZlID0gc2VsZi5hZnRlcihjdXJOb2RlKTsKICAgICAgICBjdXJOb2RlID0gbmV4dEJSKGN1ck5vZGUsICJwcmV2aW91cyIpOwogICAgICB9CiAgICAgIGN1ck5vZGUgPSBsaW5lLnRvOyBzYWZlID0gc2VsZi5iZWZvcmUobGluZS5mcm9tKTsKICAgICAgLy8gQWRkIGxpbmVzIGFmdGVyIHRoaXMgb25lIGF0IGVuZCBvZiBhcnJheS4KICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBpZiAoIWN1ck5vZGUpIGJyZWFrOwogICAgICAgIHZhciBjdXJMaW5lID0gdGVtcChjdXJOb2RlKTsKICAgICAgICBpZiAoIWN1ckxpbmUpIHsKICAgICAgICAgIGlmIChzYWZlKSBicmVhazsKICAgICAgICAgIGVsc2UgY3VyTGluZSA9IGJ1aWxkTGluZShjdXJOb2RlKTsKICAgICAgICB9CiAgICAgICAgY2hhaW4ucHVzaChjdXJMaW5lKTsKICAgICAgICBzZXRUZW1wKGN1ck5vZGUsIG51bGwpOwogICAgICAgIHNhZmUgPSBzZWxmLmJlZm9yZShjdXJOb2RlKTsKICAgICAgICBjdXJOb2RlID0gbmV4dEJSKGN1ck5vZGUsICJuZXh0Iik7CiAgICAgIH0KICAgICAgY2hhaW5zLnB1c2goY2hhaW4pOwogICAgfSk7CgogICAgcmV0dXJuIGNoYWluczsKICB9LAoKICAvLyBGaW5kIHRoZSAnc2hhZG93JyBvZiBhIGdpdmVuIGNoYWluIGJ5IGZvbGxvd2luZyB0aGUgbGlua3MgaW4gdGhlCiAgLy8gRE9NIG5vZGVzIGF0IGl0cyBzdGFydCBhbmQgZW5kLgogIHNoYWRvd0NoYWluOiBmdW5jdGlvbihjaGFpbikgewogICAgdmFyIHNoYWRvd3MgPSBbXSwgbmV4dCA9IHRoaXMuYWZ0ZXIoY2hhaW5bMF0uZnJvbSksIGVuZCA9IGNoYWluW2NoYWluLmxlbmd0aCAtIDFdLnRvOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgc2hhZG93cy5wdXNoKG5leHQpOwogICAgICB2YXIgbmV4dE5vZGUgPSBuZXh0LnRvOwogICAgICBpZiAoIW5leHROb2RlIHx8IG5leHROb2RlID09IGVuZCkKICAgICAgICBicmVhazsKICAgICAgZWxzZQogICAgICAgIG5leHQgPSBuZXh0Tm9kZS5oaXN0b3J5QWZ0ZXIgfHwgdGhpcy5iZWZvcmUoZW5kKTsKICAgICAgLy8gKFRoZSB0aGlzLmJlZm9yZShlbmQpIGlzIGEgaGFjayAtLSBGRiBzb21ldGltZXMgcmVtb3ZlcwogICAgICAvLyBwcm9wZXJ0aWVzIGZyb20gQlIgbm9kZXMsIGluIHdoaWNoIGNhc2UgdGhlIGJlc3Qgd2UgY2FuIGhvcGUKICAgICAgLy8gZm9yIGlzIHRvIG5vdCBicmVhay4pCiAgICB9CiAgICByZXR1cm4gc2hhZG93czsKICB9LAoKICAvLyBVcGRhdGUgdGhlIERPTSB0cmVlIHRvIGNvbnRhaW4gdGhlIGxpbmVzIHNwZWNpZmllZCBpbiBhIGdpdmVuCiAgLy8gY2hhaW4sIGxpbmsgdGhpcyBjaGFpbiBpbnRvIHRoZSBET00gbm9kZXMuCiAgYXBwbHlDaGFpbjogZnVuY3Rpb24oY2hhaW4pIHsKICAgIC8vIFNvbWUgYXR0ZW1wdCBpcyBtYWRlIHRvIHByZXZlbnQgdGhlIGN1cnNvciBmcm9tIGp1bXBpbmcKICAgIC8vIHJhbmRvbWx5IHdoZW4gYW4gdW5kbyBvciByZWRvIGhhcHBlbnMuIEl0IHN0aWxsIGJlaGF2ZXMgYSBiaXQKICAgIC8vIHN0cmFuZ2Ugc29tZXRpbWVzLgogICAgdmFyIGN1cnNvciA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5jb250YWluZXIsIGZhbHNlKSwgc2VsZiA9IHRoaXM7CgogICAgLy8gUmVtb3ZlIGFsbCBub2RlcyBpbiB0aGUgRE9NIHRyZWUgYmV0d2VlbiBmcm9tIGFuZCB0byAobnVsbCBmb3IKICAgIC8vIHN0YXJ0L2VuZCBvZiBjb250YWluZXIpLgogICAgZnVuY3Rpb24gcmVtb3ZlUmFuZ2UoZnJvbSwgdG8pIHsKICAgICAgdmFyIHBvcyA9IGZyb20gPyBmcm9tLm5leHRTaWJsaW5nIDogc2VsZi5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgd2hpbGUgKHBvcyAhPSB0bykgewogICAgICAgIHZhciB0ZW1wID0gcG9zLm5leHRTaWJsaW5nOwogICAgICAgIHJlbW92ZUVsZW1lbnQocG9zKTsKICAgICAgICBwb3MgPSB0ZW1wOwogICAgICB9CiAgICB9CgogICAgdmFyIHN0YXJ0ID0gY2hhaW5bMF0uZnJvbSwgZW5kID0gY2hhaW5bY2hhaW4ubGVuZ3RoIC0gMV0udG87CiAgICAvLyBDbGVhciB0aGUgc3BhY2Ugd2hlcmUgdGhpcyBjaGFuZ2UgaGFzIHRvIGJlIG1hZGUuCiAgICByZW1vdmVSYW5nZShzdGFydCwgZW5kKTsKCiAgICAvLyBJbnNlcnQgdGhlIGNvbnRlbnQgc3BlY2lmaWVkIGJ5IHRoZSBjaGFpbiBpbnRvIHRoZSBET00gdHJlZS4KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhaW4ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGxpbmUgPSBjaGFpbltpXTsKICAgICAgLy8gVGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHNwYWNlIGFyZSBhbHJlYWR5IGNvcnJlY3QsIGJ1dCBCUgogICAgICAvLyB0YWdzIGluc2lkZSBpdCBoYXZlIHRvIGJlIHB1dCBiYWNrLgogICAgICBpZiAoaSA+IDApCiAgICAgICAgc2VsZi5jb250YWluZXIuaW5zZXJ0QmVmb3JlKGxpbmUuZnJvbSwgZW5kKTsKCiAgICAgIC8vIEFkZCB0aGUgdGV4dC4KICAgICAgdmFyIG5vZGUgPSBtYWtlUGFydFNwYW4oZml4U3BhY2VzKGxpbmUudGV4dCksIHRoaXMuY29udGFpbmVyLm93bmVyRG9jdW1lbnQpOwogICAgICBzZWxmLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUobm9kZSwgZW5kKTsKICAgICAgLy8gU2VlIGlmIHRoZSBjdXJzb3Igd2FzIG9uIHRoaXMgbGluZS4gUHV0IGl0IGJhY2ssIGFkanVzdGluZwogICAgICAvLyBmb3IgY2hhbmdlZCBsaW5lIGxlbmd0aCwgaWYgaXQgd2FzLgogICAgICBpZiAoY3Vyc29yICYmIGN1cnNvci5ub2RlID09IGxpbmUuZnJvbSkgewogICAgICAgIHZhciBjdXJzb3JkaWZmID0gMDsKICAgICAgICB2YXIgcHJldiA9IHRoaXMuYWZ0ZXIobGluZS5mcm9tKTsKICAgICAgICBpZiAocHJldiAmJiBpID09IGNoYWluLmxlbmd0aCAtIDEpIHsKICAgICAgICAgIC8vIE9ubHkgYWRqdXN0IGlmIHRoZSBjdXJzb3IgaXMgYWZ0ZXIgdGhlIHVuY2hhbmdlZCBwYXJ0IG9mCiAgICAgICAgICAvLyB0aGUgbGluZS4KICAgICAgICAgIGZvciAodmFyIG1hdGNoID0gMDsgbWF0Y2ggPCBjdXJzb3Iub2Zmc2V0ICYmCiAgICAgICAgICAgICAgIGxpbmUudGV4dC5jaGFyQXQobWF0Y2gpID09IHByZXYudGV4dC5jaGFyQXQobWF0Y2gpOyBtYXRjaCsrKTsKICAgICAgICAgIGlmIChjdXJzb3Iub2Zmc2V0ID4gbWF0Y2gpCiAgICAgICAgICAgIGN1cnNvcmRpZmYgPSBsaW5lLnRleHQubGVuZ3RoIC0gcHJldi50ZXh0Lmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgc2VsZWN0LnNldEN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwge25vZGU6IGxpbmUuZnJvbSwgb2Zmc2V0OiBNYXRoLm1heCgwLCBjdXJzb3Iub2Zmc2V0ICsgY3Vyc29yZGlmZil9KTsKICAgICAgfQogICAgICAvLyBDdXJzb3Igd2FzIGluIHJlbW92ZWQgbGluZSwgdGhpcyBpcyBsYXN0IG5ldyBsaW5lLgogICAgICBlbHNlIGlmIChjdXJzb3IgJiYgKGkgPT0gY2hhaW4ubGVuZ3RoIC0gMSkgJiYgY3Vyc29yLm5vZGUgJiYgY3Vyc29yLm5vZGUucGFyZW50Tm9kZSAhPSB0aGlzLmNvbnRhaW5lcikgewogICAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHtub2RlOiBsaW5lLmZyb20sIG9mZnNldDogbGluZS50ZXh0Lmxlbmd0aH0pOwogICAgICB9CiAgICB9CgogICAgLy8gQW5jaG9yIHRoZSBjaGFpbiBpbiB0aGUgRE9NIHRyZWUuCiAgICB0aGlzLmxpbmtDaGFpbihjaGFpbik7CiAgICByZXR1cm4gc3RhcnQ7CiAgfQp9Owo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/util.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQSBmZXcgdXNlZnVsIHV0aWxpdHkgZnVuY3Rpb25zLiAqLwoKLy8gQ2FwdHVyZSBhIG1ldGhvZCBvbiBhbiBvYmplY3QuCmZ1bmN0aW9uIG1ldGhvZChvYmosIG5hbWUpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7b2JqW25hbWVdLmFwcGx5KG9iaiwgYXJndW1lbnRzKTt9Owp9CgovLyBUaGUgdmFsdWUgdXNlZCB0byBzaWduYWwgdGhlIGVuZCBvZiBhIHNlcXVlbmNlIGluIGl0ZXJhdG9ycy4KdmFyIFN0b3BJdGVyYXRpb24gPSB7dG9TdHJpbmc6IGZ1bmN0aW9uKCkge3JldHVybiAiU3RvcEl0ZXJhdGlvbiJ9fTsKCi8vIEFwcGx5IGEgZnVuY3Rpb24gdG8gZWFjaCBlbGVtZW50IGluIGEgc2VxdWVuY2UuCmZ1bmN0aW9uIGZvckVhY2goaXRlciwgZikgewogIGlmIChpdGVyLm5leHQpIHsKICAgIHRyeSB7d2hpbGUgKHRydWUpIGYoaXRlci5uZXh0KCkpO30KICAgIGNhdGNoIChlKSB7aWYgKGUgIT0gU3RvcEl0ZXJhdGlvbikgdGhyb3cgZTt9CiAgfQogIGVsc2UgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVyLmxlbmd0aDsgaSsrKQogICAgICBmKGl0ZXJbaV0pOwogIH0KfQoKLy8gTWFwIGEgZnVuY3Rpb24gb3ZlciBhIHNlcXVlbmNlLCBwcm9kdWNpbmcgYW4gYXJyYXkgb2YgcmVzdWx0cy4KZnVuY3Rpb24gbWFwKGl0ZXIsIGYpIHsKICB2YXIgYWNjdW0gPSBbXTsKICBmb3JFYWNoKGl0ZXIsIGZ1bmN0aW9uKHZhbCkge2FjY3VtLnB1c2goZih2YWwpKTt9KTsKICByZXR1cm4gYWNjdW07Cn0KCi8vIENyZWF0ZSBhIHByZWRpY2F0ZSBmdW5jdGlvbiB0aGF0IHRlc3RzIGEgc3RyaW5nIGFnYWluc3RzIGEgZ2l2ZW4KLy8gcmVndWxhciBleHByZXNzaW9uLiBObyBsb25nZXIgdXNlZCBidXQgbWlnaHQgYmUgdXNlZCBieSAzcmQgcGFydHkKLy8gcGFyc2Vycy4KZnVuY3Rpb24gbWF0Y2hlcihyZWdleHApewogIHJldHVybiBmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIHJlZ2V4cC50ZXN0KHZhbHVlKTt9Owp9CgovLyBUZXN0IHdoZXRoZXIgYSBET00gbm9kZSBoYXMgYSBjZXJ0YWluIENTUyBjbGFzcy4gTXVjaCBmYXN0ZXIgdGhhbgovLyB0aGUgTW9jaGlLaXQgZXF1aXZhbGVudCwgZm9yIHNvbWUgcmVhc29uLgpmdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpewogIHZhciBjbGFzc2VzID0gZWxlbWVudC5jbGFzc05hbWU7CiAgcmV0dXJuIGNsYXNzZXMgJiYgbmV3IFJlZ0V4cCgiKF58ICkiICsgY2xhc3NOYW1lICsgIigkfCApIikudGVzdChjbGFzc2VzKTsKfQoKLy8gSW5zZXJ0IGEgRE9NIG5vZGUgYWZ0ZXIgYW5vdGhlciBub2RlLgpmdW5jdGlvbiBpbnNlcnRBZnRlcihuZXdOb2RlLCBvbGROb2RlKSB7CiAgdmFyIHBhcmVudCA9IG9sZE5vZGUucGFyZW50Tm9kZTsKICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIG9sZE5vZGUubmV4dFNpYmxpbmcpOwogIHJldHVybiBuZXdOb2RlOwp9CgpmdW5jdGlvbiByZW1vdmVFbGVtZW50KG5vZGUpIHsKICBpZiAobm9kZS5wYXJlbnROb2RlKQogICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwp9CgpmdW5jdGlvbiBjbGVhckVsZW1lbnQobm9kZSkgewogIHdoaWxlIChub2RlLmZpcnN0Q2hpbGQpCiAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7Cn0KCi8vIENoZWNrIHdoZXRoZXIgYSBub2RlIGlzIGNvbnRhaW5lZCBpbiBhbm90aGVyIG9uZS4KZnVuY3Rpb24gaXNBbmNlc3Rvcihub2RlLCBjaGlsZCkgewogIHdoaWxlIChjaGlsZCA9IGNoaWxkLnBhcmVudE5vZGUpIHsKICAgIGlmIChub2RlID09IGNoaWxkKQogICAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovLyBUaGUgbm9uLWJyZWFraW5nIHNwYWNlIGNoYXJhY3Rlci4KdmFyIG5ic3AgPSAiXHUwMGEwIjsKdmFyIG1hdGNoaW5nID0geyJ7IjogIn0iLCAiWyI6ICJdIiwgIigiOiAiKSIsCiAgICAgICAgICAgICAgICAifSI6ICJ7IiwgIl0iOiAiWyIsICIpIjogIigifTsKCi8vIFN0YW5kYXJkaXplIGEgZmV3IHVucG9ydGFibGUgZXZlbnQgcHJvcGVydGllcy4KZnVuY3Rpb24gbm9ybWFsaXplRXZlbnQoZXZlbnQpIHsKICBpZiAoIWV2ZW50LnN0b3BQcm9wYWdhdGlvbikgewogICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24oKSB7dGhpcy5jYW5jZWxCdWJibGUgPSB0cnVlO307CiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uKCkge3RoaXMucmV0dXJuVmFsdWUgPSBmYWxzZTt9OwogIH0KICBpZiAoIWV2ZW50LnN0b3ApIHsKICAgIGV2ZW50LnN0b3AgPSBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgdGhpcy5wcmV2ZW50RGVmYXVsdCgpOwogICAgfTsKICB9CgogIGlmIChldmVudC50eXBlID09ICJrZXlwcmVzcyIpIHsKICAgIGV2ZW50LmNvZGUgPSAoZXZlbnQuY2hhckNvZGUgPT0gbnVsbCkgPyBldmVudC5rZXlDb2RlIDogZXZlbnQuY2hhckNvZGU7CiAgICBldmVudC5jaGFyYWN0ZXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNvZGUpOwogIH0KICByZXR1cm4gZXZlbnQ7Cn0KCi8vIFBvcnRhYmx5IHJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzLgpmdW5jdGlvbiBhZGRFdmVudEhhbmRsZXIobm9kZSwgdHlwZSwgaGFuZGxlciwgcmVtb3ZlRnVuYykgewogIGZ1bmN0aW9uIHdyYXBIYW5kbGVyKGV2ZW50KSB7CiAgICBoYW5kbGVyKG5vcm1hbGl6ZUV2ZW50KGV2ZW50IHx8IHdpbmRvdy5ldmVudCkpOwogIH0KICBpZiAodHlwZW9mIG5vZGUuYWRkRXZlbnRMaXN0ZW5lciA9PSAiZnVuY3Rpb24iKSB7CiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgd3JhcEhhbmRsZXIsIGZhbHNlKTsKICAgIGlmIChyZW1vdmVGdW5jKSByZXR1cm4gZnVuY3Rpb24oKSB7bm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHdyYXBIYW5kbGVyLCBmYWxzZSk7fTsKICB9CiAgZWxzZSB7CiAgICBub2RlLmF0dGFjaEV2ZW50KCJvbiIgKyB0eXBlLCB3cmFwSGFuZGxlcik7CiAgICBpZiAocmVtb3ZlRnVuYykgcmV0dXJuIGZ1bmN0aW9uKCkge25vZGUuZGV0YWNoRXZlbnQoIm9uIiArIHR5cGUsIHdyYXBIYW5kbGVyKTt9OwogIH0KfQoKZnVuY3Rpb24gbm9kZVRleHQobm9kZSkgewogIHJldHVybiBub2RlLnRleHRDb250ZW50IHx8IG5vZGUuaW5uZXJUZXh0IHx8IG5vZGUubm9kZVZhbHVlIHx8ICIiOwp9CgpmdW5jdGlvbiBub2RlVG9wKG5vZGUpIHsKICB2YXIgdG9wID0gMDsKICB3aGlsZSAobm9kZS5vZmZzZXRQYXJlbnQpIHsKICAgIHRvcCArPSBub2RlLm9mZnNldFRvcDsKICAgIG5vZGUgPSBub2RlLm9mZnNldFBhcmVudDsKICB9CiAgcmV0dXJuIHRvcDsKfQoKZnVuY3Rpb24gaXNCUihub2RlKSB7CiAgdmFyIG5uID0gbm9kZS5ub2RlTmFtZTsKICByZXR1cm4gbm4gPT0gIkJSIiB8fCBubiA9PSAiYnIiOwp9CmZ1bmN0aW9uIGlzU3Bhbihub2RlKSB7CiAgdmFyIG5uID0gbm9kZS5ub2RlTmFtZTsKICByZXR1cm4gbm4gPT0gIlNQQU4iIHx8IG5uID09ICJzcGFuIjsKfQo=]]></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+QW5vdGhlciB1dGlsaXR5IGZ1bmN0aW9uLCA8Y29kZT5Db2RlTWlycm9yLmZyb21UZXh0QXJlYTwvY29kZT4sCiAgICB3aWxsLCBnaXZlbiBhIHRleHRhcmVhIG5vZGUgb3IgdGhlIGlkIG9mIHN1Y2ggYSBub2RlLCBoaWRlIHRoZQogICAgdGV4dGFyZWEgYW5kIHJlcGxhY2UgaXQgd2l0aCBhIENvZGVNaXJyb3IgZnJhbWUuIElmIHRoZSB0ZXh0YXJlYQogICAgd2FzIHBhcnQgb2YgYSBmb3JtLCBhbiA8Y29kZT5vbnN1Ym1pdDwvY29kZT4gaGFuZGxlciB3aWxsIGJlCiAgICByZWdpc3RlcmVkIHdpdGggdGhpcyBmb3JtLCB3aGljaCB3aWxsIGxvYWQgdGhlIGNvbnRlbnQgb2YgdGhlCiAgICBlZGl0b3IgaW50byB0aGUgdGV4dGFyZWEsIHNvIHRoYXQgaXQgY2FuIGJlIHN1Ym1pdHRlZCBhcyBub3JtYWwuCiAgICBUaGlzIGZ1bmN0aW9uIG9wdGlvbmFsbHkgdGFrZXMgYSBjb25maWd1cmF0aW9uIG9iamVjdCBhcyBzZWNvbmQKICAgIGFyZ3VtZW50LjwvcD4KCiAgICA8cHJlIGNsYXNzPSJjb2RlIj52YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoImlucHV0ZmllbGQiLCB7CiAgcGFyc2VyZmlsZTogWyJ0b2tlbml6ZWphdmFzY3JpcHQuanMiLCAicGFyc2VqYXZhc2NyaXB0LmpzIl0sCiAgcGF0aDogImxpYi9jb2RlbWlycm9yL2pzLyIsCiAgc3R5bGVzaGVldDogImxpYi9jb2RlbWlycm9yL2Nzcy9qc2NvbG9ycy5jc3MiCn0pOzwvcHJlPgoKICAgIDxwPkluc3RhbmNlcyBjcmVhdGVkIGxpa2UgdGhpcyB3aWxsIGhhdmUgYQogICAgPGNvZGU+dG9UZXh0QXJlYSgpPC9jb2RlPiBtZXRob2Qgd2hpY2ggcmVtb3ZlcyB0aGVtIGFuZCByZXN0b3JlcwogICAgdGhlIHRleHQgYXJlYSB0aGV5IHdlcmUgYmFzZWQgb24uPC9wPgoKICAgIDxwPlRoZSByZWFzb24gdGhhdCB0aGUgc2NyaXB0IHBhdGggaGFzIHRvIGJlIGNvbmZpZ3VyZWQgaXMgdGhhdAogICAgQ29kZU1pcnJvciB3aWxsIGxvYWQgaW4gYSBidW5jaCBvZiBleHRyYSBmaWxlcyB3aGVuIGFuIGVkaXRvciBpcwogICAgY3JlYXRlZCAodGhlIHBhcnNlciBzY3JpcHQsIGFtb25nIG90aGVycykuIFRvIGJlIGFibGUgdG8gZG8gdGhpcywKICAgIGl0IGhhcyB0byBrbm93IHdoZXJlIHRvIGZpbmQgdGhlbS4gVGhlc2UgYXJlIGFsbCB0aGUgSmF2YVNjcmlwdAogICAgZmlsZXMgdGhhdCBhcmUgcGFydCBvZiBDb2RlTWlycm9yIGl0c2VsZjo8L3A+CgogICAgPGRsPgogICAgICA8ZHQ+PGEgaHJlZj0ianMvY29kZW1pcnJvci5qcyI+PGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPk1haW4gaW50ZXJmYWNlLCB0YWtlcyBjYXJlIG9mIGRlZmF1bHQgY29uZmlndXJhdGlvbiBhbmQgdGhlCiAgICAgIGRlZmluaXRpb24gb2YgZWRpdG9yIGZyYW1lcy4gSW5jbHVkZSB0aGlzIGluIHlvdXIgSFRNTAogICAgICBkb2N1bWVudC48L2RkPgogICAgICA8ZHQ+PGEgaHJlZj0ianMvZWRpdG9yLmpzIj48Y29kZT5lZGl0b3IuanM8L2NvZGU+PC9hPjwvZHQ+IDxkZD5UaGUKICAgICAgY29kZSB0aGF0IHRha2VzIGNhcmUgb2YgcmVhY3RpbmcgdG8gdXNlciBpbnB1dCwgY29sb3VyaW5nIHRleHQsCiAgICAgIGFuZCBpbmRlbnRpbmcgbGluZXMuPC9kZD4KICAgICAgPGR0PjxhIGhyZWY9ImpzL3V0aWwuanMiPjxjb2RlPnV0aWwuanM8L2NvZGU+PC9hPjwvZHQ+IDxkZD5BIGZldwogICAgICBnZW5lcmljIHV0aWxpdHkgZnVuY3Rpb25zLjwvZGQ+CiAgICAgIDxkdD48YQogICAgICBocmVmPSJqcy91bmRvLmpzIj48Y29kZT51bmRvLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+SW1wbGVtZW50cyB0aGUgdW5kbyBoaXN0b3J5IGZvciB0aGUgZWRpdG9yLjwvZGQ+CiAgICAgIDxkdD48YQogICAgICBocmVmPSJqcy9zdHJpbmdzdHJlYW0uanMiPjxjb2RlPnN0cmluZ3N0cmVhbS5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPk9iamVjdHMgZm9yIHdyYXBwaW5nIHRoZSB0ZXh0dWFsIGlucHV0IHRvIHRoZSBwYXJzZXIuPC9kZD4KICAgICAgPGR0PjxhIGhyZWY9ImpzL3NlbGVjdC5qcyI+PGNvZGU+c2VsZWN0LmpzPC9jb2RlPjwvYT48L2R0PiA8ZGQ+U29tZQogICAgICBoZWxwZXIgdXRpbGl0aWVzIGZvciB3b3JraW5nIHdpdGggc2VsZWN0ZWQgdGV4dCBhbmQgY3Vyc29yCiAgICAgIHBvc2l0aW9ucy48L2RkPgogICAgICA8ZHQ+PGEgaHJlZj0ianMvdG9rZW5pemUuanMiPjxjb2RlPnRva2VuaXplLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+SGVscGVyIGZyYW1ld29yayBmb3Igd3JpdGluZyB0b2tlbmlzZXJzLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxwPk1vc3Qgb2YgdGhlc2UgYXJlIHJhdGhlciBmdWxsIG9mIGNvbW1lbnRzLCB3aGljaCBjYW4gYmUgdXNlZnVsCiAgICB3aGVuIHlvdSBhcmUgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgaG93IHRoZXkgd29yaywgYnV0IHdhc3RlcyBhIGxvdAogICAgb2YgYmFuZHdpZHRoIGluIGEgcHJvZHVjdGlvbiBzeXN0ZW0uIFRha2UgYSBsb29rIGF0IHRoZQogICAgZGVzY3JpcHRpb24gb2YgdGhlIDxjb2RlPmJhc2VmaWxlczwvY29kZT4gb3B0aW9uIGJlbG93IGlmIHlvdSB3YW50CiAgICB0byBjb25jYXRlbmF0ZSBhbmQgbWluaW1pc2UgdGhlIGxpYnJhcnkgKHNlZSB0aGUgPGEgaHJlZj0iY29tcHJlc3MuaHRtbCI+Y29tcHJlc3Npb24gQVBJPC9hPikuPC9wPgoKICAgIDxwPkFwYXJ0IGZyb20gdGhlc2UsIHRoZXJlIGFyZSBmaWxlcyB0aGF0IGltcGxlbWVudCB0aGUgdmFyaW91cwogICAgcGFyc2Vycy4gVGhlc2UgYWxsIHN0YXJ0IHdpdGggZWl0aGVyIDxjb2RlPnBhcnNlPC9jb2RlPiBvcgogICAgPGNvZGU+dG9rZW5pemU8L2NvZGU+LjwvcD4KCiAgICA8aDIgaWQ9ImNvbmZpZ3VyYXRpb24iPkNvbmZpZ3VyYXRpb248L2gyPgoKICAgIDxwPlRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGNvbmZpZ3VyZSBDb2RlTWlycm9yOjwvcD4KCiAgICA8dWw+CiAgICAgIDxsaT5JZiB5b3UgZGVmaW5lIGEgZ2xvYmFsIDxjb2RlPkNvZGVNaXJyb3JDb25maWc8L2NvZGU+IG9iamVjdAogICAgICBiZWZvcmUgbG9hZGluZyA8YQogICAgICBocmVmPSJqcy9jb2RlbWlycm9yLmpzIj48Y29kZT5jb2RlbWlycm9yLmpzPC9jb2RlPjwvYT4sIHRoZQogICAgICBjb25maWd1cmF0aW9uIG9wdGlvbnMgaW4gdGhhdCBvYmplY3Qgd2lsbCBvdmVycmlkZSB0aGUKICAgICAgZGVmYXVsdHMuPC9saT4KICAgICAgPGxpPkJ5IGFzc2lnbmluZyB0byB0aGUgcHJvcGVydGllcyBvZiB0aGUKICAgICAgPGNvZGU+Q29kZU1pcnJvckNvbmZpZzwvY29kZT4gb2JqZWN0LCBjb25maWd1cmF0aW9uIGRlZmF1bHRzIGNhbgogICAgICBiZSBvdmVycmlkZGVuIGFmdGVyIGxvYWRpbmcgPGEKICAgICAgaHJlZj0ianMvY29kZW1pcnJvci5qcyI+PGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT48L2E+LjwvbGk+CiAgICAgIDxsaT5UaGUgPGNvZGU+Q29kZU1pcnJvcjwvY29kZT4gY29uc3RydWN0b3IgY2FuIGJlIGdpdmVuIGEgc2Vjb25kCiAgICAgIGFyZ3VtZW50LCBhbiBvYmplY3QsIHdoaWNoIHdpbGwgb3ZlcnJpZGUgc29tZSBvcHRpb25zIGZvciBqdXN0CiAgICAgIHRoYXQgZWRpdG9yLiBPcHRpb25zIG5vdCBtZW50aW9uZWQgaW4gdGhpcyBvYmplY3Qgd2lsbCBkZWZhdWx0IHRvCiAgICAgIHRoZSB2YWx1ZXMgaW4gdGhlIDxjb2RlPkNvZGVNaXJyb3JDb25maWc8L2NvZGU+IG9iamVjdC48L2xpPgogICAgPC91bD4KCiAgICA8cD5UaGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgYXJlIHRoZXNlIChtb3N0IGhhdmUgc2Vuc2libGUKICAgIGRlZmF1bHRzIHNwZWNpZmllZCBpbiA8YQogICAgaHJlZj0ianMvY29kZW1pcnJvci5qcyI+PGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT48L2E+KTo8L3A+CgogICAgPGRsPgoKICAgICAgPGR0Pjxjb2RlPnN0eWxlc2hlZXQ8L2NvZGU+PC9kdD48ZGQ+VGhlIGZpbGUgbmFtZSBvZiB0aGUKICAgICAgc3R5bGUtc2hlZXQsIG9yIHN0eWxlLXNoZWV0cywgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjb2xvdXIgdGhlCiAgICAgIGNvZGUgaW4gdGhlIGVkaXRvciBmcmFtZS4gQ2FuIGJlIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mCiAgICAgIHN0cmluZ3MuIFNlZSA8YQogICAgICBocmVmPSJjc3MvanNjb2xvcnMuY3NzIj48Y29kZT5qc2NvbG9ycy5jc3M8L2NvZGU+PC9hPiBmb3IgYW4KICAgICAgZXhhbXBsZS4gVGhlIHNldCBvZiBhY3RpdmUgc3R5bGVzaGVldHMgY2FuIGJlIGNoYW5nZWQgaW4gYQogICAgICBydW5uaW5nIGVkaXRvciB3aXRoIHRoZSA8Y29kZT5zZXRTdHlsZXNoZWV0PC9jb2RlPiBtZXRob2QsIHdoaWNoCiAgICAgIGFsc28gdGFrZXMgYSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncyBhcyBhcmd1bWVudC48L2RkPgoKICAgICAgPGR0Pjxjb2RlPnBhdGg8L2NvZGU+PC9kdD48ZGQ+VGhlIHBhdGggdGhhdCBpcyBwcmVmaXhlZCB0bwogICAgICBzY3JpcHQgZmlsZSBuYW1lcyB3aGVuIHRoZXkgYXJlIGxvYWRlZCBpbnRvIGFuIElGUkFNRS4gKE5vdGUgdGhhdAogICAgICB0aGlzIGlzIG5vdCBhcHBsaWVkIHRvIHRoZSBzdHlsZS1zaGVldCBmaWxlIG5hbWUuKTwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+cGFyc2VyZmlsZTwvY29kZT48L2R0PjxkZD5BIGZpbGUgbmFtZSBzdHJpbmcsIG9yIGFuCiAgICAgIGFycmF5IG9mIHN0cmluZ3MgdGhhdCBuYW1lIHRoZSBmaWxlcyBjb250YWluaW5nIHRoZSBwYXJzZXIuIFNlZQogICAgICBiZWxvdyBmb3IgdGhlIGludGVyZmFjZSB0aGF0IHN1Y2ggYSBwYXJzZXIgc2hvdWxkCiAgICAgIGltcGxlbWVudC48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmJhc2VmaWxlczwvY29kZT48L2R0PjxkZD5BbiBhcnJheSBvZiBzdHJpbmdzIG5hbWluZwogICAgICB0aGUgZmlsZXMgY29udGFpbmluZyB0aGUgYmFzZSBDb2RlTWlycm9yIGZ1bmN0aW9uYWxpdHkuIERlZmF1bHRzCiAgICAgIHRvIDxjb2RlPlsidXRpbC5qcyIsICJzdHJpbmdzdHJlYW0uanMiLCAic2VsZWN0LmpzIiwgInVuZG8uanMiLAogICAgICAiZWRpdG9yLmpzIiwgInRva2VuaXplLmpzIl08L2NvZGU+LCBidXQgaWYgeW91IHB1dCB0aGVtIGFsbCBpbnRvCiAgICAgIGEgc2luZ2xlIGZpbGUgdG8gcmVkdWNlIGxhdGVuY3ksIG9yIGFkZCBzb21lIGZ1bmN0aW9uYWxpdHksIHlvdQogICAgICBtaWdodCBoYXZlIHRvIGFkanVzdCB0aGF0LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+aWZyYW1lQ2xhc3M8L2NvZGU+PC9kdD48ZGQ+U2V0IHRoaXMgdG8gYSBzdHJpbmcgdG8KICAgICAgZ2l2ZSB0aGUgSUZSQU1FIG5vZGUgY3JlYXRlZCBmb3IgdGhlIGVkaXRvciBhIGN1c3RvbSBDU1MgY2xhc3MuCiAgICAgIERlZmF1bHRzIHRvIDxjb2RlPm51bGw8L2NvZGU+LjwvZGQ+CiAgICAgIAogICAgICA8ZHQ+PGNvZGU+cGFzc0RlbGF5PC9jb2RlPjwvZHQ+PGRkPkdpdmVzIHRoZSBhbW91bnQgb2YKICAgICAgbWlsbGlzZWNvbmRzIGJldHdlZW4gY29sb3VyaW5nIHBhc3Nlcy4gRGVmYXVsdHMgdG8gMjAwLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+cGFzc1RpbWU8L2NvZGU+PC9kdD48ZGQ+U3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFtb3VudAogICAgICBvZiB0aW1lIHRoYXQgdGhlIGhpZ2hsaWdodGVyIHdpbGwgc3BlbmQgaW4gb25lIHNob3QuIFNldHRpbmcKICAgICAgdGhpcyB0b28gaGlnaCB3aWxsIGNhdXNlIHRoZSBlZGl0b3IgdG8gJ2ZyZWV6ZScgdGhlIGJyb3dzZXIgZm9yCiAgICAgIG5vdGljZWFibGUgaW50ZXJ2YWxzLiBEZWZhdWx0cyB0byA1MC48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmNvbnRpbnVvdXNTY2FubmluZzwvY29kZT48L2R0PjxkZD5Db25maWd1cmUgY29udGludW91cwogICAgICBzY2FubmluZyBvZiB0aGUgZG9jdW1lbnQuIFdoZW4gPGNvZGU+ZmFsc2U8L2NvZGU+LCBzY2FubmluZyBpcwogICAgICBkaXNhYmxlZC4gV2hlbiBzZXQgdG8gYSBudW1iZXIsIHNheSA8Y29kZT5OPC9jb2RlPiwgYQogICAgICAnYmFja2dyb3VuZCcgcHJvY2VzcyB3aWxsIHNjYW4gdGhlIGRvY3VtZW50IGZvcgogICAgICA8Y29kZT5wYXNzVGltZTwvY29kZT4gKHNlZSBhYm92ZSkgbWlsbGlzZWNvbmRzIGV2ZXJ5CiAgICAgIDxjb2RlPk48L2NvZGU+IG1pbGxpc2Vjb25kcywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueXRoaW5nCiAgICAgIGNoYW5nZWQuIFRoaXMgbWFrZXMgc3VyZSBub24tbG9jYWwgY2hhbmdlcyBwcm9wYWdhdGUgdGhyb3VnaCB0aGUKICAgICAgZG9jdW1lbnQsIGFuZCB3aWxsIGhlbHAga2VlcCBldmVyeXRoaW5nIGNvbnNpc3RlbnQuIEl0IGRvZXMgYWRkCiAgICAgIGV4dHJhIHByb2Nlc3NpbmcgY29zdCwgZXZlbiBmb3IgYW4gaWRsZSBlZGl0b3IuIERlZmF1bHQgdmFsdWUgaXMKICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+YXV0b01hdGNoUGFyZW5zPC9jb2RlPjwvZHQ+PGRkPldoZW4gPGNvZGU+dHJ1ZTwvY29kZT4sCiAgICAgIHdpbGwgY2F1c2UgcGFyZW5zIHRvIGJlIG1hdGNoZWQgZXZlcnkgdGltZSBhIGtleSBpcyBwcmVzc2VkIG9yCiAgICAgIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgZG9jdW1lbnQuIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KICAgICAgTWlnaHQgYmUgZXhwZW5zaXZlIGZvciBiaWcgZG9jdW1lbnRzLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+bWFya1BhcmVuPC9jb2RlPiwKICAgICAgPGNvZGU+dW5tYXJrUGFyZW48L2NvZGU+PC9kdD48ZGQ+RnVuY3Rpb25zLiBDYW4gYmUgdXNlZCB0bwogICAgICBjdXN0b21pc2UgdGhlIHdheSBicmFja2V0cyBhcmUgbWFya2VkIChhbmQgdW5tYXJrZWQpIHdoZW4KICAgICAgbWF0Y2hlZC4gQm90aCB0YWtlIHRoZSBicmFja2V0J3MgPGNvZGU+U1BBTjwvY29kZT4gbm9kZSBhcyB0aGVpcgogICAgICBmaXJzdCBhcmd1bWVudCwgYW5kIDxjb2RlPm1hcmtQYXJlbjwvY29kZT4gdGFrZXMgYSBzZWNvbmQKICAgICAgYm9vbGVhbiBhcmd1bWVudCBpbmRpY2F0aW5nIHdoZXRoZXIgYSBzdWNjZXNzZnVsIG1hdGNoIHdhcwogICAgICBmb3VuZC4gVGhlIGRlZmF1bHQgaXMgdG8gbWFrZSB0aGUgYnJhY2tldHMgYm9sZCBhbmQgZ3JlZW4gKG9yCiAgICAgIHJlZCwgaWYgbm90IG1hdGNoZWQpLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+c2F2ZUZ1bmN0aW9uPC9jb2RlPjwvZHQ+PGRkPklmIGdpdmVuIGEgZnVuY3Rpb24KICAgICAgdmFsdWUsIHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHVzZXIgcHJlc3NlcwogICAgICBjb250cm9sLXMuIFlvdSBzaG91bGQgYWR2aXNlIHlvdXIgT3BlcmEgdXNlcnMgdG8gdXNlCiAgICAgIGNvbnRyb2wtc2hpZnQtcyBpbnN0ZWFkLCBzaW5jZSBwbGFpbiBjb250cm9sLXMgd2lsbCBicmluZyB1cCB0aGUKICAgICAgJ3NhdmUgcGFnZScgZGlhbG9nLiBEZWZhdWx0cyB0byA8Y29kZT5udWxsPC9jb2RlPi48L2RkPgoKICAgICAgPGR0Pjxjb2RlPnVuZG9EZXB0aDwvY29kZT48L2R0PjxkZD5NYXhpbXVtIGxlbmd0aCBvZiB0aGUgdW5kbwogICAgICBoaXN0b3J5LiBEZWZhdWx0IGlzIDUwLiBUaGlzIHNldHRpbmcgaXMgY2hhbmdlYWJsZSB3aXRoIHRoZQogICAgICA8Y29kZT5zZXRVbmRvRGVwdGgoZGVwdGgpPC9jb2RlPiBtZXRob2Qgb24gQ29kZU1pcnJvcgogICAgICBpbnN0YW5jZXMuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5vbkNoYW5nZTwvY29kZT48L2R0PjxkZD5BbiBvcHRpb25hbCBmdW5jdGlvbiBvZiB6ZXJvCiAgICAgIGFyZ3VtZW50cyB0aGF0IGdldHMgY2FsbGVkIHdoZW5ldmVyIHRoZSBkb2N1bWVudCBpcyBjaGFuZ2VkLgogICAgICBIYXBwZW5zIGF0IHVuZG8tY29tbWl0IHRpbWUsIG5vdCBpbnN0YW50YW5pb3VzbHkuPC9kZD4KCiAgICAgIDxkdD48Y29kZT51bmRvRGVsYXk8L2NvZGU+PC9kdD48ZGQ+V2hlbiBub3RoaW5nIGlzIGRvbmUgaW4gdGhlCiAgICAgIGVkaXRvciBmb3IgdGhpcyBhbW91bnQgb2YgbWlsbGlzZWNvbmRzLCBwZW5kaW5nIGNoYW5nZXMgZ2V0CiAgICAgIGFkZGVkIHRvIHRoZSB1bmRvIGhpc3RvcnkuIFNldHRpbmcgdGhpcyBsb3dlciB3aWxsIGdpdmUgdGhlIHVuZG8KICAgICAgZnVuY3Rpb25hbGl0eSBhIGZpbmVyIGdyYW51bGFyaXR5LiBEZWZhdWx0cyB0byA4MDAuPC9kZD4KCiAgICAgIDxkdD48Y29kZT53aWR0aDwvY29kZT4sIDxjb2RlPmhlaWdodDwvY29kZT48L2R0PjxkZD5UaGUgc2l6ZSBvZgogICAgICB0aGUgZWRpdG9yIGZyYW1lLCBnaXZlbiBhcyBhIHN0eWxlLXNoZWV0IHF1YW50aXRpZXMgKGZvciBleGFtcGxlCiAgICAgIDxjb2RlPiI2MDBweCI8L2NvZGU+IG9yIDxjb2RlPiIxMDAlIjwvY29kZT4pLiBXaGVuCiAgICAgIDxjb2RlPmhlaWdodDwvY29kZT4gaXMgc2V0IHRvIDxjb2RlPmR5bmFtaWM8L2NvZGU+LCB0aGUgZWRpdG9yCiAgICAgIHdpbGwgYXV0b21hdGljYWxseSByZXNpemUgdG8gZml0IGl0cyBjb250ZW50cy4gSW4gdGhpcyBjYXNlLCB0aGUKICAgICAgPGNvZGU+bWluSGVpZ2h0PC9jb2RlPiBvcHRpb24gKGFuIGludGVnZXIpIGlzIHVzZWQgdG8gZGV0ZXJtaW5lCiAgICAgIHRoZSBtaW5pbXVtIGhlaWdodCBpbiBwaXhlbHMuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5kaXNhYmxlU3BlbGxjaGVjazwvY29kZT48L2R0PjxkZD5TaG91bGQgdGhlIGVkaXRvcgogICAgICBkaXNhYmxlIHNwZWxsLWNoZWNraW5nIG9uIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBpdCAoRmlyZWZveCAyKykuCiAgICAgIERlZmF1bHQgaXMgPGNvZGU+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+LAogICAgICB0aGlzIGNhdXNlcyB0aGUgY29udGVudCBvZiB0aGUgZWRpdG9yIHRvIGJlIHJlaW5kZW50ZWQKICAgICAgaW1tZWRpYXRlbHkgd2hlbiB0aGUgZWRpdG9yIGxvYWRzLiBEZWZhdWx0cyB0bwogICAgICA8Y29kZT5mYWxzZTwvY29kZT4uPC9kZD4KCiAgICAgIDxkdD48Y29kZT5yZWFkT25seTwvY29kZT48L2R0PjxkZD5XaGVuIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwKICAgICAgdGhlIGRvY3VtZW50IGlzIG5vdCBlZGl0YWJsZS48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmRvbWFpbjwvY29kZT48L2R0PjxkZD5DYW4gYmUgc2V0IHRvIHRoZSB2YWx1ZQogICAgICA8Y29kZT5kb2N1bWVudC5kb21haW48L2NvZGU+IHNob3VsZCBoYXZlIGluc2lkZSBvZiB0aGUgaWZyYW1lLgogICAgICBVc2VkIHRvIHByZXZlbnQgYWNjZXNzIGlzc3VlcyBpbiBJRSwgd2hlcmUgdGhpcyB2YWx1ZSBpc24ndAogICAgICBhdXRvbWF0aWNhbGx5IGluaGVyaXRlZCBieSBpZnJhbWVzLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+aW5pdENhbGxiYWNrPC9jb2RlPjwvZHQ+PGRkPklmIHNldCB0byBhIGZ1bmN0aW9uLCB0aGlzCiAgICAgIHdpbGwgYmUgY2FsbGVkICh3aXRoIHRoZSBlZGl0b3Igb2JqZWN0IGFzIGl0cyBhcmd1bWVudCkgYWZ0ZXIKICAgICAgdGhlIGVkaXRvciBoYXMgZmluaXNoZWQgaW5pdGlhbGlzaW5nLjwvZGQ+CiAgICAgIAogICAgICA8ZHQ+PGNvZGU+Y3Vyc29yQWN0aXZpdHk8L2NvZGU+PC9kdD48ZGQ+QSBmdW5jdGlvbiB0aGF0IGlzCiAgICAgIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBjdXJzb3IgbW92ZXMsIHdpdGggdGhlIHRvcC1sZXZlbCBub2RlIHRoYXQKICAgICAgdGhlIGN1cnNvciBpcyBpbnNpZGUgb3IgbmV4dCB0byBhcyBhbiBhcmd1bWVudC4gQ2FuIGJlIHVzZWQgdG8KICAgICAgaGF2ZSBzb21lIGNvbnRyb2xzIHJlYWN0IHRvIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJzb3IuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5hY3RpdmVUb2tlbnM8L2NvZGU+PC9kdD48ZGQ+Q2FuIGJlIHNldCB0byBhIGZ1bmN0aW9uCiAgICAgIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCA8Y29kZT4oc3Bhbk5vZGUsIHRva2VuT2JqZWN0LAogICAgICBlZGl0b3IpPC9jb2RlPiBhcmd1bWVudHMgd2hlbmV2ZXIgYSBuZXcgdG9rZW4gbm9kZSBpcyBiZWluZwogICAgICBhZGRlZCB0byB0aGUgZG9jdW1lbnQuIENhbiBiZSB1c2VkIHRvIGRvIHRoaW5ncyBsaWtlIGFkZCBldmVudAogICAgICBoYW5kbGVycyB0byBub2Rlcy4gU2hvdWxkIDxlbT5ub3Q8L2VtPiBjaGFuZ2UgdGhlIERPTSBzdHJ1Y3R1cmUKICAgICAgb2YgdGhlIG5vZGUgKHNvIG5vIHR1cm5pbmcgdGhlIHNwYW4gaW50byBhIGxpbmspLCBzaW5jZSB0aGlzCiAgICAgIHdpbGwgZ3JlYXRseSBjb25mdXNlIHRoZSBlZGl0b3IuPC9kZD4KCiAgICAgIDxkdCBpZD0icGFyc2VyQ29uZmlnIj48Y29kZT5wYXJzZXJDb25maWc8L2NvZGU+PC9kdD48ZGQ+QW4KICAgICAgb2JqZWN0IHZhbHVlIHRoYXQgaXMgcGFzc2VkIGFsb25nIHRvIHRoZSBwYXJzZXIgdG8gY29uZmlndXJlIGl0LgogICAgICBXaGF0IHRoaXMgb2JqZWN0IHNob3VsZCBsb29rIGxpa2UgZGVwZW5kcyBvbiB0aGUgcGFyc2VyCiAgICAgIHVzZWQuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5jb250ZW50PC9jb2RlPjwvZHQ+PGRkPlRoZSBzdGFydGluZyBjb250ZW50IG9mIHRoZQogICAgICBlZGl0b3IuIFlvdSdsbCBwcm9iYWJseSBub3Qgd2FudCB0byBwcm92aWRlIGEgZ2xvYmFsIGRlZmF1bHQgZm9yCiAgICAgIHRoaXMsIGJ1dCBhZGQgaXQgdG8gdGhlIDxjb2RlPm9wdGlvbnM8L2NvZGU+IG9iamVjdCBwYXNzZWQgdG8KICAgICAgaW5kaXZpZHVhbCBlZGl0b3JzIGFzIHRoZXkgYXJlIGNyZWF0ZWQuPC9kZD4KCiAgICA8L2RsPgoKICAgIDxoMiBpZD0icGFyc2VycyI+UGFyc2VyczwvaDI+CgogICAgPHA+KElmIHlvdSB3YW50IHRvIHVzZSBhIENvZGVNaXJyb3IgcGFyc2VyIHRvIGhpZ2hsaWdodCBhIHBpZWNlIG9mCiAgICB0ZXh0LCB3aXRob3V0IGNyZWF0aW5nIGFuIGVkaXRvciwgc2VlIDxhCiAgICBocmVmPSJoaWdobGlnaHQuaHRtbCI+dGhpcyBleGFtcGxlPC9hPiwgYW5kIHRoZSA8Y29kZT48YQogICAgaHJlZj0ianMvaGlnaGxpZ2h0LmpzIj5oaWdobGlnaHQuanM8L2E+PC9jb2RlPiBzY3JpcHQuKTwvcD4KCiAgICA8cD5UaGUgZm9sbG93aW5nIHBhcnNlcnMgY29tZSB3aXRoIHRoZSBkaXN0cmlidXRpb24gb2YgQ29kZU1pcnJvcjo8L3A+CgogICAgPGRsPgogICAgICA8ZHQ+PGNvZGU+PGEgaHJlZj0ianMvcGFyc2V4bWwuanMiPnBhcnNleG1sLmpzPC9hPjwvY29kZT4gKDxhCiAgICAgIGhyZWY9Imh0bWx0ZXN0Lmh0bWwiPmRlbW88L2E+KTwvZHQ+PGRkPkEgSFRNTC9YTUwgcGFyc2VyLiBUYWtlcwogICAgICBhIDxjb2RlPnVzZUhUTUxLbHVkZ2VzPC9jb2RlPiBjb25maWd1cmF0aW9uIG9wdGlvbiAoc2VlIHRoZQogICAgICA8Y29kZT48YSBocmVmPSIjcGFyc2VyQ29uZmlnIj5wYXJzZXJDb25maWc8L2E+PC9jb2RlPiBvcHRpb24KICAgICAgYWJvdmUpLCB3aGljaCBzcGVjaWZpZXMgd2hldGhlciB0aGUgY29udGVudCBvZiB0aGUgZWRpdG9yIGlzCiAgICAgIEhUTUwgb3IgWE1MLCBhbmQgdGhpbmdzIGxpa2Ugc2VsZi1jbG9zaW5nIHRhZ3MgKDxjb2RlPmJyPC9jb2RlPiwKICAgICAgPGNvZGU+aW1nPC9jb2RlPikgZXhpc3QuIFRoaXMgZGVmYXVsdHMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCiAgICAgIEV4YW1wbGUgY29sb3VycyBmb3IgdGhlIHN0eWxlcyB0aGF0IHRoaXMgcGFyc2VyIHVzZXMgYXJlIGRlZmluZWQKICAgICAgaW4gPGNvZGU+PGEKICAgICAgaHJlZj0iY3NzL3htbGNvbG9ycy5jc3MiPmNzcy94bWxjb2xvcnMuY3NzPC9hPjwvY29kZT4uPC9kZD4KCiAgICAgIDxkdD48Y29kZT48YQogICAgICBocmVmPSJqcy90b2tlbml6ZWphdmFzY3JpcHQuanMiPnRva2VuaXplamF2YXNjcmlwdC5qczwvYT48L2NvZGU+LAogICAgICA8Y29kZT48YQogICAgICBocmVmPSJqcy9wYXJzZWphdmFzY3JpcHQuanMiPnBhcnNlZWphdmFzY3JpcHQuanM8L2E+PC9jb2RlPiAoPGEKICAgICAgaHJlZj0ianN0ZXN0Lmh0bWwiPmRlbW88L2E+KTwvZHQ+PGRkPlRoZSBKYXZhU2NyaXB0IHBhcnNlci4KICAgICAgRXhhbXBsZSBjb2xvdXJzIGluIDxjb2RlPjxhCiAgICAgIGhyZWY9ImNzcy9qc2NvbG9ycy5jc3MiPmNzcy9qc2NvbG9ycy5jc3M8L2E+PC9jb2RlPi4gVGFrZXMgb25lCiAgICAgIGNvbmZpZ3VyYXRpb24gb3B0aW9uLCA8Y29kZT5qc29uPC9jb2RlPiwgdGhhdCBjYW4gYmUgc2V0IHdoZW4KICAgICAgdGhlIGVkaXRvciBjb250ZW50IGlzIEpTT04gZGF0YS4gSXQgY2F1c2VzIGV2ZXJ5IG9wZW5pbmcgYnJhY2UKICAgICAgdG8gYmUgdHJlYXRlZCBhcyB0aGUgc3RhcnQgb2YgYW4gb2JqZWN0LCByYXRoZXIgdGhhbiBhCiAgICAgIGJsb2NrLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+PGEgaHJlZj0ianMvcGFyc2Vjc3MuanMiPnBhcnNlY3NzLmpzPC9hPjwvY29kZT4gKDxhCiAgICAgIGhyZWY9ImNzc3Rlc3QuaHRtbCI+ZGVtbzwvYT4pPC9kdD48ZGQ+QSBDU1MgcGFyc2VyLiBTdHlsZXMgaW4KICAgICAgPGNvZGU+PGEKICAgICAgaHJlZj0iY3NzL2Nzc2NvbG9ycy5jc3MiPmNzcy9jc3Njb2xvcnMuY3NzPC9hPjwvY29kZT48L2RkPgoKICAgICAgPGR0Pjxjb2RlPjxhCiAgICAgIGhyZWY9ImpzL3BhcnNlaHRtbG1peGVkLmpzIj5wYXJzZWh0bWxtaXhlZC5qczwvYT48L2NvZGU+ICg8YQogICAgICBocmVmPSJtaXhlZHRlc3QuaHRtbCI+ZGVtbzwvYT4pPC9kdD48ZGQ+QSBtaXhlZC1tb2RlIEhUTUwKICAgICAgcGFyc2VyLiBSZXF1aXJlcyB0aGUgWE1MLCBKYXZhU2NyaXB0LCBhbmQgQ1NTIHBhcnNlcnMgdG8gYWxzbyBiZQogICAgICBsb2FkZWQsIHNvIHlvdXIgPGNvZGU+cGFyc2VyZmlsZTwvY29kZT4gb3B0aW9uIGxvb2tzIHNvbWV0aGluZwogICAgICBsaWtlIDxjb2RlPlsicGFyc2V4bWwuanMiLCAicGFyc2Vjc3MuanMiLAogICAgICAidG9rZW5pemVqYXZhc2NyaXB0LmpzIiwgInBhcnNlamF2YXNjcmlwdC5qcyIsCiAgICAgICJwYXJzZWh0bWxtaXhlZC5qcyJdPC9jb2RlPi48L2RkPgoKICAgICAgPGR0Pjxjb2RlPjxhIGhyZWY9ImpzL3BhcnNlc3BhcnFsLmpzIj5wYXJzZXNwYXJxbC5qczwvYT48L2NvZGU+CiAgICAgICg8YSBocmVmPSJzcGFycWx0ZXN0Lmh0bWwiPmRlbW88L2E+KTwvZHQ+PGRkPlBhcnNlcyB0aGUgPGEKICAgICAgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TUEFSUUwiPlNQQVJRTDwvYT4gcXVlcnkKICAgICAgbGFuZ3VhZ2UuIEV4YW1wbGUgc3R5bGVzIGluIDxjb2RlPjxhCiAgICAgIGhyZWY9ImNzcy9zcGFycWxjb2xvcnMuY3NzIj5jc3Mvc3BhcnFsY29sb3JzLmNzczwvYT48L2NvZGU+PC9kZD4KCiAgICAgIDxkdD48Y29kZT48YQogICAgICBocmVmPSJqcy9wYXJzZWR1bW15LmpzIj5wYXJzZWR1bW15LmpzPC9hPjwvY29kZT48L2R0PjxkZD5BCiAgICAgICdkdW1teScgcGFyc2VyIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gZWRpdCBwbGFpbiB0ZXh0LCBvcgogICAgICBkb2N1bWVudHMgZm9yIHdoaWNoIG5vIHN1aXRhYmxlIHBhcnNlciBleGlzdHMuPC9kZD4KCiAgICAgIDxkdD48Y29kZT48YQogICAgICBocmVmPSJjb250cmliL3BocC9qcy9wYXJzZXBocC5qcyI+Y29udHJpYi9waHAvanMvcGFyc2VwaHAuanM8L2E+PC9jb2RlPgogICAgICAoPGEgaHJlZj0iY29udHJpYi9waHAvaW5kZXguaHRtbCI+ZGVtbzwvYT4pPC9kdD48ZGQ+UEhQIHBhcnNlci4KICAgICAgVGhlcmUgaXMgYWxzbyA8Y29kZT48YQogICAgICBocmVmPSJjb250cmliL3BocC9qcy9wYXJzZXBocGh0bWxtaXhlZC5qcyI+Y29udHJpYi9waHAvanMvcGFyc2VwaHBodG1sbWl4ZWQuanM8L2E+PC9jb2RlPiwKICAgICAgd2hpY2ggd3JhcHMgdGhpcyBwYXJzZXIgdG8gYWxsb3cgbWl4ZWQtbW9kZSBIVE1MICsgUEhQIHBhcnNpbmcuCiAgICAgIFRoaXMgb25lIHRha2VzIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgPGNvZGU+b3BlbmluZzwvY29kZT4sCiAgICAgIHdoaWNoIHNob3VsZCBjb250YWluIGFuIGFycmF5IG9mIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uCiAgICAgIG9wZW5pbmdzICg8Y29kZT4mbHQ7P3BocDwvY29kZT4sIDxjb2RlPiZsdDs/PC9jb2RlPiBldGMpIHdoaWNoCiAgICAgIGNhbiBiZSB1c2VkIHRvIG9wZW4gYSBQSFAgYmxvY2suIERlZmF1bHQgaXMKICAgICAgPGNvZGU+WyImbHQ7P3BocCJdPC9jb2RlPi48L2RkPgoKICAgICAgPGR0Pjxjb2RlPjxhCiAgICAgIGhyZWY9ImNvbnRyaWIvcHl0aG9uL2pzL3BhcnNlcHl0aG9uLmpzIj5jb250cmliL3B5dGhvbi9qcy9wYXJzZXB5dGhvbi5qczwvYT48L2NvZGU+CiAgICAgICg8YSBocmVmPSJjb250cmliL3B5dGhvbi9pbmRleC5odG1sIj5kZW1vPC9hPik8L2R0PjxkZD5QeXRob24KICAgICAgcGFyc2VyLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+PGEgaHJlZj0iY29udHJpYi9sdWEvanMvcGFyc2VsdWEuanMiPmNvbnRyaWIvbHVhL2pzL3BhcnNlbHVhLmpzPC9hPjwvY29kZT4KICAgICAgKDxhIGhyZWY9ImNvbnRyaWIvbHVhL2luZGV4Lmh0bWwiPmRlbW88L2E+KTwvZHQ+PGRkPkx1YQogICAgICBwYXJzZXIuPC9kZD4KCiAgICA8L2RsPgoKICAgIDxoMiBpZD0icHJvZ3JhbW1pbmciPlByb2dyYW1taW5nIEludGVyZmFjZTwvaDI+CgogICAgPHA+VG8gYmUgYXMgZmxleGlibGUgYXMgcG9zc2libGUsIENvZGVNaXJyb3IgaW1wbGVtZW50cyBhIHZlcnkKICAgIHBsYWluIGVkaXRhYmxlIGZpZWxkLCB3aXRob3V0IGFueSBhY2NvbXBhbnlpbmcgYnV0dG9ucywgYmVsbHMsIGFuZAogICAgd2hpc3RsZXMuIDxjb2RlPkNvZGVNaXJyb3I8L2NvZGU+IG9iamVjdHMgZG8sIGhvd2V2ZXIsIHByb3ZpZGUgYQogICAgbnVtYmVyIG9mIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgdGhhdCBtYWtlIGl0IHBvc3NpYmxlIHRvIGFkZAogICAgZXh0cmEgZnVuY3Rpb25hbGl0eSBhcm91bmQgdGhlIGVkaXRvci4gPGEKICAgIGhyZWY9ImpzL21pcnJvcmZyYW1lLmpzIj48Y29kZT5taXJyb3JmcmFtZS5qczwvY29kZT48L2E+IHByb3ZpZGVzCiAgICBhIGJhc2ljIGV4YW1wbGUgb2YgdGhlaXIgdXNhZ2UuPC9wPgoKICAgIDxoMz5Qcm9wZXJ0aWVzPC9oMz4KCiAgICA8ZGw+CiAgICAgIDxkdD48Y29kZT5mcmFtZTwvY29kZT48L2R0PjxkZD5UaGUgZWRpdGFibGUgZnJhbWUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPndpbjwvY29kZT48L2R0PjxkZD5UaGUgd2luZG93IG9mIHRoZSBlZGl0YWJsZSBmcmFtZS4KICAgICAgTW9zdGx5IHVzZWZ1bCBmb3IgYXR0YWNoaW5nIGV2ZW50IGhhbmRsZXJzLjwvZGQ+CiAgICAgIDxkdD48Y29kZT53cmFwcGluZzwvY29kZT48L2R0PjxkZD5UaGUgPGNvZGU+RElWPC9jb2RlPiBlbGVtZW50CiAgICAgIHdyYXBwZWQgYXJvdW5kIHRoZSBmcmFtZS4gVGhpcyBhbHdheXMgaGFzIGEgQ1NTIGNsYXNzIG9mCiAgICAgIDxjb2RlPkNvZGVNaXJyb3Itd3JhcHBpbmc8L2NvZGU+LjwvZGQ+CiAgICA8L2RsPgoKICAgIDxoMz5NZXRob2RzPC9oMz4KCiAgICA8ZGw+CiAgICAgIDxkdD48Y29kZT5nZXRDb2RlKCk8L2NvZGU+ICYjODU5NDsKICAgICAgPGNvZGU+c3RyaW5nPC9jb2RlPjwvZHQ+PGRkPlJldHVybnMgdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUKICAgICAgZWRpdG9yLCBhcyBhIHN0cmluZy48L2RkPgoKICAgICAgPGR0Pjxjb2RlPnNldENvZGUoc3RyaW5nKTwvY29kZT48L2R0PjxkZD5SZXBsYWNlcyB0aGUgY3VycmVudAogICAgICBjb250ZW50IG9mIHRoZSBlZGl0b3Igd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5mb2N1cygpPC9jb2RlPjwvZHQ+PGRkPkdpdmVzIGZvY3VzIHRvIHRoZSBlZGl0b3IKICAgICAgZnJhbWUuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5zZWxlY3Rpb24oKTwvY29kZT4gJiM4NTk0OwogICAgICA8Y29kZT5zdHJpbmc8L2NvZGU+PC9kdD48ZGQ+UmV0dXJucyB0aGUgdGV4dCB0aGF0IGlzIGN1cnJlbnRseQogICAgICBzZWxlY3RlZCBpbiB0aGUgZWRpdG9yLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+cmVwbGFjZVNlbGVjdGlvbihzdHJpbmcpPC9jb2RlPjwvZHQ+PGRkPlJlcGxhY2VzIHRoZQogICAgICBjdXJyZW50bHkgc2VsZWN0ZWQgdGV4dCB3aXRoIHRoZSBnaXZlbiBzdHJpbmcuIFdpbGwgYWxzbyBjYXVzZQogICAgICB0aGUgZWRpdG9yIGZyYW1lIHRvIGdhaW4gZm9jdXMuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5yZWluZGVudCgpPC9jb2RlPjwvZHQ+PGRkPkF1dG9tYXRpY2FsbHkgcmUtaW5kZW50IHRoZQogICAgICB3aG9sZSBkb2N1bWVudC48L2RkPgoKICAgICAgPGR0Pjxjb2RlPnJlaW5kZW50U2VsZWN0aW9uKCk8L2NvZGU+PC9kdD48ZGQ+QXV0b21hdGljYWxseQogICAgICByZS1pbmRlbnQgdGhlIHNlbGVjdGVkIGxpbmVzLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+Z2V0U2VhcmNoQ3Vyc29yKHN0cmluZywgYXRDdXJzb3IsIGNhc2VGb2xkKTwvY29kZT4KICAgICAgJiM4NTk0OyA8Y29kZT5jdXJzb3I8L2NvZGU+PC9kdD48ZGQ+VGhlIGZpcnN0IGFyZ3VtZW50IGluZGljYXRlcwogICAgICB0aGUgc3RyaW5nIHRoYXQgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciwgYW5kIHRoZSBzZWNvbmQgaW5kaWNhdGVzCiAgICAgIHdoZXRoZXIgc2VhcmNoaW5nIHNob3VsZCBzdGFydCBhdCB0aGUgY3Vyc29yICg8Y29kZT50cnVlPC9jb2RlPikKICAgICAgb3IgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudCAoPGNvZGU+ZmFsc2U8L2NvZGU+KS4gV2hlbgogICAgICA8Y29kZT5jYXNlRm9sZDwvY29kZT4gaXMgdHJ1ZSwgdGhlIHNlYXJjaCB3aWxsIGJlCiAgICAgIGNhc2UtaW5zZW5zaXRpdmU7IGlmIDxjb2RlPmNhc2VGb2xkPC9jb2RlPiBpcyB1bnNwZWNpZmllZCwgdGhlCiAgICAgIHNlYXJjaCB3aWxsIGJlIGNhc2Utc2Vuc2l0aXZlIGlmIHRoZSBzZWFyY2ggc3RyaW5nIGNvbnRhaW5zCiAgICAgIHVwcGVyY2FzZSBjaGFyYWN0ZXJzLiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFuIGludGVyZmFjZQogICAgICBmb3Igc2VhcmNoaW5nLiBDYWxsIGl0cyA8Y29kZT5maW5kTmV4dCgpPC9jb2RlPiBtZXRob2QgdG8gc2VhcmNoCiAgICAgIGZvciBhbiBvY2N1cnJlbmNlIG9mIHRoZSBnaXZlbiBzdHJpbmcuIFRoaXMgcmV0dXJucwogICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiBzb21ldGhpbmcgaXMgZm91bmQsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPgogICAgICBpZiB0aGUgZW5kIG9mIGRvY3VtZW50IGlzIHJlYWNoZWQuIFdoZW4gYW4gb2NjdXJyZW5jZSBoYXMgYmVlbgogICAgICBmb3VuZCwgeW91IGNhbiBjYWxsIDxjb2RlPnNlbGVjdCgpPC9jb2RlPiB0byBzZWxlY3QgaXQsIG9yCiAgICAgIDxjb2RlPnJlcGxhY2Uoc3RyaW5nKTwvY29kZT4gdG8gcmVwbGFjZSBpdCB3aXRoIGEgZ2l2ZW4gc3RyaW5nLgogICAgICBOb3RlIHRoYXQgbGV0dGluZyB0aGUgdXNlciBjaGFuZ2UgdGhlIGRvY3VtZW50LCBvcgogICAgICBwcm9ncmFtbWF0aWNhbGx5IGNoYW5naW5nIGl0IGluIGFueSB3YXkgZXhjZXB0IGZvciBjYWxsaW5nCiAgICAgIDxjb2RlPnJlcGxhY2U8L2NvZGU+IG9uIHRoZSBjdXJzb3IgaXRzZWxmLCBtaWdodCBjYXVzZSBhIGN1cnNvcgogICAgICBvYmplY3QgdG8gc2tpcCBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+dW5kbygpPC9jb2RlPjwvZHQ+PGRkPlVuZG8gb25lIGNoYW5nZXNldCwgaWYgYXZhaWxhYmxlLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5yZWRvKCk8L2NvZGU+PC9kdD48ZGQ+UmVkbyBvbmUgY2hhbmdlc2V0LCBpZiBhdmFpbGFibGUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPmhpc3RvcnlTaXplKCkgJiM4NTk0OyBvYmplY3Q8L2NvZGU+PC9kdD48ZGQ+R2V0IGEKICAgICAgPGNvZGU+e3VuZG8sIHJlZG99PC9jb2RlPiBvYmplY3QgaG9sZGluZyB0aGUgc2l6ZXMgb2YgdGhlIHVuZG8KICAgICAgYW5kIHJlZG8gaGlzdG9yaWVzLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5jbGVhckhpc3RvcnkoKTwvY29kZT48L2R0PjxkZD5Ecm9wIGFsbCBoaXN0b3J5CiAgICAgIGluZm9ybWF0aW9uLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+Z3JhYktleXMoY2FsbGJhY2ssIGZpbHRlcik8L2NvZGU+PC9kdD48ZGQ+Um91dGUKICAgICAga2V5Ym9hcmQgaW5wdXQgaW4gdGhlIGVkaXRvciB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uLiBUaGlzCiAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGEgc2xpZ2h0bHkgbm9ybWFsaXNlZCAoc2VlCiAgICAgIDxjb2RlPm5vcm1hbGl6ZUV2ZW50PC9jb2RlPiBpbiA8YQogICAgICBocmVmPSJqcy91dGlsLmpzIj48Y29kZT51dGlsLmpzPC9jb2RlPjwvYT4pIDxjb2RlPmtleWRvd248L2NvZGU+CiAgICAgIGV2ZW50IG9iamVjdC4gSWYgYSBzZWNvbmQgYXJndW1lbnQgaXMgZ2l2ZW4sIHRoaXMgd2lsbCBiZSB1c2VkCiAgICAgIHRvIGRldGVybWluZSB3aGljaCBldmVudHMgdG8gYXBwbHkgdGhlIGNhbGxiYWNrIHRvLiBJdCBzaG91bGQKICAgICAgdGFrZSBhIGtleSBjb2RlIChhcyBpbiA8Y29kZT5ldmVudC5rZXlDb2RlPC9jb2RlPiksIGFuZCByZXR1cm4gYQogICAgICBib29sZWFuLCB3aGVyZSA8Y29kZT50cnVlPC9jb2RlPiBtZWFucyB0aGUgZXZlbnQgc2hvdWxkIGJlCiAgICAgIHJvdXRlZCB0byB0aGUgY2FsbGJhY2ssIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gbGVhdmVzIHRoZSBrZXkgdG8KICAgICAgcGVyZm9ybSBpdHMgbm9ybWFsIGJlaGF2aW91ci48L2RkPgogICAgICA8ZHQ+PGNvZGU+dW5ncmFiS2V5cygpPC9jb2RlPjwvZHQ+PGRkPlJldmVydCB0aGUgZWZmZWN0IG9mCiAgICAgIDxjb2RlPmdyYWJLZXlzPC9jb2RlPi48L2RkPgoKICAgICAgPGR0Pjxjb2RlPnNldFBhcnNlcihuYW1lLCBwYXJzZXJDb25maWcpPC9jb2RlPjwvZHQ+PGRkPkNoYW5nZQogICAgICB0aGUgYWN0aXZlIHBhcnNlci4gVG8gdXNlIHRoaXMgeW91J2xsIGhhdmUgdG8gbG9hZCBtb3JlIHRoYW4gb25lCiAgICAgIHBhcnNlciAocHV0IHRoZSBvbmUgeW91IHdhbnQgdG8gdXNlIGFzIGRlZmF1bHQgYXQgdGhlIGVuZCBvZiB0aGUKICAgICAgbGlzdCkuIFRoZW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZQogICAgICBvZiB0aGUgcGFyc2VyIHlvdSB3YW50IHRvIHN3aXRjaCB0byAoc2VlIHRoZSBwYXJzZXIgc2NyaXB0IGZpbGUKICAgICAgdG8gZmluZCB0aGUgbmFtZSwgaXQnbGwgYmUgc29tZXRoaW5nIGxpa2UKICAgICAgPGNvZGU+Q1NTUGFyc2VyPC9jb2RlPikuIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZAogICAgICBjYW4gYmUgdXNlZCB0byBwYXNzIGEgbmV3IHBhcnNlciBjb25maWd1cmF0aW9uIG9iamVjdC48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmN1cnNvckNvb3JkcyhzdGFydCk8L2NvZGU+PC9kdD48ZGQ+R2V0IHRoZSBjb29yZGluYXRlcwogICAgICBvZiB0aGUgY3Vyc29yIGluIHRoZSBlZGl0b3IsIHJlbGF0aXZlIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YKICAgICAgdGhlIG91dGVyIGRvY3VtZW50LiBOb3JtYWxseSByZXR1cm5zIGFuIG9iamVjdCB3aXRoCiAgICAgIDxjb2RlPng8L2NvZGU+LCA8Y29kZT55PC9jb2RlPiwgYW5kIDxjb2RlPnlCb3Q8L2NvZGU+ICh0aGUKICAgICAgYm90dG9tIG9mIHRoZSBjdXJzb3IpIHByb3BlcnRpZXMuIE1heSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KICAgICAgaWYgdGhlIGN1cnNvciBwb3NpdGlvbiBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCAoZm9yIGV4YW1wbGUsIGlmCiAgICAgIHRoZSBlZGl0b3IgaXMgbm90IGZvY3VzZWQpLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxwPkZvciBkZXRhaWxlZCBpbnRlcmFjdGlvbiB3aXRoIHRoZSBjb250ZW50IG9mIHRoZSBlZGl0b3IsCiAgICBDb2RlTWlycm9yIGV4cG9zZXMgYSBsaW5lLW9yaWVudGVkIGludGVyZmFjZSwgd2hpY2ggYWxsb3dzIHlvdSB0bwogICAgaW5zcGVjdCBhbmQgbWFuaXB1bGF0ZSB0aGUgZG9jdW1lbnQgbGluZSBieSBsaW5lLiBMaW5lIGhhbmRsZXMKICAgIHNob3VsZCBiZSBjb25zaWRlcmVkIG9wYXF1ZSAodGhleSBhcmUgaW4gZmFjdCB0aGUgPGNvZGU+QlI8L2NvZGU+CiAgICBub2RlcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUpLCBleGNlcHQgdGhhdCB0aGUgdmFsdWUKICAgIDxjb2RlPmZhbHNlPC9jb2RlPiAoYnV0IDxlbT5ub3Q8L2VtPiA8Y29kZT5udWxsPC9jb2RlPikgYWx3YXlzCiAgICBkZW5vdGVzIGFuIGludmFsaWQgdmFsdWUuIFNpbmNlIGNoYW5naW5nIHRoZSBkb2N1bWVudCBtaWdodCBjYXVzZQogICAgc29tZSBsaW5lIGhhbmRsZXMgdG8gYmVjb21lIGludmFsaWQsIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgdGFrZXMKICAgIHRoZW0gYXMgYXJndW1lbnQgY2FuIHRocm93CiAgICA8Y29kZT5Db2RlTWlycm9yLkludmFsaWRMaW5lSGFuZGxlPC9jb2RlPi4gVGhlc2UgYXJlIHRoZSByZWxldmFudAogICAgbWV0aG9kczo8L3A+CgogICAgPGRsPgogICAgICA8ZHQ+PGNvZGU+Y3Vyc29yUG9zaXRpb24oc3RhcnQpPC9jb2RlPiAmIzg1OTQ7CiAgICAgIDxjb2RlPm9iamVjdDwvY29kZT48L2R0PjxkZD5SZXRyaWV2ZSBhIDxjb2RlPntsaW5lLAogICAgICBjaGFyYWN0ZXJ9PC9jb2RlPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjdXJzb3IgcG9zaXRpb24uCiAgICAgIDxjb2RlPnN0YXJ0PC9jb2RlPiBkZWZhdWx0cyB0byA8Y29kZT50cnVlPC9jb2RlPiBhbmQgZGV0ZXJtaW5lcwogICAgICBpZiB0aGUgc3RhcnRwb2ludCBvciB0aGUgZW5kcG9pbnQgb2YgdGhlIHNlbGVjdGlvbiBpcyB1c2VkLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5jdXJzb3JMaW5lKCk8L2NvZGU+ICYjODU5NDsKICAgICAgPGNvZGU+aGFuZGxlPC9jb2RlPjwvZHQ+PGRkPlJldHVybnMgdGhlIGxpbmUgb24gd2hpY2ggdGhlIGN1cnNvcgogICAgICBpcyBjdXJyZW50bHkgc2l0dGluZy48L2RkPgogICAgICA8ZHQ+PGNvZGU+Zmlyc3RMaW5lKCk8L2NvZGU+ICYjODU5NDsKICAgICAgPGNvZGU+aGFuZGxlPC9jb2RlPjwvZHQ+PGRkPkdldCB0aGUgZmlyc3QgbGluZSBvZiB0aGUKICAgICAgZG9jdW1lbnQuPC9kZD4KICAgICAgPGR0Pjxjb2RlPmxhc3RMaW5lKCk8L2NvZGU+ICYjODU5NDsKICAgICAgPGNvZGU+aGFuZGxlPC9jb2RlPjwvZHQ+PGRkPlRoZSBsYXN0IGxpbmUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPm5leHRMaW5lKGhhbmRsZSk8L2NvZGU+ICYjODU5NDsKICAgICAgPGNvZGU+aGFuZGxlPC9jb2RlPjwvZHQ+PGRkPkdldCB0aGUgbGluZSBhZnRlciB0aGUgZ2l2ZW4gb25lLCBvcgogICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhhdCB3YXMgdGhlIGxhc3QgbGluZS48L2RkPgogICAgICA8ZHQ+PGNvZGU+cHJldkxpbmUoaGFuZGxlKTwvY29kZT4gJiM4NTk0OwogICAgICA8Y29kZT5oYW5kbGU8L2NvZGU+PC9kdD48ZGQ+RmluZCB0aGUgbGluZSBiZWZvcmUgdGhlIGdpdmVuIG9uZSwKICAgICAgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGF0IHdhcyB0aGUgZmlyc3QgbGluZS48L2RkPgogICAgICA8ZHQ+PGNvZGU+bnRoTGluZShudW1iZXIpPC9jb2RlPiAmIzg1OTQ7CiAgICAgIDxjb2RlPmhhbmRsZTwvY29kZT48L2R0PjxkZD5GaW5kIHRoZSBOdGggbGluZSBvZiB0aGUgZG9jdW1lbnQuCiAgICAgIE5vdGUgdGhhdCB0aGUgZmlyc3QgbGluZSBjb3VudHMgYXMgb25lLCBub3QgemVyby4gUmV0dXJucwogICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3VjaCBsaW5lLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5saW5lQ29udGVudChoYW5kbGUpPC9jb2RlPiAmIzg1OTQ7CiAgICAgIDxjb2RlPnN0cmluZzwvY29kZT48L2R0PjxkZD5SZXRyaWV2ZSB0aGUgY29udGVudCBvZiB0aGUKICAgICAgbGluZS48L2RkPgogICAgICA8ZHQ+PGNvZGU+c2V0TGluZUNvbnRlbnQoaGFuZGxlLCBzdHJpbmcpPC9jb2RlPjwvZHQ+PGRkPlJlcGxhY2UKICAgICAgdGhlIGNvbnRlbnQgb2YgdGhlIGxpbmUgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5yZW1vdmVMaW5lKGhhbmRsZSk8L2NvZGU+PC9kdD48ZGQ+UmVtb3ZlIHRoZSBnaXZlbgogICAgICBsaW5lIGZyb20gdGhlIGVkaXRvci4gVGhlIGhhbmRsZSB3aWxsIHN0YXkgdmFsaWQgYWZ0ZXIgdGhpcwogICAgICBvcGVyYXRpb24sIGFuZCBub3cgcmVmZXJzIHRvIHRoZSBuZXh0IGxpbmUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPmxpbmVOdW1iZXIoaGFuZGxlKTwvY29kZT4gJiM4NTk0OwogICAgICA8Y29kZT5udW1iZXI8L2NvZGU+PC9kdD48ZGQ+QXNrIHdoaWNoIGxpbmUgb2YgdGhlIGRvY3VtZW50CiAgICAgICgxLWJhc2VkKSB0aGUgZ2l2ZW4gbGluZSBpcy48L2RkPgogICAgICA8ZHQ+PGNvZGU+anVtcFRvTGluZShoYW5kbGUpPC9jb2RlPjwvZHQ+PGRkPk1vdmVzIHRoZSBjdXJzb3IgdG8KICAgICAgdGhlIHN0YXJ0IG9mIHRoZSBnaXZlbiBsaW5lLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5zZWxlY3RMaW5lcyhzdGFydEhhbmRsZSwgc3RhcnRPZmZzZXQsCiAgICAgIGVuZEhhbmRsZSwgZW5kT2Zmc2V0KTwvY29kZT48L2R0PjxkZD5Nb3ZlIHRoZSBzZWxlY3Rpb24gdG8gYQogICAgICBzcGVjaWZpYyBwb2ludC4gPGNvZGU+ZW5kSGFuZGxlPC9jb2RlPiBhbmQKICAgICAgPGNvZGU+ZW5kT2Zmc2V0PC9jb2RlPiBjYW4gYmUgb21pdHRlZCB0byBqdXN0IHBsYWNlIHRoZSBjdXJzb3IKICAgICAgc29tZXdoZXJlIHdpdGhvdXQgc2VsZWN0aW5nIGFueSB0ZXh0LjwvZGQ+CiAgICAgIDxkdD48Y29kZT5pbnNlcnRJbnRvTGluZShoYW5kbGUsIHBvc2l0aW9uLAogICAgICB0ZXh0KTwvY29kZT48L2R0PjxkZD5JbnNlcnQgYSBwaWVjZSBvZiB0ZXh0IGludG8gYSBsaW5lLgogICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT4gY2FuIGJlIGFuIGludGVnZXIsIHNwZWNpZnlpbmcgdGhlIHBvc2l0aW9uCiAgICAgIGluIHRoZSBsaW5lIHdoZXJlIHRoZSB0ZXh0IHNob3VsZCBiZSBpbnNlcnRlZCwgb3IgdGhlIHN0cmluZwogICAgICA8Y29kZT4iZW5kIjwvY29kZT4sIGZvciB0aGUgZW5kIG9mIHRoZSBsaW5lLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxoMiBpZD0id3JpdGVwYXJzZXIiPldyaXRpbmcgYSBQYXJzZXI8L2gyPgoKICAgIDxwPkEgcGFyc2VyIGlzIGltcGxlbWVudGVkIGJ5IG9uZSBvciBtb3JlIGZpbGVzIChzZWUKICAgIDxjb2RlPnBhcnNlcmZpbGU8L2NvZGU+IGFib3ZlKSB3aGljaCwgd2hlbiBsb2FkZWQsIGFkZCBhCiAgICA8Y29kZT5QYXJzZXI8L2NvZGU+IHByb3BlcnR5IHRvIHRoZSA8Y29kZT5FZGl0b3I8L2NvZGU+IG9iamVjdAogICAgZGVmaW5lZCBieSA8YSBocmVmPSJqcy9lZGl0b3IuanMiPjxjb2RlPmVkaXRvci5qczwvY29kZT48L2E+LiBUaGlzCiAgICBvYmplY3QgbXVzdCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlOjwvcD4KCiAgICA8ZGw+CgogICAgICA8ZHQ+PGNvZGU+bWFrZShzdHJlYW0pPC9jb2RlPjwvZHQ+PGRkPkEgZnVuY3Rpb24gdGhhdCwgZ2l2ZW4gYQogICAgICBzdHJpbmcgc3RyZWFtIChzZWUgPGEKICAgICAgaHJlZj0ianMvc3RyaW5nc3RyZWFtLmpzIj48Y29kZT5zdHJpbmdzdHJlYW0uanM8L2NvZGU+PC9hPiksCiAgICAgIGNyZWF0ZXMgYSBwYXJzZXIuIFRoZSBiZWhhdmlvdXIgb2YgdGhpcyBwYXJzZXIgaXMgZGVzY3JpYmVkCiAgICAgIGJlbG93LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+ZWxlY3RyaWNDaGFyczwvY29kZT48L2R0PjxkZD5BbiBvcHRpb25hbCBzdHJpbmcKICAgICAgY29udGFpbmluZyB0aGUgY2hhcmFjdGVycyB0aGF0LCB3aGVuIHR5cGVkLCBzaG91bGQgY2F1c2UgdGhlCiAgICAgIGluZGVudGF0aW9uIG9mIHRoZSBjdXJyZW50IGxpbmUgdG8gYmUgcmVjb21wdXRlZCAoZm9yIGV4YW1wbGUKICAgICAgPGNvZGU+Int9IjwvY29kZT4gZm9yIGMtbGlrZSBsYW5ndWFnZXMpLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+Y29uZmlndXJlKG9iamVjdCk8L2NvZGU+PC9kdD48ZGQ+QW4gb3B0aW9uYWwgZnVuY3Rpb24KICAgICAgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIHBhcnNlci4gSWYgaXQgZXhpc3RzLCBhbmQgYW4KICAgICAgZWRpdG9yIGlzIGdpdmVuIGEgPGNvZGU+cGFyc2VyQ29uZmlnPC9jb2RlPiBvcHRpb24sIGl0IHdpbGwgYmUKICAgICAgY2FsbGVkIHdpdGggdGhlIHZhbHVlIG9mIHRoYXQgb3B0aW9uLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+Zmlyc3RJbmRlbnRhdGlvbihjaGFycywgY3VycmVudCwKICAgICAgZGlyZWN0aW9uKTwvY29kZT48L2R0PjxkZD5BbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgdG8KICAgICAgZGV0ZXJtaW5lIHRoZSBwcm9wZXIgaW5kZW50YXRpb24gb2YgdGhlIGZpcnN0IGxpbmUgb2YgYQogICAgICBkb2N1bWVudC4gV2hlbiBub3QgcHJvdmlkZWQsIDxjb2RlPjA8L2NvZGU+IGlzIHVzZWQuPC9kZD4KICAgIDwvZGw+CgogICAgPHA+V2hlbiB0aGUgPGNvZGU+bWFrZTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZCB3aXRoIGEgc3RyaW5nCiAgICBzdHJlYW0sIGl0IHNob3VsZCByZXR1cm4gYSBNb2NoaUtpdC1zdHlsZSBpdGVyYXRvcjogYW4gb2JqZWN0IHdpdGgKICAgIGEgPGNvZGU+bmV4dDwvY29kZT4gbWV0aG9kLCB3aGljaCB3aWxsIHJhaXNlCiAgICA8Y29kZT5TdG9wSXRlcmF0aW9uPC9jb2RlPiB3aGVuIGl0IGlzIGF0IGl0cyBlbmQgKHNlZSA8YQogICAgaHJlZj0iaHR0cDovL2JvYi5weXRob25tYWMub3JnL2FyY2hpdmVzLzIwMDUvMDcvMDYvaXRlcmF0aW9uLWluLWphdmFzY3JpcHQvIj50aGlzPC9hPgogICAgZm9yIGRldGFpbHMpLiBUaGlzIGl0ZXJhdG9yLCB3aGVuIGNhbGxlZCwgd2lsbCBjb25zdW1lIGlucHV0IGZyb20KICAgIHRoZSBzdHJpbmcgc3RyZWFtLCBhbmQgcHJvZHVjZSBhIHRva2VuIG9iamVjdC48L3A+CgogICAgPHA+VG9rZW4gb2JqZWN0cyByZXByZXNlbnQgYSBzaW5nbGUgc2lnbmlmaWNhbnQgcGllY2Ugb2YgdGhlIHRleHQKICAgIHRoYXQgaXMgYmVpbmcgZWRpdGVkLiBBIHRva2VuIG9iamVjdCBtdXN0IGhhdmUgYQogICAgPGNvZGU+dmFsdWU8L2NvZGU+IHByb3BlcnR5IGhvbGRpbmcgdGhlIHRleHQgaXQgc3RhbmRzIGZvciwgYW5kIGEKICAgIDxjb2RlPnN0eWxlPC9jb2RlPiBwcm9wZXJ0eSB3aXRoIHRoZSBDU1MgY2xhc3MgdGhhdCBzaG91bGQgYmUgdXNlZAogICAgdG8gY29sb3VyIHRoaXMgZWxlbWVudC4gVGhpcyBjYW4gYmUgYW55dGhpbmcsIGV4Y2VwdCB0aGF0IGFueQogICAgd2hpdGVzcGFjZSBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lIHNob3VsZCA8ZW0+YWx3YXlzPC9lbT4gaGF2ZQogICAgY2xhc3MgPGNvZGU+IndoaXRlc3BhY2UiPC9jb2RlPjogVGhlIGVkaXRvciBtdXN0IGJlIGFibGUgdG8KICAgIHJlY29nbml6ZSB0aGVzZSB3aGVuIGl0IGluZGVudHMgbGluZXMuIEZ1cnRoZXJtb3JlLCBlYWNoIG5ld2xpbmUKICAgIGNoYXJhY3RlciA8ZW0+bXVzdDwvZW0+IGhhdmUgaXRzIG93biBzZXBhcmF0ZSB0b2tlbiwgd2hpY2ggaGFzIGFuCiAgICA8Y29kZT5pbmRlbnRhdGlvbjwvY29kZT4gcHJvcGVydHkgaG9sZGluZyBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlCiAgICB1c2VkIHRvIGRldGVybWluZSB0aGUgcHJvcGVyIGluZGVudGF0aW9uIGxldmVsIGZvciB0aGUgbmV4dCBsaW5lLgogICAgVGhpcyBmdW5jdGlvbiBvcHRpb25hbGx5IHRha2VzIHRoZSB0ZXh0IGluIHRoZSBmaXJzdCB0b2tlbiBvZiB0aGUKICAgIG5leHQgbGluZSwgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gb2YgdGhlIGxpbmUsIGFuZCB0aGUKICAgICdkaXJlY3Rpb24nIG9mIHRoZSBpbmRlbnRhdGlvbiBhcyBhcmd1bWVudHMsIHdoaWNoIGl0IGNhbiB1c2UgdG8KICAgIGFkanVzdCB0aGUgaW5kZW50YXRpb24gbGV2ZWwuIFRoZSBkaXJlY3Rpb24gYXJndW1lbnQgaXMgb25seQogICAgdXNlZnVsIGZvciBtb2RlcyBpbiB3aGljaCBsaW5lcyBkbyBub3QgaGF2ZSBhIGZpeGVkIGluZGVudGF0aW9uLAogICAgYW5kIGNhbiBiZSBtb2RpZmllZCBieSBtdWx0aXBsZSB0YWIgcHJlc3Nlcy4gSXQgaXMKICAgIDxjb2RlPm51bGw8L2NvZGU+IGZvciAnZGVmYXVsdCcgaW5kZW50YXRpb25zIChsaWtlIHdoYXQgaGFwcGVucwogICAgd2hlbiB0aGUgdXNlciBwcmVzc2VzIGVudGVyKSwgPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIHJlZ3VsYXIgdGFiCiAgICBwcmVzc2VzLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBjb250cm9sLXRhYiBvciBzaGlmdC10YWIuPC9wPgoKICAgIDxwPlNvIGZhciB0aGlzIHNob3VsZCBiZSBwcmV0dHkgZWFzeS4gVGhlIGhhcmQgcGFydCBpcyB0aGF0IHRoaXMKICAgIGl0ZXJhdG9yIG11c3QgYWxzbyBoYXZlIGEgPGNvZGU+Y29weTwvY29kZT4gbWV0aG9kLiBUaGlzIG1ldGhvZCwKICAgIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cywgcmV0dXJucyBhIGZ1bmN0aW9uIHJlcHJlc2VudGluZyB0aGUKICAgIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBhcnNlci4gV2hlbiB0aGlzIHN0YXRlIGZ1bmN0aW9uIGlzIGxhdGVyCiAgICBjYWxsZWQgd2l0aCBhIHN0cmluZyBzdHJlYW0gYXMgaXRzIGFyZ3VtZW50LCBpdCByZXR1cm5zIGEgcGFyc2VyCiAgICBvYmplY3QgdGhhdCByZXN1bWVzIHBhcnNpbmcgdXNpbmcgdGhlIG9sZCBzdGF0ZSBhbmQgdGhlIG5ldyBpbnB1dAogICAgc3RyZWFtLiBJdCBtYXkgYXNzdW1lIHRoYXQgb25seSBvbmUgcGFyc2VyIGlzIGFjdGl2ZSBhdCBhIHRpbWUsCiAgICBhbmQgY2FuIGNsb2JiZXIgdGhlIHN0YXRlIG9mIHRoZSBvbGQgcGFyc2VyIGlmIGl0IHdhbnRzLjwvcD4KCiAgICA8cD5Gb3IgZXhhbXBsZXMsIHNlZSA8YQogICAgaHJlZj0ianMvcGFyc2VqYXZhc2NyaXB0LmpzIj48Y29kZT5wYXJzZWphdmFzY3JpcHQuanM8L2NvZGU+PC9hPiwKICAgIDxhIGhyZWY9ImpzL3BhcnNleG1sLmpzIj48Y29kZT5wYXJzZXhtbC5qczwvY29kZT48L2E+LCBhbmQgPGEKICAgIGhyZWY9ImpzL3BhcnNlY3NzLmpzIj48Y29kZT5wYXJzZWNzcy5qczwvY29kZT48L2E+LjwvcD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></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+KCl7PHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPnJldHVybjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5zY2FuTm9kZTwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPnN0YXJ0PC9zcGFuPiwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5zdG9wPC9zcGFuPik7fTsKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZnVuY3Rpb248L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+c3RvcDwvc3Bhbj4oKXsKICAgIDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj5jYzwvc3Bhbj4gPSA8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+c3RvcDwvc3Bhbj47CiAgICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+dGhyb3c8L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+U3RvcEl0ZXJhdGlvbjwvc3Bhbj47CiAgfQogIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5mdW5jdGlvbjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj55aWVsZDwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj52YWx1ZTwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+Yzwvc3Bhbj4pewogICAgPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPmNjPC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj5jPC9zcGFuPjsKICAgIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5yZXR1cm48L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj52YWx1ZTwvc3Bhbj47CiAgfQoKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZnVuY3Rpb248L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+c2Nhbk5vZGU8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+bm9kZTwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+Yzwvc3Bhbj4pewogICAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPm5vZGU8L3NwYW4+LjxzcGFuIGNsYXNzPSJqcy1wcm9wZXJ0eSI+bmV4dFNpYmxpbmc8L3NwYW4+KQogICAgICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+dmFyPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGVkZWYiPm5leHRjPC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5mdW5jdGlvbjwvc3Bhbj4oKXs8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+cmV0dXJuPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+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>/codemirror/unittests.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWw+CjwhLS0KICBUZXN0IEhhcm5lc3MgZm9yIENvZGVNaXJyb3IKICBUaGlzIEhUTUwgZmlsZSBwcm92aWRlcyBhIG1pbmltYWwgZW52aXJvbm1lbnQgd2l0aGluIHdoaWNoIG9uZSBjYW4gZXhlY3V0ZQogIEpTVW5pdC1zdHlsZSB0ZXN0cy4KLS0+Cgo8aHRtbD4KICA8aGVhZD4KICAgIDx0aXRsZT5UZXN0IEhhcm5lc3MgZm9yIENvZGVNaXJyb3I8L3RpdGxlPgoKICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InVuaXR0ZXN0cy5qcyI+PC9zY3JpcHQ+CgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICAvLyBDb3VudGVycyBmb3IgdW5pdCB0ZXN0IHJlc3VsdHMuCiAgICAgIHZhciB0ZXN0X2dvb2QgPSAwOwogICAgICB2YXIgdGVzdF9iYWQgPSAwOwoKICAgICAgLy8gSWYgZXhwZWN0ZWQgYW5kIGFjdHVhbCBhcmUgdGhlIGlkZW50aWNhbCwgcHJpbnQgJ09rJywgb3RoZXJ3aXNlICdGYWlsIScKICAgICAgZnVuY3Rpb24gYXNzZXJ0RXF1YWxzKG1zZywgZXhwZWN0ZWQsIGFjdHVhbCkgewogICAgICAgIGlmICh0eXBlb2YgYWN0dWFsID09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAvLyBtc2cgaXMgb3B0aW9uYWwuCiAgICAgICAgICBhY3R1YWwgPSBleHBlY3RlZDsKICAgICAgICAgIGV4cGVjdGVkID0gbXNnOwogICAgICAgICAgbXNnID0gJ0V4cGVjdGVkOiBcJycgKyBleHBlY3RlZCArICdcJyBBY3R1YWw6IFwnJyArIGFjdHVhbCArICdcJyc7CiAgICAgICAgfQogICAgICAgIHZhciBodG1sOwogICAgICAgIGlmIChleHBlY3RlZCA9PT0gYWN0dWFsKSB7CiAgICAgICAgICBodG1sID0gJzxGT05UIENPTE9SPSIjMDA5OTAwIj5PazwvRk9OVD4nOwogICAgICAgICAgdGVzdF9nb29kKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGh0bWwgPSAnPEZPTlQgQ09MT1I9IiM5OTAwMDAiPjxCSUc+RmFpbCE8L0JJRz48L0ZPTlQ+PEJSPic7CiAgICAgICAgICBtc2cgKz0gJyBFeHBlY3RlZDogXCcnICsgZXhwZWN0ZWQgKyAnXCcgQWN0dWFsOiBcJycgKyBhY3R1YWwgKyAnXCcnOwogICAgICAgICAgbXNnID0gbXNnLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTsKICAgICAgICAgIG1zZyA9IG1zZy5yZXBsYWNlKC9cclxuL2csICcmcGFyYTsnKTsKICAgICAgICAgIG1zZyA9IG1zZy5yZXBsYWNlKC9cbi9nLCAnJnBhcmE7Jyk7CiAgICAgICAgICBtc2cgPSBtc2cucmVwbGFjZSgvXHIvZywgJyZwYXJhOycpOwogICAgICAgICAgbXNnID0gbXNnLnJlcGxhY2UoL1x1MDBBMC9nLCAnJm1pZGRvdDsnKTsKICAgICAgICAgIGh0bWwgKz0gJzxjb2RlPicgKyBtc2cgKyAnPC9jb2RlPic7CiAgICAgICAgICB0ZXN0X2JhZCsrOwogICAgICAgIH0KICAgICAgICBwcmludERpdihodG1sKTsKICAgICAgfQoKICAgICAgLy8gSWYgZXhwZWN0ZWQgYW5kIGFjdHVhbCBhcmUgdGhlIGVxdWl2YWxlbnQsIHBhc3MgdGhlIHRlc3QuCiAgICAgIGZ1bmN0aW9uIGFzc2VydEVxdWl2YWxlbnQobXNnLCBleHBlY3RlZCwgYWN0dWFsKSB7CiAgICAgICAgaWYgKHR5cGVvZiBhY3R1YWwgPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgIC8vIG1zZyBpcyBvcHRpb25hbC4KICAgICAgICAgIGFjdHVhbCA9IGV4cGVjdGVkOwogICAgICAgICAgZXhwZWN0ZWQgPSBtc2c7CiAgICAgICAgICBtc2cgPSAnRXhwZWN0ZWQ6IFwnJyArIGV4cGVjdGVkICsgJ1wnIEFjdHVhbDogXCcnICsgYWN0dWFsICsgJ1wnJzsKICAgICAgICB9CiAgICAgICAgaWYgKF9lcXVpdmFsZW50KGV4cGVjdGVkLCBhY3R1YWwpKSB7CiAgICAgICAgICBhc3NlcnRFcXVhbHMobXNnLCBTdHJpbmcudG9TdHJpbmcoZXhwZWN0ZWQpLCBTdHJpbmcudG9TdHJpbmcoYWN0dWFsKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFzc2VydEVxdWFscyhtc2csIGV4cGVjdGVkLCBhY3R1YWwpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gQXJlIGEgYW5kIGIgdGhlIGVxdWl2YWxlbnQ/IC0tIFJlY3Vyc2l2ZS4KICAgICAgZnVuY3Rpb24gX2VxdWl2YWxlbnQoYSwgYikgewogICAgICAgIGlmIChhID09IGIpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIGEgPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcgJiYgYSAhPT0gbnVsbCAmJiBiICE9PSBudWxsKSB7CiAgICAgICAgICBpZiAoYS50b1N0cmluZygpICE9IGIudG9TdHJpbmcoKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKHZhciBwIGluIGEpIHsKICAgICAgICAgICAgaWYgKCFfZXF1aXZhbGVudChhW3BdLCBiW3BdKSkgewogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZm9yICh2YXIgcCBpbiBiKSB7CiAgICAgICAgICAgIGlmICghX2VxdWl2YWxlbnQoYVtwXSwgYltwXSkpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHJ1blRlc3RzKCkgewogICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdGVzdHMubGVuZ3RoOyB4KyspIHsKICAgICAgICAgIHByaW50RGl2KCc8SDM+JyArIHRlc3RzW3hdICsgJzo8L0gzPicpOwogICAgICAgICAgZXZhbCh0ZXN0c1t4XSArICcoKScpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBpbml0VGVzdHMoKSB7CiAgICAgICAgdmFyIHN0YXJ0VGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CiAgICAgICAgcnVuVGVzdHMoKTsKICAgICAgICB2YXIgZW5kVGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CiAgICAgICAgdmFyIGh0bWwgPSAnPEgzPkRvbmUuPC9IMz4nOwogICAgICAgIGh0bWwgKz0gJzxQPlRlc3RzIHBhc3NlZDogJyArIHRlc3RfZ29vZCArICc8QlI+VGVzdHMgZmFpbGVkOiAnICsgdGVzdF9iYWQgKyAnPC9QPic7CiAgICAgICAgaHRtbCArPSAnPFA+VG90YWwgdGltZTogJyArIChlbmRUaW1lIC0gc3RhcnRUaW1lKSArICcgbXM8L1A+JzsKICAgICAgICBwcmludERpdihodG1sKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcHJpbnREaXYoaHRtbCkgewogICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdG91dHB1dCcpLmFwcGVuZENoaWxkKGRpdik7CiAgICAgIH0KICAgIDwvc2NyaXB0PgogIDwvaGVhZD4KCiAgPGJvZHkgb25sb2FkPSJpbml0VGVzdHMoKSI+CiAgICA8aDE+VGVzdCBIYXJuZXNzIGZvciBDb2RlTWlycm9yPC9oMT4KICAgIDxkaXYgaWQ9InRlc3RvdXRwdXQiPjwvZGl2PgogICAgPGhyPgogICAgPGRpdiBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4KICAgIDx0ZXh0YXJlYSBpZD0iaW5wdXRmaWVsZCI+PC90ZXh0YXJlYT4KICAgIDwvZGl2PgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gbmV3IENvZGVNaXJyb3IoQ29kZU1pcnJvci5yZXBsYWNlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dGZpZWxkJykpLCB7CiAgICAgICAgICBwYXJzZXJmaWxlOiBbInRva2VuaXplamF2YXNjcmlwdC5qcyIsICJwYXJzZWphdmFzY3JpcHQuanMiXSwKICAgICAgICAgIHBhdGg6ICJqcy8iCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/unittests.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFRlc3QgSGFybmVzcyBmb3IgQ29kZU1pcnJvcgogKiBKUy11bml0IGNvbXBhdGlibGUgdGVzdHMgaGVyZS4gIFRoZSB0d28gYXZhaWxhYmxlIGFzc2VydGlvbnMgYXJlCiAqIGFzc2VydEVxdWFscyAoc3RyaWN0IGVxdWFsaXR5KSBhbmQgYXNzZXJ0RXF1aXZhbGVudCAobG9vc2VyIGVxdWl2YWxlbmN5KS4KICoKICogJ2VkaXRvcicgaXMgYSBnbG9iYWwgb2JqZWN0IGZvciB0aGUgQ29kZU1pcnJvciBlZGl0b3Igc2hhcmVkIGJldHdlZW4gYWxsCiAqIHRlc3RzLiAgQWZ0ZXIgbWFuaXB1bGF0aW5nIGl0IGluIGVhY2ggdGVzdCwgdHJ5IHRvIHJlc3RvcmUgaXQgdG8KICogYXBwcm94aW1hdGVseSBpdHMgb3JpZ2luYWwgc3RhdGUuCiAqLwoKZnVuY3Rpb24gdGVzdFNldEdldCgpIHsKICB2YXIgY29kZSA9ICdJdCB3YXMgdGhlIGJlc3Qgb2YgdGltZXMuXG5JdCB3YXMgdGhlIHdvcnN0IG9mIHRpbWVzLic7CiAgZWRpdG9yLnNldENvZGUoY29kZSk7CiAgYXNzZXJ0RXF1YWxzKGNvZGUsIGVkaXRvci5nZXRDb2RlKCkpOwogIGVkaXRvci5zZXRDb2RlKCcnKTsKICBhc3NlcnRFcXVhbHMoJycsIGVkaXRvci5nZXRDb2RlKCkpOwp9CgpmdW5jdGlvbiB0ZXN0U2V0U3R5bGVzaGVldCgpIHsKICBmdW5jdGlvbiBjc3NTdGF0dXMoKSB7CiAgICAvLyBSZXR1cm5zIGEgbGlzdCBvZiB0dXBsZXMsIGZvciBlYWNoIENTUyBsaW5rIHJldHVybiB0aGUgZmlsZW5hbWUgYW5kCiAgICAvLyB3aGV0aGVyIGl0IGlzIGVuYWJsZWQuCiAgICBsaW5rcyA9IGVkaXRvci53aW4uZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2xpbmsnKTsKICAgIGNzcyA9IFtdOwogICAgZm9yICh2YXIgeCA9IDAsIGxpbms7IGxpbmsgPSBsaW5rc1t4XTsgeCsrKSB7CiAgICAgIGlmIChsaW5rLnJlbC5pbmRleE9mKCJzdHlsZXNoZWV0IikgIT09IC0xKSB7CiAgICAgICAgY3NzLnB1c2goW2xpbmsuaHJlZi5zdWJzdHJpbmcobGluay5ocmVmLmxhc3RJbmRleE9mKCcvJykgKyAxKSwKICAgICAgICAgICAgICAgICAhbGluay5kaXNhYmxlZF0pCiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjc3M7CiAgfQogIGFzc2VydEVxdWl2YWxlbnQoW10sIGNzc1N0YXR1cygpKTsKICBlZGl0b3Iuc2V0U3R5bGVzaGVldCgnY3NzL2pzY29sb3JzLmNzcycpOwogIGFzc2VydEVxdWl2YWxlbnQoW1snanNjb2xvcnMuY3NzJywgdHJ1ZV1dLCBjc3NTdGF0dXMoKSk7CiAgZWRpdG9yLnNldFN0eWxlc2hlZXQoWydjc3MvY3NzY29sb3JzLmNzcycsICdjc3MveG1sY29sb3JzLmNzcyddKTsKICBhc3NlcnRFcXVpdmFsZW50KFtbJ2pzY29sb3JzLmNzcycsIGZhbHNlXSwgWydjc3Njb2xvcnMuY3NzJywgdHJ1ZV0sIFsneG1sY29sb3JzLmNzcycsIHRydWVdXSwgY3NzU3RhdHVzKCkpOwogIGVkaXRvci5zZXRTdHlsZXNoZWV0KFtdKTsKICBhc3NlcnRFcXVpdmFsZW50KFtbJ2pzY29sb3JzLmNzcycsIGZhbHNlXSwgWydjc3Njb2xvcnMuY3NzJywgZmFsc2VdLCBbJ3htbGNvbG9ycy5jc3MnLCBmYWxzZV1dLCBjc3NTdGF0dXMoKSk7Cn0KCi8vIFVwZGF0ZSB0aGlzIGxpc3Qgb2YgdGVzdHMgYXMgbmV3IG9uZXMgYXJlIGFkZGVkLgp2YXIgdGVzdHMgPSBbJ3Rlc3RTZXRHZXQnLCAndGVzdFNldFN0eWxlc2hlZXQnXTsKCg==]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbImZyaWVuZGx5bmFtZSJdPSJDb2RlTWlycm9yIHN5bnRheGhpZ2hsaWdodGluZyBlZGl0b3IiOwoKJGxhbmdbInBvc3RpbnN0YWxsIl09IlRoZSBDb2RlTWlycm9yIG1vZHVsZSB3YXMgc3VjZXNzZnVsbHkgaW5zdGFsbGVkIjsKJGxhbmdbIm5lZWRwZXJtaXNzaW9uIl09IidZb3UgbmVlZCB0aGUgJyVzJyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhhdCBmdW5jdGlvbi4iOwoKJGxhbmdbInNldHRpbmdzdGFiIl09IlNldHRpbmdzIjsKJGxhbmdbInNhdmVzZXR0aW5ncyJdPSJTYXZlIHNldHRpbmdzIjsKJGxhbmdbInNldHRpbmdzc2F2ZWQiXT0iU2V0dGluZ3Mgc2F2ZWQiOwoKJGxhbmdbImh0bWx0ZXN0Il09IkhUTUwgc3ludGF4IHRlc3QiOwokbGFuZ1siY3NzdGVzdCJdPSJDU1Mgc3ludGF4IHRlc3QiOwokbGFuZ1sicGhwdGVzdCJdPSJQSFAgc3ludGF4IHRlc3QiOwokbGFuZ1sianN0ZXN0Il09IkphdmFTY3JpcHQgc3ludGF4IHRlc3QiOwokbGFuZ1siZXhhbXBsZXN5bnRheCJdPSJTeW50YXggdG8gdGVzdCB3aXRoIjsKJGxhbmdbImNoYW5nZSJdPSJDaGFuZ2UuLi4iOwoKJGxhbmdbInNob3dsaW5lbnVtYmVycyJdPSJTaG93IGxpbmVudW1iZXJzIjsKJGxhbmdbInRleHR3cmFwcGluZyJdPSJXcmFwIGxvbmcgbGluZXMiOwokbGFuZ1siYXV0b21hdGNocGFyZW5zIl09IkF1dG9tYXRjaCBwYXJlbnRoZXNpcyI7CgokbGFuZ1siaGVscCJdPSI8c3Ryb25nPldoYXQgZG9lcyB0aGlzIG1vZHVsZSBkbz88L3N0cm9uZz4KPGJyLz4KVGhlIENvZGVNaXJyb3IgbW9kdWxlIGFsbG93cyB5b3UgdG8gZWRpdCBjb250ZW50LCB0ZW1wbGF0ZXMgYW5kIHN0eWxlc2hlZXRzIHVzaW5nIGEgc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvciBpbnNpZGUgeW91ciBicm93c2VyLgpJdCBjYW4gYm90aCByZXBsYWNlIGEgd3lzaXd5Zy1tb2R1bGUsIGFuZCBhY3Qgc3RhbmRhbG9uZSBmb3IgdGVtcGxhdGUvc3R5bGVzaGVldCBlZGl0aW5nIChvbmx5IHN1cHBvcnRlZCBpbiBDTVNtcyAxLjErKQo8YnIvPjxici8+CjxzdHJvbmc+SG93IGRvIEkgdXNlIHRoaXMgbW9kdWxlPzwvc3Ryb25nPgpZb3Ugc2ltcGx5IGluc3RhbGwgaXQsIGFuZCBjaG9vc2UgaXQgaW4geW91ciBhZG1pbiB1c2VyIHByZWZlcmVuY2VzLiBOb3RlLCB0aGF0IGlmIHlvdSB1c2UgQ01TbXMgMS4xIG9yIGFib3ZlIHlvdSBjYW4Kc2VsZWN0IENvZGVNaXJyb3IgYm90aCBhcyBhIFdZU0lXWUcgYW5kIGFzIGEgc3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IuIjsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/da_DK.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3IgLSBlbiBzeW50YWtzLWZyZW1oJmFlbGlnO3ZlbmRlIGVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0NvZGVNaXJyb3IgbW9kdWxldCBibGV2IGtvcnJla3QgaW5zdGFsbGVyZXQnOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICcmIzAzOTtZb3UgbmVlZCB0aGUgJiMwMzk7JXMmIzAzOTsgcGVybWlzc2lvbiB0byBwZXJmb3JtIHRoYXQgZnVuY3Rpb24uJzsKJGxhbmdbJ3NldHRpbmdzdGFiJ10gPSAnSW5kc3RpbGxpbmdlcic7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdHZW0gaW5kc3RpbGxpbmdlcic7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnSW5kc3RpbGxpbmdlcm5lIGJsZXYgZ2VtdCc7CiRsYW5nWydodG1sdGVzdCddID0gJ0hUTUwgc3ludGFrcyB0ZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1Mgc3ludGFrcyB0ZXN0JzsKJGxhbmdbJ3BocHRlc3QnXSA9ICdQSFAgc3ludGFrYSB0ZXN0JzsKJGxhbmdbJ2pzdGVzdCddID0gJ0phdmFTY3JpcHQgc3ludGFrcyB0ZXN0JzsKJGxhbmdbJ2V4YW1wbGVzeW50YXgnXSA9ICdTeW50YWtzIGRlciBza2FsIHRlc3RlcyBtZWQnOwokbGFuZ1snY2hhbmdlJ10gPSAnU2tpZnQuLi4nOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnVmlzIGxpbmllbnVtcmUnOwokbGFuZ1sndGV4dHdyYXBwaW5nJ10gPSAnT21icnlkIGxhbmdlIGxpbmllcic7CiRsYW5nWydhdXRvbWF0Y2hwYXJlbnMnXSA9ICdWaXMgbWF0Y2hlbmRlIHBhcmVudGVzZXInOwokbGFuZ1snaGVscCddID0gJzxzdHJvbmc+SHZhZCBnJm9zbGFzaDtyIGRldHRlIG1vZHVsPzwvc3Ryb25nPg0KPGJyLz4NCkNvZGVNaXJyb3ItbW9kdWxlcyBnaXZlciBkaWcgbXVsaWdoZWQgZm9yIGF0IHJlZGlnZXJlIGluZGhvbGQsIHNrYWJlbG9uZXIgb2cgc3R5bGVzaGVldHMgdmVkIGhqJmFlbGlnO2xwIGFmIHN5bnRha3MtZnJlbWgmYWVsaWc7dmVuZGUgcmVkaWdlcmluZyBpIGRpbiBicm93c2VyLg0KPGJyLz48YnIvPg0KPHN0cm9uZz5Idm9yZGFuIGJydWdlciBqZWcgZGV0dGUgbW9kdWw/PC9zdHJvbmc+DQpEdSBpbnN0YWxsZXJlciBkZXQgb2cgdiZhZWxpZztsZ2VyIGRldCBpIGRpbmUgYnJ1Z2VyIGluZHN0aWxsaW5nZXIgZm9yIGFkbWluc2l0cmF0aW9uZW4uIEJlbSZhZWxpZztyayBhdCBkdSBrYW4gdiZhZWxpZztsZ2UgYXQgYmVueXR0ZSBkZXQgYiZhcmluZztkZSBzb20gc3ludGFrcyBmcmVtaCZhZWxpZzt2ZXIgb2cgV1lTSVdZRy4nOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4yMDM5ODg2NTg1LjEyMzE3MTM2MTguMTI3OTEzNzA4MS4xMjc5NTU0OTUxLjEzNyc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEyNzc4MzQ0MTMuMTMxLjMwLnV0bWNzcj1mZWVkYnVybmVyfHV0bWNjbj1GZWVkOiBjbXNtYWRlc2ltcGxlL2Jsb2cgKENNUyBNYWRlIFNpbXBsZSl8dXRtY21kPWZlZWQnOwokbGFuZ1sncWNhJ10gPSAnMTIyOTYwMTc5MC04NTI0MzE5Ny00MzI2MDcxMyc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/de_DE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3IgU3ludGF4LUhpZ2hsaWdodGluZy1FZGl0b3IgJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnRGFzIENvZGVNaXJyb3ItTW9kdWwgd3VyZGUgZXJmb2xncmVpY2ggaW5zdGFsbGllcnQuJzsKJGxhbmdbJ25lZWRwZXJtaXNzaW9uJ10gPSAnU2llIGJlc2l0emVuIG5pY2h0ICBkaWUgJiMwMzk7JXMmIzAzOTstQmVyZWNodGlndW5nLCB1bSBkaWVzZSBGdW5rdGlvbiBhdXN6dWYmdXVtbDtocmVuLic7CiRsYW5nWydzZXR0aW5nc3RhYiddID0gJ0VpbnN0ZWxsdW5nZW4nOwokbGFuZ1snc2F2ZXNldHRpbmdzJ10gPSAnRWluc3RlbGx1bmdlbiBzcGVpY2hlcm4nOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ0VpbnN0ZWxsdW5nZW4gZ2VzcGVpY2hlcnQnOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdIVE1MLVN5bnRheC1UZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1MtU3ludGF4LVRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUC1TeW50YXgtVGVzdCc7CiRsYW5nWydqc3Rlc3QnXSA9ICdKYXZhU2NyaXB0LVN5bnRheC1UZXN0JzsKJGxhbmdbJ2V4YW1wbGVzeW50YXgnXSA9ICdTeW50YXggdGVzdGVuIG1pdCc7CiRsYW5nWydjaGFuZ2UnXSA9ICcmQXVtbDtuZGVyZSAuLi4nOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnWmVpbGVubnVtbWVybiBhbnplaWdlbic7CiRsYW5nWyd0ZXh0d3JhcHBpbmcnXSA9ICdMYW5nZSBaZWlsZW4gdW1icmVjaGVuJzsKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+V2FzIG1hY2h0IGRpZXNlcyBNb2R1bD88L2gzPg0KPHA+RGFzIENvZGVNaXJyb3ItTW9kdWxlIGlzdCBlaW4gRWRpdG9yIG1pdCBTeW50YXgtSGlnaGxpZ2h0aW5nLCBtaXQgZGVtIFNpZSBvbmxpbmUgSW5oYWx0LCBUZW1wbGF0ZXMgdW5kIFN0eWxlc2hlZXRzIGJlYXJiZWl0ZW4gayZvdW1sO25uZW4uIERhcyBNb2R1bCBrYW5uIHNvd29obCBkaWUgV1lTSVdZRy1FZGl0b3JlbiBlcnNldHplbiBhbHMgYXVjaCBzZXBhcmF0IHp1bSBFZGl0aWVyZW4gdm9uIFRlbXBsYXRlcyB1bmQgU3R5bGVzaGVldHMgdmVyd2VuZGV0IHdlcmRlbiAoZXJzdCBhYiBDTVNtcy1WZXJzaW9uIDEuMSB1bmQgaCZvdW1sO2hlcikuPC9wPg0KPGgzPldpZSB3aXJkIGVzIGVpbmdlc2V0enQ/PC9oMz4NCjxwPkluc3RhbGxpZXJlbiBTaWUgZGFzIE1vZHVsIHVuZCBha3RpdmllcmVuIFNpZSBlcyBhbnNjaGxpZSZzemxpZztlbmQgaW4gZGVuIGJlbnV0emVyc3BlemlmaXNjaGVuIEVpbnN0ZWxsdW5nZW4uPC9wPg0KPHA+QmVhY2h0ZW4gU2llLCBkYXNzIFNpZSBhYiBDTVNtcy1WZXJzaW9uIDEuMSB1bmQgaCZvdW1sO2hlciA8c3Ryb25nPkNvZGVNaXJyb3I8L3N0cm9uZz4gc293b2hsIGFscyBXWVNJV1lHLUVkaXRvciBhbHMgYXVjaCBhbHMgU3ludGF4LUhpZ2hsaWdodGluZy1FZGl0b3IgYXVzdyZhdW1sO2hsZW4gayZvdW1sO25uZW4uPC9wPic7CiRsYW5nWydxY2EnXSA9ICdQMC03NTA5MTQ3OC0xMjY4NDIxODE0MDcyJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuNzI4OTg5NDUyLjEyNjg1Njc0NzUuMTI3MDgwNzkwNi4xMjcwOTI0MDg1LjYnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEyNzA5MjQwODUuNi40LnV0bWNjbj0ocmVmZXJyYWwpfHV0bWNzcj1mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZ3x1dG1jY3Q9L2luZGV4LnBocHx1dG1jbWQ9cmVmZXJyYWwnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/es_ES.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0VkaXRvciBkZSByZXNhbHRhZG8gZGUgc2ludGF4aXMgQ29kZU1pcnJvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0VsIG0mYW1wO29hY3V0ZTtkdWxvIENvZGVNaXJyb3IgZnVlIHNhdGlzZmFjdG9yaWFtZW50ZSBpbnN0YWxhZG8nOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICcmIzAzOTtTZSBuZWNlc2l0YSBlbCBwZXJtaXNvIGRlICYjMDM5OyVzJiMwMzk7IHBhcmEgcmVhbGl6YXIgZXN0YSBmdW5jaSZhbXA7b2FjdXRlO24uJzsKJGxhbmdbJ3NldHRpbmdzdGFiJ10gPSAnQWp1c3Rlcyc7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdTYWx2YXIgYWp1c3Rlcyc7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnQWp1c3RlcyBndWFyZGFkb3MnOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdQcnVlYmEgZGUgc2ludGF4aXMgSFRNTCc7CiRsYW5nWydjc3N0ZXN0J10gPSAnUHJ1ZWJhIGRlIHNpbnRheGlzIENTUyc7CiRsYW5nWydwaHB0ZXN0J10gPSAnUHJ1ZWJhIGRlIHNpbnRheGlzIFBIUCc7CiRsYW5nWydleGFtcGxlc3ludGF4J10gPSAnU3ludGF4aXMgdXNhZGEgcGFyYSBwcm9iYXInOwokbGFuZ1snY2hhbmdlJ10gPSAnQ2FtYmlhci4uLic7CiRsYW5nWydzaG93bGluZW51bWJlcnMnXSA9ICdNb3N0YXIgZWwgbiZhbXA7dWFjdXRlO21lcm8gZGUgbCZhbXA7aWFjdXRlO25lYXMnOwokbGFuZ1sndGV4dHdyYXBwaW5nJ10gPSAnQXV0by1hanVzdGFyIGxpbmVhcyBsYXJnYXMnOwokbGFuZ1snaGVscCddID0gJzxzdHJvbmc+UXUmYW1wO2VhY3V0ZTsgaGFjZSBlc3RlIG0mYW1wO29hY3V0ZTtkdWxvPzwvc3Ryb25nPg0KPGJyLz4NCkVsIG0mYW1wO29hY3V0ZTtkdWxvIENvZGVNaXJyb3IgbGUgcGVybWl0ZSBlZGl0YXIgY29udGVuaWRvLCBwbGFudGlsbGFzIHkgaG9qYXMgZGUgZXN0aWxvIHVzYW5kbyB1biBlZGl0b3IgZGUgcmVzYWx0YWRvIGRlIHNpbnRheGlzIGRlbnRybyBkZSBzdSBuYXZlZ2Fkb3IuDQpFc3RlIHRhbWJpdSZhbXA7ZWFjdXRlO24gcHVlZGUgIHJlZW1wbGF6YXIgZWwgbSZhbXA7b2FjdXRlO2R1bG8gZGUgd3lzaXd5ZywgeSBhY3R1YXIgc29sbyBwYXJhIGVkaWNpJmFtcDtvYWN1dGU7biBkZSBwbGFudGlsbGFzL2hvamFzIGRlIGVzdGlsbyB0ZW1wbGF0ZS9zdHlsZXNoZWV0ICAoc29sbyBzb3BvcnRhZG8gZW4gQ01TbXMgMS4xKykNCjxici8+PGJyLz4NCjxzdHJvbmc+QyZhbXA7b2FjdXRlO21vIHVzbyBlc3RlIG0mYW1wO29hY3V0ZTtkdWxvPzwvc3Ryb25nPg0KVXN0ZWQgc2ltcGxlbWVudGUgbG8gaW5zdGFsYSwgeSBsbyBzZWxlY2Npb25hIGVuIGxhcyBwcmVmZXJlY2lhcyBkZSBsYSBhZG1pbmlzdHJhY2kmYW1wO29hY3V0ZTtuLiBOb3RlIHF1ZSwgc2kgdXN0ZWQgdXNhIENNU21zIDEuMSBvIHN1cGVyaW9yIGEgZXN0ZSB1c3RlZCBwdWVkZSBzZWxlY2Npb25hciBDb2RlTWlycm9yIGp1bnRvIGNvbiBXWVNJV1lHIHBhcmEgZWwgcmVzYWx0YWRvIGRlIHNpbnRheGlzLic7CiRsYW5nWydxY2EnXSA9ICdQMC0yMDk2MDU0MzcwLTEyNTk4MDM2MTU5MzknOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4yMzg2MDY4NTQuMTI1OTgwNDM2OC4xMjY3NjUyNDU5LjEyNjc2NTk3NzMuNTcnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjY3NjUyNDU5LjU2LjI4LnV0bWNjbj0ocmVmZXJyYWwpfHV0bWNzcj1mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZ3x1dG1jY3Q9L2luZGV4LnBocC90b3BpYywxOTkyOS4wLmh0bWx8dXRtY21kPXJlZmVycmFsJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/fr_FR.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0VkaXRldXIgZGUgc3ludGF4ZSBjb2xvciZlYWN1dGU7IENvZGVNaXJyb3InOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdMZSBtb2R1bGUgQ29kZU1pcnJvciBhICZlYWN1dGU7dCZlYWN1dGU7IGluc3RhbGwmZWFjdXRlOyBhdmVjIHN1Y2MmZWdyYXZlO3MnOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICcmIzAzOTtWb3VzIGF2ZXogYmVzb2luIGRlIGwmIzAzOTthdXRvcmlzYXRpb24gJiMwMzk7JXMmIzAzOTsgIHBvdXIgY2V0dGUgZm9uY3Rpb24nOwokbGFuZ1snc2V0dGluZ3N0YWInXSA9ICdQYXJhbSZlZ3JhdmU7dHJlcyc7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdTYXV2ZWdhcmRlciBsZXMgcGFyYW0mZWdyYXZlO3RyZXMnOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ1BhcmFtJmVncmF2ZTt0cmVzIHNhdXZlZ2FyZCZlYWN1dGU7cyc7CiRsYW5nWydodG1sdGVzdCddID0gJ1Rlc3QgZGUgc3ludGF4ZSBIVE1MICc7CiRsYW5nWydjc3N0ZXN0J10gPSAnVGVzdCBkZSBzeW50YXhlIENTUyAnOwokbGFuZ1sncGhwdGVzdCddID0gJ1Rlc3QgZGUgc3ludGF4ZSBQSFAnOwokbGFuZ1snanN0ZXN0J10gPSAnVGVzdCBkZSBzeW50YXhlIEphdmFTY3JpcHQnOwokbGFuZ1snZXhhbXBsZXN5bnRheCddID0gJ1N5bnRheGUgcG91ciB0ZXN0ZXIgYXZlYyZuYnNwOyc7CiRsYW5nWydjaGFuZ2UnXSA9ICdDaGFuZ2VyIC4uLic7CiRsYW5nWydzaG93bGluZW51bWJlcnMnXSA9ICdBZmZpY2hlciBsZSBub21icmUgZGUgbGlnbmVzJzsKJGxhbmdbJ3RleHR3cmFwcGluZyddID0gJ1JldG91ciAmYWdyYXZlOyBsYSBsaWduZSBhdXRvbWF0aXF1ZSc7CiRsYW5nWydhdXRvbWF0Y2hwYXJlbnMnXSA9ICdQYXJlbnRoJmVncmF2ZTtzZXMgYXV0b21hdGlxdWVzJzsKJGxhbmdbJ2hlbHAnXSA9ICc8c3Ryb25nPlF1ZSBmYWl0IGNlIG1vZHVsZSZuYnNwOz88L3N0cm9uZz4NCjxici8+DQpMZSBtb2R1bGUgQ29kZU1pcnJvciB2b3VzIHBlcm1ldCBkZSBtb2RpZmllciBsZSBjb250ZW51LCBsZXMgZ2FiYXJpdHMgZXQgbGVzIGZldWlsbGVzIGRlIHN0eWxlIGVuIHV0aWxpc2FudCB1biAmZWFjdXRlO2RpdGV1ciBkZSBzeW50YXhlIGNvbG9yJmVhY3V0ZTsgbCYjMDM5O2ludCZlYWN1dGU7cmlldXIgZGUgdm90cmUgbmF2aWdhdGV1ci4gDQpJbCBwZXV0IGF1c3NpIGJpZW4gcmVtcGxhY2VyIGwmIzAzOTsmZWFjdXRlO2RpdGV1ciBXWVNJV1lHLCBldCBwZXJtZXR0cmUgZGUgdmlzdWFsaXNlci0mZWFjdXRlO2RpdGVyIGxlcyBnYWJhcml0cywgZmV1aWxsZXMgZGUgc3R5bGUuIChVbmlxdWVtZW50IHBvdXIgdmVyc2lvbiBDTVNNUyAxLjEgb3UgcGx1cykNCjxici8+PGJyLz4NCjxzdHJvbmc+Q29tbWVudCBsJiMwMzk7dXRpbGlzZXImbmJzcDs/PC9zdHJvbmc+PGJyLz4NCklsIHZvdXMgc3VmZml0IGRlIGwmIzAzOTtpbnN0YWxsZXIsIGV0IGRhbnMgJnF1b3Q7TWVzIHByJmVhY3V0ZTtmJmVhY3V0ZTtyZW5jZXMgLyBQciZlYWN1dGU7ZiZlYWN1dGU7cmVuY2VzIGRlIGwmIzAzOTt1dGlsaXNhdGV1ciZxdW90OyBjaG9pc2lyIGF2ZWMgbGUgbWVudSBkJmVhY3V0ZTtyb3VsYW50IENvZGVNaXJyb3IgZGFucyAmcXVvdDtTJmVhY3V0ZTtsZWN0aW9ubmVyIGxhIHN5bnRheGUgc3VybGlnbiZlYWN1dGU7ZSZxdW90OyBldC9vdSAmZWFjdXRlO3ZlbnR1ZWxsZW1lbnQgZGFucyAmcXVvdDtTJmVhY3V0ZTtsZWN0aW9uIGR1IFdZU0lXWUcgJmFncmF2ZTsgdXRpbGlzZXImcXVvdDsuDQonOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjc5NjI4MTI5LjEuMS51dG1jY249KGRpcmVjdCl8dXRtY3NyPShkaXJlY3QpfHV0bWNtZD0obm9uZSknOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4xNTkxMjUyMDk2LjEyNzk2MjgxMjkuMTI3OTYyODEyOS4xMjc5NjM5ODgzLjInOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzJzsKPz4=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nb_NO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3Igc3ludGFrc2ZyZW1oZXZpbmdzcmVkaWdlcmVyJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnQ29kZU1pcnJvciBtb2R1bGVuIGJsZSBpbnN0YWxsZXJ0JzsKJGxhbmdbJ25lZWRwZXJtaXNzaW9uJ10gPSAnRHUgdHJlbmdlciAmIzAzOTslcyYjMDM5OyB0aWxsYXRlbHNlIGZvciAmYXJpbmc7IHV0ZiZvc2xhc2g7cmUgZGVubmUgZnVua3Nqb25lbi4nOwokbGFuZ1snc2V0dGluZ3N0YWInXSA9ICdJbm5zdGlsbGluZ2VyJzsKJGxhbmdbJ3NhdmVzZXR0aW5ncyddID0gJ0xhZ3JlIGlubnN0aWxsaW5nZXInOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ0lubnN0aWxsaW5nZXIgbGFncmV0JzsKJGxhbmdbJ2h0bWx0ZXN0J10gPSAnSFRNTCBzeW50YWtzIHRlc3QnOwokbGFuZ1snY3NzdGVzdCddID0gJ0NTUyBzeW50YWtzIHRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBzeW50YWtzIHRlc3QnOwokbGFuZ1snanN0ZXN0J10gPSAnSmF2YVNjcmlwdCBzeW50YWtzdGVzdCc7CiRsYW5nWydleGFtcGxlc3ludGF4J10gPSAnU3ludGFrcyAmYXJpbmc7IHRlc3RlIG1lZCc7CiRsYW5nWydjaGFuZ2UnXSA9ICdFbmRyZS4uLic7CiRsYW5nWydzaG93bGluZW51bWJlcnMnXSA9ICdWaXMgbGluamVudW1tZXInOwokbGFuZ1sndGV4dHdyYXBwaW5nJ10gPSAnQnJ5dCBsYW5nZSBsaW5qZXInOwokbGFuZ1snYXV0b21hdGNocGFyZW5zJ10gPSAnQXV0b21hdGlza2UgcGFyYW50ZXNlcic7CiRsYW5nWydoZWxwJ10gPSAnPHN0cm9uZz5XaGF0IGRvZXMgdGhpcyBtb2R1bGUgZG8/PC9zdHJvbmc+DQo8YnIvPg0KVGhlIENvZGVNaXJyb3IgbW9kdWxlIGFsbG93cyB5b3UgdG8gZWRpdCBjb250ZW50LCB0ZW1wbGF0ZXMgYW5kIHN0eWxlc2hlZXRzIHVzaW5nIGEgc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvciBpbnNpZGUgeW91ciBicm93c2VyLg0KSXQgY2FuIGJvdGggcmVwbGFjZSBhIHd5c2l3eWctbW9kdWxlLCBhbmQgYWN0IHN0YW5kYWxvbmUgZm9yIHRlbXBsYXRlL3N0eWxlc2hlZXQgZWRpdGluZyAob25seSBzdXBwb3J0ZWQgaW4gQ01TbXMgMS4xKykNCjxici8+PGJyLz4NCjxzdHJvbmc+SG93IGRvIEkgdXNlIHRoaXMgbW9kdWxlPzwvc3Ryb25nPg0KWW91IHNpbXBseSBpbnN0YWxsIGl0LCBhbmQgY2hvb3NlIGl0IGluIHlvdXIgYWRtaW4gdXNlciBwcmVmZXJlbmNlcy4gTm90ZSwgdGhhdCBpZiB5b3UgdXNlIENNU21zIDEuMSBvciBhYm92ZSB5b3UgY2FuDQpzZWxlY3QgQ29kZUFyZWEgYm90aCBhcyBhIFdZU0lXWUcgYW5kIGFzIGEgc3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IuJzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTI3OTkyMjI4Mi4zMDM5LjcwLnV0bWNzcj1mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZ3x1dG1jY249KHJlZmVycmFsKXx1dG1jbWQ9cmVmZXJyYWx8dXRtY2N0PS9pbmRleC5waHAnOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4xNzkwNTI2MjMwODQxMTAxMDAuMTIxMDQyMzU3Ny4xMjgwNDQwOTM5LjEyODA0NDI5MDEuMzA3Mic7CiRsYW5nWydxY2EnXSA9ICcxMjEwOTcxNjkwLTI3MzA4MDczLTgxOTUyODMyJzsKJGxhbmdbJ3V0bWInXSA9ICcxNTY4NjEzNTMuMi4xMC4xMjgwNDQyOTAxJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nl_NL.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3IgU3ludGF4aGlnaGxpZ2h0aW5nIEVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0RlIENvZGVNaXJyb3IgTW9kdWxlIGlzIGdlJml1bWw7bnN0YWxsZWVyZCc7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJ1UgaGVlZnQgJiMwMzk7JXMmIzAzOTsgcmVjaHRlbiBub2RpZyBvbSBkZXplIGZ1bmN0aWUgdGUgZ2VicnVpa2VuLic7CiRsYW5nWydzZXR0aW5nc3RhYiddID0gJ0luc3RlbGxpbmdlbic7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdJbnN0ZWxsaW5nZW4gb3BzbGFhbic7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnSW5zdGVsbGluZ2VuIG9wZ2VzbGFnZW4nOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdIVE1MIFN5bnRheCBUZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1MgU3ludGF4IFRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBTeW50YXggVGVzdCc7CiRsYW5nWydqc3Rlc3QnXSA9ICdKYXZhU2NyaXB0IFN5bnRheCBUZXN0JzsKJGxhbmdbJ2V4YW1wbGVzeW50YXgnXSA9ICdTeW50YXggb20gbWVlIHRlIHRlc3Rlbic7CiRsYW5nWydjaGFuZ2UnXSA9ICdXaWp6aWcuLi4nOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnUmVnZWxudW1tZXJzIHRvbmVuJzsKJGxhbmdbJ3RleHR3cmFwcGluZyddID0gJ0JyZWVrIGxhbmdlIHJlZ2VscyBhZic7CiRsYW5nWydoZWxwJ10gPSAnPHN0cm9uZz5XaGF0IGRvZXMgdGhpcyBtb2R1bGUgZG8/IDwvc3Ryb25nPg0KPGJyLz4NClRoZSBDb2RlTWlycm9yIG1vZHVsZSBhbGxvd3MgeW91IHRvIGVkaXQgY29udGVudCwgdGVtcGxhdGVzIGFuZCBzdHlsZXNoZWV0cyB1c2luZyBhIHN5bnRheGhpZ2hsaWdodGluZyBlZGl0b3IgaW5zaWRlIHlvdXIgYnJvd3Nlci4NCkl0IGNhbiBib3RoIHJlcGxhY2UgYSB3eXNpd3lnLW1vZHVsZSwgYW5kIGFjdCBzdGFuZGFsb25lIGZvciB0ZW1wbGF0ZS9zdHlsZXNoZWV0IGVkaXRpbmcgKG9ubHkgc3VwcG9ydGVkIGluIENNU21zIDEuMSspDQo8YnIvPjxici8+DQo8c3Ryb25nPkhvdyBkbyBJIHVzZSB0aGlzIG1vZHVsZT88L3N0cm9uZz4NCllvdSBzaW1wbHkgaW5zdGFsbCBpdCwgYW5kIGNob29zZSBpdCBpbiB5b3VyIGFkbWluIHVzZXIgcHJlZmVyZW5jZXMuIE5vdGUsIHRoYXQgaWYgeW91IHVzZSBDTVNtcyAxLjEgb3IgYWJvdmUgeW91IGNhbg0Kc2VsZWN0IENvZGVBcmVhIGJvdGggYXMgYSBXWVNJV1lHIGFuZCBhcyBhIHN5bnRheCBoaWdobGlnaHRpbmcgZWRpdG9yLic7CiRsYW5nWydxY2EnXSA9ICdQMC00NTc4NDg2NjYtMTI2Mzk0NTc3ODY3Mic7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEyNjc5OTcyNTQuMTI5LjMzLnV0bWNzcj1mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZ3x1dG1jY249KHJlZmVycmFsKXx1dG1jbWQ9cmVmZXJyYWx8dXRtY2N0PS9pbmRleC5waHAvdG9waWMsNDIxMjgubmV3Lmh0bWwnOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4yMDcxMzMzMzM4LjEyNjM5NDU3NzguMTI2Nzk0NjU0NS4xMjY3OTk3MjU0LjEyOSc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bWInXSA9ICcxNTY4NjEzNTMuMi4xMC4xMjY3OTk3MjU0JzsKPz4=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/ro_RO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0VkaXRvcnVsIENvZGVNaXJyb3IgY3UgZXZpZGVudGlhdG9yIGRlIHNpbnRheGEnOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdNb2R1bHVsIENvZGVNaXJyb3IgYSBmb3N0IGluc3RhbGF0IGN1IHN1Y2Nlcyc7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJ0F2ZXRpIG5ldm9pZSBkZSBwZXJtaXNpdW5lYSAmIzAzOTslcyYjMDM5OyBwZW50cnUgYWNlYXN0YSBmdW5jdGllLic7CiRsYW5nWydzZXR0aW5nc3RhYiddID0gJ1NldGFyaSc7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdTYWx2YXJlIHNldGFyaSc7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnU2V0YXJpbGUgYXUgZm9zdCBzYWx2YXRlJzsKJGxhbmdbJ2h0bWx0ZXN0J10gPSAndGVzdCBzaW50YXhhIEhUTUwnOwokbGFuZ1snY3NzdGVzdCddID0gJ3Rlc3Qgc2ludGF4YSBDU1MnOwokbGFuZ1sncGhwdGVzdCddID0gJ3Rlc3Qgc2ludGF4YSBQSFAnOwokbGFuZ1snanN0ZXN0J10gPSAndGVzdCBzaW50YXhhIEphdmFTY3JpcHQnOwokbGFuZ1snZXhhbXBsZXN5bnRheCddID0gJ1N5bnRheCB0byB0ZXN0IGN1JzsKJGxhbmdbJ2NoYW5nZSddID0gJ1NjaGltYmEnOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnQWZpc2FyZSBudW1lcmUgZGUgbGluaWUnOwokbGFuZ1sndGV4dHdyYXBwaW5nJ10gPSAnU3RyYW5nZSBsaW5pbGUgbHVuZ2knOwokbGFuZ1snaGVscCddID0gJzxzdHJvbmc+Q2UgZmFjZSBhY2VzdCBtb2R1bD88L3N0cm9uZz4NCjxici8+DQpNb2R1bHVsIENvZGVNaXJyb3IgdmEgcGVybWl0ZSBzYSBlZGl0YXRpIGNvbnRpbnV0LCB0ZW1wbGF0ZS11cmkgc2kgc3R5bGVzaGVldC11cmkgZm9sb3NpbmQgdW4gZWRpdG9yIGN1IGV2aWRlbnRpYXRvciBkZSBzaW50YXhhIGRpbiBicm93c2VyLg0KUG9hdGUgaW5sb2N1aSBhdGF0IHVuIG1vZHVsIHd5c2l3eWcsIHNpIHNhIGZ1bmN0aW9uZXplIGRlIHNpbmUgc3RhdGF0b3IgcGVudHJ1IGVkaXRhcmUgZGUgdGVtcGxhdGUvc3R5bGVzaGVldC4NCjxici8+PGJyLz4NCjxzdHJvbmc+Q3VtIHNlIGZvbG9zZXNlIGFjZXN0IG1vZHVsPzwvc3Ryb25nPg0KSW5zdGFsYXRpLWwsIHNpIGFsZWdldGktbCBpbiBwcmVmZXJpbnRlbGUgZGUgdXRpbGl6YXRvciBkaW4gYWRtaW4uJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuOTEyMjc0MjY0LjEyNzA2NDIzMTMuMTI3MDY0MjMxMy4xMjcwNjQyMzEzLjEnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1My4xLjEwLjEyNzA2NDIzMTMnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEyNzA2NDIzMTMuMS4xLnV0bWNzcj0oZGlyZWN0KXx1dG1jY249KGRpcmVjdCl8dXRtY21kPShub25lKSc7CiRsYW5nWydxY2EnXSA9ICdQMC0xMzMwMTMwNTY4LTEyNzA2NDIzMTM2ODInOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/sv_SE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3Igc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0NvZGVNaXJyb3ItbW9kdWxlbiBpbnN0YWxsZXJhZGVzIHV0YW4gbiZhcmluZztncmEgcHJvYmxlbSc7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJyYjMDM5O1lvdSBuZWVkIHRoZSAmIzAzOTslcyYjMDM5OyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhhdCBmdW5jdGlvbi4nOwokbGFuZ1snc2V0dGluZ3N0YWInXSA9ICdJbnN0JmF1bWw7bGxuaW5nYXInOwokbGFuZ1snc2F2ZXNldHRpbmdzJ10gPSAnU3BhcmEgaW5zdCZhdW1sO2xsbmluZ2FyJzsKJGxhbmdbJ3NldHRpbmdzc2F2ZWQnXSA9ICdJbnN0JmF1bWw7bGxuaW5nYXIgc3BhcmFkZXMnOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdIVE1MIHN5bnRheCB0ZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1Mgc3ludGF4IHRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBzeW50YXggdGVzdCc7CiRsYW5nWydqc3Rlc3QnXSA9ICdKYXZhU2NyaXB0IHN5bnRheCB0ZXN0JzsKJGxhbmdbJ2V4YW1wbGVzeW50YXgnXSA9ICdTeW50YXggYXR0IHRlc3RhIG1lZCc7CiRsYW5nWydjaGFuZ2UnXSA9ICcmQXVtbDtuZHJhLi4uJzsKJGxhbmdbJ3Nob3dsaW5lbnVtYmVycyddID0gJ1Zpc2EgcmFkbnVtbWVyJzsKJGxhbmdbJ3RleHR3cmFwcGluZyddID0gJ1dyYXAgbG9uZyBsaW5lcyc7CiRsYW5nWydoZWxwJ10gPSAnPHN0cm9uZz5XaGF0IGRvZXMgdGhpcyBtb2R1bGUgZG8/PC9zdHJvbmc+DQo8YnIvPg0KVGhlIENvZGVNaXJyb3IgbW9kdWxlIGFsbG93cyB5b3UgdG8gZWRpdCBjb250ZW50LCB0ZW1wbGF0ZXMgYW5kIHN0eWxlc2hlZXRzIHVzaW5nIGEgc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvciBpbnNpZGUgeW91ciBicm93c2VyLg0KSXQgY2FuIGJvdGggcmVwbGFjZSBhIHd5c2l3eWctbW9kdWxlLCBhbmQgYWN0IHN0YW5kYWxvbmUgZm9yIHRlbXBsYXRlL3N0eWxlc2hlZXQgZWRpdGluZyAob25seSBzdXBwb3J0ZWQgaW4gQ01TbXMgMS4xKykNCjxici8+PGJyLz4NCjxzdHJvbmc+SG93IGRvIEkgdXNlIHRoaXMgbW9kdWxlPzwvc3Ryb25nPg0KWW91IHNpbXBseSBpbnN0YWxsIGl0LCBhbmQgY2hvb3NlIGl0IGluIHlvdXIgYWRtaW4gdXNlciBwcmVmZXJlbmNlcy4gTm90ZSwgdGhhdCBpZiB5b3UgdXNlIENNU21zIDEuMSBvciBhYm92ZSB5b3UgY2FuDQpzZWxlY3QgQ29kZUFyZWEgYm90aCBhcyBhIFdZU0lXWUcgYW5kIGFzIGEgc3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IuJzsKJGxhbmdbJ3FjYSddID0gJ1AwLTEyMzE4NzIzMjUtMTI2OTM1OTMyMTE5NSc7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjEyNjk3Nzc2MDMuMTI2OTM1OTM0Mi4xMjY5MzU5MzQyLjEyNjkzNTkzNDIuMSc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzLjEuMTAuMTI2OTM1OTM0Mic7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTI2OTM1OTM0Mi4xLjEudXRtY3NyPWdvb2dsZXx1dG1jY249KG9yZ2FuaWMpfHV0bWNtZD1vcmdhbmljfHV0bWN0cj1jbXNtcyc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgic2hvd2xpbmVudW1iZXJzIiwxKTsKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgidXNlYXV0b2NvbXBsZXRlIiwxKTsKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgiYXV0b21hdGNocGFyZW5zIiwwKQo/Pg==]]></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[PHVsPgogIDxsaT4wLjEuNyAtIFVwZGF0ZWQgdG8gQ00gMC44MDwvbGk+CiAgPGxpPjAuMS42IC0gVXBkYXRlZCB0byBDTSAwLjcwLCBBZGRlZCBvcHRpb24gdG8gbWF0Y2ggcGFyZW50aGVzaXM8L2xpPgogIDxsaT4wLjEuNSAtIFVwZGF0ZWQgdG8gQ00gMC42NiwgcmVtb3ZlZCBhIHN0cmFuZ2UgXG4gY2hhciBmcm9tIGhlYWRlcm91dHB1dCwgbWFkZSB0YWJiaW5nIHdvcms8L2xpPgogIDxsaT4wLjEuNCAtIEZpeGVkIENQVSBob2dnaW5nIHByb2JsZW1zIGJ5IHJld3JpdGluZyB0ZXN0YXJlYS1jb2RlPC9saT4KICA8bGk+MC4xLjMgLSBVcGRhdGVkIHRvIENNIDAuNjUsIGFkZGVkIG9wdGlvbiB0byB0b2dnbGUgd29yZHdyYXA8L2xpPgogIDxsaT4wLjEuMiAtIFVwZGF0ZWQgdG8gQ00gMC42MzwvbGk+CiAgPGxpPjAuMS4xIC0gVXBkYXRlZCB0byBDTSAwLjYyLCBmaXhlZCBleGFtcGxlcyBhbmQgcHJvYmFibHkgZnVuY3Rpb25hbGl0eSBhcyB3ZWxsPC9saT4KICA8bGk+MC4xLjAgLSBJbml0aWFsIHJlbGVhc2UgPC9saT4KPC91bD4=]]></data>
	</file>
	<file>
	  <filename>/templates/codemirrorarea.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCBibGFjazsiPgo8dGV4dGFyZWEgaWQ9InskdGV4dGFyZWFpZH0iIG5hbWU9InskdGV4dGFyZWFuYW1lfSI+eyRjb250ZW50fTwvdGV4dGFyZWE+CjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogIHZhciBlZGl0b3J7JGlkfSA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKCd7JHRleHRhcmVhaWR9Jywge2xpdGVyYWx9e3svbGl0ZXJhbH0KICAgIHtpZiAkaGVpZ2h0IT0nJ31oZWlnaHQ6ICJ7JGhlaWdodH0iLAogICAgey9pZn0KICAgIGhlaWdodDogIjM1MHB4IiwKICAgIHBhcnNlcmZpbGU6IHskcGFyc2VyZmlsZX0sCiAgICBzdHlsZXNoZWV0OiB7JGNzc2ZpbGV9LAogICAgbGluZU51bWJlcnM6IHskbGluZW51bWJlcnN9LAogICAgdGV4dFdyYXBwaW5nOiB7JHRleHR3cmFwcGluZ30sCiAgICB0YWJNb2RlIDogImluZGVudCIsCiAgICBpbmRlbnRVbml0IDogMiwKICAgIGF1dG9NYXRjaFBhcmVucyA6IHskYXV0b21hdGNocGFyZW5zfSwKICAgIHBhdGg6ICJ7JHJvb3RfdXJsfS9tb2R1bGVzL0NvZGVNaXJyb3IvY29kZW1pcnJvci9qcy8iCgogIHtsaXRlcmFsfX0pO3svbGl0ZXJhbH0KPC9zY3JpcHQ+Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/settings.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRzdGFydGZvcm19CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHNob3dsaW5lbnVtYmVyc3RleHR9PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskc2hvd2xpbmVudW1iZXJzaW5wdXR9PC9wPgoJPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRleHR3cmFwcGluZ3RleHR9PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskdGV4dHdyYXBwaW5naW5wdXR9PC9wPgoJPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskYXV0b21hdGNocGFyZW5zdGV4dH08L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRhdXRvbWF0Y2hwYXJlbnNpbnB1dH08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRzdWJtaXR9PC9wPgoJPC9kaXY+CnskZW5kZm9ybX0K]]></data>
	</file>
</module>
