<?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>touchInlineEdit</name>
	<version>1.7</version>
  <mincmsversion>1.6.8</mincmsversion>
	<help><![CDATA[PGgzPlVzYWdlPC9oMz4KPHVsPgoJPGxpPkxvYWQgbW9kdWxlIC0ge2Ntc19tb2R1bGUgbW9kdWxlPSJ0b3VjaElubGluZUVkaXQifTwvbGk+Cgk8bGk+TWFyayBlZGl0YWJsZSBjb250ZW50cyAtIHtjb250ZW50IGlzZWRpdGFibGU9J3RydWUnfTwvbGk+CjwvdWw+CjxoMz5BYm91dDwvaDM+Cjx1bD4KCTxsaT5Db3B5cmlnaHQgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8iPnRvdWNoRGVzaWduPC9hPjwvbGk+Cgk8bGk+QXV0b3IgQ2hyaXN0b3BoIEdydWJlcjwvbGk+Cgk8bGk+U3VwcG9ydCB2aWEgPGEgaHJlZj0iaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMCI+SFBDPC9hPjwvbGk+Cgk8bGk+TGljZW5zZSBHUEwgMi4wPC9saT4KPC91bD4=]]></help>
	<about><![CDATA[PGJyIC8+QXV0b3I6IENocmlzdG9waCBHcnViZXIgPHRvdWNoRGVzaWduLmRlPiAmbHQ7Yy5ncnViZXJAdG91Y2hkZXNpZ24uZGUmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbiA6IDEuNzxiciAvPg==]]></about>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogYWN0aW9uLmRlZmF1bHQucGhwIDY2IDIwMTAtMDktMjQgMTQ6MjI6MTJaIHRvdWNoZGVzaWduICQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuNwogKiBAY29weXJpZ2h0IDIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqIEB0b2RvIGFkZCBjb250ZW50X2Jsb2NrIGhhbmRsaW5nCiAqIAogKiAtLQogKgogKiBVc2FnZTogCiAqCiAqIHtjbXNfbW9kdWxlIG1vZHVsZT0idG91Y2hJbmxpbmVFZGl0In0KICoKICoge2NvbnRlbnQgaXNlZGl0YWJsZT0ndHJ1ZSd9CiAqCiAqIC0tCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKICoKICovCgpnbG9iYWwgJGdDbXM7CgppZihpc3NldCgkZ0Ntcy0+bW9kdWxlc1sndG91Y2hJbmxpbmVFZGl0J10pIAoJJiYgaXNfb2JqZWN0KCRnQ21zLT5tb2R1bGVzWyd0b3VjaElubGluZUVkaXQnXVsnb2JqZWN0J10pKXsKCgkkdG91Y2hJbmxpbmVFZGl0ID0gJGdDbXMtPm1vZHVsZXNbJ3RvdWNoSW5saW5lRWRpdCddWydvYmplY3QnXTsKCglpZigkdG91Y2hJbmxpbmVFZGl0LT5oYXNJbmxpbmVFZGl0UmlnaHRzKCkpewoJCWlmKCR0b3VjaElubGluZUVkaXQtPmlzQUpBWFJlcXVlc3QoKSl7CgkJCXN3aXRjaCAoJF9QT1NUWydtZXRob2QnXSl7CgkJCQljYXNlICd1cGRhdGVDb250ZW50JzoKCQkJCQlkaWUoJHRvdWNoSW5saW5lRWRpdC0+dXBkYXRlQ29udGVudCgpKTsKCQkJCWNhc2UgJ2dldENvbnRlbnQnOgoJCQkJCWRpZSgkdG91Y2hJbmxpbmVFZGl0LT5nZXRDb250ZW50KCkpOwoJCQl9CgkJfQoJfQp9Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogYWN0aW9uLmRlZmF1bHRhZG1pbi5waHAgNjYgMjAxMC0wOS0yNCAxNDoyMjoxMlogdG91Y2hkZXNpZ24gJAogKgogKiB0b3VjaElubGluZUVkaXQgTW9kdWxlCiAqCiAqIENvcHlyaWdodCAoYykgMjAxMCB0b3VjaERlc2lnbiwgPHd3dy50b3VjaGRlc2lnbi5kZT4KICoKICogQGNhdGVnb3J5IE1vZHVsZQogKiBAYXV0aG9yIENocmlzdG9waCBHcnViZXIgPHd3dy50b3VjaGRlc2lnbi5kZT4KICogQHZlcnNpb24gMS43CiAqIEBjb3B5cmlnaHQgMjAxMCB0b3VjaERlc2lnbgogKiBAbGluayBodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLwogKiBAbGluayBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wCiAqIEBsaW5rIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hJbmxpbmVFZGl0CiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMIDIuMCkKICogQHRvZG8gYWRkIGNvbnRlbnRfYmxvY2sgaGFuZGxpbmcKICogCiAqIC0tCiAqCiAqIFVzYWdlOiAKICoKICoge2Ntc19tb2R1bGUgbW9kdWxlPSJ0b3VjaElubGluZUVkaXQifQogKgogKiB7Y29udGVudCBpc2VkaXRhYmxlPSd0cnVlJ30KICoKICogLS0KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICogT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAogKgogKi8KCmlmKCFpc3NldCgkZ0NtcykpewoJZXhpdDsKfQoKaWYoISR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ1VzZSB0b3VjaElubGluZUVkaXQnKSl7CgllY2hvICR0aGlzLT5sYW5nKCJub3Blcm1pc3Npb24iKTsKCXJldHVybjsKfQoKLy8gQWN0aXZlIHRhYgokYWN0aXZlVGFiID0gIiI7CmlmKCFlbXB0eSgkcGFyYW1zWyJ0YWIiXSkpewoJJGFjdGl2ZVRhYiA9ICRwYXJhbXNbInRhYiJdOwp9CgokeW4gPSBhcnJheSgKCSR0aGlzLT5MYW5nKCJ5ZXMiKSA9PiAnWScsCgkkdGhpcy0+TGFuZygibm8iKSA9PiAnTicKKTsKCiRib29sID0gYXJyYXkoCgkkdGhpcy0+TGFuZygieWVzIikgPT4gJ3RydWUnLAoJJHRoaXMtPkxhbmcoIm5vIikgPT4gJ2ZhbHNlJwopOwoKZWNobyAkdGhpcy0+U3RhcnRUYWJIZWFkZXJzKCk7CgplY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoInNldHRpbmdzIiwkdGhpcy0+TGFuZygic2V0dGluZ3MiKSwoJGFjdGl2ZVRhYiA9PSAnc2V0dGluZ3MnID8gdHJ1ZSA6IGZhbHNlKSk7CmVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigidGVtcGxhdGVzIiwkdGhpcy0+TGFuZygidGVtcGxhdGVzIiksKCRhY3RpdmVUYWIgPT0gJ3RlbXBsYXRlcycgPyB0cnVlIDogZmFsc2UpKTsKZWNobyAkdGhpcy0+U2V0VGFiSGVhZGVyKCJlZGl0b3IiLCR0aGlzLT5MYW5nKCJlZGl0b3IiKSwoJGFjdGl2ZVRhYiA9PSAnZWRpdG9yJyA/IHRydWUgOiBmYWxzZSkpOwoKZWNobyAkdGhpcy0+RW5kVGFiSGVhZGVycygpOwoKZWNobyAkdGhpcy0+U3RhcnRUYWJDb250ZW50KCk7CgovLyBUYWIgc2V0dGluZ3MKZWNobyAkdGhpcy0+U3RhcnRUYWIoInNldHRpbmdzIik7CmluY2x1ZGUoZGlybmFtZShfX0ZJTEVfXykuJy9mdW5jdGlvbi5hZG1pbl9zZXR0aW5ncy5waHAnKTsKZWNobyAkdGhpcy0+RW5kVGFiKCk7CgovLyBUYWIgdGVtcGxhdGVzCmlmKCR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBUZW1wbGF0ZXMnKSl7CgoJZWNobyAkdGhpcy0+U3RhcnRUYWIoInRlbXBsYXRlcyIpOwoJaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKS4nL2Z1bmN0aW9uLmFkbWluX3RlbXBsYXRlcy5waHAnKTsKCWVjaG8gJHRoaXMtPkVuZFRhYigpOwoKfQoKLy8gRWRpdG9yIHNwZWNpZmljIHNldHRpbmdzCmlmKG1ldGhvZF9leGlzdHMoJHRoaXMtPmVkaXRvciwnZ2V0QWRtaW5Db25maWcnKSl7CgoJZWNobyAkdGhpcy0+U3RhcnRUYWIoImVkaXRvciIpOwoJaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKS4nL2Z1bmN0aW9uLmFkbWluX2VkaXRvci5waHAnKTsKCWVjaG8gJHRoaXMtPkVuZFRhYigpOwoKfQoKZWNobyAkdGhpcy0+RW5kVGFiQ29udGVudCgpOwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/action.edittemplate.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZCQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuNwogKiBAY29weXJpZ2h0IDA0LjA4LjIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqIEB0b2RvIGFkZCBjb250ZW50X2Jsb2NrIGhhbmRsaW5nCiAqIAogKiAtLQogKgogKiBVc2FnZTogCiAqCiAqIHtjbXNfbW9kdWxlIG1vZHVsZT0idG91Y2hJbmxpbmVFZGl0In0KICoKICoge2NvbnRlbnQgaXNlZGl0YWJsZT0ndHJ1ZSd9CiAqCiAqIC0tCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKICoKICovCgppZighaXNzZXQoJGdDbXMpKXsKCWV4aXQ7Cn0KCmlmKCEkdGhpcy0+VmlzaWJsZVRvQWRtaW5Vc2VyKCkpewoJJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoImFjY2Vzc2RlbmllZCIpKTsKCXJldHVybjsKfQoKLy8gRm9ybSBzdGFydAokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Zvcm1zdGFydCcsJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsInNhdmV0ZW1wbGF0ZSIsJHJldHVybmlkKSk7CgokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RlbXBsYXRlJywkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oJGlkLCJ0ZW1wbGF0ZSIsJHBhcmFtc1sndGVtcGxhdGUnXSkpOwoKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0ZW1wbGF0ZV9uYW1lJywkcGFyYW1zWyd0ZW1wbGF0ZSddKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0ZW1wbGF0ZV9jb250ZW50JywkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoZmFsc2UsJGlkLCR0aGlzLT5HZXRUZW1wbGF0ZSgkcGFyYW1zWyd0ZW1wbGF0ZSddKSwKCSd0ZW1wbGF0ZV9jb250ZW50JywicGFnZXNtYWxsdGV4dGFyZWEiLCIiLCIiLCIiLCc0MCcsJzUnKSk7CgovLyBTdWJtaXQgLyBjYW5jZWwKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLCR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsInN1Ym1pdCIsJHRoaXMtPkxhbmcoInNhdmUiKSkpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Jlc2V0JywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCJyZXNldCIsJHRoaXMtPkxhbmcoInJlc2V0IikpKTsKCi8vIEZvcm0gZW5kCiR0aGlzLT5zbWFydHktPmFzc2lnbignZm9ybWVuZCcsJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CgplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoImFkbWluZWRpdHRlbXBsYXRlLnRwbCIpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.saveeditor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogYWN0aW9uLnNhdmVzZXR0aW5ncy5waHAgNTEgMjAxMC0wOS0xMyAxNDowNjoyNVogdG91Y2hkZXNpZ24gJAogKgogKiB0b3VjaElubGluZUVkaXQgTW9kdWxlCiAqCiAqIENvcHlyaWdodCAoYykgMjAxMCB0b3VjaERlc2lnbiwgPHd3dy50b3VjaGRlc2lnbi5kZT4KICoKICogQGNhdGVnb3J5IE1vZHVsZQogKiBAYXV0aG9yIENocmlzdG9waCBHcnViZXIgPHd3dy50b3VjaGRlc2lnbi5kZT4KICogQHZlcnNpb24gMS43CiAqIEBjb3B5cmlnaHQgMDQuMDguMjAxMCB0b3VjaERlc2lnbgogKiBAbGluayBodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLwogKiBAbGluayBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wCiAqIEBsaW5rIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hJbmxpbmVFZGl0CiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMIDIuMCkKICogQHRvZG8gYWRkIGNvbnRlbnRfYmxvY2sgaGFuZGxpbmcKICogCiAqIC0tCiAqCiAqIFVzYWdlOiAKICoKICoge2Ntc19tb2R1bGUgbW9kdWxlPSJ0b3VjaElubGluZUVkaXQifQogKgogKiB7Y29udGVudCBpc2VkaXRhYmxlPSd0cnVlJ30KICoKICogLS0KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICogT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAogKgogKi8KCmlmKCEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBTZXR0aW5ncycpKXsKCWVjaG8gJHRoaXMtPmxhbmcoIm5vcGVybWlzc2lvbiIpOwoJcmV0dXJuOwp9CgokdGhpcy0+ZWRpdG9yLT5zYXZlQWRtaW5Db25maWcoJHBhcmFtcyk7CgokdGhpcy0+UmVkaXJlY3QoJGlkLCAnZGVmYXVsdGFkbWluJywgJycsIGFycmF5KCJtb2R1bGVfbWVzc2FnZSIgPT4gJHRoaXMtPkxhbmcoInNldHRpbmdzc2F2ZWQiKSwidGFiIiA9PiAiZWRpdG9yIikpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.savesettings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogYWN0aW9uLnNhdmVzZXR0aW5ncy5waHAgNjYgMjAxMC0wOS0yNCAxNDoyMjoxMlogdG91Y2hkZXNpZ24gJAogKgogKiB0b3VjaElubGluZUVkaXQgTW9kdWxlCiAqCiAqIENvcHlyaWdodCAoYykgMjAxMCB0b3VjaERlc2lnbiwgPHd3dy50b3VjaGRlc2lnbi5kZT4KICoKICogQGNhdGVnb3J5IE1vZHVsZQogKiBAYXV0aG9yIENocmlzdG9waCBHcnViZXIgPHd3dy50b3VjaGRlc2lnbi5kZT4KICogQHZlcnNpb24gMS43CiAqIEBjb3B5cmlnaHQgMDQuMDguMjAxMCB0b3VjaERlc2lnbgogKiBAbGluayBodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLwogKiBAbGluayBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wCiAqIEBsaW5rIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hJbmxpbmVFZGl0CiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMIDIuMCkKICogQHRvZG8gYWRkIGNvbnRlbnRfYmxvY2sgaGFuZGxpbmcKICogCiAqIC0tCiAqCiAqIFVzYWdlOiAKICoKICoge2Ntc19tb2R1bGUgbW9kdWxlPSJ0b3VjaElubGluZUVkaXQifQogKgogKiB7Y29udGVudCBpc2VkaXRhYmxlPSd0cnVlJ30KICoKICogLS0KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICogT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAogKgogKi8KCmlmKCEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBTZXR0aW5ncycpKXsKCWVjaG8gJHRoaXMtPmxhbmcoIm5vcGVybWlzc2lvbiIpOwoJcmV0dXJuOwp9CgppZihpc3NldCgkcGFyYW1zWyJmZUVkaXRCdXR0b24iXSkgJiYgIWVtcHR5KCRwYXJhbXNbImZlRWRpdEJ1dHRvbiJdKSl7CgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgidG91Y2hJbmxpbmVFZGl0LmZlRWRpdEJ1dHRvbiIsJHBhcmFtc1siZmVFZGl0QnV0dG9uIl0pOwp9CmlmKGlzc2V0KCRwYXJhbXNbImZlRWRpdE9uRGJsQ2xpY2siXSkgJiYgIWVtcHR5KCRwYXJhbXNbImZlRWRpdE9uRGJsQ2xpY2siXSkpewoJJHRoaXMtPlNldFByZWZlcmVuY2UoInRvdWNoSW5saW5lRWRpdC5mZUVkaXRPbkRibENsaWNrIiwkcGFyYW1zWyJmZUVkaXRPbkRibENsaWNrIl0pOwp9CmlmKGlzc2V0KCRwYXJhbXNbImZlVXBkYXRlQWxlcnQiXSkgJiYgIWVtcHR5KCRwYXJhbXNbImZlVXBkYXRlQWxlcnQiXSkpewoJJHRoaXMtPlNldFByZWZlcmVuY2UoInRvdWNoSW5saW5lRWRpdC5mZVVwZGF0ZUFsZXJ0IiwkcGFyYW1zWyJmZVVwZGF0ZUFsZXJ0Il0pOwp9CmlmKGlzc2V0KCRwYXJhbXNbImZlUGx1Z2luIl0pICYmICFlbXB0eSgkcGFyYW1zWyJmZVBsdWdpbiJdKSl7CgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgidG91Y2hJbmxpbmVFZGl0LmZlUGx1Z2luIiwkcGFyYW1zWyJmZVBsdWdpbiJdKTsKCWlmKG1ldGhvZF9leGlzdHMoJHRoaXMtPmVkaXRvciwnaW5zdGFsbCcpKXsKCQkkdGhpcy0+ZWRpdG9yLT5pbnN0YWxsKCk7Cgl9Cn0KCiR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAnJywgYXJyYXkoIm1vZHVsZV9tZXNzYWdlIiA9PiAkdGhpcy0+TGFuZygic2V0dGluZ3NzYXZlZCIpLCJ0YWIiID0+ICJzZXR0aW5ncyIpKTsKCj8+]]></data>
	</file>
	<file>
	  <filename>/action.savetemplate.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogYWN0aW9uLnNhdmVzZXR0aW5ncy5waHAgOCAyMDEwLTA4LTI4IDAzOjU2OjA5WiB0b3VjaGRlc2lnbiAkCiAqCiAqIHRvdWNoSW5saW5lRWRpdCBNb2R1bGUKICoKICogQ29weXJpZ2h0IChjKSAyMDEwIHRvdWNoRGVzaWduLCA8d3d3LnRvdWNoZGVzaWduLmRlPgogKgogKiBAY2F0ZWdvcnkgTW9kdWxlCiAqIEBhdXRob3IgQ2hyaXN0b3BoIEdydWJlciA8d3d3LnRvdWNoZGVzaWduLmRlPgogKiBAdmVyc2lvbiAxLjcKICogQGNvcHlyaWdodCAwNC4wOC4yMDEwIHRvdWNoRGVzaWduCiAqIEBsaW5rIGh0dHA6Ly93d3cudG91Y2hkZXNpZ24uZGUvCiAqIEBsaW5rIGh0dHA6Ly93d3cuaG9tZXBhZ2UtY29tbXVuaXR5LmRlL2luZGV4LnBocD90b3BpYz0xNjgwLjAKICogQGxpbmsgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy90b3VjaElubGluZUVkaXQKICogQGxpY2Vuc2UgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwgMi4wKQogKiBAdG9kbyBhZGQgY29udGVudF9ibG9jayBoYW5kbGluZwogKiAKICogLS0KICoKICogVXNhZ2U6IAogKgogKiB7Y21zX21vZHVsZSBtb2R1bGU9InRvdWNoSW5saW5lRWRpdCJ9CiAqCiAqIHtjb250ZW50IGlzZWRpdGFibGU9J3RydWUnfQogKgogKiAtLQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogKiBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiAqCiAqLwoKaWYoISR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBUZW1wbGF0ZXMnKSl7CgllY2hvICR0aGlzLT5sYW5nKCJub3Blcm1pc3Npb24iKTsKCXJldHVybjsKfQoKaWYoaXNzZXQoJHBhcmFtc1sncmVzZXQnXSkpewoJJHRoaXMtPlNldFRlbXBsYXRlKCRwYXJhbXNbJ3RlbXBsYXRlJ10sICR0aGlzLT5nZXREZWZhdWx0VGVtcGxhdGUoJHBhcmFtc1sndGVtcGxhdGUnXSkpOwp9ZWxzZWlmKGlzc2V0KCRwYXJhbXNbInRlbXBsYXRlX2NvbnRlbnQiXSkgJiYgIWVtcHR5KCRwYXJhbXNbInRlbXBsYXRlX2NvbnRlbnQiXSkpewoJJHRoaXMtPlNldFRlbXBsYXRlKCRwYXJhbXNbJ3RlbXBsYXRlJ10sICRwYXJhbXNbJ3RlbXBsYXRlX2NvbnRlbnQnXSk7Cn0KCiR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAnJywgYXJyYXkoIm1vZHVsZV9tZXNzYWdlIiA9PiAkdGhpcy0+TGFuZygidGVtcGxhdGVzc2F2ZWQiKSwidGFiIiA9PiAidGVtcGxhdGVzIikpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/CHANGELOG.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8vIFZlcnNpb24gMS43CgpBZGQgdGVtcGxhdGUgbGlzdCBpbiBCQQpBZGQgcGx1Z2luIHN5c3RlbQpBZGQgbmV3IHRhYiBlZGl0b3IgaW4gQkEKVXBkYXRlIHRyYW5zbGF0aW9ucwpBZGQgcGx1Z2luIG5pY2VkaXQKQWRkIHBsdWdpbiBlbHJ0ZQpSZW1vdmUgalF1ZXJ5IGNvbnRleHRtZW51ClVwZGF0ZSBJbnN0YWxsZXIKVXBkYXRlIGljb25zIHBhdGggZm9yIG5pY2VkaXQKQWRkIENNU21zIG1heCB2ZXJzaW9uCgovLy8gVmVyc2lvbiAxLjYKCkFkZCBvcHRpb24gdG8gZW5hYmxlL2Rpc2FibGUgaW5saW5lRWRpdCBvbiBkYmxjbGljawpBZGQgb3B0aW9uYWwgY29udGV4dCBtZW51ICh0ZXN0aW5nKQpFbmFibGUgbG9nZ2luZyBpbiBpbnN0YWxsZXIgYW5kIHVwZ3JhZGUgbWV0aG9kcwpFbmFibGUgbG9nZ2luZyBvbiBjb250ZW50IGFjdGlvbnMKTW92ZSBzb21lIHN0dWZmIGludG8gZXZlbnQgbWFuYWdlcgpDbGVhbiBjb2RlIAoKLy8vIFZlcnNpb24gMS41CgpBZGQgaHRtbCBzb3VyY2UgY29kZSBlZGl0b3IKQWRkIHhodG1sIHN1cHBvcnQgKGV4cGVyaW1lbnRhbCkKRml4IGFqYXggcmVxdWVzdCBlbmNvZGluZwpCdWdmaXgKCi8vLyBWZXJzaW9uIDEuNAoKTW92ZSBqYXZhc2NyaXB0cyBleHRlcm5hbApVcGRhdGUgZmV0Y2ggdHBsIGNvbnRlbnRzIChwbHVnaW5zLHRhZ3MsbW9kdWxlcykgb24gY29udGVudCB1cGRhdGUKU29tZSBidWdmaXhlcyAKCi8vLyBWZXJzaW9uIDEuMwoKQWRkIGJ1dHRvbiB0ZW1wbGF0ZQpBZGQgb3B0aW9uIHRvIGxvYWQganF1ZXJ5ClVwZGF0ZSBsYW5ndWFnZQpVcGRhdGUgY29udGVudCB1cGRhdGUKQ2xlYW4gY29kZQoKLy8vIFZlcnNpb24gMS4yCgpBZGQgdXBncmFkZSBtZXRob2QKQWRkIENNUyBtaW5pbXVtIHZlcnNpb24KQWRkIGNzcyBjbGFzcyAudG91Y2hJbmxpbmVFZGl0QnV0dG9uIHt9CkZpeCBjb21waWxlZCBjb250ZW50X2lkCgovLy8gVmVyc2lvbiAxLjEKCkFkZCBzb21lIHNldHRpbmdzIGluIGFkbWluIHBhbmVsClVwZGF0ZSB0cmFuc2xhdGlvbgpBZGQgZ2VybWFuIHRyYW5zbGF0aW9uCkFkZCBwb3N0aW5zdGFsbCBtZXNzYWdlCkFkZCBwb3N0dW5pbnN0YWxsIG1lc3NhZ2UKCi8vLyBWZXJzaW9uIDEuMAoKSW5pdGlhbCByZWxlYXNl]]></data>
	</file>
	<file>
	  <filename>/function.admin_editor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZCQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuNwogKiBAY29weXJpZ2h0IDA0LjA4LjIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqIEB0b2RvIGFkZCBjb250ZW50X2Jsb2NrIGhhbmRsaW5nCiAqIAogKiAtLQogKgogKiBVc2FnZTogCiAqCiAqIHtjbXNfbW9kdWxlIG1vZHVsZT0idG91Y2hJbmxpbmVFZGl0In0KICoKICoge2NvbnRlbnQgaXNlZGl0YWJsZT0ndHJ1ZSd9CiAqCiAqIC0tCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKICoKICovCgppZighaXNzZXQoJGdDbXMpKXsgCglleGl0Owp9CgppZighJHRoaXMtPlZpc2libGVUb0FkbWluVXNlcigpKXsKCSR0aGlzLT5TaG93RXJyb3JzKCR0aGlzLT5MYW5nKCJhY2Nlc3NkZW5pZWQiKSk7CglyZXR1cm47Cn0KCiR0aGlzLT5lZGl0b3ItPmdldEFkbWluQ29uZmlnKCRpZCwkcmV0dXJuaWQpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/function.admin_settings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZCQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuNwogKiBAY29weXJpZ2h0IDA0LjA4LjIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqIEB0b2RvIGFkZCBjb250ZW50X2Jsb2NrIGhhbmRsaW5nCiAqIAogKiAtLQogKgogKiBVc2FnZTogCiAqCiAqIHtjbXNfbW9kdWxlIG1vZHVsZT0idG91Y2hJbmxpbmVFZGl0In0KICoKICoge2NvbnRlbnQgaXNlZGl0YWJsZT0ndHJ1ZSd9CiAqCiAqIC0tCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKICoKICovCgppZighaXNzZXQoJGdDbXMpKXsgCglleGl0Owp9CgppZighJHRoaXMtPlZpc2libGVUb0FkbWluVXNlcigpKXsKCSR0aGlzLT5TaG93RXJyb3JzKCR0aGlzLT5MYW5nKCJhY2Nlc3NkZW5pZWQiKSk7CglyZXR1cm47Cn0KCi8vIEZvcm0gc3RhcnQKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmb3Jtc3RhcnQnLCR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCJzYXZlc2V0dGluZ3MiLCRyZXR1cm5pZCkpOwoKLy8gU2VsZWN0IGlubGluZSBlZGl0b3IKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmZVBsdWdpbl9sYWJlbCcsJHRoaXMtPkxhbmcoImZlUGx1Z2luX2xhYmVsIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZlUGx1Z2luX2hlbHAnLCR0aGlzLT5MYW5nKCJmZVBsdWdpbl9oZWxwIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZlUGx1Z2luX2lucHV0JywkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93bigkaWQsImZlUGx1Z2luIiwkdGhpcy0+Z2V0UGx1Z2lucygpLCIiLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0b3VjaElubGluZUVkaXQuZmVQbHVnaW4iKSwiXG4iKSk7CgovLyBFbmFibGUgZGlzYWJsZSBpbmxpbmVFZGl0IGJ1dHRvbiBpbiBGRQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZlRWRpdEJ1dHRvbl9sYWJlbCcsJHRoaXMtPkxhbmcoImZlRWRpdEJ1dHRvbl9sYWJlbCIpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmZUVkaXRCdXR0b25faGVscCcsJHRoaXMtPkxhbmcoImZlRWRpdEJ1dHRvbl9oZWxwIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZlRWRpdEJ1dHRvbl9pbnB1dCcsJHRoaXMtPkNyZWF0ZUlucHV0UmFkaW9Hcm91cCgkaWQsImZlRWRpdEJ1dHRvbiIsJHluLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0b3VjaElubGluZUVkaXQuZmVFZGl0QnV0dG9uIiwiWSIpLCIiLCJcbiIpKTsKCi8vIEVuYWJsZSBkaXNhYmxlIGlubGluZUVkaXQgb24gZG91YmxlIGNsaWNrCiR0aGlzLT5zbWFydHktPmFzc2lnbignZmVFZGl0T25EYmxDbGlja19sYWJlbCcsJHRoaXMtPkxhbmcoImZlRWRpdE9uRGJsQ2xpY2tfbGFiZWwiKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignZmVFZGl0T25EYmxDbGlja19oZWxwJywkdGhpcy0+TGFuZygiZmVFZGl0T25EYmxDbGlja19oZWxwIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZlRWRpdE9uRGJsQ2xpY2tfaW5wdXQnLCR0aGlzLT5DcmVhdGVJbnB1dFJhZGlvR3JvdXAoJGlkLCJmZUVkaXRPbkRibENsaWNrIiwkYm9vbCwkdGhpcy0+R2V0UHJlZmVyZW5jZSgidG91Y2hJbmxpbmVFZGl0LmZlRWRpdE9uRGJsQ2xpY2siLCJ0cnVlIiksIiIsIlxuIikpOwoKLy8gRW5hYmxlIGFsZXJ0IGFuIGNvbnRlbnQgdXBkYXRlCiR0aGlzLT5zbWFydHktPmFzc2lnbignZmVVcGRhdGVBbGVydF9sYWJlbCcsJHRoaXMtPkxhbmcoImZlVXBkYXRlQWxlcnRfbGFiZWwiKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignZmVVcGRhdGVBbGVydF9oZWxwJywkdGhpcy0+TGFuZygiZmVVcGRhdGVBbGVydF9oZWxwIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZlVXBkYXRlQWxlcnRfaW5wdXQnLCR0aGlzLT5DcmVhdGVJbnB1dFJhZGlvR3JvdXAoJGlkLCJmZVVwZGF0ZUFsZXJ0IiwkYm9vbCwkdGhpcy0+R2V0UHJlZmVyZW5jZSgidG91Y2hJbmxpbmVFZGl0LmZlVXBkYXRlQWxlcnQiLCJ0cnVlIiksIiIsIlxuIikpOwoKLy8gU3VibWl0IC8gY2FuY2VsCiR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCJzdWJtaXQiLCR0aGlzLT5MYW5nKCJzYXZlIikpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjYW5jZWwnLCR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsImNhbmNlbCIsJHRoaXMtPkxhbmcoImNhbmNlbCIpKSk7CgovLyBGb3JtIGVuZAokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Zvcm1lbmQnLCR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCJhZG1pbnNldHRpbmdzLnRwbCIpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/function.admin_templates.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZCQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuNwogKiBAY29weXJpZ2h0IDA0LjA4LjIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqIEB0b2RvIGFkZCBjb250ZW50X2Jsb2NrIGhhbmRsaW5nCiAqIAogKiAtLQogKgogKiBVc2FnZTogCiAqCiAqIHtjbXNfbW9kdWxlIG1vZHVsZT0idG91Y2hJbmxpbmVFZGl0In0KICoKICoge2NvbnRlbnQgaXNlZGl0YWJsZT0ndHJ1ZSd9CiAqCiAqIC0tCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKICoKICovCgppZighaXNzZXQoJGdDbXMpKXsKCWV4aXQ7Cn0KCmlmKCEkdGhpcy0+VmlzaWJsZVRvQWRtaW5Vc2VyKCkpewoJJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoImFjY2Vzc2RlbmllZCIpKTsKCXJldHVybjsKfQoKJGl0ZW1zID0gYXJyYXkoKTsgJHJvd2NsYXNzID0gJ3JvdzEnOwpmb3JlYWNoKCR0aGlzLT5MaXN0VGVtcGxhdGVzKCkgQVMgJHRlbXBsYXRlKXsKCgkkcm93ID0gbmV3IFN0ZENsYXNzKCk7CgoJJHJvdy0+cm93Y2xhc3MgPSAkcm93Y2xhc3M7Cgkkcm93LT5uYW1lID0gJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCdlZGl0dGVtcGxhdGUnLCRyZXR1cm5pZCwKCQkkdGVtcGxhdGUsYXJyYXkoJ3RlbXBsYXRlJyA9PiAkdGVtcGxhdGUsJ21vZGUnPT4nZWRpdCcpKTsKCSRyb3ctPmVkaXRsaW5rID0gJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCAnZWRpdHRlbXBsYXRlJywkcmV0dXJuaWQsIAoJCSRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vZWRpdC5naWYnLCAKCQkkdGhpcy0+TGFuZygnZWRpdCcpLCcnLCcnLCdzeXN0ZW1pY29uJyksYXJyYXkoJ3RlbXBsYXRlJyA9PiAkdGVtcGxhdGUsJ21vZGUnPT4nZWRpdCcpKTsKCgkkcm93Y2xhc3MgPT0gInJvdzEiID8gJHJvd2NsYXNzID0gInJvdzIiIDogJHJvd2NsYXNzID0gInJvdzEiOwoKCSRpdGVtc1tdID0gJHJvdzsKCn0KCiR0aGlzLT5zbWFydHktPmFzc2lnbignaXRlbXMnLCRpdGVtcyk7CiR0aGlzLT5zbWFydHktPmFzc2lnbigndGFibGVfY29sX3RlbXBsYXRlJywkdGhpcy0+TGFuZygidGFibGVjb2x0ZW1wbGF0ZSIpKTsKCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgiYWRtaW50ZW1wbGF0ZXMudHBsIik7Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/de_DE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiRsYW5nWydoZWxwJ10gPSAnPGgzPlVzYWdlPC9oMz4KPHVsPgoJPGxpPkxvYWQgbW9kdWxlIC0ge2Ntc19tb2R1bGUgbW9kdWxlPSJ0b3VjaElubGluZUVkaXQifTwvbGk+Cgk8bGk+TWFyayBlZGl0YWJsZSBjb250ZW50cyAtIHtjb250ZW50IGlzZWRpdGFibGU9XCd0cnVlXCd9PC9saT4KPC91bD4KPGgzPkFib3V0PC9oMz4KPHVsPgoJPGxpPkNvcHlyaWdodCBieSA8YSBocmVmPSJodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLyI+dG91Y2hEZXNpZ248L2E+PC9saT4KCTxsaT5BdXRvciBDaHJpc3RvcGggR3J1YmVyPC9saT4KCTxsaT5TdXBwb3J0IHZpYSA8YSBocmVmPSJodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wIj5IUEM8L2E+PC9saT4KCTxsaT5MaWNlbnNlIEdQTCAyLjA8L2xpPgo8L3VsPic7CiRsYW5nWydzZXR0aW5ncyddID0gJ0VpbnN0ZWxsdW5nZW4nOwokbGFuZ1sndGVtcGxhdGVzJ10gPSAnVGVtcGxhdGVzJzsKJGxhbmdbJ2VkaXRvciddID0gJ0VkaXRvcic7CiRsYW5nWyd0YWJsZWNvbHRlbXBsYXRlJ10gPSAnVGVtcGxhdGUnOwokbGFuZ1sneWVzJ10gPSAnSmEnOwokbGFuZ1snbm8nXSA9ICdOZWluJzsKJGxhbmdbJ3NhdmUnXSA9ICdTcGVpY2hlcm4nOwokbGFuZ1snY2FuY2VsJ10gPSAnQWJyZWNoZW4nOwokbGFuZ1snZWRpdCddID0gJ0JlYXJiZWl0ZW4nOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ0VpbnN0ZWxsdW5nZW4gZ2VzcGVpY2hlcnQuJzsKJGxhbmdbJ3RlbXBsYXRlc3NhdmVkJ10gPSAnVGVtcGxhdGUgZ2VzcGVpY2hlcnQuJzsKCiRsYW5nWydmZVBsdWdpbl9sYWJlbCddID0gJ1dlbGNoZXIgRWRpdG9yIHNvbGwgdmVyd2VuZGV0IHdlcmRlbj8nOwokbGFuZ1snZmVQbHVnaW5faGVscCddID0gJ1fDpGhsZW4gU2llIGVpbmVuIEVkaXRvciBkZW4gU2llIGltIEZyb250ZW5kIHp1bSBiZWFyYmVpdGVuIElocmVyIEluaGFsdGUgbnV0emVuIG3DtmNodGVuLic7CiRsYW5nWydmZUVkaXRCdXR0b25fbGFiZWwnXSA9ICdFZGl0IEJ1dHRvbiBpbSBGcm9udGVuZD8nOwokbGFuZ1snZmVFZGl0QnV0dG9uX2hlbHAnXSA9ICdGw7xnZSBlaW5lbiBCdXR0b24genVtIGVpbi9hdXNzY2hhbHRlbiB2b24gSW5saW5lRWRpdCBpbSBGcm9udGVuZCBoaW56dS4nOwokbGFuZ1snZmVVcGRhdGVBbGVydF9sYWJlbCddID0gJ1VwZGF0ZSBBbGVydD8nOwokbGFuZ1snZmVVcGRhdGVBbGVydF9oZWxwJ10gPSAnQWt0aXZpZXJlIFVwZGF0ZWFsZXJ0IGltIEZyb250ZW5kLic7CiRsYW5nWyd0b3VjaElubGluZUVkaXRCdXR0b25fbGFiZWwnXSA9ICdJbmxpbmUgRWRpdGJ1dHRvbiBUZW1wbGF0ZTonOwokbGFuZ1snZmVFZGl0T25EYmxDbGlja19sYWJlbCddID0gJ0FrdGl2aWVyZSBJbmxpbmVFZGl0IGR1cmNoIERvcHBlbGtsaWNrPyc7CiRsYW5nWydmZUVkaXRPbkRibENsaWNrX2hlbHAnXSA9ICdBa3RpdmllcmUgZGVzIElubGluZS1FZGl0b3JzIGR1cmNoIGVpbmVuIERvcHBlbGtsaWNrIGluIGluIGRlbiBDb250ZW50LUJlcmVpY2guJzsKJGxhbmdbJ2ZlSW5saW5lRWRpdEJ1dHRvbiddID0gJ0VkaXQnOwokbGFuZ1snZmVVcGRhdGVBbGVydCddID0gJ0VyZm9sZ3JlaWNoIGdlc3BlaWNoZXJ0Li4uJzsKCiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ01vZHVsIGluc3RhbGxhdGlvbiBlcmZvbGdyZWljaC4nOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ01vZHVsIGVyZm9sZ3JlaWNoIGRlaW5zdGFsbGllcnQuJzsKJGxhbmdbJ3Bvc3R1cGdyYWRlJ10gPSAnTW9kdWwgZXJmb2xncmVpY2ggYXVmIFZlcnNpb24gJXMgYWt0dWFsaXNpZXJ0Lic7CiRsYW5nWydwb3N0Y29udGVudHVwZGF0ZSddID0gJ0NvbnRlbnQgbWl0IGNvbnRlbnRfaWQ6JXMgYWt0dWFsaXNpZXJ0Lic7CiRsYW5nWydwcmV1bmluc3RhbGwnXSA9ICdTaW5kIFNpZSBzaWNoZXIgZGFzIFNpZSBkaWVzZXMgTW9kdWwgbmVic3QgRWluc3RlbGx1bmdlbiB1bmQgVGVtcGxhdGVzIGVudGZlcm5lbiBtw7ZjaHRlbj8nOwoKLyogLS0tLSBQbHVnaW5zIC0tLS0gKi8KCiRsYW5nWyduaWNlZGl0RnVsbFBhbmVsX2xhYmVsJ10gPSAnRXJ3ZWl0ZXJ0ZSBXZXJremV1Z2xlaXN0ZT8nOwokbGFuZ1snbmljZWRpdEZ1bGxQYW5lbF9oZWxwJ10gPSAnQmxlbmRlIGVyd2VpdGVydGUgV2Vya3pldWdsZWlzdGUgaW0gRWRpdG9yIGVpbi4nOwokbGFuZ1snbmljZWRpdEpRdWVyeUxvYWRfbGFiZWwnXSA9J0xhZGUgalF1ZXJ5IExpYmFyeSc7CiRsYW5nWyduaWNlZGl0SlF1ZXJ5TG9hZF9oZWxwJ10gPSdMYXNzZSBJbmxpbkVkaXQgZGllIGJlbsO2dGlndGUgalF1ZXJ5IExpYmFyeSBsYWRlbi4nOwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiRsYW5nWydoZWxwJ10gPSAnPGgzPlVzYWdlPC9oMz4KPHVsPgoJPGxpPkxvYWQgbW9kdWxlIC0ge2Ntc19tb2R1bGUgbW9kdWxlPSJ0b3VjaElubGluZUVkaXQifTwvbGk+Cgk8bGk+TWFyayBlZGl0YWJsZSBjb250ZW50cyAtIHtjb250ZW50IGlzZWRpdGFibGU9XCd0cnVlXCd9PC9saT4KPC91bD4KPGgzPkFib3V0PC9oMz4KPHVsPgoJPGxpPkNvcHlyaWdodCBieSA8YSBocmVmPSJodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLyI+dG91Y2hEZXNpZ248L2E+PC9saT4KCTxsaT5BdXRob3IgQ2hyaXN0b3BoIEdydWJlcjwvbGk+Cgk8bGk+U3VwcG9ydCB2aWEgPGEgaHJlZj0iaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMCI+SFBDPC9hPjwvbGk+Cgk8bGk+TGljZW5zZSBHUEwgMi4wPC9saT4KPC91bD4nOwokbGFuZ1snc2V0dGluZ3MnXSA9ICdTZXR0aW5ncyc7CiRsYW5nWyd0ZW1wbGF0ZXMnXSA9ICdUZW1wbGF0ZXMnOwokbGFuZ1snZWRpdG9yJ10gPSAnRWRpdG9yJzsKJGxhbmdbJ3RhYmxlY29sdGVtcGxhdGUnXSA9ICdUZW1wbGF0ZSc7CiRsYW5nWyd5ZXMnXSA9ICdZZXMnOwokbGFuZ1snbm8nXSA9ICdObyc7CiRsYW5nWydzYXZlJ10gPSAnU2F2ZSc7CiRsYW5nWydlZGl0J10gPSAnRWRpdCc7CiRsYW5nWydjYW5jZWwnXSA9ICdDYW5jZWwnOwokbGFuZ1sncmVzZXQnXSA9ICdSZXNldCc7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnU2V0dGluZ3Mgc2F2ZWQuJzsKJGxhbmdbJ3RlbXBsYXRlc3NhdmVkJ10gPSAnVGVtcGxhdGUgc2F2ZWQuJzsKCiRsYW5nWydmZVBsdWdpbl9sYWJlbCddID0gJ1doaWNoIGVkaXRvciB5b3Ugd2FudD8nOwokbGFuZ1snZmVQbHVnaW5faGVscCddID0gJ1NlbGVjdCBhbiBlZGl0b3IuJzsKJGxhbmdbJ2ZlRWRpdEJ1dHRvbl9sYWJlbCddID0gJ0VkaXQgQnV0dG9uIGluIEZFPyc7CiRsYW5nWydmZUVkaXRCdXR0b25faGVscCddID0gJ0FkZCBlbmFibGUvZGlzYWJsZSBidXR0b24gZm9yIGlubGluZUVkaXQgaW4gRnJvbnRlbmQuJzsKJGxhbmdbJ2ZlRnVsbFBhbmVsX2xhYmVsJ10gPSAnQWR2YW5jZWQgVG9vbGJhcj8nOwokbGFuZ1snZmVGdWxsUGFuZWxfaGVscCddID0gJ0VuYWJsZSBhZHZhbmNlZCB0b29sYmFyIGZvciBpbmxpbmVFZGl0Lic7CiRsYW5nWydmZVVwZGF0ZUFsZXJ0X2xhYmVsJ10gPSAnVXBkYXRlIGFsZXJ0Pyc7CiRsYW5nWydmZVVwZGF0ZUFsZXJ0X2hlbHAnXSA9ICdFbmFibGUgdXBkYXRlIGFsZXJ0IGluIGZyb250ZW5kLic7CgokbGFuZ1sndG91Y2hJbmxpbmVFZGl0QnV0dG9uX2xhYmVsJ10gPSAnSW5saW5lIGVkaXQgYnV0dG9uIHRlbXBsYXRlOic7CiRsYW5nWydmZUVkaXRPbkRibENsaWNrX2xhYmVsJ10gPSAnQWN0aXZhdGUgSW5saW5lRWRpdCBvbiBkb3VibGUgY2xpY2s/JzsKJGxhbmdbJ2ZlRWRpdE9uRGJsQ2xpY2tfaGVscCddID0gJ0FjdGl2YXRlIElubGluZUVkaXQgb24gZG91YmxlIGNsaWNrIGluIGNvbnRlbnQgYXJlYS4nOwoKJGxhbmdbJ2ZlSW5saW5lRWRpdEJ1dHRvbiddID0gJ0VkaXQnOwokbGFuZ1snZmVVcGRhdGVBbGVydCddID0gJ0NvbnRlbnQgaGFzIGJlZW4gc2F2ZWQuLi4nOwoKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnSW5zdGFsbCBzdWNjZXNzLi4uJzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdVbmluc3RhbGwgc3VjY2Vzcy4uLic7CiRsYW5nWydwb3N0dXBncmFkZSddID0gJ1VwZ3JhZGUgc3VjY2VzcyBWZXJzaW9uICVzLi4uJzsKJGxhbmdbJ3Bvc3Rjb250ZW50dXBkYXRlJ10gPSAnQ29udGVudCB3aXRoIGNvbnRlbnRfaWQ6JXMgdXBkYXRlZC4nOwokbGFuZ1sncHJldW5pbnN0YWxsJ10gPSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHVuaW5zdGFsbCB0aGlzIG1vZHVsZSBhbmQgZGVzdHJveSBhbGwgc2V0dGluZ3MvdGVtcGxhdGVzPyc7CgovKiAtLS0tIFBsdWdpbnMgLS0tLSAqLwoKJGxhbmdbJ25pY2VkaXRGdWxsUGFuZWxfbGFiZWwnXSA9ICdFcndlaXRlcnRlIFdlcmt6ZXVnbGVpc3RlPyc7CiRsYW5nWyduaWNlZGl0RnVsbFBhbmVsX2hlbHAnXSA9ICdCbGVuZGUgZXJ3ZWl0ZXJ0ZSBXZXJremV1Z2xlaXN0ZSBpbSBFZGl0b3IgZWluLic7CiRsYW5nWyduaWNlZGl0SlF1ZXJ5TG9hZF9sYWJlbCddID0nTG9hZCBqUXVlcnkgbGliYXJ5JzsKJGxhbmdbJ25pY2VkaXRKUXVlcnlMb2FkX2hlbHAnXSA9J0xldCBJbmxpbkVkaXQgbG9hZCByZXF1aXJlZCBqUXVlcnkgbGliYXJ5IGluIGhlYWRlciBvZiBwYWdlcy4nOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/LICENSE.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/ICAgICAgICAgICAgICAgICAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQ0KICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQ0KDQogQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwNCiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBDQogRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzDQogb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVhbWJsZQ0KDQogIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXINCmZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljDQpMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlDQpzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcw0KR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUNCkZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8NCnVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkNCnRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvDQp5b3VyIHByb2dyYW1zLCB0b28uDQoNCiAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdA0KcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQ0KaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcg0KdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0DQppZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdA0KaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLg0KDQogIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQNCmFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4NClRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91DQpkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuDQoNCiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcg0KZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0DQp5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQ0Kc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcg0KcmlnaHRzLg0KDQogIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQNCigyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksDQpkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLg0KDQogIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluDQp0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQ0Kc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlDQp3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbw0KdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwNCmF1dGhvcnMnIHJlcHV0YXRpb25zLg0KDQogIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlDQpwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlDQpwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlDQpwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkNCnBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuDQoNCiAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQNCm1vZGlmaWNhdGlvbiBmb2xsb3cuDQoNCiAgICAgICAgICAgICAgICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UNCiAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTg0KDQogIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMNCmEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkDQp1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csDQpyZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSINCm1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6DQp0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LA0KZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXINCmxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4NCnRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLg0KDQpBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdA0KY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZg0KcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQ0KaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUNClByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuDQpXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4NCg0KICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MNCnNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQ0KY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQ0KY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQ0Kbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5Ow0KYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQ0KYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4NCg0KWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kDQp5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLg0KDQogIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24NCm9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQNCmRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQ0KYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoNCg0KICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuDQoNCiAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4NCiAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkNCiAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZA0KICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4NCg0KICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkNCiAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoDQogICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbg0KICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQ0KICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQ0KICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXINCiAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcw0KICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0DQogICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbg0KICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQ0KDQpUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmDQppZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLA0KYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluDQp0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlDQpzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UNCmRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZA0Kb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mDQp0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQ0KZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0Lg0KDQpUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QNCnlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bw0KZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yDQpjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLg0KDQpJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtDQp3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YNCmEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyDQp0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLg0KDQogIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LA0KdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mDQpTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6DQoNCiAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlDQogICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zDQogICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsDQoNCiAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQ0KICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyDQogICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQ0KICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUNCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQ0KICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwNCg0KICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyDQogICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMNCiAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQ0KICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gNCiAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikNCg0KVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcg0KbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UNCmNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55DQphc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8NCmNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGENCnNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQ0KYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkNCmZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlDQpvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudA0KaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLg0KDQpJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nDQphY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50DQphY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMNCmRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdA0KY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4NCg0KICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0NCmV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQNCm90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcw0Kdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXINCnRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoDQpwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuDQoNCiAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90DQpzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcg0KZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlDQpwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5DQptb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUNClByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kDQphbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nDQp0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4NCg0KICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlDQpQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQ0Kb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bw0KdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXINCnJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4NCllvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvDQp0aGlzIExpY2Vuc2UuDQoNCiAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudA0KaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwNCmNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3INCm90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QNCmV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90DQpkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzDQpMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91DQptYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50DQpsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5DQphbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4NCnRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8NCnJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uDQoNCklmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcg0KYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bw0KYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXINCmNpcmN1bXN0YW5jZXMuDQoNCkl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkNCnBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55DQpzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlDQppbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMNCmltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQ0KZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZA0KdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQNCnN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcNCnRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdA0KaW1wb3NlIHRoYXQgY2hvaWNlLg0KDQpUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8NCmJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLg0KDQogIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluDQpjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUNCm9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UNCm1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZw0KdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZw0KY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzDQp0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4NCg0KICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucw0Kb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsDQpiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8NCmFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLg0KDQpFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtDQpzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQ0KbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUNClNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YNCnRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUNCkZvdW5kYXRpb24uDQoNCiAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQ0KcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcg0KdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlDQpTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMNCm1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzDQpvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kDQpvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PIFdBUlJBTlRZDQoNCiAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZDQpGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4NCk9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMNClBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEDQpPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRg0KTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUw0KVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQ0KUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsDQpSRVBBSVIgT1IgQ09SUkVDVElPTi4NCg0KICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HDQpXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SDQpSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLA0KSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HDQpPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEDQpUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkNCllPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSDQpQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUNClBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4NCg0KICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TDQoNCiAgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcw0KDQogIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QNCnBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQNCmZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLg0KDQogIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0DQp0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5DQpjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdA0KdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuDQoNCiAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPg0KICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+DQoNCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KDQogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCg0KICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nDQogICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwNCiAgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLg0KDQpBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4NCg0KSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcw0Kd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToNCg0KICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvcg0KICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4NCiAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0DQogICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLg0KDQpUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUNCnBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkNCmJlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQ0KbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4NCg0KWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXINCnNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmDQpuZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6DQoNCiAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQ0KICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4NCg0KICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkNCiAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UNCg0KVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvDQpwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQ0KY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlDQpsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbA0KUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuDQo=]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogbWV0aG9kLmluc3RhbGwucGhwIDY2IDIwMTAtMDktMjQgMTQ6MjI6MTJaIHRvdWNoZGVzaWduICQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuNwogKiBAY29weXJpZ2h0IDA0LjA4LjIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqIEB0b2RvIGFkZCBjb250ZW50X2Jsb2NrIGhhbmRsaW5nCiAqIAogKiAtLQogKgogKiBVc2FnZTogCiAqCiAqIHtjbXNfbW9kdWxlIG1vZHVsZT0idG91Y2hJbmxpbmVFZGl0In0KICoKICoge2NvbnRlbnQgaXNlZGl0YWJsZT0ndHJ1ZSd9CiAqCiAqIC0tCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKICoKICovCgokdGhpcy0+Q3JlYXRlUGVybWlzc2lvbignVXNlIHRvdWNoSW5saW5lRWRpdCcsICdVc2UgdG91Y2hJbmxpbmVFZGl0Jyk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCd0b3VjaElubGluZUVkaXQuZmVFZGl0QnV0dG9uJywgJ1knKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ3RvdWNoSW5saW5lRWRpdC5mZUVkaXRPbkRibENsaWNrJywgJ3RydWUnKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ3RvdWNoSW5saW5lRWRpdC5mZUZ1bGxQYW5lbCcsICd0cnVlJyk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCd0b3VjaElubGluZUVkaXQuZmVVcGRhdGVBbGVydCcsICd0cnVlJyk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCd0b3VjaElubGluZUVkaXQuZmVQbHVnaW4nLCAnbmljZWRpdCcpOwppZihtZXRob2RfZXhpc3RzKCR0aGlzLT5lZGl0b3IsJ2luc3RhbGwnKSl7CgkkdGhpcy0+ZWRpdG9yLT5pbnN0YWxsKCk7Cn0KJHRoaXMtPlNldFRlbXBsYXRlKCd0b3VjaElubGluZUVkaXRCdXR0b24nLCAkdGhpcy0+Z2V0RGVmYXVsdFRlbXBsYXRlKCd0b3VjaElubGluZUVkaXRCdXR0b24nKSk7CiR0aGlzLT5BZGRFdmVudEhhbmRsZXIoJ0NvcmUnLCAnQ29udGVudFBvc3RSZW5kZXInLCBmYWxzZSk7CiR0aGlzLT5BZGRFdmVudEhhbmRsZXIoJ0NvcmUnLCAnU21hcnR5UHJlQ29tcGlsZScsIGZhbHNlKTsKCi8vIExvZyBpbnN0YWxsIGluZm8KJHRoaXMtPkF1ZGl0KDAsICR0aGlzLT5HZXRGcmllbmRseU5hbWUoKSwgJHRoaXMtPkxhbmcoJ3Bvc3RpbnN0YWxsJykpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogbWV0aG9kLnVuaW5zdGFsbC5waHAgNjYgMjAxMC0wOS0yNCAxNDoyMjoxMlogdG91Y2hkZXNpZ24gJAogKgogKiB0b3VjaElubGluZUVkaXQgTW9kdWxlCiAqCiAqIENvcHlyaWdodCAoYykgMjAxMCB0b3VjaERlc2lnbiwgPHd3dy50b3VjaGRlc2lnbi5kZT4KICoKICogQGNhdGVnb3J5IE1vZHVsZQogKiBAYXV0aG9yIENocmlzdG9waCBHcnViZXIgPHd3dy50b3VjaGRlc2lnbi5kZT4KICogQHZlcnNpb24gMS43CiAqIEBjb3B5cmlnaHQgMDQuMDguMjAxMCB0b3VjaERlc2lnbgogKiBAbGluayBodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLwogKiBAbGluayBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wCiAqIEBsaW5rIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hJbmxpbmVFZGl0CiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMIDIuMCkKICogQHRvZG8gYWRkIGNvbnRlbnRfYmxvY2sgaGFuZGxpbmcKICogCiAqIC0tCiAqCiAqIFVzYWdlOiAKICoKICoge2Ntc19tb2R1bGUgbW9kdWxlPSJ0b3VjaElubGluZUVkaXQifQogKgogKiB7Y29udGVudCBpc2VkaXRhYmxlPSd0cnVlJ30KICoKICogLS0KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICogT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAogKgogKi8KCiR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCk7CiR0aGlzLT5SZW1vdmVQZXJtaXNzaW9uKCdVc2UgdG91Y2hJbmxpbmVFZGl0Jyk7CiR0aGlzLT5EZWxldGVUZW1wbGF0ZSgpOwokdGhpcy0+UmVtb3ZlRXZlbnRIYW5kbGVyKCdDb3JlJywgJ0NvbnRlbnRQb3N0UmVuZGVyJyk7CiR0aGlzLT5SZW1vdmVFdmVudEhhbmRsZXIoJ0NvcmUnLCAnU21hcnR5UHJlQ29tcGlsZScpOwoKLy8gTG9nIHVuaW5zdGFsbCBpbmZvCiR0aGlzLT5BdWRpdCgwLCAkdGhpcy0+R2V0RnJpZW5kbHlOYW1lKCksICR0aGlzLT5MYW5nKCdwb3N0dW5pbnN0YWxsJykpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZCQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuNwogKiBAY29weXJpZ2h0IDA0LjA4LjIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqIEB0b2RvIGFkZCBjb250ZW50X2Jsb2NrIGhhbmRsaW5nCiAqIAogKiAtLQogKgogKiBVc2FnZTogCiAqCiAqIHtjbXNfbW9kdWxlIG1vZHVsZT0idG91Y2hJbmxpbmVFZGl0In0KICoKICoge2NvbnRlbnQgaXNlZGl0YWJsZT0ndHJ1ZSd9CiAqCiAqIC0tCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKICoKICovCgpnbG9iYWwgJGdDbXM7Cgokc21hcnR5ID0gJiRnQ21zLT5zbWFydHk7Cgokc21hcnR5LT5jbGVhcl9jb21waWxlZF90cGwoKTsKJHNtYXJ0eS0+Y2xlYXJfYWxsX2NhY2hlKCk7CgppZih2ZXJzaW9uX2NvbXBhcmUoJG9sZHZlcnNpb24sICcxLjYnLCAnPCcpKXsKCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCd0b3VjaElubGluZUVkaXQuZmVDb250ZXh0TWVudScsICdmYWxzZScpOwoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ3RvdWNoSW5saW5lRWRpdC5mZUVkaXRPbkRibENsaWNrJywgJ3RydWUnKTsKCSR0aGlzLT5BZGRFdmVudEhhbmRsZXIoJ0NvcmUnLCAnQ29udGVudFBvc3RSZW5kZXInLCBmYWxzZSk7CgkkdGhpcy0+QWRkRXZlbnRIYW5kbGVyKCdDb3JlJywgJ1NtYXJ0eVByZUNvbXBpbGUnLCBmYWxzZSk7CgkkdGhpcy0+U2V0VGVtcGxhdGUoJ3RvdWNoSW5saW5lRWRpdENvbnRleHRNZW51JywgJHRoaXMtPmdldERlZmF1bHRUZW1wbGF0ZSgndG91Y2hJbmxpbmVFZGl0Q29udGV4dE1lbnUnKSk7Cn0KaWYodmVyc2lvbl9jb21wYXJlKCRvbGR2ZXJzaW9uLCAnMS43JywgJzwnKSl7CgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgndG91Y2hJbmxpbmVFZGl0LmZlUGx1Z2luJywgJ25pY2VkaXQnKTsKCWlmKG1ldGhvZF9leGlzdHMoJHRoaXMtPmVkaXRvciwnaW5zdGFsbCcpKXsKCQkkdGhpcy0+ZWRpdG9yLT5pbnN0YWxsKCk7Cgl9CgkkdGhpcy0+RGVsZXRlVGVtcGxhdGUoJ3RvdWNoSW5saW5lRWRpdENvbnRleHRNZW51Jyk7CgkkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgndG91Y2hJbmxpbmVFZGl0LmZlQ29udGV4dE1lbnUnKTsKCSR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCd0b3VjaElubGluZUVkaXQuZmVGdWxsUGFuZWwnKTsKCSR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCd0b3VjaElubGluZUVkaXQuZmVKUXVlcnlMb2FkJyk7Cn0KCi8vIExvZyB1cGdyYWRlIGluZm8KJHRoaXMtPkF1ZGl0KDAsICR0aGlzLT5HZXRGcmllbmRseU5hbWUoKSwgCgkkdGhpcy0+TGFuZygncG9zdHVwZ3JhZGUnLCAkdGhpcy0+R2V0VmVyc2lvbigpKSk7Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/plugins/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/Changelog</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[MjAxMC0wOS0xNSAgVHJvZXggTmV2ZWxpbiAgPHRyb2V4QGZ1cnkuc2NhbmNvZGUucnU+CgoJKiBlbFJURSAoMS4wLjEpOgoJCS0gW2ZlYXR1cmVdIFRBQiBub3cga2V5IGluc2VydHMgJ1x0JyBpbnN0ZWFkIHN3aXRjaCB0byBuZXh0IGVsZW1lbnQgaW4KCQkgIHNvdXJjZSB2aWV3CgkJLSBbZmVhdHVyZV0gY29tcGxldGVkIFJUTCBzdXBwb3J0CgkJLSBbZmVhdHVyZV0gcGFnZWJyZWFrIGJ1dHRvbiBhZGRlZAoJCS0gW2ZlYXR1cmVdIHNtaWxleXMgYnV0dG9uIGFkZGVkCgkJLSBbYnVnZml4XSB0ZXh0YXJlYSB1c2VzIElEIGluc3RlYWQgTkFNRSBvbiBwb3N0CgkJLSBbYnVnZml4XSBjbGVhbiBzZWxlY3RlZCBhcmVhIG9uIHBhc3RlCgkJLSBbYnVnZml4XSBmdWxsc2NyZWVuIG1vZGUgaW4gRmlyZWZveAoJCS0gW2J1Z2ZpeF0gR29vZ2xlIE1hcHMgaW5zZXJ0aW9uCgkJLSBbYnVnZml4XSBuZXcgVmltZW8gZW1iZWQgY29kZQoJCS0gW3RyYW5zbGF0aW9uXSBGcmVuY2gsIEZyYW5jb2lzIE1hemVyb2xsZSA8Zm1hejAwOEBnbWFpbC5jb20+CgkJLSBbdHJhbnNsYXRpb25dIEh1bmdhcmlhbiwgVmlrdG9yIFRhbWFzIDx0YW1hcy52aWt0b3JAdG90YWxzdHVkaW8uaHU+CgkJLSBbdHJhbnNsYXRpb25dIER1dGNoLCBLdXJ0IEFlcnRzIGh0dHA6Ly9pbGFic29sdXRpb25zLm5ldC8KCQktIFt0cmFuc2xhdGlvbl0gUG9saXNoLCBBbmRyemVqIEJvcm93aWN6IGh0dHA6Ly9ib3Jvd2ljei5pbmZvLwoJCS0gW3RyYW5zbGF0aW9uXSBUcmFkaXRpb25hbCBDaGluZXNlLCBUYWQgPHRhZDA2MTZAZ21haWwuY29tPgoJCS0gW3RyYW5zbGF0aW9uXSBBcmFiaWMsIHRhd2ZlayBkYWdoaXN0YW5pIDx0YXdmZWtvdkBnbWFpbC5jb20+CgkJLSBbdHJhbnNsYXRpb25dIFBlcnNpYW4gKEZhcnNpKSwgU2FsZWggc29vemFuY2hpIDxpbmZvQHNvb3phbmNoaS5pcj4KCQktIFt0cmFuc2xhdGlvbl0gSXRhbGlhbiwgVWdvIFB1bnpvbG8gPHNhZHJhY3plcm91bm9AZ21haWwuY29tPgoKCgoyMDEwLTA4LTI1ICBUcm9leCBOZXZlbGluICA8dHJvZXhAZnVyeS5zY2FuY29kZS5ydT4KCgkqIGVsUlRFICgxLjApOgoJCS0gW2ZlYXR1cmVdIHVwZGF0ZSBqUXVlcnkgdG8gMS40LjIgYW5kIFVJIHRvIDEuOC40CgkJLSBbZmVhdHVyZV0gbmV3IGZpbHRlciwgZml4ZXMgIzEzNCwgIzE0MCwgIzE1MgoJCS0gW2ZlYXR1cmVdIGFkZGVkIFJUTC9MVFIgYnV0dG9uICMxMTEKCQktIFtmZWF0dXJlXSBiZXR0ZXIgcGxhY2Vob2xkZXJzICh5b3V0dWJlLCBnb29nbGUgbWFwcywgZXRjLi4uKQoJCS0gW2ZlYXR1cmVdIHVzZXItZGVmaW5lZCByZXBsYWNlbWVudHMKCQktIFtmZWF0dXJlXSBiZXR0ZXIgaWNvbnMgZnJvbSBmYW1mYW1mYW0ub3JnCgkJLSBbYnVnZml4XSByZW1vdmUgbmVlZGxlc3MgZWwtc2VsZWN0IHBhcmFtIGJlZm9yZSBwb3N0ICMxNTUKCQktIFtidWdmaXhdIHRhYmxlIGNlbGwgcHJvcGVydGllcyAjMTU2CgkJLSBbYnVnZml4XSB0ZXh0YXJlYSBub3QgcG9zdGVkIHdpdGhvdXQgbmFtZSAjMTg5CgkJLSBbdHJhbnNsYXRpb25dIExhdHZpYW4sIFVsZGlzIFBsb3RpxYbFoSA8dWxkaXMucGxvdGluc0BnbWFpbC5jb20+CgkJLSBbdHJhbnNsYXRpb25dIFNwYW5pc2gsIFJpY2FyZG8gT2JyZWfDs24gPHJvYnJlZ29ubUBnbWFpbC5jb20+CgkJLSBbdHJhbnNsYXRpb25dIEphcGFuZXNlLCBUb21vYWtpIFlvc2hpZGEgPGluZm9AeW9zaGlkYS1zdHVkaW8uanA+CgkJICBodHRwOi8veW9zaGlkYS1zdHVkaW8uanAvcmFrdWdha2lzLwoKCjIwMTAtMDMtMjkgIERtaXRyeSBMZXZhc2hvdiAgPGRpb0BzdGQ0Mi5ydT4KCgkqIGVsUlRFICgxLjByYzQpOgoJCS0gW2ZlYXR1cmVdIGJldHRlciBkaXNwbGF5IGltYWdlIG1hcmdpbiBhdHRyaWJ1dGVzCgkJLSBbZmVhdHVyZV0gbmV3IGJ1dHRvbiAiQ1NTIiBmb3IgY2xhc3MgYW5kIHN0eWxlIHNldAoJCS0gW2J1Z2ZpeF0gYmV0dGVyIFhIVE1MIHN1cHBvcnQKCQktIFtidWdmaXhdIG1vcmUgdW51c2VkIHRhZ3MvYXR0cmlidXRlcyBjbGVhbnVwIGFuZCByZXBsYWNlCgkJLSBbYnVnZml4XSByZXN0b3JlIHNlbGVjdGlvbiBhZnRlciB1bmRvL3JlZG8KCQktIFtidWdmaXhdIGxpbmtzIGFkZC9yZW1vdmUgcHJvYmxlbQoJCS0gW2J1Z2ZpeF0gSUUgc291cmNlIHdpbmRvdyBoZWlnaHQKCQktIFtidWdmaXhdIGVtYmVkIGZsYXNoIHByb2JsZW0KCgoyMDEwLTAzLTE1ICBUcm9leCBOZXZlbGluICA8dHJvZXhAZnVyeS5zY2FuY29kZS5ydT4KCgkqIGVsUlRFICgxLjByYzMpOgoJCS0gW2ZlYXR1cmVdIEFkZCBGbGFzaCBidXR0b24KCQktIFtidWdmaXhdIG5vIG1vcmUgY29uZmxpY3Qgd2l0aCBtb290b29scwoJCS0gW2J1Z2ZpeF0gdGV4dCBhbGlnbm1lbnQgZml4CgkJLSBbYnVnZml4XSBwYXJ0bHkgZml4ZXMgYmxvY2sgc2VsZWN0aW9uCgkJLSBbYnVnZml4XSBpbnNlcnQgbmV3IHJvdyBpbiB0YWJsZSBub3cgd29ya3MKCQktIFtidWdmaXhdIGZpeGVkIHVuZG8vcmVkbwoJCS0gW2J1Z2ZpeF0gZW50ZXIvc2hpZnQrZW50ZXIgZml4ZWQgaW4gU2FmYXJpCgkJLSBbYnVnZml4XSBqcXVlcnkgcGx1Z2luIG5vdyBjb250YWlucyBuZXcgY29tbWFuZHMgKG9wZW4sIGNsb3NlLAoJCSAgdXBkYXRlU291cmNlLCB2YWwpCgoKMjAwOS0xMS0wOSAgRG1pdHJ5IExldmFzaG92ICA8ZGlvQHN0ZDQyLnJ1PgoKCSogZWxSVEUgKDEuMHJjMik6CgkJLSBbYnVnZml4XSBsaW5rcyBhbmQgaW1hZ2VzIHVybHMgY29udmVydHMgdG8gbG93ZXIgY2FzZQoJCS0gW2J1Z2ZpeF0gbGluayB0byBhbmNob3Igbm90IHdvcmsKCQktIFtidWdmaXhdIG5ldyB0YWJsZSBkbyBub3Qgc2F2ZSBtYXJnaW5zCgkJLSBbYnVnZml4XSBpbnZhbGlkIHNlbGVjdGlvbiBhZnRlciBpbnNlcnQgbm9kZSBpbiBTYWZhcmkKCQktIFtidWdmaXhdIGRpYWxvZyB3aW5kb3dzIHVuZGVyIGZ1bGxzY3JlZW4gZWRpdG9yCgo=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/css/elrte-inner.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CmJvZHkuZWwtcnRlLXJ0bCwgYm9keS5lbC1ydGUtcnRsICogewoJZGlyZWN0aW9uOnJ0bDsKfSAKCmJvZHkuZWwtcnRlLXN0cnVjdHVyZSB0YWJsZSwgCmJvZHkuZWwtcnRlLXN0cnVjdHVyZSBjYXB0aW9uLApib2R5LmVsLXJ0ZS1zdHJ1Y3R1cmUgdGQsIApib2R5LmVsLXJ0ZS1zdHJ1Y3R1cmUgdGgsIApib2R5LmVsLXJ0ZS1zdHJ1Y3R1cmUgcCwgCmJvZHkuZWwtcnRlLXN0cnVjdHVyZSBkaXYsCmJvZHkuZWwtcnRlLXN0cnVjdHVyZSBibG9ja3F1b3RlCnsgb3V0bGluZToxcHggZG90dGVkICM5OWNjZmY7IH0KCmJvZHkuZWwtcnRlLXN0cnVjdHVyZSBhW25hbWVdIHsKCWRpc3BsYXk6aW5saW5lLWJsb2NrOwoJdmVydGljYWwtYWxpZ246YmFzZWxpbmU7Cgl3aWR0aDoxMnB4OyAKCWhlaWdodDoxMnB4OyAKCWJvcmRlcjoxcHggZG90dGVkICNjY2M7CgliYWNrZ3JvdW5kOiB1cmwoJy4uL2ltYWdlcy9lbHJ0ZS10b29sYmFyLnBuZycpIC01NjRweCAtOHB4IG5vLXJlcGVhdDsKfQppbWcgeyBjdXJzb3I6IGRlZmF1bHQ7IH0KCmltZy5lbHJ0ZS13ZWJraXQtaGwgeyBvdXRsaW5lOjFweCBkYXNoZWQgIzc3NzsgfQoKLmVscnRlYm0gewp9CgouZWxydGUtbWVkaWEteC1zaG9ja3dhdmUtZmxhc2gsCi5lbHJ0ZS1tZWRpYS1xdWlja3RpbWUsCi5lbHJ0ZS1tZWRpYS14LWRpcmVjdG9yLAouZWxydGUtbWVkaWEteC1tcGxheWVyMiwKLmVscnRlLW1lZGlhLXgtcG4tcmVhbGF1ZGlvLXBsdWdpbiwKLmVscnRlLW1lZGlhLXlvdXR1YmUsCi5lbHJ0ZS1tZWRpYS1ydXR1YmUsCi5lbHJ0ZS1tZWRpYS12aW1lbywKLmVscnRlLXlhbmRleC1tYXBzLAouZWxydGUtZ29vZ2xlLW1hcHMsCi5lbHJ0ZS1tZWRpYSB7Cglib3JkZXI6MXB4IHNvbGlkICNjY2M7CgliYWNrZ3JvdW5kOiNlZWUgdXJsKC4uL2ltYWdlcy9tZWRpYS1mbGFzaC5wbmcpIGNlbnRlciBjZW50ZXIgbm8tcmVwZWF0Owp9Ci5lbHJ0ZS1tZWRpYS14LXNob2Nrd2F2ZS1mbGFzaCB7CgliYWNrZ3JvdW5kLWltYWdlOnVybCguLi9pbWFnZXMvbWVkaWEtZmxhc2gucG5nKTsKfQouZWxydGUtbWVkaWEteW91dHViZSB7CgliYWNrZ3JvdW5kLWltYWdlOnVybCguLi9pbWFnZXMvbWVkaWEteW91dHViZS5wbmcpOwp9Ci5lbHJ0ZS1tZWRpYS12aW1lbyB7CgliYWNrZ3JvdW5kLWltYWdlOnVybCguLi9pbWFnZXMvbWVkaWEtdmltZW8ucG5nKTsKfQouZWxydGUtbWVkaWEtcnV0dWJlIHsKCWJhY2tncm91bmQtaW1hZ2U6dXJsKC4uL2ltYWdlcy9tZWRpYS1ydXR1YmUucG5nKTsKfQouZWxydGUtbWVkaWEtcXVpY2t0aW1lIHsKCWJhY2tncm91bmQtaW1hZ2U6dXJsKC4uL2ltYWdlcy9tZWRpYS1xdWlja3RpbWUucG5nKTsKfQouZWxydGUtbWVkaWEteC1kaXJlY3RvciB7CgliYWNrZ3JvdW5kLWltYWdlOnVybCguLi9pbWFnZXMvbWVkaWEtZGlyZWN0b3IucG5nKTsKfQouZWxydGUtbWVkaWEteC1tcGxheWVyMiB7CgliYWNrZ3JvdW5kLWltYWdlOnVybCguLi9pbWFnZXMvbWVkaWEtd2lubWVkaWEucG5nKTsKfQouZWxydGUtbWVkaWEteC1wbi1yZWFsYXVkaW8tcGx1Z2luIHsKCWJhY2tncm91bmQtaW1hZ2U6dXJsKC4uL2ltYWdlcy9tZWRpYS1yZWFsYXVkaW8ucG5nKTsKfQouZWxydGUteWFuZGV4LW1hcHMgewoJYmFja2dyb3VuZC1pbWFnZTp1cmwoLi4vaW1hZ2VzL3lhbmRleC1tYXBzLnBuZyk7Cn0KLmVscnRlLWdvb2dsZS1tYXBzIHsKCWRpc3BsYXk6IGJsb2NrOwoJYmFja2dyb3VuZC1pbWFnZTp1cmwoLi4vaW1hZ2VzL2dvb2dsZS1tYXBzLnBuZyk7Cn0KCi5lbHJ0ZS1wYWdlYnJlYWsgewoKCWRpc3BsYXk6YmxvY2s7CgljbGVhcjpib3RoOwoJd2lkdGg6MTAwJTsKCWhlaWdodDo3cHg7CglvdXRsaW5lOjFweCBkb3R0ZWQgIzc3NzsKCW91dGxpbmUtbGVmdDpub25lOwoJb3V0bGluZS1yaWdodDpub25lOwoJYmFja2dyb3VuZDp0cmFuc3BhcmVudCB1cmwoLi4vaW1hZ2VzL3BhZ2VicmVhay5naWYpIGNlbnRlciBjZW50ZXIgbm8tcmVwZWF0Owp9CgouZWxydGUtcGFnZWJyZWFrOmFmdGVyIHsKICBjb250ZW50OiAiLiI7CiAgZGlzcGxheTogYmxvY2s7CiAgZm9udC1zaXplOjA7CiAgaGVpZ2h0OiAwOwogIGNsZWFyOiBib3RoOwogIHZpc2liaWxpdHk6IGhpZGRlbjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/css/elrte.full.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGVsUlRFIFdZU0lXWUcgSFRNTC1lZGl0b3IKICogVmVyc2lvbiAxLjEgKDIwMTAtMDktMjApCiAqIGh0dHA6Ly9lbHJ0ZS5vcmcKICoKICogTW9kaWZpZWQgZm9yIHRvdWNoSW5saW5lRWRpdCBjbXNtcyBtb2R1bGU6IEFkZCBzb21lIGltcG9ydGFudCBydWxlcwogKgogKiBDb3B5cmlnaHQgMjAxMCwgU3R1ZGlvIDQyIEx0ZC4KICogTGljZW5zZWQgdW5kZXIgYSAzIGNsYXVzZXMgQlNEIGxpY2Vuc2UKICovCgpAY2hhcnNldCAiVVRGLTgiOwphIHsgb3V0bGluZTogbm9uZTsgfQoKLyoqKioqKioqKioqKiogIGNsZWFyZml4ICAqKioqKioqKioqKioqKioqKioqKioqLwoKLmNsZWFyZml4OmFmdGVyIHsKICBjb250ZW50OiAiLiI7CiAgZGlzcGxheTogYmxvY2s7CiAgZm9udC1zaXplOjA7CiAgaGVpZ2h0OiAwOwogIGNsZWFyOiBib3RoOwogIHZpc2liaWxpdHk6IGhpZGRlbjsKfQoKLmNsZWFyZml4IHsgZGlzcGxheTogYmxvY2s7IH0KCi5yb3VuZGVkLTIgeyAtbW96LWJvcmRlci1yYWRpdXM6IDJweDsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAycHg7IGJvcmRlci1yYWRpdXM6IDJweDsgfQoucm91bmRlZC0zIHsgLW1vei1ib3JkZXItcmFkaXVzOiAzcHg7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4OyBib3JkZXItcmFkaXVzOiAzcHg7IH0KLnJvdW5kZWQtNCB7IC1tb3otYm9yZGVyLXJhZGl1czogNHB4OyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsgYm9yZGVyLXJhZGl1czogNHB4OyB9Ci5yb3VuZGVkLTUgeyAtbW96LWJvcmRlci1yYWRpdXM6IDVweDsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7IGJvcmRlci1yYWRpdXM6IDVweDsgfQoucm91bmRlZC02IHsgLW1vei1ib3JkZXItcmFkaXVzOiA2cHg7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4OyBib3JkZXItcmFkaXVzOiA2cHg7IH0KLnJvdW5kZWQtNyB7IC1tb3otYm9yZGVyLXJhZGl1czogN3B4OyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDdweDsgYm9yZGVyLXJhZGl1czogN3B4OyB9Ci5yb3VuZGVkLWxlZnQtMyB7IC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OiAzcHg7IC13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogM3B4OyAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDogM3B4OyAtd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDNweDsgfQoucm91bmRlZC1ib3R0b20tNyB7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OjdweDsgLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OjdweDsgLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA3cHg7LXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogN3B4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA3cHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA3cHg7fQkKCgoudWktd2lkZ2V0IHsgZm9udC1zaXplOi45ZW07fQoudWktZGlhbG9nIC51aS1kaWFsb2ctYnV0dG9ucGFuZSBidXR0b24geyBwYWRkaW5nOiAuMWVtIC42ZW0gLjJlbSAuNmVtOyB9CgovKiBjb2xvcnBpY2tlciAiYnV0dG9uIiAqLwouZWwtY29sb3JwaWNrZXIgewoJd2lkdGggIDogMTZweDsKCWhlaWdodCA6IDE2cHg7Cglib3JkZXI6MXB4IHNvbGlkICNjY2M7Cglwb3NpdGlvbjpyZWxhdGl2ZTsKCWN1cnNvcjpkZWZhdWx0Owp9CgovKiBjb2xvcnMgcGFsZXR0ZSAqLwouZWwtcGFsZXR0ZSB7Cgl3aWR0aDogMTgycHg7Cglib3JkZXI6MXB4IHNvbGlkICNjY2M7CgliYWNrZ3JvdW5kOiNmZmY7CglwYWRkaW5nOjNweCAycHggM3B4IDNweDsKCXotaW5kZXg6MTAwMDA7IC8qIGZpZ2h0IHdpdGggdWkuZGlhbG9nIDBfbyAqLwoJcG9zaXRpb246YWJzb2x1dGU7Cgl0b3A6MTZweDsKCWxlZnQ6MDsKfQoKLyogY29sb3IgY2VsbCBpbiBwYWxldHRlICovCi5lbC1wYWxldHRlIC5jb2xvciB7CglmbG9hdDpsZWZ0OwoJd2lkdGg6MTRweDsKCWhlaWdodDoxNHB4OwoJbGluZS1oZWlnaHQ6MXB4OwoJYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlZWU7Cglib3JkZXItbGVmdDoxcHggc29saWQgI2VlZTsKfQoKLyogc2lkZSBiZWxvdyBjb2xvciBjZWxscyAqLwouZWwtcGFsZXR0ZSAucGFuZWwgewoJYm9yZGVyLXRvcDoxcHggc29saWQgI2NjYzsKCW1hcmdpbi10b3A6N3B4OwoJcGFkZGluZzo1cHggM3B4IDVweCAzcHg7Cn0KCi8qICJ3aW5kb3ciIHdpdGggc2VsZWN0ZWQgY29sb3IgKi8KLmVsLXBhbGV0dGUgLnBhbmVsIC5wcmV2aWV3IHsKCWZsb2F0OnJpZ2h0OwoJd2lkdGg6MThweDsKCWhlaWdodDoxOHB4OwoJYm9yZGVyOjFweCBzb2xpZCAjY2NjOwp9CgovKiBjb2xvciB2YWx1ZSB0ZXh0IGZpZWxkICovCi5lbC1wYWxldHRlIC5wYW5lbCBpbnB1dCB7Cglib3JkZXI6MXB4IHNvbGlkICNjY2M7Cn0KLyogZGlhbG9nIGNvbnRhaW5lciAqLwoudWktd2lkZ2V0IC5lbC1kaWFsb2dmb3JtIHsKCXBhZGRpbmc6NXB4IDNweDsKCn0KCi51aS13aWRnZXQgLmVsLWRpYWxvZ2Zvcm0tcnRsIHsKCWRpcmVjdGlvbjogcnRsOwp9CgoudWktd2lkZ2V0IC5lbC1kaWFsb2dmb3JtLXJ0bCAudWktdGFicy1uYXYgbGkgewoJZmxvYXQ6cmlnaHQ7Cn0KCi5lbC1kaWFsb2dmb3JtIGRpdi50YWI6aG92ZXIgeyBiYWNrZ3JvdW5kOnRyYW5zcGFyZW50OyB9Ci51aS1kaWFsb2cgLnVpLWRpYWxvZy10aXRsZSwgLnVpLWRpYWxvZyAudWktZGlhbG9nLWNvbnRlbnQgewoJZm9udC1zaXplOi45ZW07Cn0KCi8qIHRhYnMgbmF2ICovCi51aS10YWJzIC51aS10YWJzLW5hdiBsaSBhIHsKCXBhZGRpbmc6LjJlbSAuN2VtOwp9CgovKiB0YWIgY29udGFpbmVyICovCi5lbC1kaWFsb2dmb3JtIC50YWIgewoJcGFkZGluZzo1cHggMCAxMnB4IDA7Cglib3JkZXI6bm9uZTsKfQovKiBsaW5lIHNlcGFyYXRvciAqLwouZWwtZGlhbG9nZm9ybSAuc2VwYXJhdG9yIHsKCWJvcmRlci10b3A6MXB4IHNvbGlkICNjY2M7CgltYXJnaW46IDVweCAycHg7Cn0KCi8qIHRhYmxlIGluIGRpYWxvZyBvciBpbiB0YWIgKi8KLmVsLWRpYWxvZ2Zvcm0gdGFibGUgewoJd2lkdGg6MTAwJTsKCWJvcmRlcjogbm9uZTsKfQoKLmVsLWRpYWxvZ2Zvcm0gIHRhYmxlIHRkIHsKCXBhZGRpbmc6IDJweDsKfQoKLmVsLWRpYWxvZ2Zvcm0gaW5wdXQsIC5lbC1kaWFsb2dmb3JtIHRleHRhcmVhIHsKCWJvcmRlcjoxcHggc29saWQgI2NjYzsKfQoKLmVsLWRpYWxvZ2Zvcm0gc2VsZWN0IHsKCXBhZGRpbmc6MDsKLyoJZm9udC1zaXplOjExcHg7Ki8KfQoKLmVsLWRpYWxvZ2Zvcm0gLnNwaW5uZXIgewoJYmFja2dyb3VuZDp1cmwoLi4vaW1hZ2VzL2xvYWRpbmcuZ2lmKSA1MCUgNTAlIG5vLXJlcGVhdDsKCXRleHQtYWxpZ246Y2VudGVyOwoJd2lkdGg6MTUwcHg7CgloZWlnaHQ6NTBweDsKCW1hcmdpbjoxMHB4IGF1dG87CglwYWRkaW5nLXRvcDozM3B4OwoJZm9udC13ZWlnaHQ6Ym9sZDsKfQouZWwtZGlhbG9nZm9ybS1lcnJvciB7CgliYWNrZ3JvdW5kOiAjZmVlOyBjb2xvcjojZmYwMDAwOyBib3JkZXI6IDJweCAjODQ0IHNvbGlkOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW4tYm90dG9tOiAxZW0gMDsKCQp9Ci5lbC1kaWFsb2dmb3JtLW1lc3NhZ2UgewoJYmFja2dyb3VuZDogI2VmZTsgY29sb3I6ICMwNDA7IGJvcmRlcjogMnB4ICM0ODQgc29saWQ7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbi1ib3R0b206IDFlbSAwOwp9CgoKLmVsLWRpYWxvZ2Zvcm0gIHRhYmxlIHRkIC5lbC1ib3JkZXJzZWxlY3QgdGFibGUgewoJd2lkdGg6YXV0bzsKfQoKLmVsLWRpYWxvZ2Zvcm0gIHRhYmxlIHRkIC5lbC1ib3JkZXJzZWxlY3QgdGFibGUgdGQgewoJcGFkZGluZy1sZWZ0IDowOwoJcGFkZGluZy1yaWdodDoycHg7Cn0KLmVsLXBhZGRpbmdpbnB1dCB7CglkaXNwbGF5OiBibG9jazsKCXdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLmVsLXBhZGRpbmdpbnB1dCBpbnB1dCB7CgltYXJnaW4gOjAgMXB4IDAgMDsKCWJvcmRlcjoxcHggc29saWQgI2NjYzsKfQouZWwtcGFkZGluZ2lucHV0IHNlbGVjdCB7CglwYWRkaW5nOjA7Cn0vKiBjb250YWluZXIgZm9yIGVsc2VsZWN0ICovCi5lbC1zZWxlY3QgewoJaGVpZ2h0OjE3cHg7Cgl3aWR0aCA6IDExMHB4OwoJYm9yZGVyOjFweCBzb2xpZCAjY2NjOwoJY3Vyc29yOiBkZWZhdWx0OwoJcG9zaXRpb246cmVsYXRpdmU7Cn0KLmVsLXNlbGVjdC5ob3ZlciB7CgliYWNrZ3JvdW5kLWNvbG9yOiNlZWU7Cn0KCi8qIHNlbGVjdGVkIGVsZW1lbnQgKi8KLmVsLXNlbGVjdCBsYWJlbCB7CgloZWlnaHQ6MTdweDsKCWxpbmUtaGVpZ2h0OjE3cHg7Ci8qCWZvbnQtc2l6ZTouOTJlbTsqLwoJcGFkZGluZzogMCA1cHg7CgltYXJnaW46IDAgMTJweCAwIDA7CglkaXNwbGF5OmJsb2NrOwoJd2hpdGUtc3BhY2U6bm93cmFwOwoJb3ZlcmZsb3c6aGlkZGVuOwoJYmFja2dyb3VuZDogI2ZmZjsKCWJvcmRlci1yaWdodDoxcHggc29saWQgI2NjYzsKfQovKiBkcm9wLWRvd24gbGlzdCAqLwouZWwtc2VsZWN0IC5saXN0IHsKCWJvcmRlcjoxcHggc29saWQgI2NjYzsKCWRpc3BsYXk6YmxvY2s7Cglwb3NpdGlvbjphYnNvbHV0ZTsKCW92ZXJmbG93OmF1dG87CgliYWNrZ3JvdW5kOiNmZmY7Cgl6LWluZGV4OjEwMDA7Ci8qCWhlaWdodDoxNjEwcHgqLwp9Ci8qIGRyb3AtZG93biBsaXN0IGl0ZW0gKi8KLmVsLXNlbGVjdCAubGlzdCBkaXYgewoJcG9zaXRpb246cmVsYXRpdmU7CglwYWRkaW5nOjNweCAyNXB4IDNweCA3cHg7Cglib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVlOwp9Ci8qIGRyb3AtZG93biBsaXN0IGl0ZW0gaG92ZXJlZCAqLwouZWwtc2VsZWN0IC5saXN0IC5ob3ZlciB7CgliYWNrZ3JvdW5kOiNlZmVmZWY7Cn0KLyogZHJvcC1kb3duIGxpc3QgaXRlbSBzZWxlY3RlZCAqLwouZWwtc2VsZWN0IC5saXN0IC5hY3RpdmUgewoJYmFja2dyb3VuZC1jb2xvcjojYzNkYmVmOwp9Ci8qIGFueSBlbGVtZW50cyBpbiBkcm9wLWRvd24gbGlzdCBpdGVtICovCi5lbC1zZWxlY3QgLmxpc3QgZGl2ICogewoJcGFkZGluZzowOwoJbWFyZ2luOjA7Cglib3JkZXI6bm9uZTsKCXdoaXRlLXNwYWNlOm5vd3JhcDsKCWRpc3BsYXk6YmxvY2s7Cn0KCi8qICDQutC+0L3RgtC10LnQvdC10YAgKi8KLmVsLXJ0ZSB7IAoJZm9udC1mYW1pbHk6IFRyZWJ1Y2hldCBNUywgVmVyZGFuYSwgR2VuZXZhLHNhbnMtc2VyaWY7Ci8qCWJvcmRlcjoxcHggc29saWQgI2FhYTsqLwp9Ci5lbC1ydGUuZWwtZnVsbHNjcmVlbiB7Cglwb3NpdGlvbjphYnNvbHV0ZTsKCXdpZHRoOjk5JTsKLyoJaGVpZ2h0OjEwMCU7Ki8KCXRvcDowOwoJbGVmdDowOwoJbWFyZ2luOjA7Ci8qCXotaW5kZXg6MTAxOyovCn0KCi5lbHJ0ZS1zd2YtcGxhY2Vob2xkZXIgewoJd2lkdGg6MXB4OwoJYmFja2dyb3VuZDogdXJsKCcuLi9pbWFnZXMvc3dmLnBuZycpIDAgMCBuby1yZXBlYXQ7CQp9CgovKiBzdHlsZSB0byBkZXRlY3QgaW1hZ2VzIHVybCAqLwovKi5lbC1ydGUgKi8KLmVscnRldGVzdHVybCB7IGNvbG9yOnJlZDsgYmFja2dyb3VuZC1pbWFnZTp1cmwoLi4vaW1hZ2VzL3BpeGVsLmdpZik7fQoKLyog0L/QsNC90LXQu9GMINC40L3RgdGC0YDRg9C80LXQvdGC0L7QsiAqLwouZWwtcnRlIC50b29sYmFyIHsgIGJhY2tncm91bmQtY29sb3I6I2VlZTsgcGFkZGluZzozcHggN3B4IDJweCA3cHg7IGJvcmRlcjoxcHggc29saWQgI2NjYzsgd2hpdGUtc3BhY2U6bm9ybWFsOyB9CgouZWwtcnRlLXJ0bCAudG9vbGJhciB7IGRpcmVjdGlvbjogcnRsOyB9CgovKiDQv9Cw0L3QtdC70Ywg0LrQvdC+0L/QvtC6ICovCi5lbC1ydGUgLnRvb2xiYXIgdWwgewoJcG9zaXRpb246cmVsYXRpdmU7CglkaXNwbGF5OmlubGluZS1ibG9jazsgCglkaXNwbGF5OiAtbW96LWlubGluZS1zdGFjazsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICB6b29tOiAxOwogICAgKmRpc3BsYXk6IGlubGluZTsKCW1hcmdpbjowICFpbXBvcnRhbnQ7CglsaXN0LXN0eWxlOm5vbmU7CglwYWRkaW5nOjAgMnB4IDAgNXB4OwoJYmFja2dyb3VuZDogdXJsKCcuLi9pbWFnZXMvZWxydGUtdG9vbGJhci5wbmcnKSAtOTM0cHggLTJweCBuby1yZXBlYXQ7CQp9Ci8qINC/0LXRgNCy0LDRjyDQv9Cw0L3QtdC70Ywg0LrQvdC+0L/QvtC6ICovCi5lbC1ydGUgLnRvb2xiYXIgdWwuZmlyc3QgewoJYmFja2dyb3VuZDp0cmFuc3BhcmVudDsKCXBhZGRpbmctbGVmdDowOwp9Ci8qINC60L3QvtC/0LrQsCAqLwouZWwtcnRlIC50b29sYmFyIHVsIGxpIHsKCWRpc3BsYXk6aW5saW5lLWJsb2NrOyAKCWRpc3BsYXk6IC1tb3otaW5saW5lLXN0YWNrOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwoJaGVpZ2h0OjIycHg7IAoJd2lkdGg6MjJweDsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICB6b29tOiAxOwogICAgKmRpc3BsYXk6IGlubGluZTsKCW1hcmdpbjoxcHggMXB4ICFpbXBvcnRhbnQ7CglwYWRkaW5nOjAgIWltcG9ydGFudDsgLyogSm9vbWxhIDEuNiBjb21wYXQgKi8KCWJhY2tncm91bmQ6dXJsKCcuLi9pbWFnZXMvZWxydGUtdG9vbGJhci5wbmcnKSBuby1yZXBlYXQ7IAoJYm9yZGVyOjFweCBzb2xpZCAjY2NjOwp9Ci8qINCw0LrRgtC40LLQvdCw0Y8g0Lgg0L/QvtC00YHQstC10YfQtdC90L3QsNGPINC4INC90LXQsNC60YLQuNCy0L3QsNGPINC60L3QvtC/0LrQsCAqLwouZWwtcnRlIC50b29sYmFyIHVsIGxpLmhvdmVyICAgIHsgYm9yZGVyOjFweCBzb2xpZCAjNTRiOWJmOyB9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuYWN0aXZlICAgeyBiYWNrZ3JvdW5kLWNvbG9yOiNjM2RiZWY7IGJvcmRlcjoxcHggc29saWQgI2ZmZjsgfQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmRpc2FibGVkIHsgb3BhY2l0eTphbHBoYSgwLjMpOyBvcGFjaXR5OiAwLjM7IGZpbHRlcjpBbHBoYShPcGFjaXR5PTMwKTt9Ci8qICDQutC90L7Qv9C60LggICovCi5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuYWJvdXQgICAgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTgyOXB4IC01cHg7fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLnNhdmUgICAgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTMwcHggLTJweDt9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkubmV3ICAgICAgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNTVweCAtMnB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmNvcHkgICAgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTc4cHggLTJweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5jc3MgICAgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MDFweCAtNXB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmN1dCAgICAgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTEwNHB4IC0ycHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkucGFzdGUgICAgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTJweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5wYXN0ZXRleHQgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi01MzRweCAtMnB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLnBhc3RlZm9ybWF0dGV4dCAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTE1NHB4IC0ycHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkucmVtb3ZlZm9ybWF0ICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotMTgwcHggLTJweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5kb2NzdHJ1Y3R1cmUgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MTJweCAtNHB4fSAgCi5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudW5kbyAgICAgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotMjA1cHggLTJweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5yZWRvICAgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMzBweCAtMnB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmJvbGQgICAgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTI1MnB4IC0ycHg7IH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5pdGFsaWMgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNzBweCAtMnB4O30KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS51bmRlcmxpbmUgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yOTBweCAtMnB4OyB9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuc3RyaWtldGhyb3VnaCAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ5cHggLTI5cHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuc3Vic2NyaXB0ICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNTRweCAtMjlweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5zdXBlcnNjcmlwdCAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03NnB4IC0yOXB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmp1c3RpZnlsZWZ0ICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTMxMXB4IC0ycHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuanVzdGlmeWNlbnRlciAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotMzM1cHggLTJweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5qdXN0aWZ5cmlnaHQgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNjBweCAtMnB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmp1c3RpZnlmdWxsICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTE3NHB4IC0yOXB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmluc2VydHVub3JkZXJlZGxpc3Qge2JhY2tncm91bmQtcG9zaXRpb246LTEwMHB4IC0yOXB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmluc2VydG9yZGVyZWRsaXN0ICAge2JhY2tncm91bmQtcG9zaXRpb246LTEyNHB4IC0yOXB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLm91dGRlbnQgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTZweCAgIC0yOXB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmluZGVudCAgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTMycHggIC0yOXB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmJsb2NrcXVvdGUgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTIyMHB4IC0zMHB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmRpdiAgICAgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTY1NXB4IC0yOXB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLnN0b3BmbG9hdCAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTc3MXB4IC01cHh9ICAKLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5uYnNwICAgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi01ODBweCAtMnB4fSAKLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5mb3JlY29sb3IgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNzJweCAtMzBweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5oaWxpdGVjb2xvciAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zOTVweCAtMzBweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5saW5rICAgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDRweCAtMjlweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS51bmxpbmsgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNzBweCAtMjlweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5hbmNob3IgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yOTZweCAtMzBweH0gCi5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuaW1hZ2UgICAgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotMzg0cHggLTJweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5mbGFzaCAgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00MTBweCAtMnB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmZpbGUgICAgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTQzNnB4IC0zcHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGFibGUgICAgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDIxcHggLTMwcHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGFibGVwcm9wcyAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNjAycHggLTI5cHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGJjZWxscHJvcHMgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotODA2cHggLTI3cHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGFibGVybSAgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDYxcHggLTJweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS50YnJvd2JlZm9yZSAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02ODNweCAtNHB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLnRicm93YWZ0ZXIgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTY1NHB4IC00cHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGJyb3dybSAgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNTAwcHggLTMwcHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGJjb2xiZWZvcmUgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNzQxcHggLTI3cHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGJjb2xhZnRlciAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNzcycHggLTI3cHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGJjb2xybSAgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNTI2cHggLTMwcHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGJjZWxsc21lcmdlICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNTUycHggLTMwcHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkudGJjZWxsc3BsaXQgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNjI5cHggLTI5cHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuc21pbGV5ICAgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotMzIycHggLTI5cHh9Ci5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuc3BlYy10ZXh0ICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDg3cHggLTJweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5wcmludCAgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi01MDlweCAtMnB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmhvcml6b250YWxydWxlICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTE5OXB4IC0yOXB4fQouZWwtcnRlIC50b29sYmFyIHVsIGxpLmZ1bGxzY3JlZW4gICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTM0OHB4IC0zMHB4fSAgCi5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuZWxmaW5kZXIgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDM2cHggLTJweH0KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5sdHIgICAgICAgICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04NTVweCAtMjdweH0gIAouZWwtcnRlIC50b29sYmFyIHVsIGxpLnJ0bCAgICAgICAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTg1NXB4IC0zcHh9IAouZWwtcnRlIC50b29sYmFyIHVsIGxpLnBhZ2VicmVhayAgICAgICAgICAge2JhY2tncm91bmQtcG9zaXRpb246LTcxMXB4IC0yOHB4fSAgCgoKLyog0YDQsNCx0L7Rh9Cw0Y8g0LfQvtC90LAgKNC+0LHQtdGA0YLQutCwINC90LDQtCBpZnJhbWUpICovCi5lbC1ydGUgLndvcmt6b25lIHsgYm9yZGVyOjFweCBzb2xpZCAjZWVlOyBib3JkZXItdG9wOm5vbmU7IGhlaWdodDo0MDBweDt9Ci5lbC1ydGUuc21hbGwgLndvcmt6b25lIHsgbWluLWhlaWdodDoyNTBweDsgfQoKLyogc291cmNlIGNvZGUgKi8KLmVsLXJ0ZSB0ZXh0YXJlYSAgeyB3aWR0aDoxMDAlOyAgaGVpZ2h0OjEwMCU7ICBib3JkZXI6bm9uZTsgem9vbToxOyBvdXRsaW5lOm5vbmU7fQouZWwtcnRlLnNtYWxsIHRleHRhcmVhICB7IG1pbi1oZWlnaHQ6MjUwcHg7fQovKiDRgNC10LTQsNC60YLQvtGAICovCi5lbC1ydGUgaWZyYW1lICAgIHsgCgl3aWR0aDogMTAwJTsgCgloZWlnaHQ6NDAwcHg7IAoKCW91dGxpbmU6bm9uZTsgCglib3JkZXI6MCBzb2xpZDsgCglwYWRkaW5nOjA7IAoJbWFyZ2luOjA7CgliYWNrZ3JvdW5kOiNmZmY7IAoJei1pbmRleDoxMDA7Cn0KLmVsLXJ0ZS5zbWFsbCBpZnJhbWUgIHsgbWluLWhlaWdodDoyNTBweDt9CgovKiDQv9Cw0L3QtdC70Ywg0YHRgtCw0YLRg9GB0LAgKNC/0YPRgtGMKSAqLwouZWwtcnRlIC5zdGF0dXNiYXIgewoJaGVpZ2h0OiAyMXB4OwoJcGFkZGluZzogMCA5cHg7Cglmb250OiAxMXB4LzIxcHggJ21vbmFjbycsICdhbmRhbGUgbW9ubycsICdsdWNpZGEgY29uc29sZScsIG1vbm9zcGFjZTsKCWJhY2tncm91bmQtY29sb3I6I2VlZTsKCWJvcmRlci10b3A6MXB4IHNvbGlkICNjY2M7CQoJYm9yZGVyLXRvcDpub25lOwp9CgouZWwtcnRlLXJ0bCAuc3RhdHVzYmFyIHsKCWRpcmVjdGlvbjpydGw7Ci8qCXRleHQtYWxpZ246cmlnaHQ7Ki8KfQoKLyog0YLQsNCx0YsgKi8KLmVsLXJ0ZSAudGFic2JhciB7IGRpc3BsYXk6IGJsb2NrOyAgfQouZWwtcnRlIC50YWJzYmFyIC50YWIgewoJZmxvYXQ6bGVmdDsgIAoJbWFyZ2luLXJpZ2h0OjJweDsgCglwYWRkaW5nOiA2cHggMTdweDsKCWZvbnQtc2l6ZTogLjgyZW07IAoJZm9udC13ZWlnaHQ6Ym9sZDsKCWNvbG9yOiM3Nzc7Cgl0ZXh0LWFsaWduOmNlbnRlcjsgIAoJYm9yZGVyOjFweCBzb2xpZCAjZWVlOwoJYm9yZGVyLXRvcDpub25lOwoJYmFja2dyb3VuZDogI2ZmZjsKCWN1cnNvcjogZGVmYXVsdDsKfQouZWwtcnRlIC50YWJzYmFyIGRpdi5hY3RpdmUgeyBiYWNrZ3JvdW5kOiAjZWVlOyBjb2xvcjojNDQ0OyB9Ci5lbC1ydGUtcnRsIC50YWJzYmFyIC50YWIgIHsgZmxvYXQ6cmlnaHQ7IH0KCi8qINCy0YvQv9Cw0LTQsNGO0YnQuNC1INC80LXQvdGOICovCi8qIGNvbnRhaW5lciBmb3IgZWxzZWxlY3QgKi8KLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5lbC1zZWxlY3QgewoJaGVpZ2h0OjIycHg7Cgl3aWR0aCA6IDEyMHB4OwoJYm9yZGVyOjFweCBzb2xpZCAjY2NjOwoJZm9udC1zaXplOi44MmVtOwoJY3Vyc29yOiBkZWZhdWx0OwoJYmFja2dyb3VuZC1wb3NpdGlvbjotNDc1cHggLTMwcHg7Cn0KCi5lbC1ydGUgLnRvb2xiYXIgdWwgbGkuZWwtc2VsZWN0LmhvdmVyIHsKCWJhY2tncm91bmQtY29sb3I6I2ZlZmVmZTsKfQoKLmVsLXJ0ZSAudG9vbGJhciB1bCBsaS5lbC1zZWxlY3QgbGFiZWwgewoJaGVpZ2h0OjE5cHg7CglwYWRkaW5nOiAzcHggNXB4IDAgNXB4OwoJZmxvYXQ6bm9uZTsgLyogSm9vbWxhIDEuNiBjb21wYXQgKi8KCXdpZHRoOjk2cHg7IC8qIEpvb21sYSAxLjYgY29tcGF0ICovCn0KCi8qIHRleHRhcmVhICYgaWZyYW1lINCyINC00LjQv9C70L7Qs9Cw0YUg0LLRgdGC0LDQstC60Lgg0YLQtdC60YHRgtCwICovCi5lbC1ydGUtcGFzdGUtaW5wdXQgewoJd2lkdGggOiA5OSU7CgloZWlnaHQ6IDI1MHB4OwoJYm9yZGVyOiAxcHggc29saWQgI2NjYzsKCXBhZGRpbmc6MDsKCW1hcmdpbjowOwoJb3V0bGluZTpub25lOwp9Ci8qINC40L3QtNC40LrQsNGC0L7RgCDQstGL0LHRgNCw0L3QvtCz0L4g0YbQstC10YLQsCDQvdCwINC60L3QvtC/0LrQtSAqLwouZWwtcnRlIC50b29sYmFyIHVsIGxpIGRpdi5jb2xvci1pbmRpY2F0b3IgewoJd2lkdGg6MThweDsKCWhlaWdodDo0cHg7CgltYXJnaW46MTZweCAwIDJweCAycHg7CgliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOwp9Ci5lbC1ydGUtcnRsIC50b29sYmFyIHVsIGxpIGRpdi5jb2xvci1pbmRpY2F0b3IgewoJbWFyZ2luOjE2cHggMnB4IDJweCAwOwp9Ci8qIGNvbG9ycyBwYWxldHRlICovCi5lbC1wYWxldHRlIHsgdG9wOjIwcHg7IH0KCi5lbC1kaWFsb2dmb3JtLCAuZWwtZGlhbG9nZm9ybSB0ZCAgeyBmb250LXNpemU6LjllbTsgfQouZWwtZGlhbG9nZm9ybSBzZWxlY3QgeyBmb250LXNpemU6LjllbTt9Ci51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5lIHsgcGFkZGluZzogLjRlbSwgMWVtO30KLnVpLWRpYWxvZyAudWktZGlhbG9nLWJ1dHRvbnBhbmUgYnV0dG9uIHsgbWFyZ2luOiAuM2VtIC40ZW0gLjFlbSAwOyBmb250LXNpemU6LjllbTt9Ci51aS1kaWFsb2cgLnVpLWRpYWxvZy10aXRsZWJhciB7IHBhZGRpbmc6IC4zZW0gMWVtIC4zZW07ICAgfQovKi51aS1kaWFsb2ctYnV0dG9uc2V0IHsgcGFkZGluZzowOyBiYWNrZ3JvdW5kLWNvbG9yOiMzMzM7fSovCi8qINC00LjQsNC70L7Qs9C+0LLRi9C1INC+0LrQvdCwICovCi5lbC1kaWFsb2dmb3JtIGxhYmVsIHsKCWRpc3BsYXk6YmxvY2s7Cn0KLmVsLWRpYWxvZ2Zvcm0gbGFiZWwgaW5wdXQgewoJbWFyZ2luLXJpZ2h0OjJweDsKfQouZWwtZGlhbG9nZm9ybSBpZnJhbWUuZWwtcnRlLXByZXZpZXcgewoJd2lkdGggOiAxMDAlOwoJaGVpZ2h0IDogMjM1cHg7CgltYXJnaW46MDsKCXBhZGRpbmc6MDsKCW91dGxpbmU6bm9uZTsKCWJvcmRlcjpub25lOwp9Ci5lbC1kaWFsb2dmb3JtIGZpZWxkc2V0IHsKCWJvcmRlcjoxcHggc29saWQgI2NjYzsKCXBhZGRpbmcgOiAwOwp9Ci5lbC1kaWFsb2dmb3JtIGZpZWxkc2V0IGxlZ2VuZCB7Cglmb250LXNpemU6LjllbTsKCXBhZGRpbmc6IC4xZW0gLjVlbTsKCW1hcmdpbjogMCAwIDVweCAxZW07Cglib3JkZXI6MXB4IHNvbGlkICNjY2M7CgliYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOwp9Ci5lbC1kaWFsb2dmb3JtIHAgeyBwYWRkaW5nOi4yZW0gLjNlbTt9Ci5lbC1kaWFsb2dmb3JtIGgzIHsgY29sb3I6IzU1NTsgcGFkZGluZzoxLjJlbSAwIDAgMDsgbWFyZ2luOjA7IGZvbnQtc2l6ZToxLjJlbTsgfQoKLmVsLWRpYWxvZ2Zvcm0gaDQgeyBjb2xvcjojNTU1O2ZvbnQtc2l6ZToxZW07IHBhZGRpbmc6MDsgbWFyZ2luOiAzcHggOXB4OyB9CgouZWxydGUtbG9nbyB7IAoJd2lkdGg6NDhweDsgCgloZWlnaHQ6NDZweDsKCWZsb2F0OmxlZnQ7IAoJbWFyZ2luOi41ZW0gMWVtOwoJYmFja2dyb3VuZDp1cmwoJy4uL2ltYWdlcy9lbHJ0ZS10b29sYmFyLnBuZycpIC04ODBweCAtN3B4IG5vLXJlcGVhdDsKfQouZWxydGUtdmVyIHsgZm9udC1zaXplOi45ZW07IHBhZGRpbmctbGVmdDouN2VtO30KLmVscnRlLWNvcHkgeyBmb250LXNpemU6LjllbTsgcGFkZGluZy1sZWZ0Oi4zZW07fQp0YWJsZS5lbHJ0ZS1hdXRob3JzIHsgbWFyZ2luLWJvdHRvbToxZW07fQp0YWJsZS5lbHJ0ZS1hdXRob3JzIHRkIHsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2VlZTt9Ci8qIHdpZGdldHMgKi8KLmVsLWJvcmRlcnNlbGVjdCB7fQouZWwtYm9yZGVyc2VsZWN0IHRhYmxlICAgICAgeyAgbWFyZ2luOjA7IH0KLmVsLWJvcmRlcnNlbGVjdCB0YWJsZSB0ZCAgIHsgcGFkZGluZyA6IDAgMnB4IDAgMDsgdmVydGljYWwtYWxpZ246bWlkZGxlOyB9Ci5lbC1ib3JkZXJzZWxlY3QgaW5wdXQgICAgICB7IG1hcmdpbjowOyAgYm9yZGVyOjFweCBzb2xpZCAjY2NjOyB9CgouZWwtcGFkZGluZ2lucHV0ICAgICAgICB7IGRpc3BsYXk6IGJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB9Ci5lbC1wYWRkaW5naW5wdXQgaW5wdXQgIHsgbWFyZ2luIDowIDFweCAwIDA7IGJvcmRlcjoxcHggc29saWQgI2NjYzsgfQouZWwtcGFkZGluZ2lucHV0IHNlbGVjdCB7IHBhZGRpbmc6MDsgfQoKLmVsLXJ0ZS1zbWlsZXkgeyBtYXJnaW46NXB4OyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/elrte.plugin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogZWxydGUucGx1Z2luLnBocCA2NiAyMDEwLTA5LTI0IDE0OjIyOjEyWiB0b3VjaGRlc2lnbiAkCiAqCiAqIHRvdWNoSW5saW5lRWRpdCBlbHJ0ZSBwbHVnaW4KICoKICogQ29weXJpZ2h0IChjKSAyMDEwIHRvdWNoRGVzaWduLCA8d3d3LnRvdWNoZGVzaWduLmRlPgogKgogKiBAY2F0ZWdvcnkgTW9kdWxlCiAqIEBhdXRob3IgQ2hyaXN0b3BoIEdydWJlciA8d3d3LnRvdWNoZGVzaWduLmRlPgogKiBAdmVyc2lvbiAxLjcKICogQGNvcHlyaWdodCAwNC4wOC4yMDEwIHRvdWNoRGVzaWduCiAqIEBsaW5rIGh0dHA6Ly93d3cudG91Y2hkZXNpZ24uZGUvCiAqIEBsaW5rIGh0dHA6Ly93d3cuaG9tZXBhZ2UtY29tbXVuaXR5LmRlL2luZGV4LnBocD90b3BpYz0xNjgwLjAKICogQGxpbmsgaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy90b3VjaElubGluZUVkaXQKICogQGxpY2Vuc2UgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwgMi4wKQogKiBAdG9kbyBhZGQgY29udGVudF9ibG9jayBoYW5kbGluZwogKiAKICogLS0KICoKICogVXNhZ2U6IAogKgogKiB7Y21zX21vZHVsZSBtb2R1bGU9InRvdWNoSW5saW5lRWRpdCJ9CiAqCiAqIHtjb250ZW50IGlzZWRpdGFibGU9J3RydWUnfQogKgogKiAtLQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogKiBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiAqCiAqLwoKY2xhc3MgZWxydGUgZXh0ZW5kcyB0b3VjaElubGluZUVkaXQgewoKCXZhciAkbmFtZSA9ICdlbHJ0ZSc7Cgl2YXIgJHNtYXJ0eTsKCXZhciAkcGx1Z2luRGlyOwoKCWZ1bmN0aW9uIF9fY29uc3RydWN0KCl7CgkJZ2xvYmFsICRnQ21zOwoKCQkkdGhpcy0+cGx1Z2luRGlyID0gJ21vZHVsZXMvJyAuICR0aGlzLT5nZXROYW1lKCkgLiAnLycgCgkJCS4gVElFX1BMVUdJTl9ESVIgLiAkdGhpcy0+bmFtZTsKCgkJJHRoaXMtPnNtYXJ0eSA9ICYkZ0Ntcy0+c21hcnR5OwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKCl7CgkJJHRoaXMtPlNldFByZWZlcmVuY2UoInRvdWNoSW5saW5lRWRpdC4iLiR0aGlzLT5uYW1lLiIuVG9vbGJhciIsImNvbXBsZXRlIik7CgkJJHRoaXMtPlNldFByZWZlcmVuY2UoInRvdWNoSW5saW5lRWRpdC4iLiR0aGlzLT5uYW1lLiIuSlF1ZXJ5TG9hZCIsInRydWUiKTsKCX0KCglwcml2YXRlIGZ1bmN0aW9uIGZldGNoKCR0ZW1wbGF0ZSl7CgkJZ2xvYmFsICRnQ21zOwoKCQkkY29uZmlnID0gJiRnQ21zLT5jb25maWc7CgoJCXJldHVybiAkdGhpcy0+c21hcnR5LT5mZXRjaCgkY29uZmlnWydyb290X3BhdGgnXSAuICcvJwoJCQkuICR0aGlzLT5wbHVnaW5EaXIKCQkJLiAnL3RlbXBsYXRlcy8nIC4gJHRlbXBsYXRlKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gZ2V0QWRtaW5Db25maWcoJGlkLCRyZXR1cm5pZCl7CgoJCSRib29sID0gYXJyYXkoCgkJCSR0aGlzLT5MYW5nKCJ5ZXMiKSA9PiAndHJ1ZScsCgkJCSR0aGlzLT5MYW5nKCJubyIpID0+ICdmYWxzZScKCQkpOwoJCQoJCS8vIEZvcm0gc3RhcnQKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Zvcm1zdGFydCcsJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsInNhdmVlZGl0b3IiLCRyZXR1cm5pZCkpOwoKCQkkdG9vbGJhcnMgPSBhcnJheSgKCQkJJ3RpbnknLCdjb21wYWN0Jywnbm9ybWFsJywnY29tcGxldGUnLCdtYXhpJwoJCSk7CgoJCS8vIEVuYWJsZSBmdWxsIHBhbmVsIGluIEZFCgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidUb29sYmFyX2xhYmVsJywkdGhpcy0+TGFuZygkdGhpcy0+bmFtZS4iVG9vbGJhcl9sYWJlbCIpKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ1Rvb2xiYXJfaGVscCcsJHRoaXMtPkxhbmcoJHRoaXMtPm5hbWUuIlRvb2xiYXJfaGVscCIpKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ1Rvb2xiYXJfaW5wdXQnLCR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKCRpZCwkdGhpcy0+bmFtZS4iVG9vbGJhciIsCgkJCWFycmF5X2NvbWJpbmUoJHRvb2xiYXJzLCR0b29sYmFycyksIiIsJHRoaXMtPkdldFByZWZlcmVuY2UoInRvdWNoSW5saW5lRWRpdC4iLiR0aGlzLT5uYW1lLiIuVG9vbGJhciIsInRydWUiKSwiXG4iKSk7CgoJCS8vIGpxdWVyeSBsaWIKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ0pRdWVyeUxvYWRfbGFiZWwnLCR0aGlzLT5MYW5nKCR0aGlzLT5uYW1lLiJKUXVlcnlMb2FkX2xhYmVsIikpOwoJCSR0aGlzLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nSlF1ZXJ5TG9hZF9oZWxwJywkdGhpcy0+TGFuZygkdGhpcy0+bmFtZS4iSlF1ZXJ5TG9hZF9oZWxwIikpOwoJCSR0aGlzLT5zbWFydHktPmFzc2lnbigkdGhpcy0+bmFtZS4nSlF1ZXJ5TG9hZF9pbnB1dCcsJHRoaXMtPkNyZWF0ZUlucHV0UmFkaW9Hcm91cCgkaWQsJHRoaXMtPm5hbWUuIkpRdWVyeUxvYWQiLAoJCQkkYm9vbCwkdGhpcy0+R2V0UHJlZmVyZW5jZSgidG91Y2hJbmxpbmVFZGl0LiIuJHRoaXMtPm5hbWUuIi5KUXVlcnlMb2FkIiwidHJ1ZSIpLCIiLCJcbiIpKTsKCgkJLy8gU3VibWl0IC8gY2FuY2VsCgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLCR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsInN1Ym1pdCIsJHRoaXMtPkxhbmcoInNhdmUiKSkpOwoJCSR0aGlzLT5zbWFydHktPmFzc2lnbignY2FuY2VsJywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCJjYW5jZWwiLCR0aGlzLT5MYW5nKCJjYW5jZWwiKSkpOwoKCQkvLyBGb3JtIGVuZAoJCSR0aGlzLT5zbWFydHktPmFzc2lnbignZm9ybWVuZCcsJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CgoJCWVjaG8gJHRoaXMtPmZldGNoKCJhZG1pbmVkaXRvci50cGwiKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gc2F2ZUFkbWluQ29uZmlnKCRwYXJhbXMpewoKCQlpZihpc3NldCgkcGFyYW1zWyR0aGlzLT5uYW1lLiJUb29sYmFyIl0pICYmICFlbXB0eSgkcGFyYW1zWyR0aGlzLT5uYW1lLiJUb29sYmFyIl0pKXsKCQkJJHRoaXMtPlNldFByZWZlcmVuY2UoInRvdWNoSW5saW5lRWRpdC4iLiR0aGlzLT5uYW1lLiIuVG9vbGJhciIsJHBhcmFtc1skdGhpcy0+bmFtZS4iVG9vbGJhciJdKTsKCQl9CgkJaWYoaXNzZXQoJHBhcmFtc1skdGhpcy0+bmFtZS4iSlF1ZXJ5TG9hZCJdKSAmJiAhZW1wdHkoJHBhcmFtc1skdGhpcy0+bmFtZS4iSlF1ZXJ5TG9hZCJdKSl7CgkJCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCJ0b3VjaElubGluZUVkaXQuIi4kdGhpcy0+bmFtZS4iLkpRdWVyeUxvYWQiLCRwYXJhbXNbJHRoaXMtPm5hbWUuIkpRdWVyeUxvYWQiXSk7CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXRIZWFkZXIoKXsKCQlnbG9iYWwgJGdDbXM7CgoJCSR0aWVQcmVmID0gJHRoaXMtPkdldFByZWZWYXJzKCk7CgkJJHRpZUxhbmcgPSAkdGhpcy0+R2V0TGFuZ1ZhcnMoKTsKCgkJJGhlYWQgPSAnPCEtLSAnLiR0aGlzLT5nZXROYW1lKCkuJyBtb2R1bGUgLS0+JyAuICJcbiI7CgoJCS8vIGpRdWVyeQoJCWlmKChib29sKSR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0b3VjaElubGluZUVkaXQuIi4kdGhpcy0+bmFtZS4iLkpRdWVyeUxvYWQiKSl7CgkJCSRoZWFkLj0gJzxzY3JpcHQgc3JjPSInLiR0aGlzLT5wbHVnaW5EaXIuJy9qcy9qcXVlcnktMS40LjIubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PicgLiAiXG4iOwoJCQkkaGVhZC49ICc8c2NyaXB0IHNyYz0iJy4kdGhpcy0+cGx1Z2luRGlyLicvanMvanF1ZXJ5LXVpLTEuOC41LmN1c3RvbS5taW4uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+JyAuICJcbiI7CgkJCSRoZWFkLj0gJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iJy4kdGhpcy0+cGx1Z2luRGlyLicvanMvdWktdGhlbWVzL3Ntb290aG5lc3MvanF1ZXJ5LXVpLTEuOC41LmN1c3RvbS5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiBjaGFyc2V0PSJ1dGYtOCI+JzsKCQl9CgoJCS8vIGVscnRlCgkJJGhlYWQuPSAnPHNjcmlwdCBzcmM9IicuJHRoaXMtPnBsdWdpbkRpci4nL2pzL2VscnRlLm1pbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4nIC4gIlxuIjsKCQkkaGVhZC49ICc8c2NyaXB0IHNyYz0iJy4kdGhpcy0+cGx1Z2luRGlyLicvanMvaTE4bi9lbHJ0ZS5ydS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4nIC4gIlxuIjsKCQkkaGVhZC49ICc8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9IicuJHRoaXMtPnBsdWdpbkRpci4nL2Nzcy9lbHJ0ZS5mdWxsLmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIGNoYXJzZXQ9InV0Zi04Ij4nOwoKCQkvLyB0b3VjaElubGluZUVkaXQKCQkkaGVhZC49ICc8c2NyaXB0IHNyYz0iJy4kdGhpcy0+cGx1Z2luRGlyLicvanMvdG91Y2hJbmxpbmVFZGl0LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PicgLiAiXG4iOwoKCQkvLyBTY3JpcHQKCQkkc2NyaXB0ID0gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+JyAuICJcbiI7CgkJJHNjcmlwdC49ICcJdmFyIGNCbG9ja01haW47JyAuICJcbiI7CgkJJHNjcmlwdC49ICcJdmFyIHRpZUNvbnRlbnRJZCA9ICcuJGdDbXMtPnZhcmlhYmxlc1snY29udGVudF9pZCddLic7JyAuICJcbiI7CgkJJHNjcmlwdC49ICcJdmFyIHRpZVJlcXVlc3RVcmkgPSAiJy4kX1NFUlZFUlsiUkVRVUVTVF9VUkkiXS4nIjsnIC4gIlxuIjsKCQkkc2NyaXB0Lj0gJwl2YXIgdGllVXBkYXRlQWxlcnQgPSAnLiR0aWVQcmVmWydmZVVwZGF0ZUFsZXJ0J10uJzsnIC4gIlxuIjsKCQkkc2NyaXB0Lj0gJwl2YXIgdGllVXBkYXRlQWxlcnRNZXNzYWdlID0gIicuJHRpZUxhbmdbJ2ZlVXBkYXRlQWxlcnQnXS4nIjsnIC4gIlxuIjsKCQkkc2NyaXB0Lj0gJwl2YXIgdGllVG9vbGJhciA9ICInLiR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0b3VjaElubGluZUVkaXQuIi4kdGhpcy0+bmFtZS4iLlRvb2xiYXIiKS4nIjsnIC4gIlxuIjsKCQkkc2NyaXB0Lj0gJwl2YXIgdGllRWRpdE9uRGJsQ2xpY2sgPSAnLiR0aWVQcmVmWydmZUVkaXRPbkRibENsaWNrJ10uJzsnIC4gIlxuIjsKCQkkc2NyaXB0Lj0gJzwvc2NyaXB0PicgLiAiXG4iOwoJCSRzY3JpcHQuPSAnPCEtLSAnLiR0aGlzLT5nZXROYW1lKCkuJyBtb2R1bGUgLS0+JyAuICJcbiI7CgoJCXJldHVybiAkaGVhZCAuICRzY3JpcHQ7Cgl9Cn0KCj8+]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/images/elrte-toolbar.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAA6wAAAA3CAYAAAAIcsdZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzExODQ0QkZCNzg0MTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzExODQ0QzBCNzg0MTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDMTE4NDRCREI3ODQxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDMTE4NDRCRUI3ODQxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkPSkp0AAGrUSURBVHja7F0FfBRH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]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/google-maps.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAK4AAAAlCAMAAADspSLHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NEExM0Y1NkFCNzhEMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NEExM0Y1NkJCNzhEMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0QTEzRjU2OEI3OEQxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0QTEzRjU2OUI3OEQxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Prv1NI0AAAAYUExURY+Pj25ubtTU1LGxsTc3N1RUVPX19f///9+GG0kAAAAIdFJOU/////////8A3oO9WQAABBNJREFUeNrMmO2a6yAIhBGE3P8dHxg/gm2y7W6a5zR/2qRRX0ccsLR9+jJmFt7uuSiNEwMxm12jFSEqd+MaF1yqhYgvEQsVvTjnV7gOS2JxsThxIbuCq2p3qmsSgF0RMx+uXuC9G9dESw5Zo6r8tbiNdhmw8PcGgxQta/d2aafci+uh+lsxsSf/E+6zuA+uLyTrdNyfRVZ/7p7NYiuuNyb5IDuZu+S5DRj5cOS+sb/ieaBfMxewJwaFa9OCa+RvLY13DaDA+FweHt36DWZN5pnhNBacI7ACeCSqEFtCx7g6f7zkjBpumHDRGo1zcFCxUuOyjfHZrL8/rBjGqhDupLfBjfdCHLin2nry4JZFSnvLggHfpr6iBH7nhYwDF63jhaJ5/Ur14PPgqUo1MhOB0BzUvHet1u4qeZel8Qpe9Mn5cpXTjeHZo6NtrC3CWyT3LeWSWmioxJ1KEy5aN0CtmnGbnDE6vtQC/Xr84FcbuhY8ni0oou5MXReexk+x1t4Dh7hzG0lsIxpvhbyccF1cxuJ7kHDGHWAyHkRnc6A6oZuugdvf9FX6AZcSLmOpQ9z5aIvay2KrjnG1JmeIPRZ9IL2n9QMdkDgB7oMuuJuG9FpnfRDBcGw1lnGx1BKCLrgldv54q7RSo+M2s0DhtHR7hsux15R0xW3S19oRKWRbfdfa5Xv1Abce4Fq8VQYuPGbilnKUT45xLXagd+XIz7ibxfOQAkaWo8GgSiieQBZ1ZdtzgE9UWlRjzUraag/+tePqES4NwCN127YPyyNsouQzLkfEh8/FQL2P4ts7UkTGdf22mC9mNZL5HrvHuEfqGuxh/vyM2wpF8ZpBdbUyh3Jcxp5fcJ1tiQamAnPDEUQicizVDFaO0+Whug98D1vNsgfSU/Ry4G6YyIwGRWBa5GTeTzkjlRYEji0ljqt95DknuEPdHgz9lsPDuBuD2xo1dVbejpvC0seuoHHfHfIyzUoOdja6mFlNNa3Oi62m/Y76VstpYsJ71I5+8+HVU2GdiUp6CugLG7zSvyTzT4FTRhUSphMR4tHFr3A9J0sk8uEMtRZJSRge4+maenmB+mQ61Cg1/BuOxppOR+CVliJSwMeMZZpO8whnaBctJc7AtbFwPSejwpGmp0gucWSUP70cimlhw/gMfd334IBNKGX7RGqj9MjVixlF+1EP9x9b60LvnE4MRfSu/FMBGXf7/wzUhEB5mt3dnr1+eYRjdK8gn0PV7Oejxwl65Vf/4uBPht/37mcn1MRR7umnTj1v4P6xY9JUZWr9zEnnNtw46c0IkJ6GvxeXNJVB26dw3/kH8k9XWRxblb8bV7Id0N3iXt9qsOWeQJXsy3GjrIusghrndtrruBv+EUaqtttpP4A7M9f9sNv2T4ABAMfSlyPJQ0q7AAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/loading.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhHwAfANUAAP///5qamiYmJuTk5Ly8vMzMzKqqqrCwsKKioujo6NTU1Pb29qioqKCgoK6urtLS0tzc3NjY2Li4uObm5nBwcMbGxmhoaEZGRkhISDIyMvj4+Pr6+lBQUDY2NsTExFZWVpKSkgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAHwAfAAAG/0CAcEhMPAgOBKDDoQQKxKh0CJEErleAYLu1HDRT6YCALWu5XEolPIwYymY0GmNgAxrwuJybCUcaAHlYZ3sCdxFRA28BgVgHBQMLAAkeIB9ojQYDRGSDAQwKYRsIF4ZlBFR5AJt2a3kQQlZlDBN2QxMMcBKTeaG2Qwp5RnAHv1EHcEdwUMZDBXBIcKzNq3BJcJLUAAtwStrNCNjf3GUIDtLfA9adWMzUz6cPxN/IZQ8JvdTBcAkAsli0jOHSJQSCqmlhNr0awo7RJ19TFORqdAXVEEVZyjyKtG1AgXoZA2iK8oeiKkFZGiCaggelSTiA2LhxidLASjZjBL2siNBOFQ84LyXA+mYEiRJzBO7ZCQIAIfkEAQoAIQAsEAAAAA8ADwAABldAhIPwSISOyGRguZRAAEkkc0oYREPTqSESzU4bXe8ylDEgF4PCYRoSCDCVKEDBCLTdAormasXjD1chFRd+AhaBIQiFAgWBGx+FdoEghRSIHoUciAmFHUEAIfkEAQoAIQAsFgAFAAkAFQAABlnAkDDUiAyHgYBhcEwmCQCh0wkJTRjTgESoyAYSIcAh+xAWsgThIOsQLrKIo1yYENjtHaHnbucIQXwCFCEbH4EBIQiBAgUVF4EWQosHQ3wUGkd2GBVzGQZDQQAh+QQBCgAhACwQABAADwAPAAAGWcCQcChcBI5HBJE4QB4dy2HBGSBEQ4AD9XFVUAOJ6IRBlUQroS+EuEFcBGkkARBKeEAfgR5+NAyEe4F6IQ0RQ4KBGUuIehgGi4gUaJB7FgcaVx0cFAEFV0NBACH5BAEKACEALAUAFgAVAAkAAAZUwJAwVBkajYOjUHBBbJQhgIIROAqugg/IkwgtBoVDYFxdYs+CEHk9DmXQZzWb3DBg4Ff53BAhUvB6awRJQhoHFmiBARIQAFAFARQcHSEIDgQPXUZBACH5BAEKACEALAAAEAAPAA8AAAZZwI5gOEyEjsgjhzj0JJMUpgD0RAakn001VJAKENuQRXqpbA/e0KCqiRJDAYYC8KxghvCA/lAYLJAGGXl6hHpPDYWJTxEGiYRVAwSOAVsAEBKKYSEJDwQOCEEAIfkEAQoAIQAsAAAFAAkAFQAABlnAkNCQERpDFYxAcNRQlkvjAQoVWqiCS6WAFSBCAexnE3pSQUIO1iPsYBPHuBARqNcXQoe9PhAS9gEFQg+ABwAhCYABCkISgAwTIRCKQgB/dkcDBnVyEQ1HQQAh+QQBCgAhACwAAAAADwAPAAAGWMCQcEgsBCicDnGoOVgEUOgyVKFEr0sD5oolZrjdUKQRAkeFA0MgUI5+QJ5ECEBYr8sXxIYIsdupUxJ+AQwTUwmDAQpTIQ+DBwCMdX4FjCEOgwOWCIMLlkEAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/media-director.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NEExM0Y1NzJCNzhEMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6N0VBMjJFMTJCNzhEMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0QTEzRjU3MEI3OEQxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0QTEzRjU3MUI3OEQxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pul8LuAAAABaUExURefn5zExMTY2NtjY2Do6Oj09PVVVVVpaWlFRUUFBQZiYmKioqGlpaUlJSYKCgvPz82FhYUVFRXl5eU1NTV1dXWVlZXV1df7+/m1tbXFxcX5+foyMjCwsLLy8vKLUL1YAAAPpSURBVHjapJWLtpsgEEVBefkganxEo/7/b3YGEAFNmq6e1a6GXveegcEbMi0T5BlnclmWZTapbcZxbG2GQdqQx9e8Md5pfbGL2JL4HDztiJhZ5pAaXQO2AyGI599h1WdS1RkCgUwFcdtegPxyw0eCqP61gWgLbbID20G6gesRzPEQ7gTvBH9OgeD+CIWIBD5XPm2g9ScQTcHSN/tPJo8NJB1cMk23d6C9bAAE00dBfI/DAwgEilzehLN60v91Al5g8zw/pvhnXpFlinNOrY75sZViuPAgwJw8YG45j+3QnuVHKedaSDtBIQ/eCXzqdc8JaTAk38tZDsfxy2F/vXYh4vogmPFlWY5Nt/BUkKaaRWt3ryr8j7I/B2j4nsxR2uoVp1nBgGcnclzu/dG+4z8JmsYrSjg6ECjT265DHPie+BM3/wxGsMOn5WEIEK0Kh6dqWJG2T3gvcJEVFt+hqBSqzmEBhlrg9PqxXActE/6DQLY4OiGsYe/N7JTWSp644bUmI46pHmFa+MELTMTQmNOolZQDPKy7Pi6vURBFuC24916vpoVSw+ym9fFY617FPAjMnPEPTkv4MzC3Xkhi1lBYmzOtihgHQRvFC2xkb9ZEKhRgL0XCpwJVWoF07wzuAW52rVFAiBEEdCqAaYOAvHblvviknlDwWk5BH/FdR4YoICBeACeu5wYFU6c6K+AxDgIYkP+mlbK3gv648LoGAXktIKicIMKNIIw+BOKTIMa7IhRAWSfQxxvbzcCTpi76IhI4GkLE0a2t6ATKXbjiCWtCpBewsLoTiIug0u6+Kb7Cutlh41awsoMvXBJBZwXdcWERy+H+ac2rV56DoIvwghP7dhxvGAhyFPT2vnV93gD2YF6QxTjnREUpSnwMBDbsCUtCBD8FRRfQN4LVCAqN4+65Ng1UuHF2CGIeBH0YI2hwz8jwHRtoBINzY1UTCPgRRgIaynLTQUkZhA/I5693hufOShA0VnDijBFtSRe+wmNkn+Z5eVSkQb6EbcO5ZVZATxpxFERhKICu8R3GTw00zc2xWcGDxjjLbgVH4DdD7fhEwByeHYIOtwl/M/NL0CXfJ06PM6f2Jm4xDoIuSqGm91qaPGaVUeYPnUn45l5UxnhAJwJ4suP0+AmlGQ8OvKAbhCY4CIqbcOSieQWNR3hGbwT8JozfwKZN8g2zdYPSEU4BB8EnLqyKZFLaVL8VsHCzd12b0o4OBCxu1de9Fj5ZK7hC2T1nJ0sTwUa+bvNbaYNvG8l+Cs1uYHO1yF+r3hT29L2AUprdY5alB3sR0L9nu4TQH7PdwL8KtmDL/ybYfgj5dl6/hGz/mT8CDADjKsdAvs51GAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/media-flash.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NEExM0Y1NkVCNzhEMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NEExM0Y1NkZCNzhEMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0QTEzRjU2Q0I3OEQxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0QTEzRjU2REI3OEQxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjX722wAAABgUExURVVVVUFBQcjIyK2trf///yQkJDIyMj09PTAwMIaGhjU1NTY2Ni4uLiwsLDg4OEhISExMTEpKSllZWXd3d0VFRVBQUCoqKujo6PLy8lJSUk5OTkNDQygoKDo6OmdnZ/n5+UguIlgAAAQOSURBVHjafFbrmqsgDBS1gKJovdYq9v3f8gS5BXTPfLvdPzuTySRAs2yIkFlss8b32wPe7w4waewEwAhjTCklpaxplmIzVMf1zItqmEAUogZQwIOALd774r605pvSQitoPjesIRsCf0scXArGAXMOpKixAOrdK1gHXoAkAokDHB8W6F182IFrIWQwPAjM0QD2JAMfAvf8IeV//+dAxg6exvCfDBTiP45xuwx8rw6exijvY7zxsQO3gkzpwoK5EOljC16gj5d4Z4p1wzlWp4gc0L/4c7yIjPVjka+/X1nQKAOebSnfZogWsdtZV+UfYAMKLmUkgNjZliyyFSDszD+f0uAmsG2aGQRux7gjpFo/v/JvgQjzzcCu+WUZCQR+KjCjEdoIyYj5yAE1DuZtTvnRDMkQ8RMHWgBwaeg/zkAYAelyxP8V41zjs8iNgKei/l0DVcjvUxHeUL2PvgPrYP6L35E5GCgUr+EoRCchFfh+Hd80AAZ8/fGiKxlHwLOv5tnfOaZfBpxAxdX9LHMQ6HXVb1Tcr1AXDOS1dGcZJ8CbTP//t8dsZGDyBk5KorvAzsAKJHD1O3K6BD+SwgUgmOELz38ScGw4xqRwBtYTbs6zEzKaAfBTgffblYdLgMyrn0H5+Xx+I8cGgsC7Nx+BbW+R8VdGqJokAS3QvQ06xDbXIAkdOIE23kIj0HWBiOhgYFjLZwHP502bdTdM9h5m1e8mkCZgHERkVx/uwfxRIErAOpii0uYlm1QaoROgKAEQmB6ww0vIbhFeAjXaYs2/C+yaDu+QPP1FUPXm+T0nKlL+TcCw9SsYtlC01i6V6BhyJwDt4uLEPKNyDAYad4b8g2gNXAI7AvGQs79KV0WvEyD9FzPcwZJd/7/7DwOxh5tsbJQ/QvEKtBoZuUOJLvfHKOfC32JxgpeBJRWAdgU8heEYdo3yl4BvoLEJPgh0fTYW6Ck82/gS8hMwdC3APBmuLFKs6y/Qy6KtfXnbP0UBaAFmcH39YZLl0eoV8I6IiO82IDhgGIlAwRshRHIFcI7oy/E/gaJpGBOc1tECoAlYAeXoSgksMC6UDlU1jrB+oX+O+l+O48iUBlMGQnmBnCy1pNNZrYXkUf5N6zoA/itTGLUTKLZFt0/JsI0nu/fvDRyZtIBxg4AEgbUYp7atdXQCWEsTx48CvBxIDCH7earbpanj2YXyIYDDCsApk/ZHK/CWU0dO+SF/GwDwQeCO2tKp58cGFoPjBfwngbh21H4YoPGvBWpdD5W90TmiNzj/lxO4ISr+VP44DmfglVHHupMdPYnf52cFNPyyxux0eDY+zLcCD+DOPFo+439x7f8tENVOyy+4/oMA92g45i8hPlQfBMziPSzC0yqFcdgwXq9/AgwA8GvBY7FPyEMAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/media-quicktime.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDFENkYzN0RCNzhCMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDFENkYzN0VCNzhCMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpEMUQ2RjM3QkI3OEIxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpEMUQ2RjM3Q0I3OEIxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlRVESAAAABgUExURYWFhfz8/ImJ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]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/media-realaudio.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0VGNjQ0MURCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0VGNjQ0MUVCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyN0JFMjZDRUI3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDRUY2NDQxQ0I3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pjqzd0QAAAAYUExURTAwMBEREU5OTv7+/nFxcdLS0qenp/////tiJQYAAAAIdFJOU/////////8A3oO9WQAAAoVJREFUeNq0lom26yAIRRGB/v8fvwMOMU0aNXc9VqdY2TIFQp8QpX2R0KQCsL8C9L8AUpddwFXtjvMLEDtZTDUfomrCdGbcAkLZRtVRNCD3gNS186OocbPjkkasT7SbHcWML8CqeggQ34CUJO8Ipy8Aa94TIx4A2fK+8CfnCtBdfVWvEvs0wPb5QkxSCPRGX5kDAIID9v1HADmSrgNAzax9lm8bSvp8DQ+YCwqAagBj0W8YIs3mJkK41ka/rsluHng0G0AdGrskDsBuf4VGu/AtOnoQv+td64vYIlL1RXus3bjyXQ+WRhoBoRWrSs1AD3ZZgvvoCA3gy5LPgNhLR4S6ICIKs8I7Lpbr4EEHDG4J1WAUAZuaejFo9KADjsTETwmjS+ZcP5rU6AEfJVGycCQGFtb0GXtIc+hHOxs8kC/AmJgsyW3w/Zy4GodLGjwg7XdVqURJUUCd2vtmKbGQ+NJoJXR4UEvZAz3eEiZxqh6FiL9NYsWGveVe+LzpJs2Al/3g0H/ZkQ793lRf9cTTXNjuyon/OBcugK3J5Nu/J9M6QsrTwg0AMpvOqLm29R4QDF1QfwDUJxS7mwfjpidA/P+sPgXIZZhcdjwCaKY+A+hMfQKwa9q3AHKbt3UALag/An7kbRmgK+oPgDoUUnoJ4J95WwPQovovAA3qMWX9sXgLwGM1IZyUflXS7G5ENhVvo4y9MMuNwVssTJMlADpvxqRO3hxgD/JDPvE9T7YAoNK9Vf3EDFbCnPUXWueSCzjPw4d5rhiqiTVswGilEpUpQHMpCxhPEQ4MA0BFUo5I8wxgVlpsIjzsiAP8WMUzU9k9BVw9Oi9sAvhSDieApH2hvwKKBf8EGAAURy0yTo2KDgAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/media-rutube.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAHsAAAA2CAMAAADQ3xb/AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDFENkYzNzlCNzhCMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDFENkYzN0FCNzhCMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpEMUQ2RjM3N0I3OEIxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpEMUQ2RjM3OEI3OEIxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqDWAxgAAABgUExURQAAAKOjo6ur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]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/media-vimeo.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAIAAAAAlCAMAAAC9MRGkAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjdCRTI2QzhCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjdCRTI2QzlCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyN0JFMjZDNkI3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyN0JFMjZDN0I3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PtoQdhgAAAAMUExURRkZGW9vb9bW1v///5zkxWUAAAAEdFJOU////wBAKqn0AAACKUlEQVR42sxXi47DMAjDzv//87V7NDYQLSfd1Is0aUkomDeJ8XEREcHxpRUfKU7xX0QQm/IDNwFg3AwA/wUAeK8LcF8W4LvyN9KQxxrjRgBfXv8HgNmZBK4Dvfkbb5DTrzHr/RVp1OqrN+d/GhN2PFUNxPGjtxZoZoVIhMt/CKNicViSHm8GzD2sVBE9fRyHHjKRcOgNr5IoJMhfdIIyUD2OpLFU/+NeC/F1TmNDV7WXX3W76MMEunwjnOfOxuEgtTAD0LFmMLYAKEy/QRQA7DQQ/TFRM3JQnMHcAd1b8BY+BUEaq1oDh0Ep7s0tkNPQ5CYAFXqxLkIuOIOySwAoJYFqWLeSYEPu4FODVZjYzgFAU089q2J8x+GaTgWQrNwDQIbTAoCPSsmEaKhQZ0sHIIRS5dJI7E5Eu6NXtTnO5DCTGCg+0P9ohJhvfQf/K/WaebR831UAKyweqWyrpwFQSy49gPDSOZ0FponQOwZWUYNUoMAxap7NfeTptxODGqhok5qaHa8MHR0Azgo7+updmi7xawBzqGH6Wgy4AJBqutTUBG1NJ6MLlow5RzJ07burtlwXjqQEzr4ClM+pEdwCAMcnAPZm3m1VL1z23IvR+ICdX1qvbwNA16JpALq5yqixBaCT9BCFVr68C1ifoXTXocosox5Y7fFMhmYeTA+TbrI14icLqsWwppuh2Bu0vozOgM2v0HOyh07/yk82mQ6vxfLesfJ0rB8BBgD+th6zPgbVaQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/media-winmedia.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAEAAAAA+CAMAAACsn+1dAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0VGNjQ0MjFCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0VGNjQ0MjJCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDRUY2NDQxRkI3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDRUY2NDQyMEI3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvZqmwEAAABUUExURePj4zk5Odzc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]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/media-youtube.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAGgAAAAsCAMAAAC+Cw3pAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0VGNjQ0MjVCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0VGNjQ0MjZCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDRUY2NDQyM0I3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDRUY2NDQyNEI3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pjwud7AAAAAwUExURXJyciUlJb29vXp6elZWVqWlpZSUlGZmZkhISP7+/v///4iIiLS0tMvLy9XV1enp6UUA9FQAAAALdFJOU/////////////8ASk8B8gAAAsVJREFUeNrU2Il2qyAQAFBkG5Dt///2zQJqNhN8bU875yQo2rkBEbFq/aFQvxeKsWHUwqHzQ8iBQie1GC9DNWf1OoyhD0WvyLpdg04ZQVLy3jvnsi4ue5XLFeic6VQ6UKWkXOeh+h66oTJRKcdp6BPngdKmDIjGByfaNl6MN4TAHOI+PdxT1H/Z5wFVaz03z1ubT6BGOeIe+gbCCn83KoTaoZisbYfy5SX6HLoZgHyRVG+Jo19sbYonUKG//xQ6UKoNqIRg6FqHkNY30MipH4bAA7RdKrNBUQWDTTEhlI8G3adQp/YWEVHXaJibgABDigGBtWPoWYzegWWDNHVaDYH3WsLjWm5npaoMgqeQlhJ3O2SphiXwOKM2HvBG7VCEAKsLgYZEhYABnuqBWkq/APptdA7lFnsHQpHx4vj8HcKM0PBTJTlL5QFS7yAJ6gA/dvim1jvkliUsi+W7d1n0il90BAuC5Mh7qCZVZQeLagw2kHsh71DDlJLbc9YsuSch7LS07SRuV7uDVoa0QHgzacwduRZ7sExAVMCo8lLcQAad0I7QglAYUJiBtm/1BKLM9LPX9FWQM8Y9gRpmdl8K9biH4sI5/yKUHcf3Q4epVU9CGXoQRCXPbMBZudKPnV41osxB6zRE9xGf9wIChsJlCMB8ADnO6iW3QNAh9xSy+Qj13DSdArgOtWdQo8kVm7UYmZhMgXDSomZ03KDoaR6l3Ig3T2h+Ccms1+ejJJuvIHkY1A1qsmYB6cEYx5C4gcKAog2UXMuqZQmhjWtUbQ/KRiUviTIRwJU+8yNoO9S3fTwuiXE9PhYMJSXXt13CeSnisRsIl1BJNnRWFnAXuFLZhCtgOQec1hnkrOm1t7eX4segPA3pdMVJ868tqw/zkfSVV0ufLjrTL8t6jkq+XX/9bxVDy9PGp4eQA5lO+p/X/9//n5N/AgwARJd9XoSn+uIAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/pagebreak.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhDwAFAIABAJmZmf///yH5BAEAAAEALAAAAAAPAAUAAAINRI6JwO1vlFywsilBAQA7]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/pixel.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/evilgrin.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAr9JREFUeNpkU11IFFEU/mZ3dtzM9f8vSsulzAIjqSDZHsLIIoIeeogSXzJ6SSjoR0osTIgifDDyISJ7UCgjI18SpQRD60lKEC1tNVcT/1fXNd2Z2bmdM+OW1WHO3HvP+c53D+fcI+Ef6byBWiOMs8KAE4IMEn02rNjsqDtwBxfWYoUQ7Lbk4y0UQkdrVsEppOUdA+LSCWGY0ViYwOSnNxhubwRkHMmvRFuEwMabDxUokmWp9f2PPYh25wLxGqANAuo3a6Uz29nPOMIXRi42CcIaGvKKK7E9O4C756vQVf+MrKOA7jNXPrOd/YwjfOtvgs5y1GbuPwS7vRe7rg1gPMqDt819uHzwHhF4zZXP44oHuVcHTBzjOc4kMAyUpGzdDX32BTZKE3Al52AxvRjXu6iCcz0o6xQIpBfBlZqDTeQPE47xHMcEMlU6yqHYoQeAqLFyPHj6xEzNwBLUuSEkuYOorr1vVX2kBKGfgCPZDo4zCSTqg1AXYNOpXr46YLiOqssEloQ7XFahrHaaexFagLTaP5MAmh+PHgOpCUAiqSI7oDjWwalEQwuHEFKXoeohzM9LmJoDzl3y/yGgm9QV/5ji3ncUW860IEYG1juBGErQydykQfotqaSU5VDDcRCeM1TNIs4E8Xpq2AtP1meMtVwx0xcENDTrBnqV5pntvsYS5G/uBuM5LtLKTGqJmHyZIaaf28W76jzh/dojloUlGun3wV7RUbPX9DOO8RzHL5EShq97BBU2ebTKnZ2A3A198L7yYDLhMGLj0xBcnKZ2tmFnhoqwHouh/lG0f0Epx63W1pTE2ydxumAHHqakyYiPo1bJYWtYCKHpMvzzwMyUjvZ+lN5sQj3FBP4aJpJY0m1NF1GW4sIJmwQlMo2GgDq9iOaTNaDniUEO/m8a10gmaVJkTlaFn8VsJO214/xLgAEAIi4/dUpx5wsAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/grin.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAthJREFUeNpkk2tIVFEQx3/33n2p66uHpYVFGVRECJIR9a2ygkAoCiIiKiKoMCShSBTUKHpQGAZJFER+yd7RA6NASInK7ENgQpi6kZkPzLe77r2nObttWA1nLoe5////zJmZY/CPNZzgsmOzVzn4UBIwZJlMmBbX15zi0FSsUkr/jlpjCXl2iLqstdtIz9kMqbPBccA0YaCb782PaXtxG9PDhtUVPP9LQMg7BVeTe+Ai5ix/9NjJCbAlBUv2bl8kpH4M87a6ENuOimgBlxZwJjW5jPs3anlX/wZ7UnHuUREEJQOPSdGm83h8Funz5nLweDmvr5TWRU+RBBuKuTxv1TpcnlaGvFtYf7ITd/ZRGO8QD8DYFzaVPcPMPk3SkgIswWm85kUE5Jr7ZmZlY/fXsqdwI3XXqgn2tsJIJ/aYCIwGeHKlivDPYXYX5OH01aLxmqcFXKaB1xtn4vTbqI9rOFugL2sSHpKYY8hWcaG4TRJukP+VOMEw3mkmUlpvRMCS3ZNGB+M9JLoH8UlVEmfp3GRpLY2ypaZBaUa/lEXirIgj0Yx2z2UYOstXZOyqJyHOz4zMHPwJICtyhHAZ++2qtZnR8VE6H+wnKSYgnQotWeD1tDVexMqvobenmxHDxue2iHdZBG2HibC4XMdJXcbwhxIWz/fo2oYiAj3DPJgz0bo9YciN+fUp6Su3ywhCvAU+PQ6yH5duylQQeHMH1VJF6kI/HcKLDWGmDJLqvpWhHh+PV433SlRPSKmgilpYfEA+TXWV6mmxP4LTeM2LDVKgqZ0S0+qqyF2exLfAJZrLrpKcuQp/chpjI30MBl6TNn2c7CyD9k9dvGzhsOYRmyaxaeVb2bF2KVUz0yxSUnR7pK1yji5yOGwxMAh9PXaEXHqXm8IZ+usxiSWJL7p7hGNpieQL0RN7jYILSa0ebq3kjEQ+a/J/r3GKZYpPj07CH5My0h9Le+pz/iXAAHtZPk46B+yfAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/happy.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAtpJREFUeNpkk1tIVFEUhr85Z2YcKy8ZZVfToqhIyC5YGT1EVg9BDxJRvmU3aCAfikAxqCiKKLKy20Mv+lCYohCIVkIxZRBGQWQho1ZGmpZOWurMnLNb+0wDWouzzubs8/9rr7X+tV38Y4ESKmyLvcrGh5INlzwGo4bJnQ1nOTweq5TSv2P2rIwtdpjGhZt3MmvVdkidqRHCFshgD19bHxB8VI3hZWveaZomBBByoWlStebAZYyZSTGSCkPUBtMAw4POxu4Z4uXtYiwrFkQHcOsAdoSq3H1nuHLyOl86v2BbNh6vh3M1fi7sr6Snux9DAs3NmoO/5AwtN0obY8WBO1BKxfy1+ZiTgizLNii+uktOtmBE/Gcnxy5tBJ+c4zWpv/jUwWXmbSFQ2lQh/MNuyaIoffEKntfe5HH9GA/rOgiP2pRX5mJFbEyPwZEdL/D6TAwpLWN2NctzD9HV0lTkBJDaEjwJJq0vhthVmMLK9SmoiCIc6kLZCstwcfnWbFweF6+ehwg0h8jZaOqeJDgl6Jf1ewD/QV1ViGh/SDcJW0v4V0YlLjKyYinkLInh4+aONXyACqloRhqkpbrwuBPwehPxiUeiY4xFRp11MAS93232Fw84QjkBRKjwyI9ub9aabWTuaWCK5DTZB1MkQVmIiA/L65eo+isKiVXbETyapwMY/cPUfesMkpf1mu6Go87sqKgjrWMylc633v90r4h181vReM2Ll5EhUqre+/NU311TPb6Yo4If3qgRFbOIeFf7W/WkfLXzX+M0XvPig/Sp9SNlhvvz6QWLp5I96x3B2jx6p+aTnJrO8FAf/Ghi2bwwVjSZjrbPNL/Hr3nEp0ks7VQBuzct5dr0dDepKUgjrdisCyISdTMwCP3fojS34T9RQ6Vwfk64TGLJ4otqjnB8ehI7RH5vXEaRNNw3RH1BOedlp12T/7uN4yxDfJpu8Lg9aTrf42mPv85/BBgAoT1JaMKxwuQAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/smile.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAArVJREFUeNpkk1tIFGEUx387ey1QXHNruymhCT1FFyvLKFIqKOpBeogiym4PCeGDBFmYhEEERaAPWxp0Q+gCBhFsJBXdoIuhEUW5lpJo7bquZrbuNrOdb7fBrQ4zzHzn+///c+Z/vmPhn3h8mEZDpyJh4CIhCYtcGlHNyoWSExxIxyYSCbWdiidHWavH8BeUbWH6oo3g9oIhCppAhgbof3WbrnvXsTpYt+I4d/8SEPI2TePKkv1n0LwZ8klJJ+KgG2DVZG1XaIyB7zz3VWEYKRElYFMCRlyR62i9dI2XD14I2EI0qnPaX01V6SmcLiua1ULR6iI27azjma/Wn/o50X9cQ2PesrIi9+yftHWuonj7fvpDw9Sf3wGjr1m7YztZhYsJRApITC5m6cK34omX8vzuqblrjt3RpJzdOfnz0UMt7Du0ixvn7tEXnEWvswbCb+h1HaHJFyb8zcne6gr0YAsKr3iqAps47bQ5bMSD4Og5TMPFpqSpsYif8ZEvzBjz47vqS+aMz3uI/RBSjvy58FICaiM6jD4OP7ubIdA80SbVwvb1xM2E5U9bBW+GTRluxCIYv8zekmz/v5Hk/mm6wpvvmnwlFpU+J3QXne0Cks5ZdNlRgvHUU61VvkP2FS6JF15SIDRK62DPR3F2Nh43PLwPoX7hRSfEgrJ++ghmeUniFF7xzMpypZU9BQvycdqH6Pscpr0DxqKmETDJBSuXy+H0ZDP+y03X6wAl9eTJQepVJva+7OGoZgscn1PoYfpMNxs8I6rWNDOtchgzif6w8ulDgLb3VCqeWYGK7LpytpbOoyFnmoOsLDt2+4SBcfEiEokT+hqj7R2VtTe5LOmRv4ZJIlPuuTcPcsiTwWaZIYc5jTJTseB3bpWf5aRkPiryf9OYFrlyT1EGp+XETgbNstPH+bcAAwDqTx9DvZUusgAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/surprised.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAq5JREFUeNpkk1tsTGEQx3/nnN21aAVL8bAqmkpIqHvSlCei9aAN4hZP6vZAUpFIhbQiIuFFEBJVlbpEeWiCt5XwgohoSQitFKtSt26vqG539+wxc3aXYrKT2W/m/5+Zb858Bv/Ig4OcdWzKnSR+HHEY8jOJGhYXlxxl13Cs4zgaTsnDKlY4cUL5xRvJWVQKo6eI1xa1YOAznU9u0xa6juGluOgIdzIJzDR5s2URKtpzkp/+IDdrr3KwbL1E3rtWz+rXuOK0WKaw28H9/TiFOw9z60aIV03PmVuYx8wF08lbPIM3j1/T0hzm+eMwsxbOpnRDMY/OVbP0GIbbgd45t3A5lq+VT5RSVFHP0w9TmFYwD3pfkDtnHjnzSxjKXSfxVYJrQfHK0+JmMsnWCXkF2F0N7KjcQmPtXT53B/k4qgqn/yUdo6u5WNtDb2QEO/aVY0caULzyNIFHJj3C4/MQj4Cv/QBnLl1w75boD2EPdBCMhqi5dt71Jd9vIzYgpAkelJdKoIFoP/YQDL6rwwzX4RWvx6v9ibaWkIhDPCE4Jz04wWfEY8gYk0N92PGUwxRi0zM4UQfRKPj9sHc7FMziD0bwRnoBTMcgFu37gpOQvRGAlYSay7IG0uCkQMrW1Kf8Glecixeem6DrBze72tvkX9C9RjKW+rbZUjnLl7J6Vr/GFad45bkJ1pxm39fwRwYHpIQ5noS0PTZLBioLqLNQq2f1a1xxilce6TF9aG6nKvziLbGfFrYzjk0rLUbKLAzJ6Rdbvjrl17ji7rWyW3m/N1Fk/OG1bFo2kzMTJ/sIBLyMlLvroGTZGJTq3T1xIl9i3G1h96FGrgjn21+PSWSMaH5jBZU52ZSZJr5MQJYm1vmdW2tPcVyObUr+7zUOk6migfT1fucQ7c60Pfw5/xJgACgUIR+c+CDRAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/tongue.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAtZJREFUeNpkk21IFFEUhp+d3dYtU7I0tyL9kQVREBQrlZGRpkSikARFIlGEVEL0Q4o+MJGCCJIif0RkUP2xEiz6QLHow5A+xELBQMvKajcyF3Xddsfdmc6d1dC6zOXOOed93znnnjk2/lmtR6k1ouw2DVyY4rDJoxHS7NStO82ByVjTNFU4tl6cIC+q05SRu415qwogyQ2GKGgC8fvwtt+jt+UWdif5WdU0TxEQ8k5N40ZmWQ2aO0E+KW5zDKIG2DWxpyk0hm+EV5cOYRgxESXgUALGmCJX0XjtJm+evBawjVAoyrmmCg7lnCXOZUez2/Bs8FC4q4q2S5VNseJEv/UYtemrcz1Jab953JnN2pIyfAPDnLpcCoEO8kpLSFri4cPQEohfQ+bKLrkTN8WLPs5N23jygSbp7EnJWAGD9eyv2Evj1Wd4B9Ppdx0TXxf9049Td2WIYX88+ySOvx6FVzyVgcNmEud0OXh+xyDQvJnCvHIWrdrCvGAL+shXFvxu4UhlNb1v7vOwJp+ZGGQVOVA8S0DKJRIcItMj9TheSf2lRL+D3k+six2bSLXD/IVipMm9RmJ4c7x/mrrwaHiISBju3oZ3byEo74ZcvOGMncpWfhVXOIW3jQs45Ct6yO912iMusteHaGuHOfW5mHEGvuanuPOysYU1vNktEhfymAvd71XZ6VYGAwEaBz73SK4LsUnb12VBuL+biLebhOWp1qls5VdxhVN4xbMEtl6g4kffN4IBFZ1NNAihdD8DvlHM+HjrHFs2aPlVXOEUXvEsAdlf2j9zoq/zA+Gg3JY5i5TtIQKhIJ9e9lnn7IKw5VdxhXv8nnLFY+JvUtJVxezIWcrFZLeTpGQHzhnWECFDhT4q7f8VkWx0HnVTXtnAdeEMTxkmWYmyFzcc5HBKIkUyQ86JgMyU/nOYO8XnOSNmjyL/N42TlnSbOePl/dWQ/Wsi7cnj/EeAAQBuJUZ/HpqiqwAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/unhappy.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAqxJREFUeNpkk1tIVFEUhr9zZhwHpbC0gShTGg0M0uwGYr1EpC8pJFlRD2VhDwn2IkWhUBHUW0VBZUpRZD0I2tsECWFRkRUYpjGaFzTLS45pNvfT2ufMmNXiLDb7X/9a699rn63xjz0/w3UjQoURxYkhgCafjl+z0bj1AscXcg3DUGHLXtSy0wjhyS7ah2tzCSQvFzQiboOfo4y9eYzX8xAtgaLC8zyJF9BjyQdsNjyFJy4z50ynpf4+Z0rLJTJgrmqvcBVXPNUs3thU0H4Ko+DYWVofefjY0cn6Ajc5G1fj3rKG3tef6H7bT+frftZuWkfJ3iJe3qhj20U0U4E6c0bBDmyOHr5QQmH1Hd4NLSczLx+mPpCRm49rQzGBjD0S3yW8bhRf5anmejTKkTR3HpGJJipPHqa5/imjk+mMJNViTHcxnFxHY/13psYTqaypIDLehOKrPFXALpNOtDvshMbBMXiaa3dvm2cL+jwEZ4ZZ8cvDzQe3TCw6cJTgT0lKs6PyrAIq4J8mEoC5zw1ofQ3WYLSYvy8mbE5cXIvBwo+bXRMkGvARCWFeuy57XbfWuIlcyw2rgC58LRa3S9Wg3/fVoYedUsGPJpran4G3F5OkOmdnwdZtwg4rFU6Er9QEzQITs7RMDHrLXSvTic55edcBKYvh0ME/Cro+wptXsD5XuielI3xUnnkLu69S861/hF+zolFfSrID1mRCQIYVmLVWtVe4iiue4qs8s4D40NtBavs/9AnZhjtrCeGAjYhfFMtgrdXCVVzx2nqoUnnzf6LY0nNl7N+ew7VUl4OUlAQSEoi/JUIyYJ8vxORYkLZuquqauSfwj78ek5icnOzmak4uW0Sp3IIjXkGmHxyfobXsCpcE8ark/17jAlslnho73vxNik/GZS98zr8FGADkBCPaDyrVMQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/waii.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAArNJREFUeNpkk1tIFGEUx387szeCSlcq09TCioyKLoSS1UMXewkipKR6604J+hJBEhFhFFF0s9tDL/YWhkIEWvlQawZlQT0UbNumZG612Zhd3NlmpvPttLHaYc7AnPmf/3fO/5zPwxgLH6LJttju2ARxJOCRR2NE07m+/Dj7s7GO46jfrnUdpso2aS9ds4mpS9ZDTr5CSLZAjDgDPbeJ3ruJ5mdd5TE6RhFI8jZd58bS3WfR8se7SY4Jv23QNdB8qGrs+DBPrtVjWS6JIvAqAjvFjfKdjZw/eon+WD+2ZePz+zjRUsupXc3E3yfQhGjajEJqDzXSfbmh3W0OvOEGmkoq1qKPizJ3vkb9hRo52YJf4t9iHDizEoJyjl+n7fSDNG56ZRXhho4myd/vlSp2TJm9kEe3rnC/Lcnd1reYIzbnmsuxUja6T6Nuw2P8QR1NWisuuMm88r286+7YkSaQ3gK+gE5P9zA1W3NYvGwijvRuGu+wRQJLJDh7tQCPED3rGiLcabBopa40CaRbUK/fPwz27ZGYx8BMGIgE6QGkhfO4rgnRgjLxOS4+Y14lhZ0covMO5BdAKIQIKFPMcQFqIJ/irmSDgxD/AKs2DpFZAK8cYv78OuCvqAjy7OkIL55DKjV6uRSJV2qdVggKJ3hVnJkmSHynNRGLbJ5SVMTiBRGWLHQTxppqyVFr4S3iYyyCyuPvLIsfNtA7c1Epfu2rtDOY3uCxpoBaIIRp5/LmeZQVjZTIIvWJNPT19HI49jJK8qeoq+VimzpWkn+uvlVc/Ve4ztfUqrwMsbLQ0Wq2rC7jYt5kvwjow+dubxqgNDGMFF8+mdx/Re2RFpol/G3UZRKbID6rpY6Dk8azQfPgzzDYDubnYdqqz3FSIhGV/N9tzLJi8TzVclZM5ONLpuzs6/xHgAEARVUbYg/cRp4AAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/smileys/wink.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsRJREFUeNpkk11IVFEQx3/33v0KtfxIrazMMqKXKEuiLAg0fYl6KIIQopIiUKieiixMpCAKoUjCh3ypp2IpQQ3LgsgoClMIKlitVgMl13LLr73Xvducu7thNezcnTNn5n9mzv+Mxj/SfZYmO8qRmI2PmDg0+enM6AYt2y5RPTc2Foup7bi8OEd5NELnyrJ9LN64Cz1jUXxDk5DxEYZ72ujvuofhoaKkgUd/AUhypVh3ig5fwbcwFXSVOCv/su11ie1W0dgjv3jdfArbjoMoAJcCiFrc2VRVjy9tSBY+sGyFD26dk+VX8c1zoRsaxTuK2X2onpfNdZ3x5sDVXUtT/uadzEv9JMsQ2Auc09QxWBaNbQ287ZukrT3EiFaI4e0jf0sZ3bVdTZJQ7ZLYqtw16+luvcn9uzMOcMyOMWvNcv32Or5m+Wm5VY3Pm8KFy0fh/UKyC0/x5VVXlQMglXrdHoPeVxNUHlxA0dZ0OV36jUaxwoMsmX7KmboGAm/aedhYQYpmU7LHhSZ5TgvqY02Oc/yYGHqYyGjYqV51IVSi9ZSSI93m5sl+XtwfnQoTS/Cnq6uIzoQxp+HZYznckrWZULFnRU2xI9NxtaTLaCTssOsACKA5/WNYEn1kZ0GrH0aG4qUJeRgSoCtShFXbxImbkXiV57QQmuDBWDCwP2fpMlbkBZzAjg6YmEgw6YGC/IQWCGDKMkLBACqPBJfLn9cSLNywCo/xQ3C/C+f8KTF5F+peNE8mpp1Bf+8A2y+SLw9pUL25wZ4g5z+/GyAyaWCTgTllEJEKlJqTqm9DLi2DiPhV3NOP1Ki8ZAVKMuv3cqB0LTeycjykp7txu0nOknpPjI9bjH0zefKBmjo/t8X9869hEpkvutp/gtPZaeyRMfAkEeRZmKO/aN17jcviCajk/6ZxjiwXzSI+UklRPIwly547zr8FGAAr1TRVoSlw5QAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/images/yandex-maps.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAF8AAAA9CAMAAAD8rkWWAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjdCRTI2Q0NCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjdCRTI2Q0RCNzhDMTFERkI2RUNCQjU2NTVDOTUwNTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyN0JFMjZDQUI3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyN0JFMjZDQkI3OEMxMURGQjZFQ0JCNTY1NUM5NTA1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlM+Y38AAAAYUExURYeHh/39/ejo6NTU1Kqqqg0NDXR0dP///72IN64AAAAIdFJOU/////////8A3oO9WQAAAr9JREFUeNrsl4lu5CAMhn3BvP8bL7440iTtZIu6qtZSOyHAh/nBhsDLjUTA7PW95jwCqG5b+Jz0PXxSvLQH2cNXvBX28FUd3sjv7u/hI7j4u/hUU549fO7y/GN8YrqttepTPpXir2opwZASlg6wlaI2nyA7UrVqCf5Bf+2b/fjAr2uZZj7lC8rWCBa98i5fAVV6Mbg1yqjzxDYHPt//J3yfeZ2Eq1O983VQnGViiy+px/j9lI+mrZVh8LOEY2GUrwHmA3yZnw0gfg2I6b70VfL8ZukZ7vnuW/JrNJBAGh98TlYrt/n/nC+DX6Z5UPAxO029xvn1gc9qC587H0/40Nt2nQb/hY0MAhM/jbtPY9tQOTTQ8brodMJ35emSj5/yS5enqzv4bQsBr/xVH/rABwlFqfsfbU/4sXHocn3ZwRN/yW06Xu4p673qQ+7+DR88dG74lDF3ws91vebHi2n/8JFvwZBa8iG+gG75uPJfZYqgJX5lSh7z/STC4IovkVmO8bvwLVtENJf1fuLuX/OzPOcf+cBPx2Wq9ftDRMEVn/PYqlPCnweI9Y4J4BSXYHuTbvl1DqdiG94isIpG/MTHOD8laltahsn9K35ZjZfzbOTPMYHhkSYdSPf1mg5TNN3xM4fYbDo/J5DDC37lPjJvFhl7W28geHc/wZHfnvDf+H75aX4/TlV2+m7+33/f/ef/Wv52qzvt1/KBUCq3b5D2gKgXGGrfc4jta4rC9I03ZqK3+Ygijdx+zWo+cD5oVWDbuE/46r6oy9xgimUbUVpFexSw2Tznt1724aE44zdv2wBi/8GbiB3Bz/hovTjEcG8PfDN67j8rinQhLviiay6P9UfQP/XP9BdwzTo/RnzIN4FDBBlqHPV5zK8xAVPKBfMdufKlzY+ex2+0sAHfjvav5wfjb8w/u/n1USbcfrr8EWAAvpV+aDrS8qEAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/js/elrte.full.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGVsUlRFIFdZU0lXWUcgSFRNTC1lZGl0b3IKICogVmVyc2lvbiAxLjEgKDIwMTAtMDktMjApCiAqIGh0dHA6Ly9lbHJ0ZS5vcmcKICoKICogQ29weXJpZ2h0IDIwMTAsIFN0dWRpbyA0MiBMdGQuCiAqIExpY2Vuc2VkIHVuZGVyIGEgMyBjbGF1c2VzIEJTRCBsaWNlbnNlCiAqLwoKLyoqCiAqIEBjbGFzcyBlbGkxOG4KICogSmF2YXNjcmlwdCBhcHBsaWNhdGlvbnMgbG9jYWxpemF0aW9uIAogKgogKiBAcGFyYW0gT2JqZWN0IG8gLSBjbGFzcyBvcHRpb25zLiBPYmplY3QuIHt0ZXh0ZG9tYWluIDogJ9C40LzRj1/Qs9GA0YPQv9C/0Ytf0YHQvtC+0LHRidC10L3QuNC5JywgbWVzc2FnZXMgOiB7dGV4dGRvbWFpbjEgOiB7fVssIHRleHRkb21haW4yIDoge31dLi4ufX0KICoKICogVXNhZ2U6CiAqIAogKiB2YXIgbXNncyA9IHsgSGVsbG8gOiAn0J/RgNC10LLRjdC0JywgJ0hlbGxvICV1c2VyJyA6ICfQn9GA0LXQstC10LQgJXVzZXInIH07CiAqIC8vbG9hZCBtZXNzYWdlcyBhbmQgc2V0IGRlZmF1bHQgdGV4dGRvbWFpbgogKiB2YXIgdHJhbnNsYXRvciA9IG5ldyBlbGkxOG4oIHt0ZXh0ZG9tYWluIDogJ3Rlc3QnLCBtZXNzYWdlcyA6IHt0ZXN0IDogbXNnc319ICkKICogd2luZG93LmNvbnNvbGUubG9nKHRyYW5zbGF0b3IudHJhbnNsYXRlKCdIZWxsbycpKTsKICogd2luZG93LmNvbnNvbGUubG9nKHRyYW5zbGF0b3IuZm9ybWF0KCdIZWxsbyAldXNlcicsIHt1c2VyIDogJ0RhdmlkIEJsYWluJ30pKQogKiAvLyBjcmVhdGUgbmV3IHRleHRkb21haW4KICogdHJhbnNsYXRvci5sb2FkKHt0ZXN0MiA6IHsnR29vZGJ5ZScgOiAnSmEsIGRldmEgbWF0YSEnfSB9KQogKiAvLyBhbmQgdXNlIGl0LCB3aXRob3V0IGNoYW5naW5nIGRlZmF1bHQgb25lCiAqIHdpbmRvdy5jb25zb2xlLmxvZyh0cmFuc2xhdG9yLnRyYW5zbGF0ZSgnR29vZGJ5ZScsICd0ZXN0MicpKTsKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IChkaW8pIExldmFzaG92IGRpb0BzdGQ0Mi5ydQogKiBsaWNlbnNlOiAgIEJTRCBsaWNlbnNlCiAqKi8KZnVuY3Rpb24gZWxpMThuKG8pIHsKCQoJLyoqCgkgKiBHZXQvc2V0IGRlZmF1bHQgdGV4dGRvbWFpbgoJICoKCSAqIEBwYXJhbSBTdHJpbmcgZCBuZXcgdGV4dGRvbWFpbiBuYW1lCgkgKiBAcmV0dXJuIFN0cmluZyAgZGVmYXVsdCB0ZXh0ZG9tYWluCgkgKiovCgl0aGlzLnRleHRkb21haW4gPSBmdW5jdGlvbihkKSB7CgkJcmV0dXJuIHRoaXMubWVzc2FnZXNbZF0gPyB0aGlzLl9kb21haW4gPSBkIDogdGhpcy5fZG9tYWluOwoJfQoJCglvICYmIG8ubWVzc2FnZXMgICAmJiB0aGlzLmxvYWQoby5tZXNzYWdlcyk7CglvICYmIG8udGV4dGRvbWFpbiAmJiB0aGlzLnRleHRkb21haW4oby50ZXh0ZG9tYWluKTsKfQoKZWxpMThuLnByb3RvdHlwZSA9IG5ldyBmdW5jdGlvbigpIHsKCQoJLyoqCgkgKiBAdmFyIE9iamVjdCBtZXNzYWdlcyAoa2V5IC0gbWVzc2FnZXMgaW4gRW5nbGlzaCBvciBtZXNzYWdlIGhhbmRsZXIsIHZhbHVlIC0gbWVzc2FnZSBpbiBzZWxlY3RlZCBsYW5ndWFnZSkKCSAqKi8KCXRoaXMubWVzc2FnZXMgPSB7fTsKCS8qKgoJICogQHZhciBTdHJpbmcgZGVmYXVsdCB0ZXh0ZG9tYWluCgkgKiovCgl0aGlzLl9kb21haW4gICA9ICcnOwoJCgkvKioKCSAqIExvYWQgbmV3IG1lc3NhZ2VzCgkgKgoJICogQHBhcmFtIE9iamVjdCBtc2dzIC0gbWVzc2FnZXMgKGtleSAtIHRleHRkb21haW4gbmFtZSwgdmFsdWUgLSBtZXNzYWdlcyBPYmplY3QpCgkgKiBAcmV0dXJuIE9iamVjdCB0aGlzCgkgKiovCgl0aGlzLmxvYWQgPSBmdW5jdGlvbihtc2dzKSB7CgkJaWYgKHR5cGVvZihtc2dzKSA9PSAnb2JqZWN0JykgewoJCQlmb3IgKHZhciBkIGluIG1zZ3MpIHsKCQkJCXZhciBfbXNncyA9IG1zZ3NbZF07CgkJCQlpZiAodHlwZW9mKF9tc2dzKSA9PSAnb2JqZWN0JykgewoJCQkJCWlmICghdGhpcy5tZXNzYWdlc1tkXSkgewoJCQkJCQl0aGlzLm1lc3NhZ2VzW2RdID0ge307IAoJCQkJCX0KCQkJCQlmb3IgKHZhciBrIGluIF9tc2dzKSB7CgkJCQkJCWlmICh0eXBlb2YoX21zZ3Nba10pID09ICdzdHJpbmcnKSB7CgkJCQkJCQl0aGlzLm1lc3NhZ2VzW2RdW2tdID0gX21zZ3Nba107CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIHRoaXM7Cgl9CgoJLyoqCgkgKiBSZXR1cm4gdHJhbnNsYXRlZCBtZXNzYWdlLCBpZiBtZXNzYWdlIGV4aXN0cyBpbiByZXF1aXJlZCBvciBkZWZhdWx0IHRleHRkb21haW4sIG90aGVyd2lzZSByZXR1cm5zIG9yaWdpbmFsIG1lc3NhZ2UKCSAqCgkgKiBAcGFyYW0gIFN0cmluZyBtc2cgLSBtZXNzYWdlCgkgKiBAcGFyYW0gIFN0cmluZyBkIC0gdGV4dGRvbWFpbi4gSWYgZW1wdHksIGRlZmF1bHQgdGV4dGRvbWFpbiB3aWxsIGJlIHVzZWQKCSAqIEByZXR1cm4gU3RyaW5nIHRyYW5zbGF0ZWQgbWVzc2FnZQoJICoqLwoJdGhpcy50cmFuc2xhdGUgPSBmdW5jdGlvbihtc2csIGQpIHsKCQl2YXIgZCA9IGQgJiYgdGhpcy5tZXNzYWdlc1tkXSA/IGQgOiB0aGlzLl9kb21haW47CgkJcmV0dXJuIHRoaXMubWVzc2FnZXNbZF0gJiYgdGhpcy5tZXNzYWdlc1tkXVttc2ddID8gdGhpcy5tZXNzYWdlc1tkXVttc2ddIDogbXNnOwoJCQoJfQoJCgkvKioKCSAqIFRyYW5zbGF0ZSBtZXNzYWdlIGFuZCByZXBsYWNlIHBsYWNlaG9sZGVycyAoJXBsYWNlaG9sZGVyKQoJICoKCSAqIEBwYXJhbSAgU3RyaW5nICBtc2cgLSBtZXNzYWdlCgkgKiBAcGFyYW0gIE9iamVjdCAgcmVwbGFjZW1lbnQgZm9yIHBsYWNlaG9sZGVycyAoa2V5cyAtIHBsYWNlaG9sZGVycyBuYW1lIHdpdGhvdXQgbGVhZGluZyAlLCB2YWx1ZXMgLSByZXBsYWNlbWVudHMpCgkgKiBAcGFyYW0gIFN0cmluZyAgZCAtIHRleHRkb21haW4uIElmIGVtcHR5LCBkZWZhdWx0IHRleHRkb21haW4gd2lsbCBiZSB1c2VkCgkgKiBAcmV0dXJuIFN0cmluZyAgdHJhbnNsYXRlZCBtZXNzYWdlCgkgKiovCgl0aGlzLmZvcm1hdCA9IGZ1bmN0aW9uKG1zZywgZGF0YSwgZCkgewoJCW1zZyA9IHRoaXMudHJhbnNsYXRlKG1zZywgZCk7CgkJaWYgKHR5cGVvZihkYXRhKSA9PSAnb2JqZWN0JykgewoJCQlmb3IgKHZhciBpIGluIGRhdGEpIHsKCQkJCW1zZyA9IG1zZy5yZXBsYWNlKCclJytpLCB0aGlzLnRyYW5zbGF0ZShkYXRhW2ldLCBkKSk7CgkJCX0KCQl9CgkJcmV0dXJuIG1zZzsKCX0KfQovKioKICogQGNsYXNzIGVsRGlhbG9nRm9ybQogKiBXcmFwZXIgZm9yIGpxdWVyeS51aS5kaWFsb2cgYW5kIGpxdWVyeS51aS50YWJzCiAqICBDcmVhdGUgZm9ybSBpbiBkaWFsb2cuIFlvdSBjYW4gZGVjb3JhdGUgaXQgYXMgeW91IHdpc2ggLSB3aXRoIHRhYnMgb3IvYW5kIHRhYmxlcwogKgogKiBVc2FnZToKICogICB2YXIgZCA9IG5ldyBlbERpYWxvZ0Zvcm0ob3B0cykKICogICBkLmFwcGVuZChbJ0ZpZWxkIG5hbWU6ICcsICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJmMSIgLz4nKV0pCiAqCQkuc2VwYXJhdG9yKCkKICoJCS5hcHBlbmQoWydBbm90aGVyIGZpZWxkIG5hbWU6ICcsICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJmMiIgLz4nKV0pCiAqICAgICAgLm9wZW4oKQogKiB3aWxsIGNyZWF0ZSBkaWFsb2cgd2l0aCBwYWlyIHRleHQgZmllbGQgc2VwYXJhdGVkIGJ5IGhvcml6b250YWwgcnVsZQogKiBDYWxsaW5nIGFwcGVuZCgpIHdpdGggMiBhZGRpdGlvbmFsIGFyZ3VtZW50cyAoIGQuYXBwZW5kKFsuLl0sIG51bGwsIHRydWUpKSAKICogIC0gd2lsbCBjcmVhdGUgdGFibGUgaW4gZGlhbG9nIGFuZCBwdXQgdGV4dCBpbnB1dHMgYW5kIGxhYmVscyBpbiB0YWJsZSBjZWxscwogKgogKiBEaWFsb2cgd2l0aCB0YWJzOgogKiAgIHZhciBkID0gbmV3IGVsRGlhbG9nRm9ybShvcHRzKQogKiAgIGQudGFiKCdmaXJzdCcsICdGaXJzdCB0YWIgbGFiZWwpCiAqIAkgIC50YWIoJ3NlY29uZCcsICdTZWNvbmQgdGFiIGxhYmVsKQogKiAgICAuYXBwZW5kKFsnRmllbGQgbmFtZTogJywgJCgnPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImYxIiAvPicpXSwgJ2ZpcnN0JywgdHJ1ZSkgIC0gYWRkIGxhYmVsIGFuZCBpbnB1dCB0byBmaXJzdCB0YWIgaW4gdGFibGUgKHRhYmxlIHdpbGwgY3JlYXRlIGF1dG9tYWdpY2FseSkKICogICAgLmFwcGVuZChbJ0ZpZWxkIG5hbWUgMjogJywgJCgnPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImYyIiAvPicpXSwgJ3NlY29uZCcsIHRydWUpICAtIHNhbWUgaW4gc2Vjb24gdGFiCiAqCiAqIE9wdGlvbnM6CiAqICAgY2xhc3MgICAgIC0gY3NzIGNsYXNzIGZvciBkaWFsb2cKICogICBzdWJtaXQgICAgLSBmb3JtIHN1Ym1pdCBldmVudCBjYWxsYmFjay4gQWNjZXB0IDIgYXJncyAtIGV2ZW50IGFuZCB0aGlzIG9iamVjdAogKiAgIGFqYXhGb3JtICAtIGFyZ3VtZW50cyBmb3IgYWpheEZvcm0sIGlmIG5lZWRlZCAoZG9udCBmb3JnZXQgaW5jbHVkZSBqcXVlcnkuZm9ybS5qcykKICogICB0YWJzICAgICAgLSBhcmd1bWVudHMgZm9yIHVpLnRhYnMKICogICBkaWFsb2cgICAgLSBhcmd1bWVudHMgZm9yIHVpLmRpYWxvZwogKiAgIG5hbWUgICAgICAtIGhpZGRlbiB0ZXh0IGZpZWxkIGluIHdpY2ggc2VsZWN0ZWQgdmFsdWUgd2lsbCBzYXZlZAogKgogKiBOb3RpY2UhCiAqIFdoZW4gY2xvc2UgZGlhbG9nLCBpdCB3aWxsIGRlc3Ryb2luZyBpbnNlYWQgb2YgZGlhbG9nKCdjbG9zZScpLiBSZWFzb24gLSBzdHJhbmdlIGJ1ZyB3aXRoIHRhYnMgaW4gZGlhbG9nIG9uIHNlY29uZGFyeSBvcGVuaW5nLiAKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKgogKiovCgpmdW5jdGlvbiBlbERpYWxvZ0Zvcm0obykgewoJdmFyIHNlbGYgPSB0aGlzOwoJCgl2YXIgZGVmYXVsdHMgPSB7CgkJJ2NsYXNzJyAgIDogJ2VsLWRpYWxvZ2Zvcm0nLAoJCXN1Ym1pdCAgICA6IGZ1bmN0aW9uKGUsIGQpIHsgd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUubG9nICYmIHdpbmRvdy5jb25zb2xlLmxvZygnc3VibWl0IGNhbGxlZCcpOyBkLmNsb3NlKCk7IH0sCgkJZm9ybSAgICAgIDogeyBhY3Rpb24gOiB3aW5kb3cubG9jYXRpb24uaHJlZiwJbWV0aG9kIDogJ3Bvc3QnCX0sCgkJYWpheEZvcm0gIDogbnVsbCwKCQl2YWxpZGF0ZSAgOiBudWxsLAoJCXNwaW5uZXIgICA6ICdMb2FkaW5nJywKCQl0YWJzICAgICAgOiB7IGFjdGl2ZTogMCB9LAoJCXRhYlByZWZpeCA6ICdlbC1kZi10YWItJywKCQlkaWFsb2cgICAgOiB7CgkJCXRpdGxlICAgICA6ICdkaWFsb2cnLAoJCQlhdXRvT3BlbiAgOiBmYWxzZSwKCQkJbW9kYWwgICAgIDogdHJ1ZSwKCQkJcmVzaXphYmxlIDogZmFsc2UsCgkJCWJ1dHRvbnMgIDogewoJCQkJQ2FuY2VsIDogZnVuY3Rpb24oKSB7IHNlbGYuY2xvc2UoKTsgfSwKCQkJCU9rICAgICA6IGZ1bmN0aW9uKCkgeyBzZWxmLmZvcm0udHJpZ2dlcignc3VibWl0Jyk7IH0KCQkJfQoJCX0KCX07CgoJdGhpcy5vcHRzID0galF1ZXJ5LmV4dGVuZCh0cnVlLCBkZWZhdWx0cywgbywge2RpYWxvZyA6IHsgYXV0b09wZW4gOiBmYWxzZSwgY2xvc2UgOiBmdW5jdGlvbigpIHsgc2VsZi5jbG9zZSgpOyB9IH19KTsKCQoJaWYgKHRoaXMub3B0cy5ydGwpIHsKCQl0aGlzLm9wdHNbJ2NsYXNzJ10gKz0gJyBlbC1kaWFsb2dmb3JtLXJ0bCc7Cgl9CgkKCWlmIChvICYmIG8uZGlhbG9nICYmIG8uZGlhbG9nLmJ1dHRvbnMgJiYgdHlwZW9mKG8uZGlhbG9nLmJ1dHRvbnMpID09ICdvYmplY3QnKSB7CgkJdGhpcy5vcHRzLmRpYWxvZy5idXR0b25zID0gby5kaWFsb2cuYnV0dG9uczsKCX0KCXRoaXMudWwgICAgID0gbnVsbDsKCXRoaXMudGFicyAgID0ge307Cgl0aGlzLl90YWJsZSA9IG51bGw7Cgl0aGlzLmRpYWxvZyA9IGpRdWVyeSgnPGRpdiAvPicpLmFkZENsYXNzKHRoaXMub3B0c1snY2xhc3MnXSkuZGlhbG9nKHRoaXMub3B0cy5kaWFsb2cpOwoJdGhpcy5tZXNzYWdlID0galF1ZXJ5KCc8ZGl2IGNsYXNzPSJlbC1kaWFsb2dmb3JtLW1lc3NhZ2Ugcm91bmRlZC01IiAvPicpLmhpZGUoKS5hcHBlbmRUbyh0aGlzLmRpYWxvZyk7Cgl0aGlzLmVycm9yICAgPSBqUXVlcnkoJzxkaXYgY2xhc3M9ImVsLWRpYWxvZ2Zvcm0tZXJyb3Igcm91bmRlZC01IiAvPicpLmhpZGUoKS5hcHBlbmRUbyh0aGlzLmRpYWxvZyk7Cgl0aGlzLnNwaW5uZXIgPSBqUXVlcnkoJzxkaXYgY2xhc3M9InNwaW5uZXIiIC8+JykuaGlkZSgpLmFwcGVuZFRvKHRoaXMuZGlhbG9nKTsKCXRoaXMuY29udGVudCA9IGpRdWVyeSgnPGRpdiBjbGFzcz0iZWwtZGlhbG9nZm9ybS1jb250ZW50IiAvPicpLmFwcGVuZFRvKHRoaXMuZGlhbG9nKQoJdGhpcy5mb3JtICAgPSBqUXVlcnkoJzxmb3JtIC8+JykuYXR0cih0aGlzLm9wdHMuZm9ybSkuYXBwZW5kVG8odGhpcy5jb250ZW50KTsKCglpZiAodGhpcy5vcHRzLnN1Ym1pdCkgewoJCXRoaXMuZm9ybS5iaW5kKCdzdWJtaXQnLCBmdW5jdGlvbihlKSB7IHNlbGYub3B0cy5zdWJtaXQoZSwgc2VsZikgfSkKCX0KCWlmICh0aGlzLm9wdHMuYWpheEZvcm0gJiYgalF1ZXJ5LmZuLmFqYXhGb3JtKSB7CgkJdGhpcy5mb3JtLmFqYXhGb3JtKHRoaXMub3B0cy5hamF4Rm9ybSk7Cgl9CglpZiAodGhpcy5vcHRzLnZhbGlkYXRlKSB7CgkJdGhpcy5mb3JtLnZhbGlkYXRlKHRoaXMub3B0cy52YWxpZGF0ZSk7Cgl9CgkKCXRoaXMub3B0aW9uID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKCQlyZXR1cm4gdGhpcy5kaWFsb2cuZGlhbG9nKCdvcHRpb24nLCBuYW1lLCB2YWx1ZSkKCX0KCQoJdGhpcy5zaG93RXJyb3IgPSBmdW5jdGlvbihtc2csIGhpZGVDb250ZW50KSB7CgkJdGhpcy5oaWRlTWVzc2FnZSgpOwoJCXRoaXMuaGlkZVNwaW5uZXIoKTsKCQl0aGlzLmVycm9yLmh0bWwobXNnKS5zaG93KCk7CgkJaGlkZUNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmhpZGUoKTsKCQlyZXR1cm4gdGhpczsKCX0KCQoJdGhpcy5oaWRlRXJyb3I9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZXJyb3IudGV4dCgnJykuaGlkZSgpOwoJCXRoaXMuY29udGVudC5zaG93KCk7CgkJcmV0dXJuIHRoaXM7CQkKCX0KCQoJdGhpcy5zaG93U3Bpbm5lciA9IGZ1bmN0aW9uKHR4dCkgewoJCXRoaXMuZXJyb3IuaGlkZSgpOwoJCXRoaXMubWVzc2FnZS5oaWRlKCk7CgkJdGhpcy5jb250ZW50LmhpZGUoKTsKCQl0aGlzLnNwaW5uZXIudGV4dCh0eHR8fHRoaXMub3B0cy5zcGlubmVyKS5zaG93KCk7CgkJdGhpcy5vcHRpb24oJ2J1dHRvbnMnLCB7fSk7CgkJcmV0dXJuIHRoaXM7CQkKCX0KCQoJdGhpcy5oaWRlU3Bpbm5lciA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuY29udGVudC5zaG93KCk7CgkJdGhpcy5zcGlubmVyLmhpZGUoKTsKCQlyZXR1cm4gdGhpczsJCQoJfQoJCgl0aGlzLnNob3dNZXNzYWdlID0gZnVuY3Rpb24odHh0LCBoaWRlQ29udGVudCkgewoJCXRoaXMuaGlkZUVycm9yKCk7CgkJdGhpcy5oaWRlU3Bpbm5lcigpOwoJCXRoaXMubWVzc2FnZS5odG1sKHR4dHx8JycpLnNob3coKTsKCQloaWRlQ29udGVudCAmJiB0aGlzLmNvbnRlbnQuaGlkZSgpOwoJCXJldHVybiB0aGlzOwoJfQoJCgl0aGlzLmhpZGVNZXNzYWdlID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5tZXNzYWdlLmhpZGUoKTsKCQl0aGlzLmNvbnRlbnQuc2hvdygpOwoJCXJldHVybiB0aGlzOwkJCgl9CgkKCS8qKgoJICogQ3JlYXRlIG5ldyB0YWIKCSAqIEBwYXJhbSBzdHJpbmcgaWQgICAgLSB0YWIgaWQKCSAqIEBwYXJhbSBzdHJpbmcgdGl0bGUgLSB0YWIgbmFtZQoJICogQHJldHVybiBlbERpYWxvZ0Zvcm0JCgkqKi8KCXRoaXMudGFiID0gZnVuY3Rpb24oaWQsIHRpdGxlKSB7CgkJaWQgPSB0aGlzLm9wdHMudGFiUHJlZml4K2lkOwoJCQoJCWlmICghdGhpcy51bCkgewoJCQl0aGlzLnVsID0galF1ZXJ5KCc8dWwgLz4nKS5wcmVwZW5kVG8odGhpcy5mb3JtKTsKCQl9CgkJalF1ZXJ5KCc8bGkgLz4nKS5hcHBlbmQoalF1ZXJ5KCc8YSAvPicpLmF0dHIoJ2hyZWYnLCAnIycraWQpLmh0bWwodGl0bGUpKS5hcHBlbmRUbyh0aGlzLnVsKTsKCQl0aGlzLnRhYnNbaWRdID0ge3RhYiA6IGpRdWVyeSgnPGRpdiAvPicpLmF0dHIoJ2lkJywgaWQpLmFkZENsYXNzKCd0YWInKS5hcHBlbmRUbyh0aGlzLmZvcm0pLCB0YWJsZSA6IG51bGx9OwoJCXJldHVybiB0aGlzOwoJfQoJCgkvKioKCSAqIENyZWF0ZSBuZXcgdGFibGUKCSAqIEBwYXJhbSBzdHJpbmcgaWQgIHRhYiBpZCwgaWYgc2V0IC0gdGFibGUgd2lsbCBjcmVhdGUgaW4gdGFiLCBvdGhlcndpc2UgLSBpbiBkaWFsb2cKCSAqIEByZXR1cm4gZWxEaWFsb2dGb3JtCQoJKiovCgl0aGlzLnRhYmxlID0gZnVuY3Rpb24oaWQpIHsKCQlpZCA9IGlkICYmIGlkLmluZGV4T2YodGhpcy5vcHRzLnRhYlByZWZpeCkgPT0gLTEgPyB0aGlzLm9wdHMudGFiUHJlZml4K2lkIDogaWQ7CgkJaWYgKGlkICYmIHRoaXMudGFicyAmJiB0aGlzLnRhYnNbaWRdKSB7CgkJCXRoaXMudGFic1tpZF0udGFibGUgPSBqUXVlcnkoJzx0YWJsZSAvPicpLmFwcGVuZFRvKHRoaXMudGFic1tpZF0udGFiKTsKCQl9IGVsc2UgewoJCQl0aGlzLl90YWJsZSA9IGpRdWVyeSgnPHRhYmxlIC8+JykuYXBwZW5kVG8odGhpcy5mb3JtKTsgCgkJfQoJCXJldHVybiB0aGlzOwoJfQoJCgkvKioKCSAqIEFwcGVuZCBodG1sLCBkb20gbm9kZXMgb3IgalF1ZXJ5IG9iamVjdHMgdG8gZGlhbG9nIG9yIHRhYgoJICogQHBhcmFtIGFycmF5fG9iamVjdHxzdHJpbmcgIGRhdGEgb2JqZWN0KHMpIHRvIGFwcGVuZCB0byBkaWFsb2cKCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICAgICB0aWQgIHRhYiBpZCwgaWYgYWRkaW5nIHRvIHRhYgoJICogQHBhcmFtIGJvb2wgICAgICAgICAgICAgICAgIHQgICAgaWYgdHJ1ZSAtIGRhdGEgd2lsbCBhZGRlZCBpbiB0YWJsZSAoY3JlYXRpbmcgYXV0b21hZ2ljYWx5KQoJICogQHJldHVybiBlbERpYWxvZ0Zvcm0JCgkqKi8KCXRoaXMuYXBwZW5kID0gZnVuY3Rpb24oZGF0YSwgdGlkLCB0KSB7CgkJdGlkID0gdGlkID8gJ2VsLWRmLXRhYi0nK3RpZCA6ICcnOwoKCQlpZiAoIWRhdGEpIHsKCQkJcmV0dXJuIHRoaXM7CgkJfQoJCQoJCWlmICh0aWQgJiYgdGhpcy50YWJzW3RpZF0pIHsKCQkJaWYgKHQpIHsKCQkJCSF0aGlzLnRhYnNbdGlkXS50YWJsZSAmJiB0aGlzLnRhYmxlKHRpZCk7CgkJCQl2YXIgdHIgPSBqUXVlcnkoJzx0ciAvPicpLmFwcGVuZFRvKHRoaXMudGFic1t0aWRdLnRhYmxlKTsKCQkJCWlmICghalF1ZXJ5LmlzQXJyYXkoZGF0YSkpIHsKCQkJCQl0ci5hcHBlbmQoalF1ZXJ5KCc8dGQgLz4nKS5hcHBlbmQoZGF0YSkpOwoJCQkJfSBlbHNlIHsKCQkJCQlmb3IgKHZhciBpPTA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CgkJCQkJCXRyLmFwcGVuZChqUXVlcnkoJzx0ZCAvPicpLmFwcGVuZChkYXRhW2ldKSk7CgkJCQkJfTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWlmICghalF1ZXJ5LmlzQXJyYXkoZGF0YSkpIHsKCQkJCQl0aGlzLnRhYnNbdGlkXS50YWIuYXBwZW5kKGRhdGEpCgkJCQl9IGVsc2UgewoJCQkJCWZvciAodmFyIGk9MDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKCQkJCQkJdGhpcy50YWJzW3RpZF0udGFiLmFwcGVuZChkYXRhW2ldKTsKCQkJCQl9OwoJCQkJfQoJCQl9CgkJCQoJCX0gZWxzZSB7CgkJCWlmICghdCkgewoJCQkJaWYgKCFqUXVlcnkuaXNBcnJheShkYXRhKSkgewoJCQkJCXRoaXMuZm9ybS5hcHBlbmQoZGF0YSk7CgkJCQl9IGVsc2UgewoJCQkJCWZvciAodmFyIGk9MDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKCQkJCQkJdGhpcy5mb3JtLmFwcGVuZChkYXRhW2ldKTsKCQkJCQl9OwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJaWYgKCF0aGlzLl90YWJsZSkgewoJCQkJCXRoaXMudGFibGUoKTsKCQkJCX0KCQkJCXZhciB0ciA9IGpRdWVyeSgnPHRyIC8+JykuYXBwZW5kVG8odGhpcy5fdGFibGUpOwoJCQkJaWYgKCFqUXVlcnkuaXNBcnJheShkYXRhKSkgewoJCQkJCXRyLmFwcGVuZChqUXVlcnkoJzx0ZCAvPicpLmFwcGVuZChkYXRhKSk7CgkJCQl9IGVsc2UgewoJCQkJCWZvciAodmFyIGk9MDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKCQkJCQkJdHIuYXBwZW5kKGpRdWVyeSgnPHRkIC8+JykuYXBwZW5kKGRhdGFbaV0pKTsKCQkJCQl9OwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiB0aGlzOwoJfQoJCgkvKioKCSAqIEFwcGVuZCBzZXBhcmF0b3IgKGRpdiBjbGFzcz0ic2VwYXJhdG9yIikgdG8gZGlhbG9nIG9yIHRhYgoJICogQHBhcmFtICBzdHJpbmcgdGlkICB0YWIgaWQsIGlmIGFkZGluZyB0byB0YWIKCSAqIEByZXR1cm4gZWxEaWFsb2dGb3JtCQoJKiovCgl0aGlzLnNlcGFyYXRvciA9IGZ1bmN0aW9uKHRpZCkgewoJCXRpZCA9ICdlbC1kZi10YWItJyt0aWQ7CgkJaWYgKHRoaXMudGFicyAmJiB0aGlzLnRhYnNbdGlkXSkgewoJCQl0aGlzLnRhYnNbdGlkXS50YWIuYXBwZW5kKGpRdWVyeSgnPGRpdiAvPicpLmFkZENsYXNzKCdzZXBhcmF0b3InKSk7CgkJCXRoaXMudGFic1t0aWRdLnRhYmxlICYmIHRoaXMudGFibGUodGlkKTsKCQl9IGVsc2UgewoJCQl0aGlzLmZvcm0uYXBwZW5kKGpRdWVyeSgnPGRpdiAvPicpLmFkZENsYXNzKCdzZXBhcmF0b3InKSk7CgkJfQoJCXJldHVybiB0aGlzOwoJfQoJCgkvKioKCSAqIE9wZW4gZGlhbG9nIHdpbmRvdwoJICogQHJldHVybiBlbERpYWxvZ0Zvcm0JCgkqKi8KCXRoaXMub3BlbiA9IGZ1bmN0aW9uKCkgewoJCXRoaXMudWwgJiYgdGhpcy5mb3JtLnRhYnModGhpcy5vcHRzLnRhYnMpOwoJCXRoaXMuZm9ybS5maW5kKCc6dGV4dCcpLmtleXVwKGZ1bmN0aW9uKGUpIHsKCQkJaWYgKGUua2V5Q29kZSA9PSAxMykgewoJCQkJc2VsZi5mb3JtLnN1Ym1pdCgpOwoJCQl9CgkJfSk7CgoJCXRoaXMuZGlhbG9nLmF0dHIoJ3Vuc2VsZWN0YWJsZScsICdvbicpLmRpYWxvZygnb3BlbicpOwoJCXZhciBzZWxmID0gdGhpczsKCQlpZiAodGhpcy5mb3JtICYmIHRoaXMuZm9ybS5maW5kKCc6dGV4dCcpLmxlbmd0aCkgewoJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBzZWxmLmZvcm0uZmluZCgnOnRleHQnKVswXS5mb2N1cygpOyB9LCAyMCk7CgkJfQoJCQoJCXJldHVybiB0aGlzOwoJfQoJCgkvKioKCSAqIENsb3NlIGRpYWxvZyB3aW5kb3cgYW5kIGRlc3Ryb3kgY29udGVudAoJICogQHJldHVybiB2b2lkCQoJKiovCgl0aGlzLmNsb3NlID0gZnVuY3Rpb24oKSB7CgkJaWYgKHR5cGVvZih0aGlzLm9wdHMuY2xvc2UpID09ICdmdW5jdGlvbicpIHsKCQkJdGhpcy5vcHRzLmNsb3NlKCk7CgkJfQoJCXRoaXMuZGlhbG9nLmRpYWxvZygnZGVzdHJveScpLnJlbW92ZSgpOwoJfQoJCn0KCi8qKgogKiBlbENvbG9yUGlja2VyLiBKUXVlcnkgcGx1Z2luCiAqIENyZWF0ZSBkcm9wLWRvd24gY29sb3JzIHBhbGV0dGUuCiAqCiAqIFVzYWdlOgogKiAkKHNlbGVjdG9yKS5lbENvbG9yUGlja2VyKG9wdHMpCiAqCiAqIHNldCBjb2xvciBhZnRlciBpbml0OgogKiB2YXIgYyA9ICQoc2VsZWN0b3IpLmVsQ29sb3JQaWNrZXIob3B0cykKICogYy52YWwoJyNmZmZmOTkpCiAqCiAqIEdldCBzZWxlY3RlZCBjb2xvcjoKICogdmFyIGNvbG9yID0gYy52YWwoKTsKICoKICogTm90aWNlIQogKiAgIFBhbGV0dGUgY3JlYXRlZCBvbmx5IGFmdGVyIGZpcnN0IGNsaWNrIG9uIGVsZW1lbnQgKGxhenp5IGxvYWRpbmcpCiAqCiAqIE9wdGlvbnM6CiAqICAgY29sb3JzIC0gY29sb3JzIGFycmF5IChieSBkZWZhdWx0IGRpc3BsYXkgMjU2IHdlYiBzYWZlIGNvbG9ycykKICogICBjb2xvciAgLSBjdXJyZW50IChzZWxlY3RlZCkgY29sb3IKICogICBjbGFzcyAtIGNzcyBjbGFzcyBmb3IgZGlzcGxheSAiYnV0dG9uIiAoZWxlbWVudCBvbiB3aWNoIHBsdWdpbiB3YXMgY2FsbGVkKQogKiAgIHBhbGV0dGVDbGFzcyAtIGNzcyBjbGFzcyBmb3IgY29sb3JzIHBhbGV0dGUKICogICBwYWxldHRlUG9zaXRpb24gLSBzdHJpbmcgaW5kaWNhdGUgd2hlcmUgcGFsZXR0ZSB3aWxsIGNyZWF0ZWQ6CiAqICAgICAgJ2lubmVyJyAtIHBhbGV0dGUgd2lsbCBhdHRhY2ggdG8gZWxlbWVudCAoYWNjZXB0YWJsZSBpbiBtb3N0IGNhc2VzKQogKiAgICAgICdvdXRlcicgLSBwYWxldHRlIHdpbGwgYXR0YWNoIHRvIGRvY3VtZW50LmJvZHkuIAogKiAgICAgICAgICAgICAgICBVc2UsIHdoZW4gY3JlYXRlIGNvbG9yIHBpY2tlciBpbnNpZGUgZWxlbWVudCB3aXRoIG92ZXJmbG93ID09ICdoaWRkZW4nLCBmb3IgZXhhbXBsZSBpbiB1aS5kaWFsb2cKICogICB1cGRhdGUgLSBmdW5jdGlvbiB3aWNoIHVwZGF0ZSBidXR0b24gdmlldyBvbiBzZWxlY3QgY29sb3IgKGJ5IGRlZmF1bHQgc2V0IHNlbGVjdGVkIGNvbG9yIGFzIGJhY2tncm91bmQpCiAqICAgY2hhbmdlIC0gY2FsbGJhY2ssIGNhbGxlZCB3aGVuIGNvbG9yIHdhcyBzZWxlY3RlZCAoYnkgZGVmYXVsdCB3cml0ZSBjb2xvciB0byBjb25zb2xlLmxvZykKICogICBuYW1lICAgLSBoaWRkZW4gdGV4dCBmaWVsZCBpbiB3aWNoIHNlbGVjdGVkIGNvbG9yIHZhbHVlIHdpbGwgc2F2ZWQKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKgogKiovCihmdW5jdGlvbigkKSB7CgoJJC5mbi5lbENvbG9yUGlja2VyID0gZnVuY3Rpb24obykgewoJCXZhciBzZWxmICAgICA9IHRoaXM7CgkJdmFyIG9wdHMgICAgID0gJC5leHRlbmQoe30sICQuZm4uZWxDb2xvclBpY2tlci5kZWZhdWx0cywgbyk7CgkJdGhpcy5oaWRkZW4gID0gJCgnPGlucHV0IHR5cGU9ImhpZGRlbiIgLz4nKS5hdHRyKCduYW1lJywgb3B0cy5uYW1lKS52YWwob3B0cy5jb2xvcnx8JycpLmFwcGVuZFRvKHRoaXMpOwoJCXRoaXMucGFsZXR0ZSA9IG51bGw7CgkJdGhpcy5wcmV2aWV3ID0gbnVsbDsKCQl0aGlzLmlucHV0ICAgPSBudWxsOwoKCQlmdW5jdGlvbiBzZXRDb2xvcihjKSB7CgkJCXNlbGYudmFsKGMpOwoJCQlvcHRzLmNoYW5nZSAmJiBvcHRzLmNoYW5nZShzZWxmLnZhbCgpKTsKCQkJc2VsZi5wYWxldHRlLnNsaWRlVXAoKTsKCQl9CgoJCWZ1bmN0aW9uIGluaXQoKSB7CgkJCXNlbGYucGFsZXR0ZSAgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3Mob3B0cy5wYWxldHRlQ2xhc3MrJyByb3VuZGVkLTMnKTsKCQkJZm9yICh2YXIgaT0wOyBpIDwgb3B0cy5jb2xvcnMubGVuZ3RoOyBpKyspIHsKCQkJCSQoJzxkaXYgLz4nKQoJCQkJCS5hZGRDbGFzcygnY29sb3InKQoJCQkJCS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCBvcHRzLmNvbG9yc1tpXSkKCQkJCQkuYXR0cih7dGl0bGUgOiBvcHRzLmNvbG9yc1tpXSwgdW5zZWxlY3RhYmxlIDogJ29uJ30pCgkJCQkJLmFwcGVuZFRvKHNlbGYucGFsZXR0ZSkKCQkJCQkubW91c2VlbnRlcihmdW5jdGlvbigpIHsKCQkJCQkJdmFyIHYgPSAkKHRoaXMpLmF0dHIoJ3RpdGxlJyk7CgkJCQkJCXNlbGYuaW5wdXQudmFsKHYpOwoJCQkJCQlzZWxmLnByZXZpZXcuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgdik7CgkJCQkJfSkKCQkJCQkuY2xpY2soZnVuY3Rpb24oZSkgewoJCQkJCQllLnN0b3BQcm9wYWdhdGlvbigpOyAKCQkJCQkJc2V0Q29sb3IoJCh0aGlzKS5hdHRyKCd0aXRsZScpKTsKCQkJCQl9KTsKCQkJfTsKCQkJc2VsZi5pbnB1dCA9ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpCgkJCQkuYWRkQ2xhc3MoJ3JvdW5kZWQtMycpCgkJCQkuYXR0cignc2l6ZScsIDgpCgkJCQkuY2xpY2soZnVuY3Rpb24oZSkgewoJCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQl9KQoJCQkJLmtleWRvd24oZnVuY3Rpb24oZSkgewoJCQkJCWlmIChlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSB7CgkJCQkJCXJldHVybiB0cnVlOwoJCQkJCX0KCQkJCQl2YXIgayA9IGUua2V5Q29kZTsKCQkJCQkvLyBvbiBlc2MgLSBjbG9zZSBwYWxldHRlCgkJCQkJaWYgKGsgPT0gMjcpIHsKCQkJCQkJcmV0dXJuIHNlbGYubW91c2VsZWF2ZSgpOwoJCQkJCX0KCQkJCQkvLyBhbGxvdyBpbnB1dCBvbmx5IGhleCBjb2xvciB2YWx1ZQoJCQkJCWlmIChrIT04ICYmIGsgIT0gMTMgJiYgayE9NDYgJiYgayE9MzcgJiYgayAhPSAzOSAmJiAoazw0OCB8fCBrPjU3KSAmJiAoazw2NSB8fCBrID4gNzApKSB7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQkJdmFyIGMgPSAkKHRoaXMpLnZhbCgpOwoJCQkJCWlmIChjLmxlbmd0aCA9PSA3IHx8IGMubGVuZ3RoID09IDApIHsKCQkJCQkJaWYgKGsgPT0gMTMpIHsKCQkJCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCQlzZXRDb2xvcihjKTsKCQkJCQkJCXNlbGYucGFsZXR0ZS5zbGlkZVVwKCk7CgkJCQkJCX0KCQkJCQkJaWYgKGUua2V5Q29kZSAhPSA4ICYmIGUua2V5Q29kZSAhPSA0NiAmJiBrIT0zNyAmJiBrICE9IDM5KSB7CgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCQkJCQl9CgkJCQl9KQoJCQkJLmtleXVwKGZ1bmN0aW9uKGUpIHsKCQkJCQl2YXIgYyA9ICQodGhpcykudmFsKCk7IAoJCQkJCWMubGVuZ3RoID09IDcgJiYgL14jWzAtOWFiY2RlZl17Nn0kL2kudGVzdChjKSAmJiBzZWxmLnZhbChjKTsKCQkJCX0pOwoJCQkJCgkJCXNlbGYucHJldmlldyA9ICQoJzxkaXYgLz4nKQoJCQkJLmFkZENsYXNzKCdwcmV2aWV3IHJvdW5kZWQtMycpCgkJCQkuY2xpY2soZnVuY3Rpb24oZSkgewoJCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQkJc2V0Q29sb3Ioc2VsZi5pbnB1dC52YWwoKSk7CgkJCQl9KTsKCQkJCgkJCXNlbGYucGFsZXR0ZQoJCQkJLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2NsZWFyZml4JykpCgkJCQkuYXBwZW5kKCQoJzxkaXYgLz4nKS5hZGRDbGFzcygncGFuZWwnKS5hcHBlbmQoc2VsZi5pbnB1dCkuYXBwZW5kKHNlbGYucHJldmlldykpOwoJCQkKCQkJaWYgKG9wdHMucGFsZXR0ZVBvc2l0aW9uID09ICdvdXRlcicpIHsKCQkJCXNlbGYucGFsZXR0ZS5oaWRlKCkKCQkJCQkuYXBwZW5kVG8oc2VsZi5wYXJlbnRzKCdib2R5JykuZXEoMCkpCgkJCQkJLm1vdXNlbGVhdmUoZnVuY3Rpb24oKSB7CgkJCQkJCSQodGhpcykuc2xpZGVVcCgpOwoJCQkJCQlzZWxmLnZhbChzZWxmLnZhbCgpKTsKCQkJCQl9KQoJCQkJc2VsZi5tb3VzZWxlYXZlKGZ1bmN0aW9uKGUpIHsKCQkJCQlpZiAoZS5yZWxhdGVkVGFyZ2V0ICE9IHNlbGYucGFsZXR0ZS5nZXQoMCkpIHsKCQkJCQkJc2VsZi5wYWxldHRlLnNsaWRlVXAoKTsKCQkJCQkJc2VsZi52YWwoc2VsZi52YWwoKSk7CgkJCQkJfQoJCQkJfSkKCQkJfSBlbHNlIHsKCQkJCXNlbGYuYXBwZW5kKHNlbGYucGFsZXR0ZS5oaWRlKCkpCgkJCQkJLm1vdXNlbGVhdmUoZnVuY3Rpb24oZSkgewoJCQkJCQlzZWxmLnBhbGV0dGUuc2xpZGVVcCgpOwoJCQkJCQlzZWxmLnZhbChzZWxmLnZhbCgpKTsKCQkJCQl9KTsKCQkJfQoJCQlzZWxmLnZhbChzZWxmLnZhbCgpKTsKCQl9CgkJCgkJdGhpcy5lbXB0eSgpLmFkZENsYXNzKG9wdHNbJ2NsYXNzJ10rJyByb3VuZGVkLTMnKQoJCQkuY3NzKHsncG9zaXRpb24nIDogJ3JlbGF0aXZlJywgJ2JhY2tncm91bmQtY29sb3InIDogb3B0cy5jb2xvcnx8Jyd9KQoJCS5jbGljayhmdW5jdGlvbihlKSB7IAoJCQlpZiAoIXNlbGYuaGFzQ2xhc3MoJ2Rpc2FibGVkJykpIHsKCQkJCSFzZWxmLnBhbGV0dGUgJiYgaW5pdCgpOwoJCQkJaWYgKG9wdHMucGFsZXR0ZVBvc2l0aW9uID09ICdvdXRlcicgJiYgc2VsZi5wYWxldHRlLmNzcygnZGlzcGxheScpID09ICdub25lJykgewoJCQkJCXZhciBvID0gJCh0aGlzKS5vZmZzZXQoKTsKCQkJCQl2YXIgdyA9IHNlbGYucGFsZXR0ZS53aWR0aCgpOwoJCQkJCXZhciBsID0gc2VsZi5wYXJlbnRzKCdib2R5Jykud2lkdGgoKSAtIG8ubGVmdCA+PSB3ID8gby5sZWZ0IDogby5sZWZ0ICsgJCh0aGlzKS5vdXRlcldpZHRoKCkgLSB3OwoJCQkJCXNlbGYucGFsZXR0ZS5jc3Moe2xlZnQgOiBsKydweCcsIHRvcCA6IG8udG9wKyQodGhpcykuaGVpZ2h0KCkrMSsncHgnfSk7CgkJCQl9CgkJCQlzZWxmLnBhbGV0dGUuc2xpZGVUb2dnbGUoKTsKCQkJfQoJCX0pOwoJCQoJCXRoaXMudmFsID0gZnVuY3Rpb24odikgewoJCQlpZiAoIXYgJiYgdiE9PScnKSB7CgkJCQlyZXR1cm4gdGhpcy5oaWRkZW4udmFsKCk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmhpZGRlbi52YWwodik7CgkJCQlpZiAob3B0cy51cGRhdGUpIHsKCQkJCQlvcHRzLnVwZGF0ZSh0aGlzLmhpZGRlbi52YWwoKSk7CgkJCQl9IGVsc2UgewoJCQkJCXRoaXMuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgdik7CgkJCQl9CgkJCQkKCQkJCWlmIChzZWxmLnBhbGV0dGUpIHsKCQkJCQlzZWxmLnByZXZpZXcuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgdik7CgkJCQkJc2VsZi5pbnB1dC52YWwodik7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHRoaXM7CgkJfQoJCQoJCXJldHVybiB0aGlzOwoJfQoKCSQuZm4uZWxDb2xvclBpY2tlci5kZWZhdWx0cyA9IHsKCQknY2xhc3MnICAgICAgICAgOiAnZWwtY29sb3JwaWNrZXInLAoJCXBhbGV0dGVDbGFzcyAgICA6ICdlbC1wYWxldHRlJywKCQlwYWxldHRlUG9zaXRpb24gOiAnaW5uZXInLAoJCW5hbWUgICAgICAgICAgICA6ICdjb2xvcicsCgkJY29sb3IgICAgICAgICAgIDogJycsCgkJdXBkYXRlICAgICAgICAgIDogbnVsbCwKCQljaGFuZ2UgICAgICAgICAgOiBmdW5jdGlvbihjKSB7ICB9LAoJCWNvbG9ycyAgICAgICAgICA6IFsKCQkJJyNmZmZmZmYnLCAnI2NjY2NjYycsICcjOTk5OTk5JywgJyM2NjY2NjYnLCAnIzMzMzMzMycsICcjMDAwMDAwJywgCgkJCScjZmZjY2NjJywgJyNjYzk5OTknLCAnIzk5NjY2NicsICcjNjYzMzMzJywgJyMzMzAwMDAnLCAKCQkJJyNmZjk5OTknLCAnI2NjNjY2NicsICcjY2MzMzMzJywgJyM5OTMzMzMnLCAnIzY2MDAwMCcsIAoJCQknI2ZmNjY2NicsICcjZmYzMzMzJywgJyNmZjAwMDAnLCAnI2NjMDAwMCcsICcjOTkwMDAwJywKCQkJJyNmZjk5NjYnLCAnI2ZmNjYzMycsICcjZmYzMzAwJywgJyNjYzMzMDAnLCAnIzk5MzMwMCcsCgkJCScjZmZjYzk5JywgJyNjYzk5NjYnLCAnI2NjNjYzMycsICcjOTk2NjMzJywgJyM2NjMzMDAnLAoJCQknI2ZmOTkzMycsICcjZmY2NjAwJywgJyNmZjk5MDAnLCAnI2NjNjYwMCcsICcjY2M5OTMzJywKCQkJJyNmZmNjNjYnLCAnI2ZmY2MzMycsICcjZmZjYzAwJywgJyNjYzk5MDAnLCAnIzk5NjYwMCcsCgkJCScjZmZmZmNjJywgJyNjY2NjOTknLCAnIzk5OTk2NicsICcjNjY2NjMzJywgJyMzMzMzMDAnLAoJCQknI2ZmZmY5OScsICcjY2NjYzY2JywgJyNjY2NjMzMnLCAnIzk5OTkzMycsICcjNjY2NjAwJywKCQkJJyNmZmZmNjYnLCAnI2ZmZmYzMycsICcjZmZmZjAwJywgJyNjY2NjMDAnLCAnIzk5OTkwMCcsCgkJCScjY2NmZjY2JywgJyNjY2ZmMzMnLCAnI2NjZmYwMCcsICcjOTljYzAwJywgJyM2Njk5MDAnLAoJCQknI2NjZmY5OScsICcjOTljYzY2JywgJyM5OWNjMzMnLCAnIzY2OTkzMycsICcjMzM2NjAwJywKCQkJJyM5OWZmMzMnLCAnIzk5ZmYwMCcsICcjNjZmZjAwJywgJyM2NmNjMDAnLCAnIzY2Y2MzMycsCgkJCScjOTlmZjY2JywgJyM2NmZmMzMnLCAnIzMzZmYwMCcsICcjMzNjYzAwJywgJyMzMzk5MDAnLAoJCQknI2NjZmZjYycsICcjOTljYzk5JywgJyM2Njk5NjYnLCAnIzMzNjYzMycsICcjMDAzMzAwJywKCQkJJyM5OWZmOTknLCAnIzY2Y2M2NicsICcjMzNjYzMzJywgJyMzMzk5MzMnLCAnIzAwNjYwMCcsCgkJCScjNjZmZjY2JywgJyMzM2ZmMzMnLCAnIzAwZmYwMCcsICcjMDBjYzAwJywgJyMwMDk5MDAnLAoJCQknIzY2ZmY5OScsICcjMzNmZjY2JywgJyMwMGZmMzMnLCAnIzAwY2MzMycsICcjMDA5OTMzJywJCQkKCQkJJyM5OWZmY2MnLCAnIzY2Y2M5OScsICcjMzNjYzY2JywgJyMzMzk5NjYnLCAnIzAwNjYzMycsCQkJCQkJCgkJCScjMzNmZjk5JywgJyMwMGZmNjYnLCAnIzAwZmY5OScsICcjMDBjYzY2JywgJyMzM2NjOTknLAkJCQkJCQoJCQknIzY2ZmZjYycsICcjMzNmZmNjJywgJyMwMGZmY2MnLCAnIzAwY2M5OScsICcjMDA5OTY2JywJCQkJCQkKCQkJJyNjY2ZmZmYnLCAnIzk5Y2NjYycsICcjNjY5OTk5JywgJyMzMzY2NjYnLCAnIzAwMzMzMycsCQkJCQkJCgkJCScjOTlmZmZmJywgJyM2NmNjY2MnLCAnIzMzY2NjYycsICcjMzM5OTk5JywgJyMwMDY2NjYnLAkJCQkJCQoJCQknIzY2Y2NjYycsICcjMzNmZmZmJywgJyMwMGZmZmYnLCAnIzAwY2NjYycsICcjMDA5OTk5JywJCQkJCQkKCQkJJyM2NmNjZmYnLCAnIzMzY2NmZicsICcjMDBjY2ZmJywgJyMwMDk5Y2MnLCAnIzAwNjY5OScsCQkJCQkJCQkJCQkJCQkJCQkJCgkJCScjOTljY2ZmJywgJyM2Njk5Y2MnLCAnIzMzOTljYycsICcjMzM2Njk5JywgJyMwMDMzNjYnLAkJCQkJCQoJCQknIzMzOTlmZicsICcjMDA5OWZmJywgJyMwMDY2ZmYnLCAnIzA2NmNjYycsICcjMzM2NmNjJywJCQkJCQkJCQkJCQkJCQkJCQkKCQkJJyM2Njk5ZmYnLCAnIzMzNjZmZicsICcjMDAzM2ZmJywgJyMwMDMzY2MnLCAnIzAwMzM5OScsCQkJCQkJCgkJCScjY2NjY2ZmJywgJyM5OTk5Y2MnLCAnIzY2NjY5OScsICcjMzMzMzY2JywgJyMwMDAwMzMnLAkJCQkJCQkJCQkJCQkJCQkJCQoJCQknIzk5OTlmZicsICcjNjY2NmNjJywgJyMzMzMzY2MnLCAnIzMzMzM5OScsICcjMDAwMDY2JywJCQkJCQkJCQkJCQkJCQkJCQkKCQkJJyM2NjY2ZmYnLCAnIzMzMzNmZicsICcjMDAwMGZmJywgJyMwMDAwY2MnLCAnIzAwOTk5OScsCQkJCQkJCQkJCQkJCQkJCQkJCgkJCScjOTk2NmZmJywgJyM2NjMzZmYnLCAnIzMzMDBmZicsICcjMzMwMGNjJywgJyMzMzAwOTknLAkJCQkJCQkJCQkJCQkJCQkJCQoJCQknI2NjOTlmZicsICcjOTk2NmNjJywgJyM2NjMzY2MnLCAnIzY2MzM5OScsICcjMzMwMDY2JywKCQkJJyM5OTMzZmYnLCAnIzY2MDBmZicsICcjOTkwMGZmJywgJyM2NjAwY2MnLCAnIzk5MzNjYycsCQkJCgkJCScjY2M2NmZmJywgJyNjYzMzZmYnLCAnI2NjMDBmZicsICcjOTkwMGNjJywgJyM2NjAwOTknLAoJCQknI2ZmY2NmZicsICcjY2M5OWNjJywgJyM5OTY2OTknLCAnIzY2MzM2NicsICcjMzMwMDMzJywJCQkKCQkJJyNmZjk5ZmYnLCAnI2NjNjZjYycsICcjY2MzM2NjJywgJyM5OTMzOTknLCAnIzY2MDA2NicsCgkJCScjZmY2NmZmJywgJyNmZjMzZmYnLCAnI2ZmMDBmZicsICcjY2MwMGNjJywgJyM5OTAwOTknLAkJCQoJCQknI2ZmNjZjYycsICcjZmYzM2NjJywgJyNmZjAwY2MnLCAnI2NjMDA5OScsICcjOTkwMDY2JywKCQkJJyNmZjk5Y2MnLCAnI2NjNjY5OScsICcjY2MzMzk5JywgJyM5OTMzNjYnLCAnIzY2MDAzMycsCQkJCgkJCScjZmYzMzk5JywgJyNmZjAwOTknLCAnI2ZmMDA2NicsICcjY2MwMDY2JywgJyNjYzMzNjYnLAoJCQknI2ZmNjY5OScsICcjZmYzMzY2JywgJyNmZjAwMzMnLCAnI2NjMDAzMycsICcjOTkwMDMzJwkJCgkJCV0KCX07Cgp9KShqUXVlcnkpOwovKioKICogalF1ZXJ5IHBsdWdpbi4gQ3JlYXRlIGdyb3VwIG9mIHRleHQgaW5wdXQsIGVsU2VsZWN0IGFuZCBlbENvbG9yUGlja2VyLiAKICogQWxsb3cgaW5wdXQgYm9yZGVyLXdpZHRoLCBib3JkZXItc3R5bGUgYW5kIGJvcmRlci1jb2xvci4gVXNlZCBpbiBlbFJURQogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKCQoJJC5mbi5lbEJvcmRlclNlbGVjdCA9IGZ1bmN0aW9uKG8pIHsKCQkKCQl2YXIgJHNlbGYgPSB0aGlzOwoJCXZhciBzZWxmICA9IHRoaXMuZXEoMCk7CgkJdmFyIG9wdHMgID0gJC5leHRlbmQoe30sICQuZm4uZWxCb3JkZXJTZWxlY3QuZGVmYXVsdHMsIG8pOwoJCXZhciB3aWR0aCA9ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpCgkJCS5hdHRyKHsnbmFtZScgOiBvcHRzLm5hbWUrJ1t3aWR0aF0nLCBzaXplIDogM30pLmNzcygndGV4dC1hbGlnbicsICdyaWdodCcpCgkJCS5jaGFuZ2UoZnVuY3Rpb24oKSB7ICRzZWxmLmNoYW5nZSgpOyB9KTsKCQkKCQl2YXIgY29sb3IgPSAkKCc8ZGl2IC8+JykuY3NzKCdwb3NpdGlvbicsICdyZWxhdGl2ZScpCgkJCS5lbENvbG9yUGlja2VyKHsKCQkJCSdjbGFzcycgICAgICAgICA6ICdlbC1jb2xvcnBpY2tlciB1aS1pY29uIHVpLWljb24tcGVuY2lsJywKCQkJCW5hbWUgICAgICAgICAgICA6IG9wdHMubmFtZSsnW2NvbG9yXScsIAoJCQkJcGFsZXR0ZVBvc2l0aW9uIDogJ291dGVyJywKCQkJCWNoYW5nZSAgICAgICAgICA6IGZ1bmN0aW9uKCkgeyAkc2VsZi5jaGFuZ2UoKTsgfQoJCQl9KTsKCQkKCQkKCQl2YXIgc3R5bGUgPSAkKCc8ZGl2IC8+JykuZWxTZWxlY3QoewoJCQl0cGwgICAgICAgOiAnPGRpdiBzdHlsZT0iYm9yZGVyLWJvdHRvbTo0cHggJXZhbCAjMDAwO3dpZHRoOjEwMCU7bWFyZ2luOjdweCAwIj4gPC9kaXY+JywKCQkJdHBscyAgICAgIDogeyAnJyA6ICclbGFiZWwnfSwKCQkJbWF4SGVpZ2h0IDogb3B0cy5zdHlsZUhlaWdodCB8fCBudWxsLAoJCQlzZWxlY3QgICAgOiBmdW5jdGlvbigpIHsgJHNlbGYuY2hhbmdlKCk7IH0sCgkJCXNyYyAgICAgICA6IHsKCQkJCScnICAgICAgIDogJ25vbmUnLAoJCQkJc29saWQgICAgOiAnc29saWQnLAoJCQkJZGFzaGVkICAgOiAnZGFzaGVkJywKCQkJCWRvdHRlZCAgIDogJ2RvdHRlZCcsCgkJCQknZG91YmxlJyA6ICdkb3VibGUnLAoJCQkJZ3Jvb3ZlICAgOiAnZ3Jvb3ZlJywKCQkJCXJpZGdlICAgIDogJ3JpZGdlJywKCQkJCWluc2V0ICAgIDogJ2luc2V0JywKCQkJCW91dHNldCAgIDogJ291dHNldCcKCQkJfQoJCX0pOwoJCQoJCXNlbGYuZW1wdHkoKQoJCQkuYWRkQ2xhc3Mob3B0c1snY2xhc3MnXSkKCQkJLmF0dHIoJ25hbWUnLCBvcHRzLm5hbWV8fCcnKQoJCQkuYXBwZW5kKAoJCQkJJCgnPHRhYmxlIC8+JykuYXR0cignY2VsbHNwYWNpbmcnLCAwKS5hcHBlbmQoCgkJCQkJJCgnPHRyIC8+JykKCQkJCQkJLmFwcGVuZCgkKCc8dGQgLz4nKS5hcHBlbmQod2lkdGgpLmFwcGVuZCgnIHB4JykpCgkJCQkJCS5hcHBlbmQoJCgnPHRkIC8+JykuYXBwZW5kKHN0eWxlKSkKCQkJCQkJLmFwcGVuZCgkKCc8dGQgLz4nKS5hcHBlbmQoY29sb3IpKQoJCQkJKQoJCQkpOwoJCQoJCWZ1bmN0aW9uIHJnYjJoZXgoc3RyKSB7CgkJICAgIGZ1bmN0aW9uIGhleCh4KSAgewoJCSAgICAJaGV4RGlnaXRzID0gWyIwIiwgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsIjkiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiXTsKCQkgICAgICAgIHJldHVybiAheCAgPyAiMDAiIDogaGV4RGlnaXRzWyh4IC0geCAlIDE2KSAvIDE2XSArIGhleERpZ2l0c1t4JSAxNl07CgkJICAgIH0KCQkJdmFyIHJnYiA9IChzdHJ8fCcnKS5tYXRjaCgvXCgoWzAtOV17MSwzfSksXHMqKFswLTldezEsM30pLFxzKihbMC05XXsxLDN9KVwpLyk7IAoJCQlyZXR1cm4gcmdiID8gIiMiICsgaGV4KHJnYlsxXSkgKyBoZXgocmdiWzJdKSArIGhleChyZ2JbM10pIDogJyc7CgkJfQoJCQoJCWZ1bmN0aW9uIHRvUGl4ZWxzKG51bSkgewoJCQlpZiAoIW51bSkgewoJCQkJcmV0dXJuIG51bTsKCQkJfQoJCQl2YXIgbSA9IG51bS5tYXRjaCgvKFswLTldK1wuP1swLTldKilccyoocHh8cHR8ZW18JSkvKTsKCQkJaWYgKG0pIHsKCQkJCW51bSAgPSBtWzFdOwoJCQkJdW5pdCA9IG1bMl07CgkJCX0gCgkJCWlmIChudW1bMF0gPT0gJy4nKSB7CgkJCQludW0gPSAnMCcrbnVtOwoJCQl9CgkJCW51bSA9IHBhcnNlRmxvYXQobnVtKTsKCgkJCWlmIChpc05hTihudW0pKSB7CgkJCQlyZXR1cm4gJyc7CgkJCX0KCQkJdmFyIGJhc2UgPSBwYXJzZUludCgkKGRvY3VtZW50LmJvZHkpLmNzcygnZm9udC1zaXplJykpIHx8IDE2OwoJCQlzd2l0Y2ggKHVuaXQpIHsKCQkJCWNhc2UgJ2VtJzogcmV0dXJuIHBhcnNlSW50KG51bSpiYXNlKTsKCQkJCWNhc2UgJ3B0JzogcmV0dXJuIHBhcnNlSW50KG51bSpiYXNlLzEyKTsKCQkJCWNhc2UgJyUnIDogcmV0dXJuIHBhcnNlSW50KG51bSpiYXNlLzEwMCk7CgkJCX0KCQkJcmV0dXJuIG51bTsKCQl9CgkJCgkJdGhpcy5jaGFuZ2UgPSBmdW5jdGlvbigpIHsKCQkJb3B0cy5jaGFuZ2UgJiYgb3B0cy5jaGFuZ2UodGhpcy52YWwoKSk7CgkJfQoJCQoJCXRoaXMudmFsID0gZnVuY3Rpb24odikgewoJCQlpZiAoIXYgJiYgdiAhPT0gJycpIHsKCQkJCXZhciB3ID0gcGFyc2VJbnQod2lkdGgudmFsKCkpOwoJCQkJcmV0dXJuIHt3aWR0aCA6ICFpc05hTih3KSA/IHcrJ3B4JyA6ICcnLCBzdHlsZSA6IHN0eWxlLnZhbCgpLCBjb2xvciA6IGNvbG9yLnZhbCgpfTsKCQkJfSBlbHNlIHsKCQkJCXZhciBtLCB3LCBzLCBjLCBiID0gJyc7CgkJCQlpZiAodi5ub2RlTmFtZSB8fCB2LmNzcykgewoJCQkJCWlmICghdi5jc3MpIHsKCQkJCQkJdiA9ICQodik7CQkJCQkKCQkJCQl9CgkJCQkJdmFyIGIgPSB2LmNzcygnYm9yZGVyJykKCQkJCQlpZiAoKGIgPSB2LmNzcygnYm9yZGVyJykpKSB7CgkJCQkJCXcgPSBzID0gYyA9IGI7CgkJCQkJfSBlbHNlIHsKCQkJCQkJdyA9IHYuY3NzKCdib3JkZXItd2lkdGgnKTsKCQkJCQkJcyA9IHYuY3NzKCdib3JkZXItc3R5bGUnKTsKCQkJCQkJYyA9IHYuY3NzKCdib3JkZXItY29sb3InKTsKCQkJCQl9CgoJCQkJfSBlbHNlIHsKCQkJCQl3ID0gdi53aWR0aHx8Jyc7CgkJCQkJcyA9IHYuc3R5bGV8fCcnOwoJCQkJCWMgPSB2LmNvbG9yfHwnJzsKCQkJCX0KCgkJCQl3aWR0aC52YWwodG9QaXhlbHModykpOwoJCQkJdmFyIG0gPSBzID8gcy5tYXRjaCgvKHNvbGlkfGRhc2hlZHxkb3R0ZWR8ZG91YmxlfGdyb292ZXxyaWRnZXxpbnNldHxvdXRzZXQpL2kpIDonJzsKCQkJCXN0eWxlLnZhbChtID8gbVsxXSA6ICcnKTsKCQkJCWNvbG9yLnZhbChyZ2IyaGV4KGMpKTsKCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJfQoJCQoJCXRoaXMudmFsKG9wdHMudmFsdWUpOwoJCXJldHVybiB0aGlzOwoJfQoJCgkkLmZuLmVsQm9yZGVyU2VsZWN0LmRlZmF1bHRzID0gewoJCW5hbWUgICAgICA6ICdlbC1ib3JkZXJzZWxlY3QnLAoJCSdjbGFzcycgICA6ICdlbC1ib3JkZXJzZWxlY3QnLAoJCXZhbHVlICAgICA6IHt9LAoJCWNoYW5nZSAgICA6IG51bGwKCX0KCQp9KShqUXVlcnkpOwovKioKICogalF1ZXJ5IHBsdWdpbi4gQ3JlYXRlIGdyb3VwIG9mIHRleHQgaW5wdXQgZmllbGRzIGFuZCBzZWxlY3RzIGZvciBzZXR0aW5nIHBhZGRpbmcvbWFyZ2luLiBVc2VkIGluIGVsUlRFCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewoJCgkkLmZuLmVsUGFkZGluZ0lucHV0ID0gZnVuY3Rpb24obykgewoJCXZhciBzZWxmID0gdGhpczsKCQl2YXIgb3B0cyA9ICQuZXh0ZW5kKHt9LCAkLmZuLmVsUGFkZGluZ0lucHV0LmRlZmF1bHRzLCB7bmFtZSA6IHRoaXMuYXR0cignbmFtZScpfSwgbyk7CgkJdGhpcy5yZWdleHBzID0gewoJCQltYWluICAgOiBuZXcgUmVnRXhwKG9wdHMudHlwZSA9PSAncGFkZGluZycgPyAncGFkZGluZ1xzKjpccyooW147Il0rKScgICAgICAgIDogJ21hcmdpblxzKjpccyooW147Il0rKScsICAgICAgICdpbScpLAoJCQlsZWZ0ICAgOiBuZXcgUmVnRXhwKG9wdHMudHlwZSA9PSAncGFkZGluZycgPyAncGFkZGluZy1sZWZ0XHMqOlxzKihbXjsiXSspJyAgIDogJ21hcmdpbi1sZWZ0XHMqOlxzKihbXjsiXSspJywgICdpbScpLAoJCQl0b3AgICAgOiBuZXcgUmVnRXhwKG9wdHMudHlwZSA9PSAncGFkZGluZycgPyAncGFkZGluZy10b3Bccyo6XHMqKFteOyJdKyknICAgIDogJ21hcmdpbi10b3Bccyo6XHMqKFteOyJdKyknLCAgICAnaW0nKSwKCQkJcmlnaHQgIDogbmV3IFJlZ0V4cChvcHRzLnR5cGUgPT0gJ3BhZGRpbmcnID8gJ3BhZGRpbmctcmlnaHRccyo6XHMqKFteOyJdKyknICA6ICdtYXJnaW4tcmlnaHRccyo6XHMqKFteOyJdKyknLCAgJ2ltJyksCgkJCWJvdHRvbSA6IG5ldyBSZWdFeHAob3B0cy50eXBlID09ICdwYWRkaW5nJyA/ICdwYWRkaW5nLWJvdHRvbVxzKjpccyooW147Il0rKScgOiAnbWFyZ2luLWJvdHRvbVxzKjpccyooW147Il0rKScsICdpbScpCgkJfTsKCQkJCgkJJC5lYWNoKFsnbGVmdCcsICd0b3AnLCAncmlnaHQnLCAnYm90dG9tJ10sIGZ1bmN0aW9uKCkgewoJCQkKCQkJc2VsZlt0aGlzXSA9ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpCgkJCQkuYXR0cignc2l6ZScsIDMpCgkJCQkuY3NzKCd0ZXh0LWFsaWduJywgJ3JpZ2h0JykKCQkJCS5jc3MoJ2JvcmRlci0nK3RoaXMsICcycHggc29saWQgcmVkJykKCQkJCS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsgJCh0aGlzKS52YWwocGFyc2VOdW0oJCh0aGlzKS52YWwoKSkpOyBjaGFuZ2UoKTsgfSkKCQkJCS5hdHRyKCduYW1lJywgb3B0cy5uYW1lKydbJyt0aGlzKyddJyk7CgkJfSk7CgkJJC5lYWNoKFsndWxlZnQnLCAndXRvcCcsICd1cmlnaHQnLCAndWJvdHRvbSddLCBmdW5jdGlvbigpIHsKCQkJc2VsZlt0aGlzXSA9ICQoJzxzZWxlY3QgLz4nKQoJCQkJLmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT0icHgiPnB4PC9vcHRpb24+JykKCQkJCS5hcHBlbmQoJzxvcHRpb24gdmFsdWU9ImVtIj5lbTwvb3B0aW9uPicpCgkJCQkuYXBwZW5kKCc8b3B0aW9uIHZhbHVlPSJwdCI+cHQ8L29wdGlvbj4nKQoJCQkJLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uKCkgeyBjaGFuZ2UoKTsgfSkKCQkJCS5hdHRyKCduYW1lJywgb3B0cy5uYW1lKydbJyt0aGlzKyddJyk7CgkJCWlmIChvcHRzLnBlcmNlbnRzKSB7CgkJCQlzZWxmW3RoaXNdLmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT0iJSI+JTwvb3B0aW9uPicpOwoJCQl9CgkJfSk7CgkJCgkJdGhpcy5lbXB0eSgpLmFkZENsYXNzKG9wdHNbJ2NsYXNzJ10pCgkJCS5hcHBlbmQodGhpcy5sZWZ0KS5hcHBlbmQodGhpcy51bGVmdCkuYXBwZW5kKCcgeCAnKQoJCQkuYXBwZW5kKHRoaXMudG9wKS5hcHBlbmQodGhpcy51dG9wKS5hcHBlbmQoJyB4ICcpCgkJCS5hcHBlbmQodGhpcy5yaWdodCkuYXBwZW5kKHRoaXMudXJpZ2h0KS5hcHBlbmQoJyB4ICcpCgkJCS5hcHBlbmQodGhpcy5ib3R0b20pLmFwcGVuZCh0aGlzLnVib3R0b20pOwoJCQkKCQl0aGlzLnZhbCA9IGZ1bmN0aW9uKHYpIHsKCQkJaWYgKCF2ICYmIHYhPT0nJykgewoJCQkJdmFyIGwgPSBwYXJzZU51bSh0aGlzLmxlZnQudmFsKCkpOwoJCQkJdmFyIHQgPSBwYXJzZU51bSh0aGlzLnRvcC52YWwoKSk7CgkJCQl2YXIgciA9IHBhcnNlTnVtKHRoaXMucmlnaHQudmFsKCkpOwoJCQkJdmFyIGIgPSBwYXJzZU51bSh0aGlzLmJvdHRvbS52YWwoKSk7CgkJCQl2YXIgcmV0ID0gewoJCQkJCWxlZnQgICA6IGw9PSdhdXRvJyB8fCBsPT0wID8gbCA6IChsIT09JycgPyBsK3RoaXMudWxlZnQudmFsKCkgICA6ICcnKSwgCgkJCQkJdG9wICAgIDogdD09J2F1dG8nIHx8IHQ9PTAgPyB0IDogKHQhPT0nJyA/IHQrdGhpcy51dG9wLnZhbCgpICAgIDogJycpLAoJCQkJCXJpZ2h0ICA6IHI9PSdhdXRvJyB8fCByPT0wID8gciA6IChyIT09JycgPyByK3RoaXMudXJpZ2h0LnZhbCgpICA6ICcnKSwKCQkJCQlib3R0b20gOiBiPT0nYXV0bycgfHwgYj09MCA/IGIgOiAoYiE9PScnID8gYit0aGlzLnVib3R0b20udmFsKCkgOiAnJyksCgkJCQkJY3NzICAgIDogJycKCQkJCX07CgkJCQlpZiAocmV0LmxlZnQhPT0nJyAmJiByZXQucmlnaHQhPT0nJyAmJiByZXQudG9wIT09JycgJiYgcmV0LmJvdHRvbSE9PScnKSB7CgkJCQkJaWYgKHJldC5sZWZ0ID09IHJldC5yaWdodCAmJiByZXQudG9wID09IHJldC5ib3R0b20pIHsKCQkJCQkJcmV0LmNzcyA9IHJldC50b3ArJyAnK3JldC5sZWZ0OwoJCQkJCX0gZWxzZXsKCQkJCQkJcmV0LmNzcyA9IHJldC50b3ArJyAnK3JldC5yaWdodCsnICcrcmV0LmJvdHRvbSsnICcrcmV0LmxlZnQ7CgkJCQkJfQoJCQkJfQoJCQkJCgkJCQlyZXR1cm4gcmV0OwoJCQl9IGVsc2UgewoJCQkJCgkJCQlpZiAodi5ub2RlTmFtZSB8fCB2LmNzcykgewoJCQkJCWlmICghdi5jc3MpIHsKCQkJCQkJdiA9ICQodik7CgkJCQkJfQoJCQkJCXZhciB2YWwgICA9IHtsZWZ0IDogJycsIHRvcCA6ICcnLCByaWdodDogJycsIGJvdHRvbSA6ICcnfTsKCQkJCQl2YXIgc3R5bGUgPSAodi5hdHRyKCdzdHlsZScpfHwnJykudG9Mb3dlckNhc2UoKTsKCgkJCQkJaWYgKHN0eWxlKSB7CgkJCQkJCXN0eWxlICAgPSAkLnRyaW0oc3R5bGUpOwoJCQkJCQl2YXIgbSA9IHN0eWxlLm1hdGNoKHRoaXMucmVnZXhwcy5tYWluKTsKCQkJCQkJaWYgKG0pIHsKCQkJCQkJCXZhciB0bXAgICAgPSAkLnRyaW0obVsxXSkucmVwbGFjZSgvXHMrL2csICcgJykuc3BsaXQoJyAnLCA0KTsKCQkJCQkJCXZhbC50b3AgICAgPSB0bXBbMF07CgkJCQkJCQl2YWwucmlnaHQgID0gdG1wWzFdICYmIHRtcFsxXSE9PScnID8gdG1wWzFdIDogdmFsLnRvcDsKCQkJCQkJCXZhbC5ib3R0b20gPSB0bXBbMl0gJiYgdG1wWzJdIT09JycgPyB0bXBbMl0gOiB2YWwudG9wOwoJCQkJCQkJdmFsLmxlZnQgICA9IHRtcFszXSAmJiB0bXBbM10hPT0nJyA/IHRtcFszXSA6IHZhbC5yaWdodDsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSQuZWFjaChbJ2xlZnQnLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbSddLCBmdW5jdGlvbigpIHsKCQkJCQkJCQl2YXIgbmFtZSA9IHRoaXMudG9TdHJpbmcoKTsKCQkJCQkJCQltID0gc3R5bGUubWF0Y2goc2VsZi5yZWdleHBzW25hbWVdKTsKCQkJCQkJCQlpZiAobSkgewoJCQkJCQkJCQl2YWxbbmFtZV0gPSBtWzFdOwoJCQkJCQkJCX0KCQkJCQkJCX0pOwoJCQkJCQl9CgkJCQkJfQoJCQkJCXZhciB2ID0gdmFsOwoJCQkJfSAKCgkJCQkkLmVhY2goWydsZWZ0JywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nXSwgZnVuY3Rpb24oKSB7CgkJCQkJdmFyIG5hbWUgPSB0aGlzLnRvU3RyaW5nKCk7CgkJCQkJaWYgKHR5cGVvZih2W25hbWVdKSAhPSAndW5kZWZpbmVkJyAmJiB2W25hbWVdICE9PSBudWxsKSB7CgkJCQkJCXZbbmFtZV0gPSB2W25hbWVdLnRvU3RyaW5nKCk7CgkJCQkJCXZhciBfdiA9IHBhcnNlTnVtKHZbbmFtZV0pOwoJCQkJCQlzZWxmW25hbWVdLnZhbChfdik7CgkJCQkJCXZhciBtID0gdltuYW1lXS5tYXRjaCgvKHB4fGVtfHB0fCUpL2kpOwoJCQkJCQlzZWxmWyd1JytuYW1lXS52YWwobSA/IG1bMV0gOiAncHgnKTsKCQkJCQl9CgkJCQl9KTsKCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJfQoJCQkKCQlmdW5jdGlvbiBwYXJzZU51bShudW0pIHsKCQkJbnVtID0gJC50cmltKG51bS50b1N0cmluZygpKTsKCQkJaWYgKG51bVswXSA9PSAnLicpIHsgCgkJCQludW0gPSAnMCcrbnVtOwoJCQl9CgkJCW4gPSBwYXJzZUZsb2F0KG51bSk7CgkJCXJldHVybiAhaXNOYU4obikgPyBuIDogKG51bSA9PSAnYXV0bycgPyBudW0gOiAnJyk7CgkJfQoJCQkKCQlmdW5jdGlvbiBjaGFuZ2UoKSB7CgkJCW9wdHMuY2hhbmdlICYmIG9wdHMuY2hhbmdlKHNlbGYpOwoJCX0KCQkKCQl0aGlzLnZhbChvcHRzLnZhbHVlKTsKCQkKCQlyZXR1cm4gdGhpczsKCX0KCQoJJC5mbi5lbFBhZGRpbmdJbnB1dC5kZWZhdWx0cyA9IHsKCQluYW1lICAgICA6ICdlbC1wYWRkaW5naW5wdXQnLAoJCSdjbGFzcycgIDogJ2VsLXBhZGRpbmdpbnB1dCcsCgkJdHlwZSAgICAgOiAncGFkZGluZycsCgkJdmFsdWUgICAgOiB7fSwKCQlwZXJjZW50cyA6IHRydWUsCgkJY2hhbmdlICAgOiBudWxsCgl9CgkKfSkoalF1ZXJ5KTsKLyoqCiAqIGVsU2VsZWN0IEpRdWVyeSBwbHVnaW4KICogUmVwbGFjZW1lbnQgZm9yIHNlbGVjdCBpbnB1dAogKiBBbGxvdyB0byBwdXQgYW55IGh0bWwgYW5kIGNzcyBkZWNvcmF0aW9uIGluIGRyb3AtZG93biBsaXN0CiAqCiAqIFVzYWdlOgogKiAgICQoc2VsZWN0b3IpLmVsU2VsZWN0KG9wdHMpCiAqCiAqIHNldCB2YWx1ZSBhZnRlciBpbml0OgogKiAgIHZhciBjID0gJChzZWxlY3RvcikuZWxTZWxlY3Qob3B0cykKICogICBjLnZhbCgnc29tZSB2YWx1ZScpCiAqCiAqIEdldCBzZWxlY3RlZCB2YWx1ZToKICogICB2YXIgdmFsID0gYy52YWwoKTsKICoKICogTm90aWNlIQogKiAgIDEuIFdoZW4gY2FsbGVkIG9uIG11bHRpcGx5IGVsZW1lbnRzLCBlbFNlbGVjdCBjcmVhdGUgZHJvcC1kb3duIGxpc3Qgb25seSBmb3IgZmlzdCBlbGVtZW50CiAqICAgMi4gRWxlbWVudHMgbGlzdCBjcmVhdGVkIG9ubHkgYWZ0ZXIgZmlyc3QgY2xpY2sgb24gZWxlbWVudCAobGF6enkgbG9hZGluZykKICoKICogT3B0aW9uczoKICogICBzcmMgICAgICAgLSBvYmplY3Qgd2l0aCBwYWlycyB2YWx1ZTpsYWJlbCB0byBjcmVhdGUgZHJvcC1kb3duIGxpc3QgCiAqICAgdmFsdWUgICAgIC0gY3VycmVudCAoc2VsZWN0ZWQpIHZhbHVlCiAqICAgY2xhc3MgICAgIC0gY3NzIGNsYXNzIGZvciBkaXNwbGF5ICJidXR0b24iIChlbGVtZW50IG9uIHdpY2ggcGx1Z2luIHdhcyBjYWxsZWQpCiAqICAgbGlzdENsYXNzIC0gY3NzIGNsYXNzIGZvciBkcm9wIGRvd24gZWxlbWVudHMgbGlzdAogKiAgIHNlbGVjdCAgICAtIGNhbGxiYWNrLCBjYWxsZWQgd2hlbiB2YWx1ZSB3YXMgc2VsZWN0ZWQgKGJ5IGRlZmF1bHQgd3JpdGUgdmFsdWUgdG8gY29uc29sZS5sb2cpCiAqICAgbmFtZSAgICAgIC0gaGlkZGVuIHRleHQgZmllbGQgaW4gd2ljaCBzZWxlY3RlZCB2YWx1ZSB3aWxsIHNhdmVkCiAqICAgbWF4SGVpZ2h0IC0gZWxlbWVudHMgbGlzdCBtYXggaGVpZ2h0IChpZiBoZWlnaHQgZ3JlYXRlciAtIHNjcm9sbCB3aWxsIGFwcGVhcikKICogICB0cGwgICAgICAgLSB0ZW1wbGF0ZSBmb3IgZWxlbWVudCBpbiBsaXN0IChjb250YWlucyAyIHZhcnM6ICV2YXIgLSBmb3Igc3JjIGtleSwgJWxhYmVsIC0gZm9yIHNyY1t2YWxdICkKICogICBsYWJlbFRwbCAgLSB0ZW1wbGF0ZSBmb3IgbGFiZWwgKGN1cnJlbnQgc2VsZWN0ZWQgZWxlbWVudCkgKGNvbnRhaW5zIDIgcGxhY2Vob2xkZXJzOiAldmFyIC0gZm9yIHNyYyBrZXksICVsYWJlbCAtIGZvciBzcmNbdmFsXSApCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewoJCgkkLmZuLmVsU2VsZWN0ID0gZnVuY3Rpb24obykgewoJCXZhciAkc2VsZiAgICA9IHRoaXM7CgkJdmFyIHNlbGYgICAgID0gdGhpcy5lcSgwKTsKCQl2YXIgb3B0cyAgICAgPSAkLmV4dGVuZCh7fSwgJC5mbi5lbFNlbGVjdC5kZWZhdWx0cywgbyk7CgkJdmFyIGhpZGRlbiAgID0gJCgnPGlucHV0IHR5cGU9ImhpZGRlbiIgLz4nKS5hdHRyKCduYW1lJywgb3B0cy5uYW1lKTsKCQl2YXIgbGFiZWwgICAgPSAkKCc8bGFiZWwgLz4nKS5hdHRyKHt1bnNlbGVjdGFibGUgOiAnb24nfSkuYWRkQ2xhc3MoJ3JvdW5kZWQtbGVmdC0zJyk7CgkJdmFyIGxpc3QgICAgID0gbnVsbDsKCQl2YXIgaWVXaWR0aCAgPSBudWxsOwoKCQlpZiAoc2VsZi5nZXQoMCkubm9kZU5hbWUgPT0gJ1NFTEVDVCcpIHsKCQkJb3B0cy5zcmMgPSB7fTsKCQkJc2VsZi5jaGlsZHJlbignb3B0aW9uJykuZWFjaChmdW5jdGlvbigpIHsKCQkJCW9wdHMuc3JjWyQodGhpcykudmFsKCldID0gJCh0aGlzKS50ZXh0KCk7CgkJCX0pOwoJCQlvcHRzLnZhbHVlID0gc2VsZi52YWwoKTsKCQkJb3B0cy5uYW1lICA9IHNlbGYuYXR0cignbmFtZScpOwoJCQlzZWxmLnJlcGxhY2VXaXRoKChzZWxmID0gJCgnPGRpdiAvPicpKSk7CgkJfQoJCQoJCWlmICghb3B0cy52YWx1ZSB8fCAhb3B0cy5zcmNbb3B0cy52YWxdKSB7CgkJCW9wdHMudmFsdWUgPSBudWxsOwoJCQl2YXIgaSA9IDA7CgkJCWZvciAodmFyIHYgaW4gb3B0cy5zcmMpIHsKCQkJCWlmIChpKysgPT0gMCkgewoJCQkJCW9wdHMudmFsdWUgPSB2OwoJCQkJfQoJCQl9CgkJfQoKCQl0aGlzLnZhbCA9IGZ1bmN0aW9uKHYpIHsKCQkJaWYgKCF2ICYmIHYhPT0nJykgewoJCQkJcmV0dXJuIGhpZGRlbi52YWwoKTsKCQkJfSBlbHNlIHsKCQkJCWlmIChvcHRzLnNyY1t2XSkgewoJCQkJCWhpZGRlbi52YWwodik7CgkJCQkJdXBkYXRlTGFiZWwodik7CgkJCQkJaWYgKGxpc3QpIHsKCQkJCQkJbGlzdC5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkJCQlpZiAoJCh0aGlzKS5hdHRyKCduYW1lJykgPT0gdikgewoJCQkJCQkJCSQodGhpcykuYWRkQ2xhc3MoJ2FjdGl2ZScpOwoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkkKHRoaXMpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKCQkJCQkJCX0KCQkJCQkJfSk7CgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuIHRoaXM7CgkJCX0KCQl9CgkKCQkvLyB1cGRhdGUgbGFiZWwgY29udGVudAoJCWZ1bmN0aW9uIHVwZGF0ZUxhYmVsKHYpIHsKCQkJdmFyIHRwbCA9IG9wdHMubGFiZWxUcGwgfHwgb3B0cy50cGxzW3ZdIHx8IG9wdHMudHBsOwoJCQlsYWJlbC5odG1sKHRwbC5yZXBsYWNlKC8ldmFsL2csIHYpLnJlcGxhY2UoLyVsYWJlbC8sIG9wdHMuc3JjW3ZdKSkuY2hpbGRyZW4oKS5hdHRyKHt1bnNlbGVjdGFibGUgOiAnb24nfSk7CgkJfQoJCQoJCS8vIGluaXQgInNlbGVjdCIKCQlzZWxmLmVtcHR5KCkKCQkJLmFkZENsYXNzKG9wdHNbJ2NsYXNzJ10rJyByb3VuZGVkLTMnKQoJCQkuYXR0cih7dW5zZWxlY3RhYmxlIDogJ29uJ30pCgkJCS5hcHBlbmQoaGlkZGVuKQoJCQkuYXBwZW5kKGxhYmVsKQoJCQkuaG92ZXIoCgkJCQlmdW5jdGlvbigpIHsgJCh0aGlzKS5hZGRDbGFzcygnaG92ZXInKSB9LAoJCQkJZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlQ2xhc3MoJ2hvdmVyJykgfQoJCQkpCgkJCS5jbGljayhmdW5jdGlvbihlKSB7CgkJCQkhbGlzdCAmJiBpbml0KCk7CgkJCQlsaXN0LnNsaWRlVG9nZ2xlKCk7CgkJCQkvLyBzdHVwaWQgaWUgaW5oZXJpdCB3aWR0aCBmcm9tIHBhcmVudAoJCQkJaWYgKCQuYnJvd3Nlci5tc2llICYmICFpZVdpZHRoKSB7IAoJCQkJCWxpc3QuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJCQlpZVdpZHRoID0gTWF0aC5tYXgoaWVXaWR0aCwgJCh0aGlzKS53aWR0aCgpKTsKCQkJCQl9KTsKCQkJCQlpZiAoaWVXaWR0aCA+IGxpc3Qud2lkdGgoKSkgewoJCQkJCQlsaXN0LndpZHRoKGllV2lkdGgrNDApOwoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJCQoJCXRoaXMudmFsKG9wdHMudmFsdWUpOwoJCgkJLy8gY3JlYXRlIGRyb3AtZG93biBsaXN0CgkJZnVuY3Rpb24gaW5pdCgpIHsKCQkJLy8gbm90IHVsIGJlY2F1c2Ugb2YgaWUgaXMgc3R1cGlkIHdpdGggbW91c2VsZWF2ZSBpbiBpdCA6KAoJCQlsaXN0ID0gJCgnPGRpdiAvPicpCgkJCQkuYWRkQ2xhc3Mob3B0cy5saXN0Q2xhc3MrJyByb3VuZGVkLTMnKQoJCQkJLmhpZGUoKQoJCQkJLmFwcGVuZFRvKHNlbGYubW91c2VsZWF2ZShmdW5jdGlvbihlKSB7IGxpc3Quc2xpZGVVcCgpOyB9KSk7CgoJCQlmb3IgKHZhciB2IGluIG9wdHMuc3JjKSB7CgkJCQl2YXIgdHBsID0gb3B0cy50cGxzW3ZdIHx8IG9wdHMudHBsOyAKCQkJCSQoJzxkaXYgLz4nKQoJCQkJCS5hdHRyKCduYW1lJywgdikKCQkJCQkuYXBwZW5kKCAkKHRwbC5yZXBsYWNlKC8ldmFsL2csIHYpLnJlcGxhY2UoLyVsYWJlbC9nLCBvcHRzLnNyY1t2XSkpLmF0dHIoe3Vuc2VsZWN0YWJsZSA6ICdvbid9KSApCgkJCQkJLmFwcGVuZFRvKGxpc3QpCgkJCQkJLmhvdmVyKAoJCQkJCQlmdW5jdGlvbigpIHsgJCh0aGlzKS5hZGRDbGFzcygnaG92ZXInKSB9LAoJCQkJCQlmdW5jdGlvbigpIHsgJCh0aGlzKS5yZW1vdmVDbGFzcygnaG92ZXInKSB9CgkJCQkJKQoJCQkJCS5jbGljayhmdW5jdGlvbihlKSB7CgkJCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQkJCgkJCQkJCXZhciB2ID0gJCh0aGlzKS5hdHRyKCduYW1lJyk7CgkJCQkJCSRzZWxmLnZhbCh2KTsKCQkJCQkJb3B0cy5zZWxlY3Qodik7CgkJCQkJCWxpc3Quc2xpZGVVcCgpOwoJCQkJCX0pOwoJCQl9OwoJCQkKCQkJdmFyIHcgPSBzZWxmLm91dGVyV2lkdGgoKTsKCQkJaWYgKGxpc3Qud2lkdGgoKSA8IHcpIHsKCQkJCWxpc3Qud2lkdGgodyk7CgkJCX0KCQkJCgkJCXZhciBoID0gbGlzdC5oZWlnaHQoKTsKCQkJaWYgKG9wdHMubWF4SGVpZ2h0PjAgJiYgaD5vcHRzLm1heEhlaWdodCkgewoJCQkJbGlzdC5oZWlnaHQob3B0cy5tYXhIZWlnaHQpOwoJCQl9CgkJCQoJCQkkc2VsZi52YWwoaGlkZGVuLnZhbCgpKTsKCQl9CgkJCgkJcmV0dXJuIHRoaXM7Cgl9CgkKCSQuZm4uZWxTZWxlY3QuZGVmYXVsdHMgPSB7CgkJbmFtZSAgICAgIDogJ2VsLXNlbGVjdCcsCgkJJ2NsYXNzJyAgIDogJ2VsLXNlbGVjdCcsCgkJbGlzdENsYXNzIDogJ2xpc3QnLAoJCWxhYmVsVHBsICA6IG51bGwsCgkJdHBsICAgICAgIDogJzwldmFsPiVsYWJlbDwvJXZhbD4nLAoJCXRwbHMgICAgICA6IHt9LAoJCXZhbHVlICAgICA6IG51bGwsCgkJc3JjICAgICAgIDoge30sCgkJc2VsZWN0ICAgIDogZnVuY3Rpb24odikgeyAgd2luZG93LmNvbnNvbGUgJiYgIHdpbmRvdy5jb25zb2xlLmxvZyAmJiB3aW5kb3cuY29uc29sZS5sb2coJ3NlbGVjdGVkOiAnK3YpOyB9LAoJCW1heEhlaWdodCA6IDQxMAoJfQoJCn0pKGpRdWVyeSk7Ci8qCiAqIGVsUlRFIC0gV1NXSU5HIGVkaXRvciBmb3Igd2ViCiAqCiAqIFVzYWdlOgogKiB2YXIgb3B0cyA9IHsKICoJLi4uLiAvLyBzZWUgZWxSVEUub3B0aW9ucy5qcwogKiB9CiAqIHZhciBlZGl0b3IgPSBuZXcgZWxSVEUoJCgnI215LWlkJykuZ2V0KDApLCBvcHRzKQogKiBvcgogKiAkKCcjbXktaWQnKS5lbHJ0ZShvcHRzKQogKgogKiAkKCcjbXktaWQpIG1heSBiZSB0ZXh0YXJlYSBvciBhbnkgRE9NIEVsZW1lbnQgd2l0aCB0ZXh0CiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQ29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICovCihmdW5jdGlvbigkKSB7CgplbFJURSA9IGZ1bmN0aW9uKHRhcmdldCwgb3B0cykgewoJaWYgKCF0YXJnZXQgfHwgIXRhcmdldC5ub2RlTmFtZSkgewoJCXJldHVybiBhbGVydCgnZWxSVEU6IGFyZ3VtZW50ICJ0YXJnZXQiIGlzIG5vdCBET00gRWxlbWVudCcpOwoJfQoJdmFyIHNlbGYgICAgID0gdGhpcywgaHRtbDsKCXRoaXMudmVyc2lvbiA9ICcxLjEnOwoJdGhpcy5idWlsZCAgID0gJzIwMTAtMDktMjAnOwoJdGhpcy5vcHRpb25zID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMub3B0aW9ucywgb3B0cyk7Cgl0aGlzLmJyb3dzZXIgPSAkLmJyb3dzZXI7Cgl0aGlzLnRhcmdldCAgPSAkKHRhcmdldCk7CgkKCXRoaXMubGFuZyAgICAgID0gKCcnK3RoaXMub3B0aW9ucy5sYW5nKS50b0xvd2VyQ2FzZSgpOwoJdGhpcy5faTE4biAgICAgPSBuZXcgZWxpMThuKHt0ZXh0ZG9tYWluIDogJ3J0ZScsIG1lc3NhZ2VzIDogeyBydGUgOiB0aGlzLmkxOE1lc3NhZ2VzW3RoaXMubGFuZ10gfHwge319IH0pOwoJdGhpcy5ydGwgPSAhISgvXihhcnxmYXxoZSkkLy50ZXN0KHRoaXMubGFuZykgJiYgdGhpcy5pMThNZXNzYWdlc1t0aGlzLmxhbmddKTsKCQoJaWYgKHRoaXMucnRsKSB7CgkJdGhpcy5vcHRpb25zLmNzc0NsYXNzICs9ICcgZWwtcnRlLXJ0bCc7Cgl9Cgl0aGlzLnRvb2xiYXIgICA9ICQoJzxkaXYgY2xhc3M9InRvb2xiYXIiLz4nKTsKCXRoaXMuaWZyYW1lICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7CgkvLyB0aGlzLnNvdXJjZSAgICA9ICQoJzx0ZXh0YXJlYSAvPicpLmhpZGUoKTsKCXRoaXMud29ya3pvbmUgID0gJCgnPGRpdiBjbGFzcz0id29ya3pvbmUiLz4nKS5hcHBlbmQodGhpcy5pZnJhbWUpLmFwcGVuZCh0aGlzLnNvdXJjZSk7Cgl0aGlzLnN0YXR1c2JhciA9ICQoJzxkaXYgY2xhc3M9InN0YXR1c2JhciIvPicpOwoJdGhpcy50YWJzYmFyICAgPSAkKCc8ZGl2IGNsYXNzPSJ0YWJzYmFyIi8+Jyk7Cgl0aGlzLmVkaXRvciAgICA9ICQoJzxkaXYgY2xhc3M9IicrdGhpcy5vcHRpb25zLmNzc0NsYXNzKyciIC8+JykuYXBwZW5kKHRoaXMudG9vbGJhcikuYXBwZW5kKHRoaXMud29ya3pvbmUpLmFwcGVuZCh0aGlzLnN0YXR1c2JhcikuYXBwZW5kKHRoaXMudGFic2Jhcik7CgkKCXRoaXMuZG9jICAgICA9IG51bGw7Cgl0aGlzLiRkb2MgICAgPSBudWxsOwoJdGhpcy53aW5kb3cgID0gbnVsbDsKCQoJdGhpcy51dGlscyAgPSBuZXcgdGhpcy51dGlscyh0aGlzKTsKCXRoaXMuZG9tICAgID0gbmV3IHRoaXMuZG9tKHRoaXMpOwoJdGhpcy5maWx0ZXIgPSBuZXcgdGhpcy5maWx0ZXIodGhpcykKCQoJLyoqCgkgKiBTeW5jIGlmcmFtZXMvdGV4dGFyZWFzIGhlaWdodCB3aXRoIHdvcmt6b25lIGhlaWdodCAKCSAqCgkgKiBAcmV0dXJuIHZvaWQKCSAqLwoJdGhpcy51cGRhdGVIZWlnaHQgPSBmdW5jdGlvbigpIHsKCQlzZWxmLndvcmt6b25lLmFkZChzZWxmLmlmcmFtZSkuYWRkKHNlbGYuc291cmNlKS5oZWlnaHQoc2VsZi53b3Jrem9uZS5oZWlnaHQoKSk7Cgl9CgkKCS8qKgoJICogVHVybiBlZGl0b3IgcmVzaXphYmxlIG9uL29mZiBpZiBhbGxvd2VkCgkgKgoJICogQHBhcmFtICBCb29sZWFuIAoJICogQHJldHVybiB2b2lkCgkgKiovCgl0aGlzLnJlc2l6YWJsZSA9IGZ1bmN0aW9uKHIpIHsKCQl2YXIgc2VsZiA9IHRoaXM7CgkJaWYgKHRoaXMub3B0aW9ucy5yZXNpemFibGUgJiYgJC5mbi5yZXNpemFibGUpIHsKCQkJaWYgKHIpIHsKCQkJCXRoaXMuZWRpdG9yLnJlc2l6YWJsZSh7aGFuZGxlcyA6ICdzZScsIGFsc29SZXNpemUgOiB0aGlzLndvcmt6b25lLCBtaW5XaWR0aCA6MzAwLCBtaW5IZWlnaHQgOiAyMDAgfSkuYmluZCgncmVzaXplJywgc2VsZi51cGRhdGVIZWlnaHQpOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5lZGl0b3IucmVzaXphYmxlKCdkZXN0cm95JykudW5iaW5kKCdyZXNpemUnLCBzZWxmLnVwZGF0ZUhlaWdodCk7CgkJCX0KCQl9Cgl9CgkKCS8qIGF0dGFjaCBlZGl0b3IgdG8gZG9jdW1lbnQgKi8KCXRoaXMuZWRpdG9yLmluc2VydEFmdGVyKHRhcmdldCk7CgkvKiBpbml0IGVkaXRvciB0ZXh0YXJlYSAqLwoJdmFyIGNvbnRlbnQgPSAnJzsKCWlmICh0YXJnZXQubm9kZU5hbWUgPT0gJ1RFWFRBUkVBJykgewoJCXRoaXMuc291cmNlID0gdGhpcy50YXJnZXQ7CgkJdGhpcy5zb3VyY2UuaW5zZXJ0QWZ0ZXIodGhpcy5pZnJhbWUpLmhpZGUoKTsKCQljb250ZW50ID0gdGhpcy50YXJnZXQudmFsKCk7Cgl9IGVsc2UgewoJCXRoaXMuc291cmNlID0gJCgnPHRleHRhcmVhIC8+JykuaW5zZXJ0QWZ0ZXIodGhpcy5pZnJhbWUpLmhpZGUoKTsKCQljb250ZW50ID0gdGhpcy50YXJnZXQuaGlkZSgpLmh0bWwoKTsKCX0KCXRoaXMuc291cmNlLmF0dHIoJ25hbWUnLCB0aGlzLnRhcmdldC5hdHRyKCduYW1lJyl8fHRoaXMudGFyZ2V0LmF0dHIoJ2lkJykpOwoJY29udGVudCA9ICQudHJpbShjb250ZW50KTsKCWlmICghY29udGVudCkgewoJCWNvbnRlbnQgPSAnICc7Cgl9CgoJLyogYWRkIHRhYnMgKi8KCWlmICh0aGlzLm9wdGlvbnMuYWxsb3dTb3VyY2UpIHsKCQl0aGlzLnRhYnNiYXIuYXBwZW5kKCc8ZGl2IGNsYXNzPSJ0YWIgZWRpdG9yIHJvdW5kZWQtYm90dG9tLTcgYWN0aXZlIj4nK3NlbGYuaTE4bignRWRpdG9yJykrJzwvZGl2PjxkaXYgY2xhc3M9InRhYiBzb3VyY2Ugcm91bmRlZC1ib3R0b20tNyI+JytzZWxmLmkxOG4oJ1NvdXJjZScpKyc8L2Rpdj48ZGl2IGNsYXNzPSJjbGVhcmZpeCIgc3R5bGU9ImNsZWFyOmJvdGgiLz4nKQoJCQkuY2hpbGRyZW4oJy50YWInKS5jbGljayhmdW5jdGlvbihlKSB7CgkJCQlpZiAoISQodGhpcykuaGFzQ2xhc3MoJ2FjdGl2ZScpKSB7CgkJCQkJc2VsZi50YWJzYmFyLmNoaWxkcmVuKCcudGFiJykudG9nZ2xlQ2xhc3MoJ2FjdGl2ZScpOwoJCQkJCXNlbGYud29ya3pvbmUuY2hpbGRyZW4oKS50b2dnbGUoKTsKCgkJCQkJaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2VkaXRvcicpKSB7CgkJCQkJCXNlbGYudXBkYXRlRWRpdG9yKCk7CgkJCQkJCXNlbGYud2luZG93LmZvY3VzKCk7CgkJCQkJCXNlbGYudWkudXBkYXRlKHRydWUpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXNlbGYudXBkYXRlU291cmNlKCk7CgkJCQkJCXNlbGYuc291cmNlLmZvY3VzKCk7CgkJCQkJCWlmICgkLmJyb3dzZXIubXNpZSkgewoJCQkJCQkJLy8gQHRvZG8KCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXNlbGYuc291cmNlWzBdLnNldFNlbGVjdGlvblJhbmdlKDAsIDApOwoJCQkJCQl9CgkJCQkJCXNlbGYudWkuZGlzYWJsZSgpOwoJCQkJCQlzZWxmLnN0YXR1c2Jhci5lbXB0eSgpOwoJCQkJCQkKCQkJCQl9CgkJCQl9CgkJCQkKCQkJfSk7Cgl9CgkKCXRoaXMud2luZG93ID0gdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdzsKCXRoaXMuZG9jICAgID0gdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDsKCXRoaXMuJGRvYyAgID0gJCh0aGlzLmRvYyk7CgkKCS8qIHB1dCBjb250ZW50IGludG8gaWZyYW1lICovCglodG1sID0gJzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz4nOwoJJC5lYWNoKHNlbGYub3B0aW9ucy5jc3NmaWxlcywgZnVuY3Rpb24oKSB7CgkJaHRtbCArPSAnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJyt0aGlzKyciIC8+JzsKCX0pOwoJdGhpcy5kb2Mub3BlbigpOwoJdmFyIHMgPSB0aGlzLmZpbHRlci53eXNpd3lnKGNvbnRlbnQpLAoJCWNsID0gdGhpcy5ydGwgPyAnIGNsYXNzPSJlbC1ydGUtcnRsIicgOiAnJzsKCXRoaXMuZG9jLndyaXRlKHNlbGYub3B0aW9ucy5kb2N0eXBlK2h0bWwrJzwvaGVhZD48Ym9keScrY2wrJz4nKyhzKSsnPC9ib2R5PjwvaHRtbD4nKTsKCXRoaXMuZG9jLmNsb3NlKCk7CgkKCS8qIG1ha2UgaWZyYW1lIGVkaXRhYmxlICovCglpZiAoJC5icm93c2VyLm1zaWUpIHsKCQl0aGlzLmRvYy5ib2R5LmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7Cgl9IGVsc2UgewoJCXRyeSB7IHRoaXMuZG9jLmRlc2lnbk1vZGUgPSAib24iOyB9IAoJCWNhdGNoKGUpIHsgfQoJCXRoaXMuZG9jLmV4ZWNDb21tYW5kKCdzdHlsZVdpdGhDU1MnLCBmYWxzZSwgdGhpcy5vcHRpb25zLnN0eWxlV2l0aENTUyk7Cgl9CgkKCWlmICh0aGlzLm9wdGlvbnMuaGVpZ2h0PjApIHsKCQl0aGlzLndvcmt6b25lLmhlaWdodCh0aGlzLm9wdGlvbnMuaGVpZ2h0KTsKCQkKCX0KCXRoaXMudXBkYXRlSGVpZ2h0KCk7Cgl0aGlzLnJlc2l6YWJsZSh0cnVlKTsKCXRoaXMud2luZG93LmZvY3VzKCk7CgkKCXRoaXMuaGlzdG9yeSA9IG5ldyB0aGlzLmhpc3RvcnkodGhpcyk7CgkKCS8qIGluaXQgc2VsZWN0aW9uIG9iamVjdCAqLwoJdGhpcy5zZWxlY3Rpb24gPSBuZXcgdGhpcy5zZWxlY3Rpb24odGhpcyk7CgkvKiBpbml0IGJ1dHRvbnMgKi8KCXRoaXMudWkgPSBuZXcgdGhpcy51aSh0aGlzKTsKCQoJCgkvKiBiaW5kIHVwZGF0ZVNvdXJjZSB0byBwYXJlbnQgZm9ybSBzdWJtaXQgKi8KCXRoaXMudGFyZ2V0LnBhcmVudHMoJ2Zvcm0nKS5iaW5kKCdzdWJtaXQnLCBmdW5jdGlvbihlKSB7CgkJc2VsZi5zb3VyY2UucGFyZW50cygnZm9ybScpLmZpbmQoJ1tuYW1lPSJlbC1zZWxlY3QiXScpLnJlbW92ZSgpCgkJc2VsZi5iZWZvcmVTYXZlKCk7Cgl9KTsKCQoJLy8gb24gdGFiIHByZXNzIC0gaW5zZXJ0IFx0IGFuZCBwcmV2ZW50IG1vdmUgZm9jdXMKCXRoaXMuc291cmNlLmJpbmQoJ2tleWRvd24nLCBmdW5jdGlvbihlKSB7CgkJaWYgKGUua2V5Q29kZSA9PSA5KSB7CgkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQoJCQlpZiAoJC5icm93c2VyLm1zaWUpIHsKCQkJCXZhciByID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CgkJCQlyLnRleHQgPSAiXHQiK3IudGV4dDsKCQkJCXRoaXMuZm9jdXMoKTsKCQkJfSBlbHNlIHsKCQkJCXZhciBiZWZvcmUgPSB0aGlzLnZhbHVlLnN1YnN0cigwLCB0aGlzLnNlbGVjdGlvblN0YXJ0KSwKCQkJCQlhZnRlciA9IHRoaXMudmFsdWUuc3Vic3RyKHRoaXMuc2VsZWN0aW9uRW5kKTsKCQkJCXRoaXMudmFsdWUgPSBiZWZvcmUrIlx0IithZnRlcjsKCQkJCXRoaXMuc2V0U2VsZWN0aW9uUmFuZ2UoYmVmb3JlLmxlbmd0aCsxLCBiZWZvcmUubGVuZ3RoKzEpOwoJCQl9CgkJfQoJfSk7CgkKCS8qIHVwZGF0ZSBidXR0b25zIG9uIGNsaWNrIGFuZCBrZXl1cCAqLwoJdGhpcy4kZG9jLmJpbmQoJ21vdXNldXAnLCBmdW5jdGlvbigpIHsKCQlzZWxmLnVpLnVwZGF0ZSgpOwoJfSkKCS5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbihlKSB7CgkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCWUuc3RvcFByb3BhZ2F0aW9uKCk7Cgl9KQoJLmJpbmQoJ2tleXVwJywgZnVuY3Rpb24oZSkgewoJCWlmICgoZS5rZXlDb2RlID49IDggJiYgZS5rZXlDb2RlIDw9IDEzKSB8fCAoZS5rZXlDb2RlPj0zMiAmJiBlLmtleUNvZGU8PSA0MCkgfHwgZS5rZXlDb2RlID09IDQ2IHx8IChlLmtleUNvZGUgPj05NiAmJiBlLmtleUNvZGUgPD0gMTExKSkgewoJCQkvLyBzZWxmLmxvZygna2V5dXAgJytlLmtleUNvZGUpCgkJCXNlbGYudWkudXBkYXRlKCk7CgkJfQoJfSkKCS5iaW5kKCdrZXlkb3duJywgZnVuY3Rpb24oZSkgewoJCWlmICgoZS5tZXRhS2V5IHx8IGUuY3RybEtleSkgJiYgZS5rZXlDb2RlID09IDY1KSB7CgkJCXNlbGYudWkudXBkYXRlKCk7CgkJfSBlbHNlIGlmIChlLmtleUNvZGUgPT0gMTMpIHsKCQkJdmFyIG4gPSBzZWxmLnNlbGVjdGlvbi5nZXROb2RlKCk7CgkJCS8vIHNlbGYubG9nKG4pCgkJCWlmIChzZWxmLmRvbS5zZWxmT3JQYXJlbnQobiwgL15QUkUkLykpIHsKCQkJCXNlbGYuc2VsZWN0aW9uLmluc2VydE5vZGUoc2VsZi5kb2MuY3JlYXRlVGV4dE5vZGUoIlxyXG4iKSk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSBpZiAoJC5icm93c2VyLnNhZmFyaSAmJiBlLnNoaWZ0S2V5KSB7CgkJCQlzZWxmLnNlbGVjdGlvbi5pbnNlcnROb2RlKHNlbGYuZG9jLmNyZWF0ZUVsZW1lbnQoJ2JyJykpCgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9Cgl9KQoJCgl0aGlzLnR5cGluZyA9IGZhbHNlOwoJdGhpcy5sYXN0S2V5ID0gbnVsbDsKCQoJdGhpcy4kZG9jLmJpbmQoJ2tleWRvd24nLCBmdW5jdGlvbihlKSB7CgkJaWYgKChlLmtleUNvZGU+PTQ4ICYmIGUua2V5Q29kZSA8PTU3KSB8fCBlLmtleUNvZGU9PTYxIHx8IGUua2V5Q29kZSA9PSAxMDkgfHwgKGUua2V5Q29kZT49NjUgJiYgZS5rZXlDb2RlPD05MCkgfHwgZS5rZXlDb2RlPT0xODggfHxlLmtleUNvZGU9PTE5MCB8fCBlLmtleUNvZGU9PTE5MSB8fCAoZS5rZXlDb2RlPj0yMTkgJiYgZS5rZXlDb2RlPD0yMjIpKSB7CgkJCWlmICghc2VsZi50eXBpbmcpIHsKCQkJCXNlbGYuaGlzdG9yeS5hZGQodHJ1ZSk7CgkJCX0KCQkJc2VsZi50eXBpbmcgPSB0cnVlOwoJCQlzZWxmLmxhc3RLZXkgPSBudWxsOwoJCX0gZWxzZSBpZiAoZS5rZXlDb2RlID09IDggfHwgZS5rZXlDb2RlID09IDQ2IHx8IGUua2V5Q29kZSA9PSAzMiB8fCBlLmtleUNvZGUgPT0gMTMpIHsKCQkJaWYgKGUua2V5Q29kZSAhPSBzZWxmLmxhc3RLZXkpIHsKCQkJCXNlbGYuaGlzdG9yeS5hZGQodHJ1ZSk7CgkJCX0KCQkJc2VsZi5sYXN0S2V5ID0gZS5rZXlDb2RlOwoJCQlzZWxmLnR5cGluZyA9IGZhbHNlOwoJCX0KCgl9KQoJLmJpbmQoJ21vdXNldXAnLCBmdW5jdGlvbigpIHsKCQlzZWxmLnR5cGluZyA9IGZhbHNlOwoJCXNlbGYubGFzdEtleSA9IG51bGw7Cgl9KQoJLmJpbmQoJ3Bhc3RlJywgZnVuY3Rpb24oZSkgewoJCWlmICghc2VsZi5vcHRpb25zLmFsbG93UGFzdGUpIHsKCQkJLy8gcGFzdGUgZGVuaWVkIAoJCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJfSBlbHNlIHsKCQkJdmFyIG4gPSAkKHNlbGYuZG9tLmNyZWF0ZSgnZGl2JykpWzBdLAoJCQkJciA9IHNlbGYuZG9jLmNyZWF0ZVRleHROb2RlKCdfJyk7CgkJCXNlbGYuaGlzdG9yeS5hZGQodHJ1ZSk7CgkJCXNlbGYudHlwaW5nID0gdHJ1ZTsKCQkJc2VsZi5sYXN0S2V5ID0gbnVsbDsKCQkJbi5hcHBlbmRDaGlsZChyKTsKCQkJc2VsZi5zZWxlY3Rpb24uZGVsZXRlQ29udGVudHMoKS5pbnNlcnROb2RlKG4pOwoJCQlzZWxmLnNlbGVjdGlvbi5zZWxlY3Qocik7CgkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCQlpZiAobi5wYXJlbnROb2RlKSB7CgkJCQkJLy8gY2xlYW4gc2FuZGJveCBjb250ZW50CgkJCQkJJChuKS5odG1sKHNlbGYuZmlsdGVyLnByb2NjZXNzKCdwYXN0ZScsICQobikuaHRtbCgpKSk7CgkJCQkJciA9IG4ubGFzdENoaWxkOwoJCQkJCXNlbGYuZG9tLnVud3JhcChuKTsKCQkJCQlpZiAocikgewoJCQkJCQlzZWxmLnNlbGVjdGlvbi5zZWxlY3Qocik7CgkJCQkJCXNlbGYuc2VsZWN0aW9uLmNvbGxhcHNlKGZhbHNlKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCS8vIHNtdGggd3JvbmcgLSBjbGVhbiBhbGwgZG9jCgkJCQkJbi5wYXJlbnROb2RlICYmIG4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKTsKCQkJCQlzZWxmLnZhbChzZWxmLmZpbHRlci5wcm9jY2VzcygncGFzdGUnLCBzZWxmLmZpbHRlci53eXNpd3lnMnd5c2l3eWcoJChzZWxmLmRvYy5ib2R5KS5odG1sKCkpKSk7CgkJCQkJc2VsZi5zZWxlY3Rpb24uc2VsZWN0KHNlbGYuZG9jLmJvZHkuZmlyc3RDaGlsZCk7CgkJCQkJc2VsZi5zZWxlY3Rpb24uY29sbGFwc2UodHJ1ZSk7CgkJCQl9CgkJCQkkKHNlbGYuZG9jLmJvZHkpLm1vdXNldXAoKTsgLy8gdG8gYWN0aXZhdGUgaGlzdG9yeSBidXV0b25zCgkJCX0sIDE1KTsKCQl9Cgl9KTsKCQoJaWYgKCQuYnJvd3Nlci5tc2llKSB7CgkJdGhpcy4kZG9jLmJpbmQoJ2tleXVwJywgZnVuY3Rpb24oZSkgewoJCQlpZiAoZS5rZXlDb2RlID09IDg2ICYmIChlLm1ldGFLZXl8fGUuY3RybEtleSkpIHsKCQkJCXNlbGYuaGlzdG9yeS5hZGQodHJ1ZSk7CgkJCQlzZWxmLnR5cGluZyA9IHRydWU7CgkJCQlzZWxmLmxhc3RLZXkgPSBudWxsOwoJCQkJc2VsZi5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTsKCQkJCXNlbGYudmFsKHNlbGYuZmlsdGVyLnByb2NjZXNzKCdwYXN0ZScsIHNlbGYuZmlsdGVyLnd5c2l3eWcyd3lzaXd5ZygkKHNlbGYuZG9jLmJvZHkpLmh0bWwoKSkpKTsKCQkJCXNlbGYuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7CgkJCQkkKHNlbGYuZG9jLmJvZHkpLm1vdXNldXAoKTsKCQkJCXRoaXMudWkudXBkYXRlKCk7CgkJCX0KCQl9KTsKCX0KCQoJaWYgKCQuYnJvd3Nlci5zYWZhcmkpIHsKCQl0aGlzLiRkb2MuYmluZCgnY2xpY2snLCBmdW5jdGlvbihlKSB7CgkJCSQoc2VsZi5kb2MuYm9keSkuZmluZCgnLmVscnRlLXdlYmtpdC1obCcpLnJlbW92ZUNsYXNzKCdlbHJ0ZS13ZWJraXQtaGwnKTsKCQkJaWYgKGUudGFyZ2V0Lm5vZGVOYW1lID09ICdJTUcnKSB7CgkJCQkkKGUudGFyZ2V0KS5hZGRDbGFzcygnZWxydGUtd2Via2l0LWhsJyk7CgkJCX0KCQl9KS5iaW5kKCdrZXl1cCcsIGZ1bmN0aW9uKGUpIHsKCQkJJChzZWxmLmRvYy5ib2R5KS5maW5kKCcuZWxydGUtd2Via2l0LWhsJykucmVtb3ZlQ2xhc3MoJ2VscnRlLXdlYmtpdC1obCcpOwoJCX0pCgl9CgkKCS8vIHRoaXMucmVzaXphYmxlKHRydWUpCgl0aGlzLndpbmRvdy5mb2N1cygpOwoJLy8gdGhpcy5sb2codGhpcy5lZGl0b3IucGFyZW50cygnZm9ybScpLmZpbmQoJ1tuYW1lPSJlbC1zZWxlY3QiXScpKQoJCgkKfQoKLyoqCiAqIFJldHVybiBtZXNzYWdlIHRyYW5zbGF0ZWQgdG8gc2VsZWN0ZWQgbGFuZ3VhZ2UKICoKICogQHBhcmFtICBzdHJpbmcgIG1zZyAgbWVzc2FnZSB0ZXh0IGluIGVuZ2xpc2gKICogQHJldHVybiBzdHJpbmcKICoqLwplbFJURS5wcm90b3R5cGUuaTE4biA9IGZ1bmN0aW9uKG1zZykgewoJcmV0dXJuIHRoaXMuX2kxOG4udHJhbnNsYXRlKG1zZyk7Cn0KCgoKLyoqCiAqIERpc3BsYXkgZWRpdG9yCiAqCiAqIEByZXR1cm4gdm9pZAogKiovCmVsUlRFLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7Cgl0aGlzLmVkaXRvci5zaG93KCk7Cn0KCi8qKgogKiBIaWRlIGVkaXRvciBhbmQgZGlzcGxheSBlbGVtZW50cyBvbiB3aWNoIGVkaXRvciB3YXMgY3JlYXRlZAogKgogKiBAcmV0dXJuIHZvaWQKICoqLwplbFJURS5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHsKCXRoaXMuZWRpdG9yLmhpZGUoKTsKfQoKZWxSVEUucHJvdG90eXBlLnVwZGF0ZUVkaXRvciA9IGZ1bmN0aW9uKCkgewoJdGhpcy52YWwodGhpcy5zb3VyY2UudmFsKCkpOwp9CgplbFJURS5wcm90b3R5cGUudXBkYXRlU291cmNlID0gZnVuY3Rpb24oKSB7Cgl0aGlzLnNvdXJjZS52YWwodGhpcy5maWx0ZXIuc291cmNlKCQodGhpcy5kb2MuYm9keSkuaHRtbCgpKSk7Cn0KCi8qKgogKiBSZXR1cm4gZWRpdGVkIHRleHQKICoKICogQHJldHVybiBTdHJpbmcKICoqLwplbFJURS5wcm90b3R5cGUudmFsID0gZnVuY3Rpb24odikgewoJaWYgKHR5cGVvZih2KSA9PSAnc3RyaW5nJykgewoJCXYgPSAnJyt2OwoJCWlmICh0aGlzLnNvdXJjZS5pcygnOnZpc2libGUnKSkgewoJCQl0aGlzLnNvdXJjZS52YWwodGhpcy5maWx0ZXIuc291cmNlMnNvdXJjZSh2KSk7CgkJfSBlbHNlIHsKCQkJaWYgKCQuYnJvd3Nlci5tc2llKSB7CgkJCQl0aGlzLmRvYy5ib2R5LmlubmVySFRNTCA9ICc8YnIgLz4nK3RoaXMuZmlsdGVyLnd5c2l3eWcodik7CgkJCQl0aGlzLmRvYy5ib2R5LnJlbW92ZUNoaWxkKHRoaXMuZG9jLmJvZHkuZmlyc3RDaGlsZCk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmRvYy5ib2R5LmlubmVySFRNTCA9IHRoaXMuZmlsdGVyLnd5c2l3eWcodik7CgkJCX0KCQkJCgkJfQoJfSBlbHNlIHsKCQlpZiAodGhpcy5zb3VyY2UuaXMoJzp2aXNpYmxlJykpIHsKCQkJcmV0dXJuIHRoaXMuZmlsdGVyLnNvdXJjZTJzb3VyY2UodGhpcy5zb3VyY2UudmFsKCkpOwoJCX0gZWxzZSB7CgkJCXJldHVybiB0aGlzLmZpbHRlci5zb3VyY2UoJCh0aGlzLmRvYy5ib2R5KS5odG1sKCkpOwoJCX0KCX0KfQoKZWxSVEUucHJvdG90eXBlLmJlZm9yZVNhdmUgPSBmdW5jdGlvbigpIHsKCXRoaXMuc291cmNlLnZhbCh0aGlzLnZhbCgpfHwnJyk7Cn0KCi8qKgogKiBTdWJtaXQgZm9ybQogKgogKiBAcmV0dXJuIHZvaWQKICoqLwplbFJURS5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uKCkgewoJdGhpcy5iZWZvcmVTYXZlKCk7Cgl0aGlzLmVkaXRvci5wYXJlbnRzKCdmb3JtJykuc3VibWl0KCk7Cn0KCmVsUlRFLnByb3RvdHlwZS5sb2cgPSBmdW5jdGlvbihtc2cpIHsKCWlmICh3aW5kb3cuY29uc29sZSAmJiB3aW5kb3cuY29uc29sZS5sb2cpIHsKCQl3aW5kb3cuY29uc29sZS5sb2cobXNnKTsKCX0KICAgICAgICAKfQoKZWxSVEUucHJvdG90eXBlLmkxOE1lc3NhZ2VzID0ge307CgokLmZuLmVscnRlID0gZnVuY3Rpb24obywgdikgeyAKCXZhciBjbWQgPSB0eXBlb2YobykgPT0gJ3N0cmluZycgPyBvIDogJycsIHJldDsKCQoJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCWlmICghdGhpcy5lbHJ0ZSkgewoJCQl0aGlzLmVscnRlID0gbmV3IGVsUlRFKHRoaXMsIHR5cGVvZihvKSA9PSAnb2JqZWN0JyA/IG8gOiB7fSk7CgkJfQoJCXN3aXRjaCAoY21kKSB7CgkJCWNhc2UgJ29wZW4nOgoJCQljYXNlICdzaG93JzoKCQkJCXRoaXMuZWxydGUub3BlbigpOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2Nsb3NlJzoKCQkJY2FzZSAnaGlkZSc6CgkJCQl0aGlzLmVscnRlLmNsb3NlKCk7CgkJCQlicmVhazsKCQkJY2FzZSAndXBkYXRlU291cmNlJzoKCQkJCXRoaXMuZWxydGUudXBkYXRlU291cmNlKCk7CgkJCQlicmVhazsKCQl9Cgl9KTsKCQoJaWYgKGNtZCA9PSAndmFsJykgewoJCWlmICghdGhpcy5sZW5ndGgpIHsKCQkJcmV0dXJuICcnOwoJCX0gZWxzZSBpZiAodGhpcy5sZW5ndGggPT0gMSkgewoJCQlyZXR1cm4gdiA/IHRoaXNbMF0uZWxydGUudmFsKHYpIDogdGhpc1swXS5lbHJ0ZS52YWwoKTsKCQl9IGVsc2UgewoJCQlyZXQgPSB7fQoJCQl0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQlyZXRbdGhpcy5lbHJ0ZS5zb3VyY2UuYXR0cignbmFtZScpXSA9IHRoaXMuZWxydGUudmFsKCk7CgkJCX0pOwoJCQlyZXR1cm4gcmV0OwoJCX0KCX0KCXJldHVybiB0aGlzOwp9Cgp9KShqUXVlcnkpOwovKgogKiBET00gdXRpbGl0ZXMgZm9yIGVsUlRFIAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuZG9tID0gZnVuY3Rpb24ocnRlKSB7Cgl0aGlzLnJ0ZSA9IHJ0ZTsKCXZhciBzZWxmID0gdGhpczsKCXRoaXMucmVnRXhwID0gewoJCXRleHROb2RlcyAgICAgICAgIDogL14oQXxBQkJSfEFDUk9OWU18QUREUkVTU3xCfEJET3xCSUd8QkxPQ0tRVU9URXxDQVBUSU9OfENFTlRFUnxDSVRFfENPREV8RER8REVMfERGTnxESVZ8RFR8RU18RklFTERTRVR8Rk9OVHxIWzEtNl18SXxJTlN8S0JEfExBQkVMfExFR0VORHxMSXxNQVJRVUVFfE5PQlJ8Tk9FTUJFRHxQfFBSRXxRfFNBTVB8U01BTEx8U1BBTnxTVFJJS0V8U1RST05HfFNVQnxTVVB8VER8VEh8VFR8VkFSKSQvLAoJCXRleHRDb250YWluc05vZGVzIDogL14oQXxBQkJSfEFDUk9OWU18QUREUkVTU3xCfEJET3xCSUd8QkxPQ0tRVU9URXxDQVBUSU9OfENFTlRFUnxDSVRFfENPREV8RER8REVMfERGTnxESVZ8REx8RFR8RU18RklFTERTRVR8Rk9OVHxIWzEtNl18SXxJTlN8S0JEfExBQkVMfExFR0VORHxMSXxNQVJRVUVFfE5PQlJ8Tk9FTUJFRHxPTHxQfFBSRXxRfFNBTVB8U01BTEx8U1BBTnxTVFJJS0V8U1RST05HfFNVQnxTVVB8VEFCTEV8VEhFQUR8VEJPRFl8VEZPT1R8VER8VEh8VFJ8VFR8VUx8VkFSKSQvLAoJCWJsb2NrICAgICAgICAgICAgIDogL14oQVBQTEVUfEJMT0NLUVVPVEV8QlJ8Q0FQVElPTnxDRU5URVJ8Q09MfENPTEdST1VQfEREfERJVnxETHxEVHxIWzEtNl18RU1CRUR8RklFTERTRVR8TEl8TUFSUVVFRXxOT0JSfE9CSkVDVHxPTHxQfFBSRXxUQUJMRXxUSEVBRHxUQk9EWXxURk9PVHxURHxUSHxUUnxVTCkkLywKCQlzZWxlY3Rpb25CbG9jayAgICA6IC9eKEFQUExFVHxCTE9DS1FVT1RFfEJSfENBUFRJT058Q0VOVEVSfENPTHxDT0xHUk9VUHxERHxESVZ8REx8RFR8SFsxLTZdfEVNQkVEfEZJRUxEU0VUfExJfE1BUlFVRUV8Tk9CUnxPQkpFQ1R8T0x8UHxQUkV8VER8VEh8VFJ8VUwpJC8sCQkKCQloZWFkZXIgICAgICAgICAgICA6IC9eSFsxLTZdJC8sCgkJZm9ybUVsZW1lbnQgICAgICAgOiAvXihGT1JNfElOUFVUfEhJRERFTnxURVhUQVJFQXxTRUxFQ1R8QlVUVE9OKSQvCgl9OwoJCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgkvKiAgICAgICAgICAgICAgICAgICAgICDQo9GC0LjQu9C40YLRiyAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKCQoJLyoqCgkgKiDQktC+0LfQstGA0LDRidCw0LXRgiBib2R5INGA0LXQtNCw0LrRgtC40YDRg9C10LzQvtCz0L4g0LTQvtC60YPQvNC10L3RgtCwCgkgKgoJICogQHJldHVybiBFbGVtZW50CgkgKiovCgl0aGlzLnJvb3QgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5ydGUuYm9keTsKCX0KCgl0aGlzLmNyZWF0ZSA9IGZ1bmN0aW9uKHQpIHsKCQlyZXR1cm4gdGhpcy5ydGUuZG9jLmNyZWF0ZUVsZW1lbnQodCk7Cgl9CgoJLyoqCgkgKiBSZXR1cm4gbm9kZSBmb3IgYm9va21hcmsgd2l0aCB1bmlxdWUgSUQKCSAqCgkgKiBAcmV0dXJuIERPTUVsZW1lbnQKCSAqKi8KCXRoaXMuY3JlYXRlQm9va21hcmsgPSBmdW5jdGlvbigpIHsKCQl2YXIgYiA9IHRoaXMucnRlLmRvYy5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CgkJYi5pZCA9ICdlbHJ0ZS1ibS0nK01hdGgucmFuZG9tKCkudG9TdHJpbmcoKS5zdWJzdHIoMik7CgkJJChiKS5hZGRDbGFzcygnZWxydGVibScpOwoJCXJldHVybiBiOwoJfQoKCS8qKgoJICog0JLQvtCy0YDQsNGJ0LDQtdGCINC40L3QtNC10LrRgSDRjdC70LXQvNC10L3RgtCwINCy0L3Rg9GC0YDQuCDRgNC+0LTQuNGC0LXQu9GPCgkgKgoJICogQHBhcmFtICBFbGVtZW50IG4gINC90L7QtNCwCgkgKiBAcmV0dXJuIGludGVnZXIKCSAqKi8KCXRoaXMuaW5kZXhPZiA9IGZ1bmN0aW9uKG4pIHsKCQl2YXIgbmR4ID0gMDsKCQluID0gJChuKTsKCQl3aGlsZSAoKG4gPSBuLnByZXYoKSkgJiYgbi5sZW5ndGgpIHsKCQkJbmR4Kys7CgkJfQoJCXJldHVybiBuZHg7Cgl9CgkKCS8qKgoJICog0JLQvtCy0YDQsNGJ0LDQtdGCINC30L3QsNGH0LXQvdC40LUg0LDRgtGC0YDQuNCx0YPRgtCwINCyINC90LjQttC90LXQvCDRgNC10LPQuNGB0YLRgNC1ICjQvtGFINGD0LYg0Y3RgtC+0YIgSUUpCgkgKgoJICogQHBhcmFtICBFbGVtZW50IG4gINC90L7QtNCwCgkgKiBAcGFyYW0gIFN0cmluZyAgYXR0ciDQuNC80Y8g0LDRgtGC0YDQuNCx0YPRgtCwCgkgKiBAcmV0dXJuIHN0cmluZwoJICoqLwoJdGhpcy5hdHRyID0gZnVuY3Rpb24obiwgYXR0cikgewoJCXZhciB2ID0gJyc7CgkJaWYgKG4ubm9kZVR5cGUgPT0gMSkgewoJCQl2ID0gJChuKS5hdHRyKGF0dHIpOwoJCQlpZiAodiAmJiBhdHRyICE9ICdzcmMnICYmIGF0dHIgIT0gJ2hyZWYnKSB7CgkJCQl2ID0gdi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7CgkJCX0KCQl9IAoJCXJldHVybiB2fHwnJzsKCX0KCQoJLyoqCgkgKiDQktC+0LLRgNCw0YnQsNC10YIg0LHQu9C40LbQsNC50YjQuNC5INC+0LHRidC40Lkg0LrQvtC90YLQtdC50L3QtdGAINC00LvRjyAyLdGFINGN0Lst0YLQvtCyCgkgKgoJICogQHBhcmFtICBFbGVtZW50IG4gINC90L7QtNCwMQoJICogQHBhcmFtICBFbGVtZW50IG4gINC90L7QtNCwMgoJICogQHJldHVybiBFbGVtZW50CgkgKiovCgl0aGlzLmZpbmRDb21tb25BbmNlc3RvciA9IGZ1bmN0aW9uKG4xLCBuMikgewoJCWlmICghbjEgfHwgIW4yKSB7CgkJCXJldHVybiB0aGlzLnJ0ZS5sb2coJ2RvbS5maW5kQ29tbW9uQW5jZXN0b3IgaW52YWxpZCBhcmd1bWVudHMnKTsKCQl9CgkJaWYgKG4xID09IG4yKSB7CgkJCXJldHVybiBuMTsKCQl9IGVsc2UgaWYgKG4xLm5vZGVOYW1lID09ICdCT0RZJyB8fCBuMi5ub2RlTmFtZSA9PSAnQk9EWScpIHsKCQkJcmV0dXJuIHRoaXMucnRlLmRvYy5ib2R5OwoJCX0KCQl2YXIgcDEgPSAkKG4xKS5wYXJlbnRzKCksIHAyID0gJChuMikucGFyZW50cygpLCBsICA9IHAyLmxlbmd0aC0xLCBjICA9IHAyW2xdOwoJCWZvciAodmFyIGkgPSBwMS5sZW5ndGggLSAxOyBpID49IDA7IGktLSwgbC0tKXsKCQkJaWYgKHAxW2ldID09IHAyW2xdKSB7CgkJCQljID0gcDFbaV07CgkJCX0gZWxzZSB7CgkJCQlicmVhazsKCQkJfQoJCX07CgkJcmV0dXJuIGM7Cgl9CgkvKioKCSAqINCS0L7QstGA0LDRidCw0LXRgiBUUlVFLCDQtdGB0LvQuCDQvdC+0LTQsCDQv9GD0YHRgtCw0Y8KCSAqINC/0YPRgdGC0L7QuSDRgdGH0LjRgtCw0LXQvCDQvdC+0LTRizoKCSAqICAtINGC0LXQutGB0YLQvtCy0YvQtSDRjdC7LdGC0YssINGB0L7QtNC10YDQttCw0YnQuNC1INC/0YPRgdGC0YPRjiDRgdGC0YDQvtC60YMg0LjQu9C4INGC0LXQsyBicgoJICogIC0g0YLQtdC60YHRgtC+0LLRi9C1INC90L7QtNGLINGBINC/0YPRgdGC0L7QuSDRgdGC0YDQvtC60L7QuQoJICoKCSAqIEBwYXJhbSAgRE9NRWxlbWVudCBuICDQvdC+0LTQsAoJICogQHJldHVybiBib29sCgkgKiovCgl0aGlzLmlzRW1wdHkgPSBmdW5jdGlvbihuKSB7CgkJaWYgKG4ubm9kZVR5cGUgPT0gMSkgewoJCQlyZXR1cm4gdGhpcy5yZWdFeHAudGV4dE5vZGVzLnRlc3Qobi5ub2RlTmFtZSkgPyAkLnRyaW0oJChuKS50ZXh0KCkpLmxlbmd0aCA9PSAwIDogZmFsc2U7CgkJfSBlbHNlIGlmIChuLm5vZGVUeXBlID09IDMpIHsKCQkJcmV0dXJuIC9eKFRBQkxFfFRIRUFEfFRGT09UfFRCT0RZfFRSfFVMfE9MfERMKSQvLnRlc3Qobi5wYXJlbnROb2RlLm5vZGVOYW1lKQoJCQkJfHwgbi5ub2RlVmFsdWUgPT0gJycKCQkJCXx8ICgkLnRyaW0obi5ub2RlVmFsdWUpLmxlbmd0aD09IDAgJiYgIShuLm5leHRTaWJsaW5nICYmIG4ucHJldmlvdXNTaWJsaW5nICYmIG4ubmV4dFNpYmxpbmcubm9kZVR5cGU9PTEgJiYgbi5wcmV2aW91c1NpYmxpbmcubm9kZVR5cGU9PTEgJiYgIXRoaXMucmVnRXhwLmJsb2NrLnRlc3Qobi5uZXh0U2libGluZy5ub2RlTmFtZSkgJiYgIXRoaXMucmVnRXhwLmJsb2NrLnRlc3Qobi5wcmV2aW91c1NpYmxpbmcubm9kZU5hbWUpICkpOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgkvKiAgICAgICAgICAgICAgICAgINCf0LXRgNC10LzQtdGJ0LXQvdC40LUg0L/QviBET00gICAgICAgICAgICAgICAgICAqLwoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCS8qKgoJICog0JLQvtCy0YDQsNGJ0LDQtdGCINGB0LvQtdC00YPRjtGJ0YPRjiDRgdC+0YHQtdC00L3RjtGOINC90L7QtNGDICjQvdC1INCy0LrQu9GO0YfQsNGO0YLRgdGPINGC0LXQutGB0YLQvtCy0YvQtSDQvdC+0LTRiyDQvdC1INGB0L7Qt9C00LDRjtGJ0LjQtSDQt9C90LDRh9C40LzRi9C1INC/0YDQvtCx0LXQu9GLINC80LXQttC00YMg0LjQvdC70LDQudC9INGN0LvQtdC80LXQvdGC0LDQvNC4KQoJICoKCSAqIEBwYXJhbSAgRE9NRWxlbWVudCBuICDQvdC+0LTQsAoJICogQHJldHVybiBET01FbGVtZW50CgkgKiovCgl0aGlzLm5leHQgPSBmdW5jdGlvbihuKSB7CgkJd2hpbGUgKG4ubmV4dFNpYmxpbmcgJiYgKG4gPSBuLm5leHRTaWJsaW5nKSkgewoJCQlpZiAobi5ub2RlVHlwZSA9PSAxIHx8IChuLm5vZGVUeXBlID09IDMgJiYgIXRoaXMuaXNFbXB0eShuKSkpIHsKCQkJCXJldHVybiBuOwoJCQl9CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCS8qKgoJICog0JLQvtCy0YDQsNGJ0LDQtdGCINC/0YDQtdC00YvQtNGD0Y7RidGD0Y4g0YHQvtGB0LXQtNC90Y7RjiDQvdC+0LTRgyAo0L3QtSDQstC60LvRjtGH0LDRjtGC0YHRjyDRgtC10LrRgdGC0L7QstGL0LUg0L3QvtC00Ysg0L3QtSDRgdC+0LfQtNCw0Y7RidC40LUg0LfQvdCw0YfQuNC80YvQtSDQv9GA0L7QsdC10LvRiyDQvNC10LbQtNGDINC40L3Qu9Cw0LnQvSDRjdC70LXQvNC10L3RgtCw0LzQuCkKCSAqCgkgKiBAcGFyYW0gIERPTUVsZW1lbnQgbiAg0L3QvtC00LAKCSAqIEByZXR1cm4gRE9NRWxlbWVudAoJICoqLwoJdGhpcy5wcmV2ID0gZnVuY3Rpb24obikgewoJCXdoaWxlIChuLnByZXZpb3VzU2libGluZyAmJiAobiA9IG4ucHJldmlvdXNTaWJsaW5nKSkgewoJCQlpZiAobi5ub2RlVHlwZSA9PSAxIHx8IChuLm5vZGVUeXBlID09MyAmJiAhdGhpcy5pc0VtcHR5KG4pKSkgewoJCQkJcmV0dXJuIG47CgkJCX0KCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJdGhpcy5pc1ByZXYgPSBmdW5jdGlvbihuLCBwcmV2KSB7CgkJd2hpbGUgKChuID0gdGhpcy5wcmV2KG4pKSkgewoJCQlpZiAobiA9PSBwcmV2KSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiDQktC+0LLRgNCw0YnQsNC10YIg0LLRgdC1INGB0LvQtdC00YPRjtGJ0LjQtSDRgdC+0YHQtdC00L3QuNC4INC90L7QtNGLICjQvdC1INCy0LrQu9GO0YfQsNGO0YLRgdGPINGC0LXQutGB0YLQvtCy0YvQtSDQvdC+0LTRiyDQvdC1INGB0L7Qt9C00LDRjtGJ0LjQtSDQt9C90LDRh9C40LzRi9C1INC/0YDQvtCx0LXQu9GLINC80LXQttC00YMg0LjQvdC70LDQudC9INGN0LvQtdC80LXQvdGC0LDQvNC4KQoJICoKCSAqIEBwYXJhbSAgRE9NRWxlbWVudCBuICDQvdC+0LTQsAoJICogQHJldHVybiBBcnJheQoJICoqLwoJdGhpcy5uZXh0QWxsID0gZnVuY3Rpb24obikgewoJCXZhciByZXQgPSBbXTsKCQl3aGlsZSAoKG4gPSB0aGlzLm5leHQobikpKSB7CgkJCXJldC5wdXNoKG4pOwoJCX0KCQlyZXR1cm4gcmV0OwoJfQoJCgkvKioKCSAqINCS0L7QstGA0LDRidCw0LXRgiDQstGB0LUg0L/RgNC10LTRi9C00YPRjtGJ0LjQtSDRgdC+0YHQtdC00L3QuNC4INC90L7QtNGLICjQvdC1INCy0LrQu9GO0YfQsNGO0YLRgdGPINGC0LXQutGB0YLQvtCy0YvQtSDQvdC+0LTRiyDQvdC1INGB0L7Qt9C00LDRjtGJ0LjQtSDQt9C90LDRh9C40LzRi9C1INC/0YDQvtCx0LXQu9GLINC80LXQttC00YMg0LjQvdC70LDQudC9INGN0LvQtdC80LXQvdGC0LDQvNC4KQoJICoKCSAqIEBwYXJhbSAgRE9NRWxlbWVudCBuICDQvdC+0LTQsAoJICogQHJldHVybiBBcnJheQoJICoqLwoJdGhpcy5wcmV2QWxsID0gZnVuY3Rpb24obikgewoJCXZhciByZXQgPSBbXTsKCQl3aGlsZSAoKG4gPSB0aGlzLnByZXYobikpKSB7CgkJCXJldC5wdXNoKG4pOwoJCX0KCQlyZXR1cm4gcmV0OwoJfQoJCgkvKioKCSAqINCS0L7QstGA0LDRidCw0LXRgiDQstGB0LUg0YHQu9C10LTRg9GO0YnQuNC1INGB0L7RgdC10LTQvdC40LggaW5saW5lINC90L7QtNGLICjQvdC1INCy0LrQu9GO0YfQsNGO0YLRgdGPINGC0LXQutGB0YLQvtCy0YvQtSDQvdC+0LTRiyDQvdC1INGB0L7Qt9C00LDRjtGJ0LjQtSDQt9C90LDRh9C40LzRi9C1INC/0YDQvtCx0LXQu9GLINC80LXQttC00YMg0LjQvdC70LDQudC9INGN0LvQtdC80LXQvdGC0LDQvNC4KQoJICoKCSAqIEBwYXJhbSAgRE9NRWxlbWVudCBuICDQvdC+0LTQsAoJICogQHJldHVybiBBcnJheQoJICoqLwoJdGhpcy50b0xpbmVFbmQgPSBmdW5jdGlvbihuKSB7CgkJdmFyIHJldCA9IFtdOwoJCXdoaWxlICgobiA9IHRoaXMubmV4dChuKSkgJiYgbi5ub2RlTmFtZSAhPSAnQlInICYmIG4ubm9kZU5hbWUgIT0gJ0hSJyAmJiB0aGlzLmlzSW5saW5lKG4pKSB7CgkJCXJldC5wdXNoKG4pOwoJCX0KCQlyZXR1cm4gcmV0OwoJfQoJCgkvKioKCSAqINCS0L7QstGA0LDRidCw0LXRgiDQstGB0LUg0L/RgNC10LTRi9C00YPRjtGJ0LjQtSDRgdC+0YHQtdC00L3QuNC4IGlubGluZSDQvdC+0LTRiyAo0L3QtSDQstC60LvRjtGH0LDRjtGC0YHRjyDRgtC10LrRgdGC0L7QstGL0LUg0L3QvtC00Ysg0L3QtSDRgdC+0LfQtNCw0Y7RidC40LUg0LfQvdCw0YfQuNC80YvQtSDQv9GA0L7QsdC10LvRiyDQvNC10LbQtNGDINC40L3Qu9Cw0LnQvSDRjdC70LXQvNC10L3RgtCw0LzQuCkKCSAqCgkgKiBAcGFyYW0gIERPTUVsZW1lbnQgbiAg0L3QvtC00LAKCSAqIEByZXR1cm4gQXJyYXkKCSAqKi8KCXRoaXMudG9MaW5lU3RhcnQgPSBmdW5jdGlvbihuKSB7CgkJdmFyIHJldCA9IFtdOwoJCXdoaWxlICgobiA9IHRoaXMucHJldihuKSkgJiYgbi5ub2RlTmFtZSAhPSAnQlInICYmIG4ubm9kZU5hbWUgIT0gJ0hSJyAmJiB0aGlzLmlzSW5saW5lKG4pICkgewoJCQlyZXQudW5zaGlmdChuKTsKCQl9CgkJcmV0dXJuIHJldDsKCX0KCQoJLyoqCgkgKiDQktC+0LLRgNCw0YnQsNC10YIgVFJVRSwg0LXRgdC70Lgg0L3QvtC00LAgLSDQv9C10YDQstGL0Lkg0L3QtdC/0YPRgdGC0L7QuSDRjdC7LdGCINCy0L3Rg9GC0YDQuCDRgNC+0LTQuNGC0LXQu9GPCgkgKgoJICogQHBhcmFtICBFbGVtZW50IG4gINC90L7QtNCwCgkgKiBAcmV0dXJuIGJvb2wKCSAqKi8KCXRoaXMuaXNGaXJzdE5vdEVtcHR5ID0gZnVuY3Rpb24obikgewoJCXdoaWxlICgobiA9IHRoaXMucHJldihuKSkpIHsKCQkJaWYgKG4ubm9kZVR5cGUgPT0gMSB8fCAobi5ub2RlVHlwZSA9PSAzICYmICQudHJpbShuLm5vZGVWYWx1ZSkhPScnICkgKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgkJcmV0dXJuIHRydWU7Cgl9CgkKCS8qKgoJICog0JLQvtCy0YDQsNGJ0LDQtdGCIFRSVUUsINC10YHQu9C4INC90L7QtNCwIC0g0L/QvtGB0LvQtdC00L3QuNC5INC90LXQv9GD0YHRgtC+0Lkg0Y3Quy3RgiDQstC90YPRgtGA0Lgg0YDQvtC00LjRgtC10LvRjwoJICoKCSAqIEBwYXJhbSAgRWxlbWVudCBuICDQvdC+0LTQsAoJICogQHJldHVybiBib29sCgkgKiovCgl0aGlzLmlzTGFzdE5vdEVtcHR5ID0gZnVuY3Rpb24obikgewoJCXdoaWxlICgobiA9IHRoaXMubmV4dChuKSkpIHsKCQkJaWYgKCF0aGlzLmlzRW1wdHkobikpIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCQoJLyoqCgkgKiDQktC+0LLRgNCw0YnQsNC10YIgVFJVRSwg0LXRgdC70Lgg0L3QvtC00LAgLSDQtdC00LjQvdGB0YLQstC10L3QvdGL0Lkg0L3QtdC/0YPRgdGC0L7QuSDRjdC7LdGCINCy0L3Rg9GC0YDQuCDRgNC+0LTQuNGC0LXQu9GPCgkgKgoJICogQHBhcmFtICBET01FbGVtZW50IG4gINC90L7QtNCwCgkgKiBAcmV0dXJuIGJvb2wKCSAqKi8KCXRoaXMuaXNPbmx5Tm90RW1wdHkgPSBmdW5jdGlvbihuKSB7CgkJcmV0dXJuIHRoaXMuaXNGaXJzdE5vdEVtcHR5KG4pICYmIHRoaXMuaXNMYXN0Tm90RW1wdHkobik7Cgl9CgkKCS8qKgoJICog0JLQvtCy0YDQsNGJ0LDQtdGCINC/0L7RgdC70LXQtNC90LjQuSDQvdC10L/Rg9GB0YLQvtC5INC00L7Rh9C10YDQvdC40Lkg0Y3Quy3RgiDQvdC+0LTRiyDQuNC70LggRkFMU0UKCSAqCgkgKiBAcGFyYW0gIEVsZW1lbnQgbiAg0L3QvtC00LAKCSAqIEByZXR1cm4gRWxlbWVudAoJICoqLwoJdGhpcy5maW5kTGFzdE5vdEVtcHR5ID0gZnVuY3Rpb24obikgewoJCXRoaXMucnRlLmxvZygnZmluZExhc3ROb3RFbXB0eSBXaG8gaXMgaGVyZSAwX28nKTsKCQlpZiAobi5ub2RlVHlwZSA9PSAxICYmIChsID0gbi5sYXN0Q2hpbGQpKSB7CgkJCWlmICghdGhpcy5pc0VtcHR5KGwpKSB7CgkJCQlyZXR1cm4gbDsKCQkJfQoJCQl3aGlsZSAobC5wcmV2aW91c1NpYmxpbmcgJiYgKGwgPSBsLnByZXZpb3VzU2libGluZykpIHsKCQkJCWlmICghdGhpcy5pc0VtcHR5KGwpKSB7CgkJCQkJcmV0dXJuIGw7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoJCgkvKioKCSAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCIFRSVUUsINC10YHQu9C4INC90L7QtNCwICJpbmxpbmUiIAoJICoKCSAqIEBwYXJhbSAgRE9NRWxlbWVudCBuICDQvdC+0LTQsAoJICogQHJldHVybiBib29sCgkgKiovCgl0aGlzLmlzSW5saW5lID0gZnVuY3Rpb24obikgewoJCWlmIChuLm5vZGVUeXBlID09IDMpIHsKCQkJcmV0dXJuIHRydWU7CgkJfSBlbHNlIGlmIChuLm5vZGVUeXBlID09IDEpIHsKCQkJbiA9ICQobik7CgkJCXZhciBkID0gbi5jc3MoJ2Rpc3BsYXknKTsKCQkJdmFyIGYgPSBuLmNzcygnZmxvYXQnKTsKCQkJcmV0dXJuIGQgPT0gJ2lubGluZScgfHwgZCA9PSAnaW5saW5lLWJsb2NrJyB8fCBmID09ICdsZWZ0JyB8fCBmID09ICdyaWdodCc7CgkJfQoJCXJldHVybiB0cnVlOwoJfQoJCgkKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCS8qICAgICAgICAgICAgICAgICAg0J/QvtC40YHQuiDRjdC70LXQvNC10L3RgtC+0LIgICAgICAgICAgICAgICAgICAgICAqLwoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJCgl0aGlzLmlzID0gZnVuY3Rpb24obiwgZikgewoJCWlmIChuICYmIG4ubm9kZU5hbWUpIHsKCQkJaWYgKHR5cGVvZihmKSA9PSAnc3RyaW5nJykgewoJCQkJZiA9IHRoaXMucmVnRXhwW2ZdfHwvLj8vOwoJCQl9CgkJCWlmIChmIGluc3RhbmNlb2YgUmVnRXhwICYmIG4ubm9kZU5hbWUpIHsKCQkJCXJldHVybiBmLnRlc3Qobi5ub2RlTmFtZSk7CgkJCX0gZWxzZSBpZiAodHlwZW9mKGYpID09ICdmdW5jdGlvbicpIHsKCQkJCXJldHVybiBmKG4pOwoJCQl9CgkJfQoJCQoJCXJldHVybiBmYWxzZTsKCX0KCQoJLyoqCgkgKiDQktC+0LLRgNCw0YnQsNC10YIg0Y3Qu9C10LzQtdC90YIo0YspINC+0YLQstC10YfQsNGO0YnQuNC1INGD0YHQu9C+0LLQuNGP0Lwg0L/QvtC40YHQutCwCgkgKgoJICogQHBhcmFtICBET01FbGVtZW50fHxBcnJheSAgbiAgICAgICDQvdC+0LTQsAoJICogQHBhcmFtICBSZWdFeHB8fFN0cmluZyAgICAgZmlsdGVyICDRhNC40LvRjNGC0YAg0YPRgdC70L7QstC40Y8g0L/QvtC40YHQutCwIChSZWdFeHAg0LjQu9C4INC40LzRjyDQutC70Y7Rh9CwIHRoaXMucmVnRXhwINC40LvQuCAqKQoJICogQHJldHVybiBET01FbGVtZW50fHxBcnJheQoJICoqLwoJdGhpcy5maWx0ZXIgPSBmdW5jdGlvbihuLCBmaWx0ZXIpIHsKCQl2YXIgcmV0ID0gW10sIGk7CgkJaWYgKCFuLnB1c2gpIHsKCQkJcmV0dXJuIHRoaXMuaXMobiwgZmlsdGVyKSA/IG4gOiBudWxsOwoJCX0KCQlmb3IgKGk9MDsgaSA8IG4ubGVuZ3RoOyBpKyspIHsKCQkJaWYgKHRoaXMuaXMobltpXSwgZmlsdGVyKSkgewoJCQkJcmV0LnB1c2gobltpXSk7CgkJCX0KCQl9OwoJCXJldHVybiByZXQ7Cgl9CgkKCQoJLyoqCgkgKiDQktC+0LLRgNCw0YnQsNC10YIg0LzQsNGB0YHQuNCyINGA0L7QtNC40YLQtdC70YzRgdC60LjRhSDRjdC70LXQvNC10L3RgtC+0LIsINC+0YLQstC10YfQsNGO0YnQuNGFINGD0YHQu9C+0LLQuNGP0Lwg0L/QvtC40YHQutCwCgkgKgoJICogQHBhcmFtICBET01FbGVtZW50ICAgICAgbiAg0L3QvtC00LAsINGA0L7QtNC40YLQtdC70LXQuSwg0LrQvtGC0L7RgNC+0Lkg0LjRidC10LwKCSAqIEBwYXJhbSAgUmVnRXhwfHxTdHJpbmcgIGZpbHRlciAgINGE0LjQu9GM0YLRgCDRg9GB0LvQvtCy0LjRjyDQv9C+0LjRgdC60LAgKFJlZ0V4cCDQuNC70Lgg0LjQvNGPINC60LvRjtGH0LAgdGhpcy5yZWdFeHAg0LjQu9C4ICopCgkgKiBAcmV0dXJuIEFycmF5CgkgKiovCgl0aGlzLnBhcmVudHMgPSBmdW5jdGlvbihuLCBmaWx0ZXIpIHsKCQl2YXIgcmV0ID0gW107CgoJCXdoaWxlIChuICYmIChuID0gbi5wYXJlbnROb2RlKSAmJiBuLm5vZGVOYW1lICE9ICdCT0RZJyAmJiBuLm5vZGVOYW1lICE9ICdIVE1MJykgewoJCQlpZiAodGhpcy5pcyhuLCBmaWx0ZXIpKSB7CgkJCQlyZXQucHVzaChuKTsKCQkJfQoJCX0KCQlyZXR1cm4gcmV0OwoJfQoJCgkvKioKCSAqINCS0L7QstGA0LDRidCw0LXRgiDQsdC70LjQttCw0LnRiNC40Lkg0YDQvtC00LjRgtC10LvRjNGB0LrQuNC5INGN0Lst0YIsINC+0YLQstC10YfQsNGO0YnQuNC5INGD0YHQu9C+0LLQuNGP0Lwg0L/QvtC40YHQutCwCgkgKgoJICogQHBhcmFtICBET01FbGVtZW50ICAgICBuICDQvdC+0LTQsCwg0YDQvtC00LjRgtC10LvRjywg0LrQvtGC0L7RgNC+0Lkg0LjRidC10LwKCSAqIEBwYXJhbSAgUmVnRXhwfHxTdHJpbmcgZiAgINGE0LjQu9GM0YLRgCDRg9GB0LvQvtCy0LjRjyDQv9C+0LjRgdC60LAgKFJlZ0V4cCDQuNC70Lgg0LjQvNGPINC60LvRjtGH0LAgdGhpcy5yZWdFeHAg0LjQu9C4ICopCgkgKiBAcmV0dXJuIERPTUVsZW1lbnQKCSAqKi8KCXRoaXMucGFyZW50ID0gZnVuY3Rpb24obiwgZikgeyAKCQlyZXR1cm4gdGhpcy5wYXJlbnRzKG4sIGYpWzBdIHx8IG51bGw7IAoJfQoJCgkvKioKCSAqINCS0L7QstGA0LDRidCw0LXRgiDQuNC70Lgg0YHQsNC80YMg0L3QvtC00YMg0LjQu9C4INC10LUg0LHQu9C40LbQsNC50YjQtdCz0L4g0YDQvtC00LjRgtC10LvRjywg0LXRgdC70Lgg0LLRi9C/0L7Qu9C90Y/RjtGC0YHRjyDRg9GB0LvQvtCy0LjRjyBzZiDQtNC70Y8g0YHQsNC80L7QuSDQvdC+0LTRiyDQuNC70LggcGYg0LTQu9GPINGA0L7QtNC40YLQtdC70Y8KCSAqCgkgKiBAcGFyYW0gIERPTUVsZW1lbnQgICAgIG4gINC90L7QtNCwLCDRgNC+0LTQuNGC0LXQu9GPLCDQutC+0YLQvtGA0L7QuSDQuNGJ0LXQvAoJICogQHBhcmFtICBSZWdFeHB8fFN0cmluZyBzZiAgINGE0LjQu9GM0YLRgCDRg9GB0LvQvtCy0LjRjyDQtNC70Y8g0YHQsNC80L7QuSDQvdC+0LTRiwoJKiBAcGFyYW0gIFJlZ0V4cHx8U3RyaW5nICBwZiAgINGE0LjQu9GM0YLRgCDRg9GB0LvQvtCy0LjRjyDQtNC70Y8g0YDQvtC00LjRgtC10LvRjwoJICogQHJldHVybiBET01FbGVtZW50CgkgKiovCgl0aGlzLnNlbGZPclBhcmVudCA9IGZ1bmN0aW9uKG4sIHNmLCBwZikgewoJCXJldHVybiB0aGlzLmlzKG4sIHNmKSA/IG4gOiB0aGlzLnBhcmVudChuLCBwZnx8c2YpOwoJfQoJCgkvKioKCSAqINCS0L7QstGA0LDRidCw0LXRgiDRgNC+0LTQuNGC0LXQu9GM0YHQutGD0Y4g0L3QvtC00YMgLSDRgdGB0YvQu9C60YMKCSAqCgkgKiBAcGFyYW0gIEVsZW1lbnQgbiAg0L3QvtC00LAKCSAqIEByZXR1cm4gRWxlbWVudAoJICoqLwoJdGhpcy5zZWxmT3JQYXJlbnRMaW5rID0gZnVuY3Rpb24obikgewoJCW4gPSB0aGlzLnNlbGZPclBhcmVudChuLCAvXkEkLyk7CgkJcmV0dXJuIG4gJiYgbi5ocmVmID8gbiA6IG51bGw7Cgl9CgoJLyoqCgkgKiDQktC+0LLRgNCw0YnQsNC10YIgVFJVRSwg0LXRgdC70Lgg0L3QvtC00LAgLSAgYW5jaG9yCgkgKgoJICogQHBhcmFtICBFbGVtZW50IG4gINC90L7QtNCwCgkgKiBAcmV0dXJuIGJvb2wKCSAqKi8KCXRoaXMuc2VsZk9yUGFyZW50QW5jaG9yID0gZnVuY3Rpb24obikgewoJCW4gPSB0aGlzLnNlbGZPclBhcmVudChuLCAvXkEkLyk7CgkJcmV0dXJuIG4gJiYgIW4uaHJlZiAmJiBuLm5hbWUgPyBuIDogbnVsbDsKCX0KCgkvKioKCSAqINCS0L7QstGA0LDRidCw0LXRgiDQvNCw0YHRgdC40LIg0LTQvtGH0LXRgNC90LjRhSDRgdGB0YvQu9C+0LoKCSAqCgkgKiBAcGFyYW0gIERPTUVsZW1lbnQgbiAg0L3QvtC00LAKCSAqIEByZXR1cm4gQXJyYXkKCSAqKi8KCXRoaXMuY2hpbGRMaW5rcyA9IGZ1bmN0aW9uKG4pIHsKCQl2YXIgcmVzID0gW107CgkJJCgnYVtocmVmXScsIG4pLmVhY2goZnVuY3Rpb24oKSB7IHJlcy5wdXNoKHRoaXMpOyB9KTsKCQlyZXR1cm4gcmVzOwoJfQoJCgl0aGlzLnNlbGVjdGlvbkhhcyA9IGZ1bmN0aW9uKGYpIHsKCQl2YXIgbiA9IHRoaXMucnRlLnNlbGVjdGlvbi5jbG9uZUNvbnRlbnRzKCksIGk7CgkJaWYgKG4gJiYgbi5jaGlsZE5vZGVzICYmIG4uY2hpbGROb2Rlcy5sZW5ndGgpIHsKCQkJZm9yIChpPTA7IGkgPCBuLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsKCQkJCWlmICh0eXBlb2YoZikgPT0gJ2Z1bmN0aW9uJykgewoJCQkJCWlmIChmKG4uY2hpbGROb2Rlc1tpXSkpIHsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJfSBlbHNlIGlmIChuIGluc3RhbmNlb2YgUmVnRXhwKSB7CgkJCQkJaWYgKGYudGVzdChuLmNoaWxkTm9kZXNbaV0ubm9kZU5hbWUpKSB7CgkJCQkJCXJldHVybiB0cnVlOwoJCQkJCX0KCQkJCX0KCQkJfTsKCQl9CgkJCgkJcmV0dXJuIGZhbHNlOwoJfQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJLyogICAgICAgICAgICAgICAgICAgINCY0LfQvNC10L3QtdC90LjRjyBET00gICAgICAgICAgICAgICAgICAgICAqLwoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJCgkvKioKCSAqINCe0LHQvtGA0LDRh9C40LLQsNC10YIg0L7QtNC90YMg0L3QvtC00YMg0LTRgNGD0LPQvtC5CgkgKgoJICogQHBhcmFtICBET01FbGVtZW50IG4gINC+0LHQvtGA0LDRh9C40LLQsNC10LzQsNGPINC90L7QtNCwCgkgKiBAcGFyYW0gIERPTUVsZW1lbnQgdyAg0L3QvtC00LAg0L7QsdC10YDRgtC60LAg0LjQu9C4INC40LzRjyDRgtC10LPQsAoJICogQHJldHVybiBET01FbGVtZW50CgkgKiovCgl0aGlzLndyYXAgPSBmdW5jdGlvbihuLCB3KSB7CgkJbiA9ICQuaXNBcnJheShuKSA/IG4gOiBbbl07CgkJdyA9IHcubm9kZU5hbWUgPyB3IDogdGhpcy5jcmVhdGUodyk7CgkJCgkJaWYgKG5bMF0gJiYgblswXS5ub2RlVHlwZSAmJiBuWzBdLnBhcmVudE5vZGUpIHsKCQkJdyA9IG5bMF0ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodywgblswXSk7CgkJCSQobikuZWFjaChmdW5jdGlvbigpIHsKCQkJCWlmICh0aGlzIT13KSB7CgkJCQkJdy5hcHBlbmRDaGlsZCh0aGlzKTsKCQkJCX0KCQkJfSk7CgkJfQoJCQoJCXJldHVybiB3OwoJfQoJCgkvKioKCSAqIFJlcGxhY2Ugbm9kZSB3aXRoIGl0cyBjb250ZW50cwoJICoKCSAqIEBwYXJhbSAgRE9NRWxlbWVudCBuIG5vZGUKCSAqIEByZXR1cm4gdm9pZAoJICoqLwoJdGhpcy51bndyYXAgPSBmdW5jdGlvbihuKSB7CgkJd2hpbGUgKG4uZmlyc3RDaGlsZCkgewoJCQluLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG4uZmlyc3RDaGlsZCwgbik7CgkJfQoJCW4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKTsKCX0KCQoJLyoqCgkgKiDQntCx0L7RgNCw0YfQuNCy0LDQtdGCINCy0YHQtSDRgdC+0LTQtdGA0LbQuNC80L7QtSDQvdC+0LTRiwoJICoKCSAqIEBwYXJhbSAgRE9NRWxlbWVudCBuICDQvtCx0L7RgNCw0YfQuNCy0LDQtdC80LDRjyDQvdC+0LTQsAoJICogQHBhcmFtICBET01FbGVtZW50IHcgINC90L7QtNCwINC+0LHQtdGA0YLQutCwINC40LvQuCDQuNC80Y8g0YLQtdCz0LAKCSAqIEByZXR1cm4gRE9NRWxlbWVudAoJICoqLwoJdGhpcy53cmFwQ29udGVudHMgPSBmdW5jdGlvbihuLCB3KSB7CgkJdyA9IHcubm9kZU5hbWUgPyB3IDogdGhpcy5jcmVhdGUodyk7CgkJZm9yICh2YXIgaT0wOyBpIDwgbi5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7CgkJCXcuYXBwZW5kQ2hpbGQobi5jaGlsZE5vZGVzW2ldKTsKCQl9OwoJCW4uYXBwZW5kQ2hpbGQodyk7CgkJcmV0dXJuIHc7Cgl9CgkKCXRoaXMuY2xlYW5Ob2RlID0gZnVuY3Rpb24obikgewoKCQlpZiAobi5ub2RlVHlwZSAhPSAxKSB7CgkJCXJldHVybjsKCQl9CgkJaWYgKC9eKFB8TEkpJC8udGVzdChuLm5vZGVOYW1lKSAmJiAobCA9IHRoaXMuZmluZExhc3ROb3RFbXB0eShuKSkgJiYgbC5ub2RlTmFtZSA9PSAnQlInKSB7CgkJCSQobCkucmVtb3ZlKCk7CgkJfQoJCSRuID0gJChuKTsKCQkkbi5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKSB7CgkJCXRoaXMuY2xlYW5Ob2RlKHRoaXMpOwoJCX0pOwoJCWlmIChuLm5vZGVOYW1lICE9ICdCT0RZJyAmJiAhL14oVEFCTEV8VFJ8VEQpJC8udGVzdChuKSAmJiB0aGlzLmlzRW1wdHkobikpIHsKCQkJcmV0dXJuICRuLnJlbW92ZSgpOwoJCX0KCQlpZiAoJG4uYXR0cignc3R5bGUnKSA9PT0gJycpIHsKCQkJJG4ucmVtb3ZlQXR0cignc3R5bGUnKTsKCQl9CgkJaWYgKHRoaXMucnRlLmJyb3dzZXIuc2FmYXJpICYmICRuLmhhc0NsYXNzKCdBcHBsZS1zcGFuJykpIHsKCQkJJG4ucmVtb3ZlQ2xhc3MoJ0FwcGxlLXNwYW4nKTsKCQl9CgkJaWYgKG4ubm9kZU5hbWUgPT0gJ1NQQU4nICYmICEkbi5hdHRyKCdzdHlsZScpICYmICEkbi5hdHRyKCdjbGFzcycpICYmICEkbi5hdHRyKCdpZCcpKSB7CgkJCSRuLnJlcGxhY2VXaXRoKCRuLmh0bWwoKSk7CgkJfQoJfQoJCgl0aGlzLmNsZWFuQ2hpbGROb2RlcyA9IGZ1bmN0aW9uKG4pIHsKCQl2YXIgY21kID0gdGhpcy5jbGVhbk5vZGU7CgkJJChuKS5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKSB7IGNtZCh0aGlzKTsgfSk7Cgl9CgkKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCS8qICAgICAgICAgICAgICAgICAgICAgICDQotCw0LHQu9C40YbRiyAgICAgICAgICAgICAgICAgICAgICAgICovCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgkKCXRoaXMudGFibGVNYXRyaXggPSBmdW5jdGlvbihuKSB7CgkJdmFyIG14ID0gW107CgkJaWYgKG4gJiYgbi5ub2RlTmFtZSA9PSAnVEFCTEUnKSB7CgkJCXZhciBtYXggPSAwOwoJCQlmdW5jdGlvbiBfcG9zKHIpIHsKCQkJCWZvciAodmFyIGk9MDsgaTw9bWF4OyBpKyspIHsKCQkJCQlpZiAoIW14W3JdW2ldKSB7CgkJCQkJCXJldHVybiBpOwoJCQkJCX0KCQkJCX07CgkJCX0KCQkJCgkJCSQobikuZmluZCgndHInKS5lYWNoKGZ1bmN0aW9uKHIpIHsKCQkJCWlmICghJC5pc0FycmF5KG14W3JdKSkgewoJCQkJCW14W3JdID0gW107CgkJCQl9CgkJCQkKCQkJCSQodGhpcykuY2hpbGRyZW4oJ3RkLHRoJykuZWFjaChmdW5jdGlvbigpIHsKCQkJCQl2YXIgdyA9IHBhcnNlSW50KCQodGhpcykuYXR0cignY29sc3BhbicpfHwxKTsKCQkJCQl2YXIgaCA9IHBhcnNlSW50KCQodGhpcykuYXR0cigncm93c3BhbicpfHwxKTsKCQkJCQl2YXIgaSA9IF9wb3Mocik7CgkJCQkJZm9yICh2YXIgeT0wOyB5PGg7IHkrKykgewoJCQkJCQlmb3IgKHZhciB4PTA7IHg8dzsgeCsrKSB7CgkJCQkJCQl2YXIgX3kgPSByK3k7CgkJCQkJCQlpZiAoISQuaXNBcnJheShteFtfeV0pKSB7CgkJCQkJCQkJbXhbX3ldID0gW107CgkJCQkJCQl9CgkJCQkJCQl2YXIgZCA9IHg9PTAgJiYgeT09MCA/IHRoaXMgOiAoeT09MCA/IHggOiAiLSIpOwoJCQkJCQkJbXhbX3ldW2kreF0gPSBkOwoJCQkJCQl9CgkJCQkJfTsKCQkJCQltYXg9IE1hdGgubWF4KG1heCwgbXhbcl0ubGVuZ3RoKTsKCQkJCX0pOwoJCQl9KTsKCQl9CgkJcmV0dXJuIG14OwoJfQoJCgl0aGlzLmluZGV4ZXNPZkNlbGwgPSBmdW5jdGlvbihuLCB0Ym0pIHsKCQlmb3IgKHZhciBybnVtPTA7IHJudW0gPCB0Ym0ubGVuZ3RoOyBybnVtKyspIHsKCQkJZm9yICh2YXIgY251bT0wOyBjbnVtIDwgdGJtW3JudW1dLmxlbmd0aDsgY251bSsrKSB7CgkJCQlpZiAodGJtW3JudW1dW2NudW1dID09IG4pIHsKCQkJCQlyZXR1cm4gW3JudW0sIGNudW1dOwoJCQkJfQoJCQkJCgkJCX07CgkJfTsKCX0KCQoJdGhpcy5maXhUYWJsZSA9IGZ1bmN0aW9uKG4pIHsKCQlpZiAobiAmJiBuLm5vZGVOYW1lID09ICdUQUJMRScpIHsKCQkJdmFyIHRiID0gJChuKTsKCQkJLy90Yi5maW5kKCd0cjplbXB0eScpLnJlbW92ZSgpOwoJCQl2YXIgbXggPSB0aGlzLnRhYmxlTWF0cml4KG4pOwoJCQl2YXIgeCAgPSAwOwoJCQkkLmVhY2gobXgsIGZ1bmN0aW9uKCkgewoJCQkJeCA9IE1hdGgubWF4KHgsIHRoaXMubGVuZ3RoKTsKCQkJfSk7CgkJCWlmICh4PT0wKSB7CgkJCQlyZXR1cm4gdGIucmVtb3ZlKCk7CgkJCX0KCQkJLy8gZm9yICh2YXIgaT0wOyBpPG14Lmxlbmd0aDsgaSsrKSB7CgkJCS8vIAl0aGlzLnJ0ZS5sb2cobXhbaV0pOwoJCQkvLyB9CgkJCQoJCQlmb3IgKHZhciByPTA7IHI8bXgubGVuZ3RoOyByKyspIHsKCQkJCXZhciBsID0gbXhbcl0ubGVuZ3RoOwoJCQkJLy90aGlzLnJ0ZS5sb2cocisnIDogJytsKQoJCQkJCgkJCQlpZiAobD09MCkgewoJCQkJCS8vdGhpcy5ydGUubG9nKCdyZW1vdmU6ICcrdGIuZmluZCgndHInKS5lcShyKSkKCQkJCQl0Yi5maW5kKCd0cicpLmVxKHIpLnJlbW92ZSgpOwovLwkJCQkJdGIuZmluZCgndHInKS5lcShyKS5hcHBlbmQoJzx0ZD5yZW1vdmU8L3RkPicpCgkJCQl9IGVsc2UgaWYgKGw8eCkgewoJCQkJCXZhciBjbnQgPSB4LWw7CgkJCQkJdmFyIHJvdyA9IHRiLmZpbmQoJ3RyJykuZXEocik7CgkJCQkJZm9yIChpPTA7IGk8Y250OyBpKyspIHsKCQkJCQkJcm93LmFwcGVuZCgnPHRkPiZuYnNwOzwvdGQ+Jyk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCQoJCX0KCX0KCQoJdGhpcy50YWJsZUNvbHVtbiA9IGZ1bmN0aW9uKG4sIGV4dCwgZml4KSB7CgkJbiAgICAgID0gdGhpcy5zZWxmT3JQYXJlbnQobiwgL15URHxUSCQvKTsKCQl2YXIgdGIgPSB0aGlzLnNlbGZPclBhcmVudChuLCAvXlRBQkxFJC8pOwoJCXJldCAgICA9IFtdOwoJCWluZm8gICA9IHtvZmZzZXQgOiBbXSwgZGVsdGEgOiBbXX07CgkJaWYgKG4gJiYgdGIpIHsKCQkJZml4ICYmIHRoaXMuZml4VGFibGUodGIpOwoJCQl2YXIgbXggPSB0aGlzLnRhYmxlTWF0cml4KHRiKTsKCQkJdmFyIF9zID0gZmFsc2U7CgkJCXZhciB4OwoJCQlmb3IgKHZhciByPTA7IHI8bXgubGVuZ3RoOyByKyspIHsKCQkJCWZvciAodmFyIF94PTA7IF94PG14W3JdLmxlbmd0aDsgX3grKykgewoJCQkJCWlmIChteFtyXVtfeF0gPT0gbikgewoJCQkJCQl4ID0gX3g7CgkJCQkJCV9zID0gdHJ1ZTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKF9zKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJCgkJCS8vIHRoaXMucnRlLmxvZygnbWF0cml4Jyk7CgkJCS8vIGZvciAodmFyIGk9MDsgaTxteC5sZW5ndGg7IGkrKykgewoJCQkvLyAJdGhpcy5ydGUubG9nKG14W2ldKTsKCQkJLy8gfQoJCQlpZiAoeD49MCkgewoJCQkJZm9yKHZhciByPTA7IHI8bXgubGVuZ3RoOyByKyspIHsKCQkJCQl2YXIgdG1wID0gbXhbcl1beF18fG51bGw7CgkJCQkJaWYgKHRtcCkgewoJCQkJCQlpZiAodG1wLm5vZGVOYW1lKSB7CgkJCQkJCQlyZXQucHVzaCh0bXApOwoJCQkJCQkJaWYgKGV4dCkgewoJCQkJCQkJCWluZm8uZGVsdGEucHVzaCgwKTsKCQkJCQkJCQlpbmZvLm9mZnNldC5wdXNoKHgpOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJdmFyIGQgPSBwYXJzZUludCh0bXApOwoJCQkJCQkJaWYgKCFpc05hTihkKSAmJiBteFtyXVt4LWRdICYmIG14W3JdW3gtZF0ubm9kZU5hbWUpIHsKCQkJCQkJCQlyZXQucHVzaChteFtyXVt4LWRdKTsKCQkJCQkJCQlpZiAoZXh0KSB7CgkJCQkJCQkJCWluZm8uZGVsdGEucHVzaChkKTsKCQkJCQkJCQkJaW5mby5vZmZzZXQucHVzaCh4KTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuICFleHQgPyByZXQgOiB7Y29sdW1uIDogcmV0LCBpbmZvIDogaW5mb307Cgl9Cn0KCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgkvKioKCSAqIEBjbGFzcyBGaWx0ZXIgLSBjbGVhbiBlZGl0b3IgY29udGVudAoJICogQHBhcmFtIGVsUlRFIGVkaXRvciBpbnN0YW5jZQoJICogQGF1dGhvciBEbWl0cnkgKGRpbykgTGV2YXNob3YsIGRpb0BzdGQ0Mi5ydQoJICovCgllbFJURS5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24ocnRlKSB7CgkJdmFyIHNlbGYgPSB0aGlzLAoJCQluID0gJCgnPHNwYW4vPicpLmFkZENsYXNzKCdlbHJ0ZXRlc3R1cmwnKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KVswXTsKCQkvLyBtZWRpYSByZXBsYWNlbWVudCBpbWFnZSBiYXNlIHVybAoJCXRoaXMudXJsID0gKHR5cGVvZihuLmN1cnJlbnRTdHlsZSApIT0gInVuZGVmaW5lZCIgPyBuLmN1cnJlbnRTdHlsZVsnYmFja2dyb3VuZEltYWdlJ10gOiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG4sIG51bGwpWydiYWNrZ3JvdW5kSW1hZ2UnXSkucmVwbGFjZSgvXnVybFwoKFsnIl0/KShbXHNcU10rXC8pW1xzXFNdK1wxXCkkL2ksICIkMiIpOwoJCSQobikucmVtb3ZlKCk7CgoJCXRoaXMucnRlID0gcnRlOwoJCS8vIGZsYWcgLSByZXR1cm4geGh0bWwgdGFncz8KCQl0aGlzLnhodG1sID0gL3hodG1sL2kudGVzdChydGUub3B0aW9ucy5kb2N0eXBlKTsKCQkvLyBib29sZWFuIGF0dHJpYnV0ZXMKCQl0aGlzLmJvb2xBdHRycyA9IHJ0ZS51dGlscy5tYWtlT2JqZWN0KCdjaGVja2VkLGNvbXBhY3QsZGVjbGFyZSxkZWZlcixkaXNhYmxlZCxpc21hcCxtdWx0aXBsZSxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3dyYXAscmVhZG9ubHksc2VsZWN0ZWQnLnNwbGl0KCcsJykpOwoJCS8vIHRhZyByZWdleHAKCQl0aGlzLnRhZ1JlZ0V4cCA9IC88KFwvPykoW1x3Ol0rKSgoPzpccytcdysoPzpccyo9XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W14+XHNdKykpPykqKVxzKlwvPz4vZzsKCQkvLyBvcGVuZWQgdGFnIHJlZ2V4cAoJCXRoaXMub3BlblRhZ1JlZ0V4cCA9IC88KFtcdzpdKykoKD86XHMrXHcrKD86XHMqPVxzKig/Oig/OiJbXiJdKiIpfCg/OidbXiddKicpfFtePlxzXSspKT8pKilccypcLz8+L2c7CgkJLy8gYXR0cmlidXRlcyByZWdleHAKCQl0aGlzLmF0dHJSZWdFeHAgPSAvKFx3KykoPzpccyo9XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W15cc10rKSk/L2c7CgkJLy8gc2NyaXB0IHRhZyByZWdleHAKCQl0aGlzLnNjcmlwdFJlZ0V4cCA9IC88c2NyaXB0KFtePl0qKT4oW1xzXFNdKj8pPFwvc2NyaXB0Pi9naTsKCQkvLyBzdHlsZSB0YWcgcmVnZXhwCgkJdGhpcy5zdHlsZVJlZ0V4cCA9IC8oPHN0eWxlKFtePl0qKT5bXHNcU10qPzxcL3N0eWxlPikvZ2k7CgkJLy8gbGluayB0YWcgcmVnZXhwCgkJdGhpcy5saW5rUmVnRXhwID0gLyg8bGluayhbXj5dKyk+KS9naTsKCQkvLyBjZGF0YSByZWdleHAKCQl0aGlzLmNkYXRhUmVnRXhwID0gLzwhXFtDREFUQVxbKFtcc1xTXSspXF1cXT4vZzsKCQkvLyBvYmplY3QgdGFnIHJlZ2V4cAoJCXRoaXMub2JqUmVnRXhwID0gLzxvYmplY3QoW14+XSopPihbXHNcU10qPyk8XC9vYmplY3Q+L2dpOwoJCS8vIGVtYmVkIHRhZyByZWdleHAKCQl0aGlzLmVtYlJlZ0V4cCA9IC88KGVtYmVkKSgoPzpccytcdysoPzpccyo9XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W14+XHNdKykpPykqKVxzKj4vZ2k7CgkJLy8gcGFyYW0gdGFnIHJlZ2V4cAoJCXRoaXMucGFyYW1SZWdFeHAgPSAvPChwYXJhbSkoKD86XHMrXHcrKD86XHMqPVxzKig/Oig/OiJbXiJdKiIpfCg/OidbXiddKicpfFtePlxzXSspKT8pKilccyo+L2dpOwoJCXRoaXMudmltZW9SZWdFeHAgPSAvPChpZnJhbWUpXHMrKFtePl0qc3JjXHMqPVxzKiJodHRwOlwvXC9bXiJdK3ZpbWVvXC5jb21cL1x3K1tePl0qKT4oW1xzXFNdKj8pPFwvaWZyYW1lPi9naTsKCQkvLyB5YW5kZXggbWFwcyByZWdleHAKCQl0aGlzLnlNYXBzUmVnRXhwID0gLzxkaXZccysoW14+XSppZFxzKj1ccyooJ3wiKT9ZTWFwc0lEW14+XSopPi9naTsKCQkvLyBnb29nbGUgbWFwcyByZWdleHAKCQl0aGlzLmdNYXBzUmVnRXhwID0gLzxpZnJhbWVccysoW14+XSpzcmNccyo9XHMqImh0dHA6XC9cL21hcHNcLmdvb2dsZVwuXHcrW14+XSopPihbXHNcU10qPyk8XC9pZnJhbWU+L2dpOwoJCS8vIHZpZGVvIGhvc3RpbmdzIHVybCByZWdleHAKCQl0aGlzLnZpZGVvSG9zdFJlZ0V4cCA9IC9eKGh0dHA6XC9cL1tcd1wuXSopPyh5b3V0dWJlfHZpbWVvfHJ1dHViZSkuKi9pOwoJCS8vIGVscnRlIHNlcnZpY2VzIGNsYXNzZXMgcmVnZXhwCgkJdGhpcy5zZXJ2aWNlQ2xhc3NSZWdFeHAgPSAvPChcdyspKFtePl0qY2xhc3Nccyo9XHMqIltePl0qZWxydGUtW14+XSopPlxzKig8XC9cMT4pPy9naTsKCQl0aGlzLnBhZ2VicmVha1JlZ0V4cCA9IC88KFx3KykoW14+XSpzdHlsZVxzKj1ccyoiW14+XSpwYWdlLWJyZWFrW14+XSopPlxzKig8XC9cMT4pPy9naTsKCQkKCQl0aGlzLnBiUmVnRXhwID0gbmV3IFJlZ0V4cCgnPCEtLSBwYWdlYnJlYWsgLS0+JywgJ2dpJyk7CgkJLy8gYWxsb3dlZCB0YWdzCgkJdGhpcy5hbGxvd1RhZ3MgPSBydGUub3B0aW9ucy5hbGxvd1RhZ3MubGVuZ3RoID8gcnRlLnV0aWxzLm1ha2VPYmplY3QocnRlLm9wdGlvbnMuYWxsb3dUYWdzKSA6IG51bGw7CgkJLy8gZGVuaWVkIHRhZ3MKCQl0aGlzLmRlbnlUYWdzID0gcnRlLm9wdGlvbnMuZGVueVRhZ3MubGVuZ3RoID8gcnRlLnV0aWxzLm1ha2VPYmplY3QocnRlLm9wdGlvbnMuZGVueVRhZ3MpIDogbnVsbDsKCQkvLyBkZW55IGF0dHJpYnV0ZXMKCQl0aGlzLmRlbnlBdHRyID0gcnRlLm9wdGlvbnMuZGVueUF0dHIgPyBydGUudXRpbHMubWFrZU9iamVjdChydGUub3B0aW9ucy5kZW55QXR0cikgOiBudWxsOwoJCS8vIGRlbnkgYXR0cmlidXRlcyBmb3IgcGFzdGVkIGh0bWwKCQl0aGlzLnBhc3RlRGVueUF0dHIgPSBydGUub3B0aW9ucy5wYXN0ZURlbnlBdHRyID8gcnRlLnV0aWxzLm1ha2VPYmplY3QocnRlLm9wdGlvbnMucGFzdGVEZW55QXR0cikgOiBudWxsOwoJCS8vIGZvbnQgc2l6ZXMgdG8gY29udmVydCBzaXplIGF0dHIgaW50byBjc3MgcHJvcGVydHkKCQl0aGlzLmZvbnRTaXplID0gWydtZWRpdW0nLCAneHgtc21hbGwnLCAnc21hbGwnLCAnbWVkaXVtJywnbGFyZ2UnLCd4LWxhcmdlJywneHgtbGFyZ2UnIF07CgkJLy8gZm9udCBmYW1pbGllcyByZWdleHAgdG8gZGV0ZWN0IGZhbWlseSBieSBmb250IG5hbWUKCQl0aGlzLmZvbnRGYW1pbHkgPSB7CgkJCSdzYW5zLXNlcmlmJyA6IC9eKGFyaWFsfHRhaG9tYXx2ZXJkYW5hKSQvaSwKCQkJJ3NlcmlmJyAgICAgIDogL14odGltZXN8dGltZXMgbmV3IHJvbWFuKSQvaSwKCQkJJ21vbm9zcGFjZScgIDogL15jb3VyaWVyJC9pCgkJfQoJCS8vIHNjcmlwdHMgc3RvcmFnZQoJCXRoaXMuc2NyaXB0cyA9IHt9OwoJCS8vIGNhY2hlZCBjaGFpbnMgb2YgcnVsZXMKCQl0aGlzLl9jaGFpbnMgPSB7fTsKCQkKCQkvLyBjYWNoZSBjaGFpbnMKCQkkLmVhY2godGhpcy5jaGFpbnMsIGZ1bmN0aW9uKG4pIHsKCQkJc2VsZi5fY2hhaW5zW25dID0gW107CgkJCSQuZWFjaCh0aGlzLCBmdW5jdGlvbihpLCByKSB7CgkJCQl0eXBlb2Yoc2VsZi5ydWxlc1tyXSkgPT0gJ2Z1bmN0aW9uJyAmJiBzZWxmLl9jaGFpbnNbbl0ucHVzaChzZWxmLnJ1bGVzW3JdKTsKCQkJfSk7CgkJfSk7CgoJCS8qKgoJCSAqIGZpbHRlcmluZyB0aHJvdWdoIHJlcXVpcmVkIGNoYWluCgkJICoKCQkgKiBAcGFyYW0gIFN0cmluZyAgY2hhaW4gbmFtZQoJCSAqIEBwYXJhbSAgU3RyaW5nICBodG1sLWNvZGUKCQkgKiBAcmV0dXJuIFN0cmluZwoJCSAqKi8KCQl0aGlzLnByb2NjZXNzID0gZnVuY3Rpb24oY2hhaW4sIGh0bWwpIHsKCQkJLy8gcmVtb3ZlIHdoaXRlc3BhY2UgYXQgdGhlIGJlZ2luIGFuZCBlbmQKCQkJaHRtbCA9ICQudHJpbShodG1sKS5yZXBsYWNlKC9eXHMqKCZuYnNwOykrL2dpLCAnJykucmVwbGFjZSgvKCZuYnNwO3w8YnJbXj5dKj4pK1xzKiQvZ2ksICcnKTsKCQkJLy8gcGFzcyBodG1sIHRocm91Z2ggY2hhaW4KCQkJJC5lYWNoKHRoaXMuX2NoYWluc1tjaGFpbl18fFtdLCBmdW5jdGlvbigpIHsKCQkJCWh0bWwgPSB0aGlzLmNhbGwoc2VsZiwgaHRtbCk7CgkJCX0pOwoJCQlyZXR1cm4gaHRtbC5yZXBsYWNlKC9cdC9nLCAnICAnKS5yZXBsYWNlKC9cci9nLCAnJykucmVwbGFjZSgvXHMqXG5ccypcbisvZywgIlxuIikrJyAgJzsKCQl9CgkJCgkJLyoqCgkJICogd3JhcHBlciBmb3IgInd5c2l3eWciIGNoYWluIGZpbHRlcmluZwoJCSAqCgkJICogQHBhcmFtICBTdHJpbmcgIAoJCSAqIEByZXR1cm4gU3RyaW5nCgkJICoqLwoJCXRoaXMud3lzaXd5ZyA9IGZ1bmN0aW9uKGh0bWwpIHsKCQkJcmV0dXJuIHRoaXMucHJvY2Nlc3MoJ3d5c2l3eWcnLCBodG1sKTsKCQl9CgkJCgkJLyoqCgkJICogd3JhcHBlciBmb3IgInNvdXJjZSIgY2hhaW4gZmlsdGVyaW5nCgkJICoKCQkgKiBAcGFyYW0gIFN0cmluZyAgCgkJICogQHJldHVybiBTdHJpbmcKCQkgKiovCgkJdGhpcy5zb3VyY2UgPSBmdW5jdGlvbihodG1sKSB7CgkJCXJldHVybiB0aGlzLnByb2NjZXNzKCdzb3VyY2UnLCBodG1sKTsKCQl9CgkJCgkJLyoqCgkJICogd3JhcHBlciBmb3IgInNvdXJjZTJzb3VyY2UiIGNoYWluIGZpbHRlcmluZwoJCSAqCgkJICogQHBhcmFtICBTdHJpbmcgIAoJCSAqIEByZXR1cm4gU3RyaW5nCgkJICoqLwoJCXRoaXMuc291cmNlMnNvdXJjZSA9IGZ1bmN0aW9uKGh0bWwpIHsKCQkJcmV0dXJuIHRoaXMucHJvY2Nlc3MoJ3NvdXJjZTJzb3VyY2UnLCBodG1sKTsKCQl9CgkJCgkJLyoqCgkJICogd3JhcHBlciBmb3IgInd5c2l3eWcyd3lzaXd5ZyIgY2hhaW4gZmlsdGVyaW5nCgkJICoKCQkgKiBAcGFyYW0gIFN0cmluZyAgCgkJICogQHJldHVybiBTdHJpbmcKCQkgKiovCgkJdGhpcy53eXNpd3lnMnd5c2l3eWcgPSBmdW5jdGlvbihodG1sKSB7CgkJCXJldHVybiB0aGlzLnByb2NjZXNzKCd3eXNpd3lnMnd5c2l3eWcnLCBodG1sKTsKCQl9CgkJCgkJLyoqCgkJICogUGFyc2UgYXR0cmlidXRlcyBmcm9tIHN0cmluZyBpbnRvIG9iamVjdAoJCSAqCgkJICogQHBhcmFtICBTdHJpbmcgIHN0cmluZyBvZiBhdHRyaWJ1dGVzICAKCQkgKiBAcmV0dXJuIE9iamVjdAoJCSAqKi8KCQl0aGlzLnBhcnNlQXR0cnMgPSBmdW5jdGlvbihzKSB7CgkJCXZhciBhID0ge30sCgkJCQliID0gdGhpcy5ib29sQXR0cnMsCgkJCQltID0gcy5tYXRjaCh0aGlzLmF0dHJSZWdFeHApLAoJCQkJdCwgbiwgdjsKCgkJCW0gJiYgJC5lYWNoKG0sIGZ1bmN0aW9uKGksIHMpIHsKCQkJCXQgPSBzLnNwbGl0KCc9Jyk7CgkJCQluID0gJC50cmltKHRbMF0pLnRvTG93ZXJDYXNlKCk7CgkJCQkKCQkJCWlmICh0Lmxlbmd0aD4yKSB7CgkJCQkJdC5zaGlmdCgpOwoJCQkJCXYgPSB0LmpvaW4oJz0nKTsKCQkJCX0gZWxzZSB7CgkJCQkJdiA9IGJbbl0gfHx0WzFdfHwnJzsKCQkJCX0KCQkJCWFbbl0gPSAkLnRyaW0odikucmVwbGFjZSgvXignfCIpKC4qKShcMSkkLywgIiQyIik7CgkJCX0pOwoKCQkJYS5zdHlsZSA9IHRoaXMucnRlLnV0aWxzLnBhcnNlU3R5bGUoYS5zdHlsZSk7CgkJCWFbJ2NsYXNzJ10gPSB0aGlzLnJ0ZS51dGlscy5wYXJzZUNsYXNzKGFbJ2NsYXNzJ118fCcnKQoJCQlyZXR1cm4gYTsKCQl9CgkJCgkJLyoqCgkJICogUmVzdG9yZSBhdHRyaWJ1dGVzIHN0cmluZyBmcm9tIGhhc2gKCQkgKgoJCSAqIEBwYXJhbSAgT2JqZWN0ICBhdHRyaWJ1dGVzIGhhc2gKCQkgKiBAcmV0dXJuIFN0cmluZwoJCSAqKi8KCQl0aGlzLnNlcmlhbGl6ZUF0dHJzID0gZnVuY3Rpb24oYSwgYykgewoJCQl2YXIgcyA9IFtdLCBzZWxmID0gdGhpczsKCgkJCSQuZWFjaChhLCBmdW5jdGlvbihuLCB2KSB7CgkJCQlpZiAobj09J3N0eWxlJykgewoJCQkJCXYgPSBzZWxmLnJ0ZS51dGlscy5zZXJpYWxpemVTdHlsZSh2LCBjKTsKCQkJCX0gZWxzZSBpZiAobj09J2NsYXNzJykgewoJCQkJCXYgPSBzZWxmLnJ0ZS51dGlscy5zZXJpYWxpemVDbGFzcyh2KTsKCQkJCX0gCgkJCQl2ICYmIHMucHVzaChuKyc9IicrdisnIicpOwoJCQl9KTsKCQkJcmV0dXJuIHMuam9pbignICcpOwoJCX0KCQkKCQkvKioKCQkgKiBSZW1vdmUvcmVwbGFjZSBkZW5pZWQgYXR0cmlidXRlcy9zdHlsZSBwcm9wZXJ0aWVzCgkJICoKCQkgKiBAcGFyYW0gIE9iamVjdCAgYXR0cmlidXRlcyBoYXNoCgkJICogQHBhcmFtICBTdHJpbmcgIHRhZyBuYW1lIHRvIHdpY2ggYXR0cnMgYmVsb25ncyAKCQkgKiBAcmV0dXJuIE9iamVjdAoJCSAqKi8KCQl0aGlzLmNsZWFuQXR0cnMgPSBmdW5jdGlvbihhLCB0KSB7CgkJCXZhciBzZWxmID0gdGhpcywgcmEgPSB0aGlzLnJlcGxhY2VBdHRyczsKCgkJCS8vIHJlbW92ZSBzYWZhcmkgYW5kIG1zbyBjbGFzc2VzCgkJCSQuZWFjaChhWydjbGFzcyddLCBmdW5jdGlvbihuKSB7CgkJCQkvXihBcHBsZS1zdHlsZS1zcGFufG1zb1x3KykkL2kudGVzdChuKSAmJiBkZWxldGUgYVsnY2xhc3MnXVtuXTsKCQkJfSk7CgoJCQlmdW5jdGlvbiB2YWx1ZSh2KSB7CgkJCQlyZXR1cm4gdisoL1xkJC8udGVzdCh2KSA/ICdweCcgOiAnJyk7CgkJCX0KCgkJCSQuZWFjaChhLCBmdW5jdGlvbihuLCB2KSB7CgkJCQkvLyByZXBsYWNlIHJlcXVpcmVkIGF0dHJzIHdpdGggY3NzCgkJCQlyYVtuXSAmJiByYVtuXS5jYWxsKHNlbGYsIGEsIHQpOwoJCQkJLy8gcmVtb3ZlL2ZpeCBtc28gc3R5bGVzCgkJCQlpZiAobiA9PSAnc3R5bGUnKSB7CgkJCQkJJC5lYWNoKHYsIGZ1bmN0aW9uKHNuLCBzdikgewoJCQkJCQlzd2l0Y2ggKHNuKSB7CgkJCQkJCQljYXNlICJtc28tcGFkZGluZy1hbHQiOgoJCQkJCQkJY2FzZSAibXNvLXBhZGRpbmctdG9wLWFsdCI6CgkJCQkJCQljYXNlICJtc28tcGFkZGluZy1yaWdodC1hbHQiOgoJCQkJCQkJY2FzZSAibXNvLXBhZGRpbmctYm90dG9tLWFsdCI6CgkJCQkJCQljYXNlICJtc28tcGFkZGluZy1sZWZ0LWFsdCI6CgkJCQkJCQljYXNlICJtc28tbWFyZ2luLWFsdCI6CgkJCQkJCQljYXNlICJtc28tbWFyZ2luLXRvcC1hbHQiOgoJCQkJCQkJY2FzZSAibXNvLW1hcmdpbi1yaWdodC1hbHQiOgoJCQkJCQkJY2FzZSAibXNvLW1hcmdpbi1ib3R0b20tYWx0IjoKCQkJCQkJCWNhc2UgIm1zby1tYXJnaW4tbGVmdC1hbHQiOgoJCQkJCQkJY2FzZSAibXNvLXRhYmxlLWxheW91dC1hbHQiOgoJCQkJCQkJY2FzZSAibXNvLWhlaWdodCI6CgkJCQkJCQljYXNlICJtc28td2lkdGgiOgoJCQkJCQkJY2FzZSAibXNvLXZlcnRpY2FsLWFsaWduLWFsdCI6CgkJCQkJCQkJYS5zdHlsZVtzbi5yZXBsYWNlKC9ebXNvLXwtYWx0JC9nLCAnJyldID0gdmFsdWUoc3YpOwoJCQkJCQkJCWRlbGV0ZSBhLnN0eWxlW3NuXTsKCQkJCQkJCQlicmVhazsKCgkJCQkJCQljYXNlICJob3Jpei1hbGlnbiI6CgkJCQkJCQkJYS5zdHlsZVsndGV4dC1hbGlnbiddID0gc3Y7CgkJCQkJCQkJZGVsZXRlIGEuc3R5bGVbc25dOwoJCQkJCQkJCWJyZWFrOwoKCQkJCQkJCWNhc2UgInZlcnQtYWxpZ24iOgoJCQkJCQkJCWEuc3R5bGVbJ3ZlcnRpY2FsLWFsaWduJ10gPSBzdjsKCQkJCQkJCQlkZWxldGUgYS5zdHlsZVtzbl07CgkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJY2FzZSAiZm9udC1jb2xvciI6CgkJCQkJCQljYXNlICJtc28tZm9yZWdyb3VuZCI6CgkJCQkJCQkJYS5zdHlsZS5jb2xvciA9IHN2OwoJCQkJCQkJCWRlbGV0ZSBhLnN0eWxlW3NuXTsKCQkJCQkJCWJyZWFrOwoKCQkJCQkJCWNhc2UgIm1zby1iYWNrZ3JvdW5kIjoKCQkJCQkJCWNhc2UgIm1zby1oaWdobGlnaHQiOgoJCQkJCQkJCWEuc3R5bGUuYmFja2dyb3VuZCA9IHN2OwoJCQkJCQkJCWRlbGV0ZSBhLnN0eWxlW3NuXTsKCQkJCQkJCQlicmVhazsKCgkJCQkJCQljYXNlICJtc28tZGVmYXVsdC1oZWlnaHQiOgoJCQkJCQkJCWEuc3R5bGVbJ21pbi1oZWlnaHQnXSA9IHZhbHVlKHN2KTsKCQkJCQkJCQlkZWxldGUgYS5zdHlsZVtzbl07CgkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJY2FzZSAibXNvLWRlZmF1bHQtd2lkdGgiOgoJCQkJCQkJCWEuc3R5bGVbJ21pbi13aWR0aCddID0gdmFsdWUoc3YpOwoJCQkJCQkJCWRlbGV0ZSBhLnN0eWxlW3NuXTsKCQkJCQkJCQlicmVhazsKCgkJCQkJCQljYXNlICJtc28tcGFkZGluZy1iZXR3ZWVuLWFsdCI6CgkJCQkJCQkJYS5zdHlsZVsnYm9yZGVyLWNvbGxhcHNlJ10gPSAnc2VwYXJhdGUnOwoJCQkJCQkJCWEuc3R5bGVbJ2JvcmRlci1zcGFjaW5nJ10gPSB2YWx1ZShzdik7CgkJCQkJCQkJZGVsZXRlIGEuc3R5bGVbc25dOwoJCQkJCQkJCWJyZWFrOwoKCQkJCQkJCWNhc2UgInRleHQtbGluZS10aHJvdWdoIjoKCQkJCQkJCQlpZiAoc3YubWF0Y2goLyhzaW5nbGV8ZG91YmxlKS9pKSkgewoJCQkJCQkJCQlhLnN0eWxlWyd0ZXh0LWRlY29yYXRpb24nXSA9ICdsaW5lLXRocm91Z2gnOwoJCQkJCQkJCX0KCQkJCQkJCQlkZWxldGUgYS5zdHlsZVtzbl07CgkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJY2FzZSAibXNvLXplcm8taGVpZ2h0IjoKCQkJCQkJCQlpZiAoc3YgPT0gJ3llcycpIHsKCQkJCQkJCQkJYS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwoJCQkJCQkJCX0KCQkJCQkJCQlkZWxldGUgYS5zdHlsZVtzbl07CgkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJY2FzZSAnZm9udC13ZWlnaHQnOgoJCQkJCQkJCWlmIChzdiA9PSA3MDApIHsKCQkJCQkJCQkJYS5zdHlsZVsnZm9udC13ZWlnaHQnXSA9ICdib2xkJzsKCQkJCQkJCQl9CgkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJZGVmYXVsdDoKCQkJCQkJCQlpZiAoc24ubWF0Y2goL14obXNvfGNvbHVtbnxmb250LWVtcGh8bGFuZ3xsYXlvdXR8bGluZS1icmVha3xsaXN0LWltYWdlfG5hdnxwYW5vc2V8cHVuY3R8cm93fHJ1Ynl8c2VwfHNpemV8c3JjfHRhYi18dGFibGUtYm9yZGVyfHRleHQtKD8hYWxpZ258ZGVjb3J8aW5kZW50fHRyYW5zKXx0b3AtYmFyfHZlcnNpb258dm5kfHdvcmQtYnJlYWspLykpIHsKCQkJCQkJCQkJZGVsZXRlIGEuc3R5bGVbc25dCgkJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfSk7CgkJCQl9CgkJCX0pOwoJCQlyZXR1cm4gYTsKCQl9CgkJCgl9CgoJLy8gcnVsZXMgdG8gcmVwbGFjZSB0YWdzCgllbFJURS5wcm90b3R5cGUuZmlsdGVyLnByb3RvdHlwZS5yZXBsYWNlVGFncyA9IHsKCQliICAgICAgICAgOiB7IHRhZyA6ICdzdHJvbmcnIH0sCgkJYmlnICAgICAgIDogeyB0YWcgOiAnc3BhbicsIHN0eWxlIDogeydmb250LXNpemUnIDogJ2xhcmdlJ30gfSwKCQljZW50ZXIgICAgOiB7IHRhZyA6ICdkaXYnLCAgc3R5bGUgOiB7J3RleHQtYWxpZ24nIDogJ2NlbnRlcid9IH0sCgkJaSAgICAgICAgIDogeyB0YWcgOiAnZW0nIH0sCgkJZm9udCAgICAgIDogeyB0YWcgOiAnc3BhbicgfSwKCQlub2JyICAgICAgOiB7IHRhZyA6ICdzcGFuJywgc3R5bGUgOiB7J3doaXRlLXNwYWNlJyA6ICdub3dyYXAnfSB9LAoJCW1lbnUgICAgICA6IHsgdGFnIDogJ3VsJyB9LAoJCXBsYWludGV4dCA6IHsgdGFnIDogJ3ByZScgfSwKCQlzICAgICAgICAgOiB7IHRhZyA6ICdzdHJpa2UnIH0sCgkJc21hbGwgICAgIDogeyB0YWcgOiAnc3BhbicsIHN0eWxlIDogeydmb250LXNpemUnIDogJ3NtYWxsJ319LAoJCXUgICAgICAgICA6IHsgdGFnIDogJ3NwYW4nLCBzdHlsZSA6IHsndGV4dC1kZWNvcmF0aW9uJyA6ICd1bmRlcmxpbmUnfSB9LAoJCXhtcCAgICAgICA6IHsgdGFnIDogJ3ByZScgfQoJfQoJCgkvLyBydWxlcyB0byByZXBsYWNlIGF0dHJpYnV0ZXMKCWVsUlRFLnByb3RvdHlwZS5maWx0ZXIucHJvdG90eXBlLnJlcGxhY2VBdHRycyA9IHsKCQlhbGlnbiA6IGZ1bmN0aW9uKGEsIG4pIHsKCQkJc3dpdGNoIChuKSB7CgkJCQljYXNlICdpbWcnOgoJCQkJCWEuc3R5bGVbYS5hbGlnbi5tYXRjaCgvKGxlZnR8cmlnaHQpLykgPyAnZmxvYXQnIDogJ3ZlcnRpY2FsLWFsaWduJ10gPSBhLmFsaWduOwoJCQkJCWJyZWFrOwoJCQkJCgkJCQljYXNlICd0YWJsZSc6CgkJCQkJaWYgKGEuYWxpZ24gPT0gJ2NlbnRlcicpIHsKCQkJCQkJYS5zdHlsZVsnbWFyZ2luLWxlZnQnXSA9IGEuc3R5bGVbJ21hcmdpbi1yaWdodCddID0gJ2F1dG8nOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWEuc3R5bGVbJ2Zsb2F0J10gPSBhLmFsaWduOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCQkKCQkJCWRlZmF1bHQ6CgkJCQkJYS5zdHlsZVsndGV4dC1hbGlnbiddID0gYS5hbGlnbjsKCQkJfQoJCQlkZWxldGUgYS5hbGlnbjsKCQl9LAoJCWJvcmRlciA6IGZ1bmN0aW9uKGEpIHsKCQkJIWEuc3R5bGVbJ2JvcmRlci13aWR0aCddICYmIChhLnN0eWxlWydib3JkZXItd2lkdGgnXSA9IChwYXJzZUludChhLmJvcmRlcil8fDEpKydweCcpOwoJCQkhYS5zdHlsZVsnYm9yZGVyLXN0eWxlJ10gJiYgKGEuc3R5bGVbJ2JvcmRlci1zdHlsZSddID0gJ3NvbGlkJyk7CgkJCWRlbGV0ZSBhLmJvcmRlcjsKCQl9LAoJCWJvcmRlcmNvbG9yIDogZnVuY3Rpb24oYSkgewoJCQkhYS5zdHlsZVsnYm9yZGVyLWNvbG9yJ10gJiYgKGEuc3R5bGVbJ2JvcmRlci1jb2xvciddID0gYS5ib3JkZXJjb2xvcik7CgkJCWRlbGV0ZSBhLmJvcmRlcmNvbG9yOwoJCX0sCgkJYmFja2dyb3VuZCA6IGZ1bmN0aW9uKGEpIHsKCQkJIWEuc3R5bGVbJ2JhY2tncm91bmQtaW1hZ2UnXSAmJiAoYS5zdHlsZVsnYmFja2dyb3VuZC1pbWFnZSddID0gJ3VybCgnK2EuYmFja2dyb3VuZCsnKScpOwoJCQlkZWxldGUgYS5iYWNrZ3JvdW5kOwoJCX0sCgkJYmdjb2xvciA6IGZ1bmN0aW9uKGEpIHsKCQkJIWEuc3R5bGVbJ2JhY2tncm91bmQtY29sb3InXSAmJiAoYS5zdHlsZVsnYmFja2dyb3VuZC1jb2xvciddID0gYS5iZ2NvbG9yKTsKCQkJZGVsZXRlIGEuYmdjb2xvcjsKCQl9LAoJCWNsZWFyIDogZnVuY3Rpb24oYSkgewoJCQlhLnN0eWxlLmNsZWFyID0gYS5jbGVhciA9PSAnYWxsJyA/ICdib3RoJyA6IGEuY2xlYXI7CgkJCWRlbGV0ZSBhLmNsZWFyOwoJCX0sCgkJY29sb3IgOiBmdW5jdGlvbihhKSB7CgkJCSFhLnN0eWxlLmNvbG9yICYmIChhLnN0eWxlLmNvbG9yID0gYS5jb2xvcik7CgkJCWRlbGV0ZSBhLmNvbG9yOwoJCX0sCgkJZmFjZSA6IGZ1bmN0aW9uKGEpIHsKCQkJdmFyIGYgPSBhLmZhY2UudG9Mb3dlckNhc2UoKTsKCQkJJC5lYWNoKHRoaXMuZm9udEZhbWlseSwgZnVuY3Rpb24obiwgcikgewoJCQkJaWYgKGYubWF0Y2gocikpIHsKCQkJCQlhLnN0eWxlWydmb250LWZhbWlseSddID0gZisnLCcrbjsKCQkJCX0KCQkJfSk7CgkJCWRlbGV0ZSBhLmZhY2U7CgkJfSwKCQloc3BhY2UgOiBmdW5jdGlvbihhLCBuKSB7CgkJCWlmIChuID09ICdpbWcnKSB7CgkJCQl2YXIgdiA9IHBhcnNlSW50KGEuaHNwYWNlKXx8MDsKCQkJCSFhLnN0eWxlWydtYXJnaW4tbGVmdCddICYmIChhLnN0eWxlWydtYXJnaW4tbGVmdCddID0gdisncHgnKTsKCQkJCSFhLnN0eWxlWydtYXJnaW4tcmlnaHQnXSAmJiAoYS5zdHlsZVsnbWFyZ2luLXJpZ2h0J10gPSB2KydweCcpCgkJCQlkZWxldGUgYS5oc3BhY2U7CgkJCX0KCQl9LAoJCXNpemUgOiBmdW5jdGlvbihhLCBuKSB7CgkJCWlmIChuICE9ICdpbnB1dCcpIHsKCQkJCWEuc3R5bGVbJ2ZvbnQtc2l6ZSddID0gdGhpcy5mb250U2l6ZVtwYXJzZUludChhLnNpemUpfHwwXXx8J21lZGl1bSc7CgkJCQlkZWxldGUgYS5zaXplOwoJCQl9CgkJfSwKCQl2YWxpZ24gOiBmdW5jdGlvbihhKSB7CgkJCWlmICghYS5zdHlsZVsndmVydGljYWwtYWxpZ24nXSkgewoJCQkJYS5zdHlsZVsndmVydGljYWwtYWxpZ24nXSA9IGEudmFsaWduOwoJCQl9CgkJCWRlbGV0ZSBhLnZhbGlnbjsKCQl9LAoJCXZzcGFjZSA6IGZ1bmN0aW9uKGEsIG4pIHsKCQkJaWYgKG4gPT0gJ2ltZycpIHsKCQkJCXZhciB2ID0gcGFyc2VJbnQoYS52c3BhY2UpfHwwOwoJCQkJIWEuc3R5bGVbJ21hcmdpbi10b3AnXSAmJiAoYS5zdHlsZVsnbWFyZ2luLXRvcCddID0gdisncHgnKTsKCQkJCSFhLnN0eWxlWydtYXJnaW4tYm90dG9tJ10gJiYgKGEuc3R5bGVbJ21hcmdpbi1ib3R0b20nXSA9IHYrJ3B4JykKCQkJCWRlbGV0ZSBhLmhzcGFjZTsKCQkJfQoJCX0KCX0KCQoJLy8gcnVsZXMgY29sbGVjdGlvbgoJZWxSVEUucHJvdG90eXBlLmZpbHRlci5wcm90b3R5cGUucnVsZXMgPSB7CgkJLyoqCgkJICogSWYgdGhpcy5ydGUub3B0aW9ucy5hbGxvd1RhZ3MgaXMgc2V0IC0gcmVtb3ZlIGFsbCBleGNlcHQgdGhpcyBvbmVzCgkJICoKCQkgKiBAcGFyYW0gU3RyaW5nICBodG1sIGNvZGUKCQkgKiBAcmV0dXJuIFN0cmluZwoJCSAqKi8KCQlhbGxvd2VkVGFncyA6IGZ1bmN0aW9uKGh0bWwpIHsKCQkJdmFyIGEgPSB0aGlzLmFsbG93VGFnczsKCQkJcmV0dXJuIGEgPyBodG1sLnJlcGxhY2UodGhpcy50YWdSZWdFeHAsIGZ1bmN0aW9uKHQsIGMsIG4pIHsgcmV0dXJuIGFbbi50b0xvd2VyQ2FzZSgpXSA/IHQgOiAnJzsgfSkgOiBodG1sOwoJCX0sCgkJLyoqCgkJICogSWYgdGhpcy5ydGUub3B0aW9ucy5kZW55VGFncyBpcyBzZXQgLSByZW1vdmUgYWxsIGRlbnkgdGFncwoJCSAqCgkJICogQHBhcmFtIFN0cmluZyAgaHRtbCBjb2RlCgkJICogQHJldHVybiBTdHJpbmcKCQkgKiovCgkJZGVuaWVkVGFncyA6IGZ1bmN0aW9uKGh0bWwpIHsKCQkJdmFyIGQgPSB0aGlzLmRlbnlUYWdzOyAKCQkJcmV0dXJuIGQgPyBodG1sLnJlcGxhY2UodGhpcy50YWdSZWdFeHAsIGZ1bmN0aW9uKHQsIGMsIG4pIHsgcmV0dXJuIGRbbi50b0xvd2VyQ2FzZSgpXSA/ICcnIDogdCB9KSA6IGh0bWw7CgkJfSwKCQkKCQkvKioKCQkgKiBSZXBsYWNlIG5vdCBhbGxvd2VkIHRhZ3MvYXR0cmlidXRlcwoJCSAqCgkJICogQHBhcmFtIFN0cmluZyAgaHRtbCBjb2RlCgkJICogQHJldHVybiBTdHJpbmcKCQkgKiovCgkJY2xlYW4gOiBmdW5jdGlvbihodG1sKSB7CgkJCXZhciBzZWxmID0gdGhpcywgCgkJCQlydCAgID0gdGhpcy5yZXBsYWNlVGFncywKCQkJCXJhICAgPSB0aGlzLnJlcGxhY2VBdHRycywgCgkJCQlkYSAgID0gdGhpcy5kZW55QXR0ciwKCQkJCW47CgkJCQoJCQlyZXR1cm4gaHRtbC5yZXBsYWNlKC88IURPQ1RZUEUoW1xzXFNdKik+L2dpLCAnJykKCQkJCS5yZXBsYWNlKC88cCBbXj5dKmNsYXNzPSI/TXNvSGVhZGluZyI/W14+XSo+KC4qPyk8XC9wPi9naSwgIjxwPjxzdHJvbmc+JDE8L3N0cm9uZz48L3A+IikKCQkJCS5yZXBsYWNlKC88c3BhblxzK3N0eWxlXHMqPVxzKiJccyptc28tc3BhY2VydW5ccyo6XHMqeWVzXHMqOz9ccyoiXHMqPihbXHMmbmJzcDtdKik8XC9zcGFuPi9naSwgIiQxIikKCQkJCS5yZXBsYWNlKC8oPHBbXj5dKj5ccyo8XC9wPnw8cFtePl0qXC8+KS9naSwgJzxicj4nKQoJCQkJLnJlcGxhY2UodGhpcy50YWdSZWdFeHAsIGZ1bmN0aW9uKHQsIGMsIG4sIGEpIHsKCQkJCQluID0gbi50b0xvd2VyQ2FzZSgpOwoJCQkJCQoJCQkJCWlmIChjKSB7CgkJCQkJCXJldHVybiAnPC8nKyhydFtuXSA/IHJ0W25dLnRhZyA6IG4pKyc+JzsKCQkJCQl9CgkJCQkJCgkJCQkJLy8gY3JlYXRlIGF0dHJpYnV0ZXMgaGFzaCBhbmQgY2xlYW4gaXQKCQkJCQlhID0gc2VsZi5jbGVhbkF0dHJzKHNlbGYucGFyc2VBdHRycyhhfHwnJyksIG4pOwoJCQkJCQoJCQkJCWlmIChydFtuXSkgewoJCQkJCQlydFtuXS5zdHlsZSAmJiAkLmV4dGVuZChhLnN0eWxlLCBydFtuXS5zdHlsZSk7CgkJCQkJCW4gPSBydFtuXS50YWc7CgkJCQkJfQoJCQkJCQoJCQkJCWRhICYmICQuZWFjaChhLCBmdW5jdGlvbihuYSkgewoJCQkJCQlpZiAoZGFbbmFdKSB7CgkJCQkJCQlkZWxldGUgYVtuYV07CgkJCQkJCX0KCQkJCQl9KTsKCQkJCQlhID0gc2VsZi5zZXJpYWxpemVBdHRycyhhKTsKCQkJCQlyZXR1cm4gJzwnK24rKGE/JyAnOicnKSthKyc+JzsKCQkJCX0pOwoJCX0sCgkJCgkJLyoqCgkJICogQ2xlYW4gcGFzdGVkIGh0bWwKCQkgKgoJCSAqIEBwYXJhbSBTdHJpbmcgIGh0bWwgY29kZQoJCSAqIEByZXR1cm4gU3RyaW5nCgkJICoqLwoJCWNsZWFuUGFzdGUgOiBmdW5jdGlvbihodG1sKSB7CgkJCXZhciBzZWxmID0gdGhpcywgZCA9IHRoaXMucGFzdGVEZW55QXR0cjsKCgkJCWh0bWwgPSBodG1sCgkJCQkucmVwbGFjZSh0aGlzLnNjcmlwdFJlZ0V4cCwgJycpCgkJCQkucmVwbGFjZSh0aGlzLnN0eWxlUmVnRXhwLCAnJykKCQkJCS5yZXBsYWNlKHRoaXMubGlua1JlZ0V4cCwgJycpCgkJCQkucmVwbGFjZSh0aGlzLmNkYXRhUmVnRXhwLCAnJykKCQkJCS5yZXBsYWNlKC9cPFwhLS1bXHNcU10qPy0tXD4vZywgJycpOwoJCQkKCQkJaWYgKHRoaXMucnRlLm9wdGlvbnMucGFzdGVPbmx5VGV4dCkgewoJCQkJaHRtbCA9IGh0bWwucmVwbGFjZSh0aGlzLnRhZ1JlZ0V4cCwgZnVuY3Rpb24odCwgYywgbikgewoJCQkJCXJldHVybiAvYnIvaS50ZXN0KG4pIHx8IChjICYmIC9oWzEtNl18cHxvbHx1bHxsaXxkaXZ8YmxvY2txdW90ZXx0ci9pKSA/ICc8YnI+JyA6ICcnOwoJCQkJfSkucmVwbGFjZSgvKCZuYnNwO3w8YnJbXj5dKj4pK1xzKiQvZ2ksICcnKTsKCQkJfSBlbHNlIGlmIChkKSB7CgkJCQlodG1sID0gaHRtbC5yZXBsYWNlKHRoaXMub3BlblRhZ1JlZ0V4cCwgZnVuY3Rpb24odCwgbiwgYSkgewoJCQkJCWEgPSBzZWxmLnBhcnNlQXR0cnMoYSk7CgkJCQkJJC5lYWNoKGEsIGZ1bmN0aW9uKGFuKSB7CgkJCQkJCWlmIChkW2FuXSkgewoJCQkJCQkJZGVsZXRlIGFbYW5dOwoJCQkJCQl9CgkJCQkJfSk7CgkJCQkJYSA9IHNlbGYuc2VyaWFsaXplQXR0cnMoYSwgdHJ1ZSk7CgkJCQkJcmV0dXJuICc8JytuKyhhPycgJzonJykrYSsnPic7CgkJCQl9KTsKCQkJfQoJCQlyZXR1cm4gaHRtbDsgCgkJfSwKCQkKCQkvKioKCQkgKiBSZXBsYWNlIHNjcmlwdC9zdHlsZS9tZWRpYSBldGMgd2l0aCBwbGFjZWhvbGRlcnMKCQkgKgoJCSAqIEBwYXJhbSBTdHJpbmcgIGh0bWwgY29kZQoJCSAqIEByZXR1cm4gU3RyaW5nCgkJICoqLwoJCXJlcGxhY2UgOiBmdW5jdGlvbihodG1sKSB7CgkJCXZhciBzZWxmID0gdGhpcywgciA9IHRoaXMucnRlLm9wdGlvbnMucmVwbGFjZXx8W10sIG47CgoJCQkvLyBjdXN0b20gcmVwbGFjZXMgaWYgc2V0CgkJCWlmIChyLmxlbmd0aCkgewoJCQkJJC5lYWNoKHIsIGZ1bmN0aW9uKGksIGYpIHsKCQkJCQlpZiAodHlwZW9mKGYpID09ICdmdW5jdGlvbicpIHsKCQkJCQkJaHRtbCA9IGYuY2FsbChzZWxmLCBodG1sKTsKCQkJCQl9CgkJCQl9KTsKCQkJfQoKCQkJLyoqCgkJCSAqIFJldHVybiBtZWRpYSByZXBsYWNlbWVudCAtIGltZyBodG1sIGNvZGUKCQkJICoKCQkJICogQHBhcmFtIE9iamVjdCAgb2JqZWN0IHRvIHN0b3JlIGluIHJlbCBhdHRyCgkJCSAqIEBwYXJhbSBTdHJpbmcgIG1lZGlhIG1pbWUtdHlwZQoJCQkgKiBAcmV0dXJuIFN0cmluZwoJCQkgKiovCgkJCWZ1bmN0aW9uIGltZyhvLCB0KSB7CgkJCQl2YXIgcyA9IHNyYygpLAoJCQkJCWMgPSBzICYmIHNlbGYudmlkZW9Ib3N0UmVnRXhwLnRlc3QocykgPyBzLnJlcGxhY2Uoc2VsZi52aWRlb0hvc3RSZWdFeHAsICIkMiIpIDogdC5yZXBsYWNlKC9eXHcrXC8oLispLywgIiQxIiksCgkJCQkJdyA9IHBhcnNlSW50KChvLm9iaiA/IG8ub2JqLndpZHRoIHx8IG8ub2JqLnN0eWxlLndpZHRoIDogMCl8fChvLmVtYmVkID8gby5lbWJlZC53aWR0aCB8fCBvLmVtYmVkLnN0eWxlLndpZHRoIDogMCkpfHwxNTAsCgkJCQkJaCA9IHBhcnNlSW50KChvLm9iaiA/IG8ub2JqLmhlaWdodCB8fCBvLm9iai5zdHlsZS5oZWlnaHQgOiAwKXx8KG8uZW1iZWQgPyBvLmVtYmVkLmhlaWdodCB8fCBvLmVtYmVkLnN0eWxlLmhlaWdodCA6IDApKXx8MTAwLAoJCQkJCWlkID0gJ21lZGlhJytNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpLAoJCQkJCXN0eWxlID0nJywKCQkJCQlsOwoKCQkJCS8vIGZpbmQgbWVkaWEgc3JjCgkJCQlmdW5jdGlvbiBzcmMoKSB7CgkJCQkJaWYgKG8uZW1iZWQgJiYgby5lbWJlZC5zcmMpIHsKCQkJCQkJcmV0dXJuIG8uZW1iZWQuc3JjOwoJCQkJCX0KCQkJCQlpZiAoby5wYXJhbXMgJiYgby5wYXJhbXMubGVuZ3RoKSB7CgkJCQkJCWwgPSBvLnBhcmFtcy5sZW5ndGg7CgkJCQkJCXdoaWxlIChsLS0pIHsKCQkJCQkJCWlmIChvLnBhcmFtc1tsXS5uYW1lID09ICdzcmMnIHx8IG8ucGFyYW1zW2xdLm5hbWUgPT0gJ21vdmllJykgewoJCQkJCQkJCXJldHVybiBvLnBhcmFtc1tsXS52YWx1ZTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCWlmIChvLm9iaiAmJiBvLm9iai5zdHlsZSAmJiBvLm9iai5zdHlsZVsnZmxvYXQnXSkgewoJCQkJCXN0eWxlID0gJyBzdHlsZT0iZmxvYXQ6JytvLm9iai5zdHlsZVsnZmxvYXQnXSsnIic7CgkJCQl9CgkJCQlzZWxmLnNjcmlwdHNbaWRdID0gbzsKCQkJCXJldHVybiAnPGltZyBzcmM9Iicrc2VsZi51cmwrJ3BpeGVsLmdpZiIgY2xhc3M9ImVscnRlLW1lZGlhIGVscnRlLW1lZGlhLScrYysnIGVscnRlLXByb3RlY3RlZCIgdGl0bGU9IicrKHMgPyBzZWxmLnJ0ZS51dGlscy5lbmNvZGUocykgOiAnJykrJyIgcmVsPSInK2lkKyciIHdpZHRoPSInK3crJyIgaGVpZ2h0PSInK2grJyInK3N0eWxlKyc+JzsKCQkJfQoJCQkKCQkJaHRtbCA9IGh0bWwKCQkJCS5yZXBsYWNlKHRoaXMuc3R5bGVSZWdFeHAsICI8IS0tIEVMUlRFX0NPTU1FTlQkMSAtLT4iKQoJCQkJLnJlcGxhY2UodGhpcy5saW5rUmVnRXhwLCAgIjwhLS0gRUxSVEVfQ09NTUVOVCQxLS0+IikKCQkJCS5yZXBsYWNlKHRoaXMuY2RhdGFSZWdFeHAsICI8IS0tW0NEQVRBWyQxXV0tLT4iKQoJCQkJLnJlcGxhY2UodGhpcy5zY3JpcHRSZWdFeHAsIGZ1bmN0aW9uKHQsIGEsIHMpIHsKCQkJCQl2YXIgaWQ7CgkJCQkJaWYgKHNlbGYuZGVueVRhZ3Muc2NyaXB0KSB7CgkJCQkJCXJldHVybiAnJzsKCQkJCQl9CgkJCQkJaWQgPSAnc2NyaXB0JytNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpOwoJCQkJCWEgPSBzZWxmLnBhcnNlQXR0cnMoYSk7CgkJCQkJIWEudHlwZSAmJiAoYS50eXBlID0gJ3RleHQvamF2YXNjcmlwdCcpOwoJCQkJCXNlbGYuc2NyaXB0c1tpZF0gPSAnPHNjcmlwdCAnK3NlbGYuc2VyaWFsaXplQXR0cnMoYSkrIj4iK3MrIjwvc2NyaXB0PiI7CgkJCQkJcmV0dXJuICc8IS0tIEVMUlRFX1NDUklQVDonKyhpZCkrJyAtLT4nOwoJCQkJfSkKCQkJCS5yZXBsYWNlKHRoaXMueU1hcHNSZWdFeHAsIGZ1bmN0aW9uKHQsIGEpIHsKCQkJCQlhID0gc2VsZi5wYXJzZUF0dHJzKGEpOwoJCQkJCWFbJ2NsYXNzJ11bJ2VscnRlLXlhbmRleC1tYXBzJ10gPSAnZWxydGUteWFuZGV4LW1hcHMnOwoJCQkJCWFbJ2NsYXNzJ11bJ2VscnRlLXByb3RlY3RlZCddID0gJ2VscnRlLXByb3RlY3RlZCc7CgkJCQkJcmV0dXJuICc8ZGl2ICcrc2VsZi5zZXJpYWxpemVBdHRycyhhKSsnPic7CgkJCQl9KQoJCQkJLnJlcGxhY2UodGhpcy5nTWFwc1JlZ0V4cCwgZnVuY3Rpb24odCwgYSkgewoJCQkJCXZhciBpZCA9ICdnbWFwcycrTWF0aC5yYW5kb20oKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwgdywgaDsKCQkJCQlhID0gc2VsZi5wYXJzZUF0dHJzKGEpOwoJCQkJCXcgPSBwYXJzZUludChhLndpZHRofHxhLnN0eWxlLndpZHRofHwxMDApOwoJCQkJCWggPSBwYXJzZUludChhLmhlaWdodHx8YS5zdHlsZS5oZWlnaHR8fDEwMCk7CgkJCQkJc2VsZi5zY3JpcHRzW2lkXSA9IHQ7CgkJCQkJcmV0dXJuICc8aW1nIHNyYz0iJytzZWxmLnVybCsncGl4ZWwuZ2lmIiBjbGFzcz0iZWxydGUtZ29vZ2xlLW1hcHMgZWxydGUtcHJvdGVjdGVkIiBpZD0iJytpZCsnIiBzdHlsZT0id2lkdGg6Jyt3KydweDtoZWlnaHQ6JytoKydweCI+JzsKCQkJCX0pCgkJCQkucmVwbGFjZSh0aGlzLm9ialJlZ0V4cCwgZnVuY3Rpb24odCwgYSwgYykgewoJCQkJCXZhciBtID0gYy5tYXRjaChzZWxmLmVtYlJlZ0V4cCksCgkJCQkJCW8gPSB7IG9iaiA6IHNlbGYucGFyc2VBdHRycyhhKSwgZW1iZWQgOiBtICYmIG0ubGVuZ3RoID8gc2VsZi5wYXJzZUF0dHJzKG1bMF0uc3Vic3RyaW5nKDcpKSA6IG51bGwsIHBhcmFtcyA6IFtdIH0sCgkJCQkJCWkgPSBzZWxmLnJ0ZS51dGlscy5tZWRpYUluZm8oby5lbWJlZCA/IG8uZW1iZWQudHlwZXx8JycgOiAnJywgby5vYmouY2xhc3NpZHx8JycpOwoJCQkJCQoJCQkJCWlmIChpKSB7CgkJCQkJCWlmICgobSA9IGMubWF0Y2goc2VsZi5wYXJhbVJlZ0V4cCkpKSB7CgkJCQkJCQkkLmVhY2gobSwgZnVuY3Rpb24oaSwgcCkgewoJCQkJCQkJCW8ucGFyYW1zLnB1c2goc2VsZi5wYXJzZUF0dHJzKHAuc3Vic3RyaW5nKDYpKSk7CgkJCQkJCQl9KTsKCQkJCQkJfQoJCQkJCQkhby5vYmouY2xhc3NpZCAgJiYgKG8ub2JqLmNsYXNzaWQgID0gaS5jbGFzc2lkWzBdKTsKCQkJCQkJIW8ub2JqLmNvZGViYXNlICYmIChvLm9iai5jb2RlYmFzZSA9IGkuY29kZWJhc2UpOwoJCQkJCQlvLmVtYmVkICYmICFvLmVtYmVkLnR5cGUgJiYgKG8uZW1iZWQudHlwZSA9IGkudHlwZSk7CgkJCQkJCS8vIGllIGJ1ZyB3aXRoIGVtcHR5IGF0dHJzCgkJCQkJCW8ub2JqLndpZHRoID09ICcxJyAmJiBkZWxldGUgby5vYmoud2lkdGg7CgkJCQkJCW8ub2JqLmhlaWdodCA9PSAnMScgJiYgZGVsZXRlIG8ub2JqLmhlaWdodDsKCQkJCQkJaWYgKG8uZW1iZWQpIHsKCQkJCQkJCW8uZW1iZWQud2lkdGggPT0gJzEnICYmIGRlbGV0ZSBvLmVtYmVkLndpZHRoOwoJCQkJCQkJby5lbWJlZC5oZWlnaHQgPT0gJzEnICYmIGRlbGV0ZSBvLmVtYmVkLmhlaWdodDsKCQkJCQkJfQoJCQkJCQlyZXR1cm4gaW1nKG8sIGkudHlwZSk7CgkJCQkJfQoJCQkJCXJldHVybiB0OwoJCQkJfSkKCQkJCS5yZXBsYWNlKHRoaXMuZW1iUmVnRXhwLCBmdW5jdGlvbih0LCBuLCBhKSB7CgkJCQkJdmFyIGEgPSBzZWxmLnBhcnNlQXR0cnMoYSksCgkJCQkJCWkgPSBzZWxmLnJ0ZS51dGlscy5tZWRpYUluZm8oYS50eXBlfHwnJyk7CgkJCQkJLy8gaWUgYnVnIHdpdGggZW1wdHkgYXR0cnMKCQkJCQlhLndpZHRoID09ICcxJyAmJiBkZWxldGUgYS53aWR0aDsKCQkJCQlhLmhlaWdodCA9PSAnMScgJiYgZGVsZXRlIGEuaGVpZ2h0OwoJCQkJCXJldHVybiBpID8gaW1nKHsgZW1iZWQgOiBhIH0sIGkudHlwZSkgOiB0OwoJCQkJfSkKCQkJCS5yZXBsYWNlKHRoaXMudmltZW9SZWdFeHAsIGZ1bmN0aW9uKHQsIG4sIGEpIHsKCQkJCQlhID0gc2VsZi5wYXJzZUF0dHJzKGEpOwoJCQkJCWRlbGV0ZSBhLmZyYW1lYm9yZGVyOwoJCQkJCWEud2lkdGggPT0gJzEnICYmIGRlbGV0ZSBhLndpZHRoOwoJCQkJCWEuaGVpZ2h0ID09ICcxJyAmJiBkZWxldGUgYS5oZWlnaHQ7CgkJCQkJYS50eXBlID0gJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJzsKCQkJCQlyZXR1cm4gaW1nKHsgZW1iZWQgOiBhIH0sICdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcpOwoJCQkJfSkKCQkJCS5yZXBsYWNlKC88XC8oZW1iZWR8cGFyYW0pPi9naSwgJycpCgkJCQkucmVwbGFjZSh0aGlzLnBiUmVnRXhwLCBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gJzxpbWcgc3JjPSInK3NlbGYudXJsKydwaXhlbC5naWYiIGNsYXNzPSJlbHJ0ZS1wcm90ZWN0ZWQgZWxydGUtcGFnZWJyZWFrIj4nOwoJCQkJfSk7CgoKCQkJbiA9ICQoJzxkaXY+JytodG1sKyc8L2Rpdj4nKTsKCQkJLy8gcmVtb3ZlIGVtcHR5IHNwYW5zIGFuZCBtZXJnZSBuZXN0ZWQgc3BhbnMKCQkJbi5maW5kKCdzcGFuOm5vdChbaWRdKTpub3QoW2NsYXNzXSknKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIHQgPSAkKHRoaXMpOwoJCQkJCgkJCQlpZiAoIXQuYXR0cignc3R5bGUnKSkgewoJCQkJCXQuY2hpbGRyZW4oKS5sZW5ndGggPyBzZWxmLnJ0ZS5kb20udW53cmFwKHRoaXMpIDogdC5yZW1vdmUoKTsKCQkJCX0KCQkJfSkuZW5kKCkuZmluZCgnc3BhbiBzcGFuOm9ubHktY2hpbGQnKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIHQgICA9ICQodGhpcyksIAoJCQkJCXAgICA9IHQucGFyZW50KCkuZXEoMCksIAoJCQkJCXRpZCA9IHQuYXR0cignaWQnKSwgCgkJCQkJcGlkID0gcC5hdHRyKCdpZCcpLCBpZCwgcywgYzsKCgkJCQlpZiAoc2VsZi5ydGUuZG9tLmlzKHRoaXMsICdvbmx5Q2hpbGQnKSAmJiAoIXRpZCB8fCAhcGlkKSkgewoJCQkJCWMgPSAkLnRyaW0ocC5hdHRyKCdjbGFzcycpKycgJyt0LmF0dHIoJ2NsYXNzJykpCgkJCQkJYyAmJiBwLmF0dHIoJ2NsYXNzJywgYyk7CgkJCQkJcyA9IHNlbGYucnRlLnV0aWxzLnNlcmlhbGl6ZVN0eWxlKCQuZXh0ZW5kKHNlbGYucnRlLnV0aWxzLnBhcnNlU3R5bGUoJCh0aGlzKS5hdHRyKCdzdHlsZScpfHwnJyksIHNlbGYucnRlLnV0aWxzLnBhcnNlU3R5bGUoJChwKS5hdHRyKCdzdHlsZScpfHwnJykpKTsKCQkJCQlzICYmIHAuYXR0cignc3R5bGUnLCBzKTsKCQkJCQlpZCA9IHRpZHx8cGlkOwoJCQkJCWlkICYmIHAuYXR0cignaWQnLCBpZCk7CgkJCQkJdGhpcy5maXJzdENoaWxkID8gJCh0aGlzLmZpcnN0Q2hpbGQpLnVud3JhcCgpIDogdC5yZW1vdmUoKTsKCQkJCX0KCQkJfSk7CgoJCQkKCgkJCWlmICghdGhpcy5ydGUub3B0aW9ucy5hbGxvd1RleHROb2RlcykgewoJCQkJLy8gd3JhcCBpbmxpbmUgbm9kZXMgd2l0aCBwCgkJCQl2YXIgZG9tID0gdGhpcy5ydGUuZG9tLAoJCQkJCW5vZGVzID0gW10sCgkJCQkJdyA9IFtdOwoJCQkJCgkJCQlpZiAoJC5icm93c2VyLm1zaWUpIHsKCQkJCQlmb3IgKHZhciBpID0gMDsgaTxuWzBdLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsKCQkJCQkJbm9kZXMucHVzaChuWzBdLmNoaWxkTm9kZXNbaV0pCgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQlub2RlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG5bMF0uY2hpbGROb2Rlcyk7CgkJCQl9CgkJCQkKCgkJCQlmdW5jdGlvbiB3cmFwKCkgewoJCQkJCWlmICh3Lmxlbmd0aCAmJiBkb20uZmlsdGVyKHcsICdub3RFbXB0eScpLmxlbmd0aCkgewoJCQkJCQlkb20ud3JhcCh3LCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJykpOwoJCQkJCX0KCQkJCQl3ID0gW107CgkJCQl9CQoJCQkJJC5lYWNoKG5vZGVzLCBmdW5jdGlvbihpLCBuKSB7CgkJCQkJaWYgKGRvbS5pcyhuLCAnYmxvY2snKSkgewoJCQkJCQl3cmFwKCk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJaWYgKHcubGVuZ3RoICYmIG4ucHJldmlvdXNTaWJsaW5nICE9IHdbdy5sZW5ndGgtMV0pIHsKCQkJCQkJCXdyYXAoKTsKCQkJCQkJfQoJCQkJCQl3LnB1c2gobik7CgkJCQkJfQoJCQkJfSk7CgkJCQl3cmFwKCk7CgkJCX0KCQkJCgkJCXJldHVybiBuLmh0bWwoKTsKCQl9LAoJCS8qKgoJCSAqIFJlc3RvcmUgc2NyaXB0L3N0eWxlL21lZGlhIGV0YyBmcm9tIHBsYWNlaG9sZGVycwoJCSAqCgkJICogQHBhcmFtIFN0cmluZyAgaHRtbCBjb2RlCgkJICogQHJldHVybiBTdHJpbmcKCQkgKiovCgkJcmVzdG9yZSA6IGZ1bmN0aW9uKGh0bWwpIHsKCQkJdmFyIHNlbGYgPXRoaXMsIHIgPSB0aGlzLnJ0ZS5vcHRpb25zLnJlc3RvcmV8W107CgoJCQkvLyBjdXN0b20gcmVzdG9yZSBpZiBzZXQKCQkJaWYgKHIubGVuZ3RoKSB7CgkJCQkkLmVhY2gociwgZnVuY3Rpb24oaSwgZikgewoJCQkJCWlmICh0eXBlb2YoZikgPT0gJ2Z1bmN0aW9uJykgewoJCQkJCQlodG1sID0gZi5jYWxsKHNlbGYsIGh0bWwpOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgkJCQoJCQlodG1sID0gaHRtbAoJCQkJLnJlcGxhY2UoL1w8XCEtLVxbQ0RBVEFcWyhbXHNcU10qPylcXVxdLS1cPi9naSwgIjwhW0NEQVRBWyQxXV0+IikKCQkJCS5yZXBsYWNlKC9cPFwhLS1ccypFTFJURV9TQ1JJUFRcOlxzKihzY3JpcHRcZCspXHMqLS1cPi9naSwgZnVuY3Rpb24odCwgbikgewoJCQkJCWlmIChzZWxmLnNjcmlwdHNbbl0pIHsKCQkJCQkJdCA9IHNlbGYuc2NyaXB0c1tuXTsKCQkJCQkJZGVsZXRlIHNlbGYuc2NyaXB0c1tuXTsKCQkJCQl9CgkJCQkJcmV0dXJuIHR8fCcnOwoJCQkJfSkKCQkJCS5yZXBsYWNlKC9cPFwhLS0gRUxSVEVfQ09NTUVOVChbXHNcU10qPykgLS1cPi9naSwgIiQxIikKCQkJCS5yZXBsYWNlKHRoaXMuc2VydmljZUNsYXNzUmVnRXhwLCBmdW5jdGlvbih0LCBuLCBhLCBlKSB7CgkJCQkJdmFyIGEgPSBzZWxmLnBhcnNlQXR0cnMoYSksIGosIG8gPSAnJzsKCQkJCQkvLyBhbGVydCh0KQoJCQkJCWlmIChhWydjbGFzcyddWydlbHJ0ZS1tZWRpYSddKSB7CgkJCQkJCS8vIGFsZXJ0KGEucmVsKQoJCQkJCQkvLyByZXR1cm4gJycKCQkJCQkJLy8gaiA9IGEucmVsID8gSlNPTi5wYXJzZShzZWxmLnJ0ZS51dGlscy5kZWNvZGUoYS5yZWwpKSA6IHt9OwoJCQkJCQlqID0gc2VsZi5zY3JpcHRzW2EucmVsXXx8e307CgkJCQkJCS8vIGFsZXJ0KGopCgkJCQkJCS8vIGogPSBhLnJlbCA/ICQucGFyc2VKU09OKHNlbGYucnRlLnV0aWxzLmRlY29kZShhLnJlbCkpIDoge307CgkJCQkJCWoucGFyYW1zICYmICQuZWFjaChqLnBhcmFtcywgZnVuY3Rpb24oaSwgcCkgewoJCQkJCQkJbyArPSAnPHBhcmFtICcrc2VsZi5zZXJpYWxpemVBdHRycyhwKSsiPlxuIjsKCQkJCQkJfSk7CgkJCQkJCWouZW1iZWQgJiYgKG8rPSc8ZW1iZWQgJytzZWxmLnNlcmlhbGl6ZUF0dHJzKGouZW1iZWQpKyI+Iik7CgkJCQkJCWoub2JqICYmIChvID0gJzxvYmplY3QgJytzZWxmLnNlcmlhbGl6ZUF0dHJzKGoub2JqKSsiPlxuIitvKyJcbjwvb2JqZWN0PlxuIik7CgkJCQkJCXJldHVybiBvfHx0OwoJCQkJCX0gZWxzZSBpZiAoYVsnY2xhc3MnXVsnZWxydGUtZ29vZ2xlLW1hcHMnXSkgewoJCQkJCQl2YXIgdCA9ICcnOwoJCQkJCQlpZiAoc2VsZi5zY3JpcHRzW2EuaWRdKSB7CgkJCQkJCQl0ID0gc2VsZi5zY3JpcHRzW2EuaWRdOwoJCQkJCQkJZGVsZXRlIHNlbGYuc2NyaXB0c1thLmlkXQoJCQkJCQl9CgkJCQkJCXJldHVybiB0OwoJCQkJCX0gZWxzZSBpZiAoYVsnY2xhc3MnXVsnZWxydGUtcGFnZWJyZWFrJ10pIHsKCQkJCQkJcmV0dXJuICc8IS0tIHBhZ2VicmVhayAtLT4nOwoJCQkJCX0KCQkJCQkkLmVhY2goYVsnY2xhc3MnXSwgZnVuY3Rpb24obikgewoJCQkJCQkvXmVscnRlLVx3Ky9pLnRlc3QobikgJiYgZGVsZXRlKGFbJ2NsYXNzJ11bbl0pOyAKCQkJCQl9KTsKCQkJCQlyZXR1cm4gJzwnK24rJyAnK3NlbGYuc2VyaWFsaXplQXR0cnMoYSkrJz4nKyhlfHwnJyk7CgoJCQkJfSk7CgkJCQoJCQlyZXR1cm4gaHRtbDsKCQl9LAoJCS8qKgoJCSAqIGNvbXBhY3Qgc3R5bGVzIGFuZCBtb3ZlIHRhZ3MgYW5kIGF0dHJpYnV0ZXMgbmFtZXMgaW4gbG93ZXIgY2FzZShmb3IgaWUmb3BlcmEpCgkJICoKCQkgKiBAcGFyYW0gU3RyaW5nICBodG1sIGNvZGUKCQkgKiByZXR1cm4gU3RyaW5nCgkJICoqLwoJCWNvbXBhY3RTdHlsZXMgOiBmdW5jdGlvbihodG1sKSB7CgkJCXZhciBzZWxmID0gdGhpczsKCgkJCXJldHVybiBodG1sLnJlcGxhY2UodGhpcy50YWdSZWdFeHAsIGZ1bmN0aW9uKHQsIGMsIG4sIGEpIHsKCQkJCWEgPSAhYyAmJiBhID8gc2VsZi5zZXJpYWxpemVBdHRycyhzZWxmLnBhcnNlQXR0cnMoYSksIHRydWUpIDogJyc7CgkJCQlyZXR1cm4gJzwnK2Mrbi50b0xvd2VyQ2FzZSgpKyhhPycgJzonJykrYSsnPic7CgkJCX0pOwoJCX0sCgkJLyoqCgkJICogcmV0dXJuIHhodG1sIHRhZ3MKCQkgKgoJCSAqIEBwYXJhbSBTdHJpbmcgIGh0bWwgY29kZQoJCSAqIHJldHVybiBTdHJpbmcKCQkgKiovCgkJeGh0bWxUYWdzIDogZnVuY3Rpb24oaHRtbCkgewoJCQlyZXR1cm4gdGhpcy54aHRtbCA/IGh0bWwucmVwbGFjZSgvPChpbWd8aHJ8YnJ8ZW1iZWR8cGFyYW18bGluaykoW14+XSpcLyopPi9naSwgIjwkMSQyIC8+IikgOiBodG1sOwoJCX0KCX0KCQoJLyoqCgkgKiBDaGFpbnMgY29uZmlndXJhdGlvbgoJICogRGVmYXVsdCBjaGFpbnMgCgkgKiB3eXNpd3lnIC0gcHJvY2Nlc3MgaHRtbCBmcm9tIHNvdXJjZSBmb3Igd3lzaXd5ZyBlZGl0b3IgbW9kZQoJICogc291cmNlICAtIHByb2NjZXNzIGh0bWwgZnJvbSB3eXNpd3lnIGZvciBzb3VyY2UgZWRpdG9yIG1vZGUKCSAqIHBhc3RlICAgLSBjbGVhbiBwYXN0ZWQgaHRtbAoJICogd3lzaXd5ZzJ3eXNpd3lnIC0gY2ljbHljIHJ1bGUgdG8gY2xlYW4gaHRtbCBmcm9tIHd5c2l3eWcgZm9yIHd5c2l3eWcgcGFzdGUKCSAqIHNvdXJjZTJzb3VyY2UgLSBjaWNseWMgcnVsZSB0byBjbGVhbiBodG1sIGZyb20gc291cmNlIGZvciBzb3VyY2UgcGFzdGUKCSAqIGRlbmllZFRhZ3MgaXMgaW4gdGhlIGVuZCBvZiBjaGFpbiB0byBwcm90ZWN0IGdvb2dsZSBtYXBzIGlmcmFtZSBmcm9tIHJlbW92ZWQKCSAqKi8KCWVsUlRFLnByb3RvdHlwZS5maWx0ZXIucHJvdG90eXBlLmNoYWlucyA9IHsKCQl3eXNpd3lnICAgICAgICAgOiBbJ2NsZWFuJywnYWxsb3dlZFRhZ3MnLCAncmVwbGFjZScsICdkZW5pZWRUYWdzJywgJ2NvbXBhY3RTdHlsZXMnXSwKCQlzb3VyY2UgICAgICAgICAgOiBbJ2NsZWFuJywnYWxsb3dlZFRhZ3MnLCAncmVzdG9yZScsICdjb21wYWN0U3R5bGVzJywgJ3hodG1sVGFncyddLAoJCXBhc3RlICAgICAgICAgICA6IFsnY2xlYW4nLCdhbGxvd2VkVGFncycsICdjbGVhblBhc3RlJywgJ3JlcGxhY2UnLCAnZGVuaWVkVGFncycsICdjb21wYWN0U3R5bGVzJ10sCgkJd3lzaXd5ZzJ3eXNpd3lnIDogWydjbGVhbicsJ2FsbG93ZWRUYWdzJywgJ3Jlc3RvcmUnLCAncmVwbGFjZScsICdkZW5pZWRUYWdzJywgJ2NvbXBhY3RTdHlsZXMnXSwKCQlzb3VyY2Uyc291cmNlICAgOiBbJ2NsZWFuJywnYWxsb3dlZFRhZ3MnLCAncmVwbGFjZScsICdkZW5pZWRUYWdzJywgJ3Jlc3RvcmUnLCAnY29tcGFjdFN0eWxlcycsICd4aHRtbFRhZ3MnXQoJfQoJCgoJCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS5oaXN0b3J5ID0gZnVuY3Rpb24ocnRlKSB7Cgl0aGlzLnJ0ZSA9IHJ0ZTsKCXRoaXMuX3ByZXYgPSBbXQoJdGhpcy5fbmV4dCA9IFtdOwoKCQoJdGhpcy5hZGQgPSBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5ydGUub3B0aW9ucy5oaXN0b3J5TGVuZ3RoPjAgJiYgdGhpcy5fcHJldi5sZW5ndGg+PSB0aGlzLnJ0ZS5vcHRpb25zLmhpc3RvcnlMZW5ndGgpIHsKCQkJdGhpcy5fcHJldi5zbGljZSh0aGlzLnJ0ZS5vcHRpb25zLmhpc3RvcnlMZW5ndGgpOwoJCX0KCQl2YXIgYiA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXRCb29rbWFyaygpOwoJCXRoaXMuX3ByZXYucHVzaChbJCh0aGlzLnJ0ZS5kb2MuYm9keSkuaHRtbCgpLCBiXSk7CgkJdGhpcy5ydGUuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGIpOwoJCS8vIHRoaXMuX3ByZXYucHVzaCgkKHRoaXMucnRlLmRvYy5ib2R5KS5odG1sKCkpOwoJCXRoaXMuX25leHQgPSBbXTsKCX0KCQoJdGhpcy5iYWNrID0gZnVuY3Rpb24oKSB7CgkJCgkJaWYgKHRoaXMuX3ByZXYubGVuZ3RoKSB7CgkJCXZhciBiID0gdGhpcy5ydGUuc2VsZWN0aW9uLmdldEJvb2ttYXJrKCksIAoJCQkJZGF0YSA9IHRoaXMuX3ByZXYucG9wKCk7CgkJCXRoaXMuX25leHQucHVzaChbJCh0aGlzLnJ0ZS5kb2MuYm9keSkuaHRtbCgpLCBiXSk7CgkJCQoJCQkkKHRoaXMucnRlLmRvYy5ib2R5KS5odG1sKGRhdGFbMF0pOwoJCQl0aGlzLnJ0ZS5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoZGF0YVsxXSk7CgkJfQoJfQoKCXRoaXMuZndkID0gZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuX25leHQubGVuZ3RoKSB7CgkJCXZhciBiID0gdGhpcy5ydGUuc2VsZWN0aW9uLmdldEJvb2ttYXJrKCksIAoJCQkJZGF0YSA9IHRoaXMuX25leHQucG9wKCk7CgkJCXRoaXMuX3ByZXYucHVzaChbJCh0aGlzLnJ0ZS5kb2MuYm9keSkuaHRtbCgpLCBiXSk7CgkJCQoJCQkkKHRoaXMucnRlLmRvYy5ib2R5KS5odG1sKGRhdGFbMF0pOwoJCQl0aGlzLnJ0ZS5zZWxlY3Rpb24ubW92ZVRvQm9va21hcmsoZGF0YVsxXSk7CgkJfQoJfQoJCgl0aGlzLmNhbkJhY2sgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5fcHJldi5sZW5ndGg7Cgl9CgkKCXRoaXMuY2FuRndkID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX25leHQubGVuZ3RoOwoJfQoKfQp9KShqUXVlcnkpOy8qCiAqIGVsUlRFIGNvbmZpZ3VyYXRpb24KICoKICogQHBhcmFtIGRvY3R5cGUgICAgICAgICAtIGRvY3R5cGUgZm9yIGVkaXRvciBpZnJhbWUKICogQHBhcmFtIGNzc0NsYXNzICAgICAgICAtIGNzcyBjbGFzcyBmb3IgZWRpdG9yCiAqIEBwYXJhbSBjc3NGaWxlcyAgICAgICAgLSBhcnJheSBvZiBjc3MgZmlsZXMsIHdpdGNoIHdpbGwgaW5sdWRlIGluIGlmcmFtZQogKiBAcGFyYW0gaGVpZ2h0ICAgICAgICAgIC0gbm90IHVzZWQgbm93IChtYXkgYmUgZGVsZXRlZCBpbiBmdXR1cmUpCiAqIEBwYXJhbSBsYW5nICAgICAgICAgICAgLSBpbnRlcmZhY2UgbGFuZ3VhZ2UgKHJlcXVpcmVzIGZpbGUgaW4gaTE4biBkaXIpCiAqIEBwYXJhbSB0b29sYmFyICAgICAgICAgLSBuYW1lIG9mIHRvb2xiYXIgdG8gbG9hZAogKiBAcGFyYW0gYWJzb2x1dGVVUkxzICAgIC0gY29udmVydCBmaWxlcyBhbmQgaW1hZ2VzIHVybHMgdG8gYWJzb2x1dGUgb3Igbm90CiAqIEBwYXJhbSBhbGxvd1NvdXJjZSAgICAgLSBpcyBzb3VyY2UgZWRpdGluZyBhbGxvd2luZwogKiBAcGFyYW0gc3RyaXBXaGl0ZVNwYWNlIC0gc3RyaXAg0LvQuNGI0L3QuNC1IHdoaXRlc3BhY2VzL3RhYnMgb3Igbm90CiAqIEBwYXJhbSBzdHlsZVdpdGhDU1MgICAgLSB1c2Ugc3R5bGU9Li4uIGluc3RlYWQgb2Ygc3Ryb25nIGV0Yy4KICogQHBhcmFtIGZtQWxsb3cgICAgICAgICAtIGFsbG93IHVzaW5nIGZpbGUgbWFuZ2VyIChlbEZpbmRlcikKICogQHBhcmFtIGZtT3BlbiAgICAgICAgICAtIGNhbGxiYWNrIGZvciBvcGVuIGZpbGUgbWFuYWdlcgogKiBAcGFyYW0gYnV0dG9ucyAgICAgICAgIC0gb2JqZWN0IHdpdGggcGFpcnMgb2YgYnV0dG9ucyBjbGFzc2VzIG5hbWVzIGFuZCB0aXRsZXMgKHdoZW4gY3JlYXRlIG5ldyBidXR0b24sIHlvdSBoYXZlIHRvIGFkZCBpeXMgbmFtZSBoZXJlKQogKiBAcGFyYW0gcGFuZWxzICAgICAgICAgIC0gbmFtZWQgZ3JvdXBzIG9mIGJ1dHRvbnMKICogQHBhcmFtIHBhbmVsTmFtZXMgICAgICAtIHRpdGxlIG9mIHBhbmVscyAocmVxdWlyZWQgZm9yIG9uZSBwbGFubmVkIGZlYXR1cmUpCiAqIEBwYXJhbSB0b29sYmFycyAgICAgICAgLSBuYW1lZCByZWR5IHRvIHVzZSB0b29sYmFscyAoeW91IG1heSBjb21iaW5lIHlvdXIgb3duIHRvb2xiYXIpCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQ29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS5vcHRpb25zICAgPSB7Cglkb2N0eXBlICAgICAgICAgOiAnPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+JywKCWNzc0NsYXNzICAgICAgICA6ICdlbC1ydGUnLAoJY3NzZmlsZXMgICAgICAgIDogW10sCgloZWlnaHQgICAgICAgICAgOiBudWxsLAoJcmVzaXphYmxlICAgICAgIDogdHJ1ZSwKCWxhbmcgICAgICAgICAgICA6ICdlbicsCgl0b29sYmFyICAgICAgICAgOiAnbm9ybWFsJywKCWFic29sdXRlVVJMcyAgICA6IHRydWUsCglhbGxvd1NvdXJjZSAgICAgOiB0cnVlLAoJc3RyaXBXaGl0ZVNwYWNlIDogdHJ1ZSwKCXN0eWxlV2l0aENTUyAgICA6IGZhbHNlLAoJZm1BbGxvdyAgICAgICAgIDogdHJ1ZSwKCWZtT3BlbiAgICAgICAgICA6IG51bGwsCgkvKiBpZiBzZXQgYWxsIG90aGVyIHRhZyB3aWxsIGJlIHJlbW92ZWQgKi8KCWFsbG93VGFncyA6IFtdLAoJLyogaWYgc2V0IHRoaXMgdGFncyB3aWxsIGJlIHJlbW92ZWQgKi8KCWRlbnlUYWdzIDogWydhcHBsZXQnLCAnYmFzZScsICdiYXNlZm9udCcsICdiZ3NvdW5kJywgJ2JsaW5rJywgJ2JvZHknLCAnY29sJywgJ2NvbGdyb3VwJywgJ2lmcmFtZScsICdpc2luZGV4JywgJ2ZyYW1lc2V0JywgJ2h0bWwnLCAnaGVhZCcsICdtZXRhJywgJ21hcnF1ZWUnLCAnbm9mcmFtZXMnLCAnbm9lbWJlZCcsICdvOnAnLCAndGl0bGUnLCAneG1sJ10sCglkZW55QXR0ciA6IFtdLAoJLyogb24gcGFzdGUgZXZlbnQgdGhpcyBhdHRyaWJ1dGVzIHdpbGwgcmVtb3ZlZCBmcm9tIHBhc3RlZCBodG1sICovCglwYXN0ZURlbnlBdHRyIDogWydpZCcsICduYW1lJywgJ2NsYXNzJywgJ3N0eWxlJywgJ2xhbmd1YWdlJywgJ29uY2xpY2snLCAnb25kYmxjbGljaycsICdvbmhvdmVyJywgJ29ua2V1cCcsICdvbmtleWRvd24nLCAnb25rZXlwcmVzcyddLAoJLyogSWYgZmFsc2UgLSBhbGwgdGV4dCBub2RlcyB3aWxsIGJlIHdyYXBwZWQgYnkgcGFyYWdyYXBoIHRhZyAqLwoJYWxsb3dUZXh0Tm9kZXMgOiBmYWxzZSwKCS8qIGFsbG93IGJyb3dzZXIgc3BlY2lmaWMgc3R5bGVzIGxpa2UgLW1venwtd2Via2l0fC1vICovCglhbGxvd0Jyb3dzZXJzU3BlY1N0eWxlcyA6IGZhbHNlLAoJLyogYWxsb3cgcGFzdGUgY29udGVudCBpbnRvIGVkaXRvciAqLwoJYWxsb3dQYXN0ZSA6IHRydWUsCgkvKiBpZiB0cnVlIC0gb25seSB0ZXh0IHdpbGwgYmUgcGFzdGVkIChub3QgaW4gaWUpICovCglwYXN0ZU9ubHlUZXh0IDogZmFsc2UsCgkvKiB1c2VyIHJlcGxhY2VtZW50IHJ1bGVzICovCglyZXBsYWNlIDogW10sCgkvKiB1c2VyIHJlc3RvcmUgcnVsZXMgKi8KCXJlc3RvcmUgOiBbXSwKCXBhZ2VicmVhayA6ICc8ZGl2IHN0eWxlPSJwYWdlLWJyZWFrLWFmdGVyOiBhbHdheXM7Ij48L2Rpdj4nLCAvLyc8IS0tIHBhZ2VicmVhayAtLT4nLAoJYnV0dG9ucyAgICAgICAgIDogewoJCSdzYXZlJyAgICAgICAgICAgICAgICA6ICdTYXZlJywKCQknY29weScgICAgICAgICAgICAgICAgOiAnQ29weScsCgkJJ2N1dCcgICAgICAgICAgICAgICAgIDogJ0N1dCcsCgkJJ2NzcycgICAgICAgICAgICAgICAgIDogJ0NzcyBzdHlsZSBhbmQgY2xhc3MnLAoJCSdwYXN0ZScgICAgICAgICAgICAgICA6ICdQYXN0ZScsCgkJJ3Bhc3RldGV4dCcgICAgICAgICAgIDogJ1Bhc3RlIG9ubHkgdGV4dCcsCgkJJ3Bhc3RlZm9ybWF0dGV4dCcgICAgIDogJ1Bhc3RlIGZvcm1hdHRlZCB0ZXh0JywKCQkncmVtb3ZlZm9ybWF0JyAgICAgICAgOiAnQ2xlYW4gZm9ybWF0JywgCgkJJ3VuZG8nICAgICAgICAgICAgICAgIDogJ1VuZG8gbGFzdCBhY3Rpb24nLAoJCSdyZWRvJyAgICAgICAgICAgICAgICA6ICdSZWRvIHByZXZpb3VzIGFjdGlvbicsCgkJJ2JvbGQnICAgICAgICAgICAgICAgIDogJ0JvbGQnLAoJCSdpdGFsaWMnICAgICAgICAgICAgICA6ICdJdGFsaWMnLAoJCSd1bmRlcmxpbmUnICAgICAgICAgICA6ICdVbmRlcmxpbmUnLAoJCSdzdHJpa2V0aHJvdWdoJyAgICAgICA6ICdTdHJpa2V0aHJvdWdoJywKCQknc3VwZXJzY3JpcHQnICAgICAgICAgOiAnU3VwZXJzY3JpcHQnLAoJCSdzdWJzY3JpcHQnICAgICAgICAgICA6ICdTdWJzY3JpcHQnLAoJCSdqdXN0aWZ5bGVmdCcgICAgICAgICA6ICdBbGlnbiBsZWZ0JywKCQknanVzdGlmeXJpZ2h0JyAgICAgICAgOiAnQWlsZ24gcmlnaHQnLAoJCSdqdXN0aWZ5Y2VudGVyJyAgICAgICA6ICdBbGlnbiBjZW50ZXInLAoJCSdqdXN0aWZ5ZnVsbCcgICAgICAgICA6ICdBbGlnbiBmdWxsJywKCQknaW5kZW50JyAgICAgICAgICAgICAgOiAnSW5kZW50JywKCQknb3V0ZGVudCcgICAgICAgICAgICAgOiAnT3V0ZGVudCcsCgkJJ3J0bCcgOiAnUmlnaHQgdG8gbGVmdCcsCgkJJ2x0cicgOiAnTGVmdCB0byByaWdodCcsCgkJJ2ZvcmVjb2xvcicgICAgICAgICAgIDogJ0ZvbnQgY29sb3InLAoJCSdoaWxpdGVjb2xvcicgICAgICAgICA6ICdCYWNrZ3JvdW5kIGNvbG9yJywKCQknZm9ybWF0YmxvY2snICAgICAgICAgOiAnRm9ybWF0JywKCQknZm9udHNpemUnICAgICAgICAgICAgOiAnRm9udCBzaXplJywKCQknZm9udG5hbWUnICAgICAgICAgICAgOiAnRm9udCcsCgkJJ2luc2VydG9yZGVyZWRsaXN0JyAgIDogJ09yZGVyZWQgbGlzdCcsCgkJJ2luc2VydHVub3JkZXJlZGxpc3QnIDogJ1Vub3JkZXJlZCBsaXN0JywKCQknaG9yaXpvbnRhbHJ1bGUnICAgICAgOiAnSG9yaXpvbnRhbCBydWxlJywKCQknYmxvY2txdW90ZScgICAgICAgICAgOiAnQmxvY2txdW90ZScsCgkJJ2RpdicgICAgICAgICAgICAgICAgIDogJ0Jsb2NrIGVsZW1lbnQgKERJViknLAoJCSdsaW5rJyAgICAgICAgICAgICAgICA6ICdMaW5rJywKCQkndW5saW5rJyAgICAgICAgICAgICAgOiAnRGVsZXRlIGxpbmsnLAoJCSdhbmNob3InICAgICAgICAgICAgICA6ICdCb29rbWFyaycsCgkJJ2ltYWdlJyAgICAgICAgICAgICAgIDogJ0ltYWdlJywKCQkncGFnZWJyZWFrJyAgICAgICAgICAgOiAnUGFnZSBicmVhaycsCgkJJ3NtaWxleScgICAgICAgICAgICAgIDogJ1NtaWxleScsCgkJJ2ZsYXNoJyAgICAgICAgICAgICAgIDogJ0ZsYXNoJywKCQkndGFibGUnICAgICAgICAgICAgICAgOiAnVGFibGUnLAoJCSd0YWJsZXJtJyAgICAgICAgICAgICA6ICdEZWxldGUgdGFibGUnLAoJCSd0YWJsZXByb3BzJyAgICAgICAgICA6ICdUYWJsZSBwcm9wZXJ0aWVzJywKCQkndGJjZWxscHJvcHMnICAgICAgICAgOiAnVGFibGUgY2VsbCBwcm9wZXJ0aWVzJywKCQkndGJyb3diZWZvcmUnICAgICAgICAgOiAnSW5zZXJ0IHJvdyBiZWZvcmUnLAoJCSd0YnJvd2FmdGVyJyAgICAgICAgICA6ICdJbnNlcnQgcm93IGFmdGVyJywKCQkndGJyb3dybScgICAgICAgICAgICAgOiAnRGVsZXRlIHJvdycsCgkJJ3RiY29sYmVmb3JlJyAgICAgICAgIDogJ0luc2VydCBjb2x1bW4gYmVmb3JlJywKCQkndGJjb2xhZnRlcicgICAgICAgICAgOiAnSW5zZXJ0IGNvbHVtbiBhZnRlcicsCgkJJ3RiY29scm0nICAgICAgICAgICAgIDogJ0RlbGV0ZSBjb2x1bW4nLAoJCSd0YmNlbGxzbWVyZ2UnICAgICAgICA6ICdNZXJnZSB0YWJsZSBjZWxscycsCgkJJ3RiY2VsbHNwbGl0JyAgICAgICAgIDogJ1NwbGl0IHRhYmxlIGNlbGwnLAoJCSdkb2NzdHJ1Y3R1cmUnICAgICAgICA6ICdUb2dnbGUgZGlzcGxheSBkb2N1bWVudCBzdHJ1Y3R1cmUnLAoJCSdlbGZpbmRlcicgICAgICAgICAgICA6ICdPcGVuIGZpbGUgbWFuYWdlcicsCgkJJ2Z1bGxzY3JlZW4nICAgICAgICAgIDogJ1RvZ2dsZSBmdWxsIHNjcmVlbiBtb2RlJywKCQknbmJzcCcgICAgICAgICAgICAgICAgOiAnTm9uIGJyZWFrYWJsZSBzcGFjZScsCgkJJ3N0b3BmbG9hdCcgICAgICAgICAgIDogJ1N0b3AgZWxlbWVudCBmbG9hdGluZycsCgkJJ2Fib3V0JyAgICAgICAgICAgICAgIDogJ0Fib3V0IHRoaXMgc29mdHdhcmUnCgl9LAoJcGFuZWxzICAgICAgOiB7CgkJc2F2ZSAgICAgICA6IFsnc2F2ZSddLAoJCWNvcHlwYXN0ZSAgOiBbJ2NvcHknLCAnY3V0JywgJ3Bhc3RlJywgJ3Bhc3RldGV4dCcsICdwYXN0ZWZvcm1hdHRleHQnLCAncmVtb3ZlZm9ybWF0JywgJ2RvY3N0cnVjdHVyZSddLAoJCXVuZG9yZWRvICAgOiBbJ3VuZG8nLCAncmVkbyddLAoJCXN0eWxlICAgICAgOiBbJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsICdzdHJpa2V0aHJvdWdoJywgJ3N1YnNjcmlwdCcsICdzdXBlcnNjcmlwdCddLAoJCWNvbG9ycyAgICAgOiBbJ2ZvcmVjb2xvcicsICdoaWxpdGVjb2xvciddLAoJCWFsaWdubWVudCAgOiBbJ2p1c3RpZnlsZWZ0JywgJ2p1c3RpZnljZW50ZXInLCAnanVzdGlmeXJpZ2h0JywgJ2p1c3RpZnlmdWxsJ10sCgkJaW5kZW50ICAgICA6IFsnb3V0ZGVudCcsICdpbmRlbnQnXSwKCQlmb3JtYXQgICAgIDogWydmb3JtYXRibG9jaycsICdmb250c2l6ZScsICdmb250bmFtZSddLAoJCWxpc3RzICAgICAgOiBbJ2luc2VydG9yZGVyZWRsaXN0JywgJ2luc2VydHVub3JkZXJlZGxpc3QnXSwKCQllbGVtZW50cyAgIDogWydob3Jpem9udGFscnVsZScsICdibG9ja3F1b3RlJywgJ2RpdicsICdzdG9wZmxvYXQnLCAnY3NzJywgJ25ic3AnLCAnc21pbGV5JywgJ3BhZ2VicmVhayddLAoJCWRpcmVjdGlvbiAgOiBbJ2x0cicsICdydGwnXSwKCQlsaW5rcyAgICAgIDogWydsaW5rJywgJ3VubGluaycsICdhbmNob3InXSwKCQlpbWFnZXMgICAgIDogWydpbWFnZSddLAoJCW1lZGlhICAgICAgOiBbJ2ltYWdlJywgJ2ZsYXNoJ10sCQkKCQl0YWJsZXMgICAgIDogWyd0YWJsZScsICd0YWJsZXByb3BzJywgJ3RhYmxlcm0nLCAgJ3Ricm93YmVmb3JlJywgJ3Ricm93YWZ0ZXInLCAndGJyb3dybScsICd0YmNvbGJlZm9yZScsICd0YmNvbGFmdGVyJywgJ3RiY29scm0nLCAndGJjZWxscHJvcHMnLCAndGJjZWxsc21lcmdlJywgJ3RiY2VsbHNwbGl0J10sCgkJZWxmaW5kZXIgICA6IFsnZWxmaW5kZXInXSwKCQlmdWxsc2NyZWVuIDogWydmdWxsc2NyZWVuJywgJ2Fib3V0J10KCX0sCgl0b29sYmFycyAgICA6IHsKCQl0aW55ICAgICA6IFsnc3R5bGUnXSwKCQljb21wYWN0ICA6IFsnc2F2ZScsICd1bmRvcmVkbycsICdzdHlsZScsICdhbGlnbm1lbnQnLCAnbGlzdHMnLCAnbGlua3MnLCAnZnVsbHNjcmVlbiddLAoJCW5vcm1hbCAgIDogWydzYXZlJywgJ2NvcHlwYXN0ZScsICd1bmRvcmVkbycsICdzdHlsZScsICdhbGlnbm1lbnQnLCAnY29sb3JzJywgJ2luZGVudCcsICdsaXN0cycsICdsaW5rcycsICdlbGVtZW50cycsICdpbWFnZXMnLCAnZnVsbHNjcmVlbiddLAoJCWNvbXBsZXRlIDogWydzYXZlJywgJ2NvcHlwYXN0ZScsICd1bmRvcmVkbycsICdzdHlsZScsICdhbGlnbm1lbnQnLCAnY29sb3JzJywgJ2Zvcm1hdCcsICdpbmRlbnQnLCAnbGlzdHMnLCAnbGlua3MnLCAnZWxlbWVudHMnLCAnbWVkaWEnLCAnZnVsbHNjcmVlbiddLAoJCW1heGkgICAgIDogWydzYXZlJywgJ2NvcHlwYXN0ZScsICd1bmRvcmVkbycsICdlbGZpbmRlcicsICdzdHlsZScsICdhbGlnbm1lbnQnLCAnZGlyZWN0aW9uJywgJ2NvbG9ycycsICdmb3JtYXQnLCAnaW5kZW50JywgJ2xpc3RzJywgJ2xpbmtzJywgJ2VsZW1lbnRzJywgJ21lZGlhJywgJ3RhYmxlcycsICdmdWxsc2NyZWVuJ10sCgkJZWxkb3JhZG8gOiBbJ3NhdmUnLCAnY29weXBhc3RlJywgJ2VsZmluZGVyJywgJ3VuZG9yZWRvJywgJ3N0eWxlJywgJ2FsaWdubWVudCcsICdjb2xvcnMnLCAnZm9ybWF0JywgJ2luZGVudCcsICdsaXN0cycsICdsaW5rcycsICdlbGVtZW50cycsICdtZWRpYScsICd0YWJsZXMnLCAnZnVsbHNjcmVlbiddCgkJCgl9LAoJcGFuZWxOYW1lcyA6IHsKCQlzYXZlICAgICAgOiAnU2F2ZScsCgkJY29weXBhc3RlIDogJ0NvcHkvUGFzZScsCgkJdW5kb3JlZG8gIDogJ1VuZG8vUmVkbycsCgkJc3R5bGUgICAgIDogJ1RleHQgc3R5bGVzJywKCQljb2xvcnMgICAgOiAnQ29sb3JzJywKCQlhbGlnbm1lbnQgOiAnQWxpZ25tZW50JywKCQlpbmRlbnQgICAgOiAnSW5kZW50L091dGRlbnQnLAoJCWZvcm1hdCAgICA6ICdUZXh0IGZvcm1hdCcsCgkJbGlzdHMgICAgIDogJ0xpc3RzJywKCQllbGVtZW50cyAgOiAnTWlzYyBlbGVtZW50cycsCgkJZGlyZWN0aW9uIDogJ1NjcmlwdCBkaXJlY3Rpb24nLAoJCWxpbmtzICAgICA6ICdMaW5rcycsCgkJaW1hZ2VzICAgIDogJ0ltYWdlcycsCgkJbWVkaWEgICAgIDogJ01lZGlhJywKCQl0YWJsZXMgICAgOiAnVGFibGVzJywKCQllbGZpbmRlciAgOiAnRmlsZSBtYW5hZ2VyIChlbEZpbmRlciknCgl9Cn07Cn0pKGpRdWVyeSk7Ci8qKgogKiBAY2xhc3Mgc2VsZWN0aW9uICAtIGVsUlRFIHV0aWxzIGZvciB3b3JraW5nIHdpdGggdGV4dCBzZWxlY3Rpb24KICoKICogQHBhcmFtICBlbFJURSAgcnRlICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnNlbGVjdGlvbiA9IGZ1bmN0aW9uKHJ0ZSkgewoJdGhpcy5ydGUgICAgICA9IHJ0ZTsKCXZhciBzZWxmICAgICAgPSB0aGlzOwoJdGhpcy53M2NSYW5nZSA9IG51bGw7Cgl2YXIgc3RhcnQsIGVuZCwgbm9kZSwgYm07CgkKCSQodGhpcy5ydGUuZG9jKQoJCS5rZXl1cChmdW5jdGlvbihlKSB7CgkJCWlmIChlLmN0cmxLZXkgfHwgZS5tZXRhS2V5IHx8IChlLmtleUNvZGUgPj0gOCAmJiBlLmtleUNvZGUgPD0gMTMpIHx8IChlLmtleUNvZGU+PTMyICYmIGUua2V5Q29kZTw9IDQwKSB8fCBlLmtleUNvZGUgPT0gNDYgfHwgKGUua2V5Q29kZSA+PTk2ICYmIGUua2V5Q29kZSA8PSAxMTEpKSB7CgkJCQlzZWxmLmNsZWFuQ2FjaGUoKTsKCQkJfQoJCX0pCgkJLm1vdXNlZG93bihmdW5jdGlvbihlKSB7CgkJCS8vIHNlbGYucnRlLmxvZyhlKQoJCQlpZiAoZS50YXJnZXQubm9kZU5hbWUgPT0gJ0hUTUwnKSB7CgkJCQlzdGFydCA9IHNlbGYucnRlLmRvYy5ib2R5OwoJCQl9IGVsc2UgewoJCQkJc3RhcnQgPSBlLnRhcmdldDsKCQkJfQoJCQllbmQgICA9IG5vZGUgPSBudWxsOwoJCX0pCgkJLm1vdXNldXAoZnVuY3Rpb24oZSkgewoJCQlpZiAoZS50YXJnZXQubm9kZU5hbWUgPT0gJ0hUTUwnKSB7CgkJCQllbmQgPSBzZWxmLnJ0ZS5kb2MuYm9keTsKCQkJfSBlbHNlIHsKCQkJCWVuZCA9IGUudGFyZ2V0OwoJCQl9CgkJCWVuZCAgPSBlLnRhcmdldDsKCQkJbm9kZSA9IG51bGw7CgkJfSkuY2xpY2soKTsKCQkKCS8qKgoJICog0LLQvtC30LLRgNCw0YnQsNC10YIgc2VsZWN0aW9uCgkgKgoJICogQHJldHVybiAgU2VsZWN0aW9uCgkgKiovCglmdW5jdGlvbiBzZWxlY3Rpb24oKSB7CgkJcmV0dXJuIHNlbGYucnRlLndpbmRvdy5nZXRTZWxlY3Rpb24gPyBzZWxmLnJ0ZS53aW5kb3cuZ2V0U2VsZWN0aW9uKCkgOiBzZWxmLnJ0ZS53aW5kb3cuZG9jdW1lbnQuc2VsZWN0aW9uOwoJfQoJCgkvKioKCSAqINCS0YHQv9C+0LzQvtCz0LDRgtC10LvRjNC90LDRjyDRhNGD0L3QutGG0LjRjwoJICog0JLQvtC30LLRgNCw0YnQsNC10YIg0YHQsNC80L7Qs9C+INCy0LXRgNGF0L3QtdCz0L4g0YDQvtC00LjRgtC10LvRjywg0L7RgtCy0LXRh9Cw0Y7RidC10LPQviDRg9GB0LvQvtCy0LjRjiAtINGC0LXQutGD0YnQsNGPINC90L7QtNCwIC0g0LXQs9C+INC10LTQuNC90YHRgtCy0LXQvdC90LDRjyDQvdC10L/Rg9GB0YLQsNGPINC00L7Rh9C10YDQvdGP0Y8g0L3QvtC00LAKCSAqCgkgKiBAcGFyYW0gICBET01FbGVtZW50ICBuINC90L7QtNCwLCDQtNC70Y8g0LrQvtGC0L7RgNC+0Lkg0LjRidC10Lwg0YDQvtC00LjRgtC10LvRjwoJICogQHBhcmFtICAgRE9NRWxlbWVudCAgcCDQtdGB0LvQuCDQt9Cw0LTQsNC90LAgLSDQvdC+0LTQsCwg0LLRi9GI0LUg0LrQvtGC0L7RgNC+0Lkg0L3QtSDQv9C+0LTQvdC40LzQsNC10LzRgdGPCgkgKiBAcGFyYW0gICBTdHJpbmcgICAgICBzINGB0YLRgNC+0L3QsCDQv9C+0LjRgdC60LAgKGxlZnR8fHJpZ2h0fHxudWxsKQoJICogQHJldHVybiAgRE9NRWxlbWVudAoJICoqLwoJZnVuY3Rpb24gcmVhbFNlbGVjdGVkKG4sIHAsIHMpIHsKCQl3aGlsZSAobi5ub2RlTmFtZSAhPSAnQk9EWScgJiYgbi5wYXJlbnROb2RlICYmIG4ucGFyZW50Tm9kZS5ub2RlTmFtZSAhPSAnQk9EWScgJiYgKHAgPyBuIT09IHAgJiYgbi5wYXJlbnROb2RlICE9IHAgOiAxKSAmJiAoKHM9PSdsZWZ0JyAmJiBzZWxmLnJ0ZS5kb20uaXNGaXJzdE5vdEVtcHR5KG4pKSB8fCAocz09J3JpZ2h0JyAmJiBzZWxmLnJ0ZS5kb20uaXNMYXN0Tm90RW1wdHkobikpIHx8IChzZWxmLnJ0ZS5kb20uaXNGaXJzdE5vdEVtcHR5KG4pICYmIHNlbGYucnRlLmRvbS5pc0xhc3ROb3RFbXB0eShuKSkpICkgewoJCQluID0gbi5wYXJlbnROb2RlOwoJCX0KCQlyZXR1cm4gbjsKCX0KCQoJLyoqCgkgKiDQktC+0LfQstGA0LDRidCw0LXRgiBUUlVFLCDQtdGB0LvQuCDQstGL0LTQtdC70LXQvdC40LUgItGB0YXQu9C+0L/QvdGD0YLQviIKCSAqCgkgKiBAcmV0dXJuICBib29sCgkgKiovCgl0aGlzLmNvbGxhcHNlZCA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmdldFJhbmdlQXQoKS5pc0NvbGxhcHNlZCgpOwoJfQoJCgkvKioKCSAqICLQodGF0LvQvtC/0YvQstCw0LXRgiIg0LLRi9C00LXQu9C10L3QuNC1IAoJICoKCSAqIEBwYXJhbSAgIGJvb2wgIHRvU3RhcnQgINGB0YXQu9C+0L/QvdGD0YLRjCDQuiDQvdCw0YfQsNC70YzQvdC+0Lkg0YLQvtGH0LrQtQoJICogQHJldHVybiAgdm9pZAoJICoqLwoJdGhpcy5jb2xsYXBzZSA9IGZ1bmN0aW9uKHN0KSB7CgkJdmFyIHMgPSBzZWxlY3Rpb24oKSwKCQkJciA9IHRoaXMuZ2V0UmFuZ2VBdCgpOwoJCXIuY29sbGFwc2Uoc3Q/dHJ1ZTpmYWxzZSk7CgkJaWYgKCEkLmJyb3dzZXIubXNpZSkgewoJCQlzLnJlbW92ZUFsbFJhbmdlcygpOwoJCQlzLmFkZFJhbmdlKHIpOwoJCQkKCQl9CgkJcmV0dXJuIHRoaXM7Cgl9CgkKCS8qKgoJICog0JLQvtC30LLRgNCw0YnQsNC10YIgVGV4dFJhbmdlCgkgKiDQlNC70Y8g0L3QvtGA0LzQsNC70YzQvdGL0YUg0LHRgNCw0YPQt9C10YDQvtCyIC0g0L3QsNGC0LjQstC90YvQuSByYW5nZQoJICog0LTQu9GPICLRgdCw0LzQuNC30L3QsNC10YLQtdGH0LXQs9C+IiAtINGN0LzRg9C70Y/RhtC40Y4gdzNjIHJhbmdlCgkgKgoJICogQHJldHVybiAgcmFuZ2V8dzNjUmFuZ2UKCSAqKi8KCXRoaXMuZ2V0UmFuZ2VBdCA9IGZ1bmN0aW9uKHVwZGF0ZVczY1JhbmdlKSB7CgkJaWYgKHRoaXMucnRlLmJyb3dzZXIubXNpZSkgewoJCQlpZiAoIXRoaXMudzNjUmFuZ2UpIHsKCQkJCXRoaXMudzNjUmFuZ2UgPSBuZXcgdGhpcy5ydGUudzNjUmFuZ2UodGhpcy5ydGUpOwoJCQl9CgkJCXVwZGF0ZVczY1JhbmdlICYmIHRoaXMudzNjUmFuZ2UudXBkYXRlKCk7CgkJCXJldHVybiB0aGlzLnczY1JhbmdlOwoJCX0KCQkKCQl2YXIgcyA9IHNlbGVjdGlvbigpOwoJCXZhciByID0gcy5yYW5nZUNvdW50ID4gMCA/IHMuZ2V0UmFuZ2VBdCgwKSA6IHRoaXMucnRlLmRvYy5jcmVhdGVSYW5nZSgpOwoJCXIuZ2V0U3RhcnQgPSBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIHRoaXMuc3RhcnRDb250YWluZXIubm9kZVR5cGU9PTEgCgkJCQk/IHRoaXMuc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tNYXRoLm1pbih0aGlzLnN0YXJ0T2Zmc2V0LCB0aGlzLnN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoLTEpXSAKCQkJCTogdGhpcy5zdGFydENvbnRhaW5lcjsKCQl9CgkJCgkJci5nZXRFbmQgPSBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIHRoaXMuZW5kQ29udGFpbmVyLm5vZGVUeXBlPT0xIAoJCQkJPyB0aGlzLmVuZENvbnRhaW5lci5jaGlsZE5vZGVzWyBNYXRoLm1pbih0aGlzLnN0YXJ0T2Zmc2V0ID09IHRoaXMuZW5kT2Zmc2V0ID8gdGhpcy5lbmRPZmZzZXQgOiB0aGlzLmVuZE9mZnNldC0xLCB0aGlzLmVuZENvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aC0xKV0gCgkJCQk6IHRoaXMuZW5kQ29udGFpbmVyOwoJCX0KCQlyLmlzQ29sbGFwc2VkID0gZnVuY3Rpb24oKSB7CgkJCXJldHVybiB0aGlzLmNvbGxhcHNlZDsKCQl9CgkJcmV0dXJuIHI7Cgl9CgkKCXRoaXMuc2F2ZUlFUmFuZ2UgPSBmdW5jdGlvbigpIHsKCQlpZiAoJC5icm93c2VyLm1zaWUpIHsKCQkJYm0gPSB0aGlzLmdldFJhbmdlQXQoKS5nZXRCb29rbWFyaygpOwoJCX0KCX0KCQoJdGhpcy5yZXN0b3JlSUVSYW5nZSA9IGZ1bmN0aW9uKCkgewoJCSQuYnJvd3Nlci5tc2llICYmIGJtICYmIHRoaXMuZ2V0UmFuZ2VBdCgpLm1vdmVUb0Jvb2ttYXJrKGJtKTsKCX0KCQoJdGhpcy5jbG9uZUNvbnRlbnRzID0gZnVuY3Rpb24oKSB7CgkJdmFyIG4gPSB0aGlzLnJ0ZS5kb20uY3JlYXRlKCdkaXYnKSwgciwgYywgaTsKCQlpZiAoJC5icm93c2VyLm1zaWUpIHsKCQkJdHJ5IHsgCgkJCQlyID0gdGhpcy5ydGUud2luZG93LmRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOyAKCQkJfSBjYXRjaChlKSB7IAoJCQkJciA9IHRoaXMucnRlLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOyAKCQkJfQoJCQkkKG4pLmh0bWwoci5odG1sVGV4dCk7CgkJfSBlbHNlIHsKCQkJYyA9IHRoaXMuZ2V0UmFuZ2VBdCgpLmNsb25lQ29udGVudHMoKTsKCQkJZm9yIChpPTA7IGk8Yy5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7CgkJCQluLmFwcGVuZENoaWxkKGMuY2hpbGROb2Rlc1tpXS5jbG9uZU5vZGUodHJ1ZSkpOwoJCQl9CgkJfQoJCXJldHVybiBuOwoJfQoJCgkvKioKCSAqINCS0YvQtNC10LvRj9C10YIg0L3QvtC00YsKCSAqCgkgKiBAcGFyYW0gICBET01Ob2RlICBzICDQvdC+0LTQsCDQvdCw0YfQsNC70LAg0LLRi9C00LXQu9C10L3QuNGPCgkgKiBAcGFyYW0gICBET01Ob2RlICBlICDQvdC+0LTQsCDQutC+0L3RhtCwINCy0YvQtNC10LvQtdC90LjRjwoJICogQHJldHVybiAgc2VsZWN0aW9uCgkgKiovCgl0aGlzLnNlbGVjdCA9IGZ1bmN0aW9uKHMsIGUpIHsKCQllID0gZXx8czsKCQkKCQlpZiAodGhpcy5ydGUuYnJvd3Nlci5tc2llKSB7CgkJCXZhciByICA9IHRoaXMucnRlLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpLAoJCQkJcjEgPSByLmR1cGxpY2F0ZSgpLAoJCQkJcjIgPSByLmR1cGxpY2F0ZSgpOwoJCQkKCQkJcjEubW92ZVRvRWxlbWVudFRleHQocyk7CgkJCXIyLm1vdmVUb0VsZW1lbnRUZXh0KGUpOwoJCQlyLnNldEVuZFBvaW50KCdTdGFydFRvU3RhcnQnLCByMSk7CgkJCXIuc2V0RW5kUG9pbnQoJ0VuZFRvRW5kJywgICAgIHIyKTsKCQkJci5zZWxlY3QoKTsKCQl9IGVsc2UgewoJCQkKCQkJdmFyIHNlbCA9IHNlbGVjdGlvbigpLAoJCQkJciA9IHRoaXMuZ2V0UmFuZ2VBdCgpOwoJCQlyLnNldFN0YXJ0QmVmb3JlKHMpOwoJCQlyLnNldEVuZEFmdGVyKGUpOwoJCQlzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CgkJCXNlbC5hZGRSYW5nZShyKTsKCQl9CgkJcmV0dXJuIHRoaXMuY2xlYW5DYWNoZSgpOwoJfQoJCgkvKioKCSAqINCS0YvQtNC10LvRj9C10YIg0YHQvtC00LXRgNC20LjQvNC+0LUg0L3QvtC00YsKCSAqCgkgKiBAcGFyYW0gICBFbGVtZW50ICBuICDQvdC+0LTQsAoJICogQHJldHVybiAgc2VsZWN0aW9uCgkgKiovCgl0aGlzLnNlbGVjdENvbnRlbnRzID0gZnVuY3Rpb24obikgewoJCXZhciByID0gdGhpcy5nZXRSYW5nZUF0KCk7CgkJaWYgKG4gJiYgbi5ub2RlVHlwZSA9PSAxKSB7CgkJCWlmICh0aGlzLnJ0ZS5icm93c2VyLm1zaWUpIHsKCQkJCXIucmFuZ2UoKTsKCQkJCXIuci5tb3ZlVG9FbGVtZW50VGV4dChuLnBhcmVudE5vZGUpOwoJCQkJci5yLnNlbGVjdCgpOwoJCQl9IGVsc2UgewoJCQkJdHJ5IHsKCQkJCQlyLnNlbGVjdE5vZGVDb250ZW50cyhuKTsKCQkJCX0gY2F0Y2ggKGUpIHsKCQkJCQlyZXR1cm4gdGhpcy5ydGUubG9nKCd1bmFibGUgc2VsZWN0IG5vZGUgY29udGVudHMgJytuKTsKCQkJCX0KCQkJCXZhciBzID0gc2VsZWN0aW9uKCk7CgkJCQlzLnJlbW92ZUFsbFJhbmdlcygpOwoJCQkJcy5hZGRSYW5nZShyKTsKCQkJfQoJCX0KCQlyZXR1cm4gdGhpczsKCX0KCQoJdGhpcy5kZWxldGVDb250ZW50cyA9IGZ1bmN0aW9uKCkgewoJCWlmICghJC5icm93c2VyLm1zaWUpIHsKCQkJdGhpcy5nZXRSYW5nZUF0KCkuZGVsZXRlQ29udGVudHMoKTsKCQl9CgkJcmV0dXJuIHRoaXM7Cgl9CgkKCS8qKgoJICog0JLRgdGC0LDQstC70Y/QtdGCINC90L7QtNGDINCyINGC0LXQutGD0YnQtdC1INCy0YvQtNC10LvQtdC90LjQtQoJICoKCSAqIEBwYXJhbSAgIEVsZW1lbnQgIG4gINC90L7QtNCwCgkgKiBAcmV0dXJuICBzZWxlY3Rpb24KCSAqKi8KCXRoaXMuaW5zZXJ0Tm9kZSA9IGZ1bmN0aW9uKG4sIGNvbGxhcHNlKSB7CgkJaWYgKGNvbGxhcHNlICYmICF0aGlzLmNvbGxhcHNlZCgpKSB7CgkJCXRoaXMuY29sbGFwc2UoKTsKCQl9CgoJCWlmICh0aGlzLnJ0ZS5icm93c2VyLm1zaWUpIHsKCQkJdmFyIGh0bWwgPSBuLm5vZGVUeXBlID09IDMgPyBuLm5vZGVWYWx1ZSA6ICQodGhpcy5ydGUuZG9tLmNyZWF0ZSgnc3BhbicpKS5hcHBlbmQoJChuKSkuaHRtbCgpOwoJCQkgdmFyIHIgPSB0aGlzLmdldFJhbmdlQXQoKTsKCQkJci5pbnNlcnROb2RlKGh0bWwpOwoJCX0gZWxzZSB7CgkJCXZhciByID0gdGhpcy5nZXRSYW5nZUF0KCk7CgkJCXIuaW5zZXJ0Tm9kZShuKTsKCQkJci5zZXRTdGFydEFmdGVyKG4pOwoJCQlyLnNldEVuZEFmdGVyKG4pOwoJCQl2YXIgcyA9IHNlbGVjdGlvbigpOwoJCQlzLnJlbW92ZUFsbFJhbmdlcygpOwoJCQlzLmFkZFJhbmdlKHIpOwoJCX0KCQlyZXR1cm4gdGhpcy5jbGVhbkNhY2hlKCk7Cgl9CgoJLyoqCgkgKiDQktGB0YLQsNCy0LvRj9C10YIgaHRtbCDQsiDRgtC10LrRg9GJ0LXQtSDQstGL0LTQtdC70LXQvdC40LUKCSAqCgkgKiBAcGFyYW0gICBFbGVtZW50ICBuICDQvdC+0LTQsAoJICogQHJldHVybiAgc2VsZWN0aW9uCgkgKiovCgl0aGlzLmluc2VydEh0bWwgPSBmdW5jdGlvbihodG1sLCBjb2xsYXBzZSkgewoJCWlmIChjb2xsYXBzZSAmJiAhdGhpcy5jb2xsYXBzZWQoKSkgewoJCQl0aGlzLmNvbGxhcHNlKCk7CgkJfQoJCQoJCWlmICh0aGlzLnJ0ZS5icm93c2VyLm1zaWUpIHsKCQkJdGhpcy5nZXRSYW5nZUF0KCkucmFuZ2UoKS5wYXN0ZUhUTUwoaHRtbCk7CgkJfSBlbHNlIHsKCQkJdmFyIG4gPSAkKHRoaXMucnRlLmRvbS5jcmVhdGUoJ3NwYW4nKSkuaHRtbChodG1sfHwnJykuZ2V0KDApOwoJCQl0aGlzLmluc2VydE5vZGUobik7CgkJCSQobikucmVwbGFjZVdpdGgoJChuKS5odG1sKCkpOwoJCX0KCQlyZXR1cm4gdGhpcy5jbGVhbkNhY2hlKCk7Cgl9CgoJLyoqCgkgKiDQktGB0YLQsNCy0LvRj9C10YIg0L3QvtC00YMg0LIg0YLQtdC60YPRidC10LUg0LLRi9C00LXQu9C10L3QuNC1CgkgKgoJICogQHBhcmFtICAgRWxlbWVudCAgbiAg0L3QvtC00LAKCSAqIEByZXR1cm4gIHNlbGVjdGlvbgoJICoqLwoJdGhpcy5pbnNlcnRUZXh0ID0gZnVuY3Rpb24odGV4dCwgY29sbGFwc2UpIHsKCQl2YXIgbiA9IHRoaXMucnRlLmRvYy5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTsKCQlyZXR1cm4gdGhpcy5pbnNlcnRIdG1sKG4ubm9kZVZhbHVlKTsKCX0KCgl0aGlzLmdldEJvb2ttYXJrID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5ydGUud2luZG93LmZvY3VzKCk7CgkJdmFyIHIsIHIxLCByMiwgX3MsIF9lLAoJCQlzID0gdGhpcy5ydGUuZG9tLmNyZWF0ZUJvb2ttYXJrKCksCgkJCWUgPSB0aGlzLnJ0ZS5kb20uY3JlYXRlQm9va21hcmsoKTsKCQkJCgkJCgkJCgkJaWYgKCQuYnJvd3Nlci5tc2llKSB7CgkJCXRyeSB7IAoJCQkJciA9IHRoaXMucnRlLndpbmRvdy5kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsgCgkJCX0gY2F0Y2goZSkgeyAKCQkJCXIgPSB0aGlzLnJ0ZS5kb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsgCgkJCX0KCQkJCgkJCWlmIChyLml0ZW0pIHsKCQkJCXZhciBuID0gci5pdGVtKDApOwoJCQkJciA9IHRoaXMucnRlLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOwoJCQkJci5tb3ZlVG9FbGVtZW50VGV4dChuKTsKCQkJfQoJCQkKCQkJcjEgPSByLmR1cGxpY2F0ZSgpOwoJCQlyMiA9IHIuZHVwbGljYXRlKCk7CgkJCV9zID0gdGhpcy5ydGUuZG9tLmNyZWF0ZSgnc3BhbicpOwoJCQlfZSA9IHRoaXMucnRlLmRvbS5jcmVhdGUoJ3NwYW4nKTsKCgkJCV9zLmFwcGVuZENoaWxkKHMpOwoJCQlfZS5hcHBlbmRDaGlsZChlKTsKCgkJCXIxLmNvbGxhcHNlKHRydWUpOwoJCQlyMS5wYXN0ZUhUTUwoX3MuaW5uZXJIVE1MKTsKCQkJcjIuY29sbGFwc2UoZmFsc2UpOwoJCQlyMi5wYXN0ZUhUTUwoX2UuaW5uZXJIVE1MKTsKCQl9IGVsc2UgewoJCQkJdmFyIHNlbCA9IHNlbGVjdGlvbigpOwoJCQkJdmFyIHIgPSBzZWwucmFuZ2VDb3VudCA+IDAgPyBzZWwuZ2V0UmFuZ2VBdCgwKSA6IHRoaXMucnRlLmRvYy5jcmVhdGVSYW5nZSgpOwoJCQkJCgkJCS8vIHIgID0gdGhpcy5nZXRSYW5nZUF0KCk7CgkJCXIxID0gci5jbG9uZVJhbmdlKCk7CgkJCXIyID0gci5jbG9uZVJhbmdlKCk7CgkJCQoJCQkvLyB0aGlzLmluc2VydE5vZGUodGhpcy5ydGUuZG9tLmNyZWF0ZSgnaHInKSkKCQkJLy8gcmV0dXJuCgkJCXIyLmNvbGxhcHNlKGZhbHNlKTsKCQkJcjIuaW5zZXJ0Tm9kZShlKTsKCQkJcjEuY29sbGFwc2UodHJ1ZSk7CgkJCXIxLmluc2VydE5vZGUocyk7CgkJCXRoaXMuc2VsZWN0KHMsIGUpOwoJCX0KCQkKCQlyZXR1cm4gW3MuaWQsIGUuaWRdOwoJfQoKCXRoaXMubW92ZVRvQm9va21hcmsgPSBmdW5jdGlvbihiKSB7CgkJdGhpcy5ydGUud2luZG93LmZvY3VzKCk7CgkJCgkJaWYgKGIgJiYgYi5sZW5ndGg9PTIpIHsKCQkJdmFyIHMgPSB0aGlzLnJ0ZS5kb2MuZ2V0RWxlbWVudEJ5SWQoYlswXSksCgkJCQllID0gdGhpcy5ydGUuZG9jLmdldEVsZW1lbnRCeUlkKGJbMV0pLAoJCQkJc2VsLCByOwoJCQlpZiAocyAmJiBlKSB7CgkJCQl0aGlzLnNlbGVjdChzLCBlKTsKCQkJCWlmICh0aGlzLnJ0ZS5kb20ubmV4dChzKSA9PSBlKSB7CgkJCQkJdGhpcy5jb2xsYXBzZSh0cnVlKTsKCQkJCX0KCQkJCWlmICghJC5icm93c2VyLm1zaWUpIHsKCQkJCQlzZWwgPSBzZWxlY3Rpb24oKTsKCQkJCQlyID0gc2VsLnJhbmdlQ291bnQgPiAwID8gc2VsLmdldFJhbmdlQXQoMCkgOiB0aGlzLnJ0ZS5kb2MuY3JlYXRlUmFuZ2UoKTsKCQkJCQlzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CgkJCQkJc2VsLmFkZFJhbmdlKHIpOwoJCQkJfQoJCQkJCgkJCQlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocyk7CgkJCQllLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7CgkJCX0KCQl9CgkJcmV0dXJuIHRoaXM7CQoJfQoKCXRoaXMucmVtb3ZlQm9va21hcmsgPSBmdW5jdGlvbihiKSB7CgkJdGhpcy5ydGUud2luZG93LmZvY3VzKCk7CgkJaWYgKGIubGVuZ3RoPT0yKSB7CgkJCXZhciBzID0gdGhpcy5ydGUuZG9jLmdldEVsZW1lbnRCeUlkKGJbMF0pLAoJCQkJZSA9IHRoaXMucnRlLmRvYy5nZXRFbGVtZW50QnlJZChiWzFdKTsKCQkJaWYgKHMgJiYgZSkgewoJCQkJcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHMpOwoJCQkJZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpOwoJCQl9CgkJfQoJfQoKCS8qKgoJICog0J7Rh9C40YnQsNC10YIg0LrRjdGICgkgKgoJICogQHJldHVybiAgc2VsZWN0aW9uCgkgKiovCgl0aGlzLmNsZWFuQ2FjaGUgPSBmdW5jdGlvbigpIHsKCQlzdGFydCA9IGVuZCA9IG5vZGUgPSBudWxsOwoJCXJldHVybiB0aGlzOwoJfQoKCQoJLyoqCgkgKiDQktC+0LfQstGA0LDRidCw0LXRgiDQvdC+0LTRgyDQvdCw0YfQsNC70LAg0LLRi9C00LXQu9C10L3QuNGPCgkgKgoJICogQHJldHVybiAgRE9NRWxlbWVudAoJICoqLwoJdGhpcy5nZXRTdGFydCA9IGZ1bmN0aW9uKCkgewoJCWlmICghc3RhcnQpIHsKCQkJdmFyIHIgPSB0aGlzLmdldFJhbmdlQXQoKTsKCQkJc3RhcnQgPSByLmdldFN0YXJ0KCk7CgkJfQoJCXJldHVybiBzdGFydDsKCX0KCQoJLyoqCgkgKiDQktC+0LfQstGA0LDRidCw0LXRgiDQvdC+0LTRgyDQutC+0L3RhtCwINCy0YvQtNC10LvQtdC90LjRjwoJICoKCSAqIEByZXR1cm4gIERPTUVsZW1lbnQKCSAqKi8KCXRoaXMuZ2V0RW5kID0gZnVuY3Rpb24oKSB7CgkJaWYgKCFlbmQpIHsKCQkJdmFyIHIgPSB0aGlzLmdldFJhbmdlQXQoKTsKCQkJZW5kID0gci5nZXRFbmQoKTsKCQl9CgkJcmV0dXJuIGVuZDsKCX0KCgkvKioKCSAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINCy0YvQsdGA0LDQvdGD0Y4g0L3QvtC00YMgKNC+0LHRidC40Lkg0LrQvtC90YLQtdC50L3QtdGAINCy0YHQtdGFINCy0YvQsdGA0LDQvdC90YvRhSDQvdC+0LQpCgkgKgoJICogQHJldHVybiAgRWxlbWVudAoJICoqLwoJdGhpcy5nZXROb2RlID0gZnVuY3Rpb24oKSB7CgkJaWYgKCFub2RlKSB7CgkJCW5vZGUgPSB0aGlzLnJ0ZS5kb20uZmluZENvbW1vbkFuY2VzdG9yKHRoaXMuZ2V0U3RhcnQoKSwgdGhpcy5nZXRFbmQoKSk7CgkJfQoJCXJldHVybiBub2RlOwoJfQoKCQoJLyoqCgkgKiDQktC+0LfQstGA0LDRidCw0LXRgiDQvNCw0YHRgdC40LIg0LLRi9Cx0YDQsNC90L3Ri9GFINC90L7QtAoJICoKCSAqIEBwYXJhbSAgIE9iamVjdCAgbyAg0L/QsNGA0LDQvNC10YLRgNGLINC/0L7Qu9GD0YfQtdC90LjRjyDQuCDQvtCx0YDQsNCx0L7RgtC60Lgg0LLRi9Cx0YDQsNC90YvRhSDQvdC+0LQKCSAqIEByZXR1cm4gIEFycmF5CgkgKiovCgl0aGlzLnNlbGVjdGVkID0gZnVuY3Rpb24obykgewoJCXZhciBvcHRzID0gewoJCQljb2xsYXBzZWQgOiBmYWxzZSwgIC8vINCy0LXRgNC90YPRgtGMINCy0YvQtNC10LvQtdC90LjQtSwg0LTQsNC20LUg0LXRgdC70Lgg0L7QvdC+INGB0YXQu9C+0L/QvdGD0YLQvgoJCQlibG9ja3MgICAgOiBmYWxzZSwgIC8vINCx0LvQvtGH0L3QvtC1INCy0YvQtNC10LvQtdC90LjQtQoJCQlmaWx0ZXIgICAgOiBmYWxzZSwgIC8vINGE0LjQu9GM0YLRgCDRgNC10LfRg9C70YzRgtCw0YLQvtCyCgkJCXdyYXAgICAgICA6ICd0ZXh0JywgLy8g0YfRgtC+INC+0LHQvtGA0LDRh9C40LLQsNC10LwKCQkJdGFnICAgICAgIDogJ3NwYW4nICAvLyDQstC+INGH0YLQviDQvtCx0L7RgNCw0YfQuNCy0LDQtdC8CgkJfQoJCW9wdHMgPSAkLmV4dGVuZCh7fSwgb3B0cywgbyk7CgkJCgkJLy8g0LHQu9C+0YfQvdC+0LUg0LLRi9C00LXQu9C10L3QuNC1IC0g0LjRidC10Lwg0LHQu9C+0YfQvdGD0Y4g0L3QvtC00YMsINC90L4g0L3QtSDRgtCw0LHQu9C40YbRgwoJCWlmIChvcHRzLmJsb2NrcykgewoJCQl2YXIgbiAgPSB0aGlzLmdldE5vZGUoKSwgX24gPSBudWxsOwoJCQlpZiAoX24gPSB0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KG4sICdzZWxlY3Rpb25CbG9jaycpICkgewoJCQkJcmV0dXJuIFtfbl07CgkJCX0gCgkJfQoKCQl2YXIgc2VsICAgID0gdGhpcy5zZWxlY3RlZFJhdyhvcHRzLmNvbGxhcHNlZCwgb3B0cy5ibG9ja3MpOwoJCXZhciByZXQgICAgPSBbXTsKCQl2YXIgYnVmZmVyID0gW107CgkJdmFyIG5keCAgICA9IG51bGw7CgoJCS8vINC+0LHQvtGA0LDRh9C40LLQsNC10Lwg0L3QvtC00Ysg0LIg0LHRg9GE0YTQtdGA0LUKCQlmdW5jdGlvbiB3cmFwKCkgewoJCQkKCQkJZnVuY3Rpb24gYWxsb3dQYXJhZ3JhcGgoKSB7CgkJCQlmb3IgKHZhciBpPTA7IGkgPCBidWZmZXIubGVuZ3RoOyBpKyspIHsKCQkJCQlpZiAoYnVmZmVyW2ldLm5vZGVUeXBlID09IDEgJiYgKHNlbGYucnRlLmRvbS5zZWxmT3JQYXJlbnQoYnVmZmVyW2ldLCAvXlAkLykgfHwgJChidWZmZXJbaV0pLmZpbmQoJ3AnKS5sZW5ndGg+MCkpIHsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCX07CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfSAKCQkJCgkJCWlmIChidWZmZXIubGVuZ3RoPjApIHsKCQkJCXZhciB0YWcgID0gb3B0cy50YWcgPT0gJ3AnICYmICFhbGxvd1BhcmFncmFwaCgpID8gJ2RpdicgOiBvcHRzLnRhZzsKCQkJCXZhciBuICAgID0gc2VsZi5ydGUuZG9tLndyYXAoYnVmZmVyLCB0YWcpOwoJCQkJcmV0W25keF0gPSBuOwoJCQkJbmR4ICAgICAgPSBudWxsOwoJCQkJYnVmZmVyICAgPSBbXTsKCQkJfQoJCX0KCQkKCQkvLyDQtNC+0LHQsNCy0LvRj9C10Lwg0L3QvtC00Ysg0LIg0LHRg9GE0YTQtdGACgkJZnVuY3Rpb24gYWRkVG9CdWZmZXIobikgewoJCQlpZiAobi5ub2RlVHlwZSA9PSAxKSB7CgkJCQlpZiAoL14oVEhFQUR8VEZPT1R8VEJPRFl8Q09MfENPTEdST1VQfFRSKSQvLnRlc3Qobi5ub2RlTmFtZSkpIHsKCQkJCQkkKG4pLmZpbmQoJ3RkLHRoJykuZWFjaChmdW5jdGlvbigpIHsKCQkJCQkJdmFyIHRhZyA9IG9wdHMudGFnID09ICdwJyAmJiAkKHRoaXMpLmZpbmQoJ3AnKS5sZW5ndGg+MCA/ICdkaXYnIDogb3B0cy50YWc7CgkJCQkJCXZhciBuID0gc2VsZi5ydGUuZG9tLndyYXBDb250ZW50cyh0aGlzLCB0YWcpOwoJCQkJCQlyZXR1cm4gcmV0LnB1c2gobik7CgkJCQkJfSkKCQkJCX0gZWxzZSBpZiAoL14oQ0FQVElPTnxURHxUSHxMSXxEVHxERCkkLy50ZXN0KG4ubm9kZU5hbWUpKSB7CgkJCQkJdmFyIHRhZyA9IG9wdHMudGFnID09ICdwJyAmJiAkKG4pLmZpbmQoJ3AnKS5sZW5ndGg+MCA/ICdkaXYnIDogb3B0cy50YWc7CgkJCQkJdmFyIG4gPSBzZWxmLnJ0ZS5kb20ud3JhcENvbnRlbnRzKG4sIHRhZyk7CgkJCQkJcmV0dXJuIHJldC5wdXNoKG4pOwoJCQkJfSAKCQkJfSAKCQkJdmFyIHByZXYgPSBidWZmZXIubGVuZ3RoPjAgPyBidWZmZXJbYnVmZmVyLmxlbmd0aC0xXSA6IG51bGw7CgkJCWlmIChwcmV2ICYmIHByZXYgIT0gc2VsZi5ydGUuZG9tLnByZXYobikpIHsKCQkJCXdyYXAoKTsKCQkJfQoJCQlidWZmZXIucHVzaChuKTsgCgkJCWlmIChuZHggPT09IG51bGwpIHsKCQkJCW5keCA9IHJldC5sZW5ndGg7CgkJCQlyZXQucHVzaCgnZHVtbXknKTsgLy8g0LfQsNCz0LvRg9GI0LrQsCDQtNC70Y8g0L7QsdC+0YDQsNGH0LjQstCw0LXQvNGL0YUg0Y3Qu9C10LzQtdC90YLQvtCyCgkJCX0KCQl9CgkJCgkJaWYgKHNlbC5ub2Rlcy5sZW5ndGg+MCkgewoJCQkKCQkJZm9yICh2YXIgaT0wOyBpIDwgc2VsLm5vZGVzLmxlbmd0aDsgaSsrKSB7CgkJCQl2YXIgbiA9IHNlbC5ub2Rlc1tpXTsKCQkJCQkvLyDQv9C10YDQstGD0Y4g0Lgg0L/QvtGB0Lsg0YLQtdC60YHRgtC+0LLRi9C1INC90L7QtNGLINGA0LDQt9GA0LXQt9Cw0LXQvCwg0LXRgdC70Lgg0L3QtdC+0LHRhdC+0LTQuNC80L4KCQkJCQkgaWYgKG4ubm9kZVR5cGUgPT0gMyAmJiAoaT09MCB8fCBpID09IHNlbC5ub2Rlcy5sZW5ndGgtMSkgJiYgJC50cmltKG4ubm9kZVZhbHVlKS5sZW5ndGg+MCkgewoJCQkJCQlpZiAoaT09MCAmJiBzZWwuc28+MCkgewoJCQkJCQkJbiA9IG4uc3BsaXRUZXh0KHNlbC5zbyk7CgkJCQkJCX0KCQkJCQkJaWYgKGkgPT0gc2VsLm5vZGVzLmxlbmd0aC0xICYmIHNlbC5lbz4wKSB7CgkJCQkJCQluLnNwbGl0VGV4dChpPT0wICYmIHNlbC5zbz4wID8gc2VsLmVvIC0gc2VsLnNvIDogc2VsLmVvKTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJc3dpdGNoIChvcHRzLndyYXApIHsKCQkJCQkJLy8g0L7QsdC+0YDQsNGH0LjQstCw0LXQvCDRgtC+0LvRjNC60L4g0YLQtdC60YHRgtC+0LLRi9C1INC90L7QtNGLINGBIGJyCgkJCQkJCWNhc2UgJ3RleHQnOgoJCQkJCQkJaWYgKChuLm5vZGVUeXBlID09IDEgJiYgbi5ub2RlTmFtZSA9PSAnQlInKSB8fCAobi5ub2RlVHlwZSA9PSAzICYmICQudHJpbShuLm5vZGVWYWx1ZSkubGVuZ3RoPjApKSB7CgkJCQkJCQkJYWRkVG9CdWZmZXIobik7CgkJCQkJCQl9IGVsc2UgaWYgKG4ubm9kZVR5cGUgPT0gMSkgewoJCQkJCQkJCXJldC5wdXNoKG4pOwoJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCS8vINC+0LHQvtGA0LDRh9C40LLQsNC10Lwg0LLRgdC1INC40L3Qu9Cw0LnQvSDRjdC70LXQvNC10L3RgtGLCQoJCQkJCQljYXNlICdpbmxpbmUnOgoJCQkJCQkJaWYgKHRoaXMucnRlLmRvbS5pc0lubGluZShuKSkgewoJCQkJCQkJCWFkZFRvQnVmZmVyKG4pOwoJCQkJCQkJfSBlbHNlIGlmIChuLm5vZGVUeXBlID09IDEpIHsKCQkJCQkJCQkKCQkJCQkJCQlyZXQucHVzaChuKTsKCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoJCQkJCQkvLyDQvtCx0L7RgNCw0YfQuNCy0LDQtdC8INCy0YHQtQkKCQkJCQkJY2FzZSAnYWxsJzoKCQkJCQkJCWlmIChuLm5vZGVUeXBlID09IDEgfHwgIXRoaXMucnRlLmRvbS5pc0VtcHR5KG4pKSB7CgkJCQkJCQkJYWRkVG9CdWZmZXIobik7CgkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJLy8g0L3QuNGH0LXQs9C+INC90LUg0L7QsdC+0YDQsNGH0LjQstCw0LXQvAoJCQkJCQlkZWZhdWx0OgoJCQkJCQkJaWYgKG4ubm9kZVR5cGUgPT0gMSB8fCAhdGhpcy5ydGUuZG9tLmlzRW1wdHkobikpIHsKCQkJCQkJCQlyZXQucHVzaChuKTsKCQkJCQkJCX0KCQkJCQl9CgkJCX07CgkJCXdyYXAoKTsKCQl9CgkKCQlpZiAocmV0Lmxlbmd0aCkgewoJCQl0aGlzLnJ0ZS53aW5kb3cuZm9jdXMoKTsKCQkJCgkJCXRoaXMuc2VsZWN0KHJldFswXSwgcmV0W3JldC5sZW5ndGgtMV0pOwoJCX0JCgkJcmV0dXJuIG9wdHMuZmlsdGVyID8gdGhpcy5ydGUuZG9tLmZpbHRlcihyZXQsIG9wdHMuZmlsdGVyKSA6IHJldDsKCX0KCgl0aGlzLmR1bXAgPSBmdW5jdGlvbihjYSwgcywgZSwgc28sIGVvKSB7CgkJdmFyIHIgPSB0aGlzLmdldFJhbmdlQXQoKTsKCQl0aGlzLnJ0ZS5sb2coJ2NvbW1vbkFuY2VzdG9yQ29udGFpbmVyJyk7CgkJdGhpcy5ydGUubG9nKGNhIHx8IHIuY29tbW9uQW5jZXN0b3JDb250YWluZXIpOwoJCS8vIHRoaXMucnRlLmxvZygnY29tbW9uQW5jZXN0b3JDb250YWluZXIgY2hpbGRzIG51bScpCgkJLy8gdGhpcy9ydGUubG9nKChjYXx8ci5jb21tb25BbmNlc3RvckNvbnRhaW5lcikuY2hpbGROb2Rlcy5sZW5ndGgpCgkJdGhpcy5ydGUubG9nKCdzdGFydENvbnRhaW5lcicpOwoJCXRoaXMucnRlLmxvZyhzIHx8IHIuc3RhcnRDb250YWluZXIpOwoJCXRoaXMucnRlLmxvZygnc3RhcnRPZmZzZXQ6ICcrKHNvPj0wID8gc28gOiByLnN0YXJ0T2Zmc2V0KSk7CgkJdGhpcy5ydGUubG9nKCdlbmRDb250YWluZXInKTsKCQl0aGlzLnJ0ZS5sb2coZXx8ci5lbmRDb250YWluZXIpOwoJCXRoaXMucnRlLmxvZygnZW5kT2Zmc2V0OiAnKyhlbz49MCA/IGVvIDogci5lbmRPZmZzZXQpKTsKCX0KCgkvKioKCSAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC80LDRgdGB0LjQsiDQstGL0LHRgNCw0L3QvdGL0YUg0L3QvtC0LCDQutCw0Log0LXRgdGC0YwKCSAqCgkgKiBAcGFyYW0gICBib29sICAgICAgICAgICDQstC+0LfQstGA0LDRidCw0YLRjCDQtdGB0LvQuCDQstGL0LTQtdC70LXQvdC40LUg0YHRhdC70L7Qv9C90YPRgtC+CgkgKiBAcGFyYW0gICBib29sICAgICAgICAgICAi0LHQu9C+0YfQvdC+0LUiINCy0YvQtNC10LvQtdC90LjQtSAo0YLQtdC60YHRgtC+0LLRi9C1INC90L7QtNGLINCy0LrQu9GO0YfQsNGO0YLRgdGPINC/0L7Qu9C90L7RgdGC0YzRjiwg0L3QtSDQt9Cw0LLQuNGB0LjQvNC+INC+0YIgb2Zmc2V0KQoJICogQHJldHVybiAgQXJyYXkKCSAqKi8KCXRoaXMuc2VsZWN0ZWRSYXcgPSBmdW5jdGlvbihjb2xsYXBzZWQsIGJsb2NrcykgewoJCXZhciByZXMgPSB7c28gOiBudWxsLCBlbyA6IG51bGwsIG5vZGVzIDogW119OwoJCXZhciByICAgPSB0aGlzLmdldFJhbmdlQXQodHJ1ZSk7CgkJdmFyIGNhICA9IHIuY29tbW9uQW5jZXN0b3JDb250YWluZXI7CgkJdmFyIHMsIGU7ICAvLyBzdGFydCAmIGVuZCBub2RlcwoJCXZhciBzZiAgPSBmYWxzZTsgLy8gc3RhcnQgbm9kZSBmdWxseSBzZWxlY3RlZAoJCXZhciBlZiAgPSBmYWxzZTsgLy8gZW5kIG5vZGUgZnVsbHkgc2VsZWN0ZWQKCQkKCQkvLyDQstC+0LfQstGA0LDRidCw0LXRgiB0cnVlLCDQtdGB0LvQuCDQvdC+0LTQsCDQvdC1INGC0LXQutGB0YLQvtCy0LDRjyDQuNC70Lgg0LLRi9C00LXQu9C10L3QsCDQv9C+0LvQvdC+0YHRgtGM0Y4KCQlmdW5jdGlvbiBpc0Z1bGx5U2VsZWN0ZWQobiwgcywgZSkgewoJCQlpZiAobi5ub2RlVHlwZSA9PSAzKSB7CgkJCQllID0gZT49MCA/IGUgOiBuLm5vZGVWYWx1ZS5sZW5ndGg7CgkJCQlyZXR1cm4gKHM9PTAgJiYgZT09bi5ub2RlVmFsdWUubGVuZ3RoKSB8fCAkLnRyaW0obi5ub2RlVmFsdWUpLmxlbmd0aCA9PSAkLnRyaW0obi5ub2RlVmFsdWUuc3Vic3RyaW5nKHMsIGUpKS5sZW5ndGg7CgkJCX0gCgkJCXJldHVybiB0cnVlOwoJCX0KCQkKCQkvLyDQstC+0LfQstGA0LDRidCw0LXRgiB0cnVlLCDQtdGB0LvQuCDQvdC+0LTQsCDQv9GD0YHRgtCw0Y8g0LjQu9C4INCyINC90LXQuSDQvdC1INCy0YvQtNC10LvQtdC90L4g0L3QuCDQvtC00L3QvtCz0L4g0L3QtdC/0YDQvtCx0LXQu9GM0L3QvtCz0L4g0YHQuNC80LLQvtC70LAKCQlmdW5jdGlvbiBpc0VtcHR5U2VsZWN0ZWQobiwgcywgZSkgewoJCQlpZiAobi5ub2RlVHlwZSA9PSAxKSB7CgkJCQlyZXR1cm4gc2VsZi5ydGUuZG9tLmlzRW1wdHkobik7CgkJCX0gZWxzZSBpZiAobi5ub2RlVHlwZSA9PSAzKSB7CgkJCQlyZXR1cm4gJC50cmltKG4ubm9kZVZhbHVlLnN1YnN0cmluZyhzfHwwLCBlPj0wID8gZSA6IG4ubm9kZVZhbHVlLmxlbmd0aCkpLmxlbmd0aCA9PSAwOwoJCQl9IAoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJCgkJCgkJLy90aGlzLmR1bXAoKQoJCS8vINC90LDRh9Cw0LvRjNC90LDRjyDQvdC+0LTQsAoJCWlmIChyLnN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09IDEpIHsKCQkJaWYgKHIuc3RhcnRPZmZzZXQ8ci5zdGFydENvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aCkgewoJCQkJcyA9IHIuc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tyLnN0YXJ0T2Zmc2V0XTsKCQkJCXJlcy5zbyA9IHMubm9kZVR5cGUgPT0gMSA/IG51bGwgOiAwOwoJCQl9IGVsc2UgewoJCQkJcyA9IHIuc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tyLnN0YXJ0T2Zmc2V0LTFdOwoJCQkJcmVzLnNvID0gcy5ub2RlVHlwZSA9PSAxID8gbnVsbCA6IHMubm9kZVZhbHVlLmxlbmd0aDsKCQkJfQoJCX0gZWxzZSB7CgkJCXMgPSByLnN0YXJ0Q29udGFpbmVyOwoJCQlyZXMuc28gPSByLnN0YXJ0T2Zmc2V0OwoJCX0gCgkJCgkJLy8g0LLRi9C00LXQu9C10L3QuNC1INGB0YXQu9C+0L/QvdGD0YLQvgoJCWlmIChyLmNvbGxhcHNlZCkgewoJCQlpZiAoY29sbGFwc2VkKSB7CgkJCQkvLyAg0LHQu9C+0YfQvdC+0LUg0LLRi9C00LXQu9C10L3QuNC1CgkJCQlpZiAoYmxvY2tzKSB7CgkJCQkJcyA9IHJlYWxTZWxlY3RlZChzKTsKCQkJCQlpZiAoIXRoaXMucnRlLmRvbS5pc0VtcHR5KHMpIHx8IChzID0gdGhpcy5ydGUuZG9tLm5leHQocykpKSB7CgkJCQkJCXJlcy5ub2RlcyA9IFtzXTsKCQkJCQl9IAoJCQkJCQoJCQkJCS8vINC00L7QsdCw0LLQu9GP0LXQvCDQuNC90LvQsNC50L0g0YHQvtGB0LXQtNC10LkgCgkJCQkJaWYgKHRoaXMucnRlLmRvbS5pc0lubGluZShzKSkgewoJCQkJCQlyZXMubm9kZXMgPSB0aGlzLnJ0ZS5kb20udG9MaW5lU3RhcnQocykuY29uY2F0KHJlcy5ub2RlcywgdGhpcy5ydGUuZG9tLnRvTGluZUVuZChzKSk7CgkJCQkJfQoJCQkJCQoJCQkJCS8vIG9mZnNldCDQtNC70Y8g0YLQtdC60YHRgtC+0LLRi9GFINC90L7QtAoJCQkJCWlmIChyZXMubm9kZXMubGVuZ3RoPjApIHsKCQkJCQkJcmVzLnNvID0gcmVzLm5vZGVzWzBdLm5vZGVUeXBlID09IDEgPyBudWxsIDogMDsKCQkJCQkJcmVzLmVvID0gcmVzLm5vZGVzW3Jlcy5ub2Rlcy5sZW5ndGgtMV0ubm9kZVR5cGUgPT0gMSA/IG51bGwgOiByZXMubm9kZXNbcmVzLm5vZGVzLmxlbmd0aC0xXS5ub2RlVmFsdWUubGVuZ3RoOwoJCQkJCX0KCQkJCQkKCQkJCX0gZWxzZSBpZiAoIXRoaXMucnRlLmRvbS5pc0VtcHR5KHMpKSB7CgkJCQkJcmVzLm5vZGVzID0gW3NdOwoJCQkJfQoJCQkJCgkJCX0KCQkJcmV0dXJuIHJlczsKCQl9CgkJCgkJLy8g0LrQvtC90LXRh9C90LDRjyDQvdC+0LTQsAoJCWlmIChyLmVuZENvbnRhaW5lci5ub2RlVHlwZSA9PSAxKSB7CgkJCWUgPSByLmVuZENvbnRhaW5lci5jaGlsZE5vZGVzW3IuZW5kT2Zmc2V0LTFdOwoJCQlyZXMuZW8gPSBlLm5vZGVUeXBlID09IDEgPyBudWxsIDogZS5ub2RlVmFsdWUubGVuZ3RoOwoJCX0gZWxzZSB7CgkJCWUgPSByLmVuZENvbnRhaW5lcjsKCQkJcmVzLmVvID0gci5lbmRPZmZzZXQ7CgkJfSAKCQkvLyB0aGlzLnJ0ZS5sb2coJ3NlbGVjdCAxJykKCQkvL3RoaXMuZHVtcChjYSwgcywgZSwgcmVzLnNvLCByZXMuZW8pCgkJCgkJLy8g0L3QsNGH0LDQu9GM0L3QsNGPINC90L7QtNCwINCy0YvQtNC10LvQtdC90LAg0L/QvtC70L3QvtGB0YLRjNGOIC0g0L/QvtC00L3QuNC80LDQtdC80YHRjyDQvdCw0LLQtdGA0YUg0L/QviDQu9C10LLQvtC5INGB0YLQvtGA0L7QvdC1CgkJaWYgKHMubm9kZVR5cGUgPT0gMSB8fCBibG9ja3MgfHwgaXNGdWxseVNlbGVjdGVkKHMsIHJlcy5zbywgcy5ub2RlVmFsdWUubGVuZ3RoKSkgewovLwkJCXRoaXMucnRlLmxvZygnc3RhcnQgdGV4dCBub2RlIGlzIGZ1bGx5IHNlbGVjdGVkJykKCQkJcyA9IHJlYWxTZWxlY3RlZChzLCBjYSwgJ2xlZnQnKTsKCQkJc2YgPSB0cnVlOwoJCQlyZXMuc28gPSBzLm5vZGVUeXBlID09IDEgPyBudWxsIDogMDsKCQl9CgkJLy8g0LrQvtC90LXRh9C90LDRjyDQvdC+0LTQsCDQstGL0LTQtdC70LXQvdCwINC/0L7Qu9C90L7RgdGC0YzRjiAtINC/0L7QtNC90LjQvNCw0LXQvNGB0Y8g0L3QsNCy0LXRgNGFINC/0L4g0L/RgNCw0LLQvtC5INGB0YLQvtGA0L7QvdC1CgkJaWYgKGUubm9kZVR5cGUgPT0gMSB8fCBibG9ja3MgfHwgaXNGdWxseVNlbGVjdGVkKGUsIDAsICByZXMuZW8pKSB7Ci8vCQkJdGhpcy5ydGUubG9nKCdlbmQgdGV4dCBub2RlIGlzIGZ1bGx5IHNlbGVjdGVkJykKCQkJZSA9IHJlYWxTZWxlY3RlZChlLCBjYSwgJ3JpZ2h0Jyk7CgkJCWVmID0gdHJ1ZTsKCQkJcmVzLmVvID0gZS5ub2RlVHlwZSA9PSAxID8gbnVsbCA6IGUubm9kZVZhbHVlLmxlbmd0aDsKCQl9CgoJCS8vINCx0LvQvtGH0L3QvtC1INCy0YvQtNC10LvQtdC90LjQtSAtINC10YHQu9C4INC90L7QtNGLINC90LUg0Y3Qu9C10LzQtdC90YLRiyAtINC/0L7QtNC90LjQvNCw0LXQvNGB0Y8g0Log0YDQvtC00LjRgtC10LvRjiwg0L3QviDQvdC40LbQtSDQutC+0L3RgtC10LnQvdC10YDQsAoJCWlmIChibG9ja3MpIHsKCQkJaWYgKHMubm9kZVR5cGUgIT0gMSAmJiBzLnBhcmVudE5vZGUgIT0gY2EgJiYgcy5wYXJlbnROb2RlLm5vZGVOYW1lICE9ICdCT0RZJykgewoJCQkJcyA9IHMucGFyZW50Tm9kZTsKCQkJCXJlcy5zbyA9IG51bGw7CgkJCX0KCQkJaWYgKGUubm9kZVR5cGUgIT0gMSAmJiBlLnBhcmVudE5vZGUgIT0gY2EgJiYgZS5wYXJlbnROb2RlLm5vZGVOYW1lICE9ICdCT0RZJykgewoJCQkJZSA9IGUucGFyZW50Tm9kZTsKCQkJCXJlcy5lbyA9IG51bGw7CgkJCX0KCQl9CgoJCS8vINC10YHQu9C4INC60L7QvdGC0LXQvdC10YAg0LLRi9C00LXQu9C10L0g0L/QvtC70L3QvtGB0YLRjNGOLCDQv9C+0LTQvdC40LzQsNC10LzRgdGPINC90LDQstC10YDRhSDQvdCw0YHQutC+0LvRjNC60L4g0LzQvtC20L3QvgoJCWlmIChzLnBhcmVudE5vZGUgPT0gZS5wYXJlbnROb2RlICYmIHMucGFyZW50Tm9kZS5ub2RlTmFtZSAhPSAnQk9EWScgJiYgKHNmICYmIHRoaXMucnRlLmRvbS5pc0ZpcnN0Tm90RW1wdHkocykpICYmIChlZiAmJiB0aGlzLnJ0ZS5kb20uaXNMYXN0Tm90RW1wdHkoZSkpKSB7Ci8vCQkJdGhpcy5ydGUubG9nKCdjb21tb24gcGFyZW50JykKCQkJcyA9IGUgPSBzLnBhcmVudE5vZGU7CgkJCXJlcy5zbyA9IHMubm9kZVR5cGUgPT0gMSA/IG51bGwgOiAwOwoJCQlyZXMuZW8gPSBlLm5vZGVUeXBlID09IDEgPyBudWxsIDogZS5ub2RlVmFsdWUubGVuZ3RoOwoJCX0KCQkvLyDQvdCw0YfQsNC70YzQvdCw0Y8g0L3QvtC00LAgPT0g0LrQvtC90LXRh9C90L7QuSDQvdC+0LTQtQoJCWlmIChzID09IGUpIHsKLy8JCQl0aGlzLnJ0ZS5sb2coJ3N0YXJ0IGlzIGVuZCcpCgkJCWlmICghdGhpcy5ydGUuZG9tLmlzRW1wdHkocykpIHsKCQkJCXJlcy5ub2Rlcy5wdXNoKHMpOwoJCQl9CgkJCXJldHVybiByZXM7CgkJfQoJCSAvLyB0aGlzLnJ0ZS5sb2coJ3N0YXJ0IDInKQoJCSAgLy90aGlzLmR1bXAoY2EsIHMsIGUsIHJlcy5zbywgcmVzLmVvKQoJCQoJCS8vINC90LDRhdC+0LTQuNC8INC90LDRh9Cw0LvRjNC90YPRjiDQuCDQutC+0L3QtdGH0L3Rg9GOINGC0L7Rh9C60LggLSDQvdC+0LTRiyDQuNC3INC40LXRgNCw0YDRhdC40Lgg0YDQvtC00LjRgtC10LvQtdC5INC90LDRh9Cw0LvRjNC90L7QuSDQuCDQutC+0L3QtdGH0L3QviDQvdC+0LTRiywg0YMg0LrQvtGC0L7RgNGL0YUg0YDQvtC00LjRgtC10LvRjCAtINC60L7QvdGC0LXQudC90LXRgAoJCXZhciBzcCA9IHM7CgkJd2hpbGUgKHNwLm5vZGVOYW1lICE9ICdCT0RZJyAmJiBzcC5wYXJlbnROb2RlICE9PSBjYSAmJiBzcC5wYXJlbnROb2RlLm5vZGVOYW1lICE9ICdCT0RZJykgewoJCQlzcCA9IHNwLnBhcmVudE5vZGU7CgkJfQoJCS8vdGhpcy5ydGUubG9nKHMubm9kZU5hbWUpCgkJLy8gdGhpcy5ydGUubG9nKCdzdGFydCBwb2ludCcpCgkJLy8gdGhpcy5ydGUubG9nKHNwKQoJCQoJCXZhciBlcCA9IGU7Ci8vCQl0aGlzLnJ0ZS5sb2coZXApCgkJd2hpbGUgKGVwLm5vZGVOYW1lICE9ICdCT0RZJyAmJiBlcC5wYXJlbnROb2RlICE9PSBjYSAmJiBlcC5wYXJlbnROb2RlLm5vZGVOYW1lICE9ICdCT0RZJykgewoJCQkvLyB0aGlzLnJ0ZS5sb2coZXApCgkJCWVwID0gZXAucGFyZW50Tm9kZTsKCQl9CgkJLy8gdGhpcy5ydGUubG9nKCdlbmQgcG9pbnQnKQoJCS8vIHRoaXMucnRlLmxvZyhlcCkKCQkKCQkKCQkvLyAg0LXRgdC70Lgg0L3QsNGH0LDQu9GM0L3QsNGPINC90L7QtNCwINC90LUg0L/Rg9GB0YLQsNGPIC0g0LTQvtCx0LDQstC70Y/QtdC8INC10LUKCQlpZiAoIWlzRW1wdHlTZWxlY3RlZChzLCByZXMuc28sIHMubm9kZVR5cGU9PTMgPyBzLm5vZGVWYWx1ZS5sZW5ndGggOiBudWxsKSkgewoJCQlyZXMubm9kZXMucHVzaChzKTsKCQl9CgkJLy8g0L/QvtC00L3QuNC80LDQtdC80YHRjyDQvtGCINC90LDRh9Cw0LvRjNC90L7QuSDQvdC+0LTRiyDQtNC+INC90LDRh9Cw0LvRjNC90L7QuSDRgtC+0YfQutC4CgkJdmFyIG4gPSBzOwoJCXdoaWxlIChuICE9PSBzcCkgewoJCQl2YXIgX24gPSBuOwoJCQl3aGlsZSAoKF9uID0gdGhpcy5ydGUuZG9tLm5leHQoX24pKSkgewoJCQkJCXJlcy5ub2Rlcy5wdXNoKF9uKTsKCQkJfQoJCQluID0gbi5wYXJlbnROb2RlOwoJCX0KCQkvLyDQvtGCINC90LDRh9Cw0LvRjNC90L7QuSDRgtC+0YfQutC4INC00L4g0LrQvtC90LXRh9C90L7QuSDRgtC+0YfQutC4CgkJbiA9IHNwOwoJCXdoaWxlICgobiA9IHRoaXMucnRlLmRvbS5uZXh0KG4pKSAmJiBuIT0gZXAgKSB7Ci8vCQkJdGhpcy5ydGUubG9nKG4pCgkJCXJlcy5ub2Rlcy5wdXNoKG4pOwoJCX0KCQkvLyDQv9C+0LTQvdC40LzQsNC10LzRgdGPINC+0YIg0LrQvtC90LXRh9C90L7QuSDQvdC+0LTRiyDQtNC+INC60L7QvdC10YfQvdC+0Lkg0YLQvtGH0LrQuCwg0YDQtdC30YPQu9GM0YLQsNGCINC/0LXRgNC10LLQvtGA0LDRh9C40LLQsNC10LwKCQl2YXIgdG1wID0gW107CgkJbiA9IGU7CgkJd2hpbGUgKG4gIT09IGVwKSB7CgkJCXZhciBfbiA9IG47CgkJCXdoaWxlICgoX24gPSB0aGlzLnJ0ZS5kb20ucHJldihfbikpKSB7CgkJCQl0bXAucHVzaChfbik7CgkJCX0KCQkJbiA9IG4ucGFyZW50Tm9kZTsKCQl9CgkJaWYgKHRtcC5sZW5ndGgpIHsKCQkJcmVzLm5vZGVzID0gcmVzLm5vZGVzLmNvbmNhdCh0bXAucmV2ZXJzZSgpKTsKCQl9CgkJLy8gINC10YHQu9C4INC60L7QvdC10YfQvdCw0Y8g0L3QvtC00LAg0L3QtSDQv9GD0YHRgtCw0Y8g0LggIT0g0L3QsNGH0LDQu9GM0L3QvtC5IC0g0LTQvtCx0LDQstC70Y/QtdC8INC10LUKCQlpZiAoIWlzRW1wdHlTZWxlY3RlZChlLCAwLCBlLm5vZGVUeXBlPT0zID8gcmVzLmVvIDogbnVsbCkpIHsKCQkJcmVzLm5vZGVzLnB1c2goZSk7CgkJfQoJCQoJCWlmIChibG9ja3MpIHsKCQkJLy8g0LTQvtCx0LDQstC70Y/QtdC8INC40L3Qu9Cw0LnQvSDRgdC+0YHQtdC00LXQuSDRgdC70LXQstCwCgkJCWlmICh0aGlzLnJ0ZS5kb20uaXNJbmxpbmUocykpIHsKCQkJCXJlcy5ub2RlcyA9IHRoaXMucnRlLmRvbS50b0xpbmVTdGFydChzKS5jb25jYXQocmVzLm5vZGVzKTsKCQkJCXJlcy5zbyAgICA9IHJlcy5ub2Rlc1swXS5ub2RlVHlwZSA9PSAxID8gbnVsbCA6IDA7CgkJCX0KCQkJLy8g0LTQvtCx0LDQstC70Y/QtdC8INC40L3Qu9Cw0LnQvSDRgdC+0YHQtdC00LXQuSDRgdC/0YDQsNCy0LAKCQkJaWYgKHRoaXMucnRlLmRvbS5pc0lubGluZShlKSkgewoJCQkJcmVzLm5vZGVzID0gcmVzLm5vZGVzLmNvbmNhdCh0aGlzLnJ0ZS5kb20udG9MaW5lRW5kKGUpKTsKCQkJCXJlcy5lbyAgICA9IHJlcy5ub2Rlc1tyZXMubm9kZXMubGVuZ3RoLTFdLm5vZGVUeXBlID09IDEgPyBudWxsIDogcmVzLm5vZGVzW3Jlcy5ub2Rlcy5sZW5ndGgtMV0ubm9kZVZhbHVlLmxlbmd0aDsKCQkJfQoJCX0KCQkKCQkvLyDQstGB0LUg0YDQsNC00YPRjtGC0YHRjyEgOikKCQlyZXR1cm4gcmVzOwoJfQoJCn0KCn0pKGpRdWVyeSk7LyoqCiAqIEBjbGFzcyBlbFJURSBVc2VyIGludGVyZmFjZSBjb250cm9sbGVyCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEB0b2RvOiB0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJykgLSBtb3ZlIHRvIHVpLnVwZGF0ZTsKICogQHRvZG86IGFkZCBkb20gYW5kIHNlbGVjdGlvbiBhcyBidXR0b24gbWVtYmVycwogKiBDb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aSA9IGZ1bmN0aW9uKHJ0ZSkgewoJdGhpcy5ydGUgICAgICA9IHJ0ZTsKCXRoaXMuX2J1dHRvbnMgPSBbXTsKCXZhciBzZWxmICAgICAgPSB0aGlzLAoJCXRiICAgICAgICA9IHRoaXMucnRlLm9wdGlvbnMudG9vbGJhcnNbcnRlLm9wdGlvbnMudG9vbGJhciAmJiBydGUub3B0aW9ucy50b29sYmFyc1tydGUub3B0aW9ucy50b29sYmFyXSA/IHJ0ZS5vcHRpb25zLnRvb2xiYXIgOiAnbm9ybWFsJ10sCgkJdGJsICAgICAgID0gdGIubGVuZ3RoLAoJCXAsIHBuYW1lLCBwbCwgbiwgYywgYiwgaTsKCQoJLy8gYWRkIHByb3RvdHlwZSB0byBhbGwgYnV0dG9ucwoJZm9yIChpIGluIHRoaXMuYnV0dG9ucykgewoJCWlmICh0aGlzLmJ1dHRvbnMuaGFzT3duUHJvcGVydHkoaSkgJiYgaSAhPSAnYnV0dG9uJykgewoJCQl0aGlzLmJ1dHRvbnNbaV0ucHJvdG90eXBlID0gdGhpcy5idXR0b25zLmJ1dHRvbi5wcm90b3R5cGU7CgkJfQoJfQoJCgkvLyBjcmVhdGUgYnV0dG9ucyBhbmQgcHV0IG9uIHRvb2xiYXIKCXdoaWxlICh0YmwtLSkgewoJCXBuYW1lID0gdGJbdGJsXTsKCQlwID0gJCgnPHVsIGNsYXNzPSJwYW5lbC0nK3BuYW1lKyh0YmwgPT0gMCA/ICcgZmlyc3QnIDogJycpKyciIC8+JykucHJlcGVuZFRvKHRoaXMucnRlLnRvb2xiYXIpOwoJCXAuYmluZCgnbW91c2Vkb3duJywgZnVuY3Rpb24oZSkgewoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJfSkKCQlwbCA9IHRoaXMucnRlLm9wdGlvbnMucGFuZWxzW3BuYW1lXS5sZW5ndGg7CgkJd2hpbGUgKHBsLS0pIHsKCQkJbiA9IHRoaXMucnRlLm9wdGlvbnMucGFuZWxzW3BuYW1lXVtwbF07CgkJCWMgPSB0aGlzLmJ1dHRvbnNbbl0gfHwgdGhpcy5idXR0b25zLmJ1dHRvbjsKCQkJdGhpcy5fYnV0dG9ucy5wdXNoKChiID0gbmV3IGModGhpcy5ydGUsIG4pKSk7CgkJCXAucHJlcGVuZChiLmRvbUVsZW0pOwoJCX0KCX0KCQoJdGhpcy51cGRhdGUoKTsKCQoJdGhpcy5kaXNhYmxlID0gZnVuY3Rpb24oKSB7CgkJJC5lYWNoKHNlbGYuX2J1dHRvbnMsIGZ1bmN0aW9uKCkgewoJCQkhdGhpcy5hY3RpdmUgJiYgdGhpcy5kb21FbGVtLmFkZENsYXNzKCdkaXNhYmxlZCcpOwoJCX0pOwoJfQoJCn0KCi8qKgogKiDQntCx0L3QvtCy0LvRj9C10YIg0LrQvdC+0L/QutC4IC0g0LLRi9C30YvQstCw0LXRgiDQvNC10YLQvtC0IHVwZGF0ZSgpINC00LvRjyDQutCw0LbQtNC+0Lkg0LrQvdC+0L/QutC4CiAqCiAqIEByZXR1cm4gdm9pZAogKiovCmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oY2xlYW5DYWNoZSkgewoJY2xlYW5DYWNoZSAmJiB0aGlzLnJ0ZS5zZWxlY3Rpb24uY2xlYW5DYWNoZSgpOwoJdmFyIG4gICAgPSB0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLAoJCXAgICAgPSB0aGlzLnJ0ZS5kb20ucGFyZW50cyhuLCAnKicpLAoJCXJ0bCA9IHRoaXMucnRlLnJ0bCwKCQlzZXAgID0gcnRsID8gJyAmbGFxdW87ICcgOiAnICZyYXF1bzsgJywgCgkJcGF0aCA9ICcnLCBuYW1lLCBpOwoJCQoJZnVuY3Rpb24gX25hbWUobikgewoJCXZhciBuYW1lID0gbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCW4gPSAkKG4pCgkJaWYgKG5hbWUgPT0gJ2ltZycpIHsKCQkJaWYgKG4uaGFzQ2xhc3MoJ2VscnRlLW1lZGlhJykpIHsKCQkJCW5hbWUgPSAnbWVkaWEnOwoJCQl9IGVsc2UgaWYgKG4uaGFzQ2xhc3MoJ2VscnRlLWdvb2dsZS1tYXBzJykpIHsKCQkJCW5hbWUgPSAnZ29vZ2xlIG1hcCc7CgkJCX0gZWxzZSBpZiAobi5oYXNDbGFzcygnZWxydGUteWFuZGV4LW1hcHMnKSkgewoJCQkJbmFtZSA9ICd5YW5kZXggbWFwJzsKCQkJfSBlbHNlIGlmIChuLmhhc0NsYXNzKCdlbHJ0ZS1wYWdlYnJlYWsnKSkgewoJCQkJbmFtZSA9ICdwYWdlYnJlYWsnOwoJCQl9CgkJfQoJCXJldHVybiBuYW1lOwoJfQoJCglpZiAobiAmJiBuLm5vZGVUeXBlID09IDEgJiYgbi5ub2RlTmFtZSAhPSAnQk9EWScpIHsKCQlwLnVuc2hpZnQobik7Cgl9CgkKCWlmICghcnRsKSB7CgkJcCA9IHAucmV2ZXJzZSgpOwoJfQoJCglmb3IgKGk9MDsgaSA8IHAubGVuZ3RoOyBpKyspIHsKCQlwYXRoICs9IChpPjAgPyBzZXAgOiAnJykrX25hbWUocFtpXSk7Cgl9CgkKCXRoaXMucnRlLnN0YXR1c2Jhci5odG1sKHBhdGgpOwoJJC5lYWNoKHRoaXMuX2J1dHRvbnMsIGZ1bmN0aW9uKCkgewoJCXRoaXMudXBkYXRlKCk7Cgl9KTsKCXRoaXMucnRlLndpbmRvdy5mb2N1cygpOwp9CgoKCmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucyA9IHsKCQoJLyoqCgkgKiBAY2xhc3Mg0LrQvdC+0L/QutCwINC90LAgdG9vbGJhciDRgNC10LTQsNC60YLQvtGA0LAgCgkgKiDRgNC10LDQu9C40LfRg9C10YIg0L/QvtCy0LXQtNC10L3QuNC1INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOINC4INGP0LLQu9GP0LXRgtGB0Y8g0YDQvtC00LjRgtC10LvQtdC8INC00LvRjyDQtNGA0YPQs9C40YUg0LrQvdC+0L/QvtC6CgkgKgoJICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKCSAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4ICjQutC+0LzQsNC90LTQsCDQuNGB0L/QvtC70L3Rj9C10LzQsNGPIGRvY3VtZW50LmV4ZWNDb21tYW5kKCkpCgkgKiovCglidXR0b24gOiBmdW5jdGlvbihydGUsIG5hbWUpIHsKCQl2YXIgc2VsZiAgICAgPSB0aGlzOwoJCXRoaXMucnRlICAgICA9IHJ0ZTsKCQl0aGlzLmFjdGl2ZSA9IGZhbHNlOwoJCXRoaXMubmFtZSAgICA9IG5hbWU7CgkJdGhpcy52YWwgICAgID0gbnVsbDsKCQl0aGlzLmRvbUVsZW0gPSAkKCc8bGkgc3R5bGU9Ii1tb3otdXNlci1zZWxlY3Q6LW1vei1ub25lIiBjbGFzcz0iJytuYW1lKycgcm91bmRlZC0zIiBuYW1lPSInK25hbWUrJyIgdGl0bGU9IicrdGhpcy5ydGUuaTE4bih0aGlzLnJ0ZS5vcHRpb25zLmJ1dHRvbnNbbmFtZV0gfHwgbmFtZSkrJyIgdW5zZWxlY3RhYmxlPSJvbiIgLz4nKQoJCQkuaG92ZXIoCgkJCQlmdW5jdGlvbigpIHsgJCh0aGlzKS5hZGRDbGFzcygnaG92ZXInKTsgfSwKCQkJCWZ1bmN0aW9uKCkgeyAkKHRoaXMpLnJlbW92ZUNsYXNzKCdob3ZlcicpOyB9CgkJCSkKCQkJLmNsaWNrKCBmdW5jdGlvbihlKSB7CgkJCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJaWYgKCEkKHRoaXMpLmhhc0NsYXNzKCdkaXNhYmxlZCcpKSB7CgkJCQkJc2VsZi5jb21tYW5kKCk7CgkJCQl9CgkJCQlzZWxmLnJ0ZS53aW5kb3cuZm9jdXMoKTsKCQkJfSk7Cgl9Cn0KCi8qKgogKiDQntCx0YDQsNCx0L7RgtGH0LjQuiDQvdCw0LbQsNGC0LjRjyDQvdCwINC60L3QvtC/0LrRgyDQvdCwINGC0YPQu9Cx0LDRgNC1LiDQktGL0L/QvtC70L3QtdC90LjQtSDQutC+0LzQsNC90LTRiyDQuNC70Lgg0L7RgtC60YDRi9GC0LjQtSDQvtC60L3QsHzQvNC10L3RjiDQuCDRgtC0CiAqCiAqIEByZXR1cm4gdm9pZAogKiovCmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5idXR0b24ucHJvdG90eXBlLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7Cgl0cnkgewoJCXRoaXMucnRlLmRvYy5leGVjQ29tbWFuZCh0aGlzLm5hbWUsIGZhbHNlLCB0aGlzLnZhbCk7Cgl9IGNhdGNoKGUpIHsKCQlyZXR1cm4gdGhpcy5ydGUubG9nKCdjb21tYW5kcyBmYWlsZWQ6ICcrdGhpcy5uYW1lKTsKCX0KCQoJdGhpcy5ydGUudWkudXBkYXRlKHRydWUpOwp9CgovKioKICog0J7QsdC90L7QstC70Y/QtdGCINGB0L7RgdGC0L7Rj9C90LjQtSDQutC90L7Qv9C60LgKICoKICogQHJldHVybiB2b2lkCiAqKi8KZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmJ1dHRvbi5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oKSB7Cgl0cnkgewoJCWlmICghdGhpcy5ydGUuZG9jLnF1ZXJ5Q29tbWFuZEVuYWJsZWQodGhpcy5uYW1lKSkgewoJCQlyZXR1cm4gdGhpcy5kb21FbGVtLmFkZENsYXNzKCdkaXNhYmxlZCcpOwoJCX0gZWxzZSB7CgkJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCQl9Cgl9IGNhdGNoIChlKSB7CgkJcmV0dXJuOwoJfQoJdHJ5IHsKCQlpZiAodGhpcy5ydGUuZG9jLnF1ZXJ5Q29tbWFuZFN0YXRlKHRoaXMubmFtZSkpIHsKCQkJdGhpcy5kb21FbGVtLmFkZENsYXNzKCdhY3RpdmUnKTsKCQl9IGVsc2UgewoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoJCX0KCX0gY2F0Y2ggKGUpIHsgfQp9Cgp9KShqUXVlcnkpOy8qCiAqIE1pc2MgdXRpbHMgZm9yIGVsUlRFCiAqCiAqIEBwYXJhbSBPYmplY3QgcnRlIC0gZWRpdG9yCiAqIEB0b2RvINCf0L7QtNGD0LzQsNGC0YwsINGH0YLQviDQuNC3INGN0YLQvtCz0L4g0YDQtdCw0LvRjNC90L4g0L3Rg9C20L3QviDQuCDQvdCw0LLQtdGB0YLQuCDQv9C+0YDRj9C00L7Qui4g0JLQvtC30LzQvtC20L3QviDRh9Cw0YHRgtGMINC/0LXRgNC10L3QtdGB0YLQuCDQsiBlbGxpYgogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIENvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudXRpbHMgPSBmdW5jdGlvbihydGUpIHsKCXRoaXMucnRlICAgICA9IHJ0ZTsKCXRoaXMudXJsICAgICA9IG51bGw7CgkvLyBkb21vIGFyaWdhdG8sIFN0ZWF2ZSwgaHR0cDovL2Jsb2cuc3RldmVubGV2aXRoYW4uY29tL2FyY2hpdmVzL3BhcnNldXJpCgl0aGlzLnJlZyAgICAgPSAvXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLzsKCXRoaXMuYmFzZVVSTCA9ICcnOwoJdGhpcy5wYXRoICAgID0gJyc7CgkvKioKCSAqIGVudGl0aWVzIG1hcAoJICoqLwoJdGhpcy5lbnRpdGllcyA9IHsnJicgOiAnJmFtcDsnLCAnIicgOiAnJnF1b3Q7JywgJzwnIDogJyZsdDsnLCAnPicgOiAnJmd0Oyd9OwoJLyoqCgkgKiBlbnRpdGllcyByZWdleHAKCSAqKi8KCXRoaXMuZW50aXRpZXNSZWdFeHAgPSAvWzw+JlwiXS9nOwoJLyoqCgkgKiBtZWRpYSBpbmZvCgkgKiovCgl0aGlzLm1lZGlhID0gW3sgCgkJCXR5cGUgICAgIDogJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJywgCgkJCWNsYXNzaWQgIDogWydjbHNpZDpkMjdjZGI2ZS1hZTZkLTExY2YtOTZiOC00NDQ1NTM1NDAwMDAnXSwgCgkJCWNvZGViYXNlIDogJ2h0dHA6Ly9kb3dubG9hZC5tYWNyb21lZGlhLmNvbS9wdWIvc2hvY2t3YXZlL2NhYnMvZmxhc2gvc3dmbGFzaC5jYWIjdmVyc2lvbj02LDAsNDAsMCcgCgkJfSwgeyAKCQkJdHlwZSAgICAgOiAnYXBwbGljYXRpb24veC1kaXJlY3RvcicsIAoJCQljbGFzc2lkICA6IFsnY2xzaWQ6MTY2YjFiY2EtM2Y5Yy0xMWNmLTgwNzUtNDQ0NTUzNTQwMDAwJ10sIAoJCQljb2RlYmFzZSA6ICdodHRwOi8vZG93bmxvYWQubWFjcm9tZWRpYS5jb20vcHViL3Nob2Nrd2F2ZS9jYWJzL2RpcmVjdG9yL3N3LmNhYiN2ZXJzaW9uPTgsNSwxLDAnIAoJCX0sIHsgCgkJCXR5cGUgICAgIDogJ2FwcGxpY2F0aW9uL3gtbXBsYXllcjInLCAKCQkJY2xhc3NpZCAgOiBbJ2Nsc2lkOjZiZjUyYTUyLTM5NGEtMTFkMy1iMTUzLTAwYzA0Zjc5ZmFhNicsICdjbHNpZDoyMmQ2ZjMxMi1iMGY2LTExZDAtOTRhYi0wMDgwYzc0YzdlOTUnLCAnY2xzaWQ6MDU1ODlmYTEtYzM1Ni0xMWNlLWJmMDEtMDBhYTAwNTU1OTVhJ10sIAoJCQljb2RlYmFzZSA6ICdodHRwOi8vYWN0aXZleC5taWNyb3NvZnQuY29tL2FjdGl2ZXgvY29udHJvbHMvbXBsYXllci9lbi9uc21wMmluZi5jYWIjVmVyc2lvbj01LDEsNTIsNzAxJyAKCQl9LCB7IAoJCQl0eXBlICAgICA6ICd2aWRlby9xdWlja3RpbWUnLCAKCQkJY2xhc3NpZCAgOiBbJ2Nsc2lkOjAyYmYyNWQ1LThjMTctNGIyMy1iYzgwLWQzNDg4YWJkZGM2YiddLCAKCQkJY29kZWJhc2UgOiAnaHR0cDovL3d3dy5hcHBsZS5jb20vcXRhY3RpdmV4L3F0cGx1Z2luLmNhYiN2ZXJzaW9uPTYsMCwyLDAnIAoJCX0sIHsgCgkJCXR5cGUgICAgIDogJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbicsIAoJCQljbGFzc2lkICA6IFsnY2xzaWQ6Y2ZjZGFhMDMtOGJlNC0xMWNmLWI4NGItMDAyMGFmYmJjY2ZhJ10sIAoJCQljb2RlYmFzZSA6ICdodHRwOi8vZG93bmxvYWQubWFjcm9tZWRpYS5jb20vcHViL3Nob2Nrd2F2ZS9jYWJzL2ZsYXNoL3N3Zmxhc2guY2FiI3ZlcnNpb249NiwwLDQwLDAnCgkJfV07CgkKCS8vIHJnYiBjb2xvciByZWdleHAKCXRoaXMucmdiUmVnRXhwID0gL1xzKnJnYlxzKj9cKFxzKj8oWzAtOV0rKVxzKj8sXHMqPyhbMC05XSspXHMqPyxccyo/KFswLTldKylccyo/XClccyovaTsKCS8vIHJlZ2V4cCB0byBkZXRlY3QgY29sb3IgaW4gYm9yZGVyL2JhY2tncm91bmQgcHJvcGVydGllcwoJdGhpcy5jb2xvcnNSZWdFeHAgPSAvYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXxwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvd3xyZ2JccypcKFteXCldK1wpL2k7CgkvLyB3ZWIgc2FmZSBjb2xvcnMKCXRoaXMuY29sb3JzID0gewoJCWFxdWEgICAgOiAnIzAwZmZmZicsCgkJYmxhY2sgICA6ICcjMDAwMDAwJywKCQlibHVlICAgIDogJyMwMDAwZmYnLAoJCWZ1Y2hzaWEgOiAnI2ZmMDBmZicsCgkJZ3JheSAgICA6ICcjODA4MDgwJywKCQlncmVlbiAgIDogJyMwMDgwMDAnLAoJCWxpbWUgICAgOiAnIzAwZmYwMCcsCgkJbWFyb29uICA6ICcjODAwMDAwJywKCQluYXZ5ICAgIDogJyMwMDAwODAnLAoJCW9saXZlICAgOiAnIzgwODAwMCcsCgkJb3JhbmdlICA6ICcjZmZhNTAwJywKCQlwdXJwbGUgIDogJyM4MDAwODAnLAoJCXJlZCAgICAgOiAnI2ZmMDAwMCcsCgkJc2lsdmVyICA6ICcjYzBjMGMwJywKCQl0ZWFsICAgIDogJyMwMDgwODAnLAoJCXdoaXRlICAgOiAnI2ZmZmZmZmYnLAoJCXllbGxvdyAgOiAnI2ZmZmYwMCcKCX0KCQoJdmFyIHNlbGYgICAgID0gdGhpczsKCQoJdGhpcy5yZ2IyaGV4ID0gZnVuY3Rpb24oc3RyKSB7CgkJcmV0dXJuIHRoaXMuY29sb3IySGV4KCcnK3N0cikKCX0KCQoJdGhpcy50b1BpeGVscyA9IGZ1bmN0aW9uKG51bSkgewoJCXZhciBtID0gbnVtLm1hdGNoKC8oWzAtOV0rXC4/WzAtOV0qKVxzKihweHxwdHxlbXwlKS8pOwoJCWlmIChtKSB7CgkJCW51bSAgPSBtWzFdOwoJCQl1bml0ID0gbVsyXTsKCQl9IAoJCWlmIChudW1bMF0gPT0gJy4nKSB7CgkJCW51bSA9ICcwJytudW07CgkJfQoJCW51bSA9IHBhcnNlRmxvYXQobnVtKTsKCgkJaWYgKGlzTmFOKG51bSkpIHsKCQkJcmV0dXJuICcnOwoJCX0KCQl2YXIgYmFzZSA9IHBhcnNlSW50KCQoZG9jdW1lbnQuYm9keSkuY3NzKCdmb250LXNpemUnKSkgfHwgMTY7CgkJc3dpdGNoICh1bml0KSB7CgkJCWNhc2UgJ2VtJzogcmV0dXJuIHBhcnNlSW50KG51bSpiYXNlKTsKCQkJY2FzZSAncHQnOiByZXR1cm4gcGFyc2VJbnQobnVtKmJhc2UvMTIpOwoJCQljYXNlICclJyA6IHJldHVybiBwYXJzZUludChudW0qYmFzZS8xMDApOwoJCX0KCQlyZXR1cm4gbnVtOwoJfQoJCgkvLyBUT0RPOiBhZGQgcGFyc2UgcmVsIHBhdGggLi4vLi4vZXRjCgl0aGlzLmFic29sdXRlVVJMID0gZnVuY3Rpb24odXJsKSB7CgkJIXRoaXMudXJsICYmIHRoaXMuX3VybCgpOwoJCXVybCA9ICQudHJpbSh1cmwpOwoJCWlmICghdXJsKSB7CgkJCXJldHVybiAnJzsKCQl9CgkJLy8g0YHRgdGL0LvQutC4INC90LAg0Y/QutC+0YDRjyDQvdC1INC/0LXRgNC10LLQvtC00LjQvCDQsiDQsNCx0YEKCQlpZiAodXJsWzBdID09ICcjJykgewoJCQlyZXR1cm4gdXJsOwoJCX0KCQl2YXIgdSA9IHRoaXMucGFyc2VVUkwodXJsKTsKCgkJaWYgKCF1Lmhvc3QgJiYgIXUucGF0aCAmJiAhdS5hbmNob3IpIHsKCQkJLy90aGlzLnJ0ZS5sb2coJ0ludmFsaWQgVVJMOiAnK3VybCkKCQkJcmV0dXJuICcnOwoJCX0KCQlpZiAoIXRoaXMucnRlLm9wdGlvbnMuYWJzb2x1dGVVUkxzKSB7IAoJCQlyZXR1cm4gdXJsOwoJCX0KCQlpZiAodS5wcm90b2NvbCkgewoJCQkvL3RoaXMucnRlLmxvZygndXJsIGFscmVhZHkgYWJzb2x1dGU6ICcrdXJsKTsKCQkJcmV0dXJuIHVybDsKCQl9CgkJaWYgKHUuaG9zdCAmJiAodS5ob3N0LmluZGV4T2YoJy4nKSE9LTEgfHwgdS5ob3N0ID09ICdsb2NhbGhvc3QnKSkgewoJCQkvL3RoaXMucnRlLmxvZygnbm8gcHJvdG9jb2wnKTsKCQkJcmV0dXJuIHRoaXMudXJsLnByb3RvY29sKyc6Ly8nK3VybDsKCQl9CgkJaWYgKHVybFswXSA9PSAnLycpIHsKCQkJdXJsID0gdGhpcy5iYXNlVVJMK3VybDsKCQl9IGVsc2UgewoJCQlpZiAodXJsLmluZGV4T2YoJy4vJykgPT0gMCkgewoJCQkJdXJsID0gdXJsLnN1YnN0cmluZygyKTsKCQkJfQoJCQl1cmwgPSB0aGlzLmJhc2VVUkwrdGhpcy5wYXRoK3VybDsKCQl9CgkJcmV0dXJuIHVybDsKCX0KCQoJdGhpcy5wYXJzZVVSTCA9IGZ1bmN0aW9uKHVybCkgewoJCXZhciB1ICAgPSB1cmwubWF0Y2godGhpcy5yZWcpOwoJCXZhciByZXQgPSB7fTsKCQkkLmVhY2goWyJzb3VyY2UiLCJwcm90b2NvbCIsImF1dGhvcml0eSIsInVzZXJJbmZvIiwidXNlciIsInBhc3N3b3JkIiwiaG9zdCIsInBvcnQiLCJyZWxhdGl2ZSIsInBhdGgiLCJkaXJlY3RvcnkiLCJmaWxlIiwicXVlcnkiLCJhbmNob3IiXSwgZnVuY3Rpb24oaSkgewoJCQlyZXRbdGhpc10gPSB1W2ldOwoJCX0pOwoJCWlmICghcmV0Lmhvc3QubWF0Y2goL1thLXowLTldL2kpKSB7CgkJCXJldC5ob3N0ID0gJyc7CgkJfQoJCXJldHVybiByZXQ7Cgl9CgkKCXRoaXMudHJpbUV2ZW50Q2FsbGJhY2sgPSBmdW5jdGlvbihjKSB7CgkJYyA9IGMgPyBjLnRvU3RyaW5nKCkgOiAnJzsKCQlyZXR1cm4gJC50cmltKGMucmVwbGFjZSgvXHIqXG4vbWcsICcnKS5yZXBsYWNlKC9eZnVuY3Rpb25ccypvblthLXpdK1xzKlwoXHMqZXZlbnRccypcKVxzKlx7KC4rKVx9JC9pZ20sICckMScpKTsKCX0KCQoJdGhpcy5fdXJsID0gZnVuY3Rpb24oKSB7CgkJdGhpcy51cmwgICAgID0gdGhpcy5wYXJzZVVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7CgkJdGhpcy5iYXNlVVJMID0gdGhpcy51cmwucHJvdG9jb2wrJzovLycrKHRoaXMudXJsLnVzZXJJbmZvID8gIHBhcnRzLnVzZXJJbmZvKydAJyA6ICcnKSt0aGlzLnVybC5ob3N0Kyh0aGlzLnVybC5wb3J0ID8gJzonK3RoaXMudXJsLnBvcnQgOiAnJyk7CgkJdGhpcy5wYXRoICAgID0gIXRoaXMudXJsLmZpbGUgPyB0aGlzLnVybC5wYXRoIDogdGhpcy51cmwucGF0aC5zdWJzdHJpbmcoMCwgdGhpcy51cmwucGF0aC5sZW5ndGggLSB0aGlzLnVybC5maWxlLmxlbmd0aCk7Cgl9CgoKCS8qKgoJICogQ3JlYXRlIG9iamVjdCAobWFwKSBmcm9tIGFycmF5CgkgKgoJICogQHBhcmFtICAgQXJyYXkKCSAqIEByZXR1cm4gIE9iamVjdAoJICoqLwoJdGhpcy5tYWtlT2JqZWN0ID0gZnVuY3Rpb24obykgewoJCXZhciBtID0ge307CgkJJC5lYWNoKG8sIGZ1bmN0aW9uKGksIGUpIHsKCQkJbVtlXSA9IGU7CgkJfSk7CgkJcmV0dXJuIG07Cgl9CgoJLyoqCgkgKiBFbmNvZGUgZW50aXRpZXMgaW4gc3RyaW5nCgkgKgoJICogQHBhcmFtICAgU3RyaW5nCgkgKiBAcmV0dXJuICBTdHJpbmcKCSAqKi8KCXRoaXMuZW5jb2RlID0gZnVuY3Rpb24ocykgewoJCXZhciBlID0gdGhpcy5lbnRpdGllczsKCQlyZXR1cm4gKCcnK3MpLnJlcGxhY2UodGhpcy5lbnRpdGllc1JlZ0V4cCwgZnVuY3Rpb24oYykgewoJCQlyZXR1cm4gZVtjXTsKCQl9KTsKCX0KCQoJLyoqCgkgKiBEZWNvZGUgZW50aXRpZXMgaW4gc3RyaW5nCgkgKgoJICogQHBhcmFtICAgU3RyaW5nCgkgKiBAcmV0dXJuICBTdHJpbmcKCSAqKi8KCXRoaXMuZGVjb2RlID0gZnVuY3Rpb24ocykgewoJCXJldHVybiAkKCc8ZGl2Lz4nKS5odG1sKHN8fCcnKS50ZXh0KCk7Cgl9CgkKCS8qKgoJICogUGFyc2Ugc3R5bGUgc3RyaW5nIGludG8gb2JqZWN0CgkgKgoJICogQHBhcmFtICAgU3RyaW5nCgkgKiBAcmV0dXJuICBPYmplY3QKCSAqKi8KCXRoaXMucGFyc2VTdHlsZSA9IGZ1bmN0aW9uKHMpIHsKCQl2YXIgc3QgPSB7fSwgYSA9IHRoaXMucnRlLm9wdGlvbnMuYWxsb3dCcm93c2Vyc1NwZWNTdHlsZXMsIHQsIG4sIHY7CgkJCgkJaWYgKHR5cGVvZihzKSA9PSAnc3RyaW5nJyAmJiBzLmxlbmd0aCkgewoJCQkkLmVhY2gocy5yZXBsYWNlKC8mcXVvdDsvZ2ksICInIikuc3BsaXQoJzsnKSwgZnVuY3Rpb24oKSB7CgkJCQl0ID0gdGhpcy50b1N0cmluZygpLnNwbGl0KCc6Jyk7CgkJCQlpZiAodFswXSAmJiB0WzFdKSB7CgkJCQkJbiA9ICQudHJpbSh0WzBdKS50b0xvd2VyQ2FzZSgpOwoJCQkJCXYgPSAkLnRyaW0odFsxXSk7CgkJCQkJaWYgKG4gPT0gJ2NvbG9yJyB8fCBuID09ICdiYWNrZ3JvdW5kLWNvbG9yJykgewoJCQkJCQl2ID0gdi50b0xvd2VyQ2FzZSgpOwoJCQkJCX0KCQkJCQlpZiAobiAmJiB2ICYmIChhIHx8IG4uc3Vic3RyaW5nKDAsIDEpICE9ICctJykpIHsKCQkJCQkJc3Rbbl0gPSB2OwoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJfQoJCXJldHVybiBzdDsKCX0KCQoJCgkvKioKCSAqIENvbXBhY3Qgc29tZSBzdHlsZSBwcm9wZXJ0aWVzIGFuZCBjb252ZXJ0IGNvbG9ycyBpbiBoZXgKCSAqCgkgKiBAcGFyYW0gICBPYmplY3QKCSAqIEByZXR1cm4gIE9iamVjdAoJICoqLwoJdGhpcy5jb21wYWN0U3R5bGUgPSBmdW5jdGlvbihzKSB7CgkJdmFyIHNlbGYgPSB0aGlzOwoKCQlpZiAocy5ib3JkZXIgPT0gJ21lZGl1bSBub25lJykgewoJCQlkZWxldGUgcy5ib3JkZXI7CgkJfQoJCQoJCSQuZWFjaChzLCBmdW5jdGlvbihuLCB2KSB7CgkJCWlmICgvY29sb3IkL2kudGVzdChuKSkgewoJCQkJc1tuXSA9IHNlbGYuY29sb3IySGV4KHYpOwoJCQl9IGVsc2UgaWYgKC9eKGJvcmRlcnxiYWNrZ3JvdW5kKSQvaS50ZXN0KG4pKSB7CgkJCQlzW25dID0gdi5yZXBsYWNlKHNlbGYuY29sb3JzUmVnRXhwLCBmdW5jdGlvbihtKSB7CgkJCQkJcmV0dXJuIHNlbGYuY29sb3IySGV4KG0pOwoJCQkJfSk7CgkJCX0KCQl9KTsKCQkKCQlpZiAoc1snYm9yZGVyLXdpZHRoJ10pIHsKCQkJcy5ib3JkZXIgPSBzWydib3JkZXItd2lkdGgnXSsnICcrKHNbJ2JvcmRlci1zdHlsZSddfHwnc29saWQnKSsnICcrKHNbJ2JvcmRlci1jb2xvciddfHwnIzAwMCcpOwoJCQlkZWxldGUgc1snYm9yZGVyLXdpZHRoJ107CgkJCWRlbGV0ZSBzWydib3JkZXItc3R5bGUnXTsKCQkJZGVsZXRlIHNbJ2JvcmRlci1jb2xvciddOwoJCX0KCQkKCQlpZiAoc1snYmFja2dyb3VuZC1pbWFnZSddKSB7CgkJCXMuYmFja2dyb3VuZCA9IChzWydiYWNrZ3JvdW5kLWNvbG9yJ10rJyAnKXx8Jycrc1snYmFja2dyb3VuZC1pbWFnZSddKycgJytzWydiYWNrZ3JvdW5kLXBvc2l0aW9uJ118fCcwIDAnKycgJytzWydiYWNrZ3JvdW5kLXJlcGVhdCddfHwncmVwZWF0JzsKCQkJZGVsZXRlIHNbJ2JhY2tncm91bmQtaW1hZ2UnXTsKCQkJZGVsZXRlWydiYWNrZ3JvdW5kLWltYWdlJ107CgkJCWRlbGV0ZVsnYmFja2dyb3VuZC1wb3NpdGlvbiddOwoJCQlkZWxldGVbJ2JhY2tncm91bmQtcmVwZWF0J107CgkJfQoJCQoJCWlmIChzWydtYXJnaW4tdG9wJ10gJiYgc1snbWFyZ2luLXJpZ2h0J10gJiYgc1snbWFyZ2luLWJvdHRvbSddICYmIHNbJ21hcmdpbi1sZWZ0J10pIHsKCQkJcy5tYXJnaW4gPSBzWydtYXJnaW4tdG9wJ10rJyAnK3NbJ21hcmdpbi1yaWdodCddKycgJytzWydtYXJnaW4tYm90dG9tJ10rJyAnK3NbJ21hcmdpbi1sZWZ0J107CgkJCWRlbGV0ZSBzWydtYXJnaW4tdG9wJ107CgkJCWRlbGV0ZSBzWydtYXJnaW4tcmlnaHQnXTsKCQkJZGVsZXRlIHNbJ21hcmdpbi1ib3R0b20nXTsKCQkJZGVsZXRlIHNbJ21hcmdpbi1sZWZ0J107CgkJfQoJCQoJCWlmIChzWydwYWRkaW5nLXRvcCddICYmIHNbJ3BhZGRpbmctcmlnaHQnXSAmJiBzWydwYWRkaW5nLWJvdHRvbSddICYmIHNbJ3BhZGRpbmctbGVmdCddKSB7CgkJCXMucGFkZGluZyA9IHNbJ3BhZGRpbmctdG9wJ10rJyAnK3NbJ3BhZGRpbmctcmlnaHQnXSsnICcrc1sncGFkZGluZy1ib3R0b20nXSsnICcrc1sncGFkZGluZy1sZWZ0J107CgkJCWRlbGV0ZSBzWydwYWRkaW5nLXRvcCddOwoJCQlkZWxldGUgc1sncGFkZGluZy1yaWdodCddOwoJCQlkZWxldGUgc1sncGFkZGluZy1ib3R0b20nXTsKCQkJZGVsZXRlIHNbJ3BhZGRpbmctbGVmdCddOwoJCX0KCQkKCQlpZiAoc1snbGlzdC1zdHlsZS10eXBlJ10gfHwgc1snbGlzdC1zdHlsZS1wb3NpdGlvbiddIHx8IHNbJ2xpc3Qtc3R5bGUtaW1hZ2UnXSkgewoJCQlzWydsaXN0LXN0eWxlJ10gPSAkLnRyaW0oc1snbGlzdC1zdHlsZS10eXBlJ118fCcgJytzWydsaXN0LXN0eWxlLXBvc2l0aW9uJ118fCcnK3NbJ2xpc3Qtc3R5bGUtaW1hZ2UnXXx8JycpOwoJCQlkZWxldGUgc1snbGlzdC1zdHlsZS10eXBlJ107CgkJCWRlbGV0ZSBzWydsaXN0LXN0eWxlLXBvc2l0aW9uJ107CgkJCWRlbGV0ZSBzWydsaXN0LXN0eWxlLWltYWdlJ107CgkJfQoJCQoJCXJldHVybiBzOwoJfQoJCgkvKioKCSAqIFNlcmlhbGl6ZSBzdHlsZSBvYmplY3QgaW50byBzdHJpbmcKCSAqCgkgKiBAcGFyYW0gICBPYmplY3QgIHN0eWxlIG1hcAoJICogQHBhcmFtICAgQm9vbGVhbiBmbGFnIC0gY29tcGFjdCBzdHlsZT8KCSAqIEByZXR1cm4gIFN0cmluZwoJICoqLwoJdGhpcy5zZXJpYWxpemVTdHlsZSA9IGZ1bmN0aW9uKG8sIGMpIHsKCQl2YXIgcyA9IFtdOwoJCS8vIGM9dHJ1ZQoJCSQuZWFjaChjID8gdGhpcy5jb21wYWN0U3R5bGUobykgOiBvLCBmdW5jdGlvbihuLCB2KSB7CgkJCXYgJiYgcy5wdXNoKG4rJzonK3YpOwoJCX0pOwoJCXJldHVybiBzLmpvaW4oJzsnKTsKCX0KCgkvKioKCSAqIFBhcnNlIGNsYXNzIHN0cmluZyBpbnRvIG9iamVjdAoJICoKCSAqIEBwYXJhbSAgIFN0cmluZwoJICogQHJldHVybiAgT2JqZWN0CgkgKiovCgl0aGlzLnBhcnNlQ2xhc3MgPSBmdW5jdGlvbihjKSB7CgkJYyA9ICQudHJpbShjKTsgCgkJLy8gdGhpcy5ydGUubG9nKGMpCgkJcmV0dXJuIGMubGVuZ3RoID8gdGhpcy5tYWtlT2JqZWN0KGMuc3BsaXQoL1xzKy8pKSA6IHt9OwoJCXJldHVybiBjLmxlbmd0aCA/IGMuc3BsaXQoL1xzKy8pIDogW107Cgl9CgoJLyoqCgkgKiBTZXJpYWxpemUgY2xhc3Mgb2JqZWN0IGludG8gc3RyaW5nCgkgKgoJICogQHBhcmFtICAgT2JqZWN0CgkgKiBAcmV0dXJuICBTdHJpbmcKCSAqKi8KCXRoaXMuc2VyaWFsaXplQ2xhc3MgPSBmdW5jdGlvbihjKSB7CgkJLy8gcmV0dXJuIGMuam9pbignICcpCgkJdmFyIHMgPSBbXTsKCQkkLmVhY2goYywgZnVuY3Rpb24obikgewoJCQlzLnB1c2gobik7CgkJfSk7CgkJcmV0dXJuIHMuam9pbignICcpOwoJfQoJCgkvKioKCSAqIFJldHVybiByZXF1aXJlZCBtZWRpYSB0eXBlIGluZm8KCSAqCgkgKiBAcGFyYW0gICBTdHJpbmcgIG1pbWV0eXBlCgkgKiBAcGFyYW0gICBTdHJpbmcgIGNsYXNzaWQKCSAqIEByZXR1cm4gIE9iamVjdAoJICoqLwoJdGhpcy5tZWRpYUluZm8gPSBmdW5jdGlvbih0LCBjKSB7CgkJdmFyIGwgPSB0aGlzLm1lZGlhLmxlbmd0aDsKCQkKCQl3aGlsZSAobC0tKSB7CgkJCWlmICh0ID09PSB0aGlzLm1lZGlhW2xdLnR5cGUgfHwgKGMgJiYgJC5pbkFycmF5KGMsIHRoaXMubWVkaWFbbF0uY2xhc3NpZCkgIT0gLTEpKSB7CgkJCQlyZXR1cm4gdGhpcy5tZWRpYVtsXTsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIFJldHVybiBjb2xvciBoZXggdmFsdWUKCSAqCgkgKiBAcGFyYW0gICBTdHJpbmcgICBjb2xvciBuYW1lIG9yIHJnYgoJICogQHJldHVybiAgU3RyaW5nCgkgKiovCgl0aGlzLmNvbG9yMkhleCA9IGZ1bmN0aW9uKGMpIHsKCQl2YXIgbTsKCQkKCQlpZiAoYy5pbmRleE9mKCcjJykgPT09IDApIHsKCQkJcmV0dXJuIGM7CgkJfQoJCQoJCWMgPSBjfHwnJzsKCQlmdW5jdGlvbiBoZXgocykgewoJCQlzID0gcGFyc2VJbnQocykudG9TdHJpbmcoMTYpOwoJCQlyZXR1cm4gcy5sZW5ndGggPiAxID8gcyA6ICcwJyArIHM7IAoJCX07CgkJCgkJaWYgKHRoaXMuY29sb3JzW2NdKSB7CgkJCXJldHVybiB0aGlzLmNvbG9yc1tjXTsKCQl9CgkJaWYgKChtID0gYy5tYXRjaCh0aGlzLnJnYlJlZ0V4cCkpKSB7CgkJCXJldHVybiAnIycraGV4KG1bMV0pK2hleChtWzJdKStoZXgobVszXSk7CgkJfQoJCXJldHVybiAnJzsKCX0KCQoKCQoJCn0KCn0pKGpRdWVyeSk7LyoqCiAqIEBjbGFzcyB3M2NSYW5nZSAgLSB3M2MgdGV4dCByYW5nZSBlbXVsYXRpb24gZm9yICJzdHJhbmdlIiBicm93c2VycwogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQ29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudzNjUmFuZ2UgPSBmdW5jdGlvbihydGUpIHsKCXZhciBzZWxmICAgICAgICAgICAgICAgICAgICAgPSB0aGlzOwoJdGhpcy5ydGUgICAgICAgICAgICAgICAgICAgICA9IHJ0ZTsKCXRoaXMuciAgICAgICAgICAgICAgICAgICAgICAgPSBudWxsOwoJdGhpcy5jb2xsYXBzZWQgICAgICAgICAgICAgICA9IHRydWU7Cgl0aGlzLnN0YXJ0Q29udGFpbmVyICAgICAgICAgID0gbnVsbDsKCXRoaXMuZW5kQ29udGFpbmVyICAgICAgICAgICAgPSBudWxsOwoJdGhpcy5zdGFydE9mZnNldCAgICAgICAgICAgICA9IDA7Cgl0aGlzLmVuZE9mZnNldCAgICAgICAgICAgICAgID0gMDsKCXRoaXMuY29tbW9uQW5jZXN0b3JDb250YWluZXIgPSBudWxsOwoJCgl0aGlzLnJhbmdlID0gZnVuY3Rpb24oKSB7CgkJdHJ5IHsgCgkJCXRoaXMuciA9IHRoaXMucnRlLndpbmRvdy5kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsgCgkJfSBjYXRjaChlKSB7IAoJCQl0aGlzLnIgPSB0aGlzLnJ0ZS5kb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsgCgkJfQoJCXJldHVybiB0aGlzLnI7Cgl9CgkKCXRoaXMuaW5zZXJ0Tm9kZSA9IGZ1bmN0aW9uKGh0bWwpIHsKCQl0aGlzLnJhbmdlKCk7CgkJc2VsZi5yLmNvbGxhcHNlKGZhbHNlKQoJCXZhciByID0gc2VsZi5yLmR1cGxpY2F0ZSgpOwoJCXIucGFzdGVIVE1MKGh0bWwpOwoJfQoJCgl0aGlzLmdldEJvb2ttYXJrID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5yYW5nZSgpOwoJCWlmICh0aGlzLnIuaXRlbSkgewoJCQl2YXIgbiA9IHRoaXMuci5pdGVtKDApOwoJCQl0aGlzLnIgPSB0aGlzLnJ0ZS5kb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsKCQkJdGhpcy5yLm1vdmVUb0VsZW1lbnRUZXh0KG4pOwoJCX0KCQlyZXR1cm4gdGhpcy5yLmdldEJvb2ttYXJrKCk7Cgl9CgkKCXRoaXMubW92ZVRvQm9va21hcmsgPSBmdW5jdGlvbihibSkgewoJCXRoaXMucnRlLndpbmRvdy5mb2N1cygpOwoJCXRoaXMucmFuZ2UoKS5tb3ZlVG9Cb29rbWFyayhibSk7CgkJdGhpcy5yLnNlbGVjdCgpOwoJfQoJCgkvKioKCSAqINCe0LHQvdC+0LLQu9GP0LXRgiDQtNCw0L3QvdGL0LUg0L4g0LLRi9C00LXQu9C10L3QvdGL0YUg0L3QvtC00LDRhQoJICoKCSAqIEByZXR1cm4gdm9pZAoJICoqLwoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCgkJZnVuY3Rpb24gX2ZpbmRQb3Moc3RhcnQpIHsKCQkJdmFyIG1hcmtlciA9ICdcdUZFRkYnOwoJCQl2YXIgbmR4ID0gb2Zmc2V0ID0gMDsKCQkJdmFyIHIgPSBzZWxmLnIuZHVwbGljYXRlKCk7CgkJCXIuY29sbGFwc2Uoc3RhcnQpOwoJCQl2YXIgcCA9IHIucGFyZW50RWxlbWVudCgpOwoJCQlpZiAoIXAgfHwgcC5ub2RlTmFtZSA9PSAnSFRNTCcpIHsKCQkJCXJldHVybiB7cGFyZW50IDogc2VsZi5ydGUuZG9jLmJvZHksIG5keCA6IG5keCwgb2Zmc2V0IDogb2Zmc2V0fTsKCQkJfQoKCQkJci5wYXN0ZUhUTUwobWFya2VyKTsKCQkJCgkJCWNoaWxkcyA9IHAuY2hpbGROb2RlczsKCQkJZm9yICh2YXIgaT0wOyBpIDwgY2hpbGRzLmxlbmd0aDsgaSsrKSB7CgkJCQl2YXIgbiA9IGNoaWxkc1tpXTsKCQkJCWlmIChpPjAgJiYgKG4ubm9kZVR5cGUhPT0zIHx8IGNoaWxkc1tpLTFdLm5vZGVUeXBlICE9PTMpKSB7CgkJCQkJbmR4Kys7CgkJCQl9CgkJCQlpZiAobi5ub2RlVHlwZSAhPT0gMykgewoJCQkJCW9mZnNldCA9IDA7CgkJCQl9IGVsc2UgewoJCQkJCXZhciBwb3MgPSBuLm5vZGVWYWx1ZS5pbmRleE9mKG1hcmtlcik7CgkJCQkJaWYgKHBvcyAhPT0gLTEpIHsKCQkJCQkJb2Zmc2V0ICs9IHBvczsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCW9mZnNldCArPSBuLm5vZGVWYWx1ZS5sZW5ndGg7CgkJCQl9CgkJCX07CgkJCXIubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCAtMSk7CgkJCXIudGV4dCA9ICcnOwoJCQlyZXR1cm4ge3BhcmVudCA6IHAsIG5keCA6IE1hdGgubWluKG5keCwgcC5jaGlsZE5vZGVzLmxlbmd0aC0xKSwgb2Zmc2V0IDogb2Zmc2V0fTsKCQl9CgoJCXRoaXMucmFuZ2UoKTsKCQl0aGlzLnN0YXJ0Q29udGFpbmVyID0gdGhpcy5lbmRDb250YWluZXIgPSBudWxsOwoKCQlpZiAodGhpcy5yLml0ZW0pIHsKCQkJdGhpcy5jb2xsYXBzZWQgPSBmYWxzZTsKCQkJdmFyIGkgPSB0aGlzLnIuaXRlbSgwKTsKCQkJdGhpcy5zZXRTdGFydChpLnBhcmVudE5vZGUsIHRoaXMucnRlLmRvbS5pbmRleE9mKGkpKTsKCQkJdGhpcy5zZXRFbmQoaS5wYXJlbnROb2RlLCB0aGlzLnN0YXJ0T2Zmc2V0KzEpOwoJCX0gZWxzZSB7CgkJCXRoaXMuY29sbGFwc2VkID0gdGhpcy5yLmJvdW5kaW5nV2lkdGggPT0gMDsKCQkJdmFyIHN0YXJ0ID0gX2ZpbmRQb3ModHJ1ZSk7IAoJCQl2YXIgZW5kICAgPSBfZmluZFBvcyhmYWxzZSk7CgkJCQoJCQlzdGFydC5wYXJlbnQubm9ybWFsaXplKCk7CgkJCWVuZC5wYXJlbnQubm9ybWFsaXplKCk7CgkJCXN0YXJ0Lm5keCA9IE1hdGgubWluKHN0YXJ0Lm5keCwgc3RhcnQucGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoLTEpOwoJCQllbmQubmR4ID0gTWF0aC5taW4oZW5kLm5keCwgZW5kLnBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aC0xKTsKCQkJaWYgKHN0YXJ0LnBhcmVudC5jaGlsZE5vZGVzW3N0YXJ0Lm5keF0ubm9kZVR5cGUgJiYgc3RhcnQucGFyZW50LmNoaWxkTm9kZXNbc3RhcnQubmR4XS5ub2RlVHlwZSA9PSAxKSB7CgkJCQl0aGlzLnNldFN0YXJ0KHN0YXJ0LnBhcmVudCwgc3RhcnQubmR4KTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuc2V0U3RhcnQoc3RhcnQucGFyZW50LmNoaWxkTm9kZXNbc3RhcnQubmR4XSwgc3RhcnQub2Zmc2V0KTsKCQkJfQoJCQlpZiAoZW5kLnBhcmVudC5jaGlsZE5vZGVzW2VuZC5uZHhdLm5vZGVUeXBlICYmIGVuZC5wYXJlbnQuY2hpbGROb2Rlc1tlbmQubmR4XS5ub2RlVHlwZSA9PSAxKSB7CgkJCQl0aGlzLnNldEVuZChlbmQucGFyZW50LCBlbmQubmR4KTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuc2V0RW5kKGVuZC5wYXJlbnQuY2hpbGROb2Rlc1tlbmQubmR4XSwgZW5kLm9mZnNldCk7CgkJCX0KCQkJLy8gdGhpcy5kdW1wKCk7CgkJCXRoaXMuc2VsZWN0KCk7CgkJfQoJCXJldHVybiB0aGlzOwoJfQoJCgl0aGlzLmlzQ29sbGFwc2VkID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5yYW5nZSgpOwoJCXRoaXMuY29sbGFwc2VkID0gdGhpcy5yLml0ZW0gPyBmYWxzZSA6IHRoaXMuci5ib3VuZGluZ1dpZHRoID09IDA7CgkJcmV0dXJuIHRoaXMuY29sbGFwc2VkOwoJfQoJCgkvKioKCSAqICLQodGF0LvQvtC/0YvQstCw0LXRgiIg0LLRi9C00LXQu9C10L3QuNC1CgkgKgoJICogQHBhcmFtICBib29sICB0b1N0YXJ0IC0g0YHRhdC70L7Qv9GL0LLQsNGC0Ywg0LLRi9C00LXQu9C10L3QuNC1INC6INC90LDRh9Cw0LvRgyDQuNC70Lgg0Log0LrQvtC90YbRgwoJICogQHJldHVybiB2b2lkCgkgKiovCgl0aGlzLmNvbGxhcHNlID0gZnVuY3Rpb24odG9TdGFydCkgewoJCXRoaXMucmFuZ2UoKTsKCQlpZiAodGhpcy5yLml0ZW0pIHsKCQkJdmFyIG4gPSB0aGlzLnIuaXRlbSgwKTsKCQkJdGhpcy5yID0gdGhpcy5ydGUuZG9jLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7CgkJCXRoaXMuci5tb3ZlVG9FbGVtZW50VGV4dChuKTsKCQl9CgkJdGhpcy5yLmNvbGxhcHNlKHRvU3RhcnQpOwoJCXRoaXMuci5zZWxlY3QoKTsKCQl0aGlzLmNvbGxhcHNlZCA9IHRydWU7Cgl9CgoJdGhpcy5nZXRTdGFydCA9IGZ1bmN0aW9uKCkgewoJCXRoaXMucmFuZ2UoKTsKCQlpZiAodGhpcy5yLml0ZW0pIHsKCQkJcmV0dXJuIHRoaXMuci5pdGVtKDApOwoJCX0KCQl2YXIgciA9IHRoaXMuci5kdXBsaWNhdGUoKTsKCQlyLmNvbGxhcHNlKHRydWUpOwoJCXZhciBzID0gci5wYXJlbnRFbGVtZW50KCk7CgkJcmV0dXJuIHMgJiYgcy5ub2RlTmFtZSA9PSAnQk9EWScgPyBzLmZpcnN0Q2hpbGQgOiBzOwoJfQoJCgkKCXRoaXMuZ2V0RW5kID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5yYW5nZSgpOwoJCWlmICh0aGlzLnIuaXRlbSkgewoJCQlyZXR1cm4gdGhpcy5yLml0ZW0oMCk7CgkJfQoJCXZhciByID0gdGhpcy5yLmR1cGxpY2F0ZSgpOwoJCXIuY29sbGFwc2UoZmFsc2UpOwoJCXZhciBlID0gci5wYXJlbnRFbGVtZW50KCk7CgkJcmV0dXJuIGUgJiYgZS5ub2RlTmFtZSA9PSAnQk9EWScgPyBlLmxhc3RDaGlsZCA6IGU7Cgl9CgoJCgkvKioKCSAqINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINC90LDRh2HQu9C+INCy0YvQtNC10LvQtdC90LjRjyDQvdCwINGD0LrQsNC30LDQvdGD0Y4g0L3QvtC00YMKCSAqCgkgKiBAcGFyYW0gIEVsZW1lbnQgIG5vZGUgICAg0L3QvtC00LAKCSAqIEBwYXJhbSAgTnVtYmVyICAgb2Zmc2V0ICDQvtGC0YHRgtGD0L8g0L7RgiDQvdCw0YfQsNC70LAg0L3QvtC00YsKCSAqIEByZXR1cm4gdm9pZAoJICoqLwoJdGhpcy5zZXRTdGFydCA9IGZ1bmN0aW9uKG5vZGUsIG9mZnNldCkgewoJCXRoaXMuc3RhcnRDb250YWluZXIgPSBub2RlOwoJCXRoaXMuc3RhcnRPZmZzZXQgICAgPSBvZmZzZXQ7CgkJaWYgKHRoaXMuZW5kQ29udGFpbmVyKSB7CgkJCXRoaXMuY29tbW9uQW5jZXN0b3JDb250YWluZXIgPSB0aGlzLnJ0ZS5kb20uZmluZENvbW1vbkFuY2VzdG9yKHRoaXMuc3RhcnRDb250YWluZXIsIHRoaXMuZW5kQ29udGFpbmVyKTsKCQl9Cgl9CgkKCS8qKgoJICog0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIg0LrQvtC90LXRhiDQstGL0LTQtdC70LXQvdC40Y8g0L3QsCDRg9C60LDQt9Cw0L3Rg9GOINC90L7QtNGDCgkgKgoJICogQHBhcmFtICBFbGVtZW50ICBub2RlICAgINC90L7QtNCwCgkgKiBAcGFyYW0gIE51bWJlciAgIG9mZnNldCAg0L7RgtGB0YLRg9C/INC+0YIg0LrQvtC90YbQsCDQvdC+0LTRiwoJICogQHJldHVybiB2b2lkCgkgKiovCgl0aGlzLnNldEVuZCA9IGZ1bmN0aW9uKG5vZGUsIG9mZnNldCkgewoJCXRoaXMuZW5kQ29udGFpbmVyID0gbm9kZTsKCQl0aGlzLmVuZE9mZnNldCAgICA9IG9mZnNldDsKCQlpZiAodGhpcy5zdGFydENvbnRhaW5lcikgewoJCQl0aGlzLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyID0gdGhpcy5ydGUuZG9tLmZpbmRDb21tb25BbmNlc3Rvcih0aGlzLnN0YXJ0Q29udGFpbmVyLCB0aGlzLmVuZENvbnRhaW5lcik7CgkJfQoJfQoJCgkvKioKCSAqINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINC90LDRh2HQu9C+INCy0YvQtNC10LvQtdC90LjRjyDQv9C10YDQtdC0INGD0LrQsNC30LDQvdC+0Lkg0L3QvtC00L7QuQoJICoKCSAqIEBwYXJhbSAgRWxlbWVudCAgbm9kZSAgICDQvdC+0LTQsAoJICogQHJldHVybiB2b2lkCgkgKiovCgl0aGlzLnNldFN0YXJ0QmVmb3JlID0gZnVuY3Rpb24obikgewoJCWlmIChuLnBhcmVudE5vZGUpIHsKCQkJdGhpcy5zZXRTdGFydChuLnBhcmVudE5vZGUsIHRoaXMucnRlLmRvbS5pbmRleE9mKG4pKTsKCQl9Cgl9CgkKCS8qKgoJICog0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIg0L3QsNGHYdC70L4g0LLRi9C00LXQu9C10L3QuNGPINC/0L7RgdC70LUg0YPQutCw0LfQsNC90L7QuSDQvdC+0LTRiwoJICoKCSAqIEBwYXJhbSAgRWxlbWVudCAgbm9kZSAgICDQvdC+0LTQsAoJICogQHJldHVybiB2b2lkCgkgKiovCgl0aGlzLnNldFN0YXJ0QWZ0ZXIgPSBmdW5jdGlvbihuKSB7CgkJaWYgKG4ucGFyZW50Tm9kZSkgewoJCQl0aGlzLnNldFN0YXJ0KG4ucGFyZW50Tm9kZSwgdGhpcy5ydGUuZG9tLmluZGV4T2YobikrMSk7CgkJfQoJfQoJCgkvKioKCSAqINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINC60L7QvdC10YYg0LLRi9C00LXQu9C10L3QuNGPINC/0LXRgNC10LQg0YPQutCw0LfQsNC90L7QuSDQvdC+0LTQvtC5CgkgKgoJICogQHBhcmFtICBFbGVtZW50ICBub2RlICAgINC90L7QtNCwCgkgKiBAcmV0dXJuIHZvaWQKCSAqKi8KCXRoaXMuc2V0RW5kQmVmb3JlID0gZnVuY3Rpb24obikgewoJCWlmIChuLnBhcmVudE5vZGUpIHsKCQkJdGhpcy5zZXRFbmQobi5wYXJlbnROb2RlLCB0aGlzLnJ0ZS5kb20uaW5kZXhPZihuKSk7CgkJfQoJfQoJCgkvKioKCSAqINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINC60L7QvdC10YYg0LLRi9C00LXQu9C10L3QuNGPINC/0L7RgdC70LUg0YPQutCw0LfQsNC90L7QuSDQvdC+0LTRiwoJICoKCSAqIEBwYXJhbSAgRWxlbWVudCAgbm9kZSAgICDQvdC+0LTQsAoJICogQHJldHVybiB2b2lkCgkgKiovCgl0aGlzLnNldEVuZEFmdGVyID0gZnVuY3Rpb24obikgewoJCWlmIChuLnBhcmVudE5vZGUpIHsKCQkJdGhpcy5zZXRFbmQobi5wYXJlbnROb2RlLCB0aGlzLnJ0ZS5kb20uaW5kZXhPZihuKSsxKTsKCQl9Cgl9CgkKCS8qKgoJICog0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIg0L3QvtCy0L7QtSDQstGL0LTQtdC70LXQvdC40LUg0L/QvtGB0LvQtSDQuNC30LzQtdC90LXQvdC40LkKCSAqCgkgKiBAcmV0dXJuIHZvaWQKCSAqKi8KCXRoaXMuc2VsZWN0ID0gZnVuY3Rpb24oKSB7CgkJLy8gdGhhbmtzIHRpbnltaWNlIGF1dGhvcnMKCQlmdW5jdGlvbiBnZXRQb3MobiwgbykgewoJCQlpZiAobi5ub2RlVHlwZSAhPSAzKSB7CgkJCQlyZXR1cm4gLTE7CgkJCX0KCQkJdmFyIGMgICA9J1x1RkVGRic7CgkJCXZhciB2YWwgPSBuLm5vZGVWYWx1ZTsKCQkJdmFyIHIgICA9IHNlbGYucnRlLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOwoJCQluLm5vZGVWYWx1ZSA9IHZhbC5zdWJzdHJpbmcoMCwgbykgKyBjICsgdmFsLnN1YnN0cmluZyhvKTsKCQkJci5tb3ZlVG9FbGVtZW50VGV4dChuLnBhcmVudE5vZGUpOwoJCQlyLmZpbmRUZXh0KGMpOwoJCQl2YXIgcCA9IE1hdGguYWJzKHIubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCAtMHhGRkZGRikpOwoJCQluLm5vZGVWYWx1ZSA9IHZhbDsKCQkJcmV0dXJuIHA7CgkJfTsKCQkKCQl0aGlzLnIgPSB0aGlzLnJ0ZS5kb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsgCgkJdmFyIHNvID0gdGhpcy5zdGFydE9mZnNldDsKCQl2YXIgZW8gPSB0aGlzLmVuZE9mZnNldDsKCQl2YXIgcyA9IHRoaXMuc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT0gMSAKCQkJPyB0aGlzLnN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXNbTWF0aC5taW4oc28sIHRoaXMuc3RhcnRDb250YWluZXIuY2hpbGROb2Rlcy5sZW5ndGggLSAxKV0KCQkJOiB0aGlzLnN0YXJ0Q29udGFpbmVyOwoJCXZhciBlID0gdGhpcy5lbmRDb250YWluZXIubm9kZVR5cGUgPT0gMSAKCQkJPyB0aGlzLmVuZENvbnRhaW5lci5jaGlsZE5vZGVzW01hdGgubWluKHNvID09IGVvID8gZW8gOiBlbyAtIDEsIHRoaXMuZW5kQ29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoIC0gMSldCgkJCTogdGhpcy5lbmRDb250YWluZXI7CgoJCWlmICh0aGlzLmNvbGxhcHNlZCkgewoJCQlpZiAocy5ub2RlVHlwZSA9PSAzKSB7CgkJCQl2YXIgcCA9IGdldFBvcyhzLCBzbyk7CgkJCQl0aGlzLnIubW92ZSgnY2hhcmFjdGVyJywgcCk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLnIubW92ZVRvRWxlbWVudFRleHQocyk7CgkJCQl0aGlzLnIuY29sbGFwc2UodHJ1ZSk7CgkJCX0KCQl9IGVsc2UgewoJCQl2YXIgciAgPSB0aGlzLnJ0ZS5kb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsgCgkJCXZhciBzcCA9IGdldFBvcyhzLCBzbyk7CgkJCXZhciBlcCA9IGdldFBvcyhlLCBlbyk7CgkJCWlmIChzLm5vZGVUeXBlID09IDMpIHsKCQkJCXRoaXMuci5tb3ZlKCdjaGFyYWN0ZXInLCBzcCk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLnIubW92ZVRvRWxlbWVudFRleHQocyk7CgkJCX0KCQkJaWYgKGUubm9kZVR5cGUgPT0gMykgewoJCQkJci5tb3ZlKCdjaGFyYWN0ZXInLCBlcCk7CgkJCX0gZWxzZSB7CgkJCQlyLm1vdmVUb0VsZW1lbnRUZXh0KGUpOwoJCQl9CgkJCXRoaXMuci5zZXRFbmRQb2ludCgnRW5kVG9FbmQnLCByKTsKCQl9CgkJCgkJdHJ5IHsKCQkJdGhpcy5yLnNlbGVjdCgpOwoJCX0gY2F0Y2goZSkgewoJCQkKCQl9CgkJaWYgKHIpIHsKCQkJciA9IG51bGw7CgkJfQoJfQoJCgl0aGlzLmR1bXAgPSBmdW5jdGlvbigpIHsKCQl0aGlzLnJ0ZS5sb2coJ2NvbGxhcHNlZDogJyt0aGlzLmNvbGxhcHNlZCk7CgkJLy90aGlzLnJ0ZS5sb2coJ2NvbW1vbkFuY2VzdG9yQ29udGFpbmVyOiAnK3RoaXMuY29tbW9uQW5jZXN0b3JDb250YWluZXIubm9kZU5hbWV8fCcjdGV4dCcpCgkJdGhpcy5ydGUubG9nKCdzdGFydENvbnRhaW5lcjogJysodGhpcy5zdGFydENvbnRhaW5lciA/IHRoaXMuc3RhcnRDb250YWluZXIubm9kZU5hbWUgOiAnbm9uJykpOwoJCXRoaXMucnRlLmxvZygnc3RhcnRPZmZzZXQ6ICcrdGhpcy5zdGFydE9mZnNldCk7CgkJdGhpcy5ydGUubG9nKCdlbmRDb250YWluZXI6ICcrKHRoaXMuZW5kQ29udGFpbmVyID8gdGhpcy5lbmRDb250YWluZXIubm9kZU5hbWUgOiAnbm9uZScpKTsKCQl0aGlzLnJ0ZS5sb2coJ2VuZE9mZnNldDogJyt0aGlzLmVuZE9mZnNldCk7Cgl9CgkKfQp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoJZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmFib3V0ID0gZnVuY3Rpb24ocnRlLCBuYW1lKSAgewoJCQoJCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCQl0aGlzLmFjdGl2ZSAgPSB0cnVlOwoJCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCQl2YXIgb3B0cywgZCwgdHh0OwoJCQkKCQkJb3B0cyA9IHsKCQkJCXJ0bCA6IHJ0ZS5ydGwsCgkJCQlzdWJtaXQgOiBmdW5jdGlvbihlLCBkKSB7ICBkLmNsb3NlKCk7IH0sCgkJCQlkaWFsb2cgOiB7CgkJCQkJd2lkdGggOiA1NjAsCgkJCQkJdGl0bGUgOiB0aGlzLnJ0ZS5pMThuKCdBYm91dCB0aGlzIHNvZnR3YXJlJyksCgkJCQkJYnV0dG9ucyAgICAgOiB7CgkJCQkJCU9rIDogZnVuY3Rpb24oKSB7ICQodGhpcykuZGlhbG9nKCdkZXN0cm95Jyk7IH0KCQkJCQl9CgkJCQl9CgkJCX0KCgkJCXR4dCA9ICc8ZGl2IGNsYXNzPSJlbHJ0ZS1sb2dvIj48L2Rpdj48aDM+Jyt0aGlzLnJ0ZS5pMThuKCdBYm91dCBlbFJURScpKyc8L2gzPjxiciBjbGVhcj0iYWxsIi8+JwoJCQkJKyc8ZGl2IGNsYXNzPSJlbHJ0ZS12ZXIiPicrdGhpcy5ydGUuaTE4bignVmVyc2lvbicpKyc6ICcrdGhpcy5ydGUudmVyc2lvbisnICgnK3RoaXMucnRlLmJ1aWxkKycpPC9kaXY+JyAKCQkJCSsnPGRpdiBjbGFzcz0iZWxydGUtdmVyIj5qUXVlcnk6ICcrJCgnPGRpdi8+JykuanF1ZXJ5Kyc8L2Rpdj4nIAoJCQkJKyc8ZGl2IGNsYXNzPSJlbHJ0ZS12ZXIiPmpRdWVyeVVJOiAnKyQudWkudmVyc2lvbisnPC9kaXY+JyAKCQkJCSsnPGRpdiBjbGFzcz0iZWxydGUtdmVyIj4nK3RoaXMucnRlLmkxOG4oJ0xpY2VuY2UnKSsnOiBCU0QgTGljZW5jZTwvZGl2PicKCQkJCSsnPHA+JwoJCQkJK3RoaXMucnRlLmkxOG4oJ2VsUlRFIGlzIGFuIG9wZW4tc291cmNlIEphdmFTY3JpcHQgYmFzZWQgV1lTSVdZRyBIVE1MLWVkaXRvci4nKSsnPGJyLz4nCgkJCQkrdGhpcy5ydGUuaTE4bignTWFpbiBnb2FsIG9mIHRoZSBlZGl0b3IgLSBzaW1wbGlmeSB3b3JrIHdpdGggdGV4dCBhbmQgZm9ybWF0aW5nIChIVE1MKSBvbiBzaXRlcywgYmxvZ3MsIGZvcnVtcyBhbmQgb3RoZXIgb25saW5lIHNlcnZpY2VzLicpKyc8YnIvPicKCQkJCSt0aGlzLnJ0ZS5pMThuKCdZb3UgY2FuIHVzZSBpdCBpbiBhbnkgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCBwcm9qZWN0cy4nKQoJCQkJKyc8L3A+JwoJCQkJKyc8aDQ+Jyt0aGlzLnJ0ZS5pMThuKCdBdXRob3JzJykrJzwvaDQ+JwoJCQkJKyc8dGFibGUgY2xhc3M9ImVscnRlLWF1dGhvcnMiPicKCQkJCSsnPHRyPjx0ZD5EbWl0cnkgKGRpbykgTGV2YXNob3YgJmx0O2Rpb0BzdGQ0Mi5ydSZndDs8L3RkPjx0ZD4nK3RoaXMucnRlLmkxOG4oJ0NoaWVmIGRldmVsb3BlcicpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPlRyb2V4IE5ldmVsaW4gJmx0O3Ryb2V4QGZ1cnkuc2NhbmNvZGUucnUmZ3Q7PC90ZD48dGQ+Jyt0aGlzLnJ0ZS5pMThuKCdEZXZlbG9wZXIsIHRlY2ggc3VwcG9ydCcpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPlZhbGVudGluIFJhenVtbnloICZsdDtjb250ZW50QHN0ZDQyLnJ1Jmd0OzwvdGQ+PHRkPicrdGhpcy5ydGUuaTE4bignSW50ZXJmYWNlIGRlc2lnbmVyJykrJzwvdGQ+PC90cj4nCgkJCQkrJzx0cj48dGQ+RXZnZW55IGVTYWJiYXRoICZsdDtzYWJiYXRoLmNvZGVtZ0BnbWFpbC5jb20mZ3Q7PC90ZD48dGQ+Jyt0aGlzLnJ0ZS5pMThuKCdEZXZlbG9wZXInKSsnPC90ZD48L3RyPicKCQkJCSsnPHRyPjx0ZD5BbmRyemVqIEJvcm93aWN6ICZsdDtlbHRyZUBib3Jvd2ljei5pbmZvJmd0OzwvdGQ+PHRkPicrdGhpcy5ydGUuaTE4bignUG9saXNoIGxvY2FsaXphdGlvbicpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPkFydGVtIFZhc2lsaWV2PC90ZD48dGQ+Jyt0aGlzLnJ0ZS5pMThuKCdVa3JhbmlhbiBsb2NhbGl6YXRpb24nKSsnPC90ZD48L3RyPicKCQkJCSsnPHRyPjx0ZD5GcmFuY29pcyBNYXplcm9sbGUgJmx0O2ZtYXowMDhAZ21haWwuY29tJmd0OzwvdGQ+PHRkPicrdGhpcy5ydGUuaTE4bignRnJlbmNoIGxvY2FsaXphdGlvbicpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPkt1cnQgQWVydHM8L3RkPjx0ZD4nK3RoaXMucnRlLmkxOG4oJ0R1dGNoIGxvY2FsaXphdGlvbicpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPk1pY2hhbCBNYXJlayAmbHQ7Zm1pY2gubWFyZWtAZ21haWwuY29tJmd0OzwvdGQ+PHRkPicrdGhpcy5ydGUuaTE4bignQ3plY2ggbG9jYWxpemF0aW9uJykrJzwvdGQ+PC90cj4nCgkJCQkrJzx0cj48dGQ+UmljYXJkbyBPYnJlZ8OzbiAmbHQ7cm9icmVnb25tQGdtYWlsLmNvbSZndDs8L3RkPjx0ZD4nK3RoaXMucnRlLmkxOG4oJ1NwYW5pc2ggbG9jYWxpemF0aW9uJykrJzwvdGQ+PC90cj4nCgkJCQkrJzx0cj48dGQ+U2FsZWggU291emFuY2hpICZsdDtzYWxlaC5zb3V6YW5jaGlAZ21haWwuY29tJmd0OzwvdGQ+PHRkPicrdGhpcy5ydGUuaTE4bignUGVyc2lhbiAoZmFyc2kpIGxvY2FsaXphdGlvbicpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPlRhd2ZlayBEYWdoaXN0YW5pICZsdDt0YXdmZWtvdkBnbWFpbC5jb20mZ3Q7PC90ZD48dGQ+Jyt0aGlzLnJ0ZS5pMThuKCdBcmFiaWMgbG9jYWxpemF0aW9uJykrJywgJyt0aGlzLnJ0ZS5pMThuKCdSVEwgc3VwcG9ydCcpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPlRhZCAmbHQ7dGFkMDYxNkBnbWFpbC5jb20mZ3Q7PC90ZD48dGQ+Jyt0aGlzLnJ0ZS5pMThuKCdUcmFkaXRpb25hbCBDaGluZXNlIGxvY2FsaXphdGlvbicpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPlRvbW9ha2kgWW9zaGlkYSAmbHQ7aW5mb0B5b3NoaWRhLXN0dWRpby5qcCZndDs8L3RkPjx0ZD4nK3RoaXMucnRlLmkxOG4oJ0phcGFuZXNlIGxvY2FsaXphdGlvbicpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPlVsZGlzIFBsb3RpxYbFoSAmbHQ7dWxkaXMucGxvdGluc0BnbWFpbC5jb20mZ3Q7PC90ZD48dGQ+Jyt0aGlzLnJ0ZS5pMThuKCdMYXR2aWFuIGxvY2FsaXphdGlvbicpKyc8L3RkPjwvdHI+JwoJCQkJKyc8dHI+PHRkPlZhc2lsaXkgUmF6dW1ueWggJmx0O3J2bkBzdGQ0Mi5ydSZndDs8L3RkPjx0ZD4nK3RoaXMucnRlLmkxOG4oJ0dlcm1hbiBsb2NhbGl6YXRpb24nKSsnPC90ZD48L3RyPicKCQkJCSsnPHRyPjx0ZD5WaWt0b3IgVGFtYXMgJmx0O3RhbWFzLnZpa3RvckB0b3RhbHN0dWRpby5odSZndDs8L3RkPjx0ZD4nK3RoaXMucnRlLmkxOG4oJ0h1bmdhcmlhbiBsb2NhbGl6YXRpb24nKSsnPC90ZD48L3RyPicKCQkJCSsnPHRyPjx0ZD5VZ28gUHVuem9sbywgJmx0O3NhZHJhY3plcm91bm9AZ21haWwuY29tJmd0OzwvdGQ+PHRkPicrdGhpcy5ydGUuaTE4bignSXRhbGlhbiBsb2NhbGl6YXRpb24nKSsnPC90ZD48L3RyPicKCQkJCSsnPC90YWJsZT4nCgkJCQkrJzxkaXYgY2xhc3M9ImVscnRlLWNvcHkiPkNvcHlyaWdodCAmY29weTsgMjAwOS0yMDEwLCA8YSBocmVmPSJodHRwOi8vd3d3LnN0ZDQyLnJ1Ij5TdHVkaW8gNDIgTFREPC9hPjwvZGl2PicKCQkJCSsnPGRpdiBjbGFzcz0iZWxydGUtY29weSI+Jyt0aGlzLnJ0ZS5pMThuKCdGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHNvZnR3YXJlIHZpc2l0IHRoZScpKycgPGEgaHJlZj0iaHR0cDovL2VscnRlLm9yZyI+Jyt0aGlzLnJ0ZS5pMThuKCdlbFJURSB3ZWJzaXRlJykrJy48L2E+PC9kaXY+JwoJCQkJKyc8ZGl2IGNsYXNzPSJlbHJ0ZS1jb3B5Ij5Ud2l0dGVyOiA8YSBocmVmPSJodHRwOi8vdHdpdHRlci5jb20vZWxydGVfZWxmaW5kZXIiPmVscnRlX2VsZmluZGVyPC9hPjwvZGl2Pic7CgkJCQoJCQlkID0gbmV3IGVsRGlhbG9nRm9ybShvcHRzKTsKCQkJZC5hcHBlbmQodHh0KTsKCQkJZC5vcGVuKCk7CgkJfQoJCQoJCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CgkJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCQl9CgkJCgl9CgkKfSkoalF1ZXJ5KTsKLyoqCiAqIEBjbGFzcyDQutC90L7Qv9C60LAgLSDQl9Cw0LrQu9Cw0LTQutCwICjQvtGC0LrRgNGL0LLQsNC10YIg0LTQuNCw0LvQvtCz0L7QstC+0LUg0L7QutC90L4pCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmFuY2hvciA9IGZ1bmN0aW9uKHJ0ZSwgbmFtZSkgewoJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJdGhpcy5pbnB1dCA9ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoJ25hbWUnLCAnYW5jaG9yJykuYXR0cignc2l6ZScsICcxNicpCgl2YXIgc2VsZiA9IHRoaXM7CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCXZhciBvcHRzID0gewoJCQlydGwgOiB0aGlzLnJ0ZS5ydGwsCgkJCXN1Ym1pdCA6IGZ1bmN0aW9uKGUsIGQpIHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgZS5wcmV2ZW50RGVmYXVsdCgpOyBkLmNsb3NlKCk7IHNlbGYuc2V0KCk7ICB9LAoJCQlkaWFsb2cgOiB7CgkJCQl0aXRsZSA6IHRoaXMucnRlLmkxOG4oJ0Jvb2ttYXJrJykKCQkJfQoJCX0KCgkJCgkJdGhpcy5hbmNob3IgPSB0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50QW5jaG9yKHRoaXMucnRlLnNlbGVjdGlvbi5nZXRFbmQoKSkgfHwgcnRlLmRvbS5jcmVhdGUoJ2EnKTsKCQkhdGhpcy5ydGUuc2VsZWN0aW9uLmNvbGxhcHNlZCgpICYmIHRoaXMucnRlLnNlbGVjdGlvbi5jb2xsYXBzZShmYWxzZSk7CgkJdGhpcy5pbnB1dC52YWwoJCh0aGlzLmFuY2hvcikuYWRkQ2xhc3MoJ2VsLXJ0ZS1hbmNob3InKS5hdHRyKCduYW1lJykpOwoJCXRoaXMucnRlLnNlbGVjdGlvbi5zYXZlSUVSYW5nZSgpOwoJCXZhciBkID0gbmV3IGVsRGlhbG9nRm9ybShvcHRzKTsKCQlkLmFwcGVuZChbdGhpcy5ydGUuaTE4bignQm9va21hcmsgbmFtZScpLCB0aGlzLmlucHV0XSwgbnVsbCwgdHJ1ZSkub3BlbigpOwoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHNlbGYuaW5wdXQuZm9jdXMoKX0sIDIwKTsKCX0KCQoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQl2YXIgbiA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7CgkJaWYgKHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnRMaW5rKG4pKSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKCQl9IGVsc2UgaWYgKHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnRBbmNob3IobikpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpLmFkZENsYXNzKCdhY3RpdmUnKTsKCQl9IGVsc2UgewoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoJCX0KCX0KCQoJdGhpcy5zZXQgPSBmdW5jdGlvbigpIHsKCQl2YXIgbiA9ICQudHJpbSh0aGlzLmlucHV0LnZhbCgpKTsKCgkJaWYgKG4pIHsKCQkJdGhpcy5ydGUuaGlzdG9yeS5hZGQoKTsKCQkJaWYgKCF0aGlzLmFuY2hvci5wYXJlbnROb2RlKSB7CgkJCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0SHRtbCgnPGEgbmFtZT0iJytuKyciIHRpdGxlPSInK3RoaXMucnRlLmkxOG4oJ0Jvb2ttYXJrJykrJzogJytuKyciIGNsYXNzPSJlbC1ydGUtYW5jaG9yIj48L2E+Jyk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmFuY2hvci5uYW1lID0gbjsKCQkJCXRoaXMuYW5jaG9yLnRpdGxlID0gdGhpcy5ydGUuaTE4bignQm9va21hcmsnKSsnOiAnK247CgkJCX0KCQl9IGVsc2UgaWYgKHRoaXMuYW5jaG9yLnBhcmVudE5vZGUpIHsKCQkJdGhpcy5ydGUuaGlzdG9yeS5hZGQoKTsKCQkJdGhpcy5hbmNob3IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmFuY2hvcik7CgkJfQoJfQp9Cn0pKGpRdWVyeSk7Ci8qKgogKiBAY2xhc3Mg0LrQvdC+0L/QutCwIC0g0KbQuNGC0LDRgtCwCiAqINCV0YHQu9C4INCy0YvQtNC10LvQtdC90LjQtSDRgdGF0LvQvtC/0L3Rg9GC0L4g0Lgg0L3QsNGF0L7QtNC40YLRgdGPINCy0L3Rg9GC0YDQuCDRhtC40YLQsNGC0YsgLSDQvtC90LAg0YPQtNCw0LvRj9C10YLRgdGPCiAqINCd0L7QstGL0LUg0YbQuNGC0LDRgtGLINGB0L7Qt9C00LDRjtGC0YHRjyDRgtC+0LvRjNC60L4g0LjQtyDQvdC10YHRhdC70L7Qv9C90YPRgtC+0LPQviDQstGL0LTQtdC70LXQvdC40Y8KICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmJsb2NrcXVvdGUgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCQoJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgkJdmFyIG4sIG5vZGVzOwoJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJaWYgKHRoaXMucnRlLnNlbGVjdGlvbi5jb2xsYXBzZWQoKSAmJiAobiA9IHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgL15CTE9DS1FVT1RFJC8pKSkgewoJCQkkKG4pLnJlcGxhY2VXaXRoKCQobikuaHRtbCgpKTsKCQl9IGVsc2UgewoJCQlub2RlcyA9IHRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7d3JhcCA6ICdhbGwnLCB0YWcgOiAnYmxvY2txdW90ZSd9KTsKCQkJbm9kZXMubGVuZ3RoICYmIHRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3Qobm9kZXNbMF0sIG5vZGVzW25vZGVzLmxlbmd0aC0xXSk7CgkJfQoJCXRoaXMucnRlLnVpLnVwZGF0ZSh0cnVlKTsKCX0KCQoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5ydGUuc2VsZWN0aW9uLmNvbGxhcHNlZCgpKSB7CgkJCWlmICh0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksIC9eQkxPQ0tRVU9URSQvKSkgewoJCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpLmFkZENsYXNzKCdhY3RpdmUnKTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7CgkJCX0KCQl9IGVsc2UgewoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkIGFjdGl2ZScpOwoJCX0KCX0KfQp9KShqUXVlcnkpOwovKioKICogQGNsYXNzINC60L3QvtC/0LrQuCAi0LrQvtC/0LjRgNC+0LLQsNGC0Ywv0LLRi9GA0LXQt9Cw0YLRjC/QstGB0YLQsNCy0LjRgtGMIiAKICog0LIgZmlyZWZveCDQv9C+0LrQsNC30YvQstCw0LXRgiDQv9GA0LXQtNC70L7QttC10L3QuNC1INC90LDQttCw0YLRjCBDdGwrYywg0LIg0L7RgdGC0LDQu9GM0L3Ri9GFIC0g0LrQvtC/0LjRgNGD0LXRggogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKiBAY29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuY29weSA9IGZ1bmN0aW9uKHJ0ZSwgbmFtZSkgewoJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJCgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQkKCQlpZiAodGhpcy5ydGUuYnJvd3Nlci5tb3ppbGxhKSB7CgkJCXRyeSB7CgkJCQl0aGlzLnJ0ZS5kb2MuZXhlY0NvbW1hbmQodGhpcy5uYW1lLCBmYWxzZSwgbnVsbCk7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCXZhciBzID0gJyBDdGwgKyBDJzsKCQkJCWlmICh0aGlzLm5hbWUgPT0gJ2N1dCcpIHsKCQkJCQlzID0gJyBDdGwgKyBYJzsKCQkJCX0gZWxzZSBpZiAodGhpcy5uYW1lID09ICdwYXN0ZScpIHsKCQkJCQlzID0gJyBDdGwgKyBWJzsKCQkJCX0KCQkJCXZhciBvcHRzID0gewoJCQkJCWRpYWxvZyA6IHsKCQkJCQkJdGl0bGUgICA6IHRoaXMucnRlLmkxOG4oJ1dhcm5pbmcnKSwKCQkJCQkJYnV0dG9ucyA6IHsgT2sgOiBmdW5jdGlvbigpIHsgJCh0aGlzKS5kaWFsb2coJ2Nsb3NlJyk7IH0gfQoJCQkJCX0KCQkJCX0KCgkJCQl2YXIgZCA9IG5ldyBlbERpYWxvZ0Zvcm0ob3B0cyk7CgkJCQlkLmFwcGVuZCh0aGlzLnJ0ZS5pMThuKCdUaGlzIG9wZXJhdGlvbiBpcyBkaXNhYmxlZCBpbiB5b3VyIGJyb3dzZXIgb24gc2VjdXJpdHkgcmVhc29uLiBVc2Ugc2hvcnRjdXQgaW5zdGVhZC4nKSsnOiAnK3MpLm9wZW4oKTsKCQkJfQoJCX0gZWxzZSB7CgkJCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbW1hbmQuY2FsbCh0aGlzKTsKCQl9Cgl9Cn0KCmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5jdXQgICA9IGVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5jb3B5OwplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMucGFzdGUgPSBlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuY29weTsKCn0pKGpRdWVyeSk7KGZ1bmN0aW9uKCQpIHsKCQoJZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmNzcyA9IGZ1bmN0aW9uKHJ0ZSwgbmFtZSkgewoJCXZhciBzZWxmID0gdGhpczsKCQl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7CgkJdGhpcy5jc3NTdHlsZSA9ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSI0MiIgbmFtZT0ic3R5bGUiIC8+Jyk7CgkJdGhpcy5jc3NDbGFzcyA9ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSI0MiIgbmFtZT0iY2xhc3MiIC8+Jyk7CgkJCgkJCgkJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgkJCXZhciBuID0gdGhpcy5ub2RlKCksIG9wdHM7CgkJCXRoaXMucnRlLnNlbGVjdGlvbi5zYXZlSUVSYW5nZSgpOwoJCQlpZiAobikgewoJCQkJdmFyIG9wdHMgPSB7CgkJCQkJCgkJCQkJc3VibWl0IDogZnVuY3Rpb24oZSwgZCkgeyBlLnN0b3BQcm9wYWdhdGlvbigpOyBlLnByZXZlbnREZWZhdWx0KCk7IGQuY2xvc2UoKTsgc2VsZi5zZXQoKTsgIH0sCgkJCQkJZGlhbG9nIDogewoJCQkJCQl0aXRsZSA6IHRoaXMucnRlLmkxOG4oJ1N0eWxlJyksCgkJCQkJCXdpZHRoIDogNDUwLAoJCQkJCQlyZXNpemFibGUgOiB0cnVlLAoJCQkJCQltb2RhbCA6IHRydWUKCQkJCQl9CgkJCQl9CgkJCQl0aGlzLmNzc1N0eWxlLnZhbCgkKG4pLmF0dHIoJ3N0eWxlJykpOwoJCQkJdGhpcy5jc3NDbGFzcy52YWwoJChuKS5hdHRyKCdjbGFzcycpKTsKCQkJCXZhciBkID0gbmV3IGVsRGlhbG9nRm9ybShvcHRzKTsKCQkJCWQuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdDc3Mgc3R5bGUnKSwgdGhpcy5jc3NTdHlsZV0sIG51bGwsIHRydWUpCgkJCQlkLmFwcGVuZChbdGhpcy5ydGUuaTE4bignQ3NzIGNsYXNzJyksIHRoaXMuY3NzQ2xhc3NdLCBudWxsLCB0cnVlKS5vcGVuKCk7CgkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBzZWxmLmNzc1N0eWxlLmZvY3VzKCkgfSwgMjApCgkJCX0KCQl9CgkJCgkJdGhpcy5zZXQgPSBmdW5jdGlvbigpIHsKCQkJdmFyIG4gPSB0aGlzLm5vZGUoKTsKCQkJdGhpcy5ydGUuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7CgkJCWlmIChuKSB7CgkJCQkkKG4pLmF0dHIoJ3N0eWxlJywgdGhpcy5jc3NTdHlsZS52YWwoKSk7CgkJCQkkKG4pLmF0dHIoJ2NsYXNzJywgdGhpcy5jc3NDbGFzcy52YWwoKSk7CgkJCQl0aGlzLnJ0ZS51aS51cGRhdGUoKTsKCQkJfQoJCX0KCQkKCQl0aGlzLm5vZGUgPSBmdW5jdGlvbigpIHsKCQkJdmFyIG4gPSB0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpOwoJCQlpZiAobi5ub2RlVHlwZSA9PSAzKSB7CgkJCQluID0gbi5wYXJlbnROb2RlOwoJCQl9CgkJCXJldHVybiBuLm5vZGVUeXBlID09IDEgJiYgbi5ub2RlTmFtZSAhPSAnQk9EWScgPyBuIDogbnVsbDsKCQl9CgkJCgkJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQkJdGhpcy5kb21FbGVtLnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsIHRoaXMubm9kZSgpP2ZhbHNlOnRydWUpOwoJCX0KCQkKCX0KCQp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoJLyoqCgkgKiBAY2xhc3MgYnV0dG9uIC0gcmlnaHQgdG8gbGVmdCBkaXJlY3Rpb24gKG5vdCB3b3JrIHlldCB3aXRoIHRleHQgbm9kZXMgaW4gYm9keSkKCSAqCgkgKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAoJICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCgkgKgoJICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQoJICogQ29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKCSAqKi8KCWVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5ydGwgPSBmdW5jdGlvbihydGUsIG5hbWUpICB7CgkJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJCXZhciBzZWxmID0gdGhpczsKCQoJCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCQl2YXIgbiA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksIHNlbGYgPSB0aGlzOwoJCQlpZiAoJChuKS5hdHRyKCdkaXInKSA9PSAncnRsJyB8fCAkKG4pLnBhcmVudHMoJ1tkaXI9InJ0bCJdJykubGVuZ3RoIHx8ICQobikuZmluZCgnW2Rpcj0icnRsIl0nKS5sZW5ndGgpIHsKCQkJCSQobikucmVtb3ZlQXR0cignZGlyJyk7CgkJCQkkKG4pLnBhcmVudHMoJ1tkaXI9InJ0bCJdJykucmVtb3ZlQXR0cignZGlyJyk7CgkJCQkkKG4pLmZpbmQoJ1tkaXI9InJ0bCJdJykucmVtb3ZlQXR0cignZGlyJyk7CgkJCX0gZWxzZSB7CgkJCQlpZiAodGhpcy5ydGUuZG9tLmlzKG4sICd0ZXh0Tm9kZXMnKSAmJiB0aGlzLnJ0ZS5kb20uaXMobiwgJ2Jsb2NrJykpIHsKCQkJCQkkKG4pLmF0dHIoJ2RpcicsICdydGwnKTsKCQkJCX0gZWxzZSB7CgkJCQkJJC5lYWNoKHRoaXMucnRlLmRvbS5wYXJlbnRzKG4sICd0ZXh0Tm9kZXMnKSwgZnVuY3Rpb24oaSwgbikgewoJCQkJCQlpZiAoc2VsZi5ydGUuZG9tLmlzKG4sICdibG9jaycpKSB7CgkJCQkJCQkkKG4pLmF0dHIoJ2RpcicsICdydGwnKTsKCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJfQoJCQkJCX0pOwoJCQkJfQoJCQl9CgkJCXRoaXMucnRlLnVpLnVwZGF0ZSgpOwoJCX0KCgkJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQkJdmFyIG4gPSB0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpOwoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CgkJCWlmICgkKG4pLmF0dHIoJ2RpcicpID09ICdydGwnIHx8ICQobikucGFyZW50cygnW2Rpcj0icnRsIl0nKS5sZW5ndGggfHwgJChuKS5maW5kKCdbZGlyPSJydGwiXScpLmxlbmd0aCkgewoJCQkJdGhpcy5kb21FbGVtLmFkZENsYXNzKCdhY3RpdmUnKTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7CgkJCX0KCQl9Cgl9CgkKCS8qKgoJICogQGNsYXNzIGJ1dHRvbiAtIGxlZnQgdG8gcmlnaHQgZGlyZWN0aW9uIChub3Qgd29yayB5ZXQgd2l0aCB0ZXh0IG5vZGVzIGluIGJvZHkpCgkgKgoJICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKCSAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAoJICoKCSAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKCSAqIENvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CgkgKiovCgllbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMubHRyID0gZnVuY3Rpb24ocnRlLCBuYW1lKSAgewoJCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCQl2YXIgc2VsZiA9IHRoaXM7CgkKCQl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQkJdmFyIG4gPSB0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCBzZWxmID0gdGhpczsKCQkJaWYgKCQobikuYXR0cignZGlyJykgPT0gJ2x0cicgfHwgJChuKS5wYXJlbnRzKCdbZGlyPSJsdHIiXScpLmxlbmd0aCB8fCAkKG4pLmZpbmQoJ1tkaXI9Imx0ciJdJykubGVuZ3RoKSB7CgkJCQkkKG4pLnJlbW92ZUF0dHIoJ2RpcicpOwoJCQkJJChuKS5wYXJlbnRzKCdbZGlyPSJsdHIiXScpLnJlbW92ZUF0dHIoJ2RpcicpOwoJCQkJJChuKS5maW5kKCdbZGlyPSJsdHIiXScpLnJlbW92ZUF0dHIoJ2RpcicpOwoJCQl9IGVsc2UgewoJCQkJaWYgKHRoaXMucnRlLmRvbS5pcyhuLCAndGV4dE5vZGVzJykgJiYgdGhpcy5ydGUuZG9tLmlzKG4sICdibG9jaycpKSB7CgkJCQkJJChuKS5hdHRyKCdkaXInLCAnbHRyJyk7CgkJCQl9IGVsc2UgewoJCQkJCSQuZWFjaCh0aGlzLnJ0ZS5kb20ucGFyZW50cyhuLCAndGV4dE5vZGVzJyksIGZ1bmN0aW9uKGksIG4pIHsKCQkJCQkJaWYgKHNlbGYucnRlLmRvbS5pcyhuLCAnYmxvY2snKSkgewoJCQkJCQkJJChuKS5hdHRyKCdkaXInLCAnbHRyJyk7CgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0KCQkJfQoJCQl0aGlzLnJ0ZS51aS51cGRhdGUoKTsKCQl9CgoJCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CgkJCXZhciBuID0gdGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKTsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJCQlpZiAoJChuKS5hdHRyKCdkaXInKSA9PSAnbHRyJyB8fCAkKG4pLnBhcmVudHMoJ1tkaXI9Imx0ciJdJykubGVuZ3RoIHx8ICQobikuZmluZCgnW2Rpcj0ibHRyIl0nKS5sZW5ndGgpIHsKCQkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnYWN0aXZlJyk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoJCQl9CgkJfQoJfQoJCn0pKGpRdWVyeSk7LyoqCiAqIEBjbGFzcyDQutC90L7Qv9C60LAgLSBESVYKICog0JXRgdC70Lgg0LLRi9C00LXQu9C10L3QuNC1INGB0YXQu9C+0L/QvdGD0YLQviDQuCDQvdCw0YXQvtC00LjRgtGB0Y8g0LLQvdGD0YLRgNC4IGRpdidhIC0g0L7QvSDRg9C00LDQu9GP0LXRgtGB0Y8KICog0J3QvtCy0YvQtSBkaXYn0Ysg0YHQvtC30LTQsNGO0YLRgdGPINGC0L7Qu9GM0LrQviDQuNC3INC90LXRgdGF0LvQvtC/0L3Rg9GC0L7Qs9C+INCy0YvQtNC10LvQtdC90LjRjwogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICogCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogY29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuZGl2ID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCXZhciBuLCBub2RlczsKCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoKCQlpZiAodGhpcy5ydGUuc2VsZWN0aW9uLmNvbGxhcHNlZCgpKSB7CgkJCW4gPSB0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksIC9eRElWJC8pOwoJCQlpZiAobikgewoJCQkJJChuKS5yZXBsYWNlV2l0aCgkKG4pLmh0bWwoKSk7CgkJCX0KCQl9IGVsc2UgewoJCQlub2RlcyA9IHRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7d3JhcCA6ICdhbGwnLCB0YWcgOiAnZGl2J30pOwoJCQlub2Rlcy5sZW5ndGggJiYgdGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdChub2Rlc1swXSwgbm9kZXNbbm9kZXMubGVuZ3RoLTFdKTsKCQl9CgkJdGhpcy5ydGUudWkudXBkYXRlKHRydWUpOwoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLnJ0ZS5zZWxlY3Rpb24uY29sbGFwc2VkKCkpIHsKCQkJaWYgKHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgL15ESVYkLykpIHsKCQkJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKS5hZGRDbGFzcygnYWN0aXZlJyk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoJ2Rpc2FibGVkIGFjdGl2ZScpOwoJCQl9CgkJfSBlbHNlIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCBhY3RpdmUnKTsKCQl9Cgl9Cn0KfSkoalF1ZXJ5KTsKLyoqCiAqIEBjbGFzcyDQutC90L7Qv9C60LAgLSDQktC60LvRjtGH0LXQvdC40LUv0LLRi9C60LvRjtGH0LXQvdC40LUg0L/QvtC60LDQt9CwINGB0YLRgNGD0LrRgtGD0YDRiyDQtNC+0LrRg9C80LXQvdGC0LAKICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqIAogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5kb2NzdHJ1Y3R1cmUgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCQoJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5kb21FbGVtLnRvZ2dsZUNsYXNzKCdhY3RpdmUnKTsKCQkkKHRoaXMucnRlLmRvYy5ib2R5KS50b2dnbGVDbGFzcygnZWwtcnRlLXN0cnVjdHVyZScpOwoJfQoJdGhpcy5jb21tYW5kKCk7CgkKCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CQoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCX0KfQp9KShqUXVlcnkpOwovKioKICogQGNsYXNzIGJ1dHRvbiAtIG9wZW4gZWxmaW5kZXIgd2luZG93IChub3QgbmVlZGVkIGZvciBpbWFnZSBvciBsaW5rIGJ1dHRvbnMpLlVzZWQgaW4gRUxET1JBRE8uQ01TIGZvciBlYXN5IGZpbGUgbWFuaXB1bGF0aW9ucy4KICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmVsZmluZGVyID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7Cgl2YXIgc2VsZiA9IHRoaXM7Cgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQlpZiAoc2VsZi5ydGUub3B0aW9ucy5mbUFsbG93ICYmIHR5cGVvZihzZWxmLnJ0ZS5vcHRpb25zLmZtT3BlbikgPT0gJ2Z1bmN0aW9uJykgewoJCQlzZWxmLnJ0ZS5vcHRpb25zLmZtT3BlbiggZnVuY3Rpb24odXJsKSB7IHNlbGYucnRlLmxvZyh1cmwpIH0gKTsKCQl9Cgl9CgkKCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CgkJaWYgKHNlbGYucnRlLm9wdGlvbnMuZm1BbGxvdyAmJiB0eXBlb2Yoc2VsZi5ydGUub3B0aW9ucy5mbU9wZW4pID09ICdmdW5jdGlvbicpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJCX0gZWxzZSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKCQl9Cgl9Cn0KCn0pKGpRdWVyeSk7KGZ1bmN0aW9uKCQpIHsKCQoJZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmZsYXNoID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7CgkJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJCXZhciBzZWxmID0gdGhpczsKCQl0aGlzLnN3ZiA9IG51bGw7CgkJdGhpcy5wbGFjZWhvbGRlciA9IG51bGw7CgkJdGhpcy5zcmMgPSB7CgkJCXVybCAgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ1cmwiIC8+JykuY3NzKCd3aWR0aCcsICc5OSUnKSwKCQkJdHlwZSAgIDogJCgnPHNlbGVjdCBuYW1lPSJ0eXBlIi8+JykKCQkJCQkJLmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT0iYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giPkZsYXNoPC9vcHRpb24+JykKCQkJCQkJLmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT0idmlkZW8vcXVpY2t0aW1lIj5RdWlja3RpbWUgbW92aWU8L29wdGlvbj4nKQoJCQkJCQkuYXBwZW5kKCc8b3B0aW9uIHZhbHVlPSJhcHBsaWNhdGlvbi94LW1wbGF5ZXIyIj5XaW5kb3dzIG1lZGlhPC9vcHRpb24+JyksCgkJCXdpZHRoICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoJ3NpemUnLCA1KS5jc3MoJ3RleHQtYWxpZ24nLCAncmlnaHQnKSwKCQkJaGVpZ2h0IDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cignc2l6ZScsIDUpLmNzcygndGV4dC1hbGlnbicsICdyaWdodCcpLAoJCQl3bW9kZSAgOiAkKCc8c2VsZWN0IC8+JykKCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCcnKS50ZXh0KHRoaXMucnRlLmkxOG4oJ05vdCBzZXQnLCAnZGlhbG9ncycpKSkKCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCd0cmFuc3BhcmVudCcpLnRleHQodGhpcy5ydGUuaTE4bignVHJhbnNwYXJlbnQnKSkpLAoJCQlhbGlnbiAgOiAkKCc8c2VsZWN0IC8+JykKCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCcnKS50ZXh0KHRoaXMucnRlLmkxOG4oJ05vdCBzZXQnLCAnZGlhbG9ncycpKSkKCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdsZWZ0JyAgICAgICApLnRleHQodGhpcy5ydGUuaTE4bignTGVmdCcpKSkKCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdyaWdodCcgICAgICApLnRleHQodGhpcy5ydGUuaTE4bignUmlnaHQnKSkpCgkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgndG9wJyAgICAgICAgKS50ZXh0KHRoaXMucnRlLmkxOG4oJ1RvcCcpKSkKCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCd0ZXh0LXRvcCcgICApLnRleHQodGhpcy5ydGUuaTE4bignVGV4dCB0b3AnKSkpCgkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgnbWlkZGxlJyAgICAgKS50ZXh0KHRoaXMucnRlLmkxOG4oJ21pZGRsZScpKSkKCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdiYXNlbGluZScgICApLnRleHQodGhpcy5ydGUuaTE4bignQmFzZWxpbmUnKSkpCgkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgnYm90dG9tJyAgICAgKS50ZXh0KHRoaXMucnRlLmkxOG4oJ0JvdHRvbScpKSkKCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCd0ZXh0LWJvdHRvbScpLnRleHQodGhpcy5ydGUuaTE4bignVGV4dCBib3R0b20nKSkpLAoJCQltYXJnaW4gOiAkKCc8ZGl2IC8+JykKCQl9CgkJCgkJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgoJCQl2YXIgbiA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXRFbmQoKSwgb3B0cywgdXJsPScnLCB3PScnLCBoPScnLCBmLCBhLCBkLCBtaWQsIG8sIHdtOwoJCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTsKCQkJdGhpcy5zcmMubWFyZ2luLmVsUGFkZGluZ0lucHV0KHsgdHlwZSA6ICdtYXJnaW4nIH0pOwoJCQl0aGlzLnBsYWNlaG9sZGVyID0gbnVsbDsKCQkJdGhpcy5zd2YgPSBudWxsOwoJCQlpZiAoJChuKS5oYXNDbGFzcygnZWxydGUtbWVkaWEnKSAmJiAobWlkID0gJChuKS5hdHRyKCdyZWwnKSkgJiYgIHRoaXMucnRlLmZpbHRlci5zY3JpcHRzW21pZF0pIHsKCQkJCXRoaXMucGxhY2Vob2xkZXIgPSAkKG4pOwoJCQkJbyA9IHRoaXMucnRlLmZpbHRlci5zY3JpcHRzW21pZF07CgkJCQl1cmwgPSAnJzsKCQkJCWlmIChvLmVtYmVkICYmIG8uZW1iZWQuc3JjKSB7CgkJCQkJdXJsID0gby5lbWJlZC5zcmM7CgkJCQl9CgkJCQlpZiAoby5wYXJhbXMgJiYgby5wYXJhbXMubGVuZ3RoKSB7CgkJCQkJbCA9IG8ucGFyYW1zLmxlbmd0aDsKCQkJCQl3aGlsZSAobC0tKSB7CgkJCQkJCWlmIChvLnBhcmFtc1tsXS5uYW1lID09ICdzcmMnIHx8IG8ucGFyYW1zW2xdLm5hbWUgPT0gJ21vdmllJykgewoJCQkJCQkJdXJsID0gIG8ucGFyYW1zW2xdLnZhbHVlOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJCgkJCQlpZiAoby5lbWJlZCkgewoJCQkJCXcgPSBvLmVtYmVkLndpZHRofHxwYXJzZUludChvLmVtYmVkLnN0eWxlLndpZHRoKXx8Jyc7CgkJCQkJaCA9IG8uZW1iZWQuaGVpZ2h0fHxwYXJzZUludChvLmVtYmVkLnN0eWxlLmhlaWdodCl8fCcnOwoJCQkJCXdtID0gby5lbWJlZC53bW9kZXx8Jyc7CgkJCQl9IGVsc2UgaWYgKG8ub2JqKSB7CgkJCQkJdyA9IG8ub2JqLndpZHRofHxwYXJzZUludChvLm9iai5zdHlsZS53aWR0aCl8fCcnOwoJCQkJCWggPSBvLm9iai5oZWlnaHR8fHBhcnNlSW50KG8ub2JqLnN0eWxlLmhlaWdodCl8fCcnOwoJCQkJCXdtID0gby5vYmoud21vZGV8fCcnOwoJCQkJfQoJCQkJCgkJCQlpZiAoby5vYmopIHsKCQkJCQlmID0gby5vYmouc3R5bGVbJ2Zsb2F0J118fCcnOwoJCQkJCWEgPSBvLm9iai5zdHlsZVsndmVydGljYWwtYWxpZ24nXXx8Jyc7CgkJCQl9IGVsc2UgaWYgKG8uZW1iZWQpIHsKCQkJCQlmID0gby5lbWJlZC5zdHlsZVsnZmxvYXQnXXx8Jyc7CgkJCQkJYSA9IG8uZW1iZWQuc3R5bGVbJ3ZlcnRpY2FsLWFsaWduJ118fCcnOwoJCQkJfQoJCQkJdGhpcy5zcmMubWFyZ2luLnZhbChuKTsKCQkJCXRoaXMuc3JjLnR5cGUudmFsKG8uZW1iZWQgPyBvLmVtYmVkLnR5cGUgOiAnJyk7CgkJCX0KCQkJaWYgKCQobikuaGFzQ2xhc3MoJ2VscnRlLXN3Zi1wbGFjZWhvbGRlcicpKSB7CgkJCQl0aGlzLnBsYWNlaG9sZGVyID0gJChuKTsKCQkJCXVybCA9ICQobikuYXR0cigncmVsJyk7CgkJCQl3ID0gcGFyc2VJbnQoJChuKS5jc3MoJ3dpZHRoJykpfHwnJzsKCQkJCWggPSBwYXJzZUludCgkKG4pLmNzcygnaGVpZ2h0JykpfHwnJzsKCQkJCWYgPSAkKG4pLmNzcygnZmxvYXQnKTsKCQkJCWEgPSAkKG4pLmNzcygndmVydGljYWwtYWxpZ24nKTsKCQkJCXRoaXMuc3JjLm1hcmdpbi52YWwobik7CgkJCQl0aGlzLnNyYy53bW9kZS52YWwoJChuKS5hdHRyKCd3bW9kZScpKTsKCQkJfSAKCQkJdGhpcy5zcmMudXJsLnZhbCh1cmwpOwoJCQl0aGlzLnNyYy53aWR0aC52YWwodyk7CgkJCXRoaXMuc3JjLmhlaWdodC52YWwoaCk7CgkJCXRoaXMuc3JjLmFsaWduLnZhbChmfHxhKTsKCQkJdGhpcy5zcmMud21vZGUudmFsKHdtKTsKCQkJCgoJCQkKCgkJCXZhciBvcHRzID0gewoJCQkJcnRsIDogdGhpcy5ydGUucnRsLAoJCQkJc3VibWl0IDogZnVuY3Rpb24oZSwgZCkgeyBlLnN0b3BQcm9wYWdhdGlvbigpOyBlLnByZXZlbnREZWZhdWx0KCk7IHNlbGYuc2V0KCk7IGQuY2xvc2UoKTsgfSwKCQkJCWRpYWxvZyA6IHsKCQkJCQl3aWR0aCAgICA6IDU4MCwKCQkJCQlwb3NpdGlvbiA6ICd0b3AnLAoJCQkJCXRpdGxlICAgIDogdGhpcy5ydGUuaTE4bignRmxhc2gnKQoJCQkJfQoJCQl9CgkJCXZhciBkID0gbmV3IGVsRGlhbG9nRm9ybShvcHRzKTsKCQkJCgkJCWlmICh0aGlzLnJ0ZS5vcHRpb25zLmZtQWxsb3cgJiYgdGhpcy5ydGUub3B0aW9ucy5mbU9wZW4pIHsKCQkJCXZhciBzcmMgPSAkKCc8c3BhbiAvPicpLmFwcGVuZCh0aGlzLnNyYy51cmwuY3NzKCd3aWR0aCcsICc4NSUnKSkKCQkJCQkJLmFwcGVuZCgKCQkJCQkJCSQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ3VpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCcpCgkJCQkJCQkJLmNzcyh7J2Zsb2F0JyA6ICdyaWdodCcsICdtYXJnaW4tcmlnaHQnIDogJzNweCd9KQoJCQkJCQkJCS5hdHRyKCd0aXRsZScsIHNlbGYucnRlLmkxOG4oJ09wZW4gZmlsZSBtYW5nZXInKSkKCQkJCQkJCQkuYXBwZW5kKCQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ3VpLWljb24gdWktaWNvbi1mb2xkZXItb3BlbicpKQoJCQkJCQkJCQkuY2xpY2soIGZ1bmN0aW9uKCkgewoJCQkJCQkJCQkJc2VsZi5ydGUub3B0aW9ucy5mbU9wZW4oIGZ1bmN0aW9uKHVybCkgeyBzZWxmLnNyYy51cmwudmFsKHVybCkuY2hhbmdlKCk7IH0gKTsKCQkJCQkJCQkJfSkKCQkJCQkJCQkJLmhvdmVyKGZ1bmN0aW9uKCkgeyQodGhpcykuYWRkQ2xhc3MoJ3VpLXN0YXRlLWhvdmVyJyl9LCBmdW5jdGlvbigpIHsgJCh0aGlzKS5yZW1vdmVDbGFzcygndWktc3RhdGUtaG92ZXInKX0pCgkJCQkJCQkpOwoJCQl9IGVsc2UgewoJCQkJdmFyIHNyYyA9IHRoaXMuc3JjLnVybDsKCQkJfQoJCQkKCQkJZC5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ1VSTCcpLCBzcmNdLCBudWxsLCB0cnVlKTsKCQkJZC5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ1R5cGUnKSwgdGhpcy5zcmMudHlwZV0sIG51bGwsIHRydWUpOwoJCQlkLmFwcGVuZChbdGhpcy5ydGUuaTE4bignU2l6ZScpLCAkKCc8c3BhbiAvPicpLmFwcGVuZCh0aGlzLnNyYy53aWR0aCkuYXBwZW5kKCcgeCAnKS5hcHBlbmQodGhpcy5zcmMuaGVpZ2h0KS5hcHBlbmQoJyBweCcpXSwgbnVsbCwgdHJ1ZSkKCQkJZC5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ1dtb2RlJyksIHRoaXMuc3JjLndtb2RlXSwgbnVsbCwgdHJ1ZSk7CgkJCWQuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdBbGlnbm1lbnQnKSwgdGhpcy5zcmMuYWxpZ25dLCBudWxsLCB0cnVlKTsKCQkJZC5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ01hcmdpbnMnKSwgdGhpcy5zcmMubWFyZ2luXSwgbnVsbCwgdHJ1ZSk7CgkJCQoJCQkKCQkJCgkJCWQub3BlbigpOwoJCQlzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtzZWxmLnNyYy51cmwuZm9jdXMoKX0sIDEwMCkKCQkJCgkJCQoJCQl2YXIgZnMgPSAkKCc8ZmllbGRzZXQgLz4nKS5hcHBlbmQoJCgnPGxlZ2VuZCAvPicpLnRleHQodGhpcy5ydGUuaTE4bignUHJldmlldycpKSkKCQkJZC5hcHBlbmQoZnMsICdtYWluJyk7CgkJCXZhciBmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpOwoJCQkkKGZyYW1lKS5hdHRyKCdzcmMnLCAnIycpLmFkZENsYXNzKCdlbC1ydGUtcHJldmlldycpLmFwcGVuZFRvKGZzKTsKCQkJaHRtbCA9IHRoaXMucnRlLm9wdGlvbnMuZG9jdHlwZSsnPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPjwvaGVhZD48Ym9keSBzdHlsZT0icGFkZGluZzowO21hcmdpbjowO2ZvbnQtc2l6ZTo5cHgiPiBQcm9pbiBlbGl0IGFyY3UsIHJ1dHJ1bSBjb21tb2RvLCB2ZWhpY3VsYSB0ZW1wdXMsIGNvbW1vZG8gYSwgcmlzdXMuIEN1cmFiaXR1ciBuZWMgYXJjdS4gRG9uZWMgc29sbGljaXR1ZGluIG1pIHNpdCBhbWV0IG1hdXJpcy4gTmFtIGVsZW1lbnR1bSBxdWFtIHVsbGFtY29ycGVyIGFudGUuIEV0aWFtIGFsaXF1ZXQgbWFzc2EgZXQgbG9yZW0uIE1hdXJpcyBkYXBpYnVzIGxhY3VzIGF1Y3RvciByaXN1cy4gQWVuZWFuIHRlbXBvciB1bGxhbWNvcnBlciBsZW8uIFZpdmFtdXMgc2VkIG1hZ25hIHF1aXMgbGlndWxhIGVsZWlmZW5kIGFkaXBpc2NpbmcuIER1aXMgb3JjaS4gQWxpcXVhbSBzb2RhbGVzIHRvcnRvciB2aXRhZSBpcHN1bS4gQWxpcXVhbSBudWxsYS4gRHVpcyBhbGlxdWFtIG1vbGVzdGllIGVyYXQuIFV0IGV0IG1hdXJpcyB2ZWwgcGVkZSB2YXJpdXMgc29sbGljaXR1ZGluPC9ib2R5PjwvaHRtbD4nOwoJCQlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50Lm9wZW4oKTsKCQkJZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShodG1sKTsKCQkJZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC5jbG9zZSgpOwoJCQl0aGlzLmZyYW1lID0gZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDsKCQkJdGhpcy5wcmV2aWV3ID0gJChmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHkpOwoJCQkgCQkJCSAKCQkJdGhpcy5zcmMudHlwZS5jaGFuZ2UoZnVuY3Rpb24oKSB7CgkJCQlzZWxmLnNyYy51cmwuY2hhbmdlKCk7CgkJCX0pOwoKCQkJdGhpcy5zcmMud2lkdGguY2hhbmdlKGZ1bmN0aW9uKCkgewoJCQkJaWYgKHNlbGYuc3dmKSB7CgkJCQkJdmFyIHcgPSBwYXJzZUludCgkKHRoaXMpLnZhbCgpKXx8Jyc7CgkJCQkJJCh0aGlzKS52YWwodyk7CgkJCQkJc2VsZi5zd2YuY3NzKCd3aWR0aCcsIHcpOwoJCQkJCXNlbGYuc3dmLmNoaWxkcmVuKCdlbWJlZCcpLmNzcygnd2lkdGgnLCB3KTsKCQkJCX0gZWxzZSB7CgkJCQkJJCh0aGlzKS52YWwoJycpOwoJCQkJfQoJCQl9KTsKCgkJCXRoaXMuc3JjLmhlaWdodC5jaGFuZ2UoZnVuY3Rpb24oKSB7CgkJCQlpZiAoc2VsZi5zd2YpIHsKCQkJCQl2YXIgaCA9IHBhcnNlSW50KCQodGhpcykudmFsKCkpfHwnJzsKCQkJCQkkKHRoaXMpLnZhbChoKTsKCQkJCQlzZWxmLnN3Zi5jc3MoJ2hlaWdodCcsIGgpOwoJCQkJCXNlbGYuc3dmLmNoaWxkcmVuKCdlbWJlZCcpLmNzcygnaGVpZ2h0JywgaCk7CgkJCQl9IGVsc2UgewoJCQkJCSQodGhpcykudmFsKCcnKTsKCQkJCX0KCQkJfSk7CgkJCQoJCQl0aGlzLnNyYy53bW9kZS5jaGFuZ2UoZnVuY3Rpb24oKSB7CgkJCQlpZiAoc2VsZi5zd2YpIHsKCQkJCQl2YXIgd20gPSAkKHRoaXMpLnZhbCgpOwoJCQkJCWlmICh3bSkgewoJCQkJCQlzZWxmLnN3Zi5hdHRyKCd3bW9kZScsIHdtKTsKCQkJCQkJc2VsZi5zd2YuY2hpbGRyZW4oJ2VtYmVkJykuYXR0cignd21vZGUnLCB3bSk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZi5zd2YucmVtb3ZlQXR0cignd21vZGUnKTsKCQkJCQkJc2VsZi5zd2YuY2hpbGRyZW4oJ2VtYmVkJykucmVtb3ZlQXR0cignd21vZGUnKTsKCQkJCQl9CgkJCQl9CgkJCX0pOwoJCQkKCQkJdGhpcy5zcmMuYWxpZ24uY2hhbmdlKGZ1bmN0aW9uKCkgewoJCQkJdmFyIHYgPSAkKHRoaXMpLnZhbCgpLCBmID0gdj09J2xlZnQnIHx8IHY9PSdyaWdodCc7CgkJCQlpZiAoc2VsZi5zd2YpIHsKCQkJCQlzZWxmLnN3Zi5jc3MoewoJCQkJCQknZmxvYXQnIDogZiA/IHYgOiAnJywKCQkJCQkJJ3ZlcnRpY2FsLWFsaWduJyA6IGYgPyAnJyA6IHYKCQkJCQl9KTsKCQkJCX0gZWxzZSB7CgkJCQkJJCh0aGlzKS52YWwoJycpOwoJCQkJfQoJCQl9KTsKCQkJCgkJCXRoaXMuc3JjLm1hcmdpbi5jaGFuZ2UoZnVuY3Rpb24oKSB7CgkJCQlpZiAoc2VsZi5zd2YpIHsKCQkJCQl2YXIgbSA9IHNlbGYuc3JjLm1hcmdpbi52YWwoKTsKCQkJCQlpZiAobS5jc3MpIHsKCQkJCQkJc2VsZi5zd2YuY3NzKCdtYXJnaW4nLCBtLmNzcyk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZi5zd2YuY3NzKCdtYXJnaW4tdG9wJywgbS50b3ApOwoJCQkJCQlzZWxmLnN3Zi5jc3MoJ21hcmdpbi1yaWdodCcsIG0ucmlnaHQpOwoJCQkJCQlzZWxmLnN3Zi5jc3MoJ21hcmdpbi1ib3R0b20nLCBtLmJvdHRvbSk7CgkJCQkJCXNlbGYuc3dmLmNzcygnbWFyZ2luLWxlZnQnLCBtLmxlZnQpOwkJCQkJCQoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJCQoJCQl0aGlzLnNyYy51cmwuY2hhbmdlKGZ1bmN0aW9uKCkgewoJCQkJdmFyIHVybCA9IHNlbGYucnRlLnV0aWxzLmFic29sdXRlVVJMKCQodGhpcykudmFsKCkpLCBpLCBzd2Y7CgkJCQlpZiAodXJsKSB7CgkJCQkJaSA9IHNlbGYucnRlLnV0aWxzLm1lZGlhSW5mbyhzZWxmLnNyYy50eXBlLnZhbCgpKTsKCQkJCQlpZiAoIWkpIHsKCQkJCQkJaSA9IHNlbGYucnRlLnV0aWwubWVkaWFJbmZvKCdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcpOwoJCQkJCX0KCQkJCQlzd2YgPSAnPG9iamVjdCBjbGFzc2lkPSInK2kuY2xhc3NpZCsnIiBjb2RlYmFzZT0iJytpLmNvZGViYXNlKyciPjxwYXJhbSBuYW1lPSJzcmMiIHZhbHVlPSInK3VybCsnIiAvPjxlbWJlZCBxdWFsaXR5PSJoaWdoIiBzcmM9IicrdXJsKyciIHR5cGU9IicraS50eXBlKyciPjwvb2JqZWN0Pic7CgkJCQkJc2VsZi5wcmV2aWV3LmNoaWxkcmVuKCdvYmplY3QnKS5yZW1vdmUoKS5lbmQoKS5wcmVwZW5kKHN3Zik7CgkJCQkJc2VsZi5zd2YgPSBzZWxmLnByZXZpZXcuY2hpbGRyZW4oJ29iamVjdCcpLmVxKDApOwoJCQkJfSBlbHNlIGlmIChzZWxmLnN3Zil7CgkJCQkJc2VsZi5zd2YucmVtb3ZlKCk7CgkJCQkJc2VsZi5zd2YgPSBudWxsOwoJCQkJfQoJCQkJc2VsZi5zcmMud2lkdGgudHJpZ2dlcignY2hhbmdlJyk7CgkJCQlzZWxmLnNyYy5oZWlnaHQudHJpZ2dlcignY2hhbmdlJyk7CgkJCQlzZWxmLnNyYy5hbGlnbi50cmlnZ2VyKCdjaGFuZ2UnKTsKCgkJCX0pLnRyaWdnZXIoJ2NoYW5nZScpOwoJCX07CgkJCgkJdGhpcy5zZXQgPSBmdW5jdGlvbigpIHsKCQkJc2VsZi5zd2YgPSBudWxsCgkJCXZhciB1cmwgPSB0aGlzLnJ0ZS51dGlscy5hYnNvbHV0ZVVSTCh0aGlzLnNyYy51cmwudmFsKCkpLAoJCQkJdyA9IHBhcnNlSW50KHRoaXMuc3JjLndpZHRoLnZhbCgpKSB8fCAnJywKCQkJCWggPSBwYXJzZUludCh0aGlzLnNyYy5oZWlnaHQudmFsKCkpIHx8ICcnLAoJCQkJd20gPSB0aGlzLnNyYy53bW9kZS52YWwoKSwKCQkJCWEgPSB0aGlzLnNyYy5hbGlnbi52YWwoKSwKCQkJCWYgPSBhID09ICdsZWZ0JyB8fCBhID09ICdyaWdodCcgPyBhIDogJycsCgkJCQltaWQgPSB0aGlzLnBsYWNlaG9sZGVyID8gdGhpcy5wbGFjZWhvbGRlci5hdHRyKCdyZWwnKSA6ICcnLCBvLCBfbywgYywgCgkJCQltID0gdGhpcy5zcmMubWFyZ2luLnZhbCgpLCBtYXJnaW47CgoJCQkKCQkJCgkJCWlmICghdXJsKSB7CgkJCQlpZiAodGhpcy5wbGFjZWhvbGRlcikgewoJCQkJCXRoaXMucGxhY2Vob2xkZXIucmVtb3ZlKCk7CgkJCQkJZGVsZXRlIHRoaXMucnRlLmZpbHRlci5zY3JpcHRzW21pZF07CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlpID0gc2VsZi5ydGUudXRpbHMubWVkaWFJbmZvKHNlbGYuc3JjLnR5cGUudmFsKCkpOwoJCQkJaWYgKCFpKSB7CgkJCQkJaSA9IHNlbGYucnRlLnV0aWwubWVkaWFJbmZvKCdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcpOwoJCQkJfQoJCQkJYyA9IHRoaXMucnRlLmZpbHRlci52aWRlb0hvc3RSZWdFeHAudGVzdCh1cmwpID8gdXJsLnJlcGxhY2UodGhpcy5ydGUuZmlsdGVyLnZpZGVvSG9zdFJlZ0V4cCwgIiQyIikgOiBpLnR5cGUucmVwbGFjZSgvXlx3K1wvKC4rKS8sICIkMSIpOwoKCQkJCW8gPSB7CgkJCQkJb2JqIDogewoJCQkJCQljbGFzc2lkIDogaS5jbGFzc2lkWzBdLAoJCQkJCQljb2RlYmFzZSA6IGkuY29kZWJhc2UsCgkJCQkJCXN0eWxlIDoge30KCQkJCQl9LAoJCQkJCXBhcmFtcyA6WyB7IG5hbWUgOiAnc3JjJywgdmFsdWUgOiB1cmwgfSBdLAoJCQkJCWVtYmVkIDp7CgkJCQkJCXNyYyA6IHVybCwKCQkJCQkJdHlwZSA6IGkudHlwZSwKCQkJCQkJcXVhbGl0eSA6ICdoaWdoJywKCQkJCQkJd21vZGUgOiB3bSwKCQkJCQkJc3R5bGUgOiB7fQoJCQkJCX0KCQkJCX07CgkJCQkKCQkJCWlmICh3KSB7CgkJCQkJby5vYmoud2lkdGggPSB3OwoJCQkJCW8uZW1iZWQud2lkdGggPSB3OwoJCQkJfQoJCQkJaWYgKGgpIHsKCQkJCQlvLm9iai5oZWlnaHQgPSBoOwoJCQkJCW8uZW1iZWQuaGVpZ2h0ID0gaDsKCQkJCX0KCQkJCWlmIChmKSB7CgkJCQkJby5vYmouc3R5bGVbJ2Zsb2F0J10gPSBmOwoJCQkJfSBlbHNlIGlmIChhKSB7CgkJCQkJby5vYmouc3R5bGVbJ3ZlcnRpY2FsLWFsaWduJ10gPSBhOwoJCQkJfQoJCQkJCgkJCQlpZiAobS5jc3MpIHsKCQkJCQltYXJnaW4gPSB7IG1hcmdpbiA6IG0uY3NzIH07CgkJCQl9IGVsc2UgewoJCQkJCW1hcmdpbiA9IHsKCQkJCQkJJ21hcmdpbi10b3AnIDogbS50b3AsCgkJCQkJCSdtYXJnaW4tcmlnaHQnIDogbS5yaWdodCwKCQkJCQkJJ21hcmdpbi1ib3R0b20nIDogbS5ib3R0b20sCgkJCQkJCSdtYXJnaW4tbGVmdCcgOiBtLmxlZnQKCQkJCQl9OwoJCQkJfQoJCQkJCgkJCQlvLm9iai5zdHlsZSA9ICQuZXh0ZW5kKHt9LCBvLm9iai5zdHlsZSwgbWFyZ2luKTsKCQkJCQoJCQkJaWYgKHRoaXMucGxhY2Vob2xkZXIgJiYgbWlkKSB7CgkJCQkJX28gPSB0aGlzLnJ0ZS5maWx0ZXIuc2NyaXB0c1ttaWRdfHx7fTsKCgkJCQkJbyA9ICQuZXh0ZW5kKHRydWUsIF9vLCBvKTsKCQkJCQlkZWxldGUgby5vYmouc3R5bGUud2lkdGg7CgkJCQkJZGVsZXRlIG8ub2JqLnN0eWxlLmhlaWdodDsKCQkJCQlkZWxldGUgby5lbWJlZC5zdHlsZS53aWR0aDsKCQkJCQlkZWxldGUgby5lbWJlZC5zdHlsZS5oZWlnaHQ7CgkJCQkJdGhpcy5ydGUuZmlsdGVyLnNjcmlwdHNbbWlkXSA9IG87CgkJCQkJdGhpcy5wbGFjZWhvbGRlci5yZW1vdmVBdHRyKCdjbGFzcycpOwoJCQkJfSBlbHNlIHsKCQkJCQl2YXIgaWQgPSAnbWVkaWEnK01hdGgucmFuZG9tKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMik7CgkJCQkJdGhpcy5ydGUuZmlsdGVyLnNjcmlwdHNbaWRdID0gbzsKCQkJCQl0aGlzLnBsYWNlaG9sZGVyID0gJCh0aGlzLnJ0ZS5kb20uY3JlYXRlKCdpbWcnKSkuYXR0cigncmVsJywgaWQpLmF0dHIoJ3NyYycsIHRoaXMucnRlLmZpbHRlci51cmwrJ3BpeGVsLmdpZicpOwoJCQkJCXZhciBpbnMgPSB0cnVlOwoJCQkJfQoJCQkJdGhpcy5wbGFjZWhvbGRlci5hdHRyKCd0aXRsZScsIHRoaXMucnRlLnV0aWxzLmVuY29kZSh1cmwpKS5hdHRyKCd3aWR0aCcsIHd8fDE1MCkuYXR0cignaGVpZ2h0JywgaHx8MTAwKS5hZGRDbGFzcygnZWxydGUtcHJvdGVjdGVkIGVscnRlLW1lZGlhIGVscnRlLW1lZGlhLScrYykuY3NzKG8ub2JqLnN0eWxlKTsKCQkJCWlmIChmKSB7CgkJCQkJdGhpcy5wbGFjZWhvbGRlci5jc3MoJ2Zsb2F0JywgZikuY3NzKCd2ZXJ0aWNhbC1hbGlnbicsICcnKTsKCQkJCX0gZWxzZSBpZiAoYSkgewoJCQkJCXRoaXMucGxhY2Vob2xkZXIuY3NzKCdmbG9hdCcsICcnKS5jc3MoJ3ZlcnRpY2FsLWFsaWduJywgYSk7CgkJCQl9IGVsc2UgewoJCQkJCXRoaXMucGxhY2Vob2xkZXIuY3NzKCdmbG9hdCcsICcnKS5jc3MoJ3ZlcnRpY2FsLWFsaWduJywgJycpOwoJCQkJfQoJCQkJCgkJCQlpZiAoaW5zKSB7CgkJCQkJdGhpcy5ydGUud2luZG93LmZvY3VzKCk7CgkJCQkJdGhpcy5ydGUuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7CgkJCQkJdGhpcy5ydGUuc2VsZWN0aW9uLmluc2VydE5vZGUodGhpcy5wbGFjZWhvbGRlci5nZXQoMCkpOwoJCQkJfQoJCQl9CgkJfQoJCQoJCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CgkJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCQkJdmFyIG4gPSB0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpOwoJCQl0aGlzLmRvbUVsZW0udG9nZ2xlQ2xhc3MoJ2FjdGl2ZScsIG4gJiYgbi5ub2RlTmFtZSA9PSAnSU1HJyAmJiAkKG4pLmhhc0NsYXNzKCdlbHJ0ZS1tZWRpYScpKQoJCQkKCQl9CgkJCgkJCgl9Cn0pKGpRdWVyeSk7LyoqCiAqIEBjbGFzcyBkcm9wLWRvd24gbWVudSAtIGZvbnQtZmFtaWx5IGZvciBzZWxlY3RlZCB0ZXh0CiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5mb250bmFtZSA9IGZ1bmN0aW9uKHJ0ZSwgbmFtZSkgewoJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJdmFyIHNlbGYgPSB0aGlzOwoJdmFyIG9wdHMgPSB7CgkJdHBsICAgICAgOiAnPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiV2YWwiPiVsYWJlbDwvc3Bhbj4nLAoJCXNlbGVjdCAgIDogZnVuY3Rpb24odikgeyBzZWxmLnNldCh2KTsgfSwKCQlzcmMgICAgICA6IHsKCQkJJycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnJ0ZS5pMThuKCdGb250JyksCgkJCSdhbmRhbGUgbW9ubyxzYW5zLXNlcmlmJyAgICAgICAgICAgICAgICAgICAgICAgIDogJ0FuZGFsZSBNb25vJywKCQkJJ2FyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmJyAgICAgICAgICAgICAgICAgICAgOiAnQXJpYWwnLAoJCQknYXJpYWwgYmxhY2ssZ2FkZ2V0LHNhbnMtc2VyaWYnICAgICAgICAgICAgICAgICA6ICdBcmlhbCBCbGFjaycsCgkJCSdib29rIGFudGlxdWEscGFsYXRpbm8sc2Fucy1zZXJpZicgICAgICAgICAgICAgIDogJ0Jvb2sgQW50aXF1YScsCgkJCSdjb21pYyBzYW5zIG1zLGN1cnNpdmUnICAgICAgICAgICAgICAgICAgICAgICAgIDogJ0NvbWljIFNhbnMgTVMnLAoJCQknY291cmllciBuZXcsY291cmllcixtb25vc3BhY2UnICAgICAgICAgICAgICAgICA6ICdDb3VyaWVyIE5ldycsCgkJCSdnZW9yZ2lhLHBhbGF0aW5vLHNlcmlmJyAgICAgICAgICAgICAgICAgICAgICAgIDogJ0dlb3JnaWEnLAoJCQknaGVsdmV0aWNhLHNhbnMtc2VyaWYnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdIZWx2ZXRpY2EnLAoJCQknaW1wYWN0LHNhbnMtc2VyaWYnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdJbXBhY3QnLAoJCQknbHVjaWRhIGNvbnNvbGUsbW9uYWNvLG1vbm9zcGFjZScgICAgICAgICAgICAgICA6ICdMdWNpZGEgY29uc29sZScsCgkJCSdsdWNpZGEgc2FucyB1bmljb2RlLGx1Y2lkYSBncmFuZGUsc2Fucy1zZXJpZicgIDogJ0x1Y2lkYSBncmFuZGUnLAoJCQkndGFob21hLHNhbnMtc2VyaWYnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdUYWhvbWEnLAoJCQkndGltZXMgbmV3IHJvbWFuLHRpbWVzLHNlcmlmJyAgICAgICAgICAgICAgICAgICA6ICdUaW1lcyBOZXcgUm9tYW4nLAoJCQkndHJlYnVjaGV0IG1zLGx1Y2lkYSBncmFuZGUsdmVyZGFuYSxzYW5zLXNlcmlmJyA6ICdUcmVidWNoZXQgTVMnLAoJCQkndmVyZGFuYSxnZW5ldmEsc2Fucy1zZXJpZicgICAgICAgICAgICAgICAgICAgICA6ICdWZXJkYW5hJwoJCX0KCX0KCQoJdGhpcy5zZWxlY3QgPSB0aGlzLmRvbUVsZW0uZWxTZWxlY3Qob3B0cyk7CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJfQoJCgl0aGlzLnNldCA9IGZ1bmN0aW9uKHNpemUpIHsKCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoJCXZhciBub2RlcyA9IHRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7ZmlsdGVyIDogJ3RleHRDb250YWluc05vZGVzJ30pOwoJCSQuZWFjaChub2RlcywgZnVuY3Rpb24oKSB7CgkJCSR0aGlzID0gL14oVEhFQUR8VEZPT1R8VEJPRFl8Q09MfENPTEdST1VQfFRSKSQvLnRlc3QodGhpcy5ub2RlTmFtZSkgPyAkKHRoaXMpLmZpbmQoJ3RkLHRoJykgOiAkKHRoaXMpOwoJCQkkKHRoaXMpLmNzcygnZm9udC1mYW1pbHknLCBzaXplKS5maW5kKCdbc3R5bGVdJykuY3NzKCdmb250LWZhbWlseScsICcnKTsKCQl9KTsKCQl0aGlzLnJ0ZS51aS51cGRhdGUoKTsKCX0KCQoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7IAoJCXZhciBuID0gdGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKTsKCQlpZiAobi5ub2RlVHlwZSAhPSAxKSB7CgkJCW4gPSBuLnBhcmVudE5vZGU7CgkJfQoJCXZhciB2ID0gJChuKS5jc3MoJ2ZvbnQtZmFtaWx5Jyk7CgkJdiA9IHYgPyB2LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8sXHMrL2csICcsJykucmVwbGFjZSgvJ3wiL2csICcnKSA6ICcnOwoJCXRoaXMuc2VsZWN0LnZhbChvcHRzLnNyY1t2XSA/IHYgOiAnJyk7Cgl9Cn0KCn0pKGpRdWVyeSk7LyoqCiAqIEBjbGFzcyBkcm9wLWRvd24gbWVudSAtIGZvbnQgc2l6ZSBmb3Igc2VsZWN0ZWQgdGV4dAogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKiBAY29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuZm9udHNpemUgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCXZhciBzZWxmID0gdGhpczsKCXZhciBvcHRzID0gewoJCWxhYmVsVHBsIDogJyVsYWJlbCcsCgkJdHBsICAgICAgOiAnPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToldmFsO2xpbmUtaGVpZ2h0OjEuMmVtIj4lbGFiZWw8L3NwYW4+JywKCQlzZWxlY3QgICA6IGZ1bmN0aW9uKHYpIHsgc2VsZi5zZXQodik7IH0sCgkJc3JjICAgICAgOiB7CgkJCScnICAgICAgICAgOiB0aGlzLnJ0ZS5pMThuKCdGb250IHNpemUnKSwKCQkJJ3h4LXNtYWxsJyA6IHRoaXMucnRlLmkxOG4oJ1NtYWxsICg4cHQpJyksIAoJCQkneC1zbWFsbCcgIDogdGhpcy5ydGUuaTE4bignU21hbGwgKDEwcHgpJyksIAoJCQknc21hbGwnICAgIDogdGhpcy5ydGUuaTE4bignU21hbGwgKDEycHQpJyksIAoJCQknbWVkaXVtJyAgIDogdGhpcy5ydGUuaTE4bignTm9ybWFsICgxNHB0KScpLAoJCQknbGFyZ2UnICAgIDogdGhpcy5ydGUuaTE4bignTGFyZ2UgKDE4cHQpJyksCgkJCSd4LWxhcmdlJyAgOiB0aGlzLnJ0ZS5pMThuKCdMYXJnZSAoMjRwdCknKSwKCQkJJ3h4LWxhcmdlJyA6IHRoaXMucnRlLmkxOG4oJ0xhcmdlICgzNnB0KScpCgkJfQoJfQoJCgl0aGlzLnNlbGVjdCA9IHRoaXMuZG9tRWxlbS5lbFNlbGVjdChvcHRzKTsKCQoJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7Cgl9CgkKCXRoaXMuc2V0ID0gZnVuY3Rpb24oc2l6ZSkgewoJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJdmFyIG5vZGVzID0gdGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdGVkKHtmaWx0ZXIgOiAndGV4dENvbnRhaW5zTm9kZXMnfSk7CgkJJC5lYWNoKG5vZGVzLCBmdW5jdGlvbigpIHsKCQkJJHRoaXMgPSAvXihUSEVBRHxURk9PVHxUQk9EWXxDT0x8Q09MR1JPVVB8VFIpJC8udGVzdCh0aGlzLm5vZGVOYW1lKSA/ICQodGhpcykuZmluZCgndGQsdGgnKSA6ICQodGhpcyk7CgkJCSR0aGlzLmNzcygnZm9udC1zaXplJywgc2l6ZSkuZmluZCgiW3N0eWxlXSIpLmNzcygnZm9udC1zaXplJywgJycpOwoJCX0pOwoJCXRoaXMucnRlLnVpLnVwZGF0ZSgpOwoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCQl2YXIgbiA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7CgkJdGhpcy5zZWxlY3QudmFsKChtID0gdGhpcy5ydGUuZG9tLmF0dHIobiwgJ3N0eWxlJykubWF0Y2goL2ZvbnQtc2l6ZTpccyooW147XSspL2kpKSA/IG1bMV0gOiAnJyk7Cgl9Cn0KCn0pKGpRdWVyeSk7LyoqCiAqIEBjbGFzcyBjb2xvciBwYWxsZXRlIGZvciB0ZXh0IGNvbG9yIGFuZCBiYWNrZ3JvdW5kCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5mb3JlY29sb3IgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXZhciBzZWxmID0gdGhpczsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCXZhciBvcHRzID0gewoJCSdjbGFzcycgOiAnJywKCQljb2xvciAgIDogdGhpcy5kZWZhdWx0Q29sb3IsCgkJdXBkYXRlICA6IGZ1bmN0aW9uKGMpIHsgc2VsZi5pbmRpY2F0b3IuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgYyk7IH0sCgkJY2hhbmdlICA6IGZ1bmN0aW9uKGMpIHsgc2VsZi5zZXQoYykgfQoJfQoJCgl0aGlzLmRlZmF1bHRDb2xvciA9IHRoaXMubmFtZSA9PSAnZm9yZWNvbG9yJyA/ICcjMDAwMDAwJyA6ICcjZmZmZmZmJzsKCXRoaXMucGlja2VyICAgICAgID0gdGhpcy5kb21FbGVtLmVsQ29sb3JQaWNrZXIob3B0cyk7Cgl0aGlzLmluZGljYXRvciAgICA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnY29sb3ItaW5kaWNhdG9yJykucHJlcGVuZFRvKHRoaXMuZG9tRWxlbSk7CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJfQoJCgl0aGlzLnNldCA9IGZ1bmN0aW9uKGMpIHsKCQlpZiAoIXRoaXMucnRlLnNlbGVjdGlvbi5jb2xsYXBzZWQoKSkgewoJCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoJCQl2YXIgbm9kZXMgPSB0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoe2NvbGxhcHNlIDogZmFsc2UsIHdyYXAgOiAndGV4dCd9KSwKCQkJCWNzcyAgID0gdGhpcy5uYW1lID09ICdmb3JlY29sb3InID8gJ2NvbG9yJyA6ICdiYWNrZ3JvdW5kLWNvbG9yJzsJCQkKCQkJJC5lYWNoKG5vZGVzLCBmdW5jdGlvbigpIHsKCQkJCWlmICgvXihUSEVBRHxUQk9EWXxURk9PVHxUUikkLy50ZXN0KHRoaXMubm9kZU5hbWUpKSB7CgkJCQkJJCh0aGlzKS5maW5kKCd0ZCx0aCcpLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkJCSQodGhpcykuY3NzKGNzcywgYykuZmluZCgnKicpLmNzcyhjc3MsICcnKTsKCQkJCQl9KQoJCQkJfSBlbHNlIHsKCQkJCQkkKHRoaXMpLmNzcyhjc3MsIGMpLmZpbmQoJyonKS5jc3MoY3NzLCAnJyk7CgkJCQl9CgkJCX0pOwoJCQl0aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSk7CgkJfQoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCQl2YXIgbiA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7CgkJdGhpcy5waWNrZXIudmFsKHRoaXMucnRlLnV0aWxzLnJnYjJoZXgoJChuLm5vZGVUeXBlICE9IDEgPyBuLnBhcmVudE5vZGUgOiBuKS5jc3ModGhpcy5uYW1lID09ICdmb3JlY29sb3InID8gJ2NvbG9yJyA6ICdiYWNrZ3JvdW5kLWNvbG9yJykpfHx0aGlzLmRlZmF1bHRDb2xvcikKCX0KfQoKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmhpbGl0ZWNvbG9yID0gZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmZvcmVjb2xvcjsKCn0pKGpRdWVyeSk7LyoqCiAqIEBjbGFzcyBkcm9wLWRvd24gbWVudSAtIGZvcm1hdHRpbmcgdGV4dCBibG9jawogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKiBAY29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuZm9ybWF0YmxvY2sgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCgl2YXIgY21kID0gdGhpcy5ydGUuYnJvd3Nlci5tc2llIAoJCT8gZnVuY3Rpb24odikgeyBzZWxmLnZhbCA9IHY7IHNlbGYuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbW1hbmQuY2FsbChzZWxmKTsgfQoJCTogZnVuY3Rpb24odikgeyBzZWxmLmllQ29tbWFuZCh2KTsgfSAKCXZhciBzZWxmID0gdGhpczsKCXZhciBvcHRzID0gewoJCWxhYmVsVHBsIDogJyVsYWJlbCcsCgkJdHBscyAgICAgOiB7JycgOiAnJWxhYmVsJ30sCgkJc2VsZWN0ICAgOiBmdW5jdGlvbih2KSB7IHNlbGYuZm9ybWF0QmxvY2sodik7IH0sCgkJc3JjICAgICAgOiB7CgkJCSdzcGFuJyAgICA6IHRoaXMucnRlLmkxOG4oJ0Zvcm1hdCcpLAoJCQknaDEnICAgICAgOiB0aGlzLnJ0ZS5pMThuKCdIZWFkaW5nIDEnKSwKCQkJJ2gyJyAgICAgIDogdGhpcy5ydGUuaTE4bignSGVhZGluZyAyJyksCgkJCSdoMycgICAgICA6IHRoaXMucnRlLmkxOG4oJ0hlYWRpbmcgMycpLAoJCQknaDQnICAgICAgOiB0aGlzLnJ0ZS5pMThuKCdIZWFkaW5nIDQnKSwKCQkJJ2g1JyAgICAgIDogdGhpcy5ydGUuaTE4bignSGVhZGluZyA1JyksCgkJCSdoNicgICAgICA6IHRoaXMucnRlLmkxOG4oJ0hlYWRpbmcgNicpLAoJCQkncCcgICAgICAgOiB0aGlzLnJ0ZS5pMThuKCdQYXJhZ3JhcGgnKSwKCQkJJ2FkZHJlc3MnIDogdGhpcy5ydGUuaTE4bignQWRkcmVzcycpLAoJCQkncHJlJyAgICAgOiB0aGlzLnJ0ZS5pMThuKCdQcmVmb3JtYXR0ZWQnKSwKCQkJJ2RpdicgICAgIDogdGhpcy5ydGUuaTE4bignTm9ybWFsIChESVYpJykKCQl9Cgl9CgoJdGhpcy5zZWxlY3QgPSB0aGlzLmRvbUVsZW0uZWxTZWxlY3Qob3B0cyk7CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoKCX0KCQoJdGhpcy5mb3JtYXRCbG9jayA9IGZ1bmN0aW9uKHYpIHsKCgkJZnVuY3Rpb24gZm9ybWF0KG4sIHRhZykgewoJCQkKCQkJZnVuY3Rpb24gcmVwbGFjZUNoaWxkcyhwKSB7CgkJCQkkKHApLmZpbmQoJ2gxLGgyLGgzLGg0LGg1LGg2LHAsYWRkcmVzcyxwcmUnKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJCSQodGhpcykucmVwbGFjZVdpdGgoJCh0aGlzKS5odG1sKCkpOwoJCQkJfSk7CgkJCQlyZXR1cm4gcDsKCQkJfQoJCQkKCQkJaWYgKC9eKExJfERUfEREfFREfFRIfENBUFRJT04pJC8udGVzdChuLm5vZGVOYW1lKSkgewoJCQkJIXNlbGYucnRlLmRvbS5pc0VtcHR5KG4pICYmIHNlbGYucnRlLmRvbS53cmFwQ29udGVudHMocmVwbGFjZUNoaWxkcyhuKSwgdGFnKTsKCQkJfSBlbHNlIGlmICgvXihVTHxPTHxETHxUQUJMRSkkLy50ZXN0KG4ubm9kZU5hbWUpKSB7CgkJCQlzZWxmLnJ0ZS5kb20ud3JhcChuLCB0YWcpOwoJCQl9IGVsc2UgewoJCQkJIXNlbGYucnRlLmRvbS5pc0VtcHR5KG4pICYmICQocmVwbGFjZUNoaWxkcyhuKSkucmVwbGFjZVdpdGgoICQoc2VsZi5ydGUuZG9tLmNyZWF0ZSh0YWcpKS5odG1sKCQobikuaHRtbCgpKSk7CgkJCX0KCQkJCgkJfQoJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgoJCXZhciB0YWcgPSB2LnRvVXBwZXJDYXNlKCksCgkJCWksIG4sICRuLAoJCQljID0gdGhpcy5ydGUuc2VsZWN0aW9uLmNvbGxhcHNlZCgpLAoJCQlibSA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXRCb29rbWFyaygpLAoJCQlub2RlcyA9IHRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7CgkJCQljb2xsYXBzZWQgOiB0cnVlLAoJCQkJYmxvY2tzICAgIDogdHJ1ZSwKCQkJCWZpbHRlciAgICA6ICd0ZXh0Q29udGFpbnNOb2RlcycsCgkJCQl3cmFwICAgICAgOiAnaW5saW5lJywKCQkJCXRhZyAgICAgICA6ICdzcGFuJwoJCQl9KQoJCQlsID0gbm9kZXMubGVuZ3RoLAoJCQlzID0gJChub2Rlc1swXSkucHJldigpLAoJCQllID0gJChub2Rlc1tub2Rlcy5sZW5ndGgtMV0pLm5leHQoKTsKCgkJd2hpbGUgKGwtLSkgewoJCQluID0gbm9kZXNbbF07CgkJCSRuID0gJChuKTsKCQkJaWYgKHRhZyA9PSAnRElWJyB8fCB0YWcgPT0gJ1NQQU4nKSB7CgkJCQlpZiAoL14oSFsxLTZdfFB8QUREUkVTU3xQUkUpJC8udGVzdChuLm5vZGVOYW1lKSkgewoJCQkJCSRuLnJlcGxhY2VXaXRoKCQodGhpcy5ydGUuZG9tLmNyZWF0ZSgnZGl2JykpLmh0bWwoJG4uaHRtbCgpfHwnJykpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJaWYgKC9eKFRIRUFEfFRCT0RZfFRGT09UfFRSKSQvLnRlc3Qobi5ub2RlTmFtZSkpIHsKCQkJCQkkbi5maW5kKCd0ZCx0aCcpLmVhY2goZnVuY3Rpb24oKSB7IGZvcm1hdCh0aGlzLCB0YWcpOyB9KTsKCQkJCX0gZWxzZSBpZiAobi5ub2RlTmFtZSAhPSB0YWcpIHsKCQkJCQlmb3JtYXQobiwgdGFnKTsKCQkJCX0KCQkJfQoJCX0KCgkJdGhpcy5ydGUuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGJtKTsKCgkJdGhpcy5ydGUudWkudXBkYXRlKHRydWUpOwoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCQl2YXIgbiA9IHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgL14oSFsxLTZdfFB8QUREUkVTU3xQUkUpJC8pOwoJCXRoaXMuc2VsZWN0LnZhbChuID8gbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIDogJ3NwYW4nKTsKCX0KfQp9KShqUXVlcnkpOwovKioKICogQGNsYXNzIGJ1dHRvbiAtIHN3aXRjaCB0byBmdWxsc2NyZWVuIG1vZGUgYW5kIGJhY2sKICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmZ1bGxzY3JlZW4gPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXZhciBzZWxmICAgICA9IHRoaXM7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7Cgl0aGlzLmFjdGl2ZSAgPSB0cnVlOwoJdGhpcy5lZGl0b3IgPSBydGUuZWRpdG9yOwoJdGhpcy53eiA9IHJ0ZS53b3Jrem9uZTsKCXRoaXMuaGVpZ2h0ICA9IDA7Cgl0aGlzLmRlbHRhID0gMDsKCXRoaXMuX2NsYXNzID0gJ2VsLWZ1bGxzY3JlZW4nOwoJCglzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCXNlbGYuaGVpZ2h0ICA9IHNlbGYud3ouaGVpZ2h0KCk7CgkJc2VsZi5kZWx0YSAgID0gc2VsZi5lZGl0b3Iub3V0ZXJIZWlnaHQoKS1zZWxmLmhlaWdodDsKCX0sIDUwKTsKCQoJCgkvKioKCSAqIFVwZGF0ZSBlZGl0b3IgaGVpZ2h0IG9uIHdpbmRvdyByZXNpemUgaW4gZnVsbHNjcmVlbiB2aWV3CgkgKgoJICoqLwoJZnVuY3Rpb24gcmVzaXplKCkgewoJCXNlbGYud3ouaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKS1zZWxmLmRlbHRhKTsKCQlzZWxmLnJ0ZS51cGRhdGVIZWlnaHQoKTsKCX0KCQoJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgkJdmFyIHcgPSAkKHdpbmRvdyksCgkJCWUgPSB0aGlzLmVkaXRvciwKCQkJcCA9IGUucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbihpLCBuKSB7IHJldHVybiAgIS9eKGh0bWx8Ym9keSkkL2kudGVzdChuLm5vZGVOYW1lKSAmJiAkKG4pLmNzcygncG9zaXRpb24nKSA9PSAncmVsYXRpdmUnOyB9KSwKCQkJd3ogPSB0aGlzLnd6LAoJCQljID0gdGhpcy5fY2xhc3MsCgkJCWYgPSBlLmhhc0NsYXNzKGMpLAoJCQlydGUgPSB0aGlzLnJ0ZSwKCQkJcyA9IHRoaXMucnRlLnNlbGVjdGlvbiwKCQkJbSA9ICQuYnJvd3Nlci5tb3ppbGxhLAoJCQliLCBoOwoKCQlmdW5jdGlvbiBzYXZlKCkgewoJCQlpZiAobSkgewoJCQkJYiA9IHMuZ2V0Qm9va21hcmsoKTsKCQkJfQoJCX0KCQkKCQlmdW5jdGlvbiByZXN0b3JlKCkgewoJCQlpZiAobSkgewoJCQkJc2VsZi53ei5jaGlsZHJlbigpLnRvZ2dsZSgpOwoJCQkJc2VsZi5ydGUuc291cmNlLmZvY3VzKCk7CgkJCQlzZWxmLnd6LmNoaWxkcmVuKCkudG9nZ2xlKCk7CgkJCQlzLm1vdmVUb0Jvb2ttYXJrKGIpOwoJCQl9CgkJfQoKCQlzYXZlKCk7CgkJcC5jc3MoJ3Bvc2l0aW9uJywgZiA/ICdyZWxhdGl2ZScgOiAnc3RhdGljJyk7CQoJCQoJCWlmIChmKSB7CgkJCWUucmVtb3ZlQ2xhc3MoYyk7CgkJCXd6LmhlaWdodCh0aGlzLmhlaWdodCk7CgkJCXcudW5iaW5kKCdyZXNpemUnLCByZXNpemUpOwoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoJCX0gZWxzZSB7CgkJCWUuYWRkQ2xhc3MoYykucmVtb3ZlQXR0cignc3R5bGUnKTsKCQkJd3ouaGVpZ2h0KHcuaGVpZ2h0KCkgLSB0aGlzLmRlbHRhKS5jc3MoJ3dpZHRoJywgJzEwMCUnKTsKCQkJdy5iaW5kKCdyZXNpemUnLCByZXNpemUpOwoJCQl0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoJ2FjdGl2ZScpOwoJCX0KCQlydGUudXBkYXRlSGVpZ2h0KCk7CQoJCXJ0ZS5yZXNpemFibGUoZik7CgkJcmVzdG9yZSgpOwoJCQoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCX0KfQp9KShqUXVlcnkpOwovKioKICogQGNsYXNzIGJ1dHRvbiAtIGhvcml6b250YWwgcnVsZSAob3BlbiBkaWFsb2cgd2luZG93KQogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKiBAY29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuaG9yaXpvbnRhbHJ1bGUgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCXZhciBzZWxmID0gdGhpczsKCXRoaXMuc3JjID0gewoJCXdpZHRoICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKHsnbmFtZScgOiAnd2lkdGgnLCAnc2l6ZScgOiA0fSkuY3NzKCd0ZXh0LWFsaWduJywgJ3JpZ2h0JyksCgkJd3VuaXQgICA6ICQoJzxzZWxlY3QgLz4nKS5hdHRyKCduYW1lJywgJ3d1bml0JykKCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJyUnKS50ZXh0KCclJykpCgkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdweCcpLnRleHQoJ3B4JykpCgkJCQkJLnZhbCgnJScpLAoJCWhlaWdodCAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKHsnbmFtZScgOiAnaGVpZ2h0JywgJ3NpemUnIDogNH0pLmNzcygndGV4dC1hbGlnbicsICdyaWdodCcpLAoJCWJnICAgICAgOiAkKCc8ZGl2IC8+JyksCgkJYm9yZGVyICA6ICQoJzxkaXYgLz4nKSwKCQknY2xhc3MnIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuY3NzKCd3aWR0aCcsICcxMDAlJyksCgkJc3R5bGUgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmNzcygnd2lkdGgnLCAnMTAwJScpCgl9CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuc3JjLmJnLmVsQ29sb3JQaWNrZXIoe3BhbGV0dGVQb3NpdGlvbiA6ICdvdXRlcicsICdjbGFzcycgOiAnZWwtY29sb3JwaWNrZXIgdWktaWNvbiB1aS1pY29uLXBlbmNpbCd9KTsKCQkKCQl2YXIgbiAgID0gdGhpcy5ydGUuc2VsZWN0aW9uLmdldEVuZCgpOwoJCXRoaXMuaHIgPSBuLm5vZGVOYW1lID09ICdIUicgPyAkKG4pIDogJChydGUuZG9jLmNyZWF0ZUVsZW1lbnQoJ2hyJykpLmNzcyh7d2lkdGggOiAnMTAwJScsIGhlaWdodCA6ICcxcHgnfSk7CgkJdGhpcy5zcmMuYm9yZGVyLmVsQm9yZGVyU2VsZWN0KHtzdHlsZUhlaWdodCA6IDczLCB2YWx1ZSA6IHRoaXMuaHJ9KTsKCQkKCQl2YXIgX3cgID0gdGhpcy5oci5jc3MoJ3dpZHRoJykgfHwgdGhpcy5oci5hdHRyKCd3aWR0aCcpOwoJCXRoaXMuc3JjLndpZHRoLnZhbChwYXJzZUludChfdykgfHwgMTAwKTsKCQl0aGlzLnNyYy53dW5pdC52YWwoX3cuaW5kZXhPZigncHgnKSAhPSAtMSA/ICdweCcgOiAnJScpOwoJCQoJCXRoaXMuc3JjLmhlaWdodC52YWwoIHRoaXMucnRlLnV0aWxzLnRvUGl4ZWxzKHRoaXMuaHIuY3NzKCdoZWlnaHQnKSB8fCB0aGlzLmhyLmF0dHIoJ2hlaWdodCcpKSB8fCAxKSA7CgkJCgkJdGhpcy5zcmMuYmcudmFsKHRoaXMucnRlLnV0aWxzLmNvbG9yMkhleCh0aGlzLmhyLmNzcygnYmFja2dyb3VuZC1jb2xvcicpKSk7CgkJdGhpcy5zcmNbJ2NsYXNzJ10udmFsKHRoaXMucnRlLmRvbS5hdHRyKHRoaXMuaHIsICdjbGFzcycpKTsKCQl0aGlzLnNyYy5zdHlsZS52YWwodGhpcy5ydGUuZG9tLmF0dHIodGhpcy5ociwgJ3N0eWxlJykpOwoJCQoJCXZhciBvcHRzID0gewoJCQlydGwgOiB0aGlzLnJ0ZS5ydGwsCgkJCXN1Ym1pdCA6IGZ1bmN0aW9uKGUsIGQpIHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzZWxmLnNldCgpOyBkLmNsb3NlKCk7IH0sCgkJCWRpYWxvZyA6IHsKCQkJCXRpdGxlIDogdGhpcy5ydGUuaTE4bignSG9yaXpvbnRhbCBydWxlJykKCQkJfQoJCX0KCgkJdmFyIGQgPSBuZXcgZWxEaWFsb2dGb3JtKG9wdHMpOwoJCWQuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdXaWR0aCcpLCAgICAgICAgICAkKCc8c3BhbiAvPicpLmFwcGVuZCh0aGlzLnNyYy53aWR0aCkuYXBwZW5kKHRoaXMuc3JjLnd1bml0KSBdLCBudWxsLCB0cnVlKQoJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdIZWlnaHQnKSwgICAgICAkKCc8c3BhbiAvPicpLmFwcGVuZCh0aGlzLnNyYy5oZWlnaHQpLmFwcGVuZCgnIHB4JyldLCBudWxsLCB0cnVlKQoJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdCb3JkZXInKSwgICAgICB0aGlzLnNyYy5ib3JkZXJdLCBudWxsLCB0cnVlKQoJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdCYWNrZ3JvdW5kJyksICB0aGlzLnNyYy5iZ10sIG51bGwsIHRydWUpCgkJCS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ0NzcyBjbGFzcycpLCAgIHRoaXMuc3JjWydjbGFzcyddXSwgbnVsbCwgdHJ1ZSkKCQkJLmFwcGVuZChbdGhpcy5ydGUuaTE4bignQ3NzIHN0eWxlJyksICAgdGhpcy5zcmMuc3R5bGVdLCBudWxsLCB0cnVlKQoJCQkub3BlbigpOwoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCQlpZiAodGhpcy5ydGUuc2VsZWN0aW9uLmdldEVuZCgpLm5vZGVOYW1lID09ICdIUicpIHsKCQkJdGhpcy5kb21FbGVtLmFkZENsYXNzKCdhY3RpdmUnKTsKCQl9IGVsc2UgewoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoJCX0KCX0KCQoJdGhpcy5zZXQgPSBmdW5jdGlvbigpIHsKCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoJCSF0aGlzLmhyLnBhcmVudE5vZGUgJiYgdGhpcy5ydGUuc2VsZWN0aW9uLmluc2VydE5vZGUodGhpcy5oci5nZXQoMCkpOwoJCXZhciBhdHRyID0gewoJCQlub3NoYWRlIDogdHJ1ZSwKCQkJc3R5bGUgICA6IHRoaXMuc3JjLnN0eWxlLnZhbCgpCgkJfQoJCXZhciBiID0gdGhpcy5zcmMuYm9yZGVyLnZhbCgpOwoJCXZhciBjc3MgPSB7CgkJCXdpZHRoICA6IChwYXJzZUludCh0aGlzLnNyYy53aWR0aC52YWwoKSkgfHwgMTAwKSt0aGlzLnNyYy53dW5pdC52YWwoKSwKCQkJaGVpZ2h0IDogcGFyc2VJbnQodGhpcy5zcmMuaGVpZ2h0LnZhbCgpKSB8fCAxLAoJCQknYmFja2dyb3VuZC1jb2xvcicgOiB0aGlzLnNyYy5iZy52YWwoKSwKCQkJYm9yZGVyIDogYi53aWR0aCAmJiBiLnN0eWxlID8gYi53aWR0aCsnICcrYi5zdHlsZSsnICcrYi5jb2xvciA6ICcnCgkJfQoKCQl0aGlzLmhyLnJlbW92ZUF0dHIoJ2NsYXNzJykKCQkJLnJlbW92ZUF0dHIoJ3N0eWxlJykKCQkJLnJlbW92ZUF0dHIoJ3dpZHRoJykKCQkJLnJlbW92ZUF0dHIoJ2hlaWdodCcpCgkJCS5yZW1vdmVBdHRyKCdhbGlnbicpCgkJCS5hdHRyKGF0dHIpCgkJCS5jc3MoY3NzKTsKCQkKCQlpZiAodGhpcy5zcmNbJ2NsYXNzJ10udmFsKCkpIHsKCQkJdGhpcy5oci5hdHRyKCdjbGFzcycsIHRoaXMuc3JjWydjbGFzcyddLnZhbCgpKTsJCgkJfQoJCXRoaXMucnRlLnVpLnVwZGF0ZSgpCgl9CgkKfQp9KShqUXVlcnkpOwovKioKICogQGNsYXNzIGJ1dHRvbiAtIGluc2VydC9lZGl0IGltYWdlIChvcGVuIGRpYWxvZyB3aW5kb3cpCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIENvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmltYWdlID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7Cgl2YXIgc2VsZiA9IHRoaXM7Cgl0aGlzLmltZyA9IG51bGwKCXRoaXMuaW5pdCA9IGZ1bmN0aW9uKCkgewoJCQoJCXRoaXMubGFiZWxzID0gewoJCQltYWluICAgOiAnUHJvcGVyaWVzJywKCQkJbGluayAgIDogJ0xpbmsnLAoJCQlhZHYgICAgOiAnQWR2YW5jZWQnLAoJCQlldmVudHMgOiAnRXZlbnRzJywKCQkJaWQgICAgICAgOiAnSUQnLAoJCQknY2xhc3MnICA6ICdDc3MgY2xhc3MnLAoJCQlzdHlsZSAgICA6ICdDc3Mgc3R5bGUnLAoJCQlsb25nZGVzYyA6ICdEZXRhaWwgZGVzY3JpcHRpb24gVVJMJywKCQkJaHJlZiAgICA6ICdVUkwnLAoJCQl0YXJnZXQgIDogJ09wZW4gaW4nLAoJCQl0aXRsZSAgIDogJ1RpdGxlJwoJCX0KCQkKCQl0aGlzLnNyYyA9IHsKCQkJbWFpbiA6IHsKCQkJCXNyYyAgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmNzcygnd2lkdGgnLCAnMTAwJScpLAoJCQkJdGl0bGUgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuY3NzKCd3aWR0aCcsICcxMDAlJyksCgkJCQlhbHQgICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoJ3dpZHRoJywgJzEwMCUnKSwKCQkJCXdpZHRoICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoJ3NpemUnLCA1KS5jc3MoJ3RleHQtYWxpZ24nLCAncmlnaHQnKSwKCQkJCWhlaWdodCA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoJ3NpemUnLCA1KS5jc3MoJ3RleHQtYWxpZ24nLCAncmlnaHQnKSwKCQkJCW1hcmdpbiA6ICQoJzxkaXYgLz4nKSwKCQkJCWFsaWduICA6ICQoJzxzZWxlY3QgLz4nKS5jc3MoJ3dpZHRoJywgJzEwMCUnKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCcnKS50ZXh0KHRoaXMucnRlLmkxOG4oJ05vdCBzZXQnLCAnZGlhbG9ncycpKSkKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgnbGVmdCcgICAgICAgKS50ZXh0KHRoaXMucnRlLmkxOG4oJ0xlZnQnKSkpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ3JpZ2h0JyAgICAgICkudGV4dCh0aGlzLnJ0ZS5pMThuKCdSaWdodCcpKSkKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgndG9wJyAgICAgICAgKS50ZXh0KHRoaXMucnRlLmkxOG4oJ1RvcCcpKSkKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgndGV4dC10b3AnICAgKS50ZXh0KHRoaXMucnRlLmkxOG4oJ1RleHQgdG9wJykpKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdtaWRkbGUnICAgICApLnRleHQodGhpcy5ydGUuaTE4bignbWlkZGxlJykpKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdiYXNlbGluZScgICApLnRleHQodGhpcy5ydGUuaTE4bignQmFzZWxpbmUnKSkpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ2JvdHRvbScgICAgICkudGV4dCh0aGlzLnJ0ZS5pMThuKCdCb3R0b20nKSkpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ3RleHQtYm90dG9tJykudGV4dCh0aGlzLnJ0ZS5pMThuKCdUZXh0IGJvdHRvbScpKSksCgkJCQlib3JkZXIgOiAkKCc8ZGl2IC8+JykKCQkJfSwKCgkJCWFkdiA6IHsKCQkJCWlkICAgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuY3NzKCd3aWR0aCcsICcxMDAlJyksCgkJCQknY2xhc3MnICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmNzcygnd2lkdGgnLCAnMTAwJScpLAoJCQkJc3R5bGUgICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoJ3dpZHRoJywgJzEwMCUnKSwKCQkJCWxvbmdkZXNjIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuY3NzKCd3aWR0aCcsICcxMDAlJykKCQkJfSwKCQkJZXZlbnRzIDoge30KCQl9CgkJCgkJJC5lYWNoKAoJCQlbJ29uYmx1cicsICdvbmZvY3VzJywgJ29uY2xpY2snLCAnb25kYmxjbGljaycsICdvbm1vdXNlZG93bicsICdvbm1vdXNldXAnLCAnb25tb3VzZW92ZXInLCAnb25tb3VzZW91dCcsICdvbm1vdXNlbGVhdmUnLCAnb25rZXlkb3duJywgJ29ua2V5cHJlc3MnLCAnb25rZXl1cCddLCAKCQkJZnVuY3Rpb24oKSB7CgkJCQlzZWxmLnNyYy5ldmVudHNbdGhpc10gPSAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoJ3dpZHRoJywgJzEwMCUnKTsKCQl9KTsKCQkKCQkkLmVhY2goc2VsZi5zcmMsIGZ1bmN0aW9uKCkgewoJCQlmb3IgKHZhciBuIGluIHRoaXMpIHsKCQkJCXRoaXNbbl0uYXR0cignbmFtZScsIG4pOwoJCQl9CgkJfSk7CgkJCgl9CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCSF0aGlzLnNyYyAmJiB0aGlzLmluaXQoKTsKCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTsKCQl0aGlzLnNyYy5tYWluLmJvcmRlci5lbEJvcmRlclNlbGVjdCh7IGNoYW5nZSA6IGZ1bmN0aW9uKCkgeyBzZWxmLnVwZGF0ZUltZygpOyB9LCBuYW1lIDogJ2JvcmRlcicgfSk7CgkJdGhpcy5zcmMubWFpbi5tYXJnaW4uZWxQYWRkaW5nSW5wdXQoeyB0eXBlIDogJ21hcmdpbicgfSk7CgoJCXRoaXMuY2xlYW5WYWx1ZXMoKTsKCQl0aGlzLnNyYy5tYWluLnNyYy52YWwoJycpOwoJCQoJCXZhciBuID0gdGhpcy5ydGUuc2VsZWN0aW9uLmdldEVuZCgpLAoJCQkkbiA9ICQobik7CgkJdGhpcy5wcmV2aWV3ID0gbnVsbDsKCQl0aGlzLnByZXZJbWcgPSBudWxsOwoJCXRoaXMubGluayAgICA9IG51bGw7CgkJaWYgKG4ubm9kZU5hbWUgPT0gJ0lNRycgJiYgISRuLmhhc0NsYXNzKCdlbHJ0ZS1wcm90ZWN0ZWQnKSkgewoJCQl0aGlzLmltZyAgICAgPSAkKG4pOwoJCX0gZWxzZSB7CgkJCXRoaXMuaW1nID0gJCh0aGlzLnJ0ZS5kb2MuY3JlYXRlRWxlbWVudCgnaW1nJykpOwoJCQkKCQl9CgkJCgkJdmFyIG9wdHMgPSB7CgkJCXJ0bCA6IHRoaXMucnRlLnJ0bCwKCQkJc3VibWl0IDogZnVuY3Rpb24oZSwgZCkgeyBlLnN0b3BQcm9wYWdhdGlvbigpOyBlLnByZXZlbnREZWZhdWx0KCk7IHNlbGYuc2V0KCk7IGQuY2xvc2UoKTsgfSwKCQkJZGlhbG9nIDogewoJCQkJd2lkdGggICAgOiA1NzAsCgkJCQlwb3NpdGlvbiA6ICd0b3AnLAoJCQkJdGl0bGUgICAgOiB0aGlzLnJ0ZS5pMThuKCdJbWFnZScpCgkJCX0KCQl9CgkJdmFyIGQgPSBuZXcgZWxEaWFsb2dGb3JtKG9wdHMpOwoJCQoJCWlmICh0aGlzLnJ0ZS5vcHRpb25zLmZtQWxsb3cgJiYgdGhpcy5ydGUub3B0aW9ucy5mbU9wZW4pIHsKCQkJdmFyIHNyYyA9ICQoJzxzcGFuIC8+JykuYXBwZW5kKHRoaXMuc3JjLm1haW4uc3JjLmNzcygnd2lkdGgnLCAnODglJykpCgkJCQkJLmFwcGVuZCgKCQkJCQkJJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygndWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsJykKCQkJCQkJCS5jc3MoeydmbG9hdCcgOiAncmlnaHQnLCAnbWFyZ2luLXJpZ2h0JyA6ICczcHgnfSkKCQkJCQkJCS5hdHRyKCd0aXRsZScsIHNlbGYucnRlLmkxOG4oJ09wZW4gZmlsZSBtYW5nZXInKSkKCQkJCQkJCS5hcHBlbmQoJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygndWktaWNvbiB1aS1pY29uLWZvbGRlci1vcGVuJykpCgkJCQkJCQkJLmNsaWNrKCBmdW5jdGlvbigpIHsKCQkJCQkJCQkJc2VsZi5ydGUub3B0aW9ucy5mbU9wZW4oIGZ1bmN0aW9uKHVybCkgeyBzZWxmLnNyYy5tYWluLnNyYy52YWwodXJsKS5jaGFuZ2UoKSB9ICk7CgkJCQkJCQkJfSkKCQkJCQkJCQkuaG92ZXIoZnVuY3Rpb24oKSB7JCh0aGlzKS5hZGRDbGFzcygndWktc3RhdGUtaG92ZXInKX0sIGZ1bmN0aW9uKCkgeyAkKHRoaXMpLnJlbW92ZUNsYXNzKCd1aS1zdGF0ZS1ob3ZlcicpfSkKCQkJCQkJKTsKCQl9IGVsc2UgewoJCQl2YXIgc3JjID0gdGhpcy5zcmMubWFpbi5zcmM7CgkJfQoJCQoJCWQudGFiKCdtYWluJywgdGhpcy5ydGUuaTE4bignUHJvcGVyaWVzJykpCgkJCS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ0ltYWdlIFVSTCcpLCBzcmNdLCAgICAgICAgICAgICAgICAgJ21haW4nLCB0cnVlKQoJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdUaXRsZScpLCAgICAgdGhpcy5zcmMubWFpbi50aXRsZV0sICdtYWluJywgdHJ1ZSkKCQkJLmFwcGVuZChbdGhpcy5ydGUuaTE4bignQWx0IHRleHQnKSwgIHRoaXMuc3JjLm1haW4uYWx0XSwgICAnbWFpbicsIHRydWUpCgkJCS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ1NpemUnKSwgJCgnPHNwYW4gLz4nKS5hcHBlbmQodGhpcy5zcmMubWFpbi53aWR0aCkuYXBwZW5kKCcgeCAnKS5hcHBlbmQodGhpcy5zcmMubWFpbi5oZWlnaHQpLmFwcGVuZCgnIHB4JyldLCAnbWFpbicsIHRydWUpCgkJCS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ0FsaWdubWVudCcpLCB0aGlzLnNyYy5tYWluLmFsaWduXSwgICdtYWluJywgdHJ1ZSkKCQkJLmFwcGVuZChbdGhpcy5ydGUuaTE4bignTWFyZ2lucycpLCAgIHRoaXMuc3JjLm1haW4ubWFyZ2luXSwgJ21haW4nLCB0cnVlKQoJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdCb3JkZXInKSwgICAgdGhpcy5zcmMubWFpbi5ib3JkZXJdLCAnbWFpbicsIHRydWUpCgoJCWZvciAodmFyIHRhYiBpbiB0aGlzLnNyYykgewoJCQlpZiAodGFiICE9ICdtYWluJykgewoJCQkJZC50YWIodGFiLCB0aGlzLnJ0ZS5pMThuKHRoaXMubGFiZWxzW3RhYl0pKTsKCQkJCWZvciAodmFyIG5hbWUgaW4gdGhpcy5zcmNbdGFiXSkgewoJCQkJCXZhciBsID0gdGhpcy5ydGUuaTE4bih0aGlzLmxhYmVsc1tuYW1lXSA/IHRoaXMubGFiZWxzW25hbWVdIDogbmFtZSk7CgkJCQkJaWYgKHRhYiA9PSAnZXZlbnRzJykgewoJCQkJCQl0aGlzLnNyY1t0YWJdW25hbWVdLnZhbCh0aGlzLnJ0ZS51dGlscy50cmltRXZlbnRDYWxsYmFjayh0aGlzLmltZy5hdHRyKG5hbWUpKSk7CgkJCQkJfSBlbHNlIGlmICh0YWIgPT0gJ2xpbmsnKSB7CgkJCQkJCWlmICh0aGlzLmxpbmspIHsKCQkJCQkJCXRoaXMuc3JjW3RhYl1bbmFtZV0udmFsKG5hbWUgPT0gJ2hyZWYnID8gdGhpcy5ydGUudXRpbHMuYWJzb2x1dGVVUkwodGhpcy5saW5rLmF0dHIobmFtZSkpIDogdGhpcy5saW5rLmF0dHIobmFtZSkpOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJdGhpcy5zcmNbdGFiXVtuYW1lXS52YWwodGhpcy5pbWcuYXR0cihuYW1lKXx8JycpOwoJCQkJCX0KCQkJCQlkLmFwcGVuZChbbCwgdGhpcy5zcmNbdGFiXVtuYW1lXV0sIHRhYiwgdHJ1ZSk7CgkJCQl9CgkJCX0KCQl9OwoJCQkJCgkJZC5vcGVuKCk7CgkJCgkJdmFyIGZzID0gJCgnPGZpZWxkc2V0IC8+JykuYXBwZW5kKCQoJzxsZWdlbmQgLz4nKS50ZXh0KHRoaXMucnRlLmkxOG4oJ1ByZXZpZXcnKSkpCgkJZC5hcHBlbmQoZnMsICdtYWluJyk7CgkJdmFyIGZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7CgkJJChmcmFtZSkuYXR0cignc3JjJywgJyMnKS5hZGRDbGFzcygnZWwtcnRlLXByZXZpZXcnKS5hcHBlbmRUbyhmcyk7CgoJCWh0bWwgPSB0aGlzLnJ0ZS5vcHRpb25zLmRvY3R5cGUrJzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz48L2hlYWQ+PGJvZHkgc3R5bGU9InBhZGRpbmc6MDttYXJnaW46MDtmb250LXNpemU6OXB4Ij4gPC9ib2R5PjwvaHRtbD4nOwoJCWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQub3BlbigpOwoJCWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoaHRtbCk7CgkJZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC5jbG9zZSgpOwoJCXRoaXMuZnJhbWUgPSBmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50CgkJdGhpcy5wcmV2aWV3ID0gJChmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHkpCgkJIAkJCQkgLnRleHQoJ1Byb2luIGVsaXQgYXJjdSwgcnV0cnVtIGNvbW1vZG8sIHZlaGljdWxhIHRlbXB1cywgY29tbW9kbyBhLCByaXN1cy4gQ3VyYWJpdHVyIG5lYyBhcmN1LiBEb25lYyBzb2xsaWNpdHVkaW4gbWkgc2l0IGFtZXQgbWF1cmlzLiBOYW0gZWxlbWVudHVtIHF1YW0gdWxsYW1jb3JwZXIgYW50ZS4gRXRpYW0gYWxpcXVldCBtYXNzYSBldCBsb3JlbS4gTWF1cmlzIGRhcGlidXMgbGFjdXMgYXVjdG9yIHJpc3VzLiBBZW5lYW4gdGVtcG9yIHVsbGFtY29ycGVyIGxlby4gVml2YW11cyBzZWQgbWFnbmEgcXVpcyBsaWd1bGEgZWxlaWZlbmQgYWRpcGlzY2luZy4gRHVpcyBvcmNpLiBBbGlxdWFtIHNvZGFsZXMgdG9ydG9yIHZpdGFlIGlwc3VtLiBBbGlxdWFtIG51bGxhLiBEdWlzIGFsaXF1YW0gbW9sZXN0aWUgZXJhdC4gVXQgZXQgbWF1cmlzIHZlbCBwZWRlIHZhcml1cyBzb2xsaWNpdHVkaW4nKTsKCQkKCQlpZiAodGhpcy5pbWcuYXR0cignc3JjJykpIHsKCQkJCgkJCXRoaXMucHJldkltZyA9ICQodGhpcy5mcmFtZS5jcmVhdGVFbGVtZW50KCdpbWcnKSkKCQkJCS5hdHRyKCdzcmMnLCAgdGhpcy5ydGUudXRpbHMuYWJzb2x1dGVVUkwodGhpcy5pbWcuYXR0cignc3JjJykpKQoJCQkJCgkJCXRoaXMucHJldkltZy5hdHRyKCd3aWR0aCcsIHRoaXMuaW1nLmF0dHIoJ3dpZHRoJykpCgkJCQkuYXR0cignaGVpZ2h0JywgdGhpcy5pbWcuYXR0cignaGVpZ2h0JykpCgkJCQkuYXR0cigndGl0bGUnLCB0aGlzLmltZy5hdHRyKCd0aXRsZScpfHwnJykKCQkJCS5hdHRyKCdhbHQnLCB0aGlzLmltZy5hdHRyKCdhbHQnKXx8JycpCgkJCQkuYXR0cignc3R5bGUnLCB0aGlzLmltZy5hdHRyKCdzdHlsZScpfHwnJykKCQkJZm9yICh2YXIgbiBpbiB0aGlzLnNyYy5hZHYpIHsKCQkJCXZhciBhID0gdGhpcy5pbWcuYXR0cihuKTsKCQkJCWlmIChhKSB7CgkJCQkJdGhpcy5wcmV2SW1nLmF0dHIobiwgYSkKCQkJCX0KCQkJfQkKCQkJCQoJCQl0aGlzLnByZXZpZXcucHJlcGVuZCh0aGlzLnByZXZJbWcpOwoJCQl0aGlzLnVwZGF0ZVZhbHVlcygpOwoJCX0KCQkKCQkkLmVhY2godGhpcy5zcmMsIGZ1bmN0aW9uKCkgewoJCQkkLmVhY2godGhpcywgZnVuY3Rpb24oKSB7CgkJCQlpZiAodGhpcyA9PT0gc2VsZi5zcmMubWFpbi5zcmMpIHsKCQkJCQl0aGlzLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uKCkgeyBzZWxmLnVwZGF0ZVByZXZpZXcoKTsgfSk7CgkJCQl9IGVsc2UgaWYgKHRoaXMgPT0gc2VsZi5zcmMubWFpbi53aWR0aCB8fCB0aGlzID09IHNlbGYuc3JjLm1haW4uaGVpZ2h0KSB7CgkJCQkJdGhpcy5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbihlKSB7c2VsZi51cGRhdGVEaW1lc2lvbnMoZSk7fSk7CgkJCQl9IGVsc2UgewoJCQkJCXRoaXMuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24oKSB7IHNlbGYudXBkYXRlSW1nKCk7IH0pOwoJCQkJfQoJCQl9KTsKCQl9KTsKCQkKCQkvLyB0aGlzLnNyYy5saW5rLmhyZWYuY2hhbmdlKGZ1bmN0aW9uKCkgewoJCS8vIAl2YXIgJHRoaXMgPSAkKHRoaXMpOwoJCS8vIAkkdGhpcy52YWwoc2VsZi5ydGUudXRpbHMuYWJzb2x1dGVVUkwoJHRoaXMudmFsKCkpKTsKCQkvLyB9KTsKCQkKCX0KCQoKCQoJLyoqCgkgKiDQo9GB0YLQsNC90LDQstC70LjQstCw0LXRgiDQt9C90LDRh9C10L3QuNGPINC/0L7Qu9C10Lkg0YTQvtGA0LzRiyDQuNC3INCw0YLRgtGA0LjQsdGD0YLQvtCyIHByZXZJbWcKCSAqINCS0YvQt9GL0LLQsNC10YLRgdGPINC/0L7RgdC70LUg0LfQsNCz0YDRg9C30LrQuCBwcmV2SW1nCgkgKgoJICoqLwoJdGhpcy51cGRhdGVWYWx1ZXMgPSBmdW5jdGlvbigpIHsKCQkKCQl2YXIgaSA9IHRoaXMucHJldkltZy5nZXQoMCk7CgkJCgkJdGhpcy5vcmlnVyA9IHRoaXMucHJldkltZy5hdHRyKCd3aWR0aCcpOyAKCQl0aGlzLm9yaWdIID0gdGhpcy5wcmV2SW1nLmF0dHIoJ2hlaWdodCcpOwoJCQoJCXRoaXMuc3JjLm1haW4uc3JjLnZhbCh0aGlzLnJ0ZS5kb20uYXR0cihpLCAnc3JjJykpOwoJCXRoaXMuc3JjLm1haW4udGl0bGUudmFsKHRoaXMucnRlLmRvbS5hdHRyKGksICd0aXRsZScpKTsJCQoJCXRoaXMuc3JjLm1haW4uYWx0LnZhbCh0aGlzLnJ0ZS5kb20uYXR0cihpLCAnYWx0JykpOwoJCXRoaXMuc3JjLm1haW4ud2lkdGgudmFsKHRoaXMub3JpZ1cpOwoJCXRoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbCh0aGlzLm9yaWdIKTsKCQl0aGlzLnNyYy5hZHZbJ2NsYXNzJ10udmFsKHRoaXMucnRlLmRvbS5hdHRyKGksICdjbGFzcycpKTsKCQl0aGlzLnNyYy5tYWluLm1hcmdpbi52YWwodGhpcy5wcmV2SW1nKQoJCXZhciBmID0gdGhpcy5wcmV2SW1nLmNzcygnZmxvYXQnKTsKCQl0aGlzLnNyYy5tYWluLmFsaWduLnZhbChmID09ICdsZWZ0JyB8fCBmID09ICdyaWdodCcgPyBmIDogKHRoaXMucHJldkltZy5jc3MoJ3ZlcnRpY2FsLWFsaWduJyl8fCcnKSk7CgkJdGhpcy5zcmMubWFpbi5ib3JkZXIudmFsKHRoaXMucHJldkltZykKCQl0aGlzLnNyYy5hZHYuc3R5bGUudmFsKHRoaXMucnRlLmRvbS5hdHRyKGksICdzdHlsZScpKTsKCX0KCQoJLyoqCgkgKiDQntGH0LjRidCw0LXRgiDQv9C+0LvRjyDRhNC+0YDQvNGLCgkgKgoJICoqLwoJdGhpcy5jbGVhblZhbHVlcyA9IGZ1bmN0aW9uKCkgewoJCSQuZWFjaCh0aGlzLnNyYywgZnVuY3Rpb24oKSB7CgkJCSQuZWFjaCh0aGlzLCBmdW5jdGlvbigpIHsKCQkJCXZhciAkdGhpcyA9ICQodGhpcyk7CgkJCQlpZiAoJHRoaXMuYXR0cignbmFtZScpICE9ICdzcmMnKSB7CgkJCQkJJHRoaXMudmFsKCcnKTsKCQkJCX0KCQkJfSk7CgkJfSk7Cgl9CgkKCS8qKgoJICog0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIg0LDRgtGC0YDQuNCx0YPRgtGLIHByZXZJbWcg0LjQtyDQv9C+0LvQtdC5INGE0L7RgNC80YsKCSAqCgkgKiovCgl0aGlzLnVwZGF0ZUltZyA9IGZ1bmN0aW9uKCkgewoJCXRoaXMucHJldkltZy5hdHRyKHsKCQkJCXN0eWxlICA6ICQudHJpbSh0aGlzLnNyYy5hZHYuc3R5bGUudmFsKCkpLAoJCQkJdGl0bGUgIDogJC50cmltKHRoaXMuc3JjLm1haW4udGl0bGUudmFsKCkpLAoJCQkJYWx0ICAgIDogJC50cmltKHRoaXMuc3JjLm1haW4uYWx0LnZhbCgpKSwKCQkJCXdpZHRoICA6IHBhcnNlSW50KHRoaXMuc3JjLm1haW4ud2lkdGgudmFsKCkpLAoJCQkJaGVpZ2h0IDogcGFyc2VJbnQodGhpcy5zcmMubWFpbi5oZWlnaHQudmFsKCkpCgkJCX0pOwoKCQl2YXIgYSA9IHRoaXMuc3JjLm1haW4uYWxpZ24udmFsKCk7CgkJdmFyIGYgPSBhID09ICdsZWZ0JyB8fCBhID09ICdyaWdodCcgPyBhIDogJyc7CgkJCgkJdmFyIGIgPSB0aGlzLnNyYy5tYWluLmJvcmRlci52YWwoKTsgCgkJdmFyIG0gPSB0aGlzLnNyYy5tYWluLm1hcmdpbi52YWwoKTsKCQl0aGlzLnByZXZJbWcuY3NzKCdmbG9hdCcsIGYpOwoJCXRoaXMucHJldkltZy5jc3MoJ3ZlcnRpY2FsLWFsaWduJywgZiA/ICcnIDogYSk7CgkJdGhpcy5wcmV2SW1nLmNzcygnYm9yZGVyJywgJC50cmltKGIud2lkdGgrJyAnK2Iuc3R5bGUrJyAnK2IuY29sb3IpKTsKCQlpZiAobS5jc3MpIHsKCQkJdGhpcy5wcmV2SW1nLmNzcygnbWFyZ2luJywgbS5jc3MpOwoJCX0gZWxzZSB7CgkJCXRoaXMucHJldkltZy5jc3MoJ21hcmdpbi10b3AnLCBtLnRvcCk7CgkJCXRoaXMucHJldkltZy5jc3MoJ21hcmdpbi1yaWdodCcsIG0ucmlnaHQpOwoJCQl0aGlzLnByZXZJbWcuY3NzKCdtYXJnaW4tYm90dG9tJywgbS5ib3R0b20pOwoJCQl0aGlzLnByZXZJbWcuY3NzKCdtYXJnaW4tbGVmdCcsIG0ubGVmdCk7CQkJCQkJCgkJfQoKCQkkLmVhY2goW3RoaXMuc3JjLmV2ZW50cywgdGhpcy5zcmMuYWR2XSwgZnVuY3Rpb24oKSB7CgkJCSQuZWFjaCh0aGlzLCBmdW5jdGlvbigpIHsKCQkJCXZhciAkdGhpcyA9ICQodGhpcyk7CgkJCQl2YXIgbiA9ICR0aGlzLmF0dHIoJ25hbWUnKTsKCQkJCWlmIChuICE9ICdzdHlsZScpIHsKCQkJCQl2YXIgdiA9ICQudHJpbSgkdGhpcy52YWwoKSk7CgkJCQkJaWYgKHYpIHsKCQkJCQkJc2VsZi5wcmV2SW1nLmF0dHIobiwgdik7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZi5wcmV2SW1nLnJlbW92ZUF0dHIobik7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQl9KTsKCQkKCX0KCQoJLyoqCgkgKiDQntCx0L3QvtCy0LvRj9C10YIg0YTQvtGA0LzRgyDQstGL0LHQvtGA0LAg0LjQt9C+0LHRgNCw0LbQtdC90LjRjwoJICoKCSAqKi8KCXRoaXMudXBkYXRlUHJldmlldyA9IGZ1bmN0aW9uKCkgewoJCQoJCXZhciBpbWdzcmMgPSB0aGlzLnByZXZJbWcgPyB0aGlzLnByZXZJbWcuYXR0cignc3JjJykgOiAnJzsKCQl2YXIgc3JjICAgID0gJC50cmltKHRoaXMuc3JjLm1haW4uc3JjLnZhbCgpKTsKCQlpZiAoIXNyYyB8fCBzcmMgIT1pbWdzcmMpIHsgLy8gbmV3IGltYWdlIG9yIGVtcHR5IHNyYwoJCQlpZiAodGhpcy5wcmV2SW1nKSB7CgkJCQl0aGlzLnByZXZJbWcucmVtb3ZlKCk7CgkJCQl0aGlzLnByZXZJbWcgPSBudWxsOwoJCQl9CgkJCXRoaXMuY2xlYW5WYWx1ZXMoKTsKCQkJaWYgKHNyYykgeyAgLy8gbmV3IGltYWdlCgkJCQkKCQkJCXRoaXMucHJldkltZyA9ICQodGhpcy5mcmFtZS5jcmVhdGVFbGVtZW50KCdpbWcnKSkKCQkJCQkuYXR0cignc3JjJywgIHRoaXMucnRlLnV0aWxzLmFic29sdXRlVVJMKHNyYykpCgkJCQkJLmJpbmQoJ2xvYWQnLCBmdW5jdGlvbigpIHsKCQkJCQkJc2VsZi51cGRhdGVWYWx1ZXMoKTsKCQkJCQl9KQoJCQkJdGhpcy5wcmV2aWV3LnByZXBlbmQodGhpcy5wcmV2SW1nKTsKCQkJCXNlbGYudXBkYXRlVmFsdWVzKCk7CgkJCX0KCQl9IGVsc2UgeyAvLyB1cGRhdGUgZXhpc3RzZWQgaW1hZ2UKCQkJdGhpcy51cGRhdGVJbWcoKTsKCQl9Cgl9CgkKCXRoaXMudXBkYXRlRGltZXNpb25zID0gZnVuY3Rpb24oZSkgewoJCQoJCXZhciB3ID0gcGFyc2VJbnQodGhpcy5zcmMubWFpbi53aWR0aC52YWwoKSkgIHx8IDA7CgkJdmFyIGggPSBwYXJzZUludCh0aGlzLnNyYy5tYWluLmhlaWdodC52YWwoKSkgfHwgMDsKCQlpZiAodyA+IDAgJiYgaCA+IDApIHsKCQkJaWYgKGUuY3VycmVudFRhcmdldCA9PSB0aGlzLnNyYy5tYWluLndpZHRoLmdldCgwKSkgewoJCQkJCgkJCQl0aGlzLnNyYy5tYWluLmhlaWdodC52YWwocGFyc2VJbnQodyp0aGlzLm9yaWdIL3RoaXMub3JpZ1cpKTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuc3JjLm1haW4ud2lkdGgudmFsKHBhcnNlSW50KGgqdGhpcy5vcmlnVy90aGlzLm9yaWdIKSk7CgkJCX0JCgkJfSBlbHNlIHsKCQkJdGhpcy5zcmMubWFpbi53aWR0aC52YWwodGhpcy5vcmlnVyk7CgkJCXRoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbCh0aGlzLm9yaWdIKTsJCQkKCQl9CgoJCXRoaXMudXBkYXRlSW1nKCk7CgoJfQoJCgl0aGlzLnNldCA9IGZ1bmN0aW9uKCkgewoJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJdGhpcy5ydGUuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7CgkJaWYgKCF0aGlzLnByZXZJbWcgfHwgIXRoaXMucHJldkltZy5hdHRyKCd3aWR0aCcpKSB7CgkJCXRoaXMuaW1nICAmJiB0aGlzLmltZy5yZW1vdmUoKTsKCQkJdGhpcy5saW5rICYmIHRoaXMucnRlLmRvYy5leGVjQ29tbWFuZCgndW5saW5rJywgZmFsc2UsIG51bGwpOwoJCX0gZWxzZSB7CgkJCWlmICghdGhpcy5pbWdbMF0ucGFyZW50Tm9kZSkgewoJCQkJdGhpcy5pbWcgPSAkKHRoaXMucnRlLmRvYy5jcmVhdGVFbGVtZW50KCdpbWcnKSk7CgkJCX0gCgkJCQoJCQl0aGlzLmltZy5hdHRyKHsKCQkJCQlzcmMgICAgOiB0aGlzLnJ0ZS51dGlscy5hYnNvbHV0ZVVSTCgkLnRyaW0odGhpcy5zcmMubWFpbi5zcmMudmFsKCkpKSwKCQkJCQlzdHlsZSAgOiAkLnRyaW0odGhpcy5ydGUuZG9tLmF0dHIodGhpcy5wcmV2SW1nLmdldCgwKSwgJ3N0eWxlJykpLAoJCQkJCXRpdGxlICA6ICQudHJpbSh0aGlzLnNyYy5tYWluLnRpdGxlLnZhbCgpKSwKCQkJCQlhbHQgICAgOiAkLnRyaW0odGhpcy5zcmMubWFpbi5hbHQudmFsKCkpLAoJCQkJCXdpZHRoICA6IHBhcnNlSW50KHRoaXMuc3JjLm1haW4ud2lkdGgudmFsKCkpLAoJCQkJCWhlaWdodCA6IHBhcnNlSW50KHRoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbCgpKQoJCQkJfSk7CgkJCQkKCQkJZm9yICh2YXIgX24gaW4gdGhpcy5zcmMuYWR2KSB7CgkJCQlpZiAoX24gIT0gJ3N0eWxlJykgewoJCQkJCXZhciB2YWwgPSB0aGlzLnNyYy5hZHZbX25dLnZhbCgpOwoJCQkJCWlmICh2YWwpIHsKCQkJCQkJdGhpcy5pbWcuYXR0cihfbiwgdmFsKTsKCQkJCQl9IGVsc2UgewoJCQkJCQl0aGlzLmltZy5yZW1vdmVBdHRyKF9uKQoJCQkJCX0KCQkJCQkKCQkJCX0KCQkJfQoJCQlmb3IgKHZhciBfbiBpbiB0aGlzLnNyYy5ldmVudHMpIHsKCQkJCXZhciB2YWwgPSB0aGlzLnNyYy5ldmVudHNbX25dLnZhbCgpOwoJCQkJaWYgKHZhbCkgewoJCQkJCXRoaXMuaW1nLmF0dHIoX24sIHZhbCk7CgkJCQl9IGVsc2UgewoJCQkJCXRoaXMuaW1nLnJlbW92ZUF0dHIoX24pCgkJCQl9CgkJCX0KCQkJCQoJCQlpZiAoIXRoaXMuaW1nWzBdLnBhcmVudE5vZGUpIHsKCQkJCXRoaXMucnRlLnNlbGVjdGlvbi5pbnNlcnROb2RlKHRoaXMuaW1nLmdldCgwKSkKCQkJfQoJCX0KCQl0aGlzLnJ0ZS51aS51cGRhdGUoKTsKCX0KCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCQl2YXIgbiA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXRFbmQoKSwKCQkJJG4gPSAkKG4pOwoJCWlmIChuLm5vZGVOYW1lID09ICdJTUcnICYmICEkbi5oYXNDbGFzcygnZWxydGUtcHJvdGVjdGVkJykpIHsKCQkJdGhpcy5kb21FbGVtLmFkZENsYXNzKCdhY3RpdmUnKTsKCQl9IGVsc2UgewoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoJCX0KCX0KCQp9Cn0pKGpRdWVyeSk7Ci8qKgogKiBAY2xhc3Mg0KPQstC10LvQuNGH0LXQvdC40LUg0L7RgtGB0YLRg9C/0LAKICog0YHQv9C40YHQutC4IC0g0LXRgdC70Lgg0LLRi9C00LXQu9C10L0g0L7QtNC40L0g0Y3Qu9C10LzQtdC90YIgLSDRg9Cy0LXQu9C40YfQuNCy0LDQtdGC0YHRjyDQstC70L7QttC10L3QvdC+0YHRgtGMINGB0L/QuNGB0LrQsCwg0LIg0L7RgdGC0LDQu9GM0L3Ri9GFINGB0LvRg9GH0LDRj9GFIC0gcGFkZGluZyDRgyDRgNC+0LTQuNGC0LXQu9GM0YHQutC+0LPQviB1bHxvbAogKiDQldGB0LvQuCDRgtCw0LHQu9C40YbQsCDQstGL0LTQtdC70LXQvdCwINC/0L7Qu9C90L7RgdGC0YzRjiAtINC10Lkg0LTQvtCx0LDQstC70Y/QtdGC0YHRjyBtYXJnaW4sINC10YHQu9C4INGH0LDRgdGC0LjRh9C90L4gLSDRg9Cy0LXQu9C40YfQuNCy0LDQtdGC0YHRjyBwYWRkaW5nINC00LvRjyDRj9GH0LXQtdC6CiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5pbmRlbnQgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCXZhciBzZWxmID0gdGhpczsKCQoJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5ydGUuaGlzdG9yeS5hZGQoKTsKCQl2YXIgbm9kZXMgPSB0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoe2NvbGxhcHNlZCA6IHRydWUsIGJsb2NrcyA6IHRydWUsIHdyYXAgOiAnaW5saW5lJywgdGFnIDogJ3AnfSk7CgoJCWZ1bmN0aW9uIGluZGVudChuKSB7CgkJCXZhciBjc3MgPSAvKElNR3xIUnxUQUJMRXxFTUJFRHxPQkpFQ1QpLy50ZXN0KG4ubm9kZU5hbWUpID8gJ21hcmdpbi1sZWZ0JyA6ICdwYWRkaW5nLWxlZnQnOwoJCQl2YXIgdmFsID0gc2VsZi5ydGUuZG9tLmF0dHIobiwgJ3N0eWxlJykuaW5kZXhPZihjc3MpICE9IC0xID8gcGFyc2VJbnQoJChuKS5jc3MoY3NzKSl8fDAgOiAwOwoJCQkkKG4pLmNzcyhjc3MsIHZhbCs0MCsncHgnKTsKCQl9CgkJCgkJZm9yICh2YXIgaT0wOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKCQkJaWYgKC9eKFRBQkxFfFRIRUFEfFRGT09UfFRCT0RZfENPTHxDT0xHUk9VUHxUUikkLy50ZXN0KG5vZGVzW2ldLm5vZGVOYW1lKSkgewoJCQkJJChub2Rlc1tpXSkuZmluZCgndGQsdGgnKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJCWluZGVudCh0aGlzKTsKCQkJCX0pOwoJCQl9IGVsc2UgaWYgKC9eTEkkLy50ZXN0KG5vZGVzW2ldLm5vZGVOYW1lKSkgewoJCQkJdmFyIG4gPSAkKG5vZGVzW2ldKTsKCQkJCSQodGhpcy5ydGUuZG9tLmNyZWF0ZShub2Rlc1tpXS5wYXJlbnROb2RlLm5vZGVOYW1lKSkKCQkJCQkuYXBwZW5kKCQodGhpcy5ydGUuZG9tLmNyZWF0ZSgnbGknKSkuaHRtbChuLmh0bWwoKXx8JycpKS5hcHBlbmRUbyhuLmh0bWwoJyZuYnNwOycpKTsKCQkJfSBlbHNlIHsKCQkJCWluZGVudChub2Rlc1tpXSk7CgkJCX0KCQl9OwoJCXRoaXMucnRlLnVpLnVwZGF0ZSgpOwoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCX0KCn0KfSkoalF1ZXJ5KTsKLyoqCiAqIEBjbGFzcyBidXR0b24gLSBqdXN0aWZ5IHRleHQKICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmp1c3RpZnlsZWZ0ID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7Cgl0aGlzLmFsaWduID0gdGhpcy5uYW1lID09ICdqdXN0aWZ5ZnVsbCcgPyAnanVzdGlmeScgOiB0aGlzLm5hbWUucmVwbGFjZSgnanVzdGlmeScsICcnKTsKCgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQl2YXIgcyA9IHRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7Y29sbGFwc2VkOnRydWUsIGJsb2NrcyA6IHRydWUsIHRhZyA6ICdkaXYnfSksCgkJCWwgPSBzLmxlbmd0aDsKCQlsICYmIHRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJd2hpbGUgKGwtLSkgewoJCQl0aGlzLnJ0ZS5kb20uZmlsdGVyKHNbbF0sICd0ZXh0Tm9kZXMnKSAmJiAkKHNbbF0pLmNzcygndGV4dC1hbGlnbicsIHRoaXMuYWxpZ24pOwoJCX0KCQl0aGlzLnJ0ZS51aS51cGRhdGUoKTsKCX0KCQoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQl2YXIgcyA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksIAoJCQluID0gcy5ub2RlTmFtZSA9PSAnQk9EWScgPyBzIDogdGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudChzLCAndGV4dE5vZGVzJyl8fChzLnBhcmVudE5vZGUgJiYgcy5wYXJlbnROb2RlLm5vZGVOYW1lID09ICdCT0RZJyA/IHMucGFyZW50Tm9kZSA6IG51bGwpOwoJCWlmIChuKSB7CgkJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKS50b2dnbGVDbGFzcygnYWN0aXZlJywgJChuKS5jc3MoJ3RleHQtYWxpZ24nKSA9PSB0aGlzLmFsaWduKTsKCQl9IGVsc2UgewoJCQl0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CgkJfQoJfQoJCn0KCmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5qdXN0aWZ5Y2VudGVyID0gZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmp1c3RpZnlsZWZ0OwplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuanVzdGlmeXJpZ2h0ICA9IGVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5qdXN0aWZ5bGVmdDsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmp1c3RpZnlmdWxsICAgPSBlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuanVzdGlmeWxlZnQ7Cgp9KShqUXVlcnkpOwovKioKICogQGNsYXNzIGJ1dHRvbiAtIGluc2VydC9lZGl0IGxpbmsgKG9wZW4gZGlhbG9nIHdpbmRvdykKICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQ29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMubGluayA9IGZ1bmN0aW9uKHJ0ZSwgbmFtZSkgewoJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJdmFyIHNlbGYgPSB0aGlzOwoJdGhpcy5pbWcgPSBmYWxzZTsKCQoJZnVuY3Rpb24gaW5pdCgpIHsKCQlzZWxmLmxhYmVscyA9IHsKCQkJaWQgICAgICAgIDogJ0lEJywKCQkJJ2NsYXNzJyAgIDogJ0NzcyBjbGFzcycsCgkJCXN0eWxlICAgICA6ICdDc3Mgc3R5bGUnLAoJCQlkaXIgICAgICAgOiAnU2NyaXB0IGRpcmVjdGlvbicsCgkJCWxhbmcgICAgICA6ICdMYW5ndWFnZScsCgkJCWNoYXJzZXQgICA6ICdDaGFyc2V0JywKCQkJdHlwZSAgICAgIDogJ1RhcmdldCBNSU1FIHR5cGUnLAoJCQlyZWwgICAgICAgOiAnUmVsYXRpb25zaGlwIHBhZ2UgdG8gdGFyZ2V0IChyZWwpJywKCQkJcmV2ICAgICAgIDogJ1JlbGF0aW9uc2hpcCB0YXJnZXQgdG8gcGFnZSAocmV2KScsCgkJCXRhYmluZGV4ICA6ICdUYWIgaW5kZXgnLAoJCQlhY2Nlc3NrZXkgOiAnQWNjZXNzIGtleScKCQl9CgkJc2VsZi5zcmMgPSB7CgkJCW1haW4gOiB7CgkJCQlocmVmICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSwKCQkJCXRpdGxlICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLAoJCQkJYW5jaG9yIDogJCgnPHNlbGVjdCAvPicpLmF0dHIoJ25hbWUnLCAnYW5jaG9yJyksCgkJCQl0YXJnZXQgOiAkKCc8c2VsZWN0IC8+JykKCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS50ZXh0KHNlbGYucnRlLmkxOG4oJ0luIHRoaXMgd2luZG93JykpLnZhbCgnJykpCgkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudGV4dChzZWxmLnJ0ZS5pMThuKCdJbiBuZXcgd2luZG93IChfYmxhbmspJykpLnZhbCgnX2JsYW5rJykpCgkJCQkvLyAJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudGV4dChzZWxmLnJ0ZS5pMThuKCdJbiBuZXcgcGFyZW50IHdpbmRvdyAoX3BhcmVudCknKSkudmFsKCdfcGFyZW50JykpCgkJCQkvLyAJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudGV4dChzZWxmLnJ0ZS5pMThuKCdJbiB0b3AgZnJhbWUgKF90b3ApJykpLnZhbCgnX3RvcCcpKQoJCQl9LAoKCQkJcG9wdXAgOiB7CgkJCQl1c2UgICAgICAgIDogJCgnPGlucHV0IHR5cGU9ImNoZWNrYm94IC8+IicpLAoJCQkJdXJsICAgICAgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicgICAgKS52YWwoJ2h0dHA6Ly8nKSwKCQkJCW5hbWUgICAgICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nICAgICksCgkJCQl3aWR0aCAgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyAgICApLmF0dHIoe3NpemUgOiA2LCB0aXRsZSA6IHNlbGYucnRlLmkxOG4oJ1dpZHRoJyl9ICkuY3NzKCd0ZXh0LWFsaWduJywgJ3JpZ2h0JyksCgkJCQloZWlnaHQgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyAgICApLmF0dHIoe3NpemUgOiA2LCB0aXRsZSA6IHNlbGYucnRlLmkxOG4oJ0hlaWdodCcpfSkuY3NzKCd0ZXh0LWFsaWduJywgJ3JpZ2h0JyksCgkJCQlsZWZ0ICAgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyAgICApLmF0dHIoe3NpemUgOiA2LCB0aXRsZSA6IHNlbGYucnRlLmkxOG4oJ0xlZnQnKX0gICkuY3NzKCd0ZXh0LWFsaWduJywgJ3JpZ2h0JyksCgkJCQl0b3AgICAgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyAgICApLmF0dHIoe3NpemUgOiA2LCB0aXRsZSA6IHNlbGYucnRlLmkxOG4oJ1RvcCcpfSAgICkuY3NzKCd0ZXh0LWFsaWduJywgJ3JpZ2h0JyksCgkJCQlsb2NhdGlvbiAgIDogJCgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPicpLAkJCQkKCQkJCW1lbnViYXIgICAgOiAkKCc8aW5wdXQgdHlwZT0iY2hlY2tib3giIC8+JyksCgkJCQl0b29sYmFyICAgIDogJCgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPicpLAoJCQkJc2Nyb2xsYmFycyA6ICQoJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgLz4nKSwKCQkJCXN0YXR1cyAgICAgOiAkKCc8aW5wdXQgdHlwZT0iY2hlY2tib3giIC8+JyksCgkJCQlyZXNpemFibGUgIDogJCgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPicpLAoJCQkJZGVwZW5kZW50ICA6ICQoJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgLz4nKSwKCQkJCXJldGZhbHNlICAgOiAkKCc8aW5wdXQgdHlwZT0iY2hlY2tib3giIC8+JykuYXR0cignY2hlY2tlZCcsIHRydWUpCgkJCX0sCgoJCQlhZHYgOiB7CgkJCQlpZCAgICAgICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSwKCQkJCSdjbGFzcycgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLAoJCQkJc3R5bGUgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyksCgkJCQlkaXIgICAgICAgOiAkKCc8c2VsZWN0IC8+JykKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnRleHQoc2VsZi5ydGUuaTE4bignTm90IHNldCcpKS52YWwoJycpKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudGV4dChzZWxmLnJ0ZS5pMThuKCdMZWZ0IHRvIHJpZ2h0JykpLnZhbCgnbHRyJykpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS50ZXh0KHNlbGYucnRlLmkxOG4oJ1JpZ2h0IHRvIGxlZnQnKSkudmFsKCdydGwnKSksCgkJCQlsYW5nICAgICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSwKCQkJCWNoYXJzZXQgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLAoJCQkJdHlwZSAgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyksCgkJCQlyZWwgICAgICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSwKCQkJCXJldiAgICAgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLAoJCQkJdGFiaW5kZXggIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyksCgkJCQlhY2Nlc3NrZXkgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKQoJCQl9LAoJCQlldmVudHMgOiB7fQoJCX0KCgkJJC5lYWNoKAoJCQlbJ29uYmx1cicsICdvbmZvY3VzJywgJ29uY2xpY2snLCAnb25kYmxjbGljaycsICdvbm1vdXNlZG93bicsICdvbm1vdXNldXAnLCAnb25tb3VzZW92ZXInLCAnb25tb3VzZW91dCcsICdvbm1vdXNlbGVhdmUnLCAnb25rZXlkb3duJywgJ29ua2V5cHJlc3MnLCAnb25rZXl1cCddLCAKCQkJZnVuY3Rpb24oKSB7CgkJCQlzZWxmLnNyYy5ldmVudHNbdGhpc10gPSAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKTsKCQl9KTsKCgkJJC5lYWNoKHNlbGYuc3JjLCBmdW5jdGlvbigpIHsKCQkJZm9yICh2YXIgbiBpbiB0aGlzKSB7CgkJCQl0aGlzW25dLmF0dHIoJ25hbWUnLCBuKTsKCQkJCXZhciB0ID0gdGhpc1tuXS5hdHRyKCd0eXBlJyk7CgkJCQlpZiAoIXQgfHwgKHQgPT0gJ3RleHQnICAmJiAhdGhpc1tuXS5hdHRyKCdzaXplJykpICkgewoJCQkJCXRoaXNbbl0uY3NzKCd3aWR0aCcsICcxMDAlJyk7CgkJCQl9CgkJCX0KCQl9KTsKCQkKCX0KCQoJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgkJdmFyIG4gPSB0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLAoJCQlzZWwsIGksIHYsIG9wdHMsIGwsIHIsIGxpbmssIGhyZWYsIHM7CgkJCgkJIXRoaXMuc3JjICYmIGluaXQoKTsKCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTsKCgkJZnVuY3Rpb24gaXNMaW5rKG4pIHsgcmV0dXJuIG4ubm9kZU5hbWUgPT0gJ0EnICYmIG4uaHJlZjsgfQoJCQoJCXRoaXMubGluayA9IHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnRMaW5rKG4pOwoJCQoJCWlmICghdGhpcy5saW5rKSB7CgkJCXNlbCA9ICQuYnJvd3Nlci5tc2llID8gdGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdGVkKCkgOiB0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoe3dyYXAgOiBmYWxzZX0pOwoJCQlpZiAoc2VsLmxlbmd0aCkgewoJCQkJZm9yIChpPTA7IGkgPCBzZWwubGVuZ3RoOyBpKyspIHsKCQkJCQlpZiAoaXNMaW5rKHNlbFtpXSkpIHsKCQkJCQkJdGhpcy5saW5rID0gc2VsW2ldOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9OwoJCQkJaWYgKCF0aGlzLmxpbmspIHsKCQkJCQl0aGlzLmxpbmsgPSB0aGlzLnJ0ZS5kb20ucGFyZW50KHNlbFswXSwgaXNMaW5rKSB8fCB0aGlzLnJ0ZS5kb20ucGFyZW50KHNlbFtzZWwubGVuZ3RoLTFdLCBpc0xpbmspOwoJCQkJfQoJCQl9CgkJfQoJCQoJCXRoaXMubGluayA9IHRoaXMubGluayA/ICQodGhpcy5saW5rKSA6ICQodGhpcy5ydGUuZG9jLmNyZWF0ZUVsZW1lbnQoJ2EnKSk7CgkJdGhpcy5pbWcgPSBuLm5vZGVOYW1lID09ICdJTUcnID8gbiA6IG51bGw7CgkJdGhpcy51cGRhdGVQb3B1cCgpOwoJCQoJCXRoaXMuc3JjLm1haW4uYW5jaG9yLmVtcHR5KCk7CgkJJCgnYVtocmVmIT0iIl1bbmFtZV0nLCB0aGlzLnJ0ZS5kb2MpLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciBuID0gJCh0aGlzKS5hdHRyKCduYW1lJyk7CgkJCXNlbGYuc3JjLm1haW4uYW5jaG9yLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKG4pLnRleHQobikpOwoJCX0pOwoJCWlmICh0aGlzLnNyYy5tYWluLmFuY2hvci5jaGlsZHJlbigpLmxlbmd0aCkgewoJCQl0aGlzLnNyYy5tYWluLmFuY2hvci5wcmVwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJycpLnRleHQodGhpcy5ydGUuaTE4bignU2VsZWN0IGJvb2ttYXJrJykpICkKCQkJCS5jaGFuZ2UoZnVuY3Rpb24oKSB7CgkJCQkJdmFyIHYgPSAkKHRoaXMpLnZhbCgpOwoJCQkJCWlmICh2KSB7CgkJCQkJCXNlbGYuc3JjLm1haW4uaHJlZi52YWwoJyMnK3YpOwoJCQkJCX0KCQkJCX0pOwoJCX0KCQkKCQlvcHRzID0gewoJCQlydGwgOiB0aGlzLnJ0ZS5ydGwsCgkJCXN1Ym1pdCA6IGZ1bmN0aW9uKGUsIGQpIHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzZWxmLnNldCgpOyBkLmNsb3NlKCk7IH0sCgkJCXRhYnMgOiB7IHNob3cgOiBmdW5jdGlvbihlLCB1aSkgeyBpZiAodWkuaW5kZXg9PTMpIHsgc2VsZi51cGRhdGVPbmNsaWNrKCk7IH0gfSB9LAoJCQljbG9zZSA6IGZ1bmN0aW9uKCkge3NlbGYucnRlLmJyb3dzZXIubXNpZSAmJiBzZWxmLnJ0ZS5zZWxlY3Rpb24ucmVzdG9yZUlFUmFuZ2UoKTsgfSwKCQkJZGlhbG9nIDogewoJCQkJd2lkdGggOiAnYXV0bycsCgkJCQl3aWR0aCA6IDQzMCwKCQkJCXRpdGxlIDogdGhpcy5ydGUuaTE4bignTGluaycpCgkJCQkKCQkJfQoJCX0KCQlkID0gbmV3IGVsRGlhbG9nRm9ybShvcHRzKTsKCQkKCQlsID0gJCgnPGRpdiAvPicpCgkJCS5hcHBlbmQoICQoJzxsYWJlbCAvPicpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC5sb2NhdGlvbikuYXBwZW5kKHRoaXMucnRlLmkxOG4oJ0xvY2F0aW9uIGJhcicpKSkKCQkJLmFwcGVuZCggJCgnPGxhYmVsIC8+JykuYXBwZW5kKHRoaXMuc3JjLnBvcHVwLm1lbnViYXIpLmFwcGVuZCh0aGlzLnJ0ZS5pMThuKCdNZW51IGJhcicpKSkKCQkJLmFwcGVuZCggJCgnPGxhYmVsIC8+JykuYXBwZW5kKHRoaXMuc3JjLnBvcHVwLnRvb2xiYXIpLmFwcGVuZCh0aGlzLnJ0ZS5pMThuKCdUb29sYmFyJykpKQkJCQkKCQkJLmFwcGVuZCggJCgnPGxhYmVsIC8+JykuYXBwZW5kKHRoaXMuc3JjLnBvcHVwLnNjcm9sbGJhcnMpLmFwcGVuZCh0aGlzLnJ0ZS5pMThuKCdTY3JvbGxiYXJzJykpKTsKCQlyID0gJCgnPGRpdiAvPicpCgkJCS5hcHBlbmQoICQoJzxsYWJlbCAvPicpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC5zdGF0dXMpLmFwcGVuZCh0aGlzLnJ0ZS5pMThuKCdTdGF0dXMgYmFyJykpKQoJCQkuYXBwZW5kKCAkKCc8bGFiZWwgLz4nKS5hcHBlbmQodGhpcy5zcmMucG9wdXAucmVzaXphYmxlKS5hcHBlbmQodGhpcy5ydGUuaTE4bignUmVzaXphYmxlJykpKQoJCQkuYXBwZW5kKCAkKCc8bGFiZWwgLz4nKS5hcHBlbmQodGhpcy5zcmMucG9wdXAuZGVwZW5kZW50KS5hcHBlbmQodGhpcy5ydGUuaTE4bignRGVwZWRlbnQnKSkpCQkJCQoJCQkuYXBwZW5kKCAkKCc8bGFiZWwgLz4nKS5hcHBlbmQodGhpcy5zcmMucG9wdXAucmV0ZmFsc2UpLmFwcGVuZCh0aGlzLnJ0ZS5pMThuKCdBZGQgcmV0dXJuIGZhbHNlJykpKTsKCQkKCQlkLnRhYignbWFpbicsIHRoaXMucnRlLmkxOG4oJ1Byb3BlcmllcycpKQoJCQkudGFiKCdwb3B1cCcsICB0aGlzLnJ0ZS5pMThuKCdQb3B1cCcpKQoJCQkudGFiKCdhZHYnLCAgICB0aGlzLnJ0ZS5pMThuKCdBZHZhbmNlZCcpKQoJCQkudGFiKCdldmVudHMnLCB0aGlzLnJ0ZS5pMThuKCdFdmVudHMnKSkKCQkJLmFwcGVuZCgkKCc8bGFiZWwgLz4nKS5hcHBlbmQodGhpcy5zcmMucG9wdXAudXNlKS5hcHBlbmQodGhpcy5ydGUuaTE4bignT3BlbiBsaW5rIGluIHBvcHVwIHdpbmRvdycpKSwgJ3BvcHVwJykKCQkJLnNlcGFyYXRvcigncG9wdXAnKQoJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdVUkwnKSwgIHRoaXMuc3JjLnBvcHVwLnVybF0sICAncG9wdXAnLCB0cnVlKQoJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdXaW5kb3cgbmFtZScpLCB0aGlzLnNyYy5wb3B1cC5uYW1lXSwgJ3BvcHVwJywgdHJ1ZSkKCQkJLmFwcGVuZChbdGhpcy5ydGUuaTE4bignV2luZG93IHNpemUnKSwgJCgnPHNwYW4gLz4nKS5hcHBlbmQodGhpcy5zcmMucG9wdXAud2lkdGgpLmFwcGVuZCgnIHggJykuYXBwZW5kKHRoaXMuc3JjLnBvcHVwLmhlaWdodCkuYXBwZW5kKCcgcHgnKV0sICdwb3B1cCcsIHRydWUpCgkJCS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ1dpbmRvdyBwb3NpdGlvbicpLCAkKCc8c3BhbiAvPicpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC5sZWZ0KS5hcHBlbmQoJyB4ICcpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC50b3ApLmFwcGVuZCgnIHB4JyldLCAncG9wdXAnLCB0cnVlKQkJCQkKCQkJLnNlcGFyYXRvcigncG9wdXAnKQoJCQkuYXBwZW5kKFtsLCByXSwgJ3BvcHVwJywgdHJ1ZSk7CgoJCWxpbmsgPSB0aGlzLmxpbmsuZ2V0KDApOwoJCWhyZWYgPSB0aGlzLnJ0ZS5kb20uYXR0cihsaW5rLCAnaHJlZicpOwoJCXRoaXMuc3JjLm1haW4uaHJlZi52YWwoaHJlZikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJCQkkKHRoaXMpLnZhbChzZWxmLnJ0ZS51dGlscy5hYnNvbHV0ZVVSTCgkKHRoaXMpLnZhbCgpKSk7CgkJfSk7CgkJCgkJaWYgKHRoaXMucnRlLm9wdGlvbnMuZm1BbGxvdyAmJiB0aGlzLnJ0ZS5vcHRpb25zLmZtT3BlbikgewoJCQl2YXIgcyA9ICQoJzxzcGFuIC8+JykuYXBwZW5kKHRoaXMuc3JjLm1haW4uaHJlZi5jc3MoJ3dpZHRoJywgJzg3JScpKQoJCQkJLmFwcGVuZCgKCQkJCQkkKCc8c3BhbiAvPicpLmFkZENsYXNzKCd1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwnKQoJCQkJCQkuY3NzKHsnZmxvYXQnIDogJ3JpZ2h0JywgJ21hcmdpbi1yaWdodCcgOiAnM3B4J30pCgkJCQkJCS5hdHRyKCd0aXRsZScsIHNlbGYucnRlLmkxOG4oJ09wZW4gZmlsZSBtYW5nZXInKSkKCQkJCQkJLmFwcGVuZCgkKCc8c3BhbiAvPicpLmFkZENsYXNzKCd1aS1pY29uIHVpLWljb24tZm9sZGVyLW9wZW4nKSkKCQkJCQkJCS5jbGljayggZnVuY3Rpb24oKSB7CgkJCQkJCQkJc2VsZi5ydGUub3B0aW9ucy5mbU9wZW4oIGZ1bmN0aW9uKHVybCkgeyBzZWxmLnNyYy5tYWluLmhyZWYudmFsKHVybCkuY2hhbmdlKCk7IH0gKTsKCQkJCQkJCX0pCgkJCQkJCQkuaG92ZXIoZnVuY3Rpb24oKSB7JCh0aGlzKS5hZGRDbGFzcygndWktc3RhdGUtaG92ZXInKX0sIGZ1bmN0aW9uKCkgeyAkKHRoaXMpLnJlbW92ZUNsYXNzKCd1aS1zdGF0ZS1ob3ZlcicpfSkKCQkJCSk7CgkJCWQuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdMaW5rIFVSTCcpLCBzXSwgJ21haW4nLCB0cnVlKTsKCQl9IGVsc2UgewoJCQlkLmFwcGVuZChbdGhpcy5ydGUuaTE4bignTGluayBVUkwnKSwgdGhpcy5zcmMubWFpbi5ocmVmXSwgJ21haW4nLCB0cnVlKTsKCQl9CgkJdGhpcy5zcmMubWFpbi5ocmVmLmNoYW5nZSgpOwoJCQoJCWQuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdUaXRsZScpLCB0aGlzLnNyYy5tYWluLnRpdGxlLnZhbCh0aGlzLnJ0ZS5kb20uYXR0cihsaW5rLCAndGl0bGUnKSldLCAnbWFpbicsIHRydWUpOwoJCWlmICh0aGlzLnNyYy5tYWluLmFuY2hvci5jaGlsZHJlbigpLmxlbmd0aCkgewoJCQlkLmFwcGVuZChbdGhpcy5ydGUuaTE4bignQm9va21hcmsnKSwgdGhpcy5zcmMubWFpbi5hbmNob3IudmFsKGhyZWYpXSwgJ21haW4nLCB0cnVlKQoJCX0KCQlpZiAoIXRoaXMucnRlLm9wdGlvbnMuZG9jdHlwZS5tYXRjaCgveGh0bWwvKSkgewoJCQlkLmFwcGVuZChbdGhpcy5ydGUuaTE4bignVGFyZ2V0JyksIHRoaXMuc3JjLm1haW4udGFyZ2V0LnZhbCh0aGlzLmxpbmsuYXR0cigndGFyZ2V0Jyl8fCcnKV0sICdtYWluJywgdHJ1ZSk7CgkJfQoJCQoKCgkJZm9yICh2YXIgbiBpbiB0aGlzLnNyYy5hZHYpIHsKCQkJdGhpcy5zcmMuYWR2W25dLnZhbCh0aGlzLnJ0ZS5kb20uYXR0cihsaW5rLCBuKSk7CgkJCWQuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKHRoaXMubGFiZWxzW25dID8gdGhpcy5sYWJlbHNbbl0gOiBuKSwgdGhpcy5zcmMuYWR2W25dXSwgJ2FkdicsIHRydWUpOwoJCX0KCQlmb3IgKHZhciBuIGluIHRoaXMuc3JjLmV2ZW50cykgewoJCQl2YXIgdiA9IHRoaXMucnRlLnV0aWxzLnRyaW1FdmVudENhbGxiYWNrKHRoaXMucnRlLmRvbS5hdHRyKGxpbmssIG4pKTsKCQkJdGhpcy5zcmMuZXZlbnRzW25dLnZhbCh2KTsKCQkJZC5hcHBlbmQoW3RoaXMucnRlLmkxOG4odGhpcy5sYWJlbHNbbl0gPyB0aGlzLmxhYmVsc1tuXSA6IG4pLCB0aGlzLnNyYy5ldmVudHNbbl1dLCAnZXZlbnRzJywgdHJ1ZSk7CgkJfQoJCQoJCXRoaXMuc3JjLnBvcHVwLnVzZS5jaGFuZ2UoZnVuY3Rpb24oKSB7CgkJCXZhciBjID0gJCh0aGlzKS5hdHRyKCdjaGVja2VkJyk7CgkJCSQuZWFjaChzZWxmLnNyYy5wb3B1cCwgZnVuY3Rpb24oKSB7CgkJCQlpZiAoJCh0aGlzKS5hdHRyKCduYW1lJykgIT0gJ3VzZScpIHsKCQkJCQlpZiAoYykgewoJCQkJCQkkKHRoaXMpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJCh0aGlzKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpOwoJCQkJCX0KCQkJCX0KCQkJfSkKCQl9KTsKCQl0aGlzLnNyYy5wb3B1cC51c2UuY2hhbmdlKCk7CgkJZC5vcGVuKCk7Cgl9CgkKCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CgkJdmFyIG4gPSB0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpOwoJCQoJCS8vIHZhciB0ID0gdGhpcy5ydGUuZG9tLnNlbGVjdGlvbkhhcyhmdW5jdGlvbihuKSB7IHJldHVybiBuLm5vZGVOYW1lID09ICdBJyAmJiBuLmhyZWY7IH0pOwoJCS8vIHRoaXMucnRlLmxvZyh0KQoJCQoJCWlmICh0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50TGluayhuKSkgewoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJykuYWRkQ2xhc3MoJ2FjdGl2ZScpOwoJCX0gZWxzZSBpZiAodGhpcy5ydGUuZG9tLnNlbGVjdGlvbkhhcyhmdW5jdGlvbihuKSB7IHJldHVybiBuLm5vZGVOYW1lID09ICdBJyAmJiBuLmhyZWY7IH0pKSB7CgkJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKS5hZGRDbGFzcygnYWN0aXZlJyk7CgkJfSBlbHNlIGlmICghdGhpcy5ydGUuc2VsZWN0aW9uLmNvbGxhcHNlZCgpIHx8IG4ubm9kZU5hbWUgPT0gJ0lNRycpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCBhY3RpdmUnKTsKCQl9IGVsc2UgewoJCQl0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoJ2Rpc2FibGVkJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoJCX0KCX0KCQoJdGhpcy51cGRhdGVQb3B1cCA9IGZ1bmN0aW9uKCkgewoJCXZhciBvbmNsaWNrID0gdGhpcy5ydGUuZG9tLmF0dHIodGhpcy5saW5rLmdldCgwKSwgJ29uY2xpY2snKTsKCQlvbmNsaWNrID0gb25jbGljayA/ICQudHJpbShvbmNsaWNrLnRvU3RyaW5nKCkpIDogJycKCQlpZiAoIG9uY2xpY2subGVuZ3RoPjAgJiYgKG0gPSBvbmNsaWNrLm1hdGNoKC93aW5kb3cub3BlblwoIihbXiJdKykiLFxzKiIoW14iXSopIixccyoiKFteIl0qKSJccyouKlwpO1xzKihyZXR1cm5ccytmYWxzZSk/LykpKSB7CgkJCXRoaXMuc3JjLnBvcHVwLnVzZS5hdHRyKCdjaGVja2VkJywgJ29uJykKCQkJdGhpcy5zcmMucG9wdXAudXJsLnZhbChtWzFdKTsKCQkJdGhpcy5zcmMucG9wdXAubmFtZS52YWwobVsyXSk7CgoJCQlpZiAoIC9sb2NhdGlvbj15ZXMvLnRlc3QobVszXSkgKSB7CgkJCQl0aGlzLnNyYy5wb3B1cC5sb2NhdGlvbi5hdHRyKCdjaGVja2VkJywgdHJ1ZSk7CgkJCX0KCQkJaWYgKCAvbWVudWJhcj15ZXMvLnRlc3QobVszXSkgKSB7CgkJCQl0aGlzLnNyYy5wb3B1cC5tZW51YmFyLmF0dHIoJ2NoZWNrZWQnLCB0cnVlKTsKCQkJfQoJCQlpZiAoIC90b29sYmFyPXllcy8udGVzdChtWzNdKSApIHsKCQkJCXRoaXMuc3JjLnBvcHVwLnRvb2xiYXIuYXR0cignY2hlY2tlZCcsIHRydWUpOwoJCQl9CgkJCWlmICggL3Njcm9sbGJhcnM9eWVzLy50ZXN0KG1bM10pICkgewoJCQkJdGhpcy5zcmMucG9wdXAuc2Nyb2xsYmFycy5hdHRyKCdjaGVja2VkJywgdHJ1ZSk7CgkJCX0KCQkJaWYgKCAvc3RhdHVzPXllcy8udGVzdChtWzNdKSApIHsKCQkJCXRoaXMuc3JjLnBvcHVwLnN0YXR1cy5hdHRyKCdjaGVja2VkJywgdHJ1ZSk7CgkJCX0KCQkJaWYgKCAvcmVzaXphYmxlPXllcy8udGVzdChtWzNdKSApIHsKCQkJCXRoaXMuc3JjLnBvcHVwLnJlc2l6YWJsZS5hdHRyKCdjaGVja2VkJywgdHJ1ZSk7CgkJCX0KCQkJaWYgKCAvZGVwZW5kZW50PXllcy8udGVzdChtWzNdKSApIHsKCQkJCXRoaXMuc3JjLnBvcHVwLmRlcGVuZGVudC5hdHRyKCdjaGVja2VkJywgdHJ1ZSk7CgkJCX0KCQkJaWYgKChfbSA9IG1bM10ubWF0Y2goL3dpZHRoPShbXixdKykvKSkpIHsKCQkJCXRoaXMuc3JjLnBvcHVwLndpZHRoLnZhbChfbVsxXSk7CgkJCX0KCQkJaWYgKChfbSA9IG1bM10ubWF0Y2goL2hlaWdodD0oW14sXSspLykpKSB7CgkJCQl0aGlzLnNyYy5wb3B1cC5oZWlnaHQudmFsKF9tWzFdKTsKCQkJfQoJCQlpZiAoKF9tID0gbVszXS5tYXRjaCgvbGVmdD0oW14sXSspLykpKSB7CgkJCQl0aGlzLnNyYy5wb3B1cC5sZWZ0LnZhbChfbVsxXSk7CgkJCX0KCQkJaWYgKChfbSA9IG1bM10ubWF0Y2goL3RvcD0oW14sXSspLykpKSB7CgkJCQl0aGlzLnNyYy5wb3B1cC50b3AudmFsKF9tWzFdKTsKCQkJfQoJCQlpZiAobVs0XSkgewoJCQkJdGhpcy5zcmMucG9wdXAucmV0ZmFsc2UuYXR0cignY2hlY2tlZCcsIHRydWUpOwoJCQl9CgkJfSBlbHNlIHsKCQkJJC5lYWNoKHRoaXMuc3JjLnBvcHVwLCBmdW5jdGlvbigpIHsKCQkJCXZhciAkdGhpcyA9ICQodGhpcyk7CgkJCQlpZiAoJHRoaXMuYXR0cigndHlwZScpID09ICd0ZXh0JykgewoJCQkJCSR0aGlzLnZhbCgkdGhpcy5hdHRyKCduYW1lJykgPT0gJ3VybCcgPyAnaHR0cDovLycgOiAnJyk7CgkJCQl9IGVsc2UgewoJCQkJCWlmICgkdGhpcy5hdHRyKCduYW1lJykgPT0gJ3JldGZhbHNlJykgewoJCQkJCQl0aGlzLmF0dHIoJ2NoZWNrZWQnLCB0cnVlKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkdGhpcy5yZW1vdmVBdHRyKCdjaGVja2VkJyk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQl9CgkJCgl9CgkKCXRoaXMudXBkYXRlT25jbGljayA9IGZ1bmN0aW9uICgpIHsKCQl2YXIgdXJsID0gdGhpcy5zcmMucG9wdXAudXJsLnZhbCgpOwoJCWlmICh0aGlzLnNyYy5wb3B1cC51c2UuYXR0cignY2hlY2tlZCcpICYmIHVybCkgewoJCQl2YXIgcGFyYW1zID0gJyc7CgkJCWlmICh0aGlzLnNyYy5wb3B1cC5sb2NhdGlvbi5hdHRyKCdjaGVja2VkJykpIHsKCQkJCXBhcmFtcyArPSAnbG9jYXRpb249eWVzLCc7CgkJCX0KCQkJaWYgKHRoaXMuc3JjLnBvcHVwLm1lbnViYXIuYXR0cignY2hlY2tlZCcpKSB7CgkJCQlwYXJhbXMgKz0gJ21lbnViYXI9eWVzLCc7CgkJCX0KCQkJaWYgKHRoaXMuc3JjLnBvcHVwLnRvb2xiYXIuYXR0cignY2hlY2tlZCcpKSB7CgkJCQlwYXJhbXMgKz0gJ3Rvb2xiYXI9eWVzLCc7CgkJCX0KCQkJaWYgKHRoaXMuc3JjLnBvcHVwLnNjcm9sbGJhcnMuYXR0cignY2hlY2tlZCcpKSB7CgkJCQlwYXJhbXMgKz0gJ3Njcm9sbGJhcnM9eWVzLCc7CgkJCX0KCQkJaWYgKHRoaXMuc3JjLnBvcHVwLnN0YXR1cy5hdHRyKCdjaGVja2VkJykpIHsKCQkJCXBhcmFtcyArPSAnc3RhdHVzPXllcywnOwoJCQl9CgkJCWlmICh0aGlzLnNyYy5wb3B1cC5yZXNpemFibGUuYXR0cignY2hlY2tlZCcpKSB7CgkJCQlwYXJhbXMgKz0gJ3Jlc2l6YWJsZT15ZXMsJzsKCQkJfQoJCQlpZiAodGhpcy5zcmMucG9wdXAuZGVwZW5kZW50LmF0dHIoJ2NoZWNrZWQnKSkgewoJCQkJcGFyYW1zICs9ICdkZXBlbmRlbnQ9eWVzLCc7CgkJCX0KCQkJaWYgKHRoaXMuc3JjLnBvcHVwLndpZHRoLnZhbCgpKSB7CgkJCQlwYXJhbXMgKz0gJ3dpZHRoPScrdGhpcy5zcmMucG9wdXAud2lkdGgudmFsKCkrJywnOwoJCQl9CgkJCWlmICh0aGlzLnNyYy5wb3B1cC5oZWlnaHQudmFsKCkpIHsKCQkJCXBhcmFtcyArPSAnaGVpZ2h0PScrdGhpcy5zcmMucG9wdXAuaGVpZ2h0LnZhbCgpKycsJzsKCQkJfQoJCQlpZiAodGhpcy5zcmMucG9wdXAubGVmdC52YWwoKSkgewoJCQkJcGFyYW1zICs9ICdsZWZ0PScrdGhpcy5zcmMucG9wdXAubGVmdC52YWwoKSsnLCc7CgkJCX0KCQkJaWYgKHRoaXMuc3JjLnBvcHVwLnRvcC52YWwoKSkgewoJCQkJcGFyYW1zICs9ICd0b3A9Jyt0aGlzLnNyYy5wb3B1cC50b3AudmFsKCkrJywnOwoJCQl9CgkJCWlmIChwYXJhbXMubGVuZ3RoPjApIHsKCQkJCXBhcmFtcyA9IHBhcmFtcy5zdWJzdHJpbmcoMCwgcGFyYW1zLmxlbmd0aC0xKQoJCQl9CgkJCXZhciByZXRmYWxzZSA9IHRoaXMuc3JjLnBvcHVwLnJldGZhbHNlLmF0dHIoJ2NoZWNrZWQnKSA/ICdyZXR1cm4gZmFsc2U7JyA6ICcnOwoJCQl2YXIgb25jbGljayA9ICd3aW5kb3cub3BlbigiJyt1cmwrJyIsICInKyQudHJpbSh0aGlzLnNyYy5wb3B1cC5uYW1lLnZhbCgpKSsnIiwgIicrcGFyYW1zKyciKTsnK3JldGZhbHNlOwoJCQl0aGlzLnNyYy5ldmVudHMub25jbGljay52YWwob25jbGljayk7CgkJCWlmICghdGhpcy5zcmMubWFpbi5ocmVmLnZhbCgpKSB7CgkJCQl0aGlzLnNyYy5tYWluLmhyZWYudmFsKCcjJyk7CgkJCX0KCQl9IGVsc2UgewoJCQl2YXIgdiA9IHRoaXMuc3JjLmV2ZW50cy5vbmNsaWNrLnZhbCgpOwoJCQl2ID0gdi5yZXBsYWNlKC93aW5kb3dcLm9wZW5cKFteXCldK1wpXHMqOz9ccypyZXR1cm5ccypmYWxzZVxzKjs/L2ksICcnKTsKCQkJdGhpcy5zcmMuZXZlbnRzLm9uY2xpY2sudmFsKHYpOwoJCX0KCX0KCQoJdGhpcy5zZXQgPSBmdW5jdGlvbigpIHsKCQl2YXIgaHJlZiwgZmFrZVVSTDsKCQl0aGlzLnVwZGF0ZU9uY2xpY2soKTsKCQl0aGlzLnJ0ZS5zZWxlY3Rpb24ucmVzdG9yZUlFUmFuZ2UoKTsKCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoJCWhyZWYgPSB0aGlzLnJ0ZS51dGlscy5hYnNvbHV0ZVVSTCh0aGlzLnNyYy5tYWluLmhyZWYudmFsKCkpOwoJCWlmICghaHJlZikgewoJCQkvLyB0aGlzLmxpbmsucGFyZW50Tm9kZSAmJiB0aGlzLnJ0ZS5kb2MuZXhlY0NvbW1hbmQoJ3VubGluaycsIGZhbHNlLCBudWxsKTsKCQkJdmFyIGJtID0gdGhpcy5ydGUuc2VsZWN0aW9uLmdldEJvb2ttYXJrKCk7CgkJCXRoaXMucnRlLmRvbS51bndyYXAodGhpcy5saW5rWzBdKTsKCQkJdGhpcy5ydGUuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGJtKQoJCX0gZWxzZSB7CgkJCWlmICghdGhpcy5saW5rWzBdLnBhcmVudE5vZGUpIHsKCQkJCWlmICh0aGlzLmltZyAmJiB0aGlzLmltZy5wYXJlbnROb2RlKSB7CgkJCQkJdGhpcy5saW5rID0gJCh0aGlzLnJ0ZS5kb20uY3JlYXRlKCdhJykpLmF0dHIoJ2hyZWYnLCBocmVmKTsKCQkJCQl0aGlzLnJ0ZS5kb20ud3JhcCh0aGlzLmltZywgdGhpcy5saW5rWzBdKTsKCQkJCX0gZWxzZSB7CgkJCQkJZmFrZVVSTCA9ICcjLS1lbC1lZGl0b3ItLS0nK01hdGgucmFuZG9tKCk7CgkJCQkJdGhpcy5ydGUuZG9jLmV4ZWNDb21tYW5kKCdjcmVhdGVMaW5rJywgZmFsc2UsIGZha2VVUkwpOwoJCQkJCXRoaXMubGluayA9ICQoJ2FbaHJlZj0iJytmYWtlVVJMKyciXScsIHRoaXMucnRlLmRvYyk7CgkJCQkJdGhpcy5saW5rLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkJCXZhciAkdGhpcyA9ICQodGhpcyk7CgkJCQkJCS8vINGD0LTQsNC70Y/QtdC8INGB0YHRi9C70LrQuCDQstC+0LrRgNGD0LMg0L/Rg9GB0YLRi9GFINGN0LvQtdC80LXQvdGC0L7QsgoJCQkJCQlpZiAoISQudHJpbSgkdGhpcy5odG1sKCkpICYmICEkLnRyaW0oJHRoaXMudGV4dCgpKSkgewoJCQkJCQkJJHRoaXMucmVwbGFjZVdpdGgoJHRoaXMudGV4dCgpKTsgLy8gINGB0L7RhdGA0LDQvdGP0LXQvCDQv9GA0L7QsdC10LvRiyA6KQoJCQkJCQl9CgkJCQkJfSk7CgkJCQl9CgkJCX0KCgkJCXRoaXMuc3JjLm1haW4uaHJlZi52YWwoaHJlZik7CgkJCWZvciAodmFyIHRhYiBpbiB0aGlzLnNyYykgewoJCQkJaWYgKHRhYiAhPSAncG9wdXAnKSB7CgkJCQkJZm9yICh2YXIgbiBpbiB0aGlzLnNyY1t0YWJdKSB7CgkJCQkJCWlmIChuICE9ICdhbmNob3JzJykgewoJCQkJCQkJdmFyIHYgPSAkLnRyaW0odGhpcy5zcmNbdGFiXVtuXS52YWwoKSk7CgkJCQkJCQlpZiAodikgewoJCQkJCQkJCXRoaXMubGluay5hdHRyKG4sIHYpOwoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQl0aGlzLmxpbmsucmVtb3ZlQXR0cihuKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfTsKCQkJdGhpcy5pbWcgJiYgdGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdCh0aGlzLmltZyk7CgkJfQoJCXRoaXMucnRlLnVpLnVwZGF0ZSh0cnVlKTsKCX0KCQp9Cgp9KShqUXVlcnkpOwovKioKICogQGNsYXNzIGJ1dHRvbiAtIGluc2VydCBub24gYnJlYWthYmxlIHNwYWNlCiAqINCV0YHQu9C4INCy0YvQtNC10LvQtdC90LjQtSDRgdGF0LvQvtC/0L3Rg9GC0L4g0Lgg0L3QsNGF0L7QtNC40YLRgdGPINCy0L3Rg9GC0YDQuCBkaXYnYSAtINC+0L0g0YPQtNCw0LvRj9C10YLRgdGPCiAqINCd0L7QstGL0LUgZGl2J9GLINGB0L7Qt9C00LDRjtGC0YHRjyDRgtC+0LvRjNC60L4g0LjQtyDQvdC10YHRhdC70L7Qv9C90YPRgtC+0LPQviDQstGL0LTQtdC70LXQvdC40Y8KICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLm5ic3AgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCQoJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5ydGUuaGlzdG9yeS5hZGQoKTsKCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0SHRtbCgnJm5ic3A7JywgdHJ1ZSk7CgkJdGhpcy5ydGUud2luZG93LmZvY3VzKCk7CgkJdGhpcy5ydGUudWkudXBkYXRlKCk7Cgl9CgkKCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJfQp9Cn0pKGpRdWVyeSk7CgovKioKICogQGNsYXNzIGJ1dHRvbiAtIG91dGRlbnQgdGV4dAogKiDRg9C80LXQvdGM0YjQsNC10YIgcGFkZGluZy9tYXJnaW4v0YHQsNC80L7QvNC90LXQvdC40LUgOykKICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqIEB0b2RvIGRlY3JlYXNlIGxpc3RzIG5lc3RpbmcgbGV2ZWwhCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLm91dGRlbnQgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCXZhciBzZWxmID0gdGhpczsKCgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQl2YXIgdiA9IHRoaXMuZmluZCgpOwoJCWlmICh2Lm5vZGUpIHsKCQkJdGhpcy5ydGUuaGlzdG9yeS5hZGQoKTsKCQkJJCh2Lm5vZGUpLmNzcyh2LnR5cGUsICh2LnZhbD40MCA/IHYudmFsLTQwIDogMCkrJ3B4Jyk7CgkJCXRoaXMucnRlLnVpLnVwZGF0ZSgpOwoJCX0KCX0KCQoJdGhpcy5maW5kID0gZnVuY3Rpb24obikgewoJCWZ1bmN0aW9uIGNoZWNrTm9kZShuKSB7CgkJCXZhciByZXQgPSB7dHlwZSA6ICcnLCB2YWwgOiAwfTsKCQkJdmFyIHM7CgkJCWlmICgocyA9IHNlbGYucnRlLmRvbS5hdHRyKG4sICdzdHlsZScpKSkgewoJCQkJcmV0LnR5cGUgPSBzLmluZGV4T2YoJ3BhZGRpbmctbGVmdCcpICE9IC0xCgkJCQkJPyAncGFkZGluZy1sZWZ0JwoJCQkJCTogKHMuaW5kZXhPZignbWFyZ2luLWxlZnQnKSAhPSAtMSA/ICdtYXJnaW4tbGVmdCcgOiAnJyk7CgkJCQlyZXQudmFsID0gcmV0LnR5cGUgPyBwYXJzZUludCgkKG4pLmNzcyhyZXQudHlwZSkpfHwwIDogMDsKCQkJfQoJCQlyZXR1cm4gcmV0OwoJCX0KCQkKCQl2YXIgbiA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7CgkJdmFyIHJldCA9IGNoZWNrTm9kZShuKTsKCQlpZiAocmV0LnZhbCkgewoJCQlyZXQubm9kZSA9IG47CgkJfSBlbHNlIHsKCQkJJC5lYWNoKHRoaXMucnRlLmRvbS5wYXJlbnRzKG4sICcqJyksIGZ1bmN0aW9uKCkgewoJCQkJcmV0ID0gY2hlY2tOb2RlKHRoaXMpOwoJCQkJaWYgKHJldC52YWwpIHsKCQkJCQlyZXQubm9kZSA9IHRoaXM7CgkJCQkJcmV0dXJuIHJldDsKCQkJCX0KCQkJfSkKCQl9CgkJcmV0dXJuIHJldDsKCX0KCQoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQl2YXIgdiA9IHRoaXMuZmluZCgpOwoJCWlmICh2Lm5vZGUpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJCX0gZWxzZSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKCQl9Cgl9CgoJCn0KCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgllbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMucGFnZWJyZWFrID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7CgkJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJCQoJCS8vIHByZXZlbnQgcmVzaXplCgkJJCh0aGlzLnJ0ZS5kb2MuYm9keSkuYmluZCgnbW91c2Vkb3duJywgZnVuY3Rpb24oZSkgewoJCQlpZiAoJChlLnRhcmdldCkuaGFzQ2xhc3MoJ2VscnRlLXBhZ2VicmVhaycpKSB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCX0KCQl9KQoJCQoJCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0SHRtbCgnPGltZyBzcmM9IicrdGhpcy5ydGUuZmlsdGVyLnVybCsncGl4ZWwuZ2lmIiBjbGFzcz0iZWxydGUtcHJvdGVjdGVkIGVscnRlLXBhZ2VicmVhayIvPicsIGZhbHNlKTsKCQl9CgkJCgkJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJCX0KCX0KCQp9KShqUXVlcnkpOy8qKgogKiBAY2xhc3MgYnV0dG9uIC0gaW5zZXJ0IGZvcm1hdHRlZCB0ZXh0IChvcGVuIGRpYWxvZyB3aW5kb3cpCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5wYXN0ZWZvcm1hdHRleHQgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCXRoaXMuaWZyYW1lID0gJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKSkuYWRkQ2xhc3MoJ2VsLXJ0ZS1wYXN0ZS1pbnB1dCcpOwoJdGhpcy5kb2MgICAgPSBudWxsOwoJdmFyIHNlbGYgICAgPSB0aGlzOwoJCgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTsKCQl2YXIgc2VsZiA9IHRoaXMsCgkJCW9wdHMgPSB7CgkJCXN1Ym1pdCA6IGZ1bmN0aW9uKGUsIGQpIHsKCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQlzZWxmLnBhc3RlKCk7CgkJCQlkLmNsb3NlKCk7CgkJCX0sCgkJCWRpYWxvZyA6IHsKCQkJCXdpZHRoIDogNTAwLAoJCQkJdGl0bGUgOiB0aGlzLnJ0ZS5pMThuKCdQYXN0ZSBmb3JtYXR0ZWQgdGV4dCcpCgkJCX0KCQl9LAoJCWQgPSBuZXcgZWxEaWFsb2dGb3JtKG9wdHMpOwoJCWQuYXBwZW5kKHRoaXMuaWZyYW1lKS5vcGVuKCk7CgkJdGhpcy5kb2MgPSB0aGlzLmlmcmFtZS5nZXQoMCkuY29udGVudFdpbmRvdy5kb2N1bWVudDsKCQlodG1sID0gdGhpcy5ydGUub3B0aW9ucy5kb2N0eXBlCgkJCSsnPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPic7CgkJaHRtbCArPSAnPC9oZWFkPjxib2R5PiA8YnIgLz4gPC9ib2R5PjwvaHRtbD4nOwkKCQkKCQl0aGlzLmRvYy5vcGVuKCk7CgkJdGhpcy5kb2Mud3JpdGUoaHRtbCk7CgkJdGhpcy5kb2MuY2xvc2UoKTsKCgkJaWYgKCF0aGlzLnJ0ZS5icm93c2VyLm1zaWUpIHsKCQkJdHJ5IHsgdGhpcy5kb2MuZGVzaWduTW9kZSA9ICJvbiI7IH0gCgkJCWNhdGNoKGUpIHsgfQoJCX0gZWxzZSB7CgkJCXRoaXMuZG9jLmJvZHkuY29udGVudEVkaXRhYmxlID0gdHJ1ZTsKCQl9CgkJc2V0VGltZW91dChmdW5jdGlvbigpIHsgc2VsZi5pZnJhbWVbMF0uY29udGVudFdpbmRvdy5mb2N1cygpOyB9LCA1MCk7Cgl9CgkKCXRoaXMucGFzdGUgPSBmdW5jdGlvbigpIHsKCQkkKHRoaXMuZG9jLmJvZHkpLmZpbmQoJ1tjbGFzc10nKS5yZW1vdmVBdHRyKCdjbGFzcycpOwoJCXZhciBodG1sID0gJC50cmltKCQodGhpcy5kb2MuYm9keSkuaHRtbCgpKTsKCQlpZiAoaHRtbCkgewoJCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoJCQl0aGlzLnJ0ZS5zZWxlY3Rpb24ucmVzdG9yZUlFUmFuZ2UoKTsKCQkJdGhpcy5ydGUuc2VsZWN0aW9uLmluc2VydEh0bWwodGhpcy5ydGUuZmlsdGVyLnd5c2l3eWcyd3lzaXd5Zyh0aGlzLnJ0ZS5maWx0ZXIucHJvY2Nlc3MoJ3Bhc3RlJywgaHRtbCkpKTsKCQkJdGhpcy5ydGUudWkudXBkYXRlKHRydWUpOwoJCX0KCX0KCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCX0KfQp9KShqUXVlcnkpOwoKLyoqCiAqIEBjbGFzcyDQutC90L7Qv9C60LAgItCy0YHRgtCw0LLQuNGC0Ywg0YLQvtC70YzQutC+INGC0LXQutGB0YIiIAogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKiBAY29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMucGFzdGV0ZXh0ID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7Cgl0aGlzLmlucHV0ID0gJCgnPHRleHRhcmVhIC8+JykuYWRkQ2xhc3MoJ2VsLXJ0ZS1wYXN0ZS1pbnB1dCcpOwoJdmFyIHNlbGYgICA9IHRoaXM7CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCXRoaXMucnRlLmJyb3dzZXIubXNpZSAmJiB0aGlzLnJ0ZS5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTsKCQl2YXIgb3B0cyA9IHsKCQkJc3VibWl0IDogZnVuY3Rpb24oZSwgZCkgewoJCQkJZS5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCXNlbGYucGFzdGUoKTsKCQkJCWQuY2xvc2UoKTsKCQkJfSwKCQkJZGlhbG9nIDogewoJCQkJd2lkdGggOiA1MDAsCgkJCQl0aXRsZSA6IHRoaXMucnRlLmkxOG4oJ1Bhc3RlIG9ubHkgdGV4dCcpCgkJCX0KCQl9CgkJdmFyIGQgPSBuZXcgZWxEaWFsb2dGb3JtKG9wdHMpOwoJCWQuYXBwZW5kKHRoaXMuaW5wdXQpLm9wZW4oKTsKCX0KCQoJdGhpcy5wYXN0ZSA9IGZ1bmN0aW9uKCkgewoJCXZhciB0eHQgPSAkLnRyaW0odGhpcy5pbnB1dC52YWwoKSk7CgkJaWYgKHR4dCkgewoJCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoJCQl0aGlzLnJ0ZS5icm93c2VyLm1zaWUgJiYgdGhpcy5ydGUuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7CgkJCXRoaXMucnRlLnNlbGVjdGlvbi5pbnNlcnRUZXh0KHR4dC5yZXBsYWNlKC9ccj9cbi9nLCAnPGJyIC8+JyksIHRydWUpOwoJCQl0aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSk7CgkJfQoJCXRoaXMuaW5wdXQudmFsKCcnKTsKCX0KCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCX0KCQp9Cn0pKGpRdWVyeSk7Ci8qKgogKiBAY2xhc3MgYnV0dG9uIC0gc2F2ZSBlZGl0b3IgY29udGVudCAoc3VibWl0IGZvcm0pCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5zYXZlID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7Cgl0aGlzLmFjdGl2ZSA9IHRydWU7CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCXRoaXMucnRlLnNhdmUoKTsKCX0KCQoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsgfQp9Cn0pKGpRdWVyeSk7Ci8qKgogKiBAY2xhc3MgYnV0dG9uIC0gaW5zZXJ0IHNtaWxleSAob3BlbiBkaWFsb2cgd2luZG93KQogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuAogKgogKiBAYXV0aG9yOiAgICBlU2FiYmF0aAogKgogKiovCihmdW5jdGlvbigkKSB7IAplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuc21pbGV5ID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7Cgl2YXIgc2VsZiA9IHRoaXM7Cgl0aGlzLmltZyA9IG51bGw7Cgl0aGlzLnVybCA9IHRoaXMucnRlLmZpbHRlci51cmwrJ3NtaWxleXMvJzsKCXRoaXMuc21pbGV5cyA9IHsKCQknc21pbGUnIDogJ3NtaWxlLnBuZycsCgkJJ2hhcHB5JyA6ICdoYXBweS5wbmcnLAoJCSd0b25ndWUnIDogJ3Rvbmd1ZS5wbmcnLAoJCSdzdXJwcmlzZWQnIDogJ3N1cnByaXNlZC5wbmcnLAoJCSd3YWlpJyA6ICd3YWlpLnBuZycsCgkJJ3dpbmsnIDogJ3dpbmsucG5nJywKCQknZXZpbGdyaW4nIDogJ2V2aWxncmluLnBuZycsCgkJJ2dyaW4nIDogJ2dyaW4ucG5nJywKCQkKCQkKCQkndW5oYXBweScgOiAndW5oYXBweS5wbmcnCgl9OwoJdGhpcy53aWR0aCA9IDEyMDsKCgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQl2YXIgc2VsZiA9IHRoaXMsIHVybCA9IHRoaXMudXJsLCBkLCBvcHRzLCBpbWc7CgoJCXRoaXMucnRlLmJyb3dzZXIubXNpZSAmJiB0aGlzLnJ0ZS5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTsKCgkJb3B0cyA9IHsKCQkJZGlhbG9nIDogewoJCQkJaGVpZ2h0ICA6IDEyMCwKCQkJCXdpZHRoICAgOiB0aGlzLndpZHRoLAoJCQkJdGl0bGUgICA6IHRoaXMucnRlLmkxOG4oJ1NtaWxleScpLAoJCQkJYnV0dG9ucyA6IHt9CgkJCX0KCQl9CgkJZCA9IG5ldyBlbERpYWxvZ0Zvcm0ob3B0cyk7CgkJJC5lYWNoKHRoaXMuc21pbGV5cywgZnVuY3Rpb24obmFtZSwgaW1nKSB7CgkJCWQuYXBwZW5kKCQoJzxpbWcgc3JjPSInK3VybCtpbWcrJyIgdGl0bGU9IicrbmFtZSsnIiBpZD0iJytuYW1lKyciIGNsYXNzPSJlbC1ydGUtc21pbGV5Ii8+JykuY2xpY2soZnVuY3Rpb24oKSB7IHNlbGYuc2V0KHRoaXMuaWQsIGQpOwl9KSk7CgkJfSk7CgkJZC5vcGVuKCk7Cgl9CgoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CgkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKCX0KCgl0aGlzLnNldCA9IGZ1bmN0aW9uKHMsIGQpIHsKCQl0aGlzLnJ0ZS5icm93c2VyLm1zaWUgJiYgdGhpcy5ydGUuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7CgkJaWYgKHRoaXMuc21pbGV5c1tzXSkgewoJCQl0aGlzLmltZyA9ICQodGhpcy5ydGUuZG9jLmNyZWF0ZUVsZW1lbnQoJ2ltZycpKTsKCQkJdGhpcy5pbWcuYXR0cih7CgkJCQlzcmMgICAgOiB0aGlzLnVybCArIHRoaXMuc21pbGV5c1tzXSwKCQkJCXRpdGxlICA6IHMsCgkJCQlhbHQgICAgOiBzCgkJCX0pOwoJCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0Tm9kZSh0aGlzLmltZy5nZXQoMCkpOwoJCQl0aGlzLnJ0ZS51aS51cGRhdGUoKTsKCQl9CgkJZC5jbG9zZSgpOwoJfQp9Cn0pKGpRdWVyeSk7Ci8qKgogKiBAY2xhc3MgYnV0dG9uIC0gc3RvcHMgZWxlbWVudHMgZmxvYXRpbmcuIEluc2VydCBkaXYgd2l0aCBzdHlsZT0iY2xlYXI6YWxsIgogKiDQldGB0LvQuCDQstGL0LTQtdC70LXQvdC40LUg0YHRhdC70L7Qv9C90YPRgtC+INC4INC90LDRhdC+0LTQuNGC0YHRjyDQstC90YPRgtGA0LggZGl2J2Eg0YEg0LDRgtGC0YDQuNCx0YPRgtC+0Lwg0LjQu9C4IGNzcyBjbGVhciAtINC+0L0g0YPQtNCw0LvRj9C10YLRgdGPCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5zdG9wZmxvYXQgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCgl0aGlzLmZpbmQgPSBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5ydGUuc2VsZWN0aW9uLmNvbGxhcHNlZCgpKSB7CgkJCXZhciBuID0gdGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0RW5kKCksIC9eRElWJC8pOwoJCQlpZiAobiAmJiAodGhpcy5ydGUuZG9tLmF0dHIobiwgJ2NsZWFyJykgfHwgJChuKS5jc3MoJ2NsZWFyJykgIT0gJ25vbmUnKSkgewoJCQkJcmV0dXJuIG47CgkJCX0KCQl9Cgl9CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCXZhciBuOwoJCWlmICgobiA9IHRoaXMuZmluZCgpKSkgewoJCQl2YXIgbiA9ICQobik7CgkJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJCWlmICghbi5jaGlsZHJlbigpLmxlbmd0aCAmJiAhJC50cmltKG4udGV4dCgpKS5sZW5ndGgpIHsKCQkJCW4ucmVtb3ZlKCk7CgkJCX0gZWxzZSB7CgkJCQluLnJlbW92ZUF0dHIoJ2NsZWFyJykuY3NzKCdjbGVhcicsICcnKTsKCQkJfQoJCX0gZWxzZSB7CgkJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJCXRoaXMucnRlLnNlbGVjdGlvbi5pbnNlcnROb2RlKCQodGhpcy5ydGUuZG9tLmNyZWF0ZSgnZGl2JykpLmNzcygnY2xlYXInLCAnYm90aCcpLmdldCgwKSwgdHJ1ZSk7CgkJfQoJCXRoaXMucnRlLnVpLnVwZGF0ZSh0cnVlKTsKCX0KCQoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CgkJaWYgKHRoaXMuZmluZCgpKSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnYWN0aXZlJyk7CgkJfSBlbHNlIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKCQl9Cgl9Cn0KCn0pKGpRdWVyeSk7LyoqCiAqIEBjbGFzcyBidXR0b24gLSBjcmVhdGUvZWRpdCB0YWJsZSAob3BlbiBkaWFsb2cgd2luZG93KQogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKiBDb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy50YWJsZSA9IGZ1bmN0aW9uKHJ0ZSwgbmFtZSkgewoJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJdmFyIHNlbGYgICAgPSB0aGlzOwoJdGhpcy5zcmMgICAgPSBudWxsOwoJdGhpcy5sYWJlbHMgPSBudWxsOwoJCglmdW5jdGlvbiBpbml0KCkgewoJCXNlbGYubGFiZWxzID0gewoJCQltYWluICAgICAgOiAnUHJvcGVyaWVzJywKCQkJYWR2ICAgICAgIDogJ0FkdmFuY2VkJywKCQkJZXZlbnRzICAgIDogJ0V2ZW50cycsCgkJCWlkICAgICAgICA6ICdJRCcsCgkJCSdjbGFzcycgICA6ICdDc3MgY2xhc3MnLAoJCQlzdHlsZSAgICAgOiAnQ3NzIHN0eWxlJywKCQkJZGlyICAgICAgIDogJ1NjcmlwdCBkaXJlY3Rpb24nLAoJCQlzdW1tYXJ5ICAgOiAnU3VtbWFyeScsCgkJCWxhbmcgICAgICA6ICdMYW5ndWFnZScsCgkJCWhyZWYgICAgICA6ICdVUkwnCgkJfQoJCQoJCXNlbGYuc3JjID0gewoJCQltYWluIDogewoJCQkJY2FwdGlvbiA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLAoJCQkJcm93cyAgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoJ3NpemUnLCA1KS52YWwoMiksCgkJCQljb2xzICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cignc2l6ZScsIDUpLnZhbCgyKSwKCQkJCXdpZHRoICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCdzaXplJywgNSksCgkJCQl3dW5pdCAgIDogJCgnPHNlbGVjdCAvPicpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJyUnKS50ZXh0KCclJykpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ3B4JykudGV4dCgncHgnKSksCQkJCQoJCQkJaGVpZ2h0ICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoJ3NpemUnLCA1KSwJCgkJCQlodW5pdCAgIDogJCgnPHNlbGVjdCAvPicpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJyUnKS50ZXh0KCclJykpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ3B4JykudGV4dCgncHgnKSksCQoJCQkJYWxpZ24gICA6ICQoJzxzZWxlY3QgLz4nKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCcnKS50ZXh0KHNlbGYucnRlLmkxOG4oJ05vdCBzZXQnKSkpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ2xlZnQnKS50ZXh0KHNlbGYucnRlLmkxOG4oJ0xlZnQnKSkpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ2NlbnRlcicpLnRleHQoc2VsZi5ydGUuaTE4bignQ2VudGVyJykpKQkKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgncmlnaHQnKS50ZXh0KHNlbGYucnRlLmkxOG4oJ1JpZ2h0JykpKSwJCgkJCQlzcGFjaW5nIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cignc2l6ZScsIDUpLAkKCQkJCXBhZGRpbmcgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCdzaXplJywgNSksCgkJCQlib3JkZXIgIDogJCgnPGRpdiAvPicpLAoJCQkJLy8gZnJhbWUgICA6ICQoJzxzZWxlY3QgLz4nKQoJCQkJLy8gCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCd2b2lkJykudGV4dChzZWxmLnJ0ZS5pMThuKCdObycpKSkKCQkJCS8vIAkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgnYm9yZGVyJykudGV4dChzZWxmLnJ0ZS5pMThuKCdZZXMnKSkpLAoJCQkJcnVsZXMgICA6ICQoJzxzZWxlY3QgLz4nKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdub25lJykudGV4dChzZWxmLnJ0ZS5pMThuKCdObycpKSkKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgnYWxsJykudGV4dChzZWxmLnJ0ZS5pMThuKCdDZWxscycpKSkKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgnZ3JvdXBzJykudGV4dChzZWxmLnJ0ZS5pMThuKCdHcm91cHMnKSkpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ3Jvd3MnKS50ZXh0KHNlbGYucnRlLmkxOG4oJ1Jvd3MnKSkpCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ2NvbHMnKS50ZXh0KHNlbGYucnRlLmkxOG4oJ0NvbHVtbnMnKSkpLAoJCQkJbWFyZ2luICA6ICQoJzxkaXYgLz4nKSwKCQkJCWJnICAgICAgOiAkKCc8ZGl2IC8+JyksCgkJCQliZ2ltZyAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuY3NzKCd3aWR0aCcsICc5MCUnKQoJCQl9LAoJCQkKCQkJYWR2IDogewoJCQkJaWQgICAgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyksCgkJCQlzdW1tYXJ5ICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSwKCQkJCSdjbGFzcycgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLAoJCQkJc3R5bGUgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyksCgkJCQlkaXIgICAgICAgOiAkKCc8c2VsZWN0IC8+JykKCQkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS50ZXh0KHNlbGYucnRlLmkxOG4oJ05vdCBzZXQnKSkudmFsKCcnKSkKCQkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS50ZXh0KHNlbGYucnRlLmkxOG4oJ0xlZnQgdG8gcmlnaHQnKSkudmFsKCdsdHInKSkKCQkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS50ZXh0KHNlbGYucnRlLmkxOG4oJ1JpZ2h0IHRvIGxlZnQnKSkudmFsKCdydGwnKSksCgkJCQlsYW5nICAgICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKQoJCQl9LAoJCQkKCQkJZXZlbnRzIDoge30KCQl9CgkJCgkJJC5lYWNoKHNlbGYuc3JjLCBmdW5jdGlvbigpIHsKCQkJZm9yICh2YXIgbiBpbiB0aGlzKSB7CgkJCQl0aGlzW25dLmF0dHIoJ25hbWUnLCBuKTsKCQkJCXZhciB0ID0gdGhpc1tuXS5nZXQoMCkubm9kZU5hbWU7IAoJCQkJaWYgKHQgPT0gJ0lOUFVUJyAmJiBuICE9ICdiZ2ltZycpIHsKCQkJCQl0aGlzW25dLmNzcyh0aGlzW25dLmF0dHIoJ3NpemUnKSA/IHsndGV4dC1hbGlnbicgOiAncmlnaHQnfSA6IHt3aWR0aCA6ICcxMDAlJ30pOwoJCQkJfSBlbHNlIGlmICh0ID09ICdTRUxFQ1QnICYmIG4hPSd3dW5pdCcgJiYgbiE9J2h1bml0JykgewoJCQkJCXRoaXNbbl0uY3NzKCd3aWR0aCcsICcxMDAlJyk7CgkJCQl9CgkJCX0KCQl9KTsKCQkKCQkkLmVhY2goCgkJCVsnb25ibHVyJywgJ29uZm9jdXMnLCAnb25jbGljaycsICdvbmRibGNsaWNrJywgJ29ubW91c2Vkb3duJywgJ29ubW91c2V1cCcsICdvbm1vdXNlb3ZlcicsICdvbm1vdXNlb3V0JywgJ29ubW91c2VsZWF2ZScsICdvbmtleWRvd24nLCAnb25rZXlwcmVzcycsICdvbmtleXVwJ10sIAoJCQlmdW5jdGlvbigpIHsKCQkJCXNlbGYuc3JjLmV2ZW50c1t0aGlzXSA9ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoJ25hbWUnLCB0aGlzKS5jc3MoJ3dpZHRoJywgJzEwMCUnKTsKCQl9KTsKCQkKCQlzZWxmLnNyYy5tYWluLmFsaWduLmNoYW5nZShmdW5jdGlvbigpIHsKCQkJdmFyIHYgPSAkKHRoaXMpLnZhbCgpOwoJCQlpZiAodiA9PSAnY2VudGVyJykgewoJCQkJc2VsZi5zcmMubWFpbi5tYXJnaW4udmFsKHtsZWZ0IDogJ2F1dG8nLCByaWdodCA6ICdhdXRvJ30pOwoJCQl9IGVsc2UgewoJCQkJdmFyIG0gPSBzZWxmLnNyYy5tYWluLm1hcmdpbi52YWwoKTsKCQkJCWlmIChtLmxlZnQgPT0gJ2F1dG8nICYmIG0ucmlnaHQgPT0gJ2F1dG8nKSB7CgkJCQkJc2VsZi5zcmMubWFpbi5tYXJnaW4udmFsKHtsZWZ0IDogJycsIHJpZ2h0IDogJyd9KTsKCQkJCX0KCQkJfQoJCX0pOwoJCQoJCXNlbGYuc3JjLm1haW4uYmdpbWcuY2hhbmdlKGZ1bmN0aW9uKCkgewoJCQl2YXIgdCA9ICQodGhpcyk7CgkJCXQudmFsKHNlbGYucnRlLnV0aWxzLmFic29sdXRlVVJMKHQudmFsKCkpKTsKCQl9KQoJCQoJfQoJCgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQl2YXIgbiA9IHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgL15UQUJMRSQvKTsKCQkKCQlpZiAodGhpcy5uYW1lID09ICd0YWJsZScpIHsKCQkJdGhpcy50YWJsZSA9ICQodGhpcy5ydGUuZG9jLmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJykpOwkKCQl9IGVsc2UgewoJCQl0aGlzLnRhYmxlID0gbiA/ICQobikgOiAkKHRoaXMucnRlLmRvYy5jcmVhdGVFbGVtZW50KCd0YWJsZScpKTsJCQkJCQoJCX0KCQkKCQkhdGhpcy5zcmMgJiYgaW5pdCgpOwoJCXRoaXMuc3JjLm1haW4uYm9yZGVyLmVsQm9yZGVyU2VsZWN0KHtzdHlsZUhlaWdodCA6IDExN30pOwoJCXRoaXMuc3JjLm1haW4uYmcuZWxDb2xvclBpY2tlcih7cGFsZXR0ZVBvc2l0aW9uIDogJ291dGVyJywgJ2NsYXNzJyA6ICdlbC1jb2xvcnBpY2tlciB1aS1pY29uIHVpLWljb24tcGVuY2lsJ30pOwoJCXRoaXMuc3JjLm1haW4ubWFyZ2luLmVsUGFkZGluZ0lucHV0KHsgdHlwZSA6ICdtYXJnaW4nLCB2YWx1ZSA6IHRoaXMudGFibGV9KTsKCQkKCQlpZiAodGhpcy50YWJsZS5wYXJlbnRzKCkubGVuZ3RoKSB7CgkJCXRoaXMuc3JjLm1haW4ucm93cy52YWwoJycpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CgkJCXRoaXMuc3JjLm1haW4uY29scy52YWwoJycpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5zcmMubWFpbi5yb3dzLnZhbCgyKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpOwoJCQl0aGlzLnNyYy5tYWluLmNvbHMudmFsKDIpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CgkJfQoJCQoJCXZhciB3ID0gdGhpcy50YWJsZS5jc3MoJ3dpZHRoJykgfHwgdGhpcy50YWJsZS5hdHRyKCd3aWR0aCcpOwoJCXRoaXMuc3JjLm1haW4ud2lkdGgudmFsKHBhcnNlSW50KHcpfHwnJyk7CgkJdGhpcy5zcmMubWFpbi53dW5pdC52YWwody5pbmRleE9mKCdweCcpICE9IC0xID8gJ3B4JyA6ICclJyk7CgkJCgkJdmFyIGggPSB0aGlzLnRhYmxlLmNzcygnaGVpZ2h0JykgfHwgdGhpcy50YWJsZS5hdHRyKCdoZWlnaHQnKTsJCgkJdGhpcy5zcmMubWFpbi5oZWlnaHQudmFsKHBhcnNlSW50KGgpfHwnJyk7CgkJdGhpcy5zcmMubWFpbi5odW5pdC52YWwoaCAmJiBoLmluZGV4T2YoJ3B4JykgIT0gLTEgPyAncHgnIDogJyUnKTsKCgkJdmFyIGYgPSB0aGlzLnRhYmxlLmNzcygnZmxvYXQnKTsKCQl0aGlzLnNyYy5tYWluLmFsaWduLnZhbCgnJyk7CgkJaWYgKGYgPT0gJ2xlZnQnIHx8IGYgPT0gJ3JpZ2h0JykgewoJCQl0aGlzLnNyYy5tYWluLmFsaWduLnZhbChmKTsKCQl9IGVsc2UgewoJCQl2YXIgbWwgPSB0aGlzLnRhYmxlLmNzcygnbWFyZ2luLWxlZnQnKTsKCQkJdmFyIG1yID0gdGhpcy50YWJsZS5jc3MoJ21hcmdpbi1yaWdodCcpOwoJCQlpZiAobWwgPT0gJ2F1dG8nICYmIG1yID09ICdhdXRvJykgewoJCQkJdGhpcy5zcmMubWFpbi5hbGlnbi52YWwoJ2NlbnRlcicpOwoJCQl9CgkJfQoKCQl0aGlzLnNyYy5tYWluLmJvcmRlci52YWwodGhpcy50YWJsZSk7CgkJLy90aGlzLnNyYy5tYWluLmZyYW1lLnZhbCh0aGlzLnRhYmxlLmF0dHIoJ2ZyYW1lJykpOwoJCXRoaXMuc3JjLm1haW4ucnVsZXMudmFsKHRoaXMucnRlLmRvbS5hdHRyKHRoaXMudGFibGUuZ2V0KDApLCAncnVsZXMnKSk7CgoJCXRoaXMuc3JjLm1haW4uYmcudmFsKHRoaXMudGFibGUuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJykpOwoJCXZhciBiZ2ltZyA9ICh0aGlzLnRhYmxlLmNzcygnYmFja2dyb3VuZC1pbWFnZScpfHwnJykucmVwbGFjZSgvdXJsXCgoW15cKV0rKVwpL2ksICIkMSIpOwoJCXRoaXMuc3JjLm1haW4uYmdpbWcudmFsKGJnaW1nIT0nbm9uZScgPyBiZ2ltZyA6ICcnKTsKCgkJdmFyIG9wdHMgPSB7CgkJCXJ0bCA6IHRoaXMucnRlLnJ0bCwKCQkJc3VibWl0IDogZnVuY3Rpb24oZSwgZCkgeyBlLnN0b3BQcm9wYWdhdGlvbigpOyBlLnByZXZlbnREZWZhdWx0KCk7IHNlbGYuc2V0KCk7IGQuY2xvc2UoKTsgfSwKCQkJZGlhbG9nIDogewoJCQkJd2lkdGggOiA1MzAsCgkJCQl0aXRsZSA6IHRoaXMucnRlLmkxOG4oJ1RhYmxlJykKCQkJfQoJCX0KCQl2YXIgZCA9IG5ldyBlbERpYWxvZ0Zvcm0ob3B0cyk7CgkJCgkJZm9yICh2YXIgdGFiIGluIHRoaXMuc3JjKSB7CgkJCWQudGFiKHRhYiwgdGhpcy5ydGUuaTE4bih0aGlzLmxhYmVsc1t0YWJdKSk7CgkJCWlmICh0YWIgPT0gJ21haW4nKSB7CgkJCQl2YXIgdDEgPSAkKCc8dGFibGUgLz4nKQoJCQkJCS5hcHBlbmQoJCgnPHRyIC8+JykuYXBwZW5kKCc8dGQ+Jyt0aGlzLnJ0ZS5pMThuKCdSb3dzJykrJzwvdGQ+JykuYXBwZW5kKCQoJzx0ZCAvPicpLmFwcGVuZCh0aGlzLnNyYy5tYWluLnJvd3MpKSkKCQkJCQkuYXBwZW5kKCQoJzx0ciAvPicpLmFwcGVuZCgnPHRkPicrdGhpcy5ydGUuaTE4bignQ29sdW1ucycpKyc8L3RkPicpLmFwcGVuZCgkKCc8dGQgLz4nKS5hcHBlbmQodGhpcy5zcmMubWFpbi5jb2xzKSkpOwoJCQkJdmFyIHQyID0gJCgnPHRhYmxlIC8+JykKCQkJCQkuYXBwZW5kKCQoJzx0ciAvPicpLmFwcGVuZCgnPHRkPicrdGhpcy5ydGUuaTE4bignV2lkdGgnKSsnPC90ZD4nKS5hcHBlbmQoJCgnPHRkIC8+JykuYXBwZW5kKHRoaXMuc3JjLm1haW4ud2lkdGgpLmFwcGVuZCh0aGlzLnNyYy5tYWluLnd1bml0KSkpCgkJCQkJLmFwcGVuZCgkKCc8dHIgLz4nKS5hcHBlbmQoJzx0ZD4nK3RoaXMucnRlLmkxOG4oJ0hlaWdodCcpKyc8L3RkPicpLmFwcGVuZCgkKCc8dGQgLz4nKS5hcHBlbmQodGhpcy5zcmMubWFpbi5oZWlnaHQpLmFwcGVuZCh0aGlzLnNyYy5tYWluLmh1bml0KSkpOwoJCQkJdmFyIHQzID0gJCgnPHRhYmxlIC8+JykKCQkJCQkuYXBwZW5kKCQoJzx0ciAvPicpLmFwcGVuZCgnPHRkPicrdGhpcy5ydGUuaTE4bignU3BhY2luZycpKyc8L3RkPicpLmFwcGVuZCgkKCc8dGQgLz4nKS5hcHBlbmQodGhpcy5zcmMubWFpbi5zcGFjaW5nLnZhbCh0aGlzLnRhYmxlLmF0dHIoJ2NlbGxzcGFjaW5nJyl8fCcnKSkpKQoJCQkJCS5hcHBlbmQoJCgnPHRyIC8+JykuYXBwZW5kKCc8dGQ+Jyt0aGlzLnJ0ZS5pMThuKCdQYWRkaW5nJykrJzwvdGQ+JykuYXBwZW5kKCQoJzx0ZCAvPicpLmFwcGVuZCh0aGlzLnNyYy5tYWluLnBhZGRpbmcudmFsKHRoaXMudGFibGUuYXR0cignY2VsbHBhZGRpbmcnKXx8JycpKSkpOwoJCQkJCgkJCQlkLmFwcGVuZChbdGhpcy5ydGUuaTE4bignQ2FwdGlvbicpLCB0aGlzLnNyYy5tYWluLmNhcHRpb24udmFsKHRoaXMudGFibGUuZmluZCgnY2FwdGlvbicpLmVxKDApLnRleHQoKSB8fCAnJyldLCAnbWFpbicsIHRydWUpCgkJCQkJLnNlcGFyYXRvcignbWFpbicpCgkJCQkJLmFwcGVuZChbdDEsIHQyLCB0M10sICdtYWluJywgdHJ1ZSkKCQkJCQkuc2VwYXJhdG9yKCdtYWluJykKCQkJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdCb3JkZXInKSwgICAgICAgIHRoaXMuc3JjLm1haW4uYm9yZGVyXSwgJ21haW4nLCB0cnVlKQoJCQkJCS8vLmFwcGVuZChbdGhpcy5ydGUuaTE4bignRnJhbWUnKSwgICAgICAgdGhpcy5zcmMubWFpbi5mcmFtZV0sICdtYWluJywgdHJ1ZSkKCQkJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdJbm5lciBib3JkZXJzJyksIHRoaXMuc3JjLm1haW4ucnVsZXNdLCAnbWFpbicsIHRydWUpCgkJCQkJLmFwcGVuZChbdGhpcy5ydGUuaTE4bignQWxpZ25tZW50JyksICAgICB0aGlzLnNyYy5tYWluLmFsaWduXSwgJ21haW4nLCB0cnVlKQoJCQkJCS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ01hcmdpbnMnKSwgICAgICAgdGhpcy5zcmMubWFpbi5tYXJnaW5dLCAnbWFpbicsIHRydWUpCgkJCQkJLmFwcGVuZChbdGhpcy5ydGUuaTE4bignQmFja2dyb3VuZCcpLCAgICAkKCc8c3BhbiAvPicpLmFwcGVuZCgkKCc8c3BhbiAvPicpLmNzcyh7J2Zsb2F0JyA6ICdsZWZ0JywgJ21hcmdpbi1yaWdodCcgOiAnM3B4J30pLmFwcGVuZCh0aGlzLnNyYy5tYWluLmJnKSkuYXBwZW5kKHRoaXMuc3JjLm1haW4uYmdpbWcpXSwgJ21haW4nLCB0cnVlKQoJCQl9IGVsc2UgewoJCQkJZm9yICh2YXIgbmFtZSBpbiB0aGlzLnNyY1t0YWJdKSB7CgkJCQkJdmFyIHYgPSB0aGlzLnJ0ZS5kb20uYXR0cih0aGlzLnRhYmxlLCBuYW1lKTsKCQkJCQlpZiAodGFiID09ICdldmVudHMnKSB7CgkJCQkJCXYgPSB0aGlzLnJ0ZS51dGlscy50cmltRXZlbnRDYWxsYmFjayh2KTsKCQkJCQl9IAoJCQkJCWQuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKHRoaXMubGFiZWxzW25hbWVdID8gdGhpcy5sYWJlbHNbbmFtZV0gOiBuYW1lKSwgdGhpcy5zcmNbdGFiXVtuYW1lXS52YWwodildLCB0YWIsIHRydWUpOwoJCQkJfQoJCQl9CgkJfQoJCQoJCWQub3BlbigpOwoJfQoJCgl0aGlzLnNldCA9IGZ1bmN0aW9uKCkgewoJCQoJCWlmICghdGhpcy50YWJsZS5wYXJlbnRzKCkubGVuZ3RoKSB7CgkJCXZhciByID0gcGFyc2VJbnQodGhpcy5zcmMubWFpbi5yb3dzLnZhbCgpKSB8fCAwOwoJCQl2YXIgYyA9IHBhcnNlSW50KHRoaXMuc3JjLm1haW4uY29scy52YWwoKSkgfHwgMDsKCQkJaWYgKHI8PTAgfHwgYzw9MCkgewoJCQkJcmV0dXJuOwoJCQl9CgkJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7IAoJCQl2YXIgYiA9ICQodGhpcy5ydGUuZG9jLmNyZWF0ZUVsZW1lbnQoJ3Rib2R5JykpLmFwcGVuZFRvKHRoaXMudGFibGUpOwoJCQkKCQkJZm9yICh2YXIgaT0wOyBpIDwgcjsgaSsrKSB7CgkJCQl2YXIgdHIgPSAnPHRyPic7CgkJCQlmb3IgKHZhciBqPTA7IGogPCBjOyBqKyspIHsKCQkJCQl0ciArPSAnPHRkPiZuYnNwOzwvdGQ+JzsKCQkJCX0KCQkJCWIuYXBwZW5kKHRyKyc8L3RyPicpOwoJCQl9OwoJCQkKCQkJLy8gdmFyIHRyID0gJCh0aGlzLnJ0ZS5kb2MuY3JlYXRlRWxlbWVudCgndHInKSk7CgkJCS8vIAoJCQkvLyBmb3IgKHZhciBpPTA7IGkgPCBjOyBpKyspIHsKCQkJLy8gCXRyLmFwcGVuZCgkKHRoaXMucnRlLmRvYy5jcmVhdGVFbGVtZW50KCd0ZCcpKS5odG1sKCcmbmJzcDsnKSk7CgkJCS8vIH07CgkJCS8vIAoJCQkvLyBmb3IgKHZhciBpPTA7IGk8cjsgaSsrKSB7CgkJCS8vIAliLmFwcGVuZCh0ci5jbG9uZSh0cnVlKSk7CgkJCS8vIH07CgkJCQoJCQkvLyB0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0Tm9kZSh0aGlzLnRhYmxlLmdldCgwKSwgdHJ1ZSk7CgkJfSBlbHNlIHsKCQkJdGhpcy50YWJsZQoJCQkJLnJlbW92ZUF0dHIoJ3dpZHRoJykKCQkJCS5yZW1vdmVBdHRyKCdoZWlnaHQnKQoJCQkJLnJlbW92ZUF0dHIoJ2JvcmRlcicpCgkJCQkucmVtb3ZlQXR0cignYWxpZ24nKQoJCQkJLnJlbW92ZUF0dHIoJ2JvcmRlcmNvbG9yJykKCQkJCS5yZW1vdmVBdHRyKCdiZ2NvbG9yJykKCQkJCS5yZW1vdmVBdHRyKCdjZWxsc3BhY2luZycpCgkJCQkucmVtb3ZlQXR0cignY2VsbHBhZGRpbmcnKQoJCQkJLnJlbW92ZUF0dHIoJ2ZyYW1lJykKCQkJCS5yZW1vdmVBdHRyKCdydWxlcycpCgkJCQkucmVtb3ZlQXR0cignc3R5bGUnKTsKCQl9CgkJCgkJdmFyIGNhcCA9ICQudHJpbSh0aGlzLnNyYy5tYWluLmNhcHRpb24udmFsKCkpOwoJCWlmIChjYXApIHsKCQkJaWYgKCF0aGlzLnRhYmxlLmNoaWxkcmVuKCdjYXB0aW9uJykubGVuZ3RoKSB7CgkJCQl0aGlzLnRhYmxlLnByZXBlbmQoJzxjYXB0aW9uIC8+JyApOwoJCQl9CgkJCXRoaXMudGFibGUuY2hpbGRyZW4oJ2NhcHRpb24nKS50ZXh0KGNhcCk7CgkJfSBlbHNlIHsKCQkJdGhpcy50YWJsZS5jaGlsZHJlbignY2FwdGlvbicpLnJlbW92ZSgpOwoJCX0KCQkKCQkKCQlmb3IgKHZhciB0YWIgaW4gdGhpcy5zcmMpIHsKCQkJaWYgKHRhYiAhPSAnbWFpbicpIHsKCQkJCWZvciAodmFyIG4gaW4gdGhpcy5zcmNbdGFiXSkgewoJCQkJCXZhciB2ID0gJC50cmltKHRoaXMuc3JjW3RhYl1bbl0udmFsKCkpOwoJCQkJCWlmICh2KSB7CgkJCQkJCXRoaXMudGFibGUuYXR0cihuLCB2KTsKCQkJCQl9IGVsc2UgewoJCQkJCQl0aGlzLnRhYmxlLnJlbW92ZUF0dHIobik7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCXZhciBzcGFjaW5nLCBwYWRkaW5nLCBydWxlczsKCgkJaWYgKChzcGFjaW5nID0gcGFyc2VJbnQodGhpcy5zcmMubWFpbi5zcGFjaW5nLnZhbCgpKSkgJiYgc3BhY2luZz49MCkgewoJCQl0aGlzLnRhYmxlLmF0dHIoJ2NlbGxzcGFjaW5nJywgc3BhY2luZyk7CgkJfSAKCgkJaWYgKChwYWRkaW5nID0gcGFyc2VJbnQodGhpcy5zcmMubWFpbi5wYWRkaW5nLnZhbCgpKSkgJiYgcGFkZGluZz49MCkgewoJCQl0aGlzLnRhYmxlLmF0dHIoJ2NlbGxwYWRkaW5nJywgcGFkZGluZyk7CgkJfSAKCQkKCQlpZiAoKHJ1bGVzID0gdGhpcy5zcmMubWFpbi5ydWxlcy52YWwoKSkpIHsKCQkJdGhpcy50YWJsZS5hdHRyKCdydWxlcycsIHJ1bGVzKTsKCQl9CgkJCgkJdmFyCgkJCXcgPSBwYXJzZUludCh0aGlzLnNyYy5tYWluLndpZHRoLnZhbCgpKSB8fCAnJywKCQkJaCA9IHBhcnNlSW50KHRoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbCgpKSB8fCAnJywKCQkJaSA9ICQudHJpbSh0aGlzLnNyYy5tYWluLmJnaW1nLnZhbCgpKSwKCQkJYiA9IHRoaXMuc3JjLm1haW4uYm9yZGVyLnZhbCgpLAoJCQltID0gdGhpcy5zcmMubWFpbi5tYXJnaW4udmFsKCksCgkJCWYgPSB0aGlzLnNyYy5tYWluLmFsaWduLnZhbCgpOwoJCXRoaXMudGFibGUuY3NzKHsKCQkJd2lkdGggICAgICAgICAgICAgIDogdyA/IHcrdGhpcy5zcmMubWFpbi53dW5pdC52YWwoKSA6ICcnLAoJCQloZWlnaHQgICAgICAgICAgICAgOiBoID8gaCt0aGlzLnNyYy5tYWluLmh1bml0LnZhbCgpIDogJycsCgkJCWJvcmRlciAgICAgICAgICAgICA6ICQudHJpbShiLndpZHRoKycgJytiLnN0eWxlKycgJytiLmNvbG9yKSwKCQkJJ2JhY2tncm91bmQtY29sb3InIDogdGhpcy5zcmMubWFpbi5iZy52YWwoKSwKCQkJJ2JhY2tncm91bmQtaW1hZ2UnIDogaSA/ICd1cmwoJytpKycpJyA6ICcnCgkJfSk7CQoJCWlmIChtLmNzcykgewoJCQl0aGlzLnRhYmxlLmNzcygnbWFyZ2luJywgbS5jc3MpOwoJCX0gZWxzZSB7CgkJCXRoaXMudGFibGUuY3NzKHsKCQkJCSdtYXJnaW4tdG9wJyAgICA6IG0udG9wLAoJCQkJJ21hcmdpbi1yaWdodCcgIDogbS5yaWdodCwKCQkJCSdtYXJnaW4tYm90dG9tJyA6IG0uYm90dG9tLAoJCQkJJ21hcmdpbi1sZWZ0JyAgIDogbS5sZWZ0CgkJCX0pOwoJCX0KCQlpZiAoKGY9PSdsZWZ0JyB8fCBmPT0ncmlnaHQnKSAmJiB0aGlzLnRhYmxlLmNzcygnbWFyZ2luLWxlZnQnKSE9J2F1dG8nICAmJiB0aGlzLnRhYmxlLmNzcygnbWFyZ2luLXJpZ2h0JykhPSdhdXRvJykgewoJCQl0aGlzLnRhYmxlLmNzcygnZmxvYXQnLCBmKTsKCQl9CgkJaWYgKCF0aGlzLnRhYmxlLmF0dHIoJ3N0eWxlJykpIHsKCQkJdGhpcy50YWJsZS5yZW1vdmVBdHRyKCdzdHlsZScpOwoJCX0KCQlpZiAoIXRoaXMudGFibGUucGFyZW50cygpLmxlbmd0aCkgewoJCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0Tm9kZSh0aGlzLnRhYmxlLmdldCgwKSwgdHJ1ZSk7CgkJfQoJCXRoaXMucnRlLnVpLnVwZGF0ZSgpOwoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKCQlpZiAodGhpcy5uYW1lID09ICd0YWJsZXByb3BzJyAmJiAhdGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCAvXlRBQkxFJC8pKSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7CgkJfQoJfQoJCn0KCmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy50YWJsZXByb3BzID0gZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnRhYmxlOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBAY2xhc3MgYnV0dG9uIC0gcmVtb3ZlIHRhYmxlCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy50YWJsZXJtID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCXZhciB0ID0gdGhpcy5ydGUuZG9tLnBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCAvXlRBQkxFJC8pOwoJCS8vIHQgJiYgJCh0KS5yZW1vdmUoKTsKCQlpZiAodCkgewoJCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoJCQkkKHQpLnJlbW92ZSgpOwoJCX0KCQl0aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSk7Cgl9CgkKCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMucnRlLmRvbS5wYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgL15UQUJMRSQvKSkgewoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CgkJfSBlbHNlIHsKCQkJdGhpcy5kb21FbGVtLmFkZENsYXNzKCdkaXNhYmxlZCcpOwoJCX0KCX0KfQp9KShqUXVlcnkpOwovKioKICogQGNsYXNzIGJ1dHRvbiAtIHRhYmxlIGNlbGwgcHJvcGVydGllcwogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICoKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKiBAY29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUKICoqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGJjZWxscHJvcHMgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCXZhciBzZWxmID0gdGhpczsKCXRoaXMuc3JjID0gbnVsbDsKCXRoaXMubGFiZWxzID0gbnVsbDsKCQoJZnVuY3Rpb24gaW5pdCgpIHsKCQlzZWxmLmxhYmVscyA9IHsKCQkJbWFpbiAgICA6ICdQcm9wZXJpZXMnLAoJCQlhZHYgICAgIDogJ0FkdmFuY2VkJywKCQkJZXZlbnRzICA6ICdFdmVudHMnLAoJCQlpZCAgICAgIDogJ0lEJywKCQkJJ2NsYXNzJyA6ICdDc3MgY2xhc3MnLAoJCQlzdHlsZSAgIDogJ0NzcyBzdHlsZScsCgkJCWRpciAgICAgOiAnU2NyaXB0IGRpcmVjdGlvbicsCgkJCWxhbmcgICAgOiAnTGFuZ3VhZ2UnCgkJfQoJCQoJCXNlbGYuc3JjID0gewoJCQltYWluIDogewoJCQkJdHlwZSAgICA6ICQoJzxzZWxlY3QgLz4nKS5jc3MoJ3dpZHRoJywgJzEwMCUnKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCd0ZCcpLnRleHQoc2VsZi5ydGUuaTE4bignRGF0YScpKSkKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgndGgnKS50ZXh0KHNlbGYucnRlLmkxOG4oJ0hlYWRlcicpKSksCgkJCQl3aWR0aCAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cignc2l6ZScsIDQpLAoJCQkJd3VuaXQgICA6ICQoJzxzZWxlY3QgLz4nKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCclJykudGV4dCgnJScpKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdweCcpLnRleHQoJ3B4JykpLAkJCQkKCQkJCWhlaWdodCAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCdzaXplJywgNCksCQoJCQkJaHVuaXQgICA6ICQoJzxzZWxlY3QgLz4nKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCclJykudGV4dCgnJScpKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdweCcpLnRleHQoJ3B4JykpLAkKCQkJCWFsaWduICAgOiAkKCc8c2VsZWN0IC8+JykuY3NzKCd3aWR0aCcsICcxMDAlJykKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgnJykudGV4dChzZWxmLnJ0ZS5pMThuKCdOb3Qgc2V0JykpKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdsZWZ0JykudGV4dChzZWxmLnJ0ZS5pMThuKCdMZWZ0JykpKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdjZW50ZXInKS50ZXh0KHNlbGYucnRlLmkxOG4oJ0NlbnRlcicpKSkJCgkJCQkJCQkuYXBwZW5kKCQoJzxvcHRpb24gLz4nKS52YWwoJ3JpZ2h0JykudGV4dChzZWxmLnJ0ZS5pMThuKCdSaWdodCcpKSkKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgnanVzdGlmeScpLnRleHQoc2VsZi5ydGUuaTE4bignSnVzdGlmeScpKSksCQoJCQkJYm9yZGVyICA6ICQoJzxkaXYgLz4nKSwKCQkJCXBhZGRpbmcgIDogJCgnPGRpdiAvPicpLAoJCQkJYmcgICAgICA6ICQoJzxkaXYgLz4nKSwKCQkJCWJnaW1nICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoJ3dpZHRoJywgJzkwJScpLAoJCQkJYXBwbHkgICA6ICQoJzxzZWxlY3QgLz4nKS5jc3MoJ3dpZHRoJywgJzEwMCUnKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCcnKS50ZXh0KHNlbGYucnRlLmkxOG4oJ0N1cnJlbnQgY2VsbCcpKSkKCQkJCQkJCS5hcHBlbmQoJCgnPG9wdGlvbiAvPicpLnZhbCgncm93JykudGV4dChzZWxmLnJ0ZS5pMThuKCdBbGwgY2VsbHMgaW4gcm93JykpKQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCdjb2x1bW4nKS50ZXh0KHNlbGYucnRlLmkxOG4oJ0FsbCBjZWxscyBpbiBjb2x1bW4nKSkpCQoJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudmFsKCd0YWJsZScpLnRleHQoc2VsZi5ydGUuaTE4bignQWxsIGNlbGxzIGluIHRhYmxlJykpKQoJCQl9LAoJCQkKCQkJYWR2IDogewoJCQkJaWQgICAgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JyksCgkJCQknY2xhc3MnICAgOiAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSwKCQkJCXN0eWxlICAgICA6ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLAoJCQkJZGlyICAgICAgIDogJCgnPHNlbGVjdCAvPicpLmNzcygnd2lkdGgnLCAnMTAwJScpCgkJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudGV4dChzZWxmLnJ0ZS5pMThuKCdOb3Qgc2V0JykpLnZhbCgnJykpCgkJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudGV4dChzZWxmLnJ0ZS5pMThuKCdMZWZ0IHRvIHJpZ2h0JykpLnZhbCgnbHRyJykpCgkJCQkJCQkJLmFwcGVuZCgkKCc8b3B0aW9uIC8+JykudGV4dChzZWxmLnJ0ZS5pMThuKCdSaWdodCB0byBsZWZ0JykpLnZhbCgncnRsJykpLAoJCQkJbGFuZyAgICAgIDogJCgnPGlucHV0IHR5cGU9InRleHQiIC8+JykKCQkJfSwKCQkJCgkJCWV2ZW50cyA6IHt9CgkJfQoJCQoJCSQuZWFjaChzZWxmLnNyYywgZnVuY3Rpb24oKSB7CgkJCWZvciAodmFyIG4gaW4gdGhpcykgewoJCQkJdGhpc1tuXS5hdHRyKCduYW1lJywgbik7CgkJCQlpZiAodGhpc1tuXS5hdHRyKCd0eXBlJykgPT0gJ3RleHQnICYmICF0aGlzW25dLmF0dHIoJ3NpemUnKSAmJiBuIT0nYmdpbWcnKSB7CgkJCQkJdGhpc1tuXS5jc3MoJ3dpZHRoJywgJzEwMCUnKQoJCQkJfQoJCQl9CgkJfSk7CgkJCgkJJC5lYWNoKAoJCQlbJ29uYmx1cicsICdvbmZvY3VzJywgJ29uY2xpY2snLCAnb25kYmxjbGljaycsICdvbm1vdXNlZG93bicsICdvbm1vdXNldXAnLCAnb25tb3VzZW92ZXInLCAnb25tb3VzZW91dCcsICdvbm1vdXNlbGVhdmUnLCAnb25rZXlkb3duJywgJ29ua2V5cHJlc3MnLCAnb25rZXl1cCddLCAKCQkJZnVuY3Rpb24oKSB7CgkJCQlzZWxmLnNyYy5ldmVudHNbdGhpc10gPSAkKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCduYW1lJywgdGhpcykuY3NzKCd3aWR0aCcsICcxMDAlJyk7CgkJfSk7CgkJCgl9CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCSF0aGlzLnNyYyAmJiBpbml0KCk7CgkJdGhpcy5jZWxsID0gdGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCAvXihURHxUSCkkLyk7CgkJaWYgKCF0aGlzLmNlbGwpIHsKCQkJcmV0dXJuOwoJCX0KCQl0aGlzLnNyYy5tYWluLnR5cGUudmFsKHRoaXMuY2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTsKCQl0aGlzLmNlbGwgPSAkKHRoaXMuY2VsbCk7CgkJdGhpcy5zcmMubWFpbi5ib3JkZXIuZWxCb3JkZXJTZWxlY3Qoe3N0eWxlSGVpZ2h0IDogMTE3LCB2YWx1ZSA6IHRoaXMuY2VsbH0pOwoJCXRoaXMuc3JjLm1haW4uYmcuZWxDb2xvclBpY2tlcih7cGFsZXR0ZVBvc2l0aW9uIDogJ291dGVyJywgJ2NsYXNzJyA6ICdlbC1jb2xvcnBpY2tlciB1aS1pY29uIHVpLWljb24tcGVuY2lsJ30pOwoJCXRoaXMuc3JjLm1haW4ucGFkZGluZy5lbFBhZGRpbmdJbnB1dCh7IHZhbHVlIDogdGhpcy5jZWxsfSk7CgkJCgkJdmFyIHcgPSB0aGlzLmNlbGwuY3NzKCd3aWR0aCcpIHx8IHRoaXMuY2VsbC5hdHRyKCd3aWR0aCcpOwoJCXRoaXMuc3JjLm1haW4ud2lkdGgudmFsKHBhcnNlSW50KHcpfHwnJyk7CgkJdGhpcy5zcmMubWFpbi53dW5pdC52YWwody5pbmRleE9mKCdweCcpICE9IC0xID8gJ3B4JyA6ICclJyk7CgkJCgkJdmFyIGggPSB0aGlzLmNlbGwuY3NzKCdoZWlnaHQnKSB8fCB0aGlzLmNlbGwuYXR0cignaGVpZ2h0Jyk7CQoJCXRoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbChwYXJzZUludChoKXx8JycpOwoJCXRoaXMuc3JjLm1haW4uaHVuaXQudmFsKGguaW5kZXhPZigncHgnKSAhPSAtMSA/ICdweCcgOiAnJScpOwoJCQoJCXRoaXMuc3JjLm1haW4uYWxpZ24udmFsKHRoaXMuY2VsbC5hdHRyKCdhbGlnbicpIHx8IHRoaXMuY2VsbC5jc3MoJ3RleHQtYWxpZ24nKSk7CgkJdGhpcy5zcmMubWFpbi5iZy52YWwodGhpcy5jZWxsLmNzcygnYmFja2dyb3VuZC1jb2xvcicpKTsKCQl2YXIgYmdpbWcgPSB0aGlzLmNlbGwuY3NzKCdiYWNrZ3JvdW5kLWltYWdlJyk7CgkJdGhpcy5zcmMubWFpbi5iZ2ltZy52YWwoYmdpbWcgJiYgYmdpbWchPSdub25lJyA/IGJnaW1nLnJlcGxhY2UoL3VybFwoKFteXCldKylcKS9pLCAiJDEiKSA6ICcnKTsKCQl0aGlzLnNyYy5tYWluLmFwcGx5LnZhbCgnJyk7CgkJCgkJdmFyIG9wdHMgPSB7CgkJCXJ0bCA6IHRoaXMucnRlLnJ0bCwKCQkJc3VibWl0IDogZnVuY3Rpb24oZSwgZCkgeyBlLnN0b3BQcm9wYWdhdGlvbigpOyBlLnByZXZlbnREZWZhdWx0KCk7IHNlbGYuc2V0KCk7IGQuY2xvc2UoKTsgfSwKCQkJZGlhbG9nIDogewoJCQkJd2lkdGggOiA1MjAsCgkJCQl0aXRsZSA6IHRoaXMucnRlLmkxOG4oJ1RhYmxlIGNlbGwgcHJvcGVydGllcycpCgkJCX0KCQl9CgkJdmFyIGQgPSBuZXcgZWxEaWFsb2dGb3JtKG9wdHMpOwoJCWZvciAodmFyIHRhYiBpbiB0aGlzLnNyYykgewoJCQlkLnRhYih0YWIsIHRoaXMucnRlLmkxOG4odGhpcy5sYWJlbHNbdGFiXSkpOwoJCQkKCQkJaWYgKHRhYiA9PSAnbWFpbicpIHsKCQkJCWQuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdXaWR0aCcpLCAgICAgICAgICAgICAgJCgnPHNwYW4gLz4nKS5hcHBlbmQodGhpcy5zcmMubWFpbi53aWR0aCkuYXBwZW5kKHRoaXMuc3JjLm1haW4ud3VuaXQpXSwgICdtYWluJywgdHJ1ZSkKCQkJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdIZWlnaHQnKSwgICAgICAgICAgJCgnPHNwYW4gLz4nKS5hcHBlbmQodGhpcy5zcmMubWFpbi5oZWlnaHQpLmFwcGVuZCh0aGlzLnNyYy5tYWluLmh1bml0KV0sICdtYWluJywgdHJ1ZSkKCQkJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdUYWJsZSBjZWxsIHR5cGUnKSwgdGhpcy5zcmMubWFpbi50eXBlXSwgICAgJ21haW4nLCB0cnVlKQoJCQkJCS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ0JvcmRlcicpLCAgICAgICAgICB0aGlzLnNyYy5tYWluLmJvcmRlcl0sICAnbWFpbicsIHRydWUpCgkJCQkJLmFwcGVuZChbdGhpcy5ydGUuaTE4bignQWxpZ25tZW50JyksICAgICAgIHRoaXMuc3JjLm1haW4uYWxpZ25dLCAgICdtYWluJywgdHJ1ZSkKCQkJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdQYWRkaW5ncycpLCAgICAgICAgdGhpcy5zcmMubWFpbi5wYWRkaW5nXSwgJ21haW4nLCB0cnVlKQoJCQkJCS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oJ0JhY2tncm91bmQnKSwgICAgICAkKCc8c3BhbiAvPicpLmFwcGVuZCgkKCc8c3BhbiAvPicpLmNzcyh7J2Zsb2F0JyA6ICdsZWZ0JywgJ21hcmdpbi1yaWdodCcgOiAnM3B4J30pLmFwcGVuZCh0aGlzLnNyYy5tYWluLmJnKSkuYXBwZW5kKHRoaXMuc3JjLm1haW4uYmdpbWcpXSwgICdtYWluJywgdHJ1ZSkKCQkJCQkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCdBcHBseSB0bycpLCAgICAgICAgdGhpcy5zcmMubWFpbi5hcHBseV0sICAgJ21haW4nLCB0cnVlKTsKCQkJfSBlbHNlIHsKCQkJCWZvciAodmFyIG5hbWUgaW4gdGhpcy5zcmNbdGFiXSkgewoJCQkJCXZhciB2ID0gdGhpcy5jZWxsLmF0dHIobmFtZSkgfHwgJyc7CgkJCQkJaWYgKHRhYiA9PSAnZXZlbnRzJykgewoJCQkJCQl2ID0gdGhpcy5ydGUudXRpbHMudHJpbUV2ZW50Q2FsbGJhY2sodik7CgkJCQkJfSAKCQkJCQlkLmFwcGVuZChbdGhpcy5ydGUuaTE4bih0aGlzLmxhYmVsc1tuYW1lXSA/IHRoaXMubGFiZWxzW25hbWVdIDogbmFtZSksIHRoaXMuc3JjW3RhYl1bbmFtZV0udmFsKHYpXSwgdGFiLCB0cnVlKTsKCQkJCX0KCQkJfQoJCX0KCQlkLm9wZW4oKQoJfQoJCgl0aGlzLnNldCA9IGZ1bmN0aW9uKCkgewoJCS8vICQodCkucmVtb3ZlKCk7CgkJdmFyIHRhcmdldCA9IHRoaXMuY2VsbCwKCQkJYXBwbHkgID0gdGhpcy5zcmMubWFpbi5hcHBseS52YWwoKTsKCQlzd2l0Y2ggKHRoaXMuc3JjLm1haW4uYXBwbHkudmFsKCkpIHsKCQkJY2FzZSAncm93JzoKCQkJCXRhcmdldCA9IHRoaXMuY2VsbC5wYXJlbnQoJ3RyJykuY2hpbGRyZW4oJ3RkLHRoJyk7CgkJCQlicmVhazsKCQkJCQoJCQljYXNlICdjb2x1bW4nOgoJCQkJdGFyZ2V0ID0gJCh0aGlzLnJ0ZS5kb20udGFibGVDb2x1bW4odGhpcy5jZWxsLmdldCgwKSkpOwoJCQkJYnJlYWs7CgkJCQkKCQkJY2FzZSAndGFibGUnOgoJCQkJdGFyZ2V0ID0gdGhpcy5jZWxsLnBhcmVudHMoJ3RhYmxlJykuZmluZCgndGQsdGgnKTsKCQkJCWJyZWFrOwoJCX0KCgkJZm9yICh2YXIgdGFiIGluIHRoaXMuc3JjKSB7CgkJCWlmICh0YWIgIT0gJ21haW4nKSB7CgkJCQlmb3IgKHZhciBuIGluIHRoaXMuc3JjW3RhYl0pIHsKCQkJCQl2YXIgdiA9ICQudHJpbSh0aGlzLnNyY1t0YWJdW25dLnZhbCgpKTsKCQkJCQlpZiAodikgewoJCQkJCQl0YXJnZXQuYXR0cihuLCB2KTsKCQkJCQl9IGVsc2UgewoJCQkJCQl0YXJnZXQucmVtb3ZlQXR0cihuKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJCgkJdGFyZ2V0LnJlbW92ZUF0dHIoJ3dpZHRoJykKCQkJLnJlbW92ZUF0dHIoJ2hlaWdodCcpCgkJCS5yZW1vdmVBdHRyKCdib3JkZXInKQoJCQkucmVtb3ZlQXR0cignYWxpZ24nKQoJCQkucmVtb3ZlQXR0cignYm9yZGVyY29sb3InKQoJCQkucmVtb3ZlQXR0cignYmdjb2xvcicpOwoJCQkKCQl2YXIgdCA9IHRoaXMuc3JjLm1haW4udHlwZS52YWwoKTsKCQl2YXIgdyA9IHBhcnNlSW50KHRoaXMuc3JjLm1haW4ud2lkdGgudmFsKCkpIHx8ICcnOwoJCXZhciBoID0gcGFyc2VJbnQodGhpcy5zcmMubWFpbi5oZWlnaHQudmFsKCkpIHx8ICcnOwoJCXZhciBpID0gJC50cmltKHRoaXMuc3JjLm1haW4uYmdpbWcudmFsKCkpOwoJCXZhciBiID0gdGhpcy5zcmMubWFpbi5ib3JkZXIudmFsKCk7CgkJdmFyIGNzcyA9IHsKCQkJJ3dpZHRoJyAgICAgICAgICAgIDogdyA/IHcrdGhpcy5zcmMubWFpbi53dW5pdC52YWwoKSA6ICcnLAoJCQknaGVpZ2h0JyAgICAgICAgICAgOiBoID8gaCt0aGlzLnNyYy5tYWluLmh1bml0LnZhbCgpIDogJycsCgkJCSdiYWNrZ3JvdW5kLWNvbG9yJyA6IHRoaXMuc3JjLm1haW4uYmcudmFsKCksCgkJCSdiYWNrZ3JvdW5kLWltYWdlJyA6IGkgPyAndXJsKCcraSsnKScgOiAnJywKCQkJJ2JvcmRlcicgICAgICAgICAgIDogJC50cmltKGIud2lkdGgrJyAnK2Iuc3R5bGUrJyAnK2IuY29sb3IpLAoJCQkndGV4dC1hbGlnbicgICAgICAgOiB0aGlzLnNyYy5tYWluLmFsaWduLnZhbCgpIHx8ICcnCgkJfTsKCQl2YXIgcCA9IHRoaXMuc3JjLm1haW4ucGFkZGluZy52YWwoKTsKCQlpZiAocC5jc3MpIHsKCQkJY3NzLnBhZGRpbmcgPSBwLmNzczsKCQl9IGVsc2UgewoJCQljc3NbJ3BhZGRpbmctdG9wJ10gICAgPSBwLnRvcDsKCQkJY3NzWydwYWRkaW5nLXJpZ2h0J10gID0gcC5yaWdodDsKCQkJY3NzWydwYWRkaW5nLWJvdHRvbSddID0gcC5ib3R0b207CgkJCWNzc1sncGFkZGluZy1sZWZ0J10gICA9IHAubGVmdDsKCQl9CgkJCgkJdGFyZ2V0ID0gdGFyZ2V0LmdldCgpOwoKCQkkLmVhY2godGFyZ2V0LCBmdW5jdGlvbigpIHsKCQkJdmFyIHR5cGUgPSB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXZhciAkdGhpcyA9ICQodGhpcyk7CgkJCWlmICh0eXBlICE9IHQpIHsKCQkJCQoJCQkJdmFyIGF0dHIgPSB7fQoJCQkJZm9yICh2YXIgaSBpbiBzZWxmLnNyYy5hZHYpIHsKCQkJCQl2YXIgdiA9ICR0aGlzLmF0dHIoaSkKCQkJCQlpZiAodikgewoJCQkJCQlhdHRyW2ldID0gdi50b1N0cmluZygpOwoJCQkJCX0KCQkJCX0KCQkJCWZvciAodmFyIGkgaW4gc2VsZi5zcmMuZXZlbnRzKSB7CgkJCQkJdmFyIHYgPSAkdGhpcy5hdHRyKGkpCgkJCQkJaWYgKHYpIHsKCQkJCQkJYXR0cltpXSA9IHYudG9TdHJpbmcoKTsKCQkJCQl9CgkJCQl9CgkJCQl2YXIgY29sc3BhbiA9ICR0aGlzLmF0dHIoJ2NvbHNwYW4nKXx8MTsKCQkJCXZhciByb3dzcGFuID0gJHRoaXMuYXR0cigncm93c3BhbicpfHwxOwoJCQkJaWYgKGNvbHNwYW4+MSkgewoJCQkJCWF0dHIuY29sc3BhbiA9IGNvbHNwYW47CgkJCQl9CgkJCQlpZiAocm93c3Bhbj4xKSB7CgkJCQkJYXR0ci5yb3dzcGFuID0gcm93c3BhbjsKCQkJCX0KCQkJCQoJCQkJJHRoaXMucmVwbGFjZVdpdGgoJCgnPCcrdCsnIC8+JykuaHRtbCgkdGhpcy5odG1sKCkpLmF0dHIoYXR0cikuY3NzKGNzcykgKTsKCQkJCQoJCQl9IGVsc2UgewoJCQkJJHRoaXMuY3NzKGNzcyk7CgkJCX0KCQl9KTsKCgkJdGhpcy5ydGUudWkudXBkYXRlKCk7Cgl9CgkKCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMucnRlLmRvbS5wYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgL15UQUJMRSQvKSkgewoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CgkJfSBlbHNlIHsKCQkJdGhpcy5kb21FbGVtLmFkZENsYXNzKCdkaXNhYmxlZCcpOwoJCX0KCX0KCQp9Cgp9KShqUXVlcnkpOy8qKgogKiBAY2xhc3MgYnV0dG9uIC0gdGFibGUgY2VsbHMgbWVyZ2UKICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnRiY2VsbHNtZXJnZSA9IGZ1bmN0aW9uKHJ0ZSwgbmFtZSkgewoJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJdmFyIHNlbGYgPSB0aGlzOwoJCglmdW5jdGlvbiBzZWxlY3RlZENlbGxzKCkgewoJCXZhciBjMSA9IHNlbGYucnRlLmRvbS5zZWxmT3JQYXJlbnQoc2VsZi5ydGUuc2VsZWN0aW9uLmdldFN0YXJ0KCksIC9eKFREfFRIKSQvKTsKCQl2YXIgYzIgPSBzZWxmLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHNlbGYucnRlLnNlbGVjdGlvbi5nZXRFbmQoKSwgL14oVER8VEgpJC8pOwkJCgkJaWYgKGMxICYmIGMyICYmIGMxIT1jMiAmJiAkKGMxKS5wYXJlbnRzKCd0YWJsZScpLmdldCgwKSA9PSAkKGMyKS5wYXJlbnRzKCd0YWJsZScpLmdldCgwKSkgewoJCQlyZXR1cm4gW2MxLCBjMl07CgkJfQoJCXJldHVybiBudWxsOwoJfQoJCgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQl2YXIgY2VsbHMgPSBzZWxlY3RlZENlbGxzKCk7CgoJCWlmIChjZWxscykgewoJCQkKCQkJdmFyIF9zICA9IHRoaXMucnRlLmRvbS5pbmRleE9mKCQoY2VsbHNbMF0pLnBhcmVudCgndHInKS5nZXQoMCkpOwoJCQl2YXIgX2UgID0gdGhpcy5ydGUuZG9tLmluZGV4T2YoJChjZWxsc1sxXSkucGFyZW50KCd0cicpLmdldCgwKSk7CgkJCXZhciBybyAgPSBNYXRoLm1pbihfcywgX2UpOyAvLyByb3cgb2Zmc2V0CgkJCXZhciBybCAgPSBNYXRoLm1heChfcywgX2UpIC0gcm8gKyAxOyAvLyByb3cgbGVuZ3RoCgkJCXZhciBfYzEgPSB0aGlzLnJ0ZS5kb20udGFibGVDb2x1bW4oY2VsbHNbMF0sIHRydWUsIHRydWUpOyAKCQkJdmFyIF9jMiA9IHRoaXMucnRlLmRvbS50YWJsZUNvbHVtbihjZWxsc1sxXSwgdHJ1ZSk7CgkJCXZhciBfaTEgPSAkLmluQXJyYXkoY2VsbHNbMF0sIF9jMS5jb2x1bW4pOyAKCQkJdmFyIF9pMiA9ICQuaW5BcnJheShjZWxsc1sxXSwgX2MyLmNvbHVtbik7CgkJCQoJCQl2YXIgY29sQmVnaW4gPSBfYzEuaW5mby5vZmZzZXRbX2kxXSA8IF9jMi5pbmZvLm9mZnNldFtfaTJdICA/IF9jMSA6IF9jMjsKCQkJdmFyIGNvbEVuZCAgID0gX2MxLmluZm8ub2Zmc2V0W19pMV0gPj0gX2MyLmluZm8ub2Zmc2V0W19pMl0gPyBfYzEgOiBfYzI7CgkJCXZhciBsZW5ndGggICA9IDA7CgkJCXZhciB0YXJnZXQgICA9IG51bGw7CgkJCXZhciBodG1sICAgICA9ICcnOwoJCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoJCQl2YXIgcm93cyA9ICQoJChjZWxsc1swXSkucGFyZW50cygndGFibGUnKS5lcSgwKS5maW5kKCd0cicpLmdldCgpLnNsaWNlKHJvLCBybytybCkpCgkJCQkuZWFjaCggZnVuY3Rpb24oaSkgewoJCQkJCXZhciBfbCA9IGh0bWwubGVuZ3RoOwoJCQkJCXZhciBhY2NlcHQgPSBmYWxzZTsKCQkJCQkkKHRoaXMpLmNoaWxkcmVuKCd0ZCx0aCcpLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkJCXZhciAkdGhpcyAgID0gJCh0aGlzKTsKCQkJCQkJdmFyIGluQmVnaW4gPSAkLmluQXJyYXkodGhpcywgY29sQmVnaW4uY29sdW1uKTsKCQkJCQkJdmFyIGluRW5kICAgPSAkLmluQXJyYXkodGhpcywgY29sRW5kLmNvbHVtbik7CgkJCQkJCQoJCQkJCQlpZiAoaW5CZWdpbiE9LTEgfHwgaW5FbmQhPS0xKSB7CgkJCQkJCQlhY2NlcHQgPSBpbkJlZ2luIT0tMSAmJiBpbkVuZD09LTE7CgkJCQkJCQl2YXIgbGVuID0gcGFyc2VJbnQoJHRoaXMuYXR0cignY29sc3BhbicpfHwxKQoJCQkJCQkJaWYgKGkgPT0gMCkgewoJCQkJCQkJCWxlbmd0aCArPSBsZW47CgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJCWlmIChpbkJlZ2luIT0tMSAmJiBpPjApIHsKCQkJCQkJCQl2YXIgZGVsdGEgPSBjb2xCZWdpbi5pbmZvLmRlbHRhW2luQmVnaW5dOwoJCQkJCQkJCWlmIChkZWx0YT4wKSB7CgkJCQkJCQkJCWlmICgkdGhpcy5jc3MoJ3RleHQtYWxpZ24nKSA9PSAnbGVmdCcpIHsKCQkJCQkJCQkJCXZhciBjZWxsID0gJHRoaXMuY2xvbmUodHJ1ZSk7CgkJCQkJCQkJCQkkdGhpcy5odG1sKCcmbmJzcDsnKTsKCQkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJCXZhciBjZWxsID0gJHRoaXMuY2xvbmUoKS5odG1sKCcmbmJzcDsnKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQljZWxsLnJlbW92ZUF0dHIoJ2NvbHNwYW4nKS5yZW1vdmVBdHRyKCdpZCcpLmluc2VydEJlZm9yZSh0aGlzKTsKCQkJCQkJCQkJaWYgKGRlbHRhPjEpIHsKCQkJCQkJCQkJCWNlbGwuYXR0cignY29sc3BhbicsIGRlbHRhKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQkJaWYgKGluRW5kIT0tMSkgewoJCQkJCQkJCXZhciBkZWx0YSA9IGNvbEVuZC5pbmZvLmRlbHRhW2luRW5kXTsKCQkJCQkJCQlpZiAobGVuLWRlbHRhPjEpIHsKCQkJCQkJCQkJdmFyIGNwID0gbGVuLWRlbHRhLTE7CgkJCQkJCQkJCWlmICgkdGhpcy5jc3MoJ3RleHQtYWxpZ24nKSA9PSAncmlnaHQnKSB7CgkJCQkJCQkJCQl2YXIgY2VsbCA9ICR0aGlzLmNsb25lKHRydWUpOwoJCQkJCQkJCQkJJHRoaXMuaHRtbCgnJm5ic3A7Jyk7CgkJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCQl2YXIgY2VsbCA9ICR0aGlzLmNsb25lKCkuaHRtbCgnJm5ic3A7Jyk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJY2VsbC5yZW1vdmVBdHRyKCdjb2xzcGFuJykucmVtb3ZlQXR0cignaWQnKS5pbnNlcnRBZnRlcih0aGlzKTsKCQkJCQkJCQkJaWYgKGNwPjEpIHsKCQkJCQkJCQkJCWNlbGwuYXR0cignY29sc3BhbicsIGNwKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWlmICghdGFyZ2V0KSB7CgkJCQkJCQkJdGFyZ2V0ID0gJHRoaXM7CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCWh0bWwgKz0gJHRoaXMuaHRtbCgpOwoJCQkJCQkJCSR0aGlzLnJlbW92ZSgpOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgaWYgKGFjY2VwdCkgewoJCQkJCQkJaWYgKGkgPT0gMCkgewoJCQkJCQkJCWxlbmd0aCArPSBwYXJzZUludCgkdGhpcy5hdHRyKCdjb2xzcGFuJyl8fDEpOwoJCQkJCQkJfQoJCQkJCQkJaHRtbCArPSAkdGhpcy5odG1sKCk7CgkJCQkJCQkkdGhpcy5yZW1vdmUoKTsKCQkJCQkJCQoKCQkJCQkJfQoJCQkJCX0pCgkJCQkJaHRtbCArPSBfbCE9aHRtbC5sZW5ndGggPyAnPGJyIC8+JyA6ICcnOwoJCQkJfSk7CgoJCQl0YXJnZXQucmVtb3ZlQXR0cignY29sc3BhbicpLnJlbW92ZUF0dHIoJ3Jvd3NwYW4nKS5odG1sKHRhcmdldC5odG1sKCkraHRtbCkKCQkJaWYgKGxlbmd0aD4xKSB7CgkJCQl0YXJnZXQuYXR0cignY29sc3BhbicsIGxlbmd0aCk7CgkJCX0KCQkJaWYgKHJsPjEpIHsKCQkJCXRhcmdldC5hdHRyKCdyb3dzcGFuJywgcmwpOwoJCQl9CgkJCS8vIHNvbWV0aW1lcyB3aGVuIG1lcmdlIGNlbGxzIHdpdGggZGlmZmVyZW50IHJvd3NwYW5zIHdlIGdldCAibG9zdCIgY2VsbHMgaW4gcm93cyAKCQkJLy8gdGhpcyBhZGQgY2VsbHMgaWYgbmVlZGVkCgkJCXRoaXMucnRlLmRvbS5maXhUYWJsZSgkKGNlbGxzWzBdKS5wYXJlbnRzKCd0YWJsZScpLmdldCgwKSk7CgkJfQoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCWlmIChzZWxlY3RlZENlbGxzKCkpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJCX0gZWxzZSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKCQl9Cgl9Cn0KfSkoalF1ZXJ5KTsKLyoqCiAqIEBjbGFzcyBidXR0b24gLSBzcGxpdCBtZXJnZWQgY2VsbAogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuAogKiBAdG9kbyBzcGxpdCBub3QgbWVyZ2VkIGNlbGwgCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1IAogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy50YmNlbGxzcGxpdCA9IGZ1bmN0aW9uKHJ0ZSwgbmFtZSkgewoJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJCgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQl2YXIgbiA9IHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgL14oVER8VEgpJC8pOwoJCWlmIChuKSB7CgkJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJCXZhciBjb2xzcGFuID0gcGFyc2VJbnQodGhpcy5ydGUuZG9tLmF0dHIobiwgJ2NvbHNwYW4nKSk7CgkJCXZhciByb3dzcGFuID0gcGFyc2VJbnQodGhpcy5ydGUuZG9tLmF0dHIobiwgJ3Jvd3NwYW4nKSk7CgkJCWlmIChjb2xzcGFuPjEgfHwgcm93c3Bhbj4xKSB7CgkJCQl2YXIgY251bSA9IGNvbHNwYW4tMTsKCQkJCXZhciBybnVtID0gcm93c3Bhbi0xOwoJCQkJdmFyIHRiICAgPSB0aGlzLnJ0ZS5kb20ucGFyZW50KG4sIC9eVEFCTEUkLyk7CgkJCQl2YXIgdGJtICA9IHRoaXMucnRlLmRvbS50YWJsZU1hdHJpeCh0Yik7CgkJCQkKCQkJCS8vINGP0YfQtdC50LrQuCDQsiDRgtC10LrRg9GJ0LXQvCDRgNGP0LTRgwoJCQkJaWYgKGNudW0pIHsKCQkJCQlmb3IgKHZhciBpPTA7IGk8Y251bTsgaSsrKSB7CgkJCQkJCSQodGhpcy5ydGUuZG9tLmNyZWF0ZShuLm5vZGVOYW1lKSkuaHRtbCgnJm5ic3A7JykuaW5zZXJ0QWZ0ZXIobik7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKHJudW0pIHsKCQkJCQl2YXIgbmR4ICA9IHRoaXMucnRlLmRvbS5pbmRleGVzT2ZDZWxsKG4sIHRibSkKCQkJCQl2YXIgcm5keCA9IG5keFswXTsKCQkJCQl2YXIgY25keCA9IG5keFsxXTsKCQkJCQkvLyDRj9GH0LXQudC60Lgg0LIg0YHQu9C10LTRg9GJ0LjRhSDRgNGP0LTQsNGFCgkJCQkJZm9yICh2YXIgcj1ybmR4KzE7IHIgPCBybmR4K3JudW0rMTsgcisrKSB7CgkJCQkJCXZhciBjZWxsOwoJCQkJCQkKCQkJCQkJaWYgKCF0Ym1bcl1bY25keF0ubm9kZU5hbWUpIHsKCQkJCQkJCWlmICh0Ym1bcl1bY25keC0xXS5ub2RlTmFtZSkgewoJCQkJCQkJCWNlbGwgPSB0Ym1bcl1bY25keC0xXTsKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJZm9yICh2YXIgaT1jbmR4LTE7IGk+PTA7IGktLSkgewoJCQkJCQkJCQlpZiAodGJtW3JdW2ldLm5vZGVOYW1lKSB7CgkJCQkJCQkJCQljZWxsID10Ym1bcl1baV07CgkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWlmIChjZWxsKSB7CgkJCQkJCQkJZm9yICh2YXIgaT0wOyBpPD0gY251bTsgaSsrKSB7CgkJCQkJCQkJCSQodGhpcy5ydGUuZG9tLmNyZWF0ZShjZWxsLm5vZGVOYW1lKSkuaHRtbCgnJm5ic3A7JykuaW5zZXJ0QWZ0ZXIoY2VsbCk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfTsKCQkJCX0KCQkJCSQobikucmVtb3ZlQXR0cignY29sc3BhbicpLnJlbW92ZUF0dHIoJ3Jvd3NwYW4nKTsKCQkJCXRoaXMucnRlLmRvbS5maXhUYWJsZSh0Yik7CgkJCX0KCQl9CgkJdGhpcy5ydGUudWkudXBkYXRlKHRydWUpOwoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXZhciBuID0gdGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCAvXihURHxUSCkkLyk7CgkJaWYgKG4gJiYgKHBhcnNlSW50KHRoaXMucnRlLmRvbS5hdHRyKG4sICdjb2xzcGFuJykpPjEgfHwgcGFyc2VJbnQodGhpcy5ydGUuZG9tLmF0dHIobiwgJ3Jvd3NwYW4nKSk+MSkpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJCX0gZWxzZSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKCQl9Cgl9Cn0KCn0pKGpRdWVyeSk7Ci8qKgogKiBAY2xhc3MgYnV0dG9uIC0gSW5zZXJ0IG5ldyBjb2x1bW4gaW4gdGFibGUoYmVmb3JlIG9yIGFmdGVyIGN1cnJlbnQpCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy50YmNvbGJlZm9yZSA9IGZ1bmN0aW9uKHJ0ZSwgbmFtZSkgewoJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJdmFyIHNlbGYgPSB0aGlzOwoJCgl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCQl2YXIgY2VsbHMgPSB0aGlzLnJ0ZS5kb20udGFibGVDb2x1bW4odGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgZmFsc2UsIHRydWUpOwoJCWlmIChjZWxscy5sZW5ndGgpIHsKCQkJdGhpcy5ydGUuaGlzdG9yeS5hZGQoKTsKCQkJJC5lYWNoKGNlbGxzLCBmdW5jdGlvbigpIHsKCQkJCXZhciAkdGhpcyA9ICQodGhpcyk7CgkJCQl2YXIgY3AgPSBwYXJzZUludCgkdGhpcy5hdHRyKCdjb2xzcGFuJyl8fDEpCgkJCQlpZiAoY3AgPjEpIHsKCQkJCQkkdGhpcy5hdHRyKCdjb2xzcGFuJywgY3ArMSk7CgkJCQl9IGVsc2UgewoJCQkJCXZhciBjID0gJHRoaXMuY2xvbmUoKS5odG1sKCcmbmJzcDsnKS5yZW1vdmVBdHRyKCdjb2xzcGFuJykucmVtb3ZlQXR0cignd2lkdGgnKS5yZW1vdmVBdHRyKCdpZCcpOwoJCQkJCWlmIChzZWxmLm5hbWUgPT0gJ3RiY29sYmVmb3JlJykgewoJCQkJCQljLmluc2VydEJlZm9yZSh0aGlzKTsKCQkJCQl9IGVsc2UgewoJCQkJCQljLmluc2VydEFmdGVyKHRoaXMpOwoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJCXRoaXMucnRlLnVpLnVwZGF0ZSgpOwoJCX0KCX0KCQoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCAvXihURHxUSCkkLykpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJCX0gZWxzZSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKCQl9Cgl9Cn0KCmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy50YmNvbGFmdGVyID0gZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnRiY29sYmVmb3JlOwoKfSkoalF1ZXJ5KTsKLyoqCiAqIEBjbGFzcyBidXR0b24gLSByZW1vdmUgdGFibGUgY29sdW5tCiAqCiAqIEBwYXJhbSAgZWxSVEUgIHJ0ZSAgINC+0LHRitC10LrRgi3RgNC10LTQsNC60YLQvtGACiAqIEBwYXJhbSAgU3RyaW5nIG5hbWUgINC90LDQt9Cy0LDQvdC40LUg0LrQvdC+0L/QutC4IAogKgogKiBAYXV0aG9yOiAgICBEbWl0cnkgTGV2YXNob3YgKGRpbykgZGlvQHN0ZDQyLnJ1CiAqIEBjb3B5cmlnaHQ6IFN0dWRpbyA0MiwgaHR0cDovL3d3dy5zdGQ0Mi5ydQogKiovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy50YmNvbHJtID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7Cgl0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJ0ZSwgbmFtZSk7Cgl2YXIgc2VsZiA9IHRoaXM7CgkKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCXZhciBuICAgICA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7CgkJdmFyIGMgICAgID0gdGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudChuLCAvXihURHxUSCkkLyk7CgkJdmFyIHByZXYgID0gJChjKS5wcmV2KCd0ZCx0aCcpLmdldCgwKTsKCQl2YXIgbmV4dCAgPSAkKGMpLm5leHQoJ3RkLHRoJykuZ2V0KDApOwkJCQoJCXZhciB0YiAgICA9IHRoaXMucnRlLmRvbS5wYXJlbnQobiwgL15UQUJMRSQvKTsKCQl2YXIgY2VsbHMgPSB0aGlzLnJ0ZS5kb20udGFibGVDb2x1bW4obiwgZmFsc2UsIHRydWUpOwoKCQlpZiAoY2VsbHMubGVuZ3RoKSB7CgkJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJCSQuZWFjaChjZWxscywgZnVuY3Rpb24oKSB7CgkJCQl2YXIgJHRoaXMgPSAkKHRoaXMpOwoJCQkJdmFyIGNwICAgID0gcGFyc2VJbnQoJHRoaXMuYXR0cignY29sc3BhbicpfHwxKTsKCQkJCWlmICggY3A+MSApIHsKCQkJCQkkdGhpcy5hdHRyKCdjb2xzcGFuJywgY3AtMSk7CgkJCQl9IGVsc2UgewoJCQkJCSR0aGlzLnJlbW92ZSgpOwoJCQkJfQoJCQl9KTsKCQkJdGhpcy5ydGUuZG9tLmZpeFRhYmxlKHRiKTsKCQkJaWYgKHByZXYgfHwgbmV4dCkgewoJCQkJdGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdENvbnRlbnRzKHByZXYgPyBwcmV2IDogbmV4dCkuY29sbGFwc2UodHJ1ZSk7CgkJCX0KCQkJdGhpcy5ydGUudWkudXBkYXRlKHRydWUpOwoJCX0KCX0KCQoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLCAvXihURHxUSCkkLykpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJCX0gZWxzZSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKCQl9Cgl9Cn0KCn0pKGpRdWVyeSk7Ci8qKgogKiBAY2xhc3Mg0LzQtdC90Y4gLSDQndC+0LLRi9C5INGA0Y/QtCDQsiDRgtCw0LHQu9C40YbQtQogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICoqLwplbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGJyb3diZWZvcmUgPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCQoJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgkJdmFyIG4gID0gdGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKTsKCQl2YXIgYyAgPSB0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KG4sIC9eKFREfFRIKSQvKTsKCQl2YXIgciAgPSB0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KGMsIC9eVFIkLyk7CgkJdmFyIG14ID0gdGhpcy5ydGUuZG9tLnRhYmxlTWF0cml4KHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQoYywgL15UQUJMRSQvKSk7CgkJaWYgKGMgJiYgciAmJiBteCkgewoJCQl0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOwoJCQl2YXIgYmVmb3JlID0gdGhpcy5uYW1lID09ICd0YnJvd2JlZm9yZSc7CgkJCXZhciBybyAgICAgPSAkKHIpLnByZXZBbGwoJ3RyJykubGVuZ3RoOwoJCQl2YXIgY250ICAgID0gMDsKCQkJdmFyIG1kZiAgICA9IFtdOwoJCQkKCQkJZnVuY3Rpb24gX2ZpbmQoeCwgeSkgewoJCQkJd2hpbGUgKHk+MCkgewoJCQkJCXktLTsKCQkJCQlpZiAobXhbeV0gJiYgbXhbeV1beF0gJiYgbXhbeV1beF0ubm9kZU5hbWUpIHsKCQkJCQkJcmV0dXJuIG14W3ldW3hdOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQkKCQkJZm9yICh2YXIgaT0wOyBpPG14W3JvXS5sZW5ndGg7IGkrKykgewoJCQkJaWYgKG14W3JvXVtpXSAmJiBteFtyb11baV0ubm9kZU5hbWUpIHsKCQkJCQl2YXIgY2VsbCAgICA9ICQobXhbcm9dW2ldKTsKCQkJCQl2YXIgY29sc3BhbiA9IHBhcnNlSW50KGNlbGwuYXR0cignY29sc3BhbicpfHwxKTsKCQkJCQlpZiAocGFyc2VJbnQoY2VsbC5hdHRyKCdyb3dzcGFuJyl8fDEpID4gMSkgewoJCQkJCQlpZiAoYmVmb3JlKSB7CgkJCQkJCQljbnQgKz0gY29sc3BhbjsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCW1kZi5wdXNoKGNlbGwpOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJY250ICs9IGNvbHNwYW47CgkJCQkJfQoJCQkJfSBlbHNlIGlmIChteFtyb11baV0gPT0gJy0nKSB7CgkJCQkJY2VsbCA9IF9maW5kKGksIHJvKTsKCQkJCQljZWxsICYmIG1kZi5wdXNoKCQoY2VsbCkpOwoJCQkJfQoJCQl9CgkJCXZhciByb3cgPSAkKCc8dHIgLz4nKTsKCQkJZm9yICh2YXIgaT0wOyBpPGNudDsgaSsrKSB7CgkJCQlyb3cuYXBwZW5kKCc8dGQ+Jm5ic3A7PC90ZD4nKTsKCQkJfQoJCQlpZiAoYmVmb3JlKSB7CgkJCQlyb3cuaW5zZXJ0QmVmb3JlKHIpOwoJCQl9IGVsc2UgewoJCQkJcm93Lmluc2VydEFmdGVyKHIpOwoJCQl9CgkJCSQuZWFjaChtZGYsIGZ1bmN0aW9uKCkgewoJCQkJJCh0aGlzKS5hdHRyKCdyb3dzcGFuJywgcGFyc2VJbnQoJCh0aGlzKS5hdHRyKCdyb3dzcGFuJyl8fDEpKzEpOwoJCQl9KTsKCQkJdGhpcy5ydGUudWkudXBkYXRlKCk7CgkJfQoJfQoJCgl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksIC9eVFIkLykpIHsKCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwoJCX0gZWxzZSB7CgkJCXRoaXMuZG9tRWxlbS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKCQl9Cgl9Cn0KCmVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy50YnJvd2FmdGVyID0gZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnRicm93YmVmb3JlOwovKioKICogQGNsYXNzIGJ1dHRvbiAtIHJlbW92ZSB0YWJsZSByb3cKICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LggCiAqCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnRicm93cm0gPSBmdW5jdGlvbihydGUsIG5hbWUpIHsKCXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcnRlLCBuYW1lKTsKCXZhciBzZWxmID0gdGhpczsKCXRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uKCkgewoJCQoJCXZhciBuICA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksCgkJCWMgID0gdGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudChuLCAvXihURHxUSCkkLyksCgkJCXIgID0gdGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudChjLCAvXlRSJC8pLAoJCQl0YiA9IHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQoYywgL15UQUJMRSQvKSwKCQkJbXggPSB0aGlzLnJ0ZS5kb20udGFibGVNYXRyaXgodGIpOwoJCQoJCWlmIChjICYmIHIgJiYgbXgubGVuZ3RoKSB7CgkJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJCWlmIChteC5sZW5ndGg9PTEpIHsKCQkJCSQodGIpLnJlbW92ZSgpOwoJCQkJcmV0dXJuIHRoaXMucnRlLnVpLnVwZGF0ZSgpOwoJCQl9CgkJCXZhciBtZGYgPSBbXTsKCQkJdmFyIHJvICA9ICQocikucHJldkFsbCgndHInKS5sZW5ndGg7CgkJCQoJCQlmdW5jdGlvbiBfZmluZCh4LCB5KSB7CgkJCQl3aGlsZSAoeT4wKSB7CgkJCQkJeS0tOwoJCQkJCWlmIChteFt5XSAmJiBteFt5XVt4XSAmJiBteFt5XVt4XS5ub2RlTmFtZSkgewoJCQkJCQlyZXR1cm4gbXhbeV1beF07CgkJCQkJfQoJCQkJfQoJCQl9CgkJCQoJCQkvLyBtb3ZlIGNlbGwgd2l0aCByb3dzcGFuPjEgdG8gbmV4dCByb3cKCQkJZnVuY3Rpb24gX21vdmUoY2VsbCwgeCkgewoJCQkJeSA9IHJvKzE7CgkJCQl2YXIgc2libGluZz0gbnVsbDsKCQkJCWlmIChteFt5XSkgewoJCQkJCWZvciAodmFyIF94PTA7IF94PHg7IF94KyspIHsKCQkJCQkJaWYgKG14W3ldW194XSAmJiBteFt5XVtfeF0ubm9kZU5hbWUpIHsKCQkJCQkJCXNpYmxpbmcgPSBteFt5XVtfeF07CgkJCQkJCX0KCQkJCQl9OwoJCQkJCQoJCQkJCWNlbGwgPSBjZWxsLnJlbW92ZSgpOwoJCQkJCWlmIChzaWJsaW5nKSB7CgkJCQkJCWNlbGwuaW5zZXJ0QWZ0ZXIoc2libGluZyk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJY2VsbC5wcmVwZW5kVG8oJChyKS5uZXh0KCd0cicpLmVxKDApKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJCgkJCWZ1bmN0aW9uIF9jdXJzb3JQb3MoY29sdW1uKSB7CgkJCQlmb3IgKHZhciBpID0gMDsgaTxjb2x1bW4ubGVuZ3RoOyBpKyspIHsKCQkJCQlpZiAoY29sdW1uW2ldID09IGMpIHsKCQkJCQkJcmV0dXJuIGk8Y29sdW1uLmxlbmd0aC0xID8gY29sdW1uW2krMV0gOiBjb2x1bW5baS0xXTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJCgkJCWZvciAodmFyIGk9MDsgaTxteFtyb10ubGVuZ3RoOyBpKyspIHsKCQkJCXZhciBjZWxsID0gbnVsbDsKCQkJCXZhciBtb3ZlID0gZmFsc2U7CgkJCQlpZiAobXhbcm9dW2ldICYmIG14W3JvXVtpXS5ub2RlTmFtZSkgewoJCQkJCWNlbGwgPSBteFtyb11baV07CgkJCQkJbW92ZSA9IHRydWU7CgkJCQl9IGVsc2UgaWYgKG14W3JvXVtpXSA9PSAnLScgJiYgKGNlbGwgPSBfZmluZChpLCBybykpKSB7CgkJCQkJbW92ZSA9IGZhbHNlOwoJCQkJfQoJCQkJaWYgKGNlbGwpIHsKCQkJCQljZWxsID0gJChjZWxsKTsKCQkJCQl2YXIgcm93c3BhbiA9IHBhcnNlSW50KGNlbGwuYXR0cigncm93c3BhbicpfHwxKTsKCQkJCQlpZiAocm93c3Bhbj4xKSB7CgkJCQkJCWNlbGwuYXR0cigncm93c3BhbicsIHJvd3NwYW4tMSk7CgkJCQkJCW1vdmUgJiYgX21vdmUoY2VsbCwgaSwgcm8pOwoJCQkJCX0gCgkJCQl9CgkJCX07CgkJCQoJCQl2YXIgX2MgPSBfY3Vyc29yUG9zKHRoaXMucnRlLmRvbS50YWJsZUNvbHVtbihjKSk7CgkJCWlmIChfYykgewoJCQkJdGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdENvbnRlbnRzKF9jKS5jb2xsYXBzZSh0cnVlKTsKCQkJfQoKCQkJJChyKS5yZW1vdmUoKTsKCQl9CgkJdGhpcy5ydGUudWkudXBkYXRlKCk7Cgl9CgkKCXRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgL15UUiQvKSkgewoJCQl0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CgkJfSBlbHNlIHsKCQkJdGhpcy5kb21FbGVtLmFkZENsYXNzKCdkaXNhYmxlZCcpOwoJCX0KCX0KfQoKfSkoalF1ZXJ5KTsvKioKICogQGNsYXNzINC60L3QvtC/0LrQsCAtINC+0YLQvNC10L3QsCDQv9C+0LLRgtC+0YAg0LTQtdC50YHRgtCy0LjQuQogKgogKiBAcGFyYW0gIGVsUlRFICBydGUgICDQvtCx0YrQtdC60YIt0YDQtdC00LDQutGC0L7RgAogKiBAcGFyYW0gIFN0cmluZyBuYW1lICDQvdCw0LfQstCw0L3QuNC1INC60L3QvtC/0LrQuCAKICogCiAqIEBhdXRob3I6ICAgIERtaXRyeSBMZXZhc2hvdiAoZGlvKSBkaW9Ac3RkNDIucnUKICogQGNvcHlyaWdodDogU3R1ZGlvIDQyLCBodHRwOi8vd3d3LnN0ZDQyLnJ1CiAqKi8KKGZ1bmN0aW9uKCQpIHsKCWVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy51bmRvID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7CgkJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoJCgkJdGhpcy5jb21tYW5kID0gZnVuY3Rpb24oKSB7CgkJCWlmICh0aGlzLm5hbWUgPT0gJ3VuZG8nICYmIHRoaXMucnRlLmhpc3RvcnkuY2FuQmFjaygpKSB7CgkJCQl0aGlzLnJ0ZS5oaXN0b3J5LmJhY2soKTsKCQkJCXRoaXMucnRlLnVpLnVwZGF0ZSgpOwoJCQl9IGVsc2UgaWYgKHRoaXMubmFtZSA9PSAncmVkbycgJiYgdGhpcy5ydGUuaGlzdG9yeS5jYW5Gd2QoKSkgewoJCQkJdGhpcy5ydGUuaGlzdG9yeS5md2QoKTsKCQkJCXRoaXMucnRlLnVpLnVwZGF0ZSgpOwoJCQl9CgkJfQoJCgkJdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKCQkJdGhpcy5kb21FbGVtLnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsIHRoaXMubmFtZSA9PSAndW5kbycgPyAhdGhpcy5ydGUuaGlzdG9yeS5jYW5CYWNrKCkgOiAhdGhpcy5ydGUuaGlzdG9yeS5jYW5Gd2QoKSk7CgkJfQoJfQoKCWVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5yZWRvID0gZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnVuZG87Cgp9KShqUXVlcnkpOy8qKgogKiBAY2xhc3MgYnV0dG9uIC0gcmVtb3ZlIGxpbmsKICoKICogQHBhcmFtICBlbFJURSAgcnRlICAg0L7QsdGK0LXQutGCLdGA0LXQtNCw0LrRgtC+0YAKICogQHBhcmFtICBTdHJpbmcgbmFtZSAg0L3QsNC30LLQsNC90LjQtSDQutC90L7Qv9C60LgKICoKICogQGF1dGhvcjogICAgRG1pdHJ5IExldmFzaG92IChkaW8pIGRpb0BzdGQ0Mi5ydQogKiBAY29weXJpZ2h0OiBTdHVkaW8gNDIsIGh0dHA6Ly93d3cuc3RkNDIucnUgCiAqKi8KKGZ1bmN0aW9uKCQpIHsKCgllbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudW5saW5rID0gZnVuY3Rpb24ocnRlLCBuYW1lKSB7CgkJdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBydGUsIG5hbWUpOwoKCQl0aGlzLmNvbW1hbmQgPSBmdW5jdGlvbigpIHsKCgkJCXZhciBuID0gdGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwgCgkJCQlsID0gdGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudExpbmsobik7CgoJCQlmdW5jdGlvbiBpc0xpbmsobikgeyByZXR1cm4gbi5ub2RlTmFtZSA9PSAnQScgJiYgbi5ocmVmOyB9CgoJCQlpZiAoIWwpIHsKCgkJCQl2YXIgc2VsID0gJC5icm93c2VyLm1zaWUgPyB0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoKSA6IHRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7d3JhcCA6IGZhbHNlfSk7CgkJCQlpZiAoc2VsLmxlbmd0aCkgewoJCQkJCWZvciAodmFyIGk9MDsgaSA8IHNlbC5sZW5ndGg7IGkrKykgewoJCQkJCQlpZiAoaXNMaW5rKHNlbFtpXSkpIHsKCQkJCQkJCWwgPSBzZWxbaV07CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX07CgkJCQkJaWYgKCFsKSB7CgkJCQkJCWwgPSB0aGlzLnJ0ZS5kb20ucGFyZW50KHNlbFswXSwgaXNMaW5rKSB8fCB0aGlzLnJ0ZS5kb20ucGFyZW50KHNlbFtzZWwubGVuZ3RoLTFdLCBpc0xpbmspOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJaWYgKGwpIHsKCQkJCXRoaXMucnRlLmhpc3RvcnkuYWRkKCk7CgkJCQl0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0KGwpOwoJCQkJdGhpcy5ydGUuZG9jLmV4ZWNDb21tYW5kKCd1bmxpbmsnLCBmYWxzZSwgbnVsbCk7CgkJCQl0aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSk7CgkJCX0KCQkKCQl9CgkKCQl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewoJCQl2YXIgbiA9IHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7CgkJCWlmICh0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50TGluayhuKSkgewoJCQkJdGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpLmFkZENsYXNzKCdhY3RpdmUnKTsKCQkJfSBlbHNlIGlmICh0aGlzLnJ0ZS5kb20uc2VsZWN0aW9uSGFzKGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4ubm9kZU5hbWUgPT0gJ0EnICYmIG4uaHJlZjsgfSkpIHsKCQkJCXRoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKS5hZGRDbGFzcygnYWN0aXZlJyk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoJ2Rpc2FibGVkJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoJCQl9CgkJfQoJfQoKfSkoalF1ZXJ5KTsKCg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/elrte.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogZWxSVEUgV1lTSVdZRyBIVE1MLWVkaXRvcgogKiBWZXJzaW9uIDEuMSAoMjAxMC0wOS0yMCkKICogaHR0cDovL2VscnRlLm9yZwogKgogKiBDb3B5cmlnaHQgMjAxMCwgU3R1ZGlvIDQyIEx0ZC4KICogTGljZW5zZWQgdW5kZXIgYSAzIGNsYXVzZXMgQlNEIGxpY2Vuc2UKICovCmZ1bmN0aW9uIGVsaTE4bihhKXt0aGlzLnRleHRkb21haW49ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubWVzc2FnZXNbYl0/dGhpcy5fZG9tYWluPWI6dGhpcy5fZG9tYWlufTthJiZhLm1lc3NhZ2VzJiZ0aGlzLmxvYWQoYS5tZXNzYWdlcyk7YSYmYS50ZXh0ZG9tYWluJiZ0aGlzLnRleHRkb21haW4oYS50ZXh0ZG9tYWluKX1lbGkxOG4ucHJvdG90eXBlPW5ldyBmdW5jdGlvbigpe3RoaXMubWVzc2FnZXM9e307dGhpcy5fZG9tYWluPSIiO3RoaXMubG9hZD1mdW5jdGlvbihjKXtpZih0eXBlb2YoYyk9PSJvYmplY3QiKXtmb3IodmFyIGYgaW4gYyl7dmFyIGI9Y1tmXTtpZih0eXBlb2YoYik9PSJvYmplY3QiKXtpZighdGhpcy5tZXNzYWdlc1tmXSl7dGhpcy5tZXNzYWdlc1tmXT17fX1mb3IodmFyIGEgaW4gYil7aWYodHlwZW9mKGJbYV0pPT0ic3RyaW5nIil7dGhpcy5tZXNzYWdlc1tmXVthXT1iW2FdfX19fX1yZXR1cm4gdGhpc307dGhpcy50cmFuc2xhdGU9ZnVuY3Rpb24oYixhKXt2YXIgYT1hJiZ0aGlzLm1lc3NhZ2VzW2FdP2E6dGhpcy5fZG9tYWluO3JldHVybiB0aGlzLm1lc3NhZ2VzW2FdJiZ0aGlzLm1lc3NhZ2VzW2FdW2JdP3RoaXMubWVzc2FnZXNbYV1bYl06Yn07dGhpcy5mb3JtYXQ9ZnVuY3Rpb24oZixiLGMpe2Y9dGhpcy50cmFuc2xhdGUoZixjKTtpZih0eXBlb2YoYik9PSJvYmplY3QiKXtmb3IodmFyIGEgaW4gYil7Zj1mLnJlcGxhY2UoIiUiK2EsdGhpcy50cmFuc2xhdGUoYlthXSxjKSl9fXJldHVybiBmfX07ZnVuY3Rpb24gZWxEaWFsb2dGb3JtKGMpe3ZhciBhPXRoaXM7dmFyIGI9eyJjbGFzcyI6ImVsLWRpYWxvZ2Zvcm0iLHN1Ym1pdDpmdW5jdGlvbihmLGcpe3dpbmRvdy5jb25zb2xlJiZ3aW5kb3cuY29uc29sZS5sb2cmJndpbmRvdy5jb25zb2xlLmxvZygic3VibWl0IGNhbGxlZCIpO2cuY2xvc2UoKX0sZm9ybTp7YWN0aW9uOndpbmRvdy5sb2NhdGlvbi5ocmVmLG1ldGhvZDoicG9zdCJ9LGFqYXhGb3JtOm51bGwsdmFsaWRhdGU6bnVsbCxzcGlubmVyOiJMb2FkaW5nIix0YWJzOnthY3RpdmU6MH0sdGFiUHJlZml4OiJlbC1kZi10YWItIixkaWFsb2c6e3RpdGxlOiJkaWFsb2ciLGF1dG9PcGVuOmZhbHNlLG1vZGFsOnRydWUscmVzaXphYmxlOmZhbHNlLGJ1dHRvbnM6e0NhbmNlbDpmdW5jdGlvbigpe2EuY2xvc2UoKX0sT2s6ZnVuY3Rpb24oKXthLmZvcm0udHJpZ2dlcigic3VibWl0Iil9fX19O3RoaXMub3B0cz1qUXVlcnkuZXh0ZW5kKHRydWUsYixjLHtkaWFsb2c6e2F1dG9PcGVuOmZhbHNlLGNsb3NlOmZ1bmN0aW9uKCl7YS5jbG9zZSgpfX19KTtpZih0aGlzLm9wdHMucnRsKXt0aGlzLm9wdHNbImNsYXNzIl0rPSIgZWwtZGlhbG9nZm9ybS1ydGwifWlmKGMmJmMuZGlhbG9nJiZjLmRpYWxvZy5idXR0b25zJiZ0eXBlb2YoYy5kaWFsb2cuYnV0dG9ucyk9PSJvYmplY3QiKXt0aGlzLm9wdHMuZGlhbG9nLmJ1dHRvbnM9Yy5kaWFsb2cuYnV0dG9uc310aGlzLnVsPW51bGw7dGhpcy50YWJzPXt9O3RoaXMuX3RhYmxlPW51bGw7dGhpcy5kaWFsb2c9alF1ZXJ5KCI8ZGl2IC8+IikuYWRkQ2xhc3ModGhpcy5vcHRzWyJjbGFzcyJdKS5kaWFsb2codGhpcy5vcHRzLmRpYWxvZyk7dGhpcy5tZXNzYWdlPWpRdWVyeSgnPGRpdiBjbGFzcz0iZWwtZGlhbG9nZm9ybS1tZXNzYWdlIHJvdW5kZWQtNSIgLz4nKS5oaWRlKCkuYXBwZW5kVG8odGhpcy5kaWFsb2cpO3RoaXMuZXJyb3I9alF1ZXJ5KCc8ZGl2IGNsYXNzPSJlbC1kaWFsb2dmb3JtLWVycm9yIHJvdW5kZWQtNSIgLz4nKS5oaWRlKCkuYXBwZW5kVG8odGhpcy5kaWFsb2cpO3RoaXMuc3Bpbm5lcj1qUXVlcnkoJzxkaXYgY2xhc3M9InNwaW5uZXIiIC8+JykuaGlkZSgpLmFwcGVuZFRvKHRoaXMuZGlhbG9nKTt0aGlzLmNvbnRlbnQ9alF1ZXJ5KCc8ZGl2IGNsYXNzPSJlbC1kaWFsb2dmb3JtLWNvbnRlbnQiIC8+JykuYXBwZW5kVG8odGhpcy5kaWFsb2cpO3RoaXMuZm9ybT1qUXVlcnkoIjxmb3JtIC8+IikuYXR0cih0aGlzLm9wdHMuZm9ybSkuYXBwZW5kVG8odGhpcy5jb250ZW50KTtpZih0aGlzLm9wdHMuc3VibWl0KXt0aGlzLmZvcm0uYmluZCgic3VibWl0IixmdW5jdGlvbihmKXthLm9wdHMuc3VibWl0KGYsYSl9KX1pZih0aGlzLm9wdHMuYWpheEZvcm0mJmpRdWVyeS5mbi5hamF4Rm9ybSl7dGhpcy5mb3JtLmFqYXhGb3JtKHRoaXMub3B0cy5hamF4Rm9ybSl9aWYodGhpcy5vcHRzLnZhbGlkYXRlKXt0aGlzLmZvcm0udmFsaWRhdGUodGhpcy5vcHRzLnZhbGlkYXRlKX10aGlzLm9wdGlvbj1mdW5jdGlvbihmLGcpe3JldHVybiB0aGlzLmRpYWxvZy5kaWFsb2coIm9wdGlvbiIsZixnKX07dGhpcy5zaG93RXJyb3I9ZnVuY3Rpb24oZixnKXt0aGlzLmhpZGVNZXNzYWdlKCk7dGhpcy5oaWRlU3Bpbm5lcigpO3RoaXMuZXJyb3IuaHRtbChmKS5zaG93KCk7ZyYmdGhpcy5jb250ZW50LmhpZGUoKTtyZXR1cm4gdGhpc307dGhpcy5oaWRlRXJyb3I9ZnVuY3Rpb24oKXt0aGlzLmVycm9yLnRleHQoIiIpLmhpZGUoKTt0aGlzLmNvbnRlbnQuc2hvdygpO3JldHVybiB0aGlzfTt0aGlzLnNob3dTcGlubmVyPWZ1bmN0aW9uKGYpe3RoaXMuZXJyb3IuaGlkZSgpO3RoaXMubWVzc2FnZS5oaWRlKCk7dGhpcy5jb250ZW50LmhpZGUoKTt0aGlzLnNwaW5uZXIudGV4dChmfHx0aGlzLm9wdHMuc3Bpbm5lcikuc2hvdygpO3RoaXMub3B0aW9uKCJidXR0b25zIix7fSk7cmV0dXJuIHRoaXN9O3RoaXMuaGlkZVNwaW5uZXI9ZnVuY3Rpb24oKXt0aGlzLmNvbnRlbnQuc2hvdygpO3RoaXMuc3Bpbm5lci5oaWRlKCk7cmV0dXJuIHRoaXN9O3RoaXMuc2hvd01lc3NhZ2U9ZnVuY3Rpb24oZixnKXt0aGlzLmhpZGVFcnJvcigpO3RoaXMuaGlkZVNwaW5uZXIoKTt0aGlzLm1lc3NhZ2UuaHRtbChmfHwiIikuc2hvdygpO2cmJnRoaXMuY29udGVudC5oaWRlKCk7cmV0dXJuIHRoaXN9O3RoaXMuaGlkZU1lc3NhZ2U9ZnVuY3Rpb24oKXt0aGlzLm1lc3NhZ2UuaGlkZSgpO3RoaXMuY29udGVudC5zaG93KCk7cmV0dXJuIHRoaXN9O3RoaXMudGFiPWZ1bmN0aW9uKGcsZil7Zz10aGlzLm9wdHMudGFiUHJlZml4K2c7aWYoIXRoaXMudWwpe3RoaXMudWw9alF1ZXJ5KCI8dWwgLz4iKS5wcmVwZW5kVG8odGhpcy5mb3JtKX1qUXVlcnkoIjxsaSAvPiIpLmFwcGVuZChqUXVlcnkoIjxhIC8+IikuYXR0cigiaHJlZiIsIiMiK2cpLmh0bWwoZikpLmFwcGVuZFRvKHRoaXMudWwpO3RoaXMudGFic1tnXT17dGFiOmpRdWVyeSgiPGRpdiAvPiIpLmF0dHIoImlkIixnKS5hZGRDbGFzcygidGFiIikuYXBwZW5kVG8odGhpcy5mb3JtKSx0YWJsZTpudWxsfTtyZXR1cm4gdGhpc307dGhpcy50YWJsZT1mdW5jdGlvbihmKXtmPWYmJmYuaW5kZXhPZih0aGlzLm9wdHMudGFiUHJlZml4KT09LTE/dGhpcy5vcHRzLnRhYlByZWZpeCtmOmY7aWYoZiYmdGhpcy50YWJzJiZ0aGlzLnRhYnNbZl0pe3RoaXMudGFic1tmXS50YWJsZT1qUXVlcnkoIjx0YWJsZSAvPiIpLmFwcGVuZFRvKHRoaXMudGFic1tmXS50YWIpfWVsc2V7dGhpcy5fdGFibGU9alF1ZXJ5KCI8dGFibGUgLz4iKS5hcHBlbmRUbyh0aGlzLmZvcm0pfXJldHVybiB0aGlzfTt0aGlzLmFwcGVuZD1mdW5jdGlvbihqLGssZyl7az1rPyJlbC1kZi10YWItIitrOiIiO2lmKCFqKXtyZXR1cm4gdGhpc31pZihrJiZ0aGlzLnRhYnNba10pe2lmKGcpeyF0aGlzLnRhYnNba10udGFibGUmJnRoaXMudGFibGUoayk7dmFyIGg9alF1ZXJ5KCI8dHIgLz4iKS5hcHBlbmRUbyh0aGlzLnRhYnNba10udGFibGUpO2lmKCFqUXVlcnkuaXNBcnJheShqKSl7aC5hcHBlbmQoalF1ZXJ5KCI8dGQgLz4iKS5hcHBlbmQoaikpfWVsc2V7Zm9yKHZhciBmPTA7ZjxqLmxlbmd0aDtmKyspe2guYXBwZW5kKGpRdWVyeSgiPHRkIC8+IikuYXBwZW5kKGpbZl0pKX19fWVsc2V7aWYoIWpRdWVyeS5pc0FycmF5KGopKXt0aGlzLnRhYnNba10udGFiLmFwcGVuZChqKX1lbHNle2Zvcih2YXIgZj0wO2Y8ai5sZW5ndGg7ZisrKXt0aGlzLnRhYnNba10udGFiLmFwcGVuZChqW2ZdKX19fX1lbHNle2lmKCFnKXtpZighalF1ZXJ5LmlzQXJyYXkoaikpe3RoaXMuZm9ybS5hcHBlbmQoail9ZWxzZXtmb3IodmFyIGY9MDtmPGoubGVuZ3RoO2YrKyl7dGhpcy5mb3JtLmFwcGVuZChqW2ZdKX19fWVsc2V7aWYoIXRoaXMuX3RhYmxlKXt0aGlzLnRhYmxlKCl9dmFyIGg9alF1ZXJ5KCI8dHIgLz4iKS5hcHBlbmRUbyh0aGlzLl90YWJsZSk7aWYoIWpRdWVyeS5pc0FycmF5KGopKXtoLmFwcGVuZChqUXVlcnkoIjx0ZCAvPiIpLmFwcGVuZChqKSl9ZWxzZXtmb3IodmFyIGY9MDtmPGoubGVuZ3RoO2YrKyl7aC5hcHBlbmQoalF1ZXJ5KCI8dGQgLz4iKS5hcHBlbmQoaltmXSkpfX19fXJldHVybiB0aGlzfTt0aGlzLnNlcGFyYXRvcj1mdW5jdGlvbihmKXtmPSJlbC1kZi10YWItIitmO2lmKHRoaXMudGFicyYmdGhpcy50YWJzW2ZdKXt0aGlzLnRhYnNbZl0udGFiLmFwcGVuZChqUXVlcnkoIjxkaXYgLz4iKS5hZGRDbGFzcygic2VwYXJhdG9yIikpO3RoaXMudGFic1tmXS50YWJsZSYmdGhpcy50YWJsZShmKX1lbHNle3RoaXMuZm9ybS5hcHBlbmQoalF1ZXJ5KCI8ZGl2IC8+IikuYWRkQ2xhc3MoInNlcGFyYXRvciIpKX1yZXR1cm4gdGhpc307dGhpcy5vcGVuPWZ1bmN0aW9uKCl7dGhpcy51bCYmdGhpcy5mb3JtLnRhYnModGhpcy5vcHRzLnRhYnMpO3RoaXMuZm9ybS5maW5kKCI6dGV4dCIpLmtleXVwKGZ1bmN0aW9uKGcpe2lmKGcua2V5Q29kZT09MTMpe2YuZm9ybS5zdWJtaXQoKX19KTt0aGlzLmRpYWxvZy5hdHRyKCJ1bnNlbGVjdGFibGUiLCJvbiIpLmRpYWxvZygib3BlbiIpO3ZhciBmPXRoaXM7aWYodGhpcy5mb3JtJiZ0aGlzLmZvcm0uZmluZCgiOnRleHQiKS5sZW5ndGgpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmZvcm0uZmluZCgiOnRleHQiKVswXS5mb2N1cygpfSwyMCl9cmV0dXJuIHRoaXN9O3RoaXMuY2xvc2U9ZnVuY3Rpb24oKXtpZih0eXBlb2YodGhpcy5vcHRzLmNsb3NlKT09ImZ1bmN0aW9uIil7dGhpcy5vcHRzLmNsb3NlKCl9dGhpcy5kaWFsb2cuZGlhbG9nKCJkZXN0cm95IikucmVtb3ZlKCl9fShmdW5jdGlvbihhKXthLmZuLmVsQ29sb3JQaWNrZXI9ZnVuY3Rpb24oaCl7dmFyIGI9dGhpczt2YXIgZj1hLmV4dGVuZCh7fSxhLmZuLmVsQ29sb3JQaWNrZXIuZGVmYXVsdHMsaCk7dGhpcy5oaWRkZW49YSgnPGlucHV0IHR5cGU9ImhpZGRlbiIgLz4nKS5hdHRyKCJuYW1lIixmLm5hbWUpLnZhbChmLmNvbG9yfHwiIikuYXBwZW5kVG8odGhpcyk7dGhpcy5wYWxldHRlPW51bGw7dGhpcy5wcmV2aWV3PW51bGw7dGhpcy5pbnB1dD1udWxsO2Z1bmN0aW9uIGMoail7Yi52YWwoaik7Zi5jaGFuZ2UmJmYuY2hhbmdlKGIudmFsKCkpO2IucGFsZXR0ZS5zbGlkZVVwKCl9ZnVuY3Rpb24gZygpe2IucGFsZXR0ZT1hKCI8ZGl2IC8+IikuYWRkQ2xhc3MoZi5wYWxldHRlQ2xhc3MrIiByb3VuZGVkLTMiKTtmb3IodmFyIGo9MDtqPGYuY29sb3JzLmxlbmd0aDtqKyspe2EoIjxkaXYgLz4iKS5hZGRDbGFzcygiY29sb3IiKS5jc3MoImJhY2tncm91bmQtY29sb3IiLGYuY29sb3JzW2pdKS5hdHRyKHt0aXRsZTpmLmNvbG9yc1tqXSx1bnNlbGVjdGFibGU6Im9uIn0pLmFwcGVuZFRvKGIucGFsZXR0ZSkubW91c2VlbnRlcihmdW5jdGlvbigpe3ZhciBrPWEodGhpcykuYXR0cigidGl0bGUiKTtiLmlucHV0LnZhbChrKTtiLnByZXZpZXcuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIixrKX0pLmNsaWNrKGZ1bmN0aW9uKGspe2suc3RvcFByb3BhZ2F0aW9uKCk7YyhhKHRoaXMpLmF0dHIoInRpdGxlIikpfSl9Yi5pbnB1dD1hKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hZGRDbGFzcygicm91bmRlZC0zIikuYXR0cigic2l6ZSIsOCkuY2xpY2soZnVuY3Rpb24oayl7ay5zdG9wUHJvcGFnYXRpb24oKX0pLmtleWRvd24oZnVuY3Rpb24ocCl7aWYocC5jdHJsS2V5fHxwLm1ldGFLZXkpe3JldHVybiB0cnVlfXZhciBvPXAua2V5Q29kZTtpZihvPT0yNyl7cmV0dXJuIGIubW91c2VsZWF2ZSgpfWlmKG8hPTgmJm8hPTEzJiZvIT00NiYmbyE9MzcmJm8hPTM5JiYobzw0OHx8bz41NykmJihvPDY1fHxvPjcwKSl7cmV0dXJuIGZhbHNlfXZhciBxPWEodGhpcykudmFsKCk7aWYocS5sZW5ndGg9PTd8fHEubGVuZ3RoPT0wKXtpZihvPT0xMyl7cC5zdG9wUHJvcGFnYXRpb24oKTtwLnByZXZlbnREZWZhdWx0KCk7YyhxKTtiLnBhbGV0dGUuc2xpZGVVcCgpfWlmKHAua2V5Q29kZSE9OCYmcC5rZXlDb2RlIT00NiYmbyE9MzcmJm8hPTM5KXtyZXR1cm4gZmFsc2V9fX0pLmtleXVwKGZ1bmN0aW9uKGspe3ZhciBvPWEodGhpcykudmFsKCk7by5sZW5ndGg9PTcmJi9eI1swLTlhYmNkZWZdezZ9JC9pLnRlc3QobykmJmIudmFsKG8pfSk7Yi5wcmV2aWV3PWEoIjxkaXYgLz4iKS5hZGRDbGFzcygicHJldmlldyByb3VuZGVkLTMiKS5jbGljayhmdW5jdGlvbihrKXtrLnN0b3BQcm9wYWdhdGlvbigpO2MoYi5pbnB1dC52YWwoKSl9KTtiLnBhbGV0dGUuYXBwZW5kKGEoIjxkaXYgLz4iKS5hZGRDbGFzcygiY2xlYXJmaXgiKSkuYXBwZW5kKGEoIjxkaXYgLz4iKS5hZGRDbGFzcygicGFuZWwiKS5hcHBlbmQoYi5pbnB1dCkuYXBwZW5kKGIucHJldmlldykpO2lmKGYucGFsZXR0ZVBvc2l0aW9uPT0ib3V0ZXIiKXtiLnBhbGV0dGUuaGlkZSgpLmFwcGVuZFRvKGIucGFyZW50cygiYm9keSIpLmVxKDApKS5tb3VzZWxlYXZlKGZ1bmN0aW9uKCl7YSh0aGlzKS5zbGlkZVVwKCk7Yi52YWwoYi52YWwoKSl9KTtiLm1vdXNlbGVhdmUoZnVuY3Rpb24oayl7aWYoay5yZWxhdGVkVGFyZ2V0IT1iLnBhbGV0dGUuZ2V0KDApKXtiLnBhbGV0dGUuc2xpZGVVcCgpO2IudmFsKGIudmFsKCkpfX0pfWVsc2V7Yi5hcHBlbmQoYi5wYWxldHRlLmhpZGUoKSkubW91c2VsZWF2ZShmdW5jdGlvbihrKXtiLnBhbGV0dGUuc2xpZGVVcCgpO2IudmFsKGIudmFsKCkpfSl9Yi52YWwoYi52YWwoKSl9dGhpcy5lbXB0eSgpLmFkZENsYXNzKGZbImNsYXNzIl0rIiByb3VuZGVkLTMiKS5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsImJhY2tncm91bmQtY29sb3IiOmYuY29sb3J8fCIifSkuY2xpY2soZnVuY3Rpb24ocCl7aWYoIWIuaGFzQ2xhc3MoImRpc2FibGVkIikpeyFiLnBhbGV0dGUmJmcoKTtpZihmLnBhbGV0dGVQb3NpdGlvbj09Im91dGVyIiYmYi5wYWxldHRlLmNzcygiZGlzcGxheSIpPT0ibm9uZSIpe3ZhciBxPWEodGhpcykub2Zmc2V0KCk7dmFyIGs9Yi5wYWxldHRlLndpZHRoKCk7dmFyIGo9Yi5wYXJlbnRzKCJib2R5Iikud2lkdGgoKS1xLmxlZnQ+PWs/cS5sZWZ0OnEubGVmdCthKHRoaXMpLm91dGVyV2lkdGgoKS1rO2IucGFsZXR0ZS5jc3Moe2xlZnQ6aisicHgiLHRvcDpxLnRvcCthKHRoaXMpLmhlaWdodCgpKzErInB4In0pfWIucGFsZXR0ZS5zbGlkZVRvZ2dsZSgpfX0pO3RoaXMudmFsPWZ1bmN0aW9uKGope2lmKCFqJiZqIT09IiIpe3JldHVybiB0aGlzLmhpZGRlbi52YWwoKX1lbHNle3RoaXMuaGlkZGVuLnZhbChqKTtpZihmLnVwZGF0ZSl7Zi51cGRhdGUodGhpcy5oaWRkZW4udmFsKCkpfWVsc2V7dGhpcy5jc3MoImJhY2tncm91bmQtY29sb3IiLGopfWlmKGIucGFsZXR0ZSl7Yi5wcmV2aWV3LmNzcygiYmFja2dyb3VuZC1jb2xvciIsaik7Yi5pbnB1dC52YWwoail9fXJldHVybiB0aGlzfTtyZXR1cm4gdGhpc307YS5mbi5lbENvbG9yUGlja2VyLmRlZmF1bHRzPXsiY2xhc3MiOiJlbC1jb2xvcnBpY2tlciIscGFsZXR0ZUNsYXNzOiJlbC1wYWxldHRlIixwYWxldHRlUG9zaXRpb246ImlubmVyIixuYW1lOiJjb2xvciIsY29sb3I6IiIsdXBkYXRlOm51bGwsY2hhbmdlOmZ1bmN0aW9uKGIpe30sY29sb3JzOlsiI2ZmZmZmZiIsIiNjY2NjY2MiLCIjOTk5OTk5IiwiIzY2NjY2NiIsIiMzMzMzMzMiLCIjMDAwMDAwIiwiI2ZmY2NjYyIsIiNjYzk5OTkiLCIjOTk2NjY2IiwiIzY2MzMzMyIsIiMzMzAwMDAiLCIjZmY5OTk5IiwiI2NjNjY2NiIsIiNjYzMzMzMiLCIjOTkzMzMzIiwiIzY2MDAwMCIsIiNmZjY2NjYiLCIjZmYzMzMzIiwiI2ZmMDAwMCIsIiNjYzAwMDAiLCIjOTkwMDAwIiwiI2ZmOTk2NiIsIiNmZjY2MzMiLCIjZmYzMzAwIiwiI2NjMzMwMCIsIiM5OTMzMDAiLCIjZmZjYzk5IiwiI2NjOTk2NiIsIiNjYzY2MzMiLCIjOTk2NjMzIiwiIzY2MzMwMCIsIiNmZjk5MzMiLCIjZmY2NjAwIiwiI2ZmOTkwMCIsIiNjYzY2MDAiLCIjY2M5OTMzIiwiI2ZmY2M2NiIsIiNmZmNjMzMiLCIjZmZjYzAwIiwiI2NjOTkwMCIsIiM5OTY2MDAiLCIjZmZmZmNjIiwiI2NjY2M5OSIsIiM5OTk5NjYiLCIjNjY2NjMzIiwiIzMzMzMwMCIsIiNmZmZmOTkiLCIjY2NjYzY2IiwiI2NjY2MzMyIsIiM5OTk5MzMiLCIjNjY2NjAwIiwiI2ZmZmY2NiIsIiNmZmZmMzMiLCIjZmZmZjAwIiwiI2NjY2MwMCIsIiM5OTk5MDAiLCIjY2NmZjY2IiwiI2NjZmYzMyIsIiNjY2ZmMDAiLCIjOTljYzAwIiwiIzY2OTkwMCIsIiNjY2ZmOTkiLCIjOTljYzY2IiwiIzk5Y2MzMyIsIiM2Njk5MzMiLCIjMzM2NjAwIiwiIzk5ZmYzMyIsIiM5OWZmMDAiLCIjNjZmZjAwIiwiIzY2Y2MwMCIsIiM2NmNjMzMiLCIjOTlmZjY2IiwiIzY2ZmYzMyIsIiMzM2ZmMDAiLCIjMzNjYzAwIiwiIzMzOTkwMCIsIiNjY2ZmY2MiLCIjOTljYzk5IiwiIzY2OTk2NiIsIiMzMzY2MzMiLCIjMDAzMzAwIiwiIzk5ZmY5OSIsIiM2NmNjNjYiLCIjMzNjYzMzIiwiIzMzOTkzMyIsIiMwMDY2MDAiLCIjNjZmZjY2IiwiIzMzZmYzMyIsIiMwMGZmMDAiLCIjMDBjYzAwIiwiIzAwOTkwMCIsIiM2NmZmOTkiLCIjMzNmZjY2IiwiIzAwZmYzMyIsIiMwMGNjMzMiLCIjMDA5OTMzIiwiIzk5ZmZjYyIsIiM2NmNjOTkiLCIjMzNjYzY2IiwiIzMzOTk2NiIsIiMwMDY2MzMiLCIjMzNmZjk5IiwiIzAwZmY2NiIsIiMwMGZmOTkiLCIjMDBjYzY2IiwiIzMzY2M5OSIsIiM2NmZmY2MiLCIjMzNmZmNjIiwiIzAwZmZjYyIsIiMwMGNjOTkiLCIjMDA5OTY2IiwiI2NjZmZmZiIsIiM5OWNjY2MiLCIjNjY5OTk5IiwiIzMzNjY2NiIsIiMwMDMzMzMiLCIjOTlmZmZmIiwiIzY2Y2NjYyIsIiMzM2NjY2MiLCIjMzM5OTk5IiwiIzAwNjY2NiIsIiM2NmNjY2MiLCIjMzNmZmZmIiwiIzAwZmZmZiIsIiMwMGNjY2MiLCIjMDA5OTk5IiwiIzY2Y2NmZiIsIiMzM2NjZmYiLCIjMDBjY2ZmIiwiIzAwOTljYyIsIiMwMDY2OTkiLCIjOTljY2ZmIiwiIzY2OTljYyIsIiMzMzk5Y2MiLCIjMzM2Njk5IiwiIzAwMzM2NiIsIiMzMzk5ZmYiLCIjMDA5OWZmIiwiIzAwNjZmZiIsIiMwNjZjY2MiLCIjMzM2NmNjIiwiIzY2OTlmZiIsIiMzMzY2ZmYiLCIjMDAzM2ZmIiwiIzAwMzNjYyIsIiMwMDMzOTkiLCIjY2NjY2ZmIiwiIzk5OTljYyIsIiM2NjY2OTkiLCIjMzMzMzY2IiwiIzAwMDAzMyIsIiM5OTk5ZmYiLCIjNjY2NmNjIiwiIzMzMzNjYyIsIiMzMzMzOTkiLCIjMDAwMDY2IiwiIzY2NjZmZiIsIiMzMzMzZmYiLCIjMDAwMGZmIiwiIzAwMDBjYyIsIiMwMDk5OTkiLCIjOTk2NmZmIiwiIzY2MzNmZiIsIiMzMzAwZmYiLCIjMzMwMGNjIiwiIzMzMDA5OSIsIiNjYzk5ZmYiLCIjOTk2NmNjIiwiIzY2MzNjYyIsIiM2NjMzOTkiLCIjMzMwMDY2IiwiIzk5MzNmZiIsIiM2NjAwZmYiLCIjOTkwMGZmIiwiIzY2MDBjYyIsIiM5OTMzY2MiLCIjY2M2NmZmIiwiI2NjMzNmZiIsIiNjYzAwZmYiLCIjOTkwMGNjIiwiIzY2MDA5OSIsIiNmZmNjZmYiLCIjY2M5OWNjIiwiIzk5NjY5OSIsIiM2NjMzNjYiLCIjMzMwMDMzIiwiI2ZmOTlmZiIsIiNjYzY2Y2MiLCIjY2MzM2NjIiwiIzk5MzM5OSIsIiM2NjAwNjYiLCIjZmY2NmZmIiwiI2ZmMzNmZiIsIiNmZjAwZmYiLCIjY2MwMGNjIiwiIzk5MDA5OSIsIiNmZjY2Y2MiLCIjZmYzM2NjIiwiI2ZmMDBjYyIsIiNjYzAwOTkiLCIjOTkwMDY2IiwiI2ZmOTljYyIsIiNjYzY2OTkiLCIjY2MzMzk5IiwiIzk5MzM2NiIsIiM2NjAwMzMiLCIjZmYzMzk5IiwiI2ZmMDA5OSIsIiNmZjAwNjYiLCIjY2MwMDY2IiwiI2NjMzM2NiIsIiNmZjY2OTkiLCIjZmYzMzY2IiwiI2ZmMDAzMyIsIiNjYzAwMzMiLCIjOTkwMDMzIl19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7YS5mbi5lbEJvcmRlclNlbGVjdD1mdW5jdGlvbihoKXt2YXIgaz10aGlzO3ZhciBxPXRoaXMuZXEoMCk7dmFyIGI9YS5leHRlbmQoe30sYS5mbi5lbEJvcmRlclNlbGVjdC5kZWZhdWx0cyxoKTt2YXIgZj1hKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKHtuYW1lOmIubmFtZSsiW3dpZHRoXSIsc2l6ZTozfSkuY3NzKCJ0ZXh0LWFsaWduIiwicmlnaHQiKS5jaGFuZ2UoZnVuY3Rpb24oKXtrLmNoYW5nZSgpfSk7dmFyIGo9YSgiPGRpdiAvPiIpLmNzcygicG9zaXRpb24iLCJyZWxhdGl2ZSIpLmVsQ29sb3JQaWNrZXIoeyJjbGFzcyI6ImVsLWNvbG9ycGlja2VyIHVpLWljb24gdWktaWNvbi1wZW5jaWwiLG5hbWU6Yi5uYW1lKyJbY29sb3JdIixwYWxldHRlUG9zaXRpb246Im91dGVyIixjaGFuZ2U6ZnVuY3Rpb24oKXtrLmNoYW5nZSgpfX0pO3ZhciBjPWEoIjxkaXYgLz4iKS5lbFNlbGVjdCh7dHBsOic8ZGl2IHN0eWxlPSJib3JkZXItYm90dG9tOjRweCAldmFsICMwMDA7d2lkdGg6MTAwJTttYXJnaW46N3B4IDAiPiA8L2Rpdj4nLHRwbHM6eyIiOiIlbGFiZWwifSxtYXhIZWlnaHQ6Yi5zdHlsZUhlaWdodHx8bnVsbCxzZWxlY3Q6ZnVuY3Rpb24oKXtrLmNoYW5nZSgpfSxzcmM6eyIiOiJub25lIixzb2xpZDoic29saWQiLGRhc2hlZDoiZGFzaGVkIixkb3R0ZWQ6ImRvdHRlZCIsImRvdWJsZSI6ImRvdWJsZSIsZ3Jvb3ZlOiJncm9vdmUiLHJpZGdlOiJyaWRnZSIsaW5zZXQ6Imluc2V0IixvdXRzZXQ6Im91dHNldCJ9fSk7cS5lbXB0eSgpLmFkZENsYXNzKGJbImNsYXNzIl0pLmF0dHIoIm5hbWUiLGIubmFtZXx8IiIpLmFwcGVuZChhKCI8dGFibGUgLz4iKS5hdHRyKCJjZWxsc3BhY2luZyIsMCkuYXBwZW5kKGEoIjx0ciAvPiIpLmFwcGVuZChhKCI8dGQgLz4iKS5hcHBlbmQoZikuYXBwZW5kKCIgcHgiKSkuYXBwZW5kKGEoIjx0ZCAvPiIpLmFwcGVuZChjKSkuYXBwZW5kKGEoIjx0ZCAvPiIpLmFwcGVuZChqKSkpKTtmdW5jdGlvbiBnKHQpe2Z1bmN0aW9uIHIodSl7aGV4RGlnaXRzPVsiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsImEiLCJiIiwiYyIsImQiLCJlIiwiZiJdO3JldHVybiAhdT8iMDAiOmhleERpZ2l0c1sodS11JTE2KS8xNl0raGV4RGlnaXRzW3UlMTZdfXZhciBvPSh0fHwiIikubWF0Y2goL1woKFswLTldezEsM30pLFxzKihbMC05XXsxLDN9KSxccyooWzAtOV17MSwzfSlcKS8pO3JldHVybiBvPyIjIityKG9bMV0pK3Iob1syXSkrcihvWzNdKToiIn1mdW5jdGlvbiBwKHIpe2lmKCFyKXtyZXR1cm4gcn12YXIgbz1yLm1hdGNoKC8oWzAtOV0rXC4/WzAtOV0qKVxzKihweHxwdHxlbXwlKS8pO2lmKG8pe3I9b1sxXTt1bml0PW9bMl19aWYoclswXT09Ii4iKXtyPSIwIityfXI9cGFyc2VGbG9hdChyKTtpZihpc05hTihyKSl7cmV0dXJuIiJ9dmFyIHQ9cGFyc2VJbnQoYShkb2N1bWVudC5ib2R5KS5jc3MoImZvbnQtc2l6ZSIpKXx8MTY7c3dpdGNoKHVuaXQpe2Nhc2UiZW0iOnJldHVybiBwYXJzZUludChyKnQpO2Nhc2UicHQiOnJldHVybiBwYXJzZUludChyKnQvMTIpO2Nhc2UiJSI6cmV0dXJuIHBhcnNlSW50KHIqdC8xMDApfXJldHVybiByfXRoaXMuY2hhbmdlPWZ1bmN0aW9uKCl7Yi5jaGFuZ2UmJmIuY2hhbmdlKHRoaXMudmFsKCkpfTt0aGlzLnZhbD1mdW5jdGlvbih1KXtpZighdSYmdSE9PSIiKXt2YXIgdD1wYXJzZUludChmLnZhbCgpKTtyZXR1cm57d2lkdGg6IWlzTmFOKHQpP3QrInB4IjoiIixzdHlsZTpjLnZhbCgpLGNvbG9yOmoudmFsKCl9fWVsc2V7dmFyIHIsdCx4LHosbz0iIjtpZih1Lm5vZGVOYW1lfHx1LmNzcyl7aWYoIXUuY3NzKXt1PWEodSl9dmFyIG89dS5jc3MoImJvcmRlciIpO2lmKChvPXUuY3NzKCJib3JkZXIiKSkpe3Q9eD16PW99ZWxzZXt0PXUuY3NzKCJib3JkZXItd2lkdGgiKTt4PXUuY3NzKCJib3JkZXItc3R5bGUiKTt6PXUuY3NzKCJib3JkZXItY29sb3IiKX19ZWxzZXt0PXUud2lkdGh8fCIiO3g9dS5zdHlsZXx8IiI7ej11LmNvbG9yfHwiIn1mLnZhbChwKHQpKTt2YXIgcj14P3gubWF0Y2goLyhzb2xpZHxkYXNoZWR8ZG90dGVkfGRvdWJsZXxncm9vdmV8cmlkZ2V8aW5zZXR8b3V0c2V0KS9pKToiIjtjLnZhbChyP3JbMV06IiIpO2oudmFsKGcoeikpO3JldHVybiB0aGlzfX07dGhpcy52YWwoYi52YWx1ZSk7cmV0dXJuIHRoaXN9O2EuZm4uZWxCb3JkZXJTZWxlY3QuZGVmYXVsdHM9e25hbWU6ImVsLWJvcmRlcnNlbGVjdCIsImNsYXNzIjoiZWwtYm9yZGVyc2VsZWN0Iix2YWx1ZTp7fSxjaGFuZ2U6bnVsbH19KShqUXVlcnkpOyhmdW5jdGlvbihhKXthLmZuLmVsUGFkZGluZ0lucHV0PWZ1bmN0aW9uKGcpe3ZhciBjPXRoaXM7dmFyIGY9YS5leHRlbmQoe30sYS5mbi5lbFBhZGRpbmdJbnB1dC5kZWZhdWx0cyx7bmFtZTp0aGlzLmF0dHIoIm5hbWUiKX0sZyk7dGhpcy5yZWdleHBzPXttYWluOm5ldyBSZWdFeHAoZi50eXBlPT0icGFkZGluZyI/J3BhZGRpbmdzKjpzKihbXjsiXSspJzonbWFyZ2lucyo6cyooW147Il0rKScsImltIiksbGVmdDpuZXcgUmVnRXhwKGYudHlwZT09InBhZGRpbmciPydwYWRkaW5nLWxlZnRzKjpzKihbXjsiXSspJzonbWFyZ2luLWxlZnRzKjpzKihbXjsiXSspJywiaW0iKSx0b3A6bmV3IFJlZ0V4cChmLnR5cGU9PSJwYWRkaW5nIj8ncGFkZGluZy10b3BzKjpzKihbXjsiXSspJzonbWFyZ2luLXRvcHMqOnMqKFteOyJdKyknLCJpbSIpLHJpZ2h0Om5ldyBSZWdFeHAoZi50eXBlPT0icGFkZGluZyI/J3BhZGRpbmctcmlnaHRzKjpzKihbXjsiXSspJzonbWFyZ2luLXJpZ2h0cyo6cyooW147Il0rKScsImltIiksYm90dG9tOm5ldyBSZWdFeHAoZi50eXBlPT0icGFkZGluZyI/J3BhZGRpbmctYm90dG9tcyo6cyooW147Il0rKSc6J21hcmdpbi1ib3R0b21zKjpzKihbXjsiXSspJywiaW0iKX07YS5lYWNoKFsibGVmdCIsInRvcCIsInJpZ2h0IiwiYm90dG9tIl0sZnVuY3Rpb24oKXtjW3RoaXNdPWEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoInNpemUiLDMpLmNzcygidGV4dC1hbGlnbiIsInJpZ2h0IikuY3NzKCJib3JkZXItIit0aGlzLCIycHggc29saWQgcmVkIikuYmluZCgiY2hhbmdlIixmdW5jdGlvbigpe2EodGhpcykudmFsKGIoYSh0aGlzKS52YWwoKSkpO2goKX0pLmF0dHIoIm5hbWUiLGYubmFtZSsiWyIrdGhpcysiXSIpfSk7YS5lYWNoKFsidWxlZnQiLCJ1dG9wIiwidXJpZ2h0IiwidWJvdHRvbSJdLGZ1bmN0aW9uKCl7Y1t0aGlzXT1hKCI8c2VsZWN0IC8+IikuYXBwZW5kKCc8b3B0aW9uIHZhbHVlPSJweCI+cHg8L29wdGlvbj4nKS5hcHBlbmQoJzxvcHRpb24gdmFsdWU9ImVtIj5lbTwvb3B0aW9uPicpLmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT0icHQiPnB0PC9vcHRpb24+JykuYmluZCgiY2hhbmdlIixmdW5jdGlvbigpe2goKX0pLmF0dHIoIm5hbWUiLGYubmFtZSsiWyIrdGhpcysiXSIpO2lmKGYucGVyY2VudHMpe2NbdGhpc10uYXBwZW5kKCc8b3B0aW9uIHZhbHVlPSIlIj4lPC9vcHRpb24+Jyl9fSk7dGhpcy5lbXB0eSgpLmFkZENsYXNzKGZbImNsYXNzIl0pLmFwcGVuZCh0aGlzLmxlZnQpLmFwcGVuZCh0aGlzLnVsZWZ0KS5hcHBlbmQoIiB4ICIpLmFwcGVuZCh0aGlzLnRvcCkuYXBwZW5kKHRoaXMudXRvcCkuYXBwZW5kKCIgeCAiKS5hcHBlbmQodGhpcy5yaWdodCkuYXBwZW5kKHRoaXMudXJpZ2h0KS5hcHBlbmQoIiB4ICIpLmFwcGVuZCh0aGlzLmJvdHRvbSkuYXBwZW5kKHRoaXMudWJvdHRvbSk7dGhpcy52YWw9ZnVuY3Rpb24oeil7aWYoIXomJnohPT0iIil7dmFyIHE9Yih0aGlzLmxlZnQudmFsKCkpO3ZhciBBPWIodGhpcy50b3AudmFsKCkpO3ZhciBqPWIodGhpcy5yaWdodC52YWwoKSk7dmFyIHg9Yih0aGlzLmJvdHRvbS52YWwoKSk7dmFyIHc9e2xlZnQ6cT09ImF1dG8ifHxxPT0wP3E6KHEhPT0iIj9xK3RoaXMudWxlZnQudmFsKCk6IiIpLHRvcDpBPT0iYXV0byJ8fEE9PTA/QTooQSE9PSIiP0ErdGhpcy51dG9wLnZhbCgpOiIiKSxyaWdodDpqPT0iYXV0byJ8fGo9PTA/ajooaiE9PSIiP2ordGhpcy51cmlnaHQudmFsKCk6IiIpLGJvdHRvbTp4PT0iYXV0byJ8fHg9PTA/eDooeCE9PSIiP3grdGhpcy51Ym90dG9tLnZhbCgpOiIiKSxjc3M6IiJ9O2lmKHcubGVmdCE9PSIiJiZ3LnJpZ2h0IT09IiImJncudG9wIT09IiImJncuYm90dG9tIT09IiIpe2lmKHcubGVmdD09dy5yaWdodCYmdy50b3A9PXcuYm90dG9tKXt3LmNzcz13LnRvcCsiICIrdy5sZWZ0fWVsc2V7dy5jc3M9dy50b3ArIiAiK3cucmlnaHQrIiAiK3cuYm90dG9tKyIgIit3LmxlZnR9fXJldHVybiB3fWVsc2V7aWYoei5ub2RlTmFtZXx8ei5jc3Mpe2lmKCF6LmNzcyl7ej1hKHopfXZhciBvPXtsZWZ0OiIiLHRvcDoiIixyaWdodDoiIixib3R0b206IiJ9O3ZhciBrPSh6LmF0dHIoInN0eWxlIil8fCIiKS50b0xvd2VyQ2FzZSgpO2lmKGspe2s9YS50cmltKGspO3ZhciBwPWsubWF0Y2godGhpcy5yZWdleHBzLm1haW4pO2lmKHApe3ZhciB1PWEudHJpbShwWzFdKS5yZXBsYWNlKC9ccysvZywiICIpLnNwbGl0KCIgIiw0KTtvLnRvcD11WzBdO28ucmlnaHQ9dVsxXSYmdVsxXSE9PSIiP3VbMV06by50b3A7by5ib3R0b209dVsyXSYmdVsyXSE9PSIiP3VbMl06by50b3A7by5sZWZ0PXVbM10mJnVbM10hPT0iIj91WzNdOm8ucmlnaHR9ZWxzZXthLmVhY2goWyJsZWZ0IiwidG9wIiwicmlnaHQiLCJib3R0b20iXSxmdW5jdGlvbigpe3ZhciByPXRoaXMudG9TdHJpbmcoKTtwPWsubWF0Y2goYy5yZWdleHBzW3JdKTtpZihwKXtvW3JdPXBbMV19fSl9fXZhciB6PW99YS5lYWNoKFsibGVmdCIsInRvcCIsInJpZ2h0IiwiYm90dG9tIl0sZnVuY3Rpb24oKXt2YXIgdD10aGlzLnRvU3RyaW5nKCk7aWYodHlwZW9mKHpbdF0pIT0idW5kZWZpbmVkIiYmelt0XSE9PW51bGwpe3pbdF09elt0XS50b1N0cmluZygpO3ZhciB2PWIoelt0XSk7Y1t0XS52YWwodik7dmFyIHI9elt0XS5tYXRjaCgvKHB4fGVtfHB0fCUpL2kpO2NbInUiK3RdLnZhbChyP3JbMV06InB4Iil9fSk7cmV0dXJuIHRoaXN9fTtmdW5jdGlvbiBiKGope2o9YS50cmltKGoudG9TdHJpbmcoKSk7aWYoalswXT09Ii4iKXtqPSIwIitqfW49cGFyc2VGbG9hdChqKTtyZXR1cm4gIWlzTmFOKG4pP246KGo9PSJhdXRvIj9qOiIiKX1mdW5jdGlvbiBoKCl7Zi5jaGFuZ2UmJmYuY2hhbmdlKGMpfXRoaXMudmFsKGYudmFsdWUpO3JldHVybiB0aGlzfTthLmZuLmVsUGFkZGluZ0lucHV0LmRlZmF1bHRzPXtuYW1lOiJlbC1wYWRkaW5naW5wdXQiLCJjbGFzcyI6ImVsLXBhZGRpbmdpbnB1dCIsdHlwZToicGFkZGluZyIsdmFsdWU6e30scGVyY2VudHM6dHJ1ZSxjaGFuZ2U6bnVsbH19KShqUXVlcnkpOyhmdW5jdGlvbihhKXthLmZuLmVsU2VsZWN0PWZ1bmN0aW9uKGMpe3ZhciBxPXRoaXM7dmFyIHU9dGhpcy5lcSgwKTt2YXIgYj1hLmV4dGVuZCh7fSxhLmZuLmVsU2VsZWN0LmRlZmF1bHRzLGMpO3ZhciBnPWEoJzxpbnB1dCB0eXBlPSJoaWRkZW4iIC8+JykuYXR0cigibmFtZSIsYi5uYW1lKTt2YXIgcD1hKCI8bGFiZWwgLz4iKS5hdHRyKHt1bnNlbGVjdGFibGU6Im9uIn0pLmFkZENsYXNzKCJyb3VuZGVkLWxlZnQtMyIpO3ZhciBoPW51bGw7dmFyIGs9bnVsbDtpZih1LmdldCgwKS5ub2RlTmFtZT09IlNFTEVDVCIpe2Iuc3JjPXt9O3UuY2hpbGRyZW4oIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKXtiLnNyY1thKHRoaXMpLnZhbCgpXT1hKHRoaXMpLnRleHQoKX0pO2IudmFsdWU9dS52YWwoKTtiLm5hbWU9dS5hdHRyKCJuYW1lIik7dS5yZXBsYWNlV2l0aCgodT1hKCI8ZGl2IC8+IikpKX1pZighYi52YWx1ZXx8IWIuc3JjW2IudmFsXSl7Yi52YWx1ZT1udWxsO3ZhciBmPTA7Zm9yKHZhciByIGluIGIuc3JjKXtpZihmKys9PTApe2IudmFsdWU9cn19fXRoaXMudmFsPWZ1bmN0aW9uKG8pe2lmKCFvJiZvIT09IiIpe3JldHVybiBnLnZhbCgpfWVsc2V7aWYoYi5zcmNbb10pe2cudmFsKG8pO2oobyk7aWYoaCl7aC5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKXtpZihhKHRoaXMpLmF0dHIoIm5hbWUiKT09byl7YSh0aGlzKS5hZGRDbGFzcygiYWN0aXZlIil9ZWxzZXthKHRoaXMpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKX19KX19cmV0dXJuIHRoaXN9fTtmdW5jdGlvbiBqKG8pe3ZhciB3PWIubGFiZWxUcGx8fGIudHBsc1tvXXx8Yi50cGw7cC5odG1sKHcucmVwbGFjZSgvJXZhbC9nLG8pLnJlcGxhY2UoLyVsYWJlbC8sYi5zcmNbb10pKS5jaGlsZHJlbigpLmF0dHIoe3Vuc2VsZWN0YWJsZToib24ifSl9dS5lbXB0eSgpLmFkZENsYXNzKGJbImNsYXNzIl0rIiByb3VuZGVkLTMiKS5hdHRyKHt1bnNlbGVjdGFibGU6Im9uIn0pLmFwcGVuZChnKS5hcHBlbmQocCkuaG92ZXIoZnVuY3Rpb24oKXthKHRoaXMpLmFkZENsYXNzKCJob3ZlciIpfSxmdW5jdGlvbigpe2EodGhpcykucmVtb3ZlQ2xhc3MoImhvdmVyIil9KS5jbGljayhmdW5jdGlvbihvKXshaCYmdCgpO2guc2xpZGVUb2dnbGUoKTtpZihhLmJyb3dzZXIubXNpZSYmIWspe2guY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCl7az1NYXRoLm1heChrLGEodGhpcykud2lkdGgoKSl9KTtpZihrPmgud2lkdGgoKSl7aC53aWR0aChrKzQwKX19fSk7dGhpcy52YWwoYi52YWx1ZSk7ZnVuY3Rpb24gdCgpe2g9YSgiPGRpdiAvPiIpLmFkZENsYXNzKGIubGlzdENsYXNzKyIgcm91bmRlZC0zIikuaGlkZSgpLmFwcGVuZFRvKHUubW91c2VsZWF2ZShmdW5jdGlvbih2KXtoLnNsaWRlVXAoKX0pKTtmb3IodmFyIHggaW4gYi5zcmMpe3ZhciB6PWIudHBsc1t4XXx8Yi50cGw7YSgiPGRpdiAvPiIpLmF0dHIoIm5hbWUiLHgpLmFwcGVuZChhKHoucmVwbGFjZSgvJXZhbC9nLHgpLnJlcGxhY2UoLyVsYWJlbC9nLGIuc3JjW3hdKSkuYXR0cih7dW5zZWxlY3RhYmxlOiJvbiJ9KSkuYXBwZW5kVG8oaCkuaG92ZXIoZnVuY3Rpb24oKXthKHRoaXMpLmFkZENsYXNzKCJob3ZlciIpfSxmdW5jdGlvbigpe2EodGhpcykucmVtb3ZlQ2xhc3MoImhvdmVyIil9KS5jbGljayhmdW5jdGlvbihCKXtCLnN0b3BQcm9wYWdhdGlvbigpO0IucHJldmVudERlZmF1bHQoKTt2YXIgdz1hKHRoaXMpLmF0dHIoIm5hbWUiKTtxLnZhbCh3KTtiLnNlbGVjdCh3KTtoLnNsaWRlVXAoKX0pfXZhciBvPXUub3V0ZXJXaWR0aCgpO2lmKGgud2lkdGgoKTxvKXtoLndpZHRoKG8pfXZhciBBPWguaGVpZ2h0KCk7aWYoYi5tYXhIZWlnaHQ+MCYmQT5iLm1heEhlaWdodCl7aC5oZWlnaHQoYi5tYXhIZWlnaHQpfXEudmFsKGcudmFsKCkpfXJldHVybiB0aGlzfTthLmZuLmVsU2VsZWN0LmRlZmF1bHRzPXtuYW1lOiJlbC1zZWxlY3QiLCJjbGFzcyI6ImVsLXNlbGVjdCIsbGlzdENsYXNzOiJsaXN0IixsYWJlbFRwbDpudWxsLHRwbDoiPCV2YWw+JWxhYmVsPC8ldmFsPiIsdHBsczp7fSx2YWx1ZTpudWxsLHNyYzp7fSxzZWxlY3Q6ZnVuY3Rpb24oYil7d2luZG93LmNvbnNvbGUmJndpbmRvdy5jb25zb2xlLmxvZyYmd2luZG93LmNvbnNvbGUubG9nKCJzZWxlY3RlZDogIitiKX0sbWF4SGVpZ2h0OjQxMH19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURT1mdW5jdGlvbihvLGope2lmKCFvfHwhby5ub2RlTmFtZSl7cmV0dXJuIGFsZXJ0KCdlbFJURTogYXJndW1lbnQgInRhcmdldCIgaXMgbm90IERPTSBFbGVtZW50Jyl9dmFyIGM9dGhpcyxmO3RoaXMudmVyc2lvbj0iMS4xIjt0aGlzLmJ1aWxkPSIyMDEwLTA5LTIwIjt0aGlzLm9wdGlvbnM9YS5leHRlbmQodHJ1ZSx7fSx0aGlzLm9wdGlvbnMsaik7dGhpcy5icm93c2VyPWEuYnJvd3Nlcjt0aGlzLnRhcmdldD1hKG8pO3RoaXMubGFuZz0oIiIrdGhpcy5vcHRpb25zLmxhbmcpLnRvTG93ZXJDYXNlKCk7dGhpcy5faTE4bj1uZXcgZWxpMThuKHt0ZXh0ZG9tYWluOiJydGUiLG1lc3NhZ2VzOntydGU6dGhpcy5pMThNZXNzYWdlc1t0aGlzLmxhbmddfHx7fX19KTt0aGlzLnJ0bD0hISgvXihhcnxmYXxoZSkkLy50ZXN0KHRoaXMubGFuZykmJnRoaXMuaTE4TWVzc2FnZXNbdGhpcy5sYW5nXSk7aWYodGhpcy5ydGwpe3RoaXMub3B0aW9ucy5jc3NDbGFzcys9IiBlbC1ydGUtcnRsIn10aGlzLnRvb2xiYXI9YSgnPGRpdiBjbGFzcz0idG9vbGJhciIvPicpO3RoaXMuaWZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMud29ya3pvbmU9YSgnPGRpdiBjbGFzcz0id29ya3pvbmUiLz4nKS5hcHBlbmQodGhpcy5pZnJhbWUpLmFwcGVuZCh0aGlzLnNvdXJjZSk7dGhpcy5zdGF0dXNiYXI9YSgnPGRpdiBjbGFzcz0ic3RhdHVzYmFyIi8+Jyk7dGhpcy50YWJzYmFyPWEoJzxkaXYgY2xhc3M9InRhYnNiYXIiLz4nKTt0aGlzLmVkaXRvcj1hKCc8ZGl2IGNsYXNzPSInK3RoaXMub3B0aW9ucy5jc3NDbGFzcysnIiAvPicpLmFwcGVuZCh0aGlzLnRvb2xiYXIpLmFwcGVuZCh0aGlzLndvcmt6b25lKS5hcHBlbmQodGhpcy5zdGF0dXNiYXIpLmFwcGVuZCh0aGlzLnRhYnNiYXIpO3RoaXMuZG9jPW51bGw7dGhpcy4kZG9jPW51bGw7dGhpcy53aW5kb3c9bnVsbDt0aGlzLnV0aWxzPW5ldyB0aGlzLnV0aWxzKHRoaXMpO3RoaXMuZG9tPW5ldyB0aGlzLmRvbSh0aGlzKTt0aGlzLmZpbHRlcj1uZXcgdGhpcy5maWx0ZXIodGhpcyk7dGhpcy51cGRhdGVIZWlnaHQ9ZnVuY3Rpb24oKXtjLndvcmt6b25lLmFkZChjLmlmcmFtZSkuYWRkKGMuc291cmNlKS5oZWlnaHQoYy53b3Jrem9uZS5oZWlnaHQoKSl9O3RoaXMucmVzaXphYmxlPWZ1bmN0aW9uKHEpe3ZhciBwPXRoaXM7aWYodGhpcy5vcHRpb25zLnJlc2l6YWJsZSYmYS5mbi5yZXNpemFibGUpe2lmKHEpe3RoaXMuZWRpdG9yLnJlc2l6YWJsZSh7aGFuZGxlczoic2UiLGFsc29SZXNpemU6dGhpcy53b3Jrem9uZSxtaW5XaWR0aDozMDAsbWluSGVpZ2h0OjIwMH0pLmJpbmQoInJlc2l6ZSIscC51cGRhdGVIZWlnaHQpfWVsc2V7dGhpcy5lZGl0b3IucmVzaXphYmxlKCJkZXN0cm95IikudW5iaW5kKCJyZXNpemUiLHAudXBkYXRlSGVpZ2h0KX19fTt0aGlzLmVkaXRvci5pbnNlcnRBZnRlcihvKTt2YXIgaD0iIjtpZihvLm5vZGVOYW1lPT0iVEVYVEFSRUEiKXt0aGlzLnNvdXJjZT10aGlzLnRhcmdldDt0aGlzLnNvdXJjZS5pbnNlcnRBZnRlcih0aGlzLmlmcmFtZSkuaGlkZSgpO2g9dGhpcy50YXJnZXQudmFsKCl9ZWxzZXt0aGlzLnNvdXJjZT1hKCI8dGV4dGFyZWEgLz4iKS5pbnNlcnRBZnRlcih0aGlzLmlmcmFtZSkuaGlkZSgpO2g9dGhpcy50YXJnZXQuaGlkZSgpLmh0bWwoKX10aGlzLnNvdXJjZS5hdHRyKCJuYW1lIix0aGlzLnRhcmdldC5hdHRyKCJuYW1lIil8fHRoaXMudGFyZ2V0LmF0dHIoImlkIikpO2g9YS50cmltKGgpO2lmKCFoKXtoPSIgIn1pZih0aGlzLm9wdGlvbnMuYWxsb3dTb3VyY2Upe3RoaXMudGFic2Jhci5hcHBlbmQoJzxkaXYgY2xhc3M9InRhYiBlZGl0b3Igcm91bmRlZC1ib3R0b20tNyBhY3RpdmUiPicrYy5pMThuKCJFZGl0b3IiKSsnPC9kaXY+PGRpdiBjbGFzcz0idGFiIHNvdXJjZSByb3VuZGVkLWJvdHRvbS03Ij4nK2MuaTE4bigiU291cmNlIikrJzwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyZml4IiBzdHlsZT0iY2xlYXI6Ym90aCIvPicpLmNoaWxkcmVuKCIudGFiIikuY2xpY2soZnVuY3Rpb24ocCl7aWYoIWEodGhpcykuaGFzQ2xhc3MoImFjdGl2ZSIpKXtjLnRhYnNiYXIuY2hpbGRyZW4oIi50YWIiKS50b2dnbGVDbGFzcygiYWN0aXZlIik7Yy53b3Jrem9uZS5jaGlsZHJlbigpLnRvZ2dsZSgpO2lmKGEodGhpcykuaGFzQ2xhc3MoImVkaXRvciIpKXtjLnVwZGF0ZUVkaXRvcigpO2Mud2luZG93LmZvY3VzKCk7Yy51aS51cGRhdGUodHJ1ZSl9ZWxzZXtjLnVwZGF0ZVNvdXJjZSgpO2Muc291cmNlLmZvY3VzKCk7aWYoYS5icm93c2VyLm1zaWUpe31lbHNle2Muc291cmNlWzBdLnNldFNlbGVjdGlvblJhbmdlKDAsMCl9Yy51aS5kaXNhYmxlKCk7Yy5zdGF0dXNiYXIuZW1wdHkoKX19fSl9dGhpcy53aW5kb3c9dGhpcy5pZnJhbWUuY29udGVudFdpbmRvdzt0aGlzLmRvYz10aGlzLmlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O3RoaXMuJGRvYz1hKHRoaXMuZG9jKTtmPSc8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIC8+JzthLmVhY2goYy5vcHRpb25zLmNzc2ZpbGVzLGZ1bmN0aW9uKCl7Zis9JzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicrdGhpcysnIiAvPid9KTt0aGlzLmRvYy5vcGVuKCk7dmFyIGc9dGhpcy5maWx0ZXIud3lzaXd5ZyhoKSxiPXRoaXMucnRsPycgY2xhc3M9ImVsLXJ0ZS1ydGwiJzoiIjt0aGlzLmRvYy53cml0ZShjLm9wdGlvbnMuZG9jdHlwZStmKyI8L2hlYWQ+PGJvZHkiK2IrIj4iKyhnKSsiPC9ib2R5PjwvaHRtbD4iKTt0aGlzLmRvYy5jbG9zZSgpO2lmKGEuYnJvd3Nlci5tc2llKXt0aGlzLmRvYy5ib2R5LmNvbnRlbnRFZGl0YWJsZT10cnVlfWVsc2V7dHJ5e3RoaXMuZG9jLmRlc2lnbk1vZGU9Im9uIn1jYXRjaChrKXt9dGhpcy5kb2MuZXhlY0NvbW1hbmQoInN0eWxlV2l0aENTUyIsZmFsc2UsdGhpcy5vcHRpb25zLnN0eWxlV2l0aENTUyl9aWYodGhpcy5vcHRpb25zLmhlaWdodD4wKXt0aGlzLndvcmt6b25lLmhlaWdodCh0aGlzLm9wdGlvbnMuaGVpZ2h0KX10aGlzLnVwZGF0ZUhlaWdodCgpO3RoaXMucmVzaXphYmxlKHRydWUpO3RoaXMud2luZG93LmZvY3VzKCk7dGhpcy5oaXN0b3J5PW5ldyB0aGlzLmhpc3RvcnkodGhpcyk7dGhpcy5zZWxlY3Rpb249bmV3IHRoaXMuc2VsZWN0aW9uKHRoaXMpO3RoaXMudWk9bmV3IHRoaXMudWkodGhpcyk7dGhpcy50YXJnZXQucGFyZW50cygiZm9ybSIpLmJpbmQoInN1Ym1pdCIsZnVuY3Rpb24ocCl7Yy5zb3VyY2UucGFyZW50cygiZm9ybSIpLmZpbmQoJ1tuYW1lPSJlbC1zZWxlY3QiXScpLnJlbW92ZSgpO2MuYmVmb3JlU2F2ZSgpfSk7dGhpcy5zb3VyY2UuYmluZCgia2V5ZG93biIsZnVuY3Rpb24odCl7aWYodC5rZXlDb2RlPT05KXt0LnByZXZlbnREZWZhdWx0KCk7aWYoYS5icm93c2VyLm1zaWUpe3ZhciBwPWRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO3AudGV4dD0iXHQiK3AudGV4dDt0aGlzLmZvY3VzKCl9ZWxzZXt2YXIgcT10aGlzLnZhbHVlLnN1YnN0cigwLHRoaXMuc2VsZWN0aW9uU3RhcnQpLHU9dGhpcy52YWx1ZS5zdWJzdHIodGhpcy5zZWxlY3Rpb25FbmQpO3RoaXMudmFsdWU9cSsiXHQiK3U7dGhpcy5zZXRTZWxlY3Rpb25SYW5nZShxLmxlbmd0aCsxLHEubGVuZ3RoKzEpfX19KTt0aGlzLiRkb2MuYmluZCgibW91c2V1cCIsZnVuY3Rpb24oKXtjLnVpLnVwZGF0ZSgpfSkuYmluZCgiZHJhZ3N0YXJ0IixmdW5jdGlvbihwKXtwLnByZXZlbnREZWZhdWx0KCk7cC5zdG9wUHJvcGFnYXRpb24oKX0pLmJpbmQoImtleXVwIixmdW5jdGlvbihwKXtpZigocC5rZXlDb2RlPj04JiZwLmtleUNvZGU8PTEzKXx8KHAua2V5Q29kZT49MzImJnAua2V5Q29kZTw9NDApfHxwLmtleUNvZGU9PTQ2fHwocC5rZXlDb2RlPj05NiYmcC5rZXlDb2RlPD0xMTEpKXtjLnVpLnVwZGF0ZSgpfX0pLmJpbmQoImtleWRvd24iLGZ1bmN0aW9uKHApe2lmKChwLm1ldGFLZXl8fHAuY3RybEtleSkmJnAua2V5Q29kZT09NjUpe2MudWkudXBkYXRlKCl9ZWxzZXtpZihwLmtleUNvZGU9PTEzKXt2YXIgcT1jLnNlbGVjdGlvbi5nZXROb2RlKCk7aWYoYy5kb20uc2VsZk9yUGFyZW50KHEsL15QUkUkLykpe2Muc2VsZWN0aW9uLmluc2VydE5vZGUoYy5kb2MuY3JlYXRlVGV4dE5vZGUoIlxyXG4iKSk7cmV0dXJuIGZhbHNlfWVsc2V7aWYoYS5icm93c2VyLnNhZmFyaSYmcC5zaGlmdEtleSl7Yy5zZWxlY3Rpb24uaW5zZXJ0Tm9kZShjLmRvYy5jcmVhdGVFbGVtZW50KCJiciIpKTtyZXR1cm4gZmFsc2V9fX19fSk7dGhpcy50eXBpbmc9ZmFsc2U7dGhpcy5sYXN0S2V5PW51bGw7dGhpcy4kZG9jLmJpbmQoImtleWRvd24iLGZ1bmN0aW9uKHApe2lmKChwLmtleUNvZGU+PTQ4JiZwLmtleUNvZGU8PTU3KXx8cC5rZXlDb2RlPT02MXx8cC5rZXlDb2RlPT0xMDl8fChwLmtleUNvZGU+PTY1JiZwLmtleUNvZGU8PTkwKXx8cC5rZXlDb2RlPT0xODh8fHAua2V5Q29kZT09MTkwfHxwLmtleUNvZGU9PTE5MXx8KHAua2V5Q29kZT49MjE5JiZwLmtleUNvZGU8PTIyMikpe2lmKCFjLnR5cGluZyl7Yy5oaXN0b3J5LmFkZCh0cnVlKX1jLnR5cGluZz10cnVlO2MubGFzdEtleT1udWxsfWVsc2V7aWYocC5rZXlDb2RlPT04fHxwLmtleUNvZGU9PTQ2fHxwLmtleUNvZGU9PTMyfHxwLmtleUNvZGU9PTEzKXtpZihwLmtleUNvZGUhPWMubGFzdEtleSl7Yy5oaXN0b3J5LmFkZCh0cnVlKX1jLmxhc3RLZXk9cC5rZXlDb2RlO2MudHlwaW5nPWZhbHNlfX19KS5iaW5kKCJtb3VzZXVwIixmdW5jdGlvbigpe2MudHlwaW5nPWZhbHNlO2MubGFzdEtleT1udWxsfSkuYmluZCgicGFzdGUiLGZ1bmN0aW9uKHEpe2lmKCFjLm9wdGlvbnMuYWxsb3dQYXN0ZSl7cS5zdG9wUHJvcGFnYXRpb24oKTtxLnByZXZlbnREZWZhdWx0KCl9ZWxzZXt2YXIgdD1hKGMuZG9tLmNyZWF0ZSgiZGl2IikpWzBdLHA9Yy5kb2MuY3JlYXRlVGV4dE5vZGUoIl8iKTtjLmhpc3RvcnkuYWRkKHRydWUpO2MudHlwaW5nPXRydWU7Yy5sYXN0S2V5PW51bGw7dC5hcHBlbmRDaGlsZChwKTtjLnNlbGVjdGlvbi5kZWxldGVDb250ZW50cygpLmluc2VydE5vZGUodCk7Yy5zZWxlY3Rpb24uc2VsZWN0KHApO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtpZih0LnBhcmVudE5vZGUpe2EodCkuaHRtbChjLmZpbHRlci5wcm9jY2VzcygicGFzdGUiLGEodCkuaHRtbCgpKSk7cD10Lmxhc3RDaGlsZDtjLmRvbS51bndyYXAodCk7aWYocCl7Yy5zZWxlY3Rpb24uc2VsZWN0KHApO2Muc2VsZWN0aW9uLmNvbGxhcHNlKGZhbHNlKX19ZWxzZXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KTtjLnZhbChjLmZpbHRlci5wcm9jY2VzcygicGFzdGUiLGMuZmlsdGVyLnd5c2l3eWcyd3lzaXd5ZyhhKGMuZG9jLmJvZHkpLmh0bWwoKSkpKTtjLnNlbGVjdGlvbi5zZWxlY3QoYy5kb2MuYm9keS5maXJzdENoaWxkKTtjLnNlbGVjdGlvbi5jb2xsYXBzZSh0cnVlKX1hKGMuZG9jLmJvZHkpLm1vdXNldXAoKX0sMTUpfX0pO2lmKGEuYnJvd3Nlci5tc2llKXt0aGlzLiRkb2MuYmluZCgia2V5dXAiLGZ1bmN0aW9uKHApe2lmKHAua2V5Q29kZT09ODYmJihwLm1ldGFLZXl8fHAuY3RybEtleSkpe2MuaGlzdG9yeS5hZGQodHJ1ZSk7Yy50eXBpbmc9dHJ1ZTtjLmxhc3RLZXk9bnVsbDtjLnNlbGVjdGlvbi5zYXZlSUVSYW5nZSgpO2MudmFsKGMuZmlsdGVyLnByb2NjZXNzKCJwYXN0ZSIsYy5maWx0ZXIud3lzaXd5ZzJ3eXNpd3lnKGEoYy5kb2MuYm9keSkuaHRtbCgpKSkpO2Muc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7YShjLmRvYy5ib2R5KS5tb3VzZXVwKCk7dGhpcy51aS51cGRhdGUoKX19KX1pZihhLmJyb3dzZXIuc2FmYXJpKXt0aGlzLiRkb2MuYmluZCgiY2xpY2siLGZ1bmN0aW9uKHApe2EoYy5kb2MuYm9keSkuZmluZCgiLmVscnRlLXdlYmtpdC1obCIpLnJlbW92ZUNsYXNzKCJlbHJ0ZS13ZWJraXQtaGwiKTtpZihwLnRhcmdldC5ub2RlTmFtZT09IklNRyIpe2EocC50YXJnZXQpLmFkZENsYXNzKCJlbHJ0ZS13ZWJraXQtaGwiKX19KS5iaW5kKCJrZXl1cCIsZnVuY3Rpb24ocCl7YShjLmRvYy5ib2R5KS5maW5kKCIuZWxydGUtd2Via2l0LWhsIikucmVtb3ZlQ2xhc3MoImVscnRlLXdlYmtpdC1obCIpfSl9dGhpcy53aW5kb3cuZm9jdXMoKX07ZWxSVEUucHJvdG90eXBlLmkxOG49ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX2kxOG4udHJhbnNsYXRlKGIpfTtlbFJURS5wcm90b3R5cGUub3Blbj1mdW5jdGlvbigpe3RoaXMuZWRpdG9yLnNob3coKX07ZWxSVEUucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5lZGl0b3IuaGlkZSgpfTtlbFJURS5wcm90b3R5cGUudXBkYXRlRWRpdG9yPWZ1bmN0aW9uKCl7dGhpcy52YWwodGhpcy5zb3VyY2UudmFsKCkpfTtlbFJURS5wcm90b3R5cGUudXBkYXRlU291cmNlPWZ1bmN0aW9uKCl7dGhpcy5zb3VyY2UudmFsKHRoaXMuZmlsdGVyLnNvdXJjZShhKHRoaXMuZG9jLmJvZHkpLmh0bWwoKSkpfTtlbFJURS5wcm90b3R5cGUudmFsPWZ1bmN0aW9uKGIpe2lmKHR5cGVvZihiKT09InN0cmluZyIpe2I9IiIrYjtpZih0aGlzLnNvdXJjZS5pcygiOnZpc2libGUiKSl7dGhpcy5zb3VyY2UudmFsKHRoaXMuZmlsdGVyLnNvdXJjZTJzb3VyY2UoYikpfWVsc2V7aWYoYS5icm93c2VyLm1zaWUpe3RoaXMuZG9jLmJvZHkuaW5uZXJIVE1MPSI8YnIgLz4iK3RoaXMuZmlsdGVyLnd5c2l3eWcoYik7dGhpcy5kb2MuYm9keS5yZW1vdmVDaGlsZCh0aGlzLmRvYy5ib2R5LmZpcnN0Q2hpbGQpfWVsc2V7dGhpcy5kb2MuYm9keS5pbm5lckhUTUw9dGhpcy5maWx0ZXIud3lzaXd5ZyhiKX19fWVsc2V7aWYodGhpcy5zb3VyY2UuaXMoIjp2aXNpYmxlIikpe3JldHVybiB0aGlzLmZpbHRlci5zb3VyY2Uyc291cmNlKHRoaXMuc291cmNlLnZhbCgpKX1lbHNle3JldHVybiB0aGlzLmZpbHRlci5zb3VyY2UoYSh0aGlzLmRvYy5ib2R5KS5odG1sKCkpfX19O2VsUlRFLnByb3RvdHlwZS5iZWZvcmVTYXZlPWZ1bmN0aW9uKCl7dGhpcy5zb3VyY2UudmFsKHRoaXMudmFsKCl8fCIiKX07ZWxSVEUucHJvdG90eXBlLnNhdmU9ZnVuY3Rpb24oKXt0aGlzLmJlZm9yZVNhdmUoKTt0aGlzLmVkaXRvci5wYXJlbnRzKCJmb3JtIikuc3VibWl0KCl9O2VsUlRFLnByb3RvdHlwZS5sb2c9ZnVuY3Rpb24oYil7aWYod2luZG93LmNvbnNvbGUmJndpbmRvdy5jb25zb2xlLmxvZyl7d2luZG93LmNvbnNvbGUubG9nKGIpfX07ZWxSVEUucHJvdG90eXBlLmkxOE1lc3NhZ2VzPXt9O2EuZm4uZWxydGU9ZnVuY3Rpb24oZyxiKXt2YXIgZj10eXBlb2YoZyk9PSJzdHJpbmciP2c6IiIsYzt0aGlzLmVhY2goZnVuY3Rpb24oKXtpZighdGhpcy5lbHJ0ZSl7dGhpcy5lbHJ0ZT1uZXcgZWxSVEUodGhpcyx0eXBlb2YoZyk9PSJvYmplY3QiP2c6e30pfXN3aXRjaChmKXtjYXNlIm9wZW4iOmNhc2Uic2hvdyI6dGhpcy5lbHJ0ZS5vcGVuKCk7YnJlYWs7Y2FzZSJjbG9zZSI6Y2FzZSJoaWRlIjp0aGlzLmVscnRlLmNsb3NlKCk7YnJlYWs7Y2FzZSJ1cGRhdGVTb3VyY2UiOnRoaXMuZWxydGUudXBkYXRlU291cmNlKCk7YnJlYWt9fSk7aWYoZj09InZhbCIpe2lmKCF0aGlzLmxlbmd0aCl7cmV0dXJuIiJ9ZWxzZXtpZih0aGlzLmxlbmd0aD09MSl7cmV0dXJuIGI/dGhpc1swXS5lbHJ0ZS52YWwoYik6dGhpc1swXS5lbHJ0ZS52YWwoKX1lbHNle2M9e307dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Y1t0aGlzLmVscnRlLnNvdXJjZS5hdHRyKCJuYW1lIildPXRoaXMuZWxydGUudmFsKCl9KTtyZXR1cm4gY319fXJldHVybiB0aGlzfX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS5kb209ZnVuY3Rpb24oYyl7dGhpcy5ydGU9Yzt2YXIgYj10aGlzO3RoaXMucmVnRXhwPXt0ZXh0Tm9kZXM6L14oQXxBQkJSfEFDUk9OWU18QUREUkVTU3xCfEJET3xCSUd8QkxPQ0tRVU9URXxDQVBUSU9OfENFTlRFUnxDSVRFfENPREV8RER8REVMfERGTnxESVZ8RFR8RU18RklFTERTRVR8Rk9OVHxIWzEtNl18SXxJTlN8S0JEfExBQkVMfExFR0VORHxMSXxNQVJRVUVFfE5PQlJ8Tk9FTUJFRHxQfFBSRXxRfFNBTVB8U01BTEx8U1BBTnxTVFJJS0V8U1RST05HfFNVQnxTVVB8VER8VEh8VFR8VkFSKSQvLHRleHRDb250YWluc05vZGVzOi9eKEF8QUJCUnxBQ1JPTllNfEFERFJFU1N8QnxCRE98QklHfEJMT0NLUVVPVEV8Q0FQVElPTnxDRU5URVJ8Q0lURXxDT0RFfEREfERFTHxERk58RElWfERMfERUfEVNfEZJRUxEU0VUfEZPTlR8SFsxLTZdfEl8SU5TfEtCRHxMQUJFTHxMRUdFTkR8TEl8TUFSUVVFRXxOT0JSfE5PRU1CRUR8T0x8UHxQUkV8UXxTQU1QfFNNQUxMfFNQQU58U1RSSUtFfFNUUk9OR3xTVUJ8U1VQfFRBQkxFfFRIRUFEfFRCT0RZfFRGT09UfFREfFRIfFRSfFRUfFVMfFZBUikkLyxibG9jazovXihBUFBMRVR8QkxPQ0tRVU9URXxCUnxDQVBUSU9OfENFTlRFUnxDT0x8Q09MR1JPVVB8RER8RElWfERMfERUfEhbMS02XXxFTUJFRHxGSUVMRFNFVHxMSXxNQVJRVUVFfE5PQlJ8T0JKRUNUfE9MfFB8UFJFfFRBQkxFfFRIRUFEfFRCT0RZfFRGT09UfFREfFRIfFRSfFVMKSQvLHNlbGVjdGlvbkJsb2NrOi9eKEFQUExFVHxCTE9DS1FVT1RFfEJSfENBUFRJT058Q0VOVEVSfENPTHxDT0xHUk9VUHxERHxESVZ8REx8RFR8SFsxLTZdfEVNQkVEfEZJRUxEU0VUfExJfE1BUlFVRUV8Tk9CUnxPQkpFQ1R8T0x8UHxQUkV8VER8VEh8VFJ8VUwpJC8saGVhZGVyOi9eSFsxLTZdJC8sZm9ybUVsZW1lbnQ6L14oRk9STXxJTlBVVHxISURERU58VEVYVEFSRUF8U0VMRUNUfEJVVFRPTikkL307dGhpcy5yb290PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucnRlLmJvZHl9O3RoaXMuY3JlYXRlPWZ1bmN0aW9uKGYpe3JldHVybiB0aGlzLnJ0ZS5kb2MuY3JlYXRlRWxlbWVudChmKX07dGhpcy5jcmVhdGVCb29rbWFyaz1mdW5jdGlvbigpe3ZhciBmPXRoaXMucnRlLmRvYy5jcmVhdGVFbGVtZW50KCJzcGFuIik7Zi5pZD0iZWxydGUtYm0tIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkuc3Vic3RyKDIpO2EoZikuYWRkQ2xhc3MoImVscnRlYm0iKTtyZXR1cm4gZn07dGhpcy5pbmRleE9mPWZ1bmN0aW9uKGcpe3ZhciBmPTA7Zz1hKGcpO3doaWxlKChnPWcucHJldigpKSYmZy5sZW5ndGgpe2YrK31yZXR1cm4gZn07dGhpcy5hdHRyPWZ1bmN0aW9uKGgsZil7dmFyIGc9IiI7aWYoaC5ub2RlVHlwZT09MSl7Zz1hKGgpLmF0dHIoZik7aWYoZyYmZiE9InNyYyImJmYhPSJocmVmIil7Zz1nLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKX19cmV0dXJuIGd8fCIifTt0aGlzLmZpbmRDb21tb25BbmNlc3Rvcj1mdW5jdGlvbihqLGgpe2lmKCFqfHwhaCl7cmV0dXJuIHRoaXMucnRlLmxvZygiZG9tLmZpbmRDb21tb25BbmNlc3RvciBpbnZhbGlkIGFyZ3VtZW50cyIpfWlmKGo9PWgpe3JldHVybiBqfWVsc2V7aWYoai5ub2RlTmFtZT09IkJPRFkifHxoLm5vZGVOYW1lPT0iQk9EWSIpe3JldHVybiB0aGlzLnJ0ZS5kb2MuYm9keX19dmFyIG89YShqKS5wYXJlbnRzKCksaz1hKGgpLnBhcmVudHMoKSxmPWsubGVuZ3RoLTEscD1rW2ZdO2Zvcih2YXIgZz1vLmxlbmd0aC0xO2c+PTA7Zy0tLGYtLSl7aWYob1tnXT09a1tmXSl7cD1vW2ddfWVsc2V7YnJlYWt9fXJldHVybiBwfTt0aGlzLmlzRW1wdHk9ZnVuY3Rpb24oZil7aWYoZi5ub2RlVHlwZT09MSl7cmV0dXJuIHRoaXMucmVnRXhwLnRleHROb2Rlcy50ZXN0KGYubm9kZU5hbWUpP2EudHJpbShhKGYpLnRleHQoKSkubGVuZ3RoPT0wOmZhbHNlfWVsc2V7aWYoZi5ub2RlVHlwZT09Myl7cmV0dXJuL14oVEFCTEV8VEhFQUR8VEZPT1R8VEJPRFl8VFJ8VUx8T0x8REwpJC8udGVzdChmLnBhcmVudE5vZGUubm9kZU5hbWUpfHxmLm5vZGVWYWx1ZT09IiJ8fChhLnRyaW0oZi5ub2RlVmFsdWUpLmxlbmd0aD09MCYmIShmLm5leHRTaWJsaW5nJiZmLnByZXZpb3VzU2libGluZyYmZi5uZXh0U2libGluZy5ub2RlVHlwZT09MSYmZi5wcmV2aW91c1NpYmxpbmcubm9kZVR5cGU9PTEmJiF0aGlzLnJlZ0V4cC5ibG9jay50ZXN0KGYubmV4dFNpYmxpbmcubm9kZU5hbWUpJiYhdGhpcy5yZWdFeHAuYmxvY2sudGVzdChmLnByZXZpb3VzU2libGluZy5ub2RlTmFtZSkpKX19cmV0dXJuIHRydWV9O3RoaXMubmV4dD1mdW5jdGlvbihmKXt3aGlsZShmLm5leHRTaWJsaW5nJiYoZj1mLm5leHRTaWJsaW5nKSl7aWYoZi5ub2RlVHlwZT09MXx8KGYubm9kZVR5cGU9PTMmJiF0aGlzLmlzRW1wdHkoZikpKXtyZXR1cm4gZn19cmV0dXJuIG51bGx9O3RoaXMucHJldj1mdW5jdGlvbihmKXt3aGlsZShmLnByZXZpb3VzU2libGluZyYmKGY9Zi5wcmV2aW91c1NpYmxpbmcpKXtpZihmLm5vZGVUeXBlPT0xfHwoZi5ub2RlVHlwZT09MyYmIXRoaXMuaXNFbXB0eShmKSkpe3JldHVybiBmfX1yZXR1cm4gbnVsbH07dGhpcy5pc1ByZXY9ZnVuY3Rpb24oZyxmKXt3aGlsZSgoZz10aGlzLnByZXYoZykpKXtpZihnPT1mKXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfTt0aGlzLm5leHRBbGw9ZnVuY3Rpb24oZyl7dmFyIGY9W107d2hpbGUoKGc9dGhpcy5uZXh0KGcpKSl7Zi5wdXNoKGcpfXJldHVybiBmfTt0aGlzLnByZXZBbGw9ZnVuY3Rpb24oZyl7dmFyIGY9W107d2hpbGUoKGc9dGhpcy5wcmV2KGcpKSl7Zi5wdXNoKGcpfXJldHVybiBmfTt0aGlzLnRvTGluZUVuZD1mdW5jdGlvbihnKXt2YXIgZj1bXTt3aGlsZSgoZz10aGlzLm5leHQoZykpJiZnLm5vZGVOYW1lIT0iQlIiJiZnLm5vZGVOYW1lIT0iSFIiJiZ0aGlzLmlzSW5saW5lKGcpKXtmLnB1c2goZyl9cmV0dXJuIGZ9O3RoaXMudG9MaW5lU3RhcnQ9ZnVuY3Rpb24oZyl7dmFyIGY9W107d2hpbGUoKGc9dGhpcy5wcmV2KGcpKSYmZy5ub2RlTmFtZSE9IkJSIiYmZy5ub2RlTmFtZSE9IkhSIiYmdGhpcy5pc0lubGluZShnKSl7Zi51bnNoaWZ0KGcpfXJldHVybiBmfTt0aGlzLmlzRmlyc3ROb3RFbXB0eT1mdW5jdGlvbihmKXt3aGlsZSgoZj10aGlzLnByZXYoZikpKXtpZihmLm5vZGVUeXBlPT0xfHwoZi5ub2RlVHlwZT09MyYmYS50cmltKGYubm9kZVZhbHVlKSE9IiIpKXtyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfTt0aGlzLmlzTGFzdE5vdEVtcHR5PWZ1bmN0aW9uKGYpe3doaWxlKChmPXRoaXMubmV4dChmKSkpe2lmKCF0aGlzLmlzRW1wdHkoZikpe3JldHVybiBmYWxzZX19cmV0dXJuIHRydWV9O3RoaXMuaXNPbmx5Tm90RW1wdHk9ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXMuaXNGaXJzdE5vdEVtcHR5KGYpJiZ0aGlzLmlzTGFzdE5vdEVtcHR5KGYpfTt0aGlzLmZpbmRMYXN0Tm90RW1wdHk9ZnVuY3Rpb24oZil7dGhpcy5ydGUubG9nKCJmaW5kTGFzdE5vdEVtcHR5IFdobyBpcyBoZXJlIDBfbyIpO2lmKGYubm9kZVR5cGU9PTEmJihsPWYubGFzdENoaWxkKSl7aWYoIXRoaXMuaXNFbXB0eShsKSl7cmV0dXJuIGx9d2hpbGUobC5wcmV2aW91c1NpYmxpbmcmJihsPWwucHJldmlvdXNTaWJsaW5nKSl7aWYoIXRoaXMuaXNFbXB0eShsKSl7cmV0dXJuIGx9fX1yZXR1cm4gZmFsc2V9O3RoaXMuaXNJbmxpbmU9ZnVuY3Rpb24oail7aWYoai5ub2RlVHlwZT09Myl7cmV0dXJuIHRydWV9ZWxzZXtpZihqLm5vZGVUeXBlPT0xKXtqPWEoaik7dmFyIGg9ai5jc3MoImRpc3BsYXkiKTt2YXIgZz1qLmNzcygiZmxvYXQiKTtyZXR1cm4gaD09ImlubGluZSJ8fGg9PSJpbmxpbmUtYmxvY2sifHxnPT0ibGVmdCJ8fGc9PSJyaWdodCJ9fXJldHVybiB0cnVlfTt0aGlzLmlzPWZ1bmN0aW9uKGgsZyl7aWYoaCYmaC5ub2RlTmFtZSl7aWYodHlwZW9mKGcpPT0ic3RyaW5nIil7Zz10aGlzLnJlZ0V4cFtnXXx8Ly4/L31pZihnIGluc3RhbmNlb2YgUmVnRXhwJiZoLm5vZGVOYW1lKXtyZXR1cm4gZy50ZXN0KGgubm9kZU5hbWUpfWVsc2V7aWYodHlwZW9mKGcpPT0iZnVuY3Rpb24iKXtyZXR1cm4gZyhoKX19fXJldHVybiBmYWxzZX07dGhpcy5maWx0ZXI9ZnVuY3Rpb24oaixoKXt2YXIgZj1bXSxnO2lmKCFqLnB1c2gpe3JldHVybiB0aGlzLmlzKGosaCk/ajpudWxsfWZvcihnPTA7ZzxqLmxlbmd0aDtnKyspe2lmKHRoaXMuaXMoaltnXSxoKSl7Zi5wdXNoKGpbZ10pfX1yZXR1cm4gZn07dGhpcy5wYXJlbnRzPWZ1bmN0aW9uKGgsZyl7dmFyIGY9W107d2hpbGUoaCYmKGg9aC5wYXJlbnROb2RlKSYmaC5ub2RlTmFtZSE9IkJPRFkiJiZoLm5vZGVOYW1lIT0iSFRNTCIpe2lmKHRoaXMuaXMoaCxnKSl7Zi5wdXNoKGgpfX1yZXR1cm4gZn07dGhpcy5wYXJlbnQ9ZnVuY3Rpb24oaCxnKXtyZXR1cm4gdGhpcy5wYXJlbnRzKGgsZylbMF18fG51bGx9O3RoaXMuc2VsZk9yUGFyZW50PWZ1bmN0aW9uKGgsZyxmKXtyZXR1cm4gdGhpcy5pcyhoLGcpP2g6dGhpcy5wYXJlbnQoaCxmfHxnKX07dGhpcy5zZWxmT3JQYXJlbnRMaW5rPWZ1bmN0aW9uKGYpe2Y9dGhpcy5zZWxmT3JQYXJlbnQoZiwvXkEkLyk7cmV0dXJuIGYmJmYuaHJlZj9mOm51bGx9O3RoaXMuc2VsZk9yUGFyZW50QW5jaG9yPWZ1bmN0aW9uKGYpe2Y9dGhpcy5zZWxmT3JQYXJlbnQoZiwvXkEkLyk7cmV0dXJuIGYmJiFmLmhyZWYmJmYubmFtZT9mOm51bGx9O3RoaXMuY2hpbGRMaW5rcz1mdW5jdGlvbihnKXt2YXIgZj1bXTthKCJhW2hyZWZdIixnKS5lYWNoKGZ1bmN0aW9uKCl7Zi5wdXNoKHRoaXMpfSk7cmV0dXJuIGZ9O3RoaXMuc2VsZWN0aW9uSGFzPWZ1bmN0aW9uKGgpe3ZhciBqPXRoaXMucnRlLnNlbGVjdGlvbi5jbG9uZUNvbnRlbnRzKCksZztpZihqJiZqLmNoaWxkTm9kZXMmJmouY2hpbGROb2Rlcy5sZW5ndGgpe2ZvcihnPTA7ZzxqLmNoaWxkTm9kZXMubGVuZ3RoO2crKyl7aWYodHlwZW9mKGgpPT0iZnVuY3Rpb24iKXtpZihoKGouY2hpbGROb2Rlc1tnXSkpe3JldHVybiB0cnVlfX1lbHNle2lmKGogaW5zdGFuY2VvZiBSZWdFeHApe2lmKGgudGVzdChqLmNoaWxkTm9kZXNbZ10ubm9kZU5hbWUpKXtyZXR1cm4gdHJ1ZX19fX19cmV0dXJuIGZhbHNlfTt0aGlzLndyYXA9ZnVuY3Rpb24oZyxmKXtnPWEuaXNBcnJheShnKT9nOltnXTtmPWYubm9kZU5hbWU/Zjp0aGlzLmNyZWF0ZShmKTtpZihnWzBdJiZnWzBdLm5vZGVUeXBlJiZnWzBdLnBhcmVudE5vZGUpe2Y9Z1swXS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShmLGdbMF0pO2EoZykuZWFjaChmdW5jdGlvbigpe2lmKHRoaXMhPWYpe2YuYXBwZW5kQ2hpbGQodGhpcyl9fSl9cmV0dXJuIGZ9O3RoaXMudW53cmFwPWZ1bmN0aW9uKGYpe3doaWxlKGYuZmlyc3RDaGlsZCl7Zi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShmLmZpcnN0Q2hpbGQsZil9Zi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpfTt0aGlzLndyYXBDb250ZW50cz1mdW5jdGlvbihoLGYpe2Y9Zi5ub2RlTmFtZT9mOnRoaXMuY3JlYXRlKGYpO2Zvcih2YXIgZz0wO2c8aC5jaGlsZE5vZGVzLmxlbmd0aDtnKyspe2YuYXBwZW5kQ2hpbGQoaC5jaGlsZE5vZGVzW2ddKX1oLmFwcGVuZENoaWxkKGYpO3JldHVybiBmfTt0aGlzLmNsZWFuTm9kZT1mdW5jdGlvbihmKXtpZihmLm5vZGVUeXBlIT0xKXtyZXR1cm59aWYoL14oUHxMSSkkLy50ZXN0KGYubm9kZU5hbWUpJiYobD10aGlzLmZpbmRMYXN0Tm90RW1wdHkoZikpJiZsLm5vZGVOYW1lPT0iQlIiKXthKGwpLnJlbW92ZSgpfSRuPWEoZik7JG4uY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5jbGVhbk5vZGUodGhpcyl9KTtpZihmLm5vZGVOYW1lIT0iQk9EWSImJiEvXihUQUJMRXxUUnxURCkkLy50ZXN0KGYpJiZ0aGlzLmlzRW1wdHkoZikpe3JldHVybiAkbi5yZW1vdmUoKX1pZigkbi5hdHRyKCJzdHlsZSIpPT09IiIpeyRuLnJlbW92ZUF0dHIoInN0eWxlIil9aWYodGhpcy5ydGUuYnJvd3Nlci5zYWZhcmkmJiRuLmhhc0NsYXNzKCJBcHBsZS1zcGFuIikpeyRuLnJlbW92ZUNsYXNzKCJBcHBsZS1zcGFuIil9aWYoZi5ub2RlTmFtZT09IlNQQU4iJiYhJG4uYXR0cigic3R5bGUiKSYmISRuLmF0dHIoImNsYXNzIikmJiEkbi5hdHRyKCJpZCIpKXskbi5yZXBsYWNlV2l0aCgkbi5odG1sKCkpfX07dGhpcy5jbGVhbkNoaWxkTm9kZXM9ZnVuY3Rpb24oZyl7dmFyIGY9dGhpcy5jbGVhbk5vZGU7YShnKS5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKXtmKHRoaXMpfSl9O3RoaXMudGFibGVNYXRyaXg9ZnVuY3Rpb24oail7dmFyIGg9W107aWYoaiYmai5ub2RlTmFtZT09IlRBQkxFIil7dmFyIGc9MDtmdW5jdGlvbiBmKG8pe2Zvcih2YXIgaz0wO2s8PWc7aysrKXtpZighaFtvXVtrXSl7cmV0dXJuIGt9fX1hKGopLmZpbmQoInRyIikuZWFjaChmdW5jdGlvbihrKXtpZighYS5pc0FycmF5KGhba10pKXtoW2tdPVtdfWEodGhpcykuY2hpbGRyZW4oInRkLHRoIikuZWFjaChmdW5jdGlvbigpe3ZhciBwPXBhcnNlSW50KGEodGhpcykuYXR0cigiY29sc3BhbiIpfHwxKTt2YXIgdD1wYXJzZUludChhKHRoaXMpLmF0dHIoInJvd3NwYW4iKXx8MSk7dmFyIHI9ZihrKTtmb3IodmFyIHY9MDt2PHQ7disrKXtmb3IodmFyIG89MDtvPHA7bysrKXt2YXIgcT1rK3Y7aWYoIWEuaXNBcnJheShoW3FdKSl7aFtxXT1bXX12YXIgdT1vPT0wJiZ2PT0wP3RoaXM6KHY9PTA/bzoiLSIpO2hbcV1bcitvXT11fX1nPU1hdGgubWF4KGcsaFtrXS5sZW5ndGgpfSl9KX1yZXR1cm4gaH07dGhpcy5pbmRleGVzT2ZDZWxsPWZ1bmN0aW9uKGosaCl7Zm9yKHZhciBmPTA7ZjxoLmxlbmd0aDtmKyspe2Zvcih2YXIgZz0wO2c8aFtmXS5sZW5ndGg7ZysrKXtpZihoW2ZdW2ddPT1qKXtyZXR1cm5bZixnXX19fX07dGhpcy5maXhUYWJsZT1mdW5jdGlvbihxKXtpZihxJiZxLm5vZGVOYW1lPT0iVEFCTEUiKXt2YXIgaD1hKHEpO3ZhciBwPXRoaXMudGFibGVNYXRyaXgocSk7dmFyIGY9MDthLmVhY2gocCxmdW5jdGlvbigpe2Y9TWF0aC5tYXgoZix0aGlzLmxlbmd0aCl9KTtpZihmPT0wKXtyZXR1cm4gaC5yZW1vdmUoKX1mb3IodmFyIGs9MDtrPHAubGVuZ3RoO2srKyl7dmFyIGc9cFtrXS5sZW5ndGg7aWYoZz09MCl7aC5maW5kKCJ0ciIpLmVxKGspLnJlbW92ZSgpfWVsc2V7aWYoZzxmKXt2YXIgaj1mLWc7dmFyIG89aC5maW5kKCJ0ciIpLmVxKGspO2ZvcihpPTA7aTxqO2krKyl7by5hcHBlbmQoIjx0ZD4mbmJzcDs8L3RkPiIpfX19fX19O3RoaXMudGFibGVDb2x1bW49ZnVuY3Rpb24oaCxnLG8pe2g9dGhpcy5zZWxmT3JQYXJlbnQoaCwvXlREfFRIJC8pO3ZhciBqPXRoaXMuc2VsZk9yUGFyZW50KGgsL15UQUJMRSQvKTtyZXQ9W107aW5mbz17b2Zmc2V0OltdLGRlbHRhOltdfTtpZihoJiZqKXtvJiZ0aGlzLmZpeFRhYmxlKGopO3ZhciB1PXRoaXMudGFibGVNYXRyaXgoaik7dmFyIHY9ZmFsc2U7dmFyIHQ7Zm9yKHZhciBmPTA7Zjx1Lmxlbmd0aDtmKyspe2Zvcih2YXIgcT0wO3E8dVtmXS5sZW5ndGg7cSsrKXtpZih1W2ZdW3FdPT1oKXt0PXE7dj10cnVlO2JyZWFrfX1pZih2KXticmVha319aWYodD49MCl7Zm9yKHZhciBmPTA7Zjx1Lmxlbmd0aDtmKyspe3ZhciBrPXVbZl1bdF18fG51bGw7aWYoayl7aWYoay5ub2RlTmFtZSl7cmV0LnB1c2goayk7aWYoZyl7aW5mby5kZWx0YS5wdXNoKDApO2luZm8ub2Zmc2V0LnB1c2godCl9fWVsc2V7dmFyIHA9cGFyc2VJbnQoayk7aWYoIWlzTmFOKHApJiZ1W2ZdW3QtcF0mJnVbZl1bdC1wXS5ub2RlTmFtZSl7cmV0LnB1c2godVtmXVt0LXBdKTtpZihnKXtpbmZvLmRlbHRhLnB1c2gocCk7aW5mby5vZmZzZXQucHVzaCh0KX19fX19fX1yZXR1cm4gIWc/cmV0Ontjb2x1bW46cmV0LGluZm86aW5mb319fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24oYyl7dmFyIGI9dGhpcyxmPWEoIjxzcGFuLz4iKS5hZGRDbGFzcygiZWxydGV0ZXN0dXJsIikuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSlbMF07dGhpcy51cmw9KHR5cGVvZihmLmN1cnJlbnRTdHlsZSkhPSJ1bmRlZmluZWQiP2YuY3VycmVudFN0eWxlLmJhY2tncm91bmRJbWFnZTpkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGYsbnVsbClbImJhY2tncm91bmRJbWFnZSJdKS5yZXBsYWNlKC9edXJsXCgoWyciXT8pKFtcc1xTXStcLylbXHNcU10rXDFcKSQvaSwiJDIiKTthKGYpLnJlbW92ZSgpO3RoaXMucnRlPWM7dGhpcy54aHRtbD0veGh0bWwvaS50ZXN0KGMub3B0aW9ucy5kb2N0eXBlKTt0aGlzLmJvb2xBdHRycz1jLnV0aWxzLm1ha2VPYmplY3QoImNoZWNrZWQsY29tcGFjdCxkZWNsYXJlLGRlZmVyLGRpc2FibGVkLGlzbWFwLG11bHRpcGxlLG5vaHJlZixub3Jlc2l6ZSxub3NoYWRlLG5vd3JhcCxyZWFkb25seSxzZWxlY3RlZCIuc3BsaXQoIiwiKSk7dGhpcy50YWdSZWdFeHA9LzwoXC8/KShbXHc6XSspKCg/OlxzK1x3Kyg/OlxzKj1ccyooPzooPzoiW14iXSoiKXwoPzonW14nXSonKXxbXj5cc10rKSk/KSopXHMqXC8/Pi9nO3RoaXMub3BlblRhZ1JlZ0V4cD0vPChbXHc6XSspKCg/OlxzK1x3Kyg/OlxzKj1ccyooPzooPzoiW14iXSoiKXwoPzonW14nXSonKXxbXj5cc10rKSk/KSopXHMqXC8/Pi9nO3RoaXMuYXR0clJlZ0V4cD0vKFx3KykoPzpccyo9XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W15cc10rKSk/L2c7dGhpcy5zY3JpcHRSZWdFeHA9LzxzY3JpcHQoW14+XSopPihbXHNcU10qPyk8XC9zY3JpcHQ+L2dpO3RoaXMuc3R5bGVSZWdFeHA9Lyg8c3R5bGUoW14+XSopPltcc1xTXSo/PFwvc3R5bGU+KS9naTt0aGlzLmxpbmtSZWdFeHA9Lyg8bGluayhbXj5dKyk+KS9naTt0aGlzLmNkYXRhUmVnRXhwPS88IVxbQ0RBVEFcWyhbXHNcU10rKVxdXF0+L2c7dGhpcy5vYmpSZWdFeHA9LzxvYmplY3QoW14+XSopPihbXHNcU10qPyk8XC9vYmplY3Q+L2dpO3RoaXMuZW1iUmVnRXhwPS88KGVtYmVkKSgoPzpccytcdysoPzpccyo9XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W14+XHNdKykpPykqKVxzKj4vZ2k7dGhpcy5wYXJhbVJlZ0V4cD0vPChwYXJhbSkoKD86XHMrXHcrKD86XHMqPVxzKig/Oig/OiJbXiJdKiIpfCg/OidbXiddKicpfFtePlxzXSspKT8pKilccyo+L2dpO3RoaXMudmltZW9SZWdFeHA9LzwoaWZyYW1lKVxzKyhbXj5dKnNyY1xzKj1ccyoiaHR0cDpcL1wvW14iXSt2aW1lb1wuY29tXC9cdytbXj5dKik+KFtcc1xTXSo/KTxcL2lmcmFtZT4vZ2k7dGhpcy55TWFwc1JlZ0V4cD0vPGRpdlxzKyhbXj5dKmlkXHMqPVxzKignfCIpP1lNYXBzSURbXj5dKik+L2dpO3RoaXMuZ01hcHNSZWdFeHA9LzxpZnJhbWVccysoW14+XSpzcmNccyo9XHMqImh0dHA6XC9cL21hcHNcLmdvb2dsZVwuXHcrW14+XSopPihbXHNcU10qPyk8XC9pZnJhbWU+L2dpO3RoaXMudmlkZW9Ib3N0UmVnRXhwPS9eKGh0dHA6XC9cL1tcd1wuXSopPyh5b3V0dWJlfHZpbWVvfHJ1dHViZSkuKi9pO3RoaXMuc2VydmljZUNsYXNzUmVnRXhwPS88KFx3KykoW14+XSpjbGFzc1xzKj1ccyoiW14+XSplbHJ0ZS1bXj5dKik+XHMqKDxcL1wxPik/L2dpO3RoaXMucGFnZWJyZWFrUmVnRXhwPS88KFx3KykoW14+XSpzdHlsZVxzKj1ccyoiW14+XSpwYWdlLWJyZWFrW14+XSopPlxzKig8XC9cMT4pPy9naTt0aGlzLnBiUmVnRXhwPW5ldyBSZWdFeHAoIjwhLS0gcGFnZWJyZWFrIC0tPiIsImdpIik7dGhpcy5hbGxvd1RhZ3M9Yy5vcHRpb25zLmFsbG93VGFncy5sZW5ndGg/Yy51dGlscy5tYWtlT2JqZWN0KGMub3B0aW9ucy5hbGxvd1RhZ3MpOm51bGw7dGhpcy5kZW55VGFncz1jLm9wdGlvbnMuZGVueVRhZ3MubGVuZ3RoP2MudXRpbHMubWFrZU9iamVjdChjLm9wdGlvbnMuZGVueVRhZ3MpOm51bGw7dGhpcy5kZW55QXR0cj1jLm9wdGlvbnMuZGVueUF0dHI/Yy51dGlscy5tYWtlT2JqZWN0KGMub3B0aW9ucy5kZW55QXR0cik6bnVsbDt0aGlzLnBhc3RlRGVueUF0dHI9Yy5vcHRpb25zLnBhc3RlRGVueUF0dHI/Yy51dGlscy5tYWtlT2JqZWN0KGMub3B0aW9ucy5wYXN0ZURlbnlBdHRyKTpudWxsO3RoaXMuZm9udFNpemU9WyJtZWRpdW0iLCJ4eC1zbWFsbCIsInNtYWxsIiwibWVkaXVtIiwibGFyZ2UiLCJ4LWxhcmdlIiwieHgtbGFyZ2UiXTt0aGlzLmZvbnRGYW1pbHk9eyJzYW5zLXNlcmlmIjovXihhcmlhbHx0YWhvbWF8dmVyZGFuYSkkL2ksc2VyaWY6L14odGltZXN8dGltZXMgbmV3IHJvbWFuKSQvaSxtb25vc3BhY2U6L15jb3VyaWVyJC9pfTt0aGlzLnNjcmlwdHM9e307dGhpcy5fY2hhaW5zPXt9O2EuZWFjaCh0aGlzLmNoYWlucyxmdW5jdGlvbihnKXtiLl9jaGFpbnNbZ109W107YS5lYWNoKHRoaXMsZnVuY3Rpb24oaCxqKXt0eXBlb2YoYi5ydWxlc1tqXSk9PSJmdW5jdGlvbiImJmIuX2NoYWluc1tnXS5wdXNoKGIucnVsZXNbal0pfSl9KTt0aGlzLnByb2NjZXNzPWZ1bmN0aW9uKGgsZyl7Zz1hLnRyaW0oZykucmVwbGFjZSgvXlxzKigmbmJzcDspKy9naSwiIikucmVwbGFjZSgvKCZuYnNwO3w8YnJbXj5dKj4pK1xzKiQvZ2ksIiIpO2EuZWFjaCh0aGlzLl9jaGFpbnNbaF18fFtdLGZ1bmN0aW9uKCl7Zz10aGlzLmNhbGwoYixnKX0pO3JldHVybiBnLnJlcGxhY2UoL1x0L2csIiAgIikucmVwbGFjZSgvXHIvZywiIikucmVwbGFjZSgvXHMqXG5ccypcbisvZywiXG4iKSsiICAifTt0aGlzLnd5c2l3eWc9ZnVuY3Rpb24oZyl7cmV0dXJuIHRoaXMucHJvY2Nlc3MoInd5c2l3eWciLGcpfTt0aGlzLnNvdXJjZT1mdW5jdGlvbihnKXtyZXR1cm4gdGhpcy5wcm9jY2Vzcygic291cmNlIixnKX07dGhpcy5zb3VyY2Uyc291cmNlPWZ1bmN0aW9uKGcpe3JldHVybiB0aGlzLnByb2NjZXNzKCJzb3VyY2Uyc291cmNlIixnKX07dGhpcy53eXNpd3lnMnd5c2l3eWc9ZnVuY3Rpb24oZyl7cmV0dXJuIHRoaXMucHJvY2Nlc3MoInd5c2l3eWcyd3lzaXd5ZyIsZyl9O3RoaXMucGFyc2VBdHRycz1mdW5jdGlvbihwKXt2YXIgaj17fSxoPXRoaXMuYm9vbEF0dHJzLGc9cC5tYXRjaCh0aGlzLmF0dHJSZWdFeHApLG8scSxrO2cmJmEuZWFjaChnLGZ1bmN0aW9uKHIsdCl7bz10LnNwbGl0KCI9Iik7cT1hLnRyaW0ob1swXSkudG9Mb3dlckNhc2UoKTtpZihvLmxlbmd0aD4yKXtvLnNoaWZ0KCk7az1vLmpvaW4oIj0iKX1lbHNle2s9aFtxXXx8b1sxXXx8IiJ9altxXT1hLnRyaW0oaykucmVwbGFjZSgvXignfCIpKC4qKShcMSkkLywiJDIiKX0pO2ouc3R5bGU9dGhpcy5ydGUudXRpbHMucGFyc2VTdHlsZShqLnN0eWxlKTtqWyJjbGFzcyJdPXRoaXMucnRlLnV0aWxzLnBhcnNlQ2xhc3MoalsiY2xhc3MiXXx8IiIpO3JldHVybiBqfTt0aGlzLnNlcmlhbGl6ZUF0dHJzPWZ1bmN0aW9uKGcsayl7dmFyIGo9W10saD10aGlzO2EuZWFjaChnLGZ1bmN0aW9uKHAsbyl7aWYocD09InN0eWxlIil7bz1oLnJ0ZS51dGlscy5zZXJpYWxpemVTdHlsZShvLGspfWVsc2V7aWYocD09ImNsYXNzIil7bz1oLnJ0ZS51dGlscy5zZXJpYWxpemVDbGFzcyhvKX19byYmai5wdXNoKHArJz0iJytvKyciJyl9KTtyZXR1cm4gai5qb2luKCIgIil9O3RoaXMuY2xlYW5BdHRycz1mdW5jdGlvbihnLGope3ZhciBoPXRoaXMsbz10aGlzLnJlcGxhY2VBdHRyczthLmVhY2goZ1siY2xhc3MiXSxmdW5jdGlvbihwKXsvXihBcHBsZS1zdHlsZS1zcGFufG1zb1x3KykkL2kudGVzdChwKSYmZGVsZXRlIGdbImNsYXNzIl1bcF19KTtmdW5jdGlvbiBrKHApe3JldHVybiBwKygvXGQkLy50ZXN0KHApPyJweCI6IiIpfWEuZWFjaChnLGZ1bmN0aW9uKHEscCl7b1txXSYmb1txXS5jYWxsKGgsZyxqKTtpZihxPT0ic3R5bGUiKXthLmVhY2gocCxmdW5jdGlvbih0LHIpe3N3aXRjaCh0KXtjYXNlIm1zby1wYWRkaW5nLWFsdCI6Y2FzZSJtc28tcGFkZGluZy10b3AtYWx0IjpjYXNlIm1zby1wYWRkaW5nLXJpZ2h0LWFsdCI6Y2FzZSJtc28tcGFkZGluZy1ib3R0b20tYWx0IjpjYXNlIm1zby1wYWRkaW5nLWxlZnQtYWx0IjpjYXNlIm1zby1tYXJnaW4tYWx0IjpjYXNlIm1zby1tYXJnaW4tdG9wLWFsdCI6Y2FzZSJtc28tbWFyZ2luLXJpZ2h0LWFsdCI6Y2FzZSJtc28tbWFyZ2luLWJvdHRvbS1hbHQiOmNhc2UibXNvLW1hcmdpbi1sZWZ0LWFsdCI6Y2FzZSJtc28tdGFibGUtbGF5b3V0LWFsdCI6Y2FzZSJtc28taGVpZ2h0IjpjYXNlIm1zby13aWR0aCI6Y2FzZSJtc28tdmVydGljYWwtYWxpZ24tYWx0IjpnLnN0eWxlW3QucmVwbGFjZSgvXm1zby18LWFsdCQvZywiIildPWsocik7ZGVsZXRlIGcuc3R5bGVbdF07YnJlYWs7Y2FzZSJob3Jpei1hbGlnbiI6Zy5zdHlsZVsidGV4dC1hbGlnbiJdPXI7ZGVsZXRlIGcuc3R5bGVbdF07YnJlYWs7Y2FzZSJ2ZXJ0LWFsaWduIjpnLnN0eWxlWyJ2ZXJ0aWNhbC1hbGlnbiJdPXI7ZGVsZXRlIGcuc3R5bGVbdF07YnJlYWs7Y2FzZSJmb250LWNvbG9yIjpjYXNlIm1zby1mb3JlZ3JvdW5kIjpnLnN0eWxlLmNvbG9yPXI7ZGVsZXRlIGcuc3R5bGVbdF07YnJlYWs7Y2FzZSJtc28tYmFja2dyb3VuZCI6Y2FzZSJtc28taGlnaGxpZ2h0IjpnLnN0eWxlLmJhY2tncm91bmQ9cjtkZWxldGUgZy5zdHlsZVt0XTticmVhaztjYXNlIm1zby1kZWZhdWx0LWhlaWdodCI6Zy5zdHlsZVsibWluLWhlaWdodCJdPWsocik7ZGVsZXRlIGcuc3R5bGVbdF07YnJlYWs7Y2FzZSJtc28tZGVmYXVsdC13aWR0aCI6Zy5zdHlsZVsibWluLXdpZHRoIl09ayhyKTtkZWxldGUgZy5zdHlsZVt0XTticmVhaztjYXNlIm1zby1wYWRkaW5nLWJldHdlZW4tYWx0IjpnLnN0eWxlWyJib3JkZXItY29sbGFwc2UiXT0ic2VwYXJhdGUiO2cuc3R5bGVbImJvcmRlci1zcGFjaW5nIl09ayhyKTtkZWxldGUgZy5zdHlsZVt0XTticmVhaztjYXNlInRleHQtbGluZS10aHJvdWdoIjppZihyLm1hdGNoKC8oc2luZ2xlfGRvdWJsZSkvaSkpe2cuc3R5bGVbInRleHQtZGVjb3JhdGlvbiJdPSJsaW5lLXRocm91Z2gifWRlbGV0ZSBnLnN0eWxlW3RdO2JyZWFrO2Nhc2UibXNvLXplcm8taGVpZ2h0IjppZihyPT0ieWVzIil7Zy5zdHlsZS5kaXNwbGF5PSJub25lIn1kZWxldGUgZy5zdHlsZVt0XTticmVhaztjYXNlImZvbnQtd2VpZ2h0IjppZihyPT03MDApe2cuc3R5bGVbImZvbnQtd2VpZ2h0Il09ImJvbGQifWJyZWFrO2RlZmF1bHQ6aWYodC5tYXRjaCgvXihtc298Y29sdW1ufGZvbnQtZW1waHxsYW5nfGxheW91dHxsaW5lLWJyZWFrfGxpc3QtaW1hZ2V8bmF2fHBhbm9zZXxwdW5jdHxyb3d8cnVieXxzZXB8c2l6ZXxzcmN8dGFiLXx0YWJsZS1ib3JkZXJ8dGV4dC0oPyFhbGlnbnxkZWNvcnxpbmRlbnR8dHJhbnMpfHRvcC1iYXJ8dmVyc2lvbnx2bmR8d29yZC1icmVhaykvKSl7ZGVsZXRlIGcuc3R5bGVbdF19fX0pfX0pO3JldHVybiBnfX07ZWxSVEUucHJvdG90eXBlLmZpbHRlci5wcm90b3R5cGUucmVwbGFjZVRhZ3M9e2I6e3RhZzoic3Ryb25nIn0sYmlnOnt0YWc6InNwYW4iLHN0eWxlOnsiZm9udC1zaXplIjoibGFyZ2UifX0sY2VudGVyOnt0YWc6ImRpdiIsc3R5bGU6eyJ0ZXh0LWFsaWduIjoiY2VudGVyIn19LGk6e3RhZzoiZW0ifSxmb250Ont0YWc6InNwYW4ifSxub2JyOnt0YWc6InNwYW4iLHN0eWxlOnsid2hpdGUtc3BhY2UiOiJub3dyYXAifX0sbWVudTp7dGFnOiJ1bCJ9LHBsYWludGV4dDp7dGFnOiJwcmUifSxzOnt0YWc6InN0cmlrZSJ9LHNtYWxsOnt0YWc6InNwYW4iLHN0eWxlOnsiZm9udC1zaXplIjoic21hbGwifX0sdTp7dGFnOiJzcGFuIixzdHlsZTp7InRleHQtZGVjb3JhdGlvbiI6InVuZGVybGluZSJ9fSx4bXA6e3RhZzoicHJlIn19O2VsUlRFLnByb3RvdHlwZS5maWx0ZXIucHJvdG90eXBlLnJlcGxhY2VBdHRycz17YWxpZ246ZnVuY3Rpb24oYixjKXtzd2l0Y2goYyl7Y2FzZSJpbWciOmIuc3R5bGVbYi5hbGlnbi5tYXRjaCgvKGxlZnR8cmlnaHQpLyk/ImZsb2F0IjoidmVydGljYWwtYWxpZ24iXT1iLmFsaWduO2JyZWFrO2Nhc2UidGFibGUiOmlmKGIuYWxpZ249PSJjZW50ZXIiKXtiLnN0eWxlWyJtYXJnaW4tbGVmdCJdPWIuc3R5bGVbIm1hcmdpbi1yaWdodCJdPSJhdXRvIn1lbHNle2Iuc3R5bGVbImZsb2F0Il09Yi5hbGlnbn1icmVhaztkZWZhdWx0OmIuc3R5bGVbInRleHQtYWxpZ24iXT1iLmFsaWdufWRlbGV0ZSBiLmFsaWdufSxib3JkZXI6ZnVuY3Rpb24oYil7IWIuc3R5bGVbImJvcmRlci13aWR0aCJdJiYoYi5zdHlsZVsiYm9yZGVyLXdpZHRoIl09KHBhcnNlSW50KGIuYm9yZGVyKXx8MSkrInB4Iik7IWIuc3R5bGVbImJvcmRlci1zdHlsZSJdJiYoYi5zdHlsZVsiYm9yZGVyLXN0eWxlIl09InNvbGlkIik7ZGVsZXRlIGIuYm9yZGVyfSxib3JkZXJjb2xvcjpmdW5jdGlvbihiKXshYi5zdHlsZVsiYm9yZGVyLWNvbG9yIl0mJihiLnN0eWxlWyJib3JkZXItY29sb3IiXT1iLmJvcmRlcmNvbG9yKTtkZWxldGUgYi5ib3JkZXJjb2xvcn0sYmFja2dyb3VuZDpmdW5jdGlvbihiKXshYi5zdHlsZVsiYmFja2dyb3VuZC1pbWFnZSJdJiYoYi5zdHlsZVsiYmFja2dyb3VuZC1pbWFnZSJdPSJ1cmwoIitiLmJhY2tncm91bmQrIikiKTtkZWxldGUgYi5iYWNrZ3JvdW5kfSxiZ2NvbG9yOmZ1bmN0aW9uKGIpeyFiLnN0eWxlWyJiYWNrZ3JvdW5kLWNvbG9yIl0mJihiLnN0eWxlWyJiYWNrZ3JvdW5kLWNvbG9yIl09Yi5iZ2NvbG9yKTtkZWxldGUgYi5iZ2NvbG9yfSxjbGVhcjpmdW5jdGlvbihiKXtiLnN0eWxlLmNsZWFyPWIuY2xlYXI9PSJhbGwiPyJib3RoIjpiLmNsZWFyO2RlbGV0ZSBiLmNsZWFyfSxjb2xvcjpmdW5jdGlvbihiKXshYi5zdHlsZS5jb2xvciYmKGIuc3R5bGUuY29sb3I9Yi5jb2xvcik7ZGVsZXRlIGIuY29sb3J9LGZhY2U6ZnVuY3Rpb24oYil7dmFyIGM9Yi5mYWNlLnRvTG93ZXJDYXNlKCk7YS5lYWNoKHRoaXMuZm9udEZhbWlseSxmdW5jdGlvbihnLGYpe2lmKGMubWF0Y2goZikpe2Iuc3R5bGVbImZvbnQtZmFtaWx5Il09YysiLCIrZ319KTtkZWxldGUgYi5mYWNlfSxoc3BhY2U6ZnVuY3Rpb24oYixmKXtpZihmPT0iaW1nIil7dmFyIGM9cGFyc2VJbnQoYi5oc3BhY2UpfHwwOyFiLnN0eWxlWyJtYXJnaW4tbGVmdCJdJiYoYi5zdHlsZVsibWFyZ2luLWxlZnQiXT1jKyJweCIpOyFiLnN0eWxlWyJtYXJnaW4tcmlnaHQiXSYmKGIuc3R5bGVbIm1hcmdpbi1yaWdodCJdPWMrInB4Iik7ZGVsZXRlIGIuaHNwYWNlfX0sc2l6ZTpmdW5jdGlvbihiLGMpe2lmKGMhPSJpbnB1dCIpe2Iuc3R5bGVbImZvbnQtc2l6ZSJdPXRoaXMuZm9udFNpemVbcGFyc2VJbnQoYi5zaXplKXx8MF18fCJtZWRpdW0iO2RlbGV0ZSBiLnNpemV9fSx2YWxpZ246ZnVuY3Rpb24oYil7aWYoIWIuc3R5bGVbInZlcnRpY2FsLWFsaWduIl0pe2Iuc3R5bGVbInZlcnRpY2FsLWFsaWduIl09Yi52YWxpZ259ZGVsZXRlIGIudmFsaWdufSx2c3BhY2U6ZnVuY3Rpb24oYixmKXtpZihmPT0iaW1nIil7dmFyIGM9cGFyc2VJbnQoYi52c3BhY2UpfHwwOyFiLnN0eWxlWyJtYXJnaW4tdG9wIl0mJihiLnN0eWxlWyJtYXJnaW4tdG9wIl09YysicHgiKTshYi5zdHlsZVsibWFyZ2luLWJvdHRvbSJdJiYoYi5zdHlsZVsibWFyZ2luLWJvdHRvbSJdPWMrInB4Iik7ZGVsZXRlIGIuaHNwYWNlfX19O2VsUlRFLnByb3RvdHlwZS5maWx0ZXIucHJvdG90eXBlLnJ1bGVzPXthbGxvd2VkVGFnczpmdW5jdGlvbihjKXt2YXIgYj10aGlzLmFsbG93VGFncztyZXR1cm4gYj9jLnJlcGxhY2UodGhpcy50YWdSZWdFeHAsZnVuY3Rpb24oZixoLGcpe3JldHVybiBiW2cudG9Mb3dlckNhc2UoKV0/ZjoiIn0pOmN9LGRlbmllZFRhZ3M6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5kZW55VGFncztyZXR1cm4gYz9iLnJlcGxhY2UodGhpcy50YWdSZWdFeHAsZnVuY3Rpb24oZixoLGcpe3JldHVybiBjW2cudG9Mb3dlckNhc2UoKV0/IiI6Zn0pOmJ9LGNsZWFuOmZ1bmN0aW9uKGcpe3ZhciBjPXRoaXMsYj10aGlzLnJlcGxhY2VUYWdzLGg9dGhpcy5yZXBsYWNlQXR0cnMsZj10aGlzLmRlbnlBdHRyLGo7cmV0dXJuIGcucmVwbGFjZSgvPCFET0NUWVBFKFtcc1xTXSopPi9naSwiIikucmVwbGFjZSgvPHAgW14+XSpjbGFzcz0iP01zb0hlYWRpbmciP1tePl0qPiguKj8pPFwvcD4vZ2ksIjxwPjxzdHJvbmc+JDE8L3N0cm9uZz48L3A+IikucmVwbGFjZSgvPHNwYW5ccytzdHlsZVxzKj1ccyoiXHMqbXNvLXNwYWNlcnVuXHMqOlxzKnllc1xzKjs/XHMqIlxzKj4oW1xzJm5ic3A7XSopPFwvc3Bhbj4vZ2ksIiQxIikucmVwbGFjZSgvKDxwW14+XSo+XHMqPFwvcD58PHBbXj5dKlwvPikvZ2ksIjxicj4iKS5yZXBsYWNlKHRoaXMudGFnUmVnRXhwLGZ1bmN0aW9uKG8scSxwLGspe3A9cC50b0xvd2VyQ2FzZSgpO2lmKHEpe3JldHVybiI8LyIrKGJbcF0/YltwXS50YWc6cCkrIj4ifWs9Yy5jbGVhbkF0dHJzKGMucGFyc2VBdHRycyhrfHwiIikscCk7aWYoYltwXSl7YltwXS5zdHlsZSYmYS5leHRlbmQoay5zdHlsZSxiW3BdLnN0eWxlKTtwPWJbcF0udGFnfWYmJmEuZWFjaChrLGZ1bmN0aW9uKHIpe2lmKGZbcl0pe2RlbGV0ZSBrW3JdfX0pO2s9Yy5zZXJpYWxpemVBdHRycyhrKTtyZXR1cm4iPCIrcCsoaz8iICI6IiIpK2srIj4ifSl9LGNsZWFuUGFzdGU6ZnVuY3Rpb24oYyl7dmFyIGI9dGhpcyxmPXRoaXMucGFzdGVEZW55QXR0cjtjPWMucmVwbGFjZSh0aGlzLnNjcmlwdFJlZ0V4cCwiIikucmVwbGFjZSh0aGlzLnN0eWxlUmVnRXhwLCIiKS5yZXBsYWNlKHRoaXMubGlua1JlZ0V4cCwiIikucmVwbGFjZSh0aGlzLmNkYXRhUmVnRXhwLCIiKS5yZXBsYWNlKC9cPFwhLS1bXHNcU10qPy0tXD4vZywiIik7aWYodGhpcy5ydGUub3B0aW9ucy5wYXN0ZU9ubHlUZXh0KXtjPWMucmVwbGFjZSh0aGlzLnRhZ1JlZ0V4cCxmdW5jdGlvbihnLGosaCl7cmV0dXJuL2JyL2kudGVzdChoKXx8KGomJi9oWzEtNl18cHxvbHx1bHxsaXxkaXZ8YmxvY2txdW90ZXx0ci9pKT8iPGJyPiI6IiJ9KS5yZXBsYWNlKC8oJm5ic3A7fDxicltePl0qPikrXHMqJC9naSwiIil9ZWxzZXtpZihmKXtjPWMucmVwbGFjZSh0aGlzLm9wZW5UYWdSZWdFeHAsZnVuY3Rpb24oaCxqLGcpe2c9Yi5wYXJzZUF0dHJzKGcpO2EuZWFjaChnLGZ1bmN0aW9uKGspe2lmKGZba10pe2RlbGV0ZSBnW2tdfX0pO2c9Yi5zZXJpYWxpemVBdHRycyhnLHRydWUpO3JldHVybiI8IitqKyhnPyIgIjoiIikrZysiPiJ9KX19cmV0dXJuIGN9LHJlcGxhY2U6ZnVuY3Rpb24obyl7dmFyIHE9dGhpcyxiPXRoaXMucnRlLm9wdGlvbnMucmVwbGFjZXx8W10sZztpZihiLmxlbmd0aCl7YS5lYWNoKGIsZnVuY3Rpb24ocix0KXtpZih0eXBlb2YodCk9PSJmdW5jdGlvbiIpe289dC5jYWxsKHEsbyl9fSl9ZnVuY3Rpb24gayh4LEQpe3ZhciBFPXIoKSxCPUUmJnEudmlkZW9Ib3N0UmVnRXhwLnRlc3QoRSk/RS5yZXBsYWNlKHEudmlkZW9Ib3N0UmVnRXhwLCIkMiIpOkQucmVwbGFjZSgvXlx3K1wvKC4rKS8sIiQxIiksQz1wYXJzZUludCgoeC5vYmo/eC5vYmoud2lkdGh8fHgub2JqLnN0eWxlLndpZHRoOjApfHwoeC5lbWJlZD94LmVtYmVkLndpZHRofHx4LmVtYmVkLnN0eWxlLndpZHRoOjApKXx8MTUwLEE9cGFyc2VJbnQoKHgub2JqP3gub2JqLmhlaWdodHx8eC5vYmouc3R5bGUuaGVpZ2h0OjApfHwoeC5lbWJlZD94LmVtYmVkLmhlaWdodHx8eC5lbWJlZC5zdHlsZS5oZWlnaHQ6MCkpfHwxMDAsdj0ibWVkaWEiK01hdGgucmFuZG9tKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksdT0iIix6O2Z1bmN0aW9uIHIoKXtpZih4LmVtYmVkJiZ4LmVtYmVkLnNyYyl7cmV0dXJuIHguZW1iZWQuc3JjfWlmKHgucGFyYW1zJiZ4LnBhcmFtcy5sZW5ndGgpe3o9eC5wYXJhbXMubGVuZ3RoO3doaWxlKHotLSl7aWYoeC5wYXJhbXNbel0ubmFtZT09InNyYyJ8fHgucGFyYW1zW3pdLm5hbWU9PSJtb3ZpZSIpe3JldHVybiB4LnBhcmFtc1t6XS52YWx1ZX19fX1pZih4Lm9iaiYmeC5vYmouc3R5bGUmJngub2JqLnN0eWxlWyJmbG9hdCJdKXt1PScgc3R5bGU9ImZsb2F0OicreC5vYmouc3R5bGVbImZsb2F0Il0rJyInfXEuc2NyaXB0c1t2XT14O3JldHVybic8aW1nIHNyYz0iJytxLnVybCsncGl4ZWwuZ2lmIiBjbGFzcz0iZWxydGUtbWVkaWEgZWxydGUtbWVkaWEtJytCKycgZWxydGUtcHJvdGVjdGVkIiB0aXRsZT0iJysoRT9xLnJ0ZS51dGlscy5lbmNvZGUoRSk6IiIpKyciIHJlbD0iJyt2KyciIHdpZHRoPSInK0MrJyIgaGVpZ2h0PSInK0ErJyInK3UrIj4ifW89by5yZXBsYWNlKHRoaXMuc3R5bGVSZWdFeHAsIjwhLS0gRUxSVEVfQ09NTUVOVCQxIC0tPiIpLnJlcGxhY2UodGhpcy5saW5rUmVnRXhwLCI8IS0tIEVMUlRFX0NPTU1FTlQkMS0tPiIpLnJlcGxhY2UodGhpcy5jZGF0YVJlZ0V4cCwiPCEtLVtDREFUQVskMV1dLS0+IikucmVwbGFjZSh0aGlzLnNjcmlwdFJlZ0V4cCxmdW5jdGlvbih1LHIsdil7dmFyIHc7aWYocS5kZW55VGFncy5zY3JpcHQpe3JldHVybiIifXc9InNjcmlwdCIrTWF0aC5yYW5kb20oKS50b1N0cmluZygpLnN1YnN0cmluZygyKTtyPXEucGFyc2VBdHRycyhyKTshci50eXBlJiYoci50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiKTtxLnNjcmlwdHNbd109IjxzY3JpcHQgIitxLnNlcmlhbGl6ZUF0dHJzKHIpKyI+Iit2KyI8XC9zY3JpcHQ+IjtyZXR1cm4iPCEtLSBFTFJURV9TQ1JJUFQ6IisodykrIiAtLT4ifSkucmVwbGFjZSh0aGlzLnlNYXBzUmVnRXhwLGZ1bmN0aW9uKHUscil7cj1xLnBhcnNlQXR0cnMocik7clsiY2xhc3MiXVsiZWxydGUteWFuZGV4LW1hcHMiXT0iZWxydGUteWFuZGV4LW1hcHMiO3JbImNsYXNzIl1bImVscnRlLXByb3RlY3RlZCJdPSJlbHJ0ZS1wcm90ZWN0ZWQiO3JldHVybiI8ZGl2ICIrcS5zZXJpYWxpemVBdHRycyhyKSsiPiJ9KS5yZXBsYWNlKHRoaXMuZ01hcHNSZWdFeHAsZnVuY3Rpb24odix1KXt2YXIgej0iZ21hcHMiK01hdGgucmFuZG9tKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMikscix4O3U9cS5wYXJzZUF0dHJzKHUpO3I9cGFyc2VJbnQodS53aWR0aHx8dS5zdHlsZS53aWR0aHx8MTAwKTt4PXBhcnNlSW50KHUuaGVpZ2h0fHx1LnN0eWxlLmhlaWdodHx8MTAwKTtxLnNjcmlwdHNbel09djtyZXR1cm4nPGltZyBzcmM9IicrcS51cmwrJ3BpeGVsLmdpZiIgY2xhc3M9ImVscnRlLWdvb2dsZS1tYXBzIGVscnRlLXByb3RlY3RlZCIgaWQ9IicreisnIiBzdHlsZT0id2lkdGg6JytyKyJweDtoZWlnaHQ6Iit4KydweCI+J30pLnJlcGxhY2UodGhpcy5vYmpSZWdFeHAsZnVuY3Rpb24odyx1LHope3ZhciByPXoubWF0Y2gocS5lbWJSZWdFeHApLHg9e29iajpxLnBhcnNlQXR0cnModSksZW1iZWQ6ciYmci5sZW5ndGg/cS5wYXJzZUF0dHJzKHJbMF0uc3Vic3RyaW5nKDcpKTpudWxsLHBhcmFtczpbXX0sdj1xLnJ0ZS51dGlscy5tZWRpYUluZm8oeC5lbWJlZD94LmVtYmVkLnR5cGV8fCIiOiIiLHgub2JqLmNsYXNzaWR8fCIiKTtpZih2KXtpZigocj16Lm1hdGNoKHEucGFyYW1SZWdFeHApKSl7YS5lYWNoKHIsZnVuY3Rpb24odCxBKXt4LnBhcmFtcy5wdXNoKHEucGFyc2VBdHRycyhBLnN1YnN0cmluZyg2KSkpfSl9IXgub2JqLmNsYXNzaWQmJih4Lm9iai5jbGFzc2lkPXYuY2xhc3NpZFswXSk7IXgub2JqLmNvZGViYXNlJiYoeC5vYmouY29kZWJhc2U9di5jb2RlYmFzZSk7eC5lbWJlZCYmIXguZW1iZWQudHlwZSYmKHguZW1iZWQudHlwZT12LnR5cGUpO3gub2JqLndpZHRoPT0iMSImJmRlbGV0ZSB4Lm9iai53aWR0aDt4Lm9iai5oZWlnaHQ9PSIxIiYmZGVsZXRlIHgub2JqLmhlaWdodDtpZih4LmVtYmVkKXt4LmVtYmVkLndpZHRoPT0iMSImJmRlbGV0ZSB4LmVtYmVkLndpZHRoO3guZW1iZWQuaGVpZ2h0PT0iMSImJmRlbGV0ZSB4LmVtYmVkLmhlaWdodH1yZXR1cm4gayh4LHYudHlwZSl9cmV0dXJuIHd9KS5yZXBsYWNlKHRoaXMuZW1iUmVnRXhwLGZ1bmN0aW9uKHYsdyxyKXt2YXIgcj1xLnBhcnNlQXR0cnMociksdT1xLnJ0ZS51dGlscy5tZWRpYUluZm8oci50eXBlfHwiIik7ci53aWR0aD09IjEiJiZkZWxldGUgci53aWR0aDtyLmhlaWdodD09IjEiJiZkZWxldGUgci5oZWlnaHQ7cmV0dXJuIHU/ayh7ZW1iZWQ6cn0sdS50eXBlKTp2fSkucmVwbGFjZSh0aGlzLnZpbWVvUmVnRXhwLGZ1bmN0aW9uKHUsdixyKXtyPXEucGFyc2VBdHRycyhyKTtkZWxldGUgci5mcmFtZWJvcmRlcjtyLndpZHRoPT0iMSImJmRlbGV0ZSByLndpZHRoO3IuaGVpZ2h0PT0iMSImJmRlbGV0ZSByLmhlaWdodDtyLnR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIjtyZXR1cm4gayh7ZW1iZWQ6cn0sImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIil9KS5yZXBsYWNlKC88XC8oZW1iZWR8cGFyYW0pPi9naSwiIikucmVwbGFjZSh0aGlzLnBiUmVnRXhwLGZ1bmN0aW9uKCl7cmV0dXJuJzxpbWcgc3JjPSInK3EudXJsKydwaXhlbC5naWYiIGNsYXNzPSJlbHJ0ZS1wcm90ZWN0ZWQgZWxydGUtcGFnZWJyZWFrIj4nfSk7Zz1hKCI8ZGl2PiIrbysiPC9kaXY+Iik7Zy5maW5kKCJzcGFuOm5vdChbaWRdKTpub3QoW2NsYXNzXSkiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHI9YSh0aGlzKTtpZighci5hdHRyKCJzdHlsZSIpKXtyLmNoaWxkcmVuKCkubGVuZ3RoP3EucnRlLmRvbS51bndyYXAodGhpcyk6ci5yZW1vdmUoKX19KS5lbmQoKS5maW5kKCJzcGFuIHNwYW46b25seS1jaGlsZCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgdT1hKHRoaXMpLHg9dS5wYXJlbnQoKS5lcSgwKSx3PXUuYXR0cigiaWQiKSxyPXguYXR0cigiaWQiKSxBLHYsejtpZihxLnJ0ZS5kb20uaXModGhpcywib25seUNoaWxkIikmJighd3x8IXIpKXt6PWEudHJpbSh4LmF0dHIoImNsYXNzIikrIiAiK3UuYXR0cigiY2xhc3MiKSk7eiYmeC5hdHRyKCJjbGFzcyIseik7dj1xLnJ0ZS51dGlscy5zZXJpYWxpemVTdHlsZShhLmV4dGVuZChxLnJ0ZS51dGlscy5wYXJzZVN0eWxlKGEodGhpcykuYXR0cigic3R5bGUiKXx8IiIpLHEucnRlLnV0aWxzLnBhcnNlU3R5bGUoYSh4KS5hdHRyKCJzdHlsZSIpfHwiIikpKTt2JiZ4LmF0dHIoInN0eWxlIix2KTtBPXd8fHI7QSYmeC5hdHRyKCJpZCIsQSk7dGhpcy5maXJzdENoaWxkP2EodGhpcy5maXJzdENoaWxkKS51bndyYXAoKTp1LnJlbW92ZSgpfX0pO2lmKCF0aGlzLnJ0ZS5vcHRpb25zLmFsbG93VGV4dE5vZGVzKXt2YXIgaD10aGlzLnJ0ZS5kb20sYz1bXSxwPVtdO2lmKGEuYnJvd3Nlci5tc2llKXtmb3IodmFyIGo9MDtqPGdbMF0uY2hpbGROb2Rlcy5sZW5ndGg7aisrKXtjLnB1c2goZ1swXS5jaGlsZE5vZGVzW2pdKX19ZWxzZXtjPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGdbMF0uY2hpbGROb2Rlcyl9ZnVuY3Rpb24gZigpe2lmKHAubGVuZ3RoJiZoLmZpbHRlcihwLCJub3RFbXB0eSIpLmxlbmd0aCl7aC53cmFwKHAsZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpKX1wPVtdfWEuZWFjaChjLGZ1bmN0aW9uKHIsdCl7aWYoaC5pcyh0LCJibG9jayIpKXtmKCl9ZWxzZXtpZihwLmxlbmd0aCYmdC5wcmV2aW91c1NpYmxpbmchPXBbcC5sZW5ndGgtMV0pe2YoKX1wLnB1c2godCl9fSk7ZigpfXJldHVybiBnLmh0bWwoKX0scmVzdG9yZTpmdW5jdGlvbihjKXt2YXIgYj10aGlzLGY9dGhpcy5ydGUub3B0aW9ucy5yZXN0b3JlfFtdO2lmKGYubGVuZ3RoKXthLmVhY2goZixmdW5jdGlvbihnLGgpe2lmKHR5cGVvZihoKT09ImZ1bmN0aW9uIil7Yz1oLmNhbGwoYixjKX19KX1jPWMucmVwbGFjZSgvXDxcIS0tXFtDREFUQVxbKFtcc1xTXSo/KVxdXF0tLVw+L2dpLCI8IVtDREFUQVskMV1dPiIpLnJlcGxhY2UoL1w8XCEtLVxzKkVMUlRFX1NDUklQVFw6XHMqKHNjcmlwdFxkKylccyotLVw+L2dpLGZ1bmN0aW9uKGcsaCl7aWYoYi5zY3JpcHRzW2hdKXtnPWIuc2NyaXB0c1toXTtkZWxldGUgYi5zY3JpcHRzW2hdfXJldHVybiBnfHwiIn0pLnJlcGxhY2UoL1w8XCEtLSBFTFJURV9DT01NRU5UKFtcc1xTXSo/KSAtLVw+L2dpLCIkMSIpLnJlcGxhY2UodGhpcy5zZXJ2aWNlQ2xhc3NSZWdFeHAsZnVuY3Rpb24oayxyLGcscCl7dmFyIGc9Yi5wYXJzZUF0dHJzKGcpLGgscT0iIjtpZihnWyJjbGFzcyJdWyJlbHJ0ZS1tZWRpYSJdKXtoPWIuc2NyaXB0c1tnLnJlbF18fHt9O2gucGFyYW1zJiZhLmVhY2goaC5wYXJhbXMsZnVuY3Rpb24oaixvKXtxKz0iPHBhcmFtICIrYi5zZXJpYWxpemVBdHRycyhvKSsiPlxuIn0pO2guZW1iZWQmJihxKz0iPGVtYmVkICIrYi5zZXJpYWxpemVBdHRycyhoLmVtYmVkKSsiPiIpO2gub2JqJiYocT0iPG9iamVjdCAiK2Iuc2VyaWFsaXplQXR0cnMoaC5vYmopKyI+XG4iK3ErIlxuPC9vYmplY3Q+XG4iKTtyZXR1cm4gcXx8a31lbHNle2lmKGdbImNsYXNzIl1bImVscnRlLWdvb2dsZS1tYXBzIl0pe3ZhciBrPSIiO2lmKGIuc2NyaXB0c1tnLmlkXSl7az1iLnNjcmlwdHNbZy5pZF07ZGVsZXRlIGIuc2NyaXB0c1tnLmlkXX1yZXR1cm4ga31lbHNle2lmKGdbImNsYXNzIl1bImVscnRlLXBhZ2VicmVhayJdKXtyZXR1cm4iPCEtLSBwYWdlYnJlYWsgLS0+In19fWEuZWFjaChnWyJjbGFzcyJdLGZ1bmN0aW9uKGopey9eZWxydGUtXHcrL2kudGVzdChqKSYmZGVsZXRlIChnWyJjbGFzcyJdW2pdKX0pO3JldHVybiI8IityKyIgIitiLnNlcmlhbGl6ZUF0dHJzKGcpKyI+IisocHx8IiIpfSk7cmV0dXJuIGN9LGNvbXBhY3RTdHlsZXM6ZnVuY3Rpb24oYyl7dmFyIGI9dGhpcztyZXR1cm4gYy5yZXBsYWNlKHRoaXMudGFnUmVnRXhwLGZ1bmN0aW9uKGcsaixoLGYpe2Y9IWomJmY/Yi5zZXJpYWxpemVBdHRycyhiLnBhcnNlQXR0cnMoZiksdHJ1ZSk6IiI7cmV0dXJuIjwiK2oraC50b0xvd2VyQ2FzZSgpKyhmPyIgIjoiIikrZisiPiJ9KX0seGh0bWxUYWdzOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnhodG1sP2IucmVwbGFjZSgvPChpbWd8aHJ8YnJ8ZW1iZWR8cGFyYW18bGluaykoW14+XSpcLyopPi9naSwiPCQxJDIgLz4iKTpifX07ZWxSVEUucHJvdG90eXBlLmZpbHRlci5wcm90b3R5cGUuY2hhaW5zPXt3eXNpd3lnOlsiY2xlYW4iLCJhbGxvd2VkVGFncyIsInJlcGxhY2UiLCJkZW5pZWRUYWdzIiwiY29tcGFjdFN0eWxlcyJdLHNvdXJjZTpbImNsZWFuIiwiYWxsb3dlZFRhZ3MiLCJyZXN0b3JlIiwiY29tcGFjdFN0eWxlcyIsInhodG1sVGFncyJdLHBhc3RlOlsiY2xlYW4iLCJhbGxvd2VkVGFncyIsImNsZWFuUGFzdGUiLCJyZXBsYWNlIiwiZGVuaWVkVGFncyIsImNvbXBhY3RTdHlsZXMiXSx3eXNpd3lnMnd5c2l3eWc6WyJjbGVhbiIsImFsbG93ZWRUYWdzIiwicmVzdG9yZSIsInJlcGxhY2UiLCJkZW5pZWRUYWdzIiwiY29tcGFjdFN0eWxlcyJdLHNvdXJjZTJzb3VyY2U6WyJjbGVhbiIsImFsbG93ZWRUYWdzIiwicmVwbGFjZSIsImRlbmllZFRhZ3MiLCJyZXN0b3JlIiwiY29tcGFjdFN0eWxlcyIsInhodG1sVGFncyJdfX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS5oaXN0b3J5PWZ1bmN0aW9uKGIpe3RoaXMucnRlPWI7dGhpcy5fcHJldj1bXTt0aGlzLl9uZXh0PVtdO3RoaXMuYWRkPWZ1bmN0aW9uKCl7aWYodGhpcy5ydGUub3B0aW9ucy5oaXN0b3J5TGVuZ3RoPjAmJnRoaXMuX3ByZXYubGVuZ3RoPj10aGlzLnJ0ZS5vcHRpb25zLmhpc3RvcnlMZW5ndGgpe3RoaXMuX3ByZXYuc2xpY2UodGhpcy5ydGUub3B0aW9ucy5oaXN0b3J5TGVuZ3RoKX12YXIgYz10aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoKTt0aGlzLl9wcmV2LnB1c2goW2EodGhpcy5ydGUuZG9jLmJvZHkpLmh0bWwoKSxjXSk7dGhpcy5ydGUuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGMpO3RoaXMuX25leHQ9W119O3RoaXMuYmFjaz1mdW5jdGlvbigpe2lmKHRoaXMuX3ByZXYubGVuZ3RoKXt2YXIgYz10aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoKSxmPXRoaXMuX3ByZXYucG9wKCk7dGhpcy5fbmV4dC5wdXNoKFthKHRoaXMucnRlLmRvYy5ib2R5KS5odG1sKCksY10pO2EodGhpcy5ydGUuZG9jLmJvZHkpLmh0bWwoZlswXSk7dGhpcy5ydGUuc2VsZWN0aW9uLm1vdmVUb0Jvb2ttYXJrKGZbMV0pfX07dGhpcy5md2Q9ZnVuY3Rpb24oKXtpZih0aGlzLl9uZXh0Lmxlbmd0aCl7dmFyIGM9dGhpcy5ydGUuc2VsZWN0aW9uLmdldEJvb2ttYXJrKCksZj10aGlzLl9uZXh0LnBvcCgpO3RoaXMuX3ByZXYucHVzaChbYSh0aGlzLnJ0ZS5kb2MuYm9keSkuaHRtbCgpLGNdKTthKHRoaXMucnRlLmRvYy5ib2R5KS5odG1sKGZbMF0pO3RoaXMucnRlLnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhmWzFdKX19O3RoaXMuY2FuQmFjaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcmV2Lmxlbmd0aH07dGhpcy5jYW5Gd2Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmV4dC5sZW5ndGh9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS5vcHRpb25zPXtkb2N0eXBlOic8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4nLGNzc0NsYXNzOiJlbC1ydGUiLGNzc2ZpbGVzOltdLGhlaWdodDpudWxsLHJlc2l6YWJsZTp0cnVlLGxhbmc6ImVuIix0b29sYmFyOiJub3JtYWwiLGFic29sdXRlVVJMczp0cnVlLGFsbG93U291cmNlOnRydWUsc3RyaXBXaGl0ZVNwYWNlOnRydWUsc3R5bGVXaXRoQ1NTOmZhbHNlLGZtQWxsb3c6dHJ1ZSxmbU9wZW46bnVsbCxhbGxvd1RhZ3M6W10sZGVueVRhZ3M6WyJhcHBsZXQiLCJiYXNlIiwiYmFzZWZvbnQiLCJiZ3NvdW5kIiwiYmxpbmsiLCJib2R5IiwiY29sIiwiY29sZ3JvdXAiLCJpZnJhbWUiLCJpc2luZGV4IiwiZnJhbWVzZXQiLCJodG1sIiwiaGVhZCIsIm1ldGEiLCJtYXJxdWVlIiwibm9mcmFtZXMiLCJub2VtYmVkIiwibzpwIiwidGl0bGUiLCJ4bWwiXSxkZW55QXR0cjpbXSxwYXN0ZURlbnlBdHRyOlsiaWQiLCJuYW1lIiwiY2xhc3MiLCJzdHlsZSIsImxhbmd1YWdlIiwib25jbGljayIsIm9uZGJsY2xpY2siLCJvbmhvdmVyIiwib25rZXVwIiwib25rZXlkb3duIiwib25rZXlwcmVzcyJdLGFsbG93VGV4dE5vZGVzOmZhbHNlLGFsbG93QnJvd3NlcnNTcGVjU3R5bGVzOmZhbHNlLGFsbG93UGFzdGU6dHJ1ZSxwYXN0ZU9ubHlUZXh0OmZhbHNlLHJlcGxhY2U6W10scmVzdG9yZTpbXSxwYWdlYnJlYWs6JzxkaXYgc3R5bGU9InBhZ2UtYnJlYWstYWZ0ZXI6IGFsd2F5czsiPjwvZGl2PicsYnV0dG9uczp7c2F2ZToiU2F2ZSIsY29weToiQ29weSIsY3V0OiJDdXQiLGNzczoiQ3NzIHN0eWxlIGFuZCBjbGFzcyIscGFzdGU6IlBhc3RlIixwYXN0ZXRleHQ6IlBhc3RlIG9ubHkgdGV4dCIscGFzdGVmb3JtYXR0ZXh0OiJQYXN0ZSBmb3JtYXR0ZWQgdGV4dCIscmVtb3ZlZm9ybWF0OiJDbGVhbiBmb3JtYXQiLHVuZG86IlVuZG8gbGFzdCBhY3Rpb24iLHJlZG86IlJlZG8gcHJldmlvdXMgYWN0aW9uIixib2xkOiJCb2xkIixpdGFsaWM6Ikl0YWxpYyIsdW5kZXJsaW5lOiJVbmRlcmxpbmUiLHN0cmlrZXRocm91Z2g6IlN0cmlrZXRocm91Z2giLHN1cGVyc2NyaXB0OiJTdXBlcnNjcmlwdCIsc3Vic2NyaXB0OiJTdWJzY3JpcHQiLGp1c3RpZnlsZWZ0OiJBbGlnbiBsZWZ0IixqdXN0aWZ5cmlnaHQ6IkFpbGduIHJpZ2h0IixqdXN0aWZ5Y2VudGVyOiJBbGlnbiBjZW50ZXIiLGp1c3RpZnlmdWxsOiJBbGlnbiBmdWxsIixpbmRlbnQ6IkluZGVudCIsb3V0ZGVudDoiT3V0ZGVudCIscnRsOiJSaWdodCB0byBsZWZ0IixsdHI6IkxlZnQgdG8gcmlnaHQiLGZvcmVjb2xvcjoiRm9udCBjb2xvciIsaGlsaXRlY29sb3I6IkJhY2tncm91bmQgY29sb3IiLGZvcm1hdGJsb2NrOiJGb3JtYXQiLGZvbnRzaXplOiJGb250IHNpemUiLGZvbnRuYW1lOiJGb250IixpbnNlcnRvcmRlcmVkbGlzdDoiT3JkZXJlZCBsaXN0IixpbnNlcnR1bm9yZGVyZWRsaXN0OiJVbm9yZGVyZWQgbGlzdCIsaG9yaXpvbnRhbHJ1bGU6Ikhvcml6b250YWwgcnVsZSIsYmxvY2txdW90ZToiQmxvY2txdW90ZSIsZGl2OiJCbG9jayBlbGVtZW50IChESVYpIixsaW5rOiJMaW5rIix1bmxpbms6IkRlbGV0ZSBsaW5rIixhbmNob3I6IkJvb2ttYXJrIixpbWFnZToiSW1hZ2UiLHBhZ2VicmVhazoiUGFnZSBicmVhayIsc21pbGV5OiJTbWlsZXkiLGZsYXNoOiJGbGFzaCIsdGFibGU6IlRhYmxlIix0YWJsZXJtOiJEZWxldGUgdGFibGUiLHRhYmxlcHJvcHM6IlRhYmxlIHByb3BlcnRpZXMiLHRiY2VsbHByb3BzOiJUYWJsZSBjZWxsIHByb3BlcnRpZXMiLHRicm93YmVmb3JlOiJJbnNlcnQgcm93IGJlZm9yZSIsdGJyb3dhZnRlcjoiSW5zZXJ0IHJvdyBhZnRlciIsdGJyb3dybToiRGVsZXRlIHJvdyIsdGJjb2xiZWZvcmU6Ikluc2VydCBjb2x1bW4gYmVmb3JlIix0YmNvbGFmdGVyOiJJbnNlcnQgY29sdW1uIGFmdGVyIix0YmNvbHJtOiJEZWxldGUgY29sdW1uIix0YmNlbGxzbWVyZ2U6Ik1lcmdlIHRhYmxlIGNlbGxzIix0YmNlbGxzcGxpdDoiU3BsaXQgdGFibGUgY2VsbCIsZG9jc3RydWN0dXJlOiJUb2dnbGUgZGlzcGxheSBkb2N1bWVudCBzdHJ1Y3R1cmUiLGVsZmluZGVyOiJPcGVuIGZpbGUgbWFuYWdlciIsZnVsbHNjcmVlbjoiVG9nZ2xlIGZ1bGwgc2NyZWVuIG1vZGUiLG5ic3A6Ik5vbiBicmVha2FibGUgc3BhY2UiLHN0b3BmbG9hdDoiU3RvcCBlbGVtZW50IGZsb2F0aW5nIixhYm91dDoiQWJvdXQgdGhpcyBzb2Z0d2FyZSJ9LHBhbmVsczp7c2F2ZTpbInNhdmUiXSxjb3B5cGFzdGU6WyJjb3B5IiwiY3V0IiwicGFzdGUiLCJwYXN0ZXRleHQiLCJwYXN0ZWZvcm1hdHRleHQiLCJyZW1vdmVmb3JtYXQiLCJkb2NzdHJ1Y3R1cmUiXSx1bmRvcmVkbzpbInVuZG8iLCJyZWRvIl0sc3R5bGU6WyJib2xkIiwiaXRhbGljIiwidW5kZXJsaW5lIiwic3RyaWtldGhyb3VnaCIsInN1YnNjcmlwdCIsInN1cGVyc2NyaXB0Il0sY29sb3JzOlsiZm9yZWNvbG9yIiwiaGlsaXRlY29sb3IiXSxhbGlnbm1lbnQ6WyJqdXN0aWZ5bGVmdCIsImp1c3RpZnljZW50ZXIiLCJqdXN0aWZ5cmlnaHQiLCJqdXN0aWZ5ZnVsbCJdLGluZGVudDpbIm91dGRlbnQiLCJpbmRlbnQiXSxmb3JtYXQ6WyJmb3JtYXRibG9jayIsImZvbnRzaXplIiwiZm9udG5hbWUiXSxsaXN0czpbImluc2VydG9yZGVyZWRsaXN0IiwiaW5zZXJ0dW5vcmRlcmVkbGlzdCJdLGVsZW1lbnRzOlsiaG9yaXpvbnRhbHJ1bGUiLCJibG9ja3F1b3RlIiwiZGl2Iiwic3RvcGZsb2F0IiwiY3NzIiwibmJzcCIsInNtaWxleSIsInBhZ2VicmVhayJdLGRpcmVjdGlvbjpbImx0ciIsInJ0bCJdLGxpbmtzOlsibGluayIsInVubGluayIsImFuY2hvciJdLGltYWdlczpbImltYWdlIl0sbWVkaWE6WyJpbWFnZSIsImZsYXNoIl0sdGFibGVzOlsidGFibGUiLCJ0YWJsZXByb3BzIiwidGFibGVybSIsInRicm93YmVmb3JlIiwidGJyb3dhZnRlciIsInRicm93cm0iLCJ0YmNvbGJlZm9yZSIsInRiY29sYWZ0ZXIiLCJ0YmNvbHJtIiwidGJjZWxscHJvcHMiLCJ0YmNlbGxzbWVyZ2UiLCJ0YmNlbGxzcGxpdCJdLGVsZmluZGVyOlsiZWxmaW5kZXIiXSxmdWxsc2NyZWVuOlsiZnVsbHNjcmVlbiIsImFib3V0Il19LHRvb2xiYXJzOnt0aW55Olsic3R5bGUiXSxjb21wYWN0Olsic2F2ZSIsInVuZG9yZWRvIiwic3R5bGUiLCJhbGlnbm1lbnQiLCJsaXN0cyIsImxpbmtzIiwiZnVsbHNjcmVlbiJdLG5vcm1hbDpbInNhdmUiLCJjb3B5cGFzdGUiLCJ1bmRvcmVkbyIsInN0eWxlIiwiYWxpZ25tZW50IiwiY29sb3JzIiwiaW5kZW50IiwibGlzdHMiLCJsaW5rcyIsImVsZW1lbnRzIiwiaW1hZ2VzIiwiZnVsbHNjcmVlbiJdLGNvbXBsZXRlOlsic2F2ZSIsImNvcHlwYXN0ZSIsInVuZG9yZWRvIiwic3R5bGUiLCJhbGlnbm1lbnQiLCJjb2xvcnMiLCJmb3JtYXQiLCJpbmRlbnQiLCJsaXN0cyIsImxpbmtzIiwiZWxlbWVudHMiLCJtZWRpYSIsImZ1bGxzY3JlZW4iXSxtYXhpOlsic2F2ZSIsImNvcHlwYXN0ZSIsInVuZG9yZWRvIiwiZWxmaW5kZXIiLCJzdHlsZSIsImFsaWdubWVudCIsImRpcmVjdGlvbiIsImNvbG9ycyIsImZvcm1hdCIsImluZGVudCIsImxpc3RzIiwibGlua3MiLCJlbGVtZW50cyIsIm1lZGlhIiwidGFibGVzIiwiZnVsbHNjcmVlbiJdLGVsZG9yYWRvOlsic2F2ZSIsImNvcHlwYXN0ZSIsImVsZmluZGVyIiwidW5kb3JlZG8iLCJzdHlsZSIsImFsaWdubWVudCIsImNvbG9ycyIsImZvcm1hdCIsImluZGVudCIsImxpc3RzIiwibGlua3MiLCJlbGVtZW50cyIsIm1lZGlhIiwidGFibGVzIiwiZnVsbHNjcmVlbiJdfSxwYW5lbE5hbWVzOntzYXZlOiJTYXZlIixjb3B5cGFzdGU6IkNvcHkvUGFzZSIsdW5kb3JlZG86IlVuZG8vUmVkbyIsc3R5bGU6IlRleHQgc3R5bGVzIixjb2xvcnM6IkNvbG9ycyIsYWxpZ25tZW50OiJBbGlnbm1lbnQiLGluZGVudDoiSW5kZW50L091dGRlbnQiLGZvcm1hdDoiVGV4dCBmb3JtYXQiLGxpc3RzOiJMaXN0cyIsZWxlbWVudHM6Ik1pc2MgZWxlbWVudHMiLGRpcmVjdGlvbjoiU2NyaXB0IGRpcmVjdGlvbiIsbGlua3M6IkxpbmtzIixpbWFnZXM6IkltYWdlcyIsbWVkaWE6Ik1lZGlhIix0YWJsZXM6IlRhYmxlcyIsZWxmaW5kZXI6IkZpbGUgbWFuYWdlciAoZWxGaW5kZXIpIn19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnNlbGVjdGlvbj1mdW5jdGlvbihnKXt0aGlzLnJ0ZT1nO3ZhciBjPXRoaXM7dGhpcy53M2NSYW5nZT1udWxsO3ZhciBvLGIsaixrO2EodGhpcy5ydGUuZG9jKS5rZXl1cChmdW5jdGlvbihwKXtpZihwLmN0cmxLZXl8fHAubWV0YUtleXx8KHAua2V5Q29kZT49OCYmcC5rZXlDb2RlPD0xMyl8fChwLmtleUNvZGU+PTMyJiZwLmtleUNvZGU8PTQwKXx8cC5rZXlDb2RlPT00Nnx8KHAua2V5Q29kZT49OTYmJnAua2V5Q29kZTw9MTExKSl7Yy5jbGVhbkNhY2hlKCl9fSkubW91c2Vkb3duKGZ1bmN0aW9uKHApe2lmKHAudGFyZ2V0Lm5vZGVOYW1lPT0iSFRNTCIpe289Yy5ydGUuZG9jLmJvZHl9ZWxzZXtvPXAudGFyZ2V0fWI9aj1udWxsfSkubW91c2V1cChmdW5jdGlvbihwKXtpZihwLnRhcmdldC5ub2RlTmFtZT09IkhUTUwiKXtiPWMucnRlLmRvYy5ib2R5fWVsc2V7Yj1wLnRhcmdldH1iPXAudGFyZ2V0O2o9bnVsbH0pLmNsaWNrKCk7ZnVuY3Rpb24gaCgpe3JldHVybiBjLnJ0ZS53aW5kb3cuZ2V0U2VsZWN0aW9uP2MucnRlLndpbmRvdy5nZXRTZWxlY3Rpb24oKTpjLnJ0ZS53aW5kb3cuZG9jdW1lbnQuc2VsZWN0aW9ufWZ1bmN0aW9uIGYodCxyLHEpe3doaWxlKHQubm9kZU5hbWUhPSJCT0RZIiYmdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUubm9kZU5hbWUhPSJCT0RZIiYmKHI/dCE9PXImJnQucGFyZW50Tm9kZSE9cjoxKSYmKChxPT0ibGVmdCImJmMucnRlLmRvbS5pc0ZpcnN0Tm90RW1wdHkodCkpfHwocT09InJpZ2h0IiYmYy5ydGUuZG9tLmlzTGFzdE5vdEVtcHR5KHQpKXx8KGMucnRlLmRvbS5pc0ZpcnN0Tm90RW1wdHkodCkmJmMucnRlLmRvbS5pc0xhc3ROb3RFbXB0eSh0KSkpKXt0PXQucGFyZW50Tm9kZX1yZXR1cm4gdH10aGlzLmNvbGxhcHNlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhbmdlQXQoKS5pc0NvbGxhcHNlZCgpfTt0aGlzLmNvbGxhcHNlPWZ1bmN0aW9uKHApe3ZhciBxPWgoKSx0PXRoaXMuZ2V0UmFuZ2VBdCgpO3QuY29sbGFwc2UocD90cnVlOmZhbHNlKTtpZighYS5icm93c2VyLm1zaWUpe3EucmVtb3ZlQWxsUmFuZ2VzKCk7cS5hZGRSYW5nZSh0KX1yZXR1cm4gdGhpc307dGhpcy5nZXRSYW5nZUF0PWZ1bmN0aW9uKHQpe2lmKHRoaXMucnRlLmJyb3dzZXIubXNpZSl7aWYoIXRoaXMudzNjUmFuZ2Upe3RoaXMudzNjUmFuZ2U9bmV3IHRoaXMucnRlLnczY1JhbmdlKHRoaXMucnRlKX10JiZ0aGlzLnczY1JhbmdlLnVwZGF0ZSgpO3JldHVybiB0aGlzLnczY1JhbmdlfXZhciBwPWgoKTt2YXIgcT1wLnJhbmdlQ291bnQ+MD9wLmdldFJhbmdlQXQoMCk6dGhpcy5ydGUuZG9jLmNyZWF0ZVJhbmdlKCk7cS5nZXRTdGFydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlPT0xP3RoaXMuc3RhcnRDb250YWluZXIuY2hpbGROb2Rlc1tNYXRoLm1pbih0aGlzLnN0YXJ0T2Zmc2V0LHRoaXMuc3RhcnRDb250YWluZXIuY2hpbGROb2Rlcy5sZW5ndGgtMSldOnRoaXMuc3RhcnRDb250YWluZXJ9O3EuZ2V0RW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kQ29udGFpbmVyLm5vZGVUeXBlPT0xP3RoaXMuZW5kQ29udGFpbmVyLmNoaWxkTm9kZXNbTWF0aC5taW4odGhpcy5zdGFydE9mZnNldD09dGhpcy5lbmRPZmZzZXQ/dGhpcy5lbmRPZmZzZXQ6dGhpcy5lbmRPZmZzZXQtMSx0aGlzLmVuZENvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aC0xKV06dGhpcy5lbmRDb250YWluZXJ9O3EuaXNDb2xsYXBzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb2xsYXBzZWR9O3JldHVybiBxfTt0aGlzLnNhdmVJRVJhbmdlPWZ1bmN0aW9uKCl7aWYoYS5icm93c2VyLm1zaWUpe2s9dGhpcy5nZXRSYW5nZUF0KCkuZ2V0Qm9va21hcmsoKX19O3RoaXMucmVzdG9yZUlFUmFuZ2U9ZnVuY3Rpb24oKXthLmJyb3dzZXIubXNpZSYmayYmdGhpcy5nZXRSYW5nZUF0KCkubW92ZVRvQm9va21hcmsoayl9O3RoaXMuY2xvbmVDb250ZW50cz1mdW5jdGlvbigpe3ZhciB2PXRoaXMucnRlLmRvbS5jcmVhdGUoImRpdiIpLHEsdSxwO2lmKGEuYnJvd3Nlci5tc2llKXt0cnl7cT10aGlzLnJ0ZS53aW5kb3cuZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCl9Y2F0Y2godCl7cT10aGlzLnJ0ZS5kb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKX1hKHYpLmh0bWwocS5odG1sVGV4dCl9ZWxzZXt1PXRoaXMuZ2V0UmFuZ2VBdCgpLmNsb25lQ29udGVudHMoKTtmb3IocD0wO3A8dS5jaGlsZE5vZGVzLmxlbmd0aDtwKyspe3YuYXBwZW5kQ2hpbGQodS5jaGlsZE5vZGVzW3BdLmNsb25lTm9kZSh0cnVlKSl9fXJldHVybiB2fTt0aGlzLnNlbGVjdD1mdW5jdGlvbih0LHcpe3c9d3x8dDtpZih0aGlzLnJ0ZS5icm93c2VyLm1zaWUpe3ZhciB1PXRoaXMucnRlLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpLHE9dS5kdXBsaWNhdGUoKSxwPXUuZHVwbGljYXRlKCk7cS5tb3ZlVG9FbGVtZW50VGV4dCh0KTtwLm1vdmVUb0VsZW1lbnRUZXh0KHcpO3Uuc2V0RW5kUG9pbnQoIlN0YXJ0VG9TdGFydCIscSk7dS5zZXRFbmRQb2ludCgiRW5kVG9FbmQiLHApO3Uuc2VsZWN0KCl9ZWxzZXt2YXIgdj1oKCksdT10aGlzLmdldFJhbmdlQXQoKTt1LnNldFN0YXJ0QmVmb3JlKHQpO3Uuc2V0RW5kQWZ0ZXIodyk7di5yZW1vdmVBbGxSYW5nZXMoKTt2LmFkZFJhbmdlKHUpfXJldHVybiB0aGlzLmNsZWFuQ2FjaGUoKX07dGhpcy5zZWxlY3RDb250ZW50cz1mdW5jdGlvbih1KXt2YXIgcT10aGlzLmdldFJhbmdlQXQoKTtpZih1JiZ1Lm5vZGVUeXBlPT0xKXtpZih0aGlzLnJ0ZS5icm93c2VyLm1zaWUpe3EucmFuZ2UoKTtxLnIubW92ZVRvRWxlbWVudFRleHQodS5wYXJlbnROb2RlKTtxLnIuc2VsZWN0KCl9ZWxzZXt0cnl7cS5zZWxlY3ROb2RlQ29udGVudHModSl9Y2F0Y2godCl7cmV0dXJuIHRoaXMucnRlLmxvZygidW5hYmxlIHNlbGVjdCBub2RlIGNvbnRlbnRzICIrdSl9dmFyIHA9aCgpO3AucmVtb3ZlQWxsUmFuZ2VzKCk7cC5hZGRSYW5nZShxKX19cmV0dXJuIHRoaXN9O3RoaXMuZGVsZXRlQ29udGVudHM9ZnVuY3Rpb24oKXtpZighYS5icm93c2VyLm1zaWUpe3RoaXMuZ2V0UmFuZ2VBdCgpLmRlbGV0ZUNvbnRlbnRzKCl9cmV0dXJuIHRoaXN9O3RoaXMuaW5zZXJ0Tm9kZT1mdW5jdGlvbih2LHUpe2lmKHUmJiF0aGlzLmNvbGxhcHNlZCgpKXt0aGlzLmNvbGxhcHNlKCl9aWYodGhpcy5ydGUuYnJvd3Nlci5tc2llKXt2YXIgcD12Lm5vZGVUeXBlPT0zP3Yubm9kZVZhbHVlOmEodGhpcy5ydGUuZG9tLmNyZWF0ZSgic3BhbiIpKS5hcHBlbmQoYSh2KSkuaHRtbCgpO3ZhciB0PXRoaXMuZ2V0UmFuZ2VBdCgpO3QuaW5zZXJ0Tm9kZShwKX1lbHNle3ZhciB0PXRoaXMuZ2V0UmFuZ2VBdCgpO3QuaW5zZXJ0Tm9kZSh2KTt0LnNldFN0YXJ0QWZ0ZXIodik7dC5zZXRFbmRBZnRlcih2KTt2YXIgcT1oKCk7cS5yZW1vdmVBbGxSYW5nZXMoKTtxLmFkZFJhbmdlKHQpfXJldHVybiB0aGlzLmNsZWFuQ2FjaGUoKX07dGhpcy5pbnNlcnRIdG1sPWZ1bmN0aW9uKHAscSl7aWYocSYmIXRoaXMuY29sbGFwc2VkKCkpe3RoaXMuY29sbGFwc2UoKX1pZih0aGlzLnJ0ZS5icm93c2VyLm1zaWUpe3RoaXMuZ2V0UmFuZ2VBdCgpLnJhbmdlKCkucGFzdGVIVE1MKHApfWVsc2V7dmFyIHI9YSh0aGlzLnJ0ZS5kb20uY3JlYXRlKCJzcGFuIikpLmh0bWwocHx8IiIpLmdldCgwKTt0aGlzLmluc2VydE5vZGUocik7YShyKS5yZXBsYWNlV2l0aChhKHIpLmh0bWwoKSl9cmV0dXJuIHRoaXMuY2xlYW5DYWNoZSgpfTt0aGlzLmluc2VydFRleHQ9ZnVuY3Rpb24ocSxwKXt2YXIgcj10aGlzLnJ0ZS5kb2MuY3JlYXRlVGV4dE5vZGUocSk7cmV0dXJuIHRoaXMuaW5zZXJ0SHRtbChyLm5vZGVWYWx1ZSl9O3RoaXMuZ2V0Qm9va21hcms9ZnVuY3Rpb24oKXt0aGlzLnJ0ZS53aW5kb3cuZm9jdXMoKTt2YXIgcCx2LHQseix3LEE9dGhpcy5ydGUuZG9tLmNyZWF0ZUJvb2ttYXJrKCkseD10aGlzLnJ0ZS5kb20uY3JlYXRlQm9va21hcmsoKTtpZihhLmJyb3dzZXIubXNpZSl7dHJ5e3A9dGhpcy5ydGUud2luZG93LmRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpfWNhdGNoKHgpe3A9dGhpcy5ydGUuZG9jLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCl9aWYocC5pdGVtKXt2YXIgdT1wLml0ZW0oMCk7cD10aGlzLnJ0ZS5kb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTtwLm1vdmVUb0VsZW1lbnRUZXh0KHUpfXY9cC5kdXBsaWNhdGUoKTt0PXAuZHVwbGljYXRlKCk7ej10aGlzLnJ0ZS5kb20uY3JlYXRlKCJzcGFuIik7dz10aGlzLnJ0ZS5kb20uY3JlYXRlKCJzcGFuIik7ei5hcHBlbmRDaGlsZChBKTt3LmFwcGVuZENoaWxkKHgpO3YuY29sbGFwc2UodHJ1ZSk7di5wYXN0ZUhUTUwoei5pbm5lckhUTUwpO3QuY29sbGFwc2UoZmFsc2UpO3QucGFzdGVIVE1MKHcuaW5uZXJIVE1MKX1lbHNle3ZhciBxPWgoKTt2YXIgcD1xLnJhbmdlQ291bnQ+MD9xLmdldFJhbmdlQXQoMCk6dGhpcy5ydGUuZG9jLmNyZWF0ZVJhbmdlKCk7dj1wLmNsb25lUmFuZ2UoKTt0PXAuY2xvbmVSYW5nZSgpO3QuY29sbGFwc2UoZmFsc2UpO3QuaW5zZXJ0Tm9kZSh4KTt2LmNvbGxhcHNlKHRydWUpO3YuaW5zZXJ0Tm9kZShBKTt0aGlzLnNlbGVjdChBLHgpfXJldHVybltBLmlkLHguaWRdfTt0aGlzLm1vdmVUb0Jvb2ttYXJrPWZ1bmN0aW9uKHApe3RoaXMucnRlLndpbmRvdy5mb2N1cygpO2lmKHAmJnAubGVuZ3RoPT0yKXt2YXIgcT10aGlzLnJ0ZS5kb2MuZ2V0RWxlbWVudEJ5SWQocFswXSksdj10aGlzLnJ0ZS5kb2MuZ2V0RWxlbWVudEJ5SWQocFsxXSksdSx0O2lmKHEmJnYpe3RoaXMuc2VsZWN0KHEsdik7aWYodGhpcy5ydGUuZG9tLm5leHQocSk9PXYpe3RoaXMuY29sbGFwc2UodHJ1ZSl9aWYoIWEuYnJvd3Nlci5tc2llKXt1PWgoKTt0PXUucmFuZ2VDb3VudD4wP3UuZ2V0UmFuZ2VBdCgwKTp0aGlzLnJ0ZS5kb2MuY3JlYXRlUmFuZ2UoKTt1LnJlbW92ZUFsbFJhbmdlcygpO3UuYWRkUmFuZ2UodCl9cS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHEpO3YucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh2KX19cmV0dXJuIHRoaXN9O3RoaXMucmVtb3ZlQm9va21hcms9ZnVuY3Rpb24ocCl7dGhpcy5ydGUud2luZG93LmZvY3VzKCk7aWYocC5sZW5ndGg9PTIpe3ZhciBxPXRoaXMucnRlLmRvYy5nZXRFbGVtZW50QnlJZChwWzBdKSxyPXRoaXMucnRlLmRvYy5nZXRFbGVtZW50QnlJZChwWzFdKTtpZihxJiZyKXtxLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocSk7ci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpfX19O3RoaXMuY2xlYW5DYWNoZT1mdW5jdGlvbigpe289Yj1qPW51bGw7cmV0dXJuIHRoaXN9O3RoaXMuZ2V0U3RhcnQ9ZnVuY3Rpb24oKXtpZighbyl7dmFyIHA9dGhpcy5nZXRSYW5nZUF0KCk7bz1wLmdldFN0YXJ0KCl9cmV0dXJuIG99O3RoaXMuZ2V0RW5kPWZ1bmN0aW9uKCl7aWYoIWIpe3ZhciBwPXRoaXMuZ2V0UmFuZ2VBdCgpO2I9cC5nZXRFbmQoKX1yZXR1cm4gYn07dGhpcy5nZXROb2RlPWZ1bmN0aW9uKCl7aWYoIWope2o9dGhpcy5ydGUuZG9tLmZpbmRDb21tb25BbmNlc3Rvcih0aGlzLmdldFN0YXJ0KCksdGhpcy5nZXRFbmQoKSl9cmV0dXJuIGp9O3RoaXMuc2VsZWN0ZWQ9ZnVuY3Rpb24ocil7dmFyIHA9e2NvbGxhcHNlZDpmYWxzZSxibG9ja3M6ZmFsc2UsZmlsdGVyOmZhbHNlLHdyYXA6InRleHQiLHRhZzoic3BhbiJ9O3A9YS5leHRlbmQoe30scCxyKTtpZihwLmJsb2Nrcyl7dmFyIHY9dGhpcy5nZXROb2RlKCksdT1udWxsO2lmKHU9dGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh2LCJzZWxlY3Rpb25CbG9jayIpKXtyZXR1cm5bdV19fXZhciB0PXRoaXMuc2VsZWN0ZWRSYXcocC5jb2xsYXBzZWQscC5ibG9ja3MpO3ZhciBBPVtdO3ZhciB3PVtdO3ZhciBCPW51bGw7ZnVuY3Rpb24gcSgpe2Z1bmN0aW9uIEQoKXtmb3IodmFyIEY9MDtGPHcubGVuZ3RoO0YrKyl7aWYod1tGXS5ub2RlVHlwZT09MSYmKGMucnRlLmRvbS5zZWxmT3JQYXJlbnQod1tGXSwvXlAkLyl8fGEod1tGXSkuZmluZCgicCIpLmxlbmd0aD4wKSl7cmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1ZX1pZih3Lmxlbmd0aD4wKXt2YXIgQz1wLnRhZz09InAiJiYhRCgpPyJkaXYiOnAudGFnO3ZhciBFPWMucnRlLmRvbS53cmFwKHcsQyk7QVtCXT1FO0I9bnVsbDt3PVtdfX1mdW5jdGlvbiB6KEUpe2lmKEUubm9kZVR5cGU9PTEpe2lmKC9eKFRIRUFEfFRGT09UfFRCT0RZfENPTHxDT0xHUk9VUHxUUikkLy50ZXN0KEUubm9kZU5hbWUpKXthKEUpLmZpbmQoInRkLHRoIikuZWFjaChmdW5jdGlvbigpe3ZhciBGPXAudGFnPT0icCImJmEodGhpcykuZmluZCgicCIpLmxlbmd0aD4wPyJkaXYiOnAudGFnO3ZhciBHPWMucnRlLmRvbS53cmFwQ29udGVudHModGhpcyxGKTtyZXR1cm4gQS5wdXNoKEcpfSl9ZWxzZXtpZigvXihDQVBUSU9OfFREfFRIfExJfERUfEREKSQvLnRlc3QoRS5ub2RlTmFtZSkpe3ZhciBDPXAudGFnPT0icCImJmEoRSkuZmluZCgicCIpLmxlbmd0aD4wPyJkaXYiOnAudGFnO3ZhciBFPWMucnRlLmRvbS53cmFwQ29udGVudHMoRSxDKTtyZXR1cm4gQS5wdXNoKEUpfX19dmFyIEQ9dy5sZW5ndGg+MD93W3cubGVuZ3RoLTFdOm51bGw7aWYoRCYmRCE9Yy5ydGUuZG9tLnByZXYoRSkpe3EoKX13LnB1c2goRSk7aWYoQj09PW51bGwpe0I9QS5sZW5ndGg7QS5wdXNoKCJkdW1teSIpfX1pZih0Lm5vZGVzLmxlbmd0aD4wKXtmb3IodmFyIHg9MDt4PHQubm9kZXMubGVuZ3RoO3grKyl7dmFyIHY9dC5ub2Rlc1t4XTtpZih2Lm5vZGVUeXBlPT0zJiYoeD09MHx8eD09dC5ub2Rlcy5sZW5ndGgtMSkmJmEudHJpbSh2Lm5vZGVWYWx1ZSkubGVuZ3RoPjApe2lmKHg9PTAmJnQuc28+MCl7dj12LnNwbGl0VGV4dCh0LnNvKX1pZih4PT10Lm5vZGVzLmxlbmd0aC0xJiZ0LmVvPjApe3Yuc3BsaXRUZXh0KHg9PTAmJnQuc28+MD90LmVvLXQuc286dC5lbyl9fXN3aXRjaChwLndyYXApe2Nhc2UidGV4dCI6aWYoKHYubm9kZVR5cGU9PTEmJnYubm9kZU5hbWU9PSJCUiIpfHwodi5ub2RlVHlwZT09MyYmYS50cmltKHYubm9kZVZhbHVlKS5sZW5ndGg+MCkpe3oodil9ZWxzZXtpZih2Lm5vZGVUeXBlPT0xKXtBLnB1c2godil9fWJyZWFrO2Nhc2UiaW5saW5lIjppZih0aGlzLnJ0ZS5kb20uaXNJbmxpbmUodikpe3oodil9ZWxzZXtpZih2Lm5vZGVUeXBlPT0xKXtBLnB1c2godil9fWJyZWFrO2Nhc2UiYWxsIjppZih2Lm5vZGVUeXBlPT0xfHwhdGhpcy5ydGUuZG9tLmlzRW1wdHkodikpe3oodil9YnJlYWs7ZGVmYXVsdDppZih2Lm5vZGVUeXBlPT0xfHwhdGhpcy5ydGUuZG9tLmlzRW1wdHkodikpe0EucHVzaCh2KX19fXEoKX1pZihBLmxlbmd0aCl7dGhpcy5ydGUud2luZG93LmZvY3VzKCk7dGhpcy5zZWxlY3QoQVswXSxBW0EubGVuZ3RoLTFdKX1yZXR1cm4gcC5maWx0ZXI/dGhpcy5ydGUuZG9tLmZpbHRlcihBLHAuZmlsdGVyKTpBfTt0aGlzLmR1bXA9ZnVuY3Rpb24ocCx0LHcsdixxKXt2YXIgdT10aGlzLmdldFJhbmdlQXQoKTt0aGlzLnJ0ZS5sb2coImNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIik7dGhpcy5ydGUubG9nKHB8fHUuY29tbW9uQW5jZXN0b3JDb250YWluZXIpO3RoaXMucnRlLmxvZygic3RhcnRDb250YWluZXIiKTt0aGlzLnJ0ZS5sb2codHx8dS5zdGFydENvbnRhaW5lcik7dGhpcy5ydGUubG9nKCJzdGFydE9mZnNldDogIisodj49MD92OnUuc3RhcnRPZmZzZXQpKTt0aGlzLnJ0ZS5sb2coImVuZENvbnRhaW5lciIpO3RoaXMucnRlLmxvZyh3fHx1LmVuZENvbnRhaW5lcik7dGhpcy5ydGUubG9nKCJlbmRPZmZzZXQ6ICIrKHE+PTA/cTp1LmVuZE9mZnNldCkpfTt0aGlzLnNlbGVjdGVkUmF3PWZ1bmN0aW9uKHoscCl7dmFyIEY9e3NvOm51bGwsZW86bnVsbCxub2RlczpbXX07dmFyIHE9dGhpcy5nZXRSYW5nZUF0KHRydWUpO3ZhciB3PXEuY29tbW9uQW5jZXN0b3JDb250YWluZXI7dmFyIEgsRTt2YXIgRD1mYWxzZTt2YXIgQj1mYWxzZTtmdW5jdGlvbiBDKEoscixJKXtpZihKLm5vZGVUeXBlPT0zKXtJPUk+PTA/STpKLm5vZGVWYWx1ZS5sZW5ndGg7cmV0dXJuKHI9PTAmJkk9PUoubm9kZVZhbHVlLmxlbmd0aCl8fGEudHJpbShKLm5vZGVWYWx1ZSkubGVuZ3RoPT1hLnRyaW0oSi5ub2RlVmFsdWUuc3Vic3RyaW5nKHIsSSkpLmxlbmd0aH1yZXR1cm4gdHJ1ZX1mdW5jdGlvbiB4KEoscixJKXtpZihKLm5vZGVUeXBlPT0xKXtyZXR1cm4gYy5ydGUuZG9tLmlzRW1wdHkoSil9ZWxzZXtpZihKLm5vZGVUeXBlPT0zKXtyZXR1cm4gYS50cmltKEoubm9kZVZhbHVlLnN1YnN0cmluZyhyfHwwLEk+PTA/STpKLm5vZGVWYWx1ZS5sZW5ndGgpKS5sZW5ndGg9PTB9fXJldHVybiB0cnVlfWlmKHEuc3RhcnRDb250YWluZXIubm9kZVR5cGU9PTEpe2lmKHEuc3RhcnRPZmZzZXQ8cS5zdGFydENvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aCl7SD1xLnN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXNbcS5zdGFydE9mZnNldF07Ri5zbz1ILm5vZGVUeXBlPT0xP251bGw6MH1lbHNle0g9cS5zdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3Euc3RhcnRPZmZzZXQtMV07Ri5zbz1ILm5vZGVUeXBlPT0xP251bGw6SC5ub2RlVmFsdWUubGVuZ3RofX1lbHNle0g9cS5zdGFydENvbnRhaW5lcjtGLnNvPXEuc3RhcnRPZmZzZXR9aWYocS5jb2xsYXBzZWQpe2lmKHope2lmKHApe0g9ZihIKTtpZighdGhpcy5ydGUuZG9tLmlzRW1wdHkoSCl8fChIPXRoaXMucnRlLmRvbS5uZXh0KEgpKSl7Ri5ub2Rlcz1bSF19aWYodGhpcy5ydGUuZG9tLmlzSW5saW5lKEgpKXtGLm5vZGVzPXRoaXMucnRlLmRvbS50b0xpbmVTdGFydChIKS5jb25jYXQoRi5ub2Rlcyx0aGlzLnJ0ZS5kb20udG9MaW5lRW5kKEgpKX1pZihGLm5vZGVzLmxlbmd0aD4wKXtGLnNvPUYubm9kZXNbMF0ubm9kZVR5cGU9PTE/bnVsbDowO0YuZW89Ri5ub2Rlc1tGLm5vZGVzLmxlbmd0aC0xXS5ub2RlVHlwZT09MT9udWxsOkYubm9kZXNbRi5ub2Rlcy5sZW5ndGgtMV0ubm9kZVZhbHVlLmxlbmd0aH19ZWxzZXtpZighdGhpcy5ydGUuZG9tLmlzRW1wdHkoSCkpe0Yubm9kZXM9W0hdfX19cmV0dXJuIEZ9aWYocS5lbmRDb250YWluZXIubm9kZVR5cGU9PTEpe0U9cS5lbmRDb250YWluZXIuY2hpbGROb2Rlc1txLmVuZE9mZnNldC0xXTtGLmVvPUUubm9kZVR5cGU9PTE/bnVsbDpFLm5vZGVWYWx1ZS5sZW5ndGh9ZWxzZXtFPXEuZW5kQ29udGFpbmVyO0YuZW89cS5lbmRPZmZzZXR9aWYoSC5ub2RlVHlwZT09MXx8cHx8QyhILEYuc28sSC5ub2RlVmFsdWUubGVuZ3RoKSl7SD1mKEgsdywibGVmdCIpO0Q9dHJ1ZTtGLnNvPUgubm9kZVR5cGU9PTE/bnVsbDowfWlmKEUubm9kZVR5cGU9PTF8fHB8fEMoRSwwLEYuZW8pKXtFPWYoRSx3LCJyaWdodCIpO0I9dHJ1ZTtGLmVvPUUubm9kZVR5cGU9PTE/bnVsbDpFLm5vZGVWYWx1ZS5sZW5ndGh9aWYocCl7aWYoSC5ub2RlVHlwZSE9MSYmSC5wYXJlbnROb2RlIT13JiZILnBhcmVudE5vZGUubm9kZU5hbWUhPSJCT0RZIil7SD1ILnBhcmVudE5vZGU7Ri5zbz1udWxsfWlmKEUubm9kZVR5cGUhPTEmJkUucGFyZW50Tm9kZSE9dyYmRS5wYXJlbnROb2RlLm5vZGVOYW1lIT0iQk9EWSIpe0U9RS5wYXJlbnROb2RlO0YuZW89bnVsbH19aWYoSC5wYXJlbnROb2RlPT1FLnBhcmVudE5vZGUmJkgucGFyZW50Tm9kZS5ub2RlTmFtZSE9IkJPRFkiJiYoRCYmdGhpcy5ydGUuZG9tLmlzRmlyc3ROb3RFbXB0eShIKSkmJihCJiZ0aGlzLnJ0ZS5kb20uaXNMYXN0Tm90RW1wdHkoRSkpKXtIPUU9SC5wYXJlbnROb2RlO0Yuc289SC5ub2RlVHlwZT09MT9udWxsOjA7Ri5lbz1FLm5vZGVUeXBlPT0xP251bGw6RS5ub2RlVmFsdWUubGVuZ3RofWlmKEg9PUUpe2lmKCF0aGlzLnJ0ZS5kb20uaXNFbXB0eShIKSl7Ri5ub2Rlcy5wdXNoKEgpfXJldHVybiBGfXZhciB0PUg7d2hpbGUodC5ub2RlTmFtZSE9IkJPRFkiJiZ0LnBhcmVudE5vZGUhPT13JiZ0LnBhcmVudE5vZGUubm9kZU5hbWUhPSJCT0RZIil7dD10LnBhcmVudE5vZGV9dmFyIEc9RTt3aGlsZShHLm5vZGVOYW1lIT0iQk9EWSImJkcucGFyZW50Tm9kZSE9PXcmJkcucGFyZW50Tm9kZS5ub2RlTmFtZSE9IkJPRFkiKXtHPUcucGFyZW50Tm9kZX1pZigheChILEYuc28sSC5ub2RlVHlwZT09Mz9ILm5vZGVWYWx1ZS5sZW5ndGg6bnVsbCkpe0Yubm9kZXMucHVzaChIKX12YXIgdj1IO3doaWxlKHYhPT10KXt2YXIgdT12O3doaWxlKCh1PXRoaXMucnRlLmRvbS5uZXh0KHUpKSl7Ri5ub2Rlcy5wdXNoKHUpfXY9di5wYXJlbnROb2RlfXY9dDt3aGlsZSgodj10aGlzLnJ0ZS5kb20ubmV4dCh2KSkmJnYhPUcpe0Yubm9kZXMucHVzaCh2KX12YXIgQT1bXTt2PUU7d2hpbGUodiE9PUcpe3ZhciB1PXY7d2hpbGUoKHU9dGhpcy5ydGUuZG9tLnByZXYodSkpKXtBLnB1c2godSl9dj12LnBhcmVudE5vZGV9aWYoQS5sZW5ndGgpe0Yubm9kZXM9Ri5ub2Rlcy5jb25jYXQoQS5yZXZlcnNlKCkpfWlmKCF4KEUsMCxFLm5vZGVUeXBlPT0zP0YuZW86bnVsbCkpe0Yubm9kZXMucHVzaChFKX1pZihwKXtpZih0aGlzLnJ0ZS5kb20uaXNJbmxpbmUoSCkpe0Yubm9kZXM9dGhpcy5ydGUuZG9tLnRvTGluZVN0YXJ0KEgpLmNvbmNhdChGLm5vZGVzKTtGLnNvPUYubm9kZXNbMF0ubm9kZVR5cGU9PTE/bnVsbDowfWlmKHRoaXMucnRlLmRvbS5pc0lubGluZShFKSl7Ri5ub2Rlcz1GLm5vZGVzLmNvbmNhdCh0aGlzLnJ0ZS5kb20udG9MaW5lRW5kKEUpKTtGLmVvPUYubm9kZXNbRi5ub2Rlcy5sZW5ndGgtMV0ubm9kZVR5cGU9PTE/bnVsbDpGLm5vZGVzW0Yubm9kZXMubGVuZ3RoLTFdLm5vZGVWYWx1ZS5sZW5ndGh9fXJldHVybiBGfX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWk9ZnVuY3Rpb24oZil7dGhpcy5ydGU9Zjt0aGlzLl9idXR0b25zPVtdO3ZhciB2PXRoaXMsbz10aGlzLnJ0ZS5vcHRpb25zLnRvb2xiYXJzW2Yub3B0aW9ucy50b29sYmFyJiZmLm9wdGlvbnMudG9vbGJhcnNbZi5vcHRpb25zLnRvb2xiYXJdP2Yub3B0aW9ucy50b29sYmFyOiJub3JtYWwiXSxyPW8ubGVuZ3RoLGcsayxqLGgsdCx1LHE7Zm9yKHEgaW4gdGhpcy5idXR0b25zKXtpZih0aGlzLmJ1dHRvbnMuaGFzT3duUHJvcGVydHkocSkmJnEhPSJidXR0b24iKXt0aGlzLmJ1dHRvbnNbcV0ucHJvdG90eXBlPXRoaXMuYnV0dG9ucy5idXR0b24ucHJvdG90eXBlfX13aGlsZShyLS0pe2s9b1tyXTtnPWEoJzx1bCBjbGFzcz0icGFuZWwtJytrKyhyPT0wPyIgZmlyc3QiOiIiKSsnIiAvPicpLnByZXBlbmRUbyh0aGlzLnJ0ZS50b29sYmFyKTtnLmJpbmQoIm1vdXNlZG93biIsZnVuY3Rpb24oYil7Yi5wcmV2ZW50RGVmYXVsdCgpfSk7aj10aGlzLnJ0ZS5vcHRpb25zLnBhbmVsc1trXS5sZW5ndGg7d2hpbGUoai0tKXtoPXRoaXMucnRlLm9wdGlvbnMucGFuZWxzW2tdW2pdO3Q9dGhpcy5idXR0b25zW2hdfHx0aGlzLmJ1dHRvbnMuYnV0dG9uO3RoaXMuX2J1dHRvbnMucHVzaCgodT1uZXcgdCh0aGlzLnJ0ZSxoKSkpO2cucHJlcGVuZCh1LmRvbUVsZW0pfX10aGlzLnVwZGF0ZSgpO3RoaXMuZGlzYWJsZT1mdW5jdGlvbigpe2EuZWFjaCh2Ll9idXR0b25zLGZ1bmN0aW9uKCl7IXRoaXMuYWN0aXZlJiZ0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImRpc2FibGVkIil9KX19O2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGgpe2gmJnRoaXMucnRlLnNlbGVjdGlvbi5jbGVhbkNhY2hlKCk7dmFyIGY9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSxjPXRoaXMucnRlLmRvbS5wYXJlbnRzKGYsIioiKSxqPXRoaXMucnRlLnJ0bCxxPWo/IiAmbGFxdW87ICI6IiAmcmFxdW87ICIsbz0iIixiLGc7ZnVuY3Rpb24gayhyKXt2YXIgcD1yLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cj1hKHIpO2lmKHA9PSJpbWciKXtpZihyLmhhc0NsYXNzKCJlbHJ0ZS1tZWRpYSIpKXtwPSJtZWRpYSJ9ZWxzZXtpZihyLmhhc0NsYXNzKCJlbHJ0ZS1nb29nbGUtbWFwcyIpKXtwPSJnb29nbGUgbWFwIn1lbHNle2lmKHIuaGFzQ2xhc3MoImVscnRlLXlhbmRleC1tYXBzIikpe3A9InlhbmRleCBtYXAifWVsc2V7aWYoci5oYXNDbGFzcygiZWxydGUtcGFnZWJyZWFrIikpe3A9InBhZ2VicmVhayJ9fX19fXJldHVybiBwfWlmKGYmJmYubm9kZVR5cGU9PTEmJmYubm9kZU5hbWUhPSJCT0RZIil7Yy51bnNoaWZ0KGYpfWlmKCFqKXtjPWMucmV2ZXJzZSgpfWZvcihnPTA7ZzxjLmxlbmd0aDtnKyspe28rPShnPjA/cToiIikrayhjW2ddKX10aGlzLnJ0ZS5zdGF0dXNiYXIuaHRtbChvKTthLmVhY2godGhpcy5fYnV0dG9ucyxmdW5jdGlvbigpe3RoaXMudXBkYXRlKCl9KTt0aGlzLnJ0ZS53aW5kb3cuZm9jdXMoKX07ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zPXtidXR0b246ZnVuY3Rpb24oZixjKXt2YXIgYj10aGlzO3RoaXMucnRlPWY7dGhpcy5hY3RpdmU9ZmFsc2U7dGhpcy5uYW1lPWM7dGhpcy52YWw9bnVsbDt0aGlzLmRvbUVsZW09YSgnPGxpIHN0eWxlPSItbW96LXVzZXItc2VsZWN0Oi1tb3otbm9uZSIgY2xhc3M9IicrYysnIHJvdW5kZWQtMyIgbmFtZT0iJytjKyciIHRpdGxlPSInK3RoaXMucnRlLmkxOG4odGhpcy5ydGUub3B0aW9ucy5idXR0b25zW2NdfHxjKSsnIiB1bnNlbGVjdGFibGU9Im9uIiAvPicpLmhvdmVyKGZ1bmN0aW9uKCl7YSh0aGlzKS5hZGRDbGFzcygiaG92ZXIiKX0sZnVuY3Rpb24oKXthKHRoaXMpLnJlbW92ZUNsYXNzKCJob3ZlciIpfSkuY2xpY2soZnVuY3Rpb24oZyl7Zy5zdG9wUHJvcGFnYXRpb24oKTtnLnByZXZlbnREZWZhdWx0KCk7aWYoIWEodGhpcykuaGFzQ2xhc3MoImRpc2FibGVkIikpe2IuY29tbWFuZCgpfWIucnRlLndpbmRvdy5mb2N1cygpfSl9fTtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuYnV0dG9uLnByb3RvdHlwZS5jb21tYW5kPWZ1bmN0aW9uKCl7dGhpcy5ydGUuaGlzdG9yeS5hZGQoKTt0cnl7dGhpcy5ydGUuZG9jLmV4ZWNDb21tYW5kKHRoaXMubmFtZSxmYWxzZSx0aGlzLnZhbCl9Y2F0Y2goYil7cmV0dXJuIHRoaXMucnRlLmxvZygiY29tbWFuZHMgZmFpbGVkOiAiK3RoaXMubmFtZSl9dGhpcy5ydGUudWkudXBkYXRlKHRydWUpfTtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuYnV0dG9uLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0cnl7aWYoIXRoaXMucnRlLmRvYy5xdWVyeUNvbW1hbmRFbmFibGVkKHRoaXMubmFtZSkpe3JldHVybiB0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImRpc2FibGVkIil9ZWxzZXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIil9fWNhdGNoKGIpe3JldHVybn10cnl7aWYodGhpcy5ydGUuZG9jLnF1ZXJ5Q29tbWFuZFN0YXRlKHRoaXMubmFtZSkpe3RoaXMuZG9tRWxlbS5hZGRDbGFzcygiYWN0aXZlIil9ZWxzZXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpfX1jYXRjaChiKXt9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51dGlscz1mdW5jdGlvbihjKXt0aGlzLnJ0ZT1jO3RoaXMudXJsPW51bGw7dGhpcy5yZWc9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS87dGhpcy5iYXNlVVJMPSIiO3RoaXMucGF0aD0iIjt0aGlzLmVudGl0aWVzPXsiJiI6IiZhbXA7IiwnIic6IiZxdW90OyIsIjwiOiImbHQ7IiwiPiI6IiZndDsifTt0aGlzLmVudGl0aWVzUmVnRXhwPS9bPD4mXCJdL2c7dGhpcy5tZWRpYT1be3R5cGU6ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIixjbGFzc2lkOlsiY2xzaWQ6ZDI3Y2RiNmUtYWU2ZC0xMWNmLTk2YjgtNDQ0NTUzNTQwMDAwIl0sY29kZWJhc2U6Imh0dHA6Ly9kb3dubG9hZC5tYWNyb21lZGlhLmNvbS9wdWIvc2hvY2t3YXZlL2NhYnMvZmxhc2gvc3dmbGFzaC5jYWIjdmVyc2lvbj02LDAsNDAsMCJ9LHt0eXBlOiJhcHBsaWNhdGlvbi94LWRpcmVjdG9yIixjbGFzc2lkOlsiY2xzaWQ6MTY2YjFiY2EtM2Y5Yy0xMWNmLTgwNzUtNDQ0NTUzNTQwMDAwIl0sY29kZWJhc2U6Imh0dHA6Ly9kb3dubG9hZC5tYWNyb21lZGlhLmNvbS9wdWIvc2hvY2t3YXZlL2NhYnMvZGlyZWN0b3Ivc3cuY2FiI3ZlcnNpb249OCw1LDEsMCJ9LHt0eXBlOiJhcHBsaWNhdGlvbi94LW1wbGF5ZXIyIixjbGFzc2lkOlsiY2xzaWQ6NmJmNTJhNTItMzk0YS0xMWQzLWIxNTMtMDBjMDRmNzlmYWE2IiwiY2xzaWQ6MjJkNmYzMTItYjBmNi0xMWQwLTk0YWItMDA4MGM3NGM3ZTk1IiwiY2xzaWQ6MDU1ODlmYTEtYzM1Ni0xMWNlLWJmMDEtMDBhYTAwNTU1OTVhIl0sY29kZWJhc2U6Imh0dHA6Ly9hY3RpdmV4Lm1pY3Jvc29mdC5jb20vYWN0aXZleC9jb250cm9scy9tcGxheWVyL2VuL25zbXAyaW5mLmNhYiNWZXJzaW9uPTUsMSw1Miw3MDEifSx7dHlwZToidmlkZW8vcXVpY2t0aW1lIixjbGFzc2lkOlsiY2xzaWQ6MDJiZjI1ZDUtOGMxNy00YjIzLWJjODAtZDM0ODhhYmRkYzZiIl0sY29kZWJhc2U6Imh0dHA6Ly93d3cuYXBwbGUuY29tL3F0YWN0aXZleC9xdHBsdWdpbi5jYWIjdmVyc2lvbj02LDAsMiwwIn0se3R5cGU6ImF1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbiIsY2xhc3NpZDpbImNsc2lkOmNmY2RhYTAzLThiZTQtMTFjZi1iODRiLTAwMjBhZmJiY2NmYSJdLGNvZGViYXNlOiJodHRwOi8vZG93bmxvYWQubWFjcm9tZWRpYS5jb20vcHViL3Nob2Nrd2F2ZS9jYWJzL2ZsYXNoL3N3Zmxhc2guY2FiI3ZlcnNpb249NiwwLDQwLDAifV07dGhpcy5yZ2JSZWdFeHA9L1xzKnJnYlxzKj9cKFxzKj8oWzAtOV0rKVxzKj8sXHMqPyhbMC05XSspXHMqPyxccyo/KFswLTldKylccyo/XClccyovaTt0aGlzLmNvbG9yc1JlZ0V4cD0vYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXxwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvd3xyZ2JccypcKFteXCldK1wpL2k7dGhpcy5jb2xvcnM9e2FxdWE6IiMwMGZmZmYiLGJsYWNrOiIjMDAwMDAwIixibHVlOiIjMDAwMGZmIixmdWNoc2lhOiIjZmYwMGZmIixncmF5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsbGltZToiIzAwZmYwMCIsbWFyb29uOiIjODAwMDAwIixuYXZ5OiIjMDAwMDgwIixvbGl2ZToiIzgwODAwMCIsb3JhbmdlOiIjZmZhNTAwIixwdXJwbGU6IiM4MDAwODAiLHJlZDoiI2ZmMDAwMCIsc2lsdmVyOiIjYzBjMGMwIix0ZWFsOiIjMDA4MDgwIix3aGl0ZToiI2ZmZmZmZmYiLHllbGxvdzoiI2ZmZmYwMCJ9O3ZhciBiPXRoaXM7dGhpcy5yZ2IyaGV4PWZ1bmN0aW9uKGYpe3JldHVybiB0aGlzLmNvbG9yMkhleCgiIitmKX07dGhpcy50b1BpeGVscz1mdW5jdGlvbihnKXt2YXIgZj1nLm1hdGNoKC8oWzAtOV0rXC4/WzAtOV0qKVxzKihweHxwdHxlbXwlKS8pO2lmKGYpe2c9ZlsxXTt1bml0PWZbMl19aWYoZ1swXT09Ii4iKXtnPSIwIitnfWc9cGFyc2VGbG9hdChnKTtpZihpc05hTihnKSl7cmV0dXJuIiJ9dmFyIGg9cGFyc2VJbnQoYShkb2N1bWVudC5ib2R5KS5jc3MoImZvbnQtc2l6ZSIpKXx8MTY7c3dpdGNoKHVuaXQpe2Nhc2UiZW0iOnJldHVybiBwYXJzZUludChnKmgpO2Nhc2UicHQiOnJldHVybiBwYXJzZUludChnKmgvMTIpO2Nhc2UiJSI6cmV0dXJuIHBhcnNlSW50KGcqaC8xMDApfXJldHVybiBnfTt0aGlzLmFic29sdXRlVVJMPWZ1bmN0aW9uKGcpeyF0aGlzLnVybCYmdGhpcy5fdXJsKCk7Zz1hLnRyaW0oZyk7aWYoIWcpe3JldHVybiIifWlmKGdbMF09PSIjIil7cmV0dXJuIGd9dmFyIGY9dGhpcy5wYXJzZVVSTChnKTtpZighZi5ob3N0JiYhZi5wYXRoJiYhZi5hbmNob3Ipe3JldHVybiIifWlmKCF0aGlzLnJ0ZS5vcHRpb25zLmFic29sdXRlVVJMcyl7cmV0dXJuIGd9aWYoZi5wcm90b2NvbCl7cmV0dXJuIGd9aWYoZi5ob3N0JiYoZi5ob3N0LmluZGV4T2YoIi4iKSE9LTF8fGYuaG9zdD09ImxvY2FsaG9zdCIpKXtyZXR1cm4gdGhpcy51cmwucHJvdG9jb2wrIjovLyIrZ31pZihnWzBdPT0iLyIpe2c9dGhpcy5iYXNlVVJMK2d9ZWxzZXtpZihnLmluZGV4T2YoIi4vIik9PTApe2c9Zy5zdWJzdHJpbmcoMil9Zz10aGlzLmJhc2VVUkwrdGhpcy5wYXRoK2d9cmV0dXJuIGd9O3RoaXMucGFyc2VVUkw9ZnVuY3Rpb24oaCl7dmFyIGc9aC5tYXRjaCh0aGlzLnJlZyk7dmFyIGY9e307YS5lYWNoKFsic291cmNlIiwicHJvdG9jb2wiLCJhdXRob3JpdHkiLCJ1c2VySW5mbyIsInVzZXIiLCJwYXNzd29yZCIsImhvc3QiLCJwb3J0IiwicmVsYXRpdmUiLCJwYXRoIiwiZGlyZWN0b3J5IiwiZmlsZSIsInF1ZXJ5IiwiYW5jaG9yIl0sZnVuY3Rpb24oail7Zlt0aGlzXT1nW2pdfSk7aWYoIWYuaG9zdC5tYXRjaCgvW2EtejAtOV0vaSkpe2YuaG9zdD0iIn1yZXR1cm4gZn07dGhpcy50cmltRXZlbnRDYWxsYmFjaz1mdW5jdGlvbihmKXtmPWY/Zi50b1N0cmluZygpOiIiO3JldHVybiBhLnRyaW0oZi5yZXBsYWNlKC9ccipcbi9tZywiIikucmVwbGFjZSgvXmZ1bmN0aW9uXHMqb25bYS16XStccypcKFxzKmV2ZW50XHMqXClccypceyguKylcfSQvaWdtLCIkMSIpKX07dGhpcy5fdXJsPWZ1bmN0aW9uKCl7dGhpcy51cmw9dGhpcy5wYXJzZVVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7dGhpcy5iYXNlVVJMPXRoaXMudXJsLnByb3RvY29sKyI6Ly8iKyh0aGlzLnVybC51c2VySW5mbz9wYXJ0cy51c2VySW5mbysiQCI6IiIpK3RoaXMudXJsLmhvc3QrKHRoaXMudXJsLnBvcnQ/IjoiK3RoaXMudXJsLnBvcnQ6IiIpO3RoaXMucGF0aD0hdGhpcy51cmwuZmlsZT90aGlzLnVybC5wYXRoOnRoaXMudXJsLnBhdGguc3Vic3RyaW5nKDAsdGhpcy51cmwucGF0aC5sZW5ndGgtdGhpcy51cmwuZmlsZS5sZW5ndGgpfTt0aGlzLm1ha2VPYmplY3Q9ZnVuY3Rpb24oZyl7dmFyIGY9e307YS5lYWNoKGcsZnVuY3Rpb24oaCxqKXtmW2pdPWp9KTtyZXR1cm4gZn07dGhpcy5lbmNvZGU9ZnVuY3Rpb24oZil7dmFyIGc9dGhpcy5lbnRpdGllcztyZXR1cm4oIiIrZikucmVwbGFjZSh0aGlzLmVudGl0aWVzUmVnRXhwLGZ1bmN0aW9uKGgpe3JldHVybiBnW2hdfSl9O3RoaXMuZGVjb2RlPWZ1bmN0aW9uKGYpe3JldHVybiBhKCI8ZGl2Lz4iKS5odG1sKGZ8fCIiKS50ZXh0KCl9O3RoaXMucGFyc2VTdHlsZT1mdW5jdGlvbihrKXt2YXIgaD17fSxmPXRoaXMucnRlLm9wdGlvbnMuYWxsb3dCcm93c2Vyc1NwZWNTdHlsZXMsaixvLGc7aWYodHlwZW9mKGspPT0ic3RyaW5nIiYmay5sZW5ndGgpe2EuZWFjaChrLnJlcGxhY2UoLyZxdW90Oy9naSwiJyIpLnNwbGl0KCI7IiksZnVuY3Rpb24oKXtqPXRoaXMudG9TdHJpbmcoKS5zcGxpdCgiOiIpO2lmKGpbMF0mJmpbMV0pe289YS50cmltKGpbMF0pLnRvTG93ZXJDYXNlKCk7Zz1hLnRyaW0oalsxXSk7aWYobz09ImNvbG9yInx8bz09ImJhY2tncm91bmQtY29sb3IiKXtnPWcudG9Mb3dlckNhc2UoKX1pZihvJiZnJiYoZnx8by5zdWJzdHJpbmcoMCwxKSE9Ii0iKSl7aFtvXT1nfX19KX1yZXR1cm4gaH07dGhpcy5jb21wYWN0U3R5bGU9ZnVuY3Rpb24oZyl7dmFyIGY9dGhpcztpZihnLmJvcmRlcj09Im1lZGl1bSBub25lIil7ZGVsZXRlIGcuYm9yZGVyfWEuZWFjaChnLGZ1bmN0aW9uKGosaCl7aWYoL2NvbG9yJC9pLnRlc3Qoaikpe2dbal09Zi5jb2xvcjJIZXgoaCl9ZWxzZXtpZigvXihib3JkZXJ8YmFja2dyb3VuZCkkL2kudGVzdChqKSl7Z1tqXT1oLnJlcGxhY2UoZi5jb2xvcnNSZWdFeHAsZnVuY3Rpb24oayl7cmV0dXJuIGYuY29sb3IySGV4KGspfSl9fX0pO2lmKGdbImJvcmRlci13aWR0aCJdKXtnLmJvcmRlcj1nWyJib3JkZXItd2lkdGgiXSsiICIrKGdbImJvcmRlci1zdHlsZSJdfHwic29saWQiKSsiICIrKGdbImJvcmRlci1jb2xvciJdfHwiIzAwMCIpO2RlbGV0ZSBnWyJib3JkZXItd2lkdGgiXTtkZWxldGUgZ1siYm9yZGVyLXN0eWxlIl07ZGVsZXRlIGdbImJvcmRlci1jb2xvciJdfWlmKGdbImJhY2tncm91bmQtaW1hZ2UiXSl7Zy5iYWNrZ3JvdW5kPShnWyJiYWNrZ3JvdW5kLWNvbG9yIl0rIiAiKXx8IiIrZ1siYmFja2dyb3VuZC1pbWFnZSJdKyIgIitnWyJiYWNrZ3JvdW5kLXBvc2l0aW9uIl18fCIwIDAgIitnWyJiYWNrZ3JvdW5kLXJlcGVhdCJdfHwicmVwZWF0IjtkZWxldGUgZ1siYmFja2dyb3VuZC1pbWFnZSJdO2RlbGV0ZSBbImJhY2tncm91bmQtaW1hZ2UiXTtkZWxldGUgWyJiYWNrZ3JvdW5kLXBvc2l0aW9uIl07ZGVsZXRlIFsiYmFja2dyb3VuZC1yZXBlYXQiXX1pZihnWyJtYXJnaW4tdG9wIl0mJmdbIm1hcmdpbi1yaWdodCJdJiZnWyJtYXJnaW4tYm90dG9tIl0mJmdbIm1hcmdpbi1sZWZ0Il0pe2cubWFyZ2luPWdbIm1hcmdpbi10b3AiXSsiICIrZ1sibWFyZ2luLXJpZ2h0Il0rIiAiK2dbIm1hcmdpbi1ib3R0b20iXSsiICIrZ1sibWFyZ2luLWxlZnQiXTtkZWxldGUgZ1sibWFyZ2luLXRvcCJdO2RlbGV0ZSBnWyJtYXJnaW4tcmlnaHQiXTtkZWxldGUgZ1sibWFyZ2luLWJvdHRvbSJdO2RlbGV0ZSBnWyJtYXJnaW4tbGVmdCJdfWlmKGdbInBhZGRpbmctdG9wIl0mJmdbInBhZGRpbmctcmlnaHQiXSYmZ1sicGFkZGluZy1ib3R0b20iXSYmZ1sicGFkZGluZy1sZWZ0Il0pe2cucGFkZGluZz1nWyJwYWRkaW5nLXRvcCJdKyIgIitnWyJwYWRkaW5nLXJpZ2h0Il0rIiAiK2dbInBhZGRpbmctYm90dG9tIl0rIiAiK2dbInBhZGRpbmctbGVmdCJdO2RlbGV0ZSBnWyJwYWRkaW5nLXRvcCJdO2RlbGV0ZSBnWyJwYWRkaW5nLXJpZ2h0Il07ZGVsZXRlIGdbInBhZGRpbmctYm90dG9tIl07ZGVsZXRlIGdbInBhZGRpbmctbGVmdCJdfWlmKGdbImxpc3Qtc3R5bGUtdHlwZSJdfHxnWyJsaXN0LXN0eWxlLXBvc2l0aW9uIl18fGdbImxpc3Qtc3R5bGUtaW1hZ2UiXSl7Z1sibGlzdC1zdHlsZSJdPWEudHJpbShnWyJsaXN0LXN0eWxlLXR5cGUiXXx8IiAiK2dbImxpc3Qtc3R5bGUtcG9zaXRpb24iXXx8IiIrZ1sibGlzdC1zdHlsZS1pbWFnZSJdfHwiIik7ZGVsZXRlIGdbImxpc3Qtc3R5bGUtdHlwZSJdO2RlbGV0ZSBnWyJsaXN0LXN0eWxlLXBvc2l0aW9uIl07ZGVsZXRlIGdbImxpc3Qtc3R5bGUtaW1hZ2UiXX1yZXR1cm4gZ307dGhpcy5zZXJpYWxpemVTdHlsZT1mdW5jdGlvbihnLGgpe3ZhciBmPVtdO2EuZWFjaChoP3RoaXMuY29tcGFjdFN0eWxlKGcpOmcsZnVuY3Rpb24oayxqKXtqJiZmLnB1c2goaysiOiIrail9KTtyZXR1cm4gZi5qb2luKCI7Iil9O3RoaXMucGFyc2VDbGFzcz1mdW5jdGlvbihmKXtmPWEudHJpbShmKTtyZXR1cm4gZi5sZW5ndGg/dGhpcy5tYWtlT2JqZWN0KGYuc3BsaXQoL1xzKy8pKTp7fTtyZXR1cm4gZi5sZW5ndGg/Zi5zcGxpdCgvXHMrLyk6W119O3RoaXMuc2VyaWFsaXplQ2xhc3M9ZnVuY3Rpb24oZyl7dmFyIGY9W107YS5lYWNoKGcsZnVuY3Rpb24oaCl7Zi5wdXNoKGgpfSk7cmV0dXJuIGYuam9pbigiICIpfTt0aGlzLm1lZGlhSW5mbz1mdW5jdGlvbihnLGgpe3ZhciBmPXRoaXMubWVkaWEubGVuZ3RoO3doaWxlKGYtLSl7aWYoZz09PXRoaXMubWVkaWFbZl0udHlwZXx8KGgmJmEuaW5BcnJheShoLHRoaXMubWVkaWFbZl0uY2xhc3NpZCkhPS0xKSl7cmV0dXJuIHRoaXMubWVkaWFbZl19fX07dGhpcy5jb2xvcjJIZXg9ZnVuY3Rpb24oaCl7dmFyIGY7aWYoaC5pbmRleE9mKCIjIik9PT0wKXtyZXR1cm4gaH1oPWh8fCIiO2Z1bmN0aW9uIGcoail7aj1wYXJzZUludChqKS50b1N0cmluZygxNik7cmV0dXJuIGoubGVuZ3RoPjE/ajoiMCIran1pZih0aGlzLmNvbG9yc1toXSl7cmV0dXJuIHRoaXMuY29sb3JzW2hdfWlmKChmPWgubWF0Y2godGhpcy5yZ2JSZWdFeHApKSl7cmV0dXJuIiMiK2coZlsxXSkrZyhmWzJdKStnKGZbM10pfXJldHVybiIifX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudzNjUmFuZ2U9ZnVuY3Rpb24oYyl7dmFyIGI9dGhpczt0aGlzLnJ0ZT1jO3RoaXMucj1udWxsO3RoaXMuY29sbGFwc2VkPXRydWU7dGhpcy5zdGFydENvbnRhaW5lcj1udWxsO3RoaXMuZW5kQ29udGFpbmVyPW51bGw7dGhpcy5zdGFydE9mZnNldD0wO3RoaXMuZW5kT2Zmc2V0PTA7dGhpcy5jb21tb25BbmNlc3RvckNvbnRhaW5lcj1udWxsO3RoaXMucmFuZ2U9ZnVuY3Rpb24oKXt0cnl7dGhpcy5yPXRoaXMucnRlLndpbmRvdy5kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKX1jYXRjaChmKXt0aGlzLnI9dGhpcy5ydGUuZG9jLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCl9cmV0dXJuIHRoaXMucn07dGhpcy5pbnNlcnROb2RlPWZ1bmN0aW9uKGYpe3RoaXMucmFuZ2UoKTtiLnIuY29sbGFwc2UoZmFsc2UpO3ZhciBnPWIuci5kdXBsaWNhdGUoKTtnLnBhc3RlSFRNTChmKX07dGhpcy5nZXRCb29rbWFyaz1mdW5jdGlvbigpe3RoaXMucmFuZ2UoKTtpZih0aGlzLnIuaXRlbSl7dmFyIGY9dGhpcy5yLml0ZW0oMCk7dGhpcy5yPXRoaXMucnRlLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO3RoaXMuci5tb3ZlVG9FbGVtZW50VGV4dChmKX1yZXR1cm4gdGhpcy5yLmdldEJvb2ttYXJrKCl9O3RoaXMubW92ZVRvQm9va21hcms9ZnVuY3Rpb24oZil7dGhpcy5ydGUud2luZG93LmZvY3VzKCk7dGhpcy5yYW5nZSgpLm1vdmVUb0Jvb2ttYXJrKGYpO3RoaXMuci5zZWxlY3QoKX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKHgpe3ZhciBrPSJcdUZFRkYiO3ZhciBvPW9mZnNldD0wO3ZhciB0PWIuci5kdXBsaWNhdGUoKTt0LmNvbGxhcHNlKHgpO3ZhciB1PXQucGFyZW50RWxlbWVudCgpO2lmKCF1fHx1Lm5vZGVOYW1lPT0iSFRNTCIpe3JldHVybntwYXJlbnQ6Yi5ydGUuZG9jLmJvZHksbmR4Om8sb2Zmc2V0Om9mZnNldH19dC5wYXN0ZUhUTUwoayk7Y2hpbGRzPXUuY2hpbGROb2Rlcztmb3IodmFyIHE9MDtxPGNoaWxkcy5sZW5ndGg7cSsrKXt2YXIgdz1jaGlsZHNbcV07aWYocT4wJiYody5ub2RlVHlwZSE9PTN8fGNoaWxkc1txLTFdLm5vZGVUeXBlIT09Mykpe28rK31pZih3Lm5vZGVUeXBlIT09Myl7b2Zmc2V0PTB9ZWxzZXt2YXIgdj13Lm5vZGVWYWx1ZS5pbmRleE9mKGspO2lmKHYhPT0tMSl7b2Zmc2V0Kz12O2JyZWFrfW9mZnNldCs9dy5ub2RlVmFsdWUubGVuZ3RofX10Lm1vdmVTdGFydCgiY2hhcmFjdGVyIiwtMSk7dC50ZXh0PSIiO3JldHVybntwYXJlbnQ6dSxuZHg6TWF0aC5taW4obyx1LmNoaWxkTm9kZXMubGVuZ3RoLTEpLG9mZnNldDpvZmZzZXR9fXRoaXMucmFuZ2UoKTt0aGlzLnN0YXJ0Q29udGFpbmVyPXRoaXMuZW5kQ29udGFpbmVyPW51bGw7aWYodGhpcy5yLml0ZW0pe3RoaXMuY29sbGFwc2VkPWZhbHNlO3ZhciBnPXRoaXMuci5pdGVtKDApO3RoaXMuc2V0U3RhcnQoZy5wYXJlbnROb2RlLHRoaXMucnRlLmRvbS5pbmRleE9mKGcpKTt0aGlzLnNldEVuZChnLnBhcmVudE5vZGUsdGhpcy5zdGFydE9mZnNldCsxKX1lbHNle3RoaXMuY29sbGFwc2VkPXRoaXMuci5ib3VuZGluZ1dpZHRoPT0wO3ZhciBqPWgodHJ1ZSk7dmFyIGY9aChmYWxzZSk7ai5wYXJlbnQubm9ybWFsaXplKCk7Zi5wYXJlbnQubm9ybWFsaXplKCk7ai5uZHg9TWF0aC5taW4oai5uZHgsai5wYXJlbnQuY2hpbGROb2Rlcy5sZW5ndGgtMSk7Zi5uZHg9TWF0aC5taW4oZi5uZHgsZi5wYXJlbnQuY2hpbGROb2Rlcy5sZW5ndGgtMSk7aWYoai5wYXJlbnQuY2hpbGROb2Rlc1tqLm5keF0ubm9kZVR5cGUmJmoucGFyZW50LmNoaWxkTm9kZXNbai5uZHhdLm5vZGVUeXBlPT0xKXt0aGlzLnNldFN0YXJ0KGoucGFyZW50LGoubmR4KX1lbHNle3RoaXMuc2V0U3RhcnQoai5wYXJlbnQuY2hpbGROb2Rlc1tqLm5keF0sai5vZmZzZXQpfWlmKGYucGFyZW50LmNoaWxkTm9kZXNbZi5uZHhdLm5vZGVUeXBlJiZmLnBhcmVudC5jaGlsZE5vZGVzW2YubmR4XS5ub2RlVHlwZT09MSl7dGhpcy5zZXRFbmQoZi5wYXJlbnQsZi5uZHgpfWVsc2V7dGhpcy5zZXRFbmQoZi5wYXJlbnQuY2hpbGROb2Rlc1tmLm5keF0sZi5vZmZzZXQpfXRoaXMuc2VsZWN0KCl9cmV0dXJuIHRoaXN9O3RoaXMuaXNDb2xsYXBzZWQ9ZnVuY3Rpb24oKXt0aGlzLnJhbmdlKCk7dGhpcy5jb2xsYXBzZWQ9dGhpcy5yLml0ZW0/ZmFsc2U6dGhpcy5yLmJvdW5kaW5nV2lkdGg9PTA7cmV0dXJuIHRoaXMuY29sbGFwc2VkfTt0aGlzLmNvbGxhcHNlPWZ1bmN0aW9uKGYpe3RoaXMucmFuZ2UoKTtpZih0aGlzLnIuaXRlbSl7dmFyIGc9dGhpcy5yLml0ZW0oMCk7dGhpcy5yPXRoaXMucnRlLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO3RoaXMuci5tb3ZlVG9FbGVtZW50VGV4dChnKX10aGlzLnIuY29sbGFwc2UoZik7dGhpcy5yLnNlbGVjdCgpO3RoaXMuY29sbGFwc2VkPXRydWV9O3RoaXMuZ2V0U3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLnJhbmdlKCk7aWYodGhpcy5yLml0ZW0pe3JldHVybiB0aGlzLnIuaXRlbSgwKX12YXIgZz10aGlzLnIuZHVwbGljYXRlKCk7Zy5jb2xsYXBzZSh0cnVlKTt2YXIgZj1nLnBhcmVudEVsZW1lbnQoKTtyZXR1cm4gZiYmZi5ub2RlTmFtZT09IkJPRFkiP2YuZmlyc3RDaGlsZDpmfTt0aGlzLmdldEVuZD1mdW5jdGlvbigpe3RoaXMucmFuZ2UoKTtpZih0aGlzLnIuaXRlbSl7cmV0dXJuIHRoaXMuci5pdGVtKDApfXZhciBmPXRoaXMuci5kdXBsaWNhdGUoKTtmLmNvbGxhcHNlKGZhbHNlKTt2YXIgZz1mLnBhcmVudEVsZW1lbnQoKTtyZXR1cm4gZyYmZy5ub2RlTmFtZT09IkJPRFkiP2cubGFzdENoaWxkOmd9O3RoaXMuc2V0U3RhcnQ9ZnVuY3Rpb24oZixnKXt0aGlzLnN0YXJ0Q29udGFpbmVyPWY7dGhpcy5zdGFydE9mZnNldD1nO2lmKHRoaXMuZW5kQ29udGFpbmVyKXt0aGlzLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyPXRoaXMucnRlLmRvbS5maW5kQ29tbW9uQW5jZXN0b3IodGhpcy5zdGFydENvbnRhaW5lcix0aGlzLmVuZENvbnRhaW5lcil9fTt0aGlzLnNldEVuZD1mdW5jdGlvbihmLGcpe3RoaXMuZW5kQ29udGFpbmVyPWY7dGhpcy5lbmRPZmZzZXQ9ZztpZih0aGlzLnN0YXJ0Q29udGFpbmVyKXt0aGlzLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyPXRoaXMucnRlLmRvbS5maW5kQ29tbW9uQW5jZXN0b3IodGhpcy5zdGFydENvbnRhaW5lcix0aGlzLmVuZENvbnRhaW5lcil9fTt0aGlzLnNldFN0YXJ0QmVmb3JlPWZ1bmN0aW9uKGYpe2lmKGYucGFyZW50Tm9kZSl7dGhpcy5zZXRTdGFydChmLnBhcmVudE5vZGUsdGhpcy5ydGUuZG9tLmluZGV4T2YoZikpfX07dGhpcy5zZXRTdGFydEFmdGVyPWZ1bmN0aW9uKGYpe2lmKGYucGFyZW50Tm9kZSl7dGhpcy5zZXRTdGFydChmLnBhcmVudE5vZGUsdGhpcy5ydGUuZG9tLmluZGV4T2YoZikrMSl9fTt0aGlzLnNldEVuZEJlZm9yZT1mdW5jdGlvbihmKXtpZihmLnBhcmVudE5vZGUpe3RoaXMuc2V0RW5kKGYucGFyZW50Tm9kZSx0aGlzLnJ0ZS5kb20uaW5kZXhPZihmKSl9fTt0aGlzLnNldEVuZEFmdGVyPWZ1bmN0aW9uKGYpe2lmKGYucGFyZW50Tm9kZSl7dGhpcy5zZXRFbmQoZi5wYXJlbnROb2RlLHRoaXMucnRlLmRvbS5pbmRleE9mKGYpKzEpfX07dGhpcy5zZWxlY3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBvKEIseil7aWYoQi5ub2RlVHlwZSE9Myl7cmV0dXJuIC0xfXZhciBBPSJcdUZFRkYiO3ZhciB4PUIubm9kZVZhbHVlO3ZhciB2PWIucnRlLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO0Iubm9kZVZhbHVlPXguc3Vic3RyaW5nKDAseikrQSt4LnN1YnN0cmluZyh6KTt2Lm1vdmVUb0VsZW1lbnRUZXh0KEIucGFyZW50Tm9kZSk7di5maW5kVGV4dChBKTt2YXIgdz1NYXRoLmFicyh2Lm1vdmVTdGFydCgiY2hhcmFjdGVyIiwtMTA0ODU3NSkpO0Iubm9kZVZhbHVlPXg7cmV0dXJuIHd9dGhpcy5yPXRoaXMucnRlLmRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO3ZhciBrPXRoaXMuc3RhcnRPZmZzZXQ7dmFyIGc9dGhpcy5lbmRPZmZzZXQ7dmFyIHU9dGhpcy5zdGFydENvbnRhaW5lci5ub2RlVHlwZT09MT90aGlzLnN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXNbTWF0aC5taW4oayx0aGlzLnN0YXJ0Q29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoLTEpXTp0aGlzLnN0YXJ0Q29udGFpbmVyO3ZhciBxPXRoaXMuZW5kQ29udGFpbmVyLm5vZGVUeXBlPT0xP3RoaXMuZW5kQ29udGFpbmVyLmNoaWxkTm9kZXNbTWF0aC5taW4oaz09Zz9nOmctMSx0aGlzLmVuZENvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aC0xKV06dGhpcy5lbmRDb250YWluZXI7aWYodGhpcy5jb2xsYXBzZWQpe2lmKHUubm9kZVR5cGU9PTMpe3ZhciBoPW8odSxrKTt0aGlzLnIubW92ZSgiY2hhcmFjdGVyIixoKX1lbHNle3RoaXMuci5tb3ZlVG9FbGVtZW50VGV4dCh1KTt0aGlzLnIuY29sbGFwc2UodHJ1ZSl9fWVsc2V7dmFyIGY9dGhpcy5ydGUuZG9jLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7dmFyIGo9byh1LGspO3ZhciB0PW8ocSxnKTtpZih1Lm5vZGVUeXBlPT0zKXt0aGlzLnIubW92ZSgiY2hhcmFjdGVyIixqKX1lbHNle3RoaXMuci5tb3ZlVG9FbGVtZW50VGV4dCh1KX1pZihxLm5vZGVUeXBlPT0zKXtmLm1vdmUoImNoYXJhY3RlciIsdCl9ZWxzZXtmLm1vdmVUb0VsZW1lbnRUZXh0KHEpfXRoaXMuci5zZXRFbmRQb2ludCgiRW5kVG9FbmQiLGYpfXRyeXt0aGlzLnIuc2VsZWN0KCl9Y2F0Y2gocSl7fWlmKGYpe2Y9bnVsbH19O3RoaXMuZHVtcD1mdW5jdGlvbigpe3RoaXMucnRlLmxvZygiY29sbGFwc2VkOiAiK3RoaXMuY29sbGFwc2VkKTt0aGlzLnJ0ZS5sb2coInN0YXJ0Q29udGFpbmVyOiAiKyh0aGlzLnN0YXJ0Q29udGFpbmVyP3RoaXMuc3RhcnRDb250YWluZXIubm9kZU5hbWU6Im5vbiIpKTt0aGlzLnJ0ZS5sb2coInN0YXJ0T2Zmc2V0OiAiK3RoaXMuc3RhcnRPZmZzZXQpO3RoaXMucnRlLmxvZygiZW5kQ29udGFpbmVyOiAiKyh0aGlzLmVuZENvbnRhaW5lcj90aGlzLmVuZENvbnRhaW5lci5ub2RlTmFtZToibm9uZSIpKTt0aGlzLnJ0ZS5sb2coImVuZE9mZnNldDogIit0aGlzLmVuZE9mZnNldCl9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5hYm91dD1mdW5jdGlvbihjLGIpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxjLGIpO3RoaXMuYWN0aXZlPXRydWU7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIGcsaCxmO2c9e3J0bDpjLnJ0bCxzdWJtaXQ6ZnVuY3Rpb24oaixrKXtrLmNsb3NlKCl9LGRpYWxvZzp7d2lkdGg6NTYwLHRpdGxlOnRoaXMucnRlLmkxOG4oIkFib3V0IHRoaXMgc29mdHdhcmUiKSxidXR0b25zOntPazpmdW5jdGlvbigpe2EodGhpcykuZGlhbG9nKCJkZXN0cm95Iil9fX19O2Y9JzxkaXYgY2xhc3M9ImVscnRlLWxvZ28iPjwvZGl2PjxoMz4nK3RoaXMucnRlLmkxOG4oIkFib3V0IGVsUlRFIikrJzwvaDM+PGJyIGNsZWFyPSJhbGwiLz48ZGl2IGNsYXNzPSJlbHJ0ZS12ZXIiPicrdGhpcy5ydGUuaTE4bigiVmVyc2lvbiIpKyI6ICIrdGhpcy5ydGUudmVyc2lvbisiICgiK3RoaXMucnRlLmJ1aWxkKycpPC9kaXY+PGRpdiBjbGFzcz0iZWxydGUtdmVyIj5qUXVlcnk6ICcrYSgiPGRpdi8+IikuanF1ZXJ5Kyc8L2Rpdj48ZGl2IGNsYXNzPSJlbHJ0ZS12ZXIiPmpRdWVyeVVJOiAnK2EudWkudmVyc2lvbisnPC9kaXY+PGRpdiBjbGFzcz0iZWxydGUtdmVyIj4nK3RoaXMucnRlLmkxOG4oIkxpY2VuY2UiKSsiOiBCU0QgTGljZW5jZTwvZGl2PjxwPiIrdGhpcy5ydGUuaTE4bigiZWxSVEUgaXMgYW4gb3Blbi1zb3VyY2UgSmF2YVNjcmlwdCBiYXNlZCBXWVNJV1lHIEhUTUwtZWRpdG9yLiIpKyI8YnIvPiIrdGhpcy5ydGUuaTE4bigiTWFpbiBnb2FsIG9mIHRoZSBlZGl0b3IgLSBzaW1wbGlmeSB3b3JrIHdpdGggdGV4dCBhbmQgZm9ybWF0aW5nIChIVE1MKSBvbiBzaXRlcywgYmxvZ3MsIGZvcnVtcyBhbmQgb3RoZXIgb25saW5lIHNlcnZpY2VzLiIpKyI8YnIvPiIrdGhpcy5ydGUuaTE4bigiWW91IGNhbiB1c2UgaXQgaW4gYW55IGNvbW1lcmNpYWwgb3Igbm9uLWNvbW1lcmNpYWwgcHJvamVjdHMuIikrIjwvcD48aDQ+Iit0aGlzLnJ0ZS5pMThuKCJBdXRob3JzIikrJzwvaDQ+PHRhYmxlIGNsYXNzPSJlbHJ0ZS1hdXRob3JzIj48dHI+PHRkPkRtaXRyeSAoZGlvKSBMZXZhc2hvdiAmbHQ7ZGlvQHN0ZDQyLnJ1Jmd0OzwvdGQ+PHRkPicrdGhpcy5ydGUuaTE4bigiQ2hpZWYgZGV2ZWxvcGVyIikrIjwvdGQ+PC90cj48dHI+PHRkPlRyb2V4IE5ldmVsaW4gJmx0O3Ryb2V4QGZ1cnkuc2NhbmNvZGUucnUmZ3Q7PC90ZD48dGQ+Iit0aGlzLnJ0ZS5pMThuKCJEZXZlbG9wZXIsIHRlY2ggc3VwcG9ydCIpKyI8L3RkPjwvdHI+PHRyPjx0ZD5WYWxlbnRpbiBSYXp1bW55aCAmbHQ7Y29udGVudEBzdGQ0Mi5ydSZndDs8L3RkPjx0ZD4iK3RoaXMucnRlLmkxOG4oIkludGVyZmFjZSBkZXNpZ25lciIpKyI8L3RkPjwvdHI+PHRyPjx0ZD5FdmdlbnkgZVNhYmJhdGggJmx0O3NhYmJhdGguY29kZW1nQGdtYWlsLmNvbSZndDs8L3RkPjx0ZD4iK3RoaXMucnRlLmkxOG4oIkRldmVsb3BlciIpKyI8L3RkPjwvdHI+PHRyPjx0ZD5BbmRyemVqIEJvcm93aWN6ICZsdDtlbHRyZUBib3Jvd2ljei5pbmZvJmd0OzwvdGQ+PHRkPiIrdGhpcy5ydGUuaTE4bigiUG9saXNoIGxvY2FsaXphdGlvbiIpKyI8L3RkPjwvdHI+PHRyPjx0ZD5BcnRlbSBWYXNpbGlldjwvdGQ+PHRkPiIrdGhpcy5ydGUuaTE4bigiVWtyYW5pYW4gbG9jYWxpemF0aW9uIikrIjwvdGQ+PC90cj48dHI+PHRkPkZyYW5jb2lzIE1hemVyb2xsZSAmbHQ7Zm1hejAwOEBnbWFpbC5jb20mZ3Q7PC90ZD48dGQ+Iit0aGlzLnJ0ZS5pMThuKCJGcmVuY2ggbG9jYWxpemF0aW9uIikrIjwvdGQ+PC90cj48dHI+PHRkPkt1cnQgQWVydHM8L3RkPjx0ZD4iK3RoaXMucnRlLmkxOG4oIkR1dGNoIGxvY2FsaXphdGlvbiIpKyI8L3RkPjwvdHI+PHRyPjx0ZD5NaWNoYWwgTWFyZWsgJmx0O2ZtaWNoLm1hcmVrQGdtYWlsLmNvbSZndDs8L3RkPjx0ZD4iK3RoaXMucnRlLmkxOG4oIkN6ZWNoIGxvY2FsaXphdGlvbiIpKyI8L3RkPjwvdHI+PHRyPjx0ZD5SaWNhcmRvIE9icmVnw7NuICZsdDtyb2JyZWdvbm1AZ21haWwuY29tJmd0OzwvdGQ+PHRkPiIrdGhpcy5ydGUuaTE4bigiU3BhbmlzaCBsb2NhbGl6YXRpb24iKSsiPC90ZD48L3RyPjx0cj48dGQ+U2FsZWggU291emFuY2hpICZsdDtzYWxlaC5zb3V6YW5jaGlAZ21haWwuY29tJmd0OzwvdGQ+PHRkPiIrdGhpcy5ydGUuaTE4bigiUGVyc2lhbiAoZmFyc2kpIGxvY2FsaXphdGlvbiIpKyI8L3RkPjwvdHI+PHRyPjx0ZD5UYXdmZWsgRGFnaGlzdGFuaSAmbHQ7dGF3ZmVrb3ZAZ21haWwuY29tJmd0OzwvdGQ+PHRkPiIrdGhpcy5ydGUuaTE4bigiQXJhYmljIGxvY2FsaXphdGlvbiIpKyIsICIrdGhpcy5ydGUuaTE4bigiUlRMIHN1cHBvcnQiKSsiPC90ZD48L3RyPjx0cj48dGQ+VGFkICZsdDt0YWQwNjE2QGdtYWlsLmNvbSZndDs8L3RkPjx0ZD4iK3RoaXMucnRlLmkxOG4oIlRyYWRpdGlvbmFsIENoaW5lc2UgbG9jYWxpemF0aW9uIikrIjwvdGQ+PC90cj48dHI+PHRkPlRvbW9ha2kgWW9zaGlkYSAmbHQ7aW5mb0B5b3NoaWRhLXN0dWRpby5qcCZndDs8L3RkPjx0ZD4iK3RoaXMucnRlLmkxOG4oIkphcGFuZXNlIGxvY2FsaXphdGlvbiIpKyI8L3RkPjwvdHI+PHRyPjx0ZD5VbGRpcyBQbG90acWGxaEgJmx0O3VsZGlzLnBsb3RpbnNAZ21haWwuY29tJmd0OzwvdGQ+PHRkPiIrdGhpcy5ydGUuaTE4bigiTGF0dmlhbiBsb2NhbGl6YXRpb24iKSsiPC90ZD48L3RyPjx0cj48dGQ+VmFzaWxpeSBSYXp1bW55aCAmbHQ7cnZuQHN0ZDQyLnJ1Jmd0OzwvdGQ+PHRkPiIrdGhpcy5ydGUuaTE4bigiR2VybWFuIGxvY2FsaXphdGlvbiIpKyI8L3RkPjwvdHI+PHRyPjx0ZD5WaWt0b3IgVGFtYXMgJmx0O3RhbWFzLnZpa3RvckB0b3RhbHN0dWRpby5odSZndDs8L3RkPjx0ZD4iK3RoaXMucnRlLmkxOG4oIkh1bmdhcmlhbiBsb2NhbGl6YXRpb24iKSsiPC90ZD48L3RyPjx0cj48dGQ+VWdvIFB1bnpvbG8sICZsdDtzYWRyYWN6ZXJvdW5vQGdtYWlsLmNvbSZndDs8L3RkPjx0ZD4iK3RoaXMucnRlLmkxOG4oIkl0YWxpYW4gbG9jYWxpemF0aW9uIikrJzwvdGQ+PC90cj48L3RhYmxlPjxkaXYgY2xhc3M9ImVscnRlLWNvcHkiPkNvcHlyaWdodCAmY29weTsgMjAwOS0yMDEwLCA8YSBocmVmPSJodHRwOi8vd3d3LnN0ZDQyLnJ1Ij5TdHVkaW8gNDIgTFREPC9hPjwvZGl2PjxkaXYgY2xhc3M9ImVscnRlLWNvcHkiPicrdGhpcy5ydGUuaTE4bigiRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzb2Z0d2FyZSB2aXNpdCB0aGUiKSsnIDxhIGhyZWY9Imh0dHA6Ly9lbHJ0ZS5vcmciPicrdGhpcy5ydGUuaTE4bigiZWxSVEUgd2Vic2l0ZSIpKycuPC9hPjwvZGl2PjxkaXYgY2xhc3M9ImVscnRlLWNvcHkiPlR3aXR0ZXI6IDxhIGhyZWY9Imh0dHA6Ly90d2l0dGVyLmNvbS9lbHJ0ZV9lbGZpbmRlciI+ZWxydGVfZWxmaW5kZXI8L2E+PC9kaXY+JztoPW5ldyBlbERpYWxvZ0Zvcm0oZyk7aC5hcHBlbmQoZik7aC5vcGVuKCl9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpfX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuYW5jaG9yPWZ1bmN0aW9uKGYsYyl7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGYsYyk7dGhpcy5pbnB1dD1hKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCJuYW1lIiwiYW5jaG9yIikuYXR0cigic2l6ZSIsIjE2Iik7dmFyIGI9dGhpczt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt2YXIgZz17cnRsOnRoaXMucnRlLnJ0bCxzdWJtaXQ6ZnVuY3Rpb24oaixrKXtqLnN0b3BQcm9wYWdhdGlvbigpO2oucHJldmVudERlZmF1bHQoKTtrLmNsb3NlKCk7Yi5zZXQoKX0sZGlhbG9nOnt0aXRsZTp0aGlzLnJ0ZS5pMThuKCJCb29rbWFyayIpfX07dGhpcy5hbmNob3I9dGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudEFuY2hvcih0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0RW5kKCkpfHxmLmRvbS5jcmVhdGUoImEiKTshdGhpcy5ydGUuc2VsZWN0aW9uLmNvbGxhcHNlZCgpJiZ0aGlzLnJ0ZS5zZWxlY3Rpb24uY29sbGFwc2UoZmFsc2UpO3RoaXMuaW5wdXQudmFsKGEodGhpcy5hbmNob3IpLmFkZENsYXNzKCJlbC1ydGUtYW5jaG9yIikuYXR0cigibmFtZSIpKTt0aGlzLnJ0ZS5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTt2YXIgaD1uZXcgZWxEaWFsb2dGb3JtKGcpO2guYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJCb29rbWFyayBuYW1lIiksdGhpcy5pbnB1dF0sbnVsbCx0cnVlKS5vcGVuKCk7c2V0VGltZW91dChmdW5jdGlvbigpe2IuaW5wdXQuZm9jdXMoKX0sMjApfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBnPXRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7aWYodGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudExpbmsoZykpe3RoaXMuZG9tRWxlbS5hZGRDbGFzcygiZGlzYWJsZWQiKX1lbHNle2lmKHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnRBbmNob3IoZykpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKS5hZGRDbGFzcygiYWN0aXZlIil9ZWxzZXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpfX19O3RoaXMuc2V0PWZ1bmN0aW9uKCl7dmFyIGc9YS50cmltKHRoaXMuaW5wdXQudmFsKCkpO2lmKGcpe3RoaXMucnRlLmhpc3RvcnkuYWRkKCk7aWYoIXRoaXMuYW5jaG9yLnBhcmVudE5vZGUpe3RoaXMucnRlLnNlbGVjdGlvbi5pbnNlcnRIdG1sKCc8YSBuYW1lPSInK2crJyIgdGl0bGU9IicrdGhpcy5ydGUuaTE4bigiQm9va21hcmsiKSsiOiAiK2crJyIgY2xhc3M9ImVsLXJ0ZS1hbmNob3IiPjwvYT4nKX1lbHNle3RoaXMuYW5jaG9yLm5hbWU9Zzt0aGlzLmFuY2hvci50aXRsZT10aGlzLnJ0ZS5pMThuKCJCb29rbWFyayIpKyI6ICIrZ319ZWxzZXtpZih0aGlzLmFuY2hvci5wYXJlbnROb2RlKXt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpO3RoaXMuYW5jaG9yLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5hbmNob3IpfX19fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5ibG9ja3F1b3RlPWZ1bmN0aW9uKGMsYil7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGMsYik7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIGcsZjt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpO2lmKHRoaXMucnRlLnNlbGVjdGlvbi5jb2xsYXBzZWQoKSYmKGc9dGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLC9eQkxPQ0tRVU9URSQvKSkpe2EoZykucmVwbGFjZVdpdGgoYShnKS5odG1sKCkpfWVsc2V7Zj10aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoe3dyYXA6ImFsbCIsdGFnOiJibG9ja3F1b3RlIn0pO2YubGVuZ3RoJiZ0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0KGZbMF0sZltmLmxlbmd0aC0xXSl9dGhpcy5ydGUudWkudXBkYXRlKHRydWUpfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe2lmKHRoaXMucnRlLnNlbGVjdGlvbi5jb2xsYXBzZWQoKSl7aWYodGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLC9eQkxPQ0tRVU9URSQvKSl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpLmFkZENsYXNzKCJhY3RpdmUiKX1lbHNle3RoaXMuZG9tRWxlbS5hZGRDbGFzcygiZGlzYWJsZWQiKS5yZW1vdmVDbGFzcygiYWN0aXZlIil9fWVsc2V7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCBhY3RpdmUiKX19fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5jb3B5PWZ1bmN0aW9uKGMsYil7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGMsYik7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7aWYodGhpcy5ydGUuYnJvd3Nlci5tb3ppbGxhKXt0cnl7dGhpcy5ydGUuZG9jLmV4ZWNDb21tYW5kKHRoaXMubmFtZSxmYWxzZSxudWxsKX1jYXRjaChoKXt2YXIgZj0iIEN0bCArIEMiO2lmKHRoaXMubmFtZT09ImN1dCIpe2Y9IiBDdGwgKyBYIn1lbHNle2lmKHRoaXMubmFtZT09InBhc3RlIil7Zj0iIEN0bCArIFYifX12YXIgZz17ZGlhbG9nOnt0aXRsZTp0aGlzLnJ0ZS5pMThuKCJXYXJuaW5nIiksYnV0dG9uczp7T2s6ZnVuY3Rpb24oKXthKHRoaXMpLmRpYWxvZygiY2xvc2UiKX19fX07dmFyIGo9bmV3IGVsRGlhbG9nRm9ybShnKTtqLmFwcGVuZCh0aGlzLnJ0ZS5pMThuKCJUaGlzIG9wZXJhdGlvbiBpcyBkaXNhYmxlZCBpbiB5b3VyIGJyb3dzZXIgb24gc2VjdXJpdHkgcmVhc29uLiBVc2Ugc2hvcnRjdXQgaW5zdGVhZC4iKSsiOiAiK2YpLm9wZW4oKX19ZWxzZXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb21tYW5kLmNhbGwodGhpcyl9fX07ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmN1dD1lbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuY29weTtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMucGFzdGU9ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmNvcHl9KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuY3NzPWZ1bmN0aW9uKGYsYyl7dmFyIGI9dGhpczt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZixjKTt0aGlzLmNzc1N0eWxlPWEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSI0MiIgbmFtZT0ic3R5bGUiIC8+Jyk7dGhpcy5jc3NDbGFzcz1hKCc8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iNDIiIG5hbWU9ImNsYXNzIiAvPicpO3RoaXMuY29tbWFuZD1mdW5jdGlvbigpe3ZhciBqPXRoaXMubm9kZSgpLGc7dGhpcy5ydGUuc2VsZWN0aW9uLnNhdmVJRVJhbmdlKCk7aWYoail7dmFyIGc9e3N1Ym1pdDpmdW5jdGlvbihrLG8pe2suc3RvcFByb3BhZ2F0aW9uKCk7ay5wcmV2ZW50RGVmYXVsdCgpO28uY2xvc2UoKTtiLnNldCgpfSxkaWFsb2c6e3RpdGxlOnRoaXMucnRlLmkxOG4oIlN0eWxlIiksd2lkdGg6NDUwLHJlc2l6YWJsZTp0cnVlLG1vZGFsOnRydWV9fTt0aGlzLmNzc1N0eWxlLnZhbChhKGopLmF0dHIoInN0eWxlIikpO3RoaXMuY3NzQ2xhc3MudmFsKGEoaikuYXR0cigiY2xhc3MiKSk7dmFyIGg9bmV3IGVsRGlhbG9nRm9ybShnKTtoLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiQ3NzIHN0eWxlIiksdGhpcy5jc3NTdHlsZV0sbnVsbCx0cnVlKTtoLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiQ3NzIGNsYXNzIiksdGhpcy5jc3NDbGFzc10sbnVsbCx0cnVlKS5vcGVuKCk7c2V0VGltZW91dChmdW5jdGlvbigpe2IuY3NzU3R5bGUuZm9jdXMoKX0sMjApfX07dGhpcy5zZXQ9ZnVuY3Rpb24oKXt2YXIgZz10aGlzLm5vZGUoKTt0aGlzLnJ0ZS5zZWxlY3Rpb24ucmVzdG9yZUlFUmFuZ2UoKTtpZihnKXthKGcpLmF0dHIoInN0eWxlIix0aGlzLmNzc1N0eWxlLnZhbCgpKTthKGcpLmF0dHIoImNsYXNzIix0aGlzLmNzc0NsYXNzLnZhbCgpKTt0aGlzLnJ0ZS51aS51cGRhdGUoKX19O3RoaXMubm9kZT1mdW5jdGlvbigpe3ZhciBnPXRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7aWYoZy5ub2RlVHlwZT09Myl7Zz1nLnBhcmVudE5vZGV9cmV0dXJuIGcubm9kZVR5cGU9PTEmJmcubm9kZU5hbWUhPSJCT0RZIj9nOm51bGx9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnRvZ2dsZUNsYXNzKCJkaXNhYmxlZCIsdGhpcy5ub2RlKCk/ZmFsc2U6dHJ1ZSl9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5ydGw9ZnVuY3Rpb24oZixjKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZixjKTt2YXIgYj10aGlzO3RoaXMuY29tbWFuZD1mdW5jdGlvbigpe3ZhciBoPXRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksZz10aGlzO2lmKGEoaCkuYXR0cigiZGlyIik9PSJydGwifHxhKGgpLnBhcmVudHMoJ1tkaXI9InJ0bCJdJykubGVuZ3RofHxhKGgpLmZpbmQoJ1tkaXI9InJ0bCJdJykubGVuZ3RoKXthKGgpLnJlbW92ZUF0dHIoImRpciIpO2EoaCkucGFyZW50cygnW2Rpcj0icnRsIl0nKS5yZW1vdmVBdHRyKCJkaXIiKTthKGgpLmZpbmQoJ1tkaXI9InJ0bCJdJykucmVtb3ZlQXR0cigiZGlyIil9ZWxzZXtpZih0aGlzLnJ0ZS5kb20uaXMoaCwidGV4dE5vZGVzIikmJnRoaXMucnRlLmRvbS5pcyhoLCJibG9jayIpKXthKGgpLmF0dHIoImRpciIsInJ0bCIpfWVsc2V7YS5lYWNoKHRoaXMucnRlLmRvbS5wYXJlbnRzKGgsInRleHROb2RlcyIpLGZ1bmN0aW9uKGosayl7aWYoZy5ydGUuZG9tLmlzKGssImJsb2NrIikpe2EoaykuYXR0cigiZGlyIiwicnRsIik7cmV0dXJuIGZhbHNlfX0pfX10aGlzLnJ0ZS51aS51cGRhdGUoKX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgZz10aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpO3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKTtpZihhKGcpLmF0dHIoImRpciIpPT0icnRsInx8YShnKS5wYXJlbnRzKCdbZGlyPSJydGwiXScpLmxlbmd0aHx8YShnKS5maW5kKCdbZGlyPSJydGwiXScpLmxlbmd0aCl7dGhpcy5kb21FbGVtLmFkZENsYXNzKCJhY3RpdmUiKX1lbHNle3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiYWN0aXZlIil9fX07ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmx0cj1mdW5jdGlvbihmLGMpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxmLGMpO3ZhciBiPXRoaXM7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSxnPXRoaXM7aWYoYShoKS5hdHRyKCJkaXIiKT09Imx0ciJ8fGEoaCkucGFyZW50cygnW2Rpcj0ibHRyIl0nKS5sZW5ndGh8fGEoaCkuZmluZCgnW2Rpcj0ibHRyIl0nKS5sZW5ndGgpe2EoaCkucmVtb3ZlQXR0cigiZGlyIik7YShoKS5wYXJlbnRzKCdbZGlyPSJsdHIiXScpLnJlbW92ZUF0dHIoImRpciIpO2EoaCkuZmluZCgnW2Rpcj0ibHRyIl0nKS5yZW1vdmVBdHRyKCJkaXIiKX1lbHNle2lmKHRoaXMucnRlLmRvbS5pcyhoLCJ0ZXh0Tm9kZXMiKSYmdGhpcy5ydGUuZG9tLmlzKGgsImJsb2NrIikpe2EoaCkuYXR0cigiZGlyIiwibHRyIil9ZWxzZXthLmVhY2godGhpcy5ydGUuZG9tLnBhcmVudHMoaCwidGV4dE5vZGVzIiksZnVuY3Rpb24oaixrKXtpZihnLnJ0ZS5kb20uaXMoaywiYmxvY2siKSl7YShrKS5hdHRyKCJkaXIiLCJsdHIiKTtyZXR1cm4gZmFsc2V9fSl9fXRoaXMucnRlLnVpLnVwZGF0ZSgpfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBnPXRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpO2lmKGEoZykuYXR0cigiZGlyIik9PSJsdHIifHxhKGcpLnBhcmVudHMoJ1tkaXI9Imx0ciJdJykubGVuZ3RofHxhKGcpLmZpbmQoJ1tkaXI9Imx0ciJdJykubGVuZ3RoKXt0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImFjdGl2ZSIpfWVsc2V7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJhY3RpdmUiKX19fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5kaXY9ZnVuY3Rpb24oYyxiKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYyxiKTt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt2YXIgZyxmO3RoaXMucnRlLmhpc3RvcnkuYWRkKCk7aWYodGhpcy5ydGUuc2VsZWN0aW9uLmNvbGxhcHNlZCgpKXtnPXRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwvXkRJViQvKTtpZihnKXthKGcpLnJlcGxhY2VXaXRoKGEoZykuaHRtbCgpKX19ZWxzZXtmPXRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7d3JhcDoiYWxsIix0YWc6ImRpdiJ9KTtmLmxlbmd0aCYmdGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdChmWzBdLGZbZi5sZW5ndGgtMV0pfXRoaXMucnRlLnVpLnVwZGF0ZSh0cnVlKX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXtpZih0aGlzLnJ0ZS5zZWxlY3Rpb24uY29sbGFwc2VkKCkpe2lmKHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwvXkRJViQvKSl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpLmFkZENsYXNzKCJhY3RpdmUiKX1lbHNle3RoaXMuZG9tRWxlbS5hZGRDbGFzcygiZGlzYWJsZWQgYWN0aXZlIil9fWVsc2V7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCBhY3RpdmUiKX19fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5kb2NzdHJ1Y3R1cmU9ZnVuY3Rpb24oYyxiKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYyxiKTt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt0aGlzLmRvbUVsZW0udG9nZ2xlQ2xhc3MoImFjdGl2ZSIpO2EodGhpcy5ydGUuZG9jLmJvZHkpLnRvZ2dsZUNsYXNzKCJlbC1ydGUtc3RydWN0dXJlIil9O3RoaXMuY29tbWFuZCgpO3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpfX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuZWxmaW5kZXI9ZnVuY3Rpb24oZixjKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZixjKTt2YXIgYj10aGlzO3RoaXMuY29tbWFuZD1mdW5jdGlvbigpe2lmKGIucnRlLm9wdGlvbnMuZm1BbGxvdyYmdHlwZW9mKGIucnRlLm9wdGlvbnMuZm1PcGVuKT09ImZ1bmN0aW9uIil7Yi5ydGUub3B0aW9ucy5mbU9wZW4oZnVuY3Rpb24oZyl7Yi5ydGUubG9nKGcpfSl9fTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe2lmKGIucnRlLm9wdGlvbnMuZm1BbGxvdyYmdHlwZW9mKGIucnRlLm9wdGlvbnMuZm1PcGVuKT09ImZ1bmN0aW9uIil7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpfWVsc2V7dGhpcy5kb21FbGVtLmFkZENsYXNzKCJkaXNhYmxlZCIpfX19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmZsYXNoPWZ1bmN0aW9uKGYsYyl7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGYsYyk7dmFyIGI9dGhpczt0aGlzLnN3Zj1udWxsO3RoaXMucGxhY2Vob2xkZXI9bnVsbDt0aGlzLnNyYz17dXJsOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ1cmwiIC8+JykuY3NzKCJ3aWR0aCIsIjk5JSIpLHR5cGU6YSgnPHNlbGVjdCBuYW1lPSJ0eXBlIi8+JykuYXBwZW5kKCc8b3B0aW9uIHZhbHVlPSJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCI+Rmxhc2g8L29wdGlvbj4nKS5hcHBlbmQoJzxvcHRpb24gdmFsdWU9InZpZGVvL3F1aWNrdGltZSI+UXVpY2t0aW1lIG1vdmllPC9vcHRpb24+JykuYXBwZW5kKCc8b3B0aW9uIHZhbHVlPSJhcHBsaWNhdGlvbi94LW1wbGF5ZXIyIj5XaW5kb3dzIG1lZGlhPC9vcHRpb24+Jyksd2lkdGg6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cigic2l6ZSIsNSkuY3NzKCJ0ZXh0LWFsaWduIiwicmlnaHQiKSxoZWlnaHQ6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cigic2l6ZSIsNSkuY3NzKCJ0ZXh0LWFsaWduIiwicmlnaHQiKSx3bW9kZTphKCI8c2VsZWN0IC8+IikuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoIiIpLnRleHQodGhpcy5ydGUuaTE4bigiTm90IHNldCIsImRpYWxvZ3MiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJ0cmFuc3BhcmVudCIpLnRleHQodGhpcy5ydGUuaTE4bigiVHJhbnNwYXJlbnQiKSkpLGFsaWduOmEoIjxzZWxlY3QgLz4iKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgiIikudGV4dCh0aGlzLnJ0ZS5pMThuKCJOb3Qgc2V0IiwiZGlhbG9ncyIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoImxlZnQiKS50ZXh0KHRoaXMucnRlLmkxOG4oIkxlZnQiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJyaWdodCIpLnRleHQodGhpcy5ydGUuaTE4bigiUmlnaHQiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJ0b3AiKS50ZXh0KHRoaXMucnRlLmkxOG4oIlRvcCIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoInRleHQtdG9wIikudGV4dCh0aGlzLnJ0ZS5pMThuKCJUZXh0IHRvcCIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoIm1pZGRsZSIpLnRleHQodGhpcy5ydGUuaTE4bigibWlkZGxlIikpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgiYmFzZWxpbmUiKS50ZXh0KHRoaXMucnRlLmkxOG4oIkJhc2VsaW5lIikpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgiYm90dG9tIikudGV4dCh0aGlzLnJ0ZS5pMThuKCJCb3R0b20iKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJ0ZXh0LWJvdHRvbSIpLnRleHQodGhpcy5ydGUuaTE4bigiVGV4dCBib3R0b20iKSkpLG1hcmdpbjphKCI8ZGl2IC8+Iil9O3RoaXMuY29tbWFuZD1mdW5jdGlvbigpe3ZhciByPXRoaXMucnRlLnNlbGVjdGlvbi5nZXRFbmQoKSxqLGs9IiIsQj0iIix0PSIiLHYseix4LEEscSxDO3RoaXMucnRlLnNlbGVjdGlvbi5zYXZlSUVSYW5nZSgpO3RoaXMuc3JjLm1hcmdpbi5lbFBhZGRpbmdJbnB1dCh7dHlwZToibWFyZ2luIn0pO3RoaXMucGxhY2Vob2xkZXI9bnVsbDt0aGlzLnN3Zj1udWxsO2lmKGEocikuaGFzQ2xhc3MoImVscnRlLW1lZGlhIikmJihBPWEocikuYXR0cigicmVsIikpJiZ0aGlzLnJ0ZS5maWx0ZXIuc2NyaXB0c1tBXSl7dGhpcy5wbGFjZWhvbGRlcj1hKHIpO3E9dGhpcy5ydGUuZmlsdGVyLnNjcmlwdHNbQV07az0iIjtpZihxLmVtYmVkJiZxLmVtYmVkLnNyYyl7az1xLmVtYmVkLnNyY31pZihxLnBhcmFtcyYmcS5wYXJhbXMubGVuZ3RoKXtsPXEucGFyYW1zLmxlbmd0aDt3aGlsZShsLS0pe2lmKHEucGFyYW1zW2xdLm5hbWU9PSJzcmMifHxxLnBhcmFtc1tsXS5uYW1lPT0ibW92aWUiKXtrPXEucGFyYW1zW2xdLnZhbHVlfX19aWYocS5lbWJlZCl7Qj1xLmVtYmVkLndpZHRofHxwYXJzZUludChxLmVtYmVkLnN0eWxlLndpZHRoKXx8IiI7dD1xLmVtYmVkLmhlaWdodHx8cGFyc2VJbnQocS5lbWJlZC5zdHlsZS5oZWlnaHQpfHwiIjtDPXEuZW1iZWQud21vZGV8fCIifWVsc2V7aWYocS5vYmope0I9cS5vYmoud2lkdGh8fHBhcnNlSW50KHEub2JqLnN0eWxlLndpZHRoKXx8IiI7dD1xLm9iai5oZWlnaHR8fHBhcnNlSW50KHEub2JqLnN0eWxlLmhlaWdodCl8fCIiO0M9cS5vYmoud21vZGV8fCIifX1pZihxLm9iail7dj1xLm9iai5zdHlsZVsiZmxvYXQiXXx8IiI7ej1xLm9iai5zdHlsZVsidmVydGljYWwtYWxpZ24iXXx8IiJ9ZWxzZXtpZihxLmVtYmVkKXt2PXEuZW1iZWQuc3R5bGVbImZsb2F0Il18fCIiO3o9cS5lbWJlZC5zdHlsZVsidmVydGljYWwtYWxpZ24iXXx8IiJ9fXRoaXMuc3JjLm1hcmdpbi52YWwocik7dGhpcy5zcmMudHlwZS52YWwocS5lbWJlZD9xLmVtYmVkLnR5cGU6IiIpfWlmKGEocikuaGFzQ2xhc3MoImVscnRlLXN3Zi1wbGFjZWhvbGRlciIpKXt0aGlzLnBsYWNlaG9sZGVyPWEocik7az1hKHIpLmF0dHIoInJlbCIpO0I9cGFyc2VJbnQoYShyKS5jc3MoIndpZHRoIikpfHwiIjt0PXBhcnNlSW50KGEocikuY3NzKCJoZWlnaHQiKSl8fCIiO3Y9YShyKS5jc3MoImZsb2F0Iik7ej1hKHIpLmNzcygidmVydGljYWwtYWxpZ24iKTt0aGlzLnNyYy5tYXJnaW4udmFsKHIpO3RoaXMuc3JjLndtb2RlLnZhbChhKHIpLmF0dHIoIndtb2RlIikpfXRoaXMuc3JjLnVybC52YWwoayk7dGhpcy5zcmMud2lkdGgudmFsKEIpO3RoaXMuc3JjLmhlaWdodC52YWwodCk7dGhpcy5zcmMuYWxpZ24udmFsKHZ8fHopO3RoaXMuc3JjLndtb2RlLnZhbChDKTt2YXIgaj17cnRsOnRoaXMucnRlLnJ0bCxzdWJtaXQ6ZnVuY3Rpb24oaCxvKXtoLnN0b3BQcm9wYWdhdGlvbigpO2gucHJldmVudERlZmF1bHQoKTtiLnNldCgpO28uY2xvc2UoKX0sZGlhbG9nOnt3aWR0aDo1ODAscG9zaXRpb246InRvcCIsdGl0bGU6dGhpcy5ydGUuaTE4bigiRmxhc2giKX19O3ZhciB4PW5ldyBlbERpYWxvZ0Zvcm0oaik7aWYodGhpcy5ydGUub3B0aW9ucy5mbUFsbG93JiZ0aGlzLnJ0ZS5vcHRpb25zLmZtT3Blbil7dmFyIGc9YSgiPHNwYW4gLz4iKS5hcHBlbmQodGhpcy5zcmMudXJsLmNzcygid2lkdGgiLCI4NSUiKSkuYXBwZW5kKGEoIjxzcGFuIC8+IikuYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIpLmNzcyh7ImZsb2F0IjoicmlnaHQiLCJtYXJnaW4tcmlnaHQiOiIzcHgifSkuYXR0cigidGl0bGUiLGIucnRlLmkxOG4oIk9wZW4gZmlsZSBtYW5nZXIiKSkuYXBwZW5kKGEoIjxzcGFuIC8+IikuYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1mb2xkZXItb3BlbiIpKS5jbGljayhmdW5jdGlvbigpe2IucnRlLm9wdGlvbnMuZm1PcGVuKGZ1bmN0aW9uKGgpe2Iuc3JjLnVybC52YWwoaCkuY2hhbmdlKCl9KX0pLmhvdmVyKGZ1bmN0aW9uKCl7YSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtaG92ZXIiKX0sZnVuY3Rpb24oKXthKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSkpfWVsc2V7dmFyIGc9dGhpcy5zcmMudXJsfXguYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJVUkwiKSxnXSxudWxsLHRydWUpO3guYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJUeXBlIiksdGhpcy5zcmMudHlwZV0sbnVsbCx0cnVlKTt4LmFwcGVuZChbdGhpcy5ydGUuaTE4bigiU2l6ZSIpLGEoIjxzcGFuIC8+IikuYXBwZW5kKHRoaXMuc3JjLndpZHRoKS5hcHBlbmQoIiB4ICIpLmFwcGVuZCh0aGlzLnNyYy5oZWlnaHQpLmFwcGVuZCgiIHB4IildLG51bGwsdHJ1ZSk7eC5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIldtb2RlIiksdGhpcy5zcmMud21vZGVdLG51bGwsdHJ1ZSk7eC5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkFsaWdubWVudCIpLHRoaXMuc3JjLmFsaWduXSxudWxsLHRydWUpO3guYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJNYXJnaW5zIiksdGhpcy5zcmMubWFyZ2luXSxudWxsLHRydWUpO3gub3BlbigpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtiLnNyYy51cmwuZm9jdXMoKX0sMTAwKTt2YXIgdT1hKCI8ZmllbGRzZXQgLz4iKS5hcHBlbmQoYSgiPGxlZ2VuZCAvPiIpLnRleHQodGhpcy5ydGUuaTE4bigiUHJldmlldyIpKSk7eC5hcHBlbmQodSwibWFpbiIpO3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2EocCkuYXR0cigic3JjIiwiIyIpLmFkZENsYXNzKCJlbC1ydGUtcHJldmlldyIpLmFwcGVuZFRvKHUpO2h0bWw9dGhpcy5ydGUub3B0aW9ucy5kb2N0eXBlKyc8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIC8+PC9oZWFkPjxib2R5IHN0eWxlPSJwYWRkaW5nOjA7bWFyZ2luOjA7Zm9udC1zaXplOjlweCI+IFByb2luIGVsaXQgYXJjdSwgcnV0cnVtIGNvbW1vZG8sIHZlaGljdWxhIHRlbXB1cywgY29tbW9kbyBhLCByaXN1cy4gQ3VyYWJpdHVyIG5lYyBhcmN1LiBEb25lYyBzb2xsaWNpdHVkaW4gbWkgc2l0IGFtZXQgbWF1cmlzLiBOYW0gZWxlbWVudHVtIHF1YW0gdWxsYW1jb3JwZXIgYW50ZS4gRXRpYW0gYWxpcXVldCBtYXNzYSBldCBsb3JlbS4gTWF1cmlzIGRhcGlidXMgbGFjdXMgYXVjdG9yIHJpc3VzLiBBZW5lYW4gdGVtcG9yIHVsbGFtY29ycGVyIGxlby4gVml2YW11cyBzZWQgbWFnbmEgcXVpcyBsaWd1bGEgZWxlaWZlbmQgYWRpcGlzY2luZy4gRHVpcyBvcmNpLiBBbGlxdWFtIHNvZGFsZXMgdG9ydG9yIHZpdGFlIGlwc3VtLiBBbGlxdWFtIG51bGxhLiBEdWlzIGFsaXF1YW0gbW9sZXN0aWUgZXJhdC4gVXQgZXQgbWF1cmlzIHZlbCBwZWRlIHZhcml1cyBzb2xsaWNpdHVkaW48L2JvZHk+PC9odG1sPic7cC5jb250ZW50V2luZG93LmRvY3VtZW50Lm9wZW4oKTtwLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoaHRtbCk7cC5jb250ZW50V2luZG93LmRvY3VtZW50LmNsb3NlKCk7dGhpcy5mcmFtZT1wLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7dGhpcy5wcmV2aWV3PWEocC5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHkpO3RoaXMuc3JjLnR5cGUuY2hhbmdlKGZ1bmN0aW9uKCl7Yi5zcmMudXJsLmNoYW5nZSgpfSk7dGhpcy5zcmMud2lkdGguY2hhbmdlKGZ1bmN0aW9uKCl7aWYoYi5zd2Ype3ZhciBoPXBhcnNlSW50KGEodGhpcykudmFsKCkpfHwiIjthKHRoaXMpLnZhbChoKTtiLnN3Zi5jc3MoIndpZHRoIixoKTtiLnN3Zi5jaGlsZHJlbigiZW1iZWQiKS5jc3MoIndpZHRoIixoKX1lbHNle2EodGhpcykudmFsKCIiKX19KTt0aGlzLnNyYy5oZWlnaHQuY2hhbmdlKGZ1bmN0aW9uKCl7aWYoYi5zd2Ype3ZhciBvPXBhcnNlSW50KGEodGhpcykudmFsKCkpfHwiIjthKHRoaXMpLnZhbChvKTtiLnN3Zi5jc3MoImhlaWdodCIsbyk7Yi5zd2YuY2hpbGRyZW4oImVtYmVkIikuY3NzKCJoZWlnaHQiLG8pfWVsc2V7YSh0aGlzKS52YWwoIiIpfX0pO3RoaXMuc3JjLndtb2RlLmNoYW5nZShmdW5jdGlvbigpe2lmKGIuc3dmKXt2YXIgaD1hKHRoaXMpLnZhbCgpO2lmKGgpe2Iuc3dmLmF0dHIoIndtb2RlIixoKTtiLnN3Zi5jaGlsZHJlbigiZW1iZWQiKS5hdHRyKCJ3bW9kZSIsaCl9ZWxzZXtiLnN3Zi5yZW1vdmVBdHRyKCJ3bW9kZSIpO2Iuc3dmLmNoaWxkcmVuKCJlbWJlZCIpLnJlbW92ZUF0dHIoIndtb2RlIil9fX0pO3RoaXMuc3JjLmFsaWduLmNoYW5nZShmdW5jdGlvbigpe3ZhciBoPWEodGhpcykudmFsKCksbz1oPT0ibGVmdCJ8fGg9PSJyaWdodCI7aWYoYi5zd2Ype2Iuc3dmLmNzcyh7ImZsb2F0IjpvP2g6IiIsInZlcnRpY2FsLWFsaWduIjpvPyIiOmh9KX1lbHNle2EodGhpcykudmFsKCIiKX19KTt0aGlzLnNyYy5tYXJnaW4uY2hhbmdlKGZ1bmN0aW9uKCl7aWYoYi5zd2Ype3ZhciBoPWIuc3JjLm1hcmdpbi52YWwoKTtpZihoLmNzcyl7Yi5zd2YuY3NzKCJtYXJnaW4iLGguY3NzKX1lbHNle2Iuc3dmLmNzcygibWFyZ2luLXRvcCIsaC50b3ApO2Iuc3dmLmNzcygibWFyZ2luLXJpZ2h0IixoLnJpZ2h0KTtiLnN3Zi5jc3MoIm1hcmdpbi1ib3R0b20iLGguYm90dG9tKTtiLnN3Zi5jc3MoIm1hcmdpbi1sZWZ0IixoLmxlZnQpfX19KTt0aGlzLnNyYy51cmwuY2hhbmdlKGZ1bmN0aW9uKCl7dmFyIGg9Yi5ydGUudXRpbHMuYWJzb2x1dGVVUkwoYSh0aGlzKS52YWwoKSksbyx3O2lmKGgpe289Yi5ydGUudXRpbHMubWVkaWFJbmZvKGIuc3JjLnR5cGUudmFsKCkpO2lmKCFvKXtvPWIucnRlLnV0aWwubWVkaWFJbmZvKCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpfXc9JzxvYmplY3QgY2xhc3NpZD0iJytvLmNsYXNzaWQrJyIgY29kZWJhc2U9Iicrby5jb2RlYmFzZSsnIj48cGFyYW0gbmFtZT0ic3JjIiB2YWx1ZT0iJytoKyciIC8+PGVtYmVkIHF1YWxpdHk9ImhpZ2giIHNyYz0iJytoKyciIHR5cGU9Iicrby50eXBlKyciPjwvb2JqZWN0Pic7Yi5wcmV2aWV3LmNoaWxkcmVuKCJvYmplY3QiKS5yZW1vdmUoKS5lbmQoKS5wcmVwZW5kKHcpO2Iuc3dmPWIucHJldmlldy5jaGlsZHJlbigib2JqZWN0IikuZXEoMCl9ZWxzZXtpZihiLnN3Zil7Yi5zd2YucmVtb3ZlKCk7Yi5zd2Y9bnVsbH19Yi5zcmMud2lkdGgudHJpZ2dlcigiY2hhbmdlIik7Yi5zcmMuaGVpZ2h0LnRyaWdnZXIoImNoYW5nZSIpO2Iuc3JjLmFsaWduLnRyaWdnZXIoImNoYW5nZSIpfSkudHJpZ2dlcigiY2hhbmdlIil9O3RoaXMuc2V0PWZ1bmN0aW9uKCl7Yi5zd2Y9bnVsbDt2YXIgZz10aGlzLnJ0ZS51dGlscy5hYnNvbHV0ZVVSTCh0aGlzLnNyYy51cmwudmFsKCkpLEI9cGFyc2VJbnQodGhpcy5zcmMud2lkdGgudmFsKCkpfHwiIix0PXBhcnNlSW50KHRoaXMuc3JjLmhlaWdodC52YWwoKSl8fCIiLEM9dGhpcy5zcmMud21vZGUudmFsKCksej10aGlzLnNyYy5hbGlnbi52YWwoKSx2PXo9PSJsZWZ0Inx8ej09InJpZ2h0Ij96OiIiLEE9dGhpcy5wbGFjZWhvbGRlcj90aGlzLnBsYWNlaG9sZGVyLmF0dHIoInJlbCIpOiIiLHAsayx4LHE9dGhpcy5zcmMubWFyZ2luLnZhbCgpLHI7aWYoIWcpe2lmKHRoaXMucGxhY2Vob2xkZXIpe3RoaXMucGxhY2Vob2xkZXIucmVtb3ZlKCk7ZGVsZXRlIHRoaXMucnRlLmZpbHRlci5zY3JpcHRzW0FdfX1lbHNle2k9Yi5ydGUudXRpbHMubWVkaWFJbmZvKGIuc3JjLnR5cGUudmFsKCkpO2lmKCFpKXtpPWIucnRlLnV0aWwubWVkaWFJbmZvKCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpfXg9dGhpcy5ydGUuZmlsdGVyLnZpZGVvSG9zdFJlZ0V4cC50ZXN0KGcpP2cucmVwbGFjZSh0aGlzLnJ0ZS5maWx0ZXIudmlkZW9Ib3N0UmVnRXhwLCIkMiIpOmkudHlwZS5yZXBsYWNlKC9eXHcrXC8oLispLywiJDEiKTtwPXtvYmo6e2NsYXNzaWQ6aS5jbGFzc2lkWzBdLGNvZGViYXNlOmkuY29kZWJhc2Usc3R5bGU6e319LHBhcmFtczpbe25hbWU6InNyYyIsdmFsdWU6Z31dLGVtYmVkOntzcmM6Zyx0eXBlOmkudHlwZSxxdWFsaXR5OiJoaWdoIix3bW9kZTpDLHN0eWxlOnt9fX07aWYoQil7cC5vYmoud2lkdGg9QjtwLmVtYmVkLndpZHRoPUJ9aWYodCl7cC5vYmouaGVpZ2h0PXQ7cC5lbWJlZC5oZWlnaHQ9dH1pZih2KXtwLm9iai5zdHlsZVsiZmxvYXQiXT12fWVsc2V7aWYoeil7cC5vYmouc3R5bGVbInZlcnRpY2FsLWFsaWduIl09en19aWYocS5jc3Mpe3I9e21hcmdpbjpxLmNzc319ZWxzZXtyPXsibWFyZ2luLXRvcCI6cS50b3AsIm1hcmdpbi1yaWdodCI6cS5yaWdodCwibWFyZ2luLWJvdHRvbSI6cS5ib3R0b20sIm1hcmdpbi1sZWZ0IjpxLmxlZnR9fXAub2JqLnN0eWxlPWEuZXh0ZW5kKHt9LHAub2JqLnN0eWxlLHIpO2lmKHRoaXMucGxhY2Vob2xkZXImJkEpe2s9dGhpcy5ydGUuZmlsdGVyLnNjcmlwdHNbQV18fHt9O3A9YS5leHRlbmQodHJ1ZSxrLHApO2RlbGV0ZSBwLm9iai5zdHlsZS53aWR0aDtkZWxldGUgcC5vYmouc3R5bGUuaGVpZ2h0O2RlbGV0ZSBwLmVtYmVkLnN0eWxlLndpZHRoO2RlbGV0ZSBwLmVtYmVkLnN0eWxlLmhlaWdodDt0aGlzLnJ0ZS5maWx0ZXIuc2NyaXB0c1tBXT1wO3RoaXMucGxhY2Vob2xkZXIucmVtb3ZlQXR0cigiY2xhc3MiKX1lbHNle3ZhciBqPSJtZWRpYSIrTWF0aC5yYW5kb20oKS50b1N0cmluZygpLnN1YnN0cmluZygyKTt0aGlzLnJ0ZS5maWx0ZXIuc2NyaXB0c1tqXT1wO3RoaXMucGxhY2Vob2xkZXI9YSh0aGlzLnJ0ZS5kb20uY3JlYXRlKCJpbWciKSkuYXR0cigicmVsIixqKS5hdHRyKCJzcmMiLHRoaXMucnRlLmZpbHRlci51cmwrInBpeGVsLmdpZiIpO3ZhciB1PXRydWV9dGhpcy5wbGFjZWhvbGRlci5hdHRyKCJ0aXRsZSIsdGhpcy5ydGUudXRpbHMuZW5jb2RlKGcpKS5hdHRyKCJ3aWR0aCIsQnx8MTUwKS5hdHRyKCJoZWlnaHQiLHR8fDEwMCkuYWRkQ2xhc3MoImVscnRlLXByb3RlY3RlZCBlbHJ0ZS1tZWRpYSBlbHJ0ZS1tZWRpYS0iK3gpLmNzcyhwLm9iai5zdHlsZSk7aWYodil7dGhpcy5wbGFjZWhvbGRlci5jc3MoImZsb2F0Iix2KS5jc3MoInZlcnRpY2FsLWFsaWduIiwiIil9ZWxzZXtpZih6KXt0aGlzLnBsYWNlaG9sZGVyLmNzcygiZmxvYXQiLCIiKS5jc3MoInZlcnRpY2FsLWFsaWduIix6KX1lbHNle3RoaXMucGxhY2Vob2xkZXIuY3NzKCJmbG9hdCIsIiIpLmNzcygidmVydGljYWwtYWxpZ24iLCIiKX19aWYodSl7dGhpcy5ydGUud2luZG93LmZvY3VzKCk7dGhpcy5ydGUuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7dGhpcy5ydGUuc2VsZWN0aW9uLmluc2VydE5vZGUodGhpcy5wbGFjZWhvbGRlci5nZXQoMCkpfX19O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpO3ZhciBnPXRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7dGhpcy5kb21FbGVtLnRvZ2dsZUNsYXNzKCJhY3RpdmUiLGcmJmcubm9kZU5hbWU9PSJJTUciJiZhKGcpLmhhc0NsYXNzKCJlbHJ0ZS1tZWRpYSIpKX19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmZvbnRuYW1lPWZ1bmN0aW9uKGYsYyl7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGYsYyk7dmFyIGI9dGhpczt2YXIgZz17dHBsOic8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JXZhbCI+JWxhYmVsPC9zcGFuPicsc2VsZWN0OmZ1bmN0aW9uKGgpe2Iuc2V0KGgpfSxzcmM6eyIiOnRoaXMucnRlLmkxOG4oIkZvbnQiKSwiYW5kYWxlIG1vbm8sc2Fucy1zZXJpZiI6IkFuZGFsZSBNb25vIiwiYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWYiOiJBcmlhbCIsImFyaWFsIGJsYWNrLGdhZGdldCxzYW5zLXNlcmlmIjoiQXJpYWwgQmxhY2siLCJib29rIGFudGlxdWEscGFsYXRpbm8sc2Fucy1zZXJpZiI6IkJvb2sgQW50aXF1YSIsImNvbWljIHNhbnMgbXMsY3Vyc2l2ZSI6IkNvbWljIFNhbnMgTVMiLCJjb3VyaWVyIG5ldyxjb3VyaWVyLG1vbm9zcGFjZSI6IkNvdXJpZXIgTmV3IiwiZ2VvcmdpYSxwYWxhdGlubyxzZXJpZiI6Ikdlb3JnaWEiLCJoZWx2ZXRpY2Esc2Fucy1zZXJpZiI6IkhlbHZldGljYSIsImltcGFjdCxzYW5zLXNlcmlmIjoiSW1wYWN0IiwibHVjaWRhIGNvbnNvbGUsbW9uYWNvLG1vbm9zcGFjZSI6Ikx1Y2lkYSBjb25zb2xlIiwibHVjaWRhIHNhbnMgdW5pY29kZSxsdWNpZGEgZ3JhbmRlLHNhbnMtc2VyaWYiOiJMdWNpZGEgZ3JhbmRlIiwidGFob21hLHNhbnMtc2VyaWYiOiJUYWhvbWEiLCJ0aW1lcyBuZXcgcm9tYW4sdGltZXMsc2VyaWYiOiJUaW1lcyBOZXcgUm9tYW4iLCJ0cmVidWNoZXQgbXMsbHVjaWRhIGdyYW5kZSx2ZXJkYW5hLHNhbnMtc2VyaWYiOiJUcmVidWNoZXQgTVMiLCJ2ZXJkYW5hLGdlbmV2YSxzYW5zLXNlcmlmIjoiVmVyZGFuYSJ9fTt0aGlzLnNlbGVjdD10aGlzLmRvbUVsZW0uZWxTZWxlY3QoZyk7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7fTt0aGlzLnNldD1mdW5jdGlvbihqKXt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpO3ZhciBoPXRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7ZmlsdGVyOiJ0ZXh0Q29udGFpbnNOb2RlcyJ9KTthLmVhY2goaCxmdW5jdGlvbigpeyR0aGlzPS9eKFRIRUFEfFRGT09UfFRCT0RZfENPTHxDT0xHUk9VUHxUUikkLy50ZXN0KHRoaXMubm9kZU5hbWUpP2EodGhpcykuZmluZCgidGQsdGgiKTphKHRoaXMpO2EodGhpcykuY3NzKCJmb250LWZhbWlseSIsaikuZmluZCgiW3N0eWxlXSIpLmNzcygiZm9udC1mYW1pbHkiLCIiKX0pO3RoaXMucnRlLnVpLnVwZGF0ZSgpfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKTt2YXIgaj10aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpO2lmKGoubm9kZVR5cGUhPTEpe2o9ai5wYXJlbnROb2RlfXZhciBoPWEoaikuY3NzKCJmb250LWZhbWlseSIpO2g9aD9oLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8sXHMrL2csIiwiKS5yZXBsYWNlKC8nfCIvZywiIik6IiI7dGhpcy5zZWxlY3QudmFsKGcuc3JjW2hdP2g6IiIpfX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuZm9udHNpemU9ZnVuY3Rpb24oZixjKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZixjKTt2YXIgYj10aGlzO3ZhciBnPXtsYWJlbFRwbDoiJWxhYmVsIix0cGw6JzxzcGFuIHN0eWxlPSJmb250LXNpemU6JXZhbDtsaW5lLWhlaWdodDoxLjJlbSI+JWxhYmVsPC9zcGFuPicsc2VsZWN0OmZ1bmN0aW9uKGgpe2Iuc2V0KGgpfSxzcmM6eyIiOnRoaXMucnRlLmkxOG4oIkZvbnQgc2l6ZSIpLCJ4eC1zbWFsbCI6dGhpcy5ydGUuaTE4bigiU21hbGwgKDhwdCkiKSwieC1zbWFsbCI6dGhpcy5ydGUuaTE4bigiU21hbGwgKDEwcHgpIiksc21hbGw6dGhpcy5ydGUuaTE4bigiU21hbGwgKDEycHQpIiksbWVkaXVtOnRoaXMucnRlLmkxOG4oIk5vcm1hbCAoMTRwdCkiKSxsYXJnZTp0aGlzLnJ0ZS5pMThuKCJMYXJnZSAoMThwdCkiKSwieC1sYXJnZSI6dGhpcy5ydGUuaTE4bigiTGFyZ2UgKDI0cHQpIiksInh4LWxhcmdlIjp0aGlzLnJ0ZS5pMThuKCJMYXJnZSAoMzZwdCkiKX19O3RoaXMuc2VsZWN0PXRoaXMuZG9tRWxlbS5lbFNlbGVjdChnKTt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt9O3RoaXMuc2V0PWZ1bmN0aW9uKGope3RoaXMucnRlLmhpc3RvcnkuYWRkKCk7dmFyIGg9dGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdGVkKHtmaWx0ZXI6InRleHRDb250YWluc05vZGVzIn0pO2EuZWFjaChoLGZ1bmN0aW9uKCl7JHRoaXM9L14oVEhFQUR8VEZPT1R8VEJPRFl8Q09MfENPTEdST1VQfFRSKSQvLnRlc3QodGhpcy5ub2RlTmFtZSk/YSh0aGlzKS5maW5kKCJ0ZCx0aCIpOmEodGhpcyk7JHRoaXMuY3NzKCJmb250LXNpemUiLGopLmZpbmQoIltzdHlsZV0iKS5jc3MoImZvbnQtc2l6ZSIsIiIpfSk7dGhpcy5ydGUudWkudXBkYXRlKCl9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpO3ZhciBoPXRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7dGhpcy5zZWxlY3QudmFsKChtPXRoaXMucnRlLmRvbS5hdHRyKGgsInN0eWxlIikubWF0Y2goL2ZvbnQtc2l6ZTpccyooW147XSspL2kpKT9tWzFdOiIiKX19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmZvcmVjb2xvcj1mdW5jdGlvbihmLGMpe3ZhciBiPXRoaXM7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGYsYyk7dmFyIGc9eyJjbGFzcyI6IiIsY29sb3I6dGhpcy5kZWZhdWx0Q29sb3IsdXBkYXRlOmZ1bmN0aW9uKGgpe2IuaW5kaWNhdG9yLmNzcygiYmFja2dyb3VuZC1jb2xvciIsaCl9LGNoYW5nZTpmdW5jdGlvbihoKXtiLnNldChoKX19O3RoaXMuZGVmYXVsdENvbG9yPXRoaXMubmFtZT09ImZvcmVjb2xvciI/IiMwMDAwMDAiOiIjZmZmZmZmIjt0aGlzLnBpY2tlcj10aGlzLmRvbUVsZW0uZWxDb2xvclBpY2tlcihnKTt0aGlzLmluZGljYXRvcj1hKCI8ZGl2IC8+IikuYWRkQ2xhc3MoImNvbG9yLWluZGljYXRvciIpLnByZXBlbmRUbyh0aGlzLmRvbUVsZW0pO3RoaXMuY29tbWFuZD1mdW5jdGlvbigpe307dGhpcy5zZXQ9ZnVuY3Rpb24oayl7aWYoIXRoaXMucnRlLnNlbGVjdGlvbi5jb2xsYXBzZWQoKSl7dGhpcy5ydGUuaGlzdG9yeS5hZGQoKTt2YXIgaD10aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoe2NvbGxhcHNlOmZhbHNlLHdyYXA6InRleHQifSksaj10aGlzLm5hbWU9PSJmb3JlY29sb3IiPyJjb2xvciI6ImJhY2tncm91bmQtY29sb3IiO2EuZWFjaChoLGZ1bmN0aW9uKCl7aWYoL14oVEhFQUR8VEJPRFl8VEZPT1R8VFIpJC8udGVzdCh0aGlzLm5vZGVOYW1lKSl7YSh0aGlzKS5maW5kKCJ0ZCx0aCIpLmVhY2goZnVuY3Rpb24oKXthKHRoaXMpLmNzcyhqLGspLmZpbmQoIioiKS5jc3MoaiwiIil9KX1lbHNle2EodGhpcykuY3NzKGosaykuZmluZCgiKiIpLmNzcyhqLCIiKX19KTt0aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSl9fTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKTt2YXIgaD10aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpO3RoaXMucGlja2VyLnZhbCh0aGlzLnJ0ZS51dGlscy5yZ2IyaGV4KGEoaC5ub2RlVHlwZSE9MT9oLnBhcmVudE5vZGU6aCkuY3NzKHRoaXMubmFtZT09ImZvcmVjb2xvciI/ImNvbG9yIjoiYmFja2dyb3VuZC1jb2xvciIpKXx8dGhpcy5kZWZhdWx0Q29sb3IpfX07ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmhpbGl0ZWNvbG9yPWVsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5mb3JlY29sb3J9KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuZm9ybWF0YmxvY2s9ZnVuY3Rpb24oZixjKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZixjKTt2YXIgaD10aGlzLnJ0ZS5icm93c2VyLm1zaWU/ZnVuY3Rpb24oail7Yi52YWw9ajtiLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb21tYW5kLmNhbGwoYil9OmZ1bmN0aW9uKGope2IuaWVDb21tYW5kKGopfTt2YXIgYj10aGlzO3ZhciBnPXtsYWJlbFRwbDoiJWxhYmVsIix0cGxzOnsiIjoiJWxhYmVsIn0sc2VsZWN0OmZ1bmN0aW9uKGope2IuZm9ybWF0QmxvY2soail9LHNyYzp7c3Bhbjp0aGlzLnJ0ZS5pMThuKCJGb3JtYXQiKSxoMTp0aGlzLnJ0ZS5pMThuKCJIZWFkaW5nIDEiKSxoMjp0aGlzLnJ0ZS5pMThuKCJIZWFkaW5nIDIiKSxoMzp0aGlzLnJ0ZS5pMThuKCJIZWFkaW5nIDMiKSxoNDp0aGlzLnJ0ZS5pMThuKCJIZWFkaW5nIDQiKSxoNTp0aGlzLnJ0ZS5pMThuKCJIZWFkaW5nIDUiKSxoNjp0aGlzLnJ0ZS5pMThuKCJIZWFkaW5nIDYiKSxwOnRoaXMucnRlLmkxOG4oIlBhcmFncmFwaCIpLGFkZHJlc3M6dGhpcy5ydGUuaTE4bigiQWRkcmVzcyIpLHByZTp0aGlzLnJ0ZS5pMThuKCJQcmVmb3JtYXR0ZWQiKSxkaXY6dGhpcy5ydGUuaTE4bigiTm9ybWFsIChESVYpIil9fTt0aGlzLnNlbGVjdD10aGlzLmRvbUVsZW0uZWxTZWxlY3QoZyk7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7fTt0aGlzLmZvcm1hdEJsb2NrPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHQoeix2KXtmdW5jdGlvbiB4KEEpe2EoQSkuZmluZCgiaDEsaDIsaDMsaDQsaDUsaDYscCxhZGRyZXNzLHByZSIpLmVhY2goZnVuY3Rpb24oKXthKHRoaXMpLnJlcGxhY2VXaXRoKGEodGhpcykuaHRtbCgpKX0pO3JldHVybiBBfWlmKC9eKExJfERUfEREfFREfFRIfENBUFRJT04pJC8udGVzdCh6Lm5vZGVOYW1lKSl7IWIucnRlLmRvbS5pc0VtcHR5KHopJiZiLnJ0ZS5kb20ud3JhcENvbnRlbnRzKHgoeiksdil9ZWxzZXtpZigvXihVTHxPTHxETHxUQUJMRSkkLy50ZXN0KHoubm9kZU5hbWUpKXtiLnJ0ZS5kb20ud3JhcCh6LHYpfWVsc2V7IWIucnRlLmRvbS5pc0VtcHR5KHopJiZhKHgoeikpLnJlcGxhY2VXaXRoKGEoYi5ydGUuZG9tLmNyZWF0ZSh2KSkuaHRtbChhKHopLmh0bWwoKSkpfX19dGhpcy5ydGUuaGlzdG9yeS5hZGQoKTt2YXIgdz11LnRvVXBwZXJDYXNlKCkscCxvLHIscT10aGlzLnJ0ZS5zZWxlY3Rpb24uY29sbGFwc2VkKCksaz10aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoKSxqPXRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7Y29sbGFwc2VkOnRydWUsYmxvY2tzOnRydWUsZmlsdGVyOiJ0ZXh0Q29udGFpbnNOb2RlcyIsd3JhcDoiaW5saW5lIix0YWc6InNwYW4ifSk7bD1qLmxlbmd0aCxzPWEoalswXSkucHJldigpLGU9YShqW2oubGVuZ3RoLTFdKS5uZXh0KCk7d2hpbGUobC0tKXtvPWpbbF07cj1hKG8pO2lmKHc9PSJESVYifHx3PT0iU1BBTiIpe2lmKC9eKEhbMS02XXxQfEFERFJFU1N8UFJFKSQvLnRlc3Qoby5ub2RlTmFtZSkpe3IucmVwbGFjZVdpdGgoYSh0aGlzLnJ0ZS5kb20uY3JlYXRlKCJkaXYiKSkuaHRtbChyLmh0bWwoKXx8IiIpKX19ZWxzZXtpZigvXihUSEVBRHxUQk9EWXxURk9PVHxUUikkLy50ZXN0KG8ubm9kZU5hbWUpKXtyLmZpbmQoInRkLHRoIikuZWFjaChmdW5jdGlvbigpe3QodGhpcyx3KX0pfWVsc2V7aWYoby5ub2RlTmFtZSE9dyl7dChvLHcpfX19fXRoaXMucnRlLnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhrKTt0aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSl9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpO3ZhciBqPXRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwvXihIWzEtNl18UHxBRERSRVNTfFBSRSkkLyk7dGhpcy5zZWxlY3QudmFsKGo/ai5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOiJzcGFuIil9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5mdWxsc2NyZWVuPWZ1bmN0aW9uKGcsZil7dmFyIGI9dGhpczt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZyxmKTt0aGlzLmFjdGl2ZT10cnVlO3RoaXMuZWRpdG9yPWcuZWRpdG9yO3RoaXMud3o9Zy53b3Jrem9uZTt0aGlzLmhlaWdodD0wO3RoaXMuZGVsdGE9MDt0aGlzLl9jbGFzcz0iZWwtZnVsbHNjcmVlbiI7c2V0VGltZW91dChmdW5jdGlvbigpe2IuaGVpZ2h0PWIud3ouaGVpZ2h0KCk7Yi5kZWx0YT1iLmVkaXRvci5vdXRlckhlaWdodCgpLWIuaGVpZ2h0fSw1MCk7ZnVuY3Rpb24gYygpe2Iud3ouaGVpZ2h0KGEod2luZG93KS5oZWlnaHQoKS1iLmRlbHRhKTtiLnJ0ZS51cGRhdGVIZWlnaHQoKX10aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt2YXIgQj1hKHdpbmRvdyksdT10aGlzLmVkaXRvcixrPXUucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbihoLHApe3JldHVybiAhL14oaHRtbHxib2R5KSQvaS50ZXN0KHAubm9kZU5hbWUpJiZhKHApLmNzcygicG9zaXRpb24iKT09InJlbGF0aXZlIn0pLHE9dGhpcy53eix6PXRoaXMuX2NsYXNzLHQ9dS5oYXNDbGFzcyh6KSxqPXRoaXMucnRlLEM9dGhpcy5ydGUuc2VsZWN0aW9uLG89YS5icm93c2VyLm1vemlsbGEsQSxyO2Z1bmN0aW9uIHgoKXtpZihvKXtBPUMuZ2V0Qm9va21hcmsoKX19ZnVuY3Rpb24gdigpe2lmKG8pe2Iud3ouY2hpbGRyZW4oKS50b2dnbGUoKTtiLnJ0ZS5zb3VyY2UuZm9jdXMoKTtiLnd6LmNoaWxkcmVuKCkudG9nZ2xlKCk7Qy5tb3ZlVG9Cb29rbWFyayhBKX19eCgpO2suY3NzKCJwb3NpdGlvbiIsdD8icmVsYXRpdmUiOiJzdGF0aWMiKTtpZih0KXt1LnJlbW92ZUNsYXNzKHopO3EuaGVpZ2h0KHRoaXMuaGVpZ2h0KTtCLnVuYmluZCgicmVzaXplIixjKTt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpfWVsc2V7dS5hZGRDbGFzcyh6KS5yZW1vdmVBdHRyKCJzdHlsZSIpO3EuaGVpZ2h0KEIuaGVpZ2h0KCktdGhpcy5kZWx0YSkuY3NzKCJ3aWR0aCIsIjEwMCUiKTtCLmJpbmQoInJlc2l6ZSIsYyk7dGhpcy5kb21FbGVtLmFkZENsYXNzKCJhY3RpdmUiKX1qLnVwZGF0ZUhlaWdodCgpO2oucmVzaXphYmxlKHQpO3YoKX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIil9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5ob3Jpem9udGFscnVsZT1mdW5jdGlvbihmLGMpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxmLGMpO3ZhciBiPXRoaXM7dGhpcy5zcmM9e3dpZHRoOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoe25hbWU6IndpZHRoIixzaXplOjR9KS5jc3MoInRleHQtYWxpZ24iLCJyaWdodCIpLHd1bml0OmEoIjxzZWxlY3QgLz4iKS5hdHRyKCJuYW1lIiwid3VuaXQiKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgiJSIpLnRleHQoIiUiKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoInB4IikudGV4dCgicHgiKSkudmFsKCIlIiksaGVpZ2h0OmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoe25hbWU6ImhlaWdodCIsc2l6ZTo0fSkuY3NzKCJ0ZXh0LWFsaWduIiwicmlnaHQiKSxiZzphKCI8ZGl2IC8+IiksYm9yZGVyOmEoIjxkaXYgLz4iKSwiY2xhc3MiOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmNzcygid2lkdGgiLCIxMDAlIiksc3R5bGU6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuY3NzKCJ3aWR0aCIsIjEwMCUiKX07dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dGhpcy5zcmMuYmcuZWxDb2xvclBpY2tlcih7cGFsZXR0ZVBvc2l0aW9uOiJvdXRlciIsImNsYXNzIjoiZWwtY29sb3JwaWNrZXIgdWktaWNvbiB1aS1pY29uLXBlbmNpbCJ9KTt2YXIgaz10aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0RW5kKCk7dGhpcy5ocj1rLm5vZGVOYW1lPT0iSFIiP2Eoayk6YShmLmRvYy5jcmVhdGVFbGVtZW50KCJociIpKS5jc3Moe3dpZHRoOiIxMDAlIixoZWlnaHQ6IjFweCJ9KTt0aGlzLnNyYy5ib3JkZXIuZWxCb3JkZXJTZWxlY3Qoe3N0eWxlSGVpZ2h0OjczLHZhbHVlOnRoaXMuaHJ9KTt2YXIgZz10aGlzLmhyLmNzcygid2lkdGgiKXx8dGhpcy5oci5hdHRyKCJ3aWR0aCIpO3RoaXMuc3JjLndpZHRoLnZhbChwYXJzZUludChnKXx8MTAwKTt0aGlzLnNyYy53dW5pdC52YWwoZy5pbmRleE9mKCJweCIpIT0tMT8icHgiOiIlIik7dGhpcy5zcmMuaGVpZ2h0LnZhbCh0aGlzLnJ0ZS51dGlscy50b1BpeGVscyh0aGlzLmhyLmNzcygiaGVpZ2h0Iil8fHRoaXMuaHIuYXR0cigiaGVpZ2h0IikpfHwxKTt0aGlzLnNyYy5iZy52YWwodGhpcy5ydGUudXRpbHMuY29sb3IySGV4KHRoaXMuaHIuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIikpKTt0aGlzLnNyY1siY2xhc3MiXS52YWwodGhpcy5ydGUuZG9tLmF0dHIodGhpcy5ociwiY2xhc3MiKSk7dGhpcy5zcmMuc3R5bGUudmFsKHRoaXMucnRlLmRvbS5hdHRyKHRoaXMuaHIsInN0eWxlIikpO3ZhciBoPXtydGw6dGhpcy5ydGUucnRsLHN1Ym1pdDpmdW5jdGlvbihvLHApe28uc3RvcFByb3BhZ2F0aW9uKCk7by5wcmV2ZW50RGVmYXVsdCgpO2Iuc2V0KCk7cC5jbG9zZSgpfSxkaWFsb2c6e3RpdGxlOnRoaXMucnRlLmkxOG4oIkhvcml6b250YWwgcnVsZSIpfX07dmFyIGo9bmV3IGVsRGlhbG9nRm9ybShoKTtqLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiV2lkdGgiKSxhKCI8c3BhbiAvPiIpLmFwcGVuZCh0aGlzLnNyYy53aWR0aCkuYXBwZW5kKHRoaXMuc3JjLnd1bml0KV0sbnVsbCx0cnVlKS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkhlaWdodCIpLGEoIjxzcGFuIC8+IikuYXBwZW5kKHRoaXMuc3JjLmhlaWdodCkuYXBwZW5kKCIgcHgiKV0sbnVsbCx0cnVlKS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkJvcmRlciIpLHRoaXMuc3JjLmJvcmRlcl0sbnVsbCx0cnVlKS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkJhY2tncm91bmQiKSx0aGlzLnNyYy5iZ10sbnVsbCx0cnVlKS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkNzcyBjbGFzcyIpLHRoaXMuc3JjWyJjbGFzcyJdXSxudWxsLHRydWUpLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiQ3NzIHN0eWxlIiksdGhpcy5zcmMuc3R5bGVdLG51bGwsdHJ1ZSkub3BlbigpfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKTtpZih0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0RW5kKCkubm9kZU5hbWU9PSJIUiIpe3RoaXMuZG9tRWxlbS5hZGRDbGFzcygiYWN0aXZlIil9ZWxzZXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpfX07dGhpcy5zZXQ9ZnVuY3Rpb24oKXt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpOyF0aGlzLmhyLnBhcmVudE5vZGUmJnRoaXMucnRlLnNlbGVjdGlvbi5pbnNlcnROb2RlKHRoaXMuaHIuZ2V0KDApKTt2YXIgaD17bm9zaGFkZTp0cnVlLHN0eWxlOnRoaXMuc3JjLnN0eWxlLnZhbCgpfTt2YXIgZz10aGlzLnNyYy5ib3JkZXIudmFsKCk7dmFyIGo9e3dpZHRoOihwYXJzZUludCh0aGlzLnNyYy53aWR0aC52YWwoKSl8fDEwMCkrdGhpcy5zcmMud3VuaXQudmFsKCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuc3JjLmhlaWdodC52YWwoKSl8fDEsImJhY2tncm91bmQtY29sb3IiOnRoaXMuc3JjLmJnLnZhbCgpLGJvcmRlcjpnLndpZHRoJiZnLnN0eWxlP2cud2lkdGgrIiAiK2cuc3R5bGUrIiAiK2cuY29sb3I6IiJ9O3RoaXMuaHIucmVtb3ZlQXR0cigiY2xhc3MiKS5yZW1vdmVBdHRyKCJzdHlsZSIpLnJlbW92ZUF0dHIoIndpZHRoIikucmVtb3ZlQXR0cigiaGVpZ2h0IikucmVtb3ZlQXR0cigiYWxpZ24iKS5hdHRyKGgpLmNzcyhqKTtpZih0aGlzLnNyY1siY2xhc3MiXS52YWwoKSl7dGhpcy5oci5hdHRyKCJjbGFzcyIsdGhpcy5zcmNbImNsYXNzIl0udmFsKCkpfXRoaXMucnRlLnVpLnVwZGF0ZSgpfX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuaW1hZ2U9ZnVuY3Rpb24oZixjKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZixjKTt2YXIgYj10aGlzO3RoaXMuaW1nPW51bGw7dGhpcy5pbml0PWZ1bmN0aW9uKCl7dGhpcy5sYWJlbHM9e21haW46IlByb3BlcmllcyIsbGluazoiTGluayIsYWR2OiJBZHZhbmNlZCIsZXZlbnRzOiJFdmVudHMiLGlkOiJJRCIsImNsYXNzIjoiQ3NzIGNsYXNzIixzdHlsZToiQ3NzIHN0eWxlIixsb25nZGVzYzoiRGV0YWlsIGRlc2NyaXB0aW9uIFVSTCIsaHJlZjoiVVJMIix0YXJnZXQ6Ik9wZW4gaW4iLHRpdGxlOiJUaXRsZSJ9O3RoaXMuc3JjPXttYWluOntzcmM6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuY3NzKCJ3aWR0aCIsIjEwMCUiKSx0aXRsZTphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoIndpZHRoIiwiMTAwJSIpLGFsdDphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoIndpZHRoIiwiMTAwJSIpLHdpZHRoOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoInNpemUiLDUpLmNzcygidGV4dC1hbGlnbiIsInJpZ2h0IiksaGVpZ2h0OmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoInNpemUiLDUpLmNzcygidGV4dC1hbGlnbiIsInJpZ2h0IiksbWFyZ2luOmEoIjxkaXYgLz4iKSxhbGlnbjphKCI8c2VsZWN0IC8+IikuY3NzKCJ3aWR0aCIsIjEwMCUiKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgiIikudGV4dCh0aGlzLnJ0ZS5pMThuKCJOb3Qgc2V0IiwiZGlhbG9ncyIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoImxlZnQiKS50ZXh0KHRoaXMucnRlLmkxOG4oIkxlZnQiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJyaWdodCIpLnRleHQodGhpcy5ydGUuaTE4bigiUmlnaHQiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJ0b3AiKS50ZXh0KHRoaXMucnRlLmkxOG4oIlRvcCIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoInRleHQtdG9wIikudGV4dCh0aGlzLnJ0ZS5pMThuKCJUZXh0IHRvcCIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoIm1pZGRsZSIpLnRleHQodGhpcy5ydGUuaTE4bigibWlkZGxlIikpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgiYmFzZWxpbmUiKS50ZXh0KHRoaXMucnRlLmkxOG4oIkJhc2VsaW5lIikpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgiYm90dG9tIikudGV4dCh0aGlzLnJ0ZS5pMThuKCJCb3R0b20iKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJ0ZXh0LWJvdHRvbSIpLnRleHQodGhpcy5ydGUuaTE4bigiVGV4dCBib3R0b20iKSkpLGJvcmRlcjphKCI8ZGl2IC8+Iil9LGFkdjp7aWQ6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuY3NzKCJ3aWR0aCIsIjEwMCUiKSwiY2xhc3MiOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmNzcygid2lkdGgiLCIxMDAlIiksc3R5bGU6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuY3NzKCJ3aWR0aCIsIjEwMCUiKSxsb25nZGVzYzphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoIndpZHRoIiwiMTAwJSIpfSxldmVudHM6e319O2EuZWFjaChbIm9uYmx1ciIsIm9uZm9jdXMiLCJvbmNsaWNrIiwib25kYmxjbGljayIsIm9ubW91c2Vkb3duIiwib25tb3VzZXVwIiwib25tb3VzZW92ZXIiLCJvbm1vdXNlb3V0Iiwib25tb3VzZWxlYXZlIiwib25rZXlkb3duIiwib25rZXlwcmVzcyIsIm9ua2V5dXAiXSxmdW5jdGlvbigpe2Iuc3JjLmV2ZW50c1t0aGlzXT1hKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoIndpZHRoIiwiMTAwJSIpfSk7YS5lYWNoKGIuc3JjLGZ1bmN0aW9uKCl7Zm9yKHZhciBnIGluIHRoaXMpe3RoaXNbZ10uYXR0cigibmFtZSIsZyl9fSl9O3RoaXMuY29tbWFuZD1mdW5jdGlvbigpeyF0aGlzLnNyYyYmdGhpcy5pbml0KCk7dGhpcy5ydGUuc2VsZWN0aW9uLnNhdmVJRVJhbmdlKCk7dGhpcy5zcmMubWFpbi5ib3JkZXIuZWxCb3JkZXJTZWxlY3Qoe2NoYW5nZTpmdW5jdGlvbigpe2IudXBkYXRlSW1nKCl9LG5hbWU6ImJvcmRlciJ9KTt0aGlzLnNyYy5tYWluLm1hcmdpbi5lbFBhZGRpbmdJbnB1dCh7dHlwZToibWFyZ2luIn0pO3RoaXMuY2xlYW5WYWx1ZXMoKTt0aGlzLnNyYy5tYWluLnNyYy52YWwoIiIpO3ZhciBvPXRoaXMucnRlLnNlbGVjdGlvbi5nZXRFbmQoKSx1PWEobyk7dGhpcy5wcmV2aWV3PW51bGw7dGhpcy5wcmV2SW1nPW51bGw7dGhpcy5saW5rPW51bGw7aWYoby5ub2RlTmFtZT09IklNRyImJiF1Lmhhc0NsYXNzKCJlbHJ0ZS1wcm90ZWN0ZWQiKSl7dGhpcy5pbWc9YShvKX1lbHNle3RoaXMuaW1nPWEodGhpcy5ydGUuZG9jLmNyZWF0ZUVsZW1lbnQoImltZyIpKX12YXIgaD17cnRsOnRoaXMucnRlLnJ0bCxzdWJtaXQ6ZnVuY3Rpb24odyx4KXt3LnN0b3BQcm9wYWdhdGlvbigpO3cucHJldmVudERlZmF1bHQoKTtiLnNldCgpO3guY2xvc2UoKX0sZGlhbG9nOnt3aWR0aDo1NzAscG9zaXRpb246InRvcCIsdGl0bGU6dGhpcy5ydGUuaTE4bigiSW1hZ2UiKX19O3ZhciB0PW5ldyBlbERpYWxvZ0Zvcm0oaCk7aWYodGhpcy5ydGUub3B0aW9ucy5mbUFsbG93JiZ0aGlzLnJ0ZS5vcHRpb25zLmZtT3Blbil7dmFyIGc9YSgiPHNwYW4gLz4iKS5hcHBlbmQodGhpcy5zcmMubWFpbi5zcmMuY3NzKCJ3aWR0aCIsIjg4JSIpKS5hcHBlbmQoYSgiPHNwYW4gLz4iKS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIikuY3NzKHsiZmxvYXQiOiJyaWdodCIsIm1hcmdpbi1yaWdodCI6IjNweCJ9KS5hdHRyKCJ0aXRsZSIsYi5ydGUuaTE4bigiT3BlbiBmaWxlIG1hbmdlciIpKS5hcHBlbmQoYSgiPHNwYW4gLz4iKS5hZGRDbGFzcygidWktaWNvbiB1aS1pY29uLWZvbGRlci1vcGVuIikpLmNsaWNrKGZ1bmN0aW9uKCl7Yi5ydGUub3B0aW9ucy5mbU9wZW4oZnVuY3Rpb24odyl7Yi5zcmMubWFpbi5zcmMudmFsKHcpLmNoYW5nZSgpfSl9KS5ob3ZlcihmdW5jdGlvbigpe2EodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9LGZ1bmN0aW9uKCl7YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKX0pKX1lbHNle3ZhciBnPXRoaXMuc3JjLm1haW4uc3JjfXQudGFiKCJtYWluIix0aGlzLnJ0ZS5pMThuKCJQcm9wZXJpZXMiKSkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJJbWFnZSBVUkwiKSxnXSwibWFpbiIsdHJ1ZSkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJUaXRsZSIpLHRoaXMuc3JjLm1haW4udGl0bGVdLCJtYWluIix0cnVlKS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkFsdCB0ZXh0IiksdGhpcy5zcmMubWFpbi5hbHRdLCJtYWluIix0cnVlKS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIlNpemUiKSxhKCI8c3BhbiAvPiIpLmFwcGVuZCh0aGlzLnNyYy5tYWluLndpZHRoKS5hcHBlbmQoIiB4ICIpLmFwcGVuZCh0aGlzLnNyYy5tYWluLmhlaWdodCkuYXBwZW5kKCIgcHgiKV0sIm1haW4iLHRydWUpLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiQWxpZ25tZW50IiksdGhpcy5zcmMubWFpbi5hbGlnbl0sIm1haW4iLHRydWUpLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiTWFyZ2lucyIpLHRoaXMuc3JjLm1haW4ubWFyZ2luXSwibWFpbiIsdHJ1ZSkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJCb3JkZXIiKSx0aGlzLnNyYy5tYWluLmJvcmRlcl0sIm1haW4iLHRydWUpO2Zvcih2YXIgcCBpbiB0aGlzLnNyYyl7aWYocCE9Im1haW4iKXt0LnRhYihwLHRoaXMucnRlLmkxOG4odGhpcy5sYWJlbHNbcF0pKTtmb3IodmFyIGogaW4gdGhpcy5zcmNbcF0pe3ZhciBxPXRoaXMucnRlLmkxOG4odGhpcy5sYWJlbHNbal0/dGhpcy5sYWJlbHNbal06aik7aWYocD09ImV2ZW50cyIpe3RoaXMuc3JjW3BdW2pdLnZhbCh0aGlzLnJ0ZS51dGlscy50cmltRXZlbnRDYWxsYmFjayh0aGlzLmltZy5hdHRyKGopKSl9ZWxzZXtpZihwPT0ibGluayIpe2lmKHRoaXMubGluayl7dGhpcy5zcmNbcF1bal0udmFsKGo9PSJocmVmIj90aGlzLnJ0ZS51dGlscy5hYnNvbHV0ZVVSTCh0aGlzLmxpbmsuYXR0cihqKSk6dGhpcy5saW5rLmF0dHIoaikpfX1lbHNle3RoaXMuc3JjW3BdW2pdLnZhbCh0aGlzLmltZy5hdHRyKGopfHwiIil9fXQuYXBwZW5kKFtxLHRoaXMuc3JjW3BdW2pdXSxwLHRydWUpfX19dC5vcGVuKCk7dmFyIHI9YSgiPGZpZWxkc2V0IC8+IikuYXBwZW5kKGEoIjxsZWdlbmQgLz4iKS50ZXh0KHRoaXMucnRlLmkxOG4oIlByZXZpZXciKSkpO3QuYXBwZW5kKHIsIm1haW4iKTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTthKGspLmF0dHIoInNyYyIsIiMiKS5hZGRDbGFzcygiZWwtcnRlLXByZXZpZXciKS5hcHBlbmRUbyhyKTtodG1sPXRoaXMucnRlLm9wdGlvbnMuZG9jdHlwZSsnPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPjwvaGVhZD48Ym9keSBzdHlsZT0icGFkZGluZzowO21hcmdpbjowO2ZvbnQtc2l6ZTo5cHgiPiA8L2JvZHk+PC9odG1sPic7ay5jb250ZW50V2luZG93LmRvY3VtZW50Lm9wZW4oKTtrLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoaHRtbCk7ay5jb250ZW50V2luZG93LmRvY3VtZW50LmNsb3NlKCk7dGhpcy5mcmFtZT1rLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7dGhpcy5wcmV2aWV3PWEoay5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHkpLnRleHQoIlByb2luIGVsaXQgYXJjdSwgcnV0cnVtIGNvbW1vZG8sIHZlaGljdWxhIHRlbXB1cywgY29tbW9kbyBhLCByaXN1cy4gQ3VyYWJpdHVyIG5lYyBhcmN1LiBEb25lYyBzb2xsaWNpdHVkaW4gbWkgc2l0IGFtZXQgbWF1cmlzLiBOYW0gZWxlbWVudHVtIHF1YW0gdWxsYW1jb3JwZXIgYW50ZS4gRXRpYW0gYWxpcXVldCBtYXNzYSBldCBsb3JlbS4gTWF1cmlzIGRhcGlidXMgbGFjdXMgYXVjdG9yIHJpc3VzLiBBZW5lYW4gdGVtcG9yIHVsbGFtY29ycGVyIGxlby4gVml2YW11cyBzZWQgbWFnbmEgcXVpcyBsaWd1bGEgZWxlaWZlbmQgYWRpcGlzY2luZy4gRHVpcyBvcmNpLiBBbGlxdWFtIHNvZGFsZXMgdG9ydG9yIHZpdGFlIGlwc3VtLiBBbGlxdWFtIG51bGxhLiBEdWlzIGFsaXF1YW0gbW9sZXN0aWUgZXJhdC4gVXQgZXQgbWF1cmlzIHZlbCBwZWRlIHZhcml1cyBzb2xsaWNpdHVkaW4iKTtpZih0aGlzLmltZy5hdHRyKCJzcmMiKSl7dGhpcy5wcmV2SW1nPWEodGhpcy5mcmFtZS5jcmVhdGVFbGVtZW50KCJpbWciKSkuYXR0cigic3JjIix0aGlzLnJ0ZS51dGlscy5hYnNvbHV0ZVVSTCh0aGlzLmltZy5hdHRyKCJzcmMiKSkpO3RoaXMucHJldkltZy5hdHRyKCJ3aWR0aCIsdGhpcy5pbWcuYXR0cigid2lkdGgiKSkuYXR0cigiaGVpZ2h0Iix0aGlzLmltZy5hdHRyKCJoZWlnaHQiKSkuYXR0cigidGl0bGUiLHRoaXMuaW1nLmF0dHIoInRpdGxlIil8fCIiKS5hdHRyKCJhbHQiLHRoaXMuaW1nLmF0dHIoImFsdCIpfHwiIikuYXR0cigic3R5bGUiLHRoaXMuaW1nLmF0dHIoInN0eWxlIil8fCIiKTtmb3IodmFyIG8gaW4gdGhpcy5zcmMuYWR2KXt2YXIgdj10aGlzLmltZy5hdHRyKG8pO2lmKHYpe3RoaXMucHJldkltZy5hdHRyKG8sdil9fXRoaXMucHJldmlldy5wcmVwZW5kKHRoaXMucHJldkltZyk7dGhpcy51cGRhdGVWYWx1ZXMoKX1hLmVhY2godGhpcy5zcmMsZnVuY3Rpb24oKXthLmVhY2godGhpcyxmdW5jdGlvbigpe2lmKHRoaXM9PT1iLnNyYy5tYWluLnNyYyl7dGhpcy5iaW5kKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7Yi51cGRhdGVQcmV2aWV3KCl9KX1lbHNle2lmKHRoaXM9PWIuc3JjLm1haW4ud2lkdGh8fHRoaXM9PWIuc3JjLm1haW4uaGVpZ2h0KXt0aGlzLmJpbmQoImNoYW5nZSIsZnVuY3Rpb24odyl7Yi51cGRhdGVEaW1lc2lvbnModyl9KX1lbHNle3RoaXMuYmluZCgiY2hhbmdlIixmdW5jdGlvbigpe2IudXBkYXRlSW1nKCl9KX19fSl9KX07dGhpcy51cGRhdGVWYWx1ZXM9ZnVuY3Rpb24oKXt2YXIgZz10aGlzLnByZXZJbWcuZ2V0KDApO3RoaXMub3JpZ1c9dGhpcy5wcmV2SW1nLmF0dHIoIndpZHRoIik7dGhpcy5vcmlnSD10aGlzLnByZXZJbWcuYXR0cigiaGVpZ2h0Iik7dGhpcy5zcmMubWFpbi5zcmMudmFsKHRoaXMucnRlLmRvbS5hdHRyKGcsInNyYyIpKTt0aGlzLnNyYy5tYWluLnRpdGxlLnZhbCh0aGlzLnJ0ZS5kb20uYXR0cihnLCJ0aXRsZSIpKTt0aGlzLnNyYy5tYWluLmFsdC52YWwodGhpcy5ydGUuZG9tLmF0dHIoZywiYWx0IikpO3RoaXMuc3JjLm1haW4ud2lkdGgudmFsKHRoaXMub3JpZ1cpO3RoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbCh0aGlzLm9yaWdIKTt0aGlzLnNyYy5hZHZbImNsYXNzIl0udmFsKHRoaXMucnRlLmRvbS5hdHRyKGcsImNsYXNzIikpO3RoaXMuc3JjLm1haW4ubWFyZ2luLnZhbCh0aGlzLnByZXZJbWcpO3ZhciBoPXRoaXMucHJldkltZy5jc3MoImZsb2F0Iik7dGhpcy5zcmMubWFpbi5hbGlnbi52YWwoaD09ImxlZnQifHxoPT0icmlnaHQiP2g6KHRoaXMucHJldkltZy5jc3MoInZlcnRpY2FsLWFsaWduIil8fCIiKSk7dGhpcy5zcmMubWFpbi5ib3JkZXIudmFsKHRoaXMucHJldkltZyk7dGhpcy5zcmMuYWR2LnN0eWxlLnZhbCh0aGlzLnJ0ZS5kb20uYXR0cihnLCJzdHlsZSIpKX07dGhpcy5jbGVhblZhbHVlcz1mdW5jdGlvbigpe2EuZWFjaCh0aGlzLnNyYyxmdW5jdGlvbigpe2EuZWFjaCh0aGlzLGZ1bmN0aW9uKCl7dmFyIGc9YSh0aGlzKTtpZihnLmF0dHIoIm5hbWUiKSE9InNyYyIpe2cudmFsKCIiKX19KX0pfTt0aGlzLnVwZGF0ZUltZz1mdW5jdGlvbigpe3RoaXMucHJldkltZy5hdHRyKHtzdHlsZTphLnRyaW0odGhpcy5zcmMuYWR2LnN0eWxlLnZhbCgpKSx0aXRsZTphLnRyaW0odGhpcy5zcmMubWFpbi50aXRsZS52YWwoKSksYWx0OmEudHJpbSh0aGlzLnNyYy5tYWluLmFsdC52YWwoKSksd2lkdGg6cGFyc2VJbnQodGhpcy5zcmMubWFpbi53aWR0aC52YWwoKSksaGVpZ2h0OnBhcnNlSW50KHRoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbCgpKX0pO3ZhciBqPXRoaXMuc3JjLm1haW4uYWxpZ24udmFsKCk7dmFyIGs9aj09ImxlZnQifHxqPT0icmlnaHQiP2o6IiI7dmFyIGg9dGhpcy5zcmMubWFpbi5ib3JkZXIudmFsKCk7dmFyIGc9dGhpcy5zcmMubWFpbi5tYXJnaW4udmFsKCk7dGhpcy5wcmV2SW1nLmNzcygiZmxvYXQiLGspO3RoaXMucHJldkltZy5jc3MoInZlcnRpY2FsLWFsaWduIixrPyIiOmopO3RoaXMucHJldkltZy5jc3MoImJvcmRlciIsYS50cmltKGgud2lkdGgrIiAiK2guc3R5bGUrIiAiK2guY29sb3IpKTtpZihnLmNzcyl7dGhpcy5wcmV2SW1nLmNzcygibWFyZ2luIixnLmNzcyl9ZWxzZXt0aGlzLnByZXZJbWcuY3NzKCJtYXJnaW4tdG9wIixnLnRvcCk7dGhpcy5wcmV2SW1nLmNzcygibWFyZ2luLXJpZ2h0IixnLnJpZ2h0KTt0aGlzLnByZXZJbWcuY3NzKCJtYXJnaW4tYm90dG9tIixnLmJvdHRvbSk7dGhpcy5wcmV2SW1nLmNzcygibWFyZ2luLWxlZnQiLGcubGVmdCl9YS5lYWNoKFt0aGlzLnNyYy5ldmVudHMsdGhpcy5zcmMuYWR2XSxmdW5jdGlvbigpe2EuZWFjaCh0aGlzLGZ1bmN0aW9uKCl7dmFyIHA9YSh0aGlzKTt2YXIgcT1wLmF0dHIoIm5hbWUiKTtpZihxIT0ic3R5bGUiKXt2YXIgbz1hLnRyaW0ocC52YWwoKSk7aWYobyl7Yi5wcmV2SW1nLmF0dHIocSxvKX1lbHNle2IucHJldkltZy5yZW1vdmVBdHRyKHEpfX19KX0pfTt0aGlzLnVwZGF0ZVByZXZpZXc9ZnVuY3Rpb24oKXt2YXIgaD10aGlzLnByZXZJbWc/dGhpcy5wcmV2SW1nLmF0dHIoInNyYyIpOiIiO3ZhciBnPWEudHJpbSh0aGlzLnNyYy5tYWluLnNyYy52YWwoKSk7aWYoIWd8fGchPWgpe2lmKHRoaXMucHJldkltZyl7dGhpcy5wcmV2SW1nLnJlbW92ZSgpO3RoaXMucHJldkltZz1udWxsfXRoaXMuY2xlYW5WYWx1ZXMoKTtpZihnKXt0aGlzLnByZXZJbWc9YSh0aGlzLmZyYW1lLmNyZWF0ZUVsZW1lbnQoImltZyIpKS5hdHRyKCJzcmMiLHRoaXMucnRlLnV0aWxzLmFic29sdXRlVVJMKGcpKS5iaW5kKCJsb2FkIixmdW5jdGlvbigpe2IudXBkYXRlVmFsdWVzKCl9KTt0aGlzLnByZXZpZXcucHJlcGVuZCh0aGlzLnByZXZJbWcpO2IudXBkYXRlVmFsdWVzKCl9fWVsc2V7dGhpcy51cGRhdGVJbWcoKX19O3RoaXMudXBkYXRlRGltZXNpb25zPWZ1bmN0aW9uKGspe3ZhciBnPXBhcnNlSW50KHRoaXMuc3JjLm1haW4ud2lkdGgudmFsKCkpfHwwO3ZhciBqPXBhcnNlSW50KHRoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbCgpKXx8MDtpZihnPjAmJmo+MCl7aWYoay5jdXJyZW50VGFyZ2V0PT10aGlzLnNyYy5tYWluLndpZHRoLmdldCgwKSl7dGhpcy5zcmMubWFpbi5oZWlnaHQudmFsKHBhcnNlSW50KGcqdGhpcy5vcmlnSC90aGlzLm9yaWdXKSl9ZWxzZXt0aGlzLnNyYy5tYWluLndpZHRoLnZhbChwYXJzZUludChqKnRoaXMub3JpZ1cvdGhpcy5vcmlnSCkpfX1lbHNle3RoaXMuc3JjLm1haW4ud2lkdGgudmFsKHRoaXMub3JpZ1cpO3RoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbCh0aGlzLm9yaWdIKX10aGlzLnVwZGF0ZUltZygpfTt0aGlzLnNldD1mdW5jdGlvbigpe3RoaXMucnRlLmhpc3RvcnkuYWRkKCk7dGhpcy5ydGUuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7aWYoIXRoaXMucHJldkltZ3x8IXRoaXMucHJldkltZy5hdHRyKCJ3aWR0aCIpKXt0aGlzLmltZyYmdGhpcy5pbWcucmVtb3ZlKCk7dGhpcy5saW5rJiZ0aGlzLnJ0ZS5kb2MuZXhlY0NvbW1hbmQoInVubGluayIsZmFsc2UsbnVsbCl9ZWxzZXtpZighdGhpcy5pbWdbMF0ucGFyZW50Tm9kZSl7dGhpcy5pbWc9YSh0aGlzLnJ0ZS5kb2MuY3JlYXRlRWxlbWVudCgiaW1nIikpfXRoaXMuaW1nLmF0dHIoe3NyYzp0aGlzLnJ0ZS51dGlscy5hYnNvbHV0ZVVSTChhLnRyaW0odGhpcy5zcmMubWFpbi5zcmMudmFsKCkpKSxzdHlsZTphLnRyaW0odGhpcy5ydGUuZG9tLmF0dHIodGhpcy5wcmV2SW1nLmdldCgwKSwic3R5bGUiKSksdGl0bGU6YS50cmltKHRoaXMuc3JjLm1haW4udGl0bGUudmFsKCkpLGFsdDphLnRyaW0odGhpcy5zcmMubWFpbi5hbHQudmFsKCkpLHdpZHRoOnBhcnNlSW50KHRoaXMuc3JjLm1haW4ud2lkdGgudmFsKCkpLGhlaWdodDpwYXJzZUludCh0aGlzLnNyYy5tYWluLmhlaWdodC52YWwoKSl9KTtmb3IodmFyIGcgaW4gdGhpcy5zcmMuYWR2KXtpZihnIT0ic3R5bGUiKXt2YXIgaD10aGlzLnNyYy5hZHZbZ10udmFsKCk7aWYoaCl7dGhpcy5pbWcuYXR0cihnLGgpfWVsc2V7dGhpcy5pbWcucmVtb3ZlQXR0cihnKX19fWZvcih2YXIgZyBpbiB0aGlzLnNyYy5ldmVudHMpe3ZhciBoPXRoaXMuc3JjLmV2ZW50c1tnXS52YWwoKTtpZihoKXt0aGlzLmltZy5hdHRyKGcsaCl9ZWxzZXt0aGlzLmltZy5yZW1vdmVBdHRyKGcpfX1pZighdGhpcy5pbWdbMF0ucGFyZW50Tm9kZSl7dGhpcy5ydGUuc2VsZWN0aW9uLmluc2VydE5vZGUodGhpcy5pbWcuZ2V0KDApKX19dGhpcy5ydGUudWkudXBkYXRlKCl9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpO3ZhciBoPXRoaXMucnRlLnNlbGVjdGlvbi5nZXRFbmQoKSxnPWEoaCk7aWYoaC5ub2RlTmFtZT09IklNRyImJiFnLmhhc0NsYXNzKCJlbHJ0ZS1wcm90ZWN0ZWQiKSl7dGhpcy5kb21FbGVtLmFkZENsYXNzKCJhY3RpdmUiKX1lbHNle3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiYWN0aXZlIil9fX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuaW5kZW50PWZ1bmN0aW9uKGYsYyl7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGYsYyk7dmFyIGI9dGhpczt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpO3ZhciBoPXRoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3RlZCh7Y29sbGFwc2VkOnRydWUsYmxvY2tzOnRydWUsd3JhcDoiaW5saW5lIix0YWc6InAifSk7ZnVuY3Rpb24gZyhxKXt2YXIgbz0vKElNR3xIUnxUQUJMRXxFTUJFRHxPQkpFQ1QpLy50ZXN0KHEubm9kZU5hbWUpPyJtYXJnaW4tbGVmdCI6InBhZGRpbmctbGVmdCI7dmFyIHA9Yi5ydGUuZG9tLmF0dHIocSwic3R5bGUiKS5pbmRleE9mKG8pIT0tMT9wYXJzZUludChhKHEpLmNzcyhvKSl8fDA6MDthKHEpLmNzcyhvLHArNDArInB4Iil9Zm9yKHZhciBqPTA7ajxoLmxlbmd0aDtqKyspe2lmKC9eKFRBQkxFfFRIRUFEfFRGT09UfFRCT0RZfENPTHxDT0xHUk9VUHxUUikkLy50ZXN0KGhbal0ubm9kZU5hbWUpKXthKGhbal0pLmZpbmQoInRkLHRoIikuZWFjaChmdW5jdGlvbigpe2codGhpcyl9KX1lbHNle2lmKC9eTEkkLy50ZXN0KGhbal0ubm9kZU5hbWUpKXt2YXIgaz1hKGhbal0pO2EodGhpcy5ydGUuZG9tLmNyZWF0ZShoW2pdLnBhcmVudE5vZGUubm9kZU5hbWUpKS5hcHBlbmQoYSh0aGlzLnJ0ZS5kb20uY3JlYXRlKCJsaSIpKS5odG1sKGsuaHRtbCgpfHwiIikpLmFwcGVuZFRvKGsuaHRtbCgiJm5ic3A7IikpfWVsc2V7ZyhoW2pdKX19fXRoaXMucnRlLnVpLnVwZGF0ZSgpfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKX19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmp1c3RpZnlsZWZ0PWZ1bmN0aW9uKGMsYil7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGMsYik7dGhpcy5hbGlnbj10aGlzLm5hbWU9PSJqdXN0aWZ5ZnVsbCI/Imp1c3RpZnkiOnRoaXMubmFtZS5yZXBsYWNlKCJqdXN0aWZ5IiwiIik7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdGVkKHtjb2xsYXBzZWQ6dHJ1ZSxibG9ja3M6dHJ1ZSx0YWc6ImRpdiJ9KSxmPWcubGVuZ3RoO2YmJnRoaXMucnRlLmhpc3RvcnkuYWRkKCk7d2hpbGUoZi0tKXt0aGlzLnJ0ZS5kb20uZmlsdGVyKGdbZl0sInRleHROb2RlcyIpJiZhKGdbZl0pLmNzcygidGV4dC1hbGlnbiIsdGhpcy5hbGlnbil9dGhpcy5ydGUudWkudXBkYXRlKCl9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIGY9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSxnPWYubm9kZU5hbWU9PSJCT0RZIj9mOnRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQoZiwidGV4dE5vZGVzIil8fChmLnBhcmVudE5vZGUmJmYucGFyZW50Tm9kZS5ub2RlTmFtZT09IkJPRFkiP2YucGFyZW50Tm9kZTpudWxsKTtpZihnKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIikudG9nZ2xlQ2xhc3MoImFjdGl2ZSIsYShnKS5jc3MoInRleHQtYWxpZ24iKT09dGhpcy5hbGlnbil9ZWxzZXt0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImRpc2FibGVkIil9fX07ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmp1c3RpZnljZW50ZXI9ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmp1c3RpZnlsZWZ0O2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5qdXN0aWZ5cmlnaHQ9ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLmp1c3RpZnlsZWZ0O2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5qdXN0aWZ5ZnVsbD1lbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuanVzdGlmeWxlZnR9KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMubGluaz1mdW5jdGlvbihmLGMpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxmLGMpO3ZhciBiPXRoaXM7dGhpcy5pbWc9ZmFsc2U7ZnVuY3Rpb24gZygpe2IubGFiZWxzPXtpZDoiSUQiLCJjbGFzcyI6IkNzcyBjbGFzcyIsc3R5bGU6IkNzcyBzdHlsZSIsZGlyOiJTY3JpcHQgZGlyZWN0aW9uIixsYW5nOiJMYW5ndWFnZSIsY2hhcnNldDoiQ2hhcnNldCIsdHlwZToiVGFyZ2V0IE1JTUUgdHlwZSIscmVsOiJSZWxhdGlvbnNoaXAgcGFnZSB0byB0YXJnZXQgKHJlbCkiLHJldjoiUmVsYXRpb25zaGlwIHRhcmdldCB0byBwYWdlIChyZXYpIix0YWJpbmRleDoiVGFiIGluZGV4IixhY2Nlc3NrZXk6IkFjY2VzcyBrZXkifTtiLnNyYz17bWFpbjp7aHJlZjphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSx0aXRsZTphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSxhbmNob3I6YSgiPHNlbGVjdCAvPiIpLmF0dHIoIm5hbWUiLCJhbmNob3IiKSx0YXJnZXQ6YSgiPHNlbGVjdCAvPiIpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudGV4dChiLnJ0ZS5pMThuKCJJbiB0aGlzIHdpbmRvdyIpKS52YWwoIiIpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnRleHQoYi5ydGUuaTE4bigiSW4gbmV3IHdpbmRvdyAoX2JsYW5rKSIpKS52YWwoIl9ibGFuayIpKX0scG9wdXA6e3VzZTphKCc8aW5wdXQgdHlwZT0iY2hlY2tib3ggLz4iJyksdXJsOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLnZhbCgiaHR0cDovLyIpLG5hbWU6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+Jyksd2lkdGg6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cih7c2l6ZTo2LHRpdGxlOmIucnRlLmkxOG4oIldpZHRoIil9KS5jc3MoInRleHQtYWxpZ24iLCJyaWdodCIpLGhlaWdodDphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKHtzaXplOjYsdGl0bGU6Yi5ydGUuaTE4bigiSGVpZ2h0Iil9KS5jc3MoInRleHQtYWxpZ24iLCJyaWdodCIpLGxlZnQ6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cih7c2l6ZTo2LHRpdGxlOmIucnRlLmkxOG4oIkxlZnQiKX0pLmNzcygidGV4dC1hbGlnbiIsInJpZ2h0IiksdG9wOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoe3NpemU6Nix0aXRsZTpiLnJ0ZS5pMThuKCJUb3AiKX0pLmNzcygidGV4dC1hbGlnbiIsInJpZ2h0IiksbG9jYXRpb246YSgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPicpLG1lbnViYXI6YSgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPicpLHRvb2xiYXI6YSgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPicpLHNjcm9sbGJhcnM6YSgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPicpLHN0YXR1czphKCc8aW5wdXQgdHlwZT0iY2hlY2tib3giIC8+JykscmVzaXphYmxlOmEoJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgLz4nKSxkZXBlbmRlbnQ6YSgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPicpLHJldGZhbHNlOmEoJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgLz4nKS5hdHRyKCJjaGVja2VkIix0cnVlKX0sYWR2OntpZDphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSwiY2xhc3MiOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLHN0eWxlOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLGRpcjphKCI8c2VsZWN0IC8+IikuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS50ZXh0KGIucnRlLmkxOG4oIk5vdCBzZXQiKSkudmFsKCIiKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS50ZXh0KGIucnRlLmkxOG4oIkxlZnQgdG8gcmlnaHQiKSkudmFsKCJsdHIiKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS50ZXh0KGIucnRlLmkxOG4oIlJpZ2h0IHRvIGxlZnQiKSkudmFsKCJydGwiKSksbGFuZzphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSxjaGFyc2V0OmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLHR5cGU6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykscmVsOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLHJldjphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSx0YWJpbmRleDphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSxhY2Nlc3NrZXk6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+Jyl9LGV2ZW50czp7fX07YS5lYWNoKFsib25ibHVyIiwib25mb2N1cyIsIm9uY2xpY2siLCJvbmRibGNsaWNrIiwib25tb3VzZWRvd24iLCJvbm1vdXNldXAiLCJvbm1vdXNlb3ZlciIsIm9ubW91c2VvdXQiLCJvbm1vdXNlbGVhdmUiLCJvbmtleWRvd24iLCJvbmtleXByZXNzIiwib25rZXl1cCJdLGZ1bmN0aW9uKCl7Yi5zcmMuZXZlbnRzW3RoaXNdPWEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpfSk7YS5lYWNoKGIuc3JjLGZ1bmN0aW9uKCl7Zm9yKHZhciBqIGluIHRoaXMpe3RoaXNbal0uYXR0cigibmFtZSIsaik7dmFyIGg9dGhpc1tqXS5hdHRyKCJ0eXBlIik7aWYoIWh8fChoPT0idGV4dCImJiF0aGlzW2pdLmF0dHIoInNpemUiKSkpe3RoaXNbal0uY3NzKCJ3aWR0aCIsIjEwMCUiKX19fSl9dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIHA9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSxvLHUseCxoLHQsaix3LGssejshdGhpcy5zcmMmJmcoKTt0aGlzLnJ0ZS5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTtmdW5jdGlvbiBxKHIpe3JldHVybiByLm5vZGVOYW1lPT0iQSImJnIuaHJlZn10aGlzLmxpbms9dGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudExpbmsocCk7aWYoIXRoaXMubGluayl7bz1hLmJyb3dzZXIubXNpZT90aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoKTp0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoe3dyYXA6ZmFsc2V9KTtpZihvLmxlbmd0aCl7Zm9yKHU9MDt1PG8ubGVuZ3RoO3UrKyl7aWYocShvW3VdKSl7dGhpcy5saW5rPW9bdV07YnJlYWt9fWlmKCF0aGlzLmxpbmspe3RoaXMubGluaz10aGlzLnJ0ZS5kb20ucGFyZW50KG9bMF0scSl8fHRoaXMucnRlLmRvbS5wYXJlbnQob1tvLmxlbmd0aC0xXSxxKX19fXRoaXMubGluaz10aGlzLmxpbms/YSh0aGlzLmxpbmspOmEodGhpcy5ydGUuZG9jLmNyZWF0ZUVsZW1lbnQoImEiKSk7dGhpcy5pbWc9cC5ub2RlTmFtZT09IklNRyI/cDpudWxsO3RoaXMudXBkYXRlUG9wdXAoKTt0aGlzLnNyYy5tYWluLmFuY2hvci5lbXB0eSgpO2EoJ2FbaHJlZiE9IiJdW25hbWVdJyx0aGlzLnJ0ZS5kb2MpLmVhY2goZnVuY3Rpb24oKXt2YXIgcj1hKHRoaXMpLmF0dHIoIm5hbWUiKTtiLnNyYy5tYWluLmFuY2hvci5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbChyKS50ZXh0KHIpKX0pO2lmKHRoaXMuc3JjLm1haW4uYW5jaG9yLmNoaWxkcmVuKCkubGVuZ3RoKXt0aGlzLnNyYy5tYWluLmFuY2hvci5wcmVwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoIiIpLnRleHQodGhpcy5ydGUuaTE4bigiU2VsZWN0IGJvb2ttYXJrIikpKS5jaGFuZ2UoZnVuY3Rpb24oKXt2YXIgcj1hKHRoaXMpLnZhbCgpO2lmKHIpe2Iuc3JjLm1haW4uaHJlZi52YWwoIiMiK3IpfX0pfWg9e3J0bDp0aGlzLnJ0ZS5ydGwsc3VibWl0OmZ1bmN0aW9uKHIsdil7ci5zdG9wUHJvcGFnYXRpb24oKTtyLnByZXZlbnREZWZhdWx0KCk7Yi5zZXQoKTt2LmNsb3NlKCl9LHRhYnM6e3Nob3c6ZnVuY3Rpb24odixyKXtpZihyLmluZGV4PT0zKXtiLnVwZGF0ZU9uY2xpY2soKX19fSxjbG9zZTpmdW5jdGlvbigpe2IucnRlLmJyb3dzZXIubXNpZSYmYi5ydGUuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCl9LGRpYWxvZzp7d2lkdGg6ImF1dG8iLHdpZHRoOjQzMCx0aXRsZTp0aGlzLnJ0ZS5pMThuKCJMaW5rIil9fTtkPW5ldyBlbERpYWxvZ0Zvcm0oaCk7dD1hKCI8ZGl2IC8+IikuYXBwZW5kKGEoIjxsYWJlbCAvPiIpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC5sb2NhdGlvbikuYXBwZW5kKHRoaXMucnRlLmkxOG4oIkxvY2F0aW9uIGJhciIpKSkuYXBwZW5kKGEoIjxsYWJlbCAvPiIpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC5tZW51YmFyKS5hcHBlbmQodGhpcy5ydGUuaTE4bigiTWVudSBiYXIiKSkpLmFwcGVuZChhKCI8bGFiZWwgLz4iKS5hcHBlbmQodGhpcy5zcmMucG9wdXAudG9vbGJhcikuYXBwZW5kKHRoaXMucnRlLmkxOG4oIlRvb2xiYXIiKSkpLmFwcGVuZChhKCI8bGFiZWwgLz4iKS5hcHBlbmQodGhpcy5zcmMucG9wdXAuc2Nyb2xsYmFycykuYXBwZW5kKHRoaXMucnRlLmkxOG4oIlNjcm9sbGJhcnMiKSkpO2o9YSgiPGRpdiAvPiIpLmFwcGVuZChhKCI8bGFiZWwgLz4iKS5hcHBlbmQodGhpcy5zcmMucG9wdXAuc3RhdHVzKS5hcHBlbmQodGhpcy5ydGUuaTE4bigiU3RhdHVzIGJhciIpKSkuYXBwZW5kKGEoIjxsYWJlbCAvPiIpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC5yZXNpemFibGUpLmFwcGVuZCh0aGlzLnJ0ZS5pMThuKCJSZXNpemFibGUiKSkpLmFwcGVuZChhKCI8bGFiZWwgLz4iKS5hcHBlbmQodGhpcy5zcmMucG9wdXAuZGVwZW5kZW50KS5hcHBlbmQodGhpcy5ydGUuaTE4bigiRGVwZWRlbnQiKSkpLmFwcGVuZChhKCI8bGFiZWwgLz4iKS5hcHBlbmQodGhpcy5zcmMucG9wdXAucmV0ZmFsc2UpLmFwcGVuZCh0aGlzLnJ0ZS5pMThuKCJBZGQgcmV0dXJuIGZhbHNlIikpKTtkLnRhYigibWFpbiIsdGhpcy5ydGUuaTE4bigiUHJvcGVyaWVzIikpLnRhYigicG9wdXAiLHRoaXMucnRlLmkxOG4oIlBvcHVwIikpLnRhYigiYWR2Iix0aGlzLnJ0ZS5pMThuKCJBZHZhbmNlZCIpKS50YWIoImV2ZW50cyIsdGhpcy5ydGUuaTE4bigiRXZlbnRzIikpLmFwcGVuZChhKCI8bGFiZWwgLz4iKS5hcHBlbmQodGhpcy5zcmMucG9wdXAudXNlKS5hcHBlbmQodGhpcy5ydGUuaTE4bigiT3BlbiBsaW5rIGluIHBvcHVwIHdpbmRvdyIpKSwicG9wdXAiKS5zZXBhcmF0b3IoInBvcHVwIikuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJVUkwiKSx0aGlzLnNyYy5wb3B1cC51cmxdLCJwb3B1cCIsdHJ1ZSkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJXaW5kb3cgbmFtZSIpLHRoaXMuc3JjLnBvcHVwLm5hbWVdLCJwb3B1cCIsdHJ1ZSkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJXaW5kb3cgc2l6ZSIpLGEoIjxzcGFuIC8+IikuYXBwZW5kKHRoaXMuc3JjLnBvcHVwLndpZHRoKS5hcHBlbmQoIiB4ICIpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC5oZWlnaHQpLmFwcGVuZCgiIHB4IildLCJwb3B1cCIsdHJ1ZSkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJXaW5kb3cgcG9zaXRpb24iKSxhKCI8c3BhbiAvPiIpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC5sZWZ0KS5hcHBlbmQoIiB4ICIpLmFwcGVuZCh0aGlzLnNyYy5wb3B1cC50b3ApLmFwcGVuZCgiIHB4IildLCJwb3B1cCIsdHJ1ZSkuc2VwYXJhdG9yKCJwb3B1cCIpLmFwcGVuZChbdCxqXSwicG9wdXAiLHRydWUpO3c9dGhpcy5saW5rLmdldCgwKTtrPXRoaXMucnRlLmRvbS5hdHRyKHcsImhyZWYiKTt0aGlzLnNyYy5tYWluLmhyZWYudmFsKGspLmNoYW5nZShmdW5jdGlvbigpe2EodGhpcykudmFsKGIucnRlLnV0aWxzLmFic29sdXRlVVJMKGEodGhpcykudmFsKCkpKX0pO2lmKHRoaXMucnRlLm9wdGlvbnMuZm1BbGxvdyYmdGhpcy5ydGUub3B0aW9ucy5mbU9wZW4pe3ZhciB6PWEoIjxzcGFuIC8+IikuYXBwZW5kKHRoaXMuc3JjLm1haW4uaHJlZi5jc3MoIndpZHRoIiwiODclIikpLmFwcGVuZChhKCI8c3BhbiAvPiIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKS5jc3MoeyJmbG9hdCI6InJpZ2h0IiwibWFyZ2luLXJpZ2h0IjoiM3B4In0pLmF0dHIoInRpdGxlIixiLnJ0ZS5pMThuKCJPcGVuIGZpbGUgbWFuZ2VyIikpLmFwcGVuZChhKCI8c3BhbiAvPiIpLmFkZENsYXNzKCJ1aS1pY29uIHVpLWljb24tZm9sZGVyLW9wZW4iKSkuY2xpY2soZnVuY3Rpb24oKXtiLnJ0ZS5vcHRpb25zLmZtT3BlbihmdW5jdGlvbihyKXtiLnNyYy5tYWluLmhyZWYudmFsKHIpLmNoYW5nZSgpfSl9KS5ob3ZlcihmdW5jdGlvbigpe2EodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9LGZ1bmN0aW9uKCl7YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKX0pKTtkLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiTGluayBVUkwiKSx6XSwibWFpbiIsdHJ1ZSl9ZWxzZXtkLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiTGluayBVUkwiKSx0aGlzLnNyYy5tYWluLmhyZWZdLCJtYWluIix0cnVlKX10aGlzLnNyYy5tYWluLmhyZWYuY2hhbmdlKCk7ZC5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIlRpdGxlIiksdGhpcy5zcmMubWFpbi50aXRsZS52YWwodGhpcy5ydGUuZG9tLmF0dHIodywidGl0bGUiKSldLCJtYWluIix0cnVlKTtpZih0aGlzLnNyYy5tYWluLmFuY2hvci5jaGlsZHJlbigpLmxlbmd0aCl7ZC5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkJvb2ttYXJrIiksdGhpcy5zcmMubWFpbi5hbmNob3IudmFsKGspXSwibWFpbiIsdHJ1ZSl9aWYoIXRoaXMucnRlLm9wdGlvbnMuZG9jdHlwZS5tYXRjaCgveGh0bWwvKSl7ZC5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIlRhcmdldCIpLHRoaXMuc3JjLm1haW4udGFyZ2V0LnZhbCh0aGlzLmxpbmsuYXR0cigidGFyZ2V0Iil8fCIiKV0sIm1haW4iLHRydWUpfWZvcih2YXIgcCBpbiB0aGlzLnNyYy5hZHYpe3RoaXMuc3JjLmFkdltwXS52YWwodGhpcy5ydGUuZG9tLmF0dHIodyxwKSk7ZC5hcHBlbmQoW3RoaXMucnRlLmkxOG4odGhpcy5sYWJlbHNbcF0/dGhpcy5sYWJlbHNbcF06cCksdGhpcy5zcmMuYWR2W3BdXSwiYWR2Iix0cnVlKX1mb3IodmFyIHAgaW4gdGhpcy5zcmMuZXZlbnRzKXt2YXIgeD10aGlzLnJ0ZS51dGlscy50cmltRXZlbnRDYWxsYmFjayh0aGlzLnJ0ZS5kb20uYXR0cih3LHApKTt0aGlzLnNyYy5ldmVudHNbcF0udmFsKHgpO2QuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKHRoaXMubGFiZWxzW3BdP3RoaXMubGFiZWxzW3BdOnApLHRoaXMuc3JjLmV2ZW50c1twXV0sImV2ZW50cyIsdHJ1ZSl9dGhpcy5zcmMucG9wdXAudXNlLmNoYW5nZShmdW5jdGlvbigpe3ZhciByPWEodGhpcykuYXR0cigiY2hlY2tlZCIpO2EuZWFjaChiLnNyYy5wb3B1cCxmdW5jdGlvbigpe2lmKGEodGhpcykuYXR0cigibmFtZSIpIT0idXNlIil7aWYocil7YSh0aGlzKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpfWVsc2V7YSh0aGlzKS5hdHRyKCJkaXNhYmxlZCIsdHJ1ZSl9fX0pfSk7dGhpcy5zcmMucG9wdXAudXNlLmNoYW5nZSgpO2Qub3BlbigpfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBoPXRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCk7aWYodGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudExpbmsoaCkpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKS5hZGRDbGFzcygiYWN0aXZlIil9ZWxzZXtpZih0aGlzLnJ0ZS5kb20uc2VsZWN0aW9uSGFzKGZ1bmN0aW9uKGope3JldHVybiBqLm5vZGVOYW1lPT0iQSImJmouaHJlZn0pKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIikuYWRkQ2xhc3MoImFjdGl2ZSIpfWVsc2V7aWYoIXRoaXMucnRlLnNlbGVjdGlvbi5jb2xsYXBzZWQoKXx8aC5ub2RlTmFtZT09IklNRyIpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQgYWN0aXZlIil9ZWxzZXt0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImRpc2FibGVkIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpfX19fTt0aGlzLnVwZGF0ZVBvcHVwPWZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5ydGUuZG9tLmF0dHIodGhpcy5saW5rLmdldCgwKSwib25jbGljayIpO2g9aD9hLnRyaW0oaC50b1N0cmluZygpKToiIjtpZihoLmxlbmd0aD4wJiYobT1oLm1hdGNoKC93aW5kb3cub3BlblwoIihbXiJdKykiLFxzKiIoW14iXSopIixccyoiKFteIl0qKSJccyouKlwpO1xzKihyZXR1cm5ccytmYWxzZSk/LykpKXt0aGlzLnNyYy5wb3B1cC51c2UuYXR0cigiY2hlY2tlZCIsIm9uIik7dGhpcy5zcmMucG9wdXAudXJsLnZhbChtWzFdKTt0aGlzLnNyYy5wb3B1cC5uYW1lLnZhbChtWzJdKTtpZigvbG9jYXRpb249eWVzLy50ZXN0KG1bM10pKXt0aGlzLnNyYy5wb3B1cC5sb2NhdGlvbi5hdHRyKCJjaGVja2VkIix0cnVlKX1pZigvbWVudWJhcj15ZXMvLnRlc3QobVszXSkpe3RoaXMuc3JjLnBvcHVwLm1lbnViYXIuYXR0cigiY2hlY2tlZCIsdHJ1ZSl9aWYoL3Rvb2xiYXI9eWVzLy50ZXN0KG1bM10pKXt0aGlzLnNyYy5wb3B1cC50b29sYmFyLmF0dHIoImNoZWNrZWQiLHRydWUpfWlmKC9zY3JvbGxiYXJzPXllcy8udGVzdChtWzNdKSl7dGhpcy5zcmMucG9wdXAuc2Nyb2xsYmFycy5hdHRyKCJjaGVja2VkIix0cnVlKX1pZigvc3RhdHVzPXllcy8udGVzdChtWzNdKSl7dGhpcy5zcmMucG9wdXAuc3RhdHVzLmF0dHIoImNoZWNrZWQiLHRydWUpfWlmKC9yZXNpemFibGU9eWVzLy50ZXN0KG1bM10pKXt0aGlzLnNyYy5wb3B1cC5yZXNpemFibGUuYXR0cigiY2hlY2tlZCIsdHJ1ZSl9aWYoL2RlcGVuZGVudD15ZXMvLnRlc3QobVszXSkpe3RoaXMuc3JjLnBvcHVwLmRlcGVuZGVudC5hdHRyKCJjaGVja2VkIix0cnVlKX1pZigoX209bVszXS5tYXRjaCgvd2lkdGg9KFteLF0rKS8pKSl7dGhpcy5zcmMucG9wdXAud2lkdGgudmFsKF9tWzFdKX1pZigoX209bVszXS5tYXRjaCgvaGVpZ2h0PShbXixdKykvKSkpe3RoaXMuc3JjLnBvcHVwLmhlaWdodC52YWwoX21bMV0pfWlmKChfbT1tWzNdLm1hdGNoKC9sZWZ0PShbXixdKykvKSkpe3RoaXMuc3JjLnBvcHVwLmxlZnQudmFsKF9tWzFdKX1pZigoX209bVszXS5tYXRjaCgvdG9wPShbXixdKykvKSkpe3RoaXMuc3JjLnBvcHVwLnRvcC52YWwoX21bMV0pfWlmKG1bNF0pe3RoaXMuc3JjLnBvcHVwLnJldGZhbHNlLmF0dHIoImNoZWNrZWQiLHRydWUpfX1lbHNle2EuZWFjaCh0aGlzLnNyYy5wb3B1cCxmdW5jdGlvbigpe3ZhciBqPWEodGhpcyk7aWYoai5hdHRyKCJ0eXBlIik9PSJ0ZXh0Iil7ai52YWwoai5hdHRyKCJuYW1lIik9PSJ1cmwiPyJodHRwOi8vIjoiIil9ZWxzZXtpZihqLmF0dHIoIm5hbWUiKT09InJldGZhbHNlIil7dGhpcy5hdHRyKCJjaGVja2VkIix0cnVlKX1lbHNle2oucmVtb3ZlQXR0cigiY2hlY2tlZCIpfX19KX19O3RoaXMudXBkYXRlT25jbGljaz1mdW5jdGlvbigpe3ZhciBvPXRoaXMuc3JjLnBvcHVwLnVybC52YWwoKTtpZih0aGlzLnNyYy5wb3B1cC51c2UuYXR0cigiY2hlY2tlZCIpJiZvKXt2YXIgcD0iIjtpZih0aGlzLnNyYy5wb3B1cC5sb2NhdGlvbi5hdHRyKCJjaGVja2VkIikpe3ArPSJsb2NhdGlvbj15ZXMsIn1pZih0aGlzLnNyYy5wb3B1cC5tZW51YmFyLmF0dHIoImNoZWNrZWQiKSl7cCs9Im1lbnViYXI9eWVzLCJ9aWYodGhpcy5zcmMucG9wdXAudG9vbGJhci5hdHRyKCJjaGVja2VkIikpe3ArPSJ0b29sYmFyPXllcywifWlmKHRoaXMuc3JjLnBvcHVwLnNjcm9sbGJhcnMuYXR0cigiY2hlY2tlZCIpKXtwKz0ic2Nyb2xsYmFycz15ZXMsIn1pZih0aGlzLnNyYy5wb3B1cC5zdGF0dXMuYXR0cigiY2hlY2tlZCIpKXtwKz0ic3RhdHVzPXllcywifWlmKHRoaXMuc3JjLnBvcHVwLnJlc2l6YWJsZS5hdHRyKCJjaGVja2VkIikpe3ArPSJyZXNpemFibGU9eWVzLCJ9aWYodGhpcy5zcmMucG9wdXAuZGVwZW5kZW50LmF0dHIoImNoZWNrZWQiKSl7cCs9ImRlcGVuZGVudD15ZXMsIn1pZih0aGlzLnNyYy5wb3B1cC53aWR0aC52YWwoKSl7cCs9IndpZHRoPSIrdGhpcy5zcmMucG9wdXAud2lkdGgudmFsKCkrIiwifWlmKHRoaXMuc3JjLnBvcHVwLmhlaWdodC52YWwoKSl7cCs9ImhlaWdodD0iK3RoaXMuc3JjLnBvcHVwLmhlaWdodC52YWwoKSsiLCJ9aWYodGhpcy5zcmMucG9wdXAubGVmdC52YWwoKSl7cCs9ImxlZnQ9Iit0aGlzLnNyYy5wb3B1cC5sZWZ0LnZhbCgpKyIsIn1pZih0aGlzLnNyYy5wb3B1cC50b3AudmFsKCkpe3ArPSJ0b3A9Iit0aGlzLnNyYy5wb3B1cC50b3AudmFsKCkrIiwifWlmKHAubGVuZ3RoPjApe3A9cC5zdWJzdHJpbmcoMCxwLmxlbmd0aC0xKX12YXIgaj10aGlzLnNyYy5wb3B1cC5yZXRmYWxzZS5hdHRyKCJjaGVja2VkIik/InJldHVybiBmYWxzZTsiOiIiO3ZhciBrPSd3aW5kb3cub3BlbigiJytvKyciLCAiJythLnRyaW0odGhpcy5zcmMucG9wdXAubmFtZS52YWwoKSkrJyIsICInK3ArJyIpOycrajt0aGlzLnNyYy5ldmVudHMub25jbGljay52YWwoayk7aWYoIXRoaXMuc3JjLm1haW4uaHJlZi52YWwoKSl7dGhpcy5zcmMubWFpbi5ocmVmLnZhbCgiIyIpfX1lbHNle3ZhciBoPXRoaXMuc3JjLmV2ZW50cy5vbmNsaWNrLnZhbCgpO2g9aC5yZXBsYWNlKC93aW5kb3dcLm9wZW5cKFteXCldK1wpXHMqOz9ccypyZXR1cm5ccypmYWxzZVxzKjs/L2ksIiIpO3RoaXMuc3JjLmV2ZW50cy5vbmNsaWNrLnZhbChoKX19O3RoaXMuc2V0PWZ1bmN0aW9uKCl7dmFyIGosazt0aGlzLnVwZGF0ZU9uY2xpY2soKTt0aGlzLnJ0ZS5zZWxlY3Rpb24ucmVzdG9yZUlFUmFuZ2UoKTt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpO2o9dGhpcy5ydGUudXRpbHMuYWJzb2x1dGVVUkwodGhpcy5zcmMubWFpbi5ocmVmLnZhbCgpKTtpZighail7dmFyIHA9dGhpcy5ydGUuc2VsZWN0aW9uLmdldEJvb2ttYXJrKCk7dGhpcy5ydGUuZG9tLnVud3JhcCh0aGlzLmxpbmtbMF0pO3RoaXMucnRlLnNlbGVjdGlvbi5tb3ZlVG9Cb29rbWFyayhwKX1lbHNle2lmKCF0aGlzLmxpbmtbMF0ucGFyZW50Tm9kZSl7aWYodGhpcy5pbWcmJnRoaXMuaW1nLnBhcmVudE5vZGUpe3RoaXMubGluaz1hKHRoaXMucnRlLmRvbS5jcmVhdGUoImEiKSkuYXR0cigiaHJlZiIsaik7dGhpcy5ydGUuZG9tLndyYXAodGhpcy5pbWcsdGhpcy5saW5rWzBdKX1lbHNle2s9IiMtLWVsLWVkaXRvci0tLSIrTWF0aC5yYW5kb20oKTt0aGlzLnJ0ZS5kb2MuZXhlY0NvbW1hbmQoImNyZWF0ZUxpbmsiLGZhbHNlLGspO3RoaXMubGluaz1hKCdhW2hyZWY9IicraysnIl0nLHRoaXMucnRlLmRvYyk7dGhpcy5saW5rLmVhY2goZnVuY3Rpb24oKXt2YXIgcj1hKHRoaXMpO2lmKCFhLnRyaW0oci5odG1sKCkpJiYhYS50cmltKHIudGV4dCgpKSl7ci5yZXBsYWNlV2l0aChyLnRleHQoKSl9fSl9fXRoaXMuc3JjLm1haW4uaHJlZi52YWwoaik7Zm9yKHZhciBvIGluIHRoaXMuc3JjKXtpZihvIT0icG9wdXAiKXtmb3IodmFyIHEgaW4gdGhpcy5zcmNbb10pe2lmKHEhPSJhbmNob3JzIil7dmFyIGg9YS50cmltKHRoaXMuc3JjW29dW3FdLnZhbCgpKTtpZihoKXt0aGlzLmxpbmsuYXR0cihxLGgpfWVsc2V7dGhpcy5saW5rLnJlbW92ZUF0dHIocSl9fX19fXRoaXMuaW1nJiZ0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0KHRoaXMuaW1nKX10aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSl9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5uYnNwPWZ1bmN0aW9uKGMsYil7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGMsYik7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dGhpcy5ydGUuaGlzdG9yeS5hZGQoKTt0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0SHRtbCgiJm5ic3A7Iix0cnVlKTt0aGlzLnJ0ZS53aW5kb3cuZm9jdXMoKTt0aGlzLnJ0ZS51aS51cGRhdGUoKX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIil9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5vdXRkZW50PWZ1bmN0aW9uKGYsYyl7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGYsYyk7dmFyIGI9dGhpczt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt2YXIgZz10aGlzLmZpbmQoKTtpZihnLm5vZGUpe3RoaXMucnRlLmhpc3RvcnkuYWRkKCk7YShnLm5vZGUpLmNzcyhnLnR5cGUsKGcudmFsPjQwP2cudmFsLTQwOjApKyJweCIpO3RoaXMucnRlLnVpLnVwZGF0ZSgpfX07dGhpcy5maW5kPWZ1bmN0aW9uKGope2Z1bmN0aW9uIGcocCl7dmFyIGs9e3R5cGU6IiIsdmFsOjB9O3ZhciBvO2lmKChvPWIucnRlLmRvbS5hdHRyKHAsInN0eWxlIikpKXtrLnR5cGU9by5pbmRleE9mKCJwYWRkaW5nLWxlZnQiKSE9LTE/InBhZGRpbmctbGVmdCI6KG8uaW5kZXhPZigibWFyZ2luLWxlZnQiKSE9LTE/Im1hcmdpbi1sZWZ0IjoiIik7ay52YWw9ay50eXBlP3BhcnNlSW50KGEocCkuY3NzKGsudHlwZSkpfHwwOjB9cmV0dXJuIGt9dmFyIGo9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKTt2YXIgaD1nKGopO2lmKGgudmFsKXtoLm5vZGU9an1lbHNle2EuZWFjaCh0aGlzLnJ0ZS5kb20ucGFyZW50cyhqLCIqIiksZnVuY3Rpb24oKXtoPWcodGhpcyk7aWYoaC52YWwpe2gubm9kZT10aGlzO3JldHVybiBofX0pfXJldHVybiBofTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBnPXRoaXMuZmluZCgpO2lmKGcubm9kZSl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpfWVsc2V7dGhpcy5kb21FbGVtLmFkZENsYXNzKCJkaXNhYmxlZCIpfX19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnBhZ2VicmVhaz1mdW5jdGlvbihjLGIpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxjLGIpO2EodGhpcy5ydGUuZG9jLmJvZHkpLmJpbmQoIm1vdXNlZG93biIsZnVuY3Rpb24oZil7aWYoYShmLnRhcmdldCkuaGFzQ2xhc3MoImVscnRlLXBhZ2VicmVhayIpKXtmLnByZXZlbnREZWZhdWx0KCl9fSk7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dGhpcy5ydGUuc2VsZWN0aW9uLmluc2VydEh0bWwoJzxpbWcgc3JjPSInK3RoaXMucnRlLmZpbHRlci51cmwrJ3BpeGVsLmdpZiIgY2xhc3M9ImVscnRlLXByb3RlY3RlZCBlbHJ0ZS1wYWdlYnJlYWsiLz4nLGZhbHNlKX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIil9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy5wYXN0ZWZvcm1hdHRleHQ9ZnVuY3Rpb24oZixjKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZixjKTt0aGlzLmlmcmFtZT1hKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpKS5hZGRDbGFzcygiZWwtcnRlLXBhc3RlLWlucHV0Iik7dGhpcy5kb2M9bnVsbDt2YXIgYj10aGlzO3RoaXMuY29tbWFuZD1mdW5jdGlvbigpe3RoaXMucnRlLnNlbGVjdGlvbi5zYXZlSUVSYW5nZSgpO3ZhciBnPXRoaXMsaD17c3VibWl0OmZ1bmN0aW9uKG8scCl7by5zdG9wUHJvcGFnYXRpb24oKTtvLnByZXZlbnREZWZhdWx0KCk7Zy5wYXN0ZSgpO3AuY2xvc2UoKX0sZGlhbG9nOnt3aWR0aDo1MDAsdGl0bGU6dGhpcy5ydGUuaTE4bigiUGFzdGUgZm9ybWF0dGVkIHRleHQiKX19LGs9bmV3IGVsRGlhbG9nRm9ybShoKTtrLmFwcGVuZCh0aGlzLmlmcmFtZSkub3BlbigpO3RoaXMuZG9jPXRoaXMuaWZyYW1lLmdldCgwKS5jb250ZW50V2luZG93LmRvY3VtZW50O2h0bWw9dGhpcy5ydGUub3B0aW9ucy5kb2N0eXBlKyc8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIC8+JztodG1sKz0iPC9oZWFkPjxib2R5PiA8YnIgLz4gPC9ib2R5PjwvaHRtbD4iO3RoaXMuZG9jLm9wZW4oKTt0aGlzLmRvYy53cml0ZShodG1sKTt0aGlzLmRvYy5jbG9zZSgpO2lmKCF0aGlzLnJ0ZS5icm93c2VyLm1zaWUpe3RyeXt0aGlzLmRvYy5kZXNpZ25Nb2RlPSJvbiJ9Y2F0Y2goail7fX1lbHNle3RoaXMuZG9jLmJvZHkuY29udGVudEVkaXRhYmxlPXRydWV9c2V0VGltZW91dChmdW5jdGlvbigpe2cuaWZyYW1lWzBdLmNvbnRlbnRXaW5kb3cuZm9jdXMoKX0sNTApfTt0aGlzLnBhc3RlPWZ1bmN0aW9uKCl7YSh0aGlzLmRvYy5ib2R5KS5maW5kKCJbY2xhc3NdIikucmVtb3ZlQXR0cigiY2xhc3MiKTt2YXIgZz1hLnRyaW0oYSh0aGlzLmRvYy5ib2R5KS5odG1sKCkpO2lmKGcpe3RoaXMucnRlLmhpc3RvcnkuYWRkKCk7dGhpcy5ydGUuc2VsZWN0aW9uLnJlc3RvcmVJRVJhbmdlKCk7dGhpcy5ydGUuc2VsZWN0aW9uLmluc2VydEh0bWwodGhpcy5ydGUuZmlsdGVyLnd5c2l3eWcyd3lzaXd5Zyh0aGlzLnJ0ZS5maWx0ZXIucHJvY2Nlc3MoInBhc3RlIixnKSkpO3RoaXMucnRlLnVpLnVwZGF0ZSh0cnVlKX19O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpfX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMucGFzdGV0ZXh0PWZ1bmN0aW9uKGYsYyl7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGYsYyk7dGhpcy5pbnB1dD1hKCI8dGV4dGFyZWEgLz4iKS5hZGRDbGFzcygiZWwtcnRlLXBhc3RlLWlucHV0Iik7dmFyIGI9dGhpczt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt0aGlzLnJ0ZS5icm93c2VyLm1zaWUmJnRoaXMucnRlLnNlbGVjdGlvbi5zYXZlSUVSYW5nZSgpO3ZhciBnPXtzdWJtaXQ6ZnVuY3Rpb24oaixrKXtqLnN0b3BQcm9wYWdhdGlvbigpO2oucHJldmVudERlZmF1bHQoKTtiLnBhc3RlKCk7ay5jbG9zZSgpfSxkaWFsb2c6e3dpZHRoOjUwMCx0aXRsZTp0aGlzLnJ0ZS5pMThuKCJQYXN0ZSBvbmx5IHRleHQiKX19O3ZhciBoPW5ldyBlbERpYWxvZ0Zvcm0oZyk7aC5hcHBlbmQodGhpcy5pbnB1dCkub3BlbigpfTt0aGlzLnBhc3RlPWZ1bmN0aW9uKCl7dmFyIGc9YS50cmltKHRoaXMuaW5wdXQudmFsKCkpO2lmKGcpe3RoaXMucnRlLmhpc3RvcnkuYWRkKCk7dGhpcy5ydGUuYnJvd3Nlci5tc2llJiZ0aGlzLnJ0ZS5zZWxlY3Rpb24ucmVzdG9yZUlFUmFuZ2UoKTt0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0VGV4dChnLnJlcGxhY2UoL1xyP1xuL2csIjxiciAvPiIpLHRydWUpO3RoaXMucnRlLnVpLnVwZGF0ZSh0cnVlKX10aGlzLmlucHV0LnZhbCgiIil9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpfX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMuc2F2ZT1mdW5jdGlvbihjLGIpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxjLGIpO3RoaXMuYWN0aXZlPXRydWU7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dGhpcy5ydGUuc2F2ZSgpfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe319fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnNtaWxleT1mdW5jdGlvbihmLGMpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxmLGMpO3ZhciBiPXRoaXM7dGhpcy5pbWc9bnVsbDt0aGlzLnVybD10aGlzLnJ0ZS5maWx0ZXIudXJsKyJzbWlsZXlzLyI7dGhpcy5zbWlsZXlzPXtzbWlsZToic21pbGUucG5nIixoYXBweToiaGFwcHkucG5nIix0b25ndWU6InRvbmd1ZS5wbmciLHN1cnByaXNlZDoic3VycHJpc2VkLnBuZyIsd2FpaToid2FpaS5wbmciLHdpbms6IndpbmsucG5nIixldmlsZ3JpbjoiZXZpbGdyaW4ucG5nIixncmluOiJncmluLnBuZyIsdW5oYXBweToidW5oYXBweS5wbmcifTt0aGlzLndpZHRoPTEyMDt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt2YXIgaD10aGlzLGo9dGhpcy51cmwsbyxrLGc7dGhpcy5ydGUuYnJvd3Nlci5tc2llJiZ0aGlzLnJ0ZS5zZWxlY3Rpb24uc2F2ZUlFUmFuZ2UoKTtrPXtkaWFsb2c6e2hlaWdodDoxMjAsd2lkdGg6dGhpcy53aWR0aCx0aXRsZTp0aGlzLnJ0ZS5pMThuKCJTbWlsZXkiKSxidXR0b25zOnt9fX07bz1uZXcgZWxEaWFsb2dGb3JtKGspO2EuZWFjaCh0aGlzLnNtaWxleXMsZnVuY3Rpb24ocSxwKXtvLmFwcGVuZChhKCc8aW1nIHNyYz0iJytqK3ArJyIgdGl0bGU9IicrcSsnIiBpZD0iJytxKyciIGNsYXNzPSJlbC1ydGUtc21pbGV5Ii8+JykuY2xpY2soZnVuY3Rpb24oKXtoLnNldCh0aGlzLmlkLG8pfSkpfSk7by5vcGVuKCl9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpO3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiYWN0aXZlIil9O3RoaXMuc2V0PWZ1bmN0aW9uKGcsaCl7dGhpcy5ydGUuYnJvd3Nlci5tc2llJiZ0aGlzLnJ0ZS5zZWxlY3Rpb24ucmVzdG9yZUlFUmFuZ2UoKTtpZih0aGlzLnNtaWxleXNbZ10pe3RoaXMuaW1nPWEodGhpcy5ydGUuZG9jLmNyZWF0ZUVsZW1lbnQoImltZyIpKTt0aGlzLmltZy5hdHRyKHtzcmM6dGhpcy51cmwrdGhpcy5zbWlsZXlzW2ddLHRpdGxlOmcsYWx0Omd9KTt0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0Tm9kZSh0aGlzLmltZy5nZXQoMCkpO3RoaXMucnRlLnVpLnVwZGF0ZSgpfWguY2xvc2UoKX19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnN0b3BmbG9hdD1mdW5jdGlvbihjLGIpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxjLGIpO3RoaXMuZmluZD1mdW5jdGlvbigpe2lmKHRoaXMucnRlLnNlbGVjdGlvbi5jb2xsYXBzZWQoKSl7dmFyIGY9dGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0RW5kKCksL15ESVYkLyk7aWYoZiYmKHRoaXMucnRlLmRvbS5hdHRyKGYsImNsZWFyIil8fGEoZikuY3NzKCJjbGVhciIpIT0ibm9uZSIpKXtyZXR1cm4gZn19fTt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt2YXIgZjtpZigoZj10aGlzLmZpbmQoKSkpe3ZhciBmPWEoZik7dGhpcy5ydGUuaGlzdG9yeS5hZGQoKTtpZighZi5jaGlsZHJlbigpLmxlbmd0aCYmIWEudHJpbShmLnRleHQoKSkubGVuZ3RoKXtmLnJlbW92ZSgpfWVsc2V7Zi5yZW1vdmVBdHRyKCJjbGVhciIpLmNzcygiY2xlYXIiLCIiKX19ZWxzZXt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpO3RoaXMucnRlLnNlbGVjdGlvbi5pbnNlcnROb2RlKGEodGhpcy5ydGUuZG9tLmNyZWF0ZSgiZGl2IikpLmNzcygiY2xlYXIiLCJib3RoIikuZ2V0KDApLHRydWUpfXRoaXMucnRlLnVpLnVwZGF0ZSh0cnVlKX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7aWYodGhpcy5maW5kKCkpe3RoaXMuZG9tRWxlbS5hZGRDbGFzcygiYWN0aXZlIil9ZWxzZXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpfX19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnRhYmxlPWZ1bmN0aW9uKGYsYyl7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGYsYyk7dmFyIGI9dGhpczt0aGlzLnNyYz1udWxsO3RoaXMubGFiZWxzPW51bGw7ZnVuY3Rpb24gZygpe2IubGFiZWxzPXttYWluOiJQcm9wZXJpZXMiLGFkdjoiQWR2YW5jZWQiLGV2ZW50czoiRXZlbnRzIixpZDoiSUQiLCJjbGFzcyI6IkNzcyBjbGFzcyIsc3R5bGU6IkNzcyBzdHlsZSIsZGlyOiJTY3JpcHQgZGlyZWN0aW9uIixzdW1tYXJ5OiJTdW1tYXJ5IixsYW5nOiJMYW5ndWFnZSIsaHJlZjoiVVJMIn07Yi5zcmM9e21haW46e2NhcHRpb246YSgnPGlucHV0IHR5cGU9InRleHQiIC8+Jykscm93czphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCJzaXplIiw1KS52YWwoMiksY29sczphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCJzaXplIiw1KS52YWwoMiksd2lkdGg6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cigic2l6ZSIsNSksd3VuaXQ6YSgiPHNlbGVjdCAvPiIpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCIlIikudGV4dCgiJSIpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgicHgiKS50ZXh0KCJweCIpKSxoZWlnaHQ6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cigic2l6ZSIsNSksaHVuaXQ6YSgiPHNlbGVjdCAvPiIpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCIlIikudGV4dCgiJSIpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgicHgiKS50ZXh0KCJweCIpKSxhbGlnbjphKCI8c2VsZWN0IC8+IikuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoIiIpLnRleHQoYi5ydGUuaTE4bigiTm90IHNldCIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoImxlZnQiKS50ZXh0KGIucnRlLmkxOG4oIkxlZnQiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJjZW50ZXIiKS50ZXh0KGIucnRlLmkxOG4oIkNlbnRlciIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoInJpZ2h0IikudGV4dChiLnJ0ZS5pMThuKCJSaWdodCIpKSksc3BhY2luZzphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCJzaXplIiw1KSxwYWRkaW5nOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoInNpemUiLDUpLGJvcmRlcjphKCI8ZGl2IC8+IikscnVsZXM6YSgiPHNlbGVjdCAvPiIpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJub25lIikudGV4dChiLnJ0ZS5pMThuKCJObyIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoImFsbCIpLnRleHQoYi5ydGUuaTE4bigiQ2VsbHMiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJncm91cHMiKS50ZXh0KGIucnRlLmkxOG4oIkdyb3VwcyIpKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoInJvd3MiKS50ZXh0KGIucnRlLmkxOG4oIlJvd3MiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJjb2xzIikudGV4dChiLnJ0ZS5pMThuKCJDb2x1bW5zIikpKSxtYXJnaW46YSgiPGRpdiAvPiIpLGJnOmEoIjxkaXYgLz4iKSxiZ2ltZzphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoIndpZHRoIiwiOTAlIil9LGFkdjp7aWQ6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+Jyksc3VtbWFyeTphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSwiY2xhc3MiOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLHN0eWxlOmEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLGRpcjphKCI8c2VsZWN0IC8+IikuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS50ZXh0KGIucnRlLmkxOG4oIk5vdCBzZXQiKSkudmFsKCIiKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS50ZXh0KGIucnRlLmkxOG4oIkxlZnQgdG8gcmlnaHQiKSkudmFsKCJsdHIiKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS50ZXh0KGIucnRlLmkxOG4oIlJpZ2h0IHRvIGxlZnQiKSkudmFsKCJydGwiKSksbGFuZzphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKX0sZXZlbnRzOnt9fTthLmVhY2goYi5zcmMsZnVuY3Rpb24oKXtmb3IodmFyIGogaW4gdGhpcyl7dGhpc1tqXS5hdHRyKCJuYW1lIixqKTt2YXIgaD10aGlzW2pdLmdldCgwKS5ub2RlTmFtZTtpZihoPT0iSU5QVVQiJiZqIT0iYmdpbWciKXt0aGlzW2pdLmNzcyh0aGlzW2pdLmF0dHIoInNpemUiKT97InRleHQtYWxpZ24iOiJyaWdodCJ9Ont3aWR0aDoiMTAwJSJ9KX1lbHNle2lmKGg9PSJTRUxFQ1QiJiZqIT0id3VuaXQiJiZqIT0iaHVuaXQiKXt0aGlzW2pdLmNzcygid2lkdGgiLCIxMDAlIil9fX19KTthLmVhY2goWyJvbmJsdXIiLCJvbmZvY3VzIiwib25jbGljayIsIm9uZGJsY2xpY2siLCJvbm1vdXNlZG93biIsIm9ubW91c2V1cCIsIm9ubW91c2VvdmVyIiwib25tb3VzZW91dCIsIm9ubW91c2VsZWF2ZSIsIm9ua2V5ZG93biIsIm9ua2V5cHJlc3MiLCJvbmtleXVwIl0sZnVuY3Rpb24oKXtiLnNyYy5ldmVudHNbdGhpc109YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JykuYXR0cigibmFtZSIsdGhpcykuY3NzKCJ3aWR0aCIsIjEwMCUiKX0pO2Iuc3JjLm1haW4uYWxpZ24uY2hhbmdlKGZ1bmN0aW9uKCl7dmFyIGo9YSh0aGlzKS52YWwoKTtpZihqPT0iY2VudGVyIil7Yi5zcmMubWFpbi5tYXJnaW4udmFsKHtsZWZ0OiJhdXRvIixyaWdodDoiYXV0byJ9KX1lbHNle3ZhciBoPWIuc3JjLm1haW4ubWFyZ2luLnZhbCgpO2lmKGgubGVmdD09ImF1dG8iJiZoLnJpZ2h0PT0iYXV0byIpe2Iuc3JjLm1haW4ubWFyZ2luLnZhbCh7bGVmdDoiIixyaWdodDoiIn0pfX19KTtiLnNyYy5tYWluLmJnaW1nLmNoYW5nZShmdW5jdGlvbigpe3ZhciBoPWEodGhpcyk7aC52YWwoYi5ydGUudXRpbHMuYWJzb2x1dGVVUkwoaC52YWwoKSkpfSl9dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLC9eVEFCTEUkLyk7aWYodGhpcy5uYW1lPT0idGFibGUiKXt0aGlzLnRhYmxlPWEodGhpcy5ydGUuZG9jLmNyZWF0ZUVsZW1lbnQoInRhYmxlIikpfWVsc2V7dGhpcy50YWJsZT1yP2Eocik6YSh0aGlzLnJ0ZS5kb2MuY3JlYXRlRWxlbWVudCgidGFibGUiKSl9IXRoaXMuc3JjJiZnKCk7dGhpcy5zcmMubWFpbi5ib3JkZXIuZWxCb3JkZXJTZWxlY3Qoe3N0eWxlSGVpZ2h0OjExN30pO3RoaXMuc3JjLm1haW4uYmcuZWxDb2xvclBpY2tlcih7cGFsZXR0ZVBvc2l0aW9uOiJvdXRlciIsImNsYXNzIjoiZWwtY29sb3JwaWNrZXIgdWktaWNvbiB1aS1pY29uLXBlbmNpbCJ9KTt0aGlzLnNyYy5tYWluLm1hcmdpbi5lbFBhZGRpbmdJbnB1dCh7dHlwZToibWFyZ2luIix2YWx1ZTp0aGlzLnRhYmxlfSk7aWYodGhpcy50YWJsZS5wYXJlbnRzKCkubGVuZ3RoKXt0aGlzLnNyYy5tYWluLnJvd3MudmFsKCIiKS5hdHRyKCJkaXNhYmxlZCIsdHJ1ZSk7dGhpcy5zcmMubWFpbi5jb2xzLnZhbCgiIikuYXR0cigiZGlzYWJsZWQiLHRydWUpfWVsc2V7dGhpcy5zcmMubWFpbi5yb3dzLnZhbCgyKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpO3RoaXMuc3JjLm1haW4uY29scy52YWwoMikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKX12YXIgRD10aGlzLnRhYmxlLmNzcygid2lkdGgiKXx8dGhpcy50YWJsZS5hdHRyKCJ3aWR0aCIpO3RoaXMuc3JjLm1haW4ud2lkdGgudmFsKHBhcnNlSW50KEQpfHwiIik7dGhpcy5zcmMubWFpbi53dW5pdC52YWwoRC5pbmRleE9mKCJweCIpIT0tMT8icHgiOiIlIik7dmFyIHo9dGhpcy50YWJsZS5jc3MoImhlaWdodCIpfHx0aGlzLnRhYmxlLmF0dHIoImhlaWdodCIpO3RoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbChwYXJzZUludCh6KXx8IiIpO3RoaXMuc3JjLm1haW4uaHVuaXQudmFsKHomJnouaW5kZXhPZigicHgiKSE9LTE/InB4IjoiJSIpO3ZhciBCPXRoaXMudGFibGUuY3NzKCJmbG9hdCIpO3RoaXMuc3JjLm1haW4uYWxpZ24udmFsKCIiKTtpZihCPT0ibGVmdCJ8fEI9PSJyaWdodCIpe3RoaXMuc3JjLm1haW4uYWxpZ24udmFsKEIpfWVsc2V7dmFyIHQ9dGhpcy50YWJsZS5jc3MoIm1hcmdpbi1sZWZ0Iik7dmFyIHA9dGhpcy50YWJsZS5jc3MoIm1hcmdpbi1yaWdodCIpO2lmKHQ9PSJhdXRvIiYmcD09ImF1dG8iKXt0aGlzLnNyYy5tYWluLmFsaWduLnZhbCgiY2VudGVyIil9fXRoaXMuc3JjLm1haW4uYm9yZGVyLnZhbCh0aGlzLnRhYmxlKTt0aGlzLnNyYy5tYWluLnJ1bGVzLnZhbCh0aGlzLnJ0ZS5kb20uYXR0cih0aGlzLnRhYmxlLmdldCgwKSwicnVsZXMiKSk7dGhpcy5zcmMubWFpbi5iZy52YWwodGhpcy50YWJsZS5jc3MoImJhY2tncm91bmQtY29sb3IiKSk7dmFyIGo9KHRoaXMudGFibGUuY3NzKCJiYWNrZ3JvdW5kLWltYWdlIil8fCIiKS5yZXBsYWNlKC91cmxcKChbXlwpXSspXCkvaSwiJDEiKTt0aGlzLnNyYy5tYWluLmJnaW1nLnZhbChqIT0ibm9uZSI/ajoiIik7dmFyIGs9e3J0bDp0aGlzLnJ0ZS5ydGwsc3VibWl0OmZ1bmN0aW9uKGgsdil7aC5zdG9wUHJvcGFnYXRpb24oKTtoLnByZXZlbnREZWZhdWx0KCk7Yi5zZXQoKTt2LmNsb3NlKCl9LGRpYWxvZzp7d2lkdGg6NTMwLHRpdGxlOnRoaXMucnRlLmkxOG4oIlRhYmxlIil9fTt2YXIgQz1uZXcgZWxEaWFsb2dGb3JtKGspO2Zvcih2YXIgcSBpbiB0aGlzLnNyYyl7Qy50YWIocSx0aGlzLnJ0ZS5pMThuKHRoaXMubGFiZWxzW3FdKSk7aWYocT09Im1haW4iKXt2YXIgQT1hKCI8dGFibGUgLz4iKS5hcHBlbmQoYSgiPHRyIC8+IikuYXBwZW5kKCI8dGQ+Iit0aGlzLnJ0ZS5pMThuKCJSb3dzIikrIjwvdGQ+IikuYXBwZW5kKGEoIjx0ZCAvPiIpLmFwcGVuZCh0aGlzLnNyYy5tYWluLnJvd3MpKSkuYXBwZW5kKGEoIjx0ciAvPiIpLmFwcGVuZCgiPHRkPiIrdGhpcy5ydGUuaTE4bigiQ29sdW1ucyIpKyI8L3RkPiIpLmFwcGVuZChhKCI8dGQgLz4iKS5hcHBlbmQodGhpcy5zcmMubWFpbi5jb2xzKSkpO3ZhciB4PWEoIjx0YWJsZSAvPiIpLmFwcGVuZChhKCI8dHIgLz4iKS5hcHBlbmQoIjx0ZD4iK3RoaXMucnRlLmkxOG4oIldpZHRoIikrIjwvdGQ+IikuYXBwZW5kKGEoIjx0ZCAvPiIpLmFwcGVuZCh0aGlzLnNyYy5tYWluLndpZHRoKS5hcHBlbmQodGhpcy5zcmMubWFpbi53dW5pdCkpKS5hcHBlbmQoYSgiPHRyIC8+IikuYXBwZW5kKCI8dGQ+Iit0aGlzLnJ0ZS5pMThuKCJIZWlnaHQiKSsiPC90ZD4iKS5hcHBlbmQoYSgiPHRkIC8+IikuYXBwZW5kKHRoaXMuc3JjLm1haW4uaGVpZ2h0KS5hcHBlbmQodGhpcy5zcmMubWFpbi5odW5pdCkpKTt2YXIgdT1hKCI8dGFibGUgLz4iKS5hcHBlbmQoYSgiPHRyIC8+IikuYXBwZW5kKCI8dGQ+Iit0aGlzLnJ0ZS5pMThuKCJTcGFjaW5nIikrIjwvdGQ+IikuYXBwZW5kKGEoIjx0ZCAvPiIpLmFwcGVuZCh0aGlzLnNyYy5tYWluLnNwYWNpbmcudmFsKHRoaXMudGFibGUuYXR0cigiY2VsbHNwYWNpbmciKXx8IiIpKSkpLmFwcGVuZChhKCI8dHIgLz4iKS5hcHBlbmQoIjx0ZD4iK3RoaXMucnRlLmkxOG4oIlBhZGRpbmciKSsiPC90ZD4iKS5hcHBlbmQoYSgiPHRkIC8+IikuYXBwZW5kKHRoaXMuc3JjLm1haW4ucGFkZGluZy52YWwodGhpcy50YWJsZS5hdHRyKCJjZWxscGFkZGluZyIpfHwiIikpKSk7Qy5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkNhcHRpb24iKSx0aGlzLnNyYy5tYWluLmNhcHRpb24udmFsKHRoaXMudGFibGUuZmluZCgiY2FwdGlvbiIpLmVxKDApLnRleHQoKXx8IiIpXSwibWFpbiIsdHJ1ZSkuc2VwYXJhdG9yKCJtYWluIikuYXBwZW5kKFtBLHgsdV0sIm1haW4iLHRydWUpLnNlcGFyYXRvcigibWFpbiIpLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiQm9yZGVyIiksdGhpcy5zcmMubWFpbi5ib3JkZXJdLCJtYWluIix0cnVlKS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIklubmVyIGJvcmRlcnMiKSx0aGlzLnNyYy5tYWluLnJ1bGVzXSwibWFpbiIsdHJ1ZSkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJBbGlnbm1lbnQiKSx0aGlzLnNyYy5tYWluLmFsaWduXSwibWFpbiIsdHJ1ZSkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJNYXJnaW5zIiksdGhpcy5zcmMubWFpbi5tYXJnaW5dLCJtYWluIix0cnVlKS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkJhY2tncm91bmQiKSxhKCI8c3BhbiAvPiIpLmFwcGVuZChhKCI8c3BhbiAvPiIpLmNzcyh7ImZsb2F0IjoibGVmdCIsIm1hcmdpbi1yaWdodCI6IjNweCJ9KS5hcHBlbmQodGhpcy5zcmMubWFpbi5iZykpLmFwcGVuZCh0aGlzLnNyYy5tYWluLmJnaW1nKV0sIm1haW4iLHRydWUpfWVsc2V7Zm9yKHZhciBvIGluIHRoaXMuc3JjW3FdKXt2YXIgRT10aGlzLnJ0ZS5kb20uYXR0cih0aGlzLnRhYmxlLG8pO2lmKHE9PSJldmVudHMiKXtFPXRoaXMucnRlLnV0aWxzLnRyaW1FdmVudENhbGxiYWNrKEUpfUMuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKHRoaXMubGFiZWxzW29dP3RoaXMubGFiZWxzW29dOm8pLHRoaXMuc3JjW3FdW29dLnZhbChFKV0scSx0cnVlKX19fUMub3BlbigpfTt0aGlzLnNldD1mdW5jdGlvbigpe2lmKCF0aGlzLnRhYmxlLnBhcmVudHMoKS5sZW5ndGgpe3ZhciBrPXBhcnNlSW50KHRoaXMuc3JjLm1haW4ucm93cy52YWwoKSl8fDA7dmFyIEI9cGFyc2VJbnQodGhpcy5zcmMubWFpbi5jb2xzLnZhbCgpKXx8MDtpZihrPD0wfHxCPD0wKXtyZXR1cm59dGhpcy5ydGUuaGlzdG9yeS5hZGQoKTt2YXIgRD1hKHRoaXMucnRlLmRvYy5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKS5hcHBlbmRUbyh0aGlzLnRhYmxlKTtmb3IodmFyIHU9MDt1PGs7dSsrKXt2YXIgQz0iPHRyPiI7Zm9yKHZhciB0PTA7dDxCO3QrKyl7Qys9Ijx0ZD4mbmJzcDs8L3RkPiJ9RC5hcHBlbmQoQysiPC90cj4iKX19ZWxzZXt0aGlzLnRhYmxlLnJlbW92ZUF0dHIoIndpZHRoIikucmVtb3ZlQXR0cigiaGVpZ2h0IikucmVtb3ZlQXR0cigiYm9yZGVyIikucmVtb3ZlQXR0cigiYWxpZ24iKS5yZW1vdmVBdHRyKCJib3JkZXJjb2xvciIpLnJlbW92ZUF0dHIoImJnY29sb3IiKS5yZW1vdmVBdHRyKCJjZWxsc3BhY2luZyIpLnJlbW92ZUF0dHIoImNlbGxwYWRkaW5nIikucmVtb3ZlQXR0cigiZnJhbWUiKS5yZW1vdmVBdHRyKCJydWxlcyIpLnJlbW92ZUF0dHIoInN0eWxlIil9dmFyIEk9YS50cmltKHRoaXMuc3JjLm1haW4uY2FwdGlvbi52YWwoKSk7aWYoSSl7aWYoIXRoaXMudGFibGUuY2hpbGRyZW4oImNhcHRpb24iKS5sZW5ndGgpe3RoaXMudGFibGUucHJlcGVuZCgiPGNhcHRpb24gLz4iKX10aGlzLnRhYmxlLmNoaWxkcmVuKCJjYXB0aW9uIikudGV4dChJKX1lbHNle3RoaXMudGFibGUuY2hpbGRyZW4oImNhcHRpb24iKS5yZW1vdmUoKX1mb3IodmFyIHAgaW4gdGhpcy5zcmMpe2lmKHAhPSJtYWluIil7Zm9yKHZhciBvIGluIHRoaXMuc3JjW3BdKXt2YXIgRz1hLnRyaW0odGhpcy5zcmNbcF1bb10udmFsKCkpO2lmKEcpe3RoaXMudGFibGUuYXR0cihvLEcpfWVsc2V7dGhpcy50YWJsZS5yZW1vdmVBdHRyKG8pfX19fXZhciBBLEUsSDtpZigoQT1wYXJzZUludCh0aGlzLnNyYy5tYWluLnNwYWNpbmcudmFsKCkpKSYmQT49MCl7dGhpcy50YWJsZS5hdHRyKCJjZWxsc3BhY2luZyIsQSl9aWYoKEU9cGFyc2VJbnQodGhpcy5zcmMubWFpbi5wYWRkaW5nLnZhbCgpKSkmJkU+PTApe3RoaXMudGFibGUuYXR0cigiY2VsbHBhZGRpbmciLEUpfWlmKChIPXRoaXMuc3JjLm1haW4ucnVsZXMudmFsKCkpKXt0aGlzLnRhYmxlLmF0dHIoInJ1bGVzIixIKX12YXIgRj1wYXJzZUludCh0aGlzLnNyYy5tYWluLndpZHRoLnZhbCgpKXx8IiIseD1wYXJzZUludCh0aGlzLnNyYy5tYWluLmhlaWdodC52YWwoKSl8fCIiLHU9YS50cmltKHRoaXMuc3JjLm1haW4uYmdpbWcudmFsKCkpLEQ9dGhpcy5zcmMubWFpbi5ib3JkZXIudmFsKCkscT10aGlzLnNyYy5tYWluLm1hcmdpbi52YWwoKSx6PXRoaXMuc3JjLm1haW4uYWxpZ24udmFsKCk7dGhpcy50YWJsZS5jc3Moe3dpZHRoOkY/Rit0aGlzLnNyYy5tYWluLnd1bml0LnZhbCgpOiIiLGhlaWdodDp4P3grdGhpcy5zcmMubWFpbi5odW5pdC52YWwoKToiIixib3JkZXI6YS50cmltKEQud2lkdGgrIiAiK0Quc3R5bGUrIiAiK0QuY29sb3IpLCJiYWNrZ3JvdW5kLWNvbG9yIjp0aGlzLnNyYy5tYWluLmJnLnZhbCgpLCJiYWNrZ3JvdW5kLWltYWdlIjp1PyJ1cmwoIit1KyIpIjoiIn0pO2lmKHEuY3NzKXt0aGlzLnRhYmxlLmNzcygibWFyZ2luIixxLmNzcyl9ZWxzZXt0aGlzLnRhYmxlLmNzcyh7Im1hcmdpbi10b3AiOnEudG9wLCJtYXJnaW4tcmlnaHQiOnEucmlnaHQsIm1hcmdpbi1ib3R0b20iOnEuYm90dG9tLCJtYXJnaW4tbGVmdCI6cS5sZWZ0fSl9aWYoKHo9PSJsZWZ0Inx8ej09InJpZ2h0IikmJnRoaXMudGFibGUuY3NzKCJtYXJnaW4tbGVmdCIpIT0iYXV0byImJnRoaXMudGFibGUuY3NzKCJtYXJnaW4tcmlnaHQiKSE9ImF1dG8iKXt0aGlzLnRhYmxlLmNzcygiZmxvYXQiLHopfWlmKCF0aGlzLnRhYmxlLmF0dHIoInN0eWxlIikpe3RoaXMudGFibGUucmVtb3ZlQXR0cigic3R5bGUiKX1pZighdGhpcy50YWJsZS5wYXJlbnRzKCkubGVuZ3RoKXt0aGlzLnJ0ZS5zZWxlY3Rpb24uaW5zZXJ0Tm9kZSh0aGlzLnRhYmxlLmdldCgwKSx0cnVlKX10aGlzLnJ0ZS51aS51cGRhdGUoKX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7aWYodGhpcy5uYW1lPT0idGFibGVwcm9wcyImJiF0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksL15UQUJMRSQvKSl7dGhpcy5kb21FbGVtLmFkZENsYXNzKCJkaXNhYmxlZCIpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKX19fTtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGFibGVwcm9wcz1lbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGFibGV9KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGFibGVybT1mdW5jdGlvbihjLGIpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxjLGIpO3RoaXMuY29tbWFuZD1mdW5jdGlvbigpe3ZhciBmPXRoaXMucnRlLmRvbS5wYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwvXlRBQkxFJC8pO2lmKGYpe3RoaXMucnRlLmhpc3RvcnkuYWRkKCk7YShmKS5yZW1vdmUoKX10aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSl9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7aWYodGhpcy5ydGUuZG9tLnBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLC9eVEFCTEUkLykpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKX1lbHNle3RoaXMuZG9tRWxlbS5hZGRDbGFzcygiZGlzYWJsZWQiKX19fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGEpe2VsUlRFLnByb3RvdHlwZS51aS5wcm90b3R5cGUuYnV0dG9ucy50YmNlbGxwcm9wcz1mdW5jdGlvbihmLGMpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxmLGMpO3ZhciBiPXRoaXM7dGhpcy5zcmM9bnVsbDt0aGlzLmxhYmVscz1udWxsO2Z1bmN0aW9uIGcoKXtiLmxhYmVscz17bWFpbjoiUHJvcGVyaWVzIixhZHY6IkFkdmFuY2VkIixldmVudHM6IkV2ZW50cyIsaWQ6IklEIiwiY2xhc3MiOiJDc3MgY2xhc3MiLHN0eWxlOiJDc3Mgc3R5bGUiLGRpcjoiU2NyaXB0IGRpcmVjdGlvbiIsbGFuZzoiTGFuZ3VhZ2UifTtiLnNyYz17bWFpbjp7dHlwZTphKCI8c2VsZWN0IC8+IikuY3NzKCJ3aWR0aCIsIjEwMCUiKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgidGQiKS50ZXh0KGIucnRlLmkxOG4oIkRhdGEiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJ0aCIpLnRleHQoYi5ydGUuaTE4bigiSGVhZGVyIikpKSx3aWR0aDphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCJzaXplIiw0KSx3dW5pdDphKCI8c2VsZWN0IC8+IikuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoIiUiKS50ZXh0KCIlIikpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJweCIpLnRleHQoInB4IikpLGhlaWdodDphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5hdHRyKCJzaXplIiw0KSxodW5pdDphKCI8c2VsZWN0IC8+IikuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoIiUiKS50ZXh0KCIlIikpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJweCIpLnRleHQoInB4IikpLGFsaWduOmEoIjxzZWxlY3QgLz4iKS5jc3MoIndpZHRoIiwiMTAwJSIpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCIiKS50ZXh0KGIucnRlLmkxOG4oIk5vdCBzZXQiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJsZWZ0IikudGV4dChiLnJ0ZS5pMThuKCJMZWZ0IikpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgiY2VudGVyIikudGV4dChiLnJ0ZS5pMThuKCJDZW50ZXIiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJyaWdodCIpLnRleHQoYi5ydGUuaTE4bigiUmlnaHQiKSkpLmFwcGVuZChhKCI8b3B0aW9uIC8+IikudmFsKCJqdXN0aWZ5IikudGV4dChiLnJ0ZS5pMThuKCJKdXN0aWZ5IikpKSxib3JkZXI6YSgiPGRpdiAvPiIpLHBhZGRpbmc6YSgiPGRpdiAvPiIpLGJnOmEoIjxkaXYgLz4iKSxiZ2ltZzphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKS5jc3MoIndpZHRoIiwiOTAlIiksYXBwbHk6YSgiPHNlbGVjdCAvPiIpLmNzcygid2lkdGgiLCIxMDAlIikuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS52YWwoIiIpLnRleHQoYi5ydGUuaTE4bigiQ3VycmVudCBjZWxsIikpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgicm93IikudGV4dChiLnJ0ZS5pMThuKCJBbGwgY2VsbHMgaW4gcm93IikpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgiY29sdW1uIikudGV4dChiLnJ0ZS5pMThuKCJBbGwgY2VsbHMgaW4gY29sdW1uIikpKS5hcHBlbmQoYSgiPG9wdGlvbiAvPiIpLnZhbCgidGFibGUiKS50ZXh0KGIucnRlLmkxOG4oIkFsbCBjZWxscyBpbiB0YWJsZSIpKSl9LGFkdjp7aWQ6YSgnPGlucHV0IHR5cGU9InRleHQiIC8+JyksImNsYXNzIjphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSxzdHlsZTphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKSxkaXI6YSgiPHNlbGVjdCAvPiIpLmNzcygid2lkdGgiLCIxMDAlIikuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS50ZXh0KGIucnRlLmkxOG4oIk5vdCBzZXQiKSkudmFsKCIiKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS50ZXh0KGIucnRlLmkxOG4oIkxlZnQgdG8gcmlnaHQiKSkudmFsKCJsdHIiKSkuYXBwZW5kKGEoIjxvcHRpb24gLz4iKS50ZXh0KGIucnRlLmkxOG4oIlJpZ2h0IHRvIGxlZnQiKSkudmFsKCJydGwiKSksbGFuZzphKCc8aW5wdXQgdHlwZT0idGV4dCIgLz4nKX0sZXZlbnRzOnt9fTthLmVhY2goYi5zcmMsZnVuY3Rpb24oKXtmb3IodmFyIGggaW4gdGhpcyl7dGhpc1toXS5hdHRyKCJuYW1lIixoKTtpZih0aGlzW2hdLmF0dHIoInR5cGUiKT09InRleHQiJiYhdGhpc1toXS5hdHRyKCJzaXplIikmJmghPSJiZ2ltZyIpe3RoaXNbaF0uY3NzKCJ3aWR0aCIsIjEwMCUiKX19fSk7YS5lYWNoKFsib25ibHVyIiwib25mb2N1cyIsIm9uY2xpY2siLCJvbmRibGNsaWNrIiwib25tb3VzZWRvd24iLCJvbm1vdXNldXAiLCJvbm1vdXNlb3ZlciIsIm9ubW91c2VvdXQiLCJvbm1vdXNlbGVhdmUiLCJvbmtleWRvd24iLCJvbmtleXByZXNzIiwib25rZXl1cCJdLGZ1bmN0aW9uKCl7Yi5zcmMuZXZlbnRzW3RoaXNdPWEoJzxpbnB1dCB0eXBlPSJ0ZXh0IiAvPicpLmF0dHIoIm5hbWUiLHRoaXMpLmNzcygid2lkdGgiLCIxMDAlIil9KX10aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXshdGhpcy5zcmMmJmcoKTt0aGlzLmNlbGw9dGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLC9eKFREfFRIKSQvKTtpZighdGhpcy5jZWxsKXtyZXR1cm59dGhpcy5zcmMubWFpbi50eXBlLnZhbCh0aGlzLmNlbGwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7dGhpcy5jZWxsPWEodGhpcy5jZWxsKTt0aGlzLnNyYy5tYWluLmJvcmRlci5lbEJvcmRlclNlbGVjdCh7c3R5bGVIZWlnaHQ6MTE3LHZhbHVlOnRoaXMuY2VsbH0pO3RoaXMuc3JjLm1haW4uYmcuZWxDb2xvclBpY2tlcih7cGFsZXR0ZVBvc2l0aW9uOiJvdXRlciIsImNsYXNzIjoiZWwtY29sb3JwaWNrZXIgdWktaWNvbiB1aS1pY29uLXBlbmNpbCJ9KTt0aGlzLnNyYy5tYWluLnBhZGRpbmcuZWxQYWRkaW5nSW5wdXQoe3ZhbHVlOnRoaXMuY2VsbH0pO3ZhciBqPXRoaXMuY2VsbC5jc3MoIndpZHRoIil8fHRoaXMuY2VsbC5hdHRyKCJ3aWR0aCIpO3RoaXMuc3JjLm1haW4ud2lkdGgudmFsKHBhcnNlSW50KGopfHwiIik7dGhpcy5zcmMubWFpbi53dW5pdC52YWwoai5pbmRleE9mKCJweCIpIT0tMT8icHgiOiIlIik7dmFyIHE9dGhpcy5jZWxsLmNzcygiaGVpZ2h0Iil8fHRoaXMuY2VsbC5hdHRyKCJoZWlnaHQiKTt0aGlzLnNyYy5tYWluLmhlaWdodC52YWwocGFyc2VJbnQocSl8fCIiKTt0aGlzLnNyYy5tYWluLmh1bml0LnZhbChxLmluZGV4T2YoInB4IikhPS0xPyJweCI6IiUiKTt0aGlzLnNyYy5tYWluLmFsaWduLnZhbCh0aGlzLmNlbGwuYXR0cigiYWxpZ24iKXx8dGhpcy5jZWxsLmNzcygidGV4dC1hbGlnbiIpKTt0aGlzLnNyYy5tYWluLmJnLnZhbCh0aGlzLmNlbGwuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIikpO3ZhciB0PXRoaXMuY2VsbC5jc3MoImJhY2tncm91bmQtaW1hZ2UiKTt0aGlzLnNyYy5tYWluLmJnaW1nLnZhbCh0JiZ0IT0ibm9uZSI/dC5yZXBsYWNlKC91cmxcKChbXlwpXSspXCkvaSwiJDEiKToiIik7dGhpcy5zcmMubWFpbi5hcHBseS52YWwoIiIpO3ZhciByPXtydGw6dGhpcy5ydGUucnRsLHN1Ym1pdDpmdW5jdGlvbihoLHYpe2guc3RvcFByb3BhZ2F0aW9uKCk7aC5wcmV2ZW50RGVmYXVsdCgpO2Iuc2V0KCk7di5jbG9zZSgpfSxkaWFsb2c6e3dpZHRoOjUyMCx0aXRsZTp0aGlzLnJ0ZS5pMThuKCJUYWJsZSBjZWxsIHByb3BlcnRpZXMiKX19O3ZhciB1PW5ldyBlbERpYWxvZ0Zvcm0ocik7Zm9yKHZhciBwIGluIHRoaXMuc3JjKXt1LnRhYihwLHRoaXMucnRlLmkxOG4odGhpcy5sYWJlbHNbcF0pKTtpZihwPT0ibWFpbiIpe3UuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJXaWR0aCIpLGEoIjxzcGFuIC8+IikuYXBwZW5kKHRoaXMuc3JjLm1haW4ud2lkdGgpLmFwcGVuZCh0aGlzLnNyYy5tYWluLnd1bml0KV0sIm1haW4iLHRydWUpLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiSGVpZ2h0IiksYSgiPHNwYW4gLz4iKS5hcHBlbmQodGhpcy5zcmMubWFpbi5oZWlnaHQpLmFwcGVuZCh0aGlzLnNyYy5tYWluLmh1bml0KV0sIm1haW4iLHRydWUpLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiVGFibGUgY2VsbCB0eXBlIiksdGhpcy5zcmMubWFpbi50eXBlXSwibWFpbiIsdHJ1ZSkuYXBwZW5kKFt0aGlzLnJ0ZS5pMThuKCJCb3JkZXIiKSx0aGlzLnNyYy5tYWluLmJvcmRlcl0sIm1haW4iLHRydWUpLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiQWxpZ25tZW50IiksdGhpcy5zcmMubWFpbi5hbGlnbl0sIm1haW4iLHRydWUpLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiUGFkZGluZ3MiKSx0aGlzLnNyYy5tYWluLnBhZGRpbmddLCJtYWluIix0cnVlKS5hcHBlbmQoW3RoaXMucnRlLmkxOG4oIkJhY2tncm91bmQiKSxhKCI8c3BhbiAvPiIpLmFwcGVuZChhKCI8c3BhbiAvPiIpLmNzcyh7ImZsb2F0IjoibGVmdCIsIm1hcmdpbi1yaWdodCI6IjNweCJ9KS5hcHBlbmQodGhpcy5zcmMubWFpbi5iZykpLmFwcGVuZCh0aGlzLnNyYy5tYWluLmJnaW1nKV0sIm1haW4iLHRydWUpLmFwcGVuZChbdGhpcy5ydGUuaTE4bigiQXBwbHkgdG8iKSx0aGlzLnNyYy5tYWluLmFwcGx5XSwibWFpbiIsdHJ1ZSl9ZWxzZXtmb3IodmFyIG8gaW4gdGhpcy5zcmNbcF0pe3ZhciBrPXRoaXMuY2VsbC5hdHRyKG8pfHwiIjtpZihwPT0iZXZlbnRzIil7az10aGlzLnJ0ZS51dGlscy50cmltRXZlbnRDYWxsYmFjayhrKX11LmFwcGVuZChbdGhpcy5ydGUuaTE4bih0aGlzLmxhYmVsc1tvXT90aGlzLmxhYmVsc1tvXTpvKSx0aGlzLnNyY1twXVtvXS52YWwoayldLHAsdHJ1ZSl9fX11Lm9wZW4oKX07dGhpcy5zZXQ9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLmNlbGwsQj10aGlzLnNyYy5tYWluLmFwcGx5LnZhbCgpO3N3aXRjaCh0aGlzLnNyYy5tYWluLmFwcGx5LnZhbCgpKXtjYXNlInJvdyI6eD10aGlzLmNlbGwucGFyZW50KCJ0ciIpLmNoaWxkcmVuKCJ0ZCx0aCIpO2JyZWFrO2Nhc2UiY29sdW1uIjp4PWEodGhpcy5ydGUuZG9tLnRhYmxlQ29sdW1uKHRoaXMuY2VsbC5nZXQoMCkpKTticmVhaztjYXNlInRhYmxlIjp4PXRoaXMuY2VsbC5wYXJlbnRzKCJ0YWJsZSIpLmZpbmQoInRkLHRoIik7YnJlYWt9Zm9yKHZhciBvIGluIHRoaXMuc3JjKXtpZihvIT0ibWFpbiIpe2Zvcih2YXIgayBpbiB0aGlzLnNyY1tvXSl7dmFyIEM9YS50cmltKHRoaXMuc3JjW29dW2tdLnZhbCgpKTtpZihDKXt4LmF0dHIoayxDKX1lbHNle3gucmVtb3ZlQXR0cihrKX19fX14LnJlbW92ZUF0dHIoIndpZHRoIikucmVtb3ZlQXR0cigiaGVpZ2h0IikucmVtb3ZlQXR0cigiYm9yZGVyIikucmVtb3ZlQXR0cigiYWxpZ24iKS5yZW1vdmVBdHRyKCJib3JkZXJjb2xvciIpLnJlbW92ZUF0dHIoImJnY29sb3IiKTt2YXIgRD10aGlzLnNyYy5tYWluLnR5cGUudmFsKCk7dmFyIEE9cGFyc2VJbnQodGhpcy5zcmMubWFpbi53aWR0aC52YWwoKSl8fCIiO3ZhciByPXBhcnNlSW50KHRoaXMuc3JjLm1haW4uaGVpZ2h0LnZhbCgpKXx8IiI7dmFyIHE9YS50cmltKHRoaXMuc3JjLm1haW4uYmdpbWcudmFsKCkpO3ZhciB6PXRoaXMuc3JjLm1haW4uYm9yZGVyLnZhbCgpO3ZhciB1PXt3aWR0aDpBP0ErdGhpcy5zcmMubWFpbi53dW5pdC52YWwoKToiIixoZWlnaHQ6cj9yK3RoaXMuc3JjLm1haW4uaHVuaXQudmFsKCk6IiIsImJhY2tncm91bmQtY29sb3IiOnRoaXMuc3JjLm1haW4uYmcudmFsKCksImJhY2tncm91bmQtaW1hZ2UiOnE/InVybCgiK3ErIikiOiIiLGJvcmRlcjphLnRyaW0oei53aWR0aCsiICIrei5zdHlsZSsiICIrei5jb2xvciksInRleHQtYWxpZ24iOnRoaXMuc3JjLm1haW4uYWxpZ24udmFsKCl8fCIifTt2YXIgaj10aGlzLnNyYy5tYWluLnBhZGRpbmcudmFsKCk7aWYoai5jc3Mpe3UucGFkZGluZz1qLmNzc31lbHNle3VbInBhZGRpbmctdG9wIl09ai50b3A7dVsicGFkZGluZy1yaWdodCJdPWoucmlnaHQ7dVsicGFkZGluZy1ib3R0b20iXT1qLmJvdHRvbTt1WyJwYWRkaW5nLWxlZnQiXT1qLmxlZnR9eD14LmdldCgpO2EuZWFjaCh4LGZ1bmN0aW9uKCl7dmFyIHc9dGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3ZhciBGPWEodGhpcyk7aWYodyE9RCl7dmFyIGg9e307Zm9yKHZhciB0IGluIGIuc3JjLmFkdil7dmFyIHA9Ri5hdHRyKHQpO2lmKHApe2hbdF09cC50b1N0cmluZygpfX1mb3IodmFyIHQgaW4gYi5zcmMuZXZlbnRzKXt2YXIgcD1GLmF0dHIodCk7aWYocCl7aFt0XT1wLnRvU3RyaW5nKCl9fXZhciBHPUYuYXR0cigiY29sc3BhbiIpfHwxO3ZhciBFPUYuYXR0cigicm93c3BhbiIpfHwxO2lmKEc+MSl7aC5jb2xzcGFuPUd9aWYoRT4xKXtoLnJvd3NwYW49RX1GLnJlcGxhY2VXaXRoKGEoIjwiK0QrIiAvPiIpLmh0bWwoRi5odG1sKCkpLmF0dHIoaCkuY3NzKHUpKX1lbHNle0YuY3NzKHUpfX0pO3RoaXMucnRlLnVpLnVwZGF0ZSgpfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe2lmKHRoaXMucnRlLmRvbS5wYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwvXlRBQkxFJC8pKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIil9ZWxzZXt0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImRpc2FibGVkIil9fX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGJjZWxsc21lcmdlPWZ1bmN0aW9uKGcsZil7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGcsZik7dmFyIGM9dGhpcztmdW5jdGlvbiBiKCl7dmFyIGo9Yy5ydGUuZG9tLnNlbGZPclBhcmVudChjLnJ0ZS5zZWxlY3Rpb24uZ2V0U3RhcnQoKSwvXihURHxUSCkkLyk7dmFyIGg9Yy5ydGUuZG9tLnNlbGZPclBhcmVudChjLnJ0ZS5zZWxlY3Rpb24uZ2V0RW5kKCksL14oVER8VEgpJC8pO2lmKGomJmgmJmohPWgmJmEoaikucGFyZW50cygidGFibGUiKS5nZXQoMCk9PWEoaCkucGFyZW50cygidGFibGUiKS5nZXQoMCkpe3JldHVybltqLGhdfXJldHVybiBudWxsfXRoaXMuY29tbWFuZD1mdW5jdGlvbigpe3ZhciB6PWIoKTtpZih6KXt2YXIgeD10aGlzLnJ0ZS5kb20uaW5kZXhPZihhKHpbMF0pLnBhcmVudCgidHIiKS5nZXQoMCkpO3ZhciByPXRoaXMucnRlLmRvbS5pbmRleE9mKGEoelsxXSkucGFyZW50KCJ0ciIpLmdldCgwKSk7dmFyIHE9TWF0aC5taW4oeCxyKTt2YXIgdT1NYXRoLm1heCh4LHIpLXErMTt2YXIgaj10aGlzLnJ0ZS5kb20udGFibGVDb2x1bW4oelswXSx0cnVlLHRydWUpO3ZhciBoPXRoaXMucnRlLmRvbS50YWJsZUNvbHVtbih6WzFdLHRydWUpO3ZhciBCPWEuaW5BcnJheSh6WzBdLGouY29sdW1uKTt2YXIgdz1hLmluQXJyYXkoelsxXSxoLmNvbHVtbik7dmFyIHA9ai5pbmZvLm9mZnNldFtCXTxoLmluZm8ub2Zmc2V0W3ddP2o6aDt2YXIgdj1qLmluZm8ub2Zmc2V0W0JdPj1oLmluZm8ub2Zmc2V0W3ddP2o6aDt2YXIgaz0wO3ZhciB0PW51bGw7dmFyIG89IiI7dGhpcy5ydGUuaGlzdG9yeS5hZGQoKTt2YXIgQT1hKGEoelswXSkucGFyZW50cygidGFibGUiKS5lcSgwKS5maW5kKCJ0ciIpLmdldCgpLnNsaWNlKHEscSt1KSkuZWFjaChmdW5jdGlvbihFKXt2YXIgRD1vLmxlbmd0aDt2YXIgQz1mYWxzZTthKHRoaXMpLmNoaWxkcmVuKCJ0ZCx0aCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgSz1hKHRoaXMpO3ZhciBJPWEuaW5BcnJheSh0aGlzLHAuY29sdW1uKTt2YXIgSD1hLmluQXJyYXkodGhpcyx2LmNvbHVtbik7aWYoSSE9LTF8fEghPS0xKXtDPUkhPS0xJiZIPT0tMTt2YXIgRz1wYXJzZUludChLLmF0dHIoImNvbHNwYW4iKXx8MSk7aWYoRT09MCl7ays9R31pZihJIT0tMSYmRT4wKXt2YXIgTD1wLmluZm8uZGVsdGFbSV07aWYoTD4wKXtpZihLLmNzcygidGV4dC1hbGlnbiIpPT0ibGVmdCIpe3ZhciBGPUsuY2xvbmUodHJ1ZSk7Sy5odG1sKCImbmJzcDsiKX1lbHNle3ZhciBGPUsuY2xvbmUoKS5odG1sKCImbmJzcDsiKX1GLnJlbW92ZUF0dHIoImNvbHNwYW4iKS5yZW1vdmVBdHRyKCJpZCIpLmluc2VydEJlZm9yZSh0aGlzKTtpZihMPjEpe0YuYXR0cigiY29sc3BhbiIsTCl9fX1pZihIIT0tMSl7dmFyIEw9di5pbmZvLmRlbHRhW0hdO2lmKEctTD4xKXt2YXIgSj1HLUwtMTtpZihLLmNzcygidGV4dC1hbGlnbiIpPT0icmlnaHQiKXt2YXIgRj1LLmNsb25lKHRydWUpO0suaHRtbCgiJm5ic3A7Iil9ZWxzZXt2YXIgRj1LLmNsb25lKCkuaHRtbCgiJm5ic3A7Iil9Ri5yZW1vdmVBdHRyKCJjb2xzcGFuIikucmVtb3ZlQXR0cigiaWQiKS5pbnNlcnRBZnRlcih0aGlzKTtpZihKPjEpe0YuYXR0cigiY29sc3BhbiIsSil9fX1pZighdCl7dD1LfWVsc2V7bys9Sy5odG1sKCk7Sy5yZW1vdmUoKX19ZWxzZXtpZihDKXtpZihFPT0wKXtrKz1wYXJzZUludChLLmF0dHIoImNvbHNwYW4iKXx8MSl9bys9Sy5odG1sKCk7Sy5yZW1vdmUoKX19fSk7bys9RCE9by5sZW5ndGg/IjxiciAvPiI6IiJ9KTt0LnJlbW92ZUF0dHIoImNvbHNwYW4iKS5yZW1vdmVBdHRyKCJyb3dzcGFuIikuaHRtbCh0Lmh0bWwoKStvKTtpZihrPjEpe3QuYXR0cigiY29sc3BhbiIsayl9aWYodT4xKXt0LmF0dHIoInJvd3NwYW4iLHUpfXRoaXMucnRlLmRvbS5maXhUYWJsZShhKHpbMF0pLnBhcmVudHMoInRhYmxlIikuZ2V0KDApKX19O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7aWYoYigpKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIil9ZWxzZXt0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImRpc2FibGVkIil9fX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGJjZWxsc3BsaXQ9ZnVuY3Rpb24oYyxiKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYyxiKTt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXt2YXIgaj10aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksL14oVER8VEgpJC8pO2lmKGope3RoaXMucnRlLmhpc3RvcnkuYWRkKCk7dmFyIGs9cGFyc2VJbnQodGhpcy5ydGUuZG9tLmF0dHIoaiwiY29sc3BhbiIpKTt2YXIgbz1wYXJzZUludCh0aGlzLnJ0ZS5kb20uYXR0cihqLCJyb3dzcGFuIikpO2lmKGs+MXx8bz4xKXt2YXIgdT1rLTE7dmFyIHY9by0xO3ZhciBxPXRoaXMucnRlLmRvbS5wYXJlbnQoaiwvXlRBQkxFJC8pO3ZhciBwPXRoaXMucnRlLmRvbS50YWJsZU1hdHJpeChxKTtpZih1KXtmb3IodmFyIHQ9MDt0PHU7dCsrKXthKHRoaXMucnRlLmRvbS5jcmVhdGUoai5ub2RlTmFtZSkpLmh0bWwoIiZuYnNwOyIpLmluc2VydEFmdGVyKGopfX1pZih2KXt2YXIgeD10aGlzLnJ0ZS5kb20uaW5kZXhlc09mQ2VsbChqLHApO3ZhciBoPXhbMF07dmFyIGc9eFsxXTtmb3IodmFyIGY9aCsxO2Y8aCt2KzE7ZisrKXt2YXIgdztpZighcFtmXVtnXS5ub2RlTmFtZSl7aWYocFtmXVtnLTFdLm5vZGVOYW1lKXt3PXBbZl1bZy0xXX1lbHNle2Zvcih2YXIgdD1nLTE7dD49MDt0LS0pe2lmKHBbZl1bdF0ubm9kZU5hbWUpe3c9cFtmXVt0XTticmVha319fWlmKHcpe2Zvcih2YXIgdD0wO3Q8PXU7dCsrKXthKHRoaXMucnRlLmRvbS5jcmVhdGUody5ub2RlTmFtZSkpLmh0bWwoIiZuYnNwOyIpLmluc2VydEFmdGVyKHcpfX19fX1hKGopLnJlbW92ZUF0dHIoImNvbHNwYW4iKS5yZW1vdmVBdHRyKCJyb3dzcGFuIik7dGhpcy5ydGUuZG9tLmZpeFRhYmxlKHEpfX10aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSl9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIGY9dGhpcy5ydGUuZG9tLnNlbGZPclBhcmVudCh0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLC9eKFREfFRIKSQvKTtpZihmJiYocGFyc2VJbnQodGhpcy5ydGUuZG9tLmF0dHIoZiwiY29sc3BhbiIpKT4xfHxwYXJzZUludCh0aGlzLnJ0ZS5kb20uYXR0cihmLCJyb3dzcGFuIikpPjEpKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIil9ZWxzZXt0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImRpc2FibGVkIil9fX19KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGJjb2xiZWZvcmU9ZnVuY3Rpb24oZixjKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZixjKTt2YXIgYj10aGlzO3RoaXMuY29tbWFuZD1mdW5jdGlvbigpe3ZhciBnPXRoaXMucnRlLmRvbS50YWJsZUNvbHVtbih0aGlzLnJ0ZS5zZWxlY3Rpb24uZ2V0Tm9kZSgpLGZhbHNlLHRydWUpO2lmKGcubGVuZ3RoKXt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpO2EuZWFjaChnLGZ1bmN0aW9uKCl7dmFyIGo9YSh0aGlzKTt2YXIgaD1wYXJzZUludChqLmF0dHIoImNvbHNwYW4iKXx8MSk7aWYoaD4xKXtqLmF0dHIoImNvbHNwYW4iLGgrMSl9ZWxzZXt2YXIgaz1qLmNsb25lKCkuaHRtbCgiJm5ic3A7IikucmVtb3ZlQXR0cigiY29sc3BhbiIpLnJlbW92ZUF0dHIoIndpZHRoIikucmVtb3ZlQXR0cigiaWQiKTtpZihiLm5hbWU9PSJ0YmNvbGJlZm9yZSIpe2suaW5zZXJ0QmVmb3JlKHRoaXMpfWVsc2V7ay5pbnNlcnRBZnRlcih0aGlzKX19fSk7dGhpcy5ydGUudWkudXBkYXRlKCl9fTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe2lmKHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwvXihURHxUSCkkLykpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKX1lbHNle3RoaXMuZG9tRWxlbS5hZGRDbGFzcygiZGlzYWJsZWQiKX19fTtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGJjb2xhZnRlcj1lbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGJjb2xiZWZvcmV9KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGJjb2xybT1mdW5jdGlvbihmLGMpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxmLGMpO3ZhciBiPXRoaXM7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIHA9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKTt2YXIgbz10aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHAsL14oVER8VEgpJC8pO3ZhciBrPWEobykucHJldigidGQsdGgiKS5nZXQoMCk7dmFyIGo9YShvKS5uZXh0KCJ0ZCx0aCIpLmdldCgwKTt2YXIgZz10aGlzLnJ0ZS5kb20ucGFyZW50KHAsL15UQUJMRSQvKTt2YXIgaD10aGlzLnJ0ZS5kb20udGFibGVDb2x1bW4ocCxmYWxzZSx0cnVlKTtpZihoLmxlbmd0aCl7dGhpcy5ydGUuaGlzdG9yeS5hZGQoKTthLmVhY2goaCxmdW5jdGlvbigpe3ZhciByPWEodGhpcyk7dmFyIHE9cGFyc2VJbnQoci5hdHRyKCJjb2xzcGFuIil8fDEpO2lmKHE+MSl7ci5hdHRyKCJjb2xzcGFuIixxLTEpfWVsc2V7ci5yZW1vdmUoKX19KTt0aGlzLnJ0ZS5kb20uZml4VGFibGUoZyk7aWYoa3x8ail7dGhpcy5ydGUuc2VsZWN0aW9uLnNlbGVjdENvbnRlbnRzKGs/azpqKS5jb2xsYXBzZSh0cnVlKX10aGlzLnJ0ZS51aS51cGRhdGUodHJ1ZSl9fTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe2lmKHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwvXihURHxUSCkkLykpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKX1lbHNle3RoaXMuZG9tRWxlbS5hZGRDbGFzcygiZGlzYWJsZWQiKX19fX0pKGpRdWVyeSk7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnRicm93YmVmb3JlPWZ1bmN0aW9uKGIsYSl7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGIsYSk7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKTt2YXIgdD10aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KGgsL14oVER8VEgpJC8pO3ZhciBmPXRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodCwvXlRSJC8pO3ZhciB3PXRoaXMucnRlLmRvbS50YWJsZU1hdHJpeCh0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHQsL15UQUJMRSQvKSk7aWYodCYmZiYmdyl7dGhpcy5ydGUuaGlzdG9yeS5hZGQoKTt2YXIgdT10aGlzLm5hbWU9PSJ0YnJvd2JlZm9yZSI7dmFyIHE9JChmKS5wcmV2QWxsKCJ0ciIpLmxlbmd0aDt2YXIgaj0wO3ZhciBwPVtdO2Z1bmN0aW9uIGsoYyxyKXt3aGlsZShyPjApe3ItLTtpZih3W3JdJiZ3W3JdW2NdJiZ3W3JdW2NdLm5vZGVOYW1lKXtyZXR1cm4gd1tyXVtjXX19fWZvcih2YXIgbz0wO288d1txXS5sZW5ndGg7bysrKXtpZih3W3FdW29dJiZ3W3FdW29dLm5vZGVOYW1lKXt2YXIgdj0kKHdbcV1bb10pO3ZhciBnPXBhcnNlSW50KHYuYXR0cigiY29sc3BhbiIpfHwxKTtpZihwYXJzZUludCh2LmF0dHIoInJvd3NwYW4iKXx8MSk+MSl7aWYodSl7ais9Z31lbHNle3AucHVzaCh2KX19ZWxzZXtqKz1nfX1lbHNle2lmKHdbcV1bb109PSItIil7dj1rKG8scSk7diYmcC5wdXNoKCQodikpfX19dmFyIHg9JCgiPHRyIC8+Iik7Zm9yKHZhciBvPTA7bzxqO28rKyl7eC5hcHBlbmQoIjx0ZD4mbmJzcDs8L3RkPiIpfWlmKHUpe3guaW5zZXJ0QmVmb3JlKGYpfWVsc2V7eC5pbnNlcnRBZnRlcihmKX0kLmVhY2gocCxmdW5jdGlvbigpeyQodGhpcykuYXR0cigicm93c3BhbiIscGFyc2VJbnQoJCh0aGlzKS5hdHRyKCJyb3dzcGFuIil8fDEpKzEpfSk7dGhpcy5ydGUudWkudXBkYXRlKCl9fTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe2lmKHRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQodGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSwvXlRSJC8pKXt0aGlzLmRvbUVsZW0ucmVtb3ZlQ2xhc3MoImRpc2FibGVkIil9ZWxzZXt0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImRpc2FibGVkIil9fX07ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnRicm93YWZ0ZXI9ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnRicm93YmVmb3JlOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudGJyb3dybT1mdW5jdGlvbihmLGMpe3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxmLGMpO3ZhciBiPXRoaXM7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSx4PXRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQoaCwvXihURHxUSCkkLyksZz10aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHgsL15UUiQvKSxxPXRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnQoeCwvXlRBQkxFJC8pLEE9dGhpcy5ydGUuZG9tLnRhYmxlTWF0cml4KHEpO2lmKHgmJmcmJkEubGVuZ3RoKXt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpO2lmKEEubGVuZ3RoPT0xKXthKHEpLnJlbW92ZSgpO3JldHVybiB0aGlzLnJ0ZS51aS51cGRhdGUoKX12YXIgdT1bXTt2YXIgdj1hKGcpLnByZXZBbGwoInRyIikubGVuZ3RoO2Z1bmN0aW9uIHAocixDKXt3aGlsZShDPjApe0MtLTtpZihBW0NdJiZBW0NdW3JdJiZBW0NdW3JdLm5vZGVOYW1lKXtyZXR1cm4gQVtDXVtyXX19fWZ1bmN0aW9uIEIoQyxyKXt5PXYrMTt2YXIgRT1udWxsO2lmKEFbeV0pe2Zvcih2YXIgRD0wO0Q8cjtEKyspe2lmKEFbeV1bRF0mJkFbeV1bRF0ubm9kZU5hbWUpe0U9QVt5XVtEXX19Qz1DLnJlbW92ZSgpO2lmKEUpe0MuaW5zZXJ0QWZ0ZXIoRSl9ZWxzZXtDLnByZXBlbmRUbyhhKGcpLm5leHQoInRyIikuZXEoMCkpfX19ZnVuY3Rpb24gbyhDKXtmb3IodmFyIHI9MDtyPEMubGVuZ3RoO3IrKyl7aWYoQ1tyXT09eCl7cmV0dXJuIHI8Qy5sZW5ndGgtMT9DW3IrMV06Q1tyLTFdfX19Zm9yKHZhciB0PTA7dDxBW3ZdLmxlbmd0aDt0Kyspe3ZhciB6PW51bGw7dmFyIGo9ZmFsc2U7aWYoQVt2XVt0XSYmQVt2XVt0XS5ub2RlTmFtZSl7ej1BW3ZdW3RdO2o9dHJ1ZX1lbHNle2lmKEFbdl1bdF09PSItIiYmKHo9cCh0LHYpKSl7aj1mYWxzZX19aWYoeil7ej1hKHopO3ZhciBrPXBhcnNlSW50KHouYXR0cigicm93c3BhbiIpfHwxKTtpZihrPjEpe3ouYXR0cigicm93c3BhbiIsay0xKTtqJiZCKHosdCx2KX19fXZhciB3PW8odGhpcy5ydGUuZG9tLnRhYmxlQ29sdW1uKHgpKTtpZih3KXt0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0Q29udGVudHModykuY29sbGFwc2UodHJ1ZSl9YShnKS5yZW1vdmUoKX10aGlzLnJ0ZS51aS51cGRhdGUoKX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXtpZih0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50KHRoaXMucnRlLnNlbGVjdGlvbi5nZXROb2RlKCksL15UUiQvKSl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpfWVsc2V7dGhpcy5kb21FbGVtLmFkZENsYXNzKCJkaXNhYmxlZCIpfX19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oYSl7ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnVuZG89ZnVuY3Rpb24oYyxiKXt0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYyxiKTt0aGlzLmNvbW1hbmQ9ZnVuY3Rpb24oKXtpZih0aGlzLm5hbWU9PSJ1bmRvIiYmdGhpcy5ydGUuaGlzdG9yeS5jYW5CYWNrKCkpe3RoaXMucnRlLmhpc3RvcnkuYmFjaygpO3RoaXMucnRlLnVpLnVwZGF0ZSgpfWVsc2V7aWYodGhpcy5uYW1lPT0icmVkbyImJnRoaXMucnRlLmhpc3RvcnkuY2FuRndkKCkpe3RoaXMucnRlLmhpc3RvcnkuZndkKCk7dGhpcy5ydGUudWkudXBkYXRlKCl9fX07dGhpcy51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmRvbUVsZW0udG9nZ2xlQ2xhc3MoImRpc2FibGVkIix0aGlzLm5hbWU9PSJ1bmRvIj8hdGhpcy5ydGUuaGlzdG9yeS5jYW5CYWNrKCk6IXRoaXMucnRlLmhpc3RvcnkuY2FuRndkKCkpfX07ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnJlZG89ZWxSVEUucHJvdG90eXBlLnVpLnByb3RvdHlwZS5idXR0b25zLnVuZG99KShqUXVlcnkpOyhmdW5jdGlvbihhKXtlbFJURS5wcm90b3R5cGUudWkucHJvdG90eXBlLmJ1dHRvbnMudW5saW5rPWZ1bmN0aW9uKGMsYil7dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGMsYik7dGhpcy5jb21tYW5kPWZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKSxmPXRoaXMucnRlLmRvbS5zZWxmT3JQYXJlbnRMaW5rKGspO2Z1bmN0aW9uIGoobyl7cmV0dXJuIG8ubm9kZU5hbWU9PSJBIiYmby5ocmVmfWlmKCFmKXt2YXIgaD1hLmJyb3dzZXIubXNpZT90aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoKTp0aGlzLnJ0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQoe3dyYXA6ZmFsc2V9KTtpZihoLmxlbmd0aCl7Zm9yKHZhciBnPTA7ZzxoLmxlbmd0aDtnKyspe2lmKGooaFtnXSkpe2Y9aFtnXTticmVha319aWYoIWYpe2Y9dGhpcy5ydGUuZG9tLnBhcmVudChoWzBdLGopfHx0aGlzLnJ0ZS5kb20ucGFyZW50KGhbaC5sZW5ndGgtMV0sail9fX1pZihmKXt0aGlzLnJ0ZS5oaXN0b3J5LmFkZCgpO3RoaXMucnRlLnNlbGVjdGlvbi5zZWxlY3QoZik7dGhpcy5ydGUuZG9jLmV4ZWNDb21tYW5kKCJ1bmxpbmsiLGZhbHNlLG51bGwpO3RoaXMucnRlLnVpLnVwZGF0ZSh0cnVlKX19O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIGY9dGhpcy5ydGUuc2VsZWN0aW9uLmdldE5vZGUoKTtpZih0aGlzLnJ0ZS5kb20uc2VsZk9yUGFyZW50TGluayhmKSl7dGhpcy5kb21FbGVtLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpLmFkZENsYXNzKCJhY3RpdmUiKX1lbHNle2lmKHRoaXMucnRlLmRvbS5zZWxlY3Rpb25IYXMoZnVuY3Rpb24oZyl7cmV0dXJuIGcubm9kZU5hbWU9PSJBIiYmZy5ocmVmfSkpe3RoaXMuZG9tRWxlbS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKS5hZGRDbGFzcygiYWN0aXZlIil9ZWxzZXt0aGlzLmRvbUVsZW0uYWRkQ2xhc3MoImRpc2FibGVkIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpfX19fX0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.ar.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEFyYWJpYyB0cmFuc2xhdGlvbgogKiBAYXV0aG9yIHRhd2ZlayBkYWdoaXN0YW5pIDx0YXdmZWtvdkBnbWFpbC5jb20+CiAqIEB2ZXJzaW9uIDIwMTAtMDktMTgKICovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS5pMThNZXNzYWdlcy5hciA9IHsKCSdFZGl0b3InIDogJ9in2YTZhdit2LHYsScsCgknU291cmNlJyA6ICfYp9mE2YXYtdiv2LEnLAoJLy8gUGFuZWwgTmFtZQoJJ0NvcHkvUGFzZScgICAgICA6ICfZhtiz2K4v2YTYtdmCJywKCSdVbmRvL1JlZG8nICAgICAgOiAn2KrYsdin2KzYuS/YqtmD2LHYp9ixJywKCSdUZXh0IHN0eWxlcycgICAgOiAn2KrZhtiz2YrZgiDYp9mE2YbYtScsCgknQ29sb3JzJyAgICAgICAgIDogJ9in2YTYo9mE2YjYp9mGJywKCSdBbGlnbm1lbnQnICAgICAgOiAn2KfZhNmF2K3Yp9iw2KfYqScsCgknSW5kZW50L091dGRlbnQnIDogJ9mF2LPYp9mB2Kkg2KjYp9iv2KbYqSAvINmF2LPYp9mB2Kkg2K7Yp9iq2YXYqScsCgknSW5kZW50L091dGRlbnQnIDogJycsCgknVGV4dCBmb3JtYXQnICAgIDogJ9in2YTYqtmG2LPZitmCJywKCSdMaXN0cycgICAgICAgICAgOiAn2YLZiNin2KbZhScsCgknTWlzYyBlbGVtZW50cycgIDogJ9i52YbYp9i12LEg2YXYqtmG2YjYudipJywKCSdMaW5rcycgICAgICAgICAgOiAn2LHYp9io2Lcg2KrYtNi52KjZiicsCgknSW1hZ2VzJyAgICAgICAgIDogJ9i12YjYsdipJywKCSdNZWRpYScgICAgICAgICAgOiAn2LnZhti12LEg2LXZiNiqINij2Ygg2YHZitiv2YrZiCcsCgknVGFibGVzJyAgICAgICAgIDogJ9is2K/ZiNmEJywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAn2YXYs9iq2YPYtNmBINin2YTZhdmE2YHYp9iqJywKCS8vIGJ1dHRvbiBuYW1lcwoJJ1NhdmUnICAgICAgICAgICAgICAgICAgICA6ICfYrdmB2LgnLAoJJ0NvcHknICAgICAgICAgICAgICAgICAgICA6ICfZhtiz2K4nLAoJJ0N1dCcgICAgICAgICAgICAgICAgICAgICA6ICfZgti1JywKCSdQYXN0ZScgICAgICAgICAgICAgICAgICAgOiAn2YTYtdmCJywKCSdQYXN0ZSBvbmx5IHRleHQnICAgICAgICAgOiAn2YTYtdmCINin2YTZhti12YjYtSDZgdmC2LcnLAoJJ1Bhc3RlIGZvcm1hdHRlZCB0ZXh0JyAgICA6ICfZhNi12YIg2KfZhNmG2LXZiNi1INin2YTZhdmG2LPZgtipJywKCSdDbGVhbiBmb3JtYXQnICAgICAgICAgICAgOiAn2KXYstin2YTYqSDYp9mE2KrZhtiz2YrZgtin2KonLCAKCSdVbmRvIGxhc3QgYWN0aW9uJyAgICAgICAgOiAn2KfZhNiq2LHYp9is2Lkg2LnZhiDYo9iu2LEg2YHYudmEJywKCSdSZWRvIHByZXZpb3VzIGFjdGlvbicgICAgOiAn2KrZg9ix2KfYsSDYo9iu2LEg2YHYudmEICcsCgknQm9sZCcgICAgICAgICAgICAgICAgICAgIDogJ9i52LHZiti2JywKCSdJdGFsaWMnICAgICAgICAgICAgICAgICAgOiAn2YXYp9im2YQnLAoJJ1VuZGVybGluZScgICAgICAgICAgICAgICA6ICfYqtit2KrZhyDYrti3JywKCSdTdHJpa2V0aHJvdWdoJyAgICAgICAgICAgOiAn2YrYqtmI2LPYt9mHINiu2LcnLAoJJ1N1cGVyc2NyaXB0JyAgICAgICAgICAgICA6ICfZiti52YTZiNmHINiu2LcnLAoJJ1N1YnNjcmlwdCcgICAgICAgICAgICAgICA6ICfYqtit2KrZhyDYrti3JywKCSdBbGlnbiBsZWZ0JyAgICAgICAgICAgICAgOiAn2YXYrdin2LDYp9ipINil2YTZiSDYp9mE2YrYs9in2LEnLAoJJ0FpbGduIHJpZ2h0JyAgICAgICAgICAgICA6ICfZhdit2KfYsNin2Kkg2KXZhNmJINin2YTZitmF2YrZhiAnLAoJJ0FsaWduIGNlbnRlcicgICAgICAgICAgICA6ICfZhdit2KfYsNin2Kkg2KXZhNmJINin2YTZhdmG2KrYtdmBJywKCSdBbGlnbiBmdWxsJyAgICAgICAgICAgICAgOiAn2YXYrdin2LDYp9ipINio2LnYsdi2INin2YTYtdmB2K3YqScsCgknRm9udCBjb2xvcicgICAgICAgICAgICAgIDogJ9mE2YjZhiDYp9mE2K7YtycsCgknQmFja2dyb3VuZCBjb2xvcicgICAgICAgIDogJ9mE2YjZhiDYp9mE2K7ZhNmB2YrYqScsCgknSW5kZW50JyAgICAgICAgICAgICAgICAgIDogJ9mF2LPYp9mB2Kkg2KjYp9iv2KbYqScsIAoJJ091dGRlbnQnICAgICAgICAgICAgICAgICA6ICfZhdiz2KfZgdipINiu2KfYqtmF2KknLCAKCSdVbmRlcmxpbmUnICAgICAgICAgICAgICAgOiAnJywKCSdTdHJpa2V0aHJvdWdoJyAgICAgICAgICAgOiAnJywKCSdTdXBlcnNjcmlwdCcgICAgICAgICAgICAgOiAnJywKCSdTdWJzY3JpcHQnICAgICAgICAgICAgICAgOiAnJywKCSdBbGlnbiBsZWZ0JyAgICAgICAgICAgICAgOiAn2YXYrdin2LDYp9ipINil2YTZiSDYp9mE2YrYs9in2LEnLAoJJ0FpbGduIHJpZ2h0JyAgICAgICAgICAgICA6ICfZhdit2KfYsNin2Kkg2KXZhNmJINin2YTZitmF2YrZhiAnLAoJJ0FsaWduIGNlbnRlcicgICAgICAgICAgICA6ICfZhdit2KfYsNin2Kkg2KXZhCDYp9mE2YXZhtiq2LXZgScsCgknQWxpZ24gZnVsbCcgICAgICAgICAgICAgIDogJycsCgknRm9udCBjb2xvcicgICAgICAgICAgICAgIDogJ9mE2YjZhiDYp9mE2K7YtycsCgknQmFja2dyb3VuZCBjb2xvcicgICAgICAgIDogJ9mE2YjZhiDYp9mE2K7ZhNmB2YrYqScsCgknSW5kZW50JyAgICAgICAgICAgICAgICAgIDogJycsCgknT3V0ZGVudCcgICAgICAgICAgICAgICAgIDogJycsCgknRm9ybWF0JyAgICAgICAgICAgICAgICAgIDogJ9in2YTZhtiq2LPZitmCJywKCSdGb250IHNpemUnICAgICAgICAgICAgICAgOiAn2YLZitin2LMg2KfZhNiu2LcnLAoJJ0ZvbnQnICAgICAgICAgICAgICAgICAgICA6ICfYp9mE2K7YtycsCgknT3JkZXJlZCBsaXN0JyAgICAgICAgICAgIDogJ9mB2KfYptmF2Kkg2YXYsdmC2YXYqScsCgknVW5vcmRlcmVkIGxpc3QnICAgICAgICAgIDogJ9mC2KfYptmF2Kkg2YXYsdiq2KjYqScsCgknSG9yaXpvbnRhbCBydWxlJyAgICAgICAgIDogJ9iu2Lcg2KfZgdmC2YonLAoJJ0Jsb2NrcXVvdGUnICAgICAgICAgICAgICA6ICfYp9mC2KrYqNin2LMnLAoJJ0Jsb2NrIGVsZW1lbnQgKERJViknICAgICA6ICfYp9mC2KrYqNin2LMgKERJViknLAoJJ0xpbmsnICAgICAgICAgICAgICAgICAgICA6ICfYsdin2KjYtycsCgknRGVsZXRlIGxpbmsnICAgICAgICAgICAgIDogJ9it2LDZgSDYp9mE2LHYp9io2LcnLAoJJ0Jvb2ttYXJrJyAgICAgICAgICAgICAgICA6ICfYrdmB2Lgg2YPYudmE2KfZhdipJywKCSdJbWFnZScgICAgICAgICAgICAgICAgICAgOiAn2LXZiNix2KknLAoJJ1RhYmxlJyAgICAgICAgICAgICAgICAgICA6ICfYrNiv2YjZhCcsCgknRGVsZXRlIHRhYmxlJyAgICAgICAgICAgIDogJ9it2LDZgSDYp9mE2KzYr9mI2YQnLAoJJ0luc2VydCByb3cgYmVmb3JlJyAgICAgICA6ICfYpdiv2LHYp9isINin2YTYtdmBINmC2KjZhCAnLAoJJ0luc2VydCByb3cgYWZ0ZXInICAgICAgICA6ICfYpdiv2LHYp9isINin2YTYtdmBINio2LnYr9mHJywKCSdEZWxldGUgcm93JyAgICAgICAgICAgICAgOiAn2K3YsNmBINin2YTYtdmBJywKCSdJbnNlcnQgY29sdW1uIGJlZm9yZScgICAgOiAn2KXYr9ix2KfYrCDYudmF2YjYryDZgtio2YQgJywKCSdJbnNlcnQgY29sdW1uIGFmdGVyJyAgICAgOiAn2KXYr9ix2KfYrCDYudmF2YjYryDYqNi52K8gJywKCSdEZWxldGUgY29sdW1uJyAgICAgICAgICAgOiAn2K3YsNmBINin2YTYudmF2YjYrycsCgknTWVyZ2UgdGFibGUgY2VsbHMnICAgICAgIDogJ9iv2YXYrCDYp9mE2K7ZhNin2YrYpycsCgknU3BsaXQgdGFibGUgY2VsbCcgICAgICAgIDogJ9iq2YLYs9mK2YUg2KfZhNiu2YTZitipJywKCSdUb2dnbGUgZGlzcGxheSBkb2N1bWVudCBzdHJ1Y3R1cmUnIDogJ9il2K7Zgdin2KEvINil2LjZh9in2LEgJywKCSdUYWJsZSBjZWxsIHByb3BlcnRpZXMnICAgOiAn2K7Ytdin2KbYtSDYp9mE2K7ZhNin2YrYpycsCgknVGFibGUgcHJvcGVydGllcycgICAgICAgIDogJ9iu2LXYp9im2LUg2KfZhNis2K/ZiNmEJywKCSdUb2dnbGUgZnVsbCBzY3JlZW4gbW9kZScgOiAn2LnYsdi2INio2YPYp9mF2YQg2KfZhNi02KfYtNipJywKCSdPcGVuIGZpbGUgbWFuYWdlcicgICAgICAgOiAn2KfZgdiq2K0g2YXYs9iq2YPYtNmBINin2YTZhdmE2YHYp9iqJywKCSdOb24gYnJlYWthYmxlIHNwYWNlJyAgICAgOiAnJywKCSdTdG9wIGVsZW1lbnQgZmxvYXRpbmcnICAgOiAnJywKCS8vIGRpYWxvZ3MKCSdXYXJuaW5nJyA6ICfYqtmG2KjZitmHJywKCSdQcm9wZXJpZXMnIDogJ9iu2LXYp9im2LUnLAoJJ1BvcHVwJyA6ICfZhtin2YHYsNipINmF2YbYqNim2YLYqScsCgknQWR2YW5jZWQnIDogJ9mF2KrZgtiv2YUnLAoJJ0V2ZW50cycgOiAn2KfZhNij2K3Yr9in2KsnLAoJJ1BvcHVwJyA6ICcnLAoJJ0FkdmFuY2VkJyA6ICcnLAoJJ0V2ZW50cycgOiAnJywKCSdXaWR0aCcgOiAn2KfZhNi52LHYticsCgknSGVpZ2h0JyA6ICfYp9mE2KfYsdiq2YHYp9i5JywKCSdMZWZ0JyAgIDogJ9in2YTZitiz2KfYsScsCgknQ2VudGVyJyA6ICfYp9mE2YXZhtiq2LXZgScsCgknUmlnaHQnICA6ICfYp9mE2YrZhdmK2YYnLAoJJ0JvcmRlcicgOiAn2K3Yr9mI2K8nLAoJJ0JhY2tncm91bmQnIDogJ9in2YTYrtmE2YHZitipJywKCSdDc3MgY2xhc3MnIDogJ0NzcyDZhtmF2LcnLAoJJ0NzcyBzdHlsZScgOiAnQ3NzINiq2YbYs9mK2YInLAoJJ0JvcmRlcicgOiAnJywKCSdCYWNrZ3JvdW5kJyA6ICcnLAoJJ0NzcyBjbGFzcycgOiAnJywKCSdDc3Mgc3R5bGUnIDogJycsCgknTm8nIDogJ9mE2KcnLAoJJ1RpdGxlJyA6ICfYp9mE2LnZhtmI2KfZhicsCgknU2NyaXB0IGRpcmVjdGlvbicgOiAn2KfYqtis2KfZhyDYp9mE2YbYtScsCgknTGFuZ3VhZ2UnIDogJ9in2YTZhNi62KknLAoJJ0NoYXJzZXQnIDogJ9in2YTYqtix2YXZitiyJywKCSdOb3Qgc2V0JyA6ICfYutmK2LEg2YXYrdiv2K8nLAoJJ0xlZnQgdG8gcmlnaHQnIDogJ9mF2YYg2KfZhNmK2LPYp9ixINil2YTZiSDYp9mE2YrZhdmK2YYnLAoJJ1JpZ2h0IHRvIGxlZnQnIDogJ9mF2YYg2KfZhNmK2YXZitmGINil2YTZiSDYp9mE2YrYs9in2LEnLAoJJ0luIHRoaXMgd2luZG93JyA6ICcoX3NlbGYpJywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJyA6ICcoX2JsYW5rKScsCgknSW4gbmV3IHBhcmVudCB3aW5kb3cgKF9wYXJlbnQpJyA6ICcoX3BhcmVudCknLAoJJ0luIHRvcCBmcmFtZSAoX3RvcCknIDogJyhfdG9wKScsCgknVVJMJyA6ICcnLAoJJ09wZW4gaW4nIDogJycsCgkvLyBjb3B5CgknVGhpcyBvcGVyYXRpb24gaXMgZGlzYWJsZWQgaW4geW91ciBicm93c2VyIG9uIHNlY3VyaXR5IHJlYXNvbi4gVXNlIHNob3J0Y3V0IGluc3RlYWQuJyA6ICfZh9iw2Ycg2KfZhNi52YXZhNmK2Kkg2YXYudi32YTYqSDZhNij2LPYqNin2Kgg2KPZhdmG2YrYqSAsINin2LPYqtiu2K/ZhSDYp9mE2KfYrtiq2LXYp9ixINio2K/ZhNin2Ysg2LnZhtmH2KcnLAoJLy8gZm9ybWF0IAoJJ0hlYWRpbmcgMScgOiAn2LnZhtmI2KfZhiDYsdim2YrYs9mKIDEnLAoJJ0hlYWRpbmcgMicgOiAn2LnZhtmI2KfZhiDYsdim2YrYs9mKIDInLAoJJ0hlYWRpbmcgMycgOiAn2LnZhtmI2KfZhiDYsdim2YrYs9mKIDMnLAoJJ0hlYWRpbmcgNCcgOiAn2LnZhtmI2KfZhiDYsdim2YrYs9mKIDQnLAoJJ0hlYWRpbmcgNScgOiAn2LnZhtmI2KfZhiDYsdim2YrYs9mKIDUnLAoJJ0hlYWRpbmcgNicgOiAn2LnZhtmI2KfZhiDYsdim2YrYs9mKIDYnLAkKCSdQYXJhZ3JhcGgnIDogJ9mF2YLYt9i5INmG2LXZiiAnLAoJJ0FkZHJlc3MnIDogJ9in2YTYudmG2YjYp9mGJywKCSdQcmVmb3JtYXR0ZWQnIDogJycsCgkvLyBmb250IHNpemUKCSdTbWFsbCAoOHB0KScgICA6ICcnLAoJJ1NtYWxsICgxMHB4KScgIDogJycsCgknU21hbGwgKDEycHQpJyAgOiAnJywKCSdOb3JtYWwgKDE0cHQpJyA6ICcnLAoJJ0xhcmdlICgxOHB0KScgIDogJycsCgknTGFyZ2UgKDI0cHQpJyAgOiAnJywKCSdMYXJnZSAoMzZwdCknICA6ICcnLAkJCQkKCS8vIGJvb2ttYXJrCgknQm9va21hcmsgbmFtZScgOiAn2KfYs9mFINin2YTYudmE2KfZhdipJywKCS8vIGxpbmsKCSdMaW5rIFVSTCcgOiAnKNin2LHYqtio2KfYtyknLAoJJ1RhcmdldCcgOiAn2KfZhNmH2K/ZgScsCgknT3BlbiBsaW5rIGluIHBvcHVwIHdpbmRvdycgOiAn2KfZgdiq2K0g2YHZiiDZhtin2YHYsNipINi12LrZitix2KknLAoJJ1VSTCcgOiAn2KfYsdiq2KjYp9i3JywKCSdXaW5kb3cgbmFtZScgOiAn2KfYs9mFINin2YTZhtin2YHYsNipJywKCSdXaW5kb3cgc2l6ZScgOiAn2K3YrNmFINin2YTZhtin2YHYsNipJywKCSdXaW5kb3cgcG9zaXRpb24nIDogJ9in2YTZhdmI2LbYuScsCgknTG9jYXRpb24gYmFyJyA6ICfYp9mE2LnZhtmI2KfZhicsCgknTWVudSBiYXInIDogJ9i02LHZiti3INin2YTZgtmI2KfYptmFJywKCSdUb29sYmFyJyA6ICfZgtin2KbZhdipINin2YTYo9iv2YjYp9iqJywKCSdTY3JvbGxiYXJzJyA6ICfYtNix2YrYtyDYp9mE2KrZhdix2YrYsScsCgknU3RhdHVzIGJhcicgOiAn2LTYsdmK2Lcg2KfZhNmF2LnZhNmI2YXYp9iqJywKCSdSZXNpemFibGUnIDogJ9mF2KrYutmK2LEg2KfZhNit2KzZhScsCgknRGVwZWRlbnQnIDogJycsCgknQWRkIHJldHVybiBmYWxzZScgOiAn2KXYttin2YHYqSAocmV0dXJuIGZhbHNlKScsCgknTWVudSBiYXInIDogJycsCgknVG9vbGJhcicgOiAn2YLYp9im2YXYqSDYp9mE2KPYr9mI2KfYqicsCgknU2Nyb2xsYmFycycgOiAnJywKCSdTdGF0dXMgYmFyJyA6ICcnLAoJJ1Jlc2l6YWJsZScgOiAn2YXYqti62YrYsSDYp9mE2K3YrNmFJywKCSdEZXBlZGVudCcgOiAnJywKCSdBZGQgcmV0dXJuIGZhbHNlJyA6ICcnLAoJJ1RhcmdldCBNSU1FIHR5cGUnIDogJ01JTUUgdHlwZScsCgknUmVsYXRpb25zaGlwIHBhZ2UgdG8gdGFyZ2V0IChyZWwpJyA6ICcnLAoJJ1JlbGF0aW9uc2hpcCB0YXJnZXQgdG8gcGFnZSAocmV2KScgOiAnJywKCSdUYWIgaW5kZXgnIDogJycsCgknQWNjZXNzIGtleScgOiAn2LLYsSDYp9iu2KrYtdin2LEnLAoJLy8gaW1hZ2UKCSdTaXplJyA6ICfYp9mE2K3YrNmFJywKCSdQcmV2aWV3JyA6ICfZhdi52KfZitmG2KknLAoJJ01hcmdpbnMnIDogJycsCgknQWx0IHRleHQnIDogJ9mG2LUg2KjYr9mK2YQnLAoJJ0ltYWdlIFVSTCcgOiAn2LHYp9io2Lcg2LXZiNix2KknLAoJLy8gdGFibGUKCSdTcGFjaW5nJyAgICAgICA6ICfZhdiz2KfZgdin2KogKHNwYWNpbmcpJywKCSdQYWRkaW5nJyAgICAgICA6ICfYp9mE2YfYp9mF2LQgKHBhZGRpbmcpJywKCSdTcGFjaW5nJyAgICAgICA6ICcnLAoJJ1BhZGRpbmcnICAgICAgIDogJycsCgknUm93cycgICAgICAgICAgOiAn2KfZhNi12YHZiNmBJywKCSdDb2x1bW5zJyAgICAgICA6ICfYp9mE2KPYudmF2K/YqScsCgknR3JvdXBzJyAgICAgICAgOiAn2KfZhNmF2KzZhdmI2LnYp9iqJywKCSdDZWxscycgICAgICAgICA6ICfYrtmE2KfZitinJywKCSdDYXB0aW9uJyAgICAgICA6ICfYp9mE2LnZhtmI2KfZhicsCgknSW5uZXIgYm9yZGVycycgOiAn2K3Yr9mI2K8g2K/Yp9iu2YTZitipJwp9Cn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.cs.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogQ3plY2ggdHJhbnNsYXRpb24KICogQGF1dGhvciBNaWNoYWwgTWFyZWsgPG1pY2gubWFyZWtAZ21haWwuY29tPgogKiBAdmVyc2lvbiAyMDEwLTA5LTE5CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuaTE4TWVzc2FnZXMuY3MgPSB7CgknRWRpdG9yJyA6ICdFZGl0b3InLAoJJ1NvdXJjZScgOiAnS8OzZCcsCgkvLyBQYW5lbCBOYW1lCgknQ29weS9QYXNlJyAgICAgIDogJ0tvcMOtcm92YXQvVmxvxb5pdCcsCgknVW5kby9SZWRvJyAgICAgIDogJ1pwxJt0L1pub3Z1JywKCSdUZXh0IHN0eWxlcycgICAgOiAnU3R5bHknLAoJJ0NvbG9ycycgICAgICAgICA6ICdCYXJ2eScsCgknQWxpZ25tZW50JyAgICAgIDogJ1phcm92bsOhbsOtJywKCSdJbmRlbnQvT3V0ZGVudCcgOiAnT2RzYWRpdCAvIFDFmWVkc2FkaXQnLAoJJ1RleHQgZm9ybWF0JyAgICA6ICdGb3Jtw6F0JywKCSdMaXN0cycgICAgICAgICAgOiAnU2V6bmFteScsCgknTWlzYyBlbGVtZW50cycgIDogJ09zdGF0bsOtIGVsZW1lbnR5JywKCSdMaW5rcycgICAgICAgICAgOiAnT2RrYXp5JywKCSdJbWFnZXMnICAgICAgICAgOiAnT2Jyw6F6a3knLAoJJ01lZGlhJyAgICAgICAgICA6ICdNw6lkaWEnLAoJJ1RhYmxlcycgICAgICAgICA6ICdUYWJ1bGt5JywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAnU3Byw6F2Y2Ugc291Ym9yxa8gKGVsRmluZGVyKScsCgknZWxmaW5kZXInIDogJ1NwcsOhdmNlIHNvdWJvcsWvJywKCS8vIGJ1dHRvbiBuYW1lcwoJJ1NhdmUnICAgICAgICAgICAgICAgICAgICA6ICdVbG/Fvml0JywKCSdDb3B5JyAgICAgICAgICAgICAgICAgICAgOiAnS29ww61yb3ZhdCcsCgknQ3V0JyAgICAgICAgICAgICAgICAgICAgIDogJ1Z5am1vdXQnLAoJJ1Bhc3RlJyAgICAgICAgICAgICAgICAgICA6ICdWbG/Fvml0JywKCSdQYXN0ZSBvbmx5IHRleHQnICAgICAgICAgOiAnVmxvxb5pdCBwb3V6ZSB0ZXh0JywKCSdQYXN0ZSBmb3JtYXR0ZWQgdGV4dCcgICAgOiAnVmxvxb5pdCBmb3Jtw6F0b3ZhbsO9IHRleHQnLAoJJ0NsZWFuIGZvcm1hdCcgICAgICAgICAgICA6ICdWecSNaXN0aXQnLCAKCSdVbmRvIGxhc3QgYWN0aW9uJyAgICAgICAgOiAnWnDEm3QnLAoJJ1JlZG8gcHJldmlvdXMgYWN0aW9uJyAgICA6ICdabm92dScsCgknQm9sZCcgICAgICAgICAgICAgICAgICAgIDogJ1R1xI1uw6knLAoJJ0l0YWxpYycgICAgICAgICAgICAgICAgICA6ICdLdXJ6w612YScsCgknVW5kZXJsaW5lJyAgICAgICAgICAgICAgIDogJ1BvZHRyxb5lbsOpJywKCSdTdHJpa2V0aHJvdWdoJyAgICAgICAgICAgOiAnxaBrcnRudXTDqScsCgknU3VwZXJzY3JpcHQnICAgICAgICAgICAgIDogJ0hvcm7DrSBpbmRleCcsCgknU3Vic2NyaXB0JyAgICAgICAgICAgICAgIDogJ0RvbG7DrSBpbmRleCcsCgknQWxpZ24gbGVmdCcgICAgICAgICAgICAgIDogJ1phcm92bmF0IHZsZXZvJywKCSdBaWxnbiByaWdodCcgICAgICAgICAgICAgOiAnWmFyb3ZuYSB2cHJhdm8nLAoJJ0FsaWduIGNlbnRlcicgICAgICAgICAgICA6ICdaYXJvdm5hdCBuYSBzdMWZZWQnLAoJJ0FsaWduIGZ1bGwnICAgICAgICAgICAgICA6ICdEbyBibG9rdScsCgknRm9udCBjb2xvcicgICAgICAgICAgICAgIDogJ0JhcnZhIHDDrXNtYScsCgknQmFja2dyb3VuZCBjb2xvcicgICAgICAgIDogJ0JhcnZhIHBvemFkw60nLAoJJ0luZGVudCcgICAgICAgICAgICAgICAgICA6ICdPZHNhZGl0JywgCgknT3V0ZGVudCcgICAgICAgICAgICAgICAgIDogJ1DFmWVkc2FkaXQnLCAKCSdGb3JtYXQnICAgICAgICAgICAgICAgICAgOiAnRm9ybcOhdCcsCgknRm9udCBzaXplJyAgICAgICAgICAgICAgIDogJ1ZlbGlrb3N0JywKCSdGb250JyAgICAgICAgICAgICAgICAgICAgOiAnUMOtc21vJywKCSdPcmRlcmVkIGxpc3QnICAgICAgICAgICAgOiAnxIzDrXNsb3ZhbsO9IHNlem5hbScsCgknVW5vcmRlcmVkIGxpc3QnICAgICAgICAgIDogJ1Nlem5hbScsCgknSG9yaXpvbnRhbCBydWxlJyAgICAgICAgIDogJ1ZvZG9yb3Zuw6EgxI3DoXJhJywKCSdCbG9ja3F1b3RlJyAgICAgICAgICAgICAgOiAnQ2l0w6F0JywKCSdCbG9jayBlbGVtZW50IChESVYpJyAgICAgOiAnRElWIGVsZW1lbnQnLAoJJ0xpbmsnICAgICAgICAgICAgICAgICAgICA6ICdPZGtheicsCgknRGVsZXRlIGxpbmsnICAgICAgICAgICAgIDogJ09kc3RyYW5pdCBvZGtheicsCgknQm9va21hcmsnICAgICAgICAgICAgICAgIDogJ1rDoWxvxb5rYScsCgknSW1hZ2UnICAgICAgICAgICAgICAgICAgIDogJ09icsOhemVrJywKCSdUYWJsZScgICAgICAgICAgICAgICAgICAgOiAnVGFidWxrYScsCgknRGVsZXRlIHRhYmxlJyAgICAgICAgICAgIDogJ1NtYXphdCB0YWJ1bGt1JywKCSdJbnNlcnQgcm93IGJlZm9yZScgICAgICAgOiAnVmxvxb5pdCDFmcOhZGVrIG5hZCcsCgknSW5zZXJ0IHJvdyBhZnRlcicgICAgICAgIDogJ1Zsb8W+aXQgxZnDoWRlayBwb2QnLAoJJ0RlbGV0ZSByb3cnICAgICAgICAgICAgICA6ICdTbWF6YXQgxZnDoWRlaycsCgknSW5zZXJ0IGNvbHVtbiBiZWZvcmUnICAgIDogJ1Zsb8W+aXQgc2xvdXBlYyBwxZllZCcsCgknSW5zZXJ0IGNvbHVtbiBhZnRlcicgICAgIDogJ1Zsb8W+aXQgc2xvdXBlYyB6YScsCgknRGVsZXRlIGNvbHVtbicgICAgICAgICAgIDogJ1NtYXphdCBzbG91cGVjJywKCSdNZXJnZSB0YWJsZSBjZWxscycgICAgICAgOiAnU2xvdcSNaXQgYnXFiGt5JywKCSdTcGxpdCB0YWJsZSBjZWxsJyAgICAgICAgOiAnUm96ZMSbbGl0IGJ1xYhrdScsCgknVG9nZ2xlIGRpc3BsYXkgZG9jdW1lbnQgc3RydWN0dXJlJyA6ICdab2JyYXppdCBzdHJ1a3R1cnUnLAoJJ1RhYmxlIGNlbGwgcHJvcGVydGllcycgICA6ICdWbGFzdG5vc3RpIGJ1xYhreScsCgknVGFibGUgcHJvcGVydGllcycgICAgICAgIDogJ1ZsYXN0bm9zdGkgdGFidWxreScsCgknVG9nZ2xlIGZ1bGwgc2NyZWVuIG1vZGUnIDogJ0Z1bGxzY3JlZW4nLAoJJ09wZW4gZmlsZSBtYW5hZ2VyJyAgICAgICA6ICdPdGV2xZnDrXQgc3Byw6F2Y2Ugc291Ym9yxa8nLAoJJ05vbiBicmVha2FibGUgc3BhY2UnICAgICA6ICdOZWTEm2xpdGVsbsOhIG1lemVyYScsCgknU3RvcCBlbGVtZW50IGZsb2F0aW5nJyAgIDogJ1pydcWhaXQgb2J0w6lrw6Fuw60gZWxlbWVudHUnLAoJLy8gZGlhbG9ncwoJJ1dhcm5pbmcnIDogJ1Bvem9yJywKCSdQcm9wZXJpZXMnIDogJ1ZsYXN0bm9zdGknLAoJJ1BvcHVwJyA6ICdQb3AtdXAnLAoJJ0FkdmFuY2VkJyA6ICdWw61jZScsCgknRXZlbnRzJyA6ICdVZMOhbG9zdGknLAoJJ1dpZHRoJyA6ICfFoMOtxZlrYScsCgknSGVpZ2h0JyA6ICdWw73FoWthJywKCSdMZWZ0JyAgIDogJ1ZsZXZvJywKCSdDZW50ZXInIDogJ05hIHN0xZllZCcsCgknUmlnaHQnICA6ICdWcHJhdm8nLAoJJ0JvcmRlcicgOiAnUsOhbWXEjWVrJywKCSdCYWNrZ3JvdW5kJyA6ICdQb3phZMOtJywKCSdDc3MgY2xhc3MnIDogJ0NTUyB0xZnDrWRhJywKCSdDc3Mgc3R5bGUnIDogJ0NTUyBzdHlsJywKCSdObycgOiAnTmUnLAoJJ1RpdGxlJyA6ICdUaXR1bGVrJywKCSdTY3JpcHQgZGlyZWN0aW9uJyA6ICdQcmF2aWRsYSBzY3JpcHR1JywKCSdMYW5ndWFnZScgOiAnSmF6eWsnLAoJJ0NoYXJzZXQnIDogJ1puYWtvdsOhIHNhZGEnLAoJJ05vdCBzZXQnIDogJ05lbmFzdGF2ZW5vJywKCSdMZWZ0IHRvIHJpZ2h0JyA6ICdabGV2YSBkb3ByYXZhJywKCSdSaWdodCB0byBsZWZ0JyA6ICdacHJhdmEgZG9sZXZhJywKCSdJbiB0aGlzIHdpbmRvdycgOiAnViB0b210byBva27EmyAoX3NlbGYpJywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJyA6ICdWIG5vdsOpbSBva27EmyAoX2JsYW5rKScsCgknSW4gbmV3IHBhcmVudCB3aW5kb3cgKF9wYXJlbnQpJyA6ICdWIG5vdsOpbSByb2RpxI1vdnNrw6ltIG9rbsSbIChfcGFyZW50KScsCgknSW4gdG9wIGZyYW1lIChfdG9wKScgOiAnViBobGF2bsOtbSBva27EmyAoX3RvcCknLAoJJ1VSTCcgOiAnVVJMJywKCSdPcGVuIGluJyA6ICdPdGV2xZnDrXQgdicsCgkvLyBjb3B5CgknVGhpcyBvcGVyYXRpb24gaXMgZGlzYWJsZWQgaW4geW91ciBicm93c2VyIG9uIHNlY3VyaXR5IHJlYXNvbi4gVXNlIHNob3J0Y3V0IGluc3RlYWQuJyA6ICdUYXRvIG9wZXJhY2UgamUgdmUgdmHFoWVtIHByb2hsw63FvmXEjWkgdnlwbnV0w6Ega3bFr2xpIGJlenBlxI1ub3N0aS4gUG91xb5panRlIGtsw6F2ZXNvdm91IHprcmF0a3UuJywKCS8vIGZvcm1hdCAKCSdIZWFkaW5nIDEnIDogJ05hZHBpcyAxJywKCSdIZWFkaW5nIDInIDogJ05hZHBpcyAyJywKCSdIZWFkaW5nIDMnIDogJ05hZHBpcyAzJywKCSdIZWFkaW5nIDQnIDogJ05hZHBpcyA0JywKCSdIZWFkaW5nIDUnIDogJ05hZHBpcyA1JywKCSdIZWFkaW5nIDYnIDogJ05hZHBpcyA2JywJCgknUGFyYWdyYXBoJyA6ICdPZHN0YXZlYycsCgknQWRkcmVzcycgOiAnQWRyZXNhJywKCSdQcmVmb3JtYXR0ZWQnIDogJ1DFmWVkZm9ybcOhdG92w6FubycsCgkvLyBmb250IHNpemUKCSdTbWFsbCAoOHB0KScgICA6ICdNYWzDqSAoOCBwdCknLAoJJ1NtYWxsICgxMHB4KScgIDogJ01hbMOpICgxMCBwdCknLAoJJ1NtYWxsICgxMnB0KScgIDogJ01hbMOpICgxMiBwdCknLAoJJ05vcm1hbCAoMTRwdCknIDogJ05vcm3DoWxuw60gKDE0IHB0KScsCgknTGFyZ2UgKDE4cHQpJyAgOiAnVmVsa8OpICgxOCBwdCknLAoJJ0xhcmdlICgyNHB0KScgIDogJ1ZlbGvDqSAoMjQgcHQpJywKCSdMYXJnZSAoMzZwdCknICA6ICdWZWxrw6kgKDM2IHB0KScsCQkJCQoJLy8gYm9va21hcmsKCSdCb29rbWFyayBuYW1lJyA6ICdKbcOpbm8gesOhbG/Fvmt5JywKCS8vIGxpbmsKCSdMaW5rIFVSTCcgOiAnVVJMJywKCSdUYXJnZXQnIDogJ0PDrWwnLAoJJ09wZW4gbGluayBpbiBwb3B1cCB3aW5kb3cnIDogJ090ZXbDrXJhdCBvZGtheiB2IHBvcHVwIG9rbsSbLicsCgknVVJMJyA6ICdVUkwnLAoJJ1dpbmRvdyBuYW1lJyA6ICdKbcOpbm8gb2tuYScsCgknV2luZG93IHNpemUnIDogJ1ZlbGlrb3N0IG9rbmEnLAoJJ1dpbmRvdyBwb3NpdGlvbicgOiAnUG96aWNlIG9rbmEnLAoJJ0xvY2F0aW9uIGJhcicgOiAnQWRyZXNuw60gxZnDoWRlaycsCgknTWVudSBiYXInIDogJ01lbnUgbmFiw61kZWsnLAoJJ1Rvb2xiYXInIDogJ0xpxaF0YSBuw6FzdHJvasWvJywKCSdTY3JvbGxiYXJzJyA6ICdQb3N1dm7DrWt5JywKCSdTdGF0dXMgYmFyJyA6ICdTdGF2b3bDvSDFmcOhZGVrJywKCSdSZXNpemFibGUnIDogJ1ptxJtuYSB2ZWxpa29zdGknLAoJJ0RlcGVkZW50JyA6ICcnLAoJJ0FkZCByZXR1cm4gZmFsc2UnIDogJ1DFmWlkYXQgcmV0dXJuIGZhbHNlJywKCSdUYXJnZXQgTUlNRSB0eXBlJyA6ICdDw61sb3bDvSBNSU1FIHR5cCcsCgknUmVsYXRpb25zaGlwIHBhZ2UgdG8gdGFyZ2V0IChyZWwpJyA6ICcnLAoJJ1JlbGF0aW9uc2hpcCB0YXJnZXQgdG8gcGFnZSAocmV2KScgOiAnJywKCSdUYWIgaW5kZXgnIDogJycsCgknQWNjZXNzIGtleScgOiAnJywKCS8vIGltYWdlCgknU2l6ZScgOiAnVmVsaWtvc3QnLAoJJ1ByZXZpZXcnIDogJ07DoWhsZWQnLAoJJ01hcmdpbnMnIDogJ09rcmFqZScsCgknQWx0IHRleHQnIDogJ0FsdGVybmF0aXZuw60gdGV4dCcsCgknSW1hZ2UgVVJMJyA6ICdVUkwnLAoJLy8gdGFibGUKCSdTcGFjaW5nJyAgICAgICA6ICdWbsSbasWhw60gb2tyYWplJywKCSdQYWRkaW5nJyAgICAgICA6ICdWbml0xZluw60gb2tyYWplJywKCSdSb3dzJyAgICAgICAgICA6ICfFmMOhZGt5JywKCSdDb2x1bW5zJyAgICAgICA6ICdTbG91cGNlJywKCSdHcm91cHMnICAgICAgICA6ICdTa3VwaW55JywKCSdDZWxscycgICAgICAgICA6ICdCdcWIa3knLAoJJ0NhcHRpb24nICAgICAgIDogJ1BvcGlzZWsnLAoJJ0lubmVyIGJvcmRlcnMnIDogJ1ZuaXTFmW7DrSByw6FtZcSNa3knCgkKCQp9Cn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.de.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogR2VybWFuIHRyYW5zbGF0aW9uCiAqIEBhdXRob3IgVmFzaWxpeSBSYXp1bW55aCA8cnZuQHN0ZDQyLnJ1PgogKiBAdmVyc2lvbiAyMDEwLTA5LTE4CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuaTE4TWVzc2FnZXMuZGUgPSB7CgknRWRpdG9yJyA6ICdFZGl0b3InLAoJJ1NvdXJjZScgOiAnUXVlbGxjb2RlJywKCS8vIFBhbmVsIE5hbWUKCSdDb3B5L1Bhc2UnICAgICAgOiAnS29waWVyZW4vRWluZsO8Z2VuJywKCSdVbmRvL1JlZG8nICAgICAgOiAnUsO8Y2tnw6RuZ2lnL1dpZWRlcmhlcnN0ZWxsZW4nLAoJJ1RleHQgc3R5bGVzJyAgICA6ICdUZXh0c3RpbGUnLAoJJ0NvbG9ycycgICAgICAgICA6ICdGYXJiZScsCgknQWxpZ25tZW50JyAgICAgIDogJ0FsaWdubWVudCcsCgknSW5kZW50L091dGRlbnQnIDogJ0VpbnLDvGNrZW4gLyBBdXNyw7xja2VuJywKCSdUZXh0IGZvcm1hdCcgICAgOiAnRm9ybWF0JywKCSdMaXN0cycgICAgICAgICAgOiAnTGlzdGVuJywKCSdNaXNjIGVsZW1lbnRzJyAgOiAnU29uc3RpZ2UgZWxlbWVudGUnLAoJJ0xpbmtzJyAgICAgICAgICA6ICdMaW5rJywKCSdJbWFnZXMnICAgICAgICAgOiAnQmlsZCcsCgknTWVkaWEnICAgICAgICAgIDogJ01lZGlhIGRhdGVpJywKCSdUYWJsZXMnICAgICAgICAgOiAnVGFiZWxsZScsCgknRmlsZSBtYW5hZ2VyIChlbEZpbmRlciknIDogJ0RhdGVpLU1hbmFnZXIgKGVsRmluZGVyKScsCgkvLyBidXR0b24gbmFtZXMKCSdTYXZlJyAgICAgICAgICAgICAgICAgICAgOiAnU3BlaWNoZXJuJywKCSdDb3B5JyAgICAgICAgICAgICAgICAgICAgOiAnQXVzc2NobmVpZGVuJywKCSdDdXQnICAgICAgICAgICAgICAgICAgICAgOiAnS29waWVyZW4nLAoJJ1Bhc3RlJyAgICAgICAgICAgICAgICAgICA6ICdFaW5mw7xnZW4nLAoJJ1Bhc3RlIG9ubHkgdGV4dCcgICAgICAgICA6ICdGw7xnZW4gc2llIG51ciB0ZXh0JywKCSdQYXN0ZSBmb3JtYXR0ZWQgdGV4dCcgICAgOiAnRsO8Z2VuIHNpZSBmb3JtYXRpZXJ0ZW4gdGV4dCcsCgknQ2xlYW4gZm9ybWF0JyAgICAgICAgICAgIDogJ0Zvcm1hdGllcnVuZ2VuIGVudGZlcm5lbicsIAoJJ1VuZG8gbGFzdCBhY3Rpb24nICAgICAgICA6ICdSw7xja2fDpG5naWcnLAoJJ1JlZG8gcHJldmlvdXMgYWN0aW9uJyAgICA6ICdXaWVkZXJoZXJzdGVsbGVuJywKCSdCb2xkJyAgICAgICAgICAgICAgICAgICAgOiAnRmV0dCcsCgknSXRhbGljJyAgICAgICAgICAgICAgICAgIDogJ0t1cnNpdicsCgknVW5kZXJsaW5lJyAgICAgICAgICAgICAgIDogJ1VudGVyc3RyaWNoZW4nLAoJJ1N0cmlrZXRocm91Z2gnICAgICAgICAgICA6ICdEdXJjaGdlc3RyaWNoZW4nLAoJJ1N1cGVyc2NyaXB0JyAgICAgICAgICAgICA6ICdIb2NoZ2VzdGVsbHQnLAoJJ1N1YnNjcmlwdCcgICAgICAgICAgICAgICA6ICdUaWVmZ2VzdGVsbHQnLAoJJ0FsaWduIGxlZnQnICAgICAgICAgICAgICA6ICdMaW5rc2LDvG5kaWcnLAoJJ0FpbGduIHJpZ2h0JyAgICAgICAgICAgICA6ICdSZWNodHNiw7xuZGlnJywKCSdBbGlnbiBjZW50ZXInICAgICAgICAgICAgOiAnWmVudHJpZXJ0JywKCSdBbGlnbiBmdWxsJyAgICAgICAgICAgICAgOiAnQmxvY2tzYXR6JywKCSdGb250IGNvbG9yJyAgICAgICAgICAgICAgOiAnVGV4dGZhcmJlJywKCSdCYWNrZ3JvdW5kIGNvbG9yJyAgICAgICAgOiAnSGludGVyZ3J1bmRmYXJiZScsCgknSW5kZW50JyAgICAgICAgICAgICAgICAgIDogJ0Vpbnp1ZyBlcmjDtmhlbicsIAoJJ091dGRlbnQnICAgICAgICAgICAgICAgICA6ICdFaW56dWcgdmVycmluZ2VybicsIAoJJ0Zvcm1hdCcgICAgICAgICAgICAgICAgICA6ICdGb3JtYXQnLAoJJ0ZvbnQgc2l6ZScgICAgICAgICAgICAgICA6ICdHcsO2w59lJywKCSdGb250JyAgICAgICAgICAgICAgICAgICAgOiAnU2NocmlmdGFydCcsCgknT3JkZXJlZCBsaXN0JyAgICAgICAgICAgIDogJ051bW1lcmllcnRlIExpc3RlJywKCSdVbm9yZGVyZWQgbGlzdCcgICAgICAgICAgOiAnTGlzdGUnLAoJJ0hvcml6b250YWwgcnVsZScgICAgICAgICA6ICdIb3Jpem9udGFsZSBMaW5pZScsCgknQmxvY2txdW90ZScgICAgICAgICAgICAgIDogJ1ppdGF0YmxvY2snLAoJJ0Jsb2NrIGVsZW1lbnQgKERJViknICAgICA6ICdCbG9jay1FbGVtZW50IChESVYpJywKCSdMaW5rJyAgICAgICAgICAgICAgICAgICAgOiAnTGluaycsCgknRGVsZXRlIGxpbmsnICAgICAgICAgICAgIDogJ0xpbmsgZW50ZmVybmVuJywKCSdCb29rbWFyaycgICAgICAgICAgICAgICAgOiAnQW5rZXIgZWluZsO8Z2VuL2VkaXRpZXJlbicsCgknSW1hZ2UnICAgICAgICAgICAgICAgICAgIDogJ0JpbGQnLAoJJ1RhYmxlJyAgICAgICAgICAgICAgICAgICA6ICdUYWJlbGxlJywKCSdEZWxldGUgdGFibGUnICAgICAgICAgICAgOiAnVGFiZWxsZSBsw7ZzY2hlbicsCgknSW5zZXJ0IHJvdyBiZWZvcmUnICAgICAgIDogJ1plaWxlIG9iZXJoYWxiIGVpbmbDvGdlbicsCgknSW5zZXJ0IHJvdyBhZnRlcicgICAgICAgIDogJ1plaWxlIHVudGVyaGFsYiBlaW5mw7xnZW4nLAoJJ0RlbGV0ZSByb3cnICAgICAgICAgICAgICA6ICdaZWlsZSBlbnRmZXJuZW4nLAoJJ0luc2VydCBjb2x1bW4gYmVmb3JlJyAgICA6ICdTcGFsdGUgbGlua3MgZGF2b3IgZWluZsO8Z2VuJywKCSdJbnNlcnQgY29sdW1uIGFmdGVyJyAgICAgOiAnU3BhbHRlIHJlY2h0cyBkYW5hY2ggZWluZsO8Z2VuJywKCSdEZWxldGUgY29sdW1uJyAgICAgICAgICAgOiAnU3BhbHRlIGzDtnNjaGVuJywKCSdNZXJnZSB0YWJsZSBjZWxscycgICAgICAgOiAnWmVsbGVuIHZlcmJpbmRlbicsCgknU3BsaXQgdGFibGUgY2VsbCcgICAgICAgIDogJ1plbGxlIHRlaWxlbicsCgknVG9nZ2xlIGRpc3BsYXkgZG9jdW1lbnQgc3RydWN0dXJlJyA6ICdCbMO2Y2tlIGFuemVpZ2VuJywKCSdUYWJsZSBjZWxsIHByb3BlcnRpZXMnICAgOiAnWmVsbGVuLUVpZ2Vuc2NoYWZ0ZW4nLAoJJ1RhYmxlIHByb3BlcnRpZXMnICAgICAgICA6ICdUYWJlbGxlbi1FaWdlbnNjaGFmdGVuJywKCSdUb2dnbGUgZnVsbCBzY3JlZW4gbW9kZScgOiAnRWRpdG9yIG1heGltaWVyZW4nLAoJJ09wZW4gZmlsZSBtYW5hZ2VyJyAgICAgICA6ICdTZXJ2ZXInLAoJJ05vbiBicmVha2FibGUgc3BhY2UnICAgICA6ICdOb24tYnJlYWtpbmcgc3BhY2UnLAoJJ1N0b3AgZWxlbWVudCBmbG9hdGluZycgICA6ICdEZWFrdGl2aWVyZW4gU2llIGZsb3ctRWxlbWVudCBUZXh0JywKCS8vIGRpYWxvZ3MKCSdXYXJuaW5nJyA6ICdBQ0hUVU5HJywKCSdQcm9wZXJpZXMnIDogJ1Byb3BlcmllcycsCgknUG9wdXAnIDogJ1BvcC11cCcsCgknQWR2YW5jZWQnIDogJ21laHInLAoJJ0V2ZW50cycgOiAnVmVyYW5zdGFsdHVuZ2VuJywKCSdXaWR0aCcgOiAnQnJlaXRlJywKCSdIZWlnaHQnIDogJ0jDtmhlJywKCSdMZWZ0JyAgIDogJ0xpbmtzJywKCSdDZW50ZXInIDogJ1plbnRydW0nLAoJJ1JpZ2h0JyAgOiAnUmVjaHRzJywKCSdCb3JkZXInIDogJ1JhaG1lbicsCgknQmFja2dyb3VuZCcgOiAnSGludGVyZ3J1bmRmYXJiZScsCgknQ3NzIGNsYXNzJyA6ICdDc3MgY2xhc3MnLAoJJ0NzcyBzdHlsZScgOiAnQ3NzIHN0eWxlJywKCSdObycgOiAnTmVpbicsCgknVGl0bGUnIDogJ1RpdGVsJywKCSdTY3JpcHQgZGlyZWN0aW9uJyA6ICdSaWNodHVuZyBTY2hyZWliZW4nLAoJJ0xhbmd1YWdlJyA6ICdTcHJhY2hlJywKCSdDaGFyc2V0JyA6ICdDaGFyc2V0JywKCSdOb3Qgc2V0JyA6ICduaWNodCcsCgknTGVmdCB0byByaWdodCcgOiAnTGlua3MgbmFjaCBSZWNodHMnLAoJJ1JpZ2h0IHRvIGxlZnQnIDogJ1JlY2h0cyBuYWNoIExpbmtzJywKCSdJbiB0aGlzIHdpbmRvdycgOiAnR2xlaWNoZXMgRmVuc3RlciAoX3NlbGYpJywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJyA6ICdOZXVlcyBGZW5zdGVyIChfYmxhbmspJywKCSdJbiBuZXcgcGFyZW50IHdpbmRvdyAoX3BhcmVudCknIDogJ09iZXJlcyBGZW5zdGVyIChfcGFyZW50KScsCgknSW4gdG9wIGZyYW1lIChfdG9wKScgOiAnT2JlcnN0ZXMgRmVuc3RlciAoX3RvcCknLAoJJ1VSTCcgOiAnJywKCSdPcGVuIGluJyA6ICcnLAoJLy8gY29weQoJJ1RoaXMgb3BlcmF0aW9uIGlzIGRpc2FibGVkIGluIHlvdXIgYnJvd3NlciBvbiBzZWN1cml0eSByZWFzb24uIFVzZSBzaG9ydGN1dCBpbnN0ZWFkLicgOiAnRGllc2VyIFZvcmdhbmcgaXN0IGluIElocmVtIEJyb3dzZXIgYXVzIFNpY2hlcmhlaXRzZ3LDvG5kZW4gZGVha3RpdmllcnQuIFRhc3RlbmtvbWJpbmF0aW9uIHN0YXR0LicsCgkvLyBmb3JtYXQgCgknSGVhZGluZyAxJyA6ICfDnGJlcnNjaHJpZnQgMScsCgknSGVhZGluZyAyJyA6ICfDnGJlcnNjaHJpZnQgMicsCgknSGVhZGluZyAzJyA6ICfDnGJlcnNjaHJpZnQgMycsCgknSGVhZGluZyA0JyA6ICfDnGJlcnNjaHJpZnQgNCcsCgknSGVhZGluZyA1JyA6ICfDnGJlcnNjaHJpZnQgNScsCgknSGVhZGluZyA2JyA6ICfDnGJlcnNjaHJpZnQgNicsCQoJJ1BhcmFncmFwaCcgOiAnRm9ybWF0aWVydCcsCgknQWRkcmVzcycgOiAnQWRkcmVzc2UnLAoJJ1ByZWZvcm1hdHRlZCcgOiAnJywKCS8vIGZvbnQgc2l6ZQoJJ1NtYWxsICg4cHQpJyAgIDogJycsCgknU21hbGwgKDEwcHgpJyAgOiAnJywKCSdTbWFsbCAoMTJwdCknICA6ICcnLAoJJ05vcm1hbCAoMTRwdCknIDogJycsCgknTGFyZ2UgKDE4cHQpJyAgOiAnJywKCSdMYXJnZSAoMjRwdCknICA6ICcnLAoJJ0xhcmdlICgzNnB0KScgIDogJycsCQkJCQoJLy8gYm9va21hcmsKCSdCb29rbWFyayBuYW1lJyA6ICdBbmtlciBOYW1lJywKCS8vIGxpbmsKCSdMaW5rIFVSTCcgOiAnKFVSTCknLAoJJ1RhcmdldCcgOiAnWmllbHNlaXRlJywKCSdPcGVuIGxpbmsgaW4gcG9wdXAgd2luZG93JyA6ICdMaW5rIGluIGVpbmVtIFBvcHVwLUZlbnN0ZXInLAoJJ1VSTCcgOiAnJywKCSdXaW5kb3cgbmFtZScgOiAnUG9wLXVwIEZlbnN0ZXItTmFtZScsCgknV2luZG93IHNpemUnIDogJ0dyw7bDn2UnLAoJJ1dpbmRvdyBwb3NpdGlvbicgOiAnUG9zaXRpb24nLAoJJ0xvY2F0aW9uIGJhcicgOiAnQWRyZXNzLUxlaXN0ZScsCgknTWVudSBiYXInIDogJ01lbsO8LUxlaXN0ZScsCgknVG9vbGJhcicgOiAnV2Vya3pldWdsZWlzdGUnLAoJJ1Njcm9sbGJhcnMnIDogJ1JvbGxiYWxrZW4nLAoJJ1N0YXR1cyBiYXInIDogJ1N0YXR1c2xlaXN0ZScsCgknUmVzaXphYmxlJyA6ICdWZXJncsO2w59lcmJhcicsCgknRGVwZWRlbnQnIDogJ0FiaMOkbmdpZyAoTmV0c2NhcGUpJywKCSdBZGQgcmV0dXJuIGZhbHNlJyA6ICdhZGQgKHJldHVybiBmYWxzZSknLAoJJ1RhcmdldCBNSU1FIHR5cGUnIDogJ01JTUUgdHlwZScsCgknUmVsYXRpb25zaGlwIHBhZ2UgdG8gdGFyZ2V0IChyZWwpJyA6ICcnLAoJJ1JlbGF0aW9uc2hpcCB0YXJnZXQgdG8gcGFnZSAocmV2KScgOiAnJywKCSdUYWIgaW5kZXgnIDogJycsCgknQWNjZXNzIGtleScgOiAnWnVncmlmZnN0YXN0ZScsCgkvLyBpbWFnZQoJJ1NpemUnIDogJ0dyw7bDn2UnLAoJJ1ByZXZpZXcnIDogJ1ZvcnNjaGF1JywKCSdNYXJnaW5zJyA6ICcnLAoJJ0FsdCB0ZXh0JyA6ICdBbHQnLAoJJ0ltYWdlIFVSTCcgOiAnVVJMJywKCS8vIHRhYmxlCgknU3BhY2luZycgICAgICAgOiAnQWJzdGFuZCAoc3BhY2luZyknLAoJJ1BhZGRpbmcnICAgICAgIDogJ0Fic3RhbmQgKHBhZGRpbmcpJywKCSdSb3dzJyAgICAgICAgICA6ICdaZWlsZScsCgknQ29sdW1ucycgICAgICAgOiAnU3BhbHRlJywKCSdHcm91cHMnICAgICAgICA6ICdHcnVwcGVuJywKCSdDZWxscycgICAgICAgICA6ICdaZWxsZW4nLAoJJ0NhcHRpb24nICAgICAgIDogJ1RhYmVsbGVuLUVpZ2Vuc2NoYWZ0ZW4nLAoJJ0lubmVyIGJvcmRlcnMnIDogJ0lubmVyZSBHcmVuemVuJwoJCgkKfQp9KShqUXVlcnkpOwo=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.es.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFNwYW5pc2ggdHJhbnNsYXRpb24KICogQGF1dGhvciBSaWNhcmRvIE9icmVnw7NuIDxyb2JyZWdvbm1AZ21haWwuY29tPgogKiBAdmVyc2lvbiAyMDEwLTA5LTE4CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuaTE4TWVzc2FnZXMuZXMgPSB7CgknRWRpdG9yJyA6ICdFZGl0b3InLAoJJ1NvdXJjZScgOiAnQ8OzZGlnbyBGdWVudGUnLAoJLy8gUGFuZWwgTmFtZQoJJ0NvcHkvUGFzZScgICAgICA6ICdDb3BpYXIvUGVnYXInLAoJJ1VuZG8vUmVkbycgICAgICA6ICdEZXNoYWNlci9SZWhhY2VyJywKCSdUZXh0IHN0eWxlcycgICAgOiAnRXN0aWxvcyBkZSBUZXh0bycsCgknQ29sb3JzJyAgICAgICAgIDogJ0NvbG9yZXMnLAoJJ0FsaWdubWVudCcgICAgICA6ICdBbGluZWFjacOzbicsCgknSW5kZW50L091dGRlbnQnIDogJ0F1bWVudGFyL0Rpc21pbnVpciBTYW5ncsOtYScsCgknVGV4dCBmb3JtYXQnICAgIDogJ0Zvcm1hdG8gZGUgdGV4dG8nLAoJJ0xpc3RzJyAgICAgICAgICA6ICdMaXN0YXMnLAoJJ01pc2MgZWxlbWVudHMnICA6ICdFbGVtZW50b3MgdmFyaW9zJywKCSdMaW5rcycgICAgICAgICAgOiAnVsOtbmN1bG9zJywKCSdJbWFnZXMnICAgICAgICAgOiAnSW3DoWdlbmVzJywKCSdNZWRpYScgICAgICAgICAgOiAnTXVsdGltZWRpYScsCgknVGFibGVzJyAgICAgICAgIDogJ1RhYmxhcycsCgknRmlsZSBtYW5hZ2VyIChlbEZpbmRlciknIDogJ0FkbWluaXN0cmFkb3IgZGUgYXJjaGl2b3MnLAoJLy8gYnV0dG9uIG5hbWVzCgknU2F2ZScgICAgICAgICAgICAgICAgICAgIDogJ0d1YXJkYXInLAoJJ0NvcHknICAgICAgICAgICAgICAgICAgICA6ICdDb3BpYXInLAoJJ0N1dCcgICAgICAgICAgICAgICAgICAgICA6ICdDb3J0YXInLAoJJ1Bhc3RlJyAgICAgICAgICAgICAgICAgICA6ICdQZWdhcicsCgknUGFzdGUgb25seSB0ZXh0JyAgICAgICAgIDogJ1BlZ2FyIHNvbG8gdGV4dG8nLAoJJ1Bhc3RlIGZvcm1hdHRlZCB0ZXh0JyAgICA6ICdQZWdhciB0ZXh0byBmb3JtYXRlYWRvJywKCSdDbGVhbiBmb3JtYXQnICAgICAgICAgICAgOiAnTGltcGlhciBmb3JtYXRvJywKCSdVbmRvIGxhc3QgYWN0aW9uJyAgICAgICAgOiAnRGVzaGFjZXIgbGEgw7psdGltYSBhY2Npw7NuJywKCSdSZWRvIHByZXZpb3VzIGFjdGlvbicgICAgOiAnUmVoYWNlciBsYSDDumx0aW1hIGFjY2nDs24nLAoJJ0JvbGQnICAgICAgICAgICAgICAgICAgICA6ICdOZWdyaXRhJywKCSdJdGFsaWMnICAgICAgICAgICAgICAgICAgOiAnQ3Vyc2l2YScsCgknVW5kZXJsaW5lJyAgICAgICAgICAgICAgIDogJ1N1YnJheWFkbycsCgknU3RyaWtldGhyb3VnaCcgICAgICAgICAgIDogJ1RhY2hhZG8nLAoJJ1N1cGVyc2NyaXB0JyAgICAgICAgICAgICA6ICdTdXBlcsOtbmRpY2UnLAoJJ1N1YnNjcmlwdCcgICAgICAgICAgICAgICA6ICdTdWLDrW5kaWNlJywKCSdBbGlnbiBsZWZ0JyAgICAgICAgICAgICAgOiAnQWxpbmVhciBhIGxhIGl6cXVpZXJkYScsCgknQWlsZ24gcmlnaHQnICAgICAgICAgICAgIDogJ0FsaW5lYXIgYSBsYSBkZXJlY2hhJywKCSdBbGlnbiBjZW50ZXInICAgICAgICAgICAgOiAnQ2VudHJhcicsCgknQWxpZ24gZnVsbCcgICAgICAgICAgICAgIDogJ0p1c3RpZmljYWRvJywKCSdGb250IGNvbG9yJyAgICAgICAgICAgICAgOiAnQ29sb3IgZGUgdGV4dG8nLAoJJ0JhY2tncm91bmQgY29sb3InICAgICAgICA6ICdDb2xvciBkZSBmb25kbycsCgknSW5kZW50JyAgICAgICAgICAgICAgICAgIDogJ0F1bWVudGFyIHNhbmdyw61hJywKCSdPdXRkZW50JyAgICAgICAgICAgICAgICAgOiAnUmVkdWNpciBzYW5ncsOtYScsCgknRm9ybWF0JyAgICAgICAgICAgICAgICAgIDogJ0Zvcm1hdG8nLAoJJ0ZvbnQgc2l6ZScgICAgICAgICAgICAgICA6ICdUYW1hw7FvIGRlIGxldHJhJywKCSdGb250JyAgICAgICAgICAgICAgICAgICAgOiAnRnVlbnRlJywKCSdPcmRlcmVkIGxpc3QnICAgICAgICAgICAgOiAnTGlzdGEgb3JkZW5hZGEnLAoJJ1Vub3JkZXJlZCBsaXN0JyAgICAgICAgICA6ICdMaXN0YSBkZXNvcmRlbmFkYScsCgknSG9yaXpvbnRhbCBydWxlJyAgICAgICAgIDogJ0zDrW5lYSBob3Jpem9udGFsJywKCSdCbG9ja3F1b3RlJyAgICAgICAgICAgICAgOiAnQ2l0YScsCgknQmxvY2sgZWxlbWVudCAoRElWKScgICAgIDogJ0Jsb3F1ZSBkZSBFbGVtZW50b3MgKERJViknLAoJJ0xpbmsnICAgICAgICAgICAgICAgICAgICA6ICdWw61uY3VsbycsCgknRGVsZXRlIGxpbmsnICAgICAgICAgICAgIDogJ0VsaW1pbmFyIHbDrW5jdWxvJywKCSdCb29rbWFyaycgICAgICAgICAgICAgICAgOiAnTWFyY2Fkb3InLAoJJ0ltYWdlJyAgICAgICAgICAgICAgICAgICA6ICdJbWFnZW4nLAoJJ1RhYmxlJyAgICAgICAgICAgICAgICAgICA6ICdUYWJsYScsCgknRGVsZXRlIHRhYmxlJyAgICAgICAgICAgIDogJ0VsaW1pbmFyIHRhYmxhJywKCSdJbnNlcnQgcm93IGJlZm9yZScgICAgICAgOiAnSW5zZXJ0YXIgZmlsYSBhbnRlcycsCgknSW5zZXJ0IHJvdyBhZnRlcicgICAgICAgIDogJ0luc2VydGFyIGZpbGEgZGVzcHXDqXMnLAoJJ0RlbGV0ZSByb3cnICAgICAgICAgICAgICA6ICdFbGltaW5hciBmaWxhJywKCSdJbnNlcnQgY29sdW1uIGJlZm9yZScgICAgOiAnSW5zZXJ0YXIgY29sdW1uYSBhbnRlcycsCgknSW5zZXJ0IGNvbHVtbiBhZnRlcicgICAgIDogJ0luc2VydGFyIGNvbHVtbmEgZGVzcHXDqXMnLAoJJ0RlbGV0ZSBjb2x1bW4nICAgICAgICAgICA6ICdFbGltaW5hciBjb2x1bW5hJywKCSdNZXJnZSB0YWJsZSBjZWxscycgICAgICAgOiAnRnVuZGlyIGNlbGRhcycsCgknU3BsaXQgdGFibGUgY2VsbCcgICAgICAgIDogJ0RpdmlkaXIgY2VsZGEnLAoJJ1RvZ2dsZSBkaXNwbGF5IGRvY3VtZW50IHN0cnVjdHVyZScgOiAnUGFudGFsbGEgZGUgZXN0cnVjdHVyYSBkZSBkb2N1bWVudG8nLAoJJ1RhYmxlIGNlbGwgcHJvcGVydGllcycgICA6ICdQcm9waWVkYWRlcyBkZSBjZWxkYScsCgknVGFibGUgcHJvcGVydGllcycgICAgICAgIDogJ1Byb3BpZWRhZGVzIGRlIHRhYmxhJywKCSdUb2dnbGUgZnVsbCBzY3JlZW4gbW9kZScgOiAnTW9kbyBkZSBwYW50YWxsYSBjb21wbGV0YScsCgknT3BlbiBmaWxlIG1hbmFnZXInICAgICAgIDogJ0FicmlyIGFkbWluaXN0cmFkb3IgZGUgYXJjaGl2b3MnLAoJJ05vbiBicmVha2FibGUgc3BhY2UnICAgICA6ICdFc3BhY2lvIGluZGl2aXNpYmxlJywKCSdTdG9wIGVsZW1lbnQgZmxvYXRpbmcnICAgOiAnRGV0ZW5lciBlbGVtZW50byBmbG90YW50ZScsCgkvLyBkaWFsb2dzCgknV2FybmluZycgOiAnQWR2ZXJ0ZW5jaWEnLAoJJ1Byb3BlcmllcycgOiAnUHJvcGllZGFkZXMnLAoJJ1BvcHVwJyA6ICdWZW50YW5hIGVtZXJnZW50ZScsCgknQWR2YW5jZWQnIDogJ0F2YW56YWRvJywKCSdFdmVudHMnIDogJ0V2ZW50b3MnLAoJJ1dpZHRoJyA6ICdBbmNobycsCgknSGVpZ2h0JyA6ICdBbHRvJywKCSdMZWZ0JyAgIDogJ0l6cXVpZXJkYScsCgknQ2VudGVyJyA6ICdDZW50cmFkbycsCgknUmlnaHQnICA6ICdEZXJlY2hhJywKCSdCb3JkZXInIDogJ0JvcmRlJywKCSdCYWNrZ3JvdW5kJyA6ICdGb25kbycsCgknQ3NzIGNsYXNzJyA6ICdDbGFzZSBDU1MnLAoJJ0NzcyBzdHlsZScgOiAnRXN0aWxvIENTUycsCgknTm8nIDogJ05vJywKCSdUaXRsZScgOiAnVMOtdHVsbycsCgknU2NyaXB0IGRpcmVjdGlvbicgOiAnRGlyZWNjacOzbiBkZWwgc2NyaXB0JywKCSdMYW5ndWFnZScgOiAnSWRpb21hJywKCSdDaGFyc2V0JyA6ICdDaGFyc2V0JywKCSdOb3Qgc2V0JyA6ICdObyBlc3RhYmxlY2lkbycsCgknTGVmdCB0byByaWdodCcgOiAnSXpxdWllcmRhIGEgZGVyZWNoYScsCgknUmlnaHQgdG8gbGVmdCcgOiAnRGVyZWNoYSBhIGl6cXVpZXJkYScsCgknSW4gdGhpcyB3aW5kb3cnIDogJ0VuIGVzdGEgdmVudGFuYSAoX3NlbGYpJywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJyA6ICdFbiBudWV2YSB2ZW50YW5hIChfYmxhbmspJywKCSdJbiBuZXcgcGFyZW50IHdpbmRvdyAoX3BhcmVudCknIDogJ0VuIG51ZXZhIHZlbnRhbmEgcGFkcmUgKF9wYXJlbnQpJywKCSdJbiB0b3AgZnJhbWUgKF90b3ApJyA6ICdFbiBtYXJjbyBzdXBlcmlvciAoX3RvcCknLAoJJ1VSTCcgOiAnVVJMJywKCSdPcGVuIGluJyA6ICdBYnJpciBlbicsCgkvLyBjb3B5CgknVGhpcyBvcGVyYXRpb24gaXMgZGlzYWJsZWQgaW4geW91ciBicm93c2VyIG9uIHNlY3VyaXR5IHJlYXNvbi4gVXNlIHNob3J0Y3V0IGluc3RlYWQuJyA6ICdFc3RhIG9wZXJhY2nDs24gZXN0w6EgZGVzYWN0aXZhZGEgZW4gc3UgbmF2ZWdhZG9yIHBvciByYXpvbmVzIGRlIHNlZ3VyaWRhZC4gVXRpbGljZSBlbiBzdSBsdWdhciB1biBjb21hbmRvIGRlIHRlY2xhZG8uJywKCS8vIGZvcm1hdCAKCSdIZWFkaW5nIDEnIDogJ0VuY2FiZXphZG8gMScsCgknSGVhZGluZyAyJyA6ICdFbmNhYmV6YWRvIDInLAoJJ0hlYWRpbmcgMycgOiAnRW5jYWJlemFkbyAzJywKCSdIZWFkaW5nIDQnIDogJ0VuY2FiZXphZG8gNCcsCgknSGVhZGluZyA1JyA6ICdFbmNhYmV6YWRvIDUnLAoJJ0hlYWRpbmcgNicgOiAnRW5jYWJlemFkbyA2JywKCSdQYXJhZ3JhcGgnIDogJ1DDoXJyYWZvJywKCSdBZGRyZXNzJyA6ICdEaXJlY2Npw7NuJywKCSdQcmVmb3JtYXR0ZWQnIDogJ1ByZWZvcm1hdGVhZG8nLAoJLy8gZm9udCBzaXplCgknU21hbGwgKDhwdCknICAgOiAnUGVxdWXDsW8gKDhwdCknLAoJJ1NtYWxsICgxMHB4KScgIDogJ1BlcXVlw7FvICgxMHB4KScsCgknU21hbGwgKDEycHQpJyAgOiAnUGVxdWXDsW8gKDEycHQpJywKCSdOb3JtYWwgKDE0cHQpJyA6ICdOb3JtYWwgKDE0cHQpJywKCSdMYXJnZSAoMThwdCknICA6ICdHcmFuZGUgKDE4cHQpJywKCSdMYXJnZSAoMjRwdCknICA6ICdHcmFuZGUgKDI0cHQpJywKCSdMYXJnZSAoMzZwdCknICA6ICdHcmFuZGUgKDM2cHQpJywKCS8vIGJvb2ttYXJrCgknQm9va21hcmsgbmFtZScgOiAnTm9tYnJlIGRlbCBtYXJjYWRvcicsCgkvLyBsaW5rCgknTGluayBVUkwnIDogJ1VSTCBkZWwgdsOtbmN1bG8nLAoJJ1RhcmdldCcgOiAnT2JqZXRpdm8nLAoJJ09wZW4gbGluayBpbiBwb3B1cCB3aW5kb3cnIDogJ0FicmlyIHbDrW5jdWxvIGVuIHZlbnRhbmEgZW1lcmdlbnRlJywKCSdXaW5kb3cgbmFtZScgOiAnTm9tYnJlIGRlIGxhIHZlbnRhbmEnLAoJJ1dpbmRvdyBzaXplJyA6ICdUYW1hw7FvIGRlIGxhIHZlbnRhbmEnLAoJJ1dpbmRvdyBwb3NpdGlvbicgOiAnUG9zaWNpw7NuIGRlIGxhIHZlbnRhbmEnLAoJJ0xvY2F0aW9uIGJhcicgOiAnQmFycmEgZGUgZGlyZWNjacOzbicsCgknTWVudSBiYXInIDogJ0JhcnJhIGRlIE1lbsO6JywKCSdUb29sYmFyJyA6ICdCYXJyYSBkZSBoZXJyYW1pZW50YXMnLAoJJ1Njcm9sbGJhcnMnIDogJ0JhcnJhcyBkZSBkZXNwbGF6YW1pZW50bycsCgknU3RhdHVzIGJhcicgOiAnQmFycmEgZGUgZXN0YWRvJywKCSdSZXNpemFibGUnIDogJ1JlZGltZW5zaW9uYWJsZScsCgknRGVwZWRlbnQnIDogJ0RlcGVuZGllbnRlIChOZXRzY2FwZSknLAoJJ0FkZCByZXR1cm4gZmFsc2UnIDogJ0FncmVnYXIgKHJldHVybiBmYWxzZSknLAoJJ1RhcmdldCBNSU1FIHR5cGUnIDogJ09iamV0aXZvIGRlIFRpcG8gTUlNRScsCgknUmVsYXRpb25zaGlwIHBhZ2UgdG8gdGFyZ2V0IChyZWwpJyA6ICcnLAoJJ1JlbGF0aW9uc2hpcCB0YXJnZXQgdG8gcGFnZSAocmV2KScgOiAnJywKCSdUYWIgaW5kZXgnIDogJycsCgknQWNjZXNzIGtleScgOiAnVGVjbGEgZGUgYWNjZXNvJywKCS8vIGltYWdlCgknU2l6ZScgOiAnVGFtYcOxbycsCgknUHJldmlldycgOiAnUHJldmlzdWFsaXphY2nDs24nLAoJJ01hcmdpbnMnIDogJ03DoXJnZW5lcycsCgknQWx0IHRleHQnIDogJ1RleHRvIGFsdGVybmF0aXZvJywKCSdJbWFnZSBVUkwnIDogJ1VSTCBkZSBsYSBpbWFnZW4nLAoJLy8gdGFibGUKCSdTcGFjaW5nJyAgICAgICA6ICdFc3BhY2lhZG8gKFNwYWNpbmcpJywKCSdQYWRkaW5nJyAgICAgICA6ICdSZWxsZW5vIChQYWRkaW5nKScsCgknUm93cycgICAgICAgICAgOiAnRmlsYXMnLAoJJ0NvbHVtbnMnICAgICAgIDogJ0NvbHVtbmFzJywKCSdHcm91cHMnICAgICAgICA6ICdHcnVwb3MnLAoJJ0NlbGxzJyAgICAgICAgIDogJ0NlbGRhcycsCgknQ2FwdGlvbicgICAgICAgOiAnTGV5ZW5kYScsCgknSW5uZXIgYm9yZGVycycgOiAnQm9yZGVzIGludGVybm9zJwoJCgkKfQp9KShqUXVlcnkpOwo=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.fa.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFBlcnNpYW4gdHJhbnNsYXRpb24KICogQGF1dGhvciBTYWxlaCBzb296YW5jaGkgPGluZm9Ac29vemFuY2hpLmlyPgogKiBAdmVyc2lvbiAyMDEwLTA5LTE4CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuaTE4TWVzc2FnZXMuZmEgPSB7CgknRWRpdG9yJyA6ICfZiNuM2LHYp9iz2KrYp9ixJywKCSdTb3VyY2UnIDogJ9qp2K8g2YXZhtio2LknLAoJLy8gUGFuZWwgTmFtZQoJJ0NvcHkvUGFzZScgICAgICA6ICfaqdm+24wg2K/YsSDYrdin2YHYuNmHINmF2YjZgdiqL9io2KfYstqv2LHYr9in2YbbjCDYp9iyINit2KfZgdi42YcnLAoJJ1VuZG8vUmVkbycgICAgICA6ICfYp9mG2KzYp9mFINi52YXZhCDYqNi52K8v2KjYsdqv2LTYqiDYqNmHINi52YXZhCDZgtio2YQnLAoJJ1RleHQgc3R5bGVzJyAgICA6ICfYp9iz2KrYp9uM2YQg2YXYqtmGJywKCSdDb2xvcnMnICAgICAgICAgOiAn2LHZhtqv2YfYpycsCgknQWxpZ25tZW50JyAgICAgIDogJ9i12YHYrdmHINio2YbYr9uMJywKCSdJbmRlbnQvT3V0ZGVudCcgOiAn2KrZiCDYsdmB2Krar9uMLyDYqNix2YjZhiDYsdmB2Krar9uMJywKCSdUZXh0IGZvcm1hdCcgICAgOiAn2YLYp9mE2Kgg2YXYqtmI2YYnLAoJJ0xpc3RzJyAgICAgICAgICA6ICfZhNuM2LPYqiDZh9inJywKCSdNaXNjIGVsZW1lbnRzJyAgOiAn2LnZhtin2LXYsSDZhdiq2YHYsdmC2YcnLAoJJ0xpbmtzJyAgICAgICAgICA6ICfZvtuM2YjZhtiv2YfYpycsCgknSW1hZ2VzJyAgICAgICAgIDogJ9iq2LXYp9mI24zYsScsCgknTWVkaWEnICAgICAgICAgIDogJ9mF2YjZhNiq24wg2YXYr9uM2KcnLAoJJ1RhYmxlcycgICAgICAgICA6ICfYrNiv2YjZhCDZh9inJywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAnKGVsRmluZGVyKdmF2K/bjNix24zYqiDZgdin24zZhCcsCgkvLyBidXR0b24gbmFtZXMKCSdTYXZlJyAgICAgICAgICAgICAgICAgICAgOiAn2LDYrtuM2LHZhyDaqdix2K/ZhicsCgknQ29weScgICAgICAgICAgICAgICAgICAgIDogJ9qp2b7bjCDaqdix2K/ZhicsCgknQ3V0JyAgICAgICAgICAgICAgICAgICAgIDogJ9io2LHYtCDYr9in2K/ZhicsCgknUGFzdGUnICAgICAgICAgICAgICAgICAgIDogJ9io2KfYstqv2LHYr9in2YbbjCcsCgknUGFzdGUgb25seSB0ZXh0JyAgICAgICAgIDogJ9io2KfYstqv2LHYp9iv2YbbjCDZgdmC2Lcg2YXYqtmG2YfYpycsCgknUGFzdGUgZm9ybWF0dGVkIHRleHQnICAgIDogJ9io2KfYstqv2LHYr9in2YbbjCDZhdiq2YYg2YfYp9uMINiv2KfYsdin24wg2YLYp9mE2KgnLAoJJ0NsZWFuIGZvcm1hdCcgICAgICAgICAgICA6ICfYrdiw2YEg2YLYp9mE2Kgg2YfYpycsIAoJJ1VuZG8gbGFzdCBhY3Rpb24nICAgICAgICA6ICfYqNin2LLar9i02KrZhiDYqNmHINii2K7YsduM2YYg2K3Ysdqp2KonLAoJJ1JlZG8gcHJldmlvdXMgYWN0aW9uJyAgICA6ICfYqtqp2LHYp9ixINit2LHaqdiqINmC2KjZhNuMJywKCSdCb2xkJyAgICAgICAgICAgICAgICAgICAgOiAn2K/Ysdi02KonLAoJJ0l0YWxpYycgICAgICAgICAgICAgICAgICA6ICfYrtmI2KfYqNuM2K/ZhycsCgknVW5kZXJsaW5lJyAgICAgICAgICAgICAgIDogJ9iu2Lcg2LLbjNixINmF2KrZhicsCgknU3RyaWtldGhyb3VnaCcgICAgICAgICAgIDogJ9iu2Lcg2LHZiNuMINmF2KrZhicsCgknU3VwZXJzY3JpcHQnICAgICAgICAgICAgIDogJ9io2KfZhNin2YbZiNuM2LMnLAoJJ1N1YnNjcmlwdCcgICAgICAgICAgICAgICA6ICfYstuM2LHZhtmI24zYsycsCgknQWxpZ24gbGVmdCcgICAgICAgICAgICAgIDogJ9qG2b4g2obbjNmGJywKCSdBaWxnbiByaWdodCcgICAgICAgICAgICAgOiAn2LHYp9iz2Kog2obbjNmGJywKCSdBbGlnbiBjZW50ZXInICAgICAgICAgICAgOiAn2YjYs9i3INqG24zZhicsCgknQWxpZ24gZnVsbCcgICAgICAgICAgICAgIDogJ9io2Ycg2LXZiNix2Kog2qnYtNiv2Ycg2Ygg2qnYp9mF2YQnLAoJJ0ZvbnQgY29sb3InICAgICAgICAgICAgICA6ICfYsdmG2q8g2YLZhNmFINmH2KcnLAoJJ0JhY2tncm91bmQgY29sb3InICAgICAgICA6ICfYsdmG2q8g2LbZhduM2YbZhycsCgknSW5kZW50JyAgICAgICAgICAgICAgICAgIDogJ9iq2YjYsdmB2Krar9uMJywgCgknT3V0ZGVudCcgICAgICAgICAgICAgICAgIDogJ9io24zYsdmI2YYg2LHZgdiq2q/bjCcsIAoJJ0Zvcm1hdCcgICAgICAgICAgICAgICAgICA6ICfZgtin2YTYqCcsCgknRm9udCBzaXplJyAgICAgICAgICAgICAgIDogJ9in2YbYr9in2LLZhyDZgtmE2YUnLAoJJ0ZvbnQnICAgICAgICAgICAgICAgICAgICA6ICfZgtmE2YUnLAoJJ09yZGVyZWQgbGlzdCcgICAgICAgICAgICA6ICfZhdix2KrYqCDYs9in2LLbjCDZhNuM2LPYqicsCgknVW5vcmRlcmVkIGxpc3QnICAgICAgICAgIDogJ9io2Ycg2YfZhSDYsduM2K7YqtmGINmE24zYs9iqJywKCSdIb3Jpem9udGFsIHJ1bGUnICAgICAgICAgOiAn2K7YtyDYp9mB2YLbjCcsCgknQmxvY2txdW90ZScgICAgICAgICAgICAgIDogJ9mG2YLZhCDZgtmI2YQnLAoJJ0Jsb2NrIGVsZW1lbnQgKERJViknICAgICA6ICfYudmG2LEg2Ybar9mHINiv2KfYsdmG2K/ZhyAoRElWKScsCgknTGluaycgICAgICAgICAgICAgICAgICAgIDogJ9m+24zZiNmG2K8nLAoJJ0RlbGV0ZSBsaW5rJyAgICAgICAgICAgICA6ICfYrdiw2YEg2YTbjNmG2qknLAoJJ0Jvb2ttYXJrJyAgICAgICAgICAgICAgICA6ICfZhti02KfZhtmHINqv2LLYp9ix24wnLAoJJ0ltYWdlJyAgICAgICAgICAgICAgICAgICA6ICfYqti12YjbjNixJywKCSdUYWJsZScgICAgICAgICAgICAgICAgICAgOiAn2KzYr9mI2YQnLAoJJ0RlbGV0ZSB0YWJsZScgICAgICAgICAgICA6ICfYrdiw2YEg2KzYr9mI2YQnLAoJJ0luc2VydCByb3cgYmVmb3JlJyAgICAgICA6ICfYr9ix2Kwg2LPYt9ixINmC2KjZhCDYp9iyINin24zZhicsCgknSW5zZXJ0IHJvdyBhZnRlcicgICAgICAgIDogJ9iv2LHYrCDYs9i32LEg2KjYudivINin2LIg2KfbjNmGJywKCSdEZWxldGUgcm93JyAgICAgICAgICAgICAgOiAn2K3YsNmBINiz2LfYsScsCgknSW5zZXJ0IGNvbHVtbiBiZWZvcmUnICAgIDogJ9iv2LHYrCDYs9iq2YjZhiDZgtio2YQg2KfYsicsCgknSW5zZXJ0IGNvbHVtbiBhZnRlcicgICAgIDogJ9iv2LHYrCDYs9iq2YjZhiDYqNi52K8g2KfYsicsCgknRGVsZXRlIGNvbHVtbicgICAgICAgICAgIDogJ9it2LDZgSDYs9iq2YjZhicsCgknTWVyZ2UgdGFibGUgY2VsbHMnICAgICAgIDogJ9in2K/Yutin2YUg2qnYsdiv2YYgINiu2KfZhtmHINmH2KfbjCDYrNiv2YjZhCcsCgknU3BsaXQgdGFibGUgY2VsbCcgICAgICAgIDogJ9iq2YLYs9uM2YUg2Ygg2YXYrNiy2Kcg2qnYsdiv2YYg2K7Yp9mG2Ycg2YfYp9uMINis2K/ZiNmEJywKCSdUb2dnbGUgZGlzcGxheSBkb2N1bWVudCBzdHJ1Y3R1cmUnIDogJ9iy2YbYrNuM2LEg2LTYr9mHINio2Ycg2LPYp9iu2KrYp9ixINiz2YbYryDYr9ixINit2KfZhCDZhtmF2KfbjNi0JywKCSdUYWJsZSBjZWxsIHByb3BlcnRpZXMnICAgOiAn2KrZhti424zZhdin2Kog2K7ZiNmG2Ycg2KzYr9mI2YQnLAoJJ1RhYmxlIHByb3BlcnRpZXMnICAgICAgICA6ICfYqtmG2LjbjNmF2KfYqiDYrNiv2YjZhCcsCgknVG9nZ2xlIGZ1bGwgc2NyZWVuIG1vZGUnIDogJ9mG2YXYp9uM2LQg2Ygg2b7ZiNi02KfZhtuM2K/ZhiDaqdmEINmG2YXYp9uM2LTar9ixJywKCSdPcGVuIGZpbGUgbWFuYWdlcicgICAgICAgOiAn2KjYp9iy2qnYsdiv2YYg2YXYr9uM2LHbjNiqINmB2KfbjNmEJywKCSdOb24gYnJlYWthYmxlIHNwYWNlJyAgICAgOiAn2YHYttin24wg2LrbjNixINmC2KfYqNmEINi02qnYs9iq2YYnLAoJJ1N0b3AgZWxlbWVudCBmbG9hdGluZycgICA6ICfZhdiq2YjZgtmBINiz2KfYrtiqINi52YbYsSDYtNmG2KfZiNixJywKCS8vIGRpYWxvZ3MKCSdXYXJuaW5nJyA6ICfYp9iu2LfYp9ixJywKCSdQcm9wZXJpZXMnIDogJ9iu2LXZiNi124zYp9iqJywKCSdQb3B1cCcgOiAn2b7Zhtis2LEg2KjYp9iy2LTZiCcsCgknQWR2YW5jZWQnIDogJ9m+24zYtNix2YHYqtmHJywKCSdFdmVudHMnIDogJ9ix2YjbjNiv2KfYrycsCgknV2lkdGgnIDogJ9i32YjZhCcsCgknSGVpZ2h0JyA6ICfYudix2LYnLAoJJ0xlZnQnICAgOiAn2obZvicsCgknQ2VudGVyJyA6ICfZiNiz2LcnLAoJJ1JpZ2h0JyAgOiAn2LHYp9iz2KonLAoJJ0JvcmRlcicgOiAn2qnYp9iv2LEg2K3Yp9uM2YcnLAoJJ0JhY2tncm91bmQnIDogJ9m+2LTYqiDYtdit2YbZhy/YttmF24zZhtmHJywKCSdDc3MgY2xhc3MnIDogJ9qp2YTYp9izINiz24wg2KfYsyDYp9izJywKCSdDc3Mgc3R5bGUnIDogJ9in2LPYqtin24zZhCDYs9uMINin2LMg2KfYsycsCgknTm8nIDogJ9iu24zYsScsCgknVGl0bGUnIDogJ9i52YbZiNin2YYnLAoJJ1NjcmlwdCBkaXJlY3Rpb24nIDogJ9in2LPaqdix24zZvtiqINmH2YUg2LPZiCcsCgknTGFuZ3VhZ2UnIDogJ9ix2KjYp9mGJywKCSdDaGFyc2V0JyA6ICfaqdiv2b7bjNisINiy24zYp9mGJywKCSdOb3Qgc2V0JyA6ICfYp9i52YXYp9mEINmG2LTYrycsCgknTGVmdCB0byByaWdodCcgOiAn2obZviDYqNmHINix2KfYs9iqJywKCSdSaWdodCB0byBsZWZ0JyA6ICfYsdin2LPYqiDYqNmHINqG2b4nLAoJJ0luIHRoaXMgd2luZG93JyA6ICcoX3NlbGYpINmG2YXYp9uM2LQg2K/YsSDZh9mF24zZhiDZvtmG2KzYsdmHJywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJyA6ICcoX2JsYW5rKSDZhtmF2KfbjNi0INiv2LEg2b7Zhtis2LHZhyDYrNiv24zYryAnLAoJJ0luIG5ldyBwYXJlbnQgd2luZG93IChfcGFyZW50KScgOiAnKF9wYXJlbnQpINmG2YXYp9uM2LQg2K/YsSDZvtmG2KzYsdmHINin2LXZhNuMJywKCSdJbiB0b3AgZnJhbWUgKF90b3ApJyA6ICcoX3RvcCkg2YbZhdin24zYtCDYr9ixINio2KfZhNin24wg2YLYp9ioJywKCSdVUkwnIDogJycsCgknT3BlbiBpbicgOiAn2KjYp9iyINqp2LHYr9mGINiv2LEnLAoJLy8gY29weQoJJ1RoaXMgb3BlcmF0aW9uIGlzIGRpc2FibGVkIGluIHlvdXIgYnJvd3NlciBvbiBzZWN1cml0eSByZWFzb24uIFVzZSBzaG9ydGN1dCBpbnN0ZWFkLicgOiAn2KfbjNmGINi52YXZhNuM2KfYqiDYqNmHINiv2YTYp9uM2YQg2KfZhdmG24zYqtuMINiv2LEg2YXYsdmI2LHar9ixINmI2Kgg2LTZhdinINmF2LPYr9mI2K8g2LTYr9mHINiMINmE2LfZgdinINin2LIg2YXbjNin2YbYqNixINmH2Kcg2KfYs9iq2YHYp9iv2Ycg2qnZhtuM2K8uJywKCS8vIGZvcm1hdCAKCSdIZWFkaW5nIDEnIDogJ9iz2LEg2YHYtdmEIDEnLAoJJ0hlYWRpbmcgMicgOiAn2LPYsSDZgdi12YQgMicsCgknSGVhZGluZyAzJyA6ICfYs9ixINmB2LXZhCAzJywKCSdIZWFkaW5nIDQnIDogJ9iz2LEg2YHYtdmEIDQnLAoJJ0hlYWRpbmcgNScgOiAn2LPYsSDZgdi12YQgNScsCgknSGVhZGluZyA2JyA6ICfYs9ixINmB2LXZhCA2JywJCgknUGFyYWdyYXBoJyA6ICfZvtix2Kfar9ix2KfZgScsCgknQWRkcmVzcycgOiAn2KLYr9ix2LMnLAoJJ1ByZWZvcm1hdHRlZCcgOiAn2YLYp9mE2Kgg2KjZhtiv24wg2LTYr9mHJywKCS8vIGZvbnQgc2l6ZQoJJ1NtYWxsICg4cHQpJyAgIDogJycsCgknU21hbGwgKDEwcHgpJyAgOiAnJywKCSdTbWFsbCAoMTJwdCknICA6ICcnLAoJJ05vcm1hbCAoMTRwdCknIDogJycsCgknTGFyZ2UgKDE4cHQpJyAgOiAnJywKCSdMYXJnZSAoMjRwdCknICA6ICcnLAoJJ0xhcmdlICgzNnB0KScgIDogJycsCQkJCQoJLy8gYm9va21hcmsKCSdCb29rbWFyayBuYW1lJyA6ICfZhtin2YUg2YbYtNin2YbZhycsCgkvLyBsaW5rCgknTGluayBVUkwnIDogJyhVUkwpINm+24zZiNmG2K8nLAoJJ1RhcmdldCcgOiAn2YXZgti12K8nLAoJJ09wZW4gbGluayBpbiBwb3B1cCB3aW5kb3cnIDogJ9io2KfYsiDaqdix2K/ZhiDZvtuM2YjZhtivINiv2LEg24zaqSDZvtmG2KzYsdmHINio2KfYsti02YgnLAoJJ1VSTCcgOiAnJywKCSdXaW5kb3cgbmFtZScgOiAn2YbYp9mFINm+2YbYrNix2YcnLAoJJ1dpbmRvdyBzaXplJyA6ICfYs9in24zYsiDZvtmG2KzYsdmHJywKCSdXaW5kb3cgcG9zaXRpb24nIDogJ9mF2YjZgti524zYqiDZvtmG2KzYsdmHJywKCSdMb2NhdGlvbiBiYXInIDogJ9mF2K3ZhCDZhtqv2Ycg2K/Yp9ix2YbYr9mHJywKCSdNZW51IGJhcicgOiAn2Ybar9mHINiv2KfYsdmG2K/ZhyDZhdmG2YgnLAoJJ1Rvb2xiYXInIDogJ9is2LnYqNmHINin2KjYstin2LEnLAoJJ1Njcm9sbGJhcnMnIDogJ9mF2K3ZhCDYp9iz2qnYsdmI2YQnLAoJJ1N0YXR1cyBiYXInIDogJ9mF2K3ZhCDZiNi22LnbjNiqJywKCSdSZXNpemFibGUnIDogJ9iq2LrbjNuM2LEg2LPYp9iyINm+2LDbjNixINio2YjYr9mGJywKCSdEZXBlZGVudCcgOiAn2YXYrdiq2KfYrCcsCgknQWRkIHJldHVybiBmYWxzZScgOiAnKHJldHVybiBmYWxzZSkg2KfZgdiy2YjYr9mGJywKCSdUYXJnZXQgTUlNRSB0eXBlJyA6ICdNSU1FIHR5cGUnLAoJJ1JlbGF0aW9uc2hpcCBwYWdlIHRvIHRhcmdldCAocmVsKScgOiAnJywKCSdSZWxhdGlvbnNoaXAgdGFyZ2V0IHRvIHBhZ2UgKHJldiknIDogJycsCgknVGFiIGluZGV4JyA6ICcnLAoJJ0FjY2VzcyBrZXknIDogJ9qp24zZhNuM2K8g2K/Ys9iq2LHYs9uMJywKCS8vIGltYWdlCgknU2l6ZScgOiAn2LPYp9uM2LInLAoJJ1ByZXZpZXcnIDogJ9m+24zYtCDZhtmF2KfbjNi0JywKCSdNYXJnaW5zJyA6ICfYrdin2LTbjNmHINmH2KcnLAoJJ0FsdCB0ZXh0JyA6ICdBbHQnLAoJJ0ltYWdlIFVSTCcgOiAnVVJMJywKCS8vIHRhYmxlCgknU3BhY2luZycgICAgICAgOiAnKHNwYWNpbmcp2YHYp9i12Ycg2YfYp9uMINmF24zYp9mG24wnLAoJJ1BhZGRpbmcnICAgICAgIDogJyhwYWRkaW5nKSDYrdin2LTbjNmHINmH2Kcg2K/YsdmI2YbbjCcsCgknUm93cycgICAgICAgICAgOiAn2LPYt9ix2YfYpycsCgknQ29sdW1ucycgICAgICAgOiAn2LPYqtmI2YYg2YfYpycsCgknR3JvdXBzJyAgICAgICAgOiAn2q/YsdmI2Ycg2YfYp9izJywKCSdDZWxscycgICAgICAgICA6ICfYrtin2YbZhyDZh9in2LMnLAoJJ0NhcHRpb24nICAgICAgIDogJ9i52YbZiNin2YYnLAoJJ0lubmVyIGJvcmRlcnMnIDogJ9qp2KfYr9ixINiv2LHZiNmG24wnCgkKCQp9Cn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.fr.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEZyZW5jaCB0cmFuc2xhdGlvbgogKiBAYXV0aG9yIEZyYW5jb2lzIE1hemVyb2xsZSA8Zm1hejAwOEBnbWFpbC5jb20+CiAqIEB2ZXJzaW9uIDIwMTAtMDktMTgKICovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS5pMThNZXNzYWdlcy5mciA9IHsKCSdFZGl0b3InIDogJ0VkaXRldXInLAoJJ1NvdXJjZScgOiAnQ29kZSBTb3VyY2UnLAoJLy8gUGFuZWwgTmFtZQoJJ0NvcHkvUGFzZScgICAgICA6ICdDb3BpZXIvQ29sbGVyJywKCSdVbmRvL1JlZG8nICAgICAgOiAnQW5udWxlci9Sw6lww6l0ZXInLAoJJ1RleHQgc3R5bGVzJyAgICA6ICdTdHlsZXMgZGUgdGV4dGUnLAoJJ0NvbG9ycycgICAgICAgICA6ICdDb3VsZXVycycsCgknQWxpZ25tZW50JyAgICAgIDogJ0FsaWduZW1lbnQnLAoJJ0luZGVudC9PdXRkZW50JyA6ICdBdWdtZW50ZXIvRGltaW51ZXIgbFwnaW5jcsOpbWVudCcsCgknVGV4dCBmb3JtYXQnICAgIDogJ0Zvcm1hdCBkZSB0ZXh0ZScsCgknTGlzdHMnICAgICAgICAgIDogJ0xpc3RlcycsCgknTWlzYyBlbGVtZW50cycgIDogJ8OJbMOpbWVudHMgZGl2ZXJzJywKCSdMaW5rcycgICAgICAgICAgOiAnTGllbnMnLAoJJ0ltYWdlcycgICAgICAgICA6ICdJbWFnZXMnLAoJJ01lZGlhJyAgICAgICAgICA6ICdNdWx0aW3DqWRpYScsCgknVGFibGVzJyAgICAgICAgIDogJ1RhYmxlYXV4JywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAnR2VzdGlvbm5haXJlIGRlIGZpY2hpZXJzJywKCS8vIGJ1dHRvbiBuYW1lcwoJJ1NhdmUnICAgICAgICAgICAgICAgICAgICA6ICdFbnJlZ2lzdHJlcicsCgknQ29weScgICAgICAgICAgICAgICAgICAgIDogJ0NvcGllcicsCgknQ3V0JyAgICAgICAgICAgICAgICAgICAgIDogJ0NvdXBlcicsCgknUGFzdGUnICAgICAgICAgICAgICAgICAgIDogJ0NvbGxlcicsCgknUGFzdGUgb25seSB0ZXh0JyAgICAgICAgIDogJ0NvbGxlciBzZXVsZW1lbnQgbGUgdGV4dGUnLAoJJ1Bhc3RlIGZvcm1hdHRlZCB0ZXh0JyAgICA6ICdDb2xsZXIgbGUgdGV4dGUgZm9ybWF0w6knLAoJJ0NsZWFuIGZvcm1hdCcgICAgICAgICAgICA6ICdFZmZhY2VyIGxlIGZvcm1hdGFnZScsCgknVW5kbyBsYXN0IGFjdGlvbicgICAgICAgIDogJ0FubnVsZXIgbGEgZGVybmnDqHJlIGFjdGlvbicsCgknUmVkbyBwcmV2aW91cyBhY3Rpb24nICAgIDogJ1LDqXDDqXRlciBsYSBkZXJuacOocmUgYWN0aW9uJywKCSdCb2xkJyAgICAgICAgICAgICAgICAgICAgOiAnR3JhcycsCgknSXRhbGljJyAgICAgICAgICAgICAgICAgIDogJ0l0YWxpcXVlJywKCSdVbmRlcmxpbmUnICAgICAgICAgICAgICAgOiAnU291bGlnbmVyJywKCSdTdHJpa2V0aHJvdWdoJyAgICAgICAgICAgOiAnQmFycsOpJywKCSdTdXBlcnNjcmlwdCcgICAgICAgICAgICAgOiAnRXhwb3NhbnQnLAoJJ1N1YnNjcmlwdCcgICAgICAgICAgICAgICA6ICdJbmRpY2UnLAoJJ0FsaWduIGxlZnQnICAgICAgICAgICAgICA6ICdBbGlnbmVyIMOgIGdhdWNoZScsCgknQWlsZ24gcmlnaHQnICAgICAgICAgICAgIDogJ0FsaWduZXIgw6AgZHJvaXRlJywKCSdBbGlnbiBjZW50ZXInICAgICAgICAgICAgOiAnQ2VudHJlcicsCgknQWxpZ24gZnVsbCcgICAgICAgICAgICAgIDogJ0p1c3RpZmllcicsCgknRm9udCBjb2xvcicgICAgICAgICAgICAgIDogJ0NvdWxldXIgZGUgdGV4dGUnLAoJJ0JhY2tncm91bmQgY29sb3InICAgICAgICA6ICdDb3VsZXVyIGRcJ2FycmnDqHJlIHBsYW4nLAoJJ0luZGVudCcgICAgICAgICAgICAgICAgICA6ICdBdW1lbnRlciBsYSBtYXJnZScsCgknT3V0ZGVudCcgICAgICAgICAgICAgICAgIDogJ1LDqWR1aXJlIGxhIG1hcmdlJywKCSdGb3JtYXQnICAgICAgICAgICAgICAgICAgOiAnRm9ybWF0ZXInLAoJJ0ZvbnQgc2l6ZScgICAgICAgICAgICAgICA6ICdUYWlsbGUgZGUgcG9saWNlJywKCSdGb250JyAgICAgICAgICAgICAgICAgICAgOiAnUG9saWNlJywKCSdPcmRlcmVkIGxpc3QnICAgICAgICAgICAgOiAnTGlzdGUgb3Jkb25uw6llJywKCSdVbm9yZGVyZWQgbGlzdCcgICAgICAgICAgOiAnTGlzdGUgZMOpc29yZG9ubsOpZScsCgknSG9yaXpvbnRhbCBydWxlJyAgICAgICAgIDogJ0xpZ25lIGhvcml6b250YWxlJywKCSdCbG9ja3F1b3RlJyAgICAgICAgICAgICAgOiAnQ2l0YXRpb24nLAoJJ0Jsb2NrIGVsZW1lbnQgKERJViknICAgICA6ICdCbG9jIMOpbMOpbWVudCAoRElWKScsCgknTGluaycgICAgICAgICAgICAgICAgICAgIDogJ0xpZW4nLAoJJ0RlbGV0ZSBsaW5rJyAgICAgICAgICAgICA6ICdTdXBwcmltZXIgbGUgbGllbicsCgknQm9va21hcmsnICAgICAgICAgICAgICAgIDogJ01hcnF1ZSBwYWdlJywKCSdJbWFnZScgICAgICAgICAgICAgICAgICAgOiAnSW1hZ2UnLAoJJ1RhYmxlJyAgICAgICAgICAgICAgICAgICA6ICdUYWJsZWF1JywKCSdEZWxldGUgdGFibGUnICAgICAgICAgICAgOiAnU3VwcHJpbWVyIHRhYmxlYXUnLAoJJ0luc2VydCByb3cgYmVmb3JlJyAgICAgICA6ICdJbnPDqXJlciB1bmUgbGlnbmUgYXZhbnQnLAoJJ0luc2VydCByb3cgYWZ0ZXInICAgICAgICA6ICdJbnPDqXJlciB1bmUgbGlnbmUgYXByw6hzJywKCSdEZWxldGUgcm93JyAgICAgICAgICAgICAgOiAnU3VwcHJpbWVyIHVuZSBsaWduZScsCgknSW5zZXJ0IGNvbHVtbiBiZWZvcmUnICAgIDogJ0luc8OpcmVyIHVuZSBjb2xvbmUgYXZhbnQnLAoJJ0luc2VydCBjb2x1bW4gYWZ0ZXInICAgICA6ICdJbnPDqXJlciB1bmUgY29sb25lIGFwcsOocycsCgknRGVsZXRlIGNvbHVtbicgICAgICAgICAgIDogJ1N1cHByaW1lciB1bmUgY29sb25lJywKCSdNZXJnZSB0YWJsZSBjZWxscycgICAgICAgOiAnRnVzaW9ubmVyIGxlcyBjZWxsdWxlcycsCgknU3BsaXQgdGFibGUgY2VsbCcgICAgICAgIDogJ0RpdmlzZXIgbGEgY2VsbHVsZScsCgknVG9nZ2xlIGRpc3BsYXkgZG9jdW1lbnQgc3RydWN0dXJlJyA6ICdBbHRlcm5lciBsYSB2dWUgZHUgZG9jdW1lbnQnLAoJJ1RhYmxlIGNlbGwgcHJvcGVydGllcycgICA6ICdQcm9wcmnDqXTDqSBkZSBsYSBjZWxsdWxlJywKCSdUYWJsZSBwcm9wZXJ0aWVzJyAgICAgICAgOiAnUHJvcHJpw6l0w6kgZHUgdGFibGVhdScsCgknVG9nZ2xlIGZ1bGwgc2NyZWVuIG1vZGUnIDogJ0FsdGVybmVyIGxhIHZ1ZSBwbGVpbiDDqWNyYW4nLAoJJ09wZW4gZmlsZSBtYW5hZ2VyJyAgICAgICA6ICdPdXZyaXIgbGUgZ2VzdGlvbm5haXJlIGRlIGZpY2hpZXJzJywKCSdOb24gYnJlYWthYmxlIHNwYWNlJyAgICAgOiAnRXNwYWNlIGluc8OpY2FibGUnLAoJJ1N0b3AgZWxlbWVudCBmbG9hdGluZycgICA6ICdJbnRlcnJvbXByZSBsZSBmbG90dGVtZW50IGRlIGxcJ8OpbMOpbWVudCcsCgkvLyBkaWFsb2dzCgknV2FybmluZycgOiAnQXR0ZW50aW9uJywKCSdQcm9wZXJpZXMnIDogJ1Byb3ByacOpdMOpJywKCSdQb3B1cCcgOiAnTm91dmVsbGUgZmVuw6p0cmUnLAoJJ0FkdmFuY2VkJyA6ICdBdmFuY8OpJywKCSdFdmVudHMnIDogJ8OJdsOobmVtZW50cycsCgknV2lkdGgnIDogJ0xhcmdldXInLAoJJ0hlaWdodCcgOiAnSGF1dGV1cicsCgknTGVmdCcgICA6ICdHYXVjaGUnLAoJJ0NlbnRlcicgOiAnQ2VudHJlJywKCSdSaWdodCcgIDogJ0Ryb2l0ZScsCgknQm9yZGVyJyA6ICdCb3JkdXJlJywKCSdCYWNrZ3JvdW5kJyA6ICdBcnJpw6hyZSBwbGFuJywKCSdDc3MgY2xhc3MnIDogJ0NsYXNzZSBDU1MnLAoJJ0NzcyBzdHlsZScgOiAnU3R5bGUgQ1NTJywKCSdObycgOiAnTm9uJywKCSdUaXRsZScgOiAnVGl0cmUnLAoJJ1NjcmlwdCBkaXJlY3Rpb24nIDogJ0RpcmVjdGlvbiBkZSBzY3JpcHQnLAoJJ0xhbmd1YWdlJyA6ICdMYW5ndWUnLAoJJ0NoYXJzZXQnIDogJ0pldSBkZSBjYXJhY3TDqHJlcycsCgknTm90IHNldCcgOiAnTm8gc2V0JywKCSdMZWZ0IHRvIHJpZ2h0JyA6ICdHYXVjaGUgw6AgZHJvaXRlJywKCSdSaWdodCB0byBsZWZ0JyA6ICdEcm9pdGUgw6AgZ2F1Y2hlJywKCSdJbiB0aGlzIHdpbmRvdycgOiAnRGFucyBjZXR0ZSBmZW7DqnRyZSAoX3NlbGYpJywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJyA6ICdEYW5zIHVuZSBub3V2ZWxsZSBmZW7DqnRyZSAoX2JsYW5rKScsCgknSW4gbmV3IHBhcmVudCB3aW5kb3cgKF9wYXJlbnQpJyA6ICdEYW5zIHVuZSBub3V2ZWxsZSBmZW7DqnRyZSBwYXJlbnRlIChfcGFyZW50KScsCgknSW4gdG9wIGZyYW1lIChfdG9wKScgOiAnRGFucyBsZSBjYWRyZSBtYWl0cmUgKF90b3ApJywKCSdVUkwnIDogJ1VSTCcsCgknT3BlbiBpbicgOiAnT3V2cmlyIGRhbnMnLAoJLy8gY29weQoJJ1RoaXMgb3BlcmF0aW9uIGlzIGRpc2FibGVkIGluIHlvdXIgYnJvd3NlciBvbiBzZWN1cml0eSByZWFzb24uIFVzZSBzaG9ydGN1dCBpbnN0ZWFkLicgOiAnQ2V0dGUgb3DDqXJhdGlvbiBlc3QgZMOpc2FjdGl2w6llIGRhbnMgdm90cmUgbmF2aWdhdGV1ciBwb3VyIGRlcyByYWlzb25zIGRlIHPDqWN1cml0w6kuIFV0aWxpc2V6IGxlIHJhY2NvdXJjaS4nLAoJLy8gZm9ybWF0IAoJJ0hlYWRpbmcgMScgOiAnRW50w6p0ZSAxJywKCSdIZWFkaW5nIDInIDogJ0VudMOqdGUgMicsCgknSGVhZGluZyAzJyA6ICdFbnTDqnRlIDMnLAoJJ0hlYWRpbmcgNCcgOiAnRW50w6p0ZSA0JywKCSdIZWFkaW5nIDUnIDogJ0VudMOqdGUgNScsCgknSGVhZGluZyA2JyA6ICdFbnTDqnRlIDYnLAoJJ1BhcmFncmFwaCcgOiAnUGFyYWdyYXBoZScsCgknQWRkcmVzcycgOiAnQWRyZXNzZScsCgknUHJlZm9ybWF0dGVkJyA6ICdQcsOpZm9ybWF0w6knLAoJLy8gZm9udCBzaXplCgknU21hbGwgKDhwdCknICAgOiAnUGV0aXRlICg4cHQpJywKCSdTbWFsbCAoMTBweCknICA6ICdQZXRpdGUgKDEwcHgpJywKCSdTbWFsbCAoMTJwdCknICA6ICdQZXRpdGUgKDEycHQpJywKCSdOb3JtYWwgKDE0cHQpJyA6ICdOb3JtYWxlICgxNHB0KScsCgknTGFyZ2UgKDE4cHQpJyAgOiAnR3JhbmRlICgxOHB0KScsCgknTGFyZ2UgKDI0cHQpJyAgOiAnR3JhbmRlICgyNHB0KScsCgknTGFyZ2UgKDM2cHQpJyAgOiAnR3JhbmRlICgzNnB0KScsCgkvLyBib29rbWFyawoJJ0Jvb2ttYXJrIG5hbWUnIDogJ05vbSBkdSBmYXZvcmknLAoJLy8gbGluawoJJ0xpbmsgVVJMJyA6ICdBZHJlc3NlIGR1IGxpZW4nLAoJJ1RhcmdldCcgOiAnQ2libGUnLAoJJ09wZW4gbGluayBpbiBwb3B1cCB3aW5kb3cnIDogJ091dnJpciBkYW5zIHVuZSBub3V2ZWxsZSBmZW7DqnRyZScsCgknV2luZG93IG5hbWUnIDogJ05vbSBkZSBsYSBmZW7DqnRyZScsCgknV2luZG93IHNpemUnIDogJ1RhaWxsZSBkZSBsYSBmZW7DqnRyZScsCgknV2luZG93IHBvc2l0aW9uJyA6ICdQb3NpdGlvbiBkZSBsYSBmZW7DqnRyZScsCgknTG9jYXRpb24gYmFyJyA6ICdCYXJyZSBkXCdhZHJlc3NlJywKCSdNZW51IGJhcicgOiAnQmFycmUgZGUgbWVudScsCgknVG9vbGJhcicgOiAnQmFycmUgZFwnb3V0aWxzJywKCSdTY3JvbGxiYXJzJyA6ICdCYXJyZXMgZGUgZMOpZmlsbGVtZW50JywKCSdTdGF0dXMgYmFyJyA6ICdCYXJyZSBkXCfDqXRhdCcsCgknUmVzaXphYmxlJyA6ICdSZWRpbWVuc2lvbmFibGUnLAoJJ0RlcGVkZW50JyA6ICdEw6lwZW5kZW50IChOZXRzY2FwZSknLAoJJ0FkZCByZXR1cm4gZmFsc2UnIDogJ0Fqb3V0ZXIgdW4gcmV0b3VyIG7DqWdhdGlmIChyZXR1cm4gZmFsc2UpJywKCSdUYXJnZXQgTUlNRSB0eXBlJyA6ICdUeXBlIE1JTUUgY2libGUnLAoJJ1JlbGF0aW9uc2hpcCBwYWdlIHRvIHRhcmdldCAocmVsKScgOiAnJywKCSdSZWxhdGlvbnNoaXAgdGFyZ2V0IHRvIHBhZ2UgKHJldiknIDogJycsCgknVGFiIGluZGV4JyA6ICdJbmRleCBkZSB0YWJ1bGF0aW9uJywKCSdBY2Nlc3Mga2V5JyA6ICdUZWNsYSBkZSBhY2Nlc28nLAoJLy8gaW1hZ2UKCSdTaXplJyA6ICdUYWlsbGUnLAoJJ1ByZXZpZXcnIDogJ1Byw6l2aXN1YWxpc2F0aW9uJywKCSdNYXJnaW5zJyA6ICdNYXJnZXMnLAoJJ0FsdCB0ZXh0JyA6ICdUZXh0ZSBBTFQnLAoJJ0ltYWdlIFVSTCcgOiAnVVJMIGRlIGxcJ2ltYWdlJywKCS8vIHRhYmxlCgknU3BhY2luZycgICAgICAgOiAnRXNwYWNlIChTcGFjaW5nKScsCgknUGFkZGluZycgICAgICAgOiAnTWFyZ2UgaW50w6lyaWV1cmUgKFBhZGRpbmcpJywKCSdSb3dzJyAgICAgICAgICA6ICdMaWduZXMnLAoJJ0NvbHVtbnMnICAgICAgIDogJ0NvbG9uZXMnLAoJJ0dyb3VwcycgICAgICAgIDogJ0dyb3VwZXMnLAoJJ0NlbGxzJyAgICAgICAgIDogJ0NlbGx1bGVzJywKCSdDYXB0aW9uJyAgICAgICA6ICfDiXRpcXVldHRlJywKCSdJbm5lciBib3JkZXJzJyA6ICdCb3JkdXJlcyBpbnTDqXJpZXVyZXMnCgkKCQp9Cn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.hu.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEh1bmdhcmlhbiB0cmFuc2xhdGlvbgogKiBAYXV0aG9yIFZpa3RvciBUYW1hcyA8dGFtYXMudmlrdG9yQHRvdGFsc3R1ZGlvLmh1PgogKiBAdmVyc2lvbiAyMDEwLTA5LTE4CiAqLwogKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLmkxOE1lc3NhZ2VzLmh1ID0gewogICAgJ0VkaXRvcicgOiAnU3plcmtlc3p0xZEnLAogICAgJ1NvdXJjZScgOiAnRm9ycsOhcycsCiAgICAvLyDQvdCw0LfQstCw0L3QuNGPINC/0LDQvdC10LvQtdC5CiAgICAnQ29weS9QYXNlJyAgICAgIDogJ03DoXNvbMOhcy9CZWlsbGVzenTDqXMnLAogICAgJ1VuZG8vUmVkbycgICAgICA6ICdWaXNzemF2b27DoXMvSXNtw6l0JywKICAgICdUZXh0IHN0eWxlcycgICAgOiAnU3rDtnZlZyBzdMOtbHVzJywKICAgICdDb2xvcnMnICAgICAgICAgOiAnU3rDrW5laycsCiAgICAnQWxpZ25tZW50JyAgICAgIDogJ0VscmVuZGV6w6lzJywKICAgICdJbmRlbnQvT3V0ZGVudCcgOiAn0J7RgtGB0YLRg9C/0YsnLAogICAgJ1RleHQgZm9ybWF0JyAgICA6ICdTesO2dmVnIGZvcm1hJywKICAgICdMaXN0cycgICAgICAgICAgOiAnTGlzdMOhaycsCiAgICAnTWlzYyBlbGVtZW50cycgIDogJ0VnecOpYiBlbGVtZWsnLAogICAgJ0xpbmtzJyAgICAgICAgICA6ICdMaW5rZWsnLAogICAgJ0ltYWdlcycgICAgICAgICA6ICdLw6lwZWsnLAogICAgJ01lZGlhJyAgICAgICAgICA6ICdNw6lkaWEnLAogICAgJ1RhYmxlcycgICAgICAgICA6ICdUw6FibMOhemF0b2snLAogICAgJ0ZpbGUgbWFuYWdlciAoZWxGaW5kZXIpJyA6ICdGw6FqbCBrZXplbMWRIChlbEZpbmRlciknLAogICAgLy8g0L3QsNC30LLQsNC90LjRjyDQutC90L7Qv9C+0LoKICAgICdBYm91dCB0aGlzIHNvZnR3YXJlJyAgICAgOiAnQSBzem9mdHZlcnLFkWwnLAogICAgJ1NhdmUnICAgICAgICAgICAgICAgICAgICA6ICdNZW50w6lzJywKICAgICdDb3B5JyAgICAgICAgICAgICAgICAgICAgOiAnTcOhc29sw6FzJywKICAgICdDdXQnICAgICAgICAgICAgICAgICAgICAgOiAnS2l2w6Fnw6FzJywKICAgICdQYXN0ZScgICAgICAgICAgICAgICAgICAgOiAnQmVpbGxlc3p0w6lzJywKICAgICdQYXN0ZSBvbmx5IHRleHQnICAgICAgICAgOiAnQmVpbGxlc3p0w6lzIGNzYWsgc3rDtnZlZ2vDqW50JywKICAgICdQYXN0ZSBmb3JtYXR0ZWQgdGV4dCcgICAgOiAnQmVpbGxlc3p0w6lzIGZvcm3DoXpvdHQgc3rDtnZlZ2vDqW50JywKICAgICdDbGVhbiBmb3JtYXQnICAgICAgICAgICAgOiAnRm9ybcOhesOhcyB0w7ZybMOpc2UnLCAKICAgICdVbmRvIGxhc3QgYWN0aW9uJyAgICAgICAgOiAnVXRvbHPDsyBtxbF2ZWxldCB2aXNzemF2b27DoXNhJywKICAgICdSZWRvIHByZXZpb3VzIGFjdGlvbicgICAgOiAnRWzFkXrFkSBtxbF2ZWxldCDDumpyYScsCiAgICAnQm9sZCcgICAgICAgICAgICAgICAgICAgIDogJ0bDqWxrw7Z2w6lyJywKICAgICdJdGFsaWMnICAgICAgICAgICAgICAgICAgOiAnRMWRbHQnLAogICAgJ1VuZGVybGluZScgICAgICAgICAgICAgICA6ICdBbMOhaMO6em90dCcsCiAgICAnU3RyaWtldGhyb3VnaCcgICAgICAgICAgIDogJ8OBdGjDunpvdHQnLAogICAgJ1N1cGVyc2NyaXB0JyAgICAgICAgICAgICA6ICdGZWxzxZEgaW5kZXgnLAogICAgJ1N1YnNjcmlwdCcgICAgICAgICAgICAgICA6ICdBbHPDsyBpbmRleCcsCiAgICAnQWxpZ24gbGVmdCcgICAgICAgICAgICAgIDogJ0JhbHJhIGlnYXrDrXTDoXMnLAogICAgJ0FpbGduIHJpZ2h0JyAgICAgICAgICAgICA6ICdKb2JicmEgaWdhesOtdMOhcycsCiAgICAnQWxpZ24gY2VudGVyJyAgICAgICAgICAgIDogJ0vDtnrDqXByZSBpZ2F6w610w6FzJywKICAgICdBbGlnbiBmdWxsJyAgICAgICAgICAgICAgOiAnU8OzcmtpesOhcnQgaWdhesOtdMOhcycsCiAgICAnRm9udCBjb2xvcicgICAgICAgICAgICAgIDogJ0JldMWxc3rDrW4nLAogICAgJ0JhY2tncm91bmQgY29sb3InICAgICAgICA6ICdIw6F0dMOpciBzesOtbicsCiAgICAnSW5kZW50JyAgICAgICAgICAgICAgICAgIDogJ0JlaMO6esOhcycsCiAgICAnT3V0ZGVudCcgICAgICAgICAgICAgICAgIDogJ0tpaMO6esOhcycsCiAgICAnRm9ybWF0JyAgICAgICAgICAgICAgICAgIDogJ0Zvcm3DoXR1bScsCiAgICAnRm9udCBzaXplJyAgICAgICAgICAgICAgIDogJ0JldMWxIG3DqXJldCcsCiAgICAnRm9udCcgICAgICAgICAgICAgICAgICAgIDogJ0JldMWxIHTDrXB1cycsCiAgICAnT3JkZXJlZCBsaXN0JyAgICAgICAgICAgIDogJ1N6w6Ftb3pvdHQgbGlzdGEnLAogICAgJ1Vub3JkZXJlZCBsaXN0JyAgICAgICAgICA6ICdMaXN0YScsCiAgICAnSG9yaXpvbnRhbCBydWxlJyAgICAgICAgIDogJ1bDrXpzemludGVzIHZvbmFsJywKICAgICdCbG9ja3F1b3RlJyAgICAgICAgICAgICAgOiAnSWTDqXpldCcsCiAgICAnQmxvY2sgZWxlbWVudCAoRElWKScgICAgIDogJ0Jsb2trIGVsZW0gKERJViknLAogICAgJ0xpbmsnICAgICAgICAgICAgICAgICAgICA6ICdMaW5rJywKICAgICdEZWxldGUgbGluaycgICAgICAgICAgICAgOiAnTGluayB0w7ZybMOpc2UnLAogICAgJ0Jvb2ttYXJrJyAgICAgICAgICAgICAgICA6ICdIb3Jnb255JywKICAgICdJbWFnZScgICAgICAgICAgICAgICAgICAgOiAnS8OpcCcsCiAgICAnVGFibGUnICAgICAgICAgICAgICAgICAgIDogJ1TDoWJsw6F6YXQnLAogICAgJ0RlbGV0ZSB0YWJsZScgICAgICAgICAgICA6ICdUw6FibMOhemF0IHTDtnJsw6lzZScsCiAgICAnSW5zZXJ0IHJvdyBiZWZvcmUnICAgICAgIDogJ1NvciBiZXN6w7pyw6FzYSBzb3IgZWzDqScsCiAgICAnSW5zZXJ0IHJvdyBhZnRlcicgICAgICAgIDogJ1NvciBiZXN6w7pyw6FzYSBzb3IgbcO2Z8OpJywKICAgICdEZWxldGUgcm93JyAgICAgICAgICAgICAgOiAnU29yIHTDtnJsw6lzZScsCiAgICAnSW5zZXJ0IGNvbHVtbiBiZWZvcmUnICAgIDogJ09zemxvcCBiZXN6w7pyw6FzYSBvc3psb3AgZWzDqScsCiAgICAnSW5zZXJ0IGNvbHVtbiBhZnRlcicgICAgIDogJ09zemxvcCBiZXN6w7pyw6FzYSBvc3psb3AgbcO2Z8OpJywKICAgICdEZWxldGUgY29sdW1uJyAgICAgICAgICAgOiAnT3N6bG9wIHTDtnJsw6lzZScsCiAgICAnTWVyZ2UgdGFibGUgY2VsbHMnICAgICAgIDogJ0NlbGzDoWsgw7Zzc3pldm9uw6FzYScsCiAgICAnU3BsaXQgdGFibGUgY2VsbCcgICAgICAgIDogJ0NlbGzDoWsgc3rDqXTDoXZsYXN6dMOhc2EnLAogICAgJ1RvZ2dsZSBkaXNwbGF5IGRvY3VtZW50IHN0cnVjdHVyZScgOiAnRG9rdW1lbnR1bSBzemVya2V6ZXQgbWVndGVraW50w6lzZScsCiAgICAnVGFibGUgY2VsbCBwcm9wZXJ0aWVzJyAgIDogJ1TDoWJsw6F6YXQgY2VsbGEgdHVsYWpkb25zw6FnYWknLAogICAgJ1RhYmxlIHByb3BlcnRpZXMnICAgICAgICA6ICdUw6FibGEgdHVsYWpkb25zw6Fnb2snLAogICAgJ1RvZ2dsZSBmdWxsIHNjcmVlbiBtb2RlJyA6ICdUZWxqZXMga8OpcGVybnnFkXMgbcOzZCcsCiAgICAnT3BlbiBmaWxlIG1hbmFnZXInICAgICAgIDogJ0bDoWpsIGtlemVsxZEgbWVnbnlpdMOhc2EnLAogICAgJ05vbiBicmVha2FibGUgc3BhY2UnICAgICA6ICdTesOza8O2eicsCiAgICAnU3RvcCBlbGVtZW50IGZsb2F0aW5nJyAgIDogJ0VsZW0gZWxyZW5kZXrDqXNlayB0w7ZybMOpc2UnLAogICAgLy8gZGlhbG9ncwogICAgJ1dhcm5pbmcnIDogJ0ZpZ3llbG1lenRldMOpcycsCiAgICAnUHJvcGVyaWVzJyA6ICdUdWxhamRvbnPDoWdvaycsCiAgICAnUG9wdXAnIDogJ1BvcHVwJywKICAgICdBZHZhbmNlZCcgOiAnRWd5w6luaScsCiAgICAnRXZlbnRzJyA6ICdFc2Vtw6lueWVrJywKICAgICdXaWR0aCcgOiAnU3rDqWxlc3PDqWcnLAogICAgJ0hlaWdodCcgOiAnTWFnYXNzw6FnJywKICAgICdMZWZ0JyAgIDogJ0JhbCcsCiAgICAnQ2VudGVyJyA6ICdLw7Z6w6lwJywKICAgICdSaWdodCcgIDogJ0pvYmInLAogICAgJ0JvcmRlcicgOiAnS2VyZXQnLAogICAgJ0JhY2tncm91bmQnIDogJ0jDoXR0w6lyJywKICAgICdDc3MgY2xhc3MnIDogJ0NzcyBjbGFzcycsCiAgICAnQ3NzIHN0eWxlJyA6ICdDc3Mgc3TDrWx1cycsCiAgICAnTm8nIDogJ05lbScsCiAgICAnVGl0bGUnIDogJ0PDrW0nLAogICAgJ1NjcmlwdCBkaXJlY3Rpb24nIDogJ1NjcmlwdCBoaXZhdGtvesOhcycsCiAgICAnTGFuZ3VhZ2UnIDogJ055ZWx2JywKICAgICdDaGFyc2V0JyA6ICdLYXJha3RlcnTDoWJsYScsCiAgICAnTm90IHNldCcgOiAnTmluY3MgYmXDoWxsw610dmEnLAogICAgJ0xlZnQgdG8gcmlnaHQnIDogJ0JhbHLDs2wgam9iYnJhJywKICAgICdSaWdodCB0byBsZWZ0JyA6ICdKb2JicsOzbCBiYWxyYScsCiAgICAnSW4gdGhpcyB3aW5kb3cnIDogJ0ViYmUgYXogYWJsYWtiYScsCiAgICAnSW4gbmV3IHdpbmRvdyAoX2JsYW5rKScgOiAnw5pqIGFibGFrYmEgKF9ibGFuayknLAogICAgJ0luIG5ldyBwYXJlbnQgd2luZG93IChfcGFyZW50KScgOiAnRWd5IMO6aiBhYmxha2JhIChfcGFyZW50KScsCiAgICAnSW4gdG9wIGZyYW1lIChfdG9wKScgOiAnQSB0b3AgZnJhbWUtYmUgKF90b3ApJywKICAgICdVUkwnIDogJycsCiAgICAnT3BlbiBpbicgOiAnTWVnbnlpdMOhcycsCiAgICAnT3BlbiBmaWxlIG1hbmdlcicgOiAnRsOhamxrZXplbMWRIG1lZ255aXTDoXNhJywKICAgIC8vIGNvcHkKICAgICdUaGlzIG9wZXJhdGlvbiBpcyBkaXNhYmxlZCBpbiB5b3VyIGJyb3dzZXIgb24gc2VjdXJpdHkgcmVhc29uLiBVc2Ugc2hvcnRjdXQgaW5zdGVhZC4nIDogJ0V6IGEgbcWxdmVsZXQgbGUgdmFuIHRpbHR2YSBhIGLDtm5nw6lzesWRasOpYmVuIGEgYml6dG9uc8OhZ2kgb2tiw7NsLiBIYXN6bsOhbGphIGEgcGFyYW5jc2lrb250IGVoZWx5ZXR0LicsCiAgICAvLyBmb3JtYXQgCiAgICAnSGVhZGluZyAxJyA6ICdDw61tc29yIDEnLAogICAgJ0hlYWRpbmcgMicgOiAnQ8OtbXNvciAyJywKICAgICdIZWFkaW5nIDMnIDogJ0PDrW1zb3IgMycsCiAgICAnSGVhZGluZyA0JyA6ICdDw61tc29yIDQnLAogICAgJ0hlYWRpbmcgNScgOiAnQ8OtbXNvciA1JywKICAgICdIZWFkaW5nIDYnIDogJ0PDrW1zb3IgNicsICAgIAogICAgJ1BhcmFncmFwaCcgOiAnQmVrZXpkw6lzJywKICAgICdBZGRyZXNzJyA6ICdDw61tJywKICAgICdQcmVmb3JtYXR0ZWQnIDogJ0VsxZFyZSBmb3Jtw6F6b3R0JywKICAgIC8vIGZvbnQgc2l6ZQogICAgJ1NtYWxsICg4cHQpJyAgIDogJ0tpY3NpICg4cHQpJywKICAgICdTbWFsbCAoMTBweCknICA6ICdLaWNzaSAoMTBweCknLAogICAgJ1NtYWxsICgxMnB0KScgIDogJ0tpY3NpICgxMnB0KScsCiAgICAnTm9ybWFsICgxNHB0KScgOiAnTm9ybcOhbCAoMTRwdCknLAogICAgJ0xhcmdlICgxOHB0KScgIDogJ05hZ3kgKDE4cHQpJywKICAgICdMYXJnZSAoMjRwdCknICA6ICdOYWd5ICgyNHB0KScsCiAgICAnTGFyZ2UgKDM2cHQpJyAgOiAnTmFneSAoMzZwdCknLCAgICAgICAgICAgICAgICAKICAgIC8vIGJvb2ttYXJrCiAgICAnQm9va21hcmsgbmFtZScgOiAnSG9yZ29ueSBuZXZlJywKICAgIC8vIGxpbmsKICAgICdMaW5rIFVSTCcgOiAnTGluayBjw61tZSAoVVJMKScsCiAgICAnVGFyZ2V0JyA6ICdDw6lsJywKICAgICdTZWxlY3QgYm9va21hcmsnIDogJ0hvcmdvbnkgdsOhbGFzenTDoXNhJywKICAgICdPcGVuIGxpbmsgaW4gcG9wdXAgd2luZG93JyA6ICdIaXZhdGtvesOhcyBtZWdueWl0w6FzYSDDumogcG9wdXAgYWJsYWtiYW4nLAogICAgJ1VSTCcgOiAnJywKICAgICdXaW5kb3cgbmFtZScgOiAnQWJsYWsgbmV2ZScsCiAgICAnV2luZG93IHNpemUnIDogJ0FibGFrIG3DqXJldGUnLAogICAgJ1dpbmRvdyBwb3NpdGlvbicgOiAnQWJsYWsgcG96w61jacOzamEnLAogICAgJ0xvY2F0aW9uIGJhcicgOiAnQ8OtbXNvcicsCiAgICAnTWVudSBiYXInIDogJ01lbsO8c29yJywKICAgICdUb29sYmFyJyA6ICdFc3prw7Z6dMOhcicsCiAgICAnU2Nyb2xsYmFycycgOiAnR8O2cmfFkXPDoXYnLAogICAgJ1N0YXR1cyBiYXInIDogJ1N0w6F0dXN6IHNvcicsCiAgICAnUmVzaXphYmxlJyA6ICfDgXRtw6lyZXRlemhldMWRJywKICAgICdEZXBlZGVudCcgOiAnJywKICAgICdBZGQgcmV0dXJuIGZhbHNlJyA6ICdIb3p6w6FhZMOhcyAocmV0dXJuIGZhbHNlKScsCiAgICAnVGFyZ2V0IE1JTUUgdHlwZScgOiAnTUlNRSB0w61wdXPDuiBjw6lsJywKICAgICdSZWxhdGlvbnNoaXAgcGFnZSB0byB0YXJnZXQgKHJlbCknIDogJ0PDqWxob3oga2FwY3NvbMOzZMOzIGxhcCAocmVsKScsCiAgICAnUmVsYXRpb25zaGlwIHRhcmdldCB0byBwYWdlIChyZXYpJyA6ICdMYXBob3oga2FwY3NvbMOzZMOzIGPDqWwgKHJldiknLAogICAgJ1RhYiBpbmRleCcgOiAnVGFidWzDoXRvciBpbmRleCcsCiAgICAnQWNjZXNzIGtleScgOiAnSG96esOhZsOpcsOpc2kga3VsY3MnLAogICAgLy8gaW1hZ2UKICAgICdTaXplJyA6ICdNw6lyZXQnLAogICAgJ1ByZXZpZXcnIDogJ0VsxZFuw6l6ZXQnLAogICAgJ01hcmdpbnMnIDogJ01hcmfDs2snLAogICAgJ0FsdCB0ZXh0JyA6ICdBbHQgc3rDtnZlZycsCiAgICAnSW1hZ2UgVVJMJyA6ICdLw6lwIFVSTCcsCiAgICAvLyB0YWJsZQogICAgJ1NwYWNpbmcnICAgICAgIDogJ0NlbGxha8O2eicsCiAgICAnUGFkZGluZycgICAgICAgOiAnJywKICAgICdSb3dzJyAgICAgICAgICA6ICdTb3JvaycsCiAgICAnQ29sdW1ucycgICAgICAgOiAnT3N6bG9wb2snLAogICAgJ0dyb3VwcycgICAgICAgIDogJ0Nzb3BvcnRvaycsCiAgICAnQ2VsbHMnICAgICAgICAgOiAnQ2VsbMOhaycsCiAgICAnQ2FwdGlvbicgICAgICAgOiAnRmVsaXJhdCcsCiAgICAnSW5uZXIgYm9yZGVycycgOiAnQmVsc8WRIGtlcmV0JywKICAgIC8vIHRhYmxlIGNlbGwKICAgICdUYWJsZSBjZWxsIHR5cGUnIDogJ1TDoWJsw6F6YXQgY2VsbGEgdMOtcHVzJywKICAgICdEYXRhJyA6ICdBZGF0JywKICAgICdIZWFkZXInIDogJ0PDrW1zb3InLAogICAgJ0p1c3RpZnknIDogJ1NvcmtpesOhcnQnLAogICAgJ1BhZGRpbmdzJyA6ICdQYWRkaW5nJywKICAgICdBcHBseSB0bycgOiAnQWxrYWxtYXrDoXMgYScsCiAgICAnQ3VycmVudCBjZWxsJyA6ICdKZWxlbmxlZ2kgY2VsbGEnLAogICAgJ0FsbCBjZWxscyBpbiByb3cnIDogJ8OWc3N6ZXMgY2VsbGEgYSBzb3JiYW4nLAogICAgJ0FsbCBjZWxscyBpbiBjb2x1bW4nIDogJ8OWc3N6ZXMgY2VsbGEgYXogb3N6bG9wYmFuJywKICAgICdBbGwgY2VsbHMgaW4gdGFibGUnIDogJ8OWc3N6ZXMgY2VsbGEgYSB0w6FibMOhemF0YmFuJywKICAgIC8vIGFib3V0CiAgICAnQWJvdXQgZWxSVEUnIDogJ0F6IGVsUlRFLXLFkWwnLAogICAgJ1ZlcnNpb24nIDogJ1Zlcnppw7MnLAogICAgJ0xpY2VuY2UnIDogJ0xpc3plbnN6JywKICAgICdlbFJURSBpcyBhbiBvcGVuLXNvdXJjZSBKYXZhU2NyaXB0IGJhc2VkIFdZU0lXWUcgSFRNTC1lZGl0b3IuJyA6ICdBeiBlbFJURSBlZ3kgbnnDrWx0Zm9ycsOhc2vDs2TDuiBKYXZhU2NyaXB0IGFsYXDDuiBXWVNJV1lHIEhUTUwtc3plcmtlc3p0xZEuJywKICAgICdNYWluIGdvYWwgb2YgdGhlIGVkaXRvciAtIHNpbXBsaWZ5IHdvcmsgd2l0aCB0ZXh0IGFuZCBmb3JtYXRpbmcgKEhUTUwpIG9uIHNpdGVzLCBibG9ncywgZm9ydW1zIGFuZCBvdGhlciBvbmxpbmUgc2VydmljZXMuJyA6ICdBIHN6ZXJrZXN6dMWRIGbFkSBjw6lsamEsIGhvZ3kgZWd5c3plcsWxc8OtdHNlIGEgbXVua8OhdCDDqXMgYSBzesO2dmVnIGZvcm3DoXrDoXN0IChIVE1MKSBheiBvbGRhbGFrb24sIGJsb2dva29uLCBmw7NydW1va29uIGlsbGV0dmUgbcOhcyBvbmxpbmUgc3pvbGfDoWx0YXTDoXNva2Jhbi4nLAogICAgJ1lvdSBjYW4gdXNlIGl0IGluIGFueSBjb21tZXJjaWFsIG9yIG5vbi1jb21tZXJjaWFsIHByb2plY3RzLicgOiAnSGFzem7DoWxoYXRvZCBiw6FybWlseWVuIGtlcmVza2VkZWxuaSB2YWd5IG5lbS1rZXJlc2tlZGVsbWkgY8OpbMO6IHByb2pla3RiZW4uJywKICAgICdBdXRob3JzJyA6ICdLw6lzesOtdMWRaycsCiAgICAnQ2hpZWYgZGV2ZWxvcGVyJyA6ICdGxZEgZmVqbGVzenTFkScsCiAgICAnRGV2ZWxvcGVyLCB0ZWNoIHN1cHBvcnQnIDogJ0ZlamVsc2F6dMWRLCB0ZWNoIGthcGNzb2xhdCcsCiAgICAnSW50ZXJmYWNlIGRlc2lnbmVyJyA6ICdJbnRlcmZhY2UgdGVydmV6xZEnLAogICAgJ1NwYW5pc2ggbG9jYWxpemF0aW9uJyA6ICdTcGFueW9sIGZvcmTDrXTDsycsCiAgICAnSmFwYW5lc2UgbG9jYWxpemF0aW9uJyA6ICdKYXDDoW4gZm9yZMOtdMOzJywKICAgICdMYXR2aWFuIGxvY2FsaXphdGlvbicgOiAnTGl0dsOhbiBmb3Jkw610w7MnLAogICAgJ0dlcm1hbiBsb2NhbGl6YXRpb24nIDogJ07DqW1ldCBmb3Jkw610w7MnLAogICAgJ1VrcmFuaWFuIGxvY2FsaXphdGlvbicgOiAnVWtyw6FuIGZvcmTDrXTDsycsCiAgICAnTWFneWFyIGxvY2FsaXphdGlvbicgOiAnTWFneWFyIGZvcmTDrXTDsycsCiAgICAnRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzb2Z0d2FyZSB2aXNpdCB0aGUnIDogJ1RvdsOhYmJpIGluZm9ybcOhY2nDs2vDqXJ0IGEgc3pvZnR2ZXJyxZFsIGtlcmVzc2UgZmVsIGEgJywKICAgICdlbFJURSB3ZWJzaXRlJyA6ICdlbFJURSBob25sYXBqw6F0JyAKICAgIAogICAgCn0KfSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.it.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEl0YWxpYW4gdHJhbnNsYXRpb24KICogQGF1dGhvciBVZ28gUHVuem9sbyA8c2FkcmFjemVyb3Vub0BnbWFpbC5jb20+CiAqIEB2ZXJzaW9uIDIwMTAtMDktMjAKICovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS5pMThNZXNzYWdlcy5pdCA9IHsKCSdFZGl0b3InIDogJ0VkaXRvcicsCgknU291cmNlJyA6ICdDb2RpY2UgU29yZ2VudGUnLAoJLy8gUGFuZWwgTmFtZQoJJ0NvcHkvUGFzZScgICAgICA6ICdDb3BpYS9JbmNvbGxhJywKCSdVbmRvL1JlZG8nICAgICAgOiAnQW5udWxsYS9SaXByaXN0aW5hJywKCSdUZXh0IHN0eWxlcycgICAgOiAnU3RpbGUgZGVsIHRlc3RvJywKCSdDb2xvcnMnICAgICAgICAgOiAnQ29sb3JpJywKCSdBbGlnbm1lbnQnICAgICAgOiAnQWxsaW5lYW1lbnRvJywKCSdJbmRlbnQvT3V0ZGVudCcgOiAnQXVtZW50YS9SaWR1Y2kgaW5kZW50YXppb25lJywKCSdUZXh0IGZvcm1hdCcgICAgOiAnRm9ybWF0byBkZWwgdGVzdG8nLAoJJ0xpc3RzJyAgICAgICAgICA6ICdMaXN0ZScsCgknTWlzYyBlbGVtZW50cycgIDogJ0VsZW1lbnRpIHZhcmknLAoJJ0xpbmtzJyAgICAgICAgICA6ICdDb2xsZWdhbWVudGknLAoJJ0ltYWdlcycgICAgICAgICA6ICdJbW1hZ2luaScsCgknTWVkaWEnICAgICAgICAgIDogJ011bHRpbWVkaWEnLAoJJ1RhYmxlcycgICAgICAgICA6ICdUYWJlbGxlJywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAnRmlsZSBtYW5hZ2VyIChlbEZpbmRlciknLAoJLy8gYnV0dG9uIG5hbWVzCgknU2F2ZScgICAgICAgICAgICAgICAgICAgIDogJ1NhbHZhJywKCSdDb3B5JyAgICAgICAgICAgICAgICAgICAgOiAnQ29waWEnLAoJJ0N1dCcgICAgICAgICAgICAgICAgICAgICA6ICdUYWdsaWEnLAoJJ1Bhc3RlJyAgICAgICAgICAgICAgICAgICA6ICdJbmNvbGxhJywKCSdQYXN0ZSBvbmx5IHRleHQnICAgICAgICAgOiAnSW5jb2xsYSBzb2xvIHRlc3RvJywKCSdQYXN0ZSBmb3JtYXR0ZWQgdGV4dCcgICAgOiAnSW5jb2xsYSB0ZXN0byBmb3JtYXR0YXRvJywKCSdDbGVhbiBmb3JtYXQnICAgICAgICAgICAgOiAnUHVsaXNjaSBmb3JtYXRvJywKCSdVbmRvIGxhc3QgYWN0aW9uJyAgICAgICAgOiAnQW5udWxsYSB1bHRpbWEgYXppb25lJywKCSdSZWRvIHByZXZpb3VzIGFjdGlvbicgICAgOiAnUmlwcmlzdGluYSB1bHRpbWEgYXppb25lJywKCSdCb2xkJyAgICAgICAgICAgICAgICAgICAgOiAnTmVyZXR0bycsCgknSXRhbGljJyAgICAgICAgICAgICAgICAgIDogJ0NvcnNpdm8nLAoJJ1VuZGVybGluZScgICAgICAgICAgICAgICA6ICdTb3R0b2xpbmVhdG8nLAoJJ1N0cmlrZXRocm91Z2gnICAgICAgICAgICA6ICdCYXJyYXRvJywKCSdTdXBlcnNjcmlwdCcgICAgICAgICAgICAgOiAnSW5kaWNlJywKCSdTdWJzY3JpcHQnICAgICAgICAgICAgICAgOiAnUGVkaWNlL0RlcG9uZW50ZScsCgknQWxpZ24gbGVmdCcgICAgICAgICAgICAgIDogJ0FsbGluZWEgYSBzaW5pc3RyYScsCgknQWlsZ24gcmlnaHQnICAgICAgICAgICAgIDogJ0FsbGluZWEgYSBkZXN0cmEnLAoJJ0FsaWduIGNlbnRlcicgICAgICAgICAgICA6ICdDZW50cmEnLAoJJ0FsaWduIGZ1bGwnICAgICAgICAgICAgICA6ICdHaXVzdGlmaWNhJywKCSdGb250IGNvbG9yJyAgICAgICAgICAgICAgOiAnQ29sb3JlIGRlbCB0ZXN0bycsCgknQmFja2dyb3VuZCBjb2xvcicgICAgICAgIDogJ0NvbG9yZSBkaSBzZm9uZG8nLAoJJ0luZGVudCcgICAgICAgICAgICAgICAgICA6ICdBdW1lbnRhIGluZGVudGF6aW9uZScsCgknT3V0ZGVudCcgICAgICAgICAgICAgICAgIDogJ1JpZHVjaSBpbmRlbnRhemlvbmUnLAoJJ0Zvcm1hdCcgICAgICAgICAgICAgICAgICA6ICdGb3JtYXRvJywKCSdGb250IHNpemUnICAgICAgICAgICAgICAgOiAnR3JhbmRlenphIGNhcmF0dGVyaScsCgknRm9udCcgICAgICAgICAgICAgICAgICAgIDogJ0NhcmF0dGVyZScsCgknT3JkZXJlZCBsaXN0JyAgICAgICAgICAgIDogJ0xpc3RhIG9yZGluYXRhJywKCSdVbm9yZGVyZWQgbGlzdCcgICAgICAgICAgOiAnTGlzdGEgbm9uIG9yZGluYXRhJywKCSdIb3Jpem9udGFsIHJ1bGUnICAgICAgICAgOiAnTGluZWEgb3JpenpvbnRhbGUnLAoJJ0Jsb2NrcXVvdGUnICAgICAgICAgICAgICA6ICdDaXRhemlvbmUnLAoJJ0Jsb2NrIGVsZW1lbnQgKERJViknICAgICA6ICdCbG9jY28gZWxlbWVudG8gKERJViknLAoJJ0xpbmsnICAgICAgICAgICAgICAgICAgICA6ICdDb2xsZWdhbWVudG8nLAoJJ0RlbGV0ZSBsaW5rJyAgICAgICAgICAgICA6ICdFbGltaW5hIGNvbGxlZ2FtZW50bycsCgknQm9va21hcmsnICAgICAgICAgICAgICAgIDogJ1NlZ25hbGlicm8nLAoJJ0ltYWdlJyAgICAgICAgICAgICAgICAgICA6ICdJbW1hZ2luZScsCgknVGFibGUnICAgICAgICAgICAgICAgICAgIDogJ1RhYmVsbGEnLAoJJ0RlbGV0ZSB0YWJsZScgICAgICAgICAgICA6ICdFbGltaW5hIHRhYmVsbGEnLAoJJ0luc2VydCByb3cgYmVmb3JlJyAgICAgICA6ICdJbnNlcmlzY2kgcmlnYSBzb3ByYScsCgknSW5zZXJ0IHJvdyBhZnRlcicgICAgICAgIDogJ0luc2VyaXNjaSByaWdhIHNvdHRvJywKCSdEZWxldGUgcm93JyAgICAgICAgICAgICAgOiAnRWxpbWluYSByaWdhJywKCSdJbnNlcnQgY29sdW1uIGJlZm9yZScgICAgOiAnSW5zZXJpc2NpIGNvbG9ubmEgYSBzaW5pc3RyYScsCgknSW5zZXJ0IGNvbHVtbiBhZnRlcicgICAgIDogJ0luc2VyaXNjaSBjb2xvbm5hIGEgZGVzdHJhJywKCSdEZWxldGUgY29sdW1uJyAgICAgICAgICAgOiAnRWxpbWluYSBjb2xvbm5hJywKCSdNZXJnZSB0YWJsZSBjZWxscycgICAgICAgOiAnVW5pc2NpIGNlbGxlJywKCSdTcGxpdCB0YWJsZSBjZWxsJyAgICAgICAgOiAnU2VwYXJhIGNlbGxlJywKCSdUb2dnbGUgZGlzcGxheSBkb2N1bWVudCBzdHJ1Y3R1cmUnIDogJ1Bhc3NhIGFsbGEgbW9kYWxpdCZhZ3JhdmU7ICJ2aXN1YWxpenphemlvbmUgc3RydXR0dXJhIGRlbCBkb2N1bWVudG8iJywKCSdUYWJsZSBjZWxsIHByb3BlcnRpZXMnICAgOiAnUHJvcHJpZXQmYWdyYXZlOyBjZWxsZScsCgknVGFibGUgcHJvcGVydGllcycgICAgICAgIDogJ1Byb3ByaWV0JmFncmF2ZTsgdGFiZWxsYScsCgknVG9nZ2xlIGZ1bGwgc2NyZWVuIG1vZGUnIDogJ1Bhc3NhIGFsbGEgbW9kYWxpdCZhZ3JhdmU7ICJzY2hlcm1vIGludGVybyInLAoJJ09wZW4gZmlsZSBtYW5hZ2VyJyAgICAgICA6ICdBcHJpIGlsIGZpbGUgbWFuYWdlcicsCgknTm9uIGJyZWFrYWJsZSBzcGFjZScgICAgIDogJ1NwYXppbyBub24gZGl2aXNpYmlsZScsCgknU3RvcCBlbGVtZW50IGZsb2F0aW5nJyAgIDogJ0Jsb2NjYSBlbGVtZW50byBmbHV0dHVhbnRlJywKCS8vIGRpYWxvZ3MKCSdXYXJuaW5nJyA6ICdBdHRlbnppb25lJywKCSdQcm9wZXJpZXMnIDogJ1Byb3ByaWV0JmFncmF2ZTsnLAoJJ1BvcHVwJyA6ICdQb3B1cCcsCgknQWR2YW5jZWQnIDogJ0F2YW56YXRlJywKCSdFdmVudHMnIDogJ0V2ZW50aScsCgknV2lkdGgnIDogJ0xhcmdoZXp6YScsCgknSGVpZ2h0JyA6ICdBbHRlenphJywKCSdMZWZ0JyAgIDogJ1NpbmlzdHJhJywKCSdDZW50ZXInIDogJ0NlbnRybycsCgknUmlnaHQnICA6ICdEZXN0cmEnLAoJJ0JvcmRlcicgOiAnQm9yZG8nLAoJJ0JhY2tncm91bmQnIDogJ1Nmb25kbycsCgknQ3NzIGNsYXNzJyA6ICdDbGFzc2UgQ1NTJywKCSdDc3Mgc3R5bGUnIDogJ1N0aWxlIENTUycsCgknTm8nIDogJ05vJywKCSdUaXRsZScgOiAnVGl0b2xvJywKCSdTY3JpcHQgZGlyZWN0aW9uJyA6ICdEaXJlemlvbmUgZGVsbG8gc2NyaXB0JywKCSdMYW5ndWFnZScgOiAnTGluZ3VhJywKCSdDaGFyc2V0JyA6ICdDaGFyc2V0JywKCSdOb3Qgc2V0JyA6ICdOb24gc2V0dGF0bycsCgknTGVmdCB0byByaWdodCcgOiAnRGEgc2luaXN0cmEgYSBkZXN0cmEnLAoJJ1JpZ2h0IHRvIGxlZnQnIDogJ0RhIGRlc3RyYSBhIHNpbmlzdHJhJywKCSdJbiB0aGlzIHdpbmRvdycgOiAnSW4gcXVlc3RhIGZpbmVzdHJhIChfc2VsZiknLAoJJ0luIG5ldyB3aW5kb3cgKF9ibGFuayknIDogJ0luIHVuYSBudW92YSBmaW5lc3RyYSAoX2JsYW5rKScsCgknSW4gbmV3IHBhcmVudCB3aW5kb3cgKF9wYXJlbnQpJyA6ICdJbiB1bmEgbnVvdmEgZmluZXN0cmEgbWFkcmUgKF9wYXJlbnQpJywKCSdJbiB0b3AgZnJhbWUgKF90b3ApJyA6ICdJbiBhbHRvIGFsIGZyYW1lIChfdG9wKScsCgknVVJMJyA6ICdVUkwnLAoJJ09wZW4gaW4nIDogJ0FwcmkgaW4nLAoJLy8gY29weQoJJ1RoaXMgb3BlcmF0aW9uIGlzIGRpc2FibGVkIGluIHlvdXIgYnJvd3NlciBvbiBzZWN1cml0eSByZWFzb24uIFVzZSBzaG9ydGN1dCBpbnN0ZWFkLicgOiAnUXVlc3RhIG9wZXJhemlvbmUgJmVncmF2ZTsgZGlzYWJpbGl0YXRhIG5lbCB0dW8gYnJvd3NlciBwZXIgbW90aXZpIGRpIHNpY3VyZXp6YS4gUHVvaSBjb211bnF1ZSB1dGlsaXp6YXJlIHVuIGNvbWFuZG8gZGEgdGFzdGllcmEuJywKCS8vIGZvcm1hdCAKCSdIZWFkaW5nIDEnIDogJ0ludGVzdGF6aW9uZSAxJywKCSdIZWFkaW5nIDInIDogJ0ludGVzdGF6aW9uZSAyJywKCSdIZWFkaW5nIDMnIDogJ0ludGVzdGF6aW9uZSAzJywKCSdIZWFkaW5nIDQnIDogJ0ludGVzdGF6aW9uZSA0JywKCSdIZWFkaW5nIDUnIDogJ0ludGVzdGF6aW9uZSA1JywKCSdIZWFkaW5nIDYnIDogJ0ludGVzdGF6aW9uZSA2JywKCSdQYXJhZ3JhcGgnIDogJ1BhcmFncmFmbycsCgknQWRkcmVzcycgOiAnSW5kaXJpenpvJywKCSdQcmVmb3JtYXR0ZWQnIDogJ1ByZWZvcm1hdHRhdG8nLAoJLy8gZm9udCBzaXplCgknU21hbGwgKDhwdCknICAgOiAnUGljY29sbyAoOHB0KScsCgknU21hbGwgKDEwcHgpJyAgOiAnUGljY29sbyAoMTBweCknLAoJJ1NtYWxsICgxMnB0KScgIDogJ1BpY2NvbG8gKDEycHQpJywKCSdOb3JtYWwgKDE0cHQpJyA6ICdOb3JtYWxlICgxNHB0KScsCgknTGFyZ2UgKDE4cHQpJyAgOiAnR3JhbmRlICgxOHB0KScsCgknTGFyZ2UgKDI0cHQpJyAgOiAnR3JhbmRlICgyNHB0KScsCgknTGFyZ2UgKDM2cHQpJyAgOiAnR3JhbmRlICgzNnB0KScsCgkvLyBib29rbWFyawoJJ0Jvb2ttYXJrIG5hbWUnIDogJ05vbWUgZGVsIHNlZ25hbGlicm8nLAoJLy8gbGluawoJJ0xpbmsgVVJMJyA6ICdVUkwgZGVsIGNvbGxlZ2FtZW50bycsCgknVGFyZ2V0JyA6ICdUYXJnZXQnLAoJJ09wZW4gbGluayBpbiBwb3B1cCB3aW5kb3cnIDogJ0FwcmkgaWwgbGluayBpbiB1bmEgZmluZXN0cmEgcG9wdXAnLAoJJ1dpbmRvdyBuYW1lJyA6ICdOb21lIGRlbGxhIGZpbmVzdHJhJywKCSdXaW5kb3cgc2l6ZScgOiAnRGltZW5zaW9uaSBkZWxsYSBmaW5lc3RyYScsCgknV2luZG93IHBvc2l0aW9uJyA6ICdQb3NpemlvbmUgZGVsbGEgZmluZXN0cmEnLAoJJ0xvY2F0aW9uIGJhcicgOiAnQmFycmEgZGlyZXppb25hbGUnLAoJJ01lbnUgYmFyJyA6ICdCYXJyYSBkZWwgbWVudScsCgknVG9vbGJhcicgOiAnQmFycmEgZGVnbGkgc3RydW1lbnRpJywKCSdTY3JvbGxiYXJzJyA6ICdCYXJyYSBkaSBzY29ycmltZW50bycsCgknU3RhdHVzIGJhcicgOiAnQmFycmEgZGkgc3RhdG8nLAoJJ1Jlc2l6YWJsZScgOiAnUmlkaW1lbnNpb25hYmlsZScsCgknRGVwZWRlbnQnIDogJ0RpcGVuZGVudGUgKE5ldHNjYXBlKScsCgknQWRkIHJldHVybiBmYWxzZScgOiAnQWdnaXVuZ2kgY29uZGl6aW9uZSBmYWxzYSAocmV0dXJuIGZhbHNlKScsCgknVGFyZ2V0IE1JTUUgdHlwZScgOiAnT2JpZXR0aXZvIGRlbCB0aXBvIGRpIE1JTUUgKE1JTUUgdHlwZSknLAoJJ1JlbGF0aW9uc2hpcCBwYWdlIHRvIHRhcmdldCAocmVsKScgOiAnRGFsbGEgcGFnaW5hIGNvcnJlbGF0YSBhbGxcJ29iaWV0dGl2bycsCgknUmVsYXRpb25zaGlwIHRhcmdldCB0byBwYWdlIChyZXYpJyA6ICdEYWxsXCdvYmlldHRpdm8gYWxsYSBwYWdpbmEgY29ycmVsYXRhJywKCSdUYWIgaW5kZXgnIDogJ0luZGljZSBkaSB0YWJ1bGF6aW9uZScsCgknQWNjZXNzIGtleScgOiAnQ2hpYXZlIGRpIGFjY2Vzc28nLAoJLy8gaW1hZ2UKCSdTaXplJyA6ICdEaW1lbnNpb25lJywKCSdQcmV2aWV3JyA6ICdBbnRlcHJpbWEnLAoJJ01hcmdpbnMnIDogJ01hcmdpbmknLAoJJ0FsdCB0ZXh0JyA6ICdUZXN0byBhbHRlcm5hdGl2bycsCgknSW1hZ2UgVVJMJyA6ICdVUkwgZGVsbFwnaW1tYWdpbmUnLAoJLy8gdGFibGUKCSdTcGFjaW5nJyAgICAgICA6ICdTcGF6aWF0dXJhIChTcGFjaW5nKScsCgknUGFkZGluZycgICAgICAgOiAnUmllbXBpbWVudG8gKFBhZGRpbmcpJywKCSdSb3dzJyAgICAgICAgICA6ICdSaWdoZScsCgknQ29sdW1ucycgICAgICAgOiAnQ29sb25uZScsCgknR3JvdXBzJyAgICAgICAgOiAnR3J1cHBpJywKCSdDZWxscycgICAgICAgICA6ICdDZWxsZScsCgknQ2FwdGlvbicgICAgICAgOiAnRGlkYXNjYWxpYScsCgknSW5uZXIgYm9yZGVycycgOiAnQm9yZGkgaW50ZXJuaScKCQoJCn0KfSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.jp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEphcGFuZXNlIHRyYW5zbGF0aW9uCiAqIEBhdXRob3IgVG9tb2FraSBZb3NoaWRhIDxpbmZvQHlvc2hpZGEtc3R1ZGlvLmpwPgogKiBAdmVyc2lvbiAyMDEwLTA5LTE4CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuaTE4TWVzc2FnZXMuanAgPSB7CgknRWRpdG9yJyA6ICfjgqjjg4fjgqPjgr/jg7wnLAoJJ1NvdXJjZScgOiAn44K944O844K5JywKCS8vIFBhbmVsIE5hbWUKCSdDb3B5L1Bhc2UnICAgICAgOiAn44Kz44OU44O8L+ODmuODvOOCueODiCcsCgknVW5kby9SZWRvJyAgICAgIDogJ+WFg+OBq+aIu+OBmS/jgoTjgornm7TjgZcnLAoJJ1RleHQgc3R5bGVzJyAgICA6ICfjg4bjgq3jgrnjg4jjgrnjgr/jgqTjg6snLAoJJ0NvbG9ycycgICAgICAgICA6ICfoibInLAoJJ0FsaWdubWVudCcgICAgICA6ICfooYzmj4PjgYgnLAoJJ0luZGVudC9PdXRkZW50JyA6ICfjgqTjg7Pjg4fjg7Pjg4gv44Ki44Km44OI44OH44Oz44OIJywKCSdUZXh0IGZvcm1hdCcgICAgOiAn44OG44Kt44K544OI44OV44Kp44O844Oe44OD44OIJywKCSdMaXN0cycgICAgICAgICAgOiAn44Oq44K544OIJywKCSdNaXNjIGVsZW1lbnRzJyAgOiAn44Gd44Gu5LuWJywKCSdMaW5rcycgICAgICAgICAgOiAn44Oq44Oz44KvJywKCSdJbWFnZXMnICAgICAgICAgOiAn55S75YOPJywKCSdNZWRpYScgICAgICAgICAgOiAn44Oh44OH44Kj44KiJywKCSdUYWJsZXMnICAgICAgICAgOiAn44OG44O844OW44OrJywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAn44OV44Kh44Kk44Or44Oe44ON44O844K444OjKGVsRmluZGVyKScsCgkvLyBidXR0b24gbmFtZXMKCSdBYm91dCB0aGlzIHNvZnR3YXJlJyAgICAgOiAn44GT44Gu44K944OV44OI44Km44Kn44Ki44Gr44Gk44GE44GmJywKCSdTYXZlJyAgICAgICAgICAgICAgICAgICAgOiAn5L+d5a2YJywKCSdDb3B5JyAgICAgICAgICAgICAgICAgICAgOiAn44Kz44OU44O8JywKCSdDdXQnICAgICAgICAgICAgICAgICAgICAgOiAn5YiH44KK5Y+W44KKJywKCSdQYXN0ZScgICAgICAgICAgICAgICAgICAgOiAn6LK844KK5LuY44GRJywKCSdQYXN0ZSBvbmx5IHRleHQnICAgICAgICAgOiAn44OG44Kt44K544OI44Gu44G/6LK844KK5LuY44GRJywKCSdQYXN0ZSBmb3JtYXR0ZWQgdGV4dCcgICAgOiAn44OV44Kp44O844Oe44OD44OI44GV44KM44Gf44OG44Kt44K544OI44Gu6LK844KK5LuY44GRJywKCSdDbGVhbiBmb3JtYXQnICAgICAgICAgICAgOiAn44OV44Kp44O844Oe44OD44OI5raI5Y67JywgCgknVW5kbyBsYXN0IGFjdGlvbicgICAgICAgIDogJ+WFg+OBq+aIu+OBmScsCgknUmVkbyBwcmV2aW91cyBhY3Rpb24nICAgIDogJ+OChOOCiuebtOOBlycsCgknQm9sZCcgICAgICAgICAgICAgICAgICAgIDogJ+WkquWtlycsCgknSXRhbGljJyAgICAgICAgICAgICAgICAgIDogJ+aWnOS9kycsCgknVW5kZXJsaW5lJyAgICAgICAgICAgICAgIDogJ+S4i+e3micsCgknU3RyaWtldGhyb3VnaCcgICAgICAgICAgIDogJ+aJk+OBoea2iOOBl+e3micsCgknU3VwZXJzY3JpcHQnICAgICAgICAgICAgIDogJ+S4iuS7mOOBjeaWh+WtlycsCgknU3Vic2NyaXB0JyAgICAgICAgICAgICAgIDogJ+a3u+OBiOWtlycsCgknQWxpZ24gbGVmdCcgICAgICAgICAgICAgIDogJ+W3puaPg+OBiCcsCgknQWlsZ24gcmlnaHQnICAgICAgICAgICAgIDogJ+WPs+aPg+OBiCcsCgknQWxpZ24gY2VudGVyJyAgICAgICAgICAgIDogJ+S4reWkruaPg+OBiCcsCgknQWxpZ24gZnVsbCcgICAgICAgICAgICAgIDogJ+S4oeerr+aPg+OBiCcsCgknRm9udCBjb2xvcicgICAgICAgICAgICAgIDogJ+ODhuOCreOCueODiOiJsicsCgknQmFja2dyb3VuZCBjb2xvcicgICAgICAgIDogJ+iDjOaZr+iJsicsCgknSW5kZW50JyAgICAgICAgICAgICAgICAgIDogJ+OCpOODs+ODh+ODs+ODiCcsIAoJJ091dGRlbnQnICAgICAgICAgICAgICAgICA6ICfjgqLjgqbjg4jjg4fjg7Pjg4gnLCAKCSdGb3JtYXQnICAgICAgICAgICAgICAgICAgOiAn44OV44Kp44O844Oe44OD44OIJywKCSdGb250IHNpemUnICAgICAgICAgICAgICAgOiAn44K144Kk44K6JywKCSdGb250JyAgICAgICAgICAgICAgICAgICAgOiAn44OV44Kp44Oz44OIJywKCSdPcmRlcmVkIGxpc3QnICAgICAgICAgICAgOiAn5q616JC955Wq5Y+3JywKCSdVbm9yZGVyZWQgbGlzdCcgICAgICAgICAgOiAn566H5p2h5pu444GNJywKCSdIb3Jpem9udGFsIHJ1bGUnICAgICAgICAgOiAn5qiq572r57eaJywKCSdCbG9ja3F1b3RlJyAgICAgICAgICAgICAgOiAn44OW44Ot44OD44Kv5byV55SoJywKCSdCbG9jayBlbGVtZW50IChESVYpJyAgICAgOiAn44OW44Ot44OD44Kv6KaB57SgIChESVYpJywKCSdMaW5rJyAgICAgICAgICAgICAgICAgICAgOiAn44Oq44Oz44KvJywKCSdEZWxldGUgbGluaycgICAgICAgICAgICAgOiAn44Oq44Oz44Kv5YmK6ZmkJywKCSdCb29rbWFyaycgICAgICAgICAgICAgICAgOiAn44Ki44Oz44Kr44O85oy/5YWlL+e3qOmbhicsCgknSW1hZ2UnICAgICAgICAgICAgICAgICAgIDogJ+OCpOODoeODvOOCuCcsCgknVGFibGUnICAgICAgICAgICAgICAgICAgIDogJ+ODhuODvOODluODqycsCgknRGVsZXRlIHRhYmxlJyAgICAgICAgICAgIDogJ+ODhuODvOODluODq+WJiumZpCcsCgknSW5zZXJ0IHJvdyBiZWZvcmUnICAgICAgIDogJ+WJjeOBq+ihjOOCkuaMv+WFpScsCgknSW5zZXJ0IHJvdyBhZnRlcicgICAgICAgIDogJ+W+jOOCjeOBq+ihjOOCkuaMv+WFpScsCgknRGVsZXRlIHJvdycgICAgICAgICAgICAgIDogJ+ihjOOCkuWJiumZpCcsCgknSW5zZXJ0IGNvbHVtbiBiZWZvcmUnICAgIDogJ+WJjeOBq+WIl+OCkuaMv+WFpScsCgknSW5zZXJ0IGNvbHVtbiBhZnRlcicgICAgIDogJ+W+jOOCjeOBq+WIl+OCkuaMv+WFpScsCgknRGVsZXRlIGNvbHVtbicgICAgICAgICAgIDogJ+WIl+OCkuWJiumZpCcsCgknTWVyZ2UgdGFibGUgY2VsbHMnICAgICAgIDogJ+OCu+ODq+OCkue1kOWQiOOBmeOCiycsCgknU3BsaXQgdGFibGUgY2VsbCcgICAgICAgIDogJ+OCu+ODq+OCkuWIhuWJsuOBmeOCiycsCgknVG9nZ2xlIGRpc3BsYXkgZG9jdW1lbnQgc3RydWN0dXJlJyA6ICfmp4vmiJDopoHntKDjga7ooajnpLonLAoJJ1RhYmxlIGNlbGwgcHJvcGVydGllcycgICA6ICfjg4bjg7zjg5bjg6vjgrvjg6vjg5fjg63jg5Hjg4bjgqMnLAoJJ1RhYmxlIHByb3BlcnRpZXMnICAgICAgICA6ICfjg4bjg7zjg5bjg6vjg5fjg63jg5Hjg4bjgqMnLAoJJ1RvZ2dsZSBmdWxsIHNjcmVlbiBtb2RlJyA6ICfmnIDlpKfljJYnLAoJJ09wZW4gZmlsZSBtYW5hZ2VyJyAgICAgICA6ICfjg5XjgqHjgqTjg6vjg57jg43jg7zjgrjjg6PjgpLplovjgY8nLAoJJ05vbiBicmVha2FibGUgc3BhY2UnICAgICA6ICfmlLnooYzjgarjgZfjgrnjg5rjg7zjgrknLAoJJ1N0b3AgZWxlbWVudCBmbG9hdGluZycgICA6ICfjg5Xjg63jg7zjg4jjga7op6PpmaQnLAoJLy8gZGlhbG9ncwoJJ1dhcm5pbmcnIDogJ+itpuWRiicsCgknUHJvcGVyaWVzJyA6ICfjg5fjg63jg5Hjg4bjgqMnLAoJJ1BvcHVwJyA6ICfjg53jg4Pjg5fjgqLjg4Pjg5cnLAoJJ0FkdmFuY2VkJyA6ICfjgqLjg4njg5Djg7PjgrknLAoJJ0V2ZW50cycgOiAn44Kk44OZ44Oz44OIJywKCSdXaWR0aCcgOiAn5bmFJywKCSdIZWlnaHQnIDogJ+mrmOOBlScsCgknTGVmdCcgICA6ICflt6YnLAoJJ0NlbnRlcicgOiAn5Lit5aSuJywKCSdSaWdodCcgIDogJ+WPsycsCgknQm9yZGVyJyA6ICfjg5zjg7zjg4Djg7wnLAoJJ0JhY2tncm91bmQnIDogJ+iDjOaZrycsCgknQ3NzIGNsYXNzJyA6ICdDU1MgY2xhc3MnLAoJJ0NzcyBzdHlsZScgOiAnQ1NTIHN0eWxlJywKCSdObycgOiAnTm8nLAoJJ1RpdGxlJyA6ICfjgr/jgqTjg4jjg6snLAoJJ1NjcmlwdCBkaXJlY3Rpb24nIDogJ+aWh+Wtl+ihqOiomOaWueWQkScsCgknTGFuZ3VhZ2UnIDogJ+iogOiqnicsCgknQ2hhcnNldCcgOiAnQ2hhcnNldCcsCgknTm90IHNldCcgOiAn6Kit5a6a44GX44Gq44GEJywKCSdMZWZ0IHRvIHJpZ2h0JyA6ICflt6bjgYvjgonlj7MnLAoJJ1JpZ2h0IHRvIGxlZnQnIDogJ+WPs+OBi+OCieW3picsCgknSW4gdGhpcyB3aW5kb3cnIDogJ+WQjOOBmOOCpuOCo+ODs+ODieOCpiAoX3NlbGYpJywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJyA6ICfmlrDjgZfjgYTjgqbjgqPjg7Pjg4njgqYgKF9ibGFuayknLAoJJ0luIG5ldyBwYXJlbnQgd2luZG93IChfcGFyZW50KScgOiAn5paw44GX44GE6Kaq44Km44Kj44Oz44OJ44KmIChfcGFyZW50KScsCgknSW4gdG9wIGZyYW1lIChfdG9wKScgOiAn44OI44OD44OX44OV44Os44O844OgIChfdG9wKScsCgknVVJMJyA6ICdVUkwnLAoJJ09wZW4gaW4nIDogJ09wZW4gaW4nLAoJLy8gY29weQoJJ1RoaXMgb3BlcmF0aW9uIGlzIGRpc2FibGVkIGluIHlvdXIgYnJvd3NlciBvbiBzZWN1cml0eSByZWFzb24uIFVzZSBzaG9ydGN1dCBpbnN0ZWFkLicgOiAn44GT44Gu5qmf6IO944Gv44GK5L2/44GE44Gu44OW44Op44Km44K244Gn44Gv44K744Kt44Ol44Oq44OG44Kj44Gu6Kaz54K544GL44KJ44GU5Yip55So44Gn44GN44G+44Gb44KT44CC44K344On44O844OI44Kr44OD44OI44KS44GU5Yip55So44GP44Gg44GV44GE44CCJywKCS8vIGZvcm1hdCAKCSdIZWFkaW5nIDEnIDogJ+imi+WHuuOBlzEnLAoJJ0hlYWRpbmcgMicgOiAn6KaL5Ye644GXMicsCgknSGVhZGluZyAzJyA6ICfopovlh7rjgZczJywKCSdIZWFkaW5nIDQnIDogJ+imi+WHuuOBlzQnLAoJJ0hlYWRpbmcgNScgOiAn6KaL5Ye644GXNScsCgknSGVhZGluZyA2JyA6ICfopovlh7rjgZc2JywKCSdQYXJhZ3JhcGgnIDogJ+auteiQvScsCgknQWRkcmVzcycgOiAn44Ki44OJ44Os44K5JywKCSdQcmVmb3JtYXR0ZWQnIDogJycsCgkvLyBmb250IHNpemUKCSdTbWFsbCAoOHB0KScgICA6ICflsI8oOHB0KScsCgknU21hbGwgKDEwcHgpJyAgOiAn5bCPKDEwcHQpJywKCSdTbWFsbCAoMTJwdCknICA6ICflsI8oMTJwdCknLAoJJ05vcm1hbCAoMTRwdCknIDogJ+S4rSgxNHB0KScsCgknTGFyZ2UgKDE4cHQpJyAgOiAn5aSnKDE4cHQpJywKCSdMYXJnZSAoMjRwdCknICA6ICflpKcoMjRwdCknLAoJJ0xhcmdlICgzNnB0KScgIDogJ+WkpygzNnB0KScsCgkvLyBib29rbWFyawoJJ0Jvb2ttYXJrIG5hbWUnIDogJ+OCouODs+OCq+ODvOWQjScsCgkvLyBsaW5rCgknTGluayBVUkwnIDogJyhVUkwpJywKCSdUYXJnZXQnIDogJ+OCv+ODvOOCsuODg+ODiCcsCgknT3BlbiBsaW5rIGluIHBvcHVwIHdpbmRvdycgOiAn44Oq44Oz44Kv5YWI44KS44Od44OD44OX44Ki44OD44OX44Gn6ZaL44GPJywKCSdVUkwnIDogJ1VSTCcsCgknV2luZG93IG5hbWUnIDogJ+OCpuOCo+ODs+ODieOCpuWQjScsCgknV2luZG93IHNpemUnIDogJ+OCpuOCo+ODs+ODieOCpuOCteOCpOOCuicsCgknV2luZG93IHBvc2l0aW9uJyA6ICfjgqbjgqPjg7Pjg4njgqbkvY3nva4nLAoJJ0xvY2F0aW9uIGJhcicgOiAn44Ot44Kx44O844K344On44Oz44OQ44O8JywKCSdNZW51IGJhcicgOiAn44Oh44OL44Ol44O844OQ44O8JywKCSdUb29sYmFyJyA6ICfjg4Tjg7zjg6vjg5Djg7wnLAoJJ1Njcm9sbGJhcnMnIDogJ+OCueOCr+ODreODvOODq+ODkOODvCcsCgknU3RhdHVzIGJhcicgOiAn44K544OG44O844K/44K544OQ44O8JywKCSdSZXNpemFibGUnIDogJ+OCteOCpOOCuuWPr+WkiScsCgknRGVwZWRlbnQnIDogJ+OCpuOCo+ODs+ODieOCpumAo+WLlScsCgknQWRkIHJldHVybiBmYWxzZScgOiAncmV0dXJuIGZhbHNl44KS5Yqg44GI44KLJywKCSdUYXJnZXQgTUlNRSB0eXBlJyA6ICdUYXJnZXQgTUlNRSB0eXBlJywKCSdSZWxhdGlvbnNoaXAgcGFnZSB0byB0YXJnZXQgKHJlbCknIDogJ+ODmuODvOOCuOOBi+OCieOCv+ODvOOCsuODg+ODiOOBrumWouS/giAocmVsKScsCgknUmVsYXRpb25zaGlwIHRhcmdldCB0byBwYWdlIChyZXYpJyA6ICfjgr/jg7zjgrLjg4Pjg4jjgYvjgonjg5rjg7zjgrjjga7plqLkv4IgKHJldiknLAoJJ1RhYiBpbmRleCcgOiAn44K/44OW44Kk44Oz44OH44OD44Kv44K5JywKCSdBY2Nlc3Mga2V5JyA6ICfjgqLjgq/jgrvjgrnjgq3jg7wnLAoJLy8gaW1hZ2UKCSdTaXplJyA6ICfjgrXjgqTjgronLAoJJ1ByZXZpZXcnIDogJ+ODl+ODrOODk+ODpeODvCcsCgknTWFyZ2lucycgOiAn44Oe44O844K444OzJywKCSdBbHQgdGV4dCcgOiAn5Luj5pu/44OG44Kt44K544OIJywKCSdJbWFnZSBVUkwnIDogJ+eUu+WDj1VSTCcsCgkvLyB0YWJsZQoJJ1NwYWNpbmcnICAgICAgIDogJ+OCu+ODq+mWk+malCAoc3BhY2luZyknLAoJJ1BhZGRpbmcnICAgICAgIDogJ+OCu+ODq+WGheS9meeZvSAocGFkZGluZyknLAoJJ1Jvd3MnICAgICAgICAgIDogJ+ihjCcsCgknQ29sdW1ucycgICAgICAgOiAn5YiXJywKCSdHcm91cHMnICAgICAgICA6ICfjgrDjg6vjg7zjg5cnLAoJJ0NlbGxzJyAgICAgICAgIDogJ+OCu+ODqycsCgknQ2FwdGlvbicgICAgICAgOiAn44Kt44Oj44OX44K344On44OzJywKCSdJbm5lciBib3JkZXJzJyA6ICflhoXpg6jjg5zjg7zjg4Djg7wnLAoJLy8gYWJvdXQKCSdBYm91dCBlbFJURScgOiAnZWxSVEXjgavjgaTjgYTjgaYnLAoJJ1ZlcnNpb24nIDogJ+ODkOODvOOCuOODp+ODsycsCgknTGljZW5jZScgOiAn44Op44Kk44K744Oz44K5JywKCSdlbFJURSBpcyBhbiBvcGVuLXNvdXJjZSBKYXZhU2NyaXB0IGJhc2VkIFdZU0lXWUcgSFRNTC1lZGl0b3IuJyA6ICdlbFJUReOBr0phdmFzY3JpcHTjg5njg7zjgrnjga7jgqrjg7zjg5fjg7Pjgr3jg7zjgrlXWVNJV1lHIEhUTUzjgqjjg4fjgqPjgr/jgafjgZnjgIInLAoJJ01haW4gZ29hbCBvZiB0aGUgZWRpdG9yIC0gc2ltcGxpZnkgd29yayB3aXRoIHRleHQgYW5kIGZvcm1hdGluZyAoSFRNTCkgb24gc2l0ZXMsIGJsb2dzLCBmb3J1bXMgYW5kIG90aGVyIG9ubGluZSBzZXJ2aWNlcy4nIDogJ+OBk+OBruOCqOODh+OCo+OCv+OBruS4u+OBquebrueahOOBr+OAgeOCpuOCp+ODluOCteOCpOODiOOAgeODluODreOCsOOAgeODleOCqeODvOODqeODoOOChOOBneOBruS7luOBruOCquODs+ODqeOCpOODs+OCteODvOODk+OCueOBruODhuOCreOCueODiOOBqEhUTUzjg5Xjgqnjg7zjg57jg4Pjg4jlhaXlipvkvZzmpa3jgpLjgrfjg7Pjg5fjg6vjgavjgZnjgovjgZPjgajjgafjgZnjgIInLAoJJ1lvdSBjYW4gdXNlIGl0IGluIGFueSBjb21tZXJjaWFsIG9yIG5vbi1jb21tZXJjaWFsIHByb2plY3RzLicgOiAn5ZWG55So44O76Z2e5ZWG55So44Gr6Zai44KP44KJ44Ga44GU5Yip55So44GE44Gf44Gg44GR44G+44GZ44CCJywKCSdBdXRob3JzJyA6ICfokZfkvZzogIUnLAoJJ0NoaWVmIGRldmVsb3BlcicgOiAn44OB44O844OV44OH44OZ44Ot44OD44OR44O8JywKCSdEZXZlbG9wZXIsIHRlY2ggc3VwcG9ydCcgOiAn44OH44OZ44Ot44OD44OR44O844O744OG44Kv44OL44Kr44Or44K144Od44O844OIJywKCSdJbnRlcmZhY2UgZGVzaWduZXInIDogJ+OCpOODs+OCv+ODvOODleOCp+OCpOOCueODh+OCtuOCpOODiuODvCcsCgknU3BhbmlzaCBsb2NhbGl6YXRpb24nIDogJ+OCueODmuOCpOODs+iqnuWMluODreODvOOCq+ODqeOCpOOCvOODvOOCt+ODp+ODsycsCgknSmFwYW5lc2UgbG9jYWxpemF0aW9uJyA6ICfml6XmnKzoqp7ljJbjg63jg7zjgqvjg6njgqTjgrzjg7zjgrfjg6fjg7MnLAoJJ0xhdHZpYW4gbG9jYWxpemF0aW9uJyA6ICfjg6njg4jjg5PjgqLoqp7ljJbjg63jg7zjgqvjg6njgqTjgrzjg7zjgrfjg6fjg7MnLAoJJ0dlcm1hbiBsb2NhbGl6YXRpb24nIDogJ+ODieOCpOODhOiqnuWMluODreODvOOCq+ODqeOCpOOCvOODvOOCt+ODp+ODsycsCgknVWtyYW5pYW4gbG9jYWxpemF0aW9uJyA6ICfjgqbjgq/jg6njgqTjg4roqp7ljJbjg63jg7zjgqvjg6njgqTjgrzjg7zjgrfjg6fjg7MnLAoJJ0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc29mdHdhcmUgdmlzaXQgdGhlJyA6ICfmrKHjga5VUkzjgavjgabjgZPjga7jgr3jg5Xjg4jjgqbjgqfjgqLjga7jgojjgoroqbPjgZfjgYTmg4XloLHjgpLlhazplovjgZfjgabjgYTjgb7jgZnjgIInLAoJJ2VsUlRFIHdlYnNpdGUnIDogJ2VsUlRFIOOCpuOCp+ODluOCteOCpOODiCcKCQoJCn0KfSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.lv.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIExhdHZpYW4gdHJhbnNsYXRpb24KICogQGF1dGhvciBVbGRpcyBQbG90acWGxaEgPHVsZGlzLnBsb3RpbnNAZ21haWwuY29tPgogKiBAdmVyc2lvbiAyMDEwLTA5LTE4CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuaTE4TWVzc2FnZXMubHYgPSB7CgknRWRpdG9yJyA6ICdSZWRha3RvcnMnLAoJJ1NvdXJjZScgOiAnSXplamFzIGtvZHMnLAoJLy8gcGFuZWwgbmFtZXMKCSdDb3B5L1Bhc2UnICAgICAgOiAnS29wxJN0L0lldmlldG90JywKCSdVbmRvL1JlZG8nICAgICAgOiAnQXRjZWx0L0F0a8SBcnRvdCBkYXJixKtidScsCgknVGV4dCBzdHlsZXMnICAgIDogJ1Rla3N0YSBzdGlsaScsCgknQ29sb3JzJyAgICAgICAgIDogJ0tyxIFzYScsCgknQWxpZ25tZW50JyAgICAgIDogJ0l6bMSrZHppbsSBxaFhbmEnLAoJJ0luZGVudC9PdXRkZW50JyA6ICdBdGvEgXBlcycsCgknVGV4dCBmb3JtYXQnICAgIDogJ0Zvcm1hdMSTxaFhbmEnLAoJJ0xpc3RzJyAgICAgICAgICA6ICdTYXJha3N0aScsCgknTWlzYyBlbGVtZW50cycgIDogJ0Rhxb7EgWRpIGVsZW1lbnRpJywKCSdMaW5rcycgICAgICAgICAgOiAnU2FpdGVzJywKCSdJbWFnZXMnICAgICAgICAgOiAnQXR0xJNsaScsCgknTWVkaWEnICAgICAgICAgIDogJ03Ek2RpanUgZmFpbGknLAoJJ1RhYmxlcycgICAgICAgICA6ICdUYWJ1bGFzJywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAnRmFpbHUgcMSBcnZhbGRuaWVrcyAoZWxGaW5kZXIpJywKCS8vIGJ1dHRvbiBuYW1lcwoJJ1NhdmUnICAgICAgICAgICAgICAgICAgICA6ICdTYWdsYWLEgXQnLAoJJ0NvcHknICAgICAgICAgICAgICAgICAgICA6ICdLb3DEk3QnLAoJJ0N1dCcgICAgICAgICAgICAgICAgICAgICA6ICdJemdyaWV6dCcsCgknUGFzdGUnICAgICAgICAgICAgICAgICAgIDogJ0lldmlldG90JywKCSdQYXN0ZSBvbmx5IHRleHQnICAgICAgICAgOiAnSWV2aWV0b3QgdGlrYWkgdGVrc3R1JywKCSdQYXN0ZSBmb3JtYXR0ZWQgdGV4dCcgICAgOiAnSWV2aWV0b3QgZm9ybWF0xJN0dSB0ZWtzdHUnLAoJJ0NsZWFuIGZvcm1hdCcgICAgICAgICAgICA6ICdBdGNlbHQgZm9ybWF0xJPFoWFudScsIAoJJ1VuZG8gbGFzdCBhY3Rpb24nICAgICAgICA6ICdBdGNlbHQgcMSTZMSTam8gZGFyYsSrYnUnLAoJJ1JlZG8gcHJldmlvdXMgYWN0aW9uJyAgICA6ICdBdGvEgXJ0b3QgcMSTZMSTam8gZGFyYsSrYnUnLAoJJ0JvbGQnICAgICAgICAgICAgICAgICAgICA6ICdUcmVrbnJha3N0cycsCgknSXRhbGljJyAgICAgICAgICAgICAgICAgIDogJ1NsxKtwcmFrc3RzJywKCSdVbmRlcmxpbmUnICAgICAgICAgICAgICAgOiAnUGFzdsSrdHJvdHMnLAoJJ1N0cmlrZXRocm91Z2gnICAgICAgICAgICA6ICdJenN2xKt0cm90cycsCgknU3VwZXJzY3JpcHQnICAgICAgICAgICAgIDogJ0F1Z8WhcmFrc3RzJywKCSdTdWJzY3JpcHQnICAgICAgICAgICAgICAgOiAnQXBha8WhcmFrc3RzJywKCSdBbGlnbiBsZWZ0JyAgICAgICAgICAgICAgOiAnSXpsxKtkemluxIF0IHBhIGtyZWlzbyBtYWx1JywKCSdBaWxnbiByaWdodCcgICAgICAgICAgICAgOiAnSXpsxKtkemluxIF0IHBhIGxhYm8gbWFsdScsCgknQWxpZ24gY2VudGVyJyAgICAgICAgICAgIDogJ0NlbnRyxJN0JywKCSdBbGlnbiBmdWxsJyAgICAgICAgICAgICAgOiAnSXpsxKtkemluxIF0IHBhIG1hbMSBbScsCgknRm9udCBjb2xvcicgICAgICAgICAgICAgIDogJ8WgcmlmdGEga3LEgXNhJywKCSdCYWNrZ3JvdW5kIGNvbG9yJyAgICAgICAgOiAnRm9uYSBrcsSBc2EnLAoJJ0luZGVudCcgICAgICAgICAgICAgICAgICA6ICdQYWxpZWxpbsSBdCBhdGvEgXBpJywKCSdPdXRkZW50JyAgICAgICAgICAgICAgICAgOiAnU2FtYXppbsSBdCBhdGvEgXBpJywKCSdGb3JtYXQnICAgICAgICAgICAgICAgICAgOiAnRm9ybWF0xJPFoWFuYScsCgknRm9udCBzaXplJyAgICAgICAgICAgICAgIDogJ8WgcmlmdGEgbGllbHVtcycsCgknRm9udCcgICAgICAgICAgICAgICAgICAgIDogJ8WgcmlmdHMnLAoJJ09yZGVyZWQgbGlzdCcgICAgICAgICAgICA6ICdOdW11csSTdHMgc2FyYWtzdHMnLAoJJ1Vub3JkZXJlZCBsaXN0JyAgICAgICAgICA6ICdOZW51bXVyxJN0cyBzYXJha3N0cycsCgknSG9yaXpvbnRhbCBydWxlJyAgICAgICAgIDogJ0hvcml6b250xIFsxIEgbMSrbmlqYScsCgknQmxvY2txdW90ZScgICAgICAgICAgICAgIDogJ0NpdMSBdHMnLAoJJ0Jsb2NrIGVsZW1lbnQgKERJViknICAgICA6ICdCbG9rYSBlbGVtZW50cyAoRElWKScsCgknTGluaycgICAgICAgICAgICAgICAgICAgIDogJ1NhaXRlJywKCSdEZWxldGUgbGluaycgICAgICAgICAgICAgOiAnRHrEk3N0IHNhaXRpJywKCSdCb29rbWFyaycgICAgICAgICAgICAgICAgOiAnR3LEgW1hdHrEq21lJywKCSdJbWFnZScgICAgICAgICAgICAgICAgICAgOiAnQXR0xJNscycsCgknVGFibGUnICAgICAgICAgICAgICAgICAgIDogJ1RhYnVsYScsCgknRGVsZXRlIHRhYmxlJyAgICAgICAgICAgIDogJ0R6xJNzdCB0YWJ1bHUnLAoJJ0luc2VydCByb3cgYmVmb3JlJyAgICAgICA6ICdJZXZpZXRvdCByaW5kdSBwaXJtcycsCgknSW5zZXJ0IHJvdyBhZnRlcicgICAgICAgIDogJ0lldmlldG90IHJpbmR1IHDEk2MnLAoJJ0RlbGV0ZSByb3cnICAgICAgICAgICAgICA6ICdEesSTc3QgcmluZHUnLAoJJ0luc2VydCBjb2x1bW4gYmVmb3JlJyAgICA6ICdJZXZpZXRvdCBrb2xvbm51IHBpcm1zJywKCSdJbnNlcnQgY29sdW1uIGFmdGVyJyAgICAgOiAnSWV2aWV0b3Qga29sb25udSBwxJNjJywKCSdEZWxldGUgY29sdW1uJyAgICAgICAgICAgOiAnRHrEk3N0IGtvbG9ubnUnLAoJJ01lcmdlIHRhYmxlIGNlbGxzJyAgICAgICA6ICdBcHZpZW5vdCBhaWxlcycsCgknU3BsaXQgdGFibGUgY2VsbCcgICAgICAgIDogJ1NhZGFsxKt0IGFpbGknLAoJJ1RvZ2dsZSBkaXNwbGF5IGRvY3VtZW50IHN0cnVjdHVyZScgOiAnUsSBZMSrdCBkb2t1bWVudGEgc3RydWt0xatydS9uZXJlZHphbW9zIGVsZW1lbnR1cycsCgknVGFibGUgY2VsbCBwcm9wZXJ0aWVzJyAgIDogJ0FpbGVzIGllc3RhdMSranVtaScsCgknVGFibGUgcHJvcGVydGllcycgICAgICAgIDogJ1RhYnVsYXMgaWVzdGF0xKtqdW1pJywKCSdUb2dnbGUgZnVsbCBzY3JlZW4gbW9kZScgOiAnUGlsbnMgZWtyxIFucycsCgknT3BlbiBmaWxlIG1hbmFnZXInICAgICAgIDogJ0F0dsSTcnQgZmFpbHUgcMSBcnZhbGRuaWVrdScsCgknTm9uIGJyZWFrYWJsZSBzcGFjZScgICAgIDogJ05lcMSBcnRyYXVrdMSBIGF0c3RhcnBlJywKCSdTdG9wIGVsZW1lbnQgZmxvYXRpbmcnICAgOiAnQXRzbMSTZ3QgZWxlbWVudHUgYXBrbMSBxaFhbnUgYXIgdGVrc3R1JywKCS8vIGRpYWxvZ3MKCSdXYXJuaW5nJyA6ICdVem1hbsSrYnUnLAoJJ1Byb3BlcmllcycgOiAnSWVzdGF0xKtqdW1pJywKCSdQb3B1cCcgOiAnSmF1bnMgbG9ncycsCgknQWR2YW5jZWQnIDogJ1BhcGlsZHVzJywKCSdFdmVudHMnIDogJ05vdGlrdW1pJywKCSdXaWR0aCcgOiAnUGxhdHVtcycsCgknSGVpZ2h0JyA6ICdBdWdzdHVtcycsCgknTGVmdCcgICA6ICdQYSBrcmVzaScsCgknQ2VudGVyJyA6ICdQYSBjZW50cnUnLAoJJ1JpZ2h0JyAgOiAnUGEgbGFiaScsCgknQm9yZGVyJyA6ICdNYWxhJywKCSdCYWNrZ3JvdW5kJyA6ICdGb25zJywKCSdDc3MgY2xhc3MnIDogJ0NzcyBrbGFzZScsCgknQ3NzIHN0eWxlJyA6ICdDc3Mgc3RpbHMnLAoJJ05vJyA6ICdOxJMnLAoJJ1RpdGxlJyA6ICdWaXJzcmFrc3RzJywKCSdTY3JpcHQgZGlyZWN0aW9uJyA6ICdWxJNzdHVsZXMgdmlyemllbnMnLAoJJ0xhbmd1YWdlJyA6ICdWYWxvZGEnLAoJJ0NoYXJzZXQnIDogJ0tvZMSTanVtcycsCgknTm90IHNldCcgOiAnTmF2IHV6c3TEgWTEq+KAoHMnLAoJJ0xlZnQgdG8gcmlnaHQnIDogJ05vIGtyZWlzxIFzIHV6IGxhYm8nLAoJJ1JpZ2h0IHRvIGxlZnQnIDogJ05vIGxhYsSBcyB1eiBrcmVpc28nLAoJJ0luIHRoaXMgd2luZG93JyA6ICdEb3RhasSBIGxvZ8SBJywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJyA6ICdKYXVuxIEgbG9nxIEgKF9ibGFuayknLAoJJ0luIG5ldyBwYXJlbnQgd2luZG93IChfcGFyZW50KScgOiAnVmVjxIFrdSBsb2fEgSAoX3BhcmVudCknLAoJJ0luIHRvcCBmcmFtZSAoX3RvcCknIDogJ0F1Z8WhxJNqxIEgcsSBbcSrIChfdG9wKScsCgknVVJMJyA6ICdVUkwnLAoJJ09wZW4gaW4nIDogJ0F0dsSTcnQnLAoJJ09wZW4gZmlsZSBtYW5nZXInIDogJ0F0dsSTcnQgZmFpbHUgcMSBcnZhbGRuaWVrdScsCgkvLyBjb3B5CgknVGhpcyBvcGVyYXRpb24gaXMgZGlzYWJsZWQgaW4geW91ciBicm93c2VyIG9uIHNlY3VyaXR5IHJlYXNvbi4gVXNlIHNob3J0Y3V0IGluc3RlYWQuJyA6ICdEb3TEgSBkYXJixKtiYSBqxatzdSBwxIFybMWra2FtIGlyIGxpZWd0YSBzYWlzdMSrYsSBIGFyIGRyb8WhxKtiYXMgYXNwZWt0aWVtLiBJem1hbnRvamlldCB0YXVzdGnFhnUga29tYmluxIFjaWp1LicsCgkvLyBmb3JtYXQgCgknSGVhZGluZyAxJyA6ICdWaXJzcmFrc3RzIDEnLAoJJ0hlYWRpbmcgMicgOiAnVmlyc3Jha3N0cyAyJywKCSdIZWFkaW5nIDMnIDogJ1ZpcnNyYWtzdHMgMycsCgknSGVhZGluZyA0JyA6ICdWaXJzcmFrc3RzIDQnLAoJJ0hlYWRpbmcgNScgOiAnVmlyc3Jha3N0cyA1JywKCSdIZWFkaW5nIDYnIDogJ1ZpcnNyYWtzdHMgNicsCQoJJ1BhcmFncmFwaCcgOiAnUGFyYWdyxIFmcycsCgknQWRkcmVzcycgOiAnQWRyZXNlJywKCSdQcmVmb3JtYXR0ZWQnIDogJycsCgkvLyBmb250IHNpemUKCSdTbWFsbCAoOHB0KScgICA6ICdTxKtrcyAoOHB0KScsCgknU21hbGwgKDEwcHgpJyAgOiAnTWF6cyAoMTBweCknLAoJJ1NtYWxsICgxMnB0KScgIDogJ05lbGllbHMgKDEycHQpJywKCSdOb3JtYWwgKDE0cHQpJyA6ICdQYXJhc3RzICgxNHB0KScsCgknTGFyZ2UgKDE4cHQpJyAgOiAnTGllbHMgKDE4cHQpJywKCSdMYXJnZSAoMjRwdCknICA6ICfEu290aSBsaWVscygyNHB0KScsCgknTGFyZ2UgKDM2cHQpJyAgOiAnTWlsesSrZ3MgKDM2cHQpJywJCQkJCgkvLyBib29rbWFyawoJJ0Jvb2ttYXJrIG5hbWUnIDogJ0dyxIFtYXR6xKttZXMgdsSBcmRzJywKCS8vIGxpbmsKCSdMaW5rIFVSTCcgOiAnU2FpdGVzIGFkcmVzZSAoVVJMKScsCgknVGFyZ2V0JyA6ICdNxJNyxLdpcycsCgknU2VsZWN0IGJvb2ttYXJrJyA6ICdJenbEk2zEk3RpZXMgZ3LEgW1hdHrEq21pJywKCSdPcGVuIGxpbmsgaW4gcG9wdXAgd2luZG93JyA6ICdBdHbEk3J0IHNhaXRpIGphdW7EgSBsb2fEgScsCgknVVJMJyA6ICdVUkwnLAoJJ1dpbmRvdyBuYW1lJyA6ICdMb2dhIG5vc2F1a3VtcycsCgknV2luZG93IHNpemUnIDogJ0xvZ2EgaXptxJNycycsCgknV2luZG93IHBvc2l0aW9uJyA6ICdMb2dhIHBvesSrY2lqYScsCgknTG9jYXRpb24gYmFyJyA6ICdWaWV0YXMgcGFuZWxpcycsCgknTWVudSBiYXInIDogJ0l6dsSTbG5lcyBwYW5lbGlzJywKCSdUb29sYmFyJyA6ICdJbnN0cnVtZW50dSBwYW5lbGlzJywKCSdTY3JvbGxiYXJzJyA6ICdSaXRqb3NsYXMnLAoJJ1N0YXR1cyBiYXInIDogJ1N0xIF2b2vEvGEgcGFuZWxpcycsCgknUmVzaXphYmxlJyA6ICdJem3Ek3JhIGl6bWFpxYZhcycsCgknRGVwZWRlbnQnIDogJ0F0a2FyxKtncyAoTmV0c2NhcGUpJywKCSdBZGQgcmV0dXJuIGZhbHNlJyA6ICdQaWV2aWVub3QgKHJldHVybiBmYWxzZSknLAoJJ1RhcmdldCBNSU1FIHR5cGUnIDogJ01JTUUgdHlwZSBtxJNyxLdpJywKCSdSZWxhdGlvbnNoaXAgcGFnZSB0byB0YXJnZXQgKHJlbCknIDogJ0xhcGFzIGF0dGllY8SrYmFhIHByZXQgbcSTcsS3aSAocmVsKScsCgknUmVsYXRpb25zaGlwIHRhcmdldCB0byBwYWdlIChyZXYpJyA6ICdNxJNyxLdhIGF0dGllY8SrYmEgcHJldCBsYXB1IChyZXYpJywKCSdUYWIgaW5kZXgnIDogJycsCgknQWNjZXNzIGtleScgOiAnUGllZWphcyB0YXVzdGnFhsWhJywKCS8vIGltYWdlCgknU2l6ZScgOiAnSXptxJNycycsCgknUHJldmlldycgOiAnUHJpZWvFoXNrYXRzJywKCSdNYXJnaW5zJyA6ICdBdGvEgXBlcycsCgknQWx0IHRleHQnIDogJ0FwcmFrc3RhIHRla3N0cycsCgknSW1hZ2UgVVJMJyA6ICdCaWxkZXMgVVJMJywKCS8vIHRhYmxlCgknU3BhY2luZycgICAgICAgOiAnQXRzdGFycGUnLAoJJ1BhZGRpbmcnICAgICAgIDogJ0F0a8SBcGUnLAoJJ1Jvd3MnICAgICAgICAgIDogJ1JpbmRhcycsCgknQ29sdW1ucycgICAgICAgOiAnS29sb25uYXMnLAoJJ0dyb3VwcycgICAgICAgIDogJ0dydXBhcycsCgknQ2VsbHMnICAgICAgICAgOiAnQWlsZXMnLAoJJ0NhcHRpb24nICAgICAgIDogJ1RhYnVsYXMgdmlyc3Jha3N0cycsCgknSW5uZXIgYm9yZGVycycgOiAnSWVrxaHEk2rEgXMgcm9iZcW+YXMnLAoJLy8gdGFibGUgY2VsbAoJJ1RhYmxlIGNlbGwgdHlwZScgOiAnVGFidWxhcyBhaWxlcyB0aXBzJywKCSdEYXRhJyA6ICdEYXRpJywKCSdIZWFkZXInIDogJ1ZpcnNyYWtzdHMnLAoJJ0p1c3RpZnknIDogJ1BhIG1hbMSBbScsCgknUGFkZGluZ3MnIDogJ0F0a8SBcGVzJywKCSdBcHBseSB0bycgOiAnUGllbGlldG90IHV6JywKCSdDdXJyZW50IGNlbGwnIDogJ0l6dsSTbMSTdMSBIGFpbGUnLAoJJ0FsbCBjZWxscyBpbiByb3cnIDogJ1Zpc2FzIHJpbmRhcyBhaWxlcycsCgknQWxsIGNlbGxzIGluIGNvbHVtbicgOiAnVmlzYXMgc3RhYmnFhmEgYWlsZXMnLAoJJ0FsbCBjZWxscyBpbiB0YWJsZScgOiAnVmlzYXMgdGFidWxhcyBhaWxlcycKfQp9KShqUXVlcnkpOwo=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.nl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIER1dGNoIHRyYW5zbGF0aW9uCiAqIEBhdXRob3IgS3VydCBBZXJ0cwogKiBAbGluayBodHRwOi8vaWxhYnNvbHV0aW9ucy5uZXQvCiAqIEB2ZXJzaW9uIDIwMTAtMDktMTgKICovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS5pMThNZXNzYWdlcy5ubCA9IHsKCSdFZGl0b3InIDogJ0VkaXRvcicsCgknU291cmNlJyA6ICdCcm9uY29kZScsCi8vIFBhbmVsIG5hbWVzCgknQ29weSAvIFBhc2UnIDogJ0tvcGllZWVyIC8gUGxha2tlbicsCgknVW5kbyAvIFJlZG8nIDogJ09uZ2VkYWFuIG1ha2VuIC8gSGVyaGFsZW4gdHlwZW4nLAoJJ1RleHQgc3R5bGVzJyA6ICdUZWtzdCBzdGlqbGVuJywKCSdDb2xvcnMnOiAnS2xldXJlbjonLAoJJ0FsaWdubWVudCc6ICdBbGluZWEnLAoJJ0luZGVudCAvIE91dGRlbnQnOiAnJywKCSdUZXh0IGZvcm1hdCc6ICdUZWtzdCBvcG1hYWsnLAoJJ0xpc3RzJzogJ0xpanN0ZW4nLAoJJ01pc2MgZWxlbWVudHMnOiAnJywKCSdMaW5rcyc6ICdMaW5rcycsCgknSW1hZ2VzJzogJ0FmYmVlbGRpbmdlbicsCgknTWVkaWEnOiAnTWVkaWEnLAoJJ1RhYmxlcyc6ICdUYWJlbGxsZW4nLAoJJ0ZpbGUgbWFuYWdlciAoZWxGaW5kZXIpJyA6ICdCZXN0YW5kc21hbmFnZXIgKGVsRmluZGVyKScsCi8vIEJ1dHRvbiBuYW1lcwoJJ0Fib3V0IHRoaXMgc29mdHdhcmUnICAgICA6ICdPdmVyIGRlemUgc29mdHdhcmUnLAoJJ1NhdmUnOiAnT3BzbGFhbicsCgknQ29weSc6ICdLb3BpZWVyJywKCSdDdXQnOiAnS25pcCcsCgknUGFzdGUnOiAnUGxhaycsCgknUGFzdGUgb25seSB0ZXh0JzogJ1BsYWsgYWxsZWVuIHRla3N0JywKCSdQYXN0ZSBmb3JtYXR0ZWQgdGV4dCc6ICdQbGFrIG9wZ2VtYWFrdGUgdGVrc3QnLAoJJ0NsZWFuIGZvcm1hdCc6ICdPcG1hYWsgb3BzY2hvbmVuJywKCSdVbmRvIGxhc3QgYWN0aW9uJzogJ01hYWsgbGFhc3RlIGFjdGllIG9uZ2VkYWFuJywKCSdSZWRvIHByZXZpb3VzIGFjdGlvbic6ICdIZXJkb2UgbGFhdHN0IGdlZGFuZSBhY3RpZScsCgknQm9sZCc6ICdWZXQnLAoJJ0l0YWxpYyc6ICdDdXJzaWVmJywKCSdVbmRlcmxpbmUnOiAnT25kZXJsaWpudCcsCgknU3RyaWtldGhyb3VnaCc6ICdEb29yc3RyZWVwdCcsCgknU3VwZXJzY3JpcHQnOiAnJywKCSdTdWJzY3JpcHQnOiAnJywKCSdBbGlnbiBsZWZ0JzogJ0xpbmtzIHVpdGxpam5lbicsCgknQWlsZ24gcmlnaHQnOiAnUmVjaHRzIHVpdGxpam5lbicsCgknQWxpZ24gY2VudGVyJzogJ0NlbnRyZXJlbicsCgknQWxpZ24gZnVsbCc6ICdVaXR2dWxsZW4nLAoJJ0ZvbnQgY29sb3InOiAnVGVrc3Qga2xldXInLAoJJ0JhY2tncm91bmQgY29sb3InOiAnQWNodGVyZ3JvbmQga2xldXInLAoJJ0luZGVudCc6ICdJbnNwcmluZ2luZyB2ZXJncm90ZW4nLAoJJ091dGRlbnQnOiAnSW5zcHJpbmdpbmcgVmVya2xlaW5lbicsCgknRm9ybWF0JzogJ09wbWFhaycsCgknRm9udCBzaXplJzogJ1Rla3N0IGdyb290dGUnLAoJJ0ZvbnQnOiAnTGV0dGVydHlwZScsCgknT3JkZXJlZCBsaXN0JzogJ0dlb3JkZW5kZSBsaWpzdCcsCgknVW5vcmRlcmVkIGxpc3QnOiAnT25nZW9yZGVuZGUgbGlqc3QnLAoJJ0hvcml6b250YWwgcnVsZSc6ICdIb3Jpem9udGFsZSByZWdlbCcsCgknQmxvY2txdW90ZSc6ICcnLAoJJ0Jsb2NrIGVsZW1lbnQgKERJViknICA6ICcnLAoJJ0xpbmsnOiAnTGluaycsCgknRGVsZXRlIGxpbmsnOiAnVmVyd2lqZGVyIG1vLGwnLAoJJ0Jvb2ttYXJrJzogJycsCgknSW1hZ2UnOiAnQWZiZWVsZGluZycsCgknVGFibGUnOiAnVGFiZWwnLAoJJ0RlbGV0ZSB0YWJsZSc6ICdWZXJ3aWpkZXIgdGFiZWwnLAoJJ0luc2VydCByb3cgYmVmb3JlJzogJ0ludm9lZ2VuIHZvb3IgcmlqJywKCSdJbnNlcnQgcm93IGFmdGVyJzogJ0ludm9lZ2VuIG5hIHJpaicsCgknRGVsZXRlIHJvdyc6ICdWZXJ3aWpkZXIgcmlqJywKCSdJbnNlcnQgY29sdW1uIGJlZm9yZSc6ICdJbnZvZWdlbiB2b29yIGtvbG9tJywKCSdJbnNlcnQgY29sdW1uIGFmdGVyJzogJ0ludm9lZ2VuIG5hIGtvbG9tJywKCSdEZWxldGUgY29sdW1uJzogJ1ZlcndpamRlciBrb2xvbScsCgknTWVyZ2UgdGFibGUgY2VsbHMnOiAnU2FtZW52b2VnZW4gdGFiZWwgY2VsbGVuJywKCSdTcGxpdCB0YWJsZSBjZWxsJzogJycsCgknVG9nZ2xlIGRpc3BsYXkgZG9jdW1lbnQgc3RydWN0dXJlJzogJycsCgknVGFibGUgY2VsbCBwcm9wZXJ0aWVzJzogJycsCgknVGFibGUgcHJvcGVydGllcyc6ICcnLAoJJ1RvZ2dsZSBmdWxsIHNjcmVlbiBtb2RlJyA6ICcodG9nZ2xlKSBWb2xsZWRpZyBzY2hlcm0nLAoJJ09wZW4gZmlsZSBtYW5hZ2VyJyAgICAgICA6ICdPcGVuIGJlc3RhbmRzbWFuYWdlcicsCgknTm9uIGJyZWFrYWJsZSBzcGFjZScgICA6ICcnLAoJJ1N0b3AgZWxlbWVudCBmbG9hdGluZycgOiAnJywKLy8gRGlhbG9ncwoJJ1dhcm5pbmcnOiAnV2FhcnNjaHV3aW5nJywKCSdQcm9wZXJpZXMnOiAnT3B0aWVzJywKCSdQb3B1cCc6ICdQb3B1cCcsCgknQWR2YW5jZWQnOiAnR2VhdmFuY2VlcmQnLAoJJ0V2ZW50cyc6ICdFdmVudHMnLAoJJ1dpZHRoJzogJ0JyZWVkdGUnLAoJJ0hlaWdodCc6ICdIb29ndGUnLAoJJ0xlZnQnICAgOiAnTGlua3MnLAoJJ0NlbnRlcicgOiAnTWlkZGVuJywKCSdSaWdodCcgIDogJ1JlY2h0cycsCgknQm9yZGVyJzogJ0JvcmRlcicsCgknQmFja2dyb3VuZCc6ICdBY2h0ZXJncm9uZCcsCgknQ3NzIGNsYXNzJzogJ0NzcyBDbGFzcycsCgknQ3NzIHN0eWxlJzogJ0NzcyBzdHlsZScsCgknTm8nOiAnTmVlJywKCSdUaXRsZSc6ICdUaXRlbCcsCgknU2NyaXB0IGRpcmVjdGlvbic6ICcnLAoJJ0xhbmd1YWdlJzogJ1RhYWwnLAoJJ0NoYXJzZXQnOiAnQ2hhcnNldCcsCgknTm90IHNldCc6ICdOaWV0IGdlemV0JywKCSdMZWZ0IHRvIHJpZ2h0JzogJ0xpbmtzIG5hYXIgcmVjaHRzJywKCSdSaWdodCB0byBsZWZ0JzogJ1JlY2h0cyBuYWFyIGxpbmsnLAoJJ0luIHRoaXMgd2luZG93JzogJ0luIGRpdCB2ZW5zdGVyJywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJzogJ0luIG5pZXV3IHZlbnN0ZXIgKF9ibGFuayknLAoJJ0luIG5ldyBwYXJlbnQgd2luZG93IChfcGFyZW50KSc6ICdJbiBuZXcgcGFyZW50IHdpbmRvdyAoX3BhcmVudCknLAoJJ0luIHRvcCBmcmFtZSAoX3RvcCknOiAnSW4gdG9wIGZyYW1lIChfdG9wKScsCgknVVJMJzonJywKCSdPcGVuIGluJzogJ09wZW4gaW4nLAovLyBDb3B5CgknVGhpcyBvcGVyYXRpb24gaXMgZGlzYWJsZWQgaW4geW91ciBicm93c2VyIG9uIHNlY3VyaXR5IHJlYXNvbi4gVXNlIHNob3J0Y3V0IGluc3RlYWQuICcgOiAnRGV6ZSBvcGVyYXRpZSBpcyB1aXRnZXNjaGFrZWxkIGluIGpvdSBicm93c2VyIHZvb3IgYmV2ZWlsaWdpbmdzIHJlZGVuZW4uIEdlYnJ1aWsgZGUgc25lbGtvcHBlbGluZy4nLAovLyBGb3JtYXQKCSdIZWFkaW5nIDEnIDogJycsCgknSGVhZGluZyAyJyA6ICcnLAoJJ0hlYWRpbmcgMycgOiAnJywKCSdIZWFkaW5nIDQnIDogJycsCgknSGVhZGluZyA1JyA6ICcnLAoJJ0hlYWRpbmcgNicgOiAnJywKCSdQYXJhZ3JhcGgnIDogJycsCgknQWRkcmVzcycgOiAnJywKCSdQcmVmb3JtYXR0ZWQnOicnLAovLyBGb250IHNpemUKCSdTbWFsbCAoOHB0KSc6ICdLbGVpbnN0ICg4cHQpJywKCSdTbWFsbCAoMTBweCknOiAnS2xlaW5lciAoMTBweCknLAoJJ1NtYWxsICgxMnB0KSc6ICdLbGVpbiAoMTJwdCknLAoJJ05vcm1hbCAoMTRwdCknOiAnTm9ybWFhbCAoMTRwdCknLAoJJ0xhcmdlICgxOHB0KSc6ICdHcm9vdCAoMThwdCknLAoJJ0xhcmdlICgyNHB0KSc6ICdHcm90ZXIgKDI0cHQpJywKCSdMYXJnZSAoMzZwdCknOiAnR3Jvb3RzdCAoMzZwdCknLAovLyBCb29rbWFyawoJJ0Jvb2ttYXJrIG5hbWUnOiAnJywKLy8gTGluawoJJ0xpbmsgVVJMJzogJycsCgknVGFyZ2V0JzogJ0RvZWwnLAoJJ1NlbGVjdCBib29rbWFyaycgOiAnJywKCSdPcGVuIGxpbmsgaW4gcG9wdXAgd2luZG93JzogJycsCgknVVJMJzonJywKCSdXaW5kb3cgbmFtZSc6ICdWZW5zdGVyIG5hYW0nLAoJJ1dpbmRvdyBzaXplJzogJ1ZlbnN0ZXIgZ3Jvb3R0ZScsCgknV2luZG93IHBvc2l0aW9uJzogJ1ZlbnN0ZXIgUG9zaXRpZScsCgknT3BlbiBsaW5rIGluIHBvcHVwIHdpbmRvdyc6ICdPcGVuIGxpbmsgaW4gZWVuIHBvcHVwIGVuc3RlcicsCgknTG9jYXRpb24gYmFyJzogJ0xvY2F0aWUgYmFsaycsCgknTWVudSBiYXInOiAnTWVudSBiYWxrJywKCSdUb29sYmFyJzogJ1Rvb2xiYXInLAoJJ1Njcm9sbGJhcnMnOiAnU2Nyb2xsYmFyJywKCSdTdGF0dXMgYmFyJzogJ1N0YXR1cyBiYWxrJywKCSdSZXNpemFibGUnOiAnU2NoYWFsYmFhcicsCgknRGVwZWRlbnQnOiAnJywKCSdBZGQgcmV0dXJuIGZhbHNlJzogJycsCgknVGFyZ2V0IE1JTUUgdHlwZSc6ICcnLAoJJ1JlbGF0aW9uc2hpcCBwYWdlIHRvIHRhcmdldCAocmVsKSc6ICcnLAoJJ1JlbGF0aW9uc2hpcCB0YXJnZXQgdG8gcGFnZSAocmV2KSc6ICcnLAoJJ1RhYiBpbmRleCc6JycsCgknQWNjZXNzIGtleSc6ICcnLAovLyBJbWFnZQoJJ1NpemUnOiAnR3Jvb3R0ZScsCgknUHJldmlldyc6ICdWb29yYmVlbGQnLAoJJ01hcmdpbnMnOiAnJywKCSdBbHQgdGV4dCc6ICdBbHQgdGVrc3QnLAoJJ0ltYWdlIFVSTCc6ICdBZmJlZWxkaW5nIFVSTCcsCi8vIFRhYmxlCgknU3BhY2luZycgICAgICAgOiAnJywKCSdQYWRkaW5nJyAgICAgICA6ICcnLAoJJ1Jvd3MnICAgICAgICAgIDogJycsCgknQ29sdW1ucycgICAgICAgOiAnJywKCSdHcm91cHMnICAgICAgICA6ICcnLAoJJ0NlbGxzJyAgICAgICAgIDogJycsCgknQ2FwdGlvbicgICAgICAgOiAnJywKCSdJbm5lciBib3JkZXJzJyA6ICcnICwKCS8vIHRhYmxlIGNlbGwKCSdUYWJsZSBjZWxsIHR5cGUnIDogJycsCgknRGF0YScgOiAnJywKCSdIZWFkZXInIDogJycsCgknSnVzdGlmeScgOiAnJywKCSdQYWRkaW5ncycgOiAnJywKCSdBcHBseSB0bycgOiAnVG9lcGFzc2VuIG9wJywKCSdDdXJyZW50IGNlbGwnIDogJ0h1aWRpZ2UgY2VsbCcsCgknQWxsIGNlbGxzIGluIHJvdycgOiAnQWxsZSBjZWxsZW4gaW4gcmlqJywKCSdBbGwgY2VsbHMgaW4gY29sdW1uJyA6ICdBbGxlIGNlbGxlbiBpbiBrb2xvbScsCgknQWxsIGNlbGxzIGluIHRhYmxlJyA6ICdBbGxlIGNlbGxlbiBpbiB0YWJlbCcsCgkvLyBhYm91dAoJJ0Fib3V0IGVsUlRFJyA6ICdPdmVyIGVsUlRFJywKCSdWZXJzaW9uJyA6ICdWZXJzaWUnLAoJJ0xpY2VuY2UnIDogJ0xpY2VudGllJywKCSdlbFJURSBpcyBhbiBvcGVuLXNvdXJjZSBKYXZhU2NyaXB0IGJhc2VkIFdZU0lXWUcgSFRNTC1lZGl0b3IuJyA6ICdlbFJURSBpcyBlZW4gb3Blbi1zb3VyY2UgSmF2YXNjcmlwdCBnZWJhc3NlZXJkIFdZU0lXWUcgSFRNTC1lZGl0b3IuJywKCSdNYWluIGdvYWwgb2YgdGhlIGVkaXRvciAtIHNpbXBsaWZ5IHdvcmsgd2l0aCB0ZXh0IGFuZCBmb3JtYXRpbmcgKEhUTUwpIG9uIHNpdGVzLCBibG9ncywgZm9ydW1zIGFuZCBvdGhlciBvbmxpbmUgc2VydmljZXMuJyA6ICdIb29mZGRvZWwgdmFuIGRlIGVkaXRvciAtIFNpbXBlbCB3ZWtyZW4gbWV0IHRla3N0IGVuIG9wbWFhayAoSFRNTCkgb3Agd2Vic2l0ZXMsIGZvcnVtcyBlbiBhbmRlcmUgb25saW5lIGRpZW5zdGVuLicsCgknWW91IGNhbiB1c2UgaXQgaW4gYW55IGNvbW1lcmNpYWwgb3Igbm9uLWNvbW1lcmNpYWwgcHJvamVjdHMuJyA6ICdKZSBrYW4gaGV0IGdlYnJ1aWtlbiBpbiBjb21tZXJjaWVsZSBlbiBuaWV0IGNvbW1lcmljaWVsZSBwcm9qZWN0ZW4uJywKCSdBdXRob3JzJyA6ICdBdXRldXJzJywKCSdDaGllZiBkZXZlbG9wZXInIDogJycsCgknRGV2ZWxvcGVyLCB0ZWNoIHN1cHBvcnQnIDogJycsCgknSW50ZXJmYWNlIGRlc2lnbmVyJyA6ICcnLAoJJ1NwYW5pc2ggbG9jYWxpemF0aW9uJyA6ICcnLAoJJ0phcGFuZXNlIGxvY2FsaXphdGlvbicgOiAnJywKCSdMYXR2aWFuIGxvY2FsaXphdGlvbicgOiAnJywKCSdHZXJtYW4gbG9jYWxpemF0aW9uJyA6ICcnLAoJJ1VrcmFuaWFuIGxvY2FsaXphdGlvbicgOiAnJywKCSdGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHNvZnR3YXJlIHZpc2l0IHRoZScgOiAnVm9vciBtZWVyIGluZm9ybWF0aWUgb3ZlciBkZXplIHNvZnR3YXJlIGJlem9layBkZScsCgknZWxSVEUgd2Vic2l0ZScgOiAnJwp9Owp9KShqUXVlcnkpOwo=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.pl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFBvbGlzaCB0cmFuc2xhdGlvbgogKiBAYXV0aG9yIEFuZHJ6ZWogQm9yb3dpY3oKICogQHZlcnNpb24gMjAxMC0wOS0xOAogKi8KKGZ1bmN0aW9uKCQpIHsKZWxSVEUucHJvdG90eXBlLmkxOE1lc3NhZ2VzLnBsID0gewoJJ0VkaXRvcicgOiAnRWR5dG9yJywKCSdTb3VyY2UnIDogJ0tvZCDFunLDs2TFgm93eScsCgkvLyBQYW5lbCBOYW1lCgknQ29weS9QYXNlJyAgICAgIDogJ0tvcGl1ai9Xa2xlaicsCgknVW5kby9SZWRvJyAgICAgIDogJ0NvZm5pai9Qb27Ds3cnLAoJJ1RleHQgc3R5bGVzJyAgICA6ICdTdHlsZSB0ZWtzdG93ZScsCgknQ29sb3JzJyAgICAgICAgIDogJ0tvbG9yJywKCSdBbGlnbm1lbnQnICAgICAgOiAnV3lyw7N3bmFuaWUnLAoJJ0luZGVudC9PdXRkZW50JyA6ICdXY2nEmWNpZSAvIHd5c3luacSZY2llJywKCSdUZXh0IGZvcm1hdCcgICAgOiAnRm9ybWF0JywKCSdMaXN0cycgICAgICAgICAgOiAnTGlzdGEnLAoJJ01pc2MgZWxlbWVudHMnICA6ICdJbm5lIGVsZW1lbnR5JywKCSdMaW5rcycgICAgICAgICAgOiAnTGluaycsCgknSW1hZ2VzJyAgICAgICAgIDogJ09icmF6JywKCSdNZWRpYScgICAgICAgICAgOiAnUGxpa2kgbXVsdGltZWRpYWxuZScsCgknVGFibGVzJyAgICAgICAgIDogJ1RhYmVsYScsCgknRmlsZSBtYW5hZ2VyIChlbEZpbmRlciknIDogJ01lbmFkxbxlciBwbGlrw7N3IChlbEZpbmRlciknLAoJLy8gYnV0dG9uIG5hbWVzCgknU2F2ZScgICAgICAgICAgICAgICAgICAgIDogJ1phcGlzeicsCgknQ29weScgICAgICAgICAgICAgICAgICAgIDogJ1d5dG5paicsCgknQ3V0JyAgICAgICAgICAgICAgICAgICAgIDogJ0tvcGl1aicsCgknUGFzdGUnICAgICAgICAgICAgICAgICAgIDogJ1drbGVqJywKCSdQYXN0ZSBvbmx5IHRleHQnICAgICAgICAgOiAnV2tsZWogdHlsa28gdGVrc3QnLAoJJ1Bhc3RlIGZvcm1hdHRlZCB0ZXh0JyAgICA6ICdXa2xlaiB0ZWtzdCBzZm9ybWF0b3dhbnknLAoJJ0NsZWFuIGZvcm1hdCcgICAgICAgICAgICA6ICdXeWN6ecWbxIcgZm9ybWF0eScsIAoJJ1VuZG8gbGFzdCBhY3Rpb24nICAgICAgICA6ICdDb2ZuaWonLAoJJ1JlZG8gcHJldmlvdXMgYWN0aW9uJyAgICA6ICdQb27Ds3cnLAoJJ0JvbGQnICAgICAgICAgICAgICAgICAgICA6ICdQb2dyw7NiaWVuaWUnLAoJJ0l0YWxpYycgICAgICAgICAgICAgICAgICA6ICdLdXJzeXdhJywKCSdVbmRlcmxpbmUnICAgICAgICAgICAgICAgOiAnUG9ka3JlxZtsZW5pZScsCgknU3RyaWtldGhyb3VnaCcgICAgICAgICAgIDogJ1ByemVrcmXFm2xlbmllJywKCSdTdXBlcnNjcmlwdCcgICAgICAgICAgICAgOiAnSW5kZXggZ8Ozcm55JywKCSdTdWJzY3JpcHQnICAgICAgICAgICAgICAgOiAnaW5kZXggZG9sbnknLAoJJ0FsaWduIGxlZnQnICAgICAgICAgICAgICA6ICdXeXLDs3duYW5pZSBkbyBsZXdlaicsCgknQWlsZ24gcmlnaHQnICAgICAgICAgICAgIDogJ1d5csOzd25hbmllIGRvIHByYXdlaicsCgknQWxpZ24gY2VudGVyJyAgICAgICAgICAgIDogJ1d5Y2VudHJvd2FuaWUnLAoJJ0FsaWduIGZ1bGwnICAgICAgICAgICAgICA6ICdXeWp1c3Rvd2FuaWUnLAoJJ0ZvbnQgY29sb3InICAgICAgICAgICAgICA6ICdLb2xvciBjemNpb25raScsCgknQmFja2dyb3VuZCBjb2xvcicgICAgICAgIDogJ0tvbG9yIHTFgmEnLAoJJ0luZGVudCcgICAgICAgICAgICAgICAgICA6ICdXY2nEmWNpZScsIAoJJ091dGRlbnQnICAgICAgICAgICAgICAgICA6ICdXeXN1bmnEmWNpZScsIAoJJ0Zvcm1hdCcgICAgICAgICAgICAgICAgICA6ICdGb3JtYXQnLAoJJ0ZvbnQgc2l6ZScgICAgICAgICAgICAgICA6ICdSb3ptaWFyIGN6Y2lvbmtpJywKCSdGb250JyAgICAgICAgICAgICAgICAgICAgOiAnQ3pjaW9ua2EnLAoJJ09yZGVyZWQgbGlzdCcgICAgICAgICAgICA6ICdMaXN0YSBudW1lcm93YW5hJywKCSdVbm9yZGVyZWQgbGlzdCcgICAgICAgICAgOiAnTGlzdGEnLAoJJ0hvcml6b250YWwgcnVsZScgICAgICAgICA6ICdMaW5pYSBwb3ppb21hZScsCgknQmxvY2txdW90ZScgICAgICAgICAgICAgIDogJ0N5dGF0JywKCSdCbG9jayBlbGVtZW50IChESVYpJyAgICAgOiAnRWxlbWVudCBibG9rb3d5IChESVYpJywKCSdMaW5rJyAgICAgICAgICAgICAgICAgICAgOiAnTGluaycsCgknRGVsZXRlIGxpbmsnICAgICAgICAgICAgIDogJ1VzdcWEIGxpbmsnLAoJJ0Jvb2ttYXJrJyAgICAgICAgICAgICAgICA6ICdXc3Rhdy9ldHl0dWoga290d2ljxJknLAoJJ0ltYWdlJyAgICAgICAgICAgICAgICAgICA6ICdPYnJheicsCgknVGFibGUnICAgICAgICAgICAgICAgICAgIDogJ1RhYmVsYScsCgknRGVsZXRlIHRhYmxlJyAgICAgICAgICAgIDogJ1NrYXN1aiBUYWJlbMSZJywKCSdJbnNlcnQgcm93IGJlZm9yZScgICAgICAgOiAnV3N0YXcgd2llcnMgcHJ6ZWQnLAoJJ0luc2VydCByb3cgYWZ0ZXInICAgICAgICA6ICdXc3RhdyB3aWVycyBwbycsCgknRGVsZXRlIHJvdycgICAgICAgICAgICAgIDogJ1NrYXN1aiB3aWVyc3onLAoJJ0luc2VydCBjb2x1bW4gYmVmb3JlJyAgICA6ICdXc3RhdyBrb2x1bW7EmSBTcGFsdGUgcHJ6ZWQnLAoJJ0luc2VydCBjb2x1bW4gYWZ0ZXInICAgICA6ICdXc3RhdyBrb2x1bW7EmSBwbycsCgknRGVsZXRlIGNvbHVtbicgICAgICAgICAgIDogJ1NrYXN1aiBrb2x1bW7EmScsCgknTWVyZ2UgdGFibGUgY2VsbHMnICAgICAgIDogJ1BvxYLEhWN6IGtvbcOzcmtpJywKCSdTcGxpdCB0YWJsZSBjZWxsJyAgICAgICAgOiAnUm96xYLEhWN6IGtvbcOzcmtpJywKCSdUb2dnbGUgZGlzcGxheSBkb2N1bWVudCBzdHJ1Y3R1cmUnIDogJ1Bva2HFvCBibG9raScsCgknVGFibGUgY2VsbCBwcm9wZXJ0aWVzJyAgIDogJ1fFgmHFm2Npd2/Fm2NpIGtvbcOzcmtpJywKCSdUYWJsZSBwcm9wZXJ0aWVzJyAgICAgICAgOiAnV8WCYcWbY2l3b8WbY2kgdGFiZWxpJywKCSdUb2dnbGUgZnVsbCBzY3JlZW4gbW9kZScgOiAnUGXFgm55IGVrcmFuJywKCSdPcGVuIGZpbGUgbWFuYWdlcicgICAgICAgOiAnTWVuYWTFumVyIHBsaWvDs3cnLAoJJ05vbiBicmVha2FibGUgc3BhY2UnICAgICA6ICdUd2FyZGEgc3BhY2phJywKCSdTdG9wIGVsZW1lbnQgZmxvYXRpbmcnICAgOiAnV3nFgsSFY3ogb3RhY3phbmllIGVsZW1lbnTDs3cnLAoJLy8gZGlhbG9ncwoJJ1dhcm5pbmcnIDogJ09zdHJ6ZcW8ZW5pZScsCgknUHJvcGVyaWVzJyA6ICdXxYJhxZtjaXdvxZtjaScsCgknUG9wdXAnIDogJ29raWVua28gUG9wLXVwJywKCSdBZHZhbmNlZCcgOiAnV2nEmWNlaicsCgknRXZlbnRzJyA6ICdXeWRhcnplbmlhJywKCSdXaWR0aCcgOiAnU3plcm9rb8WbxIcnLAoJJ0hlaWdodCcgOiAnV3lzb2tvxZvEhycsCgknTGVmdCcgICA6ICdMZXd5JywKCSdDZW50ZXInIDogJ0NlbnRydW0nLAoJJ1JpZ2h0JyAgOiAnUHJhd3knLAoJJ0JvcmRlcicgOiAnUmFta2EnLAoJJ0JhY2tncm91bmQnIDogJ0tvbG9yIHTFgmEnLAoJJ0NzcyBjbGFzcycgOiAna2xhc2EgQ3NzJywKCSdDc3Mgc3R5bGUnIDogJ3N0eWwgQ3NzJywKCSdObycgOiAnTmllJywKCSdUaXRsZScgOiAnVHl0dcWCJywKCSdTY3JpcHQgZGlyZWN0aW9uJyA6ICdLb21lbnRhcnogc2t0eXB0dScsCgknTGFuZ3VhZ2UnIDogJ0rEmXp5aycsCgknQ2hhcnNldCcgOiAnU3Ryb25hIGtvZG93YScsCgknTm90IHNldCcgOiAnbmljJywKCSdMZWZ0IHRvIHJpZ2h0JyA6ICdaIGxld2VqIGRvIHByYXdlaicsCgknUmlnaHQgdG8gbGVmdCcgOiAnWiBwcmF3ZWogZG8gbGV3ZWonLAoJJ0luIHRoaXMgd2luZG93JyA6ICdUbyBzYW1vIG9rbm8gKF9zZWxmKScsCgknSW4gbmV3IHdpbmRvdyAoX2JsYW5rKScgOiAnTm93ZSBva25vIChfYmxhbmspJywKCSdJbiBuZXcgcGFyZW50IHdpbmRvdyAoX3BhcmVudCknIDogJ09rbm8gbmFkcnrEmWRuZSAoX3BhcmVudCknLAoJJ0luIHRvcCBmcmFtZSAoX3RvcCknIDogJ0fDs3JuYSByYW1rYSAoX3RvcCknLAoJJ1VSTCcgOiAnJywKCSdPcGVuIGluJyA6ICdPdHfDs3J6IHcnLAoJLy8gY29weQoJJ1RoaXMgb3BlcmF0aW9uIGlzIGRpc2FibGVkIGluIHlvdXIgYnJvd3NlciBvbiBzZWN1cml0eSByZWFzb24uIFVzZSBzaG9ydGN1dCBpbnN0ZWFkLicgOiAnVGEgb3BlcmFjamEgamVzdCB6YWJyb25pb25hIHcgdHdvamVqIHByemVnbMSFZGFyY2UgeiBwb3dvZHUgemFiZXpwaWVjemXFhC4gUG9taW1vIHRvIG1vxbxlc3ogdcW8eXdhxIcga2xhd2lzenkgc2tyw7N0w7N3LicsCgkvLyBmb3JtYXQgCgknSGVhZGluZyAxJyA6ICdOYWfFgsOzd2VrIDEnLAoJJ0hlYWRpbmcgMicgOiAnTmFnxYLDs3dlayAyJywKCSdIZWFkaW5nIDMnIDogJ05hZ8WCw7N3ZWsgMycsCgknSGVhZGluZyA0JyA6ICdOYWfFgsOzd2VrIDQnLAoJJ0hlYWRpbmcgNScgOiAnTmFnxYLDs3dlayA1JywKCSdIZWFkaW5nIDYnIDogJ05hZ8WCw7N3ZWsgNicsCQoJJ1BhcmFncmFwaCcgOiAnUGFyYWdyYWYnLAoJJ0FkZHJlc3MnIDogJ0FkZHJlc3NlJywKCSdQcmVmb3JtYXR0ZWQnIDogJycsCgkvLyBmb250IHNpemUKCSdTbWFsbCAoOHB0KScgICA6ICdNYcWCeSAoOHB0KScsCgknU21hbGwgKDEwcHgpJyAgOiAnTWHFgnkgKDEwcHQpJywKCSdTbWFsbCAoMTJwdCknICA6ICdNYcWCeSAoMTJwdCknLAoJJ05vcm1hbCAoMTRwdCknIDogJ8WacmVkbmkgKDE0cHQpJywKCSdMYXJnZSAoMThwdCknICA6ICdEdcW8eSAoMThwdCknLAoJJ0xhcmdlICgyNHB0KScgIDogJ0R1xbx5ICgyNHB0KScsCgknTGFyZ2UgKDM2cHQpJyAgOiAnRHXFvHkgKDM2cHQpJywJCQkJCgkvLyBib29rbWFyawoJJ0Jvb2ttYXJrIG5hbWUnIDogJ05hendhIGtvdHdpY3knLAoJLy8gbGluawoJJ0xpbmsgVVJMJyA6ICcoVVJMKScsCgknVGFyZ2V0JyA6ICdDZWwnLAoJJ09wZW4gbGluayBpbiBwb3B1cCB3aW5kb3cnIDogJ090d8OzcnogbGluayB3IG5vd3ltIG9rbmllJywKCSdVUkwnIDogJycsCgknV2luZG93IG5hbWUnIDogJ09raWVua28gUG9wLXVwIE5hendhJywKCSdXaW5kb3cgc2l6ZScgOiAnUm96bWlhcicsCgknV2luZG93IHBvc2l0aW9uJyA6ICdQb3p5Y2phJywKCSdMb2NhdGlvbiBiYXInIDogJ3Bhc2VrIGFkcmVzdScsCgknTWVudSBiYXInIDogJ1Bhc2VrIG1lbnUnLAoJJ1Rvb2xiYXInIDogJ1Bhc2VrIG5hcnrEmWR6aScsCgknU2Nyb2xsYmFycycgOiAnUGFza2kgcHJ6ZXdpamFuaWEnLAoJJ1N0YXR1cyBiYXInIDogJ3Bhc2VrIHN0YXR1c3knLAoJJ1Jlc2l6YWJsZScgOiAnWm1pYW5hIHJvem1pYXJ1IG9rbmEnLAoJJ0RlcGVkZW50JyA6ICdaYWxlxbxuZSAoTmV0c2NhcGUpJywKCSdBZGQgcmV0dXJuIGZhbHNlJyA6ICdkb2RhaiAocmV0dXJuIGZhbHNlKScsCgknVGFyZ2V0IE1JTUUgdHlwZScgOiAnTUlNRSB0eXBlJywKCSdSZWxhdGlvbnNoaXAgcGFnZSB0byB0YXJnZXQgKHJlbCknIDogJ1phbGXFvG5vxZtjIHN0cm9ueSBkbyBjZWx1IChyZWwpJywKCSdSZWxhdGlvbnNoaXAgdGFyZ2V0IHRvIHBhZ2UgKHJldiknIDogJ1phbGXFvG5vxZtjIHN0cm9ueSBkbyBzdHJvbnkgKHJldiknLAoJJ1RhYiBpbmRleCcgOiAnSW5kZXggdGFiJywKCSdBY2Nlc3Mga2V5JyA6ICdLbGF3aXN6IGRvc3RlcHUnLAoJLy8gaW1hZ2UKCSdTaXplJyA6ICdSb3ptaWFyJywKCSdQcmV2aWV3JyA6ICdQb2RnbMSFZCcsCgknTWFyZ2lucycgOiAnTWFyZ2luZXN5JywKCSdBbHQgdGV4dCcgOiAnVGV4dCBhbHRlcm5hdHl3bnknLAoJJ0ltYWdlIFVSTCcgOiAnVVJMJywKCS8vIHRhYmxlCgknU3BhY2luZycgICAgICAgOiAnRHlzdGFucyAoc3BhY2luZyknLAoJJ1BhZGRpbmcnICAgICAgIDogJ0R5c3RhbnMgKHBhZGRpbmcpJywKCSdSb3dzJyAgICAgICAgICA6ICdXaWVyc3onLAoJJ0NvbHVtbnMnICAgICAgIDogJ0tvbHVtbmEnLAoJJ0dyb3VwcycgICAgICAgIDogJ0dydXBhJywKCSdDZWxscycgICAgICAgICA6ICdLb23Ds3JraScsCgknQ2FwdGlvbicgICAgICAgOiAnTGVnZW5kYScsCgknSW5uZXIgYm9yZGVycycgOiAnV2V3bsSZdHJ6bmUgcmFta2knCgkKCQp9Cn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.ru.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogUnVzc2lhbiB0cmFuc2xhdGlvbgogKiBAYXV0aG9yIERtaXRyeSBMZXZhc2hvdiA8ZGlvQHN0ZDQyLnJ1PgogKiBAdmVyc2lvbiAyMDEwLTA5LTIwCiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuaTE4TWVzc2FnZXMucnUgPSB7CgknRWRpdG9yJyA6ICfQoNC10LTQsNC60YLQvtGAJywKCSdTb3VyY2UnIDogJ9CY0YHRhdC+0LTQvdC40LonLAoJLy8g0L3QsNC30LLQsNC90LjRjyDQv9Cw0L3QtdC70LXQuQoJJ0NvcHkvUGFzZScgICAgICA6ICfQmtC+0L/QuNGA0L7QstCw0L3QuNC1L9CS0YHRgtCw0LLQutCwJywKCSdVbmRvL1JlZG8nICAgICAgOiAn0J7RgtC80LXQvdCwL9Cf0L7QstGC0L7RgCDQtNC10LnRgdGC0LLQuNGPJywKCSdUZXh0IHN0eWxlcycgICAgOiAn0KHRgtC40LvQuCDRgtC10LrRgdGC0LAnLAoJJ0NvbG9ycycgICAgICAgICA6ICfQptCy0LXRgtCwJywKCSdBbGlnbm1lbnQnICAgICAgOiAn0JLRi9GA0LDQstC90LjQstCw0L3QuNC1JywKCSdJbmRlbnQvT3V0ZGVudCcgOiAn0J7RgtGB0YLRg9C/0YsnLAoJJ1RleHQgZm9ybWF0JyAgICA6ICfQpNC+0YDQvNCw0YLQuNGA0L7QstCw0L3QuNC1JywKCSdMaXN0cycgICAgICAgICAgOiAn0KHQv9C40YHQutC4JywKCSdNaXNjIGVsZW1lbnRzJyAgOiAn0KDQsNC30L3Ri9C1INGN0LvQtdC80LXQvdGC0YsnLAoJJ0xpbmtzJyAgICAgICAgICA6ICfQodGB0YvQu9C60LgnLAoJJ0ltYWdlcycgICAgICAgICA6ICfQmNC30L7QsdGA0LDQttC10L3QuNGPJywKCSdNZWRpYScgICAgICAgICAgOiAnTWVkaWEg0YTQsNC50LvRiycsCgknVGFibGVzJyAgICAgICAgIDogJ9Ci0LDQsdC70LjRhtGLJywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAn0KTQsNC50LvQvtCy0YvQuSDQvNC10L3QtdC00LbQtdGAIChlbEZpbmRlciknLAoJLy8g0L3QsNC30LLQsNC90LjRjyDQutC90L7Qv9C+0LoKCSdBYm91dCB0aGlzIHNvZnR3YXJlJyAgICAgOiAn0J4g0L/RgNC+0LPRgNCw0LzQvNC1JywKCSdTYXZlJyAgICAgICAgICAgICAgICAgICAgOiAn0KHQvtGF0YDQsNC90LjRgtGMJywKCSdDb3B5JyAgICAgICAgICAgICAgICAgICAgOiAn0JrQvtC/0LjRgNC+0LLQsNGC0YwnLAoJJ0N1dCcgICAgICAgICAgICAgICAgICAgICA6ICfQktGL0YDQtdC30LDRgtGMJywKCSdQYXN0ZScgICAgICAgICAgICAgICAgICAgOiAn0JLRgdGC0LDQstC40YLRjCcsCgknUGFzdGUgb25seSB0ZXh0JyAgICAgICAgIDogJ9CS0YHRgtCw0LLQuNGC0Ywg0YLQvtC70YzQutC+INGC0LXQutGB0YInLAoJJ1Bhc3RlIGZvcm1hdHRlZCB0ZXh0JyAgICA6ICfQktGB0YLQsNCy0LjRgtGMINGE0L7RgNC80LDRgtC40YDQvtCy0LDQvdGL0Lkg0YLQtdC60YHRgicsCgknQ2xlYW4gZm9ybWF0JyAgICAgICAgICAgIDogJ9Cj0LTQsNC70LjRgtGMINGE0L7RgNC80LDRgtC40YDQvtCy0LDQvdC40LUnLCAKCSdVbmRvIGxhc3QgYWN0aW9uJyAgICAgICAgOiAn0J7RgtC80LXQvdC40YLRjCDQtNC10LnRgdGC0LLQuNC1JywKCSdSZWRvIHByZXZpb3VzIGFjdGlvbicgICAgOiAn0J/QvtCy0YLQvtGA0LjRgtGMINC00LXQudGB0YLQstC40LUgJywKCSdCb2xkJyAgICAgICAgICAgICAgICAgICAgOiAn0JbQuNGA0L3Ri9C5JywKCSdJdGFsaWMnICAgICAgICAgICAgICAgICAgOiAn0JrRg9GA0YHQuNCyJywKCSdVbmRlcmxpbmUnICAgICAgICAgICAgICAgOiAn0J/QvtC00YfQtdGA0LrQvdGD0YLRi9C5JywKCSdTdHJpa2V0aHJvdWdoJyAgICAgICAgICAgOiAn0J/QtdGA0LXRh9C10YDQutC90YPRgtGL0LknLAoJJ1N1cGVyc2NyaXB0JyAgICAgICAgICAgICA6ICfQndCw0LTRgdGC0YDQvtGH0L3Ri9C5INGC0LXQutGB0YInLAoJJ1N1YnNjcmlwdCcgICAgICAgICAgICAgICA6ICfQn9C+0LTRgdGC0YDQvtGH0L3Ri9C5INGC0LXQutGB0YInLAoJJ0FsaWduIGxlZnQnICAgICAgICAgICAgICA6ICfQktGL0YDQvtCy0L3Rj9GC0Ywg0L3QsNC70LXQstC+JywKCSdBaWxnbiByaWdodCcgICAgICAgICAgICAgOiAn0JLRi9GA0L7QstC90Y/RgtGMINC90LDQv9GA0LDQstC+JywKCSdBbGlnbiBjZW50ZXInICAgICAgICAgICAgOiAn0JLRi9GA0L7QstC90Y/RgtGMINC/0L4g0YbQtdC90YLRgNGDJywKCSdBbGlnbiBmdWxsJyAgICAgICAgICAgICAgOiAn0JLRi9GA0L7QstC90Y/RgtGMINC/0L4g0LrRgNCw0Y/QvCcsCgknRm9udCBjb2xvcicgICAgICAgICAgICAgIDogJ9Cm0LLQtdGCINGI0YDQuNGE0YLQsCcsCgknQmFja2dyb3VuZCBjb2xvcicgICAgICAgIDogJ9Cm0LLQtdGCINC30LDQu9C40LLQutC4JywKCSdJbmRlbnQnICAgICAgICAgICAgICAgICAgOiAn0KPQstC10LvQuNGH0LjRgtGMINC+0YLRgdGC0YPQvycsCgknT3V0ZGVudCcgICAgICAgICAgICAgICAgIDogJ9Cj0LzQtdC90YzRiNC40YLRjCDQvtGC0YHRgtGD0L8nLAoJJ0Zvcm1hdCcgICAgICAgICAgICAgICAgICA6ICfQpNC+0YDQvNCw0YLQuNGA0L7QstCw0L3QuNC1JywKCSdGb250IHNpemUnICAgICAgICAgICAgICAgOiAn0KDQsNC30LzQtdGAINGI0YDQuNGE0YLQsCcsCgknRm9udCcgICAgICAgICAgICAgICAgICAgIDogJ9Co0YDQuNGE0YInLAoJJ09yZGVyZWQgbGlzdCcgICAgICAgICAgICA6ICfQndGD0LzQtdGA0L7QstCw0L3Ri9C5INGB0L/QuNGB0L7QuicsCgknVW5vcmRlcmVkIGxpc3QnICAgICAgICAgIDogJ9Cd0LXQvdGD0LzQtdGA0L7QstCw0L3Ri9C5INGB0L/QuNGB0L7QuicsCgknSG9yaXpvbnRhbCBydWxlJyAgICAgICAgIDogJ9CT0L7RgNC40LfQvtC90YLQsNC70YzQvdCw0Y8g0LvQuNC90LjRjycsCgknQmxvY2txdW90ZScgICAgICAgICAgICAgIDogJ9Cm0LjRgtCw0YLQsCcsCgknQmxvY2sgZWxlbWVudCAoRElWKScgICAgIDogJ9CR0LvQvtGH0L3Ri9C5INGN0LvQtdC80LXQvdGCIChESVYpJywKCSdMaW5rJyAgICAgICAgICAgICAgICAgICAgOiAn0KHRgdGL0LvQutCwJywKCSdEZWxldGUgbGluaycgICAgICAgICAgICAgOiAn0KPQtNCw0LvQuNGC0Ywg0YHRgdGL0LvQutGDJywKCSdCb29rbWFyaycgICAgICAgICAgICAgICAgOiAn0JfQsNC60LvQsNC00LrQsCcsCgknSW1hZ2UnICAgICAgICAgICAgICAgICAgIDogJ9CY0LfQvtCx0YDQsNC20LXQvdC40LUnLAoJJ1RhYmxlJyAgICAgICAgICAgICAgICAgICA6ICfQotCw0LHQu9C40YbQsCcsCgknRGVsZXRlIHRhYmxlJyAgICAgICAgICAgIDogJ9Cj0LTQsNC70LjRgtGMINGC0LDQsdC70LjRhtGDJywKCSdJbnNlcnQgcm93IGJlZm9yZScgICAgICAgOiAn0JLRgdGC0LDQstC40YLRjCDRgNGP0LQg0LTQvicsCgknSW5zZXJ0IHJvdyBhZnRlcicgICAgICAgIDogJ9CS0YHRgtCw0LLQuNGC0Ywg0YDRj9C0INC/0L7RgdC70LUnLAoJJ0RlbGV0ZSByb3cnICAgICAgICAgICAgICA6ICfQo9C00LDQu9C40YLRjCDRgNGP0LQnLAoJJ0luc2VydCBjb2x1bW4gYmVmb3JlJyAgICA6ICfQktGB0YLQsNCy0LjRgtGMINC60L7Qu9C+0L3QutGDINC00L4nLAoJJ0luc2VydCBjb2x1bW4gYWZ0ZXInICAgICA6ICfQktGB0YLQsNCy0LjRgtGMINC60L7Qu9C+0L3QutGDINC/0L7RgdC70LUnLAoJJ0RlbGV0ZSBjb2x1bW4nICAgICAgICAgICA6ICfQo9C00LDQu9C40YLRjCDQutC+0LvQvtC90LrRgycsCgknTWVyZ2UgdGFibGUgY2VsbHMnICAgICAgIDogJ9Ch0LrQu9C10LjRgtGMINGP0YfQtdC50LrQuCcsCgknU3BsaXQgdGFibGUgY2VsbCcgICAgICAgIDogJ9Cg0LDQt9C00LXQu9C40YLRjCDRj9GH0LXQudC60YMnLAoJJ1RvZ2dsZSBkaXNwbGF5IGRvY3VtZW50IHN0cnVjdHVyZScgOiAn0J/QvtC60LDQt9Cw0YLRjCDRgdGC0YDRg9C60YLRg9GA0YMg0LTQvtC60YPQvNC10L3RgtCwL9C90LXQstC40LTQuNC80YvQtSDRjdC70LXQvNC10L3RgtGLJywKCSdUYWJsZSBjZWxsIHByb3BlcnRpZXMnICAgOiAn0KHQstC+0LnRgdGC0LLQviDRj9GH0LXQudC60LgnLAoJJ1RhYmxlIHByb3BlcnRpZXMnICAgICAgICA6ICfQodCy0L7QudGB0YLQstC+INGC0LDQsdC70LjRhtGLJywKCSdUb2dnbGUgZnVsbCBzY3JlZW4gbW9kZScgOiAn0JLQviDQstC10YHRjCDRjdC60YDQsNC9JywKCSdPcGVuIGZpbGUgbWFuYWdlcicgICAgICAgOiAn0J7RgtC60YDRi9GC0Ywg0YTQsNC50LvQvtCy0YvQuSDQvNC10L3QtdC00LbQtdGAJywKCSdOb24gYnJlYWthYmxlIHNwYWNlJyAgICAgOiAn0J3QtdGA0LDQt9GA0YvQstC90YvQuSDQv9GA0L7QsdC10LsnLAoJJ1N0b3AgZWxlbWVudCBmbG9hdGluZycgICA6ICfQntGC0LrQu9GO0YfQuNGC0Ywg0L7QsdGC0LXQutCw0L3QuNC1INGN0LvQtdC80LXQvdGC0L7QsiDRgtC10LrRgdGC0L7QvCcsCgkvLyBkaWFsb2dzCgknV2FybmluZycgOiAn0JLQvdC40LzQsNC90LjQtScsCgknUHJvcGVyaWVzJyA6ICfQodCy0L7QudGB0YLQstCwJywKCSdQb3B1cCcgOiAn0J3QvtCy0L7QtSDQvtC60L3QvicsCgknQWR2YW5jZWQnIDogJ9CU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdC+JywKCSdFdmVudHMnIDogJ9Ch0L7QsdGL0YLQuNGPJywKCSdXaWR0aCcgOiAn0KjQuNGA0LjQvdCwJywKCSdIZWlnaHQnIDogJ9CS0YvRgdC+0YLQsCcsCgknTGVmdCcgICA6ICfQodC70LXQstCwJywKCSdDZW50ZXInIDogJ9Cf0L4g0YbQtdC90YLRgNGDJywKCSdSaWdodCcgIDogJ9Ch0L/RgNCw0LLQsCcsCgknQm9yZGVyJyA6ICfQkdC+0YDQtNGO0YAnLAoJJ0JhY2tncm91bmQnIDogJ9Ck0L7QvScsCgknQ3NzIGNsYXNzJyA6ICdDc3Mg0LrQu9Cw0YHRgScsCgknQ3NzIHN0eWxlJyA6ICdDc3MgY9GC0LjQu9GMJywKCSdObycgOiAn0J3QtdGCJywKCSdUaXRsZScgOiAn0JfQsNCz0L7Qu9C+0LLQvtC6JywKCSdTY3JpcHQgZGlyZWN0aW9uJyA6ICfQndCw0L/RgNCw0LLQu9C10L3QuNC1INC/0LjRgdGM0LzQsCcsCgknTGFuZ3VhZ2UnIDogJ9Cv0LfRi9C6JywKCSdDaGFyc2V0JyA6ICfQmtC+0LTQuNGA0L7QstC60LAnLAoJJ05vdCBzZXQnIDogJ9Cd0LUg0YPRgdGC0LDQvdC+0LLQu9C10L3QvicsCgknTGVmdCB0byByaWdodCcgOiAn0KHQu9C10LLQviDQvdCw0L/RgNCw0LLQvicsCgknUmlnaHQgdG8gbGVmdCcgOiAn0KHQv9GA0LDQstCwINC90LDQu9C10LLQvicsCgknSW4gdGhpcyB3aW5kb3cnIDogJ9CSINGN0YLQvtC8INC+0LrQvdC1JywKCSdJbiBuZXcgd2luZG93IChfYmxhbmspJyA6ICfQkiDQvdC+0LLQvtC8INC+0LrQvdC1IChfYmxhbmspJywKCSdJbiBuZXcgcGFyZW50IHdpbmRvdyAoX3BhcmVudCknIDogJ9CSINGA0L7QtNC40YLQtdC70YzRgdC60L7QvCDQvtC60L3QtSAoX3BhcmVudCknLAoJJ0luIHRvcCBmcmFtZSAoX3RvcCknIDogJ9CSINCy0LXRgNGF0L3QtdC8INGE0YDQtdC50LzQtSAoX3RvcCknLAoJJ1VSTCcgOiAnJywKCSdPcGVuIGluJyA6ICfQntGC0LrRgNGL0YLRjCcsCgknT3BlbiBmaWxlIG1hbmdlcicgOiAn0J7RgtC60YDRi9GC0Ywg0YTQsNC50LvQvtCy0YvQuSDQvNC10L3QtdC00LbQtdGAJywKCS8vIGNvcHkKCSdUaGlzIG9wZXJhdGlvbiBpcyBkaXNhYmxlZCBpbiB5b3VyIGJyb3dzZXIgb24gc2VjdXJpdHkgcmVhc29uLiBVc2Ugc2hvcnRjdXQgaW5zdGVhZC4nIDogJ9CU0LXQudGB0YLQstC40LUg0LfQsNC/0YDQtdGJ0LXQvdC+INCyINCy0LDRiNC10Lwg0LHRgNCw0YPQt9C10YDQtSDQv9C+INGB0L7QvtCx0YDQsNC20LXQvdC40Y/QvCDQsdC10LfQvtC/0LDRgdGC0L3QvtGB0YLQuC4g0JjRgdC/0L7Qu9GM0LfRg9C50YLQtSDRgdC+0YfQtdGC0LDQvdC40LUg0LrQu9Cw0LLQuNGIJywKCS8vIGZvcm1hdCAKCSdIZWFkaW5nIDEnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiAxJywKCSdIZWFkaW5nIDInIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiAyJywKCSdIZWFkaW5nIDMnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiAzJywKCSdIZWFkaW5nIDQnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiA0JywKCSdIZWFkaW5nIDUnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiA1JywKCSdIZWFkaW5nIDYnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiA2JywJCgknUGFyYWdyYXBoJyA6ICfQn9Cw0YDQsNCz0YDQsNGEJywKCSdBZGRyZXNzJyA6ICfQkNC00YDQtdGBJywKCSdQcmVmb3JtYXR0ZWQnIDogJycsCgkvLyBmb250IHNpemUKCSdTbWFsbCAoOHB0KScgICA6ICfQnNC10LvQutC40LkgKDhwdCknLAoJJ1NtYWxsICgxMHB4KScgIDogJ9Cc0LDQu9C10L3RjNC60LjQuSAoMTBweCknLAoJJ1NtYWxsICgxMnB0KScgIDogJ9Cd0LXQsdC+0LvRjNGI0L7QuSAoMTJwdCknLAoJJ05vcm1hbCAoMTRwdCknIDogJ9Ce0LHRi9GH0L3Ri9C5ICgxNHB0KScsCgknTGFyZ2UgKDE4cHQpJyAgOiAn0JHQvtC70YzRiNC+0LkgKDE4cHQpJywKCSdMYXJnZSAoMjRwdCknICA6ICfQmtGA0YPQv9C90YvQuSAoMjRwdCknLAoJJ0xhcmdlICgzNnB0KScgIDogJ9Ce0LPRgNC+0LzQvdGL0LkgKDM2cHQpJywJCQkJCgkvLyBib29rbWFyawoJJ0Jvb2ttYXJrIG5hbWUnIDogJ9CY0LzRjyDQt9Cw0LrQu9Cw0LTQutC4JywKCS8vIGxpbmsKCSdMaW5rIFVSTCcgOiAn0JDQtNGA0LXRgSDRgdGB0YvQu9C60LggKFVSTCknLAoJJ1RhcmdldCcgOiAn0KbQtdC70YwnLAoJJ1NlbGVjdCBib29rbWFyaycgOiAn0JLRi9Cx0YDQsNGC0Ywg0LfQsNC60LvQsNC00LrRgycsCgknT3BlbiBsaW5rIGluIHBvcHVwIHdpbmRvdycgOiAn0J7RgtC60YDRi9GC0Ywg0YHRgdGL0LvQutGDINCy0L4g0LLRgdC/0LvRi9Cy0LDRjtGJ0LXQvCDQvtC60L3QtScsCgknVVJMJyA6ICcnLAoJJ1dpbmRvdyBuYW1lJyA6ICfQndCw0LfQstCw0L3QuNC1INC+0LrQvdCwJywKCSdXaW5kb3cgc2l6ZScgOiAn0KDQsNC30LzQtdGAINC+0LrQvdCwJywKCSdXaW5kb3cgcG9zaXRpb24nIDogJ9Cf0L7Qt9C40YbQuNGPINC+0LrQvdCwJywKCSdMb2NhdGlvbiBiYXInIDogJ9Cf0LDQvdC10LvRjCDQu9C+0LrQsNGG0LjQuCcsCgknTWVudSBiYXInIDogJ9Cf0LDQvdC10LvRjCDQvNC10L3RjicsCgknVG9vbGJhcicgOiAn0J/QsNC90LXQu9GMINC40L3RgdGC0YDRg9C80LXQvdGC0L7QsicsCgknU2Nyb2xsYmFycycgOiAn0J/QvtC70L7RgdGLINC/0YDQvtC60YDRg9GC0LrQuCcsCgknU3RhdHVzIGJhcicgOiAn0KHRgtGA0L7QutCwINGB0L7RgdGC0L7Rj9C90LjRjycsCgknUmVzaXphYmxlJyA6ICfQmNC30LzQtdC90LXQvdC40LUg0YDQsNC30LzQtdGA0LAnLAoJJ0RlcGVkZW50JyA6ICfQl9Cw0LLQuNGB0LjQvNGL0LkgKE5ldHNjYXBlKScsCgknQWRkIHJldHVybiBmYWxzZScgOiAn0JTQvtCx0LDQstC40YLRjCAocmV0dXJuIGZhbHNlKScsCgknVGFyZ2V0IE1JTUUgdHlwZScgOiAnTUlNRSB0eXBlINGG0LXQu9C4JywKCSdSZWxhdGlvbnNoaXAgcGFnZSB0byB0YXJnZXQgKHJlbCknIDogJ9Ce0YLQvdC+0YjQtdC90LjQtSDRgdGC0YDQsNC90LjRhtGLINC6INGG0LXQu9C4IChyZWwpJywKCSdSZWxhdGlvbnNoaXAgdGFyZ2V0IHRvIHBhZ2UgKHJldiknIDogJ9Ce0YLQvdC+0YjQtdC90LjQtSDRhtC10LvQuCDQuiDRgdGC0YDQsNC90LjRhtC1IChyZXYpJywKCSdUYWIgaW5kZXgnIDogJycsCgknQWNjZXNzIGtleScgOiAn0JrQu9Cw0LLQuNGI0LAg0LTQvtGB0YLRg9C/0LAnLAoJLy8gaW1hZ2UKCSdTaXplJyA6ICfQoNCw0LfQvNC10YAnLAoJJ1ByZXZpZXcnIDogJ9Cf0YDQtdC00LLQsNGA0LjRgtC10LvRjNC90YvQuSDQv9GA0L7RgdC80L7RgtGAJywKCSdNYXJnaW5zJyA6ICfQntGC0YHRgtGD0L/RiycsCgknQWx0IHRleHQnIDogJ9Ce0L/QuNGB0LDQvdC40LUgKEFsdCknLAoJJ0ltYWdlIFVSTCcgOiAnVVJMJywKCS8vIHRhYmxlCgknU3BhY2luZycgICAgICAgOiAn0J/RgNC+0LzQtdC20YPRgtC+0LogKHNwYWNpbmcpJywKCSdQYWRkaW5nJyAgICAgICA6ICfQntGC0YHRgtGD0L8gKHBhZGRpbmcpJywKCSdSb3dzJyAgICAgICAgICA6ICfQodGC0YDQvtC60LgnLAoJJ0NvbHVtbnMnICAgICAgIDogJ9Ca0L7Qu9C+0L3QutC4JywKCSdHcm91cHMnICAgICAgICA6ICfQk9GA0YPQv9C/0YsnLAoJJ0NlbGxzJyAgICAgICAgIDogJ9Cv0YfQtdC50LrQuCcsCgknQ2FwdGlvbicgICAgICAgOiAn0JfQsNCz0L7Qu9C+0LLQvtC6INGC0LDQsdC70LjRhtGLJywKCSdJbm5lciBib3JkZXJzJyA6ICfQktC90YPRgtGA0LXQvdC90LjQuSDQsdC+0YDQtNGO0YAnLAoJLy8gdGFibGUgY2VsbAoJJ1RhYmxlIGNlbGwgdHlwZScgOiAn0KLQuNC/INGP0YfQtdC50LrQuCcsCgknRGF0YScgOiAn0JTQsNC90L3Ri9C1JywKCSdIZWFkZXInIDogJ9CX0LDQs9C+0LvQvtCy0L7QuicsCgknSnVzdGlmeScgOiAn0J/QviDQutGA0LDRj9C8JywKCSdQYWRkaW5ncycgOiAn0J7RgtGB0YLRg9C/0YsnLAoJJ0FwcGx5IHRvJyA6ICfQn9GA0LjQvNC10L3QuNGC0Ywg0LonLAoJJ0N1cnJlbnQgY2VsbCcgOiAn0JLRi9Cx0YDQsNC90L3QsNGPINGP0YfQtdC50LrQsCcsCgknQWxsIGNlbGxzIGluIHJvdycgOiAn0JLRgdC1INGP0YfQtdC50LrQuCDQsiDRgNGP0LTRgycsCgknQWxsIGNlbGxzIGluIGNvbHVtbicgOiAn0JLRgdC1INGP0YfQtdC50LrQuCDQsiDRgdGC0L7Qu9Cx0YbQtScsCgknQWxsIGNlbGxzIGluIHRhYmxlJyA6ICfQktGB0LUg0Y/Rh9C10LnQutC4INGC0LDQsdC70LjRhtGLJywKCS8vIGFib3V0CgknQWJvdXQgZWxSVEUnIDogJ9CeINGA0LXQtNCw0LrRgtC+0YDQtSBlbFJURScsCgknVmVyc2lvbicgOiAn0JLQtdGA0YHQuNGPJywKCSdMaWNlbmNlJyA6ICfQm9C40YbQtdC90LfQuNGPJywKCSdlbFJURSBpcyBhbiBvcGVuLXNvdXJjZSBKYXZhU2NyaXB0IGJhc2VkIFdZU0lXWUcgSFRNTC1lZGl0b3IuJyA6ICdlbFJURSAtINGN0YLQviDRgdCy0L7QsdC+0LTQvdGL0LkgV1lTSVdZRyDRgNC10LTQsNC60YLQvtGAINC00LvRjyDRgdCw0LnRgtC+0LIg0Lgg0YHQuNGB0YLQtdC8INGD0L/RgNCw0LLQu9C10L3QuNGPINC60L7QvdGC0LXQvdGC0L7QvCAoQ01TKSwg0L3QsNC/0LjRgdCw0L3QvdGL0Lkg0L3QsCBKYXZhU2NyaXB0LicsCgknTWFpbiBnb2FsIG9mIHRoZSBlZGl0b3IgLSBzaW1wbGlmeSB3b3JrIHdpdGggdGV4dCBhbmQgZm9ybWF0aW5nIChIVE1MKSBvbiBzaXRlcywgYmxvZ3MsIGZvcnVtcyBhbmQgb3RoZXIgb25saW5lIHNlcnZpY2VzLicgOiAn0J7RgdC90L7QstC90LDRjyDRhtC10LvRjCDRgNC10LTQsNC60YLQvtGA0LAgLSDQvNCw0LrRgdC40LzQsNC70YzQvdC+INGD0L/RgNC+0YHRgtC40YLRjCDRgNCw0LHQvtGC0YMg0YEg0YLQtdC60YHRgtC+0Lwg0Lgg0YDQsNC30LzQtdGC0LrQvtC5IChIVE1MKSDQvdCwINGB0LDQudGC0LDRhSwg0LHQu9C+0LPQsNGFLCDRhNC+0YDRg9C80LDRhSDQuCDQv9GA0L7Rh9C40YUgb25saW5lINGB0LXRgNCy0LjRgdCw0YUuJywKCSdZb3UgY2FuIHVzZSBpdCBpbiBhbnkgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCBwcm9qZWN0cy4nIDogJ9CS0Ysg0LzQvtC20LXRgtC1INC40YHQv9C+0LvRjNC30L7QstCw0YLRjCDQtdCz0L4g0LIg0LvRjtCx0YvRhSDQutC+0LzQvNC10YDRh9C10YHQutC40YUg0Lgg0L3QtdC60L7QvNC80LXRgNGH0LXRgdC60LjRhSDQv9GA0L7QtdC60YLQsNGFLicsCgknQXV0aG9ycycgOiAn0JDQstGC0L7RgNGLJywKCSdDaGllZiBkZXZlbG9wZXInIDogJ9CS0LXQtNGD0YnQuNC5INGA0LDQt9GA0LDQsdC+0YLRh9C40LonLAoJJ0RldmVsb3BlciwgdGVjaCBzdXBwb3J0JyA6ICfQoNCw0LfRgNCw0LHQvtGC0YfQuNC6LCDRgtC10YXQvdC40YfQtdGB0LrQsNGPINC/0L7QtNC00LXRgNC20LrQsCcsCgknRGV2ZWxvcGVyJyA6ICfQoNCw0LfRgNCw0LHQvtGC0YfQuNC6JywKCSdJbnRlcmZhY2UgZGVzaWduZXInIDogJ9CU0LjQt9Cw0LnQvdC10YAg0LjQvdGC0LXRgNGE0LXQudGB0LAnLAoJJ1NwYW5pc2ggbG9jYWxpemF0aW9uJyA6ICfQmNGB0L/QsNC90YHQutCw0Y8g0LvQvtC60LDQu9C40LfQsNGG0LjRjycsCgknQ3plY2ggbG9jYWxpemF0aW9uJyA6ICfQp9C10YjRgdC60LDRjyDQu9C+0LrQsNC70LjQt9Cw0YbQuNGPJywKCSdKYXBhbmVzZSBsb2NhbGl6YXRpb24nIDogJ9Cv0L/QvtC90YHQutCw0Y8g0LvQvtC60LDQu9C40LfQsNGG0LjRjycsCgknTGF0dmlhbiBsb2NhbGl6YXRpb24nIDogJ9Cb0LDRgtGL0YjRgdC60LDRjyDQu9C+0LrQsNC70LjQt9Cw0YbQuNGPJywKCSdHZXJtYW4gbG9jYWxpemF0aW9uJyA6ICfQndC10LzQtdGG0LrQsNGPINC70L7QutCw0LvQuNC30LDRhtC40Y8nLAoJJ1VrcmFuaWFuIGxvY2FsaXphdGlvbicgOiAn0KPQutGA0LDQuNC90YHQutCw0Y8g0LvQvtC60LDQu9C40LfQsNGG0LjRjycsCgknUGVyc2lhbiAoZmFyc2kpIGxvY2FsaXphdGlvbicgOiAn0J/QtdGA0YHQuNC00YHQutCw0Y8gKNGE0LDRgNGB0LgpINC70L7QutCw0LvQuNC30LDRhtC40Y8nLAoJJ0FyYWJpYyBsb2NhbGl6YXRpb24nIDogJ9CQ0YDQsNCx0YHQutCw0Y8g0LvQvtC60LDQu9C40LfQsNGG0LjRjycsCgknUlRMIHN1cHBvcnQnIDogJ9Cf0L7QtNC00LXRgNC20LrQsCBSVEwnLAoJJ0ZyZW5jaCBsb2NhbGl6YXRpb24nIDogJ9Ck0YDQsNC90YbRg9C30YHQutCw0Y8g0LvQvtC60LDQu9C40LfQsNGG0LjRjycsCgknRHV0Y2ggbG9jYWxpemF0aW9uJyA6ICfQk9C+0LvQu9Cw0L3QtNGB0LrQsNGPINC70L7QutCw0LvQuNC30LDRhtC40Y8nLAoJJ0h1bmdhcmlhbiBsb2NhbGl6YXRpb24nIDogJ9CS0LXQvdCz0LXRgNGB0LrQsNGPINC70L7QutCw0LvQuNC30LDRhtC40Y8nLAoJJ1BvbGlzaCBsb2NhbGl6YXRpb24nIDogJ9Cf0L7Qu9GM0YHQutCw0Y8g0LvQvtC60LDQu9C40LfQsNGG0LjRjycsCgknSXRhbGlhbiBsb2NhbGl6YXRpb24nIDogJ9CY0YLQsNC70YzRj9C90YHQutCw0Y8g0LvQvtC60LDQu9C40LfQsNGG0LjRjycsCgknVHJhZGl0aW9uYWwgQ2hpbmVzZSBsb2NhbGl6YXRpb24nIDogJ9Ca0LjRgtCw0LnRgdC60LDRjyAo0YLRgNCw0LTQuNGG0LjQvtC90L3QsNGPKSDQu9C+0LrQsNC70LjQt9Cw0YbQuNGPJywKCSdGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHNvZnR3YXJlIHZpc2l0IHRoZScgOiAn0J/QvtC00YDQvtCx0L3QsNGPINC40L3RhNC+0YDQvNCw0YbQuNGPINC4INGE0L7RgNGD0Lwg0YLQtdGFLiDQv9C+0LTQtNC10YDQttC60LgnLAoJJ2VsUlRFIHdlYnNpdGUnIDogJ9C90LAg0YHQsNC50YLQtSBlbFJURScgCgkKCQp9Cn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.ua.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogVWtyYW5pYW4gdHJhbnNsYXRpb24KICogQGF1dGhvciBBcnRlbSBWYXNpbHlldgogKiBAdmVyc2lvbiAyMDEwLTA5LTE4CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuaTE4TWVzc2FnZXMudWEgPSB7CgknRWRpdG9yJyA6ICfQoNC10LTQsNC60YLQvtGAJywKCSdTb3VyY2UnIDogJ9CU0LbQtdGA0LXQu9C+JywKLy8g0J3QsNC30LLQuCDQv9Cw0L3QtdC70LXQuQoJJ0NvcHkgLyBQYXNlJyA6ICfQmtC+0L/RltGO0LLQsNC90L3RjyAvINCS0YHRgtCw0LLQutCwJywKCSdVbmRvIC8gUmVkbycgOiAn0KHQutCw0YHRg9Cy0LDRgtC4IC8g0J/QvtCy0YLQvtGAINC00ZbRlycsCgknVGV4dCBzdHlsZXMnIDogJ9Ch0YLQuNC70ZYg0YLQtdC60YHRgtGDJywKCSdDb2xvcnMnOiAn0JrQvtC70YzQvtGA0LgnLAoJJ0FsaWdubWVudCc6ICfQktC40YDRltCy0L3RjtCy0LDQvdC90Y8nLAoJJ0luZGVudCAvIE91dGRlbnQnOiAn0JLRltC00YHRgtGD0L/QuCcsCgknVGV4dCBmb3JtYXQnOiAn0KTQvtGA0LzQsNGC0YPQstCw0L3QvdGPJywKCSdMaXN0cyc6ICfQodC/0LjRgdC60LgnLAoJJ01pc2MgZWxlbWVudHMnOiAn0KDRltC30L3RliDQtdC70LXQvNC10L3RgtC4JywKCSdMaW5rcyc6ICfQn9C+0YHQuNC70LDQvdC90Y8nLAoJJ0ltYWdlcyc6ICfQnNCw0LvRjtC90LrQuCcsCgknTWVkaWEnOiAnTWVkaWEg0YTQsNC50LvQuCcsCgknVGFibGVzJzogJ9Ci0LDQsdC70LjRhtGWJywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAn0KTQsNC50LvQvtCy0YvQuSDQvNC10L3QtdC00LbQtdGAIChlbEZpbmRlciknLAovLyDQndCw0LfQstC4INC60L3QvtC/0L7QugoJJ0Fib3V0IHRoaXMgc29mdHdhcmUnICAgICA6ICfQniDQv9GA0L7Qs9GA0LDQvNC80LUnLAoJJ1NhdmUnOiAn0JfQsdC10YDQtdCz0YLQuCcsCgknQ29weSc6ICfQmtC+0L/RltGO0LLQsNGC0LgnLAoJJ0N1dCc6ICfQktC40YDRltC30LDRgtC4JywKCSdQYXN0ZSc6ICfQktGB0YLQsNCy0LjRgtC4JywKCSdQYXN0ZSBvbmx5IHRleHQnOiAn0JLRgdGC0LDQstC40YLQuCDRgtGW0LvRjNC60Lgg0YLQtdC60YHRgicsCgknUGFzdGUgZm9ybWF0dGVkIHRleHQnOiAn0JLRgdGC0LDQstC40YLQuCDRhNC+0YDQvNCw0YLRg9Cy0LDQvdC90Y8g0YLQtdC60YHRgtGDJywKCSdDbGVhbiBmb3JtYXQnOiAn0JLQuNC00LDQu9C40YLQuCDRhNC+0YDQvNCw0YLRg9Cy0LDQvdC90Y8nLAoJJ1VuZG8gbGFzdCBhY3Rpb24nOiAn0KHQutCw0YHRg9Cy0LDRgtC4INC00ZbRjicsCgknUmVkbyBwcmV2aW91cyBhY3Rpb24nOiAn0J/QvtCy0YLQvtGA0LjRgtC4INC00ZbRjicsCgknQm9sZCc6ICfQotC+0LLRgdGC0LjQuScsCgknSXRhbGljJzogJ9Ca0YPRgNGB0LjQsicsCgknVW5kZXJsaW5lJzogJ9Cf0ZbQtNC60YDQtdGB0LvQtdC90LjQuScsCgknU3RyaWtldGhyb3VnaCc6ICfQn9C10YDQtdC60YDQtdGB0LvQtdC90LjQuScsCgknU3VwZXJzY3JpcHQnOiAn0JLQtdGA0YXQvdGW0Lkg0YDQtdCz0ZbRgdGC0YAnLAoJJ1N1YnNjcmlwdCc6ICfQndC40LbQvdGW0Lkg0YDQtdCz0ZbRgdGC0YAnLAoJJ0FsaWduIGxlZnQnOiAn0JLQuNGA0ZbQstC90Y/RgtC4INC70ZbQstC+0YDRg9GHJywKCSdBaWxnbiByaWdodCc6ICfQktC40YDRltCy0L3Rj9GC0Lgg0L/RgNCw0LLQvtGA0YPRhycsCgknQWxpZ24gY2VudGVyJzogJ9CS0LjRgNGW0LLQvdGP0YLQuCDQv9C+INGG0LXQvdGC0YDRgycsCgknQWxpZ24gZnVsbCc6ICfQktC40YDRltCy0L3Rj9GC0Lgg0L/QviDQutGA0LDRj9GFJywKCSdGb250IGNvbG9yJzogJ9Ca0L7Qu9GW0YAg0YLQtdC60YHRgtGDJywKCSdCYWNrZ3JvdW5kIGNvbG9yJzogJ9Ca0L7Qu9GW0YAg0LfQsNC70ZbQutCy0ZYnLAoJJ0luZGVudCc6ICfQl9Cx0ZbQu9GM0YjQuNGC0Lgg0LLRltC00YHRgtGD0L8nLAoJJ091dGRlbnQnOiAn0JfQvNC10L3RiNC40YLQuCDQstGW0LTRgdGC0YPQvycsCgknRm9ybWF0JzogJ9Ck0L7RgNC80LDRgtGD0LLQsNC90L3RjycsCgknRm9udCBzaXplJzogJ9Cg0L7Qt9C80ZbRgCDRiNGA0LjRhNGC0YMnLAoJJ0ZvbnQnOiAn0KjRgNC40YTRgicsCgknT3JkZXJlZCBsaXN0JzogJ9Cd0YPQvNC10YDQvtCy0LDQvdC40Lkg0YHQv9C40YHQvtC6JywKCSdVbm9yZGVyZWQgbGlzdCc6ICfQndC10L3Rg9C80LXRgNC+0LLQsNC90LjQuSDRgdC/0LjRgdC+0LonLAoJJ0hvcml6b250YWwgcnVsZSc6ICfQk9C+0YDQuNC30L7QvdGC0LDQu9GM0L3QsCDQu9GW0L3RltGPJywKCSdCbG9ja3F1b3RlJzogJ9Cm0LjRgtCw0YLQsCcsCgknQmxvY2sgZWxlbWVudCAoRElWKScgIDogJ9CR0LvQvtGH0L3Ri9C5INGN0LvQtdC80LXQvdGCIChESVYpJywKCSdMaW5rJzogJ9Cf0L7RgdC40LvQsNC90L3RjycsCgknRGVsZXRlIGxpbmsnOiAn0JLQuNC00LDQu9C40YLQuCDQv9C+0YHQuNC70LDQvdC90Y8nLAoJJ0Jvb2ttYXJrJzogJ9CX0LDQutC70LDQtNC60LAnLAoJJ0ltYWdlJzogJ9CX0L7QsdGA0LDQttC10L3QvdGPJywKCSdUYWJsZSc6ICfQotCw0LHQu9C40YbRjycsCgknRGVsZXRlIHRhYmxlJzogJ9CS0LjQtNCw0LvQuNGC0Lgg0YLQsNCx0LvQuNGG0Y4nLAoJJ0luc2VydCByb3cgYmVmb3JlJzogJ9CS0YHRgtCw0LLQuNGC0Lgg0YDRj9C0INC00L4nLAoJJ0luc2VydCByb3cgYWZ0ZXInOiAn0JLRgdGC0LDQstC40YLQuCDRgNGP0LQg0L/RltGB0LvRjycsCgknRGVsZXRlIHJvdyc6ICfQktC40LTQsNC70LjRgtC4INGA0Y/QtCcsCgknSW5zZXJ0IGNvbHVtbiBiZWZvcmUnOiAn0JLRgdGC0LDQstC40YLQuCDQutC+0LvQvtC90LrRgyDQtNC+JywKCSdJbnNlcnQgY29sdW1uIGFmdGVyJzogJ9CS0YHRgtCw0LLQuNGC0Lgg0LrQvtC70L7QvdC60YMg0L/RltGB0LvRjycsCgknRGVsZXRlIGNvbHVtbic6ICfQktC40LTQsNC70LjRgtC4INC60L7Qu9C+0L3QutGDJywKCSdNZXJnZSB0YWJsZSBjZWxscyc6ICfRgdC60LvQtdGX0YLQuCDQvtGB0LXRgNC10LTQutGDJywKCSdTcGxpdCB0YWJsZSBjZWxsJzogJ9Cg0L7Qt9C00ZbQu9C40YLQuCDQutC70ZbRgtC40L3QutGDJywKCSdUb2dnbGUgZGlzcGxheSBkb2N1bWVudCBzdHJ1Y3R1cmUnOiAn0J/QvtC60LDQt9Cw0YLQuCDRgdGC0YDRg9C60YLRg9GA0YMg0LTQvtC60YPQvNC10L3RgtCwIC8g0L3QtdCy0LjQtNC40LzRliDQtdC70LXQvNC10L3RgtC4JywKCSdUYWJsZSBjZWxsIHByb3BlcnRpZXMnOiAn0JLQu9Cw0YHRgtC40LLRltGB0YLRjCDQutC70ZbRgtC40L3QutGDJywKCSdUYWJsZSBwcm9wZXJ0aWVzJzogJ9CS0LvQsNGB0YLQuNCy0ZbRgdGC0Ywg0YLQsNCx0LvQuNGG0ZYnLAoJJ1RvZ2dsZSBmdWxsIHNjcmVlbiBtb2RlJyA6ICfQktC+INCy0LXRgdGMINGN0LrRgNCw0L0nLAoJJ09wZW4gZmlsZSBtYW5hZ2VyJyAgICAgICA6ICfQntGC0LrRgNGL0YLRjCDRhNCw0LnQu9C+0LLRi9C5INC80LXQvdC10LTQttC10YAnLAoJJ05vbiBicmVha2FibGUgc3BhY2UnICAgOiAn0J3QtdGA0LDQt9GA0YvQstC90YvQuSDQv9GA0L7QsdC10LsnLAoJJ1N0b3AgZWxlbWVudCBmbG9hdGluZycgOiAn0J7RgtC60LvRjtGH0LjRgtGMINC+0LHRgtC10LrQsNC90LjQtSDRjdC70LXQvNC10L3RgtC+0LIg0YLQtdC60YHRgtC+0LwnLAovL0RpYWxvZ3MKCSdXYXJuaW5nJzogJ9Cj0LLQsNCz0LAnLAoJJ1Byb3Blcmllcyc6ICfQktC70LDRgdGC0LjQstC+0YHRgtGWJywKCSdQb3B1cCc6ICfQndC+0LLQtSDQstGW0LrQvdC+JywKCSdBZHZhbmNlZCc6ICfQkdGW0LvRjNGI0LUnLAoJJ0V2ZW50cyc6ICfQn9C+0LTRltGXJywKCSdXaWR0aCc6ICfQqNC40YDQuNC90LAnLAoJJ0hlaWdodCc6ICfQktC40YHQvtGC0LAnLAoJJ0xlZnQnICAgOiAn0KHQu9C10LLQsCcsCgknQ2VudGVyJyA6ICfQn9C+INGG0LXQvdGC0YDRgycsCgknUmlnaHQnICA6ICfQodC/0YDQsNCy0LAnLAoJJ0JvcmRlcic6ICfQkdC+0YDQtNGO0YAnLAoJJ0JhY2tncm91bmQnOiAn0KTQvtC9JywKCSdDc3MgY2xhc3MnOiAnQ3NzINC60LvQsNGBJywKCSdDc3Mgc3R5bGUnOiAnQ3NzIHN0eWxlJywKCSdObyc6ICfQndGWJywKCSdUaXRsZSc6ICfQl9Cw0LPQvtC70L7QstC+0LonLAoJJ1NjcmlwdCBkaXJlY3Rpb24nOiAn0J3QsNC/0YDQsNCy0LvQtdC90L3RjyDQv9C40YHRjNC80LAnLAoJJ0xhbmd1YWdlJzogJ9Cc0L7QstCwJywKCSdDaGFyc2V0JzogJ9Ca0L7QtNGD0LLQsNC90L3RjycsCgknTm90IHNldCc6ICfQndC1INCy0YHRgtCw0L3QvtCy0LvQtdC90L4nLAoJJ0xlZnQgdG8gcmlnaHQnOiAn0JfQu9GW0LLQsCDQvdCw0L/RgNCw0LLQvicsCgknUmlnaHQgdG8gbGVmdCc6ICfQodC/0YDQsNCy0LAg0L3QsNC70ZbQstC+JywKCSdJbiB0aGlzIHdpbmRvdyc6ICfQoyDRhtGM0L7QvNGDINCy0ZbQutC90ZYnLAoJJ0luIG5ldyB3aW5kb3cgKF9ibGFuayknOiAn0KMg0L3QvtCy0L7QvNGDINCy0ZbQutC90ZYgKF9ibGFuayknLAoJJ0luIG5ldyBwYXJlbnQgd2luZG93IChfcGFyZW50KSc6ICfQoyDQsdCw0YLRjNC60ZbQstGB0YzQutC+0LzRgyDQstGW0LrQvdGWIChfcGFyZW50KScsCgknSW4gdG9wIGZyYW1lIChfdG9wKSc6ICfQoyDQstC10YDRhdC90YzQvtC80YMg0YTRgNC10LnQvNGWIChfdG9wKScsCgknVVJMJzonJywKCSdPcGVuIGluJzogJ9CS0ZbQtNC60YDQuNGC0LgnLAovLyBDb3B5CgknVGhpcyBvcGVyYXRpb24gaXMgZGlzYWJsZWQgaW4geW91ciBicm93c2VyIG9uIHNlY3VyaXR5IHJlYXNvbi4gVXNlIHNob3J0Y3V0IGluc3RlYWQuICcgOiAn0JTRltGPINC30LDQsdC+0YDQvtC90LXQvdC+INGDINCy0LDRiNC+0LzRgyDQsdGA0LDRg9C30LXRgNGWINC3INC80ZbRgNC60YPQstCw0L3RjCDQsdC10LfQv9C10LrQuC4g0JLQuNC60L7RgNC40YHRgtC+0LLRg9C50YLQtSDQutC70LDQstGW0YjRliAnLAovLyBGb3JtYXQKCSdIZWFkaW5nIDEnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiAxJywKCSdIZWFkaW5nIDInIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiAyJywKCSdIZWFkaW5nIDMnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiAzJywKCSdIZWFkaW5nIDQnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiA0JywKCSdIZWFkaW5nIDUnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiA1JywKCSdIZWFkaW5nIDYnIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiA2JywJCgknUGFyYWdyYXBoJyA6ICfQn9Cw0YDQsNCz0YDQsNGEJywKCSdBZGRyZXNzJyA6ICfQkNC00YDQtdGBJywKCSdQcmVmb3JtYXR0ZWQnOicnLAovLyBGb250IHNpemUKCSdTbWFsbCAoOHB0KSc6ICfQlNGA0ZbQsdC90LjQuSAoOHB0KScsCgknU21hbGwgKDEwcHgpJzogJ9Cc0LDQu9C10L3RjNC60LjQuSAoMTBweCknLAoJJ1NtYWxsICgxMnB0KSc6ICfQndC10LLQtdC70LjQutC40LkgKDEycHQpJywKCSdOb3JtYWwgKDE0cHQpJzogJ9CX0LLQuNGH0LDQudC90LjQuSAoMTRwdCknLAoJJ0xhcmdlICgxOHB0KSc6ICfQktC10LvQuNC60LjQuSAoMThwdCknLAoJJ0xhcmdlICgyNHB0KSc6ICfQmtGA0YPQv9C90LjQuSAoMjRwdCknLAoJJ0xhcmdlICgzNnB0KSc6ICfQktC10LvQuNGH0LXQt9C90LjQuSAoMzZwdCknLAovLyBCb29rbWFyawoJJ0Jvb2ttYXJrIG5hbWUnOiAn0IbQvCZyc3F1bzvRjyDQt9Cw0LrQu9Cw0LTQutC4JywKLy8gTGluawoJJ0xpbmsgVVJMJzogJ9CQ0LTRgNC10YHQsCDRgdGB0LjQutC70ZYgKFVSTCknLAoJJ1RhcmdldCc6ICfQnNC10YLQsCcsCgknU2VsZWN0IGJvb2ttYXJrJyA6ICfQktGL0LHRgNCw0YLRjCDQt9Cw0LrQu9Cw0LTQutGDJywKCSdPcGVuIGxpbmsgaW4gcG9wdXAgd2luZG93JzogJ9CS0ZbQtNC60YDQuNGC0Lgg0L/QvtGB0LjQu9Cw0L3QvdGPINGDINGB0L/Qu9C40LLQsNGO0YfQvtC80YMg0LLRltC60L3RlicsCgknVVJMJzonJywKCSdXaW5kb3cgbmFtZSc6ICfQndCw0LfQstCwINCy0ZbQutC90LAnLAoJJ1dpbmRvdyBzaXplJzogJ9Cg0L7Qt9C80ZbRgCDQstGW0LrQvdCwJywKCSdXaW5kb3cgcG9zaXRpb24nOiAn0J/QvtC30LjRhtGW0Y8g0LLRltC60L3QsCcsCgknT3BlbiBsaW5rIGluIHBvcHVwIHdpbmRvdyc6ICfQktGW0LTQutGA0LjRgtC4INC/0L7RgdC40LvQsNC90L3RjyDRgyDRgdC/0LvQuNCy0LDRjtGH0L7QvNGDINCy0ZbQutC90ZYnLAoJJ1dpbmRvdyBuYW1lJzogJ9Cd0LDQt9Cy0LAg0LLRltC60L3QsCcsCgknV2luZG93IHNpemUnOiAn0KDQvtC30LzRltGAINCy0ZbQutC90LAnLAoJJ1dpbmRvdyBwb3NpdGlvbic6ICfQn9C+0LfQuNGG0ZbRjyDQstGW0LrQvdCwJywKCSdMb2NhdGlvbiBiYXInOiAn0J/QsNC90LXQu9GMINC70L7QutCw0YbRltGXJywKCSdNZW51IGJhcic6ICfQn9Cw0L3QtdC70Ywg0LzQtdC90Y4nLAoJJ1Rvb2xiYXInOiAn0J/QsNC90LXQu9GMINGW0L3RgdGC0YDRg9C80LXQvdGC0ZbQsicsCgknU2Nyb2xsYmFycyc6ICfQodC80YPQs9C4INC/0YDQvtC60YDRg9GC0LrQuCcsCgknU3RhdHVzIGJhcic6ICfQoNGP0LTQvtC6INGB0YLQsNC90YMnLAoJJ1Jlc2l6YWJsZSc6ICfQl9C80ZbQvdCwINGA0L7Qt9C80ZbRgNGDJywKCSdEZXBlZGVudCc6ICfQl9Cw0LvQtdC20L3QuNC5IChOZXRzY2FwZSknLAoJJ0FkZCByZXR1cm4gZmFsc2UnOiAn0JTQvtC00LDRgtC4IChyZXR1cm4gZmFsc2UpJywKCSdUYXJnZXQgTUlNRSB0eXBlJzogJ01JTUUgdHlwZSDRhtGW0LvRlicsCgknUmVsYXRpb25zaGlwIHBhZ2UgdG8gdGFyZ2V0IChyZWwpJzogJ9Ch0YLQsNCy0LvQtdC90L3RjyDRgdGC0L7RgNGW0L3QutC4INC00L4g0LzQtdGC0LggKHJlbCkgJywKCSdSZWxhdGlvbnNoaXAgdGFyZ2V0IHRvIHBhZ2UgKHJldiknOiAn0JLRltC00L3QvtGI0LXQvdC90Y8g0LzQtdGC0Lgg0LTQviDRgdGC0L7RgNGW0L3QutC4IChyZXYpJywKCSdUYWIgaW5kZXgnOicnLAoJJ0FjY2VzcyBrZXknOiAn0JrQu9Cw0LLRltGI0LAg0LTQvtGB0YLRg9C/0YMnLAovLyBJbWFnZQoJJ1NpemUnOiAn0KDQvtC30LzRltGAJywKCSdQcmV2aWV3JzogJ9Cf0L7Qv9C10YDQtdC00L3RltC5INC/0LXRgNC10LPQu9GP0LQnLAoJJ01hcmdpbnMnOiAn0JLRltC00YHRgtGD0L/QuCcsCgknQWx0IHRleHQnOiAn0J7Qv9C40YEgKEFsdCknLAoJJ0ltYWdlIFVSTCc6ICdVUkwnLAovLyBUYWJsZQoJJ1NwYWNpbmcnICAgICAgIDogJ9Cf0YDQvtC80ZbQttC+0LogKHNwYWNpbmcpJywKCSdQYWRkaW5nJyAgICAgICA6ICfQktGW0LTRgdGC0YPQvyAocGFkZGluZyknLAoJJ1Jvd3MnICAgICAgICAgIDogJ9Cg0Y/QtNC+0LogJywKCSdDb2x1bW5zJyAgICAgICA6ICfQmtC+0LvQvtC90LrQuCcsCgknR3JvdXBzJyAgICAgICAgOiAn0JPRgNGD0L/Qv9GLJywKCSdDZWxscycgICAgICAgICA6ICfQr9GH0LXQudC60LgnLAoJJ0NhcHRpb24nICAgICAgIDogJ9CX0LDQs9C+0LvQvtCy0L7QuiDRgtCw0LHQu9C40YbRlicsCgknSW5uZXIgYm9yZGVycycgOiAn0JLQvdGD0YLRgNGW0YjQvdGW0Lkg0LHQvtGA0LTRjtGAJyAsCgkvLyB0YWJsZSBjZWxsCgknVGFibGUgY2VsbCB0eXBlJyA6ICfQotC40L8g0Y/Rh9C10LnQutC4JywKCSdEYXRhJyA6ICfQlNCw0L3QvdGL0LUnLAoJJ0hlYWRlcicgOiAn0JfQsNCz0L7Qu9C+0LLQvtC6JywKCSdKdXN0aWZ5JyA6ICfQn9C+INC60YDQsNGP0LwnLAoJJ1BhZGRpbmdzJyA6ICfQntGC0YHRgtGD0L/RiycsCgknQXBwbHkgdG8nIDogJ9Cf0YDQuNC80LXQvdC40YLRjCDQuicsCgknQ3VycmVudCBjZWxsJyA6ICfQktGL0LHRgNCw0L3QvdCw0Y8g0Y/Rh9C10LnQutCwJywKCSdBbGwgY2VsbHMgaW4gcm93JyA6ICfQktGB0LUg0Y/Rh9C10LnQutC4INCyINGA0Y/QtNGDJywKCSdBbGwgY2VsbHMgaW4gY29sdW1uJyA6ICfQktGB0LUg0Y/Rh9C10LnQutC4INCyINGB0YLQvtC70LHRhtC1JywKCSdBbGwgY2VsbHMgaW4gdGFibGUnIDogJ9CS0YHQtSDRj9GH0LXQudC60Lgg0YLQsNCx0LvQuNGG0YsnLAoJLy8gYWJvdXQKCSdBYm91dCBlbFJURScgOiAn0J4g0YDQtdC00LDQutGC0L7RgNC1IGVsUlRFJywKCSdWZXJzaW9uJyA6ICfQktC10YDRgdC40Y8nLAoJJ0xpY2VuY2UnIDogJ9Cb0LjRhtC10L3Qt9C40Y8nLAoJJ2VsUlRFIGlzIGFuIG9wZW4tc291cmNlIEphdmFTY3JpcHQgYmFzZWQgV1lTSVdZRyBIVE1MLWVkaXRvci4nIDogJ2VsUlRFIC0g0Y3RgtC+INGB0LLQvtCx0L7QtNC90YvQuSBXWVNJV1lHINGA0LXQtNCw0LrRgtC+0YAg0LTQu9GPINGB0LDQudGC0L7QsiDQuCDRgdC40YHRgtC10Lwg0YPQv9GA0LDQstC70LXQvdC40Y8g0LrQvtC90YLQtdC90YLQvtC8IChDTVMpLCDQvdCw0L/QuNGB0LDQvdC90YvQuSDQvdCwIEphdmFTY3JpcHQuJywKCSdNYWluIGdvYWwgb2YgdGhlIGVkaXRvciAtIHNpbXBsaWZ5IHdvcmsgd2l0aCB0ZXh0IGFuZCBmb3JtYXRpbmcgKEhUTUwpIG9uIHNpdGVzLCBibG9ncywgZm9ydW1zIGFuZCBvdGhlciBvbmxpbmUgc2VydmljZXMuJyA6ICfQntGB0L3QvtCy0L3QsNGPINGG0LXQu9GMINGA0LXQtNCw0LrRgtC+0YDQsCAtINC80LDQutGB0LjQvNCw0LvRjNC90L4g0YPQv9GA0L7RgdGC0LjRgtGMINGA0LDQsdC+0YLRgyDRgSDRgtC10LrRgdGC0L7QvCDQuCDRgNCw0LfQvNC10YLQutC+0LkgKEhUTUwpINC90LAg0YHQsNC50YLQsNGFLCDQsdC70L7Qs9Cw0YUsINGE0L7RgNGD0LzQsNGFINC4INC/0YDQvtGH0LjRhSBvbmxpbmUg0YHQtdGA0LLQuNGB0LDRhS4nLAoJJ1lvdSBjYW4gdXNlIGl0IGluIGFueSBjb21tZXJjaWFsIG9yIG5vbi1jb21tZXJjaWFsIHByb2plY3RzLicgOiAn0JLRiyDQvNC+0LbQtdGC0LUg0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGMINC10LPQviDQsiDQu9GO0LHRi9GFINC60L7QvNC80LXRgNGH0LXRgdC60LjRhSDQuCDQvdC10LrQvtC80LzQtdGA0YfQtdGB0LrQuNGFINC/0YDQvtC10LrRgtCw0YUuJywKCSdBdXRob3JzJyA6ICfQkNCy0YLQvtGA0YsnLAoJJ0NoaWVmIGRldmVsb3BlcicgOiAn0JLQtdC00YPRidC40Lkg0YDQsNC30YDQsNCx0L7RgtGH0LjQuicsCgknRGV2ZWxvcGVyLCB0ZWNoIHN1cHBvcnQnIDogJ9Cg0LDQt9GA0LDQsdC+0YLRh9C40LosINGC0LXRhdC90LjRh9C10YHQutCw0Y8g0L/QvtC00LTQtdGA0LbQutCwJywKCSdJbnRlcmZhY2UgZGVzaWduZXInIDogJ9CU0LjQt9Cw0LnQvdC10YAg0LjQvdGC0LXRgNGE0LXQudGB0LAnLAoJJ1NwYW5pc2ggbG9jYWxpemF0aW9uJyA6ICfQmNGB0L/QsNC90YHQutCw0Y8g0LvQvtC60LDQu9C40LfQsNGG0LjRjycsCgknSmFwYW5lc2UgbG9jYWxpemF0aW9uJyA6ICfQr9C/0L7QvdGB0LrQsNGPINC70L7QutCw0LvQuNC30LDRhtC40Y8nLAoJJ0xhdHZpYW4gbG9jYWxpemF0aW9uJyA6ICfQm9Cw0YLQstC40LnRgdC60LDRjyDQu9C+0LrQsNC70LjQt9Cw0YbQuNGPJywKCSdHZXJtYW4gbG9jYWxpemF0aW9uJyA6ICfQndC10LzQtdGG0LrQsNGPINC70L7QutCw0LvQuNC30LDRhtC40Y8nLAoJJ1VrcmFuaWFuIGxvY2FsaXphdGlvbicgOiAn0KPQutGA0LDQuNC90YHQutCw0Y8g0LvQvtC60LDQu9C40LfQsNGG0LjRjycsCgknRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzb2Z0d2FyZSB2aXNpdCB0aGUnIDogJ9Cf0L7QtNGA0L7QsdC90LDRjyDQuNC90YTQvtGA0LzQsNGG0LjRjyDQuCDRhNC+0YDRg9C8INGC0LXRhS4g0L/QvtC00LTQtdGA0LbQutC4JywKCSdlbFJURSB3ZWJzaXRlJyA6ICfQvdCwINGB0LDQudGC0LUgZWxSVEUnCn07Cn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.YOUR_LANG.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogV0FSTklORyEgWW91IHRoaXMgZmlsZSBpZiB5b3Ugd2FudCB0byBtYWtlIHlvdXIgb3duIHRyYW5zbGF0aW9uCiAqLwovKgogKiBZT1VSX0xBTkdVQUdFX1RSQU5TTEFUSU9OIHRyYW5zbGF0aW9uCiAqIEBhdXRob3IgTkFNRSA8RU1BSUw+CiAqIEB2ZXJzaW9uIDIwMXgteHgteHgKICovCihmdW5jdGlvbigkKSB7CmVsUlRFLnByb3RvdHlwZS5pMThNZXNzYWdlcy5UV09fTEVUVEVSX0xBTkdfQ09ERSA9IHsKCSdFZGl0b3InIDogJycsCgknU291cmNlJyA6ICcnLAoJLy8gcGFuZWxzIG5hbWVzCgknQ29weS9QYXNlJyAgICAgIDogJycsCgknVW5kby9SZWRvJyAgICAgIDogJycsCgknVGV4dCBzdHlsZXMnICAgIDogJycsCgknQ29sb3JzJyAgICAgICAgIDogJycsCgknQWxpZ25tZW50JyAgICAgIDogJycsCgknSW5kZW50L091dGRlbnQnIDogJycsCgknVGV4dCBmb3JtYXQnICAgIDogJycsCgknTGlzdHMnICAgICAgICAgIDogJycsCgknTWlzYyBlbGVtZW50cycgIDogJycsCgknTGlua3MnICAgICAgICAgIDogJycsCgknSW1hZ2VzJyAgICAgICAgIDogJycsCgknTWVkaWEnICAgICAgICAgIDogJycsCgknVGFibGVzJyAgICAgICAgIDogJycsCgknRmlsZSBtYW5hZ2VyIChlbEZpbmRlciknIDogJycsCgkvLyBidXR0b25zIG5hbWVzCgknQWJvdXQgdGhpcyBzb2Z0d2FyZScgICAgIDogJycsCgknU2F2ZScgICAgICAgICAgICAgICAgICAgIDogJycsCgknQ29weScgICAgICAgICAgICAgICAgICAgIDogJycsCgknQ3V0JyAgICAgICAgICAgICAgICAgICAgIDogJycsCgknUGFzdGUnICAgICAgICAgICAgICAgICAgIDogJycsCgknUGFzdGUgb25seSB0ZXh0JyAgICAgICAgIDogJycsCgknUGFzdGUgZm9ybWF0dGVkIHRleHQnICAgIDogJycsCgknQ2xlYW4gZm9ybWF0JyAgICAgICAgICAgIDogJycsIAoJJ1VuZG8gbGFzdCBhY3Rpb24nICAgICAgICA6ICcnLAoJJ1JlZG8gcHJldmlvdXMgYWN0aW9uJyAgICA6ICcnLAoJJ0JvbGQnICAgICAgICAgICAgICAgICAgICA6ICcnLAoJJ0l0YWxpYycgICAgICAgICAgICAgICAgICA6ICcnLAoJJ1VuZGVybGluZScgICAgICAgICAgICAgICA6ICcnLAoJJ1N0cmlrZXRocm91Z2gnICAgICAgICAgICA6ICcnLAoJJ1N1cGVyc2NyaXB0JyAgICAgICAgICAgICA6ICcnLAoJJ1N1YnNjcmlwdCcgICAgICAgICAgICAgICA6ICcnLAoJJ0FsaWduIGxlZnQnICAgICAgICAgICAgICA6ICcnLAoJJ0FpbGduIHJpZ2h0JyAgICAgICAgICAgICA6ICcnLAoJJ0FsaWduIGNlbnRlcicgICAgICAgICAgICA6ICcnLAoJJ0FsaWduIGZ1bGwnICAgICAgICAgICAgICA6ICcnLAoJJ0ZvbnQgY29sb3InICAgICAgICAgICAgICA6ICcnLAoJJ0JhY2tncm91bmQgY29sb3InICAgICAgICA6ICcnLAoJJ0luZGVudCcgICAgICAgICAgICAgICAgICA6ICcnLAoJJ091dGRlbnQnICAgICAgICAgICAgICAgICA6ICcnLAoJJ0Zvcm1hdCcgICAgICAgICAgICAgICAgICA6ICcnLAoJJ0ZvbnQgc2l6ZScgICAgICAgICAgICAgICA6ICcnLAoJJ0ZvbnQnICAgICAgICAgICAgICAgICAgICA6ICcnLAoJJ09yZGVyZWQgbGlzdCcgICAgICAgICAgICA6ICcnLAoJJ1Vub3JkZXJlZCBsaXN0JyAgICAgICAgICA6ICcnLAoJJ0hvcml6b250YWwgcnVsZScgICAgICAgICA6ICcnLAoJJ0Jsb2NrcXVvdGUnICAgICAgICAgICAgICA6ICcnLAoJJ0Jsb2NrIGVsZW1lbnQgKERJViknICAgICA6ICcnLAoJJ0xpbmsnICAgICAgICAgICAgICAgICAgICA6ICcnLAoJJ0RlbGV0ZSBsaW5rJyAgICAgICAgICAgICA6ICcnLAoJJ0Jvb2ttYXJrJyAgICAgICAgICAgICAgICA6ICcnLAoJJ0ltYWdlJyAgICAgICAgICAgICAgICAgICA6ICcnLAoJJ1RhYmxlJyAgICAgICAgICAgICAgICAgICA6ICcnLAoJJ0RlbGV0ZSB0YWJsZScgICAgICAgICAgICA6ICcnLAoJJ0luc2VydCByb3cgYmVmb3JlJyAgICAgICA6ICcnLAoJJ0luc2VydCByb3cgYWZ0ZXInICAgICAgICA6ICcnLAoJJ0RlbGV0ZSByb3cnICAgICAgICAgICAgICA6ICcnLAoJJ0luc2VydCBjb2x1bW4gYmVmb3JlJyAgICA6ICcnLAoJJ0luc2VydCBjb2x1bW4gYWZ0ZXInICAgICA6ICcnLAoJJ0RlbGV0ZSBjb2x1bW4nICAgICAgICAgICA6ICcnLAoJJ01lcmdlIHRhYmxlIGNlbGxzJyAgICAgICA6ICcnLAoJJ1NwbGl0IHRhYmxlIGNlbGwnICAgICAgICA6ICcnLAoJJ1RvZ2dsZSBkaXNwbGF5IGRvY3VtZW50IHN0cnVjdHVyZScgOiAnJywKCSdUYWJsZSBjZWxsIHByb3BlcnRpZXMnICAgOiAnJywKCSdUYWJsZSBwcm9wZXJ0aWVzJyAgICAgICAgOiAnJywKCSdUb2dnbGUgZnVsbCBzY3JlZW4gbW9kZScgOiAnJywKCSdPcGVuIGZpbGUgbWFuYWdlcicgICAgICAgOiAnJywKCSdOb24gYnJlYWthYmxlIHNwYWNlJyAgICAgOiAnJywKCSdTdG9wIGVsZW1lbnQgZmxvYXRpbmcnICAgOiAnJywKCS8vIGRpYWxvZ3MKCSdXYXJuaW5nJyAgICAgICAgICA6ICcnLAoJJ1Byb3BlcmllcycgICAgICAgIDogJycsCgknUG9wdXAnICAgICAgICAgICAgOiAnJywKCSdBZHZhbmNlZCcgICAgICAgICA6ICcnLAoJJ0V2ZW50cycgICAgICAgICAgIDogJycsCgknV2lkdGgnICAgICAgICAgICAgOiAnJywKCSdIZWlnaHQnICAgICAgICAgICA6ICcnLAoJJ0xlZnQnICAgICAgICAgICAgIDogJycsCgknQ2VudGVyJyAgICAgICAgICAgOiAnJywKCSdSaWdodCcgICAgICAgICAgICA6ICcnLAoJJ0JvcmRlcicgICAgICAgICAgIDogJycsCgknQmFja2dyb3VuZCcgICAgICAgOiAnJywKCSdDc3MgY2xhc3MnICAgICAgICA6ICcnLAoJJ0NzcyBzdHlsZScgICAgICAgIDogJycsCgknTm8nICAgICAgICAgICAgICAgOiAnJywKCSdUaXRsZScgICAgICAgICAgICA6ICcnLAoJJ1NjcmlwdCBkaXJlY3Rpb24nIDogJycsCgknTGFuZ3VhZ2UnICAgICAgICAgOiAnJywKCSdDaGFyc2V0JyAgICAgICAgICA6ICcnLAoJJ05vdCBzZXQnICAgICAgICAgIDogJycsCgknTGVmdCB0byByaWdodCcgICAgOiAnJywKCSdSaWdodCB0byBsZWZ0JyAgICA6ICcnLAoJJ0luIHRoaXMgd2luZG93JyAgIDogJycsCgknSW4gbmV3IHdpbmRvdyAoX2JsYW5rKScgICAgICAgICA6ICcnLAoJJ0luIG5ldyBwYXJlbnQgd2luZG93IChfcGFyZW50KScgOiAnJywKCSdJbiB0b3AgZnJhbWUgKF90b3ApJyAgICAgICAgICAgIDogJycsCgknVVJMJyAgICAgICAgICAgICAgOiAnJywKCSdPcGVuIGluJyAgICAgICAgICA6ICcnLAoJJ09wZW4gZmlsZSBtYW5nZXInIDogJycsCgkvLyBjb3B5CgknVGhpcyBvcGVyYXRpb24gaXMgZGlzYWJsZWQgaW4geW91ciBicm93c2VyIG9uIHNlY3VyaXR5IHJlYXNvbi4gVXNlIHNob3J0Y3V0IGluc3RlYWQuJyA6ICcnLAoJLy8gZm9ybWF0IAoJJ0hlYWRpbmcgMScgICAgIDogJycsCgknSGVhZGluZyAyJyAgICAgOiAnJywKCSdIZWFkaW5nIDMnICAgICA6ICcnLAoJJ0hlYWRpbmcgNCcgICAgIDogJycsCgknSGVhZGluZyA1JyAgICAgOiAnJywKCSdIZWFkaW5nIDYnICAgICA6ICcnLAoJJ1BhcmFncmFwaCcgICAgIDogJycsCgknQWRkcmVzcycgICAgICAgOiAnJywKCSdQcmVmb3JtYXR0ZWQnICA6ICcnLAoJLy8gZm9udCBzaXplCgknU21hbGwgKDhwdCknICAgOiAnJywKCSdTbWFsbCAoMTBweCknICA6ICcnLAoJJ1NtYWxsICgxMnB0KScgIDogJycsCgknTm9ybWFsICgxNHB0KScgOiAnJywKCSdMYXJnZSAoMThwdCknICA6ICcnLAoJJ0xhcmdlICgyNHB0KScgIDogJycsCgknTGFyZ2UgKDM2cHQpJyAgOiAnJywJCQkJCgkvLyBib29rbWFyawoJJ0Jvb2ttYXJrIG5hbWUnIDogJycsCgkvLyBsaW5rCgknTGluayBVUkwnICAgICAgICAgOiAnJywKCSdUYXJnZXQnICAgICAgICAgICA6ICcnLAoJJ1NlbGVjdCBib29rbWFyaycgIDogJycsCgknT3BlbiBsaW5rIGluIHBvcHVwIHdpbmRvdycgOiAnJywKCSdXaW5kb3cgbmFtZScgICAgICA6ICcnLAoJJ1dpbmRvdyBzaXplJyAgICAgIDogJycsCgknV2luZG93IHBvc2l0aW9uJyAgOiAnJywKCSdMb2NhdGlvbiBiYXInICAgICA6ICcnLAoJJ01lbnUgYmFyJyAgICAgICAgIDogJycsCgknVG9vbGJhcicgICAgICAgICAgOiAnJywKCSdTY3JvbGxiYXJzJyAgICAgICA6ICcnLAoJJ1N0YXR1cyBiYXInICAgICAgIDogJycsCgknUmVzaXphYmxlJyAgICAgICAgOiAnJywKCSdEZXBlZGVudCcgICAgICAgICA6ICcnLAoJJ0FkZCByZXR1cm4gZmFsc2UnIDogJycsCgknVGFyZ2V0IE1JTUUgdHlwZScgOiAnJywKCSdSZWxhdGlvbnNoaXAgcGFnZSB0byB0YXJnZXQgKHJlbCknIDogJycsCgknUmVsYXRpb25zaGlwIHRhcmdldCB0byBwYWdlIChyZXYpJyA6ICcnLAoJJ1RhYiBpbmRleCcgICAgICAgIDogJycsCgknQWNjZXNzIGtleScgICAgICAgOiAnJywKCS8vIGltYWdlCgknU2l6ZScgICAgICAgICAgICAgOiAnJywKCSdQcmV2aWV3JyAgICAgICAgICA6ICcnLAoJJ01hcmdpbnMnICAgICAgICAgIDogJycsCgknQWx0IHRleHQnICAgICAgICAgOiAnJywKCSdJbWFnZSBVUkwnICAgICAgICA6ICcnLAoJLy8gdGFibGUKCSdTcGFjaW5nJyAgICAgICAgICA6ICcnLAoJJ1BhZGRpbmcnICAgICAgICAgIDogJycsCgknUm93cycgICAgICAgICAgICAgOiAnJywKCSdDb2x1bW5zJyAgICAgICAgICA6ICcnLAoJJ0dyb3VwcycgICAgICAgICAgIDogJycsCgknQ2VsbHMnICAgICAgICAgICAgOiAnJywKCSdDYXB0aW9uJyAgICAgICAgICA6ICcnLAoJJ0lubmVyIGJvcmRlcnMnICAgIDogJycsCgkvLyB0YWJsZSBjZWxsCgknVGFibGUgY2VsbCB0eXBlJyAgOiAnJywKCSdEYXRhJyAgICAgICAgICAgICA6ICcnLAoJJ0hlYWRlcicgICAgICAgICAgIDogJycsCgknSnVzdGlmeScgICAgICAgICAgOiAnJywKCSdQYWRkaW5ncycgICAgICAgICA6ICcnLAoJJ0FwcGx5IHRvJyAgICAgICAgIDogJycsCgknQ3VycmVudCBjZWxsJyAgICAgOiAnJywKCSdBbGwgY2VsbHMgaW4gcm93JyA6ICcnLAoJJ0FsbCBjZWxscyBpbiBjb2x1bW4nIDogJycsCgknQWxsIGNlbGxzIGluIHRhYmxlJyA6ICcnLAoJLy8gYWJvdXQKCSdBYm91dCBlbFJURScgICAgICAgICAgICAgICAgICA6ICcnLAoJJ1ZlcnNpb24nICAgICAgICAgICAgICAgICAgICAgIDogJycsCgknTGljZW5jZScgICAgICAgICAgICAgICAgICAgICAgOiAnJywKCSdlbFJURSBpcyBhbiBvcGVuLXNvdXJjZSBKYXZhU2NyaXB0IGJhc2VkIFdZU0lXWUcgSFRNTC1lZGl0b3IuJyA6ICcnLAoJJ01haW4gZ29hbCBvZiB0aGUgZWRpdG9yIC0gc2ltcGxpZnkgd29yayB3aXRoIHRleHQgYW5kIGZvcm1hdGluZyAoSFRNTCkgb24gc2l0ZXMsIGJsb2dzLCBmb3J1bXMgYW5kIG90aGVyIG9ubGluZSBzZXJ2aWNlcy4nIDogJycsCgknWW91IGNhbiB1c2UgaXQgaW4gYW55IGNvbW1lcmNpYWwgb3Igbm9uLWNvbW1lcmNpYWwgcHJvamVjdHMuJyA6ICcnLAoJJ0F1dGhvcnMnICAgICAgICAgICAgICAgICAgICAgIDogJycsCgknQ2hpZWYgZGV2ZWxvcGVyJyAgICAgICAgICAgICAgOiAnJywKCSdEZXZlbG9wZXIsIHRlY2ggc3VwcG9ydCcgICAgICA6ICcnLAoJJ0RldmVsb3BlcicgICAgICAgICAgICAgICAgICAgIDogJycsCgknSW50ZXJmYWNlIGRlc2lnbmVyJyAgICAgICAgICAgOiAnJywKCSdTcGFuaXNoIGxvY2FsaXphdGlvbicgICAgICAgICA6ICcnLAoJJ0N6ZWNoIGxvY2FsaXphdGlvbicgICAgICAgICAgIDogJycsCgknSmFwYW5lc2UgbG9jYWxpemF0aW9uJyAgICAgICAgOiAnJywKCSdMYXR2aWFuIGxvY2FsaXphdGlvbicgICAgICAgICA6ICcnLAoJJ0dlcm1hbiBsb2NhbGl6YXRpb24nICAgICAgICAgIDogJycsCgknVWtyYW5pYW4gbG9jYWxpemF0aW9uJyAgICAgICAgOiAnJywKCSdQZXJzaWFuIChmYXJzaSkgbG9jYWxpemF0aW9uJyA6ICcnLAoJJ0FyYWJpYyBsb2NhbGl6YXRpb24nICAgICAgICAgIDogJycsCgknUlRMIHN1cHBvcnQnICAgICAgICAgICAgICAgICAgOiAnJywKCSdGcmVuY2ggbG9jYWxpemF0aW9uJyAgICAgICAgICA6ICcnLAoJJ0R1dGNoIGxvY2FsaXphdGlvbicgICAgICAgICAgIDogJycsCgknSHVuZ2FyaWFuIGxvY2FsaXphdGlvbicgICAgICAgOiAnJywKCSdQb2xpc2ggbG9jYWxpemF0aW9uJyAgICAgICAgICA6ICcnLAoJJ0l0YWxpYW4gbG9jYWxpemF0aW9uJyAgICAgICAgIDogJycsCgknVHJhZGl0aW9uYWwgQ2hpbmVzZSBsb2NhbGl6YXRpb24nIDogJycsCgknRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzb2Z0d2FyZSB2aXNpdCB0aGUnIDogJycsCgknZWxSVEUgd2Vic2l0ZScgICAgICAgICAgICAgICAgOiAn0L3QsCDRgdCw0LnRgtC1IGVsUlRFJwp9Cn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/i18n/elrte.zh_TW.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFRyYWRpdGlvbmFsIENoaW5lc2UgdHJhbnNsYXRpb24KICogQGF1dGhvciBUYWQgPHRhZDA2MTZAZ21haWwuY29tPgogKiBAdmVyc2lvbiAyMDEwLTA5LTE4CiAqLwooZnVuY3Rpb24oJCkgewplbFJURS5wcm90b3R5cGUuaTE4TWVzc2FnZXMuemhfVFcgPSB7CgknRWRpdG9yJyA6ICfmiYDopovljbPmiYDlvpcnLAoJJ1NvdXJjZScgOiAn5Y6f5aeL56K8JywKCS8vIFBhbmVsIE5hbWUKCSdDb3B5L1Bhc2UnICAgICAgOiAn6KSH6KO9L+iyvOS4iicsCgknVW5kby9SZWRvJyAgICAgIDogJ+W+qeWOny/ph43lgZonLAoJJ1RleHQgc3R5bGVzJyAgICA6ICfmloflrZfmqKPlvI8nLAoJJ0NvbG9ycycgICAgICAgICA6ICfpoY/oibInLAoJJ0FsaWdubWVudCcgICAgICA6ICflsI3pvYonLAoJJ0luZGVudC9PdXRkZW50JyA6ICfnuK7mjpIv5Ye45o6SJywKCSdUZXh0IGZvcm1hdCcgICAgOiAn5paH5a2X5qC85byPJywKCSdMaXN0cycgICAgICAgICAgOiAn5riF5ZauJywKCSdNaXNjIGVsZW1lbnRzJyAgOiAn5YW25LuW5YWD5Lu2JywKCSdMaW5rcycgICAgICAgICAgOiAn6YCj57WQJywKCSdJbWFnZXMnICAgICAgICAgOiAn5ZyW5qqUJywKCSdNZWRpYScgICAgICAgICAgOiAn5aSa5aqS6auUJywKCSdUYWJsZXMnICAgICAgICAgOiAn6KGo5qC8JywKCSdGaWxlIG1hbmFnZXIgKGVsRmluZGVyKScgOiAn5qqU5qGI566h55CGJywKCS8vIGJ1dHRvbiBuYW1lcwoJJ1NhdmUnICAgICAgICAgICAgICAgICAgICA6ICflhLLlrZgnLAoJJ0NvcHknICAgICAgICAgICAgICAgICAgICA6ICfopIfoo70nLAoJJ0N1dCcgICAgICAgICAgICAgICAgICAgICA6ICfliarkuIsnLAoJJ1Bhc3RlJyAgICAgICAgICAgICAgICAgICA6ICfosrzkuIonLAoJJ1Bhc3RlIG9ubHkgdGV4dCcgICAgICAgICA6ICfosrzkuIrntJTmloflrZcnLAoJJ1Bhc3RlIGZvcm1hdHRlZCB0ZXh0JyAgICA6ICfosrzkuIrlt7LmoLzlvI/ljJbmloflrZcnLAoJJ0NsZWFuIGZvcm1hdCcgICAgICAgICAgICA6ICfmuIXpmaTmoLzlvI8nLAoJJ1VuZG8gbGFzdCBhY3Rpb24nICAgICAgICA6ICflvqnljp/mnIDlvozkuIDlgIvli5XkvZwnLAoJJ1JlZG8gcHJldmlvdXMgYWN0aW9uJyAgICA6ICfph43lgZrkuIrkuIDlgIvli5XkvZwnLAoJJ0JvbGQnICAgICAgICAgICAgICAgICAgICA6ICfnspfpq5QnLAoJJ0l0YWxpYycgICAgICAgICAgICAgICAgICA6ICfmlpzpq5QnLAoJJ1VuZGVybGluZScgICAgICAgICAgICAgICA6ICflupXnt5onLAoJJ1N0cmlrZXRocm91Z2gnICAgICAgICAgICA6ICfliKrpmaTnt5onLAoJJ1N1cGVyc2NyaXB0JyAgICAgICAgICAgICA6ICfkuIrmqJknLAoJJ1N1YnNjcmlwdCcgICAgICAgICAgICAgICA6ICfkuIvmqJknLAoJJ0FsaWduIGxlZnQnICAgICAgICAgICAgICA6ICfpnaDlt6YnLAoJJ0FpbGduIHJpZ2h0JyAgICAgICAgICAgICA6ICfpnaDlj7MnLAoJJ0FsaWduIGNlbnRlcicgICAgICAgICAgICA6ICfnva7kuK0nLAoJJ0FsaWduIGZ1bGwnICAgICAgICAgICAgICA6ICflt6blj7PlsI3pvYonLAoJJ0ZvbnQgY29sb3InICAgICAgICAgICAgICA6ICfmloflrZfpoY/oibInLAoJJ0JhY2tncm91bmQgY29sb3InICAgICAgICA6ICfog4zmma/poY/oibInLAoJJ0luZGVudCcgICAgICAgICAgICAgICAgICA6ICfnuK7mjpInLAoJJ091dGRlbnQnICAgICAgICAgICAgICAgICA6ICflh7jmjpInLAoJJ0Zvcm1hdCcgICAgICAgICAgICAgICAgICA6ICfmoLzlvI8nLAoJJ0ZvbnQgc2l6ZScgICAgICAgICAgICAgICA6ICflrZflnovlpKflsI8nLAoJJ0ZvbnQnICAgICAgICAgICAgICAgICAgICA6ICflrZflnosnLAoJJ09yZGVyZWQgbGlzdCcgICAgICAgICAgICA6ICfnt6jomZ8nLAoJJ1Vub3JkZXJlZCBsaXN0JyAgICAgICAgICA6ICfpoIXnm67nrKbomZ8nLAoJJ0hvcml6b250YWwgcnVsZScgICAgICAgICA6ICfmsLTlubPnt5onLAoJJ0Jsb2NrcXVvdGUnICAgICAgICAgICAgICA6ICflvJXnlKgnLAoJJ0Jsb2NrIGVsZW1lbnQgKERJViknICAgICA6ICfljYDln5/lhYPku7YgKERJViknLAoJJ0xpbmsnICAgICAgICAgICAgICAgICAgICA6ICfpgKPntZAnLAoJJ0RlbGV0ZSBsaW5rJyAgICAgICAgICAgICA6ICfnp7vpmaTpgKPntZAnLAoJJ0Jvb2ttYXJrJyAgICAgICAgICAgICAgICA6ICfmm7jnsaQnLAoJJ0ltYWdlJyAgICAgICAgICAgICAgICAgICA6ICfmj5LlnJYnLAoJJ1RhYmxlJyAgICAgICAgICAgICAgICAgICA6ICfooajmoLwnLAoJJ0RlbGV0ZSB0YWJsZScgICAgICAgICAgICA6ICfliKrpmaTooajmoLwnLAoJJ0luc2VydCByb3cgYmVmb3JlJyAgICAgICA6ICfkuIrmlrnmlrDlop7kuIDliJcnLAoJJ0luc2VydCByb3cgYWZ0ZXInICAgICAgICA6ICfkuIvmlrnmlrDlop7kuIDliJcnLAoJJ0RlbGV0ZSByb3cnICAgICAgICAgICAgICA6ICfliKrpmaTliJcnLAoJJ0luc2VydCBjb2x1bW4gYmVmb3JlJyAgICA6ICflt6bpgormlrDlop7kuIDmrIQnLAoJJ0luc2VydCBjb2x1bW4gYWZ0ZXInICAgICA6ICflj7PpgormlrDlop7kuIDmrIQnLAoJJ0RlbGV0ZSBjb2x1bW4nICAgICAgICAgICA6ICfliKrpmaTmrIQnLAoJJ01lcmdlIHRhYmxlIGNlbGxzJyAgICAgICA6ICflkIjkvbXlhLLlrZjmoLwnLAoJJ1NwbGl0IHRhYmxlIGNlbGwnICAgICAgICA6ICfliIblibLlhLLlrZjmoLwnLAoJJ1RvZ2dsZSBkaXNwbGF5IGRvY3VtZW50IHN0cnVjdHVyZScgOiAn5YiH5o+b6aGv56S65paH5Lu257WQ5qeLJywKCSdUYWJsZSBjZWxsIHByb3BlcnRpZXMnICAgOiAn6KGo5qC85YSy5a2Y5qC85bGs5oCnJywKCSdUYWJsZSBwcm9wZXJ0aWVzJyAgICAgICAgOiAn6KGo5qC85bGs5oCnJywKCSdUb2dnbGUgZnVsbCBzY3JlZW4gbW9kZScgOiAn5YiH5o+b54K65YWo6J6i5bmVJywKCSdPcGVuIGZpbGUgbWFuYWdlcicgICAgICAgOiAn6ZaL5ZWf5qqU5qGI566h55CGJywKCSdOb24gYnJlYWthYmxlIHNwYWNlJyAgICAgOiAn5LiN5pa36KGM56m655m9JywKCSdTdG9wIGVsZW1lbnQgZmxvYXRpbmcnICAgOiAn5YGc5q2i5YWD5Lu25rWu5YuV5bGs5oCnJywKCS8vIGRpYWxvZ3MKCSdXYXJuaW5nJyA6ICforablkYonLAoJJ1Byb3BlcmllcycgOiAn5bGs5oCnJywKCSdQb3B1cCcgOiAn6Lez5Ye65qGGJywKCSdBZHZhbmNlZCcgOiAn6YCy6ZqOJywKCSdFdmVudHMnIDogJ+S6i+S7ticsCgknV2lkdGgnIDogJ+WvrOW6picsCgknSGVpZ2h0JyA6ICfpq5jluqYnLAoJJ0xlZnQnICAgOiAn6Z2g5bemJywKCSdDZW50ZXInIDogJ+e9ruS4rScsCgknUmlnaHQnICA6ICfpnaDlj7MnLAoJJ0JvcmRlcicgOiAn6YKK5qGGJywKCSdCYWNrZ3JvdW5kJyA6ICfog4zmma8nLAoJJ0NzcyBjbGFzcycgOiAnQ1NT6aGe5YilJywKCSdDc3Mgc3R5bGUnIDogJ0NTU+aoo+W8jycsCgknTm8nIDogJ+S4jeioree9ricsCgknVGl0bGUnIDogJ+aomemhjCcsCgknU2NyaXB0IGRpcmVjdGlvbicgOiAn6Kqe6KiA5pa55ZCRJywKCSdMYW5ndWFnZScgOiAn6Kqe6KiAJywKCSdDaGFyc2V0JyA6ICflrZflhYPnt6jnorwnLAoJJ05vdCBzZXQnIDogJ+S4jeioreWumicsCgknTGVmdCB0byByaWdodCcgOiAn5bem6Iez5Y+zJywKCSdSaWdodCB0byBsZWZ0JyA6ICflj7PliLDlt6YnLAoJJ0luIHRoaXMgd2luZG93JyA6ICflnKjmraToppbnqpcnLAoJJ0luIG5ldyB3aW5kb3cgKF9ibGFuayknIDogJ+WcqOaWsOimlueqlyAoX2JsYW5rKScsCgknSW4gbmV3IHBhcmVudCB3aW5kb3cgKF9wYXJlbnQpJyA6ICflnKjniLboppbnqpcgKF9wYXJlbnQpJywKCSdJbiB0b3AgZnJhbWUgKF90b3ApJyA6ICfot7Plh7rmoYbmnrYgKF90b3ApJywKCSdVUkwnIDogJ+e2suWdgCcsCgknT3BlbiBpbicgOiAn6ZaL5ZWf6IezJywKCS8vIGNvcHkKCSdUaGlzIG9wZXJhdGlvbiBpcyBkaXNhYmxlZCBpbiB5b3VyIGJyb3dzZXIgb24gc2VjdXJpdHkgcmVhc29uLiBVc2Ugc2hvcnRjdXQgaW5zdGVhZC4nIDogJ+WfuuaWvOWuieWFqOeQhueUse+8jOatpOWLleS9nOeEoeazleWcqOeAj+imveWZqOS4remAsuihjO+8jOiri+ebtOaOpeaMiSBDdHJsK1Yg6Kmm6Kmm44CCJywKCS8vIGZvcm1hdCAKCSdIZWFkaW5nIDEnIDogJ+aomemhjCAxJywKCSdIZWFkaW5nIDInIDogJ+aomemhjCAyJywKCSdIZWFkaW5nIDMnIDogJ+aomemhjCAzJywKCSdIZWFkaW5nIDQnIDogJ+aomemhjCA0JywKCSdIZWFkaW5nIDUnIDogJ+aomemhjCA1JywKCSdIZWFkaW5nIDYnIDogJ+aomemhjCA2JywKCSdQYXJhZ3JhcGgnIDogJ+auteiQvScsCgknQWRkcmVzcycgOiAn5L2N5Z2AJywKCSdQcmVmb3JtYXR0ZWQnIDogJ+WbuuWumuagvOW8jycsCgkvLyBmb250IHNpemUKCSdTbWFsbCAoOHB0KScgICA6ICfmpbXlsI8gKDhwdCknLAoJJ1NtYWxsICgxMHB4KScgIDogJ+abtOWwjyAoMTBweCknLAoJJ1NtYWxsICgxMnB0KScgIDogJ+WwjyAoMTJwdCknLAoJJ05vcm1hbCAoMTRwdCknIDogJ+S4rSAoMTRwdCknLAoJJ0xhcmdlICgxOHB0KScgIDogJ+WkpyAoMThwdCknLAoJJ0xhcmdlICgyNHB0KScgIDogJ+abtOWkpyAoMjRwdCknLAoJJ0xhcmdlICgzNnB0KScgIDogJ+alteWkpyAoMzZwdCknLAoJLy8gYm9va21hcmsKCSdCb29rbWFyayBuYW1lJyA6ICfmm7jnsaTlkI3nqLEnLAoJLy8gbGluawoJJ0xpbmsgVVJMJyA6ICfpgKPntZDkvY3lnYAnLAoJJ1RhcmdldCcgOiAn55uu5qiZJywKCSdPcGVuIGxpbmsgaW4gcG9wdXAgd2luZG93JyA6ICflnKjot7Plh7roppbnqpfkuK3plovllZ8nLAoJJ1dpbmRvdyBuYW1lJyA6ICfoppbnqpflkI3nqLEnLAoJJ1dpbmRvdyBzaXplJyA6ICfoppbnqpflsLrlr7gnLAoJJ1dpbmRvdyBwb3NpdGlvbicgOiAn6KaW56qX5L2N572uJywKCSdMb2NhdGlvbiBiYXInIDogJ+S9jeWdgOWIlycsCgknTWVudSBiYXInIDogJ+mBuOWWruWIlycsCgknVG9vbGJhcicgOiAn5bel5YW35YiXJywKCSdTY3JvbGxiYXJzJyA6ICfmjbLou7gnLAoJJ1N0YXR1cyBiYXInIDogJ+eLgOaFi+WIlycsCgknUmVzaXphYmxlJyA6ICflj6/lkKboqr/mlbTlsLrlr7gnLAoJJ0RlcGVkZW50JyA6ICfnm7jpl5wgKE5ldHNjYXBlKScsCgknQWRkIHJldHVybiBmYWxzZScgOiAn5Yqg5YWl5YKz5ZueZmFsc2UgKHJldHVybiBmYWxzZSknLAoJJ1RhcmdldCBNSU1FIHR5cGUnIDogJ+ebruaomeeJqeeahE1JTUXpoZ7lnosnLAoJJ1JlbGF0aW9uc2hpcCBwYWdlIHRvIHRhcmdldCAocmVsKScgOiAn5a6a576p6YCj57WQ55qE6LW36bue5paH5Lu26IiH55uu5qiZ5paH5Lu25LmL6ZaT55qE6Zec5L+CIChyZWwpJywKCSdSZWxhdGlvbnNoaXAgdGFyZ2V0IHRvIHBhZ2UgKHJldiknIDogJ+Wumue+qemAo+e1kOeahOi1t+m7nuaWh+S7tuiIh+ebruaomeaWh+S7tuS5i+mWk+eahOWPjeWQkemXnOS/giAocmV2KScsCgknVGFiIGluZGV4JyA6ICflrprkvY3ntKLlvJUnLAoJJ0FjY2VzcyBrZXknIDogJ+WtmOWPlumNtScsCgkvLyBpbWFnZQoJJ1NpemUnIDogJ+WwuuWvuCcsCgknUHJldmlldycgOiAn6aCQ6Ka9JywKCSdNYXJnaW5zJyA6ICfpgornlYwnLAoJJ0FsdCB0ZXh0JyA6ICfmj5DnpLrmloflrZcnLAoJJ0ltYWdlIFVSTCcgOiAn5ZyW5qqU57ay5Z2AJywKCS8vIHRhYmxlCgknU3BhY2luZycgICAgICAgOiAn5YSy5a2Y5qC86ZaT6LedIChTcGFjaW5nKScsCgknUGFkZGluZycgICAgICAgOiAn5YSy5a2Y5qC85YWn6LedIChQYWRkaW5nKScsCgknUm93cycgICAgICAgICAgOiAn5YiXJywKCSdDb2x1bW5zJyAgICAgICA6ICfmrIQnLAoJJ0dyb3VwcycgICAgICAgIDogJ+WEsuWtmOagvOe+pOe1hCcsCgknQ2VsbHMnICAgICAgICAgOiAn5YSy5a2Y5qC8JywKCSdDYXB0aW9uJyAgICAgICA6ICfooajmoLzmqJnpoYwnLAoJJ0lubmVyIGJvcmRlcnMnIDogJ+ahhue3micKCQoJCn0KfSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/jquery-1.4.2.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuNC4yCiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBDb3B5cmlnaHQgMjAxMCwgSm9obiBSZXNpZwogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cDovL3NpenpsZWpzLmNvbS8KICogQ29weXJpZ2h0IDIwMTAsIFRoZSBEb2pvIEZvdW5kYXRpb24KICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLgogKgogKiBEYXRlOiBTYXQgRmViIDEzIDIyOjMzOjQ4IDIwMTAgLTA1MDAKICovCihmdW5jdGlvbihBLHcpe2Z1bmN0aW9uIG1hKCl7aWYoIWMuaXNSZWFkeSl7dHJ5e3MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7c2V0VGltZW91dChtYSwxKTtyZXR1cm59Yy5yZWFkeSgpfX1mdW5jdGlvbiBRYShhLGIpe2Iuc3JjP2MuYWpheCh7dXJsOmIuc3JjLGFzeW5jOmZhbHNlLGRhdGFUeXBlOiJzY3JpcHQifSk6Yy5nbG9iYWxFdmFsKGIudGV4dHx8Yi50ZXh0Q29udGVudHx8Yi5pbm5lckhUTUx8fCIiKTtiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBYKGEsYixkLGYsZSxqKXt2YXIgaT1hLmxlbmd0aDtpZih0eXBlb2YgYj09PSJvYmplY3QiKXtmb3IodmFyIG8gaW4gYilYKGEsbyxiW29dLGYsZSxkKTtyZXR1cm4gYX1pZihkIT09dyl7Zj0haiYmZiYmYy5pc0Z1bmN0aW9uKGQpO2ZvcihvPTA7bzxpO28rKyllKGFbb10sYixmP2QuY2FsbChhW29dLG8sZShhW29dLGIpKTpkLGopO3JldHVybiBhfXJldHVybiBpPwplKGFbMF0sYik6d31mdW5jdGlvbiBKKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9ZnVuY3Rpb24gWSgpe3JldHVybiBmYWxzZX1mdW5jdGlvbiBaKCl7cmV0dXJuIHRydWV9ZnVuY3Rpb24gbmEoYSxiLGQpe2RbMF0udHlwZT1hO3JldHVybiBjLmV2ZW50LmhhbmRsZS5hcHBseShiLGQpfWZ1bmN0aW9uIG9hKGEpe3ZhciBiLGQ9W10sZj1bXSxlPWFyZ3VtZW50cyxqLGksbyxrLG4scjtpPWMuZGF0YSh0aGlzLCJldmVudHMiKTtpZighKGEubGl2ZUZpcmVkPT09dGhpc3x8IWl8fCFpLmxpdmV8fGEuYnV0dG9uJiZhLnR5cGU9PT0iY2xpY2siKSl7YS5saXZlRmlyZWQ9dGhpczt2YXIgdT1pLmxpdmUuc2xpY2UoMCk7Zm9yKGs9MDtrPHUubGVuZ3RoO2srKyl7aT11W2tdO2kub3JpZ1R5cGUucmVwbGFjZShPLCIiKT09PWEudHlwZT9mLnB1c2goaS5zZWxlY3Rvcik6dS5zcGxpY2Uoay0tLDEpfWo9YyhhLnRhcmdldCkuY2xvc2VzdChmLGEuY3VycmVudFRhcmdldCk7bj0wO2ZvcihyPQpqLmxlbmd0aDtuPHI7bisrKWZvcihrPTA7azx1Lmxlbmd0aDtrKyspe2k9dVtrXTtpZihqW25dLnNlbGVjdG9yPT09aS5zZWxlY3Rvcil7bz1qW25dLmVsZW07Zj1udWxsO2lmKGkucHJlVHlwZT09PSJtb3VzZWVudGVyInx8aS5wcmVUeXBlPT09Im1vdXNlbGVhdmUiKWY9YyhhLnJlbGF0ZWRUYXJnZXQpLmNsb3Nlc3QoaS5zZWxlY3RvcilbMF07aWYoIWZ8fGYhPT1vKWQucHVzaCh7ZWxlbTpvLGhhbmRsZU9iajppfSl9fW49MDtmb3Iocj1kLmxlbmd0aDtuPHI7bisrKXtqPWRbbl07YS5jdXJyZW50VGFyZ2V0PWouZWxlbTthLmRhdGE9ai5oYW5kbGVPYmouZGF0YTthLmhhbmRsZU9iaj1qLmhhbmRsZU9iajtpZihqLmhhbmRsZU9iai5vcmlnSGFuZGxlci5hcHBseShqLmVsZW0sZSk9PT1mYWxzZSl7Yj1mYWxzZTticmVha319cmV0dXJuIGJ9fWZ1bmN0aW9uIHBhKGEsYil7cmV0dXJuImxpdmUuIisoYSYmYSE9PSIqIj9hKyIuIjoiIikrYi5yZXBsYWNlKC9cLi9nLCJgIikucmVwbGFjZSgvIC9nLAoiJiIpfWZ1bmN0aW9uIHFhKGEpe3JldHVybiFhfHwhYS5wYXJlbnROb2RlfHxhLnBhcmVudE5vZGUubm9kZVR5cGU9PT0xMX1mdW5jdGlvbiByYShhLGIpe3ZhciBkPTA7Yi5lYWNoKGZ1bmN0aW9uKCl7aWYodGhpcy5ub2RlTmFtZT09PShhW2RdJiZhW2RdLm5vZGVOYW1lKSl7dmFyIGY9Yy5kYXRhKGFbZCsrXSksZT1jLmRhdGEodGhpcyxmKTtpZihmPWYmJmYuZXZlbnRzKXtkZWxldGUgZS5oYW5kbGU7ZS5ldmVudHM9e307Zm9yKHZhciBqIGluIGYpZm9yKHZhciBpIGluIGZbal0pYy5ldmVudC5hZGQodGhpcyxqLGZbal1baV0sZltqXVtpXS5kYXRhKX19fSl9ZnVuY3Rpb24gc2EoYSxiLGQpe3ZhciBmLGUsajtiPWImJmJbMF0/YlswXS5vd25lckRvY3VtZW50fHxiWzBdOnM7aWYoYS5sZW5ndGg9PT0xJiZ0eXBlb2YgYVswXT09PSJzdHJpbmciJiZhWzBdLmxlbmd0aDw1MTImJmI9PT1zJiYhdGEudGVzdChhWzBdKSYmKGMuc3VwcG9ydC5jaGVja0Nsb25lfHwhdWEudGVzdChhWzBdKSkpe2U9CnRydWU7aWYoaj1jLmZyYWdtZW50c1thWzBdXSlpZihqIT09MSlmPWp9aWYoIWYpe2Y9Yi5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Yy5jbGVhbihhLGIsZixkKX1pZihlKWMuZnJhZ21lbnRzW2FbMF1dPWo/ZjoxO3JldHVybntmcmFnbWVudDpmLGNhY2hlYWJsZTplfX1mdW5jdGlvbiBLKGEsYil7dmFyIGQ9e307Yy5lYWNoKHZhLmNvbmNhdC5hcHBseShbXSx2YS5zbGljZSgwLGIpKSxmdW5jdGlvbigpe2RbdGhpc109YX0pO3JldHVybiBkfWZ1bmN0aW9uIHdhKGEpe3JldHVybiJzY3JvbGxUbyJpbiBhJiZhLmRvY3VtZW50P2E6YS5ub2RlVHlwZT09PTk/YS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3c6ZmFsc2V9dmFyIGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IGMuZm4uaW5pdChhLGIpfSxSYT1BLmpRdWVyeSxTYT1BLiQscz1BLmRvY3VtZW50LFQsVGE9L15bXjxdKig8W1x3XFddKz4pW14+XSokfF4jKFtcdy1dKykkLyxVYT0vXi5bXjojXFtcLixdKiQvLFZhPS9cUy8sCldhPS9eKFxzfFx1MDBBMCkrfChcc3xcdTAwQTApKyQvZyxYYT0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT4pPyQvLFA9bmF2aWdhdG9yLnVzZXJBZ2VudCx4YT1mYWxzZSxRPVtdLEwsJD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGFhPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksYmE9QXJyYXkucHJvdG90eXBlLnB1c2gsUj1BcnJheS5wcm90b3R5cGUuc2xpY2UseWE9QXJyYXkucHJvdG90eXBlLmluZGV4T2Y7Yy5mbj1jLnByb3RvdHlwZT17aW5pdDpmdW5jdGlvbihhLGIpe3ZhciBkLGY7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSl7dGhpcy5jb250ZXh0PXRoaXNbMF09YTt0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKGE9PT0iYm9keSImJiFiKXt0aGlzLmNvbnRleHQ9czt0aGlzWzBdPXMuYm9keTt0aGlzLnNlbGVjdG9yPSJib2R5Ijt0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT09InN0cmluZyIpaWYoKGQ9VGEuZXhlYyhhKSkmJgooZFsxXXx8IWIpKWlmKGRbMV0pe2Y9Yj9iLm93bmVyRG9jdW1lbnR8fGI6cztpZihhPVhhLmV4ZWMoYSkpaWYoYy5pc1BsYWluT2JqZWN0KGIpKXthPVtzLmNyZWF0ZUVsZW1lbnQoYVsxXSldO2MuZm4uYXR0ci5jYWxsKGEsYix0cnVlKX1lbHNlIGE9W2YuY3JlYXRlRWxlbWVudChhWzFdKV07ZWxzZXthPXNhKFtkWzFdXSxbZl0pO2E9KGEuY2FjaGVhYmxlP2EuZnJhZ21lbnQuY2xvbmVOb2RlKHRydWUpOmEuZnJhZ21lbnQpLmNoaWxkTm9kZXN9cmV0dXJuIGMubWVyZ2UodGhpcyxhKX1lbHNle2lmKGI9cy5nZXRFbGVtZW50QnlJZChkWzJdKSl7aWYoYi5pZCE9PWRbMl0pcmV0dXJuIFQuZmluZChhKTt0aGlzLmxlbmd0aD0xO3RoaXNbMF09Yn10aGlzLmNvbnRleHQ9czt0aGlzLnNlbGVjdG9yPWE7cmV0dXJuIHRoaXN9ZWxzZSBpZighYiYmL15cdyskLy50ZXN0KGEpKXt0aGlzLnNlbGVjdG9yPWE7dGhpcy5jb250ZXh0PXM7YT1zLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO3JldHVybiBjLm1lcmdlKHRoaXMsCmEpfWVsc2UgcmV0dXJuIWJ8fGIuanF1ZXJ5PyhifHxUKS5maW5kKGEpOmMoYikuZmluZChhKTtlbHNlIGlmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gVC5yZWFkeShhKTtpZihhLnNlbGVjdG9yIT09dyl7dGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yO3RoaXMuY29udGV4dD1hLmNvbnRleHR9cmV0dXJuIGMubWFrZUFycmF5KGEsdGhpcyl9LHNlbGVjdG9yOiIiLGpxdWVyeToiMS40LjIiLGxlbmd0aDowLHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gUi5jYWxsKHRoaXMsMCl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD90aGlzLnRvQXJyYXkoKTphPDA/dGhpcy5zbGljZShhKVswXTp0aGlzW2FdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPWMoKTtjLmlzQXJyYXkoYSk/YmEuYXBwbHkoZixhKTpjLm1lcmdlKGYsYSk7Zi5wcmV2T2JqZWN0PXRoaXM7Zi5jb250ZXh0PXRoaXMuY29udGV4dDtpZihiPT09CiJmaW5kIilmLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrKHRoaXMuc2VsZWN0b3I/IiAiOiIiKStkO2Vsc2UgaWYoYilmLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrIi4iK2IrIigiK2QrIikiO3JldHVybiBmfSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGMuZWFjaCh0aGlzLGEsYil9LHJlYWR5OmZ1bmN0aW9uKGEpe2MuYmluZFJlYWR5KCk7aWYoYy5pc1JlYWR5KWEuY2FsbChzLGMpO2Vsc2UgUSYmUS5wdXNoKGEpO3JldHVybiB0aGlzfSxlcTpmdW5jdGlvbihhKXtyZXR1cm4gYT09PS0xP3RoaXMuc2xpY2UoYSk6dGhpcy5zbGljZShhLCthKzEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhSLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwic2xpY2UiLFIuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYy5tYXAodGhpcywKZnVuY3Rpb24oYixkKXtyZXR1cm4gYS5jYWxsKGIsZCxiKX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8YyhudWxsKX0scHVzaDpiYSxzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX07Yy5mbi5pbml0LnByb3RvdHlwZT1jLmZuO2MuZXh0ZW5kPWMuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzWzBdfHx7fSxiPTEsZD1hcmd1bWVudHMubGVuZ3RoLGY9ZmFsc2UsZSxqLGksbztpZih0eXBlb2YgYT09PSJib29sZWFuIil7Zj1hO2E9YXJndW1lbnRzWzFdfHx7fTtiPTJ9aWYodHlwZW9mIGEhPT0ib2JqZWN0IiYmIWMuaXNGdW5jdGlvbihhKSlhPXt9O2lmKGQ9PT1iKXthPXRoaXM7LS1ifWZvcig7YjxkO2IrKylpZigoZT1hcmd1bWVudHNbYl0pIT1udWxsKWZvcihqIGluIGUpe2k9YVtqXTtvPWVbal07aWYoYSE9PW8paWYoZiYmbyYmKGMuaXNQbGFpbk9iamVjdChvKXx8Yy5pc0FycmF5KG8pKSl7aT1pJiYoYy5pc1BsYWluT2JqZWN0KGkpfHwKYy5pc0FycmF5KGkpKT9pOmMuaXNBcnJheShvKT9bXTp7fTthW2pdPWMuZXh0ZW5kKGYsaSxvKX1lbHNlIGlmKG8hPT13KWFbal09b31yZXR1cm4gYX07Yy5leHRlbmQoe25vQ29uZmxpY3Q6ZnVuY3Rpb24oYSl7QS4kPVNhO2lmKGEpQS5qUXVlcnk9UmE7cmV0dXJuIGN9LGlzUmVhZHk6ZmFsc2UscmVhZHk6ZnVuY3Rpb24oKXtpZighYy5pc1JlYWR5KXtpZighcy5ib2R5KXJldHVybiBzZXRUaW1lb3V0KGMucmVhZHksMTMpO2MuaXNSZWFkeT10cnVlO2lmKFEpe2Zvcih2YXIgYSxiPTA7YT1RW2IrK107KWEuY2FsbChzLGMpO1E9bnVsbH1jLmZuLnRyaWdnZXJIYW5kbGVyJiZjKHMpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpfX0sYmluZFJlYWR5OmZ1bmN0aW9uKCl7aWYoIXhhKXt4YT10cnVlO2lmKHMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpcmV0dXJuIGMucmVhZHkoKTtpZihzLmFkZEV2ZW50TGlzdGVuZXIpe3MuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsCkwsZmFsc2UpO0EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsYy5yZWFkeSxmYWxzZSl9ZWxzZSBpZihzLmF0dGFjaEV2ZW50KXtzLmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEwpO0EuYXR0YWNoRXZlbnQoIm9ubG9hZCIsYy5yZWFkeSk7dmFyIGE9ZmFsc2U7dHJ5e2E9QS5mcmFtZUVsZW1lbnQ9PW51bGx9Y2F0Y2goYil7fXMuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsJiZhJiZtYSgpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuICQuY2FsbChhKT09PSJbb2JqZWN0IEZ1bmN0aW9uXSJ9LGlzQXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuICQuY2FsbChhKT09PSJbb2JqZWN0IEFycmF5XSJ9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oYSl7aWYoIWF8fCQuY2FsbChhKSE9PSJbb2JqZWN0IE9iamVjdF0ifHxhLm5vZGVUeXBlfHxhLnNldEludGVydmFsKXJldHVybiBmYWxzZTtpZihhLmNvbnN0cnVjdG9yJiYhYWEuY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhYWEuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwKImlzUHJvdG90eXBlT2YiKSlyZXR1cm4gZmFsc2U7dmFyIGI7Zm9yKGIgaW4gYSk7cmV0dXJuIGI9PT13fHxhYS5jYWxsKGEsYil9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIGEpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfSxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBhO30scGFyc2VKU09OOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhIT09InN0cmluZyJ8fCFhKXJldHVybiBudWxsO2E9Yy50cmltKGEpO2lmKC9eW1xdLDp7fVxzXSokLy50ZXN0KGEucmVwbGFjZSgvXFwoPzpbIlxcXC9iZm5ydF18dVswLTlhLWZBLUZdezR9KS9nLCJAIikucmVwbGFjZSgvIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2csIl0iKS5yZXBsYWNlKC8oPzpefDp8LCkoPzpccypcWykrL2csIiIpKSlyZXR1cm4gQS5KU09OJiZBLkpTT04ucGFyc2U/QS5KU09OLnBhcnNlKGEpOihuZXcgRnVuY3Rpb24oInJldHVybiAiKwphKSkoKTtlbHNlIGMuZXJyb3IoIkludmFsaWQgSlNPTjogIithKX0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihhKXtpZihhJiZWYS50ZXN0KGEpKXt2YXIgYj1zLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fHMuZG9jdW1lbnRFbGVtZW50LGQ9cy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkLnR5cGU9InRleHQvamF2YXNjcmlwdCI7aWYoYy5zdXBwb3J0LnNjcmlwdEV2YWwpZC5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKGEpKTtlbHNlIGQudGV4dD1hO2IuaW5zZXJ0QmVmb3JlKGQsYi5maXJzdENoaWxkKTtiLnJlbW92ZUNoaWxkKGQpfX0sbm9kZU5hbWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT09Yi50b1VwcGVyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGEsYixkKXt2YXIgZixlPTAsaj1hLmxlbmd0aCxpPWo9PT13fHxjLmlzRnVuY3Rpb24oYSk7aWYoZClpZihpKWZvcihmIGluIGEpe2lmKGIuYXBwbHkoYVtmXSwKZCk9PT1mYWxzZSlicmVha31lbHNlIGZvcig7ZTxqOyl7aWYoYi5hcHBseShhW2UrK10sZCk9PT1mYWxzZSlicmVha31lbHNlIGlmKGkpZm9yKGYgaW4gYSl7aWYoYi5jYWxsKGFbZl0sZixhW2ZdKT09PWZhbHNlKWJyZWFrfWVsc2UgZm9yKGQ9YVswXTtlPGomJmIuY2FsbChkLGUsZCkhPT1mYWxzZTtkPWFbKytlXSk7cmV0dXJuIGF9LHRyaW06ZnVuY3Rpb24oYSl7cmV0dXJuKGF8fCIiKS5yZXBsYWNlKFdhLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7Yj1ifHxbXTtpZihhIT1udWxsKWEubGVuZ3RoPT1udWxsfHx0eXBlb2YgYT09PSJzdHJpbmcifHxjLmlzRnVuY3Rpb24oYSl8fHR5cGVvZiBhIT09ImZ1bmN0aW9uIiYmYS5zZXRJbnRlcnZhbD9iYS5jYWxsKGIsYSk6Yy5tZXJnZShiLGEpO3JldHVybiBifSxpbkFycmF5OmZ1bmN0aW9uKGEsYil7aWYoYi5pbmRleE9mKXJldHVybiBiLmluZGV4T2YoYSk7Zm9yKHZhciBkPTAsZj1iLmxlbmd0aDtkPGY7ZCsrKWlmKGJbZF09PT0KYSlyZXR1cm4gZDtyZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLmxlbmd0aCxmPTA7aWYodHlwZW9mIGIubGVuZ3RoPT09Im51bWJlciIpZm9yKHZhciBlPWIubGVuZ3RoO2Y8ZTtmKyspYVtkKytdPWJbZl07ZWxzZSBmb3IoO2JbZl0hPT13OylhW2QrK109YltmKytdO2EubGVuZ3RoPWQ7cmV0dXJuIGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGQpe2Zvcih2YXIgZj1bXSxlPTAsaj1hLmxlbmd0aDtlPGo7ZSsrKSFkIT09IWIoYVtlXSxlKSYmZi5wdXNoKGFbZV0pO3JldHVybiBmfSxtYXA6ZnVuY3Rpb24oYSxiLGQpe2Zvcih2YXIgZj1bXSxlLGo9MCxpPWEubGVuZ3RoO2o8aTtqKyspe2U9YihhW2pdLGosZCk7aWYoZSE9bnVsbClmW2YubGVuZ3RoXT1lfXJldHVybiBmLmNvbmNhdC5hcHBseShbXSxmKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYixkKXtpZihhcmd1bWVudHMubGVuZ3RoPT09MilpZih0eXBlb2YgYj09PSJzdHJpbmciKXtkPWE7YT1kW2JdO2I9d31lbHNlIGlmKGImJgohYy5pc0Z1bmN0aW9uKGIpKXtkPWI7Yj13fWlmKCFiJiZhKWI9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShkfHx0aGlzLGFyZ3VtZW50cyl9O2lmKGEpYi5ndWlkPWEuZ3VpZD1hLmd1aWR8fGIuZ3VpZHx8Yy5ndWlkKys7cmV0dXJuIGJ9LHVhTWF0Y2g6ZnVuY3Rpb24oYSl7YT1hLnRvTG93ZXJDYXNlKCk7YT0vKHdlYmtpdClbIFwvXShbXHcuXSspLy5leGVjKGEpfHwvKG9wZXJhKSg/Oi4qdmVyc2lvbik/WyBcL10oW1x3Ll0rKS8uZXhlYyhhKXx8Lyhtc2llKSAoW1x3Ll0rKS8uZXhlYyhhKXx8IS9jb21wYXRpYmxlLy50ZXN0KGEpJiYvKG1vemlsbGEpKD86Lio/IHJ2OihbXHcuXSspKT8vLmV4ZWMoYSl8fFtdO3JldHVybnticm93c2VyOmFbMV18fCIiLHZlcnNpb246YVsyXXx8IjAifX0sYnJvd3Nlcjp7fX0pO1A9Yy51YU1hdGNoKFApO2lmKFAuYnJvd3Nlcil7Yy5icm93c2VyW1AuYnJvd3Nlcl09dHJ1ZTtjLmJyb3dzZXIudmVyc2lvbj1QLnZlcnNpb259aWYoYy5icm93c2VyLndlYmtpdCljLmJyb3dzZXIuc2FmYXJpPQp0cnVlO2lmKHlhKWMuaW5BcnJheT1mdW5jdGlvbihhLGIpe3JldHVybiB5YS5jYWxsKGIsYSl9O1Q9YyhzKTtpZihzLmFkZEV2ZW50TGlzdGVuZXIpTD1mdW5jdGlvbigpe3MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsTCxmYWxzZSk7Yy5yZWFkeSgpfTtlbHNlIGlmKHMuYXR0YWNoRXZlbnQpTD1mdW5jdGlvbigpe2lmKHMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpe3MuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsTCk7Yy5yZWFkeSgpfX07KGZ1bmN0aW9uKCl7Yy5zdXBwb3J0PXt9O3ZhciBhPXMuZG9jdW1lbnRFbGVtZW50LGI9cy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkPXMuY3JlYXRlRWxlbWVudCgiZGl2IiksZj0ic2NyaXB0IitKKCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtkLmlubmVySFRNTD0iICAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJyBzdHlsZT0nY29sb3I6cmVkO2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiI7CnZhciBlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSxqPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXTtpZighKCFlfHwhZS5sZW5ndGh8fCFqKSl7Yy5zdXBwb3J0PXtsZWFkaW5nV2hpdGVzcGFjZTpkLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0zLHRib2R5OiFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCxodG1sU2VyaWFsaXplOiEhZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxzdHlsZTovcmVkLy50ZXN0KGouZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxocmVmTm9ybWFsaXplZDpqLmdldEF0dHJpYnV0ZSgiaHJlZiIpPT09Ii9hIixvcGFjaXR5Oi9eMC41NSQvLnRlc3Qoai5zdHlsZS5vcGFjaXR5KSxjc3NGbG9hdDohIWouc3R5bGUuY3NzRmxvYXQsY2hlY2tPbjpkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdLnZhbHVlPT09Im9uIixvcHRTZWxlY3RlZDpzLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLmFwcGVuZENoaWxkKHMuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLnNlbGVjdGVkLApwYXJlbnROb2RlOmQucmVtb3ZlQ2hpbGQoZC5hcHBlbmRDaGlsZChzLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSkucGFyZW50Tm9kZT09PW51bGwsZGVsZXRlRXhwYW5kbzp0cnVlLGNoZWNrQ2xvbmU6ZmFsc2Usc2NyaXB0RXZhbDpmYWxzZSxub0Nsb25lRXZlbnQ6dHJ1ZSxib3hNb2RlbDpudWxsfTtiLnR5cGU9InRleHQvamF2YXNjcmlwdCI7dHJ5e2IuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgid2luZG93LiIrZisiPTE7IikpfWNhdGNoKGkpe31hLmluc2VydEJlZm9yZShiLGEuZmlyc3RDaGlsZCk7aWYoQVtmXSl7Yy5zdXBwb3J0LnNjcmlwdEV2YWw9dHJ1ZTtkZWxldGUgQVtmXX10cnl7ZGVsZXRlIGIudGVzdH1jYXRjaChvKXtjLnN1cHBvcnQuZGVsZXRlRXhwYW5kbz1mYWxzZX1hLnJlbW92ZUNoaWxkKGIpO2lmKGQuYXR0YWNoRXZlbnQmJmQuZmlyZUV2ZW50KXtkLmF0dGFjaEV2ZW50KCJvbmNsaWNrIixmdW5jdGlvbiBrKCl7Yy5zdXBwb3J0Lm5vQ2xvbmVFdmVudD0KZmFsc2U7ZC5kZXRhY2hFdmVudCgib25jbGljayIsayl9KTtkLmNsb25lTm9kZSh0cnVlKS5maXJlRXZlbnQoIm9uY2xpY2siKX1kPXMuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5pbm5lckhUTUw9IjxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0ncmFkaW90ZXN0JyBjaGVja2VkPSdjaGVja2VkJy8+IjthPXMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2EuYXBwZW5kQ2hpbGQoZC5maXJzdENoaWxkKTtjLnN1cHBvcnQuY2hlY2tDbG9uZT1hLmNsb25lTm9kZSh0cnVlKS5jbG9uZU5vZGUodHJ1ZSkubGFzdENoaWxkLmNoZWNrZWQ7YyhmdW5jdGlvbigpe3ZhciBrPXMuY3JlYXRlRWxlbWVudCgiZGl2Iik7ay5zdHlsZS53aWR0aD1rLnN0eWxlLnBhZGRpbmdMZWZ0PSIxcHgiO3MuYm9keS5hcHBlbmRDaGlsZChrKTtjLmJveE1vZGVsPWMuc3VwcG9ydC5ib3hNb2RlbD1rLm9mZnNldFdpZHRoPT09MjtzLmJvZHkucmVtb3ZlQ2hpbGQoaykuc3R5bGUuZGlzcGxheT0ibm9uZSJ9KTthPWZ1bmN0aW9uKGspe3ZhciBuPQpzLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2s9Im9uIitrO3ZhciByPWsgaW4gbjtpZighcil7bi5zZXRBdHRyaWJ1dGUoaywicmV0dXJuOyIpO3I9dHlwZW9mIG5ba109PT0iZnVuY3Rpb24ifXJldHVybiByfTtjLnN1cHBvcnQuc3VibWl0QnViYmxlcz1hKCJzdWJtaXQiKTtjLnN1cHBvcnQuY2hhbmdlQnViYmxlcz1hKCJjaGFuZ2UiKTthPWI9ZD1lPWo9bnVsbH19KSgpO2MucHJvcHM9eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLHJlYWRvbmx5OiJyZWFkT25seSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIscm93c3Bhbjoicm93U3BhbiIsY29sc3BhbjoiY29sU3BhbiIsdGFiaW5kZXg6InRhYkluZGV4Iix1c2VtYXA6InVzZU1hcCIsZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIn07dmFyIEc9ImpRdWVyeSIrSigpLFlhPTAsemE9e307Yy5leHRlbmQoe2NhY2hlOnt9LGV4cGFuZG86Ryxub0RhdGE6e2VtYmVkOnRydWUsb2JqZWN0OnRydWUsCmFwcGxldDp0cnVlfSxkYXRhOmZ1bmN0aW9uKGEsYixkKXtpZighKGEubm9kZU5hbWUmJmMubm9EYXRhW2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pKXthPWE9PUE/emE6YTt2YXIgZj1hW0ddLGU9Yy5jYWNoZTtpZighZiYmdHlwZW9mIGI9PT0ic3RyaW5nIiYmZD09PXcpcmV0dXJuIG51bGw7Znx8KGY9KytZYSk7aWYodHlwZW9mIGI9PT0ib2JqZWN0Iil7YVtHXT1mO2VbZl09Yy5leHRlbmQodHJ1ZSx7fSxiKX1lbHNlIGlmKCFlW2ZdKXthW0ddPWY7ZVtmXT17fX1hPWVbZl07aWYoZCE9PXcpYVtiXT1kO3JldHVybiB0eXBlb2YgYj09PSJzdHJpbmciP2FbYl06YX19LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtpZighKGEubm9kZU5hbWUmJmMubm9EYXRhW2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pKXthPWE9PUE/emE6YTt2YXIgZD1hW0ddLGY9Yy5jYWNoZSxlPWZbZF07aWYoYil7aWYoZSl7ZGVsZXRlIGVbYl07Yy5pc0VtcHR5T2JqZWN0KGUpJiZjLnJlbW92ZURhdGEoYSl9fWVsc2V7aWYoYy5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8pZGVsZXRlIGFbYy5leHBhbmRvXTsKZWxzZSBhLnJlbW92ZUF0dHJpYnV0ZSYmYS5yZW1vdmVBdHRyaWJ1dGUoYy5leHBhbmRvKTtkZWxldGUgZltkXX19fX0pO2MuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PT0idW5kZWZpbmVkIiYmdGhpcy5sZW5ndGgpcmV0dXJuIGMuZGF0YSh0aGlzWzBdKTtlbHNlIGlmKHR5cGVvZiBhPT09Im9iamVjdCIpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2MuZGF0YSh0aGlzLGEpfSk7dmFyIGQ9YS5zcGxpdCgiLiIpO2RbMV09ZFsxXT8iLiIrZFsxXToiIjtpZihiPT09dyl7dmFyIGY9dGhpcy50cmlnZ2VySGFuZGxlcigiZ2V0RGF0YSIrZFsxXSsiISIsW2RbMF1dKTtpZihmPT09dyYmdGhpcy5sZW5ndGgpZj1jLmRhdGEodGhpc1swXSxhKTtyZXR1cm4gZj09PXcmJmRbMV0/dGhpcy5kYXRhKGRbMF0pOmZ9ZWxzZSByZXR1cm4gdGhpcy50cmlnZ2VyKCJzZXREYXRhIitkWzFdKyIhIixbZFswXSxiXSkuZWFjaChmdW5jdGlvbigpe2MuZGF0YSh0aGlzLAphLGIpfSl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2MucmVtb3ZlRGF0YSh0aGlzLGEpfSl9fSk7Yy5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYixkKXtpZihhKXtiPShifHwiZngiKSsicXVldWUiO3ZhciBmPWMuZGF0YShhLGIpO2lmKCFkKXJldHVybiBmfHxbXTtpZighZnx8Yy5pc0FycmF5KGQpKWY9Yy5kYXRhKGEsYixjLm1ha2VBcnJheShkKSk7ZWxzZSBmLnB1c2goZCk7cmV0dXJuIGZ9fSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBkPWMucXVldWUoYSxiKSxmPWQuc2hpZnQoKTtpZihmPT09ImlucHJvZ3Jlc3MiKWY9ZC5zaGlmdCgpO2lmKGYpe2I9PT0iZngiJiZkLnVuc2hpZnQoImlucHJvZ3Jlc3MiKTtmLmNhbGwoYSxmdW5jdGlvbigpe2MuZGVxdWV1ZShhLGIpfSl9fX0pO2MuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhIT09InN0cmluZyIpe2I9YTthPSJmeCJ9aWYoYj09PQp3KXJldHVybiBjLnF1ZXVlKHRoaXNbMF0sYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPWMucXVldWUodGhpcyxhLGIpO2E9PT0iZngiJiZkWzBdIT09ImlucHJvZ3Jlc3MiJiZjLmRlcXVldWUodGhpcyxhKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLmRlcXVldWUodGhpcyxhKX0pfSxkZWxheTpmdW5jdGlvbihhLGIpe2E9Yy5meD9jLmZ4LnNwZWVkc1thXXx8YTphO2I9Ynx8ImZ4IjtyZXR1cm4gdGhpcy5xdWV1ZShiLGZ1bmN0aW9uKCl7dmFyIGQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKGQsYil9LGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9fSk7dmFyIEFhPS9bXG5cdF0vZyxjYT0vXHMrLyxaYT0vXHIvZywkYT0vaHJlZnxzcmN8c3R5bGUvLGFiPS8oYnV0dG9ufGlucHV0KS9pLGJiPS8oYnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpL2ksCmNiPS9eKGF8YXJlYSkkL2ksQmE9L3JhZGlvfGNoZWNrYm94LztjLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBYKHRoaXMsYSxiLHRydWUsYy5hdHRyKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5hdHRyKHRoaXMsYSwiIik7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMucmVtb3ZlQXR0cmlidXRlKGEpfSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3ZhciByPWModGhpcyk7ci5hZGRDbGFzcyhhLmNhbGwodGhpcyxuLHIuYXR0cigiY2xhc3MiKSkpfSk7aWYoYSYmdHlwZW9mIGE9PT0ic3RyaW5nIilmb3IodmFyIGI9KGF8fCIiKS5zcGxpdChjYSksZD0wLGY9dGhpcy5sZW5ndGg7ZDxmO2QrKyl7dmFyIGU9dGhpc1tkXTtpZihlLm5vZGVUeXBlPT09MSlpZihlLmNsYXNzTmFtZSl7Zm9yKHZhciBqPSIgIitlLmNsYXNzTmFtZSsiICIsCmk9ZS5jbGFzc05hbWUsbz0wLGs9Yi5sZW5ndGg7bzxrO28rKylpZihqLmluZGV4T2YoIiAiK2Jbb10rIiAiKTwwKWkrPSIgIitiW29dO2UuY2xhc3NOYW1lPWMudHJpbShpKX1lbHNlIGUuY2xhc3NOYW1lPWF9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGspe3ZhciBuPWModGhpcyk7bi5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxrLG4uYXR0cigiY2xhc3MiKSkpfSk7aWYoYSYmdHlwZW9mIGE9PT0ic3RyaW5nInx8YT09PXcpZm9yKHZhciBiPShhfHwiIikuc3BsaXQoY2EpLGQ9MCxmPXRoaXMubGVuZ3RoO2Q8ZjtkKyspe3ZhciBlPXRoaXNbZF07aWYoZS5ub2RlVHlwZT09PTEmJmUuY2xhc3NOYW1lKWlmKGEpe2Zvcih2YXIgaj0oIiAiK2UuY2xhc3NOYW1lKyIgIikucmVwbGFjZShBYSwiICIpLGk9MCxvPWIubGVuZ3RoO2k8bztpKyspaj1qLnJlcGxhY2UoIiAiK2JbaV0rIiAiLAoiICIpO2UuY2xhc3NOYW1lPWMudHJpbShqKX1lbHNlIGUuY2xhc3NOYW1lPSIifXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBkPXR5cGVvZiBhLGY9dHlwZW9mIGI9PT0iYm9vbGVhbiI7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIGo9Yyh0aGlzKTtqLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGUsai5hdHRyKCJjbGFzcyIpLGIpLGIpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKGQ9PT0ic3RyaW5nIilmb3IodmFyIGUsaj0wLGk9Yyh0aGlzKSxvPWIsaz1hLnNwbGl0KGNhKTtlPWtbaisrXTspe289Zj9vOiFpLmhhc0NsYXNzKGUpO2lbbz8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKGUpfWVsc2UgaWYoZD09PSJ1bmRlZmluZWQifHxkPT09ImJvb2xlYW4iKXt0aGlzLmNsYXNzTmFtZSYmYy5kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKTt0aGlzLmNsYXNzTmFtZT0KdGhpcy5jbGFzc05hbWV8fGE9PT1mYWxzZT8iIjpjLmRhdGEodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIn19KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7YT0iICIrYSsiICI7Zm9yKHZhciBiPTAsZD10aGlzLmxlbmd0aDtiPGQ7YisrKWlmKCgiICIrdGhpc1tiXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKEFhLCIgIikuaW5kZXhPZihhKT4tMSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2V9LHZhbDpmdW5jdGlvbihhKXtpZihhPT09dyl7dmFyIGI9dGhpc1swXTtpZihiKXtpZihjLm5vZGVOYW1lKGIsIm9wdGlvbiIpKXJldHVybihiLmF0dHJpYnV0ZXMudmFsdWV8fHt9KS5zcGVjaWZpZWQ/Yi52YWx1ZTpiLnRleHQ7aWYoYy5ub2RlTmFtZShiLCJzZWxlY3QiKSl7dmFyIGQ9Yi5zZWxlY3RlZEluZGV4LGY9W10sZT1iLm9wdGlvbnM7Yj1iLnR5cGU9PT0ic2VsZWN0LW9uZSI7aWYoZDwwKXJldHVybiBudWxsO3ZhciBqPWI/ZDowO2ZvcihkPWI/ZCsxOmUubGVuZ3RoO2o8ZDtqKyspe3ZhciBpPQplW2pdO2lmKGkuc2VsZWN0ZWQpe2E9YyhpKS52YWwoKTtpZihiKXJldHVybiBhO2YucHVzaChhKX19cmV0dXJuIGZ9aWYoQmEudGVzdChiLnR5cGUpJiYhYy5zdXBwb3J0LmNoZWNrT24pcmV0dXJuIGIuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPT09bnVsbD8ib24iOmIudmFsdWU7cmV0dXJuKGIudmFsdWV8fCIiKS5yZXBsYWNlKFphLCIiKX1yZXR1cm4gd312YXIgbz1jLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihrKXt2YXIgbj1jKHRoaXMpLHI9YTtpZih0aGlzLm5vZGVUeXBlPT09MSl7aWYobylyPWEuY2FsbCh0aGlzLGssbi52YWwoKSk7aWYodHlwZW9mIHI9PT0ibnVtYmVyIilyKz0iIjtpZihjLmlzQXJyYXkocikmJkJhLnRlc3QodGhpcy50eXBlKSl0aGlzLmNoZWNrZWQ9Yy5pbkFycmF5KG4udmFsKCkscik+PTA7ZWxzZSBpZihjLm5vZGVOYW1lKHRoaXMsInNlbGVjdCIpKXt2YXIgdT1jLm1ha2VBcnJheShyKTtjKCJvcHRpb24iLHRoaXMpLmVhY2goZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPQpjLmluQXJyYXkoYyh0aGlzKS52YWwoKSx1KT49MH0pO2lmKCF1Lmxlbmd0aCl0aGlzLnNlbGVjdGVkSW5kZXg9LTF9ZWxzZSB0aGlzLnZhbHVlPXJ9fSl9fSk7Yy5leHRlbmQoe2F0dHJGbjp7dmFsOnRydWUsY3NzOnRydWUsaHRtbDp0cnVlLHRleHQ6dHJ1ZSxkYXRhOnRydWUsd2lkdGg6dHJ1ZSxoZWlnaHQ6dHJ1ZSxvZmZzZXQ6dHJ1ZX0sYXR0cjpmdW5jdGlvbihhLGIsZCxmKXtpZighYXx8YS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04KXJldHVybiB3O2lmKGYmJmIgaW4gYy5hdHRyRm4pcmV0dXJuIGMoYSlbYl0oZCk7Zj1hLm5vZGVUeXBlIT09MXx8IWMuaXNYTUxEb2MoYSk7dmFyIGU9ZCE9PXc7Yj1mJiZjLnByb3BzW2JdfHxiO2lmKGEubm9kZVR5cGU9PT0xKXt2YXIgaj0kYS50ZXN0KGIpO2lmKGIgaW4gYSYmZiYmIWope2lmKGUpe2I9PT0idHlwZSImJmFiLnRlc3QoYS5ub2RlTmFtZSkmJmEucGFyZW50Tm9kZSYmYy5lcnJvcigidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIik7CmFbYl09ZH1pZihjLm5vZGVOYW1lKGEsImZvcm0iKSYmYS5nZXRBdHRyaWJ1dGVOb2RlKGIpKXJldHVybiBhLmdldEF0dHJpYnV0ZU5vZGUoYikubm9kZVZhbHVlO2lmKGI9PT0idGFiSW5kZXgiKXJldHVybihiPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiSW5kZXgiKSkmJmIuc3BlY2lmaWVkP2IudmFsdWU6YmIudGVzdChhLm5vZGVOYW1lKXx8Y2IudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6dztyZXR1cm4gYVtiXX1pZighYy5zdXBwb3J0LnN0eWxlJiZmJiZiPT09InN0eWxlIil7aWYoZSlhLnN0eWxlLmNzc1RleHQ9IiIrZDtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0fWUmJmEuc2V0QXR0cmlidXRlKGIsIiIrZCk7YT0hYy5zdXBwb3J0LmhyZWZOb3JtYWxpemVkJiZmJiZqP2EuZ2V0QXR0cmlidXRlKGIsMik6YS5nZXRBdHRyaWJ1dGUoYik7cmV0dXJuIGE9PT1udWxsP3c6YX1yZXR1cm4gYy5zdHlsZShhLGIsZCl9fSk7dmFyIE89L1wuKC4qKSQvLGRiPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1teXHdcc1wuXHxgXS9nLApmdW5jdGlvbihiKXtyZXR1cm4iXFwiK2J9KX07Yy5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYixkLGYpe2lmKCEoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04KSl7aWYoYS5zZXRJbnRlcnZhbCYmYSE9PUEmJiFhLmZyYW1lRWxlbWVudClhPUE7dmFyIGUsajtpZihkLmhhbmRsZXIpe2U9ZDtkPWUuaGFuZGxlcn1pZighZC5ndWlkKWQuZ3VpZD1jLmd1aWQrKztpZihqPWMuZGF0YShhKSl7dmFyIGk9ai5ldmVudHM9ai5ldmVudHN8fHt9LG89ai5oYW5kbGU7aWYoIW8pai5oYW5kbGU9bz1mdW5jdGlvbigpe3JldHVybiB0eXBlb2YgYyE9PSJ1bmRlZmluZWQiJiYhYy5ldmVudC50cmlnZ2VyZWQ/Yy5ldmVudC5oYW5kbGUuYXBwbHkoby5lbGVtLGFyZ3VtZW50cyk6d307by5lbGVtPWE7Yj1iLnNwbGl0KCIgIik7Zm9yKHZhciBrLG49MCxyO2s9YltuKytdOyl7aj1lP2MuZXh0ZW5kKHt9LGUpOntoYW5kbGVyOmQsZGF0YTpmfTtpZihrLmluZGV4T2YoIi4iKT4tMSl7cj1rLnNwbGl0KCIuIik7Cms9ci5zaGlmdCgpO2oubmFtZXNwYWNlPXIuc2xpY2UoMCkuc29ydCgpLmpvaW4oIi4iKX1lbHNle3I9W107ai5uYW1lc3BhY2U9IiJ9ai50eXBlPWs7ai5ndWlkPWQuZ3VpZDt2YXIgdT1pW2tdLHo9Yy5ldmVudC5zcGVjaWFsW2tdfHx7fTtpZighdSl7dT1pW2tdPVtdO2lmKCF6LnNldHVwfHx6LnNldHVwLmNhbGwoYSxmLHIsbyk9PT1mYWxzZSlpZihhLmFkZEV2ZW50TGlzdGVuZXIpYS5hZGRFdmVudExpc3RlbmVyKGssbyxmYWxzZSk7ZWxzZSBhLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrayxvKX1pZih6LmFkZCl7ei5hZGQuY2FsbChhLGopO2lmKCFqLmhhbmRsZXIuZ3VpZClqLmhhbmRsZXIuZ3VpZD1kLmd1aWR9dS5wdXNoKGopO2MuZXZlbnQuZ2xvYmFsW2tdPXRydWV9YT1udWxsfX19LGdsb2JhbDp7fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGQsZil7aWYoIShhLm5vZGVUeXBlPT09M3x8YS5ub2RlVHlwZT09PTgpKXt2YXIgZSxqPTAsaSxvLGssbixyLHUsej1jLmRhdGEoYSksCkM9eiYmei5ldmVudHM7aWYoeiYmQyl7aWYoYiYmYi50eXBlKXtkPWIuaGFuZGxlcjtiPWIudHlwZX1pZighYnx8dHlwZW9mIGI9PT0ic3RyaW5nIiYmYi5jaGFyQXQoMCk9PT0iLiIpe2I9Ynx8IiI7Zm9yKGUgaW4gQyljLmV2ZW50LnJlbW92ZShhLGUrYil9ZWxzZXtmb3IoYj1iLnNwbGl0KCIgIik7ZT1iW2orK107KXtuPWU7aT1lLmluZGV4T2YoIi4iKTwwO289W107aWYoIWkpe289ZS5zcGxpdCgiLiIpO2U9by5zaGlmdCgpO2s9bmV3IFJlZ0V4cCgiKF58XFwuKSIrYy5tYXAoby5zbGljZSgwKS5zb3J0KCksZGIpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpfWlmKHI9Q1tlXSlpZihkKXtuPWMuZXZlbnQuc3BlY2lhbFtlXXx8e307Zm9yKEI9Znx8MDtCPHIubGVuZ3RoO0IrKyl7dT1yW0JdO2lmKGQuZ3VpZD09PXUuZ3VpZCl7aWYoaXx8ay50ZXN0KHUubmFtZXNwYWNlKSl7Zj09bnVsbCYmci5zcGxpY2UoQi0tLDEpO24ucmVtb3ZlJiZuLnJlbW92ZS5jYWxsKGEsdSl9aWYoZiE9Cm51bGwpYnJlYWt9fWlmKHIubGVuZ3RoPT09MHx8ZiE9bnVsbCYmci5sZW5ndGg9PT0xKXtpZighbi50ZWFyZG93bnx8bi50ZWFyZG93bi5jYWxsKGEsbyk9PT1mYWxzZSlDYShhLGUsei5oYW5kbGUpO2RlbGV0ZSBDW2VdfX1lbHNlIGZvcih2YXIgQj0wO0I8ci5sZW5ndGg7QisrKXt1PXJbQl07aWYoaXx8ay50ZXN0KHUubmFtZXNwYWNlKSl7Yy5ldmVudC5yZW1vdmUoYSxuLHUuaGFuZGxlcixCKTtyLnNwbGljZShCLS0sMSl9fX1pZihjLmlzRW1wdHlPYmplY3QoQykpe2lmKGI9ei5oYW5kbGUpYi5lbGVtPW51bGw7ZGVsZXRlIHouZXZlbnRzO2RlbGV0ZSB6LmhhbmRsZTtjLmlzRW1wdHlPYmplY3QoeikmJmMucmVtb3ZlRGF0YShhKX19fX19LHRyaWdnZXI6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGU9YS50eXBlfHxhO2lmKCFmKXthPXR5cGVvZiBhPT09Im9iamVjdCI/YVtHXT9hOmMuZXh0ZW5kKGMuRXZlbnQoZSksYSk6Yy5FdmVudChlKTtpZihlLmluZGV4T2YoIiEiKT49MCl7YS50eXBlPQplPWUuc2xpY2UoMCwtMSk7YS5leGNsdXNpdmU9dHJ1ZX1pZighZCl7YS5zdG9wUHJvcGFnYXRpb24oKTtjLmV2ZW50Lmdsb2JhbFtlXSYmYy5lYWNoKGMuY2FjaGUsZnVuY3Rpb24oKXt0aGlzLmV2ZW50cyYmdGhpcy5ldmVudHNbZV0mJmMuZXZlbnQudHJpZ2dlcihhLGIsdGhpcy5oYW5kbGUuZWxlbSl9KX1pZighZHx8ZC5ub2RlVHlwZT09PTN8fGQubm9kZVR5cGU9PT04KXJldHVybiB3O2EucmVzdWx0PXc7YS50YXJnZXQ9ZDtiPWMubWFrZUFycmF5KGIpO2IudW5zaGlmdChhKX1hLmN1cnJlbnRUYXJnZXQ9ZDsoZj1jLmRhdGEoZCwiaGFuZGxlIikpJiZmLmFwcGx5KGQsYik7Zj1kLnBhcmVudE5vZGV8fGQub3duZXJEb2N1bWVudDt0cnl7aWYoIShkJiZkLm5vZGVOYW1lJiZjLm5vRGF0YVtkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSlpZihkWyJvbiIrZV0mJmRbIm9uIitlXS5hcHBseShkLGIpPT09ZmFsc2UpYS5yZXN1bHQ9ZmFsc2V9Y2F0Y2goail7fWlmKCFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJgpmKWMuZXZlbnQudHJpZ2dlcihhLGIsZix0cnVlKTtlbHNlIGlmKCFhLmlzRGVmYXVsdFByZXZlbnRlZCgpKXtmPWEudGFyZ2V0O3ZhciBpLG89Yy5ub2RlTmFtZShmLCJhIikmJmU9PT0iY2xpY2siLGs9Yy5ldmVudC5zcGVjaWFsW2VdfHx7fTtpZigoIWsuX2RlZmF1bHR8fGsuX2RlZmF1bHQuY2FsbChkLGEpPT09ZmFsc2UpJiYhbyYmIShmJiZmLm5vZGVOYW1lJiZjLm5vRGF0YVtmLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSl7dHJ5e2lmKGZbZV0pe2lmKGk9Zlsib24iK2VdKWZbIm9uIitlXT1udWxsO2MuZXZlbnQudHJpZ2dlcmVkPXRydWU7ZltlXSgpfX1jYXRjaChuKXt9aWYoaSlmWyJvbiIrZV09aTtjLmV2ZW50LnRyaWdnZXJlZD1mYWxzZX19fSxoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGIsZCxmLGU7YT1hcmd1bWVudHNbMF09Yy5ldmVudC5maXgoYXx8QS5ldmVudCk7YS5jdXJyZW50VGFyZ2V0PXRoaXM7Yj1hLnR5cGUuaW5kZXhPZigiLiIpPDAmJiFhLmV4Y2x1c2l2ZTsKaWYoIWIpe2Q9YS50eXBlLnNwbGl0KCIuIik7YS50eXBlPWQuc2hpZnQoKTtmPW5ldyBSZWdFeHAoIihefFxcLikiK2Quc2xpY2UoMCkuc29ydCgpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpfWU9Yy5kYXRhKHRoaXMsImV2ZW50cyIpO2Q9ZVthLnR5cGVdO2lmKGUmJmQpe2Q9ZC5zbGljZSgwKTtlPTA7Zm9yKHZhciBqPWQubGVuZ3RoO2U8ajtlKyspe3ZhciBpPWRbZV07aWYoYnx8Zi50ZXN0KGkubmFtZXNwYWNlKSl7YS5oYW5kbGVyPWkuaGFuZGxlcjthLmRhdGE9aS5kYXRhO2EuaGFuZGxlT2JqPWk7aT1pLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKGkhPT13KXthLnJlc3VsdD1pO2lmKGk9PT1mYWxzZSl7YS5wcmV2ZW50RGVmYXVsdCgpO2Euc3RvcFByb3BhZ2F0aW9uKCl9fWlmKGEuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVha319fXJldHVybiBhLnJlc3VsdH0scHJvcHM6ImFsdEtleSBhdHRyQ2hhbmdlIGF0dHJOYW1lIGJ1YmJsZXMgYnV0dG9uIGNhbmNlbGFibGUgY2hhckNvZGUgY2xpZW50WCBjbGllbnRZIGN0cmxLZXkgY3VycmVudFRhcmdldCBkYXRhIGRldGFpbCBldmVudFBoYXNlIGZyb21FbGVtZW50IGhhbmRsZXIga2V5Q29kZSBsYXllclggbGF5ZXJZIG1ldGFLZXkgbmV3VmFsdWUgb2Zmc2V0WCBvZmZzZXRZIG9yaWdpbmFsVGFyZ2V0IHBhZ2VYIHBhZ2VZIHByZXZWYWx1ZSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNjcmVlblggc2NyZWVuWSBzaGlmdEtleSBzcmNFbGVtZW50IHRhcmdldCB0b0VsZW1lbnQgdmlldyB3aGVlbERlbHRhIHdoaWNoIi5zcGxpdCgiICIpLApmaXg6ZnVuY3Rpb24oYSl7aWYoYVtHXSlyZXR1cm4gYTt2YXIgYj1hO2E9Yy5FdmVudChiKTtmb3IodmFyIGQ9dGhpcy5wcm9wcy5sZW5ndGgsZjtkOyl7Zj10aGlzLnByb3BzWy0tZF07YVtmXT1iW2ZdfWlmKCFhLnRhcmdldClhLnRhcmdldD1hLnNyY0VsZW1lbnR8fHM7aWYoYS50YXJnZXQubm9kZVR5cGU9PT0zKWEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGU7aWYoIWEucmVsYXRlZFRhcmdldCYmYS5mcm9tRWxlbWVudClhLnJlbGF0ZWRUYXJnZXQ9YS5mcm9tRWxlbWVudD09PWEudGFyZ2V0P2EudG9FbGVtZW50OmEuZnJvbUVsZW1lbnQ7aWYoYS5wYWdlWD09bnVsbCYmYS5jbGllbnRYIT1udWxsKXtiPXMuZG9jdW1lbnRFbGVtZW50O2Q9cy5ib2R5O2EucGFnZVg9YS5jbGllbnRYKyhiJiZiLnNjcm9sbExlZnR8fGQmJmQuc2Nyb2xsTGVmdHx8MCktKGImJmIuY2xpZW50TGVmdHx8ZCYmZC5jbGllbnRMZWZ0fHwwKTthLnBhZ2VZPWEuY2xpZW50WSsoYiYmYi5zY3JvbGxUb3B8fApkJiZkLnNjcm9sbFRvcHx8MCktKGImJmIuY2xpZW50VG9wfHxkJiZkLmNsaWVudFRvcHx8MCl9aWYoIWEud2hpY2gmJihhLmNoYXJDb2RlfHxhLmNoYXJDb2RlPT09MD9hLmNoYXJDb2RlOmEua2V5Q29kZSkpYS53aGljaD1hLmNoYXJDb2RlfHxhLmtleUNvZGU7aWYoIWEubWV0YUtleSYmYS5jdHJsS2V5KWEubWV0YUtleT1hLmN0cmxLZXk7aWYoIWEud2hpY2gmJmEuYnV0dG9uIT09dylhLndoaWNoPWEuYnV0dG9uJjE/MTphLmJ1dHRvbiYyPzM6YS5idXR0b24mND8yOjA7cmV0dXJuIGF9LGd1aWQ6MUU4LHByb3h5OmMucHJveHksc3BlY2lhbDp7cmVhZHk6e3NldHVwOmMuYmluZFJlYWR5LHRlYXJkb3duOmMubm9vcH0sbGl2ZTp7YWRkOmZ1bmN0aW9uKGEpe2MuZXZlbnQuYWRkKHRoaXMsYS5vcmlnVHlwZSxjLmV4dGVuZCh7fSxhLHtoYW5kbGVyOm9hfSkpfSxyZW1vdmU6ZnVuY3Rpb24oYSl7dmFyIGI9dHJ1ZSxkPWEub3JpZ1R5cGUucmVwbGFjZShPLCIiKTtjLmVhY2goYy5kYXRhKHRoaXMsCiJldmVudHMiKS5saXZlfHxbXSxmdW5jdGlvbigpe2lmKGQ9PT10aGlzLm9yaWdUeXBlLnJlcGxhY2UoTywiIikpcmV0dXJuIGI9ZmFsc2V9KTtiJiZjLmV2ZW50LnJlbW92ZSh0aGlzLGEub3JpZ1R5cGUsb2EpfX0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihhLGIsZCl7aWYodGhpcy5zZXRJbnRlcnZhbCl0aGlzLm9uYmVmb3JldW5sb2FkPWQ7cmV0dXJuIGZhbHNlfSx0ZWFyZG93bjpmdW5jdGlvbihhLGIpe2lmKHRoaXMub25iZWZvcmV1bmxvYWQ9PT1iKXRoaXMub25iZWZvcmV1bmxvYWQ9bnVsbH19fX07dmFyIENhPXMucmVtb3ZlRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbihhLGIsZCl7YS5yZW1vdmVFdmVudExpc3RlbmVyKGIsZCxmYWxzZSl9OmZ1bmN0aW9uKGEsYixkKXthLmRldGFjaEV2ZW50KCJvbiIrYixkKX07Yy5FdmVudD1mdW5jdGlvbihhKXtpZighdGhpcy5wcmV2ZW50RGVmYXVsdClyZXR1cm4gbmV3IGMuRXZlbnQoYSk7aWYoYSYmYS50eXBlKXt0aGlzLm9yaWdpbmFsRXZlbnQ9CmE7dGhpcy50eXBlPWEudHlwZX1lbHNlIHRoaXMudHlwZT1hO3RoaXMudGltZVN0YW1wPUooKTt0aGlzW0ddPXRydWV9O2MuRXZlbnQucHJvdG90eXBlPXtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPVo7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKGEpe2EucHJldmVudERlZmF1bHQmJmEucHJldmVudERlZmF1bHQoKTthLnJldHVyblZhbHVlPWZhbHNlfX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1aO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDtpZihhKXthLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKTthLmNhbmNlbEJ1YmJsZT10cnVlfX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1aO3RoaXMuc3RvcFByb3BhZ2F0aW9uKCl9LGlzRGVmYXVsdFByZXZlbnRlZDpZLGlzUHJvcGFnYXRpb25TdG9wcGVkOlksCmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOll9O3ZhciBEYT1mdW5jdGlvbihhKXt2YXIgYj1hLnJlbGF0ZWRUYXJnZXQ7dHJ5e2Zvcig7YiYmYiE9PXRoaXM7KWI9Yi5wYXJlbnROb2RlO2lmKGIhPT10aGlzKXthLnR5cGU9YS5kYXRhO2MuZXZlbnQuaGFuZGxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19Y2F0Y2goZCl7fX0sRWE9ZnVuY3Rpb24oYSl7YS50eXBlPWEuZGF0YTtjLmV2ZW50LmhhbmRsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2MuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7Yy5ldmVudC5zcGVjaWFsW2FdPXtzZXR1cDpmdW5jdGlvbihkKXtjLmV2ZW50LmFkZCh0aGlzLGIsZCYmZC5zZWxlY3Rvcj9FYTpEYSxhKX0sdGVhcmRvd246ZnVuY3Rpb24oZCl7Yy5ldmVudC5yZW1vdmUodGhpcyxiLGQmJmQuc2VsZWN0b3I/RWE6RGEpfX19KTtpZighYy5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXMpYy5ldmVudC5zcGVjaWFsLnN1Ym1pdD0Ke3NldHVwOmZ1bmN0aW9uKCl7aWYodGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09ImZvcm0iKXtjLmV2ZW50LmFkZCh0aGlzLCJjbGljay5zcGVjaWFsU3VibWl0IixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxkPWIudHlwZTtpZigoZD09PSJzdWJtaXQifHxkPT09ImltYWdlIikmJmMoYikuY2xvc2VzdCgiZm9ybSIpLmxlbmd0aClyZXR1cm4gbmEoInN1Ym1pdCIsdGhpcyxhcmd1bWVudHMpfSk7Yy5ldmVudC5hZGQodGhpcywia2V5cHJlc3Muc3BlY2lhbFN1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsZD1iLnR5cGU7aWYoKGQ9PT0idGV4dCJ8fGQ9PT0icGFzc3dvcmQiKSYmYyhiKS5jbG9zZXN0KCJmb3JtIikubGVuZ3RoJiZhLmtleUNvZGU9PT0xMylyZXR1cm4gbmEoInN1Ym1pdCIsdGhpcyxhcmd1bWVudHMpfSl9ZWxzZSByZXR1cm4gZmFsc2V9LHRlYXJkb3duOmZ1bmN0aW9uKCl7Yy5ldmVudC5yZW1vdmUodGhpcywiLnNwZWNpYWxTdWJtaXQiKX19OwppZighYy5zdXBwb3J0LmNoYW5nZUJ1YmJsZXMpe3ZhciBkYT0vdGV4dGFyZWF8aW5wdXR8c2VsZWN0L2ksZWEsRmE9ZnVuY3Rpb24oYSl7dmFyIGI9YS50eXBlLGQ9YS52YWx1ZTtpZihiPT09InJhZGlvInx8Yj09PSJjaGVja2JveCIpZD1hLmNoZWNrZWQ7ZWxzZSBpZihiPT09InNlbGVjdC1tdWx0aXBsZSIpZD1hLnNlbGVjdGVkSW5kZXg+LTE/Yy5tYXAoYS5vcHRpb25zLGZ1bmN0aW9uKGYpe3JldHVybiBmLnNlbGVjdGVkfSkuam9pbigiLSIpOiIiO2Vsc2UgaWYoYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InNlbGVjdCIpZD1hLnNlbGVjdGVkSW5kZXg7cmV0dXJuIGR9LGZhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9YS50YXJnZXQsZixlO2lmKCEoIWRhLnRlc3QoZC5ub2RlTmFtZSl8fGQucmVhZE9ubHkpKXtmPWMuZGF0YShkLCJfY2hhbmdlX2RhdGEiKTtlPUZhKGQpO2lmKGEudHlwZSE9PSJmb2N1c291dCJ8fGQudHlwZSE9PSJyYWRpbyIpYy5kYXRhKGQsIl9jaGFuZ2VfZGF0YSIsCmUpO2lmKCEoZj09PXd8fGU9PT1mKSlpZihmIT1udWxsfHxlKXthLnR5cGU9ImNoYW5nZSI7cmV0dXJuIGMuZXZlbnQudHJpZ2dlcihhLGIsZCl9fX07Yy5ldmVudC5zcGVjaWFsLmNoYW5nZT17ZmlsdGVyczp7Zm9jdXNvdXQ6ZmEsY2xpY2s6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsZD1iLnR5cGU7aWYoZD09PSJyYWRpbyJ8fGQ9PT0iY2hlY2tib3gifHxiLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0ic2VsZWN0IilyZXR1cm4gZmEuY2FsbCh0aGlzLGEpfSxrZXlkb3duOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGQ9Yi50eXBlO2lmKGEua2V5Q29kZT09PTEzJiZiLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0idGV4dGFyZWEifHxhLmtleUNvZGU9PT0zMiYmKGQ9PT0iY2hlY2tib3gifHxkPT09InJhZGlvIil8fGQ9PT0ic2VsZWN0LW11bHRpcGxlIilyZXR1cm4gZmEuY2FsbCh0aGlzLGEpfSxiZWZvcmVhY3RpdmF0ZTpmdW5jdGlvbihhKXthPWEudGFyZ2V0O2MuZGF0YShhLAoiX2NoYW5nZV9kYXRhIixGYShhKSl9fSxzZXR1cDpmdW5jdGlvbigpe2lmKHRoaXMudHlwZT09PSJmaWxlIilyZXR1cm4gZmFsc2U7Zm9yKHZhciBhIGluIGVhKWMuZXZlbnQuYWRkKHRoaXMsYSsiLnNwZWNpYWxDaGFuZ2UiLGVhW2FdKTtyZXR1cm4gZGEudGVzdCh0aGlzLm5vZGVOYW1lKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtjLmV2ZW50LnJlbW92ZSh0aGlzLCIuc3BlY2lhbENoYW5nZSIpO3JldHVybiBkYS50ZXN0KHRoaXMubm9kZU5hbWUpfX07ZWE9Yy5ldmVudC5zcGVjaWFsLmNoYW5nZS5maWx0ZXJzfXMuYWRkRXZlbnRMaXN0ZW5lciYmYy5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoZil7Zj1jLmV2ZW50LmZpeChmKTtmLnR5cGU9YjtyZXR1cm4gYy5ldmVudC5oYW5kbGUuY2FsbCh0aGlzLGYpfWMuZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYSwKZCx0cnVlKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxkLHRydWUpfX19KTtjLmVhY2goWyJiaW5kIiwib25lIl0sZnVuY3Rpb24oYSxiKXtjLmZuW2JdPWZ1bmN0aW9uKGQsZixlKXtpZih0eXBlb2YgZD09PSJvYmplY3QiKXtmb3IodmFyIGogaW4gZCl0aGlzW2JdKGosZixkW2pdLGUpO3JldHVybiB0aGlzfWlmKGMuaXNGdW5jdGlvbihmKSl7ZT1mO2Y9d312YXIgaT1iPT09Im9uZSI/Yy5wcm94eShlLGZ1bmN0aW9uKGspe2ModGhpcykudW5iaW5kKGssaSk7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSk6ZTtpZihkPT09InVubG9hZCImJmIhPT0ib25lIil0aGlzLm9uZShkLGYsZSk7ZWxzZXtqPTA7Zm9yKHZhciBvPXRoaXMubGVuZ3RoO2o8bztqKyspYy5ldmVudC5hZGQodGhpc1tqXSxkLGksZil9cmV0dXJuIHRoaXN9fSk7Yy5mbi5leHRlbmQoe3VuYmluZDpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09Im9iamVjdCImJgohYS5wcmV2ZW50RGVmYXVsdClmb3IodmFyIGQgaW4gYSl0aGlzLnVuYmluZChkLGFbZF0pO2Vsc2V7ZD0wO2Zvcih2YXIgZj10aGlzLmxlbmd0aDtkPGY7ZCsrKWMuZXZlbnQucmVtb3ZlKHRoaXNbZF0sYSxiKX1yZXR1cm4gdGhpc30sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGQsZil7cmV0dXJuIHRoaXMubGl2ZShiLGQsZixhKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMudW5iaW5kKCJsaXZlIik6dGhpcy5kaWUoYixudWxsLGQsYSl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe2lmKHRoaXNbMF0pe2E9Yy5FdmVudChhKTthLnByZXZlbnREZWZhdWx0KCk7YS5zdG9wUHJvcGFnYXRpb24oKTtjLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXNbMF0pO3JldHVybiBhLnJlc3VsdH19LAp0b2dnbGU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPWFyZ3VtZW50cyxkPTE7ZDxiLmxlbmd0aDspYy5wcm94eShhLGJbZCsrXSk7cmV0dXJuIHRoaXMuY2xpY2soYy5wcm94eShhLGZ1bmN0aW9uKGYpe3ZhciBlPShjLmRhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkKXx8MCklZDtjLmRhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkLGUrMSk7Zi5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBiW2VdLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8ZmFsc2V9KSl9LGhvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfX0pO3ZhciBHYT17Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0Iixtb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In07Yy5lYWNoKFsibGl2ZSIsImRpZSJdLGZ1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihkLGYsZSxqKXt2YXIgaSxvPTAsayxuLHI9anx8dGhpcy5zZWxlY3RvciwKdT1qP3RoaXM6Yyh0aGlzLmNvbnRleHQpO2lmKGMuaXNGdW5jdGlvbihmKSl7ZT1mO2Y9d31mb3IoZD0oZHx8IiIpLnNwbGl0KCIgIik7KGk9ZFtvKytdKSE9bnVsbDspe2o9Ty5leGVjKGkpO2s9IiI7aWYoail7az1qWzBdO2k9aS5yZXBsYWNlKE8sIiIpfWlmKGk9PT0iaG92ZXIiKWQucHVzaCgibW91c2VlbnRlciIraywibW91c2VsZWF2ZSIrayk7ZWxzZXtuPWk7aWYoaT09PSJmb2N1cyJ8fGk9PT0iYmx1ciIpe2QucHVzaChHYVtpXStrKTtpKz1rfWVsc2UgaT0oR2FbaV18fGkpK2s7Yj09PSJsaXZlIj91LmVhY2goZnVuY3Rpb24oKXtjLmV2ZW50LmFkZCh0aGlzLHBhKGkscikse2RhdGE6ZixzZWxlY3RvcjpyLGhhbmRsZXI6ZSxvcmlnVHlwZTppLG9yaWdIYW5kbGVyOmUscHJlVHlwZTpufSl9KTp1LnVuYmluZChwYShpLHIpLGUpfX1yZXR1cm4gdGhpc319KTtjLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IiLnNwbGl0KCIgIiksCmZ1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihkKXtyZXR1cm4gZD90aGlzLmJpbmQoYixkKTp0aGlzLnRyaWdnZXIoYil9O2lmKGMuYXR0ckZuKWMuYXR0ckZuW2JdPXRydWV9KTtBLmF0dGFjaEV2ZW50JiYhQS5hZGRFdmVudExpc3RlbmVyJiZBLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gYy5jYWNoZSlpZihjLmNhY2hlW2FdLmhhbmRsZSl0cnl7Yy5ldmVudC5yZW1vdmUoYy5jYWNoZVthXS5oYW5kbGUuZWxlbSl9Y2F0Y2goYil7fX0pOyhmdW5jdGlvbigpe2Z1bmN0aW9uIGEoZyl7Zm9yKHZhciBoPSIiLGwsbT0wO2dbbV07bSsrKXtsPWdbbV07aWYobC5ub2RlVHlwZT09PTN8fGwubm9kZVR5cGU9PT00KWgrPWwubm9kZVZhbHVlO2Vsc2UgaWYobC5ub2RlVHlwZSE9PTgpaCs9YShsLmNoaWxkTm9kZXMpfXJldHVybiBofWZ1bmN0aW9uIGIoZyxoLGwsbSxxLHApe3E9MDtmb3IodmFyIHY9bS5sZW5ndGg7cTx2O3ErKyl7dmFyIHQ9bVtxXTsKaWYodCl7dD10W2ddO2Zvcih2YXIgeT1mYWxzZTt0Oyl7aWYodC5zaXpjYWNoZT09PWwpe3k9bVt0LnNpenNldF07YnJlYWt9aWYodC5ub2RlVHlwZT09PTEmJiFwKXt0LnNpemNhY2hlPWw7dC5zaXpzZXQ9cX1pZih0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1oKXt5PXQ7YnJlYWt9dD10W2ddfW1bcV09eX19fWZ1bmN0aW9uIGQoZyxoLGwsbSxxLHApe3E9MDtmb3IodmFyIHY9bS5sZW5ndGg7cTx2O3ErKyl7dmFyIHQ9bVtxXTtpZih0KXt0PXRbZ107Zm9yKHZhciB5PWZhbHNlO3Q7KXtpZih0LnNpemNhY2hlPT09bCl7eT1tW3Quc2l6c2V0XTticmVha31pZih0Lm5vZGVUeXBlPT09MSl7aWYoIXApe3Quc2l6Y2FjaGU9bDt0LnNpenNldD1xfWlmKHR5cGVvZiBoIT09InN0cmluZyIpe2lmKHQ9PT1oKXt5PXRydWU7YnJlYWt9fWVsc2UgaWYoay5maWx0ZXIoaCxbdF0pLmxlbmd0aD4wKXt5PXQ7YnJlYWt9fXQ9dFtnXX1tW3FdPXl9fX12YXIgZj0vKCg/OlwoKD86XChbXigpXStcKXxbXigpXSspK1wpfFxbKD86XFtbXltcXV0qXF18WyciXVteJyJdKlsnIl18W15bXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZywKZT0wLGo9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxpPWZhbHNlLG89dHJ1ZTtbMCwwXS5zb3J0KGZ1bmN0aW9uKCl7bz1mYWxzZTtyZXR1cm4gMH0pO3ZhciBrPWZ1bmN0aW9uKGcsaCxsLG0pe2w9bHx8W107dmFyIHE9aD1ofHxzO2lmKGgubm9kZVR5cGUhPT0xJiZoLm5vZGVUeXBlIT09OSlyZXR1cm5bXTtpZighZ3x8dHlwZW9mIGchPT0ic3RyaW5nIilyZXR1cm4gbDtmb3IodmFyIHA9W10sdix0LHksUyxIPXRydWUsTT14KGgpLEk9ZzsoZi5leGVjKCIiKSx2PWYuZXhlYyhJKSkhPT1udWxsOyl7ST12WzNdO3AucHVzaCh2WzFdKTtpZih2WzJdKXtTPXZbM107YnJlYWt9fWlmKHAubGVuZ3RoPjEmJnIuZXhlYyhnKSlpZihwLmxlbmd0aD09PTImJm4ucmVsYXRpdmVbcFswXV0pdD1nYShwWzBdK3BbMV0saCk7ZWxzZSBmb3IodD1uLnJlbGF0aXZlW3BbMF1dP1toXTprKHAuc2hpZnQoKSxoKTtwLmxlbmd0aDspe2c9cC5zaGlmdCgpO2lmKG4ucmVsYXRpdmVbZ10pZys9cC5zaGlmdCgpOwp0PWdhKGcsdCl9ZWxzZXtpZighbSYmcC5sZW5ndGg+MSYmaC5ub2RlVHlwZT09PTkmJiFNJiZuLm1hdGNoLklELnRlc3QocFswXSkmJiFuLm1hdGNoLklELnRlc3QocFtwLmxlbmd0aC0xXSkpe3Y9ay5maW5kKHAuc2hpZnQoKSxoLE0pO2g9di5leHByP2suZmlsdGVyKHYuZXhwcix2LnNldClbMF06di5zZXRbMF19aWYoaCl7dj1tP3tleHByOnAucG9wKCksc2V0OnoobSl9OmsuZmluZChwLnBvcCgpLHAubGVuZ3RoPT09MSYmKHBbMF09PT0ifiJ8fHBbMF09PT0iKyIpJiZoLnBhcmVudE5vZGU/aC5wYXJlbnROb2RlOmgsTSk7dD12LmV4cHI/ay5maWx0ZXIodi5leHByLHYuc2V0KTp2LnNldDtpZihwLmxlbmd0aD4wKXk9eih0KTtlbHNlIEg9ZmFsc2U7Zm9yKDtwLmxlbmd0aDspe3ZhciBEPXAucG9wKCk7dj1EO2lmKG4ucmVsYXRpdmVbRF0pdj1wLnBvcCgpO2Vsc2UgRD0iIjtpZih2PT1udWxsKXY9aDtuLnJlbGF0aXZlW0RdKHksdixNKX19ZWxzZSB5PVtdfXl8fCh5PXQpO3l8fGsuZXJyb3IoRHx8CmcpO2lmKGouY2FsbCh5KT09PSJbb2JqZWN0IEFycmF5XSIpaWYoSClpZihoJiZoLm5vZGVUeXBlPT09MSlmb3IoZz0wO3lbZ10hPW51bGw7ZysrKXtpZih5W2ddJiYoeVtnXT09PXRydWV8fHlbZ10ubm9kZVR5cGU9PT0xJiZFKGgseVtnXSkpKWwucHVzaCh0W2ddKX1lbHNlIGZvcihnPTA7eVtnXSE9bnVsbDtnKyspeVtnXSYmeVtnXS5ub2RlVHlwZT09PTEmJmwucHVzaCh0W2ddKTtlbHNlIGwucHVzaC5hcHBseShsLHkpO2Vsc2Ugeih5LGwpO2lmKFMpe2soUyxxLGwsbSk7ay51bmlxdWVTb3J0KGwpfXJldHVybiBsfTtrLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZyl7aWYoQil7aT1vO2cuc29ydChCKTtpZihpKWZvcih2YXIgaD0xO2g8Zy5sZW5ndGg7aCsrKWdbaF09PT1nW2gtMV0mJmcuc3BsaWNlKGgtLSwxKX1yZXR1cm4gZ307ay5tYXRjaGVzPWZ1bmN0aW9uKGcsaCl7cmV0dXJuIGsoZyxudWxsLG51bGwsaCl9O2suZmluZD1mdW5jdGlvbihnLGgsbCl7dmFyIG0scTtpZighZylyZXR1cm5bXTsKZm9yKHZhciBwPTAsdj1uLm9yZGVyLmxlbmd0aDtwPHY7cCsrKXt2YXIgdD1uLm9yZGVyW3BdO2lmKHE9bi5sZWZ0TWF0Y2hbdF0uZXhlYyhnKSl7dmFyIHk9cVsxXTtxLnNwbGljZSgxLDEpO2lmKHkuc3Vic3RyKHkubGVuZ3RoLTEpIT09IlxcIil7cVsxXT0ocVsxXXx8IiIpLnJlcGxhY2UoL1xcL2csIiIpO209bi5maW5kW3RdKHEsaCxsKTtpZihtIT1udWxsKXtnPWcucmVwbGFjZShuLm1hdGNoW3RdLCIiKTticmVha319fX1tfHwobT1oLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpO3JldHVybntzZXQ6bSxleHByOmd9fTtrLmZpbHRlcj1mdW5jdGlvbihnLGgsbCxtKXtmb3IodmFyIHE9ZyxwPVtdLHY9aCx0LHksUz1oJiZoWzBdJiZ4KGhbMF0pO2cmJmgubGVuZ3RoOyl7Zm9yKHZhciBIIGluIG4uZmlsdGVyKWlmKCh0PW4ubGVmdE1hdGNoW0hdLmV4ZWMoZykpIT1udWxsJiZ0WzJdKXt2YXIgTT1uLmZpbHRlcltIXSxJLEQ7RD10WzFdO3k9ZmFsc2U7dC5zcGxpY2UoMSwxKTtpZihELnN1YnN0cihELmxlbmd0aC0KMSkhPT0iXFwiKXtpZih2PT09cClwPVtdO2lmKG4ucHJlRmlsdGVyW0hdKWlmKHQ9bi5wcmVGaWx0ZXJbSF0odCx2LGwscCxtLFMpKXtpZih0PT09dHJ1ZSljb250aW51ZX1lbHNlIHk9ST10cnVlO2lmKHQpZm9yKHZhciBVPTA7KEQ9dltVXSkhPW51bGw7VSsrKWlmKEQpe0k9TShELHQsVSx2KTt2YXIgSGE9bV4hIUk7aWYobCYmSSE9bnVsbClpZihIYSl5PXRydWU7ZWxzZSB2W1VdPWZhbHNlO2Vsc2UgaWYoSGEpe3AucHVzaChEKTt5PXRydWV9fWlmKEkhPT13KXtsfHwodj1wKTtnPWcucmVwbGFjZShuLm1hdGNoW0hdLCIiKTtpZigheSlyZXR1cm5bXTticmVha319fWlmKGc9PT1xKWlmKHk9PW51bGwpay5lcnJvcihnKTtlbHNlIGJyZWFrO3E9Z31yZXR1cm4gdn07ay5lcnJvcj1mdW5jdGlvbihnKXt0aHJvdyJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2c7fTt2YXIgbj1rLnNlbGVjdG9ycz17b3JkZXI6WyJJRCIsIk5BTUUiLCJUQUciXSxtYXRjaDp7SUQ6LyMoKD86W1x3XHUwMGMwLVx1RkZGRi1dfFxcLikrKS8sCkNMQVNTOi9cLigoPzpbXHdcdTAwYzAtXHVGRkZGLV18XFwuKSspLyxOQU1FOi9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRi1dfFxcLikrKVsnIl0qXF0vLEFUVFI6L1xbXHMqKCg/Oltcd1x1MDBjMC1cdUZGRkYtXXxcXC4pKylccyooPzooXFM/PSlccyooWyciXSopKC4qPylcM3wpXHMqXF0vLFRBRzovXigoPzpbXHdcdTAwYzAtXHVGRkZGXCotXXxcXC4pKykvLENISUxEOi86KG9ubHl8bnRofGxhc3R8Zmlyc3QpLWNoaWxkKD86XCgoZXZlbnxvZGR8W1xkbistXSopXCkpPy8sUE9TOi86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W14tXXwkKS8sUFNFVURPOi86KCg/Oltcd1x1MDBjMC1cdUZGRkYtXXxcXC4pKykoPzpcKChbJyJdPykoKD86XChbXlwpXStcKXxbXlwoXCldKikrKVwyXCkpPy99LGxlZnRNYXRjaDp7fSxhdHRyTWFwOnsiY2xhc3MiOiJjbGFzc05hbWUiLCJmb3IiOiJodG1sRm9yIn0sYXR0ckhhbmRsZTp7aHJlZjpmdW5jdGlvbihnKXtyZXR1cm4gZy5nZXRBdHRyaWJ1dGUoImhyZWYiKX19LApyZWxhdGl2ZTp7IisiOmZ1bmN0aW9uKGcsaCl7dmFyIGw9dHlwZW9mIGg9PT0ic3RyaW5nIixtPWwmJiEvXFcvLnRlc3QoaCk7bD1sJiYhbTtpZihtKWg9aC50b0xvd2VyQ2FzZSgpO209MDtmb3IodmFyIHE9Zy5sZW5ndGgscDttPHE7bSsrKWlmKHA9Z1ttXSl7Zm9yKDsocD1wLnByZXZpb3VzU2libGluZykmJnAubm9kZVR5cGUhPT0xOyk7Z1ttXT1sfHxwJiZwLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1oP3B8fGZhbHNlOnA9PT1ofWwmJmsuZmlsdGVyKGgsZyx0cnVlKX0sIj4iOmZ1bmN0aW9uKGcsaCl7dmFyIGw9dHlwZW9mIGg9PT0ic3RyaW5nIjtpZihsJiYhL1xXLy50ZXN0KGgpKXtoPWgudG9Mb3dlckNhc2UoKTtmb3IodmFyIG09MCxxPWcubGVuZ3RoO208cTttKyspe3ZhciBwPWdbbV07aWYocCl7bD1wLnBhcmVudE5vZGU7Z1ttXT1sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1oP2w6ZmFsc2V9fX1lbHNle209MDtmb3IocT1nLmxlbmd0aDttPHE7bSsrKWlmKHA9Z1ttXSlnW21dPQpsP3AucGFyZW50Tm9kZTpwLnBhcmVudE5vZGU9PT1oO2wmJmsuZmlsdGVyKGgsZyx0cnVlKX19LCIiOmZ1bmN0aW9uKGcsaCxsKXt2YXIgbT1lKysscT1kO2lmKHR5cGVvZiBoPT09InN0cmluZyImJiEvXFcvLnRlc3QoaCkpe3ZhciBwPWg9aC50b0xvd2VyQ2FzZSgpO3E9Yn1xKCJwYXJlbnROb2RlIixoLG0sZyxwLGwpfSwifiI6ZnVuY3Rpb24oZyxoLGwpe3ZhciBtPWUrKyxxPWQ7aWYodHlwZW9mIGg9PT0ic3RyaW5nIiYmIS9cVy8udGVzdChoKSl7dmFyIHA9aD1oLnRvTG93ZXJDYXNlKCk7cT1ifXEoInByZXZpb3VzU2libGluZyIsaCxtLGcscCxsKX19LGZpbmQ6e0lEOmZ1bmN0aW9uKGcsaCxsKXtpZih0eXBlb2YgaC5nZXRFbGVtZW50QnlJZCE9PSJ1bmRlZmluZWQiJiYhbClyZXR1cm4oZz1oLmdldEVsZW1lbnRCeUlkKGdbMV0pKT9bZ106W119LE5BTUU6ZnVuY3Rpb24oZyxoKXtpZih0eXBlb2YgaC5nZXRFbGVtZW50c0J5TmFtZSE9PSJ1bmRlZmluZWQiKXt2YXIgbD1bXTsKaD1oLmdldEVsZW1lbnRzQnlOYW1lKGdbMV0pO2Zvcih2YXIgbT0wLHE9aC5sZW5ndGg7bTxxO20rKyloW21dLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09Z1sxXSYmbC5wdXNoKGhbbV0pO3JldHVybiBsLmxlbmd0aD09PTA/bnVsbDpsfX0sVEFHOmZ1bmN0aW9uKGcsaCl7cmV0dXJuIGguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZ1sxXSl9fSxwcmVGaWx0ZXI6e0NMQVNTOmZ1bmN0aW9uKGcsaCxsLG0scSxwKXtnPSIgIitnWzFdLnJlcGxhY2UoL1xcL2csIiIpKyIgIjtpZihwKXJldHVybiBnO3A9MDtmb3IodmFyIHY7KHY9aFtwXSkhPW51bGw7cCsrKWlmKHYpaWYocV4odi5jbGFzc05hbWUmJigiICIrdi5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKC9bXHRcbl0vZywiICIpLmluZGV4T2YoZyk+PTApKWx8fG0ucHVzaCh2KTtlbHNlIGlmKGwpaFtwXT1mYWxzZTtyZXR1cm4gZmFsc2V9LElEOmZ1bmN0aW9uKGcpe3JldHVybiBnWzFdLnJlcGxhY2UoL1xcL2csIiIpfSxUQUc6ZnVuY3Rpb24oZyl7cmV0dXJuIGdbMV0udG9Mb3dlckNhc2UoKX0sCkNISUxEOmZ1bmN0aW9uKGcpe2lmKGdbMV09PT0ibnRoIil7dmFyIGg9LygtPykoXGQqKW4oKD86XCt8LSk/XGQqKS8uZXhlYyhnWzJdPT09ImV2ZW4iJiYiMm4ifHxnWzJdPT09Im9kZCImJiIybisxInx8IS9cRC8udGVzdChnWzJdKSYmIjBuKyIrZ1syXXx8Z1syXSk7Z1syXT1oWzFdKyhoWzJdfHwxKS0wO2dbM109aFszXS0wfWdbMF09ZSsrO3JldHVybiBnfSxBVFRSOmZ1bmN0aW9uKGcsaCxsLG0scSxwKXtoPWdbMV0ucmVwbGFjZSgvXFwvZywiIik7aWYoIXAmJm4uYXR0ck1hcFtoXSlnWzFdPW4uYXR0ck1hcFtoXTtpZihnWzJdPT09In49IilnWzRdPSIgIitnWzRdKyIgIjtyZXR1cm4gZ30sUFNFVURPOmZ1bmN0aW9uKGcsaCxsLG0scSl7aWYoZ1sxXT09PSJub3QiKWlmKChmLmV4ZWMoZ1szXSl8fCIiKS5sZW5ndGg+MXx8L15cdy8udGVzdChnWzNdKSlnWzNdPWsoZ1szXSxudWxsLG51bGwsaCk7ZWxzZXtnPWsuZmlsdGVyKGdbM10saCxsLHRydWVecSk7bHx8bS5wdXNoLmFwcGx5KG0sCmcpO3JldHVybiBmYWxzZX1lbHNlIGlmKG4ubWF0Y2guUE9TLnRlc3QoZ1swXSl8fG4ubWF0Y2guQ0hJTEQudGVzdChnWzBdKSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZ30sUE9TOmZ1bmN0aW9uKGcpe2cudW5zaGlmdCh0cnVlKTtyZXR1cm4gZ319LGZpbHRlcnM6e2VuYWJsZWQ6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuZGlzYWJsZWQ9PT1mYWxzZSYmZy50eXBlIT09ImhpZGRlbiJ9LGRpc2FibGVkOmZ1bmN0aW9uKGcpe3JldHVybiBnLmRpc2FibGVkPT09dHJ1ZX0sY2hlY2tlZDpmdW5jdGlvbihnKXtyZXR1cm4gZy5jaGVja2VkPT09dHJ1ZX0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuc2VsZWN0ZWQ9PT10cnVlfSxwYXJlbnQ6ZnVuY3Rpb24oZyl7cmV0dXJuISFnLmZpcnN0Q2hpbGR9LGVtcHR5OmZ1bmN0aW9uKGcpe3JldHVybiFnLmZpcnN0Q2hpbGR9LGhhczpmdW5jdGlvbihnLGgsbCl7cmV0dXJuISFrKGxbM10sZykubGVuZ3RofSxoZWFkZXI6ZnVuY3Rpb24oZyl7cmV0dXJuL2hcZC9pLnRlc3QoZy5ub2RlTmFtZSl9LAp0ZXh0OmZ1bmN0aW9uKGcpe3JldHVybiJ0ZXh0Ij09PWcudHlwZX0scmFkaW86ZnVuY3Rpb24oZyl7cmV0dXJuInJhZGlvIj09PWcudHlwZX0sY2hlY2tib3g6ZnVuY3Rpb24oZyl7cmV0dXJuImNoZWNrYm94Ij09PWcudHlwZX0sZmlsZTpmdW5jdGlvbihnKXtyZXR1cm4iZmlsZSI9PT1nLnR5cGV9LHBhc3N3b3JkOmZ1bmN0aW9uKGcpe3JldHVybiJwYXNzd29yZCI9PT1nLnR5cGV9LHN1Ym1pdDpmdW5jdGlvbihnKXtyZXR1cm4ic3VibWl0Ij09PWcudHlwZX0saW1hZ2U6ZnVuY3Rpb24oZyl7cmV0dXJuImltYWdlIj09PWcudHlwZX0scmVzZXQ6ZnVuY3Rpb24oZyl7cmV0dXJuInJlc2V0Ij09PWcudHlwZX0sYnV0dG9uOmZ1bmN0aW9uKGcpe3JldHVybiJidXR0b24iPT09Zy50eXBlfHxnLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iYnV0dG9uIn0saW5wdXQ6ZnVuY3Rpb24oZyl7cmV0dXJuL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaS50ZXN0KGcubm9kZU5hbWUpfX0sCnNldEZpbHRlcnM6e2ZpcnN0OmZ1bmN0aW9uKGcsaCl7cmV0dXJuIGg9PT0wfSxsYXN0OmZ1bmN0aW9uKGcsaCxsLG0pe3JldHVybiBoPT09bS5sZW5ndGgtMX0sZXZlbjpmdW5jdGlvbihnLGgpe3JldHVybiBoJTI9PT0wfSxvZGQ6ZnVuY3Rpb24oZyxoKXtyZXR1cm4gaCUyPT09MX0sbHQ6ZnVuY3Rpb24oZyxoLGwpe3JldHVybiBoPGxbM10tMH0sZ3Q6ZnVuY3Rpb24oZyxoLGwpe3JldHVybiBoPmxbM10tMH0sbnRoOmZ1bmN0aW9uKGcsaCxsKXtyZXR1cm4gbFszXS0wPT09aH0sZXE6ZnVuY3Rpb24oZyxoLGwpe3JldHVybiBsWzNdLTA9PT1ofX0sZmlsdGVyOntQU0VVRE86ZnVuY3Rpb24oZyxoLGwsbSl7dmFyIHE9aFsxXSxwPW4uZmlsdGVyc1txXTtpZihwKXJldHVybiBwKGcsbCxoLG0pO2Vsc2UgaWYocT09PSJjb250YWlucyIpcmV0dXJuKGcudGV4dENvbnRlbnR8fGcuaW5uZXJUZXh0fHxhKFtnXSl8fCIiKS5pbmRleE9mKGhbM10pPj0wO2Vsc2UgaWYocT09PSJub3QiKXtoPQpoWzNdO2w9MDtmb3IobT1oLmxlbmd0aDtsPG07bCsrKWlmKGhbbF09PT1nKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZX1lbHNlIGsuZXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrcSl9LENISUxEOmZ1bmN0aW9uKGcsaCl7dmFyIGw9aFsxXSxtPWc7c3dpdGNoKGwpe2Nhc2UgIm9ubHkiOmNhc2UgImZpcnN0Ijpmb3IoO209bS5wcmV2aW91c1NpYmxpbmc7KWlmKG0ubm9kZVR5cGU9PT0xKXJldHVybiBmYWxzZTtpZihsPT09ImZpcnN0IilyZXR1cm4gdHJ1ZTttPWc7Y2FzZSAibGFzdCI6Zm9yKDttPW0ubmV4dFNpYmxpbmc7KWlmKG0ubm9kZVR5cGU9PT0xKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTtjYXNlICJudGgiOmw9aFsyXTt2YXIgcT1oWzNdO2lmKGw9PT0xJiZxPT09MClyZXR1cm4gdHJ1ZTtoPWhbMF07dmFyIHA9Zy5wYXJlbnROb2RlO2lmKHAmJihwLnNpemNhY2hlIT09aHx8IWcubm9kZUluZGV4KSl7dmFyIHY9MDtmb3IobT1wLmZpcnN0Q2hpbGQ7bTttPQptLm5leHRTaWJsaW5nKWlmKG0ubm9kZVR5cGU9PT0xKW0ubm9kZUluZGV4PSsrdjtwLnNpemNhY2hlPWh9Zz1nLm5vZGVJbmRleC1xO3JldHVybiBsPT09MD9nPT09MDpnJWw9PT0wJiZnL2w+PTB9fSxJRDpmdW5jdGlvbihnLGgpe3JldHVybiBnLm5vZGVUeXBlPT09MSYmZy5nZXRBdHRyaWJ1dGUoImlkIik9PT1ofSxUQUc6ZnVuY3Rpb24oZyxoKXtyZXR1cm4gaD09PSIqIiYmZy5ub2RlVHlwZT09PTF8fGcubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWh9LENMQVNTOmZ1bmN0aW9uKGcsaCl7cmV0dXJuKCIgIisoZy5jbGFzc05hbWV8fGcuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSsiICIpLmluZGV4T2YoaCk+LTF9LEFUVFI6ZnVuY3Rpb24oZyxoKXt2YXIgbD1oWzFdO2c9bi5hdHRySGFuZGxlW2xdP24uYXR0ckhhbmRsZVtsXShnKTpnW2xdIT1udWxsP2dbbF06Zy5nZXRBdHRyaWJ1dGUobCk7bD1nKyIiO3ZhciBtPWhbMl07aD1oWzRdO3JldHVybiBnPT1udWxsP209PT0iIT0iOm09PT0KIj0iP2w9PT1oOm09PT0iKj0iP2wuaW5kZXhPZihoKT49MDptPT09In49Ij8oIiAiK2wrIiAiKS5pbmRleE9mKGgpPj0wOiFoP2wmJmchPT1mYWxzZTptPT09IiE9Ij9sIT09aDptPT09Il49Ij9sLmluZGV4T2YoaCk9PT0wOm09PT0iJD0iP2wuc3Vic3RyKGwubGVuZ3RoLWgubGVuZ3RoKT09PWg6bT09PSJ8PSI/bD09PWh8fGwuc3Vic3RyKDAsaC5sZW5ndGgrMSk9PT1oKyItIjpmYWxzZX0sUE9TOmZ1bmN0aW9uKGcsaCxsLG0pe3ZhciBxPW4uc2V0RmlsdGVyc1toWzJdXTtpZihxKXJldHVybiBxKGcsbCxoLG0pfX19LHI9bi5tYXRjaC5QT1M7Zm9yKHZhciB1IGluIG4ubWF0Y2gpe24ubWF0Y2hbdV09bmV3IFJlZ0V4cChuLm1hdGNoW3VdLnNvdXJjZSsvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UpO24ubGVmdE1hdGNoW3VdPW5ldyBSZWdFeHAoLyheKD86LnxccnxcbikqPykvLnNvdXJjZStuLm1hdGNoW3VdLnNvdXJjZS5yZXBsYWNlKC9cXChcZCspL2csZnVuY3Rpb24oZywKaCl7cmV0dXJuIlxcIisoaC0wKzEpfSkpfXZhciB6PWZ1bmN0aW9uKGcsaCl7Zz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChnLDApO2lmKGgpe2gucHVzaC5hcHBseShoLGcpO3JldHVybiBofXJldHVybiBnfTt0cnl7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocy5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcywwKX1jYXRjaChDKXt6PWZ1bmN0aW9uKGcsaCl7aD1ofHxbXTtpZihqLmNhbGwoZyk9PT0iW29iamVjdCBBcnJheV0iKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGgsZyk7ZWxzZSBpZih0eXBlb2YgZy5sZW5ndGg9PT0ibnVtYmVyIilmb3IodmFyIGw9MCxtPWcubGVuZ3RoO2w8bTtsKyspaC5wdXNoKGdbbF0pO2Vsc2UgZm9yKGw9MDtnW2xdO2wrKyloLnB1c2goZ1tsXSk7cmV0dXJuIGh9fXZhciBCO2lmKHMuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKUI9ZnVuY3Rpb24oZyxoKXtpZighZy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8CiFoLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKXtpZihnPT1oKWk9dHJ1ZTtyZXR1cm4gZy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8tMToxfWc9Zy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihoKSY0Py0xOmc9PT1oPzA6MTtpZihnPT09MClpPXRydWU7cmV0dXJuIGd9O2Vsc2UgaWYoInNvdXJjZUluZGV4ImluIHMuZG9jdW1lbnRFbGVtZW50KUI9ZnVuY3Rpb24oZyxoKXtpZighZy5zb3VyY2VJbmRleHx8IWguc291cmNlSW5kZXgpe2lmKGc9PWgpaT10cnVlO3JldHVybiBnLnNvdXJjZUluZGV4Py0xOjF9Zz1nLnNvdXJjZUluZGV4LWguc291cmNlSW5kZXg7aWYoZz09PTApaT10cnVlO3JldHVybiBnfTtlbHNlIGlmKHMuY3JlYXRlUmFuZ2UpQj1mdW5jdGlvbihnLGgpe2lmKCFnLm93bmVyRG9jdW1lbnR8fCFoLm93bmVyRG9jdW1lbnQpe2lmKGc9PWgpaT10cnVlO3JldHVybiBnLm93bmVyRG9jdW1lbnQ/LTE6MX12YXIgbD1nLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSxtPQpoLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtsLnNldFN0YXJ0KGcsMCk7bC5zZXRFbmQoZywwKTttLnNldFN0YXJ0KGgsMCk7bS5zZXRFbmQoaCwwKTtnPWwuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKFJhbmdlLlNUQVJUX1RPX0VORCxtKTtpZihnPT09MClpPXRydWU7cmV0dXJuIGd9OyhmdW5jdGlvbigpe3ZhciBnPXMuY3JlYXRlRWxlbWVudCgiZGl2IiksaD0ic2NyaXB0IisobmV3IERhdGUpLmdldFRpbWUoKTtnLmlubmVySFRNTD0iPGEgbmFtZT0nIitoKyInLz4iO3ZhciBsPXMuZG9jdW1lbnRFbGVtZW50O2wuaW5zZXJ0QmVmb3JlKGcsbC5maXJzdENoaWxkKTtpZihzLmdldEVsZW1lbnRCeUlkKGgpKXtuLmZpbmQuSUQ9ZnVuY3Rpb24obSxxLHApe2lmKHR5cGVvZiBxLmdldEVsZW1lbnRCeUlkIT09InVuZGVmaW5lZCImJiFwKXJldHVybihxPXEuZ2V0RWxlbWVudEJ5SWQobVsxXSkpP3EuaWQ9PT1tWzFdfHx0eXBlb2YgcS5nZXRBdHRyaWJ1dGVOb2RlIT09InVuZGVmaW5lZCImJgpxLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlPT09bVsxXT9bcV06dzpbXX07bi5maWx0ZXIuSUQ9ZnVuY3Rpb24obSxxKXt2YXIgcD10eXBlb2YgbS5nZXRBdHRyaWJ1dGVOb2RlIT09InVuZGVmaW5lZCImJm0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbS5ub2RlVHlwZT09PTEmJnAmJnAubm9kZVZhbHVlPT09cX19bC5yZW1vdmVDaGlsZChnKTtsPWc9bnVsbH0pKCk7KGZ1bmN0aW9uKCl7dmFyIGc9cy5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLmFwcGVuZENoaWxkKHMuY3JlYXRlQ29tbWVudCgiIikpO2lmKGcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg+MCluLmZpbmQuVEFHPWZ1bmN0aW9uKGgsbCl7bD1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKGhbMV0pO2lmKGhbMV09PT0iKiIpe2g9W107Zm9yKHZhciBtPTA7bFttXTttKyspbFttXS5ub2RlVHlwZT09PTEmJmgucHVzaChsW21dKTtsPWh9cmV0dXJuIGx9O2cuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IjsKaWYoZy5maXJzdENoaWxkJiZ0eXBlb2YgZy5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9PSJ1bmRlZmluZWQiJiZnLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikhPT0iIyIpbi5hdHRySGFuZGxlLmhyZWY9ZnVuY3Rpb24oaCl7cmV0dXJuIGguZ2V0QXR0cmlidXRlKCJocmVmIiwyKX07Zz1udWxsfSkoKTtzLnF1ZXJ5U2VsZWN0b3JBbGwmJmZ1bmN0aW9uKCl7dmFyIGc9ayxoPXMuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5pbm5lckhUTUw9IjxwIGNsYXNzPSdURVNUJz48L3A+IjtpZighKGgucXVlcnlTZWxlY3RvckFsbCYmaC5xdWVyeVNlbGVjdG9yQWxsKCIuVEVTVCIpLmxlbmd0aD09PTApKXtrPWZ1bmN0aW9uKG0scSxwLHYpe3E9cXx8cztpZighdiYmcS5ub2RlVHlwZT09PTkmJiF4KHEpKXRyeXtyZXR1cm4geihxLnF1ZXJ5U2VsZWN0b3JBbGwobSkscCl9Y2F0Y2godCl7fXJldHVybiBnKG0scSxwLHYpfTtmb3IodmFyIGwgaW4gZylrW2xdPWdbbF07aD1udWxsfX0oKTsKKGZ1bmN0aW9uKCl7dmFyIGc9cy5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCEoIWcuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZXx8Zy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoPT09MCkpe2cubGFzdENoaWxkLmNsYXNzTmFtZT0iZSI7aWYoZy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoIT09MSl7bi5vcmRlci5zcGxpY2UoMSwwLCJDTEFTUyIpO24uZmluZC5DTEFTUz1mdW5jdGlvbihoLGwsbSl7aWYodHlwZW9mIGwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9PSJ1bmRlZmluZWQiJiYhbSlyZXR1cm4gbC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGhbMV0pfTtnPW51bGx9fX0pKCk7dmFyIEU9cy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9mdW5jdGlvbihnLGgpe3JldHVybiEhKGcuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaCkmMTYpfToKZnVuY3Rpb24oZyxoKXtyZXR1cm4gZyE9PWgmJihnLmNvbnRhaW5zP2cuY29udGFpbnMoaCk6dHJ1ZSl9LHg9ZnVuY3Rpb24oZyl7cmV0dXJuKGc9KGc/Zy5vd25lckRvY3VtZW50fHxnOjApLmRvY3VtZW50RWxlbWVudCk/Zy5ub2RlTmFtZSE9PSJIVE1MIjpmYWxzZX0sZ2E9ZnVuY3Rpb24oZyxoKXt2YXIgbD1bXSxtPSIiLHE7Zm9yKGg9aC5ub2RlVHlwZT9baF06aDtxPW4ubWF0Y2guUFNFVURPLmV4ZWMoZyk7KXttKz1xWzBdO2c9Zy5yZXBsYWNlKG4ubWF0Y2guUFNFVURPLCIiKX1nPW4ucmVsYXRpdmVbZ10/ZysiKiI6ZztxPTA7Zm9yKHZhciBwPWgubGVuZ3RoO3E8cDtxKyspayhnLGhbcV0sbCk7cmV0dXJuIGsuZmlsdGVyKG0sbCl9O2MuZmluZD1rO2MuZXhwcj1rLnNlbGVjdG9ycztjLmV4cHJbIjoiXT1jLmV4cHIuZmlsdGVycztjLnVuaXF1ZT1rLnVuaXF1ZVNvcnQ7Yy50ZXh0PWE7Yy5pc1hNTERvYz14O2MuY29udGFpbnM9RX0pKCk7dmFyIGViPS9VbnRpbCQvLGZiPS9eKD86cGFyZW50c3xwcmV2VW50aWx8cHJldkFsbCkvLApnYj0vLC87Uj1BcnJheS5wcm90b3R5cGUuc2xpY2U7dmFyIElhPWZ1bmN0aW9uKGEsYixkKXtpZihjLmlzRnVuY3Rpb24oYikpcmV0dXJuIGMuZ3JlcChhLGZ1bmN0aW9uKGUsail7cmV0dXJuISFiLmNhbGwoZSxqLGUpPT09ZH0pO2Vsc2UgaWYoYi5ub2RlVHlwZSlyZXR1cm4gYy5ncmVwKGEsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1iPT09ZH0pO2Vsc2UgaWYodHlwZW9mIGI9PT0ic3RyaW5nIil7dmFyIGY9Yy5ncmVwKGEsZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZVR5cGU9PT0xfSk7aWYoVWEudGVzdChiKSlyZXR1cm4gYy5maWx0ZXIoYixmLCFkKTtlbHNlIGI9Yy5maWx0ZXIoYixmKX1yZXR1cm4gYy5ncmVwKGEsZnVuY3Rpb24oZSl7cmV0dXJuIGMuaW5BcnJheShlLGIpPj0wPT09ZH0pfTtjLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGEpLGQ9MCxmPTAsZT10aGlzLmxlbmd0aDtmPGU7ZisrKXtkPWIubGVuZ3RoOwpjLmZpbmQoYSx0aGlzW2ZdLGIpO2lmKGY+MClmb3IodmFyIGo9ZDtqPGIubGVuZ3RoO2orKylmb3IodmFyIGk9MDtpPGQ7aSsrKWlmKGJbaV09PT1iW2pdKXtiLnNwbGljZShqLS0sMSk7YnJlYWt9fXJldHVybiBifSxoYXM6ZnVuY3Rpb24oYSl7dmFyIGI9YyhhKTtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGQ9MCxmPWIubGVuZ3RoO2Q8ZjtkKyspaWYoYy5jb250YWlucyh0aGlzLGJbZF0pKXJldHVybiB0cnVlfSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soSWEodGhpcyxhLGZhbHNlKSwibm90IixhKX0sZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhJYSh0aGlzLGEsdHJ1ZSksImZpbHRlciIsYSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhYSYmYy5maWx0ZXIoYSx0aGlzKS5sZW5ndGg+MH0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe2lmKGMuaXNBcnJheShhKSl7dmFyIGQ9W10sZj10aGlzWzBdLGUsaj0Ke30saTtpZihmJiZhLmxlbmd0aCl7ZT0wO2Zvcih2YXIgbz1hLmxlbmd0aDtlPG87ZSsrKXtpPWFbZV07altpXXx8KGpbaV09Yy5leHByLm1hdGNoLlBPUy50ZXN0KGkpP2MoaSxifHx0aGlzLmNvbnRleHQpOmkpfWZvcig7ZiYmZi5vd25lckRvY3VtZW50JiZmIT09Yjspe2ZvcihpIGluIGope2U9altpXTtpZihlLmpxdWVyeT9lLmluZGV4KGYpPi0xOmMoZikuaXMoZSkpe2QucHVzaCh7c2VsZWN0b3I6aSxlbGVtOmZ9KTtkZWxldGUgaltpXX19Zj1mLnBhcmVudE5vZGV9fXJldHVybiBkfXZhciBrPWMuZXhwci5tYXRjaC5QT1MudGVzdChhKT9jKGEsYnx8dGhpcy5jb250ZXh0KTpudWxsO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbihuLHIpe2Zvcig7ciYmci5vd25lckRvY3VtZW50JiZyIT09Yjspe2lmKGs/ay5pbmRleChyKT4tMTpjKHIpLmlzKGEpKXJldHVybiByO3I9ci5wYXJlbnROb2RlfXJldHVybiBudWxsfSl9LGluZGV4OmZ1bmN0aW9uKGEpe2lmKCFhfHx0eXBlb2YgYT09PQoic3RyaW5nIilyZXR1cm4gYy5pbkFycmF5KHRoaXNbMF0sYT9jKGEpOnRoaXMucGFyZW50KCkuY2hpbGRyZW4oKSk7cmV0dXJuIGMuaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyl9LGFkZDpmdW5jdGlvbihhLGIpe2E9dHlwZW9mIGE9PT0ic3RyaW5nIj9jKGEsYnx8dGhpcy5jb250ZXh0KTpjLm1ha2VBcnJheShhKTtiPWMubWVyZ2UodGhpcy5nZXQoKSxhKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2socWEoYVswXSl8fHFhKGJbMF0pP2I6Yy51bmlxdWUoYikpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSk7Yy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuKGE9YS5wYXJlbnROb2RlKSYmYS5ub2RlVHlwZSE9PTExP2E6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gYy5kaXIoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBjLmRpcihhLCJwYXJlbnROb2RlIiwKZCl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGMubnRoKGEsMiwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gYy5udGgoYSwyLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gYy5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gYy5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGMuZGlyKGEsIm5leHRTaWJsaW5nIixkKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixkKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIGMuc2libGluZyhhLnBhcmVudE5vZGUuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGMuc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gYy5ub2RlTmFtZShhLCJpZnJhbWUiKT8KYS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpjLm1ha2VBcnJheShhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtjLmZuW2FdPWZ1bmN0aW9uKGQsZil7dmFyIGU9Yy5tYXAodGhpcyxiLGQpO2ViLnRlc3QoYSl8fChmPWQpO2lmKGYmJnR5cGVvZiBmPT09InN0cmluZyIpZT1jLmZpbHRlcihmLGUpO2U9dGhpcy5sZW5ndGg+MT9jLnVuaXF1ZShlKTplO2lmKCh0aGlzLmxlbmd0aD4xfHxnYi50ZXN0KGYpKSYmZmIudGVzdChhKSllPWUucmV2ZXJzZSgpO3JldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsUi5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KTtjLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixkKXtpZihkKWE9Ijpub3QoIithKyIpIjtyZXR1cm4gYy5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj1bXTtmb3IoYT1hW2JdO2EmJmEubm9kZVR5cGUhPT05JiYoZD09PXd8fGEubm9kZVR5cGUhPT0xfHwhYyhhKS5pcyhkKSk7KXthLm5vZGVUeXBlPT09CjEmJmYucHVzaChhKTthPWFbYl19cmV0dXJuIGZ9LG50aDpmdW5jdGlvbihhLGIsZCl7Yj1ifHwxO2Zvcih2YXIgZj0wO2E7YT1hW2RdKWlmKGEubm9kZVR5cGU9PT0xJiYrK2Y9PT1iKWJyZWFrO3JldHVybiBhfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PT0xJiZhIT09YiYmZC5wdXNoKGEpO3JldHVybiBkfX0pO3ZhciBKYT0vIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLFY9L15ccysvLEthPS8oPChbXHc6XSspW14+XSo/KVwvPi9nLGhiPS9eKD86YXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkkL2ksTGE9LzwoW1x3Ol0rKS8saWI9Lzx0Ym9keS9pLGpiPS88fCYjP1x3KzsvLHRhPS88c2NyaXB0fDxvYmplY3R8PGVtYmVkfDxvcHRpb258PHN0eWxlL2ksdWE9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksTWE9ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBoYi50ZXN0KGQpPwphOmIrIj48LyIrZCsiPiJ9LEY9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07Ri5vcHRncm91cD1GLm9wdGlvbjtGLnRib2R5PUYudGZvb3Q9Ri5jb2xncm91cD1GLmNhcHRpb249Ri50aGVhZDtGLnRoPUYudGQ7aWYoIWMuc3VwcG9ydC5odG1sU2VyaWFsaXplKUYuX2RlZmF1bHQ9WzEsImRpdjxkaXY+IiwiPC9kaXY+Il07Yy5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGQ9CmModGhpcyk7ZC50ZXh0KGEuY2FsbCh0aGlzLGIsZC50ZXh0KCkpKX0pO2lmKHR5cGVvZiBhIT09Im9iamVjdCImJmEhPT13KXJldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fHMpLmNyZWF0ZVRleHROb2RlKGEpKTtyZXR1cm4gYy50ZXh0KHRoaXMpfSx3cmFwQWxsOmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGQpe2ModGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxkKSl9KTtpZih0aGlzWzBdKXt2YXIgYj1jKGEsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSh0cnVlKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pO2IubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciBkPXRoaXM7ZC5maXJzdENoaWxkJiZkLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0xOylkPWQuZmlyc3RDaGlsZDtyZXR1cm4gZH0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sCndyYXBJbm5lcjpmdW5jdGlvbihhKXtpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtjKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Yyh0aGlzKSxkPWIuY29udGVudHMoKTtkLmxlbmd0aD9kLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yyh0aGlzKS53cmFwQWxsKGEpfSl9LHVud3JhcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKXtjLm5vZGVOYW1lKHRoaXMsImJvZHkiKXx8Yyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSkuZW5kKCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyx0cnVlLGZ1bmN0aW9uKGEpe3RoaXMubm9kZVR5cGU9PT0xJiZ0aGlzLmFwcGVuZENoaWxkKGEpfSl9LApwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLHRydWUsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuaW5zZXJ0QmVmb3JlKGEsdGhpcy5maXJzdENoaWxkKX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZhbHNlLGZ1bmN0aW9uKGIpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYix0aGlzKX0pO2Vsc2UgaWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9Yyhhcmd1bWVudHNbMF0pO2EucHVzaC5hcHBseShhLHRoaXMudG9BcnJheSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYSwiYmVmb3JlIixhcmd1bWVudHMpfX0sYWZ0ZXI6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZhbHNlLGZ1bmN0aW9uKGIpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYiwKdGhpcy5uZXh0U2libGluZyl9KTtlbHNlIGlmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIixhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLGMoYXJndW1lbnRzWzBdKS50b0FycmF5KCkpO3JldHVybiBhfX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPTAsZjsoZj10aGlzW2RdKSE9bnVsbDtkKyspaWYoIWF8fGMuZmlsdGVyKGEsW2ZdKS5sZW5ndGgpe2lmKCFiJiZmLm5vZGVUeXBlPT09MSl7Yy5jbGVhbkRhdGEoZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTtjLmNsZWFuRGF0YShbZl0pfWYucGFyZW50Tm9kZSYmZi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpfXJldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGI7KGI9dGhpc1thXSkhPW51bGw7YSsrKWZvcihiLm5vZGVUeXBlPT09MSYmYy5jbGVhbkRhdGEoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTsKcmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubWFwKGZ1bmN0aW9uKCl7aWYoIWMuc3VwcG9ydC5ub0Nsb25lRXZlbnQmJiFjLmlzWE1MRG9jKHRoaXMpKXt2YXIgZD10aGlzLm91dGVySFRNTCxmPXRoaXMub3duZXJEb2N1bWVudDtpZighZCl7ZD1mLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuYXBwZW5kQ2hpbGQodGhpcy5jbG9uZU5vZGUodHJ1ZSkpO2Q9ZC5pbm5lckhUTUx9cmV0dXJuIGMuY2xlYW4oW2QucmVwbGFjZShKYSwiIikucmVwbGFjZSgvPShbXj0iJz5cc10rXC8pPi9nLCc9IiQxIj4nKS5yZXBsYWNlKFYsIiIpXSxmKVswXX1lbHNlIHJldHVybiB0aGlzLmNsb25lTm9kZSh0cnVlKX0pO2lmKGE9PT10cnVlKXtyYSh0aGlzLGIpO3JhKHRoaXMuZmluZCgiKiIpLGIuZmluZCgiKiIpKX1yZXR1cm4gYn0saHRtbDpmdW5jdGlvbihhKXtpZihhPT09dylyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5ub2RlVHlwZT09PTE/dGhpc1swXS5pbm5lckhUTUwucmVwbGFjZShKYSwKIiIpOm51bGw7ZWxzZSBpZih0eXBlb2YgYT09PSJzdHJpbmciJiYhdGEudGVzdChhKSYmKGMuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZXx8IVYudGVzdChhKSkmJiFGWyhMYS5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1hLnJlcGxhY2UoS2EsTWEpO3RyeXtmb3IodmFyIGI9MCxkPXRoaXMubGVuZ3RoO2I8ZDtiKyspaWYodGhpc1tiXS5ub2RlVHlwZT09PTEpe2MuY2xlYW5EYXRhKHRoaXNbYl0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7dGhpc1tiXS5pbm5lckhUTUw9YX19Y2F0Y2goZil7dGhpcy5lbXB0eSgpLmFwcGVuZChhKX19ZWxzZSBjLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBqPWModGhpcyksaT1qLmh0bWwoKTtqLmVtcHR5KCkuYXBwZW5kKGZ1bmN0aW9uKCl7cmV0dXJuIGEuY2FsbCh0aGlzLGUsaSl9KX0pOnRoaXMuZW1wdHkoKS5hcHBlbmQoYSk7cmV0dXJuIHRoaXN9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe2lmKHRoaXNbMF0mJgp0aGlzWzBdLnBhcmVudE5vZGUpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBkPWModGhpcyksZj1kLmh0bWwoKTtkLnJlcGxhY2VXaXRoKGEuY2FsbCh0aGlzLGIsZikpfSk7aWYodHlwZW9mIGEhPT0ic3RyaW5nIilhPWMoYSkuZGV0YWNoKCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXRoaXMubmV4dFNpYmxpbmcsZD10aGlzLnBhcmVudE5vZGU7Yyh0aGlzKS5yZW1vdmUoKTtiP2MoYikuYmVmb3JlKGEpOmMoZCkuYXBwZW5kKGEpfSl9ZWxzZSByZXR1cm4gdGhpcy5wdXNoU3RhY2soYyhjLmlzRnVuY3Rpb24oYSk/YSgpOmEpLCJyZXBsYWNlV2l0aCIsYSl9LGRldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSx0cnVlKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYodSl7cmV0dXJuIGMubm9kZU5hbWUodSwidGFibGUiKT91LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHwKdS5hcHBlbmRDaGlsZCh1Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6dX12YXIgZSxqLGk9YVswXSxvPVtdLGs7aWYoIWMuc3VwcG9ydC5jaGVja0Nsb25lJiZhcmd1bWVudHMubGVuZ3RoPT09MyYmdHlwZW9mIGk9PT0ic3RyaW5nIiYmdWEudGVzdChpKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yyh0aGlzKS5kb21NYW5pcChhLGIsZCx0cnVlKX0pO2lmKGMuaXNGdW5jdGlvbihpKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHUpe3ZhciB6PWModGhpcyk7YVswXT1pLmNhbGwodGhpcyx1LGI/ei5odG1sKCk6dyk7ei5kb21NYW5pcChhLGIsZCl9KTtpZih0aGlzWzBdKXtlPWkmJmkucGFyZW50Tm9kZTtlPWMuc3VwcG9ydC5wYXJlbnROb2RlJiZlJiZlLm5vZGVUeXBlPT09MTEmJmUuY2hpbGROb2Rlcy5sZW5ndGg9PT10aGlzLmxlbmd0aD97ZnJhZ21lbnQ6ZX06c2EoYSx0aGlzLG8pO2s9ZS5mcmFnbWVudDtpZihqPWsuY2hpbGROb2Rlcy5sZW5ndGg9PT0KMT8oaz1rLmZpcnN0Q2hpbGQpOmsuZmlyc3RDaGlsZCl7Yj1iJiZjLm5vZGVOYW1lKGosInRyIik7Zm9yKHZhciBuPTAscj10aGlzLmxlbmd0aDtuPHI7bisrKWQuY2FsbChiP2YodGhpc1tuXSxqKTp0aGlzW25dLG4+MHx8ZS5jYWNoZWFibGV8fHRoaXMubGVuZ3RoPjE/ay5jbG9uZU5vZGUodHJ1ZSk6ayl9by5sZW5ndGgmJmMuZWFjaChvLFFhKX1yZXR1cm4gdGhpc319KTtjLmZyYWdtZW50cz17fTtjLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGIpe2MuZm5bYV09ZnVuY3Rpb24oZCl7dmFyIGY9W107ZD1jKGQpO3ZhciBlPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2lmKGUmJmUubm9kZVR5cGU9PT0xMSYmZS5jaGlsZE5vZGVzLmxlbmd0aD09PTEmJmQubGVuZ3RoPT09MSl7ZFtiXSh0aGlzWzBdKTsKcmV0dXJuIHRoaXN9ZWxzZXtlPTA7Zm9yKHZhciBqPWQubGVuZ3RoO2U8ajtlKyspe3ZhciBpPShlPjA/dGhpcy5jbG9uZSh0cnVlKTp0aGlzKS5nZXQoKTtjLmZuW2JdLmFwcGx5KGMoZFtlXSksaSk7Zj1mLmNvbmNhdChpKX1yZXR1cm4gdGhpcy5wdXNoU3RhY2soZixhLGQuc2VsZWN0b3IpfX19KTtjLmV4dGVuZCh7Y2xlYW46ZnVuY3Rpb24oYSxiLGQsZil7Yj1ifHxzO2lmKHR5cGVvZiBiLmNyZWF0ZUVsZW1lbnQ9PT0idW5kZWZpbmVkIiliPWIub3duZXJEb2N1bWVudHx8YlswXSYmYlswXS5vd25lckRvY3VtZW50fHxzO2Zvcih2YXIgZT1bXSxqPTAsaTsoaT1hW2pdKSE9bnVsbDtqKyspe2lmKHR5cGVvZiBpPT09Im51bWJlciIpaSs9IiI7aWYoaSl7aWYodHlwZW9mIGk9PT0ic3RyaW5nIiYmIWpiLnRlc3QoaSkpaT1iLmNyZWF0ZVRleHROb2RlKGkpO2Vsc2UgaWYodHlwZW9mIGk9PT0ic3RyaW5nIil7aT1pLnJlcGxhY2UoS2EsTWEpO3ZhciBvPShMYS5leGVjKGkpfHxbIiIsCiIiXSlbMV0udG9Mb3dlckNhc2UoKSxrPUZbb118fEYuX2RlZmF1bHQsbj1rWzBdLHI9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3Ioci5pbm5lckhUTUw9a1sxXStpK2tbMl07bi0tOylyPXIubGFzdENoaWxkO2lmKCFjLnN1cHBvcnQudGJvZHkpe249aWIudGVzdChpKTtvPW89PT0idGFibGUiJiYhbj9yLmZpcnN0Q2hpbGQmJnIuZmlyc3RDaGlsZC5jaGlsZE5vZGVzOmtbMV09PT0iPHRhYmxlPiImJiFuP3IuY2hpbGROb2RlczpbXTtmb3Ioaz1vLmxlbmd0aC0xO2s+PTA7LS1rKWMubm9kZU5hbWUob1trXSwidGJvZHkiKSYmIW9ba10uY2hpbGROb2Rlcy5sZW5ndGgmJm9ba10ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvW2tdKX0hYy5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlJiZWLnRlc3QoaSkmJnIuaW5zZXJ0QmVmb3JlKGIuY3JlYXRlVGV4dE5vZGUoVi5leGVjKGkpWzBdKSxyLmZpcnN0Q2hpbGQpO2k9ci5jaGlsZE5vZGVzfWlmKGkubm9kZVR5cGUpZS5wdXNoKGkpO2Vsc2UgZT0KYy5tZXJnZShlLGkpfX1pZihkKWZvcihqPTA7ZVtqXTtqKyspaWYoZiYmYy5ub2RlTmFtZShlW2pdLCJzY3JpcHQiKSYmKCFlW2pdLnR5cGV8fGVbal0udHlwZS50b0xvd2VyQ2FzZSgpPT09InRleHQvamF2YXNjcmlwdCIpKWYucHVzaChlW2pdLnBhcmVudE5vZGU/ZVtqXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVbal0pOmVbal0pO2Vsc2V7ZVtqXS5ub2RlVHlwZT09PTEmJmUuc3BsaWNlLmFwcGx5KGUsW2orMSwwXS5jb25jYXQoYy5tYWtlQXJyYXkoZVtqXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IikpKSk7ZC5hcHBlbmRDaGlsZChlW2pdKX1yZXR1cm4gZX0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixkLGY9Yy5jYWNoZSxlPWMuZXZlbnQuc3BlY2lhbCxqPWMuc3VwcG9ydC5kZWxldGVFeHBhbmRvLGk9MCxvOyhvPWFbaV0pIT1udWxsO2krKylpZihkPW9bYy5leHBhbmRvXSl7Yj1mW2RdO2lmKGIuZXZlbnRzKWZvcih2YXIgayBpbiBiLmV2ZW50cyllW2tdPwpjLmV2ZW50LnJlbW92ZShvLGspOkNhKG8sayxiLmhhbmRsZSk7aWYoailkZWxldGUgb1tjLmV4cGFuZG9dO2Vsc2Ugby5yZW1vdmVBdHRyaWJ1dGUmJm8ucmVtb3ZlQXR0cmlidXRlKGMuZXhwYW5kbyk7ZGVsZXRlIGZbZF19fX0pO3ZhciBrYj0vei0/aW5kZXh8Zm9udC0/d2VpZ2h0fG9wYWNpdHl8em9vbXxsaW5lLT9oZWlnaHQvaSxOYT0vYWxwaGFcKFteKV0qXCkvLE9hPS9vcGFjaXR5PShbXildKikvLGhhPS9mbG9hdC9pLGlhPS8tKFthLXpdKS9pZyxsYj0vKFtBLVpdKS9nLG1iPS9eLT9cZCsoPzpweCk/JC9pLG5iPS9eLT9cZC8sb2I9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LHBiPVsiTGVmdCIsIlJpZ2h0Il0scWI9WyJUb3AiLCJCb3R0b20iXSxyYj1zLmRlZmF1bHRWaWV3JiZzLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUsUGE9Yy5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQiLGphPQpmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O2MuZm4uY3NzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIFgodGhpcyxhLGIsdHJ1ZSxmdW5jdGlvbihkLGYsZSl7aWYoZT09PXcpcmV0dXJuIGMuY3VyQ1NTKGQsZik7aWYodHlwZW9mIGU9PT0ibnVtYmVyIiYmIWtiLnRlc3QoZikpZSs9InB4IjtjLnN0eWxlKGQsZixlKX0pfTtjLmV4dGVuZCh7c3R5bGU6ZnVuY3Rpb24oYSxiLGQpe2lmKCFhfHxhLm5vZGVUeXBlPT09M3x8YS5ub2RlVHlwZT09PTgpcmV0dXJuIHc7aWYoKGI9PT0id2lkdGgifHxiPT09ImhlaWdodCIpJiZwYXJzZUZsb2F0KGQpPDApZD13O3ZhciBmPWEuc3R5bGV8fGEsZT1kIT09dztpZighYy5zdXBwb3J0Lm9wYWNpdHkmJmI9PT0ib3BhY2l0eSIpe2lmKGUpe2Yuem9vbT0xO2I9cGFyc2VJbnQoZCwxMCkrIiI9PT0iTmFOIj8iIjoiYWxwaGEob3BhY2l0eT0iK2QqMTAwKyIpIjthPWYuZmlsdGVyfHxjLmN1ckNTUyhhLCJmaWx0ZXIiKXx8IiI7Zi5maWx0ZXI9Ck5hLnRlc3QoYSk/YS5yZXBsYWNlKE5hLGIpOmJ9cmV0dXJuIGYuZmlsdGVyJiZmLmZpbHRlci5pbmRleE9mKCJvcGFjaXR5PSIpPj0wP3BhcnNlRmxvYXQoT2EuZXhlYyhmLmZpbHRlcilbMV0pLzEwMCsiIjoiIn1pZihoYS50ZXN0KGIpKWI9UGE7Yj1iLnJlcGxhY2UoaWEsamEpO2lmKGUpZltiXT1kO3JldHVybiBmW2JdfSxjc3M6ZnVuY3Rpb24oYSxiLGQsZil7aWYoYj09PSJ3aWR0aCJ8fGI9PT0iaGVpZ2h0Iil7dmFyIGUsaj1iPT09IndpZHRoIj9wYjpxYjtmdW5jdGlvbiBpKCl7ZT1iPT09IndpZHRoIj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0O2YhPT0iYm9yZGVyIiYmYy5lYWNoKGosZnVuY3Rpb24oKXtmfHwoZS09cGFyc2VGbG9hdChjLmN1ckNTUyhhLCJwYWRkaW5nIit0aGlzLHRydWUpKXx8MCk7aWYoZj09PSJtYXJnaW4iKWUrPXBhcnNlRmxvYXQoYy5jdXJDU1MoYSwibWFyZ2luIit0aGlzLHRydWUpKXx8MDtlbHNlIGUtPXBhcnNlRmxvYXQoYy5jdXJDU1MoYSwKImJvcmRlciIrdGhpcysiV2lkdGgiLHRydWUpKXx8MH0pfWEub2Zmc2V0V2lkdGghPT0wP2koKTpjLnN3YXAoYSxvYixpKTtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLnJvdW5kKGUpKX1yZXR1cm4gYy5jdXJDU1MoYSxiLGQpfSxjdXJDU1M6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmLGU9YS5zdHlsZTtpZighYy5zdXBwb3J0Lm9wYWNpdHkmJmI9PT0ib3BhY2l0eSImJmEuY3VycmVudFN0eWxlKXtmPU9hLnRlc3QoYS5jdXJyZW50U3R5bGUuZmlsdGVyfHwiIik/cGFyc2VGbG9hdChSZWdFeHAuJDEpLzEwMCsiIjoiIjtyZXR1cm4gZj09PSIiPyIxIjpmfWlmKGhhLnRlc3QoYikpYj1QYTtpZighZCYmZSYmZVtiXSlmPWVbYl07ZWxzZSBpZihyYil7aWYoaGEudGVzdChiKSliPSJmbG9hdCI7Yj1iLnJlcGxhY2UobGIsIi0kMSIpLnRvTG93ZXJDYXNlKCk7ZT1hLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7aWYoIWUpcmV0dXJuIG51bGw7aWYoYT1lLmdldENvbXB1dGVkU3R5bGUoYSxudWxsKSlmPQphLmdldFByb3BlcnR5VmFsdWUoYik7aWYoYj09PSJvcGFjaXR5IiYmZj09PSIiKWY9IjEifWVsc2UgaWYoYS5jdXJyZW50U3R5bGUpe2Q9Yi5yZXBsYWNlKGlhLGphKTtmPWEuY3VycmVudFN0eWxlW2JdfHxhLmN1cnJlbnRTdHlsZVtkXTtpZighbWIudGVzdChmKSYmbmIudGVzdChmKSl7Yj1lLmxlZnQ7dmFyIGo9YS5ydW50aW1lU3R5bGUubGVmdDthLnJ1bnRpbWVTdHlsZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQ7ZS5sZWZ0PWQ9PT0iZm9udFNpemUiPyIxZW0iOmZ8fDA7Zj1lLnBpeGVsTGVmdCsicHgiO2UubGVmdD1iO2EucnVudGltZVN0eWxlLmxlZnQ9an19cmV0dXJuIGZ9LHN3YXA6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPXt9O2Zvcih2YXIgZSBpbiBiKXtmW2VdPWEuc3R5bGVbZV07YS5zdHlsZVtlXT1iW2VdfWQuY2FsbChhKTtmb3IoZSBpbiBiKWEuc3R5bGVbZV09ZltlXX19KTtpZihjLmV4cHImJmMuZXhwci5maWx0ZXJzKXtjLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7dmFyIGI9CmEub2Zmc2V0V2lkdGgsZD1hLm9mZnNldEhlaWdodCxmPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJ0ciI7cmV0dXJuIGI9PT0wJiZkPT09MCYmIWY/dHJ1ZTpiPjAmJmQ+MCYmIWY/ZmFsc2U6Yy5jdXJDU1MoYSwiZGlzcGxheSIpPT09Im5vbmUifTtjLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFjLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9fXZhciBzYj1KKCksdGI9LzxzY3JpcHQoLnxccykqP1wvc2NyaXB0Pi9naSx1Yj0vc2VsZWN0fHRleHRhcmVhL2ksdmI9L2NvbG9yfGRhdGV8ZGF0ZXRpbWV8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2Vlay9pLE49Lz1cPygmfCQpLyxrYT0vXD8vLHdiPS8oXD98JilfPS4qPygmfCQpLyx4Yj0vXihcdys6KT9cL1wvKFteXC8/I10rKS8seWI9LyUyMC9nLHpiPWMuZm4ubG9hZDtjLmZuLmV4dGVuZCh7bG9hZDpmdW5jdGlvbihhLGIsZCl7aWYodHlwZW9mIGEhPT0KInN0cmluZyIpcmV0dXJuIHpiLmNhbGwodGhpcyxhKTtlbHNlIGlmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZj1hLmluZGV4T2YoIiAiKTtpZihmPj0wKXt2YXIgZT1hLnNsaWNlKGYsYS5sZW5ndGgpO2E9YS5zbGljZSgwLGYpfWY9IkdFVCI7aWYoYilpZihjLmlzRnVuY3Rpb24oYikpe2Q9YjtiPW51bGx9ZWxzZSBpZih0eXBlb2YgYj09PSJvYmplY3QiKXtiPWMucGFyYW0oYixjLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCk7Zj0iUE9TVCJ9dmFyIGo9dGhpcztjLmFqYXgoe3VybDphLHR5cGU6ZixkYXRhVHlwZToiaHRtbCIsZGF0YTpiLGNvbXBsZXRlOmZ1bmN0aW9uKGksbyl7aWYobz09PSJzdWNjZXNzInx8bz09PSJub3Rtb2RpZmllZCIpai5odG1sKGU/YygiPGRpdiAvPiIpLmFwcGVuZChpLnJlc3BvbnNlVGV4dC5yZXBsYWNlKHRiLCIiKSkuZmluZChlKTppLnJlc3BvbnNlVGV4dCk7ZCYmai5lYWNoKGQsW2kucmVzcG9uc2VUZXh0LG8saV0pfX0pO3JldHVybiB0aGlzfSwKc2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGMucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cz9jLm1ha2VBcnJheSh0aGlzLmVsZW1lbnRzKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZSYmIXRoaXMuZGlzYWJsZWQmJih0aGlzLmNoZWNrZWR8fHViLnRlc3QodGhpcy5ub2RlTmFtZSl8fHZiLnRlc3QodGhpcy50eXBlKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXthPWModGhpcykudmFsKCk7cmV0dXJuIGE9PW51bGw/bnVsbDpjLmlzQXJyYXkoYSk/Yy5tYXAoYSxmdW5jdGlvbihkKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6ZH19KTp7bmFtZTpiLm5hbWUsdmFsdWU6YX19KS5nZXQoKX19KTtjLmVhY2goImFqYXhTdGFydCBhamF4U3RvcCBhamF4Q29tcGxldGUgYWpheEVycm9yIGFqYXhTdWNjZXNzIGFqYXhTZW5kIi5zcGxpdCgiICIpLApmdW5jdGlvbihhLGIpe2MuZm5bYl09ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuYmluZChiLGQpfX0pO2MuZXh0ZW5kKHtnZXQ6ZnVuY3Rpb24oYSxiLGQsZil7aWYoYy5pc0Z1bmN0aW9uKGIpKXtmPWZ8fGQ7ZD1iO2I9bnVsbH1yZXR1cm4gYy5hamF4KHt0eXBlOiJHRVQiLHVybDphLGRhdGE6YixzdWNjZXNzOmQsZGF0YVR5cGU6Zn0pfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYy5nZXQoYSxudWxsLGIsInNjcmlwdCIpfSxnZXRKU09OOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5nZXQoYSxiLGQsImpzb24iKX0scG9zdDpmdW5jdGlvbihhLGIsZCxmKXtpZihjLmlzRnVuY3Rpb24oYikpe2Y9Znx8ZDtkPWI7Yj17fX1yZXR1cm4gYy5hamF4KHt0eXBlOiJQT1NUIix1cmw6YSxkYXRhOmIsc3VjY2VzczpkLGRhdGFUeXBlOmZ9KX0sYWpheFNldHVwOmZ1bmN0aW9uKGEpe2MuZXh0ZW5kKGMuYWpheFNldHRpbmdzLGEpfSxhamF4U2V0dGluZ3M6e3VybDpsb2NhdGlvbi5ocmVmLApnbG9iYWw6dHJ1ZSx0eXBlOiJHRVQiLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLHByb2Nlc3NEYXRhOnRydWUsYXN5bmM6dHJ1ZSx4aHI6QS5YTUxIdHRwUmVxdWVzdCYmKEEubG9jYXRpb24ucHJvdG9jb2whPT0iZmlsZToifHwhQS5BY3RpdmVYT2JqZWN0KT9mdW5jdGlvbigpe3JldHVybiBuZXcgQS5YTUxIdHRwUmVxdWVzdH06ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBBLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYSl7fX0sYWNjZXB0czp7eG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixodG1sOiJ0ZXh0L2h0bWwiLHNjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLHRleHQ6InRleHQvcGxhaW4iLF9kZWZhdWx0OiIqLyoifX0sbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7ZS5zdWNjZXNzJiYKZS5zdWNjZXNzLmNhbGwoayxvLGkseCk7ZS5nbG9iYWwmJmYoImFqYXhTdWNjZXNzIixbeCxlXSl9ZnVuY3Rpb24gZCgpe2UuY29tcGxldGUmJmUuY29tcGxldGUuY2FsbChrLHgsaSk7ZS5nbG9iYWwmJmYoImFqYXhDb21wbGV0ZSIsW3gsZV0pO2UuZ2xvYmFsJiYhLS1jLmFjdGl2ZSYmYy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpfWZ1bmN0aW9uIGYocSxwKXsoZS5jb250ZXh0P2MoZS5jb250ZXh0KTpjLmV2ZW50KS50cmlnZ2VyKHEscCl9dmFyIGU9Yy5leHRlbmQodHJ1ZSx7fSxjLmFqYXhTZXR0aW5ncyxhKSxqLGksbyxrPWEmJmEuY29udGV4dHx8ZSxuPWUudHlwZS50b1VwcGVyQ2FzZSgpO2lmKGUuZGF0YSYmZS5wcm9jZXNzRGF0YSYmdHlwZW9mIGUuZGF0YSE9PSJzdHJpbmciKWUuZGF0YT1jLnBhcmFtKGUuZGF0YSxlLnRyYWRpdGlvbmFsKTtpZihlLmRhdGFUeXBlPT09Impzb25wIil7aWYobj09PSJHRVQiKU4udGVzdChlLnVybCl8fChlLnVybCs9KGthLnRlc3QoZS51cmwpPwoiJiI6Ij8iKSsoZS5qc29ucHx8ImNhbGxiYWNrIikrIj0/Iik7ZWxzZSBpZighZS5kYXRhfHwhTi50ZXN0KGUuZGF0YSkpZS5kYXRhPShlLmRhdGE/ZS5kYXRhKyImIjoiIikrKGUuanNvbnB8fCJjYWxsYmFjayIpKyI9PyI7ZS5kYXRhVHlwZT0ianNvbiJ9aWYoZS5kYXRhVHlwZT09PSJqc29uIiYmKGUuZGF0YSYmTi50ZXN0KGUuZGF0YSl8fE4udGVzdChlLnVybCkpKXtqPWUuanNvbnBDYWxsYmFja3x8Impzb25wIitzYisrO2lmKGUuZGF0YSllLmRhdGE9KGUuZGF0YSsiIikucmVwbGFjZShOLCI9IitqKyIkMSIpO2UudXJsPWUudXJsLnJlcGxhY2UoTiwiPSIraisiJDEiKTtlLmRhdGFUeXBlPSJzY3JpcHQiO0Fbal09QVtqXXx8ZnVuY3Rpb24ocSl7bz1xO2IoKTtkKCk7QVtqXT13O3RyeXtkZWxldGUgQVtqXX1jYXRjaChwKXt9eiYmei5yZW1vdmVDaGlsZChDKX19aWYoZS5kYXRhVHlwZT09PSJzY3JpcHQiJiZlLmNhY2hlPT09bnVsbCllLmNhY2hlPWZhbHNlO2lmKGUuY2FjaGU9PT0KZmFsc2UmJm49PT0iR0VUIil7dmFyIHI9SigpLHU9ZS51cmwucmVwbGFjZSh3YiwiJDFfPSIrcisiJDIiKTtlLnVybD11Kyh1PT09ZS51cmw/KGthLnRlc3QoZS51cmwpPyImIjoiPyIpKyJfPSIrcjoiIil9aWYoZS5kYXRhJiZuPT09IkdFVCIpZS51cmwrPShrYS50ZXN0KGUudXJsKT8iJiI6Ij8iKStlLmRhdGE7ZS5nbG9iYWwmJiFjLmFjdGl2ZSsrJiZjLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpO3I9KHI9eGIuZXhlYyhlLnVybCkpJiYoclsxXSYmclsxXSE9PWxvY2F0aW9uLnByb3RvY29sfHxyWzJdIT09bG9jYXRpb24uaG9zdCk7aWYoZS5kYXRhVHlwZT09PSJzY3JpcHQiJiZuPT09IkdFVCImJnIpe3ZhciB6PXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8cy5kb2N1bWVudEVsZW1lbnQsQz1zLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO0Muc3JjPWUudXJsO2lmKGUuc2NyaXB0Q2hhcnNldClDLmNoYXJzZXQ9ZS5zY3JpcHRDaGFyc2V0O2lmKCFqKXt2YXIgQj0KZmFsc2U7Qy5vbmxvYWQ9Qy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZighQiYmKCF0aGlzLnJlYWR5U3RhdGV8fHRoaXMucmVhZHlTdGF0ZT09PSJsb2FkZWQifHx0aGlzLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKSl7Qj10cnVlO2IoKTtkKCk7Qy5vbmxvYWQ9Qy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbDt6JiZDLnBhcmVudE5vZGUmJnoucmVtb3ZlQ2hpbGQoQyl9fX16Lmluc2VydEJlZm9yZShDLHouZmlyc3RDaGlsZCk7cmV0dXJuIHd9dmFyIEU9ZmFsc2UseD1lLnhocigpO2lmKHgpe2UudXNlcm5hbWU/eC5vcGVuKG4sZS51cmwsZS5hc3luYyxlLnVzZXJuYW1lLGUucGFzc3dvcmQpOngub3BlbihuLGUudXJsLGUuYXN5bmMpO3RyeXtpZihlLmRhdGF8fGEmJmEuY29udGVudFR5cGUpeC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGUuY29udGVudFR5cGUpO2lmKGUuaWZNb2RpZmllZCl7Yy5sYXN0TW9kaWZpZWRbZS51cmxdJiZ4LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIiwKYy5sYXN0TW9kaWZpZWRbZS51cmxdKTtjLmV0YWdbZS51cmxdJiZ4LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLGMuZXRhZ1tlLnVybF0pfXJ8fHguc2V0UmVxdWVzdEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIsIlhNTEh0dHBSZXF1ZXN0Iik7eC5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGUuZGF0YVR5cGUmJmUuYWNjZXB0c1tlLmRhdGFUeXBlXT9lLmFjY2VwdHNbZS5kYXRhVHlwZV0rIiwgKi8qIjplLmFjY2VwdHMuX2RlZmF1bHQpfWNhdGNoKGdhKXt9aWYoZS5iZWZvcmVTZW5kJiZlLmJlZm9yZVNlbmQuY2FsbChrLHgsZSk9PT1mYWxzZSl7ZS5nbG9iYWwmJiEtLWMuYWN0aXZlJiZjLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIik7eC5hYm9ydCgpO3JldHVybiBmYWxzZX1lLmdsb2JhbCYmZigiYWpheFNlbmQiLFt4LGVdKTt2YXIgZz14Lm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihxKXtpZigheHx8eC5yZWFkeVN0YXRlPT09MHx8cT09PSJhYm9ydCIpe0V8fApkKCk7RT10cnVlO2lmKHgpeC5vbnJlYWR5c3RhdGVjaGFuZ2U9Yy5ub29wfWVsc2UgaWYoIUUmJngmJih4LnJlYWR5U3RhdGU9PT00fHxxPT09InRpbWVvdXQiKSl7RT10cnVlO3gub25yZWFkeXN0YXRlY2hhbmdlPWMubm9vcDtpPXE9PT0idGltZW91dCI/InRpbWVvdXQiOiFjLmh0dHBTdWNjZXNzKHgpPyJlcnJvciI6ZS5pZk1vZGlmaWVkJiZjLmh0dHBOb3RNb2RpZmllZCh4LGUudXJsKT8ibm90bW9kaWZpZWQiOiJzdWNjZXNzIjt2YXIgcDtpZihpPT09InN1Y2Nlc3MiKXRyeXtvPWMuaHR0cERhdGEoeCxlLmRhdGFUeXBlLGUpfWNhdGNoKHYpe2k9InBhcnNlcmVycm9yIjtwPXZ9aWYoaT09PSJzdWNjZXNzInx8aT09PSJub3Rtb2RpZmllZCIpanx8YigpO2Vsc2UgYy5oYW5kbGVFcnJvcihlLHgsaSxwKTtkKCk7cT09PSJ0aW1lb3V0IiYmeC5hYm9ydCgpO2lmKGUuYXN5bmMpeD1udWxsfX07dHJ5e3ZhciBoPXguYWJvcnQ7eC5hYm9ydD1mdW5jdGlvbigpe3gmJmguY2FsbCh4KTsKZygiYWJvcnQiKX19Y2F0Y2gobCl7fWUuYXN5bmMmJmUudGltZW91dD4wJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eCYmIUUmJmcoInRpbWVvdXQiKX0sZS50aW1lb3V0KTt0cnl7eC5zZW5kKG49PT0iUE9TVCJ8fG49PT0iUFVUInx8bj09PSJERUxFVEUiP2UuZGF0YTpudWxsKX1jYXRjaChtKXtjLmhhbmRsZUVycm9yKGUseCxudWxsLG0pO2QoKX1lLmFzeW5jfHxnKCk7cmV0dXJuIHh9fSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhLGIsZCxmKXtpZihhLmVycm9yKWEuZXJyb3IuY2FsbChhLmNvbnRleHR8fGEsYixkLGYpO2lmKGEuZ2xvYmFsKShhLmNvbnRleHQ/YyhhLmNvbnRleHQpOmMuZXZlbnQpLnRyaWdnZXIoImFqYXhFcnJvciIsW2IsYSxmXSl9LGFjdGl2ZTowLGh0dHBTdWNjZXNzOmZ1bmN0aW9uKGEpe3RyeXtyZXR1cm4hYS5zdGF0dXMmJmxvY2F0aW9uLnByb3RvY29sPT09ImZpbGU6Inx8YS5zdGF0dXM+PTIwMCYmYS5zdGF0dXM8MzAwfHxhLnN0YXR1cz09PTMwNHx8YS5zdGF0dXM9PT0KMTIyM3x8YS5zdGF0dXM9PT0wfWNhdGNoKGIpe31yZXR1cm4gZmFsc2V9LGh0dHBOb3RNb2RpZmllZDpmdW5jdGlvbihhLGIpe3ZhciBkPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSxmPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIkV0YWciKTtpZihkKWMubGFzdE1vZGlmaWVkW2JdPWQ7aWYoZiljLmV0YWdbYl09ZjtyZXR1cm4gYS5zdGF0dXM9PT0zMDR8fGEuc3RhdHVzPT09MH0saHR0cERhdGE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPWEuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpfHwiIixlPWI9PT0ieG1sInx8IWImJmYuaW5kZXhPZigieG1sIik+PTA7YT1lP2EucmVzcG9uc2VYTUw6YS5yZXNwb25zZVRleHQ7ZSYmYS5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWU9PT0icGFyc2VyZXJyb3IiJiZjLmVycm9yKCJwYXJzZXJlcnJvciIpO2lmKGQmJmQuZGF0YUZpbHRlcilhPWQuZGF0YUZpbHRlcihhLGIpO2lmKHR5cGVvZiBhPT09InN0cmluZyIpaWYoYj09PQoianNvbiJ8fCFiJiZmLmluZGV4T2YoImpzb24iKT49MClhPWMucGFyc2VKU09OKGEpO2Vsc2UgaWYoYj09PSJzY3JpcHQifHwhYiYmZi5pbmRleE9mKCJqYXZhc2NyaXB0Iik+PTApYy5nbG9iYWxFdmFsKGEpO3JldHVybiBhfSxwYXJhbTpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoaSxvKXtpZihjLmlzQXJyYXkobykpYy5lYWNoKG8sZnVuY3Rpb24oayxuKXtifHwvXFtcXSQvLnRlc3QoaSk/ZihpLG4pOmQoaSsiWyIrKHR5cGVvZiBuPT09Im9iamVjdCJ8fGMuaXNBcnJheShuKT9rOiIiKSsiXSIsbil9KTtlbHNlIWImJm8hPW51bGwmJnR5cGVvZiBvPT09Im9iamVjdCI/Yy5lYWNoKG8sZnVuY3Rpb24oayxuKXtkKGkrIlsiK2srIl0iLG4pfSk6ZihpLG8pfWZ1bmN0aW9uIGYoaSxvKXtvPWMuaXNGdW5jdGlvbihvKT9vKCk6bztlW2UubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoaSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChvKX12YXIgZT1bXTtpZihiPT09dyliPWMuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsOwppZihjLmlzQXJyYXkoYSl8fGEuanF1ZXJ5KWMuZWFjaChhLGZ1bmN0aW9uKCl7Zih0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcih2YXIgaiBpbiBhKWQoaixhW2pdKTtyZXR1cm4gZS5qb2luKCImIikucmVwbGFjZSh5YiwiKyIpfX0pO3ZhciBsYT17fSxBYj0vdG9nZ2xlfHNob3d8aGlkZS8sQmI9L14oWystXT0pPyhbXGQrLS5dKykoLiopJC8sVyx2YT1bWyJoZWlnaHQiLCJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLFsid2lkdGgiLCJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdLFsib3BhY2l0eSJdXTtjLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbihhLGIpe2lmKGF8fGE9PT0wKXJldHVybiB0aGlzLmFuaW1hdGUoSygic2hvdyIsMyksYSxiKTtlbHNle2E9MDtmb3IoYj10aGlzLmxlbmd0aDthPGI7YSsrKXt2YXIgZD1jLmRhdGEodGhpc1thXSwib2xkZGlzcGxheSIpOwp0aGlzW2FdLnN0eWxlLmRpc3BsYXk9ZHx8IiI7aWYoYy5jc3ModGhpc1thXSwiZGlzcGxheSIpPT09Im5vbmUiKXtkPXRoaXNbYV0ubm9kZU5hbWU7dmFyIGY7aWYobGFbZF0pZj1sYVtkXTtlbHNle3ZhciBlPWMoIjwiK2QrIiAvPiIpLmFwcGVuZFRvKCJib2R5Iik7Zj1lLmNzcygiZGlzcGxheSIpO2lmKGY9PT0ibm9uZSIpZj0iYmxvY2siO2UucmVtb3ZlKCk7bGFbZF09Zn1jLmRhdGEodGhpc1thXSwib2xkZGlzcGxheSIsZil9fWE9MDtmb3IoYj10aGlzLmxlbmd0aDthPGI7YSsrKXRoaXNbYV0uc3R5bGUuZGlzcGxheT1jLmRhdGEodGhpc1thXSwib2xkZGlzcGxheSIpfHwiIjtyZXR1cm4gdGhpc319LGhpZGU6ZnVuY3Rpb24oYSxiKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKEsoImhpZGUiLDMpLGEsYik7ZWxzZXthPTA7Zm9yKGI9dGhpcy5sZW5ndGg7YTxiO2ErKyl7dmFyIGQ9Yy5kYXRhKHRoaXNbYV0sIm9sZGRpc3BsYXkiKTshZCYmZCE9PSJub25lIiYmYy5kYXRhKHRoaXNbYV0sCiJvbGRkaXNwbGF5IixjLmNzcyh0aGlzW2FdLCJkaXNwbGF5IikpfWE9MDtmb3IoYj10aGlzLmxlbmd0aDthPGI7YSsrKXRoaXNbYV0uc3R5bGUuZGlzcGxheT0ibm9uZSI7cmV0dXJuIHRoaXN9fSxfdG9nZ2xlOmMuZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbihhLGIpe3ZhciBkPXR5cGVvZiBhPT09ImJvb2xlYW4iO2lmKGMuaXNGdW5jdGlvbihhKSYmYy5pc0Z1bmN0aW9uKGIpKXRoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZWxzZSBhPT1udWxsfHxkP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBmPWQ/YTpjKHRoaXMpLmlzKCI6aGlkZGVuIik7Yyh0aGlzKVtmPyJzaG93IjoiaGlkZSJdKCl9KTp0aGlzLmFuaW1hdGUoSygidG9nZ2xlIiwzKSxhLGIpO3JldHVybiB0aGlzfSxmYWRlVG86ZnVuY3Rpb24oYSxiLGQpe3JldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxkKX0sCmFuaW1hdGU6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGU9Yy5zcGVlZChiLGQsZik7aWYoYy5pc0VtcHR5T2JqZWN0KGEpKXJldHVybiB0aGlzLmVhY2goZS5jb21wbGV0ZSk7cmV0dXJuIHRoaXNbZS5xdWV1ZT09PWZhbHNlPyJlYWNoIjoicXVldWUiXShmdW5jdGlvbigpe3ZhciBqPWMuZXh0ZW5kKHt9LGUpLGksbz10aGlzLm5vZGVUeXBlPT09MSYmYyh0aGlzKS5pcygiOmhpZGRlbiIpLGs9dGhpcztmb3IoaSBpbiBhKXt2YXIgbj1pLnJlcGxhY2UoaWEsamEpO2lmKGkhPT1uKXthW25dPWFbaV07ZGVsZXRlIGFbaV07aT1ufWlmKGFbaV09PT0iaGlkZSImJm98fGFbaV09PT0ic2hvdyImJiFvKXJldHVybiBqLmNvbXBsZXRlLmNhbGwodGhpcyk7aWYoKGk9PT0iaGVpZ2h0Inx8aT09PSJ3aWR0aCIpJiZ0aGlzLnN0eWxlKXtqLmRpc3BsYXk9Yy5jc3ModGhpcywiZGlzcGxheSIpO2oub3ZlcmZsb3c9dGhpcy5zdHlsZS5vdmVyZmxvd31pZihjLmlzQXJyYXkoYVtpXSkpeyhqLnNwZWNpYWxFYXNpbmc9Cmouc3BlY2lhbEVhc2luZ3x8e30pW2ldPWFbaV1bMV07YVtpXT1hW2ldWzBdfX1pZihqLm92ZXJmbG93IT1udWxsKXRoaXMuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiI7ai5jdXJBbmltPWMuZXh0ZW5kKHt9LGEpO2MuZWFjaChhLGZ1bmN0aW9uKHIsdSl7dmFyIHo9bmV3IGMuZngoayxqLHIpO2lmKEFiLnRlc3QodSkpelt1PT09InRvZ2dsZSI/bz8ic2hvdyI6ImhpZGUiOnVdKGEpO2Vsc2V7dmFyIEM9QmIuZXhlYyh1KSxCPXouY3VyKHRydWUpfHwwO2lmKEMpe3U9cGFyc2VGbG9hdChDWzJdKTt2YXIgRT1DWzNdfHwicHgiO2lmKEUhPT0icHgiKXtrLnN0eWxlW3JdPSh1fHwxKStFO0I9KHV8fDEpL3ouY3VyKHRydWUpKkI7ay5zdHlsZVtyXT1CK0V9aWYoQ1sxXSl1PShDWzFdPT09Ii09Ij8tMToxKSp1K0I7ei5jdXN0b20oQix1LEUpfWVsc2Ugei5jdXN0b20oQix1LCIiKX19KTtyZXR1cm4gdHJ1ZX0pfSxzdG9wOmZ1bmN0aW9uKGEsYil7dmFyIGQ9Yy50aW1lcnM7YSYmdGhpcy5xdWV1ZShbXSk7CnRoaXMuZWFjaChmdW5jdGlvbigpe2Zvcih2YXIgZj1kLmxlbmd0aC0xO2Y+PTA7Zi0tKWlmKGRbZl0uZWxlbT09PXRoaXMpe2ImJmRbZl0odHJ1ZSk7ZC5zcGxpY2UoZiwxKX19KTtifHx0aGlzLmRlcXVldWUoKTtyZXR1cm4gdGhpc319KTtjLmVhY2goe3NsaWRlRG93bjpLKCJzaG93IiwxKSxzbGlkZVVwOksoImhpZGUiLDEpLHNsaWRlVG9nZ2xlOksoInRvZ2dsZSIsMSksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9fSxmdW5jdGlvbihhLGIpe2MuZm5bYV09ZnVuY3Rpb24oZCxmKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsZCxmKX19KTtjLmV4dGVuZCh7c3BlZWQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPWEmJnR5cGVvZiBhPT09Im9iamVjdCI/YTp7Y29tcGxldGU6ZHx8IWQmJmJ8fGMuaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpkJiZifHxiJiYhYy5pc0Z1bmN0aW9uKGIpJiZifTtmLmR1cmF0aW9uPWMuZngub2ZmPzA6dHlwZW9mIGYuZHVyYXRpb249PT0KIm51bWJlciI/Zi5kdXJhdGlvbjpjLmZ4LnNwZWVkc1tmLmR1cmF0aW9uXXx8Yy5meC5zcGVlZHMuX2RlZmF1bHQ7Zi5vbGQ9Zi5jb21wbGV0ZTtmLmNvbXBsZXRlPWZ1bmN0aW9uKCl7Zi5xdWV1ZSE9PWZhbHNlJiZjKHRoaXMpLmRlcXVldWUoKTtjLmlzRnVuY3Rpb24oZi5vbGQpJiZmLm9sZC5jYWxsKHRoaXMpfTtyZXR1cm4gZn0sZWFzaW5nOntsaW5lYXI6ZnVuY3Rpb24oYSxiLGQsZil7cmV0dXJuIGQrZiphfSxzd2luZzpmdW5jdGlvbihhLGIsZCxmKXtyZXR1cm4oLU1hdGguY29zKGEqTWF0aC5QSSkvMiswLjUpKmYrZH19LHRpbWVyczpbXSxmeDpmdW5jdGlvbihhLGIsZCl7dGhpcy5vcHRpb25zPWI7dGhpcy5lbGVtPWE7dGhpcy5wcm9wPWQ7aWYoIWIub3JpZyliLm9yaWc9e319fSk7Yy5meC5wcm90b3R5cGU9e3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKTsoYy5meC5zdGVwW3RoaXMucHJvcF18fApjLmZ4LnN0ZXAuX2RlZmF1bHQpKHRoaXMpO2lmKCh0aGlzLnByb3A9PT0iaGVpZ2h0Inx8dGhpcy5wcm9wPT09IndpZHRoIikmJnRoaXMuZWxlbS5zdHlsZSl0aGlzLmVsZW0uc3R5bGUuZGlzcGxheT0iYmxvY2sifSxjdXI6ZnVuY3Rpb24oYSl7aWYodGhpcy5lbGVtW3RoaXMucHJvcF0hPW51bGwmJighdGhpcy5lbGVtLnN0eWxlfHx0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXT09bnVsbCkpcmV0dXJuIHRoaXMuZWxlbVt0aGlzLnByb3BdO3JldHVybihhPXBhcnNlRmxvYXQoYy5jc3ModGhpcy5lbGVtLHRoaXMucHJvcCxhKSkpJiZhPi0xMDAwMD9hOnBhcnNlRmxvYXQoYy5jdXJDU1ModGhpcy5lbGVtLHRoaXMucHJvcCkpfHwwfSxjdXN0b206ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoail7cmV0dXJuIGUuc3RlcChqKX10aGlzLnN0YXJ0VGltZT1KKCk7dGhpcy5zdGFydD1hO3RoaXMuZW5kPWI7dGhpcy51bml0PWR8fHRoaXMudW5pdHx8InB4Ijt0aGlzLm5vdz10aGlzLnN0YXJ0Owp0aGlzLnBvcz10aGlzLnN0YXRlPTA7dmFyIGU9dGhpcztmLmVsZW09dGhpcy5lbGVtO2lmKGYoKSYmYy50aW1lcnMucHVzaChmKSYmIVcpVz1zZXRJbnRlcnZhbChjLmZ4LnRpY2ssMTMpfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1jLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApO3RoaXMub3B0aW9ucy5zaG93PXRydWU7dGhpcy5jdXN0b20odGhpcy5wcm9wPT09IndpZHRoInx8dGhpcy5wcm9wPT09ImhlaWdodCI/MTowLHRoaXMuY3VyKCkpO2ModGhpcy5lbGVtKS5zaG93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWMuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCk7dGhpcy5vcHRpb25zLmhpZGU9dHJ1ZTt0aGlzLmN1c3RvbSh0aGlzLmN1cigpLDApfSxzdGVwOmZ1bmN0aW9uKGEpe3ZhciBiPUooKSxkPXRydWU7aWYoYXx8Yj49dGhpcy5vcHRpb25zLmR1cmF0aW9uK3RoaXMuc3RhcnRUaW1lKXt0aGlzLm5vdz0KdGhpcy5lbmQ7dGhpcy5wb3M9dGhpcy5zdGF0ZT0xO3RoaXMudXBkYXRlKCk7dGhpcy5vcHRpb25zLmN1ckFuaW1bdGhpcy5wcm9wXT10cnVlO2Zvcih2YXIgZiBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSlpZih0aGlzLm9wdGlvbnMuY3VyQW5pbVtmXSE9PXRydWUpZD1mYWxzZTtpZihkKXtpZih0aGlzLm9wdGlvbnMuZGlzcGxheSE9bnVsbCl7dGhpcy5lbGVtLnN0eWxlLm92ZXJmbG93PXRoaXMub3B0aW9ucy5vdmVyZmxvdzthPWMuZGF0YSh0aGlzLmVsZW0sIm9sZGRpc3BsYXkiKTt0aGlzLmVsZW0uc3R5bGUuZGlzcGxheT1hP2E6dGhpcy5vcHRpb25zLmRpc3BsYXk7aWYoYy5jc3ModGhpcy5lbGVtLCJkaXNwbGF5Iik9PT0ibm9uZSIpdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn10aGlzLm9wdGlvbnMuaGlkZSYmYyh0aGlzLmVsZW0pLmhpZGUoKTtpZih0aGlzLm9wdGlvbnMuaGlkZXx8dGhpcy5vcHRpb25zLnNob3cpZm9yKHZhciBlIGluIHRoaXMub3B0aW9ucy5jdXJBbmltKWMuc3R5bGUodGhpcy5lbGVtLAplLHRoaXMub3B0aW9ucy5vcmlnW2VdKTt0aGlzLm9wdGlvbnMuY29tcGxldGUuY2FsbCh0aGlzLmVsZW0pfXJldHVybiBmYWxzZX1lbHNle2U9Yi10aGlzLnN0YXJ0VGltZTt0aGlzLnN0YXRlPWUvdGhpcy5vcHRpb25zLmR1cmF0aW9uO2E9dGhpcy5vcHRpb25zLmVhc2luZ3x8KGMuZWFzaW5nLnN3aW5nPyJzd2luZyI6ImxpbmVhciIpO3RoaXMucG9zPWMuZWFzaW5nW3RoaXMub3B0aW9ucy5zcGVjaWFsRWFzaW5nJiZ0aGlzLm9wdGlvbnMuc3BlY2lhbEVhc2luZ1t0aGlzLnByb3BdfHxhXSh0aGlzLnN0YXRlLGUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik7dGhpcy5ub3c9dGhpcy5zdGFydCsodGhpcy5lbmQtdGhpcy5zdGFydCkqdGhpcy5wb3M7dGhpcy51cGRhdGUoKX1yZXR1cm4gdHJ1ZX19O2MuZXh0ZW5kKGMuZngse3RpY2s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9Yy50aW1lcnMsYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0oKXx8YS5zcGxpY2UoYi0tLDEpO2EubGVuZ3RofHwKYy5meC5zdG9wKCl9LHN0b3A6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKFcpO1c9bnVsbH0sc3BlZWRzOntzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LHN0ZXA6e29wYWNpdHk6ZnVuY3Rpb24oYSl7Yy5zdHlsZShhLmVsZW0sIm9wYWNpdHkiLGEubm93KX0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7aWYoYS5lbGVtLnN0eWxlJiZhLmVsZW0uc3R5bGVbYS5wcm9wXSE9bnVsbClhLmVsZW0uc3R5bGVbYS5wcm9wXT0oYS5wcm9wPT09IndpZHRoInx8YS5wcm9wPT09ImhlaWdodCI/TWF0aC5tYXgoMCxhLm5vdyk6YS5ub3cpK2EudW5pdDtlbHNlIGEuZWxlbVthLnByb3BdPWEubm93fX19KTtpZihjLmV4cHImJmMuZXhwci5maWx0ZXJzKWMuZXhwci5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGEpe3JldHVybiBjLmdyZXAoYy50aW1lcnMsZnVuY3Rpb24oYil7cmV0dXJuIGE9PT1iLmVsZW19KS5sZW5ndGh9O2MuZm4ub2Zmc2V0PSJnZXRCb3VuZGluZ0NsaWVudFJlY3QiaW4gcy5kb2N1bWVudEVsZW1lbnQ/CmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2Mub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsZSl9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGMub2Zmc2V0LmJvZHlPZmZzZXQoYik7dmFyIGQ9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxmPWIub3duZXJEb2N1bWVudDtiPWYuYm9keTtmPWYuZG9jdW1lbnRFbGVtZW50O3JldHVybnt0b3A6ZC50b3ArKHNlbGYucGFnZVlPZmZzZXR8fGMuc3VwcG9ydC5ib3hNb2RlbCYmZi5zY3JvbGxUb3B8fGIuc2Nyb2xsVG9wKS0oZi5jbGllbnRUb3B8fGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoc2VsZi5wYWdlWE9mZnNldHx8Yy5zdXBwb3J0LmJveE1vZGVsJiZmLnNjcm9sbExlZnR8fGIuc2Nyb2xsTGVmdCktKGYuY2xpZW50TGVmdHx8Yi5jbGllbnRMZWZ0fHwwKX19OmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzWzBdO2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihyKXtjLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLHIpfSk7aWYoIWJ8fCFiLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYj09PWIub3duZXJEb2N1bWVudC5ib2R5KXJldHVybiBjLm9mZnNldC5ib2R5T2Zmc2V0KGIpO2Mub2Zmc2V0LmluaXRpYWxpemUoKTt2YXIgZD1iLm9mZnNldFBhcmVudCxmPWIsZT1iLm93bmVyRG9jdW1lbnQsaixpPWUuZG9jdW1lbnRFbGVtZW50LG89ZS5ib2R5O2Y9KGU9ZS5kZWZhdWx0Vmlldyk/ZS5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCk6Yi5jdXJyZW50U3R5bGU7Zm9yKHZhciBrPWIub2Zmc2V0VG9wLG49Yi5vZmZzZXRMZWZ0OyhiPWIucGFyZW50Tm9kZSkmJmIhPT1vJiZiIT09aTspe2lmKGMub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiYmZi5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7aj1lP2UuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlOwprLT1iLnNjcm9sbFRvcDtuLT1iLnNjcm9sbExlZnQ7aWYoYj09PWQpe2srPWIub2Zmc2V0VG9wO24rPWIub2Zmc2V0TGVmdDtpZihjLm9mZnNldC5kb2VzTm90QWRkQm9yZGVyJiYhKGMub2Zmc2V0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzJiYvXnQoYWJsZXxkfGgpJC9pLnRlc3QoYi5ub2RlTmFtZSkpKXtrKz1wYXJzZUZsb2F0KGouYm9yZGVyVG9wV2lkdGgpfHwwO24rPXBhcnNlRmxvYXQoai5ib3JkZXJMZWZ0V2lkdGgpfHwwfWY9ZDtkPWIub2Zmc2V0UGFyZW50fWlmKGMub2Zmc2V0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSYmai5vdmVyZmxvdyE9PSJ2aXNpYmxlIil7ays9cGFyc2VGbG9hdChqLmJvcmRlclRvcFdpZHRoKXx8MDtuKz1wYXJzZUZsb2F0KGouYm9yZGVyTGVmdFdpZHRoKXx8MH1mPWp9aWYoZi5wb3NpdGlvbj09PSJyZWxhdGl2ZSJ8fGYucG9zaXRpb249PT0ic3RhdGljIil7ays9by5vZmZzZXRUb3A7bis9by5vZmZzZXRMZWZ0fWlmKGMub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiYmCmYucG9zaXRpb249PT0iZml4ZWQiKXtrKz1NYXRoLm1heChpLnNjcm9sbFRvcCxvLnNjcm9sbFRvcCk7bis9TWF0aC5tYXgoaS5zY3JvbGxMZWZ0LG8uc2Nyb2xsTGVmdCl9cmV0dXJue3RvcDprLGxlZnQ6bn19O2Mub2Zmc2V0PXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9cy5ib2R5LGI9cy5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLGYsZSxqPXBhcnNlRmxvYXQoYy5jdXJDU1MoYSwibWFyZ2luVG9wIix0cnVlKSl8fDA7Yy5leHRlbmQoYi5zdHlsZSx7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAsYm9yZGVyOjAsd2lkdGg6IjFweCIsaGVpZ2h0OiIxcHgiLHZpc2liaWxpdHk6ImhpZGRlbiJ9KTtiLmlubmVySFRNTD0iPGRpdiBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO21hcmdpbjowO2JvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7Jz48ZGl2PjwvZGl2PjwvZGl2Pjx0YWJsZSBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO21hcmdpbjowO2JvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnPjx0cj48dGQ+PC90ZD48L3RyPjwvdGFibGU+IjsKYS5pbnNlcnRCZWZvcmUoYixhLmZpcnN0Q2hpbGQpO2Q9Yi5maXJzdENoaWxkO2Y9ZC5maXJzdENoaWxkO2U9ZC5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7dGhpcy5kb2VzTm90QWRkQm9yZGVyPWYub2Zmc2V0VG9wIT09NTt0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzPWUub2Zmc2V0VG9wPT09NTtmLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7Zi5zdHlsZS50b3A9IjIwcHgiO3RoaXMuc3VwcG9ydHNGaXhlZFBvc2l0aW9uPWYub2Zmc2V0VG9wPT09MjB8fGYub2Zmc2V0VG9wPT09MTU7Zi5zdHlsZS5wb3NpdGlvbj1mLnN0eWxlLnRvcD0iIjtkLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iO2Quc3R5bGUucG9zaXRpb249InJlbGF0aXZlIjt0aGlzLnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZT1mLm9mZnNldFRvcD09PS01O3RoaXMuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQ9YS5vZmZzZXRUb3AhPT1qO2EucmVtb3ZlQ2hpbGQoYik7CmMub2Zmc2V0LmluaXRpYWxpemU9Yy5ub29wfSxib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGQ9YS5vZmZzZXRMZWZ0O2Mub2Zmc2V0LmluaXRpYWxpemUoKTtpZihjLm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCl7Yis9cGFyc2VGbG9hdChjLmN1ckNTUyhhLCJtYXJnaW5Ub3AiLHRydWUpKXx8MDtkKz1wYXJzZUZsb2F0KGMuY3VyQ1NTKGEsIm1hcmdpbkxlZnQiLHRydWUpKXx8MH1yZXR1cm57dG9wOmIsbGVmdDpkfX0sc2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixkKXtpZigvc3RhdGljLy50ZXN0KGMuY3VyQ1NTKGEsInBvc2l0aW9uIikpKWEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIjt2YXIgZj1jKGEpLGU9Zi5vZmZzZXQoKSxqPXBhcnNlSW50KGMuY3VyQ1NTKGEsInRvcCIsdHJ1ZSksMTApfHwwLGk9cGFyc2VJbnQoYy5jdXJDU1MoYSwibGVmdCIsdHJ1ZSksMTApfHwwO2lmKGMuaXNGdW5jdGlvbihiKSliPWIuY2FsbChhLApkLGUpO2Q9e3RvcDpiLnRvcC1lLnRvcCtqLGxlZnQ6Yi5sZWZ0LWUubGVmdCtpfTsidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxkKTpmLmNzcyhkKX19O2MuZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKCF0aGlzWzBdKXJldHVybiBudWxsO3ZhciBhPXRoaXNbMF0sYj10aGlzLm9mZnNldFBhcmVudCgpLGQ9dGhpcy5vZmZzZXQoKSxmPS9eYm9keXxodG1sJC9pLnRlc3QoYlswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06Yi5vZmZzZXQoKTtkLnRvcC09cGFyc2VGbG9hdChjLmN1ckNTUyhhLCJtYXJnaW5Ub3AiLHRydWUpKXx8MDtkLmxlZnQtPXBhcnNlRmxvYXQoYy5jdXJDU1MoYSwibWFyZ2luTGVmdCIsdHJ1ZSkpfHwwO2YudG9wKz1wYXJzZUZsb2F0KGMuY3VyQ1NTKGJbMF0sImJvcmRlclRvcFdpZHRoIix0cnVlKSl8fDA7Zi5sZWZ0Kz1wYXJzZUZsb2F0KGMuY3VyQ1NTKGJbMF0sImJvcmRlckxlZnRXaWR0aCIsdHJ1ZSkpfHwwO3JldHVybnt0b3A6ZC50b3AtCmYudG9wLGxlZnQ6ZC5sZWZ0LWYubGVmdH19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8cy5ib2R5O2EmJiEvXmJvZHl8aHRtbCQvaS50ZXN0KGEubm9kZU5hbWUpJiZjLmNzcyhhLCJwb3NpdGlvbiIpPT09InN0YXRpYyI7KWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF9KX19KTtjLmVhY2goWyJMZWZ0IiwiVG9wIl0sZnVuY3Rpb24oYSxiKXt2YXIgZD0ic2Nyb2xsIitiO2MuZm5bZF09ZnVuY3Rpb24oZil7dmFyIGU9dGhpc1swXSxqO2lmKCFlKXJldHVybiBudWxsO2lmKGYhPT13KXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihqPXdhKHRoaXMpKWouc2Nyb2xsVG8oIWE/ZjpjKGopLnNjcm9sbExlZnQoKSxhP2Y6YyhqKS5zY3JvbGxUb3AoKSk7ZWxzZSB0aGlzW2RdPWZ9KTtlbHNlIHJldHVybihqPXdhKGUpKT8icGFnZVhPZmZzZXQiaW4gaj9qW2E/InBhZ2VZT2Zmc2V0IjoKInBhZ2VYT2Zmc2V0Il06Yy5zdXBwb3J0LmJveE1vZGVsJiZqLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8ai5kb2N1bWVudC5ib2R5W2RdOmVbZF19fSk7Yy5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGIpe3ZhciBkPWIudG9Mb3dlckNhc2UoKTtjLmZuWyJpbm5lciIrYl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1swXT9jLmNzcyh0aGlzWzBdLGQsZmFsc2UsInBhZGRpbmciKTpudWxsfTtjLmZuWyJvdXRlciIrYl09ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXNbMF0/Yy5jc3ModGhpc1swXSxkLGZhbHNlLGY/Im1hcmdpbiI6ImJvcmRlciIpOm51bGx9O2MuZm5bZF09ZnVuY3Rpb24oZil7dmFyIGU9dGhpc1swXTtpZighZSlyZXR1cm4gZj09bnVsbD9udWxsOnRoaXM7aWYoYy5pc0Z1bmN0aW9uKGYpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oail7dmFyIGk9Yyh0aGlzKTtpW2RdKGYuY2FsbCh0aGlzLGosaVtkXSgpKSl9KTtyZXR1cm4ic2Nyb2xsVG8iaW4KZSYmZS5kb2N1bWVudD9lLmRvY3VtZW50LmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCImJmUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2JdfHxlLmRvY3VtZW50LmJvZHlbImNsaWVudCIrYl06ZS5ub2RlVHlwZT09PTk/TWF0aC5tYXgoZS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYl0sZS5ib2R5WyJzY3JvbGwiK2JdLGUuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiK2JdLGUuYm9keVsib2Zmc2V0IitiXSxlLmRvY3VtZW50RWxlbWVudFsib2Zmc2V0IitiXSk6Zj09PXc/Yy5jc3MoZSxkKTp0aGlzLmNzcyhkLHR5cGVvZiBmPT09InN0cmluZyI/ZjpmKyJweCIpfX0pO0EualF1ZXJ5PUEuJD1jfSkod2luZG93KTsK]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/jquery-ui-1.8.5.custom.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBVSSAxLjguNQogKgogKiBDb3B5cmlnaHQgMjAxMCwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkKICovCihmdW5jdGlvbihjLGope2Z1bmN0aW9uIGsoYSl7cmV0dXJuIWMoYSkucGFyZW50cygpLmFuZFNlbGYoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gYy5jdXJDU1ModGhpcywidmlzaWJpbGl0eSIpPT09ImhpZGRlbiJ8fGMuZXhwci5maWx0ZXJzLmhpZGRlbih0aGlzKX0pLmxlbmd0aH1jLnVpPWMudWl8fHt9O2lmKCFjLnVpLnZlcnNpb24pe2MuZXh0ZW5kKGMudWkse3ZlcnNpb246IjEuOC41IixrZXlDb2RlOntBTFQ6MTgsQkFDS1NQQUNFOjgsQ0FQU19MT0NLOjIwLENPTU1BOjE4OCxDT01NQU5EOjkxLENPTU1BTkRfTEVGVDo5MSxDT01NQU5EX1JJR0hUOjkzLENPTlRST0w6MTcsREVMRVRFOjQ2LERPV046NDAsRU5EOjM1LEVOVEVSOjEzLEVTQ0FQRToyNyxIT01FOjM2LElOU0VSVDo0NSxMRUZUOjM3LE1FTlU6OTMsTlVNUEFEX0FERDoxMDcsTlVNUEFEX0RFQ0lNQUw6MTEwLE5VTVBBRF9ESVZJREU6MTExLE5VTVBBRF9FTlRFUjoxMDgsTlVNUEFEX01VTFRJUExZOjEwNiwKTlVNUEFEX1NVQlRSQUNUOjEwOSxQQUdFX0RPV046MzQsUEFHRV9VUDozMyxQRVJJT0Q6MTkwLFJJR0hUOjM5LFNISUZUOjE2LFNQQUNFOjMyLFRBQjo5LFVQOjM4LFdJTkRPV1M6OTF9fSk7Yy5mbi5leHRlbmQoe19mb2N1czpjLmZuLmZvY3VzLGZvY3VzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciI/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyhkKS5mb2N1cygpO2ImJmIuY2FsbChkKX0sYSl9KTp0aGlzLl9mb2N1cy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHNjcm9sbFBhcmVudDpmdW5jdGlvbigpe3ZhciBhO2E9Yy5icm93c2VyLm1zaWUmJi8oc3RhdGljfHJlbGF0aXZlKS8udGVzdCh0aGlzLmNzcygicG9zaXRpb24iKSl8fC9hYnNvbHV0ZS8udGVzdCh0aGlzLmNzcygicG9zaXRpb24iKSk/dGhpcy5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuLyhyZWxhdGl2ZXxhYnNvbHV0ZXxmaXhlZCkvLnRlc3QoYy5jdXJDU1ModGhpcywKInBvc2l0aW9uIiwxKSkmJi8oYXV0b3xzY3JvbGwpLy50ZXN0KGMuY3VyQ1NTKHRoaXMsIm92ZXJmbG93IiwxKStjLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy15IiwxKStjLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy14IiwxKSl9KS5lcSgwKTp0aGlzLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4vKGF1dG98c2Nyb2xsKS8udGVzdChjLmN1ckNTUyh0aGlzLCJvdmVyZmxvdyIsMSkrYy5jdXJDU1ModGhpcywib3ZlcmZsb3cteSIsMSkrYy5jdXJDU1ModGhpcywib3ZlcmZsb3cteCIsMSkpfSkuZXEoMCk7cmV0dXJuL2ZpeGVkLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKXx8IWEubGVuZ3RoP2MoZG9jdW1lbnQpOmF9LHpJbmRleDpmdW5jdGlvbihhKXtpZihhIT09ailyZXR1cm4gdGhpcy5jc3MoInpJbmRleCIsYSk7aWYodGhpcy5sZW5ndGgpe2E9Yyh0aGlzWzBdKTtmb3IodmFyIGI7YS5sZW5ndGgmJmFbMF0hPT1kb2N1bWVudDspe2I9YS5jc3MoInBvc2l0aW9uIik7CmlmKGI9PT0iYWJzb2x1dGUifHxiPT09InJlbGF0aXZlInx8Yj09PSJmaXhlZCIpe2I9cGFyc2VJbnQoYS5jc3MoInpJbmRleCIpKTtpZighaXNOYU4oYikmJmIhPTApcmV0dXJuIGJ9YT1hLnBhcmVudCgpfX1yZXR1cm4gMH0sZGlzYWJsZVNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJpbmQoIm1vdXNlZG93bi51aS1kaXNhYmxlU2VsZWN0aW9uIHNlbGVjdHN0YXJ0LnVpLWRpc2FibGVTZWxlY3Rpb24iLGZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKX0pfSxlbmFibGVTZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmJpbmQoIi51aS1kaXNhYmxlU2VsZWN0aW9uIil9fSk7Yy5lYWNoKFsiV2lkdGgiLCJIZWlnaHQiXSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoZixnLGwsbSl7Yy5lYWNoKGUsZnVuY3Rpb24oKXtnLT1wYXJzZUZsb2F0KGMuY3VyQ1NTKGYsInBhZGRpbmciK3RoaXMsdHJ1ZSkpfHwwO2lmKGwpZy09cGFyc2VGbG9hdChjLmN1ckNTUyhmLAoiYm9yZGVyIit0aGlzKyJXaWR0aCIsdHJ1ZSkpfHwwO2lmKG0pZy09cGFyc2VGbG9hdChjLmN1ckNTUyhmLCJtYXJnaW4iK3RoaXMsdHJ1ZSkpfHwwfSk7cmV0dXJuIGd9dmFyIGU9Yj09PSJXaWR0aCI/WyJMZWZ0IiwiUmlnaHQiXTpbIlRvcCIsIkJvdHRvbSJdLGg9Yi50b0xvd2VyQ2FzZSgpLGk9e2lubmVyV2lkdGg6Yy5mbi5pbm5lcldpZHRoLGlubmVySGVpZ2h0OmMuZm4uaW5uZXJIZWlnaHQsb3V0ZXJXaWR0aDpjLmZuLm91dGVyV2lkdGgsb3V0ZXJIZWlnaHQ6Yy5mbi5vdXRlckhlaWdodH07Yy5mblsiaW5uZXIiK2JdPWZ1bmN0aW9uKGYpe2lmKGY9PT1qKXJldHVybiBpWyJpbm5lciIrYl0uY2FsbCh0aGlzKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5zdHlsZSh0aGlzLGgsZCh0aGlzLGYpKyJweCIpfSl9O2MuZm5bIm91dGVyIitiXT1mdW5jdGlvbihmLGcpe2lmKHR5cGVvZiBmIT09Im51bWJlciIpcmV0dXJuIGlbIm91dGVyIitiXS5jYWxsKHRoaXMsZik7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2Muc3R5bGUodGhpcywKaCxkKHRoaXMsZix0cnVlLGcpKyJweCIpfSl9fSk7Yy5leHRlbmQoYy5leHByWyI6Il0se2RhdGE6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiEhYy5kYXRhKGEsZFszXSl9LGZvY3VzYWJsZTpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksZD1jLmF0dHIoYSwidGFiaW5kZXgiKTtpZigiYXJlYSI9PT1iKXtiPWEucGFyZW50Tm9kZTtkPWIubmFtZTtpZighYS5ocmVmfHwhZHx8Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im1hcCIpcmV0dXJuIGZhbHNlO2E9YygiaW1nW3VzZW1hcD0jIitkKyJdIilbMF07cmV0dXJuISFhJiZrKGEpfXJldHVybigvaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbnxvYmplY3QvLnRlc3QoYik/IWEuZGlzYWJsZWQ6ImEiPT1iP2EuaHJlZnx8IWlzTmFOKGQpOiFpc05hTihkKSkmJmsoYSl9LHRhYmJhYmxlOmZ1bmN0aW9uKGEpe3ZhciBiPWMuYXR0cihhLCJ0YWJpbmRleCIpO3JldHVybihpc05hTihiKXx8Yj49MCkmJmMoYSkuaXMoIjpmb2N1c2FibGUiKX19KTsKYyhmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGI9ZG9jdW1lbnQuYm9keTtjLmV4dGVuZChhLnN0eWxlLHttaW5IZWlnaHQ6IjEwMHB4IixoZWlnaHQ6ImF1dG8iLHBhZGRpbmc6MCxib3JkZXJXaWR0aDowfSk7Yy5zdXBwb3J0Lm1pbkhlaWdodD1iLmFwcGVuZENoaWxkKGEpLm9mZnNldEhlaWdodD09PTEwMDtiLnJlbW92ZUNoaWxkKGEpLnN0eWxlLmRpc3BsYXk9Im5vbmUifSk7Yy5leHRlbmQoYy51aSx7cGx1Z2luOnthZGQ6ZnVuY3Rpb24oYSxiLGQpe2E9Yy51aVthXS5wcm90b3R5cGU7Zm9yKHZhciBlIGluIGQpe2EucGx1Z2luc1tlXT1hLnBsdWdpbnNbZV18fFtdO2EucGx1Z2luc1tlXS5wdXNoKFtiLGRbZV1dKX19LGNhbGw6ZnVuY3Rpb24oYSxiLGQpe2lmKChiPWEucGx1Z2luc1tiXSkmJmEuZWxlbWVudFswXS5wYXJlbnROb2RlKWZvcih2YXIgZT0wO2U8Yi5sZW5ndGg7ZSsrKWEub3B0aW9uc1tiW2VdWzBdXSYmYltlXVsxXS5hcHBseShhLmVsZW1lbnQsCmQpfX0sY29udGFpbnM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZG9jdW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNjphIT09YiYmYS5jb250YWlucyhiKX0saGFzU2Nyb2xsOmZ1bmN0aW9uKGEsYil7aWYoYyhhKS5jc3MoIm92ZXJmbG93Iik9PT0iaGlkZGVuIilyZXR1cm4gZmFsc2U7Yj1iJiZiPT09ImxlZnQiPyJzY3JvbGxMZWZ0Ijoic2Nyb2xsVG9wIjt2YXIgZD1mYWxzZTtpZihhW2JdPjApcmV0dXJuIHRydWU7YVtiXT0xO2Q9YVtiXT4wO2FbYl09MDtyZXR1cm4gZH0saXNPdmVyQXhpczpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGE+YiYmYTxiK2R9LGlzT3ZlcjpmdW5jdGlvbihhLGIsZCxlLGgsaSl7cmV0dXJuIGMudWkuaXNPdmVyQXhpcyhhLGQsaCkmJmMudWkuaXNPdmVyQXhpcyhiLGUsaSl9fSl9fSkoalF1ZXJ5KTsKOy8qIQogKiBqUXVlcnkgVUkgV2lkZ2V0IDEuOC41CiAqCiAqIENvcHlyaWdodCAyMDEwLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9XaWRnZXQKICovCihmdW5jdGlvbihiLGope2lmKGIuY2xlYW5EYXRhKXt2YXIgaz1iLmNsZWFuRGF0YTtiLmNsZWFuRGF0YT1mdW5jdGlvbihhKXtmb3IodmFyIGM9MCxkOyhkPWFbY10pIT1udWxsO2MrKyliKGQpLnRyaWdnZXJIYW5kbGVyKCJyZW1vdmUiKTtrKGEpfX1lbHNle3ZhciBsPWIuZm4ucmVtb3ZlO2IuZm4ucmVtb3ZlPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKCFjKWlmKCFhfHxiLmZpbHRlcihhLFt0aGlzXSkubGVuZ3RoKWIoIioiLHRoaXMpLmFkZChbdGhpc10pLmVhY2goZnVuY3Rpb24oKXtiKHRoaXMpLnRyaWdnZXJIYW5kbGVyKCJyZW1vdmUiKX0pO3JldHVybiBsLmNhbGwoYih0aGlzKSxhLGMpfSl9fWIud2lkZ2V0PWZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1hLnNwbGl0KCIuIilbMF0sZjthPWEuc3BsaXQoIi4iKVsxXTtmPWUrIi0iK2E7aWYoIWQpe2Q9YztjPWIuV2lkZ2V0fWIuZXhwclsiOiJdW2ZdPWZ1bmN0aW9uKGgpe3JldHVybiEhYi5kYXRhKGgsCmEpfTtiW2VdPWJbZV18fHt9O2JbZV1bYV09ZnVuY3Rpb24oaCxnKXthcmd1bWVudHMubGVuZ3RoJiZ0aGlzLl9jcmVhdGVXaWRnZXQoaCxnKX07Yz1uZXcgYztjLm9wdGlvbnM9Yi5leHRlbmQodHJ1ZSx7fSxjLm9wdGlvbnMpO2JbZV1bYV0ucHJvdG90eXBlPWIuZXh0ZW5kKHRydWUsYyx7bmFtZXNwYWNlOmUsd2lkZ2V0TmFtZTphLHdpZGdldEV2ZW50UHJlZml4OmJbZV1bYV0ucHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4fHxhLHdpZGdldEJhc2VDbGFzczpmfSxkKTtiLndpZGdldC5icmlkZ2UoYSxiW2VdW2FdKX07Yi53aWRnZXQuYnJpZGdlPWZ1bmN0aW9uKGEsYyl7Yi5mblthXT1mdW5jdGlvbihkKXt2YXIgZT10eXBlb2YgZD09PSJzdHJpbmciLGY9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGg9dGhpcztkPSFlJiZmLmxlbmd0aD9iLmV4dGVuZC5hcHBseShudWxsLFt0cnVlLGRdLmNvbmNhdChmKSk6ZDtpZihlJiZkLnN1YnN0cmluZygwLDEpPT09CiJfIilyZXR1cm4gaDtlP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBnPWIuZGF0YSh0aGlzLGEpO2lmKCFnKXRocm93ImNhbm5vdCBjYWxsIG1ldGhvZHMgb24gIithKyIgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb247IGF0dGVtcHRlZCB0byBjYWxsIG1ldGhvZCAnIitkKyInIjtpZighYi5pc0Z1bmN0aW9uKGdbZF0pKXRocm93Im5vIHN1Y2ggbWV0aG9kICciK2QrIicgZm9yICIrYSsiIHdpZGdldCBpbnN0YW5jZSI7dmFyIGk9Z1tkXS5hcHBseShnLGYpO2lmKGkhPT1nJiZpIT09ail7aD1pO3JldHVybiBmYWxzZX19KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZz1iLmRhdGEodGhpcyxhKTtnP2cub3B0aW9uKGR8fHt9KS5faW5pdCgpOmIuZGF0YSh0aGlzLGEsbmV3IGMoZCx0aGlzKSl9KTtyZXR1cm4gaH19O2IuV2lkZ2V0PWZ1bmN0aW9uKGEsYyl7YXJndW1lbnRzLmxlbmd0aCYmdGhpcy5fY3JlYXRlV2lkZ2V0KGEsYyl9O2IuV2lkZ2V0LnByb3RvdHlwZT17d2lkZ2V0TmFtZToid2lkZ2V0IiwKd2lkZ2V0RXZlbnRQcmVmaXg6IiIsb3B0aW9uczp7ZGlzYWJsZWQ6ZmFsc2V9LF9jcmVhdGVXaWRnZXQ6ZnVuY3Rpb24oYSxjKXtiLmRhdGEoYyx0aGlzLndpZGdldE5hbWUsdGhpcyk7dGhpcy5lbGVtZW50PWIoYyk7dGhpcy5vcHRpb25zPWIuZXh0ZW5kKHRydWUse30sdGhpcy5vcHRpb25zLGIubWV0YWRhdGEmJmIubWV0YWRhdGEuZ2V0KGMpW3RoaXMud2lkZ2V0TmFtZV0sYSk7dmFyIGQ9dGhpczt0aGlzLmVsZW1lbnQuYmluZCgicmVtb3ZlLiIrdGhpcy53aWRnZXROYW1lLGZ1bmN0aW9uKCl7ZC5kZXN0cm95KCl9KTt0aGlzLl9jcmVhdGUoKTt0aGlzLl9pbml0KCl9LF9jcmVhdGU6ZnVuY3Rpb24oKXt9LF9pbml0OmZ1bmN0aW9uKCl7fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnVuYmluZCgiLiIrdGhpcy53aWRnZXROYW1lKS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0TmFtZSk7dGhpcy53aWRnZXQoKS51bmJpbmQoIi4iK3RoaXMud2lkZ2V0TmFtZSkucmVtb3ZlQXR0cigiYXJpYS1kaXNhYmxlZCIpLnJlbW92ZUNsYXNzKHRoaXMud2lkZ2V0QmFzZUNsYXNzKwoiLWRpc2FibGVkIHVpLXN0YXRlLWRpc2FibGVkIil9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnR9LG9wdGlvbjpmdW5jdGlvbihhLGMpe3ZhciBkPWEsZT10aGlzO2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0wKXJldHVybiBiLmV4dGVuZCh7fSxlLm9wdGlvbnMpO2lmKHR5cGVvZiBhPT09InN0cmluZyIpe2lmKGM9PT1qKXJldHVybiB0aGlzLm9wdGlvbnNbYV07ZD17fTtkW2FdPWN9Yi5lYWNoKGQsZnVuY3Rpb24oZixoKXtlLl9zZXRPcHRpb24oZixoKX0pO3JldHVybiBlfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGEsYyl7dGhpcy5vcHRpb25zW2FdPWM7aWYoYT09PSJkaXNhYmxlZCIpdGhpcy53aWRnZXQoKVtjPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0odGhpcy53aWRnZXRCYXNlQ2xhc3MrIi1kaXNhYmxlZCB1aS1zdGF0ZS1kaXNhYmxlZCIpLmF0dHIoImFyaWEtZGlzYWJsZWQiLGMpO3JldHVybiB0aGlzfSxlbmFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsCmZhbHNlKX0sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIix0cnVlKX0sX3RyaWdnZXI6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPXRoaXMub3B0aW9uc1thXTtjPWIuRXZlbnQoYyk7Yy50eXBlPShhPT09dGhpcy53aWRnZXRFdmVudFByZWZpeD9hOnRoaXMud2lkZ2V0RXZlbnRQcmVmaXgrYSkudG9Mb3dlckNhc2UoKTtkPWR8fHt9O2lmKGMub3JpZ2luYWxFdmVudCl7YT1iLmV2ZW50LnByb3BzLmxlbmd0aDtmb3IodmFyIGY7YTspe2Y9Yi5ldmVudC5wcm9wc1stLWFdO2NbZl09Yy5vcmlnaW5hbEV2ZW50W2ZdfX10aGlzLmVsZW1lbnQudHJpZ2dlcihjLGQpO3JldHVybiEoYi5pc0Z1bmN0aW9uKGUpJiZlLmNhbGwodGhpcy5lbGVtZW50WzBdLGMsZCk9PT1mYWxzZXx8Yy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl9fX0pKGpRdWVyeSk7CjsvKiEKICogalF1ZXJ5IFVJIE1vdXNlIDEuOC41CiAqCiAqIENvcHlyaWdodCAyMDEwLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9Nb3VzZQogKgogKiBEZXBlbmRzOgogKglqcXVlcnkudWkud2lkZ2V0LmpzCiAqLwooZnVuY3Rpb24oYyl7Yy53aWRnZXQoInVpLm1vdXNlIix7b3B0aW9uczp7Y2FuY2VsOiI6aW5wdXQsb3B0aW9uIixkaXN0YW5jZToxLGRlbGF5OjB9LF9tb3VzZUluaXQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuZWxlbWVudC5iaW5kKCJtb3VzZWRvd24uIit0aGlzLndpZGdldE5hbWUsZnVuY3Rpb24oYil7cmV0dXJuIGEuX21vdXNlRG93bihiKX0pLmJpbmQoImNsaWNrLiIrdGhpcy53aWRnZXROYW1lLGZ1bmN0aW9uKGIpe2lmKGEuX3ByZXZlbnRDbGlja0V2ZW50KXthLl9wcmV2ZW50Q2xpY2tFdmVudD1mYWxzZTtiLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO3JldHVybiBmYWxzZX19KTt0aGlzLnN0YXJ0ZWQ9ZmFsc2V9LF9tb3VzZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQudW5iaW5kKCIuIit0aGlzLndpZGdldE5hbWUpfSxfbW91c2VEb3duOmZ1bmN0aW9uKGEpe2Eub3JpZ2luYWxFdmVudD1hLm9yaWdpbmFsRXZlbnR8fHt9O2lmKCFhLm9yaWdpbmFsRXZlbnQubW91c2VIYW5kbGVkKXt0aGlzLl9tb3VzZVN0YXJ0ZWQmJgp0aGlzLl9tb3VzZVVwKGEpO3RoaXMuX21vdXNlRG93bkV2ZW50PWE7dmFyIGI9dGhpcyxlPWEud2hpY2g9PTEsZj10eXBlb2YgdGhpcy5vcHRpb25zLmNhbmNlbD09InN0cmluZyI/YyhhLnRhcmdldCkucGFyZW50cygpLmFkZChhLnRhcmdldCkuZmlsdGVyKHRoaXMub3B0aW9ucy5jYW5jZWwpLmxlbmd0aDpmYWxzZTtpZighZXx8Znx8IXRoaXMuX21vdXNlQ2FwdHVyZShhKSlyZXR1cm4gdHJ1ZTt0aGlzLm1vdXNlRGVsYXlNZXQ9IXRoaXMub3B0aW9ucy5kZWxheTtpZighdGhpcy5tb3VzZURlbGF5TWV0KXRoaXMuX21vdXNlRGVsYXlUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5tb3VzZURlbGF5TWV0PXRydWV9LHRoaXMub3B0aW9ucy5kZWxheSk7aWYodGhpcy5fbW91c2VEaXN0YW5jZU1ldChhKSYmdGhpcy5fbW91c2VEZWxheU1ldChhKSl7dGhpcy5fbW91c2VTdGFydGVkPXRoaXMuX21vdXNlU3RhcnQoYSkhPT1mYWxzZTtpZighdGhpcy5fbW91c2VTdGFydGVkKXthLnByZXZlbnREZWZhdWx0KCk7CnJldHVybiB0cnVlfX10aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZT1mdW5jdGlvbihkKXtyZXR1cm4gYi5fbW91c2VNb3ZlKGQpfTt0aGlzLl9tb3VzZVVwRGVsZWdhdGU9ZnVuY3Rpb24oZCl7cmV0dXJuIGIuX21vdXNlVXAoZCl9O2MoZG9jdW1lbnQpLmJpbmQoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkuYmluZCgibW91c2V1cC4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUpO2MuYnJvd3Nlci5zYWZhcml8fGEucHJldmVudERlZmF1bHQoKTtyZXR1cm4gYS5vcmlnaW5hbEV2ZW50Lm1vdXNlSGFuZGxlZD10cnVlfX0sX21vdXNlTW92ZTpmdW5jdGlvbihhKXtpZihjLmJyb3dzZXIubXNpZSYmIWEuYnV0dG9uKXJldHVybiB0aGlzLl9tb3VzZVVwKGEpO2lmKHRoaXMuX21vdXNlU3RhcnRlZCl7dGhpcy5fbW91c2VEcmFnKGEpO3JldHVybiBhLnByZXZlbnREZWZhdWx0KCl9aWYodGhpcy5fbW91c2VEaXN0YW5jZU1ldChhKSYmCnRoaXMuX21vdXNlRGVsYXlNZXQoYSkpKHRoaXMuX21vdXNlU3RhcnRlZD10aGlzLl9tb3VzZVN0YXJ0KHRoaXMuX21vdXNlRG93bkV2ZW50LGEpIT09ZmFsc2UpP3RoaXMuX21vdXNlRHJhZyhhKTp0aGlzLl9tb3VzZVVwKGEpO3JldHVybiF0aGlzLl9tb3VzZVN0YXJ0ZWR9LF9tb3VzZVVwOmZ1bmN0aW9uKGEpe2MoZG9jdW1lbnQpLnVuYmluZCgibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS51bmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKTtpZih0aGlzLl9tb3VzZVN0YXJ0ZWQpe3RoaXMuX21vdXNlU3RhcnRlZD1mYWxzZTt0aGlzLl9wcmV2ZW50Q2xpY2tFdmVudD1hLnRhcmdldD09dGhpcy5fbW91c2VEb3duRXZlbnQudGFyZ2V0O3RoaXMuX21vdXNlU3RvcChhKX1yZXR1cm4gZmFsc2V9LF9tb3VzZURpc3RhbmNlTWV0OmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLm1heChNYXRoLmFicyh0aGlzLl9tb3VzZURvd25FdmVudC5wYWdlWC0KYS5wYWdlWCksTWF0aC5hYnModGhpcy5fbW91c2VEb3duRXZlbnQucGFnZVktYS5wYWdlWSkpPj10aGlzLm9wdGlvbnMuZGlzdGFuY2V9LF9tb3VzZURlbGF5TWV0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubW91c2VEZWxheU1ldH0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oKXt9LF9tb3VzZURyYWc6ZnVuY3Rpb24oKXt9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oKXt9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gdHJ1ZX19KX0pKGpRdWVyeSk7CjsvKgogKiBqUXVlcnkgVUkgUG9zaXRpb24gMS44LjUKICoKICogQ29weXJpZ2h0IDIwMTAsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1Bvc2l0aW9uCiAqLwooZnVuY3Rpb24oYyl7Yy51aT1jLnVpfHx7fTt2YXIgbj0vbGVmdHxjZW50ZXJ8cmlnaHQvLG89L3RvcHxjZW50ZXJ8Ym90dG9tLyx0PWMuZm4ucG9zaXRpb24sdT1jLmZuLm9mZnNldDtjLmZuLnBvc2l0aW9uPWZ1bmN0aW9uKGIpe2lmKCFifHwhYi5vZilyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Yj1jLmV4dGVuZCh7fSxiKTt2YXIgYT1jKGIub2YpLGQ9YVswXSxnPShiLmNvbGxpc2lvbnx8ImZsaXAiKS5zcGxpdCgiICIpLGU9Yi5vZmZzZXQ/Yi5vZmZzZXQuc3BsaXQoIiAiKTpbMCwwXSxoLGssajtpZihkLm5vZGVUeXBlPT09OSl7aD1hLndpZHRoKCk7az1hLmhlaWdodCgpO2o9e3RvcDowLGxlZnQ6MH19ZWxzZSBpZihkLnNjcm9sbFRvJiZkLmRvY3VtZW50KXtoPWEud2lkdGgoKTtrPWEuaGVpZ2h0KCk7aj17dG9wOmEuc2Nyb2xsVG9wKCksbGVmdDphLnNjcm9sbExlZnQoKX19ZWxzZSBpZihkLnByZXZlbnREZWZhdWx0KXtiLmF0PSJsZWZ0IHRvcCI7aD1rPTA7aj0Ke3RvcDpiLm9mLnBhZ2VZLGxlZnQ6Yi5vZi5wYWdlWH19ZWxzZXtoPWEub3V0ZXJXaWR0aCgpO2s9YS5vdXRlckhlaWdodCgpO2o9YS5vZmZzZXQoKX1jLmVhY2goWyJteSIsImF0Il0sZnVuY3Rpb24oKXt2YXIgZj0oYlt0aGlzXXx8IiIpLnNwbGl0KCIgIik7aWYoZi5sZW5ndGg9PT0xKWY9bi50ZXN0KGZbMF0pP2YuY29uY2F0KFsiY2VudGVyIl0pOm8udGVzdChmWzBdKT9bImNlbnRlciJdLmNvbmNhdChmKTpbImNlbnRlciIsImNlbnRlciJdO2ZbMF09bi50ZXN0KGZbMF0pP2ZbMF06ImNlbnRlciI7ZlsxXT1vLnRlc3QoZlsxXSk/ZlsxXToiY2VudGVyIjtiW3RoaXNdPWZ9KTtpZihnLmxlbmd0aD09PTEpZ1sxXT1nWzBdO2VbMF09cGFyc2VJbnQoZVswXSwxMCl8fDA7aWYoZS5sZW5ndGg9PT0xKWVbMV09ZVswXTtlWzFdPXBhcnNlSW50KGVbMV0sMTApfHwwO2lmKGIuYXRbMF09PT0icmlnaHQiKWoubGVmdCs9aDtlbHNlIGlmKGIuYXRbMF09PT0iY2VudGVyIilqLmxlZnQrPWgvCjI7aWYoYi5hdFsxXT09PSJib3R0b20iKWoudG9wKz1rO2Vsc2UgaWYoYi5hdFsxXT09PSJjZW50ZXIiKWoudG9wKz1rLzI7ai5sZWZ0Kz1lWzBdO2oudG9wKz1lWzFdO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZj1jKHRoaXMpLGw9Zi5vdXRlcldpZHRoKCksbT1mLm91dGVySGVpZ2h0KCkscD1wYXJzZUludChjLmN1ckNTUyh0aGlzLCJtYXJnaW5MZWZ0Iix0cnVlKSl8fDAscT1wYXJzZUludChjLmN1ckNTUyh0aGlzLCJtYXJnaW5Ub3AiLHRydWUpKXx8MCx2PWwrcCtwYXJzZUludChjLmN1ckNTUyh0aGlzLCJtYXJnaW5SaWdodCIsdHJ1ZSkpfHwwLHc9bStxK3BhcnNlSW50KGMuY3VyQ1NTKHRoaXMsIm1hcmdpbkJvdHRvbSIsdHJ1ZSkpfHwwLGk9Yy5leHRlbmQoe30saikscjtpZihiLm15WzBdPT09InJpZ2h0IilpLmxlZnQtPWw7ZWxzZSBpZihiLm15WzBdPT09ImNlbnRlciIpaS5sZWZ0LT1sLzI7aWYoYi5teVsxXT09PSJib3R0b20iKWkudG9wLT1tO2Vsc2UgaWYoYi5teVsxXT09PQoiY2VudGVyIilpLnRvcC09bS8yO2kubGVmdD1wYXJzZUludChpLmxlZnQpO2kudG9wPXBhcnNlSW50KGkudG9wKTtyPXtsZWZ0OmkubGVmdC1wLHRvcDppLnRvcC1xfTtjLmVhY2goWyJsZWZ0IiwidG9wIl0sZnVuY3Rpb24ocyx4KXtjLnVpLnBvc2l0aW9uW2dbc11dJiZjLnVpLnBvc2l0aW9uW2dbc11dW3hdKGkse3RhcmdldFdpZHRoOmgsdGFyZ2V0SGVpZ2h0OmssZWxlbVdpZHRoOmwsZWxlbUhlaWdodDptLGNvbGxpc2lvblBvc2l0aW9uOnIsY29sbGlzaW9uV2lkdGg6dixjb2xsaXNpb25IZWlnaHQ6dyxvZmZzZXQ6ZSxteTpiLm15LGF0OmIuYXR9KX0pO2MuZm4uYmdpZnJhbWUmJmYuYmdpZnJhbWUoKTtmLm9mZnNldChjLmV4dGVuZChpLHt1c2luZzpiLnVzaW5nfSkpfSl9O2MudWkucG9zaXRpb249e2ZpdDp7bGVmdDpmdW5jdGlvbihiLGEpe3ZhciBkPWMod2luZG93KTtkPWEuY29sbGlzaW9uUG9zaXRpb24ubGVmdCthLmNvbGxpc2lvbldpZHRoLWQud2lkdGgoKS1kLnNjcm9sbExlZnQoKTsKYi5sZWZ0PWQ+MD9iLmxlZnQtZDpNYXRoLm1heChiLmxlZnQtYS5jb2xsaXNpb25Qb3NpdGlvbi5sZWZ0LGIubGVmdCl9LHRvcDpmdW5jdGlvbihiLGEpe3ZhciBkPWMod2luZG93KTtkPWEuY29sbGlzaW9uUG9zaXRpb24udG9wK2EuY29sbGlzaW9uSGVpZ2h0LWQuaGVpZ2h0KCktZC5zY3JvbGxUb3AoKTtiLnRvcD1kPjA/Yi50b3AtZDpNYXRoLm1heChiLnRvcC1hLmNvbGxpc2lvblBvc2l0aW9uLnRvcCxiLnRvcCl9fSxmbGlwOntsZWZ0OmZ1bmN0aW9uKGIsYSl7aWYoYS5hdFswXSE9PSJjZW50ZXIiKXt2YXIgZD1jKHdpbmRvdyk7ZD1hLmNvbGxpc2lvblBvc2l0aW9uLmxlZnQrYS5jb2xsaXNpb25XaWR0aC1kLndpZHRoKCktZC5zY3JvbGxMZWZ0KCk7dmFyIGc9YS5teVswXT09PSJsZWZ0Ij8tYS5lbGVtV2lkdGg6YS5teVswXT09PSJyaWdodCI/YS5lbGVtV2lkdGg6MCxlPWEuYXRbMF09PT0ibGVmdCI/YS50YXJnZXRXaWR0aDotYS50YXJnZXRXaWR0aCxoPS0yKmEub2Zmc2V0WzBdOwpiLmxlZnQrPWEuY29sbGlzaW9uUG9zaXRpb24ubGVmdDwwP2crZStoOmQ+MD9nK2UraDowfX0sdG9wOmZ1bmN0aW9uKGIsYSl7aWYoYS5hdFsxXSE9PSJjZW50ZXIiKXt2YXIgZD1jKHdpbmRvdyk7ZD1hLmNvbGxpc2lvblBvc2l0aW9uLnRvcCthLmNvbGxpc2lvbkhlaWdodC1kLmhlaWdodCgpLWQuc2Nyb2xsVG9wKCk7dmFyIGc9YS5teVsxXT09PSJ0b3AiPy1hLmVsZW1IZWlnaHQ6YS5teVsxXT09PSJib3R0b20iP2EuZWxlbUhlaWdodDowLGU9YS5hdFsxXT09PSJ0b3AiP2EudGFyZ2V0SGVpZ2h0Oi1hLnRhcmdldEhlaWdodCxoPS0yKmEub2Zmc2V0WzFdO2IudG9wKz1hLmNvbGxpc2lvblBvc2l0aW9uLnRvcDwwP2crZStoOmQ+MD9nK2UraDowfX19fTtpZighYy5vZmZzZXQuc2V0T2Zmc2V0KXtjLm9mZnNldC5zZXRPZmZzZXQ9ZnVuY3Rpb24oYixhKXtpZigvc3RhdGljLy50ZXN0KGMuY3VyQ1NTKGIsInBvc2l0aW9uIikpKWIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIjt2YXIgZD0KYyhiKSxnPWQub2Zmc2V0KCksZT1wYXJzZUludChjLmN1ckNTUyhiLCJ0b3AiLHRydWUpLDEwKXx8MCxoPXBhcnNlSW50KGMuY3VyQ1NTKGIsImxlZnQiLHRydWUpLDEwKXx8MDtnPXt0b3A6YS50b3AtZy50b3ArZSxsZWZ0OmEubGVmdC1nLmxlZnQraH07InVzaW5nImluIGE/YS51c2luZy5jYWxsKGIsZyk6ZC5jc3MoZyl9O2MuZm4ub2Zmc2V0PWZ1bmN0aW9uKGIpe3ZhciBhPXRoaXNbMF07aWYoIWF8fCFhLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsYil9KTtyZXR1cm4gdS5jYWxsKHRoaXMpfX19KShqUXVlcnkpOwo7LyoKICogalF1ZXJ5IFVJIERyYWdnYWJsZSAxLjguNQogKgogKiBDb3B5cmlnaHQgMjAxMCwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRHJhZ2dhYmxlcwogKgogKiBEZXBlbmRzOgogKglqcXVlcnkudWkuY29yZS5qcwogKglqcXVlcnkudWkubW91c2UuanMKICoJanF1ZXJ5LnVpLndpZGdldC5qcwogKi8KKGZ1bmN0aW9uKGQpe2Qud2lkZ2V0KCJ1aS5kcmFnZ2FibGUiLGQudWkubW91c2Use3dpZGdldEV2ZW50UHJlZml4OiJkcmFnIixvcHRpb25zOnthZGRDbGFzc2VzOnRydWUsYXBwZW5kVG86InBhcmVudCIsYXhpczpmYWxzZSxjb25uZWN0VG9Tb3J0YWJsZTpmYWxzZSxjb250YWlubWVudDpmYWxzZSxjdXJzb3I6ImF1dG8iLGN1cnNvckF0OmZhbHNlLGdyaWQ6ZmFsc2UsaGFuZGxlOmZhbHNlLGhlbHBlcjoib3JpZ2luYWwiLGlmcmFtZUZpeDpmYWxzZSxvcGFjaXR5OmZhbHNlLHJlZnJlc2hQb3NpdGlvbnM6ZmFsc2UscmV2ZXJ0OmZhbHNlLHJldmVydER1cmF0aW9uOjUwMCxzY29wZToiZGVmYXVsdCIsc2Nyb2xsOnRydWUsc2Nyb2xsU2Vuc2l0aXZpdHk6MjAsc2Nyb2xsU3BlZWQ6MjAsc25hcDpmYWxzZSxzbmFwTW9kZToiYm90aCIsc25hcFRvbGVyYW5jZToyMCxzdGFjazpmYWxzZSx6SW5kZXg6ZmFsc2V9LF9jcmVhdGU6ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMuaGVscGVyPT0KIm9yaWdpbmFsIiYmIS9eKD86cnxhfGYpLy50ZXN0KHRoaXMuZWxlbWVudC5jc3MoInBvc2l0aW9uIikpKXRoaXMuZWxlbWVudFswXS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiO3RoaXMub3B0aW9ucy5hZGRDbGFzc2VzJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZSIpO3RoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUtZGlzYWJsZWQiKTt0aGlzLl9tb3VzZUluaXQoKX0sZGVzdHJveTpmdW5jdGlvbigpe2lmKHRoaXMuZWxlbWVudC5kYXRhKCJkcmFnZ2FibGUiKSl7dGhpcy5lbGVtZW50LnJlbW92ZURhdGEoImRyYWdnYWJsZSIpLnVuYmluZCgiLmRyYWdnYWJsZSIpLnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUgdWktZHJhZ2dhYmxlLWRyYWdnaW5nIHVpLWRyYWdnYWJsZS1kaXNhYmxlZCIpO3RoaXMuX21vdXNlRGVzdHJveSgpO3JldHVybiB0aGlzfX0sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5vcHRpb25zO2lmKHRoaXMuaGVscGVyfHxiLmRpc2FibGVkfHxkKGEudGFyZ2V0KS5pcygiLnVpLXJlc2l6YWJsZS1oYW5kbGUiKSlyZXR1cm4gZmFsc2U7dGhpcy5oYW5kbGU9dGhpcy5fZ2V0SGFuZGxlKGEpO2lmKCF0aGlzLmhhbmRsZSlyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9uczt0aGlzLmhlbHBlcj10aGlzLl9jcmVhdGVIZWxwZXIoYSk7dGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpO2lmKGQudWkuZGRtYW5hZ2VyKWQudWkuZGRtYW5hZ2VyLmN1cnJlbnQ9dGhpczt0aGlzLl9jYWNoZU1hcmdpbnMoKTt0aGlzLmNzc1Bvc2l0aW9uPXRoaXMuaGVscGVyLmNzcygicG9zaXRpb24iKTt0aGlzLnNjcm9sbFBhcmVudD10aGlzLmhlbHBlci5zY3JvbGxQYXJlbnQoKTt0aGlzLm9mZnNldD10aGlzLnBvc2l0aW9uQWJzPXRoaXMuZWxlbWVudC5vZmZzZXQoKTt0aGlzLm9mZnNldD17dG9wOnRoaXMub2Zmc2V0LnRvcC0KdGhpcy5tYXJnaW5zLnRvcCxsZWZ0OnRoaXMub2Zmc2V0LmxlZnQtdGhpcy5tYXJnaW5zLmxlZnR9O2QuZXh0ZW5kKHRoaXMub2Zmc2V0LHtjbGljazp7bGVmdDphLnBhZ2VYLXRoaXMub2Zmc2V0LmxlZnQsdG9wOmEucGFnZVktdGhpcy5vZmZzZXQudG9wfSxwYXJlbnQ6dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkscmVsYXRpdmU6dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKX0pO3RoaXMub3JpZ2luYWxQb3NpdGlvbj10aGlzLnBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24oYSk7dGhpcy5vcmlnaW5hbFBhZ2VYPWEucGFnZVg7dGhpcy5vcmlnaW5hbFBhZ2VZPWEucGFnZVk7Yi5jdXJzb3JBdCYmdGhpcy5fYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcihiLmN1cnNvckF0KTtiLmNvbnRhaW5tZW50JiZ0aGlzLl9zZXRDb250YWlubWVudCgpO2lmKHRoaXMuX3RyaWdnZXIoInN0YXJ0IixhKT09PWZhbHNlKXt0aGlzLl9jbGVhcigpO3JldHVybiBmYWxzZX10aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCk7CmQudWkuZGRtYW5hZ2VyJiYhYi5kcm9wQmVoYXZpb3VyJiZkLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0aGlzLGEpO3RoaXMuaGVscGVyLmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKTt0aGlzLl9tb3VzZURyYWcoYSx0cnVlKTtyZXR1cm4gdHJ1ZX0sX21vdXNlRHJhZzpmdW5jdGlvbihhLGIpe3RoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihhKTt0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpO2lmKCFiKXtiPXRoaXMuX3VpSGFzaCgpO2lmKHRoaXMuX3RyaWdnZXIoImRyYWciLGEsYik9PT1mYWxzZSl7dGhpcy5fbW91c2VVcCh7fSk7cmV0dXJuIGZhbHNlfXRoaXMucG9zaXRpb249Yi5wb3NpdGlvbn1pZighdGhpcy5vcHRpb25zLmF4aXN8fHRoaXMub3B0aW9ucy5heGlzIT0ieSIpdGhpcy5oZWxwZXJbMF0uc3R5bGUubGVmdD10aGlzLnBvc2l0aW9uLmxlZnQrInB4IjtpZighdGhpcy5vcHRpb25zLmF4aXN8fAp0aGlzLm9wdGlvbnMuYXhpcyE9IngiKXRoaXMuaGVscGVyWzBdLnN0eWxlLnRvcD10aGlzLnBvc2l0aW9uLnRvcCsicHgiO2QudWkuZGRtYW5hZ2VyJiZkLnVpLmRkbWFuYWdlci5kcmFnKHRoaXMsYSk7cmV0dXJuIGZhbHNlfSxfbW91c2VTdG9wOmZ1bmN0aW9uKGEpe3ZhciBiPWZhbHNlO2lmKGQudWkuZGRtYW5hZ2VyJiYhdGhpcy5vcHRpb25zLmRyb3BCZWhhdmlvdXIpYj1kLnVpLmRkbWFuYWdlci5kcm9wKHRoaXMsYSk7aWYodGhpcy5kcm9wcGVkKXtiPXRoaXMuZHJvcHBlZDt0aGlzLmRyb3BwZWQ9ZmFsc2V9aWYoIXRoaXMuZWxlbWVudFswXXx8IXRoaXMuZWxlbWVudFswXS5wYXJlbnROb2RlKXJldHVybiBmYWxzZTtpZih0aGlzLm9wdGlvbnMucmV2ZXJ0PT0iaW52YWxpZCImJiFifHx0aGlzLm9wdGlvbnMucmV2ZXJ0PT0idmFsaWQiJiZifHx0aGlzLm9wdGlvbnMucmV2ZXJ0PT09dHJ1ZXx8ZC5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5yZXZlcnQpJiZ0aGlzLm9wdGlvbnMucmV2ZXJ0LmNhbGwodGhpcy5lbGVtZW50LApiKSl7dmFyIGM9dGhpcztkKHRoaXMuaGVscGVyKS5hbmltYXRlKHRoaXMub3JpZ2luYWxQb3NpdGlvbixwYXJzZUludCh0aGlzLm9wdGlvbnMucmV2ZXJ0RHVyYXRpb24sMTApLGZ1bmN0aW9uKCl7Yy5fdHJpZ2dlcigic3RvcCIsYSkhPT1mYWxzZSYmYy5fY2xlYXIoKX0pfWVsc2UgdGhpcy5fdHJpZ2dlcigic3RvcCIsYSkhPT1mYWxzZSYmdGhpcy5fY2xlYXIoKTtyZXR1cm4gZmFsc2V9LGNhbmNlbDpmdW5jdGlvbigpe3RoaXMuaGVscGVyLmlzKCIudWktZHJhZ2dhYmxlLWRyYWdnaW5nIik/dGhpcy5fbW91c2VVcCh7fSk6dGhpcy5fY2xlYXIoKTtyZXR1cm4gdGhpc30sX2dldEhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYj0hdGhpcy5vcHRpb25zLmhhbmRsZXx8IWQodGhpcy5vcHRpb25zLmhhbmRsZSx0aGlzLmVsZW1lbnQpLmxlbmd0aD90cnVlOmZhbHNlO2QodGhpcy5vcHRpb25zLmhhbmRsZSx0aGlzLmVsZW1lbnQpLmZpbmQoIioiKS5hbmRTZWxmKCkuZWFjaChmdW5jdGlvbigpe2lmKHRoaXM9PQphLnRhcmdldCliPXRydWV9KTtyZXR1cm4gYn0sX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnM7YT1kLmlzRnVuY3Rpb24oYi5oZWxwZXIpP2QoYi5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLFthXSkpOmIuaGVscGVyPT0iY2xvbmUiP3RoaXMuZWxlbWVudC5jbG9uZSgpOnRoaXMuZWxlbWVudDthLnBhcmVudHMoImJvZHkiKS5sZW5ndGh8fGEuYXBwZW5kVG8oYi5hcHBlbmRUbz09InBhcmVudCI/dGhpcy5lbGVtZW50WzBdLnBhcmVudE5vZGU6Yi5hcHBlbmRUbyk7YVswXSE9dGhpcy5lbGVtZW50WzBdJiYhLyhmaXhlZHxhYnNvbHV0ZSkvLnRlc3QoYS5jc3MoInBvc2l0aW9uIikpJiZhLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpO3JldHVybiBhfSxfYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcjpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09InN0cmluZyIpYT1hLnNwbGl0KCIgIik7aWYoZC5pc0FycmF5KGEpKWE9e2xlZnQ6K2FbMF0sdG9wOithWzFdfHwKMH07aWYoImxlZnQiaW4gYSl0aGlzLm9mZnNldC5jbGljay5sZWZ0PWEubGVmdCt0aGlzLm1hcmdpbnMubGVmdDtpZigicmlnaHQiaW4gYSl0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtYS5yaWdodCt0aGlzLm1hcmdpbnMubGVmdDtpZigidG9wImluIGEpdGhpcy5vZmZzZXQuY2xpY2sudG9wPWEudG9wK3RoaXMubWFyZ2lucy50b3A7aWYoImJvdHRvbSJpbiBhKXRoaXMub2Zmc2V0LmNsaWNrLnRvcD10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC1hLmJvdHRvbSt0aGlzLm1hcmdpbnMudG9wfSxfZ2V0UGFyZW50T2Zmc2V0OmZ1bmN0aW9uKCl7dGhpcy5vZmZzZXRQYXJlbnQ9dGhpcy5oZWxwZXIub2Zmc2V0UGFyZW50KCk7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnQub2Zmc2V0KCk7aWYodGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmdGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZkLnVpLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLAp0aGlzLm9mZnNldFBhcmVudFswXSkpe2EubGVmdCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpO2EudG9wKz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKX1pZih0aGlzLm9mZnNldFBhcmVudFswXT09ZG9jdW1lbnQuYm9keXx8dGhpcy5vZmZzZXRQYXJlbnRbMF0udGFnTmFtZSYmdGhpcy5vZmZzZXRQYXJlbnRbMF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpPT0iaHRtbCImJmQuYnJvd3Nlci5tc2llKWE9e3RvcDowLGxlZnQ6MH07cmV0dXJue3RvcDphLnRvcCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCksbGVmdDphLmxlZnQrKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKX19LF9nZXRSZWxhdGl2ZU9mZnNldDpmdW5jdGlvbigpe2lmKHRoaXMuY3NzUG9zaXRpb249PSJyZWxhdGl2ZSIpe3ZhciBhPXRoaXMuZWxlbWVudC5wb3NpdGlvbigpO3JldHVybnt0b3A6YS50b3AtCihwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoInRvcCIpLDEwKXx8MCkrdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCksbGVmdDphLmxlZnQtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygibGVmdCIpLDEwKXx8MCkrdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpfX1lbHNlIHJldHVybnt0b3A6MCxsZWZ0OjB9fSxfY2FjaGVNYXJnaW5zOmZ1bmN0aW9uKCl7dGhpcy5tYXJnaW5zPXtsZWZ0OnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpbkxlZnQiKSwxMCl8fDAsdG9wOnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpblRvcCIpLDEwKXx8MH19LF9jYWNoZUhlbHBlclByb3BvcnRpb25zOmZ1bmN0aW9uKCl7dGhpcy5oZWxwZXJQcm9wb3J0aW9ucz17d2lkdGg6dGhpcy5oZWxwZXIub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmhlbHBlci5vdXRlckhlaWdodCgpfX0sX3NldENvbnRhaW5tZW50OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zO2lmKGEuY29udGFpbm1lbnQ9PQoicGFyZW50IilhLmNvbnRhaW5tZW50PXRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGU7aWYoYS5jb250YWlubWVudD09ImRvY3VtZW50Inx8YS5jb250YWlubWVudD09IndpbmRvdyIpdGhpcy5jb250YWlubWVudD1bMC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0LDAtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AsZChhLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykud2lkdGgoKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LChkKGEuY29udGFpbm1lbnQ9PSJkb2N1bWVudCI/ZG9jdW1lbnQ6d2luZG93KS5oZWlnaHQoKXx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF07aWYoIS9eKGRvY3VtZW50fHdpbmRvd3xwYXJlbnQpJC8udGVzdChhLmNvbnRhaW5tZW50KSYmCmEuY29udGFpbm1lbnQuY29uc3RydWN0b3IhPUFycmF5KXt2YXIgYj1kKGEuY29udGFpbm1lbnQpWzBdO2lmKGIpe2E9ZChhLmNvbnRhaW5tZW50KS5vZmZzZXQoKTt2YXIgYz1kKGIpLmNzcygib3ZlcmZsb3ciKSE9ImhpZGRlbiI7dGhpcy5jb250YWlubWVudD1bYS5sZWZ0KyhwYXJzZUludChkKGIpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoZChiKS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKS10aGlzLm1hcmdpbnMubGVmdCxhLnRvcCsocGFyc2VJbnQoZChiKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoZChiKS5jc3MoInBhZGRpbmdUb3AiKSwxMCl8fDApLXRoaXMubWFyZ2lucy50b3AsYS5sZWZ0KyhjP01hdGgubWF4KGIuc2Nyb2xsV2lkdGgsYi5vZmZzZXRXaWR0aCk6Yi5vZmZzZXRXaWR0aCktKHBhcnNlSW50KGQoYikuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApLShwYXJzZUludChkKGIpLmNzcygicGFkZGluZ1JpZ2h0IiksCjEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCxhLnRvcCsoYz9NYXRoLm1heChiLnNjcm9sbEhlaWdodCxiLm9mZnNldEhlaWdodCk6Yi5vZmZzZXRIZWlnaHQpLShwYXJzZUludChkKGIpLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLShwYXJzZUludChkKGIpLmNzcygicGFkZGluZ0JvdHRvbSIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF19fWVsc2UgaWYoYS5jb250YWlubWVudC5jb25zdHJ1Y3Rvcj09QXJyYXkpdGhpcy5jb250YWlubWVudD1hLmNvbnRhaW5tZW50fSxfY29udmVydFBvc2l0aW9uVG86ZnVuY3Rpb24oYSxiKXtpZighYiliPXRoaXMucG9zaXRpb247YT1hPT0iYWJzb2x1dGUiPzE6LTE7dmFyIGM9dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmISh0aGlzLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJmQudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sCnRoaXMub2Zmc2V0UGFyZW50WzBdKSk/dGhpcy5vZmZzZXRQYXJlbnQ6dGhpcy5zY3JvbGxQYXJlbnQsZj0vKGh0bWx8Ym9keSkvaS50ZXN0KGNbMF0udGFnTmFtZSk7cmV0dXJue3RvcDpiLnRvcCt0aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AqYSt0aGlzLm9mZnNldC5wYXJlbnQudG9wKmEtKGQuYnJvd3Nlci5zYWZhcmkmJmQuYnJvd3Nlci52ZXJzaW9uPDUyNiYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOih0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTpmPzA6Yy5zY3JvbGxUb3AoKSkqYSksbGVmdDpiLmxlZnQrdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdCphK3RoaXMub2Zmc2V0LnBhcmVudC5sZWZ0KmEtKGQuYnJvd3Nlci5zYWZhcmkmJmQuYnJvd3Nlci52ZXJzaW9uPDUyNiYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOih0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6CmY/MDpjLnNjcm9sbExlZnQoKSkqYSl9fSxfZ2VuZXJhdGVQb3NpdGlvbjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMsYz10aGlzLmNzc1Bvc2l0aW9uPT0iYWJzb2x1dGUiJiYhKHRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmZC51aS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSkpP3RoaXMub2Zmc2V0UGFyZW50OnRoaXMuc2Nyb2xsUGFyZW50LGY9LyhodG1sfGJvZHkpL2kudGVzdChjWzBdLnRhZ05hbWUpLGU9YS5wYWdlWCxnPWEucGFnZVk7aWYodGhpcy5vcmlnaW5hbFBvc2l0aW9uKXtpZih0aGlzLmNvbnRhaW5tZW50KXtpZihhLnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8dGhpcy5jb250YWlubWVudFswXSllPXRoaXMuY29udGFpbm1lbnRbMF0rdGhpcy5vZmZzZXQuY2xpY2subGVmdDtpZihhLnBhZ2VZLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDx0aGlzLmNvbnRhaW5tZW50WzFdKWc9dGhpcy5jb250YWlubWVudFsxXSsKdGhpcy5vZmZzZXQuY2xpY2sudG9wO2lmKGEucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdD50aGlzLmNvbnRhaW5tZW50WzJdKWU9dGhpcy5jb250YWlubWVudFsyXSt0aGlzLm9mZnNldC5jbGljay5sZWZ0O2lmKGEucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPnRoaXMuY29udGFpbm1lbnRbM10pZz10aGlzLmNvbnRhaW5tZW50WzNdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcH1pZihiLmdyaWQpe2c9dGhpcy5vcmlnaW5hbFBhZ2VZK01hdGgucm91bmQoKGctdGhpcy5vcmlnaW5hbFBhZ2VZKS9iLmdyaWRbMV0pKmIuZ3JpZFsxXTtnPXRoaXMuY29udGFpbm1lbnQ/IShnLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDx0aGlzLmNvbnRhaW5tZW50WzFdfHxnLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD50aGlzLmNvbnRhaW5tZW50WzNdKT9nOiEoZy10aGlzLm9mZnNldC5jbGljay50b3A8dGhpcy5jb250YWlubWVudFsxXSk/Zy1iLmdyaWRbMV06ZytiLmdyaWRbMV06ZztlPXRoaXMub3JpZ2luYWxQYWdlWCsKTWF0aC5yb3VuZCgoZS10aGlzLm9yaWdpbmFsUGFnZVgpL2IuZ3JpZFswXSkqYi5ncmlkWzBdO2U9dGhpcy5jb250YWlubWVudD8hKGUtdGhpcy5vZmZzZXQuY2xpY2subGVmdDx0aGlzLmNvbnRhaW5tZW50WzBdfHxlLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+dGhpcy5jb250YWlubWVudFsyXSk/ZTohKGUtdGhpcy5vZmZzZXQuY2xpY2subGVmdDx0aGlzLmNvbnRhaW5tZW50WzBdKT9lLWIuZ3JpZFswXTplK2IuZ3JpZFswXTplfX1yZXR1cm57dG9wOmctdGhpcy5vZmZzZXQuY2xpY2sudG9wLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wKyhkLmJyb3dzZXIuc2FmYXJpJiZkLmJyb3dzZXIudmVyc2lvbjw1MjYmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDp0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTpmPzA6Yy5zY3JvbGxUb3AoKSksbGVmdDplLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQtCnRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQrKGQuYnJvd3Nlci5zYWZhcmkmJmQuYnJvd3Nlci52ZXJzaW9uPDUyNiYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTpmPzA6Yy5zY3JvbGxMZWZ0KCkpfX0sX2NsZWFyOmZ1bmN0aW9uKCl7dGhpcy5oZWxwZXIucmVtb3ZlQ2xhc3MoInVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpO3RoaXMuaGVscGVyWzBdIT10aGlzLmVsZW1lbnRbMF0mJiF0aGlzLmNhbmNlbEhlbHBlclJlbW92YWwmJnRoaXMuaGVscGVyLnJlbW92ZSgpO3RoaXMuaGVscGVyPW51bGw7dGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsPWZhbHNlfSxfdHJpZ2dlcjpmdW5jdGlvbihhLGIsYyl7Yz1jfHx0aGlzLl91aUhhc2goKTtkLnVpLnBsdWdpbi5jYWxsKHRoaXMsYSxbYixjXSk7aWYoYT09ImRyYWciKXRoaXMucG9zaXRpb25BYnM9CnRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpO3JldHVybiBkLldpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIuY2FsbCh0aGlzLGEsYixjKX0scGx1Z2luczp7fSxfdWlIYXNoOmZ1bmN0aW9uKCl7cmV0dXJue2hlbHBlcjp0aGlzLmhlbHBlcixwb3NpdGlvbjp0aGlzLnBvc2l0aW9uLG9yaWdpbmFsUG9zaXRpb246dGhpcy5vcmlnaW5hbFBvc2l0aW9uLG9mZnNldDp0aGlzLnBvc2l0aW9uQWJzfX19KTtkLmV4dGVuZChkLnVpLmRyYWdnYWJsZSx7dmVyc2lvbjoiMS44LjUifSk7ZC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJjb25uZWN0VG9Tb3J0YWJsZSIse3N0YXJ0OmZ1bmN0aW9uKGEsYil7dmFyIGM9ZCh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxmPWMub3B0aW9ucyxlPWQuZXh0ZW5kKHt9LGIse2l0ZW06Yy5lbGVtZW50fSk7Yy5zb3J0YWJsZXM9W107ZChmLmNvbm5lY3RUb1NvcnRhYmxlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGc9ZC5kYXRhKHRoaXMsInNvcnRhYmxlIik7CmlmKGcmJiFnLm9wdGlvbnMuZGlzYWJsZWQpe2Muc29ydGFibGVzLnB1c2goe2luc3RhbmNlOmcsc2hvdWxkUmV2ZXJ0Omcub3B0aW9ucy5yZXZlcnR9KTtnLl9yZWZyZXNoSXRlbXMoKTtnLl90cmlnZ2VyKCJhY3RpdmF0ZSIsYSxlKX19KX0sc3RvcDpmdW5jdGlvbihhLGIpe3ZhciBjPWQodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZj1kLmV4dGVuZCh7fSxiLHtpdGVtOmMuZWxlbWVudH0pO2QuZWFjaChjLnNvcnRhYmxlcyxmdW5jdGlvbigpe2lmKHRoaXMuaW5zdGFuY2UuaXNPdmVyKXt0aGlzLmluc3RhbmNlLmlzT3Zlcj0wO2MuY2FuY2VsSGVscGVyUmVtb3ZhbD10cnVlO3RoaXMuaW5zdGFuY2UuY2FuY2VsSGVscGVyUmVtb3ZhbD1mYWxzZTtpZih0aGlzLnNob3VsZFJldmVydCl0aGlzLmluc3RhbmNlLm9wdGlvbnMucmV2ZXJ0PXRydWU7dGhpcy5pbnN0YW5jZS5fbW91c2VTdG9wKGEpO3RoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI9dGhpcy5pbnN0YW5jZS5vcHRpb25zLl9oZWxwZXI7CmMub3B0aW9ucy5oZWxwZXI9PSJvcmlnaW5hbCImJnRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW0uY3NzKHt0b3A6ImF1dG8iLGxlZnQ6ImF1dG8ifSl9ZWxzZXt0aGlzLmluc3RhbmNlLmNhbmNlbEhlbHBlclJlbW92YWw9ZmFsc2U7dGhpcy5pbnN0YW5jZS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsYSxmKX19KX0sZHJhZzpmdW5jdGlvbihhLGIpe3ZhciBjPWQodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZj10aGlzO2QuZWFjaChjLnNvcnRhYmxlcyxmdW5jdGlvbigpe3RoaXMuaW5zdGFuY2UucG9zaXRpb25BYnM9Yy5wb3NpdGlvbkFiczt0aGlzLmluc3RhbmNlLmhlbHBlclByb3BvcnRpb25zPWMuaGVscGVyUHJvcG9ydGlvbnM7dGhpcy5pbnN0YW5jZS5vZmZzZXQuY2xpY2s9Yy5vZmZzZXQuY2xpY2s7aWYodGhpcy5pbnN0YW5jZS5faW50ZXJzZWN0c1dpdGgodGhpcy5pbnN0YW5jZS5jb250YWluZXJDYWNoZSkpe2lmKCF0aGlzLmluc3RhbmNlLmlzT3Zlcil7dGhpcy5pbnN0YW5jZS5pc092ZXI9CjE7dGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbT1kKGYpLmNsb25lKCkuYXBwZW5kVG8odGhpcy5pbnN0YW5jZS5lbGVtZW50KS5kYXRhKCJzb3J0YWJsZS1pdGVtIix0cnVlKTt0aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlcj10aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyO3RoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI9ZnVuY3Rpb24oKXtyZXR1cm4gYi5oZWxwZXJbMF19O2EudGFyZ2V0PXRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW1bMF07dGhpcy5pbnN0YW5jZS5fbW91c2VDYXB0dXJlKGEsdHJ1ZSk7dGhpcy5pbnN0YW5jZS5fbW91c2VTdGFydChhLHRydWUsdHJ1ZSk7dGhpcy5pbnN0YW5jZS5vZmZzZXQuY2xpY2sudG9wPWMub2Zmc2V0LmNsaWNrLnRvcDt0aGlzLmluc3RhbmNlLm9mZnNldC5jbGljay5sZWZ0PWMub2Zmc2V0LmNsaWNrLmxlZnQ7dGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LmxlZnQtPWMub2Zmc2V0LnBhcmVudC5sZWZ0LXRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC5sZWZ0Owp0aGlzLmluc3RhbmNlLm9mZnNldC5wYXJlbnQudG9wLT1jLm9mZnNldC5wYXJlbnQudG9wLXRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC50b3A7Yy5fdHJpZ2dlcigidG9Tb3J0YWJsZSIsYSk7Yy5kcm9wcGVkPXRoaXMuaW5zdGFuY2UuZWxlbWVudDtjLmN1cnJlbnRJdGVtPWMuZWxlbWVudDt0aGlzLmluc3RhbmNlLmZyb21PdXRzaWRlPWN9dGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbSYmdGhpcy5pbnN0YW5jZS5fbW91c2VEcmFnKGEpfWVsc2UgaWYodGhpcy5pbnN0YW5jZS5pc092ZXIpe3RoaXMuaW5zdGFuY2UuaXNPdmVyPTA7dGhpcy5pbnN0YW5jZS5jYW5jZWxIZWxwZXJSZW1vdmFsPXRydWU7dGhpcy5pbnN0YW5jZS5vcHRpb25zLnJldmVydD1mYWxzZTt0aGlzLmluc3RhbmNlLl90cmlnZ2VyKCJvdXQiLGEsdGhpcy5pbnN0YW5jZS5fdWlIYXNoKHRoaXMuaW5zdGFuY2UpKTt0aGlzLmluc3RhbmNlLl9tb3VzZVN0b3AoYSx0cnVlKTt0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyPQp0aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlcjt0aGlzLmluc3RhbmNlLmN1cnJlbnRJdGVtLnJlbW92ZSgpO3RoaXMuaW5zdGFuY2UucGxhY2Vob2xkZXImJnRoaXMuaW5zdGFuY2UucGxhY2Vob2xkZXIucmVtb3ZlKCk7Yy5fdHJpZ2dlcigiZnJvbVNvcnRhYmxlIixhKTtjLmRyb3BwZWQ9ZmFsc2V9fSl9fSk7ZC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJjdXJzb3IiLHtzdGFydDpmdW5jdGlvbigpe3ZhciBhPWQoImJvZHkiKSxiPWQodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9ucztpZihhLmNzcygiY3Vyc29yIikpYi5fY3Vyc29yPWEuY3NzKCJjdXJzb3IiKTthLmNzcygiY3Vyc29yIixiLmN1cnNvcil9LHN0b3A6ZnVuY3Rpb24oKXt2YXIgYT1kKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7YS5fY3Vyc29yJiZkKCJib2R5IikuY3NzKCJjdXJzb3IiLGEuX2N1cnNvcil9fSk7ZC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJpZnJhbWVGaXgiLHtzdGFydDpmdW5jdGlvbigpe3ZhciBhPQpkKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZChhLmlmcmFtZUZpeD09PXRydWU/ImlmcmFtZSI6YS5pZnJhbWVGaXgpLmVhY2goZnVuY3Rpb24oKXtkKCc8ZGl2IGNsYXNzPSJ1aS1kcmFnZ2FibGUtaWZyYW1lRml4IiBzdHlsZT0iYmFja2dyb3VuZDogI2ZmZjsiPjwvZGl2PicpLmNzcyh7d2lkdGg6dGhpcy5vZmZzZXRXaWR0aCsicHgiLGhlaWdodDp0aGlzLm9mZnNldEhlaWdodCsicHgiLHBvc2l0aW9uOiJhYnNvbHV0ZSIsb3BhY2l0eToiMC4wMDEiLHpJbmRleDoxRTN9KS5jc3MoZCh0aGlzKS5vZmZzZXQoKSkuYXBwZW5kVG8oImJvZHkiKX0pfSxzdG9wOmZ1bmN0aW9uKCl7ZCgiZGl2LnVpLWRyYWdnYWJsZS1pZnJhbWVGaXgiKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpfSl9fSk7ZC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJvcGFjaXR5Iix7c3RhcnQ6ZnVuY3Rpb24oYSxiKXthPWQoYi5oZWxwZXIpO2I9ZCh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zOwppZihhLmNzcygib3BhY2l0eSIpKWIuX29wYWNpdHk9YS5jc3MoIm9wYWNpdHkiKTthLmNzcygib3BhY2l0eSIsYi5vcGFjaXR5KX0sc3RvcDpmdW5jdGlvbihhLGIpe2E9ZCh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zO2EuX29wYWNpdHkmJmQoYi5oZWxwZXIpLmNzcygib3BhY2l0eSIsYS5fb3BhY2l0eSl9fSk7ZC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJzY3JvbGwiLHtzdGFydDpmdW5jdGlvbigpe3ZhciBhPWQodGhpcykuZGF0YSgiZHJhZ2dhYmxlIik7aWYoYS5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZhLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0iSFRNTCIpYS5vdmVyZmxvd09mZnNldD1hLnNjcm9sbFBhcmVudC5vZmZzZXQoKX0sZHJhZzpmdW5jdGlvbihhKXt2YXIgYj1kKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGM9Yi5vcHRpb25zLGY9ZmFsc2U7aWYoYi5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZiLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0KIkhUTUwiKXtpZighYy5heGlzfHxjLmF4aXMhPSJ4IilpZihiLm92ZXJmbG93T2Zmc2V0LnRvcCtiLnNjcm9sbFBhcmVudFswXS5vZmZzZXRIZWlnaHQtYS5wYWdlWTxjLnNjcm9sbFNlbnNpdGl2aXR5KWIuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1mPWIuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCtjLnNjcm9sbFNwZWVkO2Vsc2UgaWYoYS5wYWdlWS1iLm92ZXJmbG93T2Zmc2V0LnRvcDxjLnNjcm9sbFNlbnNpdGl2aXR5KWIuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1mPWIuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcC1jLnNjcm9sbFNwZWVkO2lmKCFjLmF4aXN8fGMuYXhpcyE9InkiKWlmKGIub3ZlcmZsb3dPZmZzZXQubGVmdCtiLnNjcm9sbFBhcmVudFswXS5vZmZzZXRXaWR0aC1hLnBhZ2VYPGMuc2Nyb2xsU2Vuc2l0aXZpdHkpYi5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1mPWIuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQrYy5zY3JvbGxTcGVlZDtlbHNlIGlmKGEucGFnZVgtCmIub3ZlcmZsb3dPZmZzZXQubGVmdDxjLnNjcm9sbFNlbnNpdGl2aXR5KWIuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9Zj1iLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0LWMuc2Nyb2xsU3BlZWR9ZWxzZXtpZighYy5heGlzfHxjLmF4aXMhPSJ4IilpZihhLnBhZ2VZLWQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpPGMuc2Nyb2xsU2Vuc2l0aXZpdHkpZj1kKGRvY3VtZW50KS5zY3JvbGxUb3AoZChkb2N1bWVudCkuc2Nyb2xsVG9wKCktYy5zY3JvbGxTcGVlZCk7ZWxzZSBpZihkKHdpbmRvdykuaGVpZ2h0KCktKGEucGFnZVktZChkb2N1bWVudCkuc2Nyb2xsVG9wKCkpPGMuc2Nyb2xsU2Vuc2l0aXZpdHkpZj1kKGRvY3VtZW50KS5zY3JvbGxUb3AoZChkb2N1bWVudCkuc2Nyb2xsVG9wKCkrYy5zY3JvbGxTcGVlZCk7aWYoIWMuYXhpc3x8Yy5heGlzIT0ieSIpaWYoYS5wYWdlWC1kKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCk8Yy5zY3JvbGxTZW5zaXRpdml0eSlmPWQoZG9jdW1lbnQpLnNjcm9sbExlZnQoZChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpLQpjLnNjcm9sbFNwZWVkKTtlbHNlIGlmKGQod2luZG93KS53aWR0aCgpLShhLnBhZ2VYLWQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSk8Yy5zY3JvbGxTZW5zaXRpdml0eSlmPWQoZG9jdW1lbnQpLnNjcm9sbExlZnQoZChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpK2Muc2Nyb2xsU3BlZWQpfWYhPT1mYWxzZSYmZC51aS5kZG1hbmFnZXImJiFjLmRyb3BCZWhhdmlvdXImJmQudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKGIsYSl9fSk7ZC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJzbmFwIix7c3RhcnQ6ZnVuY3Rpb24oKXt2YXIgYT1kKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGI9YS5vcHRpb25zO2Euc25hcEVsZW1lbnRzPVtdO2QoYi5zbmFwLmNvbnN0cnVjdG9yIT1TdHJpbmc/Yi5zbmFwLml0ZW1zfHwiOmRhdGEoZHJhZ2dhYmxlKSI6Yi5zbmFwKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9ZCh0aGlzKSxmPWMub2Zmc2V0KCk7dGhpcyE9YS5lbGVtZW50WzBdJiZhLnNuYXBFbGVtZW50cy5wdXNoKHtpdGVtOnRoaXMsCndpZHRoOmMub3V0ZXJXaWR0aCgpLGhlaWdodDpjLm91dGVySGVpZ2h0KCksdG9wOmYudG9wLGxlZnQ6Zi5sZWZ0fSl9KX0sZHJhZzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1kKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGY9Yy5vcHRpb25zLGU9Zi5zbmFwVG9sZXJhbmNlLGc9Yi5vZmZzZXQubGVmdCxuPWcrYy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCxtPWIub2Zmc2V0LnRvcCxvPW0rYy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsaD1jLnNuYXBFbGVtZW50cy5sZW5ndGgtMTtoPj0wO2gtLSl7dmFyIGk9Yy5zbmFwRWxlbWVudHNbaF0ubGVmdCxrPWkrYy5zbmFwRWxlbWVudHNbaF0ud2lkdGgsaj1jLnNuYXBFbGVtZW50c1toXS50b3AsbD1qK2Muc25hcEVsZW1lbnRzW2hdLmhlaWdodDtpZihpLWU8ZyYmZzxrK2UmJmotZTxtJiZtPGwrZXx8aS1lPGcmJmc8aytlJiZqLWU8byYmbzxsK2V8fGktZTxuJiZuPGsrZSYmai1lPG0mJm08bCtlfHxpLWU8biYmbjxrK2UmJmotZTxvJiYKbzxsK2Upe2lmKGYuc25hcE1vZGUhPSJpbm5lciIpe3ZhciBwPU1hdGguYWJzKGotbyk8PWUscT1NYXRoLmFicyhsLW0pPD1lLHI9TWF0aC5hYnMoaS1uKTw9ZSxzPU1hdGguYWJzKGstZyk8PWU7aWYocCliLnBvc2l0aW9uLnRvcD1jLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6ai1jLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxsZWZ0OjB9KS50b3AtYy5tYXJnaW5zLnRvcDtpZihxKWIucG9zaXRpb24udG9wPWMuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDpsLGxlZnQ6MH0pLnRvcC1jLm1hcmdpbnMudG9wO2lmKHIpYi5wb3NpdGlvbi5sZWZ0PWMuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6aS1jLmhlbHBlclByb3BvcnRpb25zLndpZHRofSkubGVmdC1jLm1hcmdpbnMubGVmdDtpZihzKWIucG9zaXRpb24ubGVmdD1jLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Omt9KS5sZWZ0LWMubWFyZ2lucy5sZWZ0fXZhciB0PQpwfHxxfHxyfHxzO2lmKGYuc25hcE1vZGUhPSJvdXRlciIpe3A9TWF0aC5hYnMoai1tKTw9ZTtxPU1hdGguYWJzKGwtbyk8PWU7cj1NYXRoLmFicyhpLWcpPD1lO3M9TWF0aC5hYnMoay1uKTw9ZTtpZihwKWIucG9zaXRpb24udG9wPWMuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDpqLGxlZnQ6MH0pLnRvcC1jLm1hcmdpbnMudG9wO2lmKHEpYi5wb3NpdGlvbi50b3A9Yy5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOmwtYy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsbGVmdDowfSkudG9wLWMubWFyZ2lucy50b3A7aWYociliLnBvc2l0aW9uLmxlZnQ9Yy5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOjAsbGVmdDppfSkubGVmdC1jLm1hcmdpbnMubGVmdDtpZihzKWIucG9zaXRpb24ubGVmdD1jLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0OmstYy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aH0pLmxlZnQtYy5tYXJnaW5zLmxlZnR9aWYoIWMuc25hcEVsZW1lbnRzW2hdLnNuYXBwaW5nJiYKKHB8fHF8fHJ8fHN8fHQpKWMub3B0aW9ucy5zbmFwLnNuYXAmJmMub3B0aW9ucy5zbmFwLnNuYXAuY2FsbChjLmVsZW1lbnQsYSxkLmV4dGVuZChjLl91aUhhc2goKSx7c25hcEl0ZW06Yy5zbmFwRWxlbWVudHNbaF0uaXRlbX0pKTtjLnNuYXBFbGVtZW50c1toXS5zbmFwcGluZz1wfHxxfHxyfHxzfHx0fWVsc2V7Yy5zbmFwRWxlbWVudHNbaF0uc25hcHBpbmcmJmMub3B0aW9ucy5zbmFwLnJlbGVhc2UmJmMub3B0aW9ucy5zbmFwLnJlbGVhc2UuY2FsbChjLmVsZW1lbnQsYSxkLmV4dGVuZChjLl91aUhhc2goKSx7c25hcEl0ZW06Yy5zbmFwRWxlbWVudHNbaF0uaXRlbX0pKTtjLnNuYXBFbGVtZW50c1toXS5zbmFwcGluZz1mYWxzZX19fX0pO2QudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwic3RhY2siLHtzdGFydDpmdW5jdGlvbigpe3ZhciBhPWQodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9uczthPWQubWFrZUFycmF5KGQoYS5zdGFjaykpLnNvcnQoZnVuY3Rpb24oYyxmKXtyZXR1cm4ocGFyc2VJbnQoZChjKS5jc3MoInpJbmRleCIpLAoxMCl8fDApLShwYXJzZUludChkKGYpLmNzcygiekluZGV4IiksMTApfHwwKX0pO2lmKGEubGVuZ3RoKXt2YXIgYj1wYXJzZUludChhWzBdLnN0eWxlLnpJbmRleCl8fDA7ZChhKS5lYWNoKGZ1bmN0aW9uKGMpe3RoaXMuc3R5bGUuekluZGV4PWIrY30pO3RoaXNbMF0uc3R5bGUuekluZGV4PWIrYS5sZW5ndGh9fX0pO2QudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiekluZGV4Iix7c3RhcnQ6ZnVuY3Rpb24oYSxiKXthPWQoYi5oZWxwZXIpO2I9ZCh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zO2lmKGEuY3NzKCJ6SW5kZXgiKSliLl96SW5kZXg9YS5jc3MoInpJbmRleCIpO2EuY3NzKCJ6SW5kZXgiLGIuekluZGV4KX0sc3RvcDpmdW5jdGlvbihhLGIpe2E9ZCh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zO2EuX3pJbmRleCYmZChiLmhlbHBlcikuY3NzKCJ6SW5kZXgiLGEuX3pJbmRleCl9fSl9KShqUXVlcnkpOwo7LyoKICogalF1ZXJ5IFVJIERyb3BwYWJsZSAxLjguNQogKgogKiBDb3B5cmlnaHQgMjAxMCwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRHJvcHBhYmxlcwogKgogKiBEZXBlbmRzOgogKglqcXVlcnkudWkuY29yZS5qcwogKglqcXVlcnkudWkud2lkZ2V0LmpzCiAqCWpxdWVyeS51aS5tb3VzZS5qcwogKglqcXVlcnkudWkuZHJhZ2dhYmxlLmpzCiAqLwooZnVuY3Rpb24oZCl7ZC53aWRnZXQoInVpLmRyb3BwYWJsZSIse3dpZGdldEV2ZW50UHJlZml4OiJkcm9wIixvcHRpb25zOnthY2NlcHQ6IioiLGFjdGl2ZUNsYXNzOmZhbHNlLGFkZENsYXNzZXM6dHJ1ZSxncmVlZHk6ZmFsc2UsaG92ZXJDbGFzczpmYWxzZSxzY29wZToiZGVmYXVsdCIsdG9sZXJhbmNlOiJpbnRlcnNlY3QifSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zLGI9YS5hY2NlcHQ7dGhpcy5pc292ZXI9MDt0aGlzLmlzb3V0PTE7dGhpcy5hY2NlcHQ9ZC5pc0Z1bmN0aW9uKGIpP2I6ZnVuY3Rpb24oYyl7cmV0dXJuIGMuaXMoYil9O3RoaXMucHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuZWxlbWVudFswXS5vZmZzZXRXaWR0aCxoZWlnaHQ6dGhpcy5lbGVtZW50WzBdLm9mZnNldEhlaWdodH07ZC51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1thLnNjb3BlXT1kLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Euc2NvcGVdfHxbXTtkLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Euc2NvcGVdLnB1c2godGhpcyk7CmEuYWRkQ2xhc3NlcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcm9wcGFibGUiKX0sZGVzdHJveTpmdW5jdGlvbigpe2Zvcih2YXIgYT1kLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3RoaXMub3B0aW9ucy5zY29wZV0sYj0wO2I8YS5sZW5ndGg7YisrKWFbYl09PXRoaXMmJmEuc3BsaWNlKGIsMSk7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1kcm9wcGFibGUgdWktZHJvcHBhYmxlLWRpc2FibGVkIikucmVtb3ZlRGF0YSgiZHJvcHBhYmxlIikudW5iaW5kKCIuZHJvcHBhYmxlIik7cmV0dXJuIHRoaXN9LF9zZXRPcHRpb246ZnVuY3Rpb24oYSxiKXtpZihhPT0iYWNjZXB0Iil0aGlzLmFjY2VwdD1kLmlzRnVuY3Rpb24oYik/YjpmdW5jdGlvbihjKXtyZXR1cm4gYy5pcyhiKX07ZC5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfYWN0aXZhdGU6ZnVuY3Rpb24oYSl7dmFyIGI9ZC51aS5kZG1hbmFnZXIuY3VycmVudDt0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MmJgp0aGlzLmVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKTtiJiZ0aGlzLl90cmlnZ2VyKCJhY3RpdmF0ZSIsYSx0aGlzLnVpKGIpKX0sX2RlYWN0aXZhdGU6ZnVuY3Rpb24oYSl7dmFyIGI9ZC51aS5kZG1hbmFnZXIuY3VycmVudDt0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MmJnRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpO2ImJnRoaXMuX3RyaWdnZXIoImRlYWN0aXZhdGUiLGEsdGhpcy51aShiKSl9LF9vdmVyOmZ1bmN0aW9uKGEpe3ZhciBiPWQudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7aWYoISghYnx8KGIuY3VycmVudEl0ZW18fGIuZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFswXSkpaWYodGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYi5jdXJyZW50SXRlbXx8Yi5lbGVtZW50KSl7dGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MmJnRoaXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyk7CnRoaXMuX3RyaWdnZXIoIm92ZXIiLGEsdGhpcy51aShiKSl9fSxfb3V0OmZ1bmN0aW9uKGEpe3ZhciBiPWQudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7aWYoISghYnx8KGIuY3VycmVudEl0ZW18fGIuZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFswXSkpaWYodGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYi5jdXJyZW50SXRlbXx8Yi5lbGVtZW50KSl7dGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MmJnRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyk7dGhpcy5fdHJpZ2dlcigib3V0IixhLHRoaXMudWkoYikpfX0sX2Ryb3A6ZnVuY3Rpb24oYSxiKXt2YXIgYz1ifHxkLnVpLmRkbWFuYWdlci5jdXJyZW50O2lmKCFjfHwoYy5jdXJyZW50SXRlbXx8Yy5lbGVtZW50KVswXT09dGhpcy5lbGVtZW50WzBdKXJldHVybiBmYWxzZTt2YXIgZT1mYWxzZTt0aGlzLmVsZW1lbnQuZmluZCgiOmRhdGEoZHJvcHBhYmxlKSIpLm5vdCgiLnVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZz0KZC5kYXRhKHRoaXMsImRyb3BwYWJsZSIpO2lmKGcub3B0aW9ucy5ncmVlZHkmJiFnLm9wdGlvbnMuZGlzYWJsZWQmJmcub3B0aW9ucy5zY29wZT09Yy5vcHRpb25zLnNjb3BlJiZnLmFjY2VwdC5jYWxsKGcuZWxlbWVudFswXSxjLmN1cnJlbnRJdGVtfHxjLmVsZW1lbnQpJiZkLnVpLmludGVyc2VjdChjLGQuZXh0ZW5kKGcse29mZnNldDpnLmVsZW1lbnQub2Zmc2V0KCl9KSxnLm9wdGlvbnMudG9sZXJhbmNlKSl7ZT10cnVlO3JldHVybiBmYWxzZX19KTtpZihlKXJldHVybiBmYWxzZTtpZih0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSxjLmN1cnJlbnRJdGVtfHxjLmVsZW1lbnQpKXt0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MmJnRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpO3RoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpO3RoaXMuX3RyaWdnZXIoImRyb3AiLAphLHRoaXMudWkoYykpO3JldHVybiB0aGlzLmVsZW1lbnR9cmV0dXJuIGZhbHNlfSx1aTpmdW5jdGlvbihhKXtyZXR1cm57ZHJhZ2dhYmxlOmEuY3VycmVudEl0ZW18fGEuZWxlbWVudCxoZWxwZXI6YS5oZWxwZXIscG9zaXRpb246YS5wb3NpdGlvbixvZmZzZXQ6YS5wb3NpdGlvbkFic319fSk7ZC5leHRlbmQoZC51aS5kcm9wcGFibGUse3ZlcnNpb246IjEuOC41In0pO2QudWkuaW50ZXJzZWN0PWZ1bmN0aW9uKGEsYixjKXtpZighYi5vZmZzZXQpcmV0dXJuIGZhbHNlO3ZhciBlPShhLnBvc2l0aW9uQWJzfHxhLnBvc2l0aW9uLmFic29sdXRlKS5sZWZ0LGc9ZSthLmhlbHBlclByb3BvcnRpb25zLndpZHRoLGY9KGEucG9zaXRpb25BYnN8fGEucG9zaXRpb24uYWJzb2x1dGUpLnRvcCxoPWYrYS5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsaT1iLm9mZnNldC5sZWZ0LGs9aStiLnByb3BvcnRpb25zLndpZHRoLGo9Yi5vZmZzZXQudG9wLGw9aitiLnByb3BvcnRpb25zLmhlaWdodDsKc3dpdGNoKGMpe2Nhc2UgImZpdCI6cmV0dXJuIGk8PWUmJmc8PWsmJmo8PWYmJmg8PWw7Y2FzZSAiaW50ZXJzZWN0IjpyZXR1cm4gaTxlK2EuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMiYmZy1hLmhlbHBlclByb3BvcnRpb25zLndpZHRoLzI8ayYmajxmK2EuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzImJmgtYS5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMjxsO2Nhc2UgInBvaW50ZXIiOnJldHVybiBkLnVpLmlzT3ZlcigoYS5wb3NpdGlvbkFic3x8YS5wb3NpdGlvbi5hYnNvbHV0ZSkudG9wKyhhLmNsaWNrT2Zmc2V0fHxhLm9mZnNldC5jbGljaykudG9wLChhLnBvc2l0aW9uQWJzfHxhLnBvc2l0aW9uLmFic29sdXRlKS5sZWZ0KyhhLmNsaWNrT2Zmc2V0fHxhLm9mZnNldC5jbGljaykubGVmdCxqLGksYi5wcm9wb3J0aW9ucy5oZWlnaHQsYi5wcm9wb3J0aW9ucy53aWR0aCk7Y2FzZSAidG91Y2giOnJldHVybihmPj1qJiZmPD1sfHxoPj1qJiZoPD1sfHxmPGomJmg+bCkmJihlPj0KaSYmZTw9a3x8Zz49aSYmZzw9a3x8ZTxpJiZnPmspO2RlZmF1bHQ6cmV0dXJuIGZhbHNlfX07ZC51aS5kZG1hbmFnZXI9e2N1cnJlbnQ6bnVsbCxkcm9wcGFibGVzOnsiZGVmYXVsdCI6W119LHByZXBhcmVPZmZzZXRzOmZ1bmN0aW9uKGEsYil7dmFyIGM9ZC51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1thLm9wdGlvbnMuc2NvcGVdfHxbXSxlPWI/Yi50eXBlOm51bGwsZz0oYS5jdXJyZW50SXRlbXx8YS5lbGVtZW50KS5maW5kKCI6ZGF0YShkcm9wcGFibGUpIikuYW5kU2VsZigpLGY9MDthOmZvcig7ZjxjLmxlbmd0aDtmKyspaWYoIShjW2ZdLm9wdGlvbnMuZGlzYWJsZWR8fGEmJiFjW2ZdLmFjY2VwdC5jYWxsKGNbZl0uZWxlbWVudFswXSxhLmN1cnJlbnRJdGVtfHxhLmVsZW1lbnQpKSl7Zm9yKHZhciBoPTA7aDxnLmxlbmd0aDtoKyspaWYoZ1toXT09Y1tmXS5lbGVtZW50WzBdKXtjW2ZdLnByb3BvcnRpb25zLmhlaWdodD0wO2NvbnRpbnVlIGF9Y1tmXS52aXNpYmxlPWNbZl0uZWxlbWVudC5jc3MoImRpc3BsYXkiKSE9CiJub25lIjtpZihjW2ZdLnZpc2libGUpe2NbZl0ub2Zmc2V0PWNbZl0uZWxlbWVudC5vZmZzZXQoKTtjW2ZdLnByb3BvcnRpb25zPXt3aWR0aDpjW2ZdLmVsZW1lbnRbMF0ub2Zmc2V0V2lkdGgsaGVpZ2h0OmNbZl0uZWxlbWVudFswXS5vZmZzZXRIZWlnaHR9O2U9PSJtb3VzZWRvd24iJiZjW2ZdLl9hY3RpdmF0ZS5jYWxsKGNbZl0sYil9fX0sZHJvcDpmdW5jdGlvbihhLGIpe3ZhciBjPWZhbHNlO2QuZWFjaChkLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Eub3B0aW9ucy5zY29wZV18fFtdLGZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zKXtpZighdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLnZpc2libGUmJmQudWkuaW50ZXJzZWN0KGEsdGhpcyx0aGlzLm9wdGlvbnMudG9sZXJhbmNlKSljPWN8fHRoaXMuX2Ryb3AuY2FsbCh0aGlzLGIpO2lmKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMudmlzaWJsZSYmdGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYS5jdXJyZW50SXRlbXx8CmEuZWxlbWVudCkpe3RoaXMuaXNvdXQ9MTt0aGlzLmlzb3Zlcj0wO3RoaXMuX2RlYWN0aXZhdGUuY2FsbCh0aGlzLGIpfX19KTtyZXR1cm4gY30sZHJhZzpmdW5jdGlvbihhLGIpe2Eub3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zJiZkLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyhhLGIpO2QuZWFjaChkLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Eub3B0aW9ucy5zY29wZV18fFtdLGZ1bmN0aW9uKCl7aWYoISh0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fHRoaXMuZ3JlZWR5Q2hpbGR8fCF0aGlzLnZpc2libGUpKXt2YXIgYz1kLnVpLmludGVyc2VjdChhLHRoaXMsdGhpcy5vcHRpb25zLnRvbGVyYW5jZSk7aWYoYz0hYyYmdGhpcy5pc292ZXI9PTE/Imlzb3V0IjpjJiZ0aGlzLmlzb3Zlcj09MD8iaXNvdmVyIjpudWxsKXt2YXIgZTtpZih0aGlzLm9wdGlvbnMuZ3JlZWR5KXt2YXIgZz10aGlzLmVsZW1lbnQucGFyZW50cygiOmRhdGEoZHJvcHBhYmxlKTplcSgwKSIpO2lmKGcubGVuZ3RoKXtlPQpkLmRhdGEoZ1swXSwiZHJvcHBhYmxlIik7ZS5ncmVlZHlDaGlsZD1jPT0iaXNvdmVyIj8xOjB9fWlmKGUmJmM9PSJpc292ZXIiKXtlLmlzb3Zlcj0wO2UuaXNvdXQ9MTtlLl9vdXQuY2FsbChlLGIpfXRoaXNbY109MTt0aGlzW2M9PSJpc291dCI/Imlzb3ZlciI6Imlzb3V0Il09MDt0aGlzW2M9PSJpc292ZXIiPyJfb3ZlciI6Il9vdXQiXS5jYWxsKHRoaXMsYik7aWYoZSYmYz09Imlzb3V0Iil7ZS5pc291dD0wO2UuaXNvdmVyPTE7ZS5fb3Zlci5jYWxsKGUsYil9fX19KX19fSkoalF1ZXJ5KTsKOy8qCiAqIGpRdWVyeSBVSSBSZXNpemFibGUgMS44LjUKICoKICogQ29weXJpZ2h0IDIwMTAsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1Jlc2l6YWJsZXMKICoKICogRGVwZW5kczoKICoJanF1ZXJ5LnVpLmNvcmUuanMKICoJanF1ZXJ5LnVpLm1vdXNlLmpzCiAqCWpxdWVyeS51aS53aWRnZXQuanMKICovCihmdW5jdGlvbihlKXtlLndpZGdldCgidWkucmVzaXphYmxlIixlLnVpLm1vdXNlLHt3aWRnZXRFdmVudFByZWZpeDoicmVzaXplIixvcHRpb25zOnthbHNvUmVzaXplOmZhbHNlLGFuaW1hdGU6ZmFsc2UsYW5pbWF0ZUR1cmF0aW9uOiJzbG93IixhbmltYXRlRWFzaW5nOiJzd2luZyIsYXNwZWN0UmF0aW86ZmFsc2UsYXV0b0hpZGU6ZmFsc2UsY29udGFpbm1lbnQ6ZmFsc2UsZ2hvc3Q6ZmFsc2UsZ3JpZDpmYWxzZSxoYW5kbGVzOiJlLHMsc2UiLGhlbHBlcjpmYWxzZSxtYXhIZWlnaHQ6bnVsbCxtYXhXaWR0aDpudWxsLG1pbkhlaWdodDoxMCxtaW5XaWR0aDoxMCx6SW5kZXg6MUUzfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxhPXRoaXMub3B0aW9uczt0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZSIpO2UuZXh0ZW5kKHRoaXMse19hc3BlY3RSYXRpbzohIWEuYXNwZWN0UmF0aW8sYXNwZWN0UmF0aW86YS5hc3BlY3RSYXRpbyxvcmlnaW5hbEVsZW1lbnQ6dGhpcy5lbGVtZW50LApfcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50czpbXSxfaGVscGVyOmEuaGVscGVyfHxhLmdob3N0fHxhLmFuaW1hdGU/YS5oZWxwZXJ8fCJ1aS1yZXNpemFibGUtaGVscGVyIjpudWxsfSk7aWYodGhpcy5lbGVtZW50WzBdLm5vZGVOYW1lLm1hdGNoKC9jYW52YXN8dGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbnxpbWcvaSkpey9yZWxhdGl2ZS8udGVzdCh0aGlzLmVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpKSYmZS5icm93c2VyLm9wZXJhJiZ0aGlzLmVsZW1lbnQuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUiLHRvcDoiYXV0byIsbGVmdDoiYXV0byJ9KTt0aGlzLmVsZW1lbnQud3JhcChlKCc8ZGl2IGNsYXNzPSJ1aS13cmFwcGVyIiBzdHlsZT0ib3ZlcmZsb3c6IGhpZGRlbjsiPjwvZGl2PicpLmNzcyh7cG9zaXRpb246dGhpcy5lbGVtZW50LmNzcygicG9zaXRpb24iKSx3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKSwKdG9wOnRoaXMuZWxlbWVudC5jc3MoInRvcCIpLGxlZnQ6dGhpcy5lbGVtZW50LmNzcygibGVmdCIpfSkpO3RoaXMuZWxlbWVudD10aGlzLmVsZW1lbnQucGFyZW50KCkuZGF0YSgicmVzaXphYmxlIix0aGlzLmVsZW1lbnQuZGF0YSgicmVzaXphYmxlIikpO3RoaXMuZWxlbWVudElzV3JhcHBlcj10cnVlO3RoaXMuZWxlbWVudC5jc3Moe21hcmdpbkxlZnQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5MZWZ0IiksbWFyZ2luVG9wOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luVG9wIiksbWFyZ2luUmlnaHQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5SaWdodCIpLG1hcmdpbkJvdHRvbTp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbkJvdHRvbSIpfSk7dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHttYXJnaW5MZWZ0OjAsbWFyZ2luVG9wOjAsbWFyZ2luUmlnaHQ6MCxtYXJnaW5Cb3R0b206MH0pO3RoaXMub3JpZ2luYWxSZXNpemVTdHlsZT0KdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiKTt0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIsIm5vbmUiKTt0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLnB1c2godGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHtwb3NpdGlvbjoic3RhdGljIix6b29tOjEsZGlzcGxheToiYmxvY2sifSkpO3RoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7bWFyZ2luOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luIil9KTt0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpfXRoaXMuaGFuZGxlcz1hLmhhbmRsZXN8fCghZSgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiLHRoaXMuZWxlbWVudCkubGVuZ3RoPyJlLHMsc2UiOntuOiIudWktcmVzaXphYmxlLW4iLGU6Ii51aS1yZXNpemFibGUtZSIsczoiLnVpLXJlc2l6YWJsZS1zIix3OiIudWktcmVzaXphYmxlLXciLHNlOiIudWktcmVzaXphYmxlLXNlIixzdzoiLnVpLXJlc2l6YWJsZS1zdyIsbmU6Ii51aS1yZXNpemFibGUtbmUiLApudzoiLnVpLXJlc2l6YWJsZS1udyJ9KTtpZih0aGlzLmhhbmRsZXMuY29uc3RydWN0b3I9PVN0cmluZyl7aWYodGhpcy5oYW5kbGVzPT0iYWxsIil0aGlzLmhhbmRsZXM9Im4sZSxzLHcsc2Usc3csbmUsbnciO3ZhciBjPXRoaXMuaGFuZGxlcy5zcGxpdCgiLCIpO3RoaXMuaGFuZGxlcz17fTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGY9ZS50cmltKGNbZF0pLGc9ZSgnPGRpdiBjbGFzcz0idWktcmVzaXphYmxlLWhhbmRsZSAnKygidWktcmVzaXphYmxlLSIrZikrJyI+PC9kaXY+Jyk7L3N3fHNlfG5lfG53Ly50ZXN0KGYpJiZnLmNzcyh7ekluZGV4OisrYS56SW5kZXh9KTsic2UiPT1mJiZnLmFkZENsYXNzKCJ1aS1pY29uIHVpLWljb24tZ3JpcHNtYWxsLWRpYWdvbmFsLXNlIik7dGhpcy5oYW5kbGVzW2ZdPSIudWktcmVzaXphYmxlLSIrZjt0aGlzLmVsZW1lbnQuYXBwZW5kKGcpfX10aGlzLl9yZW5kZXJBeGlzPWZ1bmN0aW9uKGgpe2g9aHx8dGhpcy5lbGVtZW50O2Zvcih2YXIgaSBpbiB0aGlzLmhhbmRsZXMpe2lmKHRoaXMuaGFuZGxlc1tpXS5jb25zdHJ1Y3Rvcj09ClN0cmluZyl0aGlzLmhhbmRsZXNbaV09ZSh0aGlzLmhhbmRsZXNbaV0sdGhpcy5lbGVtZW50KS5zaG93KCk7aWYodGhpcy5lbGVtZW50SXNXcmFwcGVyJiZ0aGlzLm9yaWdpbmFsRWxlbWVudFswXS5ub2RlTmFtZS5tYXRjaCgvdGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbi9pKSl7dmFyIGo9ZSh0aGlzLmhhbmRsZXNbaV0sdGhpcy5lbGVtZW50KSxrPTA7az0vc3d8bmV8bnd8c2V8bnxzLy50ZXN0KGkpP2oub3V0ZXJIZWlnaHQoKTpqLm91dGVyV2lkdGgoKTtqPVsicGFkZGluZyIsL25lfG53fG4vLnRlc3QoaSk/IlRvcCI6L3NlfHN3fHMvLnRlc3QoaSk/IkJvdHRvbSI6L15lJC8udGVzdChpKT8iUmlnaHQiOiJMZWZ0Il0uam9pbigiIik7aC5jc3MoaixrKTt0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpfWUodGhpcy5oYW5kbGVzW2ldKX19O3RoaXMuX3JlbmRlckF4aXModGhpcy5lbGVtZW50KTt0aGlzLl9oYW5kbGVzPWUoIi51aS1yZXNpemFibGUtaGFuZGxlIix0aGlzLmVsZW1lbnQpLmRpc2FibGVTZWxlY3Rpb24oKTsKdGhpcy5faGFuZGxlcy5tb3VzZW92ZXIoZnVuY3Rpb24oKXtpZighYi5yZXNpemluZyl7aWYodGhpcy5jbGFzc05hbWUpdmFyIGg9dGhpcy5jbGFzc05hbWUubWF0Y2goL3VpLXJlc2l6YWJsZS0oc2V8c3d8bmV8bnd8bnxlfHN8dykvaSk7Yi5heGlzPWgmJmhbMV0/aFsxXToic2UifX0pO2lmKGEuYXV0b0hpZGUpe3RoaXMuX2hhbmRsZXMuaGlkZSgpO2UodGhpcy5lbGVtZW50KS5hZGRDbGFzcygidWktcmVzaXphYmxlLWF1dG9oaWRlIikuaG92ZXIoZnVuY3Rpb24oKXtlKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKTtiLl9oYW5kbGVzLnNob3coKX0sZnVuY3Rpb24oKXtpZighYi5yZXNpemluZyl7ZSh0aGlzKS5hZGRDbGFzcygidWktcmVzaXphYmxlLWF1dG9oaWRlIik7Yi5faGFuZGxlcy5oaWRlKCl9fSl9dGhpcy5fbW91c2VJbml0KCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9tb3VzZURlc3Ryb3koKTt2YXIgYj1mdW5jdGlvbihjKXtlKGMpLnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUgdWktcmVzaXphYmxlLWRpc2FibGVkIHVpLXJlc2l6YWJsZS1yZXNpemluZyIpLnJlbW92ZURhdGEoInJlc2l6YWJsZSIpLnVuYmluZCgiLnJlc2l6YWJsZSIpLmZpbmQoIi51aS1yZXNpemFibGUtaGFuZGxlIikucmVtb3ZlKCl9OwppZih0aGlzLmVsZW1lbnRJc1dyYXBwZXIpe2IodGhpcy5lbGVtZW50KTt2YXIgYT10aGlzLmVsZW1lbnQ7YS5hZnRlcih0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe3Bvc2l0aW9uOmEuY3NzKCJwb3NpdGlvbiIpLHdpZHRoOmEub3V0ZXJXaWR0aCgpLGhlaWdodDphLm91dGVySGVpZ2h0KCksdG9wOmEuY3NzKCJ0b3AiKSxsZWZ0OmEuY3NzKCJsZWZ0Iil9KSkucmVtb3ZlKCl9dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiLHRoaXMub3JpZ2luYWxSZXNpemVTdHlsZSk7Yih0aGlzLm9yaWdpbmFsRWxlbWVudCk7cmV0dXJuIHRoaXN9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oYil7dmFyIGE9ZmFsc2U7Zm9yKHZhciBjIGluIHRoaXMuaGFuZGxlcylpZihlKHRoaXMuaGFuZGxlc1tjXSlbMF09PWIudGFyZ2V0KWE9dHJ1ZTtyZXR1cm4hdGhpcy5vcHRpb25zLmRpc2FibGVkJiZhfSxfbW91c2VTdGFydDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLm9wdGlvbnMsYz10aGlzLmVsZW1lbnQucG9zaXRpb24oKSwKZD10aGlzLmVsZW1lbnQ7dGhpcy5yZXNpemluZz10cnVlO3RoaXMuZG9jdW1lbnRTY3JvbGw9e3RvcDplKGRvY3VtZW50KS5zY3JvbGxUb3AoKSxsZWZ0OmUoZG9jdW1lbnQpLnNjcm9sbExlZnQoKX07aWYoZC5pcygiLnVpLWRyYWdnYWJsZSIpfHwvYWJzb2x1dGUvLnRlc3QoZC5jc3MoInBvc2l0aW9uIikpKWQuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDpjLnRvcCxsZWZ0OmMubGVmdH0pO2UuYnJvd3Nlci5vcGVyYSYmL3JlbGF0aXZlLy50ZXN0KGQuY3NzKCJwb3NpdGlvbiIpKSYmZC5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsdG9wOiJhdXRvIixsZWZ0OiJhdXRvIn0pO3RoaXMuX3JlbmRlclByb3h5KCk7Yz1tKHRoaXMuaGVscGVyLmNzcygibGVmdCIpKTt2YXIgZj1tKHRoaXMuaGVscGVyLmNzcygidG9wIikpO2lmKGEuY29udGFpbm1lbnQpe2MrPWUoYS5jb250YWlubWVudCkuc2Nyb2xsTGVmdCgpfHwwO2YrPWUoYS5jb250YWlubWVudCkuc2Nyb2xsVG9wKCl8fDB9dGhpcy5vZmZzZXQ9CnRoaXMuaGVscGVyLm9mZnNldCgpO3RoaXMucG9zaXRpb249e2xlZnQ6Yyx0b3A6Zn07dGhpcy5zaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6ZC5vdXRlcldpZHRoKCksaGVpZ2h0OmQub3V0ZXJIZWlnaHQoKX06e3dpZHRoOmQud2lkdGgoKSxoZWlnaHQ6ZC5oZWlnaHQoKX07dGhpcy5vcmlnaW5hbFNpemU9dGhpcy5faGVscGVyP3t3aWR0aDpkLm91dGVyV2lkdGgoKSxoZWlnaHQ6ZC5vdXRlckhlaWdodCgpfTp7d2lkdGg6ZC53aWR0aCgpLGhlaWdodDpkLmhlaWdodCgpfTt0aGlzLm9yaWdpbmFsUG9zaXRpb249e2xlZnQ6Yyx0b3A6Zn07dGhpcy5zaXplRGlmZj17d2lkdGg6ZC5vdXRlcldpZHRoKCktZC53aWR0aCgpLGhlaWdodDpkLm91dGVySGVpZ2h0KCktZC5oZWlnaHQoKX07dGhpcy5vcmlnaW5hbE1vdXNlUG9zaXRpb249e2xlZnQ6Yi5wYWdlWCx0b3A6Yi5wYWdlWX07dGhpcy5hc3BlY3RSYXRpbz10eXBlb2YgYS5hc3BlY3RSYXRpbz09Im51bWJlciI/YS5hc3BlY3RSYXRpbzoKdGhpcy5vcmlnaW5hbFNpemUud2lkdGgvdGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0fHwxO2E9ZSgiLnVpLXJlc2l6YWJsZS0iK3RoaXMuYXhpcykuY3NzKCJjdXJzb3IiKTtlKCJib2R5IikuY3NzKCJjdXJzb3IiLGE9PSJhdXRvIj90aGlzLmF4aXMrIi1yZXNpemUiOmEpO2QuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1yZXNpemluZyIpO3RoaXMuX3Byb3BhZ2F0ZSgic3RhcnQiLGIpO3JldHVybiB0cnVlfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuaGVscGVyLGM9dGhpcy5vcmlnaW5hbE1vdXNlUG9zaXRpb24sZD10aGlzLl9jaGFuZ2VbdGhpcy5heGlzXTtpZighZClyZXR1cm4gZmFsc2U7Yz1kLmFwcGx5KHRoaXMsW2IsYi5wYWdlWC1jLmxlZnR8fDAsYi5wYWdlWS1jLnRvcHx8MF0pO2lmKHRoaXMuX2FzcGVjdFJhdGlvfHxiLnNoaWZ0S2V5KWM9dGhpcy5fdXBkYXRlUmF0aW8oYyxiKTtjPXRoaXMuX3Jlc3BlY3RTaXplKGMsYik7dGhpcy5fcHJvcGFnYXRlKCJyZXNpemUiLApiKTthLmNzcyh7dG9wOnRoaXMucG9zaXRpb24udG9wKyJweCIsbGVmdDp0aGlzLnBvc2l0aW9uLmxlZnQrInB4Iix3aWR0aDp0aGlzLnNpemUud2lkdGgrInB4IixoZWlnaHQ6dGhpcy5zaXplLmhlaWdodCsicHgifSk7IXRoaXMuX2hlbHBlciYmdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5sZW5ndGgmJnRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCk7dGhpcy5fdXBkYXRlQ2FjaGUoYyk7dGhpcy5fdHJpZ2dlcigicmVzaXplIixiLHRoaXMudWkoKSk7cmV0dXJuIGZhbHNlfSxfbW91c2VTdG9wOmZ1bmN0aW9uKGIpe3RoaXMucmVzaXppbmc9ZmFsc2U7dmFyIGE9dGhpcy5vcHRpb25zLGM9dGhpcztpZih0aGlzLl9oZWxwZXIpe3ZhciBkPXRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMsZj1kLmxlbmd0aCYmL3RleHRhcmVhL2kudGVzdChkWzBdLm5vZGVOYW1lKTtkPWYmJmUudWkuaGFzU2Nyb2xsKGRbMF0sImxlZnQiKT8wOmMuc2l6ZURpZmYuaGVpZ2h0OwpmPXt3aWR0aDpjLnNpemUud2lkdGgtKGY/MDpjLnNpemVEaWZmLndpZHRoKSxoZWlnaHQ6Yy5zaXplLmhlaWdodC1kfTtkPXBhcnNlSW50KGMuZWxlbWVudC5jc3MoImxlZnQiKSwxMCkrKGMucG9zaXRpb24ubGVmdC1jLm9yaWdpbmFsUG9zaXRpb24ubGVmdCl8fG51bGw7dmFyIGc9cGFyc2VJbnQoYy5lbGVtZW50LmNzcygidG9wIiksMTApKyhjLnBvc2l0aW9uLnRvcC1jLm9yaWdpbmFsUG9zaXRpb24udG9wKXx8bnVsbDthLmFuaW1hdGV8fHRoaXMuZWxlbWVudC5jc3MoZS5leHRlbmQoZix7dG9wOmcsbGVmdDpkfSkpO2MuaGVscGVyLmhlaWdodChjLnNpemUuaGVpZ2h0KTtjLmhlbHBlci53aWR0aChjLnNpemUud2lkdGgpO3RoaXMuX2hlbHBlciYmIWEuYW5pbWF0ZSYmdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKX1lKCJib2R5IikuY3NzKCJjdXJzb3IiLCJhdXRvIik7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKTt0aGlzLl9wcm9wYWdhdGUoInN0b3AiLApiKTt0aGlzLl9oZWxwZXImJnRoaXMuaGVscGVyLnJlbW92ZSgpO3JldHVybiBmYWxzZX0sX3VwZGF0ZUNhY2hlOmZ1bmN0aW9uKGIpe3RoaXMub2Zmc2V0PXRoaXMuaGVscGVyLm9mZnNldCgpO2lmKGwoYi5sZWZ0KSl0aGlzLnBvc2l0aW9uLmxlZnQ9Yi5sZWZ0O2lmKGwoYi50b3ApKXRoaXMucG9zaXRpb24udG9wPWIudG9wO2lmKGwoYi5oZWlnaHQpKXRoaXMuc2l6ZS5oZWlnaHQ9Yi5oZWlnaHQ7aWYobChiLndpZHRoKSl0aGlzLnNpemUud2lkdGg9Yi53aWR0aH0sX3VwZGF0ZVJhdGlvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucG9zaXRpb24sYz10aGlzLnNpemUsZD10aGlzLmF4aXM7aWYoYi5oZWlnaHQpYi53aWR0aD1jLmhlaWdodCp0aGlzLmFzcGVjdFJhdGlvO2Vsc2UgaWYoYi53aWR0aCliLmhlaWdodD1jLndpZHRoL3RoaXMuYXNwZWN0UmF0aW87aWYoZD09InN3Iil7Yi5sZWZ0PWEubGVmdCsoYy53aWR0aC1iLndpZHRoKTtiLnRvcD1udWxsfWlmKGQ9PSJudyIpe2IudG9wPQphLnRvcCsoYy5oZWlnaHQtYi5oZWlnaHQpO2IubGVmdD1hLmxlZnQrKGMud2lkdGgtYi53aWR0aCl9cmV0dXJuIGJ9LF9yZXNwZWN0U2l6ZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLm9wdGlvbnMsYz10aGlzLmF4aXMsZD1sKGIud2lkdGgpJiZhLm1heFdpZHRoJiZhLm1heFdpZHRoPGIud2lkdGgsZj1sKGIuaGVpZ2h0KSYmYS5tYXhIZWlnaHQmJmEubWF4SGVpZ2h0PGIuaGVpZ2h0LGc9bChiLndpZHRoKSYmYS5taW5XaWR0aCYmYS5taW5XaWR0aD5iLndpZHRoLGg9bChiLmhlaWdodCkmJmEubWluSGVpZ2h0JiZhLm1pbkhlaWdodD5iLmhlaWdodDtpZihnKWIud2lkdGg9YS5taW5XaWR0aDtpZihoKWIuaGVpZ2h0PWEubWluSGVpZ2h0O2lmKGQpYi53aWR0aD1hLm1heFdpZHRoO2lmKGYpYi5oZWlnaHQ9YS5tYXhIZWlnaHQ7dmFyIGk9dGhpcy5vcmlnaW5hbFBvc2l0aW9uLmxlZnQrdGhpcy5vcmlnaW5hbFNpemUud2lkdGgsaj10aGlzLnBvc2l0aW9uLnRvcCt0aGlzLnNpemUuaGVpZ2h0LAprPS9zd3xud3x3Ly50ZXN0KGMpO2M9L253fG5lfG4vLnRlc3QoYyk7aWYoZyYmayliLmxlZnQ9aS1hLm1pbldpZHRoO2lmKGQmJmspYi5sZWZ0PWktYS5tYXhXaWR0aDtpZihoJiZjKWIudG9wPWotYS5taW5IZWlnaHQ7aWYoZiYmYyliLnRvcD1qLWEubWF4SGVpZ2h0O2lmKChhPSFiLndpZHRoJiYhYi5oZWlnaHQpJiYhYi5sZWZ0JiZiLnRvcCliLnRvcD1udWxsO2Vsc2UgaWYoYSYmIWIudG9wJiZiLmxlZnQpYi5sZWZ0PW51bGw7cmV0dXJuIGJ9LF9wcm9wb3J0aW9uYWxseVJlc2l6ZTpmdW5jdGlvbigpe2lmKHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoKWZvcih2YXIgYj10aGlzLmhlbHBlcnx8dGhpcy5lbGVtZW50LGE9MDthPHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50c1thXTtpZighdGhpcy5ib3JkZXJEaWYpe3ZhciBkPVtjLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwKYy5jc3MoImJvcmRlclJpZ2h0V2lkdGgiKSxjLmNzcygiYm9yZGVyQm90dG9tV2lkdGgiKSxjLmNzcygiYm9yZGVyTGVmdFdpZHRoIildLGY9W2MuY3NzKCJwYWRkaW5nVG9wIiksYy5jc3MoInBhZGRpbmdSaWdodCIpLGMuY3NzKCJwYWRkaW5nQm90dG9tIiksYy5jc3MoInBhZGRpbmdMZWZ0IildO3RoaXMuYm9yZGVyRGlmPWUubWFwKGQsZnVuY3Rpb24oZyxoKXtnPXBhcnNlSW50KGcsMTApfHwwO2g9cGFyc2VJbnQoZltoXSwxMCl8fDA7cmV0dXJuIGcraH0pfWUuYnJvd3Nlci5tc2llJiYoZShiKS5pcygiOmhpZGRlbiIpfHxlKGIpLnBhcmVudHMoIjpoaWRkZW4iKS5sZW5ndGgpfHxjLmNzcyh7aGVpZ2h0OmIuaGVpZ2h0KCktdGhpcy5ib3JkZXJEaWZbMF0tdGhpcy5ib3JkZXJEaWZbMl18fDAsd2lkdGg6Yi53aWR0aCgpLXRoaXMuYm9yZGVyRGlmWzFdLXRoaXMuYm9yZGVyRGlmWzNdfHwwfSl9fSxfcmVuZGVyUHJveHk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnM7dGhpcy5lbGVtZW50T2Zmc2V0PQp0aGlzLmVsZW1lbnQub2Zmc2V0KCk7aWYodGhpcy5faGVscGVyKXt0aGlzLmhlbHBlcj10aGlzLmhlbHBlcnx8ZSgnPGRpdiBzdHlsZT0ib3ZlcmZsb3c6aGlkZGVuOyI+PC9kaXY+Jyk7dmFyIGE9ZS5icm93c2VyLm1zaWUmJmUuYnJvd3Nlci52ZXJzaW9uPDcsYz1hPzE6MDthPWE/MjotMTt0aGlzLmhlbHBlci5hZGRDbGFzcyh0aGlzLl9oZWxwZXIpLmNzcyh7d2lkdGg6dGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoKSthLGhlaWdodDp0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKSthLHBvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDp0aGlzLmVsZW1lbnRPZmZzZXQubGVmdC1jKyJweCIsdG9wOnRoaXMuZWxlbWVudE9mZnNldC50b3AtYysicHgiLHpJbmRleDorK2IuekluZGV4fSk7dGhpcy5oZWxwZXIuYXBwZW5kVG8oImJvZHkiKS5kaXNhYmxlU2VsZWN0aW9uKCl9ZWxzZSB0aGlzLmhlbHBlcj10aGlzLmVsZW1lbnR9LF9jaGFuZ2U6e2U6ZnVuY3Rpb24oYixhKXtyZXR1cm57d2lkdGg6dGhpcy5vcmlnaW5hbFNpemUud2lkdGgrCmF9fSx3OmZ1bmN0aW9uKGIsYSl7cmV0dXJue2xlZnQ6dGhpcy5vcmlnaW5hbFBvc2l0aW9uLmxlZnQrYSx3aWR0aDp0aGlzLm9yaWdpbmFsU2l6ZS53aWR0aC1hfX0sbjpmdW5jdGlvbihiLGEsYyl7cmV0dXJue3RvcDp0aGlzLm9yaWdpbmFsUG9zaXRpb24udG9wK2MsaGVpZ2h0OnRoaXMub3JpZ2luYWxTaXplLmhlaWdodC1jfX0sczpmdW5jdGlvbihiLGEsYyl7cmV0dXJue2hlaWdodDp0aGlzLm9yaWdpbmFsU2l6ZS5oZWlnaHQrY319LHNlOmZ1bmN0aW9uKGIsYSxjKXtyZXR1cm4gZS5leHRlbmQodGhpcy5fY2hhbmdlLnMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS5lLmFwcGx5KHRoaXMsW2IsYSxjXSkpfSxzdzpmdW5jdGlvbihiLGEsYyl7cmV0dXJuIGUuZXh0ZW5kKHRoaXMuX2NoYW5nZS5zLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2Uudy5hcHBseSh0aGlzLFtiLGEsY10pKX0sbmU6ZnVuY3Rpb24oYixhLGMpe3JldHVybiBlLmV4dGVuZCh0aGlzLl9jaGFuZ2Uubi5hcHBseSh0aGlzLAphcmd1bWVudHMpLHRoaXMuX2NoYW5nZS5lLmFwcGx5KHRoaXMsW2IsYSxjXSkpfSxudzpmdW5jdGlvbihiLGEsYyl7cmV0dXJuIGUuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2Uudy5hcHBseSh0aGlzLFtiLGEsY10pKX19LF9wcm9wYWdhdGU6ZnVuY3Rpb24oYixhKXtlLnVpLnBsdWdpbi5jYWxsKHRoaXMsYixbYSx0aGlzLnVpKCldKTtiIT0icmVzaXplIiYmdGhpcy5fdHJpZ2dlcihiLGEsdGhpcy51aSgpKX0scGx1Z2luczp7fSx1aTpmdW5jdGlvbigpe3JldHVybntvcmlnaW5hbEVsZW1lbnQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQsZWxlbWVudDp0aGlzLmVsZW1lbnQsaGVscGVyOnRoaXMuaGVscGVyLHBvc2l0aW9uOnRoaXMucG9zaXRpb24sc2l6ZTp0aGlzLnNpemUsb3JpZ2luYWxTaXplOnRoaXMub3JpZ2luYWxTaXplLG9yaWdpbmFsUG9zaXRpb246dGhpcy5vcmlnaW5hbFBvc2l0aW9ufX19KTtlLmV4dGVuZChlLnVpLnJlc2l6YWJsZSwKe3ZlcnNpb246IjEuOC41In0pO2UudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiYWxzb1Jlc2l6ZSIse3N0YXJ0OmZ1bmN0aW9uKCl7dmFyIGI9ZSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKS5vcHRpb25zLGE9ZnVuY3Rpb24oYyl7ZShjKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9ZSh0aGlzKTtkLmRhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIix7d2lkdGg6cGFyc2VJbnQoZC53aWR0aCgpLDEwKSxoZWlnaHQ6cGFyc2VJbnQoZC5oZWlnaHQoKSwxMCksbGVmdDpwYXJzZUludChkLmNzcygibGVmdCIpLDEwKSx0b3A6cGFyc2VJbnQoZC5jc3MoInRvcCIpLDEwKSxwb3NpdGlvbjpkLmNzcygicG9zaXRpb24iKX0pfSl9O2lmKHR5cGVvZiBiLmFsc29SZXNpemU9PSJvYmplY3QiJiYhYi5hbHNvUmVzaXplLnBhcmVudE5vZGUpaWYoYi5hbHNvUmVzaXplLmxlbmd0aCl7Yi5hbHNvUmVzaXplPWIuYWxzb1Jlc2l6ZVswXTthKGIuYWxzb1Jlc2l6ZSl9ZWxzZSBlLmVhY2goYi5hbHNvUmVzaXplLApmdW5jdGlvbihjKXthKGMpfSk7ZWxzZSBhKGIuYWxzb1Jlc2l6ZSl9LHJlc2l6ZTpmdW5jdGlvbihiLGEpe3ZhciBjPWUodGhpcykuZGF0YSgicmVzaXphYmxlIik7Yj1jLm9wdGlvbnM7dmFyIGQ9Yy5vcmlnaW5hbFNpemUsZj1jLm9yaWdpbmFsUG9zaXRpb24sZz17aGVpZ2h0OmMuc2l6ZS5oZWlnaHQtZC5oZWlnaHR8fDAsd2lkdGg6Yy5zaXplLndpZHRoLWQud2lkdGh8fDAsdG9wOmMucG9zaXRpb24udG9wLWYudG9wfHwwLGxlZnQ6Yy5wb3NpdGlvbi5sZWZ0LWYubGVmdHx8MH0saD1mdW5jdGlvbihpLGope2UoaSkuZWFjaChmdW5jdGlvbigpe3ZhciBrPWUodGhpcykscT1lKHRoaXMpLmRhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIikscD17fSxyPWomJmoubGVuZ3RoP2o6ay5wYXJlbnRzKGEub3JpZ2luYWxFbGVtZW50WzBdKS5sZW5ndGg/WyJ3aWR0aCIsImhlaWdodCJdOlsid2lkdGgiLCJoZWlnaHQiLCJ0b3AiLCJsZWZ0Il07ZS5lYWNoKHIsZnVuY3Rpb24obixvKXtpZigobj0KKHFbb118fDApKyhnW29dfHwwKSkmJm4+PTApcFtvXT1ufHxudWxsfSk7aWYoZS5icm93c2VyLm9wZXJhJiYvcmVsYXRpdmUvLnRlc3Qoay5jc3MoInBvc2l0aW9uIikpKXtjLl9yZXZlcnRUb1JlbGF0aXZlUG9zaXRpb249dHJ1ZTtrLmNzcyh7cG9zaXRpb246ImFic29sdXRlIix0b3A6ImF1dG8iLGxlZnQ6ImF1dG8ifSl9ay5jc3MocCl9KX07dHlwZW9mIGIuYWxzb1Jlc2l6ZT09Im9iamVjdCImJiFiLmFsc29SZXNpemUubm9kZVR5cGU/ZS5lYWNoKGIuYWxzb1Jlc2l6ZSxmdW5jdGlvbihpLGope2goaSxqKX0pOmgoYi5hbHNvUmVzaXplKX0sc3RvcDpmdW5jdGlvbigpe3ZhciBiPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksYT1iLm9wdGlvbnMsYz1mdW5jdGlvbihkKXtlKGQpLmVhY2goZnVuY3Rpb24oKXt2YXIgZj1lKHRoaXMpO2YuY3NzKHtwb3NpdGlvbjpmLmRhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIikucG9zaXRpb259KX0pfTtpZihiLl9yZXZlcnRUb1JlbGF0aXZlUG9zaXRpb24pe2IuX3JldmVydFRvUmVsYXRpdmVQb3NpdGlvbj0KZmFsc2U7dHlwZW9mIGEuYWxzb1Jlc2l6ZT09Im9iamVjdCImJiFhLmFsc29SZXNpemUubm9kZVR5cGU/ZS5lYWNoKGEuYWxzb1Jlc2l6ZSxmdW5jdGlvbihkKXtjKGQpfSk6YyhhLmFsc29SZXNpemUpfWUodGhpcykucmVtb3ZlRGF0YSgicmVzaXphYmxlLWFsc29yZXNpemUiKX19KTtlLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImFuaW1hdGUiLHtzdG9wOmZ1bmN0aW9uKGIpe3ZhciBhPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksYz1hLm9wdGlvbnMsZD1hLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLGY9ZC5sZW5ndGgmJi90ZXh0YXJlYS9pLnRlc3QoZFswXS5ub2RlTmFtZSksZz1mJiZlLnVpLmhhc1Njcm9sbChkWzBdLCJsZWZ0Iik/MDphLnNpemVEaWZmLmhlaWdodDtmPXt3aWR0aDphLnNpemUud2lkdGgtKGY/MDphLnNpemVEaWZmLndpZHRoKSxoZWlnaHQ6YS5zaXplLmhlaWdodC1nfTtnPXBhcnNlSW50KGEuZWxlbWVudC5jc3MoImxlZnQiKSwxMCkrKGEucG9zaXRpb24ubGVmdC0KYS5vcmlnaW5hbFBvc2l0aW9uLmxlZnQpfHxudWxsO3ZhciBoPXBhcnNlSW50KGEuZWxlbWVudC5jc3MoInRvcCIpLDEwKSsoYS5wb3NpdGlvbi50b3AtYS5vcmlnaW5hbFBvc2l0aW9uLnRvcCl8fG51bGw7YS5lbGVtZW50LmFuaW1hdGUoZS5leHRlbmQoZixoJiZnP3t0b3A6aCxsZWZ0Omd9Ont9KSx7ZHVyYXRpb246Yy5hbmltYXRlRHVyYXRpb24sZWFzaW5nOmMuYW5pbWF0ZUVhc2luZyxzdGVwOmZ1bmN0aW9uKCl7dmFyIGk9e3dpZHRoOnBhcnNlSW50KGEuZWxlbWVudC5jc3MoIndpZHRoIiksMTApLGhlaWdodDpwYXJzZUludChhLmVsZW1lbnQuY3NzKCJoZWlnaHQiKSwxMCksdG9wOnBhcnNlSW50KGEuZWxlbWVudC5jc3MoInRvcCIpLDEwKSxsZWZ0OnBhcnNlSW50KGEuZWxlbWVudC5jc3MoImxlZnQiKSwxMCl9O2QmJmQubGVuZ3RoJiZlKGRbMF0pLmNzcyh7d2lkdGg6aS53aWR0aCxoZWlnaHQ6aS5oZWlnaHR9KTthLl91cGRhdGVDYWNoZShpKTthLl9wcm9wYWdhdGUoInJlc2l6ZSIsCmIpfX0pfX0pO2UudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiY29udGFpbm1lbnQiLHtzdGFydDpmdW5jdGlvbigpe3ZhciBiPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksYT1iLmVsZW1lbnQsYz1iLm9wdGlvbnMuY29udGFpbm1lbnQ7aWYoYT1jIGluc3RhbmNlb2YgZT9jLmdldCgwKTovcGFyZW50Ly50ZXN0KGMpP2EucGFyZW50KCkuZ2V0KDApOmMpe2IuY29udGFpbmVyRWxlbWVudD1lKGEpO2lmKC9kb2N1bWVudC8udGVzdChjKXx8Yz09ZG9jdW1lbnQpe2IuY29udGFpbmVyT2Zmc2V0PXtsZWZ0OjAsdG9wOjB9O2IuY29udGFpbmVyUG9zaXRpb249e2xlZnQ6MCx0b3A6MH07Yi5wYXJlbnREYXRhPXtlbGVtZW50OmUoZG9jdW1lbnQpLGxlZnQ6MCx0b3A6MCx3aWR0aDplKGRvY3VtZW50KS53aWR0aCgpLGhlaWdodDplKGRvY3VtZW50KS5oZWlnaHQoKXx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodH19ZWxzZXt2YXIgZD1lKGEpLGY9W107ZShbIlRvcCIsCiJSaWdodCIsIkxlZnQiLCJCb3R0b20iXSkuZWFjaChmdW5jdGlvbihpLGope2ZbaV09bShkLmNzcygicGFkZGluZyIraikpfSk7Yi5jb250YWluZXJPZmZzZXQ9ZC5vZmZzZXQoKTtiLmNvbnRhaW5lclBvc2l0aW9uPWQucG9zaXRpb24oKTtiLmNvbnRhaW5lclNpemU9e2hlaWdodDpkLmlubmVySGVpZ2h0KCktZlszXSx3aWR0aDpkLmlubmVyV2lkdGgoKS1mWzFdfTtjPWIuY29udGFpbmVyT2Zmc2V0O3ZhciBnPWIuY29udGFpbmVyU2l6ZS5oZWlnaHQsaD1iLmNvbnRhaW5lclNpemUud2lkdGg7aD1lLnVpLmhhc1Njcm9sbChhLCJsZWZ0Iik/YS5zY3JvbGxXaWR0aDpoO2c9ZS51aS5oYXNTY3JvbGwoYSk/YS5zY3JvbGxIZWlnaHQ6ZztiLnBhcmVudERhdGE9e2VsZW1lbnQ6YSxsZWZ0OmMubGVmdCx0b3A6Yy50b3Asd2lkdGg6aCxoZWlnaHQ6Z319fX0scmVzaXplOmZ1bmN0aW9uKGIpe3ZhciBhPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksYz1hLm9wdGlvbnMsZD1hLmNvbnRhaW5lck9mZnNldCwKZj1hLnBvc2l0aW9uO2I9YS5fYXNwZWN0UmF0aW98fGIuc2hpZnRLZXk7dmFyIGc9e3RvcDowLGxlZnQ6MH0saD1hLmNvbnRhaW5lckVsZW1lbnQ7aWYoaFswXSE9ZG9jdW1lbnQmJi9zdGF0aWMvLnRlc3QoaC5jc3MoInBvc2l0aW9uIikpKWc9ZDtpZihmLmxlZnQ8KGEuX2hlbHBlcj9kLmxlZnQ6MCkpe2Euc2l6ZS53aWR0aCs9YS5faGVscGVyP2EucG9zaXRpb24ubGVmdC1kLmxlZnQ6YS5wb3NpdGlvbi5sZWZ0LWcubGVmdDtpZihiKWEuc2l6ZS5oZWlnaHQ9YS5zaXplLndpZHRoL2MuYXNwZWN0UmF0aW87YS5wb3NpdGlvbi5sZWZ0PWMuaGVscGVyP2QubGVmdDowfWlmKGYudG9wPChhLl9oZWxwZXI/ZC50b3A6MCkpe2Euc2l6ZS5oZWlnaHQrPWEuX2hlbHBlcj9hLnBvc2l0aW9uLnRvcC1kLnRvcDphLnBvc2l0aW9uLnRvcDtpZihiKWEuc2l6ZS53aWR0aD1hLnNpemUuaGVpZ2h0KmMuYXNwZWN0UmF0aW87YS5wb3NpdGlvbi50b3A9YS5faGVscGVyP2QudG9wOjB9YS5vZmZzZXQubGVmdD0KYS5wYXJlbnREYXRhLmxlZnQrYS5wb3NpdGlvbi5sZWZ0O2Eub2Zmc2V0LnRvcD1hLnBhcmVudERhdGEudG9wK2EucG9zaXRpb24udG9wO2M9TWF0aC5hYnMoKGEuX2hlbHBlcj9hLm9mZnNldC5sZWZ0LWcubGVmdDphLm9mZnNldC5sZWZ0LWcubGVmdCkrYS5zaXplRGlmZi53aWR0aCk7ZD1NYXRoLmFicygoYS5faGVscGVyP2Eub2Zmc2V0LnRvcC1nLnRvcDphLm9mZnNldC50b3AtZC50b3ApK2Euc2l6ZURpZmYuaGVpZ2h0KTtmPWEuY29udGFpbmVyRWxlbWVudC5nZXQoMCk9PWEuZWxlbWVudC5wYXJlbnQoKS5nZXQoMCk7Zz0vcmVsYXRpdmV8YWJzb2x1dGUvLnRlc3QoYS5jb250YWluZXJFbGVtZW50LmNzcygicG9zaXRpb24iKSk7aWYoZiYmZyljLT1hLnBhcmVudERhdGEubGVmdDtpZihjK2Euc2l6ZS53aWR0aD49YS5wYXJlbnREYXRhLndpZHRoKXthLnNpemUud2lkdGg9YS5wYXJlbnREYXRhLndpZHRoLWM7aWYoYilhLnNpemUuaGVpZ2h0PWEuc2l6ZS53aWR0aC9hLmFzcGVjdFJhdGlvfWlmKGQrCmEuc2l6ZS5oZWlnaHQ+PWEucGFyZW50RGF0YS5oZWlnaHQpe2Euc2l6ZS5oZWlnaHQ9YS5wYXJlbnREYXRhLmhlaWdodC1kO2lmKGIpYS5zaXplLndpZHRoPWEuc2l6ZS5oZWlnaHQqYS5hc3BlY3RSYXRpb319LHN0b3A6ZnVuY3Rpb24oKXt2YXIgYj1lKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGE9Yi5vcHRpb25zLGM9Yi5jb250YWluZXJPZmZzZXQsZD1iLmNvbnRhaW5lclBvc2l0aW9uLGY9Yi5jb250YWluZXJFbGVtZW50LGc9ZShiLmhlbHBlciksaD1nLm9mZnNldCgpLGk9Zy5vdXRlcldpZHRoKCktYi5zaXplRGlmZi53aWR0aDtnPWcub3V0ZXJIZWlnaHQoKS1iLnNpemVEaWZmLmhlaWdodDtiLl9oZWxwZXImJiFhLmFuaW1hdGUmJi9yZWxhdGl2ZS8udGVzdChmLmNzcygicG9zaXRpb24iKSkmJmUodGhpcykuY3NzKHtsZWZ0OmgubGVmdC1kLmxlZnQtYy5sZWZ0LHdpZHRoOmksaGVpZ2h0Omd9KTtiLl9oZWxwZXImJiFhLmFuaW1hdGUmJi9zdGF0aWMvLnRlc3QoZi5jc3MoInBvc2l0aW9uIikpJiYKZSh0aGlzKS5jc3Moe2xlZnQ6aC5sZWZ0LWQubGVmdC1jLmxlZnQsd2lkdGg6aSxoZWlnaHQ6Z30pfX0pO2UudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiZ2hvc3QiLHtzdGFydDpmdW5jdGlvbigpe3ZhciBiPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksYT1iLm9wdGlvbnMsYz1iLnNpemU7Yi5naG9zdD1iLm9yaWdpbmFsRWxlbWVudC5jbG9uZSgpO2IuZ2hvc3QuY3NzKHtvcGFjaXR5OjAuMjUsZGlzcGxheToiYmxvY2siLHBvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OmMuaGVpZ2h0LHdpZHRoOmMud2lkdGgsbWFyZ2luOjAsbGVmdDowLHRvcDowfSkuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1naG9zdCIpLmFkZENsYXNzKHR5cGVvZiBhLmdob3N0PT0ic3RyaW5nIj9hLmdob3N0OiIiKTtiLmdob3N0LmFwcGVuZFRvKGIuaGVscGVyKX0scmVzaXplOmZ1bmN0aW9uKCl7dmFyIGI9ZSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKTtiLmdob3N0JiZiLmdob3N0LmNzcyh7cG9zaXRpb246InJlbGF0aXZlIiwKaGVpZ2h0OmIuc2l6ZS5oZWlnaHQsd2lkdGg6Yi5zaXplLndpZHRofSl9LHN0b3A6ZnVuY3Rpb24oKXt2YXIgYj1lKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpO2IuZ2hvc3QmJmIuaGVscGVyJiZiLmhlbHBlci5nZXQoMCkucmVtb3ZlQ2hpbGQoYi5naG9zdC5nZXQoMCkpfX0pO2UudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiZ3JpZCIse3Jlc2l6ZTpmdW5jdGlvbigpe3ZhciBiPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksYT1iLm9wdGlvbnMsYz1iLnNpemUsZD1iLm9yaWdpbmFsU2l6ZSxmPWIub3JpZ2luYWxQb3NpdGlvbixnPWIuYXhpczthLmdyaWQ9dHlwZW9mIGEuZ3JpZD09Im51bWJlciI/W2EuZ3JpZCxhLmdyaWRdOmEuZ3JpZDt2YXIgaD1NYXRoLnJvdW5kKChjLndpZHRoLWQud2lkdGgpLyhhLmdyaWRbMF18fDEpKSooYS5ncmlkWzBdfHwxKTthPU1hdGgucm91bmQoKGMuaGVpZ2h0LWQuaGVpZ2h0KS8oYS5ncmlkWzFdfHwxKSkqKGEuZ3JpZFsxXXx8MSk7aWYoL14oc2V8c3xlKSQvLnRlc3QoZykpe2Iuc2l6ZS53aWR0aD0KZC53aWR0aCtoO2Iuc2l6ZS5oZWlnaHQ9ZC5oZWlnaHQrYX1lbHNlIGlmKC9eKG5lKSQvLnRlc3QoZykpe2Iuc2l6ZS53aWR0aD1kLndpZHRoK2g7Yi5zaXplLmhlaWdodD1kLmhlaWdodCthO2IucG9zaXRpb24udG9wPWYudG9wLWF9ZWxzZXtpZigvXihzdykkLy50ZXN0KGcpKXtiLnNpemUud2lkdGg9ZC53aWR0aCtoO2Iuc2l6ZS5oZWlnaHQ9ZC5oZWlnaHQrYX1lbHNle2Iuc2l6ZS53aWR0aD1kLndpZHRoK2g7Yi5zaXplLmhlaWdodD1kLmhlaWdodCthO2IucG9zaXRpb24udG9wPWYudG9wLWF9Yi5wb3NpdGlvbi5sZWZ0PWYubGVmdC1ofX19KTt2YXIgbT1mdW5jdGlvbihiKXtyZXR1cm4gcGFyc2VJbnQoYiwxMCl8fDB9LGw9ZnVuY3Rpb24oYil7cmV0dXJuIWlzTmFOKHBhcnNlSW50KGIsMTApKX19KShqUXVlcnkpOwo7LyoKICogalF1ZXJ5IFVJIFNlbGVjdGFibGUgMS44LjUKICoKICogQ29weXJpZ2h0IDIwMTAsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1NlbGVjdGFibGVzCiAqCiAqIERlcGVuZHM6CiAqCWpxdWVyeS51aS5jb3JlLmpzCiAqCWpxdWVyeS51aS5tb3VzZS5qcwogKglqcXVlcnkudWkud2lkZ2V0LmpzCiAqLwooZnVuY3Rpb24oZSl7ZS53aWRnZXQoInVpLnNlbGVjdGFibGUiLGUudWkubW91c2Use29wdGlvbnM6e2FwcGVuZFRvOiJib2R5IixhdXRvUmVmcmVzaDp0cnVlLGRpc3RhbmNlOjAsZmlsdGVyOiIqIix0b2xlcmFuY2U6InRvdWNoIn0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBjPXRoaXM7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RhYmxlIik7dGhpcy5kcmFnZ2VkPWZhbHNlO3ZhciBmO3RoaXMucmVmcmVzaD1mdW5jdGlvbigpe2Y9ZShjLm9wdGlvbnMuZmlsdGVyLGMuZWxlbWVudFswXSk7Zi5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9ZSh0aGlzKSxiPWQub2Zmc2V0KCk7ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIse2VsZW1lbnQ6dGhpcywkZWxlbWVudDpkLGxlZnQ6Yi5sZWZ0LHRvcDpiLnRvcCxyaWdodDpiLmxlZnQrZC5vdXRlcldpZHRoKCksYm90dG9tOmIudG9wK2Qub3V0ZXJIZWlnaHQoKSxzdGFydHNlbGVjdGVkOmZhbHNlLHNlbGVjdGVkOmQuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIiksCnNlbGVjdGluZzpkLmhhc0NsYXNzKCJ1aS1zZWxlY3RpbmciKSx1bnNlbGVjdGluZzpkLmhhc0NsYXNzKCJ1aS11bnNlbGVjdGluZyIpfSl9KX07dGhpcy5yZWZyZXNoKCk7dGhpcy5zZWxlY3RlZXM9Zi5hZGRDbGFzcygidWktc2VsZWN0ZWUiKTt0aGlzLl9tb3VzZUluaXQoKTt0aGlzLmhlbHBlcj1lKCI8ZGl2IGNsYXNzPSd1aS1zZWxlY3RhYmxlLWhlbHBlcic+PC9kaXY+Iil9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVlcy5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWUiKS5yZW1vdmVEYXRhKCJzZWxlY3RhYmxlLWl0ZW0iKTt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGFibGUgdWktc2VsZWN0YWJsZS1kaXNhYmxlZCIpLnJlbW92ZURhdGEoInNlbGVjdGFibGUiKS51bmJpbmQoIi5zZWxlY3RhYmxlIik7dGhpcy5fbW91c2VEZXN0cm95KCk7cmV0dXJuIHRoaXN9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKGMpe3ZhciBmPXRoaXM7dGhpcy5vcG9zPVtjLnBhZ2VYLApjLnBhZ2VZXTtpZighdGhpcy5vcHRpb25zLmRpc2FibGVkKXt2YXIgZD10aGlzLm9wdGlvbnM7dGhpcy5zZWxlY3RlZXM9ZShkLmZpbHRlcix0aGlzLmVsZW1lbnRbMF0pO3RoaXMuX3RyaWdnZXIoInN0YXJ0IixjKTtlKGQuYXBwZW5kVG8pLmFwcGVuZCh0aGlzLmhlbHBlcik7dGhpcy5oZWxwZXIuY3NzKHtsZWZ0OmMuY2xpZW50WCx0b3A6Yy5jbGllbnRZLHdpZHRoOjAsaGVpZ2h0OjB9KTtkLmF1dG9SZWZyZXNoJiZ0aGlzLnJlZnJlc2goKTt0aGlzLnNlbGVjdGVlcy5maWx0ZXIoIi51aS1zZWxlY3RlZCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1lLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7Yi5zdGFydHNlbGVjdGVkPXRydWU7aWYoIWMubWV0YUtleSl7Yi4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKTtiLnNlbGVjdGVkPWZhbHNlO2IuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIik7Yi51bnNlbGVjdGluZz10cnVlO2YuX3RyaWdnZXIoInVuc2VsZWN0aW5nIiwKYyx7dW5zZWxlY3Rpbmc6Yi5lbGVtZW50fSl9fSk7ZShjLnRhcmdldCkucGFyZW50cygpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO2lmKGIpe3ZhciBnPSFjLm1ldGFLZXl8fCFiLiRlbGVtZW50Lmhhc0NsYXNzKCJ1aS1zZWxlY3RlZCIpO2IuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoZz8idWktdW5zZWxlY3RpbmciOiJ1aS1zZWxlY3RlZCIpLmFkZENsYXNzKGc/InVpLXNlbGVjdGluZyI6InVpLXVuc2VsZWN0aW5nIik7Yi51bnNlbGVjdGluZz0hZztiLnNlbGVjdGluZz1nOyhiLnNlbGVjdGVkPWcpP2YuX3RyaWdnZXIoInNlbGVjdGluZyIsYyx7c2VsZWN0aW5nOmIuZWxlbWVudH0pOmYuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixjLHt1bnNlbGVjdGluZzpiLmVsZW1lbnR9KTtyZXR1cm4gZmFsc2V9fSl9fSxfbW91c2VEcmFnOmZ1bmN0aW9uKGMpe3ZhciBmPXRoaXM7dGhpcy5kcmFnZ2VkPXRydWU7aWYoIXRoaXMub3B0aW9ucy5kaXNhYmxlZCl7dmFyIGQ9CnRoaXMub3B0aW9ucyxiPXRoaXMub3Bvc1swXSxnPXRoaXMub3Bvc1sxXSxoPWMucGFnZVgsaT1jLnBhZ2VZO2lmKGI+aCl7dmFyIGo9aDtoPWI7Yj1qfWlmKGc+aSl7aj1pO2k9ZztnPWp9dGhpcy5oZWxwZXIuY3NzKHtsZWZ0OmIsdG9wOmcsd2lkdGg6aC1iLGhlaWdodDppLWd9KTt0aGlzLnNlbGVjdGVlcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGE9ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO2lmKCEoIWF8fGEuZWxlbWVudD09Zi5lbGVtZW50WzBdKSl7dmFyIGs9ZmFsc2U7aWYoZC50b2xlcmFuY2U9PSJ0b3VjaCIpaz0hKGEubGVmdD5ofHxhLnJpZ2h0PGJ8fGEudG9wPml8fGEuYm90dG9tPGcpO2Vsc2UgaWYoZC50b2xlcmFuY2U9PSJmaXQiKWs9YS5sZWZ0PmImJmEucmlnaHQ8aCYmYS50b3A+ZyYmYS5ib3R0b208aTtpZihrKXtpZihhLnNlbGVjdGVkKXthLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpO2Euc2VsZWN0ZWQ9ZmFsc2V9aWYoYS51bnNlbGVjdGluZyl7YS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktdW5zZWxlY3RpbmciKTsKYS51bnNlbGVjdGluZz1mYWxzZX1pZighYS5zZWxlY3Rpbmcpe2EuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXNlbGVjdGluZyIpO2Euc2VsZWN0aW5nPXRydWU7Zi5fdHJpZ2dlcigic2VsZWN0aW5nIixjLHtzZWxlY3Rpbmc6YS5lbGVtZW50fSl9fWVsc2V7aWYoYS5zZWxlY3RpbmcpaWYoYy5tZXRhS2V5JiZhLnN0YXJ0c2VsZWN0ZWQpe2EuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGluZyIpO2Euc2VsZWN0aW5nPWZhbHNlO2EuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXNlbGVjdGVkIik7YS5zZWxlY3RlZD10cnVlfWVsc2V7YS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0aW5nIik7YS5zZWxlY3Rpbmc9ZmFsc2U7aWYoYS5zdGFydHNlbGVjdGVkKXthLiRlbGVtZW50LmFkZENsYXNzKCJ1aS11bnNlbGVjdGluZyIpO2EudW5zZWxlY3Rpbmc9dHJ1ZX1mLl90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsYyx7dW5zZWxlY3Rpbmc6YS5lbGVtZW50fSl9aWYoYS5zZWxlY3RlZClpZighYy5tZXRhS2V5JiYKIWEuc3RhcnRzZWxlY3RlZCl7YS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKTthLnNlbGVjdGVkPWZhbHNlO2EuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIik7YS51bnNlbGVjdGluZz10cnVlO2YuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixjLHt1bnNlbGVjdGluZzphLmVsZW1lbnR9KX19fX0pO3JldHVybiBmYWxzZX19LF9tb3VzZVN0b3A6ZnVuY3Rpb24oYyl7dmFyIGY9dGhpczt0aGlzLmRyYWdnZWQ9ZmFsc2U7ZSgiLnVpLXVuc2VsZWN0aW5nIix0aGlzLmVsZW1lbnRbMF0pLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1lLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7ZC4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktdW5zZWxlY3RpbmciKTtkLnVuc2VsZWN0aW5nPWZhbHNlO2Quc3RhcnRzZWxlY3RlZD1mYWxzZTtmLl90cmlnZ2VyKCJ1bnNlbGVjdGVkIixjLHt1bnNlbGVjdGVkOmQuZWxlbWVudH0pfSk7ZSgiLnVpLXNlbGVjdGluZyIsdGhpcy5lbGVtZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9CmUuZGF0YSh0aGlzLCJzZWxlY3RhYmxlLWl0ZW0iKTtkLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKS5hZGRDbGFzcygidWktc2VsZWN0ZWQiKTtkLnNlbGVjdGluZz1mYWxzZTtkLnNlbGVjdGVkPXRydWU7ZC5zdGFydHNlbGVjdGVkPXRydWU7Zi5fdHJpZ2dlcigic2VsZWN0ZWQiLGMse3NlbGVjdGVkOmQuZWxlbWVudH0pfSk7dGhpcy5fdHJpZ2dlcigic3RvcCIsYyk7dGhpcy5oZWxwZXIucmVtb3ZlKCk7cmV0dXJuIGZhbHNlfX0pO2UuZXh0ZW5kKGUudWkuc2VsZWN0YWJsZSx7dmVyc2lvbjoiMS44LjUifSl9KShqUXVlcnkpOwo7LyoKICogalF1ZXJ5IFVJIERpYWxvZyAxLjguNQogKgogKiBDb3B5cmlnaHQgMjAxMCwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRGlhbG9nCiAqCiAqIERlcGVuZHM6CiAqCWpxdWVyeS51aS5jb3JlLmpzCiAqCWpxdWVyeS51aS53aWRnZXQuanMKICogIGpxdWVyeS51aS5idXR0b24uanMKICoJanF1ZXJ5LnVpLmRyYWdnYWJsZS5qcwogKglqcXVlcnkudWkubW91c2UuanMKICoJanF1ZXJ5LnVpLnBvc2l0aW9uLmpzCiAqCWpxdWVyeS51aS5yZXNpemFibGUuanMKICovCihmdW5jdGlvbihjLGope2Mud2lkZ2V0KCJ1aS5kaWFsb2ciLHtvcHRpb25zOnthdXRvT3Blbjp0cnVlLGJ1dHRvbnM6e30sY2xvc2VPbkVzY2FwZTp0cnVlLGNsb3NlVGV4dDoiY2xvc2UiLGRpYWxvZ0NsYXNzOiIiLGRyYWdnYWJsZTp0cnVlLGhpZGU6bnVsbCxoZWlnaHQ6ImF1dG8iLG1heEhlaWdodDpmYWxzZSxtYXhXaWR0aDpmYWxzZSxtaW5IZWlnaHQ6MTUwLG1pbldpZHRoOjE1MCxtb2RhbDpmYWxzZSxwb3NpdGlvbjp7bXk6ImNlbnRlciIsYXQ6ImNlbnRlciIsb2Y6d2luZG93LGNvbGxpc2lvbjoiZml0Iix1c2luZzpmdW5jdGlvbihhKXt2YXIgYj1jKHRoaXMpLmNzcyhhKS5vZmZzZXQoKS50b3A7YjwwJiZjKHRoaXMpLmNzcygidG9wIixhLnRvcC1iKX19LHJlc2l6YWJsZTp0cnVlLHNob3c6bnVsbCxzdGFjazp0cnVlLHRpdGxlOiIiLHdpZHRoOjMwMCx6SW5kZXg6MUUzfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcmlnaW5hbFRpdGxlPXRoaXMuZWxlbWVudC5hdHRyKCJ0aXRsZSIpOwppZih0eXBlb2YgdGhpcy5vcmlnaW5hbFRpdGxlIT09InN0cmluZyIpdGhpcy5vcmlnaW5hbFRpdGxlPSIiO3RoaXMub3B0aW9ucy50aXRsZT10aGlzLm9wdGlvbnMudGl0bGV8fHRoaXMub3JpZ2luYWxUaXRsZTt2YXIgYT10aGlzLGI9YS5vcHRpb25zLGQ9Yi50aXRsZXx8IiYjMTYwOyIsZj1jLnVpLmRpYWxvZy5nZXRUaXRsZUlkKGEuZWxlbWVudCksZz0oYS51aURpYWxvZz1jKCI8ZGl2PjwvZGl2PiIpKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5oaWRlKCkuYWRkQ2xhc3MoInVpLWRpYWxvZyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCAiK2IuZGlhbG9nQ2xhc3MpLmNzcyh7ekluZGV4OmIuekluZGV4fSkuYXR0cigidGFiSW5kZXgiLC0xKS5jc3MoIm91dGxpbmUiLDApLmtleWRvd24oZnVuY3Rpb24oaSl7aWYoYi5jbG9zZU9uRXNjYXBlJiZpLmtleUNvZGUmJmkua2V5Q29kZT09PWMudWkua2V5Q29kZS5FU0NBUEUpe2EuY2xvc2UoaSk7aS5wcmV2ZW50RGVmYXVsdCgpfX0pLmF0dHIoe3JvbGU6ImRpYWxvZyIsCiJhcmlhLWxhYmVsbGVkYnkiOmZ9KS5tb3VzZWRvd24oZnVuY3Rpb24oaSl7YS5tb3ZlVG9Ub3AoZmFsc2UsaSl9KTthLmVsZW1lbnQuc2hvdygpLnJlbW92ZUF0dHIoInRpdGxlIikuYWRkQ2xhc3MoInVpLWRpYWxvZy1jb250ZW50IHVpLXdpZGdldC1jb250ZW50IikuYXBwZW5kVG8oZyk7dmFyIGU9KGEudWlEaWFsb2dUaXRsZWJhcj1jKCI8ZGl2PjwvZGl2PiIpKS5hZGRDbGFzcygidWktZGlhbG9nLXRpdGxlYmFyIHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCB1aS1oZWxwZXItY2xlYXJmaXgiKS5wcmVwZW5kVG8oZyksaD1jKCc8YSBocmVmPSIjIj48L2E+JykuYWRkQ2xhc3MoInVpLWRpYWxvZy10aXRsZWJhci1jbG9zZSB1aS1jb3JuZXItYWxsIikuYXR0cigicm9sZSIsImJ1dHRvbiIpLmhvdmVyKGZ1bmN0aW9uKCl7aC5hZGRDbGFzcygidWktc3RhdGUtaG92ZXIiKX0sZnVuY3Rpb24oKXtoLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSkuZm9jdXMoZnVuY3Rpb24oKXtoLmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSkuYmx1cihmdW5jdGlvbigpe2gucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIil9KS5jbGljayhmdW5jdGlvbihpKXthLmNsb3NlKGkpOwpyZXR1cm4gZmFsc2V9KS5hcHBlbmRUbyhlKTsoYS51aURpYWxvZ1RpdGxlYmFyQ2xvc2VUZXh0PWMoIjxzcGFuPjwvc3Bhbj4iKSkuYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1jbG9zZXRoaWNrIikudGV4dChiLmNsb3NlVGV4dCkuYXBwZW5kVG8oaCk7YygiPHNwYW4+PC9zcGFuPiIpLmFkZENsYXNzKCJ1aS1kaWFsb2ctdGl0bGUiKS5hdHRyKCJpZCIsZikuaHRtbChkKS5wcmVwZW5kVG8oZSk7aWYoYy5pc0Z1bmN0aW9uKGIuYmVmb3JlY2xvc2UpJiYhYy5pc0Z1bmN0aW9uKGIuYmVmb3JlQ2xvc2UpKWIuYmVmb3JlQ2xvc2U9Yi5iZWZvcmVjbG9zZTtlLmZpbmQoIioiKS5hZGQoZSkuZGlzYWJsZVNlbGVjdGlvbigpO2IuZHJhZ2dhYmxlJiZjLmZuLmRyYWdnYWJsZSYmYS5fbWFrZURyYWdnYWJsZSgpO2IucmVzaXphYmxlJiZjLmZuLnJlc2l6YWJsZSYmYS5fbWFrZVJlc2l6YWJsZSgpO2EuX2NyZWF0ZUJ1dHRvbnMoYi5idXR0b25zKTthLl9pc09wZW49ZmFsc2U7Yy5mbi5iZ2lmcmFtZSYmCmcuYmdpZnJhbWUoKX0sX2luaXQ6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuYXV0b09wZW4mJnRoaXMub3BlbigpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLm92ZXJsYXkmJmEub3ZlcmxheS5kZXN0cm95KCk7YS51aURpYWxvZy5oaWRlKCk7YS5lbGVtZW50LnVuYmluZCgiLmRpYWxvZyIpLnJlbW92ZURhdGEoImRpYWxvZyIpLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctY29udGVudCB1aS13aWRnZXQtY29udGVudCIpLmhpZGUoKS5hcHBlbmRUbygiYm9keSIpO2EudWlEaWFsb2cucmVtb3ZlKCk7YS5vcmlnaW5hbFRpdGxlJiZhLmVsZW1lbnQuYXR0cigidGl0bGUiLGEub3JpZ2luYWxUaXRsZSk7cmV0dXJuIGF9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVpRGlhbG9nfSxjbG9zZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLGQ7aWYoZmFsc2UhPT1iLl90cmlnZ2VyKCJiZWZvcmVDbG9zZSIsYSkpe2Iub3ZlcmxheSYmYi5vdmVybGF5LmRlc3Ryb3koKTtiLnVpRGlhbG9nLnVuYmluZCgia2V5cHJlc3MudWktZGlhbG9nIik7CmIuX2lzT3Blbj1mYWxzZTtpZihiLm9wdGlvbnMuaGlkZSliLnVpRGlhbG9nLmhpZGUoYi5vcHRpb25zLmhpZGUsZnVuY3Rpb24oKXtiLl90cmlnZ2VyKCJjbG9zZSIsYSl9KTtlbHNle2IudWlEaWFsb2cuaGlkZSgpO2IuX3RyaWdnZXIoImNsb3NlIixhKX1jLnVpLmRpYWxvZy5vdmVybGF5LnJlc2l6ZSgpO2lmKGIub3B0aW9ucy5tb2RhbCl7ZD0wO2MoIi51aS1kaWFsb2ciKS5lYWNoKGZ1bmN0aW9uKCl7aWYodGhpcyE9PWIudWlEaWFsb2dbMF0pZD1NYXRoLm1heChkLGModGhpcykuY3NzKCJ6LWluZGV4IikpfSk7Yy51aS5kaWFsb2cubWF4Wj1kfXJldHVybiBifX0saXNPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzT3Blbn0sbW92ZVRvVG9wOmZ1bmN0aW9uKGEsYil7dmFyIGQ9dGhpcyxmPWQub3B0aW9ucztpZihmLm1vZGFsJiYhYXx8IWYuc3RhY2smJiFmLm1vZGFsKXJldHVybiBkLl90cmlnZ2VyKCJmb2N1cyIsYik7aWYoZi56SW5kZXg+Yy51aS5kaWFsb2cubWF4WiljLnVpLmRpYWxvZy5tYXhaPQpmLnpJbmRleDtpZihkLm92ZXJsYXkpe2MudWkuZGlhbG9nLm1heForPTE7ZC5vdmVybGF5LiRlbC5jc3MoInotaW5kZXgiLGMudWkuZGlhbG9nLm92ZXJsYXkubWF4Wj1jLnVpLmRpYWxvZy5tYXhaKX1hPXtzY3JvbGxUb3A6ZC5lbGVtZW50LmF0dHIoInNjcm9sbFRvcCIpLHNjcm9sbExlZnQ6ZC5lbGVtZW50LmF0dHIoInNjcm9sbExlZnQiKX07Yy51aS5kaWFsb2cubWF4Wis9MTtkLnVpRGlhbG9nLmNzcygiei1pbmRleCIsYy51aS5kaWFsb2cubWF4Wik7ZC5lbGVtZW50LmF0dHIoYSk7ZC5fdHJpZ2dlcigiZm9jdXMiLGIpO3JldHVybiBkfSxvcGVuOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2lzT3Blbil7dmFyIGE9dGhpcyxiPWEub3B0aW9ucyxkPWEudWlEaWFsb2c7YS5vdmVybGF5PWIubW9kYWw/bmV3IGMudWkuZGlhbG9nLm92ZXJsYXkoYSk6bnVsbDtkLm5leHQoKS5sZW5ndGgmJmQuYXBwZW5kVG8oImJvZHkiKTthLl9zaXplKCk7YS5fcG9zaXRpb24oYi5wb3NpdGlvbik7ZC5zaG93KGIuc2hvdyk7CmEubW92ZVRvVG9wKHRydWUpO2IubW9kYWwmJmQuYmluZCgia2V5cHJlc3MudWktZGlhbG9nIixmdW5jdGlvbihmKXtpZihmLmtleUNvZGU9PT1jLnVpLmtleUNvZGUuVEFCKXt2YXIgZz1jKCI6dGFiYmFibGUiLHRoaXMpLGU9Zy5maWx0ZXIoIjpmaXJzdCIpO2c9Zy5maWx0ZXIoIjpsYXN0Iik7aWYoZi50YXJnZXQ9PT1nWzBdJiYhZi5zaGlmdEtleSl7ZS5mb2N1cygxKTtyZXR1cm4gZmFsc2V9ZWxzZSBpZihmLnRhcmdldD09PWVbMF0mJmYuc2hpZnRLZXkpe2cuZm9jdXMoMSk7cmV0dXJuIGZhbHNlfX19KTtjKGEuZWxlbWVudC5maW5kKCI6dGFiYmFibGUiKS5nZXQoKS5jb25jYXQoZC5maW5kKCIudWktZGlhbG9nLWJ1dHRvbnBhbmUgOnRhYmJhYmxlIikuZ2V0KCkuY29uY2F0KGQuZ2V0KCkpKSkuZXEoMCkuZm9jdXMoKTthLl9pc09wZW49dHJ1ZTthLl90cmlnZ2VyKCJvcGVuIik7cmV0dXJuIGF9fSxfY3JlYXRlQnV0dG9uczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLGQ9ZmFsc2UsCmY9YygiPGRpdj48L2Rpdj4iKS5hZGRDbGFzcygidWktZGlhbG9nLWJ1dHRvbnBhbmUgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4IiksZz1jKCI8ZGl2PjwvZGl2PiIpLmFkZENsYXNzKCJ1aS1kaWFsb2ctYnV0dG9uc2V0IikuYXBwZW5kVG8oZik7Yi51aURpYWxvZy5maW5kKCIudWktZGlhbG9nLWJ1dHRvbnBhbmUiKS5yZW1vdmUoKTt0eXBlb2YgYT09PSJvYmplY3QiJiZhIT09bnVsbCYmYy5lYWNoKGEsZnVuY3Rpb24oKXtyZXR1cm4hKGQ9dHJ1ZSl9KTtpZihkKXtjLmVhY2goYSxmdW5jdGlvbihlLGgpe2g9Yy5pc0Z1bmN0aW9uKGgpP3tjbGljazpoLHRleHQ6ZX06aDtlPWMoIjxidXR0b24+PC9idXR0b24+IixoKS51bmJpbmQoImNsaWNrIikuY2xpY2soZnVuY3Rpb24oKXtoLmNsaWNrLmFwcGx5KGIuZWxlbWVudFswXSxhcmd1bWVudHMpfSkuYXBwZW5kVG8oZyk7Yy5mbi5idXR0b24mJmUuYnV0dG9uKCl9KTtmLmFwcGVuZFRvKGIudWlEaWFsb2cpfX0sX21ha2VEcmFnZ2FibGU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGUpe3JldHVybntwb3NpdGlvbjplLnBvc2l0aW9uLApvZmZzZXQ6ZS5vZmZzZXR9fXZhciBiPXRoaXMsZD1iLm9wdGlvbnMsZj1jKGRvY3VtZW50KSxnO2IudWlEaWFsb2cuZHJhZ2dhYmxlKHtjYW5jZWw6Ii51aS1kaWFsb2ctY29udGVudCwgLnVpLWRpYWxvZy10aXRsZWJhci1jbG9zZSIsaGFuZGxlOiIudWktZGlhbG9nLXRpdGxlYmFyIixjb250YWlubWVudDoiZG9jdW1lbnQiLHN0YXJ0OmZ1bmN0aW9uKGUsaCl7Zz1kLmhlaWdodD09PSJhdXRvIj8iYXV0byI6Yyh0aGlzKS5oZWlnaHQoKTtjKHRoaXMpLmhlaWdodChjKHRoaXMpLmhlaWdodCgpKS5hZGRDbGFzcygidWktZGlhbG9nLWRyYWdnaW5nIik7Yi5fdHJpZ2dlcigiZHJhZ1N0YXJ0IixlLGEoaCkpfSxkcmFnOmZ1bmN0aW9uKGUsaCl7Yi5fdHJpZ2dlcigiZHJhZyIsZSxhKGgpKX0sc3RvcDpmdW5jdGlvbihlLGgpe2QucG9zaXRpb249W2gucG9zaXRpb24ubGVmdC1mLnNjcm9sbExlZnQoKSxoLnBvc2l0aW9uLnRvcC1mLnNjcm9sbFRvcCgpXTtjKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctZHJhZ2dpbmciKS5oZWlnaHQoZyk7CmIuX3RyaWdnZXIoImRyYWdTdG9wIixlLGEoaCkpO2MudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKCl9fSl9LF9tYWtlUmVzaXphYmxlOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoZSl7cmV0dXJue29yaWdpbmFsUG9zaXRpb246ZS5vcmlnaW5hbFBvc2l0aW9uLG9yaWdpbmFsU2l6ZTplLm9yaWdpbmFsU2l6ZSxwb3NpdGlvbjplLnBvc2l0aW9uLHNpemU6ZS5zaXplfX1hPWE9PT1qP3RoaXMub3B0aW9ucy5yZXNpemFibGU6YTt2YXIgZD10aGlzLGY9ZC5vcHRpb25zLGc9ZC51aURpYWxvZy5jc3MoInBvc2l0aW9uIik7YT10eXBlb2YgYT09PSJzdHJpbmciP2E6Im4sZSxzLHcsc2Usc3csbmUsbnciO2QudWlEaWFsb2cucmVzaXphYmxlKHtjYW5jZWw6Ii51aS1kaWFsb2ctY29udGVudCIsY29udGFpbm1lbnQ6ImRvY3VtZW50IixhbHNvUmVzaXplOmQuZWxlbWVudCxtYXhXaWR0aDpmLm1heFdpZHRoLG1heEhlaWdodDpmLm1heEhlaWdodCxtaW5XaWR0aDpmLm1pbldpZHRoLG1pbkhlaWdodDpkLl9taW5IZWlnaHQoKSwKaGFuZGxlczphLHN0YXJ0OmZ1bmN0aW9uKGUsaCl7Yyh0aGlzKS5hZGRDbGFzcygidWktZGlhbG9nLXJlc2l6aW5nIik7ZC5fdHJpZ2dlcigicmVzaXplU3RhcnQiLGUsYihoKSl9LHJlc2l6ZTpmdW5jdGlvbihlLGgpe2QuX3RyaWdnZXIoInJlc2l6ZSIsZSxiKGgpKX0sc3RvcDpmdW5jdGlvbihlLGgpe2ModGhpcykucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1yZXNpemluZyIpO2YuaGVpZ2h0PWModGhpcykuaGVpZ2h0KCk7Zi53aWR0aD1jKHRoaXMpLndpZHRoKCk7ZC5fdHJpZ2dlcigicmVzaXplU3RvcCIsZSxiKGgpKTtjLnVpLmRpYWxvZy5vdmVybGF5LnJlc2l6ZSgpfX0pLmNzcygicG9zaXRpb24iLGcpLmZpbmQoIi51aS1yZXNpemFibGUtc2UiKS5hZGRDbGFzcygidWktaWNvbiB1aS1pY29uLWdyaXAtZGlhZ29uYWwtc2UiKX0sX21pbkhlaWdodDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucztyZXR1cm4gYS5oZWlnaHQ9PT0iYXV0byI/YS5taW5IZWlnaHQ6TWF0aC5taW4oYS5taW5IZWlnaHQsCmEuaGVpZ2h0KX0sX3Bvc2l0aW9uOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9WzAsMF0sZjtpZihhKXtpZih0eXBlb2YgYT09PSJzdHJpbmcifHx0eXBlb2YgYT09PSJvYmplY3QiJiYiMCJpbiBhKXtiPWEuc3BsaXQ/YS5zcGxpdCgiICIpOlthWzBdLGFbMV1dO2lmKGIubGVuZ3RoPT09MSliWzFdPWJbMF07Yy5lYWNoKFsibGVmdCIsInRvcCJdLGZ1bmN0aW9uKGcsZSl7aWYoK2JbZ109PT1iW2ddKXtkW2ddPWJbZ107YltnXT1lfX0pO2E9e215OmIuam9pbigiICIpLGF0OmIuam9pbigiICIpLG9mZnNldDpkLmpvaW4oIiAiKX19YT1jLmV4dGVuZCh7fSxjLnVpLmRpYWxvZy5wcm90b3R5cGUub3B0aW9ucy5wb3NpdGlvbixhKX1lbHNlIGE9Yy51aS5kaWFsb2cucHJvdG90eXBlLm9wdGlvbnMucG9zaXRpb247KGY9dGhpcy51aURpYWxvZy5pcygiOnZpc2libGUiKSl8fHRoaXMudWlEaWFsb2cuc2hvdygpO3RoaXMudWlEaWFsb2cuY3NzKHt0b3A6MCxsZWZ0OjB9KS5wb3NpdGlvbihhKTsKZnx8dGhpcy51aURpYWxvZy5oaWRlKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYSxiKXt2YXIgZD10aGlzLGY9ZC51aURpYWxvZyxnPWYuaXMoIjpkYXRhKHJlc2l6YWJsZSkiKSxlPWZhbHNlO3N3aXRjaChhKXtjYXNlICJiZWZvcmVjbG9zZSI6YT0iYmVmb3JlQ2xvc2UiO2JyZWFrO2Nhc2UgImJ1dHRvbnMiOmQuX2NyZWF0ZUJ1dHRvbnMoYik7ZT10cnVlO2JyZWFrO2Nhc2UgImNsb3NlVGV4dCI6ZC51aURpYWxvZ1RpdGxlYmFyQ2xvc2VUZXh0LnRleHQoIiIrYik7YnJlYWs7Y2FzZSAiZGlhbG9nQ2xhc3MiOmYucmVtb3ZlQ2xhc3MoZC5vcHRpb25zLmRpYWxvZ0NsYXNzKS5hZGRDbGFzcygidWktZGlhbG9nIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsICIrYik7YnJlYWs7Y2FzZSAiZGlzYWJsZWQiOmI/Zi5hZGRDbGFzcygidWktZGlhbG9nLWRpc2FibGVkIik6Zi5yZW1vdmVDbGFzcygidWktZGlhbG9nLWRpc2FibGVkIik7YnJlYWs7Y2FzZSAiZHJhZ2dhYmxlIjpiPwpkLl9tYWtlRHJhZ2dhYmxlKCk6Zi5kcmFnZ2FibGUoImRlc3Ryb3kiKTticmVhaztjYXNlICJoZWlnaHQiOmU9dHJ1ZTticmVhaztjYXNlICJtYXhIZWlnaHQiOmcmJmYucmVzaXphYmxlKCJvcHRpb24iLCJtYXhIZWlnaHQiLGIpO2U9dHJ1ZTticmVhaztjYXNlICJtYXhXaWR0aCI6ZyYmZi5yZXNpemFibGUoIm9wdGlvbiIsIm1heFdpZHRoIixiKTtlPXRydWU7YnJlYWs7Y2FzZSAibWluSGVpZ2h0IjpnJiZmLnJlc2l6YWJsZSgib3B0aW9uIiwibWluSGVpZ2h0IixiKTtlPXRydWU7YnJlYWs7Y2FzZSAibWluV2lkdGgiOmcmJmYucmVzaXphYmxlKCJvcHRpb24iLCJtaW5XaWR0aCIsYik7ZT10cnVlO2JyZWFrO2Nhc2UgInBvc2l0aW9uIjpkLl9wb3NpdGlvbihiKTticmVhaztjYXNlICJyZXNpemFibGUiOmcmJiFiJiZmLnJlc2l6YWJsZSgiZGVzdHJveSIpO2cmJnR5cGVvZiBiPT09InN0cmluZyImJmYucmVzaXphYmxlKCJvcHRpb24iLCJoYW5kbGVzIixiKTshZyYmYiE9PWZhbHNlJiYKZC5fbWFrZVJlc2l6YWJsZShiKTticmVhaztjYXNlICJ0aXRsZSI6YygiLnVpLWRpYWxvZy10aXRsZSIsZC51aURpYWxvZ1RpdGxlYmFyKS5odG1sKCIiKyhifHwiJiMxNjA7IikpO2JyZWFrO2Nhc2UgIndpZHRoIjplPXRydWU7YnJlYWt9Yy5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkoZCxhcmd1bWVudHMpO2UmJmQuX3NpemUoKX0sX3NpemU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMsYjt0aGlzLmVsZW1lbnQuY3NzKHt3aWR0aDoiYXV0byIsbWluSGVpZ2h0OjAsaGVpZ2h0OjB9KTtpZihhLm1pbldpZHRoPmEud2lkdGgpYS53aWR0aD1hLm1pbldpZHRoO2I9dGhpcy51aURpYWxvZy5jc3Moe2hlaWdodDoiYXV0byIsd2lkdGg6YS53aWR0aH0pLmhlaWdodCgpO3RoaXMuZWxlbWVudC5jc3MoYS5oZWlnaHQ9PT0iYXV0byI/e21pbkhlaWdodDpNYXRoLm1heChhLm1pbkhlaWdodC1iLDApLGhlaWdodDpjLnN1cHBvcnQubWluSGVpZ2h0PyJhdXRvIjpNYXRoLm1heChhLm1pbkhlaWdodC0KYiwwKX06e21pbkhlaWdodDowLGhlaWdodDpNYXRoLm1heChhLmhlaWdodC1iLDApfSkuc2hvdygpO3RoaXMudWlEaWFsb2cuaXMoIjpkYXRhKHJlc2l6YWJsZSkiKSYmdGhpcy51aURpYWxvZy5yZXNpemFibGUoIm9wdGlvbiIsIm1pbkhlaWdodCIsdGhpcy5fbWluSGVpZ2h0KCkpfX0pO2MuZXh0ZW5kKGMudWkuZGlhbG9nLHt2ZXJzaW9uOiIxLjguNSIsdXVpZDowLG1heFo6MCxnZXRUaXRsZUlkOmZ1bmN0aW9uKGEpe2E9YS5hdHRyKCJpZCIpO2lmKCFhKXt0aGlzLnV1aWQrPTE7YT10aGlzLnV1aWR9cmV0dXJuInVpLWRpYWxvZy10aXRsZS0iK2F9LG92ZXJsYXk6ZnVuY3Rpb24oYSl7dGhpcy4kZWw9Yy51aS5kaWFsb2cub3ZlcmxheS5jcmVhdGUoYSl9fSk7Yy5leHRlbmQoYy51aS5kaWFsb2cub3ZlcmxheSx7aW5zdGFuY2VzOltdLG9sZEluc3RhbmNlczpbXSxtYXhaOjAsZXZlbnRzOmMubWFwKCJmb2N1cyxtb3VzZWRvd24sbW91c2V1cCxrZXlkb3duLGtleXByZXNzLGNsaWNrIi5zcGxpdCgiLCIpLApmdW5jdGlvbihhKXtyZXR1cm4gYSsiLmRpYWxvZy1vdmVybGF5In0pLmpvaW4oIiAiKSxjcmVhdGU6ZnVuY3Rpb24oYSl7aWYodGhpcy5pbnN0YW5jZXMubGVuZ3RoPT09MCl7c2V0VGltZW91dChmdW5jdGlvbigpe2MudWkuZGlhbG9nLm92ZXJsYXkuaW5zdGFuY2VzLmxlbmd0aCYmYyhkb2N1bWVudCkuYmluZChjLnVpLmRpYWxvZy5vdmVybGF5LmV2ZW50cyxmdW5jdGlvbihkKXtpZihjKGQudGFyZ2V0KS56SW5kZXgoKTxjLnVpLmRpYWxvZy5vdmVybGF5Lm1heFopcmV0dXJuIGZhbHNlfSl9LDEpO2MoZG9jdW1lbnQpLmJpbmQoImtleWRvd24uZGlhbG9nLW92ZXJsYXkiLGZ1bmN0aW9uKGQpe2lmKGEub3B0aW9ucy5jbG9zZU9uRXNjYXBlJiZkLmtleUNvZGUmJmQua2V5Q29kZT09PWMudWkua2V5Q29kZS5FU0NBUEUpe2EuY2xvc2UoZCk7ZC5wcmV2ZW50RGVmYXVsdCgpfX0pO2Mod2luZG93KS5iaW5kKCJyZXNpemUuZGlhbG9nLW92ZXJsYXkiLGMudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKX12YXIgYj0KKHRoaXMub2xkSW5zdGFuY2VzLnBvcCgpfHxjKCI8ZGl2PjwvZGl2PiIpLmFkZENsYXNzKCJ1aS13aWRnZXQtb3ZlcmxheSIpKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5jc3Moe3dpZHRoOnRoaXMud2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWlnaHQoKX0pO2MuZm4uYmdpZnJhbWUmJmIuYmdpZnJhbWUoKTt0aGlzLmluc3RhbmNlcy5wdXNoKGIpO3JldHVybiBifSxkZXN0cm95OmZ1bmN0aW9uKGEpe3RoaXMub2xkSW5zdGFuY2VzLnB1c2godGhpcy5pbnN0YW5jZXMuc3BsaWNlKGMuaW5BcnJheShhLHRoaXMuaW5zdGFuY2VzKSwxKVswXSk7dGhpcy5pbnN0YW5jZXMubGVuZ3RoPT09MCYmYyhbZG9jdW1lbnQsd2luZG93XSkudW5iaW5kKCIuZGlhbG9nLW92ZXJsYXkiKTthLnJlbW92ZSgpO3ZhciBiPTA7Yy5lYWNoKHRoaXMuaW5zdGFuY2VzLGZ1bmN0aW9uKCl7Yj1NYXRoLm1heChiLHRoaXMuY3NzKCJ6LWluZGV4IikpfSk7dGhpcy5tYXhaPWJ9LGhlaWdodDpmdW5jdGlvbigpe3ZhciBhLApiO2lmKGMuYnJvd3Nlci5tc2llJiZjLmJyb3dzZXIudmVyc2lvbjw3KXthPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpO2I9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldEhlaWdodCxkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCk7cmV0dXJuIGE8Yj9jKHdpbmRvdykuaGVpZ2h0KCkrInB4IjphKyJweCJ9ZWxzZSByZXR1cm4gYyhkb2N1bWVudCkuaGVpZ2h0KCkrInB4In0sd2lkdGg6ZnVuY3Rpb24oKXt2YXIgYSxiO2lmKGMuYnJvd3Nlci5tc2llJiZjLmJyb3dzZXIudmVyc2lvbjw3KXthPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCxkb2N1bWVudC5ib2R5LnNjcm9sbFdpZHRoKTtiPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRXaWR0aCxkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoKTtyZXR1cm4gYTwKYj9jKHdpbmRvdykud2lkdGgoKSsicHgiOmErInB4In1lbHNlIHJldHVybiBjKGRvY3VtZW50KS53aWR0aCgpKyJweCJ9LHJlc2l6ZTpmdW5jdGlvbigpe3ZhciBhPWMoW10pO2MuZWFjaChjLnVpLmRpYWxvZy5vdmVybGF5Lmluc3RhbmNlcyxmdW5jdGlvbigpe2E9YS5hZGQodGhpcyl9KTthLmNzcyh7d2lkdGg6MCxoZWlnaHQ6MH0pLmNzcyh7d2lkdGg6Yy51aS5kaWFsb2cub3ZlcmxheS53aWR0aCgpLGhlaWdodDpjLnVpLmRpYWxvZy5vdmVybGF5LmhlaWdodCgpfSl9fSk7Yy5leHRlbmQoYy51aS5kaWFsb2cub3ZlcmxheS5wcm90b3R5cGUse2Rlc3Ryb3k6ZnVuY3Rpb24oKXtjLnVpLmRpYWxvZy5vdmVybGF5LmRlc3Ryb3kodGhpcy4kZWwpfX0pfSkoalF1ZXJ5KTsKOy8qCiAqIGpRdWVyeSBVSSBUYWJzIDEuOC41CiAqCiAqIENvcHlyaWdodCAyMDEwLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9UYWJzCiAqCiAqIERlcGVuZHM6CiAqCWpxdWVyeS51aS5jb3JlLmpzCiAqCWpxdWVyeS51aS53aWRnZXQuanMKICovCihmdW5jdGlvbihkLHApe2Z1bmN0aW9uIHUoKXtyZXR1cm4rK3Z9ZnVuY3Rpb24gdygpe3JldHVybisreH12YXIgdj0wLHg9MDtkLndpZGdldCgidWkudGFicyIse29wdGlvbnM6e2FkZDpudWxsLGFqYXhPcHRpb25zOm51bGwsY2FjaGU6ZmFsc2UsY29va2llOm51bGwsY29sbGFwc2libGU6ZmFsc2UsZGlzYWJsZTpudWxsLGRpc2FibGVkOltdLGVuYWJsZTpudWxsLGV2ZW50OiJjbGljayIsZng6bnVsbCxpZFByZWZpeDoidWktdGFicy0iLGxvYWQ6bnVsbCxwYW5lbFRlbXBsYXRlOiI8ZGl2PjwvZGl2PiIscmVtb3ZlOm51bGwsc2VsZWN0Om51bGwsc2hvdzpudWxsLHNwaW5uZXI6IjxlbT5Mb2FkaW5nJiM4MjMwOzwvZW0+Iix0YWJUZW1wbGF0ZToiPGxpPjxhIGhyZWY9JyN7aHJlZn0nPjxzcGFuPiN7bGFiZWx9PC9zcGFuPjwvYT48L2xpPiJ9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLl90YWJpZnkodHJ1ZSl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYSxlKXtpZihhPT0ic2VsZWN0ZWQiKXRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSYmCmU9PXRoaXMub3B0aW9ucy5zZWxlY3RlZHx8dGhpcy5zZWxlY3QoZSk7ZWxzZXt0aGlzLm9wdGlvbnNbYV09ZTt0aGlzLl90YWJpZnkoKX19LF90YWJJZDpmdW5jdGlvbihhKXtyZXR1cm4gYS50aXRsZSYmYS50aXRsZS5yZXBsYWNlKC9ccy9nLCJfIikucmVwbGFjZSgvW15cd1x1MDBjMC1cdUZGRkYtXS9nLCIiKXx8dGhpcy5vcHRpb25zLmlkUHJlZml4K3UoKX0sX3Nhbml0aXplU2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvOi9nLCJcXDoiKX0sX2Nvb2tpZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY29va2llfHwodGhpcy5jb29raWU9dGhpcy5vcHRpb25zLmNvb2tpZS5uYW1lfHwidWktdGFicy0iK3coKSk7cmV0dXJuIGQuY29va2llLmFwcGx5KG51bGwsW2FdLmNvbmNhdChkLm1ha2VBcnJheShhcmd1bWVudHMpKSl9LF91aTpmdW5jdGlvbihhLGUpe3JldHVybnt0YWI6YSxwYW5lbDplLGluZGV4OnRoaXMuYW5jaG9ycy5pbmRleChhKX19LF9jbGVhbnVwOmZ1bmN0aW9uKCl7dGhpcy5saXMuZmlsdGVyKCIudWktc3RhdGUtcHJvY2Vzc2luZyIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1wcm9jZXNzaW5nIikuZmluZCgic3BhbjpkYXRhKGxhYmVsLnRhYnMpIikuZWFjaChmdW5jdGlvbigpe3ZhciBhPQpkKHRoaXMpO2EuaHRtbChhLmRhdGEoImxhYmVsLnRhYnMiKSkucmVtb3ZlRGF0YSgibGFiZWwudGFicyIpfSl9LF90YWJpZnk6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZShnLGYpe2cuY3NzKCJkaXNwbGF5IiwiIik7IWQuc3VwcG9ydC5vcGFjaXR5JiZmLm9wYWNpdHkmJmdbMF0uc3R5bGUucmVtb3ZlQXR0cmlidXRlKCJmaWx0ZXIiKX12YXIgYj10aGlzLGM9dGhpcy5vcHRpb25zLGg9L14jLisvO3RoaXMubGlzdD10aGlzLmVsZW1lbnQuZmluZCgib2wsdWwiKS5lcSgwKTt0aGlzLmxpcz1kKCIgPiBsaTpoYXMoYVtocmVmXSkiLHRoaXMubGlzdCk7dGhpcy5hbmNob3JzPXRoaXMubGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBkKCJhIix0aGlzKVswXX0pO3RoaXMucGFuZWxzPWQoW10pO3RoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKGcsZil7dmFyIGk9ZChmKS5hdHRyKCJocmVmIiksbD1pLnNwbGl0KCIjIilbMF0scTtpZihsJiYobD09PWxvY2F0aW9uLnRvU3RyaW5nKCkuc3BsaXQoIiMiKVswXXx8CihxPWQoImJhc2UiKVswXSkmJmw9PT1xLmhyZWYpKXtpPWYuaGFzaDtmLmhyZWY9aX1pZihoLnRlc3QoaSkpYi5wYW5lbHM9Yi5wYW5lbHMuYWRkKGIuX3Nhbml0aXplU2VsZWN0b3IoaSkpO2Vsc2UgaWYoaSYmaSE9PSIjIil7ZC5kYXRhKGYsImhyZWYudGFicyIsaSk7ZC5kYXRhKGYsImxvYWQudGFicyIsaS5yZXBsYWNlKC8jLiokLywiIikpO2k9Yi5fdGFiSWQoZik7Zi5ocmVmPSIjIitpO2Y9ZCgiIyIraSk7aWYoIWYubGVuZ3RoKXtmPWQoYy5wYW5lbFRlbXBsYXRlKS5hdHRyKCJpZCIsaSkuYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpLmluc2VydEFmdGVyKGIucGFuZWxzW2ctMV18fGIubGlzdCk7Zi5kYXRhKCJkZXN0cm95LnRhYnMiLHRydWUpfWIucGFuZWxzPWIucGFuZWxzLmFkZChmKX1lbHNlIGMuZGlzYWJsZWQucHVzaChnKX0pO2lmKGEpe3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktdGFicyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIpOwp0aGlzLmxpc3QuYWRkQ2xhc3MoInVpLXRhYnMtbmF2IHVpLWhlbHBlci1yZXNldCB1aS1oZWxwZXItY2xlYXJmaXggdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIik7dGhpcy5saXMuYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLXRvcCIpO3RoaXMucGFuZWxzLmFkZENsYXNzKCJ1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iKTtpZihjLnNlbGVjdGVkPT09cCl7bG9jYXRpb24uaGFzaCYmdGhpcy5hbmNob3JzLmVhY2goZnVuY3Rpb24oZyxmKXtpZihmLmhhc2g9PWxvY2F0aW9uLmhhc2gpe2Muc2VsZWN0ZWQ9ZztyZXR1cm4gZmFsc2V9fSk7aWYodHlwZW9mIGMuc2VsZWN0ZWQhPT0ibnVtYmVyIiYmYy5jb29raWUpYy5zZWxlY3RlZD1wYXJzZUludChiLl9jb29raWUoKSwxMCk7aWYodHlwZW9mIGMuc2VsZWN0ZWQhPT0ibnVtYmVyIiYmdGhpcy5saXMuZmlsdGVyKCIudWktdGFicy1zZWxlY3RlZCIpLmxlbmd0aCljLnNlbGVjdGVkPQp0aGlzLmxpcy5pbmRleCh0aGlzLmxpcy5maWx0ZXIoIi51aS10YWJzLXNlbGVjdGVkIikpO2Muc2VsZWN0ZWQ9Yy5zZWxlY3RlZHx8KHRoaXMubGlzLmxlbmd0aD8wOi0xKX1lbHNlIGlmKGMuc2VsZWN0ZWQ9PT1udWxsKWMuc2VsZWN0ZWQ9LTE7Yy5zZWxlY3RlZD1jLnNlbGVjdGVkPj0wJiZ0aGlzLmFuY2hvcnNbYy5zZWxlY3RlZF18fGMuc2VsZWN0ZWQ8MD9jLnNlbGVjdGVkOjA7Yy5kaXNhYmxlZD1kLnVuaXF1ZShjLmRpc2FibGVkLmNvbmNhdChkLm1hcCh0aGlzLmxpcy5maWx0ZXIoIi51aS1zdGF0ZS1kaXNhYmxlZCIpLGZ1bmN0aW9uKGcpe3JldHVybiBiLmxpcy5pbmRleChnKX0pKSkuc29ydCgpO2QuaW5BcnJheShjLnNlbGVjdGVkLGMuZGlzYWJsZWQpIT0tMSYmYy5kaXNhYmxlZC5zcGxpY2UoZC5pbkFycmF5KGMuc2VsZWN0ZWQsYy5kaXNhYmxlZCksMSk7dGhpcy5wYW5lbHMuYWRkQ2xhc3MoInVpLXRhYnMtaGlkZSIpO3RoaXMubGlzLnJlbW92ZUNsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpOwppZihjLnNlbGVjdGVkPj0wJiZ0aGlzLmFuY2hvcnMubGVuZ3RoKXt0aGlzLnBhbmVscy5lcShjLnNlbGVjdGVkKS5yZW1vdmVDbGFzcygidWktdGFicy1oaWRlIik7dGhpcy5saXMuZXEoYy5zZWxlY3RlZCkuYWRkQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIik7Yi5lbGVtZW50LnF1ZXVlKCJ0YWJzIixmdW5jdGlvbigpe2IuX3RyaWdnZXIoInNob3ciLG51bGwsYi5fdWkoYi5hbmNob3JzW2Muc2VsZWN0ZWRdLGIucGFuZWxzW2Muc2VsZWN0ZWRdKSl9KTt0aGlzLmxvYWQoYy5zZWxlY3RlZCl9ZCh3aW5kb3cpLmJpbmQoInVubG9hZCIsZnVuY3Rpb24oKXtiLmxpcy5hZGQoYi5hbmNob3JzKS51bmJpbmQoIi50YWJzIik7Yi5saXM9Yi5hbmNob3JzPWIucGFuZWxzPW51bGx9KX1lbHNlIGMuc2VsZWN0ZWQ9dGhpcy5saXMuaW5kZXgodGhpcy5saXMuZmlsdGVyKCIudWktdGFicy1zZWxlY3RlZCIpKTt0aGlzLmVsZW1lbnRbYy5jb2xsYXBzaWJsZT8iYWRkQ2xhc3MiOgoicmVtb3ZlQ2xhc3MiXSgidWktdGFicy1jb2xsYXBzaWJsZSIpO2MuY29va2llJiZ0aGlzLl9jb29raWUoYy5zZWxlY3RlZCxjLmNvb2tpZSk7YT0wO2Zvcih2YXIgajtqPXRoaXMubGlzW2FdO2ErKylkKGopW2QuaW5BcnJheShhLGMuZGlzYWJsZWQpIT0tMSYmIWQoaikuaGFzQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQiKT8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpO2MuY2FjaGU9PT1mYWxzZSYmdGhpcy5hbmNob3JzLnJlbW92ZURhdGEoImNhY2hlLnRhYnMiKTt0aGlzLmxpcy5hZGQodGhpcy5hbmNob3JzKS51bmJpbmQoIi50YWJzIik7aWYoYy5ldmVudCE9PSJtb3VzZW92ZXIiKXt2YXIgaz1mdW5jdGlvbihnLGYpe2YuaXMoIjpub3QoLnVpLXN0YXRlLWRpc2FibGVkKSIpJiZmLmFkZENsYXNzKCJ1aS1zdGF0ZS0iK2cpfSxuPWZ1bmN0aW9uKGcsZil7Zi5yZW1vdmVDbGFzcygidWktc3RhdGUtIitnKX07dGhpcy5saXMuYmluZCgibW91c2VvdmVyLnRhYnMiLApmdW5jdGlvbigpe2soImhvdmVyIixkKHRoaXMpKX0pO3RoaXMubGlzLmJpbmQoIm1vdXNlb3V0LnRhYnMiLGZ1bmN0aW9uKCl7bigiaG92ZXIiLGQodGhpcykpfSk7dGhpcy5hbmNob3JzLmJpbmQoImZvY3VzLnRhYnMiLGZ1bmN0aW9uKCl7aygiZm9jdXMiLGQodGhpcykuY2xvc2VzdCgibGkiKSl9KTt0aGlzLmFuY2hvcnMuYmluZCgiYmx1ci50YWJzIixmdW5jdGlvbigpe24oImZvY3VzIixkKHRoaXMpLmNsb3Nlc3QoImxpIikpfSl9dmFyIG0sbztpZihjLmZ4KWlmKGQuaXNBcnJheShjLmZ4KSl7bT1jLmZ4WzBdO289Yy5meFsxXX1lbHNlIG09bz1jLmZ4O3ZhciByPW8/ZnVuY3Rpb24oZyxmKXtkKGcpLmNsb3Nlc3QoImxpIikuYWRkQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIik7Zi5oaWRlKCkucmVtb3ZlQ2xhc3MoInVpLXRhYnMtaGlkZSIpLmFuaW1hdGUobyxvLmR1cmF0aW9ufHwibm9ybWFsIixmdW5jdGlvbigpe2UoZixvKTtiLl90cmlnZ2VyKCJzaG93IiwKbnVsbCxiLl91aShnLGZbMF0pKX0pfTpmdW5jdGlvbihnLGYpe2QoZykuY2xvc2VzdCgibGkiKS5hZGRDbGFzcygidWktdGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUiKTtmLnJlbW92ZUNsYXNzKCJ1aS10YWJzLWhpZGUiKTtiLl90cmlnZ2VyKCJzaG93IixudWxsLGIuX3VpKGcsZlswXSkpfSxzPW0/ZnVuY3Rpb24oZyxmKXtmLmFuaW1hdGUobSxtLmR1cmF0aW9ufHwibm9ybWFsIixmdW5jdGlvbigpe2IubGlzLnJlbW92ZUNsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpO2YuYWRkQ2xhc3MoInVpLXRhYnMtaGlkZSIpO2UoZixtKTtiLmVsZW1lbnQuZGVxdWV1ZSgidGFicyIpfSl9OmZ1bmN0aW9uKGcsZil7Yi5saXMucmVtb3ZlQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIik7Zi5hZGRDbGFzcygidWktdGFicy1oaWRlIik7Yi5lbGVtZW50LmRlcXVldWUoInRhYnMiKX07dGhpcy5hbmNob3JzLmJpbmQoYy5ldmVudCsiLnRhYnMiLApmdW5jdGlvbigpe3ZhciBnPXRoaXMsZj1kKGcpLmNsb3Nlc3QoImxpIiksaT1iLnBhbmVscy5maWx0ZXIoIjpub3QoLnVpLXRhYnMtaGlkZSkiKSxsPWQoYi5fc2FuaXRpemVTZWxlY3RvcihnLmhhc2gpKTtpZihmLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIikmJiFjLmNvbGxhcHNpYmxlfHxmLmhhc0NsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpfHxmLmhhc0NsYXNzKCJ1aS1zdGF0ZS1wcm9jZXNzaW5nIil8fGIucGFuZWxzLmZpbHRlcigiOmFuaW1hdGVkIikubGVuZ3RofHxiLl90cmlnZ2VyKCJzZWxlY3QiLG51bGwsYi5fdWkodGhpcyxsWzBdKSk9PT1mYWxzZSl7dGhpcy5ibHVyKCk7cmV0dXJuIGZhbHNlfWMuc2VsZWN0ZWQ9Yi5hbmNob3JzLmluZGV4KHRoaXMpO2IuYWJvcnQoKTtpZihjLmNvbGxhcHNpYmxlKWlmKGYuaGFzQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQiKSl7Yy5zZWxlY3RlZD0tMTtjLmNvb2tpZSYmYi5fY29va2llKGMuc2VsZWN0ZWQsYy5jb29raWUpO2IuZWxlbWVudC5xdWV1ZSgidGFicyIsCmZ1bmN0aW9uKCl7cyhnLGkpfSkuZGVxdWV1ZSgidGFicyIpO3RoaXMuYmx1cigpO3JldHVybiBmYWxzZX1lbHNlIGlmKCFpLmxlbmd0aCl7Yy5jb29raWUmJmIuX2Nvb2tpZShjLnNlbGVjdGVkLGMuY29va2llKTtiLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7cihnLGwpfSk7Yi5sb2FkKGIuYW5jaG9ycy5pbmRleCh0aGlzKSk7dGhpcy5ibHVyKCk7cmV0dXJuIGZhbHNlfWMuY29va2llJiZiLl9jb29raWUoYy5zZWxlY3RlZCxjLmNvb2tpZSk7aWYobC5sZW5ndGgpe2kubGVuZ3RoJiZiLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7cyhnLGkpfSk7Yi5lbGVtZW50LnF1ZXVlKCJ0YWJzIixmdW5jdGlvbigpe3IoZyxsKX0pO2IubG9hZChiLmFuY2hvcnMuaW5kZXgodGhpcykpfWVsc2UgdGhyb3cialF1ZXJ5IFVJIFRhYnM6IE1pc21hdGNoaW5nIGZyYWdtZW50IGlkZW50aWZpZXIuIjtkLmJyb3dzZXIubXNpZSYmdGhpcy5ibHVyKCl9KTt0aGlzLmFuY2hvcnMuYmluZCgiY2xpY2sudGFicyIsCmZ1bmN0aW9uKCl7cmV0dXJuIGZhbHNlfSl9LF9nZXRJbmRleDpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09InN0cmluZyIpYT10aGlzLmFuY2hvcnMuaW5kZXgodGhpcy5hbmNob3JzLmZpbHRlcigiW2hyZWYkPSIrYSsiXSIpKTtyZXR1cm4gYX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9uczt0aGlzLmFib3J0KCk7dGhpcy5lbGVtZW50LnVuYmluZCgiLnRhYnMiKS5yZW1vdmVDbGFzcygidWktdGFicyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCB1aS10YWJzLWNvbGxhcHNpYmxlIikucmVtb3ZlRGF0YSgidGFicyIpO3RoaXMubGlzdC5yZW1vdmVDbGFzcygidWktdGFicy1uYXYgdWktaGVscGVyLXJlc2V0IHVpLWhlbHBlci1jbGVhcmZpeCB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1hbGwiKTt0aGlzLmFuY2hvcnMuZWFjaChmdW5jdGlvbigpe3ZhciBlPWQuZGF0YSh0aGlzLCJocmVmLnRhYnMiKTtpZihlKXRoaXMuaHJlZj0KZTt2YXIgYj1kKHRoaXMpLnVuYmluZCgiLnRhYnMiKTtkLmVhY2goWyJocmVmIiwibG9hZCIsImNhY2hlIl0sZnVuY3Rpb24oYyxoKXtiLnJlbW92ZURhdGEoaCsiLnRhYnMiKX0pfSk7dGhpcy5saXMudW5iaW5kKCIudGFicyIpLmFkZCh0aGlzLnBhbmVscykuZWFjaChmdW5jdGlvbigpe2QuZGF0YSh0aGlzLCJkZXN0cm95LnRhYnMiKT9kKHRoaXMpLnJlbW92ZSgpOmQodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLXRvcCB1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSB1aS1zdGF0ZS1ob3ZlciB1aS1zdGF0ZS1mb2N1cyB1aS1zdGF0ZS1kaXNhYmxlZCB1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20gdWktdGFicy1oaWRlIil9KTthLmNvb2tpZSYmdGhpcy5fY29va2llKG51bGwsYS5jb29raWUpO3JldHVybiB0aGlzfSxhZGQ6ZnVuY3Rpb24oYSxlLGIpe2lmKGI9PT1wKWI9dGhpcy5hbmNob3JzLmxlbmd0aDsKdmFyIGM9dGhpcyxoPXRoaXMub3B0aW9ucztlPWQoaC50YWJUZW1wbGF0ZS5yZXBsYWNlKC8jXHtocmVmXH0vZyxhKS5yZXBsYWNlKC8jXHtsYWJlbFx9L2csZSkpO2E9IWEuaW5kZXhPZigiIyIpP2EucmVwbGFjZSgiIyIsIiIpOnRoaXMuX3RhYklkKGQoImEiLGUpWzBdKTtlLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci10b3AiKS5kYXRhKCJkZXN0cm95LnRhYnMiLHRydWUpO3ZhciBqPWQoIiMiK2EpO2oubGVuZ3RofHwoaj1kKGgucGFuZWxUZW1wbGF0ZSkuYXR0cigiaWQiLGEpLmRhdGEoImRlc3Ryb3kudGFicyIsdHJ1ZSkpO2ouYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSB1aS10YWJzLWhpZGUiKTtpZihiPj10aGlzLmxpcy5sZW5ndGgpe2UuYXBwZW5kVG8odGhpcy5saXN0KTtqLmFwcGVuZFRvKHRoaXMubGlzdFswXS5wYXJlbnROb2RlKX1lbHNle2UuaW5zZXJ0QmVmb3JlKHRoaXMubGlzW2JdKTsKai5pbnNlcnRCZWZvcmUodGhpcy5wYW5lbHNbYl0pfWguZGlzYWJsZWQ9ZC5tYXAoaC5kaXNhYmxlZCxmdW5jdGlvbihrKXtyZXR1cm4gaz49Yj8rK2s6a30pO3RoaXMuX3RhYmlmeSgpO2lmKHRoaXMuYW5jaG9ycy5sZW5ndGg9PTEpe2guc2VsZWN0ZWQ9MDtlLmFkZENsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpO2oucmVtb3ZlQ2xhc3MoInVpLXRhYnMtaGlkZSIpO3RoaXMuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtjLl90cmlnZ2VyKCJzaG93IixudWxsLGMuX3VpKGMuYW5jaG9yc1swXSxjLnBhbmVsc1swXSkpfSk7dGhpcy5sb2FkKDApfXRoaXMuX3RyaWdnZXIoImFkZCIsbnVsbCx0aGlzLl91aSh0aGlzLmFuY2hvcnNbYl0sdGhpcy5wYW5lbHNbYl0pKTtyZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKGEpe2E9dGhpcy5fZ2V0SW5kZXgoYSk7dmFyIGU9dGhpcy5vcHRpb25zLGI9dGhpcy5saXMuZXEoYSkucmVtb3ZlKCksYz10aGlzLnBhbmVscy5lcShhKS5yZW1vdmUoKTsKaWYoYi5oYXNDbGFzcygidWktdGFicy1zZWxlY3RlZCIpJiZ0aGlzLmFuY2hvcnMubGVuZ3RoPjEpdGhpcy5zZWxlY3QoYSsoYSsxPHRoaXMuYW5jaG9ycy5sZW5ndGg/MTotMSkpO2UuZGlzYWJsZWQ9ZC5tYXAoZC5ncmVwKGUuZGlzYWJsZWQsZnVuY3Rpb24oaCl7cmV0dXJuIGghPWF9KSxmdW5jdGlvbihoKXtyZXR1cm4gaD49YT8tLWg6aH0pO3RoaXMuX3RhYmlmeSgpO3RoaXMuX3RyaWdnZXIoInJlbW92ZSIsbnVsbCx0aGlzLl91aShiLmZpbmQoImEiKVswXSxjWzBdKSk7cmV0dXJuIHRoaXN9LGVuYWJsZTpmdW5jdGlvbihhKXthPXRoaXMuX2dldEluZGV4KGEpO3ZhciBlPXRoaXMub3B0aW9ucztpZihkLmluQXJyYXkoYSxlLmRpc2FibGVkKSE9LTEpe3RoaXMubGlzLmVxKGEpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpO2UuZGlzYWJsZWQ9ZC5ncmVwKGUuZGlzYWJsZWQsZnVuY3Rpb24oYil7cmV0dXJuIGIhPWF9KTt0aGlzLl90cmlnZ2VyKCJlbmFibGUiLG51bGwsCnRoaXMuX3VpKHRoaXMuYW5jaG9yc1thXSx0aGlzLnBhbmVsc1thXSkpO3JldHVybiB0aGlzfX0sZGlzYWJsZTpmdW5jdGlvbihhKXthPXRoaXMuX2dldEluZGV4KGEpO3ZhciBlPXRoaXMub3B0aW9ucztpZihhIT1lLnNlbGVjdGVkKXt0aGlzLmxpcy5lcShhKS5hZGRDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKTtlLmRpc2FibGVkLnB1c2goYSk7ZS5kaXNhYmxlZC5zb3J0KCk7dGhpcy5fdHJpZ2dlcigiZGlzYWJsZSIsbnVsbCx0aGlzLl91aSh0aGlzLmFuY2hvcnNbYV0sdGhpcy5wYW5lbHNbYV0pKX1yZXR1cm4gdGhpc30sc2VsZWN0OmZ1bmN0aW9uKGEpe2E9dGhpcy5fZ2V0SW5kZXgoYSk7aWYoYT09LTEpaWYodGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlJiZ0aGlzLm9wdGlvbnMuc2VsZWN0ZWQhPS0xKWE9dGhpcy5vcHRpb25zLnNlbGVjdGVkO2Vsc2UgcmV0dXJuIHRoaXM7dGhpcy5hbmNob3JzLmVxKGEpLnRyaWdnZXIodGhpcy5vcHRpb25zLmV2ZW50KyIudGFicyIpO3JldHVybiB0aGlzfSwKbG9hZDpmdW5jdGlvbihhKXthPXRoaXMuX2dldEluZGV4KGEpO3ZhciBlPXRoaXMsYj10aGlzLm9wdGlvbnMsYz10aGlzLmFuY2hvcnMuZXEoYSlbMF0saD1kLmRhdGEoYywibG9hZC50YWJzIik7dGhpcy5hYm9ydCgpO2lmKCFofHx0aGlzLmVsZW1lbnQucXVldWUoInRhYnMiKS5sZW5ndGghPT0wJiZkLmRhdGEoYywiY2FjaGUudGFicyIpKXRoaXMuZWxlbWVudC5kZXF1ZXVlKCJ0YWJzIik7ZWxzZXt0aGlzLmxpcy5lcShhKS5hZGRDbGFzcygidWktc3RhdGUtcHJvY2Vzc2luZyIpO2lmKGIuc3Bpbm5lcil7dmFyIGo9ZCgic3BhbiIsYyk7ai5kYXRhKCJsYWJlbC50YWJzIixqLmh0bWwoKSkuaHRtbChiLnNwaW5uZXIpfXRoaXMueGhyPWQuYWpheChkLmV4dGVuZCh7fSxiLmFqYXhPcHRpb25zLHt1cmw6aCxzdWNjZXNzOmZ1bmN0aW9uKGssbil7ZChlLl9zYW5pdGl6ZVNlbGVjdG9yKGMuaGFzaCkpLmh0bWwoayk7ZS5fY2xlYW51cCgpO2IuY2FjaGUmJmQuZGF0YShjLCJjYWNoZS50YWJzIiwKdHJ1ZSk7ZS5fdHJpZ2dlcigibG9hZCIsbnVsbCxlLl91aShlLmFuY2hvcnNbYV0sZS5wYW5lbHNbYV0pKTt0cnl7Yi5hamF4T3B0aW9ucy5zdWNjZXNzKGssbil9Y2F0Y2gobSl7fX0sZXJyb3I6ZnVuY3Rpb24oayxuKXtlLl9jbGVhbnVwKCk7ZS5fdHJpZ2dlcigibG9hZCIsbnVsbCxlLl91aShlLmFuY2hvcnNbYV0sZS5wYW5lbHNbYV0pKTt0cnl7Yi5hamF4T3B0aW9ucy5lcnJvcihrLG4sYSxjKX1jYXRjaChtKXt9fX0pKTtlLmVsZW1lbnQuZGVxdWV1ZSgidGFicyIpO3JldHVybiB0aGlzfX0sYWJvcnQ6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucXVldWUoW10pO3RoaXMucGFuZWxzLnN0b3AoZmFsc2UsdHJ1ZSk7dGhpcy5lbGVtZW50LnF1ZXVlKCJ0YWJzIix0aGlzLmVsZW1lbnQucXVldWUoInRhYnMiKS5zcGxpY2UoLTIsMikpO2lmKHRoaXMueGhyKXt0aGlzLnhoci5hYm9ydCgpO2RlbGV0ZSB0aGlzLnhocn10aGlzLl9jbGVhbnVwKCk7cmV0dXJuIHRoaXN9LHVybDpmdW5jdGlvbihhLAplKXt0aGlzLmFuY2hvcnMuZXEoYSkucmVtb3ZlRGF0YSgiY2FjaGUudGFicyIpLmRhdGEoImxvYWQudGFicyIsZSk7cmV0dXJuIHRoaXN9LGxlbmd0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFuY2hvcnMubGVuZ3RofX0pO2QuZXh0ZW5kKGQudWkudGFicyx7dmVyc2lvbjoiMS44LjUifSk7ZC5leHRlbmQoZC51aS50YWJzLnByb3RvdHlwZSx7cm90YXRpb246bnVsbCxyb3RhdGU6ZnVuY3Rpb24oYSxlKXt2YXIgYj10aGlzLGM9dGhpcy5vcHRpb25zLGg9Yi5fcm90YXRlfHwoYi5fcm90YXRlPWZ1bmN0aW9uKGope2NsZWFyVGltZW91dChiLnJvdGF0aW9uKTtiLnJvdGF0aW9uPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgaz1jLnNlbGVjdGVkO2Iuc2VsZWN0KCsrazxiLmFuY2hvcnMubGVuZ3RoP2s6MCl9LGEpO2omJmouc3RvcFByb3BhZ2F0aW9uKCl9KTtlPWIuX3Vucm90YXRlfHwoYi5fdW5yb3RhdGU9IWU/ZnVuY3Rpb24oail7ai5jbGllbnRYJiZiLnJvdGF0ZShudWxsKX06CmZ1bmN0aW9uKCl7dD1jLnNlbGVjdGVkO2goKX0pO2lmKGEpe3RoaXMuZWxlbWVudC5iaW5kKCJ0YWJzc2hvdyIsaCk7dGhpcy5hbmNob3JzLmJpbmQoYy5ldmVudCsiLnRhYnMiLGUpO2goKX1lbHNle2NsZWFyVGltZW91dChiLnJvdGF0aW9uKTt0aGlzLmVsZW1lbnQudW5iaW5kKCJ0YWJzc2hvdyIsaCk7dGhpcy5hbmNob3JzLnVuYmluZChjLmV2ZW50KyIudGFicyIsZSk7ZGVsZXRlIHRoaXMuX3JvdGF0ZTtkZWxldGUgdGhpcy5fdW5yb3RhdGV9cmV0dXJuIHRoaXN9fSl9KShqUXVlcnkpOwo7]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/touchInlineEdit.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqICRJZDogdG91Y2hJbmxpbmVFZGl0LmpzIDUxIDIwMTAtMDktMTMgMTQ6MDY6MjVaIHRvdWNoZGVzaWduICQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuNwogKiBAY29weXJpZ2h0IDA0LjA4LjIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqIEB0b2RvIGFkZCBjb250ZW50X2Jsb2NrIGhhbmRsaW5nCiAqIAogKiAtLQogKgogKiBVc2FnZTogCiAqCiAqIHtjbXNfbW9kdWxlIG1vZHVsZT0idG91Y2hJbmxpbmVFZGl0In0KICoKICoge2NvbnRlbnQgaXNlZGl0YWJsZT0ndHJ1ZSd9CiAqCiAqIC0tCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKICoKICovCgpmdW5jdGlvbiB0b3VjaElubGluZUVkaXRJbml0RWRpdG9yKCl7CgoJdmFyIG9wdHMgPSB7CgkJY3NzQ2xhc3MgOiAnZWwtcnRlJywKCQkvLyBsYW5nICAgICA6ICdydScsCgkJaGVpZ2h0ICAgOiAnYXV0bycsCgkJdG9vbGJhciAgOiB0aWVUb29sYmFyLAoJCWNzc2ZpbGVzIDogWydjc3MvZWxydGUtaW5uZXIuY3NzJ10KCX0KCS8vJCgnI3RvdWNoSW5saW5lRWRpdElkJyArIHRpZUNvbnRlbnRJZCkuZWxydGUob3B0cyk7CgljQmxvY2tNYWluID0gbmV3IGVsUlRFKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3VjaElubGluZUVkaXRJZCcgKyB0aWVDb250ZW50SWQpLCBvcHRzKTsKfQoKZnVuY3Rpb24gdG91Y2hJbmxpbmVFZGl0UmVtb3ZlRWRpdG9yKCl7CgoJY0Jsb2NrTWFpbi5lZGl0b3IuaGlkZSgpOyAvLyBSZW1vdmUgZWRpdG9yCgljQmxvY2tNYWluLmVkaXRvci5wcmV2KCkuc2hvdygpOyAvLyBEaXNwbGF5IHRpZSBkaXYKCWNCbG9ja01haW4gPSBudWxsOyAvLyBEZXN0cm95IGVkaXRvcgp9CgpmdW5jdGlvbiB0b3VjaElubGluZUVkaXRUb2dnbGVFZGl0b3IoKXsKCglpZighY0Jsb2NrTWFpbil7CgkJdG91Y2hJbmxpbmVFZGl0SW5pdENvbnRlbnQoKTsKCQl0b3VjaElubGluZUVkaXRJbml0RWRpdG9yKCk7Cgl9ZWxzZXsKCQl0b3VjaElubGluZUVkaXRSZW1vdmVFZGl0b3IoKTsKCX0KfQoKZnVuY3Rpb24gdG91Y2hJbmxpbmVFZGl0SW5pdENvbnRlbnQoKXsKCgkkLmFqYXgoe2FzeW5jOmZhbHNlLAoJCXR5cGU6ICdQT1NUJywKCQl1cmw6IHRpZVJlcXVlc3RVcmksCgkJZGF0YTogJ21ldGhvZD1nZXRDb250ZW50JmlkPScgKyB0aWVDb250ZW50SWQsCgkJc3VjY2VzczogZnVuY3Rpb24oZGF0YSl7CgkJCSQoJyN0b3VjaElubGluZUVkaXRJZCcgKyB0aWVDb250ZW50SWQpLmh0bWwoZGF0YSk7CgkJfQoJfSk7Cn0KCmZ1bmN0aW9uIHRvdWNoSW5saW5lRWRpdFNhdmUoaWQsY29udGVudCl7CgoJJC5wb3N0KHRpZVJlcXVlc3RVcmksIHsgbWV0aG9kOiAidXBkYXRlQ29udGVudCIsIGlkOiB0aWVDb250ZW50SWQsIGNvbnRlbnQ6IGNvbnRlbnQgfSwKCQlmdW5jdGlvbihkYXRhKXsKCQkJaWYodGllVXBkYXRlQWxlcnQpewoJCQkJYWxlcnQodGllVXBkYXRlQWxlcnRNZXNzYWdlKTsKCQkJfQoJCQl0b3VjaElubGluZUVkaXRUb2dnbGVFZGl0b3IoKTsKCQkJJCgnI3RvdWNoSW5saW5lRWRpdElkJyArIHRpZUNvbnRlbnRJZCkuaHRtbChkYXRhKTsKCQl9CgkpOwp9CgovLyBBZGQgc2F2ZSBoYW5kbGVyCmVsUlRFLnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24gKCkgewoKCXRvdWNoSW5saW5lRWRpdFNhdmUodGllQ29udGVudElkLHRoaXMuZmlsdGVyLnNvdXJjZSgkKHRoaXMuZG9jLmJvZHkpLmh0bWwoKSkpOwp9OwoKZnVuY3Rpb24gZnVuY3Rpb25FeGlzdHMobmFtZSl7CglyZXR1cm4gKHR5cGVvZiBuYW1lID09ICdmdW5jdGlvbicpOwp9CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewoKCSQoJy50b3VjaElubGluZUVkaXRCdXR0b24nKS5jbGljayhmdW5jdGlvbigpewoJCXRvdWNoSW5saW5lRWRpdFRvZ2dsZUVkaXRvcigpOwoJCXJldHVybiBmYWxzZTsKCX0pOwoKCWlmKHRpZUVkaXRPbkRibENsaWNrKXsKCQkkKCcudG91Y2hJbmxpbmVFZGl0JykuZGJsY2xpY2soZnVuY3Rpb24oKXsKCQkJdG91Y2hJbmxpbmVFZGl0VG9nZ2xlRWRpdG9yKCk7CgkJCXJldHVybiBmYWxzZTsKCQl9KTsKCX0KfSk7]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAABkCAYAAAD0ZHJ6AAAAe0lEQVRoge3OMQHAIBAAMcC/kjdZJHTI0A4XBdkz86wfO18H3hRUBVVBVVAVVAVVQVVQFVQFVUFVUBVUBVVBVVAVVAVVQVVQFVQFVUFVUBVUBVVBVVAVVAVVQVVQFVQFVUFVUBVUBVVBVVAVVAVVQVVQFVQFVUFVUBVUF8O8A8WdY6opAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAABkCAYAAAD0ZHJ6AAAAeUlEQVRoge3OMQHAIBAAsVL/nh8JDDfAkCjImpn5HvbfDpwIVoKVYCVYCVaClWAlWAlWgpVgJVgJVoKVYCVYCVaClWAlWAlWgpVgJVgJVoKVYCVYCVaClWAlWAlWgpVgJVgJVoKVYCVYCVaClWAlWAlWgpVgJVgJVhtqiwTEKTLXTgAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAAP0lEQVQ4je3PMQrAMABC0a/3v2zX0mCXNkOgc6C4PARd5DqPGKCU8luS8SbAQhiCQRgJE56kZTfbbP9RSvnkBsWcEAZRWcgqAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAAMElEQVQ4je3LIQ4AIBTD0O3f/8wrFgmKhMy8pKJKwkhSKeVbbGuAPU9f4PIopTxgAeS0DRtI4yK0AAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAANklEQVQ4jWN48uTJfyYGBgaGUWKUGCWGLfHt2zcoi5GREYNgYmJCZiG42IiB98woMUqMEtgIAMdjCdyg+eEBAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAANUlEQVQ4je3LMQoAIBADwb38/6t5wFXaWAiCtUiaYZvF9hBACOFbuntVVe11B0CSjjeE8BwThQIJ8dhEl0YAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAAPklEQVQ4je3PMQqAMABD0Z/c/7aCIAXjJIhD10LJ8vgZw30eMUApZV/GhZNgSTjoLYElY/hNMJ/S6gullCkPiCIPCr4NiEwAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAABkCAYAAABHLFpgAAAALElEQVQYlWN49OjRfyYGBgaGIUT8//8fSqBx0Yh///4RL8vAwAAVQ2MNOwIAl6g6KkOJwk8AAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-icons_2e83ff_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[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]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-icons_222222_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[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]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-icons_454545_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEVERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkQfbf86AAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMM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]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-icons_888888_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEWMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMiozJxoFPAAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMM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]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/images/ui-icons_cd0a0a_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[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]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/js/ui-themes/smoothness/jquery-ui-1.8.5.custom.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IFVJIENTUyBGcmFtZXdvcmsgQFZFUlNJT04KICoKICogQ29weXJpZ2h0IDIwMTAsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1RoZW1pbmcvQVBJCiAqLwoKLyogTGF5b3V0IGhlbHBlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi51aS1oZWxwZXItaGlkZGVuIHsgZGlzcGxheTogbm9uZTsgfQoudWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIHsgcG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAtOTk5OTk5OTlweDsgfQoudWktaGVscGVyLXJlc2V0IHsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyBib3JkZXI6IDA7IG91dGxpbmU6IDA7IGxpbmUtaGVpZ2h0OiAxLjM7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC1zaXplOiAxMDAlOyBsaXN0LXN0eWxlOiBub25lOyB9Ci51aS1oZWxwZXItY2xlYXJmaXg6YWZ0ZXIgeyBjb250ZW50OiAiLiI7IGRpc3BsYXk6IGJsb2NrOyBoZWlnaHQ6IDA7IGNsZWFyOiBib3RoOyB2aXNpYmlsaXR5OiBoaWRkZW47IH0KLnVpLWhlbHBlci1jbGVhcmZpeCB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgfQovKiByZXF1aXJlZCBjb21tZW50IGZvciBjbGVhcmZpeCB0byB3b3JrIGluIE9wZXJhIFwqLwoqIGh0bWwgLnVpLWhlbHBlci1jbGVhcmZpeCB7IGhlaWdodDoxJTsgfQoudWktaGVscGVyLWNsZWFyZml4IHsgZGlzcGxheTpibG9jazsgfQovKiBlbmQgY2xlYXJmaXggKi8KLnVpLWhlbHBlci16Zml4IHsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgdG9wOiAwOyBsZWZ0OiAwOyBwb3NpdGlvbjogYWJzb2x1dGU7IG9wYWNpdHk6IDA7IGZpbHRlcjpBbHBoYShPcGFjaXR5PTApOyB9CgoKLyogSW50ZXJhY3Rpb24gQ3VlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLnVpLXN0YXRlLWRpc2FibGVkIHsgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7IH0KCgovKiBJY29ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIHN0YXRlcyBhbmQgaW1hZ2VzICovCi51aS1pY29uIHsgZGlzcGxheTogYmxvY2s7IHRleHQtaW5kZW50OiAtOTk5OTlweDsgb3ZlcmZsb3c6IGhpZGRlbjsgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgfQoKCi8qIE1pc2MgdmlzdWFscwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIE92ZXJsYXlzICovCi51aS13aWRnZXQtb3ZlcmxheSB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyB9CgoKLyoKICogalF1ZXJ5IFVJIENTUyBGcmFtZXdvcmsgQFZFUlNJT04KICoKICogQ29weXJpZ2h0IDIwMTAsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1RoZW1pbmcvQVBJCiAqCiAqIFRvIHZpZXcgYW5kIG1vZGlmeSB0aGlzIHRoZW1lLCB2aXNpdCBodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyLz9mZkRlZmF1bHQ9VmVyZGFuYSxBcmlhbCxzYW5zLXNlcmlmJmZ3RGVmYXVsdD1ub3JtYWwmZnNEZWZhdWx0PTEuMWVtJmNvcm5lclJhZGl1cz00cHgmYmdDb2xvckhlYWRlcj1jY2NjY2MmYmdUZXh0dXJlSGVhZGVyPTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlIZWFkZXI9NzUmYm9yZGVyQ29sb3JIZWFkZXI9YWFhYWFhJmZjSGVhZGVyPTIyMjIyMiZpY29uQ29sb3JIZWFkZXI9MjIyMjIyJmJnQ29sb3JDb250ZW50PWZmZmZmZiZiZ1RleHR1cmVDb250ZW50PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eUNvbnRlbnQ9NzUmYm9yZGVyQ29sb3JDb250ZW50PWFhYWFhYSZmY0NvbnRlbnQ9MjIyMjIyJmljb25Db2xvckNvbnRlbnQ9MjIyMjIyJmJnQ29sb3JEZWZhdWx0PWU2ZTZlNiZiZ1RleHR1cmVEZWZhdWx0PTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTc1JmJvcmRlckNvbG9yRGVmYXVsdD1kM2QzZDMmZmNEZWZhdWx0PTU1NTU1NSZpY29uQ29sb3JEZWZhdWx0PTg4ODg4OCZiZ0NvbG9ySG92ZXI9ZGFkYWRhJmJnVGV4dHVyZUhvdmVyPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlIb3Zlcj03NSZib3JkZXJDb2xvckhvdmVyPTk5OTk5OSZmY0hvdmVyPTIxMjEyMSZpY29uQ29sb3JIb3Zlcj00NTQ1NDUmYmdDb2xvckFjdGl2ZT1mZmZmZmYmYmdUZXh0dXJlQWN0aXZlPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlBY3RpdmU9NjUmYm9yZGVyQ29sb3JBY3RpdmU9YWFhYWFhJmZjQWN0aXZlPTIxMjEyMSZpY29uQ29sb3JBY3RpdmU9NDU0NTQ1JmJnQ29sb3JIaWdobGlnaHQ9ZmJmOWVlJmJnVGV4dHVyZUhpZ2hsaWdodD0wMl9nbGFzcy5wbmcmYmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTU1JmJvcmRlckNvbG9ySGlnaGxpZ2h0PWZjZWZhMSZmY0hpZ2hsaWdodD0zNjM2MzYmaWNvbkNvbG9ySGlnaGxpZ2h0PTJlODNmZiZiZ0NvbG9yRXJyb3I9ZmVmMWVjJmJnVGV4dHVyZUVycm9yPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlFcnJvcj05NSZib3JkZXJDb2xvckVycm9yPWNkMGEwYSZmY0Vycm9yPWNkMGEwYSZpY29uQ29sb3JFcnJvcj1jZDBhMGEmYmdDb2xvck92ZXJsYXk9YWFhYWFhJmJnVGV4dHVyZU92ZXJsYXk9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5T3ZlcmxheT0wJm9wYWNpdHlPdmVybGF5PTMwJmJnQ29sb3JTaGFkb3c9YWFhYWFhJmJnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9MCZvcGFjaXR5U2hhZG93PTMwJnRoaWNrbmVzc1NoYWRvdz04cHgmb2Zmc2V0VG9wU2hhZG93PS04cHgmb2Zmc2V0TGVmdFNoYWRvdz0tOHB4JmNvcm5lclJhZGl1c1NoYWRvdz04cHgKICovCgoKLyogQ29tcG9uZW50IGNvbnRhaW5lcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi51aS13aWRnZXQgeyBmb250LWZhbWlseTogVmVyZGFuYSxBcmlhbCxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEuMWVtOyB9Ci51aS13aWRnZXQgLnVpLXdpZGdldCB7IGZvbnQtc2l6ZTogMWVtOyB9Ci51aS13aWRnZXQgaW5wdXQsIC51aS13aWRnZXQgc2VsZWN0LCAudWktd2lkZ2V0IHRleHRhcmVhLCAudWktd2lkZ2V0IGJ1dHRvbiB7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLEFyaWFsLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMWVtOyB9Ci51aS13aWRnZXQtY29udGVudCB7IGJvcmRlcjogMXB4IHNvbGlkICNhYWFhYWE7IGJhY2tncm91bmQ6ICNmZmZmZmYgdXJsKGltYWdlcy91aS1iZ19mbGF0Xzc1X2ZmZmZmZl80MHgxMDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBjb2xvcjogIzIyMjIyMjsgfQoudWktd2lkZ2V0LWNvbnRlbnQgYSB7IGNvbG9yOiAjMjIyMjIyOyB9Ci51aS13aWRnZXQtaGVhZGVyIHsgYm9yZGVyOiAxcHggc29saWQgI2FhYWFhYTsgYmFja2dyb3VuZDogI2NjY2NjYyB1cmwoaW1hZ2VzL3VpLWJnX2hpZ2hsaWdodC1zb2Z0Xzc1X2NjY2NjY18xeDEwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7IGNvbG9yOiAjMjIyMjIyOyBmb250LXdlaWdodDogYm9sZDsgfQoudWktd2lkZ2V0LWhlYWRlciBhIHsgY29sb3I6ICMyMjIyMjI7IH0KCi8qIEludGVyYWN0aW9uIHN0YXRlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLnVpLXN0YXRlLWRlZmF1bHQsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZGVmYXVsdCwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWRlZmF1bHQgeyBib3JkZXI6IDFweCBzb2xpZCAjZDNkM2QzOyBiYWNrZ3JvdW5kOiAjZTZlNmU2IHVybChpbWFnZXMvdWktYmdfZ2xhc3NfNzVfZTZlNmU2XzF4NDAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgY29sb3I6ICM1NTU1NTU7IH0KLnVpLXN0YXRlLWRlZmF1bHQgYSwgLnVpLXN0YXRlLWRlZmF1bHQgYTpsaW5rLCAudWktc3RhdGUtZGVmYXVsdCBhOnZpc2l0ZWQgeyBjb2xvcjogIzU1NTU1NTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9Ci51aS1zdGF0ZS1ob3ZlciwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1ob3ZlciwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhvdmVyLCAudWktc3RhdGUtZm9jdXMsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZm9jdXMsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1mb2N1cyB7IGJvcmRlcjogMXB4IHNvbGlkICM5OTk5OTk7IGJhY2tncm91bmQ6ICNkYWRhZGEgdXJsKGltYWdlcy91aS1iZ19nbGFzc183NV9kYWRhZGFfMXg0MDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBmb250LXdlaWdodDogbm9ybWFsOyBjb2xvcjogIzIxMjEyMTsgfQoudWktc3RhdGUtaG92ZXIgYSwgLnVpLXN0YXRlLWhvdmVyIGE6aG92ZXIgeyBjb2xvcjogIzIxMjEyMTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9Ci51aS1zdGF0ZS1hY3RpdmUsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtYWN0aXZlLCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtYWN0aXZlIHsgYm9yZGVyOiAxcHggc29saWQgI2FhYWFhYTsgYmFja2dyb3VuZDogI2ZmZmZmZiB1cmwoaW1hZ2VzL3VpLWJnX2dsYXNzXzY1X2ZmZmZmZl8xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGNvbG9yOiAjMjEyMTIxOyB9Ci51aS1zdGF0ZS1hY3RpdmUgYSwgLnVpLXN0YXRlLWFjdGl2ZSBhOmxpbmssIC51aS1zdGF0ZS1hY3RpdmUgYTp2aXNpdGVkIHsgY29sb3I6ICMyMTIxMjE7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQoudWktd2lkZ2V0IDphY3RpdmUgeyBvdXRsaW5lOiBub25lOyB9CgovKiBJbnRlcmFjdGlvbiBDdWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoudWktc3RhdGUtaGlnaGxpZ2h0LCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWhpZ2hsaWdodCwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhpZ2hsaWdodCAge2JvcmRlcjogMXB4IHNvbGlkICNmY2VmYTE7IGJhY2tncm91bmQ6ICNmYmY5ZWUgdXJsKGltYWdlcy91aS1iZ19nbGFzc181NV9mYmY5ZWVfMXg0MDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBjb2xvcjogIzM2MzYzNjsgfQoudWktc3RhdGUtaGlnaGxpZ2h0IGEsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaGlnaGxpZ2h0IGEsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhpZ2hsaWdodCBhIHsgY29sb3I6ICMzNjM2MzY7IH0KLnVpLXN0YXRlLWVycm9yLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yLCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkICNjZDBhMGE7IGJhY2tncm91bmQ6ICNmZWYxZWMgdXJsKGltYWdlcy91aS1iZ19nbGFzc185NV9mZWYxZWNfMXg0MDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBjb2xvcjogI2NkMGEwYTsgfQoudWktc3RhdGUtZXJyb3IgYSwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1lcnJvciBhLCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZXJyb3IgYSB7IGNvbG9yOiAjY2QwYTBhOyB9Ci51aS1zdGF0ZS1lcnJvci10ZXh0LCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yLXRleHQsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1lcnJvci10ZXh0IHsgY29sb3I6ICNjZDBhMGE7IH0KLnVpLXByaW9yaXR5LXByaW1hcnksIC51aS13aWRnZXQtY29udGVudCAudWktcHJpb3JpdHktcHJpbWFyeSwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXByaW9yaXR5LXByaW1hcnkgeyBmb250LXdlaWdodDogYm9sZDsgfQoudWktcHJpb3JpdHktc2Vjb25kYXJ5LCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXByaW9yaXR5LXNlY29uZGFyeSwgIC51aS13aWRnZXQtaGVhZGVyIC51aS1wcmlvcml0eS1zZWNvbmRhcnkgeyBvcGFjaXR5OiAuNzsgZmlsdGVyOkFscGhhKE9wYWNpdHk9NzApOyBmb250LXdlaWdodDogbm9ybWFsOyB9Ci51aS1zdGF0ZS1kaXNhYmxlZCwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1kaXNhYmxlZCwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWRpc2FibGVkIHsgb3BhY2l0eTogLjM1OyBmaWx0ZXI6QWxwaGEoT3BhY2l0eT0zNSk7IGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IH0KCi8qIEljb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyogc3RhdGVzIGFuZCBpbWFnZXMgKi8KLnVpLWljb24geyB3aWR0aDogMTZweDsgaGVpZ2h0OiAxNnB4OyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3VpLWljb25zXzIyMjIyMl8yNTZ4MjQwLnBuZyk7IH0KLnVpLXdpZGdldC1jb250ZW50IC51aS1pY29uIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3VpLWljb25zXzIyMjIyMl8yNTZ4MjQwLnBuZyk7IH0KLnVpLXdpZGdldC1oZWFkZXIgLnVpLWljb24ge2JhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvdWktaWNvbnNfMjIyMjIyXzI1NngyNDAucG5nKTsgfQoudWktc3RhdGUtZGVmYXVsdCAudWktaWNvbiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvdWktaWNvbnNfODg4ODg4XzI1NngyNDAucG5nKTsgfQoudWktc3RhdGUtaG92ZXIgLnVpLWljb24sIC51aS1zdGF0ZS1mb2N1cyAudWktaWNvbiB7YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy91aS1pY29uc180NTQ1NDVfMjU2eDI0MC5wbmcpOyB9Ci51aS1zdGF0ZS1hY3RpdmUgLnVpLWljb24ge2JhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvdWktaWNvbnNfNDU0NTQ1XzI1NngyNDAucG5nKTsgfQoudWktc3RhdGUtaGlnaGxpZ2h0IC51aS1pY29uIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3VpLWljb25zXzJlODNmZl8yNTZ4MjQwLnBuZyk7IH0KLnVpLXN0YXRlLWVycm9yIC51aS1pY29uLCAudWktc3RhdGUtZXJyb3ItdGV4dCAudWktaWNvbiB7YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy91aS1pY29uc19jZDBhMGFfMjU2eDI0MC5wbmcpOyB9CgovKiBwb3NpdGlvbmluZyAqLwoudWktaWNvbi1jYXJhdC0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7IH0KLnVpLWljb24tY2FyYXQtMS1uZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IDA7IH0KLnVpLWljb24tY2FyYXQtMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggMDsgfQoudWktaWNvbi1jYXJhdC0xLXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggMDsgfQoudWktaWNvbi1jYXJhdC0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAwOyB9Ci51aS1pY29uLWNhcmF0LTEtc3cgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAwOyB9Ci51aS1pY29uLWNhcmF0LTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IDA7IH0KLnVpLWljb24tY2FyYXQtMS1udyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAwOyB9Ci51aS1pY29uLWNhcmF0LTItbi1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IDA7IH0KLnVpLWljb24tY2FyYXQtMi1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggMDsgfQoudWktaWNvbi10cmlhbmdsZS0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNnB4OyB9Ci51aS1pY29uLXRyaWFuZ2xlLTEtbmUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTZweDsgfQoudWktaWNvbi10cmlhbmdsZS0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTZweDsgfQoudWktaWNvbi10cmlhbmdsZS0xLXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE2cHg7IH0KLnVpLWljb24tdHJpYW5nbGUtMS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE2cHg7IH0KLnVpLWljb24tdHJpYW5nbGUtMS1zdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNnB4OyB9Ci51aS1pY29uLXRyaWFuZ2xlLTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xNnB4OyB9Ci51aS1pY29uLXRyaWFuZ2xlLTEtbncgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTE2cHg7IH0KLnVpLWljb24tdHJpYW5nbGUtMi1uLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTE2cHg7IH0KLnVpLWljb24tdHJpYW5nbGUtMi1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTE2cHg7IH0KLnVpLWljb24tYXJyb3ctMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMzJweDsgfQoudWktaWNvbi1hcnJvdy0xLW5lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMS1zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTEtc3cgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMzJweDsgfQoudWktaWNvbi1hcnJvdy0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMzJweDsgfQoudWktaWNvbi1hcnJvdy0xLW53IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTItbi1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTItbmUtc3cgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMi1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMi1zZS1udyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMzJweDsgfQoudWktaWNvbi1hcnJvd3N0b3AtMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93c3RvcC0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTMycHg7IH0KLnVpLWljb24tYXJyb3dzdG9wLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtMzJweDsgfQoudWktaWNvbi1hcnJvd3N0b3AtMS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI0MHB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93dGhpY2stMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTEtbmUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTEtZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2stMS1zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2stMS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0xLXN3IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTEtbncgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0yLW4tcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTItbmUtc3cgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0yLWUtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTItc2UtbncgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI0MHB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC02NHB4OyB9Ci51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTY0cHg7IH0KLnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JldHVybi0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JldHVybi0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JldHVybi0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JldHVybi0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTY0cHg7IH0KLnVpLWljb24tYXJyb3dyZWZyZXNoLTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JlZnJlc2gtMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC02NHB4OyB9Ci51aS1pY29uLWFycm93cmVmcmVzaC0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTY0cHg7IH0KLnVpLWljb24tYXJyb3dyZWZyZXNoLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtNjRweDsgfQoudWktaWNvbi1hcnJvdy00IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtODBweDsgfQoudWktaWNvbi1hcnJvdy00LWRpYWcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtODBweDsgfQoudWktaWNvbi1leHRsaW5rIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTgwcHg7IH0KLnVpLWljb24tbmV3d2luIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTgwcHg7IH0KLnVpLWljb24tcmVmcmVzaCB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC04MHB4OyB9Ci51aS1pY29uLXNodWZmbGUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtODBweDsgfQoudWktaWNvbi10cmFuc2Zlci1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtODBweDsgfQoudWktaWNvbi10cmFuc2ZlcnRoaWNrLWUtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtODBweDsgfQoudWktaWNvbi1mb2xkZXItY29sbGFwc2VkIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtOTZweDsgfQoudWktaWNvbi1mb2xkZXItb3BlbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC05NnB4OyB9Ci51aS1pY29uLWRvY3VtZW50IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTk2cHg7IH0KLnVpLWljb24tZG9jdW1lbnQtYiB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC05NnB4OyB9Ci51aS1pY29uLW5vdGUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtOTZweDsgfQoudWktaWNvbi1tYWlsLWNsb3NlZCB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC05NnB4OyB9Ci51aS1pY29uLW1haWwtb3BlbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC05NnB4OyB9Ci51aS1pY29uLXN1aXRjYXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC05NnB4OyB9Ci51aS1pY29uLWNvbW1lbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTk2cHg7IH0KLnVpLWljb24tcGVyc29uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC05NnB4OyB9Ci51aS1pY29uLXByaW50IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC05NnB4OyB9Ci51aS1pY29uLXRyYXNoIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC05NnB4OyB9Ci51aS1pY29uLWxvY2tlZCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtOTZweDsgfQoudWktaWNvbi11bmxvY2tlZCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtOTZweDsgfQoudWktaWNvbi1ib29rbWFyayB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtOTZweDsgfQoudWktaWNvbi10YWcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQwcHggLTk2cHg7IH0KLnVpLWljb24taG9tZSB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTExMnB4OyB9Ci51aS1pY29uLWZsYWcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTEycHg7IH0KLnVpLWljb24tY2FsZW5kYXIgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTEycHg7IH0KLnVpLWljb24tY2FydCB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xMTJweDsgfQoudWktaWNvbi1wZW5jaWwgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTEycHg7IH0KLnVpLWljb24tY2xvY2sgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTEycHg7IH0KLnVpLWljb24tZGlzayB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xMTJweDsgfQoudWktaWNvbi1jYWxjdWxhdG9yIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xMTJweDsgfQoudWktaWNvbi16b29taW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTExMnB4OyB9Ci51aS1pY29uLXpvb21vdXQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTExMnB4OyB9Ci51aS1pY29uLXNlYXJjaCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtMTEycHg7IH0KLnVpLWljb24td3JlbmNoIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xMTJweDsgfQoudWktaWNvbi1nZWFyIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0xMTJweDsgfQoudWktaWNvbi1oZWFydCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtMTEycHg7IH0KLnVpLWljb24tc3RhciB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtMTEycHg7IH0KLnVpLWljb24tbGluayB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yNDBweCAtMTEycHg7IH0KLnVpLWljb24tY2FuY2VsIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTI4cHg7IH0KLnVpLWljb24tcGx1cyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xMjhweDsgfQoudWktaWNvbi1wbHVzdGhpY2sgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7IH0KLnVpLWljb24tbWludXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTI4cHg7IH0KLnVpLWljb24tbWludXN0aGljayB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xMjhweDsgfQoudWktaWNvbi1jbG9zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xMjhweDsgfQoudWktaWNvbi1jbG9zZXRoaWNrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTEyOHB4OyB9Ci51aS1pY29uLWtleSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTI4cHg7IH0KLnVpLWljb24tbGlnaHRidWxiIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xMjhweDsgfQoudWktaWNvbi1zY2lzc29ycyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTI4cHg7IH0KLnVpLWljb24tY2xpcGJvYXJkIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0xMjhweDsgfQoudWktaWNvbi1jb3B5IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xMjhweDsgfQoudWktaWNvbi1jb250YWN0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0xMjhweDsgfQoudWktaWNvbi1pbWFnZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtMTI4cHg7IH0KLnVpLWljb24tdmlkZW8geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTEyOHB4OyB9Ci51aS1pY29uLXNjcmlwdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yNDBweCAtMTI4cHg7IH0KLnVpLWljb24tYWxlcnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNDRweDsgfQoudWktaWNvbi1pbmZvIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTE0NHB4OyB9Ci51aS1pY29uLW5vdGljZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNDRweDsgfQoudWktaWNvbi1oZWxwIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE0NHB4OyB9Ci51aS1pY29uLWNoZWNrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE0NHB4OyB9Ci51aS1pY29uLWJ1bGxldCB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNDRweDsgfQoudWktaWNvbi1yYWRpby1vZmYgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTQ0cHg7IH0KLnVpLWljb24tcmFkaW8tb24geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTE0NHB4OyB9Ci51aS1pY29uLXBpbi13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xNDRweDsgfQoudWktaWNvbi1waW4tcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTQ0cHg7IH0KLnVpLWljb24tcGxheSB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTE2MHB4OyB9Ci51aS1pY29uLXBhdXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTE2MHB4OyB9Ci51aS1pY29uLXNlZWstbmV4dCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNjBweDsgfQoudWktaWNvbi1zZWVrLXByZXYgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTYwcHg7IH0KLnVpLWljb24tc2Vlay1lbmQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTYwcHg7IH0KLnVpLWljb24tc2Vlay1zdGFydCB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNjBweDsgfQovKiB1aS1pY29uLXNlZWstZmlyc3QgaXMgZGVwcmVjYXRlZCwgdXNlIHVpLWljb24tc2Vlay1zdGFydCBpbnN0ZWFkICovCi51aS1pY29uLXNlZWstZmlyc3QgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTYwcHg7IH0KLnVpLWljb24tc3RvcCB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xNjBweDsgfQoudWktaWNvbi1lamVjdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTYwcHg7IH0KLnVpLWljb24tdm9sdW1lLW9mZiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTYwcHg7IH0KLnVpLWljb24tdm9sdW1lLW9uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xNjBweDsgfQoudWktaWNvbi1wb3dlciB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTE3NnB4OyB9Ci51aS1pY29uLXNpZ25hbC1kaWFnIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTE3NnB4OyB9Ci51aS1pY29uLXNpZ25hbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNzZweDsgfQoudWktaWNvbi1iYXR0ZXJ5LTAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTc2cHg7IH0KLnVpLWljb24tYmF0dGVyeS0xIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE3NnB4OyB9Ci51aS1pY29uLWJhdHRlcnktMiB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNzZweDsgfQoudWktaWNvbi1iYXR0ZXJ5LTMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTc2cHg7IH0KLnVpLWljb24tY2lyY2xlLXBsdXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtbWludXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLWNsb3NlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS10cmlhbmdsZS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS10cmlhbmdsZS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS10cmlhbmdsZS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS10cmlhbmdsZS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS1hcnJvdy1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtYXJyb3ctcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLWFycm93LXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS1hcnJvdy1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtem9vbWluIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtem9vbW91dCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLWNoZWNrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGVzbWFsbC1wbHVzIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMjA4cHg7IH0KLnVpLWljb24tY2lyY2xlc21hbGwtbWludXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMjA4cHg7IH0KLnVpLWljb24tY2lyY2xlc21hbGwtY2xvc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMjA4cHg7IH0KLnVpLWljb24tc3F1YXJlc21hbGwtcGx1cyB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0yMDhweDsgfQoudWktaWNvbi1zcXVhcmVzbWFsbC1taW51cyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0yMDhweDsgfQoudWktaWNvbi1zcXVhcmVzbWFsbC1jbG9zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0yMDhweDsgfQoudWktaWNvbi1ncmlwLWRvdHRlZC12ZXJ0aWNhbCB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTIyNHB4OyB9Ci51aS1pY29uLWdyaXAtZG90dGVkLWhvcml6b250YWwgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMjI0cHg7IH0KLnVpLWljb24tZ3JpcC1zb2xpZC12ZXJ0aWNhbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0yMjRweDsgfQoudWktaWNvbi1ncmlwLXNvbGlkLWhvcml6b250YWwgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMjI0cHg7IH0KLnVpLWljb24tZ3JpcHNtYWxsLWRpYWdvbmFsLXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTIyNHB4OyB9Ci51aS1pY29uLWdyaXAtZGlhZ29uYWwtc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMjI0cHg7IH0KCgovKiBNaXNjIHZpc3VhbHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBDb3JuZXIgcmFkaXVzICovCi51aS1jb3JuZXItdGwgeyAtbW96LWJvcmRlci1yYWRpdXMtdG9wbGVmdDogNHB4OyAtd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDsgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OyB9Ci51aS1jb3JuZXItdHIgeyAtbW96LWJvcmRlci1yYWRpdXMtdG9wcmlnaHQ6IDRweDsgLXdlYmtpdC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OyB9Ci51aS1jb3JuZXItYmwgeyAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDogNHB4OyAtd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4OyB9Ci51aS1jb3JuZXItYnIgeyAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6IDRweDsgLXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OyB9Ci51aS1jb3JuZXItdG9wIHsgLW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6IDRweDsgLXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7IGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDsgLW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OiA0cHg7IC13ZWJraXQtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDsgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDsgfQoudWktY29ybmVyLWJvdHRvbSB7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiA0cHg7IC13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDogNHB4OyAtd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7IH0KLnVpLWNvcm5lci1yaWdodCB7ICAtbW96LWJvcmRlci1yYWRpdXMtdG9wcmlnaHQ6IDRweDsgLXdlYmtpdC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OyAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6IDRweDsgLXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OyB9Ci51aS1jb3JuZXItbGVmdCB7IC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OiA0cHg7IC13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OyBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiA0cHg7IC13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7IH0KLnVpLWNvcm5lci1hbGwgeyAtbW96LWJvcmRlci1yYWRpdXM6IDRweDsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgfQoKLyogT3ZlcmxheXMgKi8KLnVpLXdpZGdldC1vdmVybGF5IHsgYmFja2dyb3VuZDogI2FhYWFhYSB1cmwoaW1hZ2VzL3VpLWJnX2ZsYXRfMF9hYWFhYWFfNDB4MTAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsgb3BhY2l0eTogLjMwO2ZpbHRlcjpBbHBoYShPcGFjaXR5PTMwKTsgfQoudWktd2lkZ2V0LXNoYWRvdyB7IG1hcmdpbjogLThweCAwIDAgLThweDsgcGFkZGluZzogOHB4OyBiYWNrZ3JvdW5kOiAjYWFhYWFhIHVybChpbWFnZXMvdWktYmdfZmxhdF8wX2FhYWFhYV80MHgxMDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBvcGFjaXR5OiAuMzA7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MzApOyAtbW96LWJvcmRlci1yYWRpdXM6IDhweDsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgfS8qCiAqIGpRdWVyeSBVSSBSZXNpemFibGUgQFZFUlNJT04KICoKICogQ29weXJpZ2h0IDIwMTAsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1Jlc2l6YWJsZSN0aGVtaW5nCiAqLwoudWktcmVzaXphYmxlIHsgcG9zaXRpb246IHJlbGF0aXZlO30KLnVpLXJlc2l6YWJsZS1oYW5kbGUgeyBwb3NpdGlvbjogYWJzb2x1dGU7Zm9udC1zaXplOiAwLjFweDt6LWluZGV4OiA5OTk5OTsgZGlzcGxheTogYmxvY2s7fQoudWktcmVzaXphYmxlLWRpc2FibGVkIC51aS1yZXNpemFibGUtaGFuZGxlLCAudWktcmVzaXphYmxlLWF1dG9oaWRlIC51aS1yZXNpemFibGUtaGFuZGxlIHsgZGlzcGxheTogbm9uZTsgfQoudWktcmVzaXphYmxlLW4geyBjdXJzb3I6IG4tcmVzaXplOyBoZWlnaHQ6IDdweDsgd2lkdGg6IDEwMCU7IHRvcDogLTVweDsgbGVmdDogMDsgfQoudWktcmVzaXphYmxlLXMgeyBjdXJzb3I6IHMtcmVzaXplOyBoZWlnaHQ6IDdweDsgd2lkdGg6IDEwMCU7IGJvdHRvbTogLTVweDsgbGVmdDogMDsgfQoudWktcmVzaXphYmxlLWUgeyBjdXJzb3I6IGUtcmVzaXplOyB3aWR0aDogN3B4OyByaWdodDogLTVweDsgdG9wOiAwOyBoZWlnaHQ6IDEwMCU7IH0KLnVpLXJlc2l6YWJsZS13IHsgY3Vyc29yOiB3LXJlc2l6ZTsgd2lkdGg6IDdweDsgbGVmdDogLTVweDsgdG9wOiAwOyBoZWlnaHQ6IDEwMCU7IH0KLnVpLXJlc2l6YWJsZS1zZSB7IGN1cnNvcjogc2UtcmVzaXplOyB3aWR0aDogMTJweDsgaGVpZ2h0OiAxMnB4OyByaWdodDogMXB4OyBib3R0b206IDFweDsgfQoudWktcmVzaXphYmxlLXN3IHsgY3Vyc29yOiBzdy1yZXNpemU7IHdpZHRoOiA5cHg7IGhlaWdodDogOXB4OyBsZWZ0OiAtNXB4OyBib3R0b206IC01cHg7IH0KLnVpLXJlc2l6YWJsZS1udyB7IGN1cnNvcjogbnctcmVzaXplOyB3aWR0aDogOXB4OyBoZWlnaHQ6IDlweDsgbGVmdDogLTVweDsgdG9wOiAtNXB4OyB9Ci51aS1yZXNpemFibGUtbmUgeyBjdXJzb3I6IG5lLXJlc2l6ZTsgd2lkdGg6IDlweDsgaGVpZ2h0OiA5cHg7IHJpZ2h0OiAtNXB4OyB0b3A6IC01cHg7fS8qCiAqIGpRdWVyeSBVSSBTZWxlY3RhYmxlIEBWRVJTSU9OCiAqCiAqIENvcHlyaWdodCAyMDEwLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9TZWxlY3RhYmxlI3RoZW1pbmcKICovCi51aS1zZWxlY3RhYmxlLWhlbHBlciB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgei1pbmRleDogMTAwOyBib3JkZXI6MXB4IGRvdHRlZCBibGFjazsgfQovKgogKiBqUXVlcnkgVUkgRGlhbG9nIEBWRVJTSU9OCiAqCiAqIENvcHlyaWdodCAyMDEwLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9EaWFsb2cjdGhlbWluZwogKi8KLnVpLWRpYWxvZyB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgcGFkZGluZzogLjJlbTsgd2lkdGg6IDMwMHB4OyBvdmVyZmxvdzogaGlkZGVuOyB9Ci51aS1kaWFsb2cgLnVpLWRpYWxvZy10aXRsZWJhciB7IHBhZGRpbmc6IC41ZW0gMWVtIC4zZW07IHBvc2l0aW9uOiByZWxhdGl2ZTsgIH0KLnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlIHsgZmxvYXQ6IGxlZnQ7IG1hcmdpbjogLjFlbSAxNnB4IC4yZW0gMDsgfSAKLnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlIHsgcG9zaXRpb246IGFic29sdXRlOyByaWdodDogLjNlbTsgdG9wOiA1MCU7IHdpZHRoOiAxOXB4OyBtYXJnaW46IC0xMHB4IDAgMCAwOyBwYWRkaW5nOiAxcHg7IGhlaWdodDogMThweDsgfQoudWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2Ugc3BhbiB7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IDFweDsgfQoudWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2U6aG92ZXIsIC51aS1kaWFsb2cgLnVpLWRpYWxvZy10aXRsZWJhci1jbG9zZTpmb2N1cyB7IHBhZGRpbmc6IDA7IH0KLnVpLWRpYWxvZyAudWktZGlhbG9nLWNvbnRlbnQgeyBwb3NpdGlvbjogcmVsYXRpdmU7IGJvcmRlcjogMDsgcGFkZGluZzogLjVlbSAxZW07IGJhY2tncm91bmQ6IG5vbmU7IG92ZXJmbG93OiBhdXRvOyB6b29tOiAxOyB9Ci51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5lIHsgdGV4dC1hbGlnbjogbGVmdDsgYm9yZGVyLXdpZHRoOiAxcHggMCAwIDA7IGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IG1hcmdpbjogLjVlbSAwIDAgMDsgcGFkZGluZzogLjNlbSAxZW0gLjVlbSAuNGVtOyB9Ci51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5lIC51aS1kaWFsb2ctYnV0dG9uc2V0IHsgZmxvYXQ6IHJpZ2h0OyB9Ci51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5lIGJ1dHRvbiB7IG1hcmdpbjogLjVlbSAuNGVtIC41ZW0gMDsgY3Vyc29yOiBwb2ludGVyOyB9Ci51aS1kaWFsb2cgLnVpLXJlc2l6YWJsZS1zZSB7IHdpZHRoOiAxNHB4OyBoZWlnaHQ6IDE0cHg7IHJpZ2h0OiAzcHg7IGJvdHRvbTogM3B4OyB9Ci51aS1kcmFnZ2FibGUgLnVpLWRpYWxvZy10aXRsZWJhciB7IGN1cnNvcjogbW92ZTsgfQovKgogKiBqUXVlcnkgVUkgVGFicyBAVkVSU0lPTgogKgogKiBDb3B5cmlnaHQgMjAxMCwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvVGFicyN0aGVtaW5nCiAqLwoudWktdGFicyB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZzogLjJlbTsgem9vbTogMTsgfSAvKiBwb3NpdGlvbjogcmVsYXRpdmUgcHJldmVudHMgSUUgc2Nyb2xsIGJ1ZyAoZWxlbWVudCB3aXRoIHBvc2l0aW9uOiByZWxhdGl2ZSBpbnNpZGUgY29udGFpbmVyIHdpdGggb3ZlcmZsb3c6IGF1dG8gYXBwZWFyIGFzICJmaXhlZCIpICovCi51aS10YWJzIC51aS10YWJzLW5hdiB7IG1hcmdpbjogMDsgcGFkZGluZzogLjJlbSAuMmVtIDA7IH0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIHsgbGlzdC1zdHlsZTogbm9uZTsgZmxvYXQ6IGxlZnQ7IHBvc2l0aW9uOiByZWxhdGl2ZTsgdG9wOiAxcHg7IG1hcmdpbjogMCAuMmVtIDFweCAwOyBib3JkZXItYm90dG9tOiAwICFpbXBvcnRhbnQ7IHBhZGRpbmc6IDA7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIGEgeyBmbG9hdDogbGVmdDsgcGFkZGluZzogLjVlbSAxZW07IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQoudWktdGFicyAudWktdGFicy1uYXYgbGkudWktdGFicy1zZWxlY3RlZCB7IG1hcmdpbi1ib3R0b206IDA7IHBhZGRpbmctYm90dG9tOiAxcHg7IH0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtc2VsZWN0ZWQgYSwgLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXN0YXRlLWRpc2FibGVkIGEsIC51aS10YWJzIC51aS10YWJzLW5hdiBsaS51aS1zdGF0ZS1wcm9jZXNzaW5nIGEgeyBjdXJzb3I6IHRleHQ7IH0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIGEsIC51aS10YWJzLnVpLXRhYnMtY29sbGFwc2libGUgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtc2VsZWN0ZWQgYSB7IGN1cnNvcjogcG9pbnRlcjsgfSAvKiBmaXJzdCBzZWxlY3RvciBpbiBncm91cCBzZWVtcyBvYnNvbGV0ZSwgYnV0IHJlcXVpcmVkIHRvIG92ZXJjb21lIGJ1ZyBpbiBPcGVyYSBhcHBseWluZyBjdXJzb3I6IHRleHQgb3ZlcmFsbCBpZiBkZWZpbmVkIGVsc2V3aGVyZS4uLiAqLwoudWktdGFicyAudWktdGFicy1wYW5lbCB7IGRpc3BsYXk6IGJsb2NrOyBib3JkZXItd2lkdGg6IDA7IHBhZGRpbmc6IDFlbSAxLjRlbTsgYmFja2dyb3VuZDogbm9uZTsgfQoudWktdGFicyAudWktdGFicy1oaWRlIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/README</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ICAgICAgICBfICAgX19fX18gICAgX19fX19fXyAgIF9fX19fXyAKICAgICAgIHwgfCB8ICBfXyBcICB8X18gICBfX3wgfCAgX19fX3wKICBfX18gIHwgfCB8IHxfXykgfCAgICB8IHwgICAgfCB8X18gICAKIC8gXyBcIHwgfCB8ICBfICAvICAgICB8IHwgICAgfCAgX198ICAKfCAgX18vIHwgfCB8IHwgXCBcICAgICB8IHwgICAgfCB8X19fXyAKIFxfX198IHxffCB8X3wgIFxfXCAgICB8X3wgICAgfF9fX19fX3wKCgoKRGVzY3JpcHRpb24KPT09PT09PT09PT0KCkhvbWVwYWdlOiBodHRwOi8vZWxydGUub3JnCkUtbWFpbDogICBkZXZAc3RkNDIucnUKCmVsUlRFIGlzIGFuIG9wZW4tc291cmNlIFdZU0lXWUcgSFRNTC1lZGl0b3Igd3JpdHRlbiBpbiBKYXZhU2NyaXB0IHVzaW5nCmpRdWVyeSBVSS4gSXQgZmVhdHVyZXMgcmljaCB0ZXh0IGVkaXRpbmcsIG9wdGlvbnMgZm9yIGNoYW5naW5nIGl0cyBhcHBlYXJhbmNlLApzdHlsZSBhbmQgbWFueSBtb3JlLiBZb3UgY2FuIHVzZSBpdCBpbiBhbnkgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbApwcm9qZWN0cy4gTWFpbiBnb2FsIG9mIHRoZSBlZGl0b3IgLSBzaW1wbGlmeSB3b3JrIHdpdGggdGV4dCBhbmQgZm9ybWF0aW5nCihIVE1MKSBvbiBzaXRlcywgYmxvZ3MsIGZvcnVtcyBhbmQgb3RoZXIgb25saW5lIHNlcnZpY2VzLgoKClVzYWdlCj09PT09CgogKiBSaWNoIHRleHQgZWRpdGluZywgY2hhbmdlIGl0cyBhcHBlYXJhbmNlIGFuZCBzdHlsZQogKiBJbnNlcnQgYW5kIG1hbmFnZSB2YXJpb3VzIEhUTUwgZWxlbWVudHMgd2l0aCBmb3JtYXR0aW5nIChpbWFnZXMsIHRhYmxlcywKICAgbGlzdHMgYW5kIGV0Yy4pCiAqIFZpZXcgYW5kIGVkaXQgSFRNTC1jb2RlCgoKRmVhdHVyZXMKPT09PT09PT0KCiAqIEFkdmFuY2VkIHdvcmsgd2l0aCBDU1MKICAgLSBTZXR0aW5nIGluZGVudGF0aW9uIChtYXJnaW5zLCBwYWRkaW5ncykgZm9yIGltYWdlcyBhbmQgdGFibGUgY2VsbHMKICAgICAoc2VwZXJhdGUgZm9yIGVhY2ggZGlyZWN0aW9uKQogICAtIENvbnRyb2xsaW5nIGJvcmRlciBwcm9wZXJ0aWVzICh3aWR0aCwgc3R5bGUsIGNvbG9yKSB3aXRoIGNvbnZlbmllbnQgZGlhbG9ncwogICAtIFdyaXRpbmcgZWxlbWVudCBwcm9wZXJ0aWVzIGFzIENTUy1zdHlsZSBhbHdheXMgd2hlbiBwb3NzaWJsZQogKiBMaWdodHdlaWdodCwgZmFzdCBhbmQgZWFzeSB0byBpbnRlZ3JhdGUKICogSW50ZXJmYWNlIGFwcGVhcmFuY2UgaXMgY29uZmlndXJlZCBmcm9tIG9uZSBDU1MgZmlsZQogKiBObyB0ZW1wbGF0ZXMgdXNlZAogKiBpMThuLiBUaGUgZWRpdG9yIGNhbiBiZSBlYXNpbHkgbG9jYWxpemVkIGludG8gYW55IGxhbmd1YWdlLiBDdXJyZW50bHkKICAgYXZhaWxhYmxlIGluIEVuZ2xpc2gsIEdlcm1hbiwgSmFwYW5lc2UsIExhdHZpYW4sIFNwYW5pc2gsIFJ1c3NpYW4gYW5kCiAgIFVrcmFpbmlhbiBsYW5ndWFnZXMKICogRGVzaWduZWQgdG8gd29yayB3aXRoIGVsRmluZGVyIGZpbGUgbWFuYWdlciAoaHR0cDovL2VscnRlLm9yZy9lbGZpbmRlciksCiAgIGJ1dCBhbHNvIGNhbiBiZSB1c2VkIHdpdGggYW55IG90aGVyCiAqIEZsZXhpYmxlIGZvciBleHRlbnNpb25zCgoKUmVxdWlyZW1lbnRzCj09PT09PT09PT09PQoKTW9kZXJuIGJyb3dzZXIuIGVsUlRFIGhhcyBiZWVuIHRlc3RlZCBpbiBGaXJlZm94IDMuNSssIEludGVybmV0IEV4cGxvcmVyIDcgJiA4LApTYWZhcmkgNC81LCBPcGVyYSAxMCBhbmQgQ2hyb21lIDQvNS82CgoKRG9jdW1lbnRhdGlvbgo9PT09PT09PT09PT09CgpodHRwOi8vZWxydGUub3JnL3JlZG1pbmUvd2lraS9lbHJ0ZQoKCkF1dGhvcnMKPT09PT09PQoKQ2hpZWYgZGV2ZWxvcGVyOiBEbWl0cnkgImRpbyIgTGV2YXNob3YgPGRpb0BzdGQ0Mi5ydT4KRGV2ZWxvcGVyLCB0ZWNoIHN1cHBvcnQ6IFRyb2V4IE5ldmVsaW4gPHRyb2V4QGZ1cnkuc2NhbmNvZGUucnU+CkRlc2lnbjogVmFsZW50aW4gUmF6dW1uaWgKCgpUcmFuc2xhdG9ycwo9PT09PT09PT09PQoKQXJhYmljOiAgICAgICAgICAgICAgIHRhd2ZlayBkYWdoaXN0YW5pIDx0YXdmZWtvdkBnbWFpbC5jb20+CkR1dGNoOiAgICAgICAgICAgICAgICBLdXJ0IEFlcnRzIGh0dHA6Ly9pbGFic29sdXRpb25zLm5ldC8KRW5nbGlzaDogICAgICAgICAgICAgIERtaXRyeSAiZGlvIiBMZXZhc2hvdiA8ZGlvQHN0ZDQyLnJ1PgpGcmVuY2g6ICAgICAgICAgICAgICAgRnJhbmNvaXMgTWF6ZXJvbGxlIDxmbWF6MDA4QGdtYWlsLmNvbT4KR2VybWFuOiAgICAgICAgICAgICAgIFZhc2lsaXkgUmF6dW1ueWggPHJ2bkBzdGQ0Mi5ydT4KSHVuZ2FyaWFuOiAgICAgICAgICAgIFZpa3RvciBUYW1hcyA8dGFtYXMudmlrdG9yQHRvdGFsc3R1ZGlvLmh1PgpJdGFsaWFuOiAgICAgICAgICAgICAgVWdvIFB1bnpvbG8gPHNhZHJhY3plcm91bm9AZ21haWwuY29tPgpKYXBhbmVzZTogICAgICAgICAgICAgVG9tb2FraSBZb3NoaWRhIDxpbmZvQHlvc2hpZGEtc3R1ZGlvLmpwPgpMYXR2aWFuOiAgICAgICAgICAgICAgVWxkaXMgUGxvdGnFhsWhIDx1bGRpcy5wbG90aW5zQGdtYWlsLmNvbT4KUGVyc2lhbiAoRmFyc2kpOiAgICAgIFNhbGVoIHNvb3phbmNoaSA8aW5mb0Bzb296YW5jaGkuaXI+ClBvbGlzaDogICAgICAgICAgICAgICBBbmRyemVqIEJvcm93aWN6IGh0dHA6Ly9ib3Jvd2ljei5pbmZvLwpTcGFuaXNoOiAgICAgICAgICAgICAgUmljYXJkbyBPYnJlZ8OzbiA8cm9icmVnb25tQGdtYWlsLmNvbT4KUnVzc2lhbjogICAgICAgICAgICAgIERtaXRyeSAiZGlvIiBMZXZhc2hvdiA8ZGlvQHN0ZDQyLnJ1PgpUcmFkaXRpb25hbCBDaGluZXNlOiAgVGFkIDx0YWQwNjE2QGdtYWlsLmNvbT4KVWtyYW5pYW46ICAgICAgICAgICAgIEFydGVtIFZhc2lseWV2CgoKV2UgaG9wZSBvdXIgdG9vbHMgd2lsbCBiZSBoZWxwZnVsIGZvciB5b3UuCgoKTGljZW5zZToKPT09PT09PT0KCmVsUlRFIGlzIGlzc3VlZCB1bmRlciBhIDMtY2xhdXNlcyBCU0QgbGljZW5zZS4KZWxSVEUgdXNlcyBhbmQgY29tZXMgd2l0aCBqUXVlcnkgYW5kIGpRdWVyeS1VSSB3aXRjaCBhcmUgaXNzdWVkIHVuZGVyCk1JVCBhbmQgR1BMIGxpY2Vuc2VzLgoKClRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHVuZGVyIGEgMyBjbGF1c2VzIEJTRCBsaWNlbnNlOgoKQ29weXJpZ2h0IChjKSAyMDA5LCBTdHVkaW8gNDIgTHRkLgpBbGwgcmlnaHRzIHJlc2VydmVkLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cm1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU3R1ZGlvIDQyIEx0ZC4gbm9yIHRoZQogICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgU3R1ZGlvIDQyIEx0ZC4gJydBUyBJUycnIEFORCBBTlkKRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRApXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCkRJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFN0dWRpbyA0MiBMdGQuIEJFIExJQUJMRSBGT1IgQU5ZCkRJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCihJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECk9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCihJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTClNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoK]]></data>
	</file>
	<file>
	  <filename>/plugins/elrte/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/elrte/templates/admineditor.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRmb3Jtc3RhcnR9Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRlbHJ0ZVRvb2xiYXJfbGFiZWx9PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZWxydGVUb29sYmFyX2lucHV0fTxici8+eyRlbHJ0ZVRvb2xiYXJfaGVscH08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JGVscnRlSlF1ZXJ5TG9hZF9sYWJlbH08L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRlbHJ0ZUpRdWVyeUxvYWRfaW5wdXR9PGJyLz57JGVscnRlSlF1ZXJ5TG9hZF9oZWxwfTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPiZuYnNwOzwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JHN1Ym1pdH17JGNhbmNlbH08L3A+Cgk8L2Rpdj4KeyRmb3JtZW5kfQ==]]></data>
	</file>
	<file>
	  <filename>/plugins/nicedit/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/nicedit/img/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/nicedit/img/nicEditorIcons.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[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]]></data>
	</file>
	<file>
	  <filename>/plugins/nicedit/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/nicedit/js/jquery.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuMy4yCiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDkgSm9obiBSZXNpZwogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlcy4KICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9MaWNlbnNlCiAqCiAqIERhdGU6IDIwMDktMDItMTkgMTc6MzQ6MjEgLTA1MDAgKFRodSwgMTkgRmViIDIwMDkpCiAqIFJldmlzaW9uOiA2MjQ2CiAqLwooZnVuY3Rpb24oKXsKCnZhciAKCS8vIFdpbGwgc3BlZWQgdXAgcmVmZXJlbmNlcyB0byB3aW5kb3csIGFuZCBhbGxvd3MgbXVuZ2luZyBpdHMgbmFtZS4KCXdpbmRvdyA9IHRoaXMsCgkvLyBXaWxsIHNwZWVkIHVwIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkLCBhbmQgYWxsb3dzIG11bmdpbmcgaXRzIG5hbWUuCgl1bmRlZmluZWQsCgkvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAoJLy8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV8kID0gd2luZG93LiQsCgoJalF1ZXJ5ID0gd2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCS8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJwoJCXJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7Cgl9LAoKCS8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzIG9yIElEIHN0cmluZ3MKCS8vIChib3RoIG9mIHdoaWNoIHdlIG9wdGltaXplIGZvcikKCXF1aWNrRXhwciA9IC9eW148XSooPCgufFxzKSs+KVtePl0qJHxeIyhbXHctXSspJC8sCgkvLyBJcyBpdCBhIHNpbXBsZSBzZWxlY3RvcgoJaXNTaW1wbGUgPSAvXi5bXjojXFtcLixdKiQvOwoKalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKCWluaXQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKCQkvLyBNYWtlIHN1cmUgdGhhdCBhIHNlbGVjdGlvbiB3YXMgcHJvdmlkZWQKCQlzZWxlY3RvciA9IHNlbGVjdG9yIHx8IGRvY3VtZW50OwoKCQkvLyBIYW5kbGUgJChET01FbGVtZW50KQoJCWlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7CgkJCXRoaXNbMF0gPSBzZWxlY3RvcjsKCQkJdGhpcy5sZW5ndGggPSAxOwoJCQl0aGlzLmNvbnRleHQgPSBzZWxlY3RvcjsKCQkJcmV0dXJuIHRoaXM7CgkJfQoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCS8vIEFyZSB3ZSBkZWFsaW5nIHdpdGggSFRNTCBzdHJpbmcgb3IgYW4gSUQ/CgkJCXZhciBtYXRjaCA9IHF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApOwoKCQkJLy8gVmVyaWZ5IGEgbWF0Y2gsIGFuZCB0aGF0IG5vIGNvbnRleHQgd2FzIHNwZWNpZmllZCBmb3IgI2lkCgkJCWlmICggbWF0Y2ggJiYgKG1hdGNoWzFdIHx8ICFjb250ZXh0KSApIHsKCgkJCQkvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSkKCQkJCWlmICggbWF0Y2hbMV0gKQoJCQkJCXNlbGVjdG9yID0galF1ZXJ5LmNsZWFuKCBbIG1hdGNoWzFdIF0sIGNvbnRleHQgKTsKCgkJCQkvLyBIQU5ETEU6ICQoIiNpZCIpCgkJCQllbHNlIHsKCQkJCQl2YXIgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFszXSApOwoKCQkJCQkvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgSUUgYW5kIE9wZXJhIHJldHVybiBpdGVtcwoJCQkJCS8vIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAoJCQkJCWlmICggZWxlbSAmJiBlbGVtLmlkICE9IG1hdGNoWzNdICkKCQkJCQkJcmV0dXJuIGpRdWVyeSgpLmZpbmQoIHNlbGVjdG9yICk7CgoJCQkJCS8vIE90aGVyd2lzZSwgd2UgaW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKCQkJCQl2YXIgcmV0ID0galF1ZXJ5KCBlbGVtIHx8IFtdICk7CgkJCQkJcmV0LmNvbnRleHQgPSBkb2N1bWVudDsKCQkJCQlyZXQuc2VsZWN0b3IgPSBzZWxlY3RvcjsKCQkJCQlyZXR1cm4gcmV0OwoJCQkJfQoKCQkJLy8gSEFORExFOiAkKGV4cHIsIFtjb250ZXh0XSkKCQkJLy8gKHdoaWNoIGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZW50KS5maW5kKGV4cHIpCgkJCX0gZWxzZQoJCQkJcmV0dXJuIGpRdWVyeSggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKCQl9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApCgkJCXJldHVybiBqUXVlcnkoIGRvY3VtZW50ICkucmVhZHkoIHNlbGVjdG9yICk7CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IG9sZCBzZWxlY3RvciBzdGF0ZSBpcyBwYXNzZWQgYWxvbmcKCQlpZiAoIHNlbGVjdG9yLnNlbGVjdG9yICYmIHNlbGVjdG9yLmNvbnRleHQgKSB7CgkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rvci5zZWxlY3RvcjsKCQkJdGhpcy5jb250ZXh0ID0gc2VsZWN0b3IuY29udGV4dDsKCQl9CgoJCXJldHVybiB0aGlzLnNldEFycmF5KGpRdWVyeS5pc0FycmF5KCBzZWxlY3RvciApID8KCQkJc2VsZWN0b3IgOgoJCQlqUXVlcnkubWFrZUFycmF5KHNlbGVjdG9yKSk7Cgl9LAoKCS8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0b3IKCXNlbGVjdG9yOiAiIiwKCgkvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkCglqcXVlcnk6ICIxLjMuMiIsCgoJLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQKCXNpemU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmxlbmd0aDsKCX0sCgoJLy8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUgoJLy8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXkKCWdldDogZnVuY3Rpb24oIG51bSApIHsKCQlyZXR1cm4gbnVtID09PSB1bmRlZmluZWQgPwoKCQkJLy8gUmV0dXJuIGEgJ2NsZWFuJyBhcnJheQoJCQlBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggdGhpcyApIDoKCgkJCS8vIFJldHVybiBqdXN0IHRoZSBvYmplY3QKCQkJdGhpc1sgbnVtIF07Cgl9LAoKCS8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sKCS8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KQoJcHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMsIG5hbWUsIHNlbGVjdG9yICkgewoJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CgkJdmFyIHJldCA9IGpRdWVyeSggZWxlbXMgKTsKCgkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKCQlyZXQucHJldk9iamVjdCA9IHRoaXM7CgoJCXJldC5jb250ZXh0ID0gdGhpcy5jb250ZXh0OwoKCQlpZiAoIG5hbWUgPT09ICJmaW5kIiApCgkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAodGhpcy5zZWxlY3RvciA/ICIgIiA6ICIiKSArIHNlbGVjdG9yOwoJCWVsc2UgaWYgKCBuYW1lICkKCQkJcmV0LnNlbGVjdG9yID0gdGhpcy5zZWxlY3RvciArICIuIiArIG5hbWUgKyAiKCIgKyBzZWxlY3RvciArICIpIjsKCgkJLy8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXQKCQlyZXR1cm4gcmV0OwoJfSwKCgkvLyBGb3JjZSB0aGUgY3VycmVudCBtYXRjaGVkIHNldCBvZiBlbGVtZW50cyB0byBiZWNvbWUKCS8vIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgZWxlbWVudHMgKGRlc3Ryb3lpbmcgdGhlIHN0YWNrIGluIHRoZSBwcm9jZXNzKQoJLy8gWW91IHNob3VsZCB1c2UgcHVzaFN0YWNrKCkgaW4gb3JkZXIgdG8gZG8gdGhpcywgYnV0IG1haW50YWluIHRoZSBzdGFjawoJc2V0QXJyYXk6IGZ1bmN0aW9uKCBlbGVtcyApIHsKCQkvLyBSZXNldHRpbmcgdGhlIGxlbmd0aCB0byAwLCB0aGVuIHVzaW5nIHRoZSBuYXRpdmUgQXJyYXkgcHVzaAoJCS8vIGlzIGEgc3VwZXItZmFzdCB3YXkgdG8gcG9wdWxhdGUgYW4gb2JqZWN0IHdpdGggYXJyYXktbGlrZSBwcm9wZXJ0aWVzCgkJdGhpcy5sZW5ndGggPSAwOwoJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCB0aGlzLCBlbGVtcyApOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KCS8vIChZb3UgY2FuIHNlZWQgdGhlIGFyZ3VtZW50cyB3aXRoIGFuIGFycmF5IG9mIGFyZ3MsIGJ1dCB0aGlzIGlzCgkvLyBvbmx5IHVzZWQgaW50ZXJuYWxseS4pCgllYWNoOiBmdW5jdGlvbiggY2FsbGJhY2ssIGFyZ3MgKSB7CgkJcmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjaywgYXJncyApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCgkvLyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoCgkJCS8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAoJCQllbGVtICYmIGVsZW0uanF1ZXJ5ID8gZWxlbVswXSA6IGVsZW0KCQksIHRoaXMgKTsKCX0sCgoJYXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlLCB0eXBlICkgewoJCXZhciBvcHRpb25zID0gbmFtZTsKCgkJLy8gTG9vayBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UncmUgYWNjZXNzaW5nIGEgc3R5bGUgdmFsdWUKCQlpZiAoIHR5cGVvZiBuYW1lID09PSAic3RyaW5nIiApCgkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApCgkJCQlyZXR1cm4gdGhpc1swXSAmJiBqUXVlcnlbIHR5cGUgfHwgImF0dHIiIF0oIHRoaXNbMF0sIG5hbWUgKTsKCgkJCWVsc2UgewoJCQkJb3B0aW9ucyA9IHt9OwoJCQkJb3B0aW9uc1sgbmFtZSBdID0gdmFsdWU7CgkJCX0KCgkJLy8gQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHNldHRpbmcgc3R5bGUgdmFsdWVzCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKXsKCQkJLy8gU2V0IGFsbCB0aGUgc3R5bGVzCgkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApCgkJCQlqUXVlcnkuYXR0cigKCQkJCQl0eXBlID8KCQkJCQkJdGhpcy5zdHlsZSA6CgkJCQkJCXRoaXMsCgkJCQkJbmFtZSwgalF1ZXJ5LnByb3AoIHRoaXMsIG9wdGlvbnNbIG5hbWUgXSwgdHlwZSwgaSwgbmFtZSApCgkJCQkpOwoJCX0pOwoJfSwKCgljc3M6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCS8vIGlnbm9yZSBuZWdhdGl2ZSB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcwoJCWlmICggKGtleSA9PSAnd2lkdGgnIHx8IGtleSA9PSAnaGVpZ2h0JykgJiYgcGFyc2VGbG9hdCh2YWx1ZSkgPCAwICkKCQkJdmFsdWUgPSB1bmRlZmluZWQ7CgkJcmV0dXJuIHRoaXMuYXR0cigga2V5LCB2YWx1ZSwgImN1ckNTUyIgKTsKCX0sCgoJdGV4dDogZnVuY3Rpb24oIHRleHQgKSB7CgkJaWYgKCB0eXBlb2YgdGV4dCAhPT0gIm9iamVjdCIgJiYgdGV4dCAhPSBudWxsICkKCQkJcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoICh0aGlzWzBdICYmIHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUoIHRleHQgKSApOwoKCQl2YXIgcmV0ID0gIiI7CgoJCWpRdWVyeS5lYWNoKCB0ZXh0IHx8IHRoaXMsIGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5lYWNoKCB0aGlzLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKCl7CgkJCQlpZiAoIHRoaXMubm9kZVR5cGUgIT0gOCApCgkJCQkJcmV0ICs9IHRoaXMubm9kZVR5cGUgIT0gMSA/CgkJCQkJCXRoaXMubm9kZVZhbHVlIDoKCQkJCQkJalF1ZXJ5LmZuLnRleHQoIFsgdGhpcyBdICk7CgkJCX0pOwoJCX0pOwoKCQlyZXR1cm4gcmV0OwoJfSwKCgl3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCApIHsKCQlpZiAoIHRoaXNbMF0gKSB7CgkJCS8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kCgkJCXZhciB3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWzBdLm93bmVyRG9jdW1lbnQgKS5jbG9uZSgpOwoKCQkJaWYgKCB0aGlzWzBdLnBhcmVudE5vZGUgKQoJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbMF0gKTsKCgkJCXdyYXAubWFwKGZ1bmN0aW9uKCl7CgkJCQl2YXIgZWxlbSA9IHRoaXM7CgoJCQkJd2hpbGUgKCBlbGVtLmZpcnN0Q2hpbGQgKQoJCQkJCWVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7CgoJCQkJcmV0dXJuIGVsZW07CgkJCX0pLmFwcGVuZCh0aGlzKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgl3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkJalF1ZXJ5KCB0aGlzICkuY29udGVudHMoKS53cmFwQWxsKCBodG1sICk7CgkJfSk7Cgl9LAoKCXdyYXA6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkJalF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaHRtbCApOwoJCX0pOwoJfSwKCglhcHBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oZWxlbSl7CgkJCWlmICh0aGlzLm5vZGVUeXBlID09IDEpCgkJCQl0aGlzLmFwcGVuZENoaWxkKCBlbGVtICk7CgkJfSk7Cgl9LAoKCXByZXBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oZWxlbSl7CgkJCWlmICh0aGlzLm5vZGVUeXBlID09IDEpCgkJCQl0aGlzLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5maXJzdENoaWxkICk7CgkJfSk7Cgl9LAoKCWJlZm9yZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCBmYWxzZSwgZnVuY3Rpb24oZWxlbSl7CgkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKCQl9KTsKCX0sCgoJYWZ0ZXI6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKGVsZW0pewoJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJfSk7Cgl9LAoKCWVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCBqUXVlcnkoIFtdICk7Cgl9LAoKCS8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KCS8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLgoJcHVzaDogW10ucHVzaCwKCXNvcnQ6IFtdLnNvcnQsCglzcGxpY2U6IFtdLnNwbGljZSwKCglmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJaWYgKCB0aGlzLmxlbmd0aCA9PT0gMSApIHsKCQkJdmFyIHJldCA9IHRoaXMucHVzaFN0YWNrKCBbXSwgImZpbmQiLCBzZWxlY3RvciApOwoJCQlyZXQubGVuZ3RoID0gMDsKCQkJalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCB0aGlzWzBdLCByZXQgKTsKCQkJcmV0dXJuIHJldDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS51bmlxdWUoalF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbihlbGVtKXsKCQkJCXJldHVybiBqUXVlcnkuZmluZCggc2VsZWN0b3IsIGVsZW0gKTsKCQkJfSkpLCAiZmluZCIsIHNlbGVjdG9yICk7CgkJfQoJfSwKCgljbG9uZTogZnVuY3Rpb24oIGV2ZW50cyApIHsKCQkvLyBEbyB0aGUgY2xvbmUKCQl2YXIgcmV0ID0gdGhpcy5tYXAoZnVuY3Rpb24oKXsKCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50ICYmICFqUXVlcnkuaXNYTUxEb2ModGhpcykgKSB7CgkJCQkvLyBJRSBjb3BpZXMgZXZlbnRzIGJvdW5kIHZpYSBhdHRhY2hFdmVudCB3aGVuCgkJCQkvLyB1c2luZyBjbG9uZU5vZGUuIENhbGxpbmcgZGV0YWNoRXZlbnQgb24gdGhlCgkJCQkvLyBjbG9uZSB3aWxsIGFsc28gcmVtb3ZlIHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ25hbAoJCQkJLy8gSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSB1c2UgaW5uZXJIVE1MLgoJCQkJLy8gVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucyBzb21lIG1vZGlmaWNhdGlvbnMgdG8KCQkJCS8vIGF0dHJpYnV0ZXMgaW4gSUUgdGhhdCBhcmUgYWN0dWFsbHkgb25seSBzdG9yZWQKCQkJCS8vIGFzIHByb3BlcnRpZXMgd2lsbCBub3QgYmUgY29waWVkIChzdWNoIGFzIHRoZQoJCQkJLy8gdGhlIG5hbWUgYXR0cmlidXRlIG9uIGFuIGlucHV0KS4KCQkJCXZhciBodG1sID0gdGhpcy5vdXRlckhUTUw7CgkJCQlpZiAoICFodG1sICkgewoJCQkJCXZhciBkaXYgPSB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgkJCQkJZGl2LmFwcGVuZENoaWxkKCB0aGlzLmNsb25lTm9kZSh0cnVlKSApOwoJCQkJCWh0bWwgPSBkaXYuaW5uZXJIVE1MOwoJCQkJfQoKCQkJCXJldHVybiBqUXVlcnkuY2xlYW4oW2h0bWwucmVwbGFjZSgvIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLCAiIikucmVwbGFjZSgvXlxzKi8sICIiKV0pWzBdOwoJCQl9IGVsc2UKCQkJCXJldHVybiB0aGlzLmNsb25lTm9kZSh0cnVlKTsKCQl9KTsKCgkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQoJCWlmICggZXZlbnRzID09PSB0cnVlICkgewoJCQl2YXIgb3JpZyA9IHRoaXMuZmluZCgiKiIpLmFuZFNlbGYoKSwgaSA9IDA7CgoJCQlyZXQuZmluZCgiKiIpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCl7CgkJCQlpZiAoIHRoaXMubm9kZU5hbWUgIT09IG9yaWdbaV0ubm9kZU5hbWUgKQoJCQkJCXJldHVybjsKCgkJCQl2YXIgZXZlbnRzID0galF1ZXJ5LmRhdGEoIG9yaWdbaV0sICJldmVudHMiICk7CgoJCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkgewoJCQkJCWZvciAoIHZhciBoYW5kbGVyIGluIGV2ZW50c1sgdHlwZSBdICkgewoJCQkJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaGFuZGxlciBdLCBldmVudHNbIHR5cGUgXVsgaGFuZGxlciBdLmRhdGEgKTsKCQkJCQl9CgkJCQl9CgoJCQkJaSsrOwoJCQl9KTsKCQl9CgoJCS8vIFJldHVybiB0aGUgY2xvbmVkIHNldAoJCXJldHVybiByZXQ7Cgl9LAoKCWZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjaygKCQkJalF1ZXJ5LmlzRnVuY3Rpb24oIHNlbGVjdG9yICkgJiYKCQkJalF1ZXJ5LmdyZXAodGhpcywgZnVuY3Rpb24oZWxlbSwgaSl7CgkJCQlyZXR1cm4gc2VsZWN0b3IuY2FsbCggZWxlbSwgaSApOwoJCQl9KSB8fAoKCQkJalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgalF1ZXJ5LmdyZXAodGhpcywgZnVuY3Rpb24oZWxlbSl7CgkJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKCQkJfSkgKSwgImZpbHRlciIsIHNlbGVjdG9yICk7Cgl9LAoKCWNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgcG9zID0galF1ZXJ5LmV4cHIubWF0Y2guUE9TLnRlc3QoIHNlbGVjdG9yICkgPyBqUXVlcnkoc2VsZWN0b3IpIDogbnVsbCwKCQkJY2xvc2VyID0gMDsKCgkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7CgkJCXZhciBjdXIgPSB0aGlzOwoJCQl3aGlsZSAoIGN1ciAmJiBjdXIub3duZXJEb2N1bWVudCApIHsKCQkJCWlmICggcG9zID8gcG9zLmluZGV4KGN1cikgPiAtMSA6IGpRdWVyeShjdXIpLmlzKHNlbGVjdG9yKSApIHsKCQkJCQlqUXVlcnkuZGF0YShjdXIsICJjbG9zZXN0IiwgY2xvc2VyKTsKCQkJCQlyZXR1cm4gY3VyOwoJCQkJfQoJCQkJY3VyID0gY3VyLnBhcmVudE5vZGU7CgkJCQljbG9zZXIrKzsKCQkJfQoJCX0pOwoJfSwKCglub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKQoJCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSB3aGVyZSBqdXN0IG9uZSBzZWxlY3RvciBpcyBwYXNzZWQgaW4KCQkJaWYgKCBpc1NpbXBsZS50ZXN0KCBzZWxlY3RvciApICkKCQkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgdGhpcywgdHJ1ZSApLCAibm90Iiwgc2VsZWN0b3IgKTsKCQkJZWxzZQoJCQkJc2VsZWN0b3IgPSBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCB0aGlzICk7CgoJCXZhciBpc0FycmF5TGlrZSA9IHNlbGVjdG9yLmxlbmd0aCAmJiBzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGggLSAxXSAhPT0gdW5kZWZpbmVkICYmICFzZWxlY3Rvci5ub2RlVHlwZTsKCQlyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCXJldHVybiBpc0FycmF5TGlrZSA/IGpRdWVyeS5pbkFycmF5KCB0aGlzLCBzZWxlY3RvciApIDwgMCA6IHRoaXMgIT0gc2VsZWN0b3I7CgkJfSk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LnVuaXF1ZSggalF1ZXJ5Lm1lcmdlKAoJCQl0aGlzLmdldCgpLAoJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KCQkJCWpRdWVyeSggc2VsZWN0b3IgKSA6CgkJCQlqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciApCgkJKSkpOwoJfSwKCglpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiAhIXNlbGVjdG9yICYmIGpRdWVyeS5tdWx0aUZpbHRlciggc2VsZWN0b3IsIHRoaXMgKS5sZW5ndGggPiAwOwoJfSwKCgloYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiAhIXNlbGVjdG9yICYmIHRoaXMuaXMoICIuIiArIHNlbGVjdG9yICk7Cgl9LAoKCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsJCQkKCQkJdmFyIGVsZW0gPSB0aGlzWzBdOwoKCQkJaWYgKCBlbGVtICkgewoJCQkJaWYoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgJ29wdGlvbicgKSApCgkJCQkJcmV0dXJuIChlbGVtLmF0dHJpYnV0ZXMudmFsdWUgfHwge30pLnNwZWNpZmllZCA/IGVsZW0udmFsdWUgOiBlbGVtLnRleHQ7CgkJCQkKCQkJCS8vIFdlIG5lZWQgdG8gaGFuZGxlIHNlbGVjdCBib3hlcyBzcGVjaWFsCgkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgInNlbGVjdCIgKSApIHsKCQkJCQl2YXIgaW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsCgkJCQkJCXZhbHVlcyA9IFtdLAoJCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAoJCQkJCQlvbmUgPSBlbGVtLnR5cGUgPT0gInNlbGVjdC1vbmUiOwoKCQkJCQkvLyBOb3RoaW5nIHdhcyBzZWxlY3RlZAoJCQkJCWlmICggaW5kZXggPCAwICkKCQkJCQkJcmV0dXJuIG51bGw7CgoJCQkJCS8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnMKCQkJCQlmb3IgKCB2YXIgaSA9IG9uZSA/IGluZGV4IDogMCwgbWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKyApIHsKCQkJCQkJdmFyIG9wdGlvbiA9IG9wdGlvbnNbIGkgXTsKCgkJCQkJCWlmICggb3B0aW9uLnNlbGVjdGVkICkgewoJCQkJCQkJLy8gR2V0IHRoZSBzcGVjaWZjIHZhbHVlIGZvciB0aGUgb3B0aW9uCgkJCQkJCQl2YWx1ZSA9IGpRdWVyeShvcHRpb24pLnZhbCgpOwoKCQkJCQkJCS8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzCgkJCQkJCQlpZiAoIG9uZSApCgkJCQkJCQkJcmV0dXJuIHZhbHVlOwoKCQkJCQkJCS8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5CgkJCQkJCQl2YWx1ZXMucHVzaCggdmFsdWUgKTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJcmV0dXJuIHZhbHVlczsJCQkJCgkJCQl9CgoJCQkJLy8gRXZlcnl0aGluZyBlbHNlLCB3ZSBqdXN0IGdyYWIgdGhlIHZhbHVlCgkJCQlyZXR1cm4gKGVsZW0udmFsdWUgfHwgIiIpLnJlcGxhY2UoL1xyL2csICIiKTsKCgkJCX0KCgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gIm51bWJlciIgKQoJCQl2YWx1ZSArPSAnJzsKCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpewoJCQlpZiAoIHRoaXMubm9kZVR5cGUgIT0gMSApCgkJCQlyZXR1cm47CgoJCQlpZiAoIGpRdWVyeS5pc0FycmF5KHZhbHVlKSAmJiAvcmFkaW98Y2hlY2tib3gvLnRlc3QoIHRoaXMudHlwZSApICkKCQkJCXRoaXMuY2hlY2tlZCA9IChqUXVlcnkuaW5BcnJheSh0aGlzLnZhbHVlLCB2YWx1ZSkgPj0gMCB8fAoJCQkJCWpRdWVyeS5pbkFycmF5KHRoaXMubmFtZSwgdmFsdWUpID49IDApOwoKCQkJZWxzZSBpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgInNlbGVjdCIgKSApIHsKCQkJCXZhciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KHZhbHVlKTsKCgkJCQlqUXVlcnkoICJvcHRpb24iLCB0aGlzICkuZWFjaChmdW5jdGlvbigpewoJCQkJCXRoaXMuc2VsZWN0ZWQgPSAoalF1ZXJ5LmluQXJyYXkoIHRoaXMudmFsdWUsIHZhbHVlcyApID49IDAgfHwKCQkJCQkJalF1ZXJ5LmluQXJyYXkoIHRoaXMudGV4dCwgdmFsdWVzICkgPj0gMCk7CgkJCQl9KTsKCgkJCQlpZiAoICF2YWx1ZXMubGVuZ3RoICkKCQkJCQl0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTsKCgkJCX0gZWxzZQoJCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwoJCX0pOwoJfSwKCglodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwoJCQkodGhpc1swXSA/CgkJCQl0aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKC8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csICIiKSA6CgkJCQludWxsKSA6CgkJCXRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7Cgl9LAoKCXJlcGxhY2VXaXRoOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIHRoaXMuYWZ0ZXIoIHZhbHVlICkucmVtb3ZlKCk7Cgl9LAoKCWVxOiBmdW5jdGlvbiggaSApIHsKCQlyZXR1cm4gdGhpcy5zbGljZSggaSwgK2kgKyAxICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICksCgkJCSJzbGljZSIsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpICk7Cgl9LAoKCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBpKXsKCQkJcmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsKCQl9KSk7Cgl9LAoKCWFuZFNlbGY6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmFkZCggdGhpcy5wcmV2T2JqZWN0ICk7Cgl9LAoKCWRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgdGFibGUsIGNhbGxiYWNrICkgewoJCWlmICggdGhpc1swXSApIHsKCQkJdmFyIGZyYWdtZW50ID0gKHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCB0aGlzWzBdKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksCgkJCQlzY3JpcHRzID0galF1ZXJ5LmNsZWFuKCBhcmdzLCAodGhpc1swXS5vd25lckRvY3VtZW50IHx8IHRoaXNbMF0pLCBmcmFnbWVudCApLAoJCQkJZmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkOwoKCQkJaWYgKCBmaXJzdCApCgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApCgkJCQkJY2FsbGJhY2suY2FsbCggcm9vdCh0aGlzW2ldLCBmaXJzdCksIHRoaXMubGVuZ3RoID4gMSB8fCBpID4gMCA/CgkJCQkJCQlmcmFnbWVudC5jbG9uZU5vZGUodHJ1ZSkgOiBmcmFnbWVudCApOwoJCQoJCQlpZiAoIHNjcmlwdHMgKQoJCQkJalF1ZXJ5LmVhY2goIHNjcmlwdHMsIGV2YWxTY3JpcHQgKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJCQoJCWZ1bmN0aW9uIHJvb3QoIGVsZW0sIGN1ciApIHsKCQkJcmV0dXJuIHRhYmxlICYmIGpRdWVyeS5ub2RlTmFtZShlbGVtLCAidGFibGUiKSAmJiBqUXVlcnkubm9kZU5hbWUoY3VyLCAidHIiKSA/CgkJCQkoZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXSB8fAoJCQkJZWxlbS5hcHBlbmRDaGlsZChlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSkpIDoKCQkJCWVsZW07CgkJfQoJfQp9OwoKLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvbgpqUXVlcnkuZm4uaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CgpmdW5jdGlvbiBldmFsU2NyaXB0KCBpLCBlbGVtICkgewoJaWYgKCBlbGVtLnNyYyApCgkJalF1ZXJ5LmFqYXgoewoJCQl1cmw6IGVsZW0uc3JjLAoJCQlhc3luYzogZmFsc2UsCgkJCWRhdGFUeXBlOiAic2NyaXB0IgoJCX0pOwoKCWVsc2UKCQlqUXVlcnkuZ2xvYmFsRXZhbCggZWxlbS50ZXh0IHx8IGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lckhUTUwgfHwgIiIgKTsKCglpZiAoIGVsZW0ucGFyZW50Tm9kZSApCgkJZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7Cn0KCmZ1bmN0aW9uIG5vdygpewoJcmV0dXJuICtuZXcgRGF0ZTsKfQoKalF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsKCS8vIGNvcHkgcmVmZXJlbmNlIHRvIHRhcmdldCBvYmplY3QKCXZhciB0YXJnZXQgPSBhcmd1bWVudHNbMF0gfHwge30sIGkgPSAxLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLCBkZWVwID0gZmFsc2UsIG9wdGlvbnM7CgoJLy8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvbgoJaWYgKCB0eXBlb2YgdGFyZ2V0ID09PSAiYm9vbGVhbiIgKSB7CgkJZGVlcCA9IHRhcmdldDsKCQl0YXJnZXQgPSBhcmd1bWVudHNbMV0gfHwge307CgkJLy8gc2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldAoJCWkgPSAyOwoJfQoKCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQoJaWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24odGFyZ2V0KSApCgkJdGFyZ2V0ID0ge307CgoJLy8gZXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGxlbmd0aCA9PSBpICkgewoJCXRhcmdldCA9IHRoaXM7CgkJLS1pOwoJfQoKCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkKCQkvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCgkJaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkKCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAoJCQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkgewoJCQkJdmFyIHNyYyA9IHRhcmdldFsgbmFtZSBdLCBjb3B5ID0gb3B0aW9uc1sgbmFtZSBdOwoKCQkJCS8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3AKCQkJCWlmICggdGFyZ2V0ID09PSBjb3B5ICkKCQkJCQljb250aW51ZTsKCgkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgb2JqZWN0IHZhbHVlcwoJCQkJaWYgKCBkZWVwICYmIGNvcHkgJiYgdHlwZW9mIGNvcHkgPT09ICJvYmplY3QiICYmICFjb3B5Lm5vZGVUeXBlICkKCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIAoJCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQkJc3JjIHx8ICggY29weS5sZW5ndGggIT0gbnVsbCA/IFsgXSA6IHsgfSApCgkJCQkJLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApCgkJCQkJdGFyZ2V0WyBuYW1lIF0gPSBjb3B5OwoKCQkJfQoKCS8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0CglyZXR1cm4gdGFyZ2V0Owp9OwoKLy8gZXhjbHVkZSB0aGUgZm9sbG93aW5nIGNzcyBwcm9wZXJ0aWVzIHRvIGFkZCBweAp2YXIJZXhjbHVkZSA9IC96LT9pbmRleHxmb250LT93ZWlnaHR8b3BhY2l0eXx6b29tfGxpbmUtP2hlaWdodC9pLAoJLy8gY2FjaGUgZGVmYXVsdFZpZXcKCWRlZmF1bHRWaWV3ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwge30sCgl0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CgpqUXVlcnkuZXh0ZW5kKHsKCW5vQ29uZmxpY3Q6IGZ1bmN0aW9uKCBkZWVwICkgewoJCXdpbmRvdy4kID0gXyQ7CgoJCWlmICggZGVlcCApCgkJCXdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5OwoKCQlyZXR1cm4galF1ZXJ5OwoJfSwKCgkvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLgoJLy8gU2luY2UgdmVyc2lvbiAxLjMsIERPTSBtZXRob2RzIGFuZCBmdW5jdGlvbnMgbGlrZSBhbGVydAoJLy8gYXJlbid0IHN1cHBvcnRlZC4gVGhleSByZXR1cm4gZmFsc2Ugb24gSUUgKCMyOTY4KS4KCWlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gIltvYmplY3QgRnVuY3Rpb25dIjsKCX0sCgoJaXNBcnJheTogZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAiW29iamVjdCBBcnJheV0iOwoJfSwKCgkvLyBjaGVjayBpZiBhbiBlbGVtZW50IGlzIGluIGEgKG9yIGlzIGFuKSBYTUwgZG9jdW1lbnQKCWlzWE1MRG9jOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8CgkJCSEhZWxlbS5vd25lckRvY3VtZW50ICYmIGpRdWVyeS5pc1hNTERvYyggZWxlbS5vd25lckRvY3VtZW50ICk7Cgl9LAoKCS8vIEV2YWx1bGF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dAoJZ2xvYmFsRXZhbDogZnVuY3Rpb24oIGRhdGEgKSB7CgkJaWYgKCBkYXRhICYmIC9cUy8udGVzdChkYXRhKSApIHsKCQkJLy8gSW5zcGlyZWQgYnkgY29kZSBieSBBbmRyZWEgR2lhbW1hcmNoaQoJCQkvLyBodHRwOi8vd2VicmVmbGVjdGlvbi5ibG9nc3BvdC5jb20vMjAwNy8wOC9nbG9iYWwtc2NvcGUtZXZhbHVhdGlvbi1hbmQtZG9tLmh0bWwKCQkJdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKCQkJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwoKCQkJc2NyaXB0LnR5cGUgPSAidGV4dC9qYXZhc2NyaXB0IjsKCQkJaWYgKCBqUXVlcnkuc3VwcG9ydC5zY3JpcHRFdmFsICkKCQkJCXNjcmlwdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIGRhdGEgKSApOwoJCQllbHNlCgkJCQlzY3JpcHQudGV4dCA9IGRhdGE7CgoJCQkvLyBVc2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQgb2YgYXBwZW5kQ2hpbGQgIHRvIGNpcmN1bXZlbnQgYW4gSUU2IGJ1Zy4KCQkJLy8gVGhpcyBhcmlzZXMgd2hlbiBhIGJhc2Ugbm9kZSBpcyB1c2VkICgjMjcwOSkuCgkJCWhlYWQuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIGhlYWQuZmlyc3RDaGlsZCApOwoJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKCQl9Cgl9LAoKCW5vZGVOYW1lOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT0gbmFtZS50b1VwcGVyQ2FzZSgpOwoJfSwKCgkvLyBhcmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgllYWNoOiBmdW5jdGlvbiggb2JqZWN0LCBjYWxsYmFjaywgYXJncyApIHsKCQl2YXIgbmFtZSwgaSA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7CgoJCWlmICggYXJncyApIHsKCQkJaWYgKCBsZW5ndGggPT09IHVuZGVmaW5lZCApIHsKCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkKCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5KCBvYmplY3RbIG5hbWUgXSwgYXJncyApID09PSBmYWxzZSApCgkJCQkJCWJyZWFrOwoJCQl9IGVsc2UKCQkJCWZvciAoIDsgaSA8IGxlbmd0aDsgKQoJCQkJCWlmICggY2FsbGJhY2suYXBwbHkoIG9iamVjdFsgaSsrIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKQoJCQkJCQlicmVhazsKCgkJLy8gQSBzcGVjaWFsLCBmYXN0LCBjYXNlIGZvciB0aGUgbW9zdCBjb21tb24gdXNlIG9mIGVhY2gKCQl9IGVsc2UgewoJCQlpZiAoIGxlbmd0aCA9PT0gdW5kZWZpbmVkICkgewoJCQkJZm9yICggbmFtZSBpbiBvYmplY3QgKQoJCQkJCWlmICggY2FsbGJhY2suY2FsbCggb2JqZWN0WyBuYW1lIF0sIG5hbWUsIG9iamVjdFsgbmFtZSBdICkgPT09IGZhbHNlICkKCQkJCQkJYnJlYWs7CgkJCX0gZWxzZQoJCQkJZm9yICggdmFyIHZhbHVlID0gb2JqZWN0WzBdOwoJCQkJCWkgPCBsZW5ndGggJiYgY2FsbGJhY2suY2FsbCggdmFsdWUsIGksIHZhbHVlICkgIT09IGZhbHNlOyB2YWx1ZSA9IG9iamVjdFsrK2ldICl7fQoJCX0KCgkJcmV0dXJuIG9iamVjdDsKCX0sCgoJcHJvcDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCB0eXBlLCBpLCBuYW1lICkgewoJCS8vIEhhbmRsZSBleGVjdXRhYmxlIGZ1bmN0aW9ucwoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKQoJCQl2YWx1ZSA9IHZhbHVlLmNhbGwoIGVsZW0sIGkgKTsKCgkJLy8gSGFuZGxlIHBhc3NpbmcgaW4gYSBudW1iZXIgdG8gYSBDU1MgcHJvcGVydHkKCQlyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAibnVtYmVyIiAmJiB0eXBlID09ICJjdXJDU1MiICYmICFleGNsdWRlLnRlc3QoIG5hbWUgKSA/CgkJCXZhbHVlICsgInB4IiA6CgkJCXZhbHVlOwoJfSwKCgljbGFzc05hbWU6IHsKCQkvLyBpbnRlcm5hbCBvbmx5LCB1c2UgYWRkQ2xhc3MoImNsYXNzIikKCQlhZGQ6IGZ1bmN0aW9uKCBlbGVtLCBjbGFzc05hbWVzICkgewoJCQlqUXVlcnkuZWFjaCgoY2xhc3NOYW1lcyB8fCAiIikuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihpLCBjbGFzc05hbWUpewoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09IDEgJiYgIWpRdWVyeS5jbGFzc05hbWUuaGFzKCBlbGVtLmNsYXNzTmFtZSwgY2xhc3NOYW1lICkgKQoJCQkJCWVsZW0uY2xhc3NOYW1lICs9IChlbGVtLmNsYXNzTmFtZSA/ICIgIiA6ICIiKSArIGNsYXNzTmFtZTsKCQkJfSk7CgkJfSwKCgkJLy8gaW50ZXJuYWwgb25seSwgdXNlIHJlbW92ZUNsYXNzKCJjbGFzcyIpCgkJcmVtb3ZlOiBmdW5jdGlvbiggZWxlbSwgY2xhc3NOYW1lcyApIHsKCQkJaWYgKGVsZW0ubm9kZVR5cGUgPT0gMSkKCQkJCWVsZW0uY2xhc3NOYW1lID0gY2xhc3NOYW1lcyAhPT0gdW5kZWZpbmVkID8KCQkJCQlqUXVlcnkuZ3JlcChlbGVtLmNsYXNzTmFtZS5zcGxpdCgvXHMrLyksIGZ1bmN0aW9uKGNsYXNzTmFtZSl7CgkJCQkJCXJldHVybiAhalF1ZXJ5LmNsYXNzTmFtZS5oYXMoIGNsYXNzTmFtZXMsIGNsYXNzTmFtZSApOwoJCQkJCX0pLmpvaW4oIiAiKSA6CgkJCQkJIiI7CgkJfSwKCgkJLy8gaW50ZXJuYWwgb25seSwgdXNlIGhhc0NsYXNzKCJjbGFzcyIpCgkJaGFzOiBmdW5jdGlvbiggZWxlbSwgY2xhc3NOYW1lICkgewoJCQlyZXR1cm4gZWxlbSAmJiBqUXVlcnkuaW5BcnJheSggY2xhc3NOYW1lLCAoZWxlbS5jbGFzc05hbWUgfHwgZWxlbSkudG9TdHJpbmcoKS5zcGxpdCgvXHMrLykgKSA+IC0xOwoJCX0KCX0sCgoJLy8gQSBtZXRob2QgZm9yIHF1aWNrbHkgc3dhcHBpbmcgaW4vb3V0IENTUyBwcm9wZXJ0aWVzIHRvIGdldCBjb3JyZWN0IGNhbGN1bGF0aW9ucwoJc3dhcDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrICkgewoJCXZhciBvbGQgPSB7fTsKCQkvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXMKCQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkgewoJCQlvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdOwoJCX0KCgkJY2FsbGJhY2suY2FsbCggZWxlbSApOwoKCQkvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXMKCQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkKCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb2xkWyBuYW1lIF07Cgl9LAoKCWNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGZvcmNlLCBleHRyYSApIHsKCQlpZiAoIG5hbWUgPT0gIndpZHRoIiB8fCBuYW1lID09ICJoZWlnaHQiICkgewoJCQl2YXIgdmFsLCBwcm9wcyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiJibG9jayIgfSwgd2hpY2ggPSBuYW1lID09ICJ3aWR0aCIgPyBbICJMZWZ0IiwgIlJpZ2h0IiBdIDogWyAiVG9wIiwgIkJvdHRvbSIgXTsKCgkJCWZ1bmN0aW9uIGdldFdIKCkgewoJCQkJdmFsID0gbmFtZSA9PSAid2lkdGgiID8gZWxlbS5vZmZzZXRXaWR0aCA6IGVsZW0ub2Zmc2V0SGVpZ2h0OwoKCQkJCWlmICggZXh0cmEgPT09ICJib3JkZXIiICkKCQkJCQlyZXR1cm47CgoJCQkJalF1ZXJ5LmVhY2goIHdoaWNoLCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoICFleHRyYSApCgkJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVsZW0sICJwYWRkaW5nIiArIHRoaXMsIHRydWUpKSB8fCAwOwoJCQkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkKCQkJCQkJdmFsICs9IHBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyggZWxlbSwgIm1hcmdpbiIgKyB0aGlzLCB0cnVlKSkgfHwgMDsKCQkJCQllbHNlCgkJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVsZW0sICJib3JkZXIiICsgdGhpcyArICJXaWR0aCIsIHRydWUpKSB8fCAwOwoJCQkJfSk7CgkJCX0KCgkJCWlmICggZWxlbS5vZmZzZXRXaWR0aCAhPT0gMCApCgkJCQlnZXRXSCgpOwoJCQllbHNlCgkJCQlqUXVlcnkuc3dhcCggZWxlbSwgcHJvcHMsIGdldFdIICk7CgoJCQlyZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCh2YWwpKTsKCQl9CgoJCXJldHVybiBqUXVlcnkuY3VyQ1NTKCBlbGVtLCBuYW1lLCBmb3JjZSApOwoJfSwKCgljdXJDU1M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBmb3JjZSApIHsKCQl2YXIgcmV0LCBzdHlsZSA9IGVsZW0uc3R5bGU7CgoJCS8vIFdlIG5lZWQgdG8gaGFuZGxlIG9wYWNpdHkgc3BlY2lhbCBpbiBJRQoJCWlmICggbmFtZSA9PSAib3BhY2l0eSIgJiYgIWpRdWVyeS5zdXBwb3J0Lm9wYWNpdHkgKSB7CgkJCXJldCA9IGpRdWVyeS5hdHRyKCBzdHlsZSwgIm9wYWNpdHkiICk7CgoJCQlyZXR1cm4gcmV0ID09ICIiID8KCQkJCSIxIiA6CgkJCQlyZXQ7CgkJfQoKCQkvLyBNYWtlIHN1cmUgd2UncmUgdXNpbmcgdGhlIHJpZ2h0IG5hbWUgZm9yIGdldHRpbmcgdGhlIGZsb2F0IHZhbHVlCgkJaWYgKCBuYW1lLm1hdGNoKCAvZmxvYXQvaSApICkKCQkJbmFtZSA9IHN0eWxlRmxvYXQ7CgoJCWlmICggIWZvcmNlICYmIHN0eWxlICYmIHN0eWxlWyBuYW1lIF0gKQoJCQlyZXQgPSBzdHlsZVsgbmFtZSBdOwoKCQllbHNlIGlmICggZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKCgkJCS8vIE9ubHkgImZsb2F0IiBpcyBuZWVkZWQgaGVyZQoJCQlpZiAoIG5hbWUubWF0Y2goIC9mbG9hdC9pICkgKQoJCQkJbmFtZSA9ICJmbG9hdCI7CgoJCQluYW1lID0gbmFtZS5yZXBsYWNlKCAvKFtBLVpdKS9nLCAiLSQxIiApLnRvTG93ZXJDYXNlKCk7CgoJCQl2YXIgY29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKTsKCgkJCWlmICggY29tcHV0ZWRTdHlsZSApCgkJCQlyZXQgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKTsKCgkJCS8vIFdlIHNob3VsZCBhbHdheXMgZ2V0IGEgbnVtYmVyIGJhY2sgZnJvbSBvcGFjaXR5CgkJCWlmICggbmFtZSA9PSAib3BhY2l0eSIgJiYgcmV0ID09ICIiICkKCQkJCXJldCA9ICIxIjsKCgkJfSBlbHNlIGlmICggZWxlbS5jdXJyZW50U3R5bGUgKSB7CgkJCXZhciBjYW1lbENhc2UgPSBuYW1lLnJlcGxhY2UoL1wtKFx3KS9nLCBmdW5jdGlvbihhbGwsIGxldHRlcil7CgkJCQlyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7CgkJCX0pOwoKCQkJcmV0ID0gZWxlbS5jdXJyZW50U3R5bGVbIG5hbWUgXSB8fCBlbGVtLmN1cnJlbnRTdHlsZVsgY2FtZWxDYXNlIF07CgoJCQkvLyBGcm9tIHRoZSBhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzCgkJCS8vIGh0dHA6Ly9lcmlrLmVhZS5uZXQvYXJjaGl2ZXMvMjAwNy8wNy8yNy8xOC41NC4xNS8jY29tbWVudC0xMDIyOTEKCgkJCS8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFyIHBpeGVsIG51bWJlcgoJCQkvLyBidXQgYSBudW1iZXIgdGhhdCBoYXMgYSB3ZWlyZCBlbmRpbmcsIHdlIG5lZWQgdG8gY29udmVydCBpdCB0byBwaXhlbHMKCQkJaWYgKCAhL15cZCsocHgpPyQvaS50ZXN0KCByZXQgKSAmJiAvXlxkLy50ZXN0KCByZXQgKSApIHsKCQkJCS8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXMKCQkJCXZhciBsZWZ0ID0gc3R5bGUubGVmdCwgcnNMZWZ0ID0gZWxlbS5ydW50aW1lU3R5bGUubGVmdDsKCgkJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CgkJCQllbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gZWxlbS5jdXJyZW50U3R5bGUubGVmdDsKCQkJCXN0eWxlLmxlZnQgPSByZXQgfHwgMDsKCQkJCXJldCA9IHN0eWxlLnBpeGVsTGVmdCArICJweCI7CgoJCQkJLy8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlcwoJCQkJc3R5bGUubGVmdCA9IGxlZnQ7CgkJCQllbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gcnNMZWZ0OwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCgljbGVhbjogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0LCBmcmFnbWVudCApIHsKCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKCgkJLy8gIWNvbnRleHQuY3JlYXRlRWxlbWVudCBmYWlscyBpbiBJRSB3aXRoIGFuIGVycm9yIGJ1dCByZXR1cm5zIHR5cGVvZiAnb2JqZWN0JwoJCWlmICggdHlwZW9mIGNvbnRleHQuY3JlYXRlRWxlbWVudCA9PT0gInVuZGVmaW5lZCIgKQoJCQljb250ZXh0ID0gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHRbMF0gJiYgY29udGV4dFswXS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50OwoKCQkvLyBJZiBhIHNpbmdsZSBzdHJpbmcgaXMgcGFzc2VkIGluIGFuZCBpdCdzIGEgc2luZ2xlIHRhZwoJCS8vIGp1c3QgZG8gYSBjcmVhdGVFbGVtZW50IGFuZCBza2lwIHRoZSByZXN0CgkJaWYgKCAhZnJhZ21lbnQgJiYgZWxlbXMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBlbGVtc1swXSA9PT0gInN0cmluZyIgKSB7CgkJCXZhciBtYXRjaCA9IC9ePChcdyspXHMqXC8/PiQvLmV4ZWMoZWxlbXNbMF0pOwoJCQlpZiAoIG1hdGNoICkKCQkJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggbWF0Y2hbMV0gKSBdOwoJCX0KCgkJdmFyIHJldCA9IFtdLCBzY3JpcHRzID0gW10sIGRpdiA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgoJCWpRdWVyeS5lYWNoKGVsZW1zLCBmdW5jdGlvbihpLCBlbGVtKXsKCQkJaWYgKCB0eXBlb2YgZWxlbSA9PT0gIm51bWJlciIgKQoJCQkJZWxlbSArPSAnJzsKCgkJCWlmICggIWVsZW0gKQoJCQkJcmV0dXJuOwoKCQkJLy8gQ29udmVydCBodG1sIHN0cmluZyBpbnRvIERPTSBub2RlcwoJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKCQkJCS8vIEZpeCAiWEhUTUwiLXN0eWxlIHRhZ3MgaW4gYWxsIGJyb3dzZXJzCgkJCQllbGVtID0gZWxlbS5yZXBsYWNlKC8oPChcdyspW14+XSo/KVwvPi9nLCBmdW5jdGlvbihhbGwsIGZyb250LCB0YWcpewoJCQkJCXJldHVybiB0YWcubWF0Y2goL14oYWJicnxicnxjb2x8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbXxocnxhcmVhfGVtYmVkKSQvaSkgPwoJCQkJCQlhbGwgOgoJCQkJCQlmcm9udCArICI+PC8iICsgdGFnICsgIj4iOwoJCQkJfSk7CgoJCQkJLy8gVHJpbSB3aGl0ZXNwYWNlLCBvdGhlcndpc2UgaW5kZXhPZiB3b24ndCB3b3JrIGFzIGV4cGVjdGVkCgkJCQl2YXIgdGFncyA9IGVsZW0ucmVwbGFjZSgvXlxzKy8sICIiKS5zdWJzdHJpbmcoMCwgMTApLnRvTG93ZXJDYXNlKCk7CgoJCQkJdmFyIHdyYXAgPQoJCQkJCS8vIG9wdGlvbiBvciBvcHRncm91cAoJCQkJCSF0YWdzLmluZGV4T2YoIjxvcHQiKSAmJgoJCQkJCVsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdIHx8CgoJCQkJCSF0YWdzLmluZGV4T2YoIjxsZWciKSAmJgoJCQkJCVsgMSwgIjxmaWVsZHNldD4iLCAiPC9maWVsZHNldD4iIF0gfHwKCgkJCQkJdGFncy5tYXRjaCgvXjwodGhlYWR8dGJvZHl8dGZvb3R8Y29sZ3xjYXApLykgJiYKCQkJCQlbIDEsICI8dGFibGU+IiwgIjwvdGFibGU+IiBdIHx8CgoJCQkJCSF0YWdzLmluZGV4T2YoIjx0ciIpICYmCgkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSB8fAoKCQkJCSAJLy8gPHRoZWFkPiBtYXRjaGVkIGFib3ZlCgkJCQkJKCF0YWdzLmluZGV4T2YoIjx0ZCIpIHx8ICF0YWdzLmluZGV4T2YoIjx0aCIpKSAmJgoJCQkJCVsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iIF0gfHwKCgkJCQkJIXRhZ3MuaW5kZXhPZigiPGNvbCIpICYmCgkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCAiPC9jb2xncm91cD48L3RhYmxlPiIgXSB8fAoKCQkJCQkvLyBJRSBjYW4ndCBzZXJpYWxpemUgPGxpbms+IGFuZCA8c2NyaXB0PiB0YWdzIG5vcm1hbGx5CgkJCQkJIWpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgJiYKCQkJCQlbIDEsICJkaXY8ZGl2PiIsICI8L2Rpdj4iIF0gfHwKCgkJCQkJWyAwLCAiIiwgIiIgXTsKCgkJCQkvLyBHbyB0byBodG1sIGFuZCBiYWNrLCB0aGVuIHBlZWwgb2ZmIGV4dHJhIHdyYXBwZXJzCgkJCQlkaXYuaW5uZXJIVE1MID0gd3JhcFsxXSArIGVsZW0gKyB3cmFwWzJdOwoKCQkJCS8vIE1vdmUgdG8gdGhlIHJpZ2h0IGRlcHRoCgkJCQl3aGlsZSAoIHdyYXBbMF0tLSApCgkJCQkJZGl2ID0gZGl2Lmxhc3RDaGlsZDsKCgkJCQkvLyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50cwoJCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQudGJvZHkgKSB7CgoJCQkJCS8vIFN0cmluZyB3YXMgYSA8dGFibGU+LCAqbWF5KiBoYXZlIHNwdXJpb3VzIDx0Ym9keT4KCQkJCQl2YXIgaGFzQm9keSA9IC88dGJvZHkvaS50ZXN0KGVsZW0pLAoJCQkJCQl0Ym9keSA9ICF0YWdzLmluZGV4T2YoIjx0YWJsZSIpICYmICFoYXNCb2R5ID8KCQkJCQkJCWRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxkLmNoaWxkTm9kZXMgOgoKCQkJCQkJLy8gU3RyaW5nIHdhcyBhIGJhcmUgPHRoZWFkPiBvciA8dGZvb3Q+CgkJCQkJCXdyYXBbMV0gPT0gIjx0YWJsZT4iICYmICFoYXNCb2R5ID8KCQkJCQkJCWRpdi5jaGlsZE5vZGVzIDoKCQkJCQkJCVtdOwoKCQkJCQlmb3IgKCB2YXIgaiA9IHRib2R5Lmxlbmd0aCAtIDE7IGogPj0gMCA7IC0taiApCgkJCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0Ym9keVsgaiBdLCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5ndGggKQoJCQkJCQkJdGJvZHlbIGogXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0Ym9keVsgaiBdICk7CgoJCQkJCX0KCgkJCQkvLyBJRSBjb21wbGV0ZWx5IGtpbGxzIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVuIGlubmVySFRNTCBpcyB1c2VkCgkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSAmJiAvXlxzLy50ZXN0KCBlbGVtICkgKQoJCQkJCWRpdi5pbnNlcnRCZWZvcmUoIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIGVsZW0ubWF0Y2goL15ccyovKVswXSApLCBkaXYuZmlyc3RDaGlsZCApOwoJCQkJCgkJCQllbGVtID0galF1ZXJ5Lm1ha2VBcnJheSggZGl2LmNoaWxkTm9kZXMgKTsKCQkJfQoKCQkJaWYgKCBlbGVtLm5vZGVUeXBlICkKCQkJCXJldC5wdXNoKCBlbGVtICk7CgkJCWVsc2UKCQkJCXJldCA9IGpRdWVyeS5tZXJnZSggcmV0LCBlbGVtICk7CgoJCX0pOwoKCQlpZiAoIGZyYWdtZW50ICkgewoJCQlmb3IgKCB2YXIgaSA9IDA7IHJldFtpXTsgaSsrICkgewoJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIHJldFtpXSwgInNjcmlwdCIgKSAmJiAoIXJldFtpXS50eXBlIHx8IHJldFtpXS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICJ0ZXh0L2phdmFzY3JpcHQiKSApIHsKCQkJCQlzY3JpcHRzLnB1c2goIHJldFtpXS5wYXJlbnROb2RlID8gcmV0W2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHJldFtpXSApIDogcmV0W2ldICk7CgkJCQl9IGVsc2UgewoJCQkJCWlmICggcmV0W2ldLm5vZGVUeXBlID09PSAxICkKCQkJCQkJcmV0LnNwbGljZS5hcHBseSggcmV0LCBbaSArIDEsIDBdLmNvbmNhdChqUXVlcnkubWFrZUFycmF5KHJldFtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IikpKSApOwoJCQkJCWZyYWdtZW50LmFwcGVuZENoaWxkKCByZXRbaV0gKTsKCQkJCX0KCQkJfQoJCQkKCQkJcmV0dXJuIHNjcmlwdHM7CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCglhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CgkJLy8gZG9uJ3Qgc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICghZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4KQoJCQlyZXR1cm4gdW5kZWZpbmVkOwoKCQl2YXIgbm90eG1sID0gIWpRdWVyeS5pc1hNTERvYyggZWxlbSApLAoJCQkvLyBXaGV0aGVyIHdlIGFyZSBzZXR0aW5nIChvciBnZXR0aW5nKQoJCQlzZXQgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkOwoKCQkvLyBUcnkgdG8gbm9ybWFsaXplL2ZpeCB0aGUgbmFtZQoJCW5hbWUgPSBub3R4bWwgJiYgalF1ZXJ5LnByb3BzWyBuYW1lIF0gfHwgbmFtZTsKCgkJLy8gT25seSBkbyBhbGwgdGhlIGZvbGxvd2luZyBpZiB0aGlzIGlzIGEgbm9kZSAoZmFzdGVyIGZvciBzdHlsZSkKCQkvLyBJRSBlbGVtLmdldEF0dHJpYnV0ZSBwYXNzZXMgZXZlbiBmb3Igc3R5bGUKCQlpZiAoIGVsZW0udGFnTmFtZSApIHsKCgkJCS8vIFRoZXNlIGF0dHJpYnV0ZXMgcmVxdWlyZSBzcGVjaWFsIHRyZWF0bWVudAoJCQl2YXIgc3BlY2lhbCA9IC9ocmVmfHNyY3xzdHlsZS8udGVzdCggbmFtZSApOwoKCQkJLy8gU2FmYXJpIG1pcy1yZXBvcnRzIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHByb3BlcnR5IG9mIGEgaGlkZGVuIG9wdGlvbgoJCQkvLyBBY2Nlc3NpbmcgdGhlIHBhcmVudCdzIHNlbGVjdGVkSW5kZXggcHJvcGVydHkgZml4ZXMgaXQKCQkJaWYgKCBuYW1lID09ICJzZWxlY3RlZCIgJiYgZWxlbS5wYXJlbnROb2RlICkKCQkJCWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OwoKCQkJLy8gSWYgYXBwbGljYWJsZSwgYWNjZXNzIHRoZSBhdHRyaWJ1dGUgdmlhIHRoZSBET00gMCB3YXkKCQkJaWYgKCBuYW1lIGluIGVsZW0gJiYgbm90eG1sICYmICFzcGVjaWFsICkgewoJCQkJaWYgKCBzZXQgKXsKCQkJCQkvLyBXZSBjYW4ndCBhbGxvdyB0aGUgdHlwZSBwcm9wZXJ0eSB0byBiZSBjaGFuZ2VkIChzaW5jZSBpdCBjYXVzZXMgcHJvYmxlbXMgaW4gSUUpCgkJCQkJaWYgKCBuYW1lID09ICJ0eXBlIiAmJiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSAmJiBlbGVtLnBhcmVudE5vZGUgKQoJCQkJCQl0aHJvdyAidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIjsKCgkJCQkJZWxlbVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9CgoJCQkJLy8gYnJvd3NlcnMgaW5kZXggZWxlbWVudHMgYnkgaWQvbmFtZSBvbiBmb3JtcywgZ2l2ZSBwcmlvcml0eSB0byBhdHRyaWJ1dGVzLgoJCQkJaWYoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImZvcm0iICkgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpICkKCQkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkubm9kZVZhbHVlOwoKCQkJCS8vIGVsZW0udGFiSW5kZXggZG9lc24ndCBhbHdheXMgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXQKCQkJCS8vIGh0dHA6Ly9mbHVpZHByb2plY3Qub3JnL2Jsb2cvMjAwOC8wMS8wOS9nZXR0aW5nLXNldHRpbmctYW5kLXJlbW92aW5nLXRhYmluZGV4LXZhbHVlcy13aXRoLWphdmFzY3JpcHQvCgkJCQlpZiAoIG5hbWUgPT0gInRhYkluZGV4IiApIHsKCQkJCQl2YXIgYXR0cmlidXRlTm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggInRhYkluZGV4IiApOwoJCQkJCXJldHVybiBhdHRyaWJ1dGVOb2RlICYmIGF0dHJpYnV0ZU5vZGUuc3BlY2lmaWVkCgkJCQkJCT8gYXR0cmlidXRlTm9kZS52YWx1ZQoJCQkJCQk6IGVsZW0ubm9kZU5hbWUubWF0Y2goLyhidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkvaSkKCQkJCQkJCT8gMAoJCQkJCQkJOiBlbGVtLm5vZGVOYW1lLm1hdGNoKC9eKGF8YXJlYSkkL2kpICYmIGVsZW0uaHJlZgoJCQkJCQkJCT8gMAoJCQkJCQkJCTogdW5kZWZpbmVkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtWyBuYW1lIF07CgkJCX0KCgkJCWlmICggIWpRdWVyeS5zdXBwb3J0LnN0eWxlICYmIG5vdHhtbCAmJiAgbmFtZSA9PSAic3R5bGUiICkKCQkJCXJldHVybiBqUXVlcnkuYXR0ciggZWxlbS5zdHlsZSwgImNzc1RleHQiLCB2YWx1ZSApOwoKCQkJaWYgKCBzZXQgKQoJCQkJLy8gY29udmVydCB0aGUgdmFsdWUgdG8gYSBzdHJpbmcgKGFsbCBicm93c2VycyBkbyB0aGlzIGJ1dCBJRSkgc2VlICMxMDcwCgkJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgIiIgKyB2YWx1ZSApOwoKCQkJdmFyIGF0dHIgPSAhalF1ZXJ5LnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWQgJiYgbm90eG1sICYmIHNwZWNpYWwKCQkJCQkvLyBTb21lIGF0dHJpYnV0ZXMgcmVxdWlyZSBhIHNwZWNpYWwgY2FsbCBvbiBJRQoJCQkJCT8gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIDIgKQoJCQkJCTogZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKCgkJCS8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkCgkJCXJldHVybiBhdHRyID09PSBudWxsID8gdW5kZWZpbmVkIDogYXR0cjsKCQl9CgoJCS8vIGVsZW0gaXMgYWN0dWFsbHkgZWxlbS5zdHlsZSAuLi4gc2V0IHRoZSBzdHlsZQoKCQkvLyBJRSB1c2VzIGZpbHRlcnMgZm9yIG9wYWNpdHkKCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5vcGFjaXR5ICYmIG5hbWUgPT0gIm9wYWNpdHkiICkgewoJCQlpZiAoIHNldCApIHsKCQkJCS8vIElFIGhhcyB0cm91YmxlIHdpdGggb3BhY2l0eSBpZiBpdCBkb2VzIG5vdCBoYXZlIGxheW91dAoJCQkJLy8gRm9yY2UgaXQgYnkgc2V0dGluZyB0aGUgem9vbSBsZXZlbAoJCQkJZWxlbS56b29tID0gMTsKCgkJCQkvLyBTZXQgdGhlIGFscGhhIGZpbHRlciB0byBzZXQgdGhlIG9wYWNpdHkKCQkJCWVsZW0uZmlsdGVyID0gKGVsZW0uZmlsdGVyIHx8ICIiKS5yZXBsYWNlKCAvYWxwaGFcKFteKV0qXCkvLCAiIiApICsKCQkJCQkocGFyc2VJbnQoIHZhbHVlICkgKyAnJyA9PSAiTmFOIiA/ICIiIDogImFscGhhKG9wYWNpdHk9IiArIHZhbHVlICogMTAwICsgIikiKTsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uZmlsdGVyICYmIGVsZW0uZmlsdGVyLmluZGV4T2YoIm9wYWNpdHk9IikgPj0gMCA/CgkJCQkocGFyc2VGbG9hdCggZWxlbS5maWx0ZXIubWF0Y2goL29wYWNpdHk9KFteKV0qKS8pWzFdICkgLyAxMDApICsgJyc6CgkJCQkiIjsKCQl9CgoJCW5hbWUgPSBuYW1lLnJlcGxhY2UoLy0oW2Etel0pL2lnLCBmdW5jdGlvbihhbGwsIGxldHRlcil7CgkJCXJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTsKCQl9KTsKCgkJaWYgKCBzZXQgKQoJCQllbGVtWyBuYW1lIF0gPSB2YWx1ZTsKCgkJcmV0dXJuIGVsZW1bIG5hbWUgXTsKCX0sCgoJdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7CgkJcmV0dXJuICh0ZXh0IHx8ICIiKS5yZXBsYWNlKCAvXlxzK3xccyskL2csICIiICk7Cgl9LAoKCW1ha2VBcnJheTogZnVuY3Rpb24oIGFycmF5ICkgewoJCXZhciByZXQgPSBbXTsKCgkJaWYoIGFycmF5ICE9IG51bGwgKXsKCQkJdmFyIGkgPSBhcnJheS5sZW5ndGg7CgkJCS8vIFRoZSB3aW5kb3csIHN0cmluZ3MgKGFuZCBmdW5jdGlvbnMpIGFsc28gaGF2ZSAnbGVuZ3RoJwoJCQlpZiggaSA9PSBudWxsIHx8IHR5cGVvZiBhcnJheSA9PT0gInN0cmluZyIgfHwgalF1ZXJ5LmlzRnVuY3Rpb24oYXJyYXkpIHx8IGFycmF5LnNldEludGVydmFsICkKCQkJCXJldFswXSA9IGFycmF5OwoJCQllbHNlCgkJCQl3aGlsZSggaSApCgkJCQkJcmV0Wy0taV0gPSBhcnJheVtpXTsKCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCWluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnJheSApIHsKCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkKCQkvLyBVc2UgPT09IGJlY2F1c2Ugb24gSUUsIHdpbmRvdyA9PSBkb2N1bWVudAoJCQlpZiAoIGFycmF5WyBpIF0gPT09IGVsZW0gKQoJCQkJcmV0dXJuIGk7CgoJCXJldHVybiAtMTsKCX0sCgoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCS8vIFdlIGhhdmUgdG8gbG9vcCB0aGlzIHdheSBiZWNhdXNlIElFICYgT3BlcmEgb3ZlcndyaXRlIHRoZSBsZW5ndGgKCQkvLyBleHBhbmRvIG9mIGdldEVsZW1lbnRzQnlUYWdOYW1lCgkJdmFyIGkgPSAwLCBlbGVtLCBwb3MgPSBmaXJzdC5sZW5ndGg7CgkJLy8gQWxzbywgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29ycmVjdCBlbGVtZW50cyBhcmUgYmVpbmcgcmV0dXJuZWQKCQkvLyAoSUUgcmV0dXJucyBjb21tZW50IG5vZGVzIGluIGEgJyonIHF1ZXJ5KQoJCWlmICggIWpRdWVyeS5zdXBwb3J0LmdldEFsbCApIHsKCQkJd2hpbGUgKCAoZWxlbSA9IHNlY29uZFsgaSsrIF0pICE9IG51bGwgKQoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlICE9IDggKQoJCQkJCWZpcnN0WyBwb3MrKyBdID0gZWxlbTsKCgkJfSBlbHNlCgkJCXdoaWxlICggKGVsZW0gPSBzZWNvbmRbIGkrKyBdKSAhPSBudWxsICkKCQkJCWZpcnN0WyBwb3MrKyBdID0gZWxlbTsKCgkJcmV0dXJuIGZpcnN0OwoJfSwKCgl1bmlxdWU6IGZ1bmN0aW9uKCBhcnJheSApIHsKCQl2YXIgcmV0ID0gW10sIGRvbmUgPSB7fTsKCgkJdHJ5IHsKCgkJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQl2YXIgaWQgPSBqUXVlcnkuZGF0YSggYXJyYXlbIGkgXSApOwoKCQkJCWlmICggIWRvbmVbIGlkIF0gKSB7CgkJCQkJZG9uZVsgaWQgXSA9IHRydWU7CgkJCQkJcmV0LnB1c2goIGFycmF5WyBpIF0gKTsKCQkJCX0KCQkJfQoKCQl9IGNhdGNoKCBlICkgewoJCQlyZXQgPSBhcnJheTsKCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCWdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludiApIHsKCQl2YXIgcmV0ID0gW107CgoJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXMKCQkvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvbgoJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKQoJCQlpZiAoICFpbnYgIT0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICkgKQoJCQkJcmV0LnB1c2goIGVsZW1zWyBpIF0gKTsKCgkJcmV0dXJuIHJldDsKCX0sCgoJbWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrICkgewoJCXZhciByZXQgPSBbXTsKCgkJLy8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyCgkJLy8gbmV3IHZhbHVlIChvciB2YWx1ZXMpLgoJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCXZhciB2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgoJCQlpZiAoIHZhbHVlICE9IG51bGwgKQoJCQkJcmV0WyByZXQubGVuZ3RoIF0gPSB2YWx1ZTsKCQl9CgoJCXJldHVybiByZXQuY29uY2F0LmFwcGx5KCBbXSwgcmV0ICk7Cgl9Cn0pOwoKLy8gVXNlIG9mIGpRdWVyeS5icm93c2VyIGlzIGRlcHJlY2F0ZWQuCi8vIEl0J3MgaW5jbHVkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBwbHVnaW5zLAovLyBhbHRob3VnaCB0aGV5IHNob3VsZCB3b3JrIHRvIG1pZ3JhdGUgYXdheS4KCnZhciB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7CgovLyBGaWd1cmUgb3V0IHdoYXQgYnJvd3NlciBpcyBiZWluZyB1c2VkCmpRdWVyeS5icm93c2VyID0gewoJdmVyc2lvbjogKHVzZXJBZ2VudC5tYXRjaCggLy4rKD86cnZ8aXR8cmF8aWUpW1wvOiBdKFtcZC5dKykvICkgfHwgWzAsJzAnXSlbMV0sCglzYWZhcmk6IC93ZWJraXQvLnRlc3QoIHVzZXJBZ2VudCApLAoJb3BlcmE6IC9vcGVyYS8udGVzdCggdXNlckFnZW50ICksCgltc2llOiAvbXNpZS8udGVzdCggdXNlckFnZW50ICkgJiYgIS9vcGVyYS8udGVzdCggdXNlckFnZW50ICksCgltb3ppbGxhOiAvbW96aWxsYS8udGVzdCggdXNlckFnZW50ICkgJiYgIS8oY29tcGF0aWJsZXx3ZWJraXQpLy50ZXN0KCB1c2VyQWdlbnQgKQp9OwoKalF1ZXJ5LmVhY2goewoJcGFyZW50OiBmdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxlbS5wYXJlbnROb2RlO30sCglwYXJlbnRzOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LmRpcihlbGVtLCJwYXJlbnROb2RlIik7fSwKCW5leHQ6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubnRoKGVsZW0sMiwibmV4dFNpYmxpbmciKTt9LAoJcHJldjogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5udGgoZWxlbSwyLCJwcmV2aW91c1NpYmxpbmciKTt9LAoJbmV4dEFsbDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwibmV4dFNpYmxpbmciKTt9LAoJcHJldkFsbDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwicHJldmlvdXNTaWJsaW5nIik7fSwKCXNpYmxpbmdzOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsZWxlbSk7fSwKCWNoaWxkcmVuOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5maXJzdENoaWxkKTt9LAoJY29udGVudHM6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubm9kZU5hbWUoZWxlbSwiaWZyYW1lIik/ZWxlbS5jb250ZW50RG9jdW1lbnR8fGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudDpqUXVlcnkubWFrZUFycmF5KGVsZW0uY2hpbGROb2Rlcyk7fQp9LCBmdW5jdGlvbihuYW1lLCBmbil7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgcmV0ID0galF1ZXJ5Lm1hcCggdGhpcywgZm4gKTsKCgkJaWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT0gInN0cmluZyIgKQoJCQlyZXQgPSBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsKCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkudW5pcXVlKCByZXQgKSwgbmFtZSwgc2VsZWN0b3IgKTsKCX07Cn0pOwoKalF1ZXJ5LmVhY2goewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKG5hbWUsIG9yaWdpbmFsKXsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciByZXQgPSBbXSwgaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApOwoKCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbnNlcnQubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQl2YXIgZWxlbXMgPSAoaSA+IDAgPyB0aGlzLmNsb25lKHRydWUpIDogdGhpcykuZ2V0KCk7CgkJCWpRdWVyeS5mblsgb3JpZ2luYWwgXS5hcHBseSggalF1ZXJ5KGluc2VydFtpXSksIGVsZW1zICk7CgkJCXJldCA9IHJldC5jb25jYXQoIGVsZW1zICk7CgkJfQoKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgc2VsZWN0b3IgKTsKCX07Cn0pOwoKalF1ZXJ5LmVhY2goewoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUgKSB7CgkJalF1ZXJ5LmF0dHIoIHRoaXMsIG5hbWUsICIiICk7CgkJaWYgKHRoaXMubm9kZVR5cGUgPT0gMSkKCQkJdGhpcy5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTsKCX0sCgoJYWRkQ2xhc3M6IGZ1bmN0aW9uKCBjbGFzc05hbWVzICkgewoJCWpRdWVyeS5jbGFzc05hbWUuYWRkKCB0aGlzLCBjbGFzc05hbWVzICk7Cgl9LAoKCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggY2xhc3NOYW1lcyApIHsKCQlqUXVlcnkuY2xhc3NOYW1lLnJlbW92ZSggdGhpcywgY2xhc3NOYW1lcyApOwoJfSwKCgl0b2dnbGVDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMsIHN0YXRlICkgewoJCWlmKCB0eXBlb2Ygc3RhdGUgIT09ICJib29sZWFuIiApCgkJCXN0YXRlID0gIWpRdWVyeS5jbGFzc05hbWUuaGFzKCB0aGlzLCBjbGFzc05hbWVzICk7CgkJalF1ZXJ5LmNsYXNzTmFtZVsgc3RhdGUgPyAiYWRkIiA6ICJyZW1vdmUiIF0oIHRoaXMsIGNsYXNzTmFtZXMgKTsKCX0sCgoJcmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJaWYgKCAhc2VsZWN0b3IgfHwgalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIFsgdGhpcyBdICkubGVuZ3RoICkgewoJCQkvLyBQcmV2ZW50IG1lbW9yeSBsZWFrcwoJCQlqUXVlcnkoICIqIiwgdGhpcyApLmFkZChbdGhpc10pLmVhY2goZnVuY3Rpb24oKXsKCQkJCWpRdWVyeS5ldmVudC5yZW1vdmUodGhpcyk7CgkJCQlqUXVlcnkucmVtb3ZlRGF0YSh0aGlzKTsKCQkJfSk7CgkJCWlmICh0aGlzLnBhcmVudE5vZGUpCgkJCQl0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRoaXMgKTsKCQl9Cgl9LAoKCWVtcHR5OiBmdW5jdGlvbigpIHsKCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKCQlqUXVlcnkodGhpcykuY2hpbGRyZW4oKS5yZW1vdmUoKTsKCgkJLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXMKCQl3aGlsZSAoIHRoaXMuZmlyc3RDaGlsZCApCgkJCXRoaXMucmVtb3ZlQ2hpbGQoIHRoaXMuZmlyc3RDaGlsZCApOwoJfQp9LCBmdW5jdGlvbihuYW1lLCBmbil7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCl7CgkJcmV0dXJuIHRoaXMuZWFjaCggZm4sIGFyZ3VtZW50cyApOwoJfTsKfSk7CgovLyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieSB0aGUgZGltZW5zaW9ucyBhbmQgb2Zmc2V0IG1vZHVsZXMKZnVuY3Rpb24gbnVtKGVsZW0sIHByb3ApIHsKCXJldHVybiBlbGVtWzBdICYmIHBhcnNlSW50KCBqUXVlcnkuY3VyQ1NTKGVsZW1bMF0sIHByb3AsIHRydWUpLCAxMCApIHx8IDA7Cn0KdmFyIGV4cGFuZG8gPSAialF1ZXJ5IiArIG5vdygpLCB1dWlkID0gMCwgd2luZG93RGF0YSA9IHt9OwoKalF1ZXJ5LmV4dGVuZCh7CgljYWNoZToge30sCgoJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CgkJZWxlbSA9IGVsZW0gPT0gd2luZG93ID8KCQkJd2luZG93RGF0YSA6CgkJCWVsZW07CgoJCXZhciBpZCA9IGVsZW1bIGV4cGFuZG8gXTsKCgkJLy8gQ29tcHV0ZSBhIHVuaXF1ZSBJRCBmb3IgdGhlIGVsZW1lbnQKCQlpZiAoICFpZCApCgkJCWlkID0gZWxlbVsgZXhwYW5kbyBdID0gKyt1dWlkOwoKCQkvLyBPbmx5IGdlbmVyYXRlIHRoZSBkYXRhIGNhY2hlIGlmIHdlJ3JlCgkJLy8gdHJ5aW5nIHRvIGFjY2VzcyBvciBtYW5pcHVsYXRlIGl0CgkJaWYgKCBuYW1lICYmICFqUXVlcnkuY2FjaGVbIGlkIF0gKQoJCQlqUXVlcnkuY2FjaGVbIGlkIF0gPSB7fTsKCgkJLy8gUHJldmVudCBvdmVycmlkaW5nIHRoZSBuYW1lZCBjYWNoZSB3aXRoIHVuZGVmaW5lZCB2YWx1ZXMKCQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApCgkJCWpRdWVyeS5jYWNoZVsgaWQgXVsgbmFtZSBdID0gZGF0YTsKCgkJLy8gUmV0dXJuIHRoZSBuYW1lZCBjYWNoZSBkYXRhLCBvciB0aGUgSUQgZm9yIHRoZSBlbGVtZW50CgkJcmV0dXJuIG5hbWUgPwoJCQlqUXVlcnkuY2FjaGVbIGlkIF1bIG5hbWUgXSA6CgkJCWlkOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQllbGVtID0gZWxlbSA9PSB3aW5kb3cgPwoJCQl3aW5kb3dEYXRhIDoKCQkJZWxlbTsKCgkJdmFyIGlkID0gZWxlbVsgZXhwYW5kbyBdOwoKCQkvLyBJZiB3ZSB3YW50IHRvIHJlbW92ZSBhIHNwZWNpZmljIHNlY3Rpb24gb2YgdGhlIGVsZW1lbnQncyBkYXRhCgkJaWYgKCBuYW1lICkgewoJCQlpZiAoIGpRdWVyeS5jYWNoZVsgaWQgXSApIHsKCQkJCS8vIFJlbW92ZSB0aGUgc2VjdGlvbiBvZiBjYWNoZSBkYXRhCgkJCQlkZWxldGUgalF1ZXJ5LmNhY2hlWyBpZCBdWyBuYW1lIF07CgoJCQkJLy8gSWYgd2UndmUgcmVtb3ZlZCBhbGwgdGhlIGRhdGEsIHJlbW92ZSB0aGUgZWxlbWVudCdzIGNhY2hlCgkJCQluYW1lID0gIiI7CgoJCQkJZm9yICggbmFtZSBpbiBqUXVlcnkuY2FjaGVbIGlkIF0gKQoJCQkJCWJyZWFrOwoKCQkJCWlmICggIW5hbWUgKQoJCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtICk7CgkJCX0KCgkJLy8gT3RoZXJ3aXNlLCB3ZSB3YW50IHRvIHJlbW92ZSBhbGwgb2YgdGhlIGVsZW1lbnQncyBkYXRhCgkJfSBlbHNlIHsKCQkJLy8gQ2xlYW4gdXAgdGhlIGVsZW1lbnQgZXhwYW5kbwoJCQl0cnkgewoJCQkJZGVsZXRlIGVsZW1bIGV4cGFuZG8gXTsKCQkJfSBjYXRjaChlKXsKCQkJCS8vIElFIGhhcyB0cm91YmxlIGRpcmVjdGx5IHJlbW92aW5nIHRoZSBleHBhbmRvCgkJCQkvLyBidXQgaXQncyBvayB3aXRoIHVzaW5nIHJlbW92ZUF0dHJpYnV0ZQoJCQkJaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApCgkJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGV4cGFuZG8gKTsKCQkJfQoKCQkJLy8gQ29tcGxldGVseSByZW1vdmUgdGhlIGRhdGEgY2FjaGUKCQkJZGVsZXRlIGpRdWVyeS5jYWNoZVsgaWQgXTsKCQl9Cgl9LAoJcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgewoJCWlmICggZWxlbSApewoJCgkJCXR5cGUgPSAodHlwZSB8fCAiZngiKSArICJxdWV1ZSI7CgkKCQkJdmFyIHEgPSBqUXVlcnkuZGF0YSggZWxlbSwgdHlwZSApOwoJCgkJCWlmICggIXEgfHwgalF1ZXJ5LmlzQXJyYXkoZGF0YSkgKQoJCQkJcSA9IGpRdWVyeS5kYXRhKCBlbGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KGRhdGEpICk7CgkJCWVsc2UgaWYoIGRhdGEgKQoJCQkJcS5wdXNoKCBkYXRhICk7CgkKCQl9CgkJcmV0dXJuIHE7Cgl9LAoKCWRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICl7CgkJdmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksCgkJCWZuID0gcXVldWUuc2hpZnQoKTsKCQkKCQlpZiggIXR5cGUgfHwgdHlwZSA9PT0gImZ4IiApCgkJCWZuID0gcXVldWVbMF07CgkJCQoJCWlmKCBmbiAhPT0gdW5kZWZpbmVkICkKCQkJZm4uY2FsbChlbGVtKTsKCX0KfSk7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICl7CgkJdmFyIHBhcnRzID0ga2V5LnNwbGl0KCIuIik7CgkJcGFydHNbMV0gPSBwYXJ0c1sxXSA/ICIuIiArIHBhcnRzWzFdIDogIiI7CgoJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJdmFyIGRhdGEgPSB0aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF1dKTsKCgkJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIHRoaXMubGVuZ3RoICkKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSwga2V5ICk7CgoJCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkICYmIHBhcnRzWzFdID8KCQkJCXRoaXMuZGF0YSggcGFydHNbMF0gKSA6CgkJCQlkYXRhOwoJCX0gZWxzZQoJCQlyZXR1cm4gdGhpcy50cmlnZ2VyKCJzZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF0sIHZhbHVlXSkuZWFjaChmdW5jdGlvbigpewoJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJfSk7Cgl9LAoKCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKXsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5yZW1vdmVEYXRhKCB0aGlzLCBrZXkgKTsKCQl9KTsKCX0sCglxdWV1ZTogZnVuY3Rpb24odHlwZSwgZGF0YSl7CgkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CgkJCWRhdGEgPSB0eXBlOwoJCQl0eXBlID0gImZ4IjsKCQl9CgoJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICkKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApOwoJCQkKCQkJIGlmKCB0eXBlID09ICJmeCIgJiYgcXVldWUubGVuZ3RoID09IDEgKQoJCQkJcXVldWVbMF0uY2FsbCh0aGlzKTsKCQl9KTsKCX0sCglkZXF1ZXVlOiBmdW5jdGlvbih0eXBlKXsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSk7Cgl9Cn0pOy8qIQogKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSAtIHYwLjkuMwogKiAgQ29weXJpZ2h0IDIwMDksIFRoZSBEb2pvIEZvdW5kYXRpb24KICogIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQsIEJTRCwgYW5kIEdQTCBMaWNlbnNlcy4KICogIE1vcmUgaW5mb3JtYXRpb246IGh0dHA6Ly9zaXp6bGVqcy5jb20vCiAqLwooZnVuY3Rpb24oKXsKCnZhciBjaHVua2VyID0gLygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15bXF1dKlxdfFsnIl1bXiciXSpbJyJdfFteW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPy9nLAoJZG9uZSA9IDAsCgl0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7Cgp2YXIgU2l6emxlID0gZnVuY3Rpb24oc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQpIHsKCXJlc3VsdHMgPSByZXN1bHRzIHx8IFtdOwoJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJaWYgKCBjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkgKQoJCXJldHVybiBbXTsKCQoJaWYgKCAhc2VsZWN0b3IgfHwgdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKCQlyZXR1cm4gcmVzdWx0czsKCX0KCgl2YXIgcGFydHMgPSBbXSwgbSwgc2V0LCBjaGVja1NldCwgY2hlY2ssIG1vZGUsIGV4dHJhLCBwcnVuZSA9IHRydWU7CgkKCS8vIFJlc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgY2h1bmtlciByZWdleHAgKHN0YXJ0IGZyb20gaGVhZCkKCWNodW5rZXIubGFzdEluZGV4ID0gMDsKCQoJd2hpbGUgKCAobSA9IGNodW5rZXIuZXhlYyhzZWxlY3RvcikpICE9PSBudWxsICkgewoJCXBhcnRzLnB1c2goIG1bMV0gKTsKCQkKCQlpZiAoIG1bMl0gKSB7CgkJCWV4dHJhID0gUmVnRXhwLnJpZ2h0Q29udGV4dDsKCQkJYnJlYWs7CgkJfQoJfQoKCWlmICggcGFydHMubGVuZ3RoID4gMSAmJiBvcmlnUE9TLmV4ZWMoIHNlbGVjdG9yICkgKSB7CgkJaWYgKCBwYXJ0cy5sZW5ndGggPT09IDIgJiYgRXhwci5yZWxhdGl2ZVsgcGFydHNbMF0gXSApIHsKCQkJc2V0ID0gcG9zUHJvY2VzcyggcGFydHNbMF0gKyBwYXJ0c1sxXSwgY29udGV4dCApOwoJCX0gZWxzZSB7CgkJCXNldCA9IEV4cHIucmVsYXRpdmVbIHBhcnRzWzBdIF0gPwoJCQkJWyBjb250ZXh0IF0gOgoJCQkJU2l6emxlKCBwYXJ0cy5zaGlmdCgpLCBjb250ZXh0ICk7CgoJCQl3aGlsZSAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCXNlbGVjdG9yID0gcGFydHMuc2hpZnQoKTsKCgkJCQlpZiAoIEV4cHIucmVsYXRpdmVbIHNlbGVjdG9yIF0gKQoJCQkJCXNlbGVjdG9yICs9IHBhcnRzLnNoaWZ0KCk7CgoJCQkJc2V0ID0gcG9zUHJvY2Vzcyggc2VsZWN0b3IsIHNldCApOwoJCQl9CgkJfQoJfSBlbHNlIHsKCQl2YXIgcmV0ID0gc2VlZCA/CgkJCXsgZXhwcjogcGFydHMucG9wKCksIHNldDogbWFrZUFycmF5KHNlZWQpIH0gOgoJCQlTaXp6bGUuZmluZCggcGFydHMucG9wKCksIHBhcnRzLmxlbmd0aCA9PT0gMSAmJiBjb250ZXh0LnBhcmVudE5vZGUgPyBjb250ZXh0LnBhcmVudE5vZGUgOiBjb250ZXh0LCBpc1hNTChjb250ZXh0KSApOwoJCXNldCA9IFNpenpsZS5maWx0ZXIoIHJldC5leHByLCByZXQuc2V0ICk7CgoJCWlmICggcGFydHMubGVuZ3RoID4gMCApIHsKCQkJY2hlY2tTZXQgPSBtYWtlQXJyYXkoc2V0KTsKCQl9IGVsc2UgewoJCQlwcnVuZSA9IGZhbHNlOwoJCX0KCgkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCXZhciBjdXIgPSBwYXJ0cy5wb3AoKSwgcG9wID0gY3VyOwoKCQkJaWYgKCAhRXhwci5yZWxhdGl2ZVsgY3VyIF0gKSB7CgkJCQljdXIgPSAiIjsKCQkJfSBlbHNlIHsKCQkJCXBvcCA9IHBhcnRzLnBvcCgpOwoJCQl9CgoJCQlpZiAoIHBvcCA9PSBudWxsICkgewoJCQkJcG9wID0gY29udGV4dDsKCQkJfQoKCQkJRXhwci5yZWxhdGl2ZVsgY3VyIF0oIGNoZWNrU2V0LCBwb3AsIGlzWE1MKGNvbnRleHQpICk7CgkJfQoJfQoKCWlmICggIWNoZWNrU2V0ICkgewoJCWNoZWNrU2V0ID0gc2V0OwoJfQoKCWlmICggIWNoZWNrU2V0ICkgewoJCXRocm93ICJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiICsgKGN1ciB8fCBzZWxlY3Rvcik7Cgl9CgoJaWYgKCB0b1N0cmluZy5jYWxsKGNoZWNrU2V0KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsKCQlpZiAoICFwcnVuZSApIHsKCQkJcmVzdWx0cy5wdXNoLmFwcGx5KCByZXN1bHRzLCBjaGVja1NldCApOwoJCX0gZWxzZSBpZiAoIGNvbnRleHQubm9kZVR5cGUgPT09IDEgKSB7CgkJCWZvciAoIHZhciBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiAoY2hlY2tTZXRbaV0gPT09IHRydWUgfHwgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgJiYgY29udGFpbnMoY29udGV4dCwgY2hlY2tTZXRbaV0pKSApIHsKCQkJCQlyZXN1bHRzLnB1c2goIHNldFtpXSApOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwOyBjaGVja1NldFtpXSAhPSBudWxsOyBpKysgKSB7CgkJCQlpZiAoIGNoZWNrU2V0W2ldICYmIGNoZWNrU2V0W2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCXJlc3VsdHMucHVzaCggc2V0W2ldICk7CgkJCQl9CgkJCX0KCQl9Cgl9IGVsc2UgewoJCW1ha2VBcnJheSggY2hlY2tTZXQsIHJlc3VsdHMgKTsKCX0KCglpZiAoIGV4dHJhICkgewoJCVNpenpsZSggZXh0cmEsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTsKCgkJaWYgKCBzb3J0T3JkZXIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IGZhbHNlOwoJCQlyZXN1bHRzLnNvcnQoc29ydE9yZGVyKTsKCgkJCWlmICggaGFzRHVwbGljYXRlICkgewoJCQkJZm9yICggdmFyIGkgPSAxOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKyApIHsKCQkJCQlpZiAoIHJlc3VsdHNbaV0gPT09IHJlc3VsdHNbaS0xXSApIHsKCQkJCQkJcmVzdWx0cy5zcGxpY2UoaS0tLCAxKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIHJlc3VsdHM7Cn07CgpTaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKGV4cHIsIHNldCl7CglyZXR1cm4gU2l6emxlKGV4cHIsIG51bGwsIG51bGwsIHNldCk7Cn07CgpTaXp6bGUuZmluZCA9IGZ1bmN0aW9uKGV4cHIsIGNvbnRleHQsIGlzWE1MKXsKCXZhciBzZXQsIG1hdGNoOwoKCWlmICggIWV4cHIgKSB7CgkJcmV0dXJuIFtdOwoJfQoKCWZvciAoIHZhciBpID0gMCwgbCA9IEV4cHIub3JkZXIubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCXZhciB0eXBlID0gRXhwci5vcmRlcltpXSwgbWF0Y2g7CgkJCgkJaWYgKCAobWF0Y2ggPSBFeHByLm1hdGNoWyB0eXBlIF0uZXhlYyggZXhwciApKSApIHsKCQkJdmFyIGxlZnQgPSBSZWdFeHAubGVmdENvbnRleHQ7CgoJCQlpZiAoIGxlZnQuc3Vic3RyKCBsZWZ0Lmxlbmd0aCAtIDEgKSAhPT0gIlxcIiApIHsKCQkJCW1hdGNoWzFdID0gKG1hdGNoWzFdIHx8ICIiKS5yZXBsYWNlKC9cXC9nLCAiIik7CgkJCQlzZXQgPSBFeHByLmZpbmRbIHR5cGUgXSggbWF0Y2gsIGNvbnRleHQsIGlzWE1MICk7CgkJCQlpZiAoIHNldCAhPSBudWxsICkgewoJCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCX0KCglpZiAoICFzZXQgKSB7CgkJc2V0ID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOwoJfQoKCXJldHVybiB7c2V0OiBzZXQsIGV4cHI6IGV4cHJ9Owp9OwoKU2l6emxlLmZpbHRlciA9IGZ1bmN0aW9uKGV4cHIsIHNldCwgaW5wbGFjZSwgbm90KXsKCXZhciBvbGQgPSBleHByLCByZXN1bHQgPSBbXSwgY3VyTG9vcCA9IHNldCwgbWF0Y2gsIGFueUZvdW5kLAoJCWlzWE1MRmlsdGVyID0gc2V0ICYmIHNldFswXSAmJiBpc1hNTChzZXRbMF0pOwoKCXdoaWxlICggZXhwciAmJiBzZXQubGVuZ3RoICkgewoJCWZvciAoIHZhciB0eXBlIGluIEV4cHIuZmlsdGVyICkgewoJCQlpZiAoIChtYXRjaCA9IEV4cHIubWF0Y2hbIHR5cGUgXS5leGVjKCBleHByICkpICE9IG51bGwgKSB7CgkJCQl2YXIgZmlsdGVyID0gRXhwci5maWx0ZXJbIHR5cGUgXSwgZm91bmQsIGl0ZW07CgkJCQlhbnlGb3VuZCA9IGZhbHNlOwoKCQkJCWlmICggY3VyTG9vcCA9PSByZXN1bHQgKSB7CgkJCQkJcmVzdWx0ID0gW107CgkJCQl9CgoJCQkJaWYgKCBFeHByLnByZUZpbHRlclsgdHlwZSBdICkgewoJCQkJCW1hdGNoID0gRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSggbWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTEZpbHRlciApOwoKCQkJCQlpZiAoICFtYXRjaCApIHsKCQkJCQkJYW55Rm91bmQgPSBmb3VuZCA9IHRydWU7CgkJCQkJfSBlbHNlIGlmICggbWF0Y2ggPT09IHRydWUgKSB7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0KCQkJCX0KCgkJCQlpZiAoIG1hdGNoICkgewoJCQkJCWZvciAoIHZhciBpID0gMDsgKGl0ZW0gPSBjdXJMb29wW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCQkJCWlmICggaXRlbSApIHsKCQkJCQkJCWZvdW5kID0gZmlsdGVyKCBpdGVtLCBtYXRjaCwgaSwgY3VyTG9vcCApOwoJCQkJCQkJdmFyIHBhc3MgPSBub3QgXiAhIWZvdW5kOwoKCQkJCQkJCWlmICggaW5wbGFjZSAmJiBmb3VuZCAhPSBudWxsICkgewoJCQkJCQkJCWlmICggcGFzcyApIHsKCQkJCQkJCQkJYW55Rm91bmQgPSB0cnVlOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCWN1ckxvb3BbaV0gPSBmYWxzZTsKCQkJCQkJCQl9CgkJCQkJCQl9IGVsc2UgaWYgKCBwYXNzICkgewoJCQkJCQkJCXJlc3VsdC5wdXNoKCBpdGVtICk7CgkJCQkJCQkJYW55Rm91bmQgPSB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggZm91bmQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQlpZiAoICFpbnBsYWNlICkgewoJCQkJCQljdXJMb29wID0gcmVzdWx0OwoJCQkJCX0KCgkJCQkJZXhwciA9IGV4cHIucmVwbGFjZSggRXhwci5tYXRjaFsgdHlwZSBdLCAiIiApOwoKCQkJCQlpZiAoICFhbnlGb3VuZCApIHsKCQkJCQkJcmV0dXJuIFtdOwoJCQkJCX0KCgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEltcHJvcGVyIGV4cHJlc3Npb24KCQlpZiAoIGV4cHIgPT0gb2xkICkgewoJCQlpZiAoIGFueUZvdW5kID09IG51bGwgKSB7CgkJCQl0aHJvdyAiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIGV4cHI7CgkJCX0gZWxzZSB7CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJb2xkID0gZXhwcjsKCX0KCglyZXR1cm4gY3VyTG9vcDsKfTsKCnZhciBFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKCW9yZGVyOiBbICJJRCIsICJOQU1FIiwgIlRBRyIgXSwKCW1hdGNoOiB7CgkJSUQ6IC8jKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspLywKCQlDTEFTUzogL1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspLywKCQlOQU1FOiAvXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspWyciXSpcXS8sCgkJQVRUUjogL1xbXHMqKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspXHMqKD86KFxTPz0pXHMqKFsnIl0qKSguKj8pXDN8KVxzKlxdLywKCQlUQUc6IC9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKl8tXXxcXC4pKykvLAoJCUNISUxEOiAvOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoKGV2ZW58b2RkfFtcZG4rLV0qKVwpKT8vLAoJCVBPUzogLzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXi1dfCQpLywKCQlQU0VVRE86IC86KCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspKD86XCgoWyciXSopKCg/OlwoW15cKV0rXCl8W15cMlwoXCldKikrKVwyXCkpPy8KCX0sCglhdHRyTWFwOiB7CgkJImNsYXNzIjogImNsYXNzTmFtZSIsCgkJImZvciI6ICJodG1sRm9yIgoJfSwKCWF0dHJIYW5kbGU6IHsKCQlocmVmOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJocmVmIik7CgkJfQoJfSwKCXJlbGF0aXZlOiB7CgkJIisiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpewoJCQl2YXIgaXNQYXJ0U3RyID0gdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciLAoJCQkJaXNUYWcgPSBpc1BhcnRTdHIgJiYgIS9cVy8udGVzdChwYXJ0KSwKCQkJCWlzUGFydFN0ck5vdFRhZyA9IGlzUGFydFN0ciAmJiAhaXNUYWc7CgoJCQlpZiAoIGlzVGFnICYmICFpc1hNTCApIHsKCQkJCXBhcnQgPSBwYXJ0LnRvVXBwZXJDYXNlKCk7CgkJCX0KCgkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aCwgZWxlbTsgaSA8IGw7IGkrKyApIHsKCQkJCWlmICggKGVsZW0gPSBjaGVja1NldFtpXSkgKSB7CgkJCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW0ucHJldmlvdXNTaWJsaW5nKSAmJiBlbGVtLm5vZGVUeXBlICE9PSAxICkge30KCgkJCQkJY2hlY2tTZXRbaV0gPSBpc1BhcnRTdHJOb3RUYWcgfHwgZWxlbSAmJiBlbGVtLm5vZGVOYW1lID09PSBwYXJ0ID8KCQkJCQkJZWxlbSB8fCBmYWxzZSA6CgkJCQkJCWVsZW0gPT09IHBhcnQ7CgkJCQl9CgkJCX0KCgkJCWlmICggaXNQYXJ0U3RyTm90VGFnICkgewoJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsKCQkJfQoJCX0sCgkJIj4iOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpewoJCQl2YXIgaXNQYXJ0U3RyID0gdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciOwoKCQkJaWYgKCBpc1BhcnRTdHIgJiYgIS9cVy8udGVzdChwYXJ0KSApIHsKCQkJCXBhcnQgPSBpc1hNTCA/IHBhcnQgOiBwYXJ0LnRvVXBwZXJDYXNlKCk7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CgkJCQkJaWYgKCBlbGVtICkgewoJCQkJCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOwoJCQkJCQljaGVja1NldFtpXSA9IHBhcmVudC5ub2RlTmFtZSA9PT0gcGFydCA/IHBhcmVudCA6IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoJCQkJCWlmICggZWxlbSApIHsKCQkJCQkJY2hlY2tTZXRbaV0gPSBpc1BhcnRTdHIgPwoJCQkJCQkJZWxlbS5wYXJlbnROb2RlIDoKCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA9PT0gcGFydDsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCBpc1BhcnRTdHIgKSB7CgkJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsKCQkJCX0KCQkJfQoJCX0sCgkJIiI6IGZ1bmN0aW9uKGNoZWNrU2V0LCBwYXJ0LCBpc1hNTCl7CgkJCXZhciBkb25lTmFtZSA9IGRvbmUrKywgY2hlY2tGbiA9IGRpckNoZWNrOwoKCQkJaWYgKCAhcGFydC5tYXRjaCgvXFcvKSApIHsKCQkJCXZhciBub2RlQ2hlY2sgPSBwYXJ0ID0gaXNYTUwgPyBwYXJ0IDogcGFydC50b1VwcGVyQ2FzZSgpOwoJCQkJY2hlY2tGbiA9IGRpck5vZGVDaGVjazsKCQkJfQoKCQkJY2hlY2tGbigicGFyZW50Tm9kZSIsIHBhcnQsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCk7CgkJfSwKCQkifiI6IGZ1bmN0aW9uKGNoZWNrU2V0LCBwYXJ0LCBpc1hNTCl7CgkJCXZhciBkb25lTmFtZSA9IGRvbmUrKywgY2hlY2tGbiA9IGRpckNoZWNrOwoKCQkJaWYgKCB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIgJiYgIXBhcnQubWF0Y2goL1xXLykgKSB7CgkJCQl2YXIgbm9kZUNoZWNrID0gcGFydCA9IGlzWE1MID8gcGFydCA6IHBhcnQudG9VcHBlckNhc2UoKTsKCQkJCWNoZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CgkJCX0KCgkJCWNoZWNrRm4oInByZXZpb3VzU2libGluZyIsIHBhcnQsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCk7CgkJfQoJfSwKCWZpbmQ6IHsKCQlJRDogZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKXsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgIWlzWE1MICkgewoJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsKCQkJCXJldHVybiBtID8gW21dIDogW107CgkJCX0KCQl9LAoJCU5BTUU6IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0LCBpc1hNTCl7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJdmFyIHJldCA9IFtdLCByZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZShtYXRjaFsxXSk7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcmVzdWx0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJaWYgKCByZXN1bHRzW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpID09PSBtYXRjaFsxXSApIHsKCQkJCQkJcmV0LnB1c2goIHJlc3VsdHNbaV0gKTsKCQkJCQl9CgkJCQl9CgoJCQkJcmV0dXJuIHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0OwoJCQl9CgkJfSwKCQlUQUc6IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0KXsKCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobWF0Y2hbMV0pOwoJCX0KCX0sCglwcmVGaWx0ZXI6IHsKCQlDTEFTUzogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTCl7CgkJCW1hdGNoID0gIiAiICsgbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpICsgIiAiOwoKCQkJaWYgKCBpc1hNTCApIHsKCQkJCXJldHVybiBtYXRjaDsKCQkJfQoKCQkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IGN1ckxvb3BbaV0pICE9IG51bGw7IGkrKyApIHsKCQkJCWlmICggZWxlbSApIHsKCQkJCQlpZiAoIG5vdCBeIChlbGVtLmNsYXNzTmFtZSAmJiAoIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICIpLmluZGV4T2YobWF0Y2gpID49IDApICkgewoJCQkJCQlpZiAoICFpbnBsYWNlICkKCQkJCQkJCXJlc3VsdC5wdXNoKCBlbGVtICk7CgkJCQkJfSBlbHNlIGlmICggaW5wbGFjZSApIHsKCQkJCQkJY3VyTG9vcFtpXSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGZhbHNlOwoJCX0sCgkJSUQ6IGZ1bmN0aW9uKG1hdGNoKXsKCQkJcmV0dXJuIG1hdGNoWzFdLnJlcGxhY2UoL1xcL2csICIiKTsKCQl9LAoJCVRBRzogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3ApewoJCQlmb3IgKCB2YXIgaSA9IDA7IGN1ckxvb3BbaV0gPT09IGZhbHNlOyBpKysgKXt9CgkJCXJldHVybiBjdXJMb29wW2ldICYmIGlzWE1MKGN1ckxvb3BbaV0pID8gbWF0Y2hbMV0gOiBtYXRjaFsxXS50b1VwcGVyQ2FzZSgpOwoJCX0sCgkJQ0hJTEQ6IGZ1bmN0aW9uKG1hdGNoKXsKCQkJaWYgKCBtYXRjaFsxXSA9PSAibnRoIiApIHsKCQkJCS8vIHBhcnNlIGVxdWF0aW9ucyBsaWtlICdldmVuJywgJ29kZCcsICc1JywgJzJuJywgJzNuKzInLCAnNG4tMScsICctbis2JwoJCQkJdmFyIHRlc3QgPSAvKC0/KShcZCopbigoPzpcK3wtKT9cZCopLy5leGVjKAoJCQkJCW1hdGNoWzJdID09ICJldmVuIiAmJiAiMm4iIHx8IG1hdGNoWzJdID09ICJvZGQiICYmICIybisxIiB8fAoJCQkJCSEvXEQvLnRlc3QoIG1hdGNoWzJdICkgJiYgIjBuKyIgKyBtYXRjaFsyXSB8fCBtYXRjaFsyXSk7CgoJCQkJLy8gY2FsY3VsYXRlIHRoZSBudW1iZXJzIChmaXJzdCluKyhsYXN0KSBpbmNsdWRpbmcgaWYgdGhleSBhcmUgbmVnYXRpdmUKCQkJCW1hdGNoWzJdID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkgLSAwOwoJCQkJbWF0Y2hbM10gPSB0ZXN0WzNdIC0gMDsKCQkJfQoKCQkJLy8gVE9ETzogTW92ZSB0byBub3JtYWwgY2FjaGluZyBzeXN0ZW0KCQkJbWF0Y2hbMF0gPSBkb25lKys7CgoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCQlBVFRSOiBmdW5jdGlvbihtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MKXsKCQkJdmFyIG5hbWUgPSBtYXRjaFsxXS5yZXBsYWNlKC9cXC9nLCAiIik7CgkJCQoJCQlpZiAoICFpc1hNTCAmJiBFeHByLmF0dHJNYXBbbmFtZV0gKSB7CgkJCQltYXRjaFsxXSA9IEV4cHIuYXR0ck1hcFtuYW1lXTsKCQkJfQoKCQkJaWYgKCBtYXRjaFsyXSA9PT0gIn49IiApIHsKCQkJCW1hdGNoWzRdID0gIiAiICsgbWF0Y2hbNF0gKyAiICI7CgkJCX0KCgkJCXJldHVybiBtYXRjaDsKCQl9LAoJCVBTRVVETzogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90KXsKCQkJaWYgKCBtYXRjaFsxXSA9PT0gIm5vdCIgKSB7CgkJCQkvLyBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBjb21wbGV4IGV4cHJlc3Npb24sIG9yIGEgc2ltcGxlIG9uZQoJCQkJaWYgKCBtYXRjaFszXS5tYXRjaChjaHVua2VyKS5sZW5ndGggPiAxIHx8IC9eXHcvLnRlc3QobWF0Y2hbM10pICkgewoJCQkJCW1hdGNoWzNdID0gU2l6emxlKG1hdGNoWzNdLCBudWxsLCBudWxsLCBjdXJMb29wKTsKCQkJCX0gZWxzZSB7CgkJCQkJdmFyIHJldCA9IFNpenpsZS5maWx0ZXIobWF0Y2hbM10sIGN1ckxvb3AsIGlucGxhY2UsIHRydWUgXiBub3QpOwoJCQkJCWlmICggIWlucGxhY2UgKSB7CgkJCQkJCXJlc3VsdC5wdXNoLmFwcGx5KCByZXN1bHQsIHJldCApOwoJCQkJCX0KCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0gZWxzZSBpZiAoIEV4cHIubWF0Y2guUE9TLnRlc3QoIG1hdGNoWzBdICkgfHwgRXhwci5tYXRjaC5DSElMRC50ZXN0KCBtYXRjaFswXSApICkgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJCgkJCXJldHVybiBtYXRjaDsKCQl9LAoJCVBPUzogZnVuY3Rpb24obWF0Y2gpewoJCQltYXRjaC51bnNoaWZ0KCB0cnVlICk7CgkJCXJldHVybiBtYXRjaDsKCQl9Cgl9LAoJZmlsdGVyczogewoJCWVuYWJsZWQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2UgJiYgZWxlbS50eXBlICE9PSAiaGlkZGVuIjsKCQl9LAoJCWRpc2FibGVkOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7CgkJfSwKCQljaGVja2VkOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuIGVsZW0uY2hlY2tlZCA9PT0gdHJ1ZTsKCQl9LAoJCXNlbGVjdGVkOiBmdW5jdGlvbihlbGVtKXsKCQkJLy8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdAoJCQkvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5CgkJCWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OwoJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTsKCQl9LAoJCXBhcmVudDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAhIWVsZW0uZmlyc3RDaGlsZDsKCQl9LAoJCWVtcHR5OiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICFlbGVtLmZpcnN0Q2hpbGQ7CgkJfSwKCQloYXM6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKCQkJcmV0dXJuICEhU2l6emxlKCBtYXRjaFszXSwgZWxlbSApLmxlbmd0aDsKCQl9LAoJCWhlYWRlcjogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAvaFxkL2kudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgkJdGV4dDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAidGV4dCIgPT09IGVsZW0udHlwZTsKCQl9LAoJCXJhZGlvOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJyYWRpbyIgPT09IGVsZW0udHlwZTsKCQl9LAoJCWNoZWNrYm94OiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJjaGVja2JveCIgPT09IGVsZW0udHlwZTsKCQl9LAoJCWZpbGU6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gImZpbGUiID09PSBlbGVtLnR5cGU7CgkJfSwKCQlwYXNzd29yZDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAicGFzc3dvcmQiID09PSBlbGVtLnR5cGU7CgkJfSwKCQlzdWJtaXQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gInN1Ym1pdCIgPT09IGVsZW0udHlwZTsKCQl9LAoJCWltYWdlOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJpbWFnZSIgPT09IGVsZW0udHlwZTsKCQl9LAoJCXJlc2V0OiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJyZXNldCIgPT09IGVsZW0udHlwZTsKCQl9LAoJCWJ1dHRvbjogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAiYnV0dG9uIiA9PT0gZWxlbS50eXBlIHx8IGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gIkJVVFRPTiI7CgkJfSwKCQlpbnB1dDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAvaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLnRlc3QoZWxlbS5ub2RlTmFtZSk7CgkJfQoJfSwKCXNldEZpbHRlcnM6IHsKCQlmaXJzdDogZnVuY3Rpb24oZWxlbSwgaSl7CgkJCXJldHVybiBpID09PSAwOwoJCX0sCgkJbGFzdDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gsIGFycmF5KXsKCQkJcmV0dXJuIGkgPT09IGFycmF5Lmxlbmd0aCAtIDE7CgkJfSwKCQlldmVuOiBmdW5jdGlvbihlbGVtLCBpKXsKCQkJcmV0dXJuIGkgJSAyID09PSAwOwoJCX0sCgkJb2RkOiBmdW5jdGlvbihlbGVtLCBpKXsKCQkJcmV0dXJuIGkgJSAyID09PSAxOwoJCX0sCgkJbHQ6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKCQkJcmV0dXJuIGkgPCBtYXRjaFszXSAtIDA7CgkJfSwKCQlndDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpewoJCQlyZXR1cm4gaSA+IG1hdGNoWzNdIC0gMDsKCQl9LAoJCW50aDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpewoJCQlyZXR1cm4gbWF0Y2hbM10gLSAwID09IGk7CgkJfSwKCQllcTogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpewoJCQlyZXR1cm4gbWF0Y2hbM10gLSAwID09IGk7CgkJfQoJfSwKCWZpbHRlcjogewoJCVBTRVVETzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gsIGksIGFycmF5KXsKCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwgZmlsdGVyID0gRXhwci5maWx0ZXJzWyBuYW1lIF07CgoJCQlpZiAoIGZpbHRlciApIHsKCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOwoJCQl9IGVsc2UgaWYgKCBuYW1lID09PSAiY29udGFpbnMiICkgewoJCQkJcmV0dXJuIChlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8ICIiKS5pbmRleE9mKG1hdGNoWzNdKSA+PSAwOwoJCQl9IGVsc2UgaWYgKCBuYW1lID09PSAibm90IiApIHsKCQkJCXZhciBub3QgPSBtYXRjaFszXTsKCgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBub3QubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWlmICggbm90W2ldID09PSBlbGVtICkgewoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJfQoKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfSwKCQlDSElMRDogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpewoJCQl2YXIgdHlwZSA9IG1hdGNoWzFdLCBub2RlID0gZWxlbTsKCQkJc3dpdGNoICh0eXBlKSB7CgkJCQljYXNlICdvbmx5JzoKCQkJCWNhc2UgJ2ZpcnN0JzoKCQkJCQl3aGlsZSAobm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nKSAgewoJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSByZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJCWlmICggdHlwZSA9PSAnZmlyc3QnKSByZXR1cm4gdHJ1ZTsKCQkJCQlub2RlID0gZWxlbTsKCQkJCWNhc2UgJ2xhc3QnOgoJCQkJCXdoaWxlIChub2RlID0gbm9kZS5uZXh0U2libGluZykgIHsKCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCWNhc2UgJ250aCc6CgkJCQkJdmFyIGZpcnN0ID0gbWF0Y2hbMl0sIGxhc3QgPSBtYXRjaFszXTsKCgkJCQkJaWYgKCBmaXJzdCA9PSAxICYmIGxhc3QgPT0gMCApIHsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJCQoJCQkJCXZhciBkb25lTmFtZSA9IG1hdGNoWzBdLAoJCQkJCQlwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CgkKCQkJCQlpZiAoIHBhcmVudCAmJiAocGFyZW50LnNpemNhY2hlICE9PSBkb25lTmFtZSB8fCAhZWxlbS5ub2RlSW5kZXgpICkgewoJCQkJCQl2YXIgY291bnQgPSAwOwoJCQkJCQlmb3IgKCBub2RlID0gcGFyZW50LmZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nICkgewoJCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJCW5vZGUubm9kZUluZGV4ID0gKytjb3VudDsKCQkJCQkJCX0KCQkJCQkJfSAKCQkJCQkJcGFyZW50LnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJfQoJCQkJCQoJCQkJCXZhciBkaWZmID0gZWxlbS5ub2RlSW5kZXggLSBsYXN0OwoJCQkJCWlmICggZmlyc3QgPT0gMCApIHsKCQkJCQkJcmV0dXJuIGRpZmYgPT0gMDsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gKCBkaWZmICUgZmlyc3QgPT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJfQoJCX0sCgkJSUQ6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IG1hdGNoOwoJCX0sCgkJVEFHOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CgkJCXJldHVybiAobWF0Y2ggPT09ICIqIiAmJiBlbGVtLm5vZGVUeXBlID09PSAxKSB8fCBlbGVtLm5vZGVOYW1lID09PSBtYXRjaDsKCQl9LAoJCUNMQVNTOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CgkJCXJldHVybiAoIiAiICsgKGVsZW0uY2xhc3NOYW1lIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSArICIgIikKCQkJCS5pbmRleE9mKCBtYXRjaCApID4gLTE7CgkJfSwKCQlBVFRSOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CgkJCXZhciBuYW1lID0gbWF0Y2hbMV0sCgkJCQlyZXN1bHQgPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSA/CgkJCQkJRXhwci5hdHRySGFuZGxlWyBuYW1lIF0oIGVsZW0gKSA6CgkJCQkJZWxlbVsgbmFtZSBdICE9IG51bGwgPwoJCQkJCQllbGVtWyBuYW1lIF0gOgoJCQkJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApLAoJCQkJdmFsdWUgPSByZXN1bHQgKyAiIiwKCQkJCXR5cGUgPSBtYXRjaFsyXSwKCQkJCWNoZWNrID0gbWF0Y2hbNF07CgoJCQlyZXR1cm4gcmVzdWx0ID09IG51bGwgPwoJCQkJdHlwZSA9PT0gIiE9IiA6CgkJCQl0eXBlID09PSAiPSIgPwoJCQkJdmFsdWUgPT09IGNoZWNrIDoKCQkJCXR5cGUgPT09ICIqPSIgPwoJCQkJdmFsdWUuaW5kZXhPZihjaGVjaykgPj0gMCA6CgkJCQl0eXBlID09PSAifj0iID8KCQkJCSgiICIgKyB2YWx1ZSArICIgIikuaW5kZXhPZihjaGVjaykgPj0gMCA6CgkJCQkhY2hlY2sgPwoJCQkJdmFsdWUgJiYgcmVzdWx0ICE9PSBmYWxzZSA6CgkJCQl0eXBlID09PSAiIT0iID8KCQkJCXZhbHVlICE9IGNoZWNrIDoKCQkJCXR5cGUgPT09ICJePSIgPwoJCQkJdmFsdWUuaW5kZXhPZihjaGVjaykgPT09IDAgOgoJCQkJdHlwZSA9PT0gIiQ9IiA/CgkJCQl2YWx1ZS5zdWJzdHIodmFsdWUubGVuZ3RoIC0gY2hlY2subGVuZ3RoKSA9PT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gInw9IiA/CgkJCQl2YWx1ZSA9PT0gY2hlY2sgfHwgdmFsdWUuc3Vic3RyKDAsIGNoZWNrLmxlbmd0aCArIDEpID09PSBjaGVjayArICItIiA6CgkJCQlmYWxzZTsKCQl9LAoJCVBPUzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gsIGksIGFycmF5KXsKCQkJdmFyIG5hbWUgPSBtYXRjaFsyXSwgZmlsdGVyID0gRXhwci5zZXRGaWx0ZXJzWyBuYW1lIF07CgoJCQlpZiAoIGZpbHRlciApIHsKCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOwoJCQl9CgkJfQoJfQp9OwoKdmFyIG9yaWdQT1MgPSBFeHByLm1hdGNoLlBPUzsKCmZvciAoIHZhciB0eXBlIGluIEV4cHIubWF0Y2ggKSB7CglFeHByLm1hdGNoWyB0eXBlIF0gPSBSZWdFeHAoIEV4cHIubWF0Y2hbIHR5cGUgXS5zb3VyY2UgKyAvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UgKTsKfQoKdmFyIG1ha2VBcnJheSA9IGZ1bmN0aW9uKGFycmF5LCByZXN1bHRzKSB7CglhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcnJheSApOwoKCWlmICggcmVzdWx0cyApIHsKCQlyZXN1bHRzLnB1c2guYXBwbHkoIHJlc3VsdHMsIGFycmF5ICk7CgkJcmV0dXJuIHJlc3VsdHM7Cgl9CgkKCXJldHVybiBhcnJheTsKfTsKCi8vIFBlcmZvcm0gYSBzaW1wbGUgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRoZSBicm93c2VyIGlzIGNhcGFibGUgb2YKLy8gY29udmVydGluZyBhIE5vZGVMaXN0IHRvIGFuIGFycmF5IHVzaW5nIGJ1aWx0aW4gbWV0aG9kcy4KdHJ5IHsKCUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcyApOwoKLy8gUHJvdmlkZSBhIGZhbGxiYWNrIG1ldGhvZCBpZiBpdCBkb2VzIG5vdCB3b3JrCn0gY2F0Y2goZSl7CgltYWtlQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0cykgewoJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdOwoKCQlpZiAoIHRvU3RyaW5nLmNhbGwoYXJyYXkpID09PSAiW29iamVjdCBBcnJheV0iICkgewoJCQlBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggcmV0LCBhcnJheSApOwoJCX0gZWxzZSB7CgkJCWlmICggdHlwZW9mIGFycmF5Lmxlbmd0aCA9PT0gIm51bWJlciIgKSB7CgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCB2YXIgaSA9IDA7IGFycmF5W2ldOyBpKysgKSB7CgkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiByZXQ7Cgl9Owp9Cgp2YXIgc29ydE9yZGVyOwoKaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQl2YXIgcmV0ID0gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDQgPyAtMSA6IGEgPT09IGIgPyAwIDogMTsKCQlpZiAoIHJldCA9PT0gMCApIHsKCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsKCQl9CgkJcmV0dXJuIHJldDsKCX07Cn0gZWxzZSBpZiAoICJzb3VyY2VJbmRleCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICkgewoJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7CgkJdmFyIHJldCA9IGEuc291cmNlSW5kZXggLSBiLnNvdXJjZUluZGV4OwoJCWlmICggcmV0ID09PSAwICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCX0KCQlyZXR1cm4gcmV0OwoJfTsKfSBlbHNlIGlmICggZG9jdW1lbnQuY3JlYXRlUmFuZ2UgKSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQl2YXIgYVJhbmdlID0gYS5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCksIGJSYW5nZSA9IGIub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOwoJCWFSYW5nZS5zZWxlY3ROb2RlKGEpOwoJCWFSYW5nZS5jb2xsYXBzZSh0cnVlKTsKCQliUmFuZ2Uuc2VsZWN0Tm9kZShiKTsKCQliUmFuZ2UuY29sbGFwc2UodHJ1ZSk7CgkJdmFyIHJldCA9IGFSYW5nZS5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuU1RBUlRfVE9fRU5ELCBiUmFuZ2UpOwoJCWlmICggcmV0ID09PSAwICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCX0KCQlyZXR1cm4gcmV0OwoJfTsKfQoKLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBicm93c2VyIHJldHVybnMgZWxlbWVudHMgYnkgbmFtZSB3aGVuCi8vIHF1ZXJ5aW5nIGJ5IGdldEVsZW1lbnRCeUlkIChhbmQgcHJvdmlkZSBhIHdvcmthcm91bmQpCihmdW5jdGlvbigpewoJLy8gV2UncmUgZ29pbmcgdG8gaW5qZWN0IGEgZmFrZSBpbnB1dCBlbGVtZW50IHdpdGggYSBzcGVjaWZpZWQgbmFtZQoJdmFyIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJmb3JtIiksCgkJaWQgPSAic2NyaXB0IiArIChuZXcgRGF0ZSkuZ2V0VGltZSgpOwoJZm9ybS5pbm5lckhUTUwgPSAiPGlucHV0IG5hbWU9JyIgKyBpZCArICInLz4iOwoKCS8vIEluamVjdCBpdCBpbnRvIHRoZSByb290IGVsZW1lbnQsIGNoZWNrIGl0cyBzdGF0dXMsIGFuZCByZW1vdmUgaXQgcXVpY2tseQoJdmFyIHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7Cglyb290Lmluc2VydEJlZm9yZSggZm9ybSwgcm9vdC5maXJzdENoaWxkICk7CgoJLy8gVGhlIHdvcmthcm91bmQgaGFzIHRvIGRvIGFkZGl0aW9uYWwgY2hlY2tzIGFmdGVyIGEgZ2V0RWxlbWVudEJ5SWQKCS8vIFdoaWNoIHNsb3dzIHRoaW5ncyBkb3duIGZvciBvdGhlciBicm93c2VycyAoaGVuY2UgdGhlIGJyYW5jaGluZykKCWlmICggISFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggaWQgKSApIHsKCQlFeHByLmZpbmQuSUQgPSBmdW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOwoJCQkJcmV0dXJuIG0gPyBtLmlkID09PSBtYXRjaFsxXSB8fCB0eXBlb2YgbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSAidW5kZWZpbmVkIiAmJiBtLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlID09PSBtYXRjaFsxXSA/IFttXSA6IHVuZGVmaW5lZCA6IFtdOwoJCQl9CgkJfTsKCgkJRXhwci5maWx0ZXIuSUQgPSBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CgkJCXZhciBub2RlID0gdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gInVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOwoJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlICYmIG5vZGUubm9kZVZhbHVlID09PSBtYXRjaDsKCQl9OwoJfQoKCXJvb3QucmVtb3ZlQ2hpbGQoIGZvcm0gKTsKfSkoKTsKCihmdW5jdGlvbigpewoJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBicm93c2VyIHJldHVybnMgb25seSBlbGVtZW50cwoJLy8gd2hlbiBkb2luZyBnZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpCgoJLy8gQ3JlYXRlIGEgZmFrZSBlbGVtZW50Cgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CglkaXYuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIiIpICk7CgoJLy8gTWFrZSBzdXJlIG5vIGNvbW1lbnRzIGFyZSBmb3VuZAoJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGggPiAwICkgewoJCUV4cHIuZmluZC5UQUcgPSBmdW5jdGlvbihtYXRjaCwgY29udGV4dCl7CgkJCXZhciByZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShtYXRjaFsxXSk7CgoJCQkvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzCgkJCWlmICggbWF0Y2hbMV0gPT09ICIqIiApIHsKCQkJCXZhciB0bXAgPSBbXTsKCgkJCQlmb3IgKCB2YXIgaSA9IDA7IHJlc3VsdHNbaV07IGkrKyApIHsKCQkJCQlpZiAoIHJlc3VsdHNbaV0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJCXRtcC5wdXNoKCByZXN1bHRzW2ldICk7CgkJCQkJfQoJCQkJfQoKCQkJCXJlc3VsdHMgPSB0bXA7CgkJCX0KCgkJCXJldHVybiByZXN1bHRzOwoJCX07Cgl9CgoJLy8gQ2hlY2sgdG8gc2VlIGlmIGFuIGF0dHJpYnV0ZSByZXR1cm5zIG5vcm1hbGl6ZWQgaHJlZiBhdHRyaWJ1dGVzCglkaXYuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOwoJaWYgKCBkaXYuZmlyc3RDaGlsZCAmJiB0eXBlb2YgZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlICE9PSAidW5kZWZpbmVkIiAmJgoJCQlkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSAhPT0gIiMiICkgewoJCUV4cHIuYXR0ckhhbmRsZS5ocmVmID0gZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgiaHJlZiIsIDIpOwoJCX07Cgl9Cn0pKCk7CgppZiAoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwgKSAoZnVuY3Rpb24oKXsKCXZhciBvbGRTaXp6bGUgPSBTaXp6bGUsIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJZGl2LmlubmVySFRNTCA9ICI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7CgoJLy8gU2FmYXJpIGNhbid0IGhhbmRsZSB1cHBlcmNhc2Ugb3IgdW5pY29kZSBjaGFyYWN0ZXJzIHdoZW4KCS8vIGluIHF1aXJrcyBtb2RlLgoJaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCAmJiBkaXYucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGggPT09IDAgKSB7CgkJcmV0dXJuOwoJfQoJCglTaXp6bGUgPSBmdW5jdGlvbihxdWVyeSwgY29udGV4dCwgZXh0cmEsIHNlZWQpewoJCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OwoKCQkvLyBPbmx5IHVzZSBxdWVyeVNlbGVjdG9yQWxsIG9uIG5vbi1YTUwgZG9jdW1lbnRzCgkJLy8gKElEIHNlbGVjdG9ycyBkb24ndCB3b3JrIGluIG5vbi1IVE1MIGRvY3VtZW50cykKCQlpZiAoICFzZWVkICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgIWlzWE1MKGNvbnRleHQpICkgewoJCQl0cnkgewoJCQkJcmV0dXJuIG1ha2VBcnJheSggY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSwgZXh0cmEgKTsKCQkJfSBjYXRjaChlKXt9CgkJfQoJCQoJCXJldHVybiBvbGRTaXp6bGUocXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkKTsKCX07CgoJU2l6emxlLmZpbmQgPSBvbGRTaXp6bGUuZmluZDsKCVNpenpsZS5maWx0ZXIgPSBvbGRTaXp6bGUuZmlsdGVyOwoJU2l6emxlLnNlbGVjdG9ycyA9IG9sZFNpenpsZS5zZWxlY3RvcnM7CglTaXp6bGUubWF0Y2hlcyA9IG9sZFNpenpsZS5tYXRjaGVzOwp9KSgpOwoKaWYgKCBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICkgKGZ1bmN0aW9uKCl7Cgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CglkaXYuaW5uZXJIVE1MID0gIjxkaXYgY2xhc3M9J3Rlc3QgZSc+PC9kaXY+PGRpdiBjbGFzcz0ndGVzdCc+PC9kaXY+IjsKCgkvLyBPcGVyYSBjYW4ndCBmaW5kIGEgc2Vjb25kIGNsYXNzbmFtZSAoaW4gOS42KQoJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMCApCgkJcmV0dXJuOwoKCS8vIFNhZmFyaSBjYWNoZXMgY2xhc3MgYXR0cmlidXRlcywgZG9lc24ndCBjYXRjaCBjaGFuZ2VzIChpbiAzLjIpCglkaXYubGFzdENoaWxkLmNsYXNzTmFtZSA9ICJlIjsKCglpZiAoIGRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoID09PSAxICkKCQlyZXR1cm47CgoJRXhwci5vcmRlci5zcGxpY2UoMSwgMCwgIkNMQVNTIik7CglFeHByLmZpbmQuQ0xBU1MgPSBmdW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpIHsKCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09ICJ1bmRlZmluZWQiICYmICFpc1hNTCApIHsKCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShtYXRjaFsxXSk7CgkJfQoJfTsKfSkoKTsKCmZ1bmN0aW9uIGRpck5vZGVDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsKCXZhciBzaWJEaXIgPSBkaXIgPT0gInByZXZpb3VzU2libGluZyIgJiYgIWlzWE1MOwoJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CgkJaWYgKCBlbGVtICkgewoJCQlpZiAoIHNpYkRpciAmJiBlbGVtLm5vZGVUeXBlID09PSAxICl7CgkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQllbGVtLnNpenNldCA9IGk7CgkJCX0KCQkJZWxlbSA9IGVsZW1bZGlyXTsKCQkJdmFyIG1hdGNoID0gZmFsc2U7CgoJCQl3aGlsZSAoIGVsZW0gKSB7CgkJCQlpZiAoIGVsZW0uc2l6Y2FjaGUgPT09IGRvbmVOYW1lICkgewoJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNYTUwgKXsKCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJZWxlbS5zaXpzZXQgPSBpOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlTmFtZSA9PT0gY3VyICkgewoJCQkJCW1hdGNoID0gZWxlbTsKCQkJCQlicmVhazsKCQkJCX0KCgkJCQllbGVtID0gZWxlbVtkaXJdOwoJCQl9CgoJCQljaGVja1NldFtpXSA9IG1hdGNoOwoJCX0KCX0KfQoKZnVuY3Rpb24gZGlyQ2hlY2soIGRpciwgY3VyLCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKSB7Cgl2YXIgc2liRGlyID0gZGlyID09ICJwcmV2aW91c1NpYmxpbmciICYmICFpc1hNTDsKCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoJCWlmICggZWxlbSApIHsKCQkJaWYgKCBzaWJEaXIgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCWVsZW0uc2l6Y2FjaGUgPSBkb25lTmFtZTsKCQkJCWVsZW0uc2l6c2V0ID0gaTsKCQkJfQoJCQllbGVtID0gZWxlbVtkaXJdOwoJCQl2YXIgbWF0Y2ggPSBmYWxzZTsKCgkJCXdoaWxlICggZWxlbSApIHsKCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7CgkJCQkJbWF0Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWlmICggIWlzWE1MICkgewoJCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJCWVsZW0uc2l6c2V0ID0gaTsKCQkJCQl9CgkJCQkJaWYgKCB0eXBlb2YgY3VyICE9PSAic3RyaW5nIiApIHsKCQkJCQkJaWYgKCBlbGVtID09PSBjdXIgKSB7CgkJCQkJCQltYXRjaCA9IHRydWU7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoKCQkJCQl9IGVsc2UgaWYgKCBTaXp6bGUuZmlsdGVyKCBjdXIsIFtlbGVtXSApLmxlbmd0aCA+IDAgKSB7CgkJCQkJCW1hdGNoID0gZWxlbTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoKCQkJCWVsZW0gPSBlbGVtW2Rpcl07CgkJCX0KCgkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7CgkJfQoJfQp9Cgp2YXIgY29udGFpbnMgPSBkb2N1bWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/ICBmdW5jdGlvbihhLCBiKXsKCXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgMTY7Cn0gOiBmdW5jdGlvbihhLCBiKXsKCXJldHVybiBhICE9PSBiICYmIChhLmNvbnRhaW5zID8gYS5jb250YWlucyhiKSA6IHRydWUpOwp9OwoKdmFyIGlzWE1MID0gZnVuY3Rpb24oZWxlbSl7CglyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8CgkJISFlbGVtLm93bmVyRG9jdW1lbnQgJiYgaXNYTUwoIGVsZW0ub3duZXJEb2N1bWVudCApOwp9OwoKdmFyIHBvc1Byb2Nlc3MgPSBmdW5jdGlvbihzZWxlY3RvciwgY29udGV4dCl7Cgl2YXIgdG1wU2V0ID0gW10sIGxhdGVyID0gIiIsIG1hdGNoLAoJCXJvb3QgPSBjb250ZXh0Lm5vZGVUeXBlID8gW2NvbnRleHRdIDogY29udGV4dDsKCgkvLyBQb3NpdGlvbiBzZWxlY3RvcnMgbXVzdCBiZSBkb25lIGFmdGVyIHRoZSBmaWx0ZXIKCS8vIEFuZCBzbyBtdXN0IDpub3QocG9zaXRpb25hbCkgc28gd2UgbW92ZSBhbGwgUFNFVURPcyB0byB0aGUgZW5kCgl3aGlsZSAoIChtYXRjaCA9IEV4cHIubWF0Y2guUFNFVURPLmV4ZWMoIHNlbGVjdG9yICkpICkgewoJCWxhdGVyICs9IG1hdGNoWzBdOwoJCXNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSggRXhwci5tYXRjaC5QU0VVRE8sICIiICk7Cgl9CgoJc2VsZWN0b3IgPSBFeHByLnJlbGF0aXZlW3NlbGVjdG9yXSA/IHNlbGVjdG9yICsgIioiIDogc2VsZWN0b3I7CgoJZm9yICggdmFyIGkgPSAwLCBsID0gcm9vdC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJU2l6emxlKCBzZWxlY3Rvciwgcm9vdFtpXSwgdG1wU2V0ICk7Cgl9CgoJcmV0dXJuIFNpenpsZS5maWx0ZXIoIGxhdGVyLCB0bXBTZXQgKTsKfTsKCi8vIEVYUE9TRQpqUXVlcnkuZmluZCA9IFNpenpsZTsKalF1ZXJ5LmZpbHRlciA9IFNpenpsZS5maWx0ZXI7CmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9yczsKalF1ZXJ5LmV4cHJbIjoiXSA9IGpRdWVyeS5leHByLmZpbHRlcnM7CgpTaXp6bGUuc2VsZWN0b3JzLmZpbHRlcnMuaGlkZGVuID0gZnVuY3Rpb24oZWxlbSl7CglyZXR1cm4gZWxlbS5vZmZzZXRXaWR0aCA9PT0gMCB8fCBlbGVtLm9mZnNldEhlaWdodCA9PT0gMDsKfTsKClNpenpsZS5zZWxlY3RvcnMuZmlsdGVycy52aXNpYmxlID0gZnVuY3Rpb24oZWxlbSl7CglyZXR1cm4gZWxlbS5vZmZzZXRXaWR0aCA+IDAgfHwgZWxlbS5vZmZzZXRIZWlnaHQgPiAwOwp9OwoKU2l6emxlLnNlbGVjdG9ycy5maWx0ZXJzLmFuaW1hdGVkID0gZnVuY3Rpb24oZWxlbSl7CglyZXR1cm4galF1ZXJ5LmdyZXAoalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oZm4pewoJCXJldHVybiBlbGVtID09PSBmbi5lbGVtOwoJfSkubGVuZ3RoOwp9OwoKalF1ZXJ5Lm11bHRpRmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7CglpZiAoIG5vdCApIHsKCQlleHByID0gIjpub3QoIiArIGV4cHIgKyAiKSI7Cgl9CgoJcmV0dXJuIFNpenpsZS5tYXRjaGVzKGV4cHIsIGVsZW1zKTsKfTsKCmpRdWVyeS5kaXIgPSBmdW5jdGlvbiggZWxlbSwgZGlyICl7Cgl2YXIgbWF0Y2hlZCA9IFtdLCBjdXIgPSBlbGVtW2Rpcl07Cgl3aGlsZSAoIGN1ciAmJiBjdXIgIT0gZG9jdW1lbnQgKSB7CgkJaWYgKCBjdXIubm9kZVR5cGUgPT0gMSApCgkJCW1hdGNoZWQucHVzaCggY3VyICk7CgkJY3VyID0gY3VyW2Rpcl07Cgl9CglyZXR1cm4gbWF0Y2hlZDsKfTsKCmpRdWVyeS5udGggPSBmdW5jdGlvbihjdXIsIHJlc3VsdCwgZGlyLCBlbGVtKXsKCXJlc3VsdCA9IHJlc3VsdCB8fCAxOwoJdmFyIG51bSA9IDA7CgoJZm9yICggOyBjdXI7IGN1ciA9IGN1cltkaXJdICkKCQlpZiAoIGN1ci5ub2RlVHlwZSA9PSAxICYmICsrbnVtID09IHJlc3VsdCApCgkJCWJyZWFrOwoKCXJldHVybiBjdXI7Cn07CgpqUXVlcnkuc2libGluZyA9IGZ1bmN0aW9uKG4sIGVsZW0pewoJdmFyIHIgPSBbXTsKCglmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkgewoJCWlmICggbi5ub2RlVHlwZSA9PSAxICYmIG4gIT0gZWxlbSApCgkJCXIucHVzaCggbiApOwoJfQoKCXJldHVybiByOwp9OwoKcmV0dXJuOwoKd2luZG93LlNpenpsZSA9IFNpenpsZTsKCn0pKCk7Ci8qCiAqIEEgbnVtYmVyIG9mIGhlbHBlciBmdW5jdGlvbnMgdXNlZCBmb3IgbWFuYWdpbmcgZXZlbnRzLgogKiBNYW55IG9mIHRoZSBpZGVhcyBiZWhpbmQgdGhpcyBjb2RlIG9yaWdpbmF0ZWQgZnJvbQogKiBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkuCiAqLwpqUXVlcnkuZXZlbnQgPSB7CgoJLy8gQmluZCBhbiBldmVudCB0byBhbiBlbGVtZW50CgkvLyBPcmlnaW5hbCBieSBEZWFuIEVkd2FyZHMKCWFkZDogZnVuY3Rpb24oZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEpIHsKCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDggKQoJCQlyZXR1cm47CgoJCS8vIEZvciB3aGF0ZXZlciByZWFzb24sIElFIGhhcyB0cm91YmxlIHBhc3NpbmcgdGhlIHdpbmRvdyBvYmplY3QKCQkvLyBhcm91bmQsIGNhdXNpbmcgaXQgdG8gYmUgY2xvbmVkIGluIHRoZSBwcm9jZXNzCgkJaWYgKCBlbGVtLnNldEludGVydmFsICYmIGVsZW0gIT0gd2luZG93ICkKCQkJZWxlbSA9IHdpbmRvdzsKCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGJlaW5nIGV4ZWN1dGVkIGhhcyBhIHVuaXF1ZSBJRAoJCWlmICggIWhhbmRsZXIuZ3VpZCApCgkJCWhhbmRsZXIuZ3VpZCA9IHRoaXMuZ3VpZCsrOwoKCQkvLyBpZiBkYXRhIGlzIHBhc3NlZCwgYmluZCB0byBoYW5kbGVyCgkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCS8vIENyZWF0ZSB0ZW1wb3JhcnkgZnVuY3Rpb24gcG9pbnRlciB0byBvcmlnaW5hbCBoYW5kbGVyCgkJCXZhciBmbiA9IGhhbmRsZXI7CgoJCQkvLyBDcmVhdGUgdW5pcXVlIGhhbmRsZXIgZnVuY3Rpb24sIHdyYXBwZWQgYXJvdW5kIG9yaWdpbmFsIGhhbmRsZXIKCQkJaGFuZGxlciA9IHRoaXMucHJveHkoIGZuICk7CgoJCQkvLyBTdG9yZSBkYXRhIGluIHVuaXF1ZSBoYW5kbGVyCgkJCWhhbmRsZXIuZGF0YSA9IGRhdGE7CgkJfQoKCQkvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlCgkJdmFyIGV2ZW50cyA9IGpRdWVyeS5kYXRhKGVsZW0sICJldmVudHMiKSB8fCBqUXVlcnkuZGF0YShlbGVtLCAiZXZlbnRzIiwge30pLAoJCQloYW5kbGUgPSBqUXVlcnkuZGF0YShlbGVtLCAiaGFuZGxlIikgfHwgalF1ZXJ5LmRhdGEoZWxlbSwgImhhbmRsZSIsIGZ1bmN0aW9uKCl7CgkJCQkvLyBIYW5kbGUgdGhlIHNlY29uZCBldmVudCBvZiBhIHRyaWdnZXIgYW5kIHdoZW4KCQkJCS8vIGFuIGV2ZW50IGlzIGNhbGxlZCBhZnRlciBhIHBhZ2UgaGFzIHVubG9hZGVkCgkJCQlyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gInVuZGVmaW5lZCIgJiYgIWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPwoJCQkJCWpRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoYXJndW1lbnRzLmNhbGxlZS5lbGVtLCBhcmd1bWVudHMpIDoKCQkJCQl1bmRlZmluZWQ7CgkJCX0pOwoJCS8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2YgdGhlIGhhbmRsZSBmdW5jdGlvbgoJCS8vIFRoaXMgaXMgdG8gcHJldmVudCBhIG1lbW9yeSBsZWFrIHdpdGggbm9uLW5hdGl2ZQoJCS8vIGV2ZW50IGluIElFLgoJCWhhbmRsZS5lbGVtID0gZWxlbTsKCgkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZQoJCS8vIGpRdWVyeSguLi4pLmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKCQlqUXVlcnkuZWFjaCh0eXBlcy5zcGxpdCgvXHMrLyksIGZ1bmN0aW9uKGluZGV4LCB0eXBlKSB7CgkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKCQkJdmFyIG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7CgkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCWhhbmRsZXIudHlwZSA9IG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLiIpOwoKCQkJLy8gR2V0IHRoZSBjdXJyZW50IGxpc3Qgb2YgZnVuY3Rpb25zIGJvdW5kIHRvIHRoaXMgZXZlbnQKCQkJdmFyIGhhbmRsZXJzID0gZXZlbnRzW3R5cGVdOwoJCQkKCQkJaWYgKCBqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0eXBlXSApCgkJCQlqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0eXBlXS5zZXR1cC5jYWxsKGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMpOwoKCQkJLy8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZQoJCQlpZiAoIWhhbmRsZXJzKSB7CgkJCQloYW5kbGVycyA9IGV2ZW50c1t0eXBlXSA9IHt9OwoKCQkJCS8vIENoZWNrIGZvciBhIHNwZWNpYWwgZXZlbnQgaGFuZGxlcgoJCQkJLy8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lci9hdHRhY2hFdmVudCBpZiB0aGUgc3BlY2lhbAoJCQkJLy8gZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0gfHwgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0uc2V0dXAuY2FsbChlbGVtLCBkYXRhLCBuYW1lc3BhY2VzKSA9PT0gZmFsc2UgKSB7CgkJCQkJLy8gQmluZCB0aGUgZ2xvYmFsIGV2ZW50IGhhbmRsZXIgdG8gdGhlIGVsZW1lbnQKCQkJCQlpZiAoZWxlbS5hZGRFdmVudExpc3RlbmVyKQoJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlLCBmYWxzZSk7CgkJCQkJZWxzZSBpZiAoZWxlbS5hdHRhY2hFdmVudCkKCQkJCQkJZWxlbS5hdHRhY2hFdmVudCgib24iICsgdHlwZSwgaGFuZGxlKTsKCQkJCX0KCQkJfQoKCQkJLy8gQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdAoJCQloYW5kbGVyc1toYW5kbGVyLmd1aWRdID0gaGFuZGxlcjsKCgkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgYmVlbiB1c2VkLCBmb3IgZ2xvYmFsIHRyaWdnZXJpbmcKCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFt0eXBlXSA9IHRydWU7CgkJfSk7CgoJCS8vIE51bGxpZnkgZWxlbSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiBJRQoJCWVsZW0gPSBudWxsOwoJfSwKCglndWlkOiAxLAoJZ2xvYmFsOiB7fSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oZWxlbSwgdHlwZXMsIGhhbmRsZXIpIHsKCQkvLyBkb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICggZWxlbS5ub2RlVHlwZSA9PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT0gOCApCgkJCXJldHVybjsKCgkJdmFyIGV2ZW50cyA9IGpRdWVyeS5kYXRhKGVsZW0sICJldmVudHMiKSwgcmV0LCBpbmRleDsKCgkJaWYgKCBldmVudHMgKSB7CgkJCS8vIFVuYmluZCBhbGwgZXZlbnRzIGZvciB0aGUgZWxlbWVudAoJCQlpZiAoIHR5cGVzID09PSB1bmRlZmluZWQgfHwgKHR5cGVvZiB0eXBlcyA9PT0gInN0cmluZyIgJiYgdHlwZXMuY2hhckF0KDApID09ICIuIikgKQoJCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkKCQkJCQl0aGlzLnJlbW92ZSggZWxlbSwgdHlwZSArICh0eXBlcyB8fCAiIikgKTsKCQkJZWxzZSB7CgkJCQkvLyB0eXBlcyBpcyBhY3R1YWxseSBhbiBldmVudCBvYmplY3QgaGVyZQoJCQkJaWYgKCB0eXBlcy50eXBlICkgewoJCQkJCWhhbmRsZXIgPSB0eXBlcy5oYW5kbGVyOwoJCQkJCXR5cGVzID0gdHlwZXMudHlwZTsKCQkJCX0KCgkJCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGVyYXRlZCBieSBhIHNwYWNlCgkJCQkvLyBqUXVlcnkoLi4uKS51bmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKCQkJCWpRdWVyeS5lYWNoKHR5cGVzLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oaW5kZXgsIHR5cGUpewoJCQkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKCQkJCQl2YXIgbmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIi4iKTsKCQkJCQl0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOwoJCQkJCXZhciBuYW1lc3BhY2UgPSBSZWdFeHAoIihefFxcLikiICsgbmFtZXNwYWNlcy5zbGljZSgpLnNvcnQoKS5qb2luKCIuKlxcLiIpICsgIihcXC58JCkiKTsKCgkJCQkJaWYgKCBldmVudHNbdHlwZV0gKSB7CgkJCQkJCS8vIHJlbW92ZSB0aGUgZ2l2ZW4gaGFuZGxlciBmb3IgdGhlIGdpdmVuIHR5cGUKCQkJCQkJaWYgKCBoYW5kbGVyICkKCQkJCQkJCWRlbGV0ZSBldmVudHNbdHlwZV1baGFuZGxlci5ndWlkXTsKCgkJCQkJCS8vIHJlbW92ZSBhbGwgaGFuZGxlcnMgZm9yIHRoZSBnaXZlbiB0eXBlCgkJCQkJCWVsc2UKCQkJCQkJCWZvciAoIHZhciBoYW5kbGUgaW4gZXZlbnRzW3R5cGVdICkKCQkJCQkJCQkvLyBIYW5kbGUgdGhlIHJlbW92YWwgb2YgbmFtZXNwYWNlZCBldmVudHMKCQkJCQkJCQlpZiAoIG5hbWVzcGFjZS50ZXN0KGV2ZW50c1t0eXBlXVtoYW5kbGVdLnR5cGUpICkKCQkJCQkJCQkJZGVsZXRlIGV2ZW50c1t0eXBlXVtoYW5kbGVdOwoJCQkJCQkJCQkKCQkJCQkJaWYgKCBqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0eXBlXSApCgkJCQkJCQlqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0eXBlXS50ZWFyZG93bi5jYWxsKGVsZW0sIG5hbWVzcGFjZXMpOwoKCQkJCQkJLy8gcmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiBubyBtb3JlIGhhbmRsZXJzIGV4aXN0CgkJCQkJCWZvciAoIHJldCBpbiBldmVudHNbdHlwZV0gKSBicmVhazsKCQkJCQkJaWYgKCAhcmV0ICkgewoJCQkJCQkJaWYgKCAhalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0gfHwgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0udGVhcmRvd24uY2FsbChlbGVtLCBuYW1lc3BhY2VzKSA9PT0gZmFsc2UgKSB7CgkJCQkJCQkJaWYgKGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcikKCQkJCQkJCQkJZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGpRdWVyeS5kYXRhKGVsZW0sICJoYW5kbGUiKSwgZmFsc2UpOwoJCQkJCQkJCWVsc2UgaWYgKGVsZW0uZGV0YWNoRXZlbnQpCgkJCQkJCQkJCWVsZW0uZGV0YWNoRXZlbnQoIm9uIiArIHR5cGUsIGpRdWVyeS5kYXRhKGVsZW0sICJoYW5kbGUiKSk7CgkJCQkJCQl9CgkJCQkJCQlyZXQgPSBudWxsOwoJCQkJCQkJZGVsZXRlIGV2ZW50c1t0eXBlXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pOwoJCQl9CgoJCQkvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZAoJCQlmb3IgKCByZXQgaW4gZXZlbnRzICkgYnJlYWs7CgkJCWlmICggIXJldCApIHsKCQkJCXZhciBoYW5kbGUgPSBqUXVlcnkuZGF0YSggZWxlbSwgImhhbmRsZSIgKTsKCQkJCWlmICggaGFuZGxlICkgaGFuZGxlLmVsZW0gPSBudWxsOwoJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sICJldmVudHMiICk7CgkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgImhhbmRsZSIgKTsKCQkJfQoJCX0KCX0sCgoJLy8gYnViYmxpbmcgaXMgaW50ZXJuYWwKCXRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgYnViYmxpbmcgKSB7CgkJLy8gRXZlbnQgb2JqZWN0IG9yIGV2ZW50IHR5cGUKCQl2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgZXZlbnQ7CgoJCWlmKCAhYnViYmxpbmcgKXsKCQkJZXZlbnQgPSB0eXBlb2YgZXZlbnQgPT09ICJvYmplY3QiID8KCQkJCS8vIGpRdWVyeS5FdmVudCBvYmplY3QKCQkJCWV2ZW50W2V4cGFuZG9dID8gZXZlbnQgOgoJCQkJLy8gT2JqZWN0IGxpdGVyYWwKCQkJCWpRdWVyeS5leHRlbmQoIGpRdWVyeS5FdmVudCh0eXBlKSwgZXZlbnQgKSA6CgkJCQkvLyBKdXN0IHRoZSBldmVudCB0eXBlIChzdHJpbmcpCgkJCQlqUXVlcnkuRXZlbnQodHlwZSk7CgoJCQlpZiAoIHR5cGUuaW5kZXhPZigiISIpID49IDAgKSB7CgkJCQlldmVudC50eXBlID0gdHlwZSA9IHR5cGUuc2xpY2UoMCwgLTEpOwoJCQkJZXZlbnQuZXhjbHVzaXZlID0gdHJ1ZTsKCQkJfQoKCQkJLy8gSGFuZGxlIGEgZ2xvYmFsIHRyaWdnZXIKCQkJaWYgKCAhZWxlbSApIHsKCQkJCS8vIERvbid0IGJ1YmJsZSBjdXN0b20gZXZlbnRzIHdoZW4gZ2xvYmFsICh0byBhdm9pZCB0b28gbXVjaCBvdmVyaGVhZCkKCQkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoJCQkJLy8gT25seSB0cmlnZ2VyIGlmIHdlJ3ZlIGV2ZXIgYm91bmQgYW4gZXZlbnQgZm9yIGl0CgkJCQlpZiAoIHRoaXMuZ2xvYmFsW3R5cGVdICkKCQkJCQlqUXVlcnkuZWFjaCggalF1ZXJ5LmNhY2hlLCBmdW5jdGlvbigpewoJCQkJCQlpZiAoIHRoaXMuZXZlbnRzICYmIHRoaXMuZXZlbnRzW3R5cGVdICkKCQkJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgdGhpcy5oYW5kbGUuZWxlbSApOwoJCQkJCX0pOwoJCQl9CgoJCQkvLyBIYW5kbGUgdHJpZ2dlcmluZyBhIHNpbmdsZSBlbGVtZW50CgoJCQkvLyBkb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCQlpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDggKQoJCQkJcmV0dXJuIHVuZGVmaW5lZDsKCQkJCgkJCS8vIENsZWFuIHVwIGluIGNhc2UgaXQgaXMgcmV1c2VkCgkJCWV2ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDsKCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKCQkJCgkJCS8vIENsb25lIHRoZSBpbmNvbWluZyBkYXRhLCBpZiBhbnkKCQkJZGF0YSA9IGpRdWVyeS5tYWtlQXJyYXkoZGF0YSk7CgkJCWRhdGEudW5zaGlmdCggZXZlbnQgKTsKCQl9CgoJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBlbGVtOwoKCQkvLyBUcmlnZ2VyIHRoZSBldmVudCwgaXQgaXMgYXNzdW1lZCB0aGF0ICJoYW5kbGUiIGlzIGEgZnVuY3Rpb24KCQl2YXIgaGFuZGxlID0galF1ZXJ5LmRhdGEoZWxlbSwgImhhbmRsZSIpOwoJCWlmICggaGFuZGxlICkKCQkJaGFuZGxlLmFwcGx5KCBlbGVtLCBkYXRhICk7CgoJCS8vIEhhbmRsZSB0cmlnZ2VyaW5nIG5hdGl2ZSAub25mb28gaGFuZGxlcnMgKGFuZCBvbiBsaW5rcyBzaW5jZSB3ZSBkb24ndCBjYWxsIC5jbGljaygpIGZvciBsaW5rcykKCQlpZiAoICghZWxlbVt0eXBlXSB8fCAoalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICdhJykgJiYgdHlwZSA9PSAiY2xpY2siKSkgJiYgZWxlbVsib24iK3R5cGVdICYmIGVsZW1bIm9uIit0eXBlXS5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApCgkJCWV2ZW50LnJlc3VsdCA9IGZhbHNlOwoKCQkvLyBUcmlnZ2VyIHRoZSBuYXRpdmUgZXZlbnRzIChleGNlcHQgZm9yIGNsaWNrcyBvbiBsaW5rcykKCQlpZiAoICFidWJibGluZyAmJiBlbGVtW3R5cGVdICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSAmJiAhKGpRdWVyeS5ub2RlTmFtZShlbGVtLCAnYScpICYmIHR5cGUgPT0gImNsaWNrIikgKSB7CgkJCXRoaXMudHJpZ2dlcmVkID0gdHJ1ZTsKCQkJdHJ5IHsKCQkJCWVsZW1bIHR5cGUgXSgpOwoJCQkvLyBwcmV2ZW50IElFIGZyb20gdGhyb3dpbmcgYW4gZXJyb3IgZm9yIHNvbWUgaGlkZGVuIGVsZW1lbnRzCgkJCX0gY2F0Y2ggKGUpIHt9CgkJfQoKCQl0aGlzLnRyaWdnZXJlZCA9IGZhbHNlOwoKCQlpZiAoICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkgewoJCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlIHx8IGVsZW0ub3duZXJEb2N1bWVudDsKCQkJaWYgKCBwYXJlbnQgKQoJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoZXZlbnQsIGRhdGEsIHBhcmVudCwgdHJ1ZSk7CgkJfQoJfSwKCgloYW5kbGU6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJLy8gcmV0dXJuZWQgdW5kZWZpbmVkIG9yIGZhbHNlCgkJdmFyIGFsbCwgaGFuZGxlcnM7CgoJCWV2ZW50ID0gYXJndW1lbnRzWzBdID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgfHwgd2luZG93LmV2ZW50ICk7CgkJZXZlbnQuY3VycmVudFRhcmdldCA9IHRoaXM7CgkJCgkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVycwoJCXZhciBuYW1lc3BhY2VzID0gZXZlbnQudHlwZS5zcGxpdCgiLiIpOwoJCWV2ZW50LnR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgoJCS8vIENhY2hlIHRoaXMgbm93LCBhbGwgPSB0cnVlIG1lYW5zLCBhbnkgaGFuZGxlcgoJCWFsbCA9ICFuYW1lc3BhY2VzLmxlbmd0aCAmJiAhZXZlbnQuZXhjbHVzaXZlOwoJCQoJCXZhciBuYW1lc3BhY2UgPSBSZWdFeHAoIihefFxcLikiICsgbmFtZXNwYWNlcy5zbGljZSgpLnNvcnQoKS5qb2luKCIuKlxcLiIpICsgIihcXC58JCkiKTsKCgkJaGFuZGxlcnMgPSAoIGpRdWVyeS5kYXRhKHRoaXMsICJldmVudHMiKSB8fCB7fSApW2V2ZW50LnR5cGVdOwoKCQlmb3IgKCB2YXIgaiBpbiBoYW5kbGVycyApIHsKCQkJdmFyIGhhbmRsZXIgPSBoYW5kbGVyc1tqXTsKCgkJCS8vIEZpbHRlciB0aGUgZnVuY3Rpb25zIGJ5IGNsYXNzCgkJCWlmICggYWxsIHx8IG5hbWVzcGFjZS50ZXN0KGhhbmRsZXIudHlwZSkgKSB7CgkJCQkvLyBQYXNzIGluIGEgcmVmZXJlbmNlIHRvIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIGl0c2VsZgoJCQkJLy8gU28gdGhhdCB3ZSBjYW4gbGF0ZXIgcmVtb3ZlIGl0CgkJCQlldmVudC5oYW5kbGVyID0gaGFuZGxlcjsKCQkJCWV2ZW50LmRhdGEgPSBoYW5kbGVyLmRhdGE7CgoJCQkJdmFyIHJldCA9IGhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCgkJCQlpZiggcmV0ICE9PSB1bmRlZmluZWQgKXsKCQkJCQlldmVudC5yZXN1bHQgPSByZXQ7CgkJCQkJaWYgKCByZXQgPT09IGZhbHNlICkgewoJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYoIGV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKQoJCQkJCWJyZWFrOwoKCQkJfQoJCX0KCX0sCgoJcHJvcHM6ICJhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGJ1dHRvbiBjYW5jZWxhYmxlIGNoYXJDb2RlIGNsaWVudFggY2xpZW50WSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZGF0YSBkZXRhaWwgZXZlbnRQaGFzZSBmcm9tRWxlbWVudCBoYW5kbGVyIGtleUNvZGUgbWV0YUtleSBuZXdWYWx1ZSBvcmlnaW5hbFRhcmdldCBwYWdlWCBwYWdlWSBwcmV2VmFsdWUgcmVsYXRlZE5vZGUgcmVsYXRlZFRhcmdldCBzY3JlZW5YIHNjcmVlblkgc2hpZnRLZXkgc3JjRWxlbWVudCB0YXJnZXQgdG9FbGVtZW50IHZpZXcgd2hlZWxEZWx0YSB3aGljaCIuc3BsaXQoIiAiKSwKCglmaXg6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJaWYgKCBldmVudFtleHBhbmRvXSApCgkJCXJldHVybiBldmVudDsKCgkJLy8gc3RvcmUgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QKCQkvLyBhbmQgImNsb25lIiB0byBzZXQgcmVhZC1vbmx5IHByb3BlcnRpZXMKCQl2YXIgb3JpZ2luYWxFdmVudCA9IGV2ZW50OwoJCWV2ZW50ID0galF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7CgoJCWZvciAoIHZhciBpID0gdGhpcy5wcm9wcy5sZW5ndGgsIHByb3A7IGk7ICl7CgkJCXByb3AgPSB0aGlzLnByb3BzWyAtLWkgXTsKCQkJZXZlbnRbIHByb3AgXSA9IG9yaWdpbmFsRXZlbnRbIHByb3AgXTsKCQl9CgoJCS8vIEZpeCB0YXJnZXQgcHJvcGVydHksIGlmIG5lY2Vzc2FyeQoJCWlmICggIWV2ZW50LnRhcmdldCApCgkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnNyY0VsZW1lbnQgfHwgZG9jdW1lbnQ7IC8vIEZpeGVzICMxOTI1IHdoZXJlIHNyY0VsZW1lbnQgbWlnaHQgbm90IGJlIGRlZmluZWQgZWl0aGVyCgoJCS8vIGNoZWNrIGlmIHRhcmdldCBpcyBhIHRleHRub2RlIChzYWZhcmkpCgkJaWYgKCBldmVudC50YXJnZXQubm9kZVR5cGUgPT0gMyApCgkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2RlOwoKCQkvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5CgkJaWYgKCAhZXZlbnQucmVsYXRlZFRhcmdldCAmJiBldmVudC5mcm9tRWxlbWVudCApCgkJCWV2ZW50LnJlbGF0ZWRUYXJnZXQgPSBldmVudC5mcm9tRWxlbWVudCA9PSBldmVudC50YXJnZXQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDsKCgkJLy8gQ2FsY3VsYXRlIHBhZ2VYL1kgaWYgbWlzc2luZyBhbmQgY2xpZW50WC9ZIGF2YWlsYWJsZQoJCWlmICggZXZlbnQucGFnZVggPT0gbnVsbCAmJiBldmVudC5jbGllbnRYICE9IG51bGwgKSB7CgkJCXZhciBkb2MgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGJvZHkgPSBkb2N1bWVudC5ib2R5OwoJCQlldmVudC5wYWdlWCA9IGV2ZW50LmNsaWVudFggKyAoZG9jICYmIGRvYy5zY3JvbGxMZWZ0IHx8IGJvZHkgJiYgYm9keS5zY3JvbGxMZWZ0IHx8IDApIC0gKGRvYy5jbGllbnRMZWZ0IHx8IDApOwoJCQlldmVudC5wYWdlWSA9IGV2ZW50LmNsaWVudFkgKyAoZG9jICYmIGRvYy5zY3JvbGxUb3AgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCB8fCAwKSAtIChkb2MuY2xpZW50VG9wIHx8IDApOwoJCX0KCgkJLy8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzCgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgKChldmVudC5jaGFyQ29kZSB8fCBldmVudC5jaGFyQ29kZSA9PT0gMCkgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGUpICkKCQkJZXZlbnQud2hpY2ggPSBldmVudC5jaGFyQ29kZSB8fCBldmVudC5rZXlDb2RlOwoKCQkvLyBBZGQgbWV0YUtleSB0byBub24tTWFjIGJyb3dzZXJzICh1c2UgY3RybCBmb3IgUEMncyBhbmQgTWV0YSBmb3IgTWFjcykKCQlpZiAoICFldmVudC5tZXRhS2V5ICYmIGV2ZW50LmN0cmxLZXkgKQoJCQlldmVudC5tZXRhS2V5ID0gZXZlbnQuY3RybEtleTsKCgkJLy8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PSBsZWZ0OyAyID09IG1pZGRsZTsgMyA9PSByaWdodAoJCS8vIE5vdGU6IGJ1dHRvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28gZG9uJ3QgdXNlIGl0CgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgZXZlbnQuYnV0dG9uICkKCQkJZXZlbnQud2hpY2ggPSAoZXZlbnQuYnV0dG9uICYgMSA/IDEgOiAoIGV2ZW50LmJ1dHRvbiAmIDIgPyAzIDogKCBldmVudC5idXR0b24gJiA0ID8gMiA6IDAgKSApKTsKCgkJcmV0dXJuIGV2ZW50OwoJfSwKCglwcm94eTogZnVuY3Rpb24oIGZuLCBwcm94eSApewoJCXByb3h5ID0gcHJveHkgfHwgZnVuY3Rpb24oKXsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07CgkJLy8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkCgkJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IHByb3h5Lmd1aWQgfHwgdGhpcy5ndWlkKys7CgkJLy8gU28gcHJveHkgY2FuIGJlIGRlY2xhcmVkIGFzIGFuIGFyZ3VtZW50CgkJcmV0dXJuIHByb3h5OwoJfSwKCglzcGVjaWFsOiB7CgkJcmVhZHk6IHsKCQkJLy8gTWFrZSBzdXJlIHRoZSByZWFkeSBldmVudCBpcyBzZXR1cAoJCQlzZXR1cDogYmluZFJlYWR5LAoJCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7fQoJCX0KCX0sCgkKCXNwZWNpYWxBbGw6IHsKCQlsaXZlOiB7CgkJCXNldHVwOiBmdW5jdGlvbiggc2VsZWN0b3IsIG5hbWVzcGFjZXMgKXsKCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIG5hbWVzcGFjZXNbMF0sIGxpdmVIYW5kbGVyICk7CgkJCX0sCgkJCXRlYXJkb3duOiAgZnVuY3Rpb24oIG5hbWVzcGFjZXMgKXsKCQkJCWlmICggbmFtZXNwYWNlcy5sZW5ndGggKSB7CgkJCQkJdmFyIHJlbW92ZSA9IDAsIG5hbWUgPSBSZWdFeHAoIihefFxcLikiICsgbmFtZXNwYWNlc1swXSArICIoXFwufCQpIik7CgkJCQkJCgkJCQkJalF1ZXJ5LmVhY2goIChqUXVlcnkuZGF0YSh0aGlzLCAiZXZlbnRzIikubGl2ZSB8fCB7fSksIGZ1bmN0aW9uKCl7CgkJCQkJCWlmICggbmFtZS50ZXN0KHRoaXMudHlwZSkgKQoJCQkJCQkJcmVtb3ZlKys7CgkJCQkJfSk7CgkJCQkJCgkJCQkJaWYgKCByZW1vdmUgPCAxICkKCQkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgbmFtZXNwYWNlc1swXSwgbGl2ZUhhbmRsZXIgKTsKCQkJCX0KCQkJfQoJCX0KCX0KfTsKCmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMgKXsKCS8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZAoJaWYoICF0aGlzLnByZXZlbnREZWZhdWx0ICkKCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudChzcmMpOwoJCgkvLyBFdmVudCBvYmplY3QKCWlmKCBzcmMgJiYgc3JjLnR5cGUgKXsKCQl0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7CgkJdGhpcy50eXBlID0gc3JjLnR5cGU7CgkvLyBFdmVudCB0eXBlCgl9ZWxzZQoJCXRoaXMudHlwZSA9IHNyYzsKCgkvLyB0aW1lU3RhbXAgaXMgYnVnZ3kgZm9yIHNvbWUgZXZlbnRzIG9uIEZpcmVmb3goIzM4NDMpCgkvLyBTbyB3ZSB3b24ndCByZWx5IG9uIHRoZSBuYXRpdmUgdmFsdWUKCXRoaXMudGltZVN0YW1wID0gbm93KCk7CgkKCS8vIE1hcmsgaXQgYXMgZml4ZWQKCXRoaXNbZXhwYW5kb10gPSB0cnVlOwp9OwoKZnVuY3Rpb24gcmV0dXJuRmFsc2UoKXsKCXJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiByZXR1cm5UcnVlKCl7CglyZXR1cm4gdHJ1ZTsKfQoKLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbApqUXVlcnkuRXZlbnQucHJvdG90eXBlID0gewoJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgkJaWYoICFlICkKCQkJcmV0dXJuOwoJCS8vIGlmIHByZXZlbnREZWZhdWx0IGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CgkJaWYgKGUucHJldmVudERlZmF1bHQpCgkJCWUucHJldmVudERlZmF1bHQoKTsKCQkvLyBvdGhlcndpc2Ugc2V0IHRoZSByZXR1cm5WYWx1ZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gZmFsc2UgKElFKQoJCWUucmV0dXJuVmFsdWUgPSBmYWxzZTsKCX0sCglzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQl2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKCQlpZiggIWUgKQoJCQlyZXR1cm47CgkJLy8gaWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CgkJaWYgKGUuc3RvcFByb3BhZ2F0aW9uKQoJCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJCS8vIG90aGVyd2lzZSBzZXQgdGhlIGNhbmNlbEJ1YmJsZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gdHJ1ZSAoSUUpCgkJZS5jYW5jZWxCdWJibGUgPSB0cnVlOwoJfSwKCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpewoJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoJCXRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7Cgl9LAoJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKCWlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZQp9OwovLyBDaGVja3MgaWYgYW4gZXZlbnQgaGFwcGVuZWQgb24gYW4gZWxlbWVudCB3aXRoaW4gYW5vdGhlciBlbGVtZW50Ci8vIFVzZWQgaW4galF1ZXJ5LmV2ZW50LnNwZWNpYWwubW91c2VlbnRlciBhbmQgbW91c2VsZWF2ZSBoYW5kbGVycwp2YXIgd2l0aGluRWxlbWVudCA9IGZ1bmN0aW9uKGV2ZW50KSB7CgkvLyBDaGVjayBpZiBtb3VzZShvdmVyfG91dCkgYXJlIHN0aWxsIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQgZWxlbWVudAoJdmFyIHBhcmVudCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7CgkvLyBUcmF2ZXJzZSB1cCB0aGUgdHJlZQoJd2hpbGUgKCBwYXJlbnQgJiYgcGFyZW50ICE9IHRoaXMgKQoJCXRyeSB7IHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOyB9CgkJY2F0Y2goZSkgeyBwYXJlbnQgPSB0aGlzOyB9CgkKCWlmKCBwYXJlbnQgIT0gdGhpcyApewoJCS8vIHNldCB0aGUgY29ycmVjdCBldmVudCB0eXBlCgkJZXZlbnQudHlwZSA9IGV2ZW50LmRhdGE7CgkJLy8gaGFuZGxlIGV2ZW50IGlmIHdlIGFjdHVhbGx5IGp1c3QgbW91c2VkIG9uIHRvIGEgbm9uIHN1Yi1lbGVtZW50CgkJalF1ZXJ5LmV2ZW50LmhhbmRsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7Cgl9Cn07CgkKalF1ZXJ5LmVhY2goeyAKCW1vdXNlb3ZlcjogJ21vdXNlZW50ZXInLCAKCW1vdXNlb3V0OiAnbW91c2VsZWF2ZScKfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApewoJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0gewoJCXNldHVwOiBmdW5jdGlvbigpewoJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCBvcmlnLCB3aXRoaW5FbGVtZW50LCBmaXggKTsKCQl9LAoJCXRlYXJkb3duOiBmdW5jdGlvbigpewoJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCBvcmlnLCB3aXRoaW5FbGVtZW50ICk7CgkJfQoJfTsJCQkgICAKfSk7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWJpbmQ6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdHlwZSA9PSAidW5sb2FkIiA/IHRoaXMub25lKHR5cGUsIGRhdGEsIGZuKSA6IHRoaXMuZWFjaChmdW5jdGlvbigpewoJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlLCBmbiB8fCBkYXRhLCBmbiAmJiBkYXRhICk7CgkJfSk7Cgl9LAoKCW9uZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEsIGZuICkgewoJCXZhciBvbmUgPSBqUXVlcnkuZXZlbnQucHJveHkoIGZuIHx8IGRhdGEsIGZ1bmN0aW9uKGV2ZW50KSB7CgkJCWpRdWVyeSh0aGlzKS51bmJpbmQoZXZlbnQsIG9uZSk7CgkJCXJldHVybiAoZm4gfHwgZGF0YSkuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCX0pOwoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZSwgb25lLCBmbiAmJiBkYXRhKTsKCQl9KTsKCX0sCgoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZSwgZm4gKSB7CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpewoJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlLCBmbiApOwoJCX0pOwoJfSwKCgl0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7CgkJfSk7Cgl9LAoKCXRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKCQlpZiggdGhpc1swXSApewoJCQl2YXIgZXZlbnQgPSBqUXVlcnkuRXZlbnQodHlwZSk7CgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggZXZlbnQsIGRhdGEsIHRoaXNbMF0gKTsKCQkJcmV0dXJuIGV2ZW50LnJlc3VsdDsKCQl9CQkKCX0sCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4gKSB7CgkJLy8gU2F2ZSByZWZlcmVuY2UgdG8gYXJndW1lbnRzIGZvciBhY2Nlc3MgaW4gY2xvc3VyZQoJCXZhciBhcmdzID0gYXJndW1lbnRzLCBpID0gMTsKCgkJLy8gbGluayBhbGwgdGhlIGZ1bmN0aW9ucywgc28gYW55IG9mIHRoZW0gY2FuIHVuYmluZCB0aGlzIGNsaWNrIGhhbmRsZXIKCQl3aGlsZSggaSA8IGFyZ3MubGVuZ3RoICkKCQkJalF1ZXJ5LmV2ZW50LnByb3h5KCBmbiwgYXJnc1tpKytdICk7CgoJCXJldHVybiB0aGlzLmNsaWNrKCBqUXVlcnkuZXZlbnQucHJveHkoIGZuLCBmdW5jdGlvbihldmVudCkgewoJCQkvLyBGaWd1cmUgb3V0IHdoaWNoIGZ1bmN0aW9uIHRvIGV4ZWN1dGUKCQkJdGhpcy5sYXN0VG9nZ2xlID0gKCB0aGlzLmxhc3RUb2dnbGUgfHwgMCApICUgaTsKCgkJCS8vIE1ha2Ugc3VyZSB0aGF0IGNsaWNrcyBzdG9wCgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCQkvLyBhbmQgZXhlY3V0ZSB0aGUgZnVuY3Rpb24KCQkJcmV0dXJuIGFyZ3NbIHRoaXMubGFzdFRvZ2dsZSsrIF0uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIHx8IGZhbHNlOwoJCX0pKTsKCX0sCgoJaG92ZXI6IGZ1bmN0aW9uKGZuT3ZlciwgZm5PdXQpIHsKCQlyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGZuT3ZlcikubW91c2VsZWF2ZShmbk91dCk7Cgl9LAoKCXJlYWR5OiBmdW5jdGlvbihmbikgewoJCS8vIEF0dGFjaCB0aGUgbGlzdGVuZXJzCgkJYmluZFJlYWR5KCk7CgoJCS8vIElmIHRoZSBET00gaXMgYWxyZWFkeSByZWFkeQoJCWlmICggalF1ZXJ5LmlzUmVhZHkgKQoJCQkvLyBFeGVjdXRlIHRoZSBmdW5jdGlvbiBpbW1lZGlhdGVseQoJCQlmbi5jYWxsKCBkb2N1bWVudCwgalF1ZXJ5ICk7CgoJCS8vIE90aGVyd2lzZSwgcmVtZW1iZXIgdGhlIGZ1bmN0aW9uIGZvciBsYXRlcgoJCWVsc2UKCQkJLy8gQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgd2FpdCBsaXN0CgkJCWpRdWVyeS5yZWFkeUxpc3QucHVzaCggZm4gKTsKCgkJcmV0dXJuIHRoaXM7Cgl9LAoJCglsaXZlOiBmdW5jdGlvbiggdHlwZSwgZm4gKXsKCQl2YXIgcHJveHkgPSBqUXVlcnkuZXZlbnQucHJveHkoIGZuICk7CgkJcHJveHkuZ3VpZCArPSB0aGlzLnNlbGVjdG9yICsgdHlwZTsKCgkJalF1ZXJ5KGRvY3VtZW50KS5iaW5kKCBsaXZlQ29udmVydCh0eXBlLCB0aGlzLnNlbGVjdG9yKSwgdGhpcy5zZWxlY3RvciwgcHJveHkgKTsKCgkJcmV0dXJuIHRoaXM7Cgl9LAoJCglkaWU6IGZ1bmN0aW9uKCB0eXBlLCBmbiApewoJCWpRdWVyeShkb2N1bWVudCkudW5iaW5kKCBsaXZlQ29udmVydCh0eXBlLCB0aGlzLnNlbGVjdG9yKSwgZm4gPyB7IGd1aWQ6IGZuLmd1aWQgKyB0aGlzLnNlbGVjdG9yICsgdHlwZSB9IDogbnVsbCApOwoJCXJldHVybiB0aGlzOwoJfQp9KTsKCmZ1bmN0aW9uIGxpdmVIYW5kbGVyKCBldmVudCApewoJdmFyIGNoZWNrID0gUmVnRXhwKCIoXnxcXC4pIiArIGV2ZW50LnR5cGUgKyAiKFxcLnwkKSIpLAoJCXN0b3AgPSB0cnVlLAoJCWVsZW1zID0gW107CgoJalF1ZXJ5LmVhY2goalF1ZXJ5LmRhdGEodGhpcywgImV2ZW50cyIpLmxpdmUgfHwgW10sIGZ1bmN0aW9uKGksIGZuKXsKCQlpZiAoIGNoZWNrLnRlc3QoZm4udHlwZSkgKSB7CgkJCXZhciBlbGVtID0galF1ZXJ5KGV2ZW50LnRhcmdldCkuY2xvc2VzdChmbi5kYXRhKVswXTsKCQkJaWYgKCBlbGVtICkKCQkJCWVsZW1zLnB1c2goeyBlbGVtOiBlbGVtLCBmbjogZm4gfSk7CgkJfQoJfSk7CgoJZWxlbXMuc29ydChmdW5jdGlvbihhLGIpIHsKCQlyZXR1cm4galF1ZXJ5LmRhdGEoYS5lbGVtLCAiY2xvc2VzdCIpIC0galF1ZXJ5LmRhdGEoYi5lbGVtLCAiY2xvc2VzdCIpOwoJfSk7CgkKCWpRdWVyeS5lYWNoKGVsZW1zLCBmdW5jdGlvbigpewoJCWlmICggdGhpcy5mbi5jYWxsKHRoaXMuZWxlbSwgZXZlbnQsIHRoaXMuZm4uZGF0YSkgPT09IGZhbHNlICkKCQkJcmV0dXJuIChzdG9wID0gZmFsc2UpOwoJfSk7CgoJcmV0dXJuIHN0b3A7Cn0KCmZ1bmN0aW9uIGxpdmVDb252ZXJ0KHR5cGUsIHNlbGVjdG9yKXsKCXJldHVybiBbImxpdmUiLCB0eXBlLCBzZWxlY3Rvci5yZXBsYWNlKC9cLi9nLCAiYCIpLnJlcGxhY2UoLyAvZywgInwiKV0uam9pbigiLiIpOwp9CgpqUXVlcnkuZXh0ZW5kKHsKCWlzUmVhZHk6IGZhbHNlLAoJcmVhZHlMaXN0OiBbXSwKCS8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHkKCXJlYWR5OiBmdW5jdGlvbigpIHsKCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgRE9NIGlzIG5vdCBhbHJlYWR5IGxvYWRlZAoJCWlmICggIWpRdWVyeS5pc1JlYWR5ICkgewoJCQkvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHkKCQkJalF1ZXJ5LmlzUmVhZHkgPSB0cnVlOwoKCQkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCQlpZiAoIGpRdWVyeS5yZWFkeUxpc3QgKSB7CgkJCQkvLyBFeGVjdXRlIGFsbCBvZiB0aGVtCgkJCQlqUXVlcnkuZWFjaCggalF1ZXJ5LnJlYWR5TGlzdCwgZnVuY3Rpb24oKXsKCQkJCQl0aGlzLmNhbGwoIGRvY3VtZW50LCBqUXVlcnkgKTsKCQkJCX0pOwoKCQkJCS8vIFJlc2V0IHRoZSBsaXN0IG9mIGZ1bmN0aW9ucwoJCQkJalF1ZXJ5LnJlYWR5TGlzdCA9IG51bGw7CgkJCX0KCgkJCS8vIFRyaWdnZXIgYW55IGJvdW5kIHJlYWR5IGV2ZW50cwoJCQlqUXVlcnkoZG9jdW1lbnQpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpOwoJCX0KCX0KfSk7Cgp2YXIgcmVhZHlCb3VuZCA9IGZhbHNlOwoKZnVuY3Rpb24gYmluZFJlYWR5KCl7CglpZiAoIHJlYWR5Qm91bmQgKSByZXR1cm47CglyZWFkeUJvdW5kID0gdHJ1ZTsKCgkvLyBNb3ppbGxhLCBPcGVyYSBhbmQgd2Via2l0IG5pZ2h0bGllcyBjdXJyZW50bHkgc3VwcG9ydCB0aGlzIGV2ZW50CglpZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7CgkJLy8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFjawoJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKXsKCQkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggIkRPTUNvbnRlbnRMb2FkZWQiLCBhcmd1bWVudHMuY2FsbGVlLCBmYWxzZSApOwoJCQlqUXVlcnkucmVhZHkoKTsKCQl9LCBmYWxzZSApOwoKCS8vIElmIElFIGV2ZW50IG1vZGVsIGlzIHVzZWQKCX0gZWxzZSBpZiAoIGRvY3VtZW50LmF0dGFjaEV2ZW50ICkgewoJCS8vIGVuc3VyZSBmaXJpbmcgYmVmb3JlIG9ubG9hZCwKCQkvLyBtYXliZSBsYXRlIGJ1dCBzYWZlIGFsc28gZm9yIGlmcmFtZXMKCQlkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKXsKCQkJaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgewoJCQkJZG9jdW1lbnQuZGV0YWNoRXZlbnQoICJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlICk7CgkJCQlqUXVlcnkucmVhZHkoKTsKCQkJfQoJCX0pOwoKCQkvLyBJZiBJRSBhbmQgbm90IGFuIGlmcmFtZQoJCS8vIGNvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKCQlpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCAmJiB3aW5kb3cgPT0gd2luZG93LnRvcCApIChmdW5jdGlvbigpewoJCQlpZiAoIGpRdWVyeS5pc1JlYWR5ICkgcmV0dXJuOwoKCQkJdHJ5IHsKCQkJCS8vIElmIElFIGlzIHVzZWQsIHVzZSB0aGUgdHJpY2sgYnkgRGllZ28gUGVyaW5pCgkJCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLwoJCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iik7CgkJCX0gY2F0Y2goIGVycm9yICkgewoJCQkJc2V0VGltZW91dCggYXJndW1lbnRzLmNhbGxlZSwgMCApOwoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBhbmQgZXhlY3V0ZSBhbnkgd2FpdGluZyBmdW5jdGlvbnMKCQkJalF1ZXJ5LnJlYWR5KCk7CgkJfSkoKTsKCX0KCgkvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29yawoJalF1ZXJ5LmV2ZW50LmFkZCggd2luZG93LCAibG9hZCIsIGpRdWVyeS5yZWFkeSApOwp9CgpqUXVlcnkuZWFjaCggKCJibHVyLGZvY3VzLGxvYWQscmVzaXplLHNjcm9sbCx1bmxvYWQsY2xpY2ssZGJsY2xpY2ssIiArCgkibW91c2Vkb3duLG1vdXNldXAsbW91c2Vtb3ZlLG1vdXNlb3Zlcixtb3VzZW91dCxtb3VzZWVudGVyLG1vdXNlbGVhdmUsIiArCgkiY2hhbmdlLHNlbGVjdCxzdWJtaXQsa2V5ZG93bixrZXlwcmVzcyxrZXl1cCxlcnJvciIpLnNwbGl0KCIsIiksIGZ1bmN0aW9uKGksIG5hbWUpewoKCS8vIEhhbmRsZSBldmVudCBiaW5kaW5nCglqUXVlcnkuZm5bbmFtZV0gPSBmdW5jdGlvbihmbil7CgkJcmV0dXJuIGZuID8gdGhpcy5iaW5kKG5hbWUsIGZuKSA6IHRoaXMudHJpZ2dlcihuYW1lKTsKCX07Cn0pOwoKLy8gUHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUKLy8gQW5kIHByZXZlbnQgZXJyb3JzIG9uIHJlZnJlc2ggd2l0aCBldmVudHMgbGlrZSBtb3VzZW92ZXIgaW4gb3RoZXIgYnJvd3NlcnMKLy8gV2luZG93IGlzbid0IGluY2x1ZGVkIHNvIGFzIG5vdCB0byB1bmJpbmQgZXhpc3RpbmcgdW5sb2FkIGV2ZW50cwpqUXVlcnkoIHdpbmRvdyApLmJpbmQoICd1bmxvYWQnLCBmdW5jdGlvbigpeyAKCWZvciAoIHZhciBpZCBpbiBqUXVlcnkuY2FjaGUgKQoJCS8vIFNraXAgdGhlIHdpbmRvdwoJCWlmICggaWQgIT0gMSAmJiBqUXVlcnkuY2FjaGVbIGlkIF0uaGFuZGxlICkKCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggalF1ZXJ5LmNhY2hlWyBpZCBdLmhhbmRsZS5lbGVtICk7Cn0pOyAKKGZ1bmN0aW9uKCl7CgoJalF1ZXJ5LnN1cHBvcnQgPSB7fTsKCgl2YXIgcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKCQlzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSwKCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKCQlpZCA9ICJzY3JpcHQiICsgKG5ldyBEYXRlKS5nZXRUaW1lKCk7CgoJZGl2LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CglkaXYuaW5uZXJIVE1MID0gJyAgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPSIvYSIgc3R5bGU9ImNvbG9yOnJlZDtmbG9hdDpsZWZ0O29wYWNpdHk6LjU7Ij5hPC9hPjxzZWxlY3Q+PG9wdGlvbj50ZXh0PC9vcHRpb24+PC9zZWxlY3Q+PG9iamVjdD48cGFyYW0vPjwvb2JqZWN0Pic7CgoJdmFyIGFsbCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLAoJCWEgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXTsKCgkvLyBDYW4ndCBnZXQgYmFzaWMgdGVzdCBzdXBwb3J0CglpZiAoICFhbGwgfHwgIWFsbC5sZW5ndGggfHwgIWEgKSB7CgkJcmV0dXJuOwoJfQoKCWpRdWVyeS5zdXBwb3J0ID0gewoJCS8vIElFIHN0cmlwcyBsZWFkaW5nIHdoaXRlc3BhY2Ugd2hlbiAuaW5uZXJIVE1MIGlzIHVzZWQKCQlsZWFkaW5nV2hpdGVzcGFjZTogZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT0gMywKCQkKCQkvLyBNYWtlIHN1cmUgdGhhdCB0Ym9keSBlbGVtZW50cyBhcmVuJ3QgYXV0b21hdGljYWxseSBpbnNlcnRlZAoJCS8vIElFIHdpbGwgaW5zZXJ0IHRoZW0gaW50byBlbXB0eSB0YWJsZXMKCQl0Ym9keTogIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsCgkJCgkJLy8gTWFrZSBzdXJlIHRoYXQgeW91IGNhbiBnZXQgYWxsIGVsZW1lbnRzIGluIGFuIDxvYmplY3Q+IGVsZW1lbnQKCQkvLyBJRSA3IGFsd2F5cyByZXR1cm5zIG5vIHJlc3VsdHMKCQlvYmplY3RBbGw6ICEhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXQoJCQkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGgsCgkJCgkJLy8gTWFrZSBzdXJlIHRoYXQgbGluayBlbGVtZW50cyBnZXQgc2VyaWFsaXplZCBjb3JyZWN0bHkgYnkgaW5uZXJIVE1MCgkJLy8gVGhpcyByZXF1aXJlcyBhIHdyYXBwZXIgZWxlbWVudCBpbiBJRQoJCWh0bWxTZXJpYWxpemU6ICEhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLAoJCQoJCS8vIEdldCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gZnJvbSBnZXRBdHRyaWJ1dGUKCQkvLyAoSUUgdXNlcyAuY3NzVGV4dCBpbnN0ZWQpCgkJc3R5bGU6IC9yZWQvLnRlc3QoIGEuZ2V0QXR0cmlidXRlKCJzdHlsZSIpICksCgkJCgkJLy8gTWFrZSBzdXJlIHRoYXQgVVJMcyBhcmVuJ3QgbWFuaXB1bGF0ZWQKCQkvLyAoSUUgbm9ybWFsaXplcyBpdCBieSBkZWZhdWx0KQoJCWhyZWZOb3JtYWxpemVkOiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpID09PSAiL2EiLAoJCQoJCS8vIE1ha2Ugc3VyZSB0aGF0IGVsZW1lbnQgb3BhY2l0eSBleGlzdHMKCQkvLyAoSUUgdXNlcyBmaWx0ZXIgaW5zdGVhZCkKCQlvcGFjaXR5OiBhLnN0eWxlLm9wYWNpdHkgPT09ICIwLjUiLAoJCQoJCS8vIFZlcmlmeSBzdHlsZSBmbG9hdCBleGlzdGVuY2UKCQkvLyAoSUUgdXNlcyBzdHlsZUZsb2F0IGluc3RlYWQgb2YgY3NzRmxvYXQpCgkJY3NzRmxvYXQ6ICEhYS5zdHlsZS5jc3NGbG9hdCwKCgkJLy8gV2lsbCBiZSBkZWZpbmVkIGxhdGVyCgkJc2NyaXB0RXZhbDogZmFsc2UsCgkJbm9DbG9uZUV2ZW50OiB0cnVlLAoJCWJveE1vZGVsOiBudWxsCgl9OwoJCglzY3JpcHQudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiOwoJdHJ5IHsKCQlzY3JpcHQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCAid2luZG93LiIgKyBpZCArICI9MTsiICkgKTsKCX0gY2F0Y2goZSl7fQoKCXJvb3QuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIHJvb3QuZmlyc3RDaGlsZCApOwoJCgkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZXhlY3V0aW9uIG9mIGNvZGUgd29ya3MgYnkgaW5qZWN0aW5nIGEgc2NyaXB0CgkvLyB0YWcgd2l0aCBhcHBlbmRDaGlsZC9jcmVhdGVUZXh0Tm9kZQoJLy8gKElFIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzLCBmYWlscywgYW5kIHVzZXMgLnRleHQgaW5zdGVhZCkKCWlmICggd2luZG93WyBpZCBdICkgewoJCWpRdWVyeS5zdXBwb3J0LnNjcmlwdEV2YWwgPSB0cnVlOwoJCWRlbGV0ZSB3aW5kb3dbIGlkIF07Cgl9CgoJcm9vdC5yZW1vdmVDaGlsZCggc2NyaXB0ICk7CgoJaWYgKCBkaXYuYXR0YWNoRXZlbnQgJiYgZGl2LmZpcmVFdmVudCApIHsKCQlkaXYuYXR0YWNoRXZlbnQoIm9uY2xpY2siLCBmdW5jdGlvbigpewoJCQkvLyBDbG9uaW5nIGEgbm9kZSBzaG91bGRuJ3QgY29weSBvdmVyIGFueQoJCQkvLyBib3VuZCBldmVudCBoYW5kbGVycyAoSUUgZG9lcyB0aGlzKQoJCQlqUXVlcnkuc3VwcG9ydC5ub0Nsb25lRXZlbnQgPSBmYWxzZTsKCQkJZGl2LmRldGFjaEV2ZW50KCJvbmNsaWNrIiwgYXJndW1lbnRzLmNhbGxlZSk7CgkJfSk7CgkJZGl2LmNsb25lTm9kZSh0cnVlKS5maXJlRXZlbnQoIm9uY2xpY2siKTsKCX0KCgkvLyBGaWd1cmUgb3V0IGlmIHRoZSBXM0MgYm94IG1vZGVsIHdvcmtzIGFzIGV4cGVjdGVkCgkvLyBkb2N1bWVudC5ib2R5IG11c3QgZXhpc3QgYmVmb3JlIHdlIGNhbiBkbyB0aGlzCglqUXVlcnkoZnVuY3Rpb24oKXsKCQl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgkJZGl2LnN0eWxlLndpZHRoID0gZGl2LnN0eWxlLnBhZGRpbmdMZWZ0ID0gIjFweCI7CgoJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoIGRpdiApOwoJCWpRdWVyeS5ib3hNb2RlbCA9IGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsID0gZGl2Lm9mZnNldFdpZHRoID09PSAyOwoJCWRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoIGRpdiApLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Cgl9KTsKfSkoKTsKCnZhciBzdHlsZUZsb2F0ID0galF1ZXJ5LnN1cHBvcnQuY3NzRmxvYXQgPyAiY3NzRmxvYXQiIDogInN0eWxlRmxvYXQiOwoKalF1ZXJ5LnByb3BzID0gewoJImZvciI6ICJodG1sRm9yIiwKCSJjbGFzcyI6ICJjbGFzc05hbWUiLAoJImZsb2F0Ijogc3R5bGVGbG9hdCwKCWNzc0Zsb2F0OiBzdHlsZUZsb2F0LAoJc3R5bGVGbG9hdDogc3R5bGVGbG9hdCwKCXJlYWRvbmx5OiAicmVhZE9ubHkiLAoJbWF4bGVuZ3RoOiAibWF4TGVuZ3RoIiwKCWNlbGxzcGFjaW5nOiAiY2VsbFNwYWNpbmciLAoJcm93c3BhbjogInJvd1NwYW4iLAoJdGFiaW5kZXg6ICJ0YWJJbmRleCIKfTsKalF1ZXJ5LmZuLmV4dGVuZCh7CgkvLyBLZWVwIGEgY29weSBvZiB0aGUgb2xkIGxvYWQKCV9sb2FkOiBqUXVlcnkuZm4ubG9hZCwKCglsb2FkOiBmdW5jdGlvbiggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkgewoJCWlmICggdHlwZW9mIHVybCAhPT0gInN0cmluZyIgKQoJCQlyZXR1cm4gdGhpcy5fbG9hZCggdXJsICk7CgoJCXZhciBvZmYgPSB1cmwuaW5kZXhPZigiICIpOwoJCWlmICggb2ZmID49IDAgKSB7CgkJCXZhciBzZWxlY3RvciA9IHVybC5zbGljZShvZmYsIHVybC5sZW5ndGgpOwoJCQl1cmwgPSB1cmwuc2xpY2UoMCwgb2ZmKTsKCQl9CgoJCS8vIERlZmF1bHQgdG8gYSBHRVQgcmVxdWVzdAoJCXZhciB0eXBlID0gIkdFVCI7CgoJCS8vIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHdhcyBwcm92aWRlZAoJCWlmICggcGFyYW1zICkKCQkJLy8gSWYgaXQncyBhIGZ1bmN0aW9uCgkJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHBhcmFtcyApICkgewoJCQkJLy8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2sKCQkJCWNhbGxiYWNrID0gcGFyYW1zOwoJCQkJcGFyYW1zID0gbnVsbDsKCgkJCS8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmcKCQkJfSBlbHNlIGlmKCB0eXBlb2YgcGFyYW1zID09PSAib2JqZWN0IiApIHsKCQkJCXBhcmFtcyA9IGpRdWVyeS5wYXJhbSggcGFyYW1zICk7CgkJCQl0eXBlID0gIlBPU1QiOwoJCQl9CgoJCXZhciBzZWxmID0gdGhpczsKCgkJLy8gUmVxdWVzdCB0aGUgcmVtb3RlIGRvY3VtZW50CgkJalF1ZXJ5LmFqYXgoewoJCQl1cmw6IHVybCwKCQkJdHlwZTogdHlwZSwKCQkJZGF0YVR5cGU6ICJodG1sIiwKCQkJZGF0YTogcGFyYW1zLAoJCQljb21wbGV0ZTogZnVuY3Rpb24ocmVzLCBzdGF0dXMpewoJCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaW5qZWN0IHRoZSBIVE1MIGludG8gYWxsIHRoZSBtYXRjaGVkIGVsZW1lbnRzCgkJCQlpZiAoIHN0YXR1cyA9PSAic3VjY2VzcyIgfHwgc3RhdHVzID09ICJub3Rtb2RpZmllZCIgKQoJCQkJCS8vIFNlZSBpZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQKCQkJCQlzZWxmLmh0bWwoIHNlbGVjdG9yID8KCQkJCQkJLy8gQ3JlYXRlIGEgZHVtbXkgZGl2IHRvIGhvbGQgdGhlIHJlc3VsdHMKCQkJCQkJalF1ZXJ5KCI8ZGl2Lz4iKQoJCQkJCQkJLy8gaW5qZWN0IHRoZSBjb250ZW50cyBvZiB0aGUgZG9jdW1lbnQgaW4sIHJlbW92aW5nIHRoZSBzY3JpcHRzCgkJCQkJCQkvLyB0byBhdm9pZCBhbnkgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnMgaW4gSUUKCQkJCQkJCS5hcHBlbmQocmVzLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC88c2NyaXB0KC58XHMpKj9cL3NjcmlwdD4vZywgIiIpKQoKCQkJCQkJCS8vIExvY2F0ZSB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzCgkJCQkJCQkuZmluZChzZWxlY3RvcikgOgoKCQkJCQkJLy8gSWYgbm90LCBqdXN0IGluamVjdCB0aGUgZnVsbCByZXN1bHQKCQkJCQkJcmVzLnJlc3BvbnNlVGV4dCApOwoKCQkJCWlmKCBjYWxsYmFjayApCgkJCQkJc2VsZi5lYWNoKCBjYWxsYmFjaywgW3Jlcy5yZXNwb25zZVRleHQsIHN0YXR1cywgcmVzXSApOwoJCQl9CgkJfSk7CgkJcmV0dXJuIHRoaXM7Cgl9LAoKCXNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGpRdWVyeS5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpOwoJfSwKCXNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXsKCQkJcmV0dXJuIHRoaXMuZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpIDogdGhpczsKCQl9KQoJCS5maWx0ZXIoZnVuY3Rpb24oKXsKCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhdGhpcy5kaXNhYmxlZCAmJgoJCQkJKHRoaXMuY2hlY2tlZCB8fCAvc2VsZWN0fHRleHRhcmVhL2kudGVzdCh0aGlzLm5vZGVOYW1lKSB8fAoJCQkJCS90ZXh0fGhpZGRlbnxwYXNzd29yZHxzZWFyY2gvaS50ZXN0KHRoaXMudHlwZSkpOwoJCX0pCgkJLm1hcChmdW5jdGlvbihpLCBlbGVtKXsKCQkJdmFyIHZhbCA9IGpRdWVyeSh0aGlzKS52YWwoKTsKCQkJcmV0dXJuIHZhbCA9PSBudWxsID8gbnVsbCA6CgkJCQlqUXVlcnkuaXNBcnJheSh2YWwpID8KCQkJCQlqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKHZhbCwgaSl7CgkJCQkJCXJldHVybiB7bmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsfTsKCQkJCQl9KSA6CgkJCQkJe25hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbH07CgkJfSkuZ2V0KCk7Cgl9Cn0pOwoKLy8gQXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBldmVudHMKalF1ZXJ5LmVhY2goICJhamF4U3RhcnQsYWpheFN0b3AsYWpheENvbXBsZXRlLGFqYXhFcnJvcixhamF4U3VjY2VzcyxhamF4U2VuZCIuc3BsaXQoIiwiKSwgZnVuY3Rpb24oaSxvKXsKCWpRdWVyeS5mbltvXSA9IGZ1bmN0aW9uKGYpewoJCXJldHVybiB0aGlzLmJpbmQobywgZik7Cgl9Owp9KTsKCnZhciBqc2MgPSBub3coKTsKCmpRdWVyeS5leHRlbmQoewogIAoJZ2V0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCQkvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21taXRlZAoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJY2FsbGJhY2sgPSBkYXRhOwoJCQlkYXRhID0gbnVsbDsKCQl9CgoJCXJldHVybiBqUXVlcnkuYWpheCh7CgkJCXR5cGU6ICJHRVQiLAoJCQl1cmw6IHVybCwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2ssCgkJCWRhdGFUeXBlOiB0eXBlCgkJfSk7Cgl9LAoKCWdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIGpRdWVyeS5nZXQodXJsLCBudWxsLCBjYWxsYmFjaywgInNjcmlwdCIpOwoJfSwKCglnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmdldCh1cmwsIGRhdGEsIGNhbGxiYWNrLCAianNvbiIpOwoJfSwKCglwb3N0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkgKSB7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHt9OwoJCX0KCgkJcmV0dXJuIGpRdWVyeS5hamF4KHsKCQkJdHlwZTogIlBPU1QiLAoJCQl1cmw6IHVybCwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2ssCgkJCWRhdGFUeXBlOiB0eXBlCgkJfSk7Cgl9LAoKCWFqYXhTZXR1cDogZnVuY3Rpb24oIHNldHRpbmdzICkgewoJCWpRdWVyeS5leHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHNldHRpbmdzICk7Cgl9LAoKCWFqYXhTZXR0aW5nczogewoJCXVybDogbG9jYXRpb24uaHJlZiwKCQlnbG9iYWw6IHRydWUsCgkJdHlwZTogIkdFVCIsCgkJY29udGVudFR5cGU6ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLAoJCXByb2Nlc3NEYXRhOiB0cnVlLAoJCWFzeW5jOiB0cnVlLAoJCS8qCgkJdGltZW91dDogMCwKCQlkYXRhOiBudWxsLAoJCXVzZXJuYW1lOiBudWxsLAoJCXBhc3N3b3JkOiBudWxsLAoJCSovCgkJLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdDsgTWljcm9zb2Z0IGZhaWxlZCB0byBwcm9wZXJseQoJCS8vIGltcGxlbWVudCB0aGUgWE1MSHR0cFJlcXVlc3QgaW4gSUU3LCBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUKCQkvLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBvdmVycmlkZW4gYnkgY2FsbGluZyBqUXVlcnkuYWpheFNldHVwCgkJeGhyOmZ1bmN0aW9uKCl7CgkJCXJldHVybiB3aW5kb3cuQWN0aXZlWE9iamVjdCA/IG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpIDogbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CgkJfSwKCQlhY2NlcHRzOiB7CgkJCXhtbDogImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLAoJCQlodG1sOiAidGV4dC9odG1sIiwKCQkJc2NyaXB0OiAidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IiwKCQkJanNvbjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsCgkJCXRleHQ6ICJ0ZXh0L3BsYWluIiwKCQkJX2RlZmF1bHQ6ICIqLyoiCgkJfQoJfSwKCgkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0CglsYXN0TW9kaWZpZWQ6IHt9LAoKCWFqYXg6IGZ1bmN0aW9uKCBzICkgewoJCS8vIEV4dGVuZCB0aGUgc2V0dGluZ3MsIGJ1dCByZS1leHRlbmQgJ3MnIHNvIHRoYXQgaXQgY2FuIGJlCgkJLy8gY2hlY2tlZCBhZ2FpbiBsYXRlciAoaW4gdGhlIHRlc3Qgc3VpdGUsIHNwZWNpZmljYWxseSkKCQlzID0galF1ZXJ5LmV4dGVuZCh0cnVlLCBzLCBqUXVlcnkuZXh0ZW5kKHRydWUsIHt9LCBqUXVlcnkuYWpheFNldHRpbmdzLCBzKSk7CgoJCXZhciBqc29ucCwganNyZSA9IC89XD8oJnwkKS9nLCBzdGF0dXMsIGRhdGEsCgkJCXR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKCgkJLy8gY29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nCgkJaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApCgkJCXMuZGF0YSA9IGpRdWVyeS5wYXJhbShzLmRhdGEpOwoKCQkvLyBIYW5kbGUgSlNPTlAgUGFyYW1ldGVyIENhbGxiYWNrcwoJCWlmICggcy5kYXRhVHlwZSA9PSAianNvbnAiICkgewoJCQlpZiAoIHR5cGUgPT0gIkdFVCIgKSB7CgkJCQlpZiAoICFzLnVybC5tYXRjaChqc3JlKSApCgkJCQkJcy51cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArIChzLmpzb25wIHx8ICJjYWxsYmFjayIpICsgIj0/IjsKCQkJfSBlbHNlIGlmICggIXMuZGF0YSB8fCAhcy5kYXRhLm1hdGNoKGpzcmUpICkKCQkJCXMuZGF0YSA9IChzLmRhdGEgPyBzLmRhdGEgKyAiJiIgOiAiIikgKyAocy5qc29ucCB8fCAiY2FsbGJhY2siKSArICI9PyI7CgkJCXMuZGF0YVR5cGUgPSAianNvbiI7CgkJfQoKCQkvLyBCdWlsZCB0ZW1wb3JhcnkgSlNPTlAgZnVuY3Rpb24KCQlpZiAoIHMuZGF0YVR5cGUgPT0gImpzb24iICYmIChzLmRhdGEgJiYgcy5kYXRhLm1hdGNoKGpzcmUpIHx8IHMudXJsLm1hdGNoKGpzcmUpKSApIHsKCQkJanNvbnAgPSAianNvbnAiICsganNjKys7CgoJCQkvLyBSZXBsYWNlIHRoZSA9PyBzZXF1ZW5jZSBib3RoIGluIHRoZSBxdWVyeSBzdHJpbmcgYW5kIHRoZSBkYXRhCgkJCWlmICggcy5kYXRhICkKCQkJCXMuZGF0YSA9IChzLmRhdGEgKyAiIikucmVwbGFjZShqc3JlLCAiPSIgKyBqc29ucCArICIkMSIpOwoJCQlzLnVybCA9IHMudXJsLnJlcGxhY2UoanNyZSwgIj0iICsganNvbnAgKyAiJDEiKTsKCgkJCS8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlCgkJCS8vIHRoYXQgYSBKU09OUCBzdHlsZSByZXNwb25zZSBpcyBleGVjdXRlZCBwcm9wZXJseQoJCQlzLmRhdGFUeXBlID0gInNjcmlwdCI7CgoJCQkvLyBIYW5kbGUgSlNPTlAtc3R5bGUgbG9hZGluZwoJCQl3aW5kb3dbIGpzb25wIF0gPSBmdW5jdGlvbih0bXApewoJCQkJZGF0YSA9IHRtcDsKCQkJCXN1Y2Nlc3MoKTsKCQkJCWNvbXBsZXRlKCk7CgkJCQkvLyBHYXJiYWdlIGNvbGxlY3QKCQkJCXdpbmRvd1sganNvbnAgXSA9IHVuZGVmaW5lZDsKCQkJCXRyeXsgZGVsZXRlIHdpbmRvd1sganNvbnAgXTsgfSBjYXRjaChlKXt9CgkJCQlpZiAoIGhlYWQgKQoJCQkJCWhlYWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJCQl9OwoJCX0KCgkJaWYgKCBzLmRhdGFUeXBlID09ICJzY3JpcHQiICYmIHMuY2FjaGUgPT0gbnVsbCApCgkJCXMuY2FjaGUgPSBmYWxzZTsKCgkJaWYgKCBzLmNhY2hlID09PSBmYWxzZSAmJiB0eXBlID09ICJHRVQiICkgewoJCQl2YXIgdHMgPSBub3coKTsKCQkJLy8gdHJ5IHJlcGxhY2luZyBfPSBpZiBpdCBpcyB0aGVyZQoJCQl2YXIgcmV0ID0gcy51cmwucmVwbGFjZSgvKFw/fCYpXz0uKj8oJnwkKS8sICIkMV89IiArIHRzICsgIiQyIik7CgkJCS8vIGlmIG5vdGhpbmcgd2FzIHJlcGxhY2VkLCBhZGQgdGltZXN0YW1wIHRvIHRoZSBlbmQKCQkJcy51cmwgPSByZXQgKyAoKHJldCA9PSBzLnVybCkgPyAocy51cmwubWF0Y2goL1w/LykgPyAiJiIgOiAiPyIpICsgIl89IiArIHRzIDogIiIpOwoJCX0KCgkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBkYXRhIHRvIHVybCBmb3IgZ2V0IHJlcXVlc3RzCgkJaWYgKCBzLmRhdGEgJiYgdHlwZSA9PSAiR0VUIiApIHsKCQkJcy51cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArIHMuZGF0YTsKCgkJCS8vIElFIGxpa2VzIHRvIHNlbmQgYm90aCBnZXQgYW5kIHBvc3QgZGF0YSwgcHJldmVudCB0aGlzCgkJCXMuZGF0YSA9IG51bGw7CgkJfQoKCQkvLyBXYXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzCgkJaWYgKCBzLmdsb2JhbCAmJiAhIGpRdWVyeS5hY3RpdmUrKyApCgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0YXJ0IiApOwoKCQkvLyBNYXRjaGVzIGFuIGFic29sdXRlIFVSTCwgYW5kIHNhdmVzIHRoZSBkb21haW4KCQl2YXIgcGFydHMgPSAvXihcdys6KT9cL1wvKFteXC8/I10rKS8uZXhlYyggcy51cmwgKTsKCgkJLy8gSWYgd2UncmUgcmVxdWVzdGluZyBhIHJlbW90ZSBkb2N1bWVudAoJCS8vIGFuZCB0cnlpbmcgdG8gbG9hZCBKU09OIG9yIFNjcmlwdCB3aXRoIGEgR0VUCgkJaWYgKCBzLmRhdGFUeXBlID09ICJzY3JpcHQiICYmIHR5cGUgPT0gIkdFVCIgJiYgcGFydHMKCQkJJiYgKCBwYXJ0c1sxXSAmJiBwYXJ0c1sxXSAhPSBsb2NhdGlvbi5wcm90b2NvbCB8fCBwYXJ0c1syXSAhPSBsb2NhdGlvbi5ob3N0ICkpewoKCQkJdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdOwoJCQl2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CgkJCXNjcmlwdC5zcmMgPSBzLnVybDsKCQkJaWYgKHMuc2NyaXB0Q2hhcnNldCkKCQkJCXNjcmlwdC5jaGFyc2V0ID0gcy5zY3JpcHRDaGFyc2V0OwoKCQkJLy8gSGFuZGxlIFNjcmlwdCBsb2FkaW5nCgkJCWlmICggIWpzb25wICkgewoJCQkJdmFyIGRvbmUgPSBmYWxzZTsKCgkJCQkvLyBBdHRhY2ggaGFuZGxlcnMgZm9yIGFsbCBicm93c2VycwoJCQkJc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpewoJCQkJCWlmICggIWRvbmUgJiYgKCF0aGlzLnJlYWR5U3RhdGUgfHwKCQkJCQkJCXRoaXMucmVhZHlTdGF0ZSA9PSAibG9hZGVkIiB8fCB0aGlzLnJlYWR5U3RhdGUgPT0gImNvbXBsZXRlIikgKSB7CgkJCQkJCWRvbmUgPSB0cnVlOwoJCQkJCQlzdWNjZXNzKCk7CgkJCQkJCWNvbXBsZXRlKCk7CgoJCQkJCQkvLyBIYW5kbGUgbWVtb3J5IGxlYWsgaW4gSUUKCQkJCQkJc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwoJCQkJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKCQkJCQl9CgkJCQl9OwoJCQl9CgoJCQloZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7CgoJCQkvLyBXZSBoYW5kbGUgZXZlcnl0aGluZyB1c2luZyB0aGUgc2NyaXB0IGVsZW1lbnQgaW5qZWN0aW9uCgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQl2YXIgcmVxdWVzdERvbmUgPSBmYWxzZTsKCgkJLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdAoJCXZhciB4aHIgPSBzLnhocigpOwoKCQkvLyBPcGVuIHRoZSBzb2NrZXQKCQkvLyBQYXNzaW5nIG51bGwgdXNlcm5hbWUsIGdlbmVyYXRlcyBhIGxvZ2luIHBvcHVwIG9uIE9wZXJhICgjMjg2NSkKCQlpZiggcy51c2VybmFtZSApCgkJCXhoci5vcGVuKHR5cGUsIHMudXJsLCBzLmFzeW5jLCBzLnVzZXJuYW1lLCBzLnBhc3N3b3JkKTsKCQllbHNlCgkJCXhoci5vcGVuKHR5cGUsIHMudXJsLCBzLmFzeW5jKTsKCgkJLy8gTmVlZCBhbiBleHRyYSB0cnkvY2F0Y2ggZm9yIGNyb3NzIGRvbWFpbiByZXF1ZXN0cyBpbiBGaXJlZm94IDMKCQl0cnkgewoJCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQkJaWYgKCBzLmRhdGEgKQoJCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUpOwoKCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBoZWFkZXIsIGlmIGlmTW9kaWZpZWQgbW9kZS4KCQkJaWYgKCBzLmlmTW9kaWZpZWQgKQoJCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIiwKCQkJCQlqUXVlcnkubGFzdE1vZGlmaWVkW3MudXJsXSB8fCAiVGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBHTVQiICk7CgoJCQkvLyBTZXQgaGVhZGVyIHNvIHRoZSBjYWxsZWQgc2NyaXB0IGtub3dzIHRoYXQgaXQncyBhbiBYTUxIdHRwUmVxdWVzdAoJCQl4aHIuc2V0UmVxdWVzdEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIsICJYTUxIdHRwUmVxdWVzdCIpOwoKCQkJLy8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZQoJCQl4aHIuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0Iiwgcy5kYXRhVHlwZSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGUgXSA/CgkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGUgXSArICIsICovKiIgOgoJCQkJcy5hY2NlcHRzLl9kZWZhdWx0ICk7CgkJfSBjYXRjaChlKXt9CgoJCS8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnQKCQlpZiAoIHMuYmVmb3JlU2VuZCAmJiBzLmJlZm9yZVNlbmQoeGhyLCBzKSA9PT0gZmFsc2UgKSB7CgkJCS8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlcgoJCQlpZiAoIHMuZ2xvYmFsICYmICEgLS1qUXVlcnkuYWN0aXZlICkKCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCS8vIGNsb3NlIG9wZW5kZWQgc29ja2V0CgkJCXhoci5hYm9ydCgpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlpZiAoIHMuZ2xvYmFsICkKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFqYXhTZW5kIiwgW3hociwgc10pOwoKCQkvLyBXYWl0IGZvciBhIHJlc3BvbnNlIHRvIGNvbWUgYmFjawoJCXZhciBvbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbihpc1RpbWVvdXQpewoJCQkvLyBUaGUgcmVxdWVzdCB3YXMgYWJvcnRlZCwgY2xlYXIgdGhlIGludGVydmFsIGFuZCBkZWNyZW1lbnQgalF1ZXJ5LmFjdGl2ZQoJCQlpZiAoeGhyLnJlYWR5U3RhdGUgPT0gMCkgewoJCQkJaWYgKGl2YWwpIHsKCQkJCQkvLyBjbGVhciBwb2xsIGludGVydmFsCgkJCQkJY2xlYXJJbnRlcnZhbChpdmFsKTsKCQkJCQlpdmFsID0gbnVsbDsKCQkJCQkvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXIKCQkJCQlpZiAoIHMuZ2xvYmFsICYmICEgLS1qUXVlcnkuYWN0aXZlICkKCQkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RvcCIgKTsKCQkJCX0KCQkJLy8gVGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlIGFuZCB0aGUgZGF0YSBpcyBhdmFpbGFibGUsIG9yIHRoZSByZXF1ZXN0IHRpbWVkIG91dAoJCQl9IGVsc2UgaWYgKCAhcmVxdWVzdERvbmUgJiYgeGhyICYmICh4aHIucmVhZHlTdGF0ZSA9PSA0IHx8IGlzVGltZW91dCA9PSAidGltZW91dCIpICkgewoJCQkJcmVxdWVzdERvbmUgPSB0cnVlOwoKCQkJCS8vIGNsZWFyIHBvbGwgaW50ZXJ2YWwKCQkJCWlmIChpdmFsKSB7CgkJCQkJY2xlYXJJbnRlcnZhbChpdmFsKTsKCQkJCQlpdmFsID0gbnVsbDsKCQkJCX0KCgkJCQlzdGF0dXMgPSBpc1RpbWVvdXQgPT0gInRpbWVvdXQiID8gInRpbWVvdXQiIDoKCQkJCQkhalF1ZXJ5Lmh0dHBTdWNjZXNzKCB4aHIgKSA/ICJlcnJvciIgOgoJCQkJCXMuaWZNb2RpZmllZCAmJiBqUXVlcnkuaHR0cE5vdE1vZGlmaWVkKCB4aHIsIHMudXJsICkgPyAibm90bW9kaWZpZWQiIDoKCQkJCQkic3VjY2VzcyI7CgoJCQkJaWYgKCBzdGF0dXMgPT0gInN1Y2Nlc3MiICkgewoJCQkJCS8vIFdhdGNoIGZvciwgYW5kIGNhdGNoLCBYTUwgZG9jdW1lbnQgcGFyc2UgZXJyb3JzCgkJCQkJdHJ5IHsKCQkJCQkJLy8gcHJvY2VzcyB0aGUgZGF0YSAocnVucyB0aGUgeG1sIHRocm91Z2ggaHR0cERhdGEgcmVnYXJkbGVzcyBvZiBjYWxsYmFjaykKCQkJCQkJZGF0YSA9IGpRdWVyeS5odHRwRGF0YSggeGhyLCBzLmRhdGFUeXBlLCBzICk7CgkJCQkJfSBjYXRjaChlKSB7CgkJCQkJCXN0YXR1cyA9ICJwYXJzZXJlcnJvciI7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsIG9yIG5vdG1vZGlmaWVkCgkJCQlpZiAoIHN0YXR1cyA9PSAic3VjY2VzcyIgKSB7CgkJCQkJLy8gQ2FjaGUgTGFzdC1Nb2RpZmllZCBoZWFkZXIsIGlmIGlmTW9kaWZpZWQgbW9kZS4KCQkJCQl2YXIgbW9kUmVzOwoJCQkJCXRyeSB7CgkJCQkJCW1vZFJlcyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpOwoJCQkJCX0gY2F0Y2goZSkge30gLy8gc3dhbGxvdyBleGNlcHRpb24gdGhyb3duIGJ5IEZGIGlmIGhlYWRlciBpcyBub3QgYXZhaWxhYmxlCgoJCQkJCWlmICggcy5pZk1vZGlmaWVkICYmIG1vZFJlcyApCgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbcy51cmxdID0gbW9kUmVzOwoKCQkJCQkvLyBKU09OUCBoYW5kbGVzIGl0cyBvd24gc3VjY2VzcyBjYWxsYmFjawoJCQkJCWlmICggIWpzb25wICkKCQkJCQkJc3VjY2VzcygpOwoJCQkJfSBlbHNlCgkJCQkJalF1ZXJ5LmhhbmRsZUVycm9yKHMsIHhociwgc3RhdHVzKTsKCgkJCQkvLyBGaXJlIHRoZSBjb21wbGV0ZSBoYW5kbGVycwoJCQkJY29tcGxldGUoKTsKCgkJCQlpZiAoIGlzVGltZW91dCApCgkJCQkJeGhyLmFib3J0KCk7CgoJCQkJLy8gU3RvcCBtZW1vcnkgbGVha3MKCQkJCWlmICggcy5hc3luYyApCgkJCQkJeGhyID0gbnVsbDsKCQkJfQoJCX07CgoJCWlmICggcy5hc3luYyApIHsKCQkJLy8gZG9uJ3QgYXR0YWNoIHRoZSBoYW5kbGVyIHRvIHRoZSByZXF1ZXN0LCBqdXN0IHBvbGwgaXQgaW5zdGVhZAoJCQl2YXIgaXZhbCA9IHNldEludGVydmFsKG9ucmVhZHlzdGF0ZWNoYW5nZSwgMTMpOwoKCQkJLy8gVGltZW91dCBjaGVja2VyCgkJCWlmICggcy50aW1lb3V0ID4gMCApCgkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgkJCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSByZXF1ZXN0IGlzIHN0aWxsIGhhcHBlbmluZwoJCQkJCWlmICggeGhyICYmICFyZXF1ZXN0RG9uZSApCgkJCQkJCW9ucmVhZHlzdGF0ZWNoYW5nZSggInRpbWVvdXQiICk7CgkJCQl9LCBzLnRpbWVvdXQpOwoJCX0KCgkJLy8gU2VuZCB0aGUgZGF0YQoJCXRyeSB7CgkJCXhoci5zZW5kKHMuZGF0YSk7CgkJfSBjYXRjaChlKSB7CgkJCWpRdWVyeS5oYW5kbGVFcnJvcihzLCB4aHIsIG51bGwsIGUpOwoJCX0KCgkJLy8gZmlyZWZveCAxLjUgZG9lc24ndCBmaXJlIHN0YXRlY2hhbmdlIGZvciBzeW5jIHJlcXVlc3RzCgkJaWYgKCAhcy5hc3luYyApCgkJCW9ucmVhZHlzdGF0ZWNoYW5nZSgpOwoKCQlmdW5jdGlvbiBzdWNjZXNzKCl7CgkJCS8vIElmIGEgbG9jYWwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgZmlyZSBpdCBhbmQgcGFzcyBpdCB0aGUgZGF0YQoJCQlpZiAoIHMuc3VjY2VzcyApCgkJCQlzLnN1Y2Nlc3MoIGRhdGEsIHN0YXR1cyApOwoKCQkJLy8gRmlyZSB0aGUgZ2xvYmFsIGNhbGxiYWNrCgkJCWlmICggcy5nbG9iYWwgKQoJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3VjY2VzcyIsIFt4aHIsIHNdICk7CgkJfQoKCQlmdW5jdGlvbiBjb21wbGV0ZSgpewoJCQkvLyBQcm9jZXNzIHJlc3VsdAoJCQlpZiAoIHMuY29tcGxldGUgKQoJCQkJcy5jb21wbGV0ZSh4aHIsIHN0YXR1cyk7CgoJCQkvLyBUaGUgcmVxdWVzdCB3YXMgY29tcGxldGVkCgkJCWlmICggcy5nbG9iYWwgKQoJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4Q29tcGxldGUiLCBbeGhyLCBzXSApOwoKCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCWlmICggcy5nbG9iYWwgJiYgISAtLWpRdWVyeS5hY3RpdmUgKQoJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RvcCIgKTsKCQl9CgoJCS8vIHJldHVybiBYTUxIdHRwUmVxdWVzdCB0byBhbGxvdyBhYm9ydGluZyB0aGUgcmVxdWVzdCBldGMuCgkJcmV0dXJuIHhocjsKCX0sCgoJaGFuZGxlRXJyb3I6IGZ1bmN0aW9uKCBzLCB4aHIsIHN0YXR1cywgZSApIHsKCQkvLyBJZiBhIGxvY2FsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIGZpcmUgaXQKCQlpZiAoIHMuZXJyb3IgKSBzLmVycm9yKCB4aHIsIHN0YXR1cywgZSApOwoKCQkvLyBGaXJlIHRoZSBnbG9iYWwgY2FsbGJhY2sKCQlpZiAoIHMuZ2xvYmFsICkKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4RXJyb3IiLCBbeGhyLCBzLCBlXSApOwoJfSwKCgkvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXMKCWFjdGl2ZTogMCwKCgkvLyBEZXRlcm1pbmVzIGlmIGFuIFhNTEh0dHBSZXF1ZXN0IHdhcyBzdWNjZXNzZnVsIG9yIG5vdAoJaHR0cFN1Y2Nlc3M6IGZ1bmN0aW9uKCB4aHIgKSB7CgkJdHJ5IHsKCQkJLy8gSUUgZXJyb3Igc29tZXRpbWVzIHJldHVybnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDQgc28gdHJlYXQgaXQgYXMgc3VjY2Vzcywgc2VlICMxNDUwCgkJCXJldHVybiAheGhyLnN0YXR1cyAmJiBsb2NhdGlvbi5wcm90b2NvbCA9PSAiZmlsZToiIHx8CgkJCQkoIHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDAgKSB8fCB4aHIuc3RhdHVzID09IDMwNCB8fCB4aHIuc3RhdHVzID09IDEyMjM7CgkJfSBjYXRjaChlKXt9CgkJcmV0dXJuIGZhbHNlOwoJfSwKCgkvLyBEZXRlcm1pbmVzIGlmIGFuIFhNTEh0dHBSZXF1ZXN0IHJldHVybnMgTm90TW9kaWZpZWQKCWh0dHBOb3RNb2RpZmllZDogZnVuY3Rpb24oIHhociwgdXJsICkgewoJCXRyeSB7CgkJCXZhciB4aHJSZXMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTsKCgkJCS8vIEZpcmVmb3ggYWx3YXlzIHJldHVybnMgMjAwLiBjaGVjayBMYXN0LU1vZGlmaWVkIGRhdGUKCQkJcmV0dXJuIHhoci5zdGF0dXMgPT0gMzA0IHx8IHhoclJlcyA9PSBqUXVlcnkubGFzdE1vZGlmaWVkW3VybF07CgkJfSBjYXRjaChlKXt9CgkJcmV0dXJuIGZhbHNlOwoJfSwKCglodHRwRGF0YTogZnVuY3Rpb24oIHhociwgdHlwZSwgcyApIHsKCQl2YXIgY3QgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpLAoJCQl4bWwgPSB0eXBlID09ICJ4bWwiIHx8ICF0eXBlICYmIGN0ICYmIGN0LmluZGV4T2YoInhtbCIpID49IDAsCgkJCWRhdGEgPSB4bWwgPyB4aHIucmVzcG9uc2VYTUwgOiB4aHIucmVzcG9uc2VUZXh0OwoKCQlpZiAoIHhtbCAmJiBkYXRhLmRvY3VtZW50RWxlbWVudC50YWdOYW1lID09ICJwYXJzZXJlcnJvciIgKQoJCQl0aHJvdyAicGFyc2VyZXJyb3IiOwoJCQkKCQkvLyBBbGxvdyBhIHByZS1maWx0ZXJpbmcgZnVuY3Rpb24gdG8gc2FuaXRpemUgdGhlIHJlc3BvbnNlCgkJLy8gcyAhPSBudWxsIGlzIGNoZWNrZWQgdG8ga2VlcCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQoJCWlmKCBzICYmIHMuZGF0YUZpbHRlciApCgkJCWRhdGEgPSBzLmRhdGFGaWx0ZXIoIGRhdGEsIHR5cGUgKTsKCgkJLy8gVGhlIGZpbHRlciBjYW4gYWN0dWFsbHkgcGFyc2UgdGhlIHJlc3BvbnNlCgkJaWYoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApewoKCQkJLy8gSWYgdGhlIHR5cGUgaXMgInNjcmlwdCIsIGV2YWwgaXQgaW4gZ2xvYmFsIGNvbnRleHQKCQkJaWYgKCB0eXBlID09ICJzY3JpcHQiICkKCQkJCWpRdWVyeS5nbG9iYWxFdmFsKCBkYXRhICk7CgoJCQkvLyBHZXQgdGhlIEphdmFTY3JpcHQgb2JqZWN0LCBpZiBKU09OIGlzIHVzZWQuCgkJCWlmICggdHlwZSA9PSAianNvbiIgKQoJCQkJZGF0YSA9IHdpbmRvd1siZXZhbCJdKCIoIiArIGRhdGEgKyAiKSIpOwoJCX0KCQkKCQlyZXR1cm4gZGF0YTsKCX0sCgoJLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2YKCS8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwoJcGFyYW06IGZ1bmN0aW9uKCBhICkgewoJCXZhciBzID0gWyBdOwoKCQlmdW5jdGlvbiBhZGQoIGtleSwgdmFsdWUgKXsKCQkJc1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKCQl9OwoKCQkvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheQoJCS8vIG9mIGZvcm0gZWxlbWVudHMKCQlpZiAoIGpRdWVyeS5pc0FycmF5KGEpIHx8IGEuanF1ZXJ5ICkKCQkJLy8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzCgkJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpewoJCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKCQkJfSk7CgoJCS8vIE90aGVyd2lzZSwgYXNzdW1lIHRoYXQgaXQncyBhbiBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzCgkJZWxzZQoJCQkvLyBTZXJpYWxpemUgdGhlIGtleS92YWx1ZXMKCQkJZm9yICggdmFyIGogaW4gYSApCgkJCQkvLyBJZiB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgdGhlbiB0aGUga2V5IG5hbWVzIG5lZWQgdG8gYmUgcmVwZWF0ZWQKCQkJCWlmICggalF1ZXJ5LmlzQXJyYXkoYVtqXSkgKQoJCQkJCWpRdWVyeS5lYWNoKCBhW2pdLCBmdW5jdGlvbigpewoJCQkJCQlhZGQoIGosIHRoaXMgKTsKCQkJCQl9KTsKCQkJCWVsc2UKCQkJCQlhZGQoIGosIGpRdWVyeS5pc0Z1bmN0aW9uKGFbal0pID8gYVtqXSgpIDogYVtqXSApOwoKCQkvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uCgkJcmV0dXJuIHMuam9pbigiJiIpLnJlcGxhY2UoLyUyMC9nLCAiKyIpOwoJfQoKfSk7CnZhciBlbGVtZGlzcGxheSA9IHt9LAoJdGltZXJJZCwKCWZ4QXR0cnMgPSBbCgkJLy8gaGVpZ2h0IGFuaW1hdGlvbnMKCQlbICJoZWlnaHQiLCAibWFyZ2luVG9wIiwgIm1hcmdpbkJvdHRvbSIsICJwYWRkaW5nVG9wIiwgInBhZGRpbmdCb3R0b20iIF0sCgkJLy8gd2lkdGggYW5pbWF0aW9ucwoJCVsgIndpZHRoIiwgIm1hcmdpbkxlZnQiLCAibWFyZ2luUmlnaHQiLCAicGFkZGluZ0xlZnQiLCAicGFkZGluZ1JpZ2h0IiBdLAoJCS8vIG9wYWNpdHkgYW5pbWF0aW9ucwoJCVsgIm9wYWNpdHkiIF0KCV07CgpmdW5jdGlvbiBnZW5GeCggdHlwZSwgbnVtICl7Cgl2YXIgb2JqID0ge307CglqUXVlcnkuZWFjaCggZnhBdHRycy5jb25jYXQuYXBwbHkoW10sIGZ4QXR0cnMuc2xpY2UoMCxudW0pKSwgZnVuY3Rpb24oKXsKCQlvYmpbIHRoaXMgXSA9IHR5cGU7Cgl9KTsKCXJldHVybiBvYmo7Cn0KCmpRdWVyeS5mbi5leHRlbmQoewoJc2hvdzogZnVuY3Rpb24oc3BlZWQsY2FsbGJhY2spewoJCWlmICggc3BlZWQgKSB7CgkJCXJldHVybiB0aGlzLmFuaW1hdGUoIGdlbkZ4KCJzaG93IiwgMyksIHNwZWVkLCBjYWxsYmFjayk7CgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKXsKCQkJCXZhciBvbGQgPSBqUXVlcnkuZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIpOwoJCQkJCgkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSBvbGQgfHwgIiI7CgkJCQkKCQkJCWlmICggalF1ZXJ5LmNzcyh0aGlzW2ldLCAiZGlzcGxheSIpID09PSAibm9uZSIgKSB7CgkJCQkJdmFyIHRhZ05hbWUgPSB0aGlzW2ldLnRhZ05hbWUsIGRpc3BsYXk7CgkJCQkJCgkJCQkJaWYgKCBlbGVtZGlzcGxheVsgdGFnTmFtZSBdICkgewoJCQkJCQlkaXNwbGF5ID0gZWxlbWRpc3BsYXlbIHRhZ05hbWUgXTsKCQkJCQl9IGVsc2UgewoJCQkJCQl2YXIgZWxlbSA9IGpRdWVyeSgiPCIgKyB0YWdOYW1lICsgIiAvPiIpLmFwcGVuZFRvKCJib2R5Iik7CgkJCQkJCQoJCQkJCQlkaXNwbGF5ID0gZWxlbS5jc3MoImRpc3BsYXkiKTsKCQkJCQkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgKQoJCQkJCQkJZGlzcGxheSA9ICJibG9jayI7CgkJCQkJCQoJCQkJCQllbGVtLnJlbW92ZSgpOwoJCQkJCQkKCQkJCQkJZWxlbWRpc3BsYXlbIHRhZ05hbWUgXSA9IGRpc3BsYXk7CgkJCQkJfQoJCQkJCQoJCQkJCWpRdWVyeS5kYXRhKHRoaXNbaV0sICJvbGRkaXNwbGF5IiwgZGlzcGxheSk7CgkJCQl9CgkJCX0KCgkJCS8vIFNldCB0aGUgZGlzcGxheSBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAoJCQkvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93CgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CgkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSBqUXVlcnkuZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIpIHx8ICIiOwoJCQl9CgkJCQoJCQlyZXR1cm4gdGhpczsKCQl9Cgl9LAoKCWhpZGU6IGZ1bmN0aW9uKHNwZWVkLGNhbGxiYWNrKXsKCQlpZiAoIHNwZWVkICkgewoJCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBnZW5GeCgiaGlkZSIsIDMpLCBzcGVlZCwgY2FsbGJhY2spOwoJCX0gZWxzZSB7CgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CgkJCQl2YXIgb2xkID0galF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiKTsKCQkJCWlmICggIW9sZCAmJiBvbGQgIT09ICJub25lIiApCgkJCQkJalF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiLCBqUXVlcnkuY3NzKHRoaXNbaV0sICJkaXNwbGF5IikpOwoJCQl9CgoJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdwoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApewoJCQkJdGhpc1tpXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCQl9Cgl9LAoKCS8vIFNhdmUgdGhlIG9sZCB0b2dnbGUgZnVuY3Rpb24KCV90b2dnbGU6IGpRdWVyeS5mbi50b2dnbGUsCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4sIGZuMiApewoJCXZhciBib29sID0gdHlwZW9mIGZuID09PSAiYm9vbGVhbiI7CgoJCXJldHVybiBqUXVlcnkuaXNGdW5jdGlvbihmbikgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oZm4yKSA/CgkJCXRoaXMuX3RvZ2dsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgOgoJCQlmbiA9PSBudWxsIHx8IGJvb2wgPwoJCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCQkJdmFyIHN0YXRlID0gYm9vbCA/IGZuIDogalF1ZXJ5KHRoaXMpLmlzKCI6aGlkZGVuIik7CgkJCQkJalF1ZXJ5KHRoaXMpWyBzdGF0ZSA/ICJzaG93IiA6ICJoaWRlIiBdKCk7CgkJCQl9KSA6CgkJCQl0aGlzLmFuaW1hdGUoZ2VuRngoInRvZ2dsZSIsIDMpLCBmbiwgZm4yKTsKCX0sCgoJZmFkZVRvOiBmdW5jdGlvbihzcGVlZCx0byxjYWxsYmFjayl7CgkJcmV0dXJuIHRoaXMuYW5pbWF0ZSh7b3BhY2l0eTogdG99LCBzcGVlZCwgY2FsbGJhY2spOwoJfSwKCglhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CgkJdmFyIG9wdGFsbCA9IGpRdWVyeS5zcGVlZChzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayk7CgoJCXJldHVybiB0aGlzWyBvcHRhbGwucXVldWUgPT09IGZhbHNlID8gImVhY2giIDogInF1ZXVlIiBdKGZ1bmN0aW9uKCl7CgkJCgkJCXZhciBvcHQgPSBqUXVlcnkuZXh0ZW5kKHt9LCBvcHRhbGwpLCBwLAoJCQkJaGlkZGVuID0gdGhpcy5ub2RlVHlwZSA9PSAxICYmIGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpLAoJCQkJc2VsZiA9IHRoaXM7CgkKCQkJZm9yICggcCBpbiBwcm9wICkgewoJCQkJaWYgKCBwcm9wW3BdID09ICJoaWRlIiAmJiBoaWRkZW4gfHwgcHJvcFtwXSA9PSAic2hvdyIgJiYgIWhpZGRlbiApCgkJCQkJcmV0dXJuIG9wdC5jb21wbGV0ZS5jYWxsKHRoaXMpOwoKCQkJCWlmICggKCBwID09ICJoZWlnaHQiIHx8IHAgPT0gIndpZHRoIiApICYmIHRoaXMuc3R5bGUgKSB7CgkJCQkJLy8gU3RvcmUgZGlzcGxheSBwcm9wZXJ0eQoJCQkJCW9wdC5kaXNwbGF5ID0galF1ZXJ5LmNzcyh0aGlzLCAiZGlzcGxheSIpOwoKCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCBub3RoaW5nIHNuZWFrcyBvdXQKCQkJCQlvcHQub3ZlcmZsb3cgPSB0aGlzLnN0eWxlLm92ZXJmbG93OwoJCQkJfQoJCQl9CgoJCQlpZiAoIG9wdC5vdmVyZmxvdyAhPSBudWxsICkKCQkJCXRoaXMuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKCgkJCW9wdC5jdXJBbmltID0galF1ZXJ5LmV4dGVuZCh7fSwgcHJvcCk7CgoJCQlqUXVlcnkuZWFjaCggcHJvcCwgZnVuY3Rpb24obmFtZSwgdmFsKXsKCQkJCXZhciBlID0gbmV3IGpRdWVyeS5meCggc2VsZiwgb3B0LCBuYW1lICk7CgoJCQkJaWYgKCAvdG9nZ2xlfHNob3d8aGlkZS8udGVzdCh2YWwpICkKCQkJCQllWyB2YWwgPT0gInRvZ2dsZSIgPyBoaWRkZW4gPyAic2hvdyIgOiAiaGlkZSIgOiB2YWwgXSggcHJvcCApOwoJCQkJZWxzZSB7CgkJCQkJdmFyIHBhcnRzID0gdmFsLnRvU3RyaW5nKCkubWF0Y2goL14oWystXT0pPyhbXGQrLS5dKykoLiopJC8pLAoJCQkJCQlzdGFydCA9IGUuY3VyKHRydWUpIHx8IDA7CgoJCQkJCWlmICggcGFydHMgKSB7CgkJCQkJCXZhciBlbmQgPSBwYXJzZUZsb2F0KHBhcnRzWzJdKSwKCQkJCQkJCXVuaXQgPSBwYXJ0c1szXSB8fCAicHgiOwoKCQkJCQkJLy8gV2UgbmVlZCB0byBjb21wdXRlIHN0YXJ0aW5nIHZhbHVlCgkJCQkJCWlmICggdW5pdCAhPSAicHgiICkgewoJCQkJCQkJc2VsZi5zdHlsZVsgbmFtZSBdID0gKGVuZCB8fCAxKSArIHVuaXQ7CgkJCQkJCQlzdGFydCA9ICgoZW5kIHx8IDEpIC8gZS5jdXIodHJ1ZSkpICogc3RhcnQ7CgkJCQkJCQlzZWxmLnN0eWxlWyBuYW1lIF0gPSBzdGFydCArIHVuaXQ7CgkJCQkJCX0KCgkJCQkJCS8vIElmIGEgKz0vLT0gdG9rZW4gd2FzIHByb3ZpZGVkLCB3ZSdyZSBkb2luZyBhIHJlbGF0aXZlIGFuaW1hdGlvbgoJCQkJCQlpZiAoIHBhcnRzWzFdICkKCQkJCQkJCWVuZCA9ICgocGFydHNbMV0gPT0gIi09IiA/IC0xIDogMSkgKiBlbmQpICsgc3RhcnQ7CgoJCQkJCQllLmN1c3RvbSggc3RhcnQsIGVuZCwgdW5pdCApOwoJCQkJCX0gZWxzZQoJCQkJCQllLmN1c3RvbSggc3RhcnQsIHZhbCwgIiIgKTsKCQkJCX0KCQkJfSk7CgoJCQkvLyBGb3IgSlMgc3RyaWN0IGNvbXBsaWFuY2UKCQkJcmV0dXJuIHRydWU7CgkJfSk7Cgl9LAoKCXN0b3A6IGZ1bmN0aW9uKGNsZWFyUXVldWUsIGdvdG9FbmQpewoJCXZhciB0aW1lcnMgPSBqUXVlcnkudGltZXJzOwoKCQlpZiAoY2xlYXJRdWV1ZSkKCQkJdGhpcy5xdWV1ZShbXSk7CgoJCXRoaXMuZWFjaChmdW5jdGlvbigpewoJCQkvLyBnbyBpbiByZXZlcnNlIG9yZGVyIHNvIGFueXRoaW5nIGFkZGVkIHRvIHRoZSBxdWV1ZSBkdXJpbmcgdGhlIGxvb3AgaXMgaWdub3JlZAoJCQlmb3IgKCB2YXIgaSA9IHRpbWVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSApCgkJCQlpZiAoIHRpbWVyc1tpXS5lbGVtID09IHRoaXMgKSB7CgkJCQkJaWYgKGdvdG9FbmQpCgkJCQkJCS8vIGZvcmNlIHRoZSBuZXh0IHN0ZXAgdG8gYmUgdGhlIGxhc3QKCQkJCQkJdGltZXJzW2ldKHRydWUpOwoJCQkJCXRpbWVycy5zcGxpY2UoaSwgMSk7CgkJCQl9CgkJfSk7CgoJCS8vIHN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQKCQlpZiAoIWdvdG9FbmQpCgkJCXRoaXMuZGVxdWV1ZSgpOwoKCQlyZXR1cm4gdGhpczsKCX0KCn0pOwoKLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucwpqUXVlcnkuZWFjaCh7CglzbGlkZURvd246IGdlbkZ4KCJzaG93IiwgMSksCglzbGlkZVVwOiBnZW5GeCgiaGlkZSIsIDEpLAoJc2xpZGVUb2dnbGU6IGdlbkZ4KCJ0b2dnbGUiLCAxKSwKCWZhZGVJbjogeyBvcGFjaXR5OiAic2hvdyIgfSwKCWZhZGVPdXQ6IHsgb3BhY2l0eTogImhpZGUiIH0KfSwgZnVuY3Rpb24oIG5hbWUsIHByb3BzICl7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgY2FsbGJhY2sgKXsKCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGNhbGxiYWNrICk7Cgl9Owp9KTsKCmpRdWVyeS5leHRlbmQoewoKCXNwZWVkOiBmdW5jdGlvbihzcGVlZCwgZWFzaW5nLCBmbikgewoJCXZhciBvcHQgPSB0eXBlb2Ygc3BlZWQgPT09ICJvYmplY3QiID8gc3BlZWQgOiB7CgkJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCQlqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCwKCQkJZHVyYXRpb246IHNwZWVkLAoJCQllYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKGVhc2luZykgJiYgZWFzaW5nCgkJfTsKCgkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0LmR1cmF0aW9uID09PSAibnVtYmVyIiA/IG9wdC5kdXJhdGlvbiA6CgkJCWpRdWVyeS5meC5zcGVlZHNbb3B0LmR1cmF0aW9uXSB8fCBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0OwoKCQkvLyBRdWV1ZWluZwoJCW9wdC5vbGQgPSBvcHQuY29tcGxldGU7CgkJb3B0LmNvbXBsZXRlID0gZnVuY3Rpb24oKXsKCQkJaWYgKCBvcHQucXVldWUgIT09IGZhbHNlICkKCQkJCWpRdWVyeSh0aGlzKS5kZXF1ZXVlKCk7CgkJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdC5vbGQgKSApCgkJCQlvcHQub2xkLmNhbGwoIHRoaXMgKTsKCQl9OwoKCQlyZXR1cm4gb3B0OwoJfSwKCgllYXNpbmc6IHsKCQlsaW5lYXI6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51bSwgZGlmZiApIHsKCQkJcmV0dXJuIGZpcnN0TnVtICsgZGlmZiAqIHA7CgkJfSwKCQlzd2luZzogZnVuY3Rpb24oIHAsIG4sIGZpcnN0TnVtLCBkaWZmICkgewoJCQlyZXR1cm4gKCgtTWF0aC5jb3MocCpNYXRoLlBJKS8yKSArIDAuNSkgKiBkaWZmICsgZmlyc3ROdW07CgkJfQoJfSwKCgl0aW1lcnM6IFtdLAoKCWZ4OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCApewoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkJdGhpcy5lbGVtID0gZWxlbTsKCQl0aGlzLnByb3AgPSBwcm9wOwoKCQlpZiAoICFvcHRpb25zLm9yaWcgKQoJCQlvcHRpb25zLm9yaWcgPSB7fTsKCX0KCn0pOwoKalF1ZXJ5LmZ4LnByb3RvdHlwZSA9IHsKCgkvLyBTaW1wbGUgZnVuY3Rpb24gZm9yIHNldHRpbmcgYSBzdHlsZSB2YWx1ZQoJdXBkYXRlOiBmdW5jdGlvbigpewoJCWlmICggdGhpcy5vcHRpb25zLnN0ZXAgKQoJCQl0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKCB0aGlzLmVsZW0sIHRoaXMubm93LCB0aGlzICk7CgoJCShqUXVlcnkuZnguc3RlcFt0aGlzLnByb3BdIHx8IGpRdWVyeS5meC5zdGVwLl9kZWZhdWx0KSggdGhpcyApOwoKCQkvLyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBibG9jayBmb3IgaGVpZ2h0L3dpZHRoIGFuaW1hdGlvbnMKCQlpZiAoICggdGhpcy5wcm9wID09ICJoZWlnaHQiIHx8IHRoaXMucHJvcCA9PSAid2lkdGgiICkgJiYgdGhpcy5lbGVtLnN0eWxlICkKCQkJdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwoJfSwKCgkvLyBHZXQgdGhlIGN1cnJlbnQgc2l6ZQoJY3VyOiBmdW5jdGlvbihmb3JjZSl7CgkJaWYgKCB0aGlzLmVsZW1bdGhpcy5wcm9wXSAhPSBudWxsICYmICghdGhpcy5lbGVtLnN0eWxlIHx8IHRoaXMuZWxlbS5zdHlsZVt0aGlzLnByb3BdID09IG51bGwpICkKCQkJcmV0dXJuIHRoaXMuZWxlbVsgdGhpcy5wcm9wIF07CgoJCXZhciByID0gcGFyc2VGbG9hdChqUXVlcnkuY3NzKHRoaXMuZWxlbSwgdGhpcy5wcm9wLCBmb3JjZSkpOwoJCXJldHVybiByICYmIHIgPiAtMTAwMDAgPyByIDogcGFyc2VGbG9hdChqUXVlcnkuY3VyQ1NTKHRoaXMuZWxlbSwgdGhpcy5wcm9wKSkgfHwgMDsKCX0sCgoJLy8gU3RhcnQgYW4gYW5pbWF0aW9uIGZyb20gb25lIG51bWJlciB0byBhbm90aGVyCgljdXN0b206IGZ1bmN0aW9uKGZyb20sIHRvLCB1bml0KXsKCQl0aGlzLnN0YXJ0VGltZSA9IG5vdygpOwoJCXRoaXMuc3RhcnQgPSBmcm9tOwoJCXRoaXMuZW5kID0gdG87CgkJdGhpcy51bml0ID0gdW5pdCB8fCB0aGlzLnVuaXQgfHwgInB4IjsKCQl0aGlzLm5vdyA9IHRoaXMuc3RhcnQ7CgkJdGhpcy5wb3MgPSB0aGlzLnN0YXRlID0gMDsKCgkJdmFyIHNlbGYgPSB0aGlzOwoJCWZ1bmN0aW9uIHQoZ290b0VuZCl7CgkJCXJldHVybiBzZWxmLnN0ZXAoZ290b0VuZCk7CgkJfQoKCQl0LmVsZW0gPSB0aGlzLmVsZW07CgoJCWlmICggdCgpICYmIGpRdWVyeS50aW1lcnMucHVzaCh0KSAmJiAhdGltZXJJZCApIHsKCQkJdGltZXJJZCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgkJCQl2YXIgdGltZXJzID0galF1ZXJ5LnRpbWVyczsKCgkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKQoJCQkJCWlmICggIXRpbWVyc1tpXSgpICkKCQkJCQkJdGltZXJzLnNwbGljZShpLS0sIDEpOwoKCQkJCWlmICggIXRpbWVycy5sZW5ndGggKSB7CgkJCQkJY2xlYXJJbnRlcnZhbCggdGltZXJJZCApOwoJCQkJCXRpbWVySWQgPSB1bmRlZmluZWQ7CgkJCQl9CgkJCX0sIDEzKTsKCQl9Cgl9LAoKCS8vIFNpbXBsZSAnc2hvdycgZnVuY3Rpb24KCXNob3c6IGZ1bmN0aW9uKCl7CgkJLy8gUmVtZW1iZXIgd2hlcmUgd2Ugc3RhcnRlZCwgc28gdGhhdCB3ZSBjYW4gZ28gYmFjayB0byBpdCBsYXRlcgoJCXRoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF0gPSBqUXVlcnkuYXR0ciggdGhpcy5lbGVtLnN0eWxlLCB0aGlzLnByb3AgKTsKCQl0aGlzLm9wdGlvbnMuc2hvdyA9IHRydWU7CgoJCS8vIEJlZ2luIHRoZSBhbmltYXRpb24KCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBzdGFydCBhdCBhIHNtYWxsIHdpZHRoL2hlaWdodCB0byBhdm9pZCBhbnkKCQkvLyBmbGFzaCBvZiBjb250ZW50CgkJdGhpcy5jdXN0b20odGhpcy5wcm9wID09ICJ3aWR0aCIgfHwgdGhpcy5wcm9wID09ICJoZWlnaHQiID8gMSA6IDAsIHRoaXMuY3VyKCkpOwoKCQkvLyBTdGFydCBieSBzaG93aW5nIHRoZSBlbGVtZW50CgkJalF1ZXJ5KHRoaXMuZWxlbSkuc2hvdygpOwoJfSwKCgkvLyBTaW1wbGUgJ2hpZGUnIGZ1bmN0aW9uCgloaWRlOiBmdW5jdGlvbigpewoJCS8vIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKCQl0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdID0galF1ZXJ5LmF0dHIoIHRoaXMuZWxlbS5zdHlsZSwgdGhpcy5wcm9wICk7CgkJdGhpcy5vcHRpb25zLmhpZGUgPSB0cnVlOwoKCQkvLyBCZWdpbiB0aGUgYW5pbWF0aW9uCgkJdGhpcy5jdXN0b20odGhpcy5jdXIoKSwgMCk7Cgl9LAoKCS8vIEVhY2ggc3RlcCBvZiBhbiBhbmltYXRpb24KCXN0ZXA6IGZ1bmN0aW9uKGdvdG9FbmQpewoJCXZhciB0ID0gbm93KCk7CgoJCWlmICggZ290b0VuZCB8fCB0ID49IHRoaXMub3B0aW9ucy5kdXJhdGlvbiArIHRoaXMuc3RhcnRUaW1lICkgewoJCQl0aGlzLm5vdyA9IHRoaXMuZW5kOwoJCQl0aGlzLnBvcyA9IHRoaXMuc3RhdGUgPSAxOwoJCQl0aGlzLnVwZGF0ZSgpOwoKCQkJdGhpcy5vcHRpb25zLmN1ckFuaW1bIHRoaXMucHJvcCBdID0gdHJ1ZTsKCgkJCXZhciBkb25lID0gdHJ1ZTsKCQkJZm9yICggdmFyIGkgaW4gdGhpcy5vcHRpb25zLmN1ckFuaW0gKQoJCQkJaWYgKCB0aGlzLm9wdGlvbnMuY3VyQW5pbVtpXSAhPT0gdHJ1ZSApCgkJCQkJZG9uZSA9IGZhbHNlOwoKCQkJaWYgKCBkb25lICkgewoJCQkJaWYgKCB0aGlzLm9wdGlvbnMuZGlzcGxheSAhPSBudWxsICkgewoJCQkJCS8vIFJlc2V0IHRoZSBvdmVyZmxvdwoJCQkJCXRoaXMuZWxlbS5zdHlsZS5vdmVyZmxvdyA9IHRoaXMub3B0aW9ucy5vdmVyZmxvdzsKCgkJCQkJLy8gUmVzZXQgdGhlIGRpc3BsYXkKCQkJCQl0aGlzLmVsZW0uc3R5bGUuZGlzcGxheSA9IHRoaXMub3B0aW9ucy5kaXNwbGF5OwoJCQkJCWlmICggalF1ZXJ5LmNzcyh0aGlzLmVsZW0sICJkaXNwbGF5IikgPT0gIm5vbmUiICkKCQkJCQkJdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwoJCQkJfQoKCQkJCS8vIEhpZGUgdGhlIGVsZW1lbnQgaWYgdGhlICJoaWRlIiBvcGVyYXRpb24gd2FzIGRvbmUKCQkJCWlmICggdGhpcy5vcHRpb25zLmhpZGUgKQoJCQkJCWpRdWVyeSh0aGlzLmVsZW0pLmhpZGUoKTsKCgkJCQkvLyBSZXNldCB0aGUgcHJvcGVydGllcywgaWYgdGhlIGl0ZW0gaGFzIGJlZW4gaGlkZGVuIG9yIHNob3duCgkJCQlpZiAoIHRoaXMub3B0aW9ucy5oaWRlIHx8IHRoaXMub3B0aW9ucy5zaG93ICkKCQkJCQlmb3IgKCB2YXIgcCBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSApCgkJCQkJCWpRdWVyeS5hdHRyKHRoaXMuZWxlbS5zdHlsZSwgcCwgdGhpcy5vcHRpb25zLm9yaWdbcF0pOwoJCQkJCQoJCQkJLy8gRXhlY3V0ZSB0aGUgY29tcGxldGUgZnVuY3Rpb24KCQkJCXRoaXMub3B0aW9ucy5jb21wbGV0ZS5jYWxsKCB0aGlzLmVsZW0gKTsKCQkJfQoKCQkJcmV0dXJuIGZhbHNlOwoJCX0gZWxzZSB7CgkJCXZhciBuID0gdCAtIHRoaXMuc3RhcnRUaW1lOwoJCQl0aGlzLnN0YXRlID0gbiAvIHRoaXMub3B0aW9ucy5kdXJhdGlvbjsKCgkJCS8vIFBlcmZvcm0gdGhlIGVhc2luZyBmdW5jdGlvbiwgZGVmYXVsdHMgdG8gc3dpbmcKCQkJdGhpcy5wb3MgPSBqUXVlcnkuZWFzaW5nW3RoaXMub3B0aW9ucy5lYXNpbmcgfHwgKGpRdWVyeS5lYXNpbmcuc3dpbmcgPyAic3dpbmciIDogImxpbmVhciIpXSh0aGlzLnN0YXRlLCBuLCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24pOwoJCQl0aGlzLm5vdyA9IHRoaXMuc3RhcnQgKyAoKHRoaXMuZW5kIC0gdGhpcy5zdGFydCkgKiB0aGlzLnBvcyk7CgoJCQkvLyBQZXJmb3JtIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGFuaW1hdGlvbgoJCQl0aGlzLnVwZGF0ZSgpOwoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9Cgp9OwoKalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmZ4LCB7CglzcGVlZHM6ewoJCXNsb3c6IDYwMCwKIAkJZmFzdDogMjAwLAogCQkvLyBEZWZhdWx0IHNwZWVkCiAJCV9kZWZhdWx0OiA0MDAKCX0sCglzdGVwOiB7CgoJCW9wYWNpdHk6IGZ1bmN0aW9uKGZ4KXsKCQkJalF1ZXJ5LmF0dHIoZnguZWxlbS5zdHlsZSwgIm9wYWNpdHkiLCBmeC5ub3cpOwoJCX0sCgoJCV9kZWZhdWx0OiBmdW5jdGlvbihmeCl7CgkJCWlmICggZnguZWxlbS5zdHlsZSAmJiBmeC5lbGVtLnN0eWxlWyBmeC5wcm9wIF0gIT0gbnVsbCApCgkJCQlmeC5lbGVtLnN0eWxlWyBmeC5wcm9wIF0gPSBmeC5ub3cgKyBmeC51bml0OwoJCQllbHNlCgkJCQlmeC5lbGVtWyBmeC5wcm9wIF0gPSBmeC5ub3c7CgkJfQoJfQp9KTsKaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImdldEJvdW5kaW5nQ2xpZW50UmVjdCJdICkKCWpRdWVyeS5mbi5vZmZzZXQgPSBmdW5jdGlvbigpIHsKCQlpZiAoICF0aGlzWzBdICkgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwIH07CgkJaWYgKCB0aGlzWzBdID09PSB0aGlzWzBdLm93bmVyRG9jdW1lbnQuYm9keSApIHJldHVybiBqUXVlcnkub2Zmc2V0LmJvZHlPZmZzZXQoIHRoaXNbMF0gKTsKCQl2YXIgYm94ICA9IHRoaXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGRvYyA9IHRoaXNbMF0ub3duZXJEb2N1bWVudCwgYm9keSA9IGRvYy5ib2R5LCBkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudCwKCQkJY2xpZW50VG9wID0gZG9jRWxlbS5jbGllbnRUb3AgfHwgYm9keS5jbGllbnRUb3AgfHwgMCwgY2xpZW50TGVmdCA9IGRvY0VsZW0uY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMCwKCQkJdG9wICA9IGJveC50b3AgICsgKHNlbGYucGFnZVlPZmZzZXQgfHwgalF1ZXJ5LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsVG9wICB8fCBib2R5LnNjcm9sbFRvcCApIC0gY2xpZW50VG9wLAoJCQlsZWZ0ID0gYm94LmxlZnQgKyAoc2VsZi5wYWdlWE9mZnNldCB8fCBqUXVlcnkuYm94TW9kZWwgJiYgZG9jRWxlbS5zY3JvbGxMZWZ0IHx8IGJvZHkuc2Nyb2xsTGVmdCkgLSBjbGllbnRMZWZ0OwoJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07Cgl9OwplbHNlIAoJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCkgewoJCWlmICggIXRoaXNbMF0gKSByZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTsKCQlpZiAoIHRoaXNbMF0gPT09IHRoaXNbMF0ub3duZXJEb2N1bWVudC5ib2R5ICkgcmV0dXJuIGpRdWVyeS5vZmZzZXQuYm9keU9mZnNldCggdGhpc1swXSApOwoJCWpRdWVyeS5vZmZzZXQuaW5pdGlhbGl6ZWQgfHwgalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplKCk7CgoJCXZhciBlbGVtID0gdGhpc1swXSwgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQsIHByZXZPZmZzZXRQYXJlbnQgPSBlbGVtLAoJCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsIGNvbXB1dGVkU3R5bGUsIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50LAoJCQlib2R5ID0gZG9jLmJvZHksIGRlZmF1bHRWaWV3ID0gZG9jLmRlZmF1bHRWaWV3LAoJCQlwcmV2Q29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgbnVsbCksCgkJCXRvcCA9IGVsZW0ub2Zmc2V0VG9wLCBsZWZ0ID0gZWxlbS5vZmZzZXRMZWZ0OwoKCQl3aGlsZSAoIChlbGVtID0gZWxlbS5wYXJlbnROb2RlKSAmJiBlbGVtICE9PSBib2R5ICYmIGVsZW0gIT09IGRvY0VsZW0gKSB7CgkJCWNvbXB1dGVkU3R5bGUgPSBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpOwoJCQl0b3AgLT0gZWxlbS5zY3JvbGxUb3AsIGxlZnQgLT0gZWxlbS5zY3JvbGxMZWZ0OwoJCQlpZiAoIGVsZW0gPT09IG9mZnNldFBhcmVudCApIHsKCQkJCXRvcCArPSBlbGVtLm9mZnNldFRvcCwgbGVmdCArPSBlbGVtLm9mZnNldExlZnQ7CgkJCQlpZiAoIGpRdWVyeS5vZmZzZXQuZG9lc05vdEFkZEJvcmRlciAmJiAhKGpRdWVyeS5vZmZzZXQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMgJiYgL150KGFibGV8ZHxoKSQvaS50ZXN0KGVsZW0udGFnTmFtZSkpICkKCQkJCQl0b3AgICs9IHBhcnNlSW50KCBjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoLCAgMTApIHx8IDAsCgkJCQkJbGVmdCArPSBwYXJzZUludCggY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgsIDEwKSB8fCAwOwoJCQkJcHJldk9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudCwgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQ7CgkJCX0KCQkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSAmJiBjb21wdXRlZFN0eWxlLm92ZXJmbG93ICE9PSAidmlzaWJsZSIgKQoJCQkJdG9wICArPSBwYXJzZUludCggY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCwgIDEwKSB8fCAwLAoJCQkJbGVmdCArPSBwYXJzZUludCggY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgsIDEwKSB8fCAwOwoJCQlwcmV2Q29tcHV0ZWRTdHlsZSA9IGNvbXB1dGVkU3R5bGU7CgkJfQoKCQlpZiAoIHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAicmVsYXRpdmUiIHx8IHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAic3RhdGljIiApCgkJCXRvcCAgKz0gYm9keS5vZmZzZXRUb3AsCgkJCWxlZnQgKz0gYm9keS5vZmZzZXRMZWZ0OwoKCQlpZiAoIHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAiZml4ZWQiICkKCQkJdG9wICArPSBNYXRoLm1heChkb2NFbGVtLnNjcm9sbFRvcCwgYm9keS5zY3JvbGxUb3ApLAoJCQlsZWZ0ICs9IE1hdGgubWF4KGRvY0VsZW0uc2Nyb2xsTGVmdCwgYm9keS5zY3JvbGxMZWZ0KTsKCgkJcmV0dXJuIHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfTsKCX07CgpqUXVlcnkub2Zmc2V0ID0gewoJaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7CgkJaWYgKCB0aGlzLmluaXRpYWxpemVkICkgcmV0dXJuOwoJCXZhciBib2R5ID0gZG9jdW1lbnQuYm9keSwgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksIGlubmVyRGl2LCBjaGVja0RpdiwgdGFibGUsIHRkLCBydWxlcywgcHJvcCwgYm9keU1hcmdpblRvcCA9IGJvZHkuc3R5bGUubWFyZ2luVG9wLAoJCQlodG1sID0gJzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OyI+PGRpdj48L2Rpdj48L2Rpdj48dGFibGUgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OyIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPic7CgoJCXJ1bGVzID0geyBwb3NpdGlvbjogJ2Fic29sdXRlJywgdG9wOiAwLCBsZWZ0OiAwLCBtYXJnaW46IDAsIGJvcmRlcjogMCwgd2lkdGg6ICcxcHgnLCBoZWlnaHQ6ICcxcHgnLCB2aXNpYmlsaXR5OiAnaGlkZGVuJyB9OwoJCWZvciAoIHByb3AgaW4gcnVsZXMgKSBjb250YWluZXIuc3R5bGVbcHJvcF0gPSBydWxlc1twcm9wXTsKCgkJY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7CgkJYm9keS5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCBib2R5LmZpcnN0Q2hpbGQpOwoJCWlubmVyRGl2ID0gY29udGFpbmVyLmZpcnN0Q2hpbGQsIGNoZWNrRGl2ID0gaW5uZXJEaXYuZmlyc3RDaGlsZCwgdGQgPSBpbm5lckRpdi5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7CgoJCXRoaXMuZG9lc05vdEFkZEJvcmRlciA9IChjaGVja0Rpdi5vZmZzZXRUb3AgIT09IDUpOwoJCXRoaXMuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMgPSAodGQub2Zmc2V0VG9wID09PSA1KTsKCgkJaW5uZXJEaXYuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJywgaW5uZXJEaXYuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOwoJCXRoaXMuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gLTUpOwoKCQlib2R5LnN0eWxlLm1hcmdpblRvcCA9ICcxcHgnOwoJCXRoaXMuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgPSAoYm9keS5vZmZzZXRUb3AgPT09IDApOwoJCWJvZHkuc3R5bGUubWFyZ2luVG9wID0gYm9keU1hcmdpblRvcDsKCgkJYm9keS5yZW1vdmVDaGlsZChjb250YWluZXIpOwoJCXRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOwoJfSwKCglib2R5T2Zmc2V0OiBmdW5jdGlvbihib2R5KSB7CgkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplZCB8fCBqUXVlcnkub2Zmc2V0LmluaXRpYWxpemUoKTsKCQl2YXIgdG9wID0gYm9keS5vZmZzZXRUb3AsIGxlZnQgPSBib2R5Lm9mZnNldExlZnQ7CgkJaWYgKCBqUXVlcnkub2Zmc2V0LmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0ICkKCQkJdG9wICArPSBwYXJzZUludCggalF1ZXJ5LmN1ckNTUyhib2R5LCAnbWFyZ2luVG9wJywgIHRydWUpLCAxMCApIHx8IDAsCgkJCWxlZnQgKz0gcGFyc2VJbnQoIGpRdWVyeS5jdXJDU1MoYm9keSwgJ21hcmdpbkxlZnQnLCB0cnVlKSwgMTAgKSB8fCAwOwoJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07Cgl9Cn07CgoKalF1ZXJ5LmZuLmV4dGVuZCh7Cglwb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGxlZnQgPSAwLCB0b3AgPSAwLCByZXN1bHRzOwoKCQlpZiAoIHRoaXNbMF0gKSB7CgkJCS8vIEdldCAqcmVhbCogb2Zmc2V0UGFyZW50CgkJCXZhciBvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCgpLAoKCQkJLy8gR2V0IGNvcnJlY3Qgb2Zmc2V0cwoJCQlvZmZzZXQgICAgICAgPSB0aGlzLm9mZnNldCgpLAoJCQlwYXJlbnRPZmZzZXQgPSAvXmJvZHl8aHRtbCQvaS50ZXN0KG9mZnNldFBhcmVudFswXS50YWdOYW1lKSA/IHsgdG9wOiAwLCBsZWZ0OiAwIH0gOiBvZmZzZXRQYXJlbnQub2Zmc2V0KCk7CgoJCQkvLyBTdWJ0cmFjdCBlbGVtZW50IG1hcmdpbnMKCQkJLy8gbm90ZTogd2hlbiBhbiBlbGVtZW50IGhhcyBtYXJnaW46IGF1dG8gdGhlIG9mZnNldExlZnQgYW5kIG1hcmdpbkxlZnQgCgkJCS8vIGFyZSB0aGUgc2FtZSBpbiBTYWZhcmkgY2F1c2luZyBvZmZzZXQubGVmdCB0byBpbmNvcnJlY3RseSBiZSAwCgkJCW9mZnNldC50b3AgIC09IG51bSggdGhpcywgJ21hcmdpblRvcCcgICk7CgkJCW9mZnNldC5sZWZ0IC09IG51bSggdGhpcywgJ21hcmdpbkxlZnQnICk7CgoJCQkvLyBBZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnMKCQkJcGFyZW50T2Zmc2V0LnRvcCAgKz0gbnVtKCBvZmZzZXRQYXJlbnQsICdib3JkZXJUb3BXaWR0aCcgICk7CgkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IG51bSggb2Zmc2V0UGFyZW50LCAnYm9yZGVyTGVmdFdpZHRoJyApOwoKCQkJLy8gU3VidHJhY3QgdGhlIHR3byBvZmZzZXRzCgkJCXJlc3VsdHMgPSB7CgkJCQl0b3A6ICBvZmZzZXQudG9wICAtIHBhcmVudE9mZnNldC50b3AsCgkJCQlsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0CgkJCX07CgkJfQoKCQlyZXR1cm4gcmVzdWx0czsKCX0sCgoJb2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHsKCQl2YXIgb2Zmc2V0UGFyZW50ID0gdGhpc1swXS5vZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnQuYm9keTsKCQl3aGlsZSAoIG9mZnNldFBhcmVudCAmJiAoIS9eYm9keXxodG1sJC9pLnRlc3Qob2Zmc2V0UGFyZW50LnRhZ05hbWUpICYmIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50LCAncG9zaXRpb24nKSA9PSAnc3RhdGljJykgKQoJCQlvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50OwoJCXJldHVybiBqUXVlcnkob2Zmc2V0UGFyZW50KTsKCX0KfSk7CgoKLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzCmpRdWVyeS5lYWNoKCBbJ0xlZnQnLCAnVG9wJ10sIGZ1bmN0aW9uKGksIG5hbWUpIHsKCXZhciBtZXRob2QgPSAnc2Nyb2xsJyArIG5hbWU7CgkKCWpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbih2YWwpIHsKCQlpZiAoIXRoaXNbMF0pIHJldHVybiBudWxsOwoKCQlyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgPwoKCQkJLy8gU2V0IHRoZSBzY3JvbGwgb2Zmc2V0CgkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCXRoaXMgPT0gd2luZG93IHx8IHRoaXMgPT0gZG9jdW1lbnQgPwoJCQkJCXdpbmRvdy5zY3JvbGxUbygKCQkJCQkJIWkgPyB2YWwgOiBqUXVlcnkod2luZG93KS5zY3JvbGxMZWZ0KCksCgkJCQkJCSBpID8gdmFsIDogalF1ZXJ5KHdpbmRvdykuc2Nyb2xsVG9wKCkKCQkJCQkpIDoKCQkJCQl0aGlzWyBtZXRob2QgXSA9IHZhbDsKCQkJfSkgOgoKCQkJLy8gUmV0dXJuIHRoZSBzY3JvbGwgb2Zmc2V0CgkJCXRoaXNbMF0gPT0gd2luZG93IHx8IHRoaXNbMF0gPT0gZG9jdW1lbnQgPwoJCQkJc2VsZlsgaSA/ICdwYWdlWU9mZnNldCcgOiAncGFnZVhPZmZzZXQnIF0gfHwKCQkJCQlqUXVlcnkuYm94TW9kZWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyBtZXRob2QgXSB8fAoJCQkJCWRvY3VtZW50LmJvZHlbIG1ldGhvZCBdIDoKCQkJCXRoaXNbMF1bIG1ldGhvZCBdOwoJfTsKfSk7Ci8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcwpqUXVlcnkuZWFjaChbICJIZWlnaHQiLCAiV2lkdGgiIF0sIGZ1bmN0aW9uKGksIG5hbWUpewoKCXZhciB0bCA9IGkgPyAiTGVmdCIgIDogIlRvcCIsICAvLyB0b3Agb3IgbGVmdAoJCWJyID0gaSA/ICJSaWdodCIgOiAiQm90dG9tIiwgLy8gYm90dG9tIG9yIHJpZ2h0CgkJbG93ZXIgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CgoJLy8gaW5uZXJIZWlnaHQgYW5kIGlubmVyV2lkdGgKCWpRdWVyeS5mblsiaW5uZXIiICsgbmFtZV0gPSBmdW5jdGlvbigpewoJCXJldHVybiB0aGlzWzBdID8KCQkJalF1ZXJ5LmNzcyggdGhpc1swXSwgbG93ZXIsIGZhbHNlLCAicGFkZGluZyIgKSA6CgkJCW51bGw7Cgl9OwoKCS8vIG91dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRoCglqUXVlcnkuZm5bIm91dGVyIiArIG5hbWVdID0gZnVuY3Rpb24obWFyZ2luKSB7CgkJcmV0dXJuIHRoaXNbMF0gPwoJCQlqUXVlcnkuY3NzKCB0aGlzWzBdLCBsb3dlciwgZmFsc2UsIG1hcmdpbiA/ICJtYXJnaW4iIDogImJvcmRlciIgKSA6CgkJCW51bGw7Cgl9OwoJCgl2YXIgdHlwZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCglqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0aW9uKCBzaXplICkgewoJCS8vIEdldCB3aW5kb3cgd2lkdGggb3IgaGVpZ2h0CgkJcmV0dXJuIHRoaXNbMF0gPT0gd2luZG93ID8KCQkJLy8gRXZlcnlvbmUgZWxzZSB1c2UgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IG9yIGRvY3VtZW50LmJvZHkgZGVwZW5kaW5nIG9uIFF1aXJrcyB2cyBTdGFuZGFyZHMgbW9kZQoJCQlkb2N1bWVudC5jb21wYXRNb2RlID09ICJDU1MxQ29tcGF0IiAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdIHx8CgkJCWRvY3VtZW50LmJvZHlbICJjbGllbnQiICsgbmFtZSBdIDoKCgkJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKCQkJdGhpc1swXSA9PSBkb2N1bWVudCA/CgkJCQkvLyBFaXRoZXIgc2Nyb2xsW1dpZHRoL0hlaWdodF0gb3Igb2Zmc2V0W1dpZHRoL0hlaWdodF0sIHdoaWNoZXZlciBpcyBncmVhdGVyCgkJCQlNYXRoLm1heCgKCQkJCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIgKyBuYW1lXSwKCQkJCQlkb2N1bWVudC5ib2R5WyJzY3JvbGwiICsgbmFtZV0sIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsic2Nyb2xsIiArIG5hbWVdLAoJCQkJCWRvY3VtZW50LmJvZHlbIm9mZnNldCIgKyBuYW1lXSwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiICsgbmFtZV0KCQkJCSkgOgoKCQkJCS8vIEdldCBvciBzZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50CgkJCQlzaXplID09PSB1bmRlZmluZWQgPwoJCQkJCS8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCQkodGhpcy5sZW5ndGggPyBqUXVlcnkuY3NzKCB0aGlzWzBdLCB0eXBlICkgOiBudWxsKSA6CgoJCQkJCS8vIFNldCB0aGUgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50IChkZWZhdWx0IHRvIHBpeGVscyBpZiB2YWx1ZSBpcyB1bml0bGVzcykKCQkJCQl0aGlzLmNzcyggdHlwZSwgdHlwZW9mIHNpemUgPT09ICJzdHJpbmciID8gc2l6ZSA6IHNpemUgKyAicHgiICk7Cgl9OwoKfSk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/plugins/nicedit/js/nicEdit.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogTmljRWRpdCAtIE1pY3JvIElubGluZSBXWVNJV1lHCiAqIENvcHlyaWdodCAyMDA3LTIwMDggQnJpYW4gS2lyY2hvZmYKICoKICogTmljRWRpdCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1JVCBsaWNlbnNlCiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHZpc2l0IGh0dHA6Ly9uaWNlZGl0LmNvbS8KICogRG8gbm90IHJlbW92ZSB0aGlzIGNvcHlyaWdodCBtZXNzYWdlCiAqLw0KdmFyIGJrRXh0ZW5kID0gZnVuY3Rpb24oKXsKCXZhciBhcmdzID0gYXJndW1lbnRzOwoJaWYgKGFyZ3MubGVuZ3RoID09IDEpIGFyZ3MgPSBbdGhpcywgYXJnc1swXV07Cglmb3IgKHZhciBwcm9wIGluIGFyZ3NbMV0pIGFyZ3NbMF1bcHJvcF0gPSBhcmdzWzFdW3Byb3BdOwoJcmV0dXJuIGFyZ3NbMF07Cn07CmZ1bmN0aW9uIGJrQ2xhc3MoKSB7IH0KYmtDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0ID0gZnVuY3Rpb24oKSB7fTsKYmtDbGFzcy5leHRlbmQgPSBmdW5jdGlvbihkZWYpIHsKICB2YXIgY2xhc3NEZWYgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKGFyZ3VtZW50c1swXSAhPT0gYmtDbGFzcykgeyByZXR1cm4gdGhpcy5jb25zdHJ1Y3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfQogIH07CiAgdmFyIHByb3RvID0gbmV3IHRoaXMoYmtDbGFzcyk7CiAgYmtFeHRlbmQocHJvdG8sZGVmKTsKICBjbGFzc0RlZi5wcm90b3R5cGUgPSBwcm90bzsKICBjbGFzc0RlZi5leHRlbmQgPSB0aGlzLmV4dGVuZDsgICAgICAKICByZXR1cm4gY2xhc3NEZWY7Cn07Cgp2YXIgYmtFbGVtZW50ID0gYmtDbGFzcy5leHRlbmQoewoJY29uc3RydWN0IDogZnVuY3Rpb24oZWxtLGQpIHsKCQlpZih0eXBlb2YoZWxtKSA9PSAic3RyaW5nIikgewoJCQllbG0gPSAoZCB8fCBkb2N1bWVudCkuY3JlYXRlRWxlbWVudChlbG0pOwoJCX0KCQllbG0gPSAkQksoZWxtKTsKCQlyZXR1cm4gZWxtOwoJfSwKCQoJYXBwZW5kVG8gOiBmdW5jdGlvbihlbG0pIHsKCQllbG0uYXBwZW5kQ2hpbGQodGhpcyk7CQoJCXJldHVybiB0aGlzOwoJfSwKCQoJYXBwZW5kQmVmb3JlIDogZnVuY3Rpb24oZWxtKSB7CgkJZWxtLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsZWxtKTsJCgkJcmV0dXJuIHRoaXM7Cgl9LAoJCglhZGRFdmVudCA6IGZ1bmN0aW9uKHR5cGUsIGZuKSB7CgkJYmtMaWIuYWRkRXZlbnQodGhpcyx0eXBlLGZuKTsKCQlyZXR1cm4gdGhpczsJCgl9LAoJCglzZXRDb250ZW50IDogZnVuY3Rpb24oYykgewoJCXRoaXMuaW5uZXJIVE1MID0gYzsKCQlyZXR1cm4gdGhpczsKCX0sCgkKCXBvcyA6IGZ1bmN0aW9uKCkgewoJCXZhciBjdXJsZWZ0ID0gY3VydG9wID0gMDsKCQl2YXIgbyA9IG9iaiA9IHRoaXM7CgkJaWYgKG9iai5vZmZzZXRQYXJlbnQpIHsKCQkJZG8gewoJCQkJY3VybGVmdCArPSBvYmoub2Zmc2V0TGVmdDsKCQkJCWN1cnRvcCArPSBvYmoub2Zmc2V0VG9wOwoJCQl9IHdoaWxlIChvYmogPSBvYmoub2Zmc2V0UGFyZW50KTsKCQl9CgkJdmFyIGIgPSAoIXdpbmRvdy5vcGVyYSkgPyBwYXJzZUludCh0aGlzLmdldFN0eWxlKCdib3JkZXItd2lkdGgnKSB8fCB0aGlzLnN0eWxlLmJvcmRlcikgfHwgMCA6IDA7CgkJcmV0dXJuIFtjdXJsZWZ0K2IsY3VydG9wK2IrdGhpcy5vZmZzZXRIZWlnaHRdOwoJfSwKCQoJbm9TZWxlY3QgOiBmdW5jdGlvbigpIHsKCQlia0xpYi5ub1NlbGVjdCh0aGlzKTsKCQlyZXR1cm4gdGhpczsKCX0sCgkKCXBhcmVudFRhZyA6IGZ1bmN0aW9uKHQpIHsKCQl2YXIgZWxtID0gdGhpczsKCQkgZG8gewoJCQlpZihlbG0gJiYgZWxtLm5vZGVOYW1lICYmIGVsbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09IHQpIHsKCQkJCXJldHVybiBlbG07CgkJCX0KCQkJZWxtID0gZWxtLnBhcmVudE5vZGU7CgkJfSB3aGlsZShlbG0pOwoJCXJldHVybiBmYWxzZTsKCX0sCgkKCWhhc0NsYXNzIDogZnVuY3Rpb24oY2xzKSB7CgkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lLm1hdGNoKG5ldyBSZWdFeHAoJyhcXHN8XiluaWNFZGl0LScrY2xzKycoXFxzfCQpJykpOwoJfSwKCQoJYWRkQ2xhc3MgOiBmdW5jdGlvbihjbHMpIHsKCQlpZiAoIXRoaXMuaGFzQ2xhc3MoY2xzKSkgeyB0aGlzLmNsYXNzTmFtZSArPSAiIG5pY0VkaXQtIitjbHMgfTsKCQlyZXR1cm4gdGhpczsKCX0sCgkKCXJlbW92ZUNsYXNzIDogZnVuY3Rpb24oY2xzKSB7CgkJaWYgKHRoaXMuaGFzQ2xhc3MoY2xzKSkgewoJCQl0aGlzLmNsYXNzTmFtZSA9IHRoaXMuY2xhc3NOYW1lLnJlcGxhY2UobmV3IFJlZ0V4cCgnKFxcc3xeKW5pY0VkaXQtJytjbHMrJyhcXHN8JCknKSwnICcpOwoJCX0KCQlyZXR1cm4gdGhpczsKCX0sCgoJc2V0U3R5bGUgOiBmdW5jdGlvbihzdCkgewoJCXZhciBlbG1TdHlsZSA9IHRoaXMuc3R5bGU7CgkJZm9yKHZhciBpdG0gaW4gc3QpIHsKCQkJc3dpdGNoKGl0bSkgewoJCQkJY2FzZSAnZmxvYXQnOgoJCQkJCWVsbVN0eWxlWydjc3NGbG9hdCddID0gZWxtU3R5bGVbJ3N0eWxlRmxvYXQnXSA9IHN0W2l0bV07CgkJCQkJYnJlYWs7CgkJCQljYXNlICdvcGFjaXR5JzoKCQkJCQllbG1TdHlsZS5vcGFjaXR5ID0gc3RbaXRtXTsKCQkJCQllbG1TdHlsZS5maWx0ZXIgPSAiYWxwaGEob3BhY2l0eT0iICsgTWF0aC5yb3VuZChzdFtpdG1dKjEwMCkgKyAiKSI7IAoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnY2xhc3NOYW1lJzoKCQkJCQl0aGlzLmNsYXNzTmFtZSA9IHN0W2l0bV07CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCS8vaWYoZG9jdW1lbnQuY29tcGF0TW9kZSB8fCBpdG0gIT0gImN1cnNvciIpIHsgLy8gTmFzdHkgV29ya2Fyb3VuZCBmb3IgSUUgNS41CgkJCQkJCWVsbVN0eWxlW2l0bV0gPSBzdFtpdG1dOwoJCQkJCS8vfQkJCgkJCX0KCQl9CgkJcmV0dXJuIHRoaXM7Cgl9LAoJCglnZXRTdHlsZSA6IGZ1bmN0aW9uKCBjc3NSdWxlLCBkICkgewoJCXZhciBkb2MgPSAoIWQpID8gZG9jdW1lbnQuZGVmYXVsdFZpZXcgOiBkOyAKCQlpZih0aGlzLm5vZGVUeXBlID09IDEpCgkJcmV0dXJuIChkb2MgJiYgZG9jLmdldENvbXB1dGVkU3R5bGUpID8gZG9jLmdldENvbXB1dGVkU3R5bGUoIHRoaXMsIG51bGwgKS5nZXRQcm9wZXJ0eVZhbHVlKGNzc1J1bGUpIDogdGhpcy5jdXJyZW50U3R5bGVbIGJrTGliLmNhbWVsaXplKGNzc1J1bGUpIF07Cgl9LAoJCglyZW1vdmUgOiBmdW5jdGlvbigpIHsKCQl0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyk7CgkJcmV0dXJuIHRoaXM7CQoJfSwKCQoJc2V0QXR0cmlidXRlcyA6IGZ1bmN0aW9uKGF0KSB7CgkJZm9yKHZhciBpdG0gaW4gYXQpIHsKCQkJdGhpc1tpdG1dID0gYXRbaXRtXTsKCQl9CgkJcmV0dXJuIHRoaXM7Cgl9Cn0pOwoKdmFyIGJrTGliID0gewoJaXNNU0lFIDogKG5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoIk1TSUUiKSAhPSAtMSksCgkKCWFkZEV2ZW50IDogZnVuY3Rpb24ob2JqLCB0eXBlLCBmbikgewoJCShvYmouYWRkRXZlbnRMaXN0ZW5lcikgPyBvYmouYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZm4sIGZhbHNlICkgOiBvYmouYXR0YWNoRXZlbnQoIm9uIit0eXBlLCBmbik7CQoJfSwKCQoJdG9BcnJheSA6IGZ1bmN0aW9uKGl0ZXJhYmxlKSB7CgkJdmFyIGxlbmd0aCA9IGl0ZXJhYmxlLmxlbmd0aCwgcmVzdWx0cyA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgCXdoaWxlIChsZW5ndGgtLSkgeyByZXN1bHRzW2xlbmd0aF0gPSBpdGVyYWJsZVtsZW5ndGhdIH07CiAgICAJcmV0dXJuIHJlc3VsdHM7CQoJfSwKCQoJbm9TZWxlY3QgOiBmdW5jdGlvbihlbGVtZW50KSB7CgkJaWYoZWxlbWVudC5zZXRBdHRyaWJ1dGUgJiYgZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9ICdpbnB1dCcgJiYgZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9ICd0ZXh0YXJlYScpIHsKCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3Vuc2VsZWN0YWJsZScsJ29uJyk7CgkJfQoJCWZvcih2YXIgaT0wO2k8ZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aDtpKyspIHsKCQkJYmtMaWIubm9TZWxlY3QoZWxlbWVudC5jaGlsZE5vZGVzW2ldKTsKCQl9Cgl9LAoJY2FtZWxpemUgOiBmdW5jdGlvbihzKSB7CgkJcmV0dXJuIHMucmVwbGFjZSgvXC0oLikvZywgZnVuY3Rpb24obSwgbCl7cmV0dXJuIGwudG9VcHBlckNhc2UoKX0pOwoJfSwKCWluQXJyYXkgOiBmdW5jdGlvbihhcnIsaXRlbSkgewoJICAgIHJldHVybiAoYmtMaWIuc2VhcmNoKGFycixpdGVtKSAhPSBudWxsKTsKCX0sCglzZWFyY2ggOiBmdW5jdGlvbihhcnIsaXRtKSB7CgkJZm9yKHZhciBpPTA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKCQkJaWYoYXJyW2ldID09IGl0bSkKCQkJCXJldHVybiBpOwoJCX0KCQlyZXR1cm4gbnVsbDsJCgl9LAoJY2FuY2VsRXZlbnQgOiBmdW5jdGlvbihlKSB7CgkJZSA9IGUgfHwgd2luZG93LmV2ZW50OwoJCWlmKGUucHJldmVudERlZmF1bHQgJiYgZS5zdG9wUHJvcGFnYXRpb24pIHsKCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9LAoJZG9tTG9hZCA6IFtdLAoJZG9tTG9hZGVkIDogZnVuY3Rpb24oKSB7CgkJaWYgKGFyZ3VtZW50cy5jYWxsZWUuZG9uZSkgcmV0dXJuOwoJCWFyZ3VtZW50cy5jYWxsZWUuZG9uZSA9IHRydWU7CgkJZm9yIChpID0gMDtpIDwgYmtMaWIuZG9tTG9hZC5sZW5ndGg7aSsrKSBia0xpYi5kb21Mb2FkW2ldKCk7Cgl9LAoJb25Eb21Mb2FkZWQgOiBmdW5jdGlvbihmaXJlVGhpcykgewoJCXRoaXMuZG9tTG9hZC5wdXNoKGZpcmVUaGlzKTsKCQlpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgewoJCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgYmtMaWIuZG9tTG9hZGVkLCBudWxsKTsKCQl9IGVsc2UgaWYoYmtMaWIuaXNNU0lFKSB7CgkJCWRvY3VtZW50LndyaXRlKCI8c3R5bGU+Lm5pY0VkaXQtbWFpbiBwIHsgbWFyZ2luOiAwOyB9PC9zdHlsZT48c2NyIisiaXB0IGlkPV9faWVfb25sb2FkIGRlZmVyICIgKyAoKGxvY2F0aW9uLnByb3RvY29sID09ICJodHRwczoiKSA/ICJzcmM9J2phdmFzY3JpcHQ6dm9pZCgwKSciIDogInNyYz0vLzAiKSArICI+PFwvc2NyIisiaXB0PiIpOwoJCQkkQksoIl9faWVfb25sb2FkIikub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CgkJCSAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09ICJjb21wbGV0ZSIpe2JrTGliLmRvbUxvYWRlZCgpO30KCQkJfTsKCQl9CgkgICAgd2luZG93Lm9ubG9hZCA9IGJrTGliLmRvbUxvYWRlZDsKCX0KfTsKCmZ1bmN0aW9uICRCSyhlbG0pIHsKCWlmKHR5cGVvZihlbG0pID09ICJzdHJpbmciKSB7CgkJZWxtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxtKTsKCX0KCXJldHVybiAoZWxtICYmICFlbG0uYXBwZW5kVG8pID8gYmtFeHRlbmQoZWxtLGJrRWxlbWVudC5wcm90b3R5cGUpIDogZWxtOwp9Cgp2YXIgYmtFdmVudCA9IHsKCWFkZEV2ZW50IDogZnVuY3Rpb24oZXZUeXBlLCBldkZ1bmMpIHsKCQlpZihldkZ1bmMpIHsKCQkJdGhpcy5ldmVudExpc3QgPSB0aGlzLmV2ZW50TGlzdCB8fCB7fTsKCQkJdGhpcy5ldmVudExpc3RbZXZUeXBlXSA9IHRoaXMuZXZlbnRMaXN0W2V2VHlwZV0gfHwgW107CgkJCXRoaXMuZXZlbnRMaXN0W2V2VHlwZV0ucHVzaChldkZ1bmMpOwoJCX0KCQlyZXR1cm4gdGhpczsKCX0sCglmaXJlRXZlbnQgOiBmdW5jdGlvbigpIHsKCQl2YXIgYXJncyA9IGJrTGliLnRvQXJyYXkoYXJndW1lbnRzKSwgZXZUeXBlID0gYXJncy5zaGlmdCgpOwoJCWlmKHRoaXMuZXZlbnRMaXN0ICYmIHRoaXMuZXZlbnRMaXN0W2V2VHlwZV0pIHsKCQkJZm9yKHZhciBpPTA7aTx0aGlzLmV2ZW50TGlzdFtldlR5cGVdLmxlbmd0aDtpKyspIHsKCQkJCXRoaXMuZXZlbnRMaXN0W2V2VHlwZV1baV0uYXBwbHkodGhpcyxhcmdzKTsKCQkJfQoJCX0KCX0JCn07CgpmdW5jdGlvbiBfXyhzKSB7CglyZXR1cm4gczsKfQoKRnVuY3Rpb24ucHJvdG90eXBlLmNsb3N1cmUgPSBmdW5jdGlvbigpIHsKICB2YXIgX19tZXRob2QgPSB0aGlzLCBhcmdzID0gYmtMaWIudG9BcnJheShhcmd1bWVudHMpLCBvYmogPSBhcmdzLnNoaWZ0KCk7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgeyBpZih0eXBlb2YoYmtMaWIpICE9ICd1bmRlZmluZWQnKSB7IHJldHVybiBfX21ldGhvZC5hcHBseShvYmosYXJncy5jb25jYXQoYmtMaWIudG9BcnJheShhcmd1bWVudHMpKSk7IH0gfTsKfQoJCkZ1bmN0aW9uLnByb3RvdHlwZS5jbG9zdXJlTGlzdGVuZXIgPSBmdW5jdGlvbigpIHsKICAJdmFyIF9fbWV0aG9kID0gdGhpcywgYXJncyA9IGJrTGliLnRvQXJyYXkoYXJndW1lbnRzKSwgb2JqZWN0ID0gYXJncy5zaGlmdCgpOyAKICAJcmV0dXJuIGZ1bmN0aW9uKGUpIHsgCiAgCWUgPSBlIHx8IHdpbmRvdy5ldmVudDsKICAJaWYoZS50YXJnZXQpIHsgdmFyIHRhcmdldCA9IGUudGFyZ2V0OyB9IGVsc2UgeyB2YXIgdGFyZ2V0ID0gIGUuc3JjRWxlbWVudCB9OwoJICAJcmV0dXJuIF9fbWV0aG9kLmFwcGx5KG9iamVjdCwgW2UsdGFyZ2V0XS5jb25jYXQoYXJncykgKTsgCgl9Owp9CQkKCg0KLyogU1RBUlQgQ09ORklHICovCg0KdmFyIG5pY0VkaXRvckNvbmZpZyA9IGJrQ2xhc3MuZXh0ZW5kKHsKCWJ1dHRvbnMgOiB7CgkJJ2JvbGQnIDoge25hbWUgOiBfXygnQ2xpY2sgdG8gQm9sZCcpLCBjb21tYW5kIDogJ0JvbGQnLCB0YWdzIDogWydCJywnU1RST05HJ10sIGNzcyA6IHsnZm9udC13ZWlnaHQnIDogJ2JvbGQnfSwga2V5IDogJ2InfSwKCQknaXRhbGljJyA6IHtuYW1lIDogX18oJ0NsaWNrIHRvIEl0YWxpYycpLCBjb21tYW5kIDogJ0l0YWxpYycsIHRhZ3MgOiBbJ0VNJywnSSddLCBjc3MgOiB7J2ZvbnQtc3R5bGUnIDogJ2l0YWxpYyd9LCBrZXkgOiAnaSd9LAoJCSd1bmRlcmxpbmUnIDoge25hbWUgOiBfXygnQ2xpY2sgdG8gVW5kZXJsaW5lJyksIGNvbW1hbmQgOiAnVW5kZXJsaW5lJywgdGFncyA6IFsnVSddLCBjc3MgOiB7J3RleHQtZGVjb3JhdGlvbicgOiAndW5kZXJsaW5lJ30sIGtleSA6ICd1J30sCgkJJ2xlZnQnIDoge25hbWUgOiBfXygnTGVmdCBBbGlnbicpLCBjb21tYW5kIDogJ2p1c3RpZnlsZWZ0Jywgbm9BY3RpdmUgOiB0cnVlfSwKCQknY2VudGVyJyA6IHtuYW1lIDogX18oJ0NlbnRlciBBbGlnbicpLCBjb21tYW5kIDogJ2p1c3RpZnljZW50ZXInLCBub0FjdGl2ZSA6IHRydWV9LAoJCSdyaWdodCcgOiB7bmFtZSA6IF9fKCdSaWdodCBBbGlnbicpLCBjb21tYW5kIDogJ2p1c3RpZnlyaWdodCcsIG5vQWN0aXZlIDogdHJ1ZX0sCgkJJ2p1c3RpZnknIDoge25hbWUgOiBfXygnSnVzdGlmeSBBbGlnbicpLCBjb21tYW5kIDogJ2p1c3RpZnlmdWxsJywgbm9BY3RpdmUgOiB0cnVlfSwKCQknb2wnIDoge25hbWUgOiBfXygnSW5zZXJ0IE9yZGVyZWQgTGlzdCcpLCBjb21tYW5kIDogJ2luc2VydG9yZGVyZWRsaXN0JywgdGFncyA6IFsnT0wnXX0sCgkJJ3VsJyA6IAl7bmFtZSA6IF9fKCdJbnNlcnQgVW5vcmRlcmVkIExpc3QnKSwgY29tbWFuZCA6ICdpbnNlcnR1bm9yZGVyZWRsaXN0JywgdGFncyA6IFsnVUwnXX0sCgkJJ3N1YnNjcmlwdCcgOiB7bmFtZSA6IF9fKCdDbGljayB0byBTdWJzY3JpcHQnKSwgY29tbWFuZCA6ICdzdWJzY3JpcHQnLCB0YWdzIDogWydTVUInXX0sCgkJJ3N1cGVyc2NyaXB0JyA6IHtuYW1lIDogX18oJ0NsaWNrIHRvIFN1cGVyc2NyaXB0JyksIGNvbW1hbmQgOiAnc3VwZXJzY3JpcHQnLCB0YWdzIDogWydTVVAnXX0sCgkJJ3N0cmlrZXRocm91Z2gnIDoge25hbWUgOiBfXygnQ2xpY2sgdG8gU3RyaWtlIFRocm91Z2gnKSwgY29tbWFuZCA6ICdzdHJpa2VUaHJvdWdoJywgY3NzIDogeyd0ZXh0LWRlY29yYXRpb24nIDogJ2xpbmUtdGhyb3VnaCd9fSwKCQkncmVtb3ZlZm9ybWF0JyA6IHtuYW1lIDogX18oJ1JlbW92ZSBGb3JtYXR0aW5nJyksIGNvbW1hbmQgOiAncmVtb3ZlZm9ybWF0Jywgbm9BY3RpdmUgOiB0cnVlfSwKCQknaW5kZW50JyA6IHtuYW1lIDogX18oJ0luZGVudCBUZXh0JyksIGNvbW1hbmQgOiAnaW5kZW50Jywgbm9BY3RpdmUgOiB0cnVlfSwKCQknb3V0ZGVudCcgOiB7bmFtZSA6IF9fKCdSZW1vdmUgSW5kZW50JyksIGNvbW1hbmQgOiAnb3V0ZGVudCcsIG5vQWN0aXZlIDogdHJ1ZX0sCgkJJ2hyJyA6IHtuYW1lIDogX18oJ0hvcml6b250YWwgUnVsZScpLCBjb21tYW5kIDogJ2luc2VydEhvcml6b250YWxSdWxlJywgbm9BY3RpdmUgOiB0cnVlfQoJfSwKCWljb25zUGF0aCA6ICcuLi9uaWNFZGl0b3JJY29ucy5naWYnLAoJYnV0dG9uTGlzdCA6IFsnc2F2ZScsJ2JvbGQnLCdpdGFsaWMnLCd1bmRlcmxpbmUnLCdsZWZ0JywnY2VudGVyJywncmlnaHQnLCdqdXN0aWZ5Jywnb2wnLCd1bCcsJ2ZvbnRTaXplJywnZm9udEZhbWlseScsJ2ZvbnRGb3JtYXQnLCdpbmRlbnQnLCdvdXRkZW50JywnaW1hZ2UnLCd1cGxvYWQnLCdsaW5rJywndW5saW5rJywnZm9yZWNvbG9yJywnYmdjb2xvciddLAoJaWNvbkxpc3QgOiB7InhodG1sIjoxLCJiZ2NvbG9yIjoyLCJmb3JlY29sb3IiOjMsImJvbGQiOjQsImNlbnRlciI6NSwiaHIiOjYsImluZGVudCI6NywiaXRhbGljIjo4LCJqdXN0aWZ5Ijo5LCJsZWZ0IjoxMCwib2wiOjExLCJvdXRkZW50IjoxMiwicmVtb3ZlZm9ybWF0IjoxMywicmlnaHQiOjE0LCJzYXZlIjoyNSwic3RyaWtldGhyb3VnaCI6MTYsInN1YnNjcmlwdCI6MTcsInN1cGVyc2NyaXB0IjoxOCwidWwiOjE5LCJ1bmRlcmxpbmUiOjIwLCJpbWFnZSI6MjEsImxpbmsiOjIyLCJ1bmxpbmsiOjIzLCJjbG9zZSI6MjQsImFycm93IjoyNn0KCQp9KTsKLyogRU5EIENPTkZJRyAqLw0KCgp2YXIgbmljRWRpdG9ycyA9IHsKCW5pY1BsdWdpbnMgOiBbXSwKCWVkaXRvcnMgOiBbXSwKCQoJcmVnaXN0ZXJQbHVnaW4gOiBmdW5jdGlvbihwbHVnaW4sb3B0aW9ucykgewoJCXRoaXMubmljUGx1Z2lucy5wdXNoKHtwIDogcGx1Z2luLCBvIDogb3B0aW9uc30pOwoJfSwKCglhbGxUZXh0QXJlYXMgOiBmdW5jdGlvbihuaWNPcHRpb25zKSB7CgkJdmFyIHRleHRhcmVhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZXh0YXJlYSIpOwoJCWZvcih2YXIgaT0wO2k8dGV4dGFyZWFzLmxlbmd0aDtpKyspIHsKCQkJbmljRWRpdG9ycy5lZGl0b3JzLnB1c2gobmV3IG5pY0VkaXRvcihuaWNPcHRpb25zKS5wYW5lbEluc3RhbmNlKHRleHRhcmVhc1tpXSkpOwoJCX0KCQlyZXR1cm4gbmljRWRpdG9ycy5lZGl0b3JzOwoJfSwKCQoJZmluZEVkaXRvciA6IGZ1bmN0aW9uKGUpIHsKCQl2YXIgZWRpdG9ycyA9IG5pY0VkaXRvcnMuZWRpdG9yczsKCQlmb3IodmFyIGk9MDtpPGVkaXRvcnMubGVuZ3RoO2krKykgewoJCQlpZihlZGl0b3JzW2ldLmluc3RhbmNlQnlJZChlKSkgewoJCQkJcmV0dXJuIGVkaXRvcnNbaV0uaW5zdGFuY2VCeUlkKGUpOwoJCQl9CgkJfQoJfQp9OwoKCnZhciBuaWNFZGl0b3IgPSBia0NsYXNzLmV4dGVuZCh7Cgljb25zdHJ1Y3QgOiBmdW5jdGlvbihvKSB7CgkJdGhpcy5vcHRpb25zID0gbmV3IG5pY0VkaXRvckNvbmZpZygpOwoJCWJrRXh0ZW5kKHRoaXMub3B0aW9ucyxvKTsKCQl0aGlzLm5pY0luc3RhbmNlcyA9IG5ldyBBcnJheSgpOwoJCXRoaXMubG9hZGVkUGx1Z2lucyA9IG5ldyBBcnJheSgpOwoJCQoJCXZhciBwbHVnaW5zID0gbmljRWRpdG9ycy5uaWNQbHVnaW5zOwoJCWZvcih2YXIgaT0wO2k8cGx1Z2lucy5sZW5ndGg7aSsrKSB7CgkJCXRoaXMubG9hZGVkUGx1Z2lucy5wdXNoKG5ldyBwbHVnaW5zW2ldLnAodGhpcyxwbHVnaW5zW2ldLm8pKTsKCQl9CgkJbmljRWRpdG9ycy5lZGl0b3JzLnB1c2godGhpcyk7CgkJYmtMaWIuYWRkRXZlbnQoZG9jdW1lbnQuYm9keSwnbW91c2Vkb3duJywgdGhpcy5zZWxlY3RDaGVjay5jbG9zdXJlTGlzdGVuZXIodGhpcykgKTsKCX0sCgkKCXBhbmVsSW5zdGFuY2UgOiBmdW5jdGlvbihlLG8pIHsKCQllID0gdGhpcy5jaGVja1JlcGxhY2UoJEJLKGUpKTsKCQl2YXIgcGFuZWxFbG0gPSBuZXcgYmtFbGVtZW50KCdESVYnKS5zZXRTdHlsZSh7d2lkdGggOiAocGFyc2VJbnQoZS5nZXRTdHlsZSgnd2lkdGgnKSkgfHwgZS5jbGllbnRXaWR0aCkrJ3B4J30pLmFwcGVuZEJlZm9yZShlKTsKCQl0aGlzLnNldFBhbmVsKHBhbmVsRWxtKTsKCQlyZXR1cm4gdGhpcy5hZGRJbnN0YW5jZShlLG8pOwkKCX0sCgoJY2hlY2tSZXBsYWNlIDogZnVuY3Rpb24oZSkgewoJCXZhciByID0gbmljRWRpdG9ycy5maW5kRWRpdG9yKGUpOwoJCWlmKHIpIHsKCQkJci5yZW1vdmVJbnN0YW5jZShlKTsKCQkJci5yZW1vdmVQYW5lbCgpOwoJCX0KCQlyZXR1cm4gZTsKCX0sCgoJYWRkSW5zdGFuY2UgOiBmdW5jdGlvbihlLG8pIHsKCQllID0gdGhpcy5jaGVja1JlcGxhY2UoJEJLKGUpKTsKCQlpZiggZS5jb250ZW50RWRpdGFibGUgfHwgISF3aW5kb3cub3BlcmEgKSB7CgkJCXZhciBuZXdJbnN0YW5jZSA9IG5ldyBuaWNFZGl0b3JJbnN0YW5jZShlLG8sdGhpcyk7CgkJfSBlbHNlIHsKCQkJdmFyIG5ld0luc3RhbmNlID0gbmV3IG5pY0VkaXRvcklGcmFtZUluc3RhbmNlKGUsbyx0aGlzKTsKCQl9CgkJdGhpcy5uaWNJbnN0YW5jZXMucHVzaChuZXdJbnN0YW5jZSk7CgkJcmV0dXJuIHRoaXM7Cgl9LAoJCglyZW1vdmVJbnN0YW5jZSA6IGZ1bmN0aW9uKGUpIHsKCQllID0gJEJLKGUpOwoJCXZhciBpbnN0YW5jZXMgPSB0aGlzLm5pY0luc3RhbmNlczsKCQlmb3IodmFyIGk9MDtpPGluc3RhbmNlcy5sZW5ndGg7aSsrKSB7CQoJCQlpZihpbnN0YW5jZXNbaV0uZSA9PSBlKSB7CgkJCQlpbnN0YW5jZXNbaV0ucmVtb3ZlKCk7CgkJCQl0aGlzLm5pY0luc3RhbmNlcy5zcGxpY2UoaSwxKTsKCQkJfQoJCX0KCX0sCgoJcmVtb3ZlUGFuZWwgOiBmdW5jdGlvbihlKSB7CgkJaWYodGhpcy5uaWNQYW5lbCkgewoJCQl0aGlzLm5pY1BhbmVsLnJlbW92ZSgpOwoJCQl0aGlzLm5pY1BhbmVsID0gbnVsbDsKCQl9CQoJfSwKCglpbnN0YW5jZUJ5SWQgOiBmdW5jdGlvbihlKSB7CgkJZSA9ICRCSyhlKTsKCQl2YXIgaW5zdGFuY2VzID0gdGhpcy5uaWNJbnN0YW5jZXM7CgkJZm9yKHZhciBpPTA7aTxpbnN0YW5jZXMubGVuZ3RoO2krKykgewoJCQlpZihpbnN0YW5jZXNbaV0uZSA9PSBlKSB7CgkJCQlyZXR1cm4gaW5zdGFuY2VzW2ldOwoJCQl9CgkJfQkKCX0sCgoJc2V0UGFuZWwgOiBmdW5jdGlvbihlKSB7CgkJdGhpcy5uaWNQYW5lbCA9IG5ldyBuaWNFZGl0b3JQYW5lbCgkQksoZSksdGhpcy5vcHRpb25zLHRoaXMpOwoJCXRoaXMuZmlyZUV2ZW50KCdwYW5lbCcsdGhpcy5uaWNQYW5lbCk7CgkJcmV0dXJuIHRoaXM7Cgl9LAoJCgluaWNDb21tYW5kIDogZnVuY3Rpb24oY21kLGFyZ3MpIHsJCgkJaWYodGhpcy5zZWxlY3RlZEluc3RhbmNlKSB7CgkJCXRoaXMuc2VsZWN0ZWRJbnN0YW5jZS5uaWNDb21tYW5kKGNtZCxhcmdzKTsKCQl9Cgl9LAoJCglnZXRJY29uIDogZnVuY3Rpb24oaWNvbk5hbWUsb3B0aW9ucykgewoJCXZhciBpY29uID0gdGhpcy5vcHRpb25zLmljb25MaXN0W2ljb25OYW1lXTsKCQl2YXIgZmlsZSA9IChvcHRpb25zLmljb25GaWxlcykgPyBvcHRpb25zLmljb25GaWxlc1tpY29uTmFtZV0gOiAnJzsKCQlyZXR1cm4ge2JhY2tncm91bmRJbWFnZSA6ICJ1cmwoJyIrKChpY29uKSA/IHRoaXMub3B0aW9ucy5pY29uc1BhdGggOiBmaWxlKSsiJykiLCBiYWNrZ3JvdW5kUG9zaXRpb24gOiAoKGljb24pID8gKChpY29uLTEpKi0xOCkgOiAwKSsncHggMHB4J307CQoJfSwKCQkKCXNlbGVjdENoZWNrIDogZnVuY3Rpb24oZSx0KSB7CgkJdmFyIGZvdW5kID0gZmFsc2U7CgkJZG97CgkJCWlmKHQuY2xhc3NOYW1lICYmIHQuY2xhc3NOYW1lLmluZGV4T2YoJ25pY0VkaXQnKSAhPSAtMSkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfSB3aGlsZSh0ID0gdC5wYXJlbnROb2RlKTsKCQl0aGlzLmZpcmVFdmVudCgnYmx1cicsdGhpcy5zZWxlY3RlZEluc3RhbmNlLHQpOwoJCXRoaXMubGFzdFNlbGVjdGVkSW5zdGFuY2UgPSB0aGlzLnNlbGVjdGVkSW5zdGFuY2U7CgkJdGhpcy5zZWxlY3RlZEluc3RhbmNlID0gbnVsbDsKCQlyZXR1cm4gZmFsc2U7Cgl9CgkKfSk7Cm5pY0VkaXRvciA9IG5pY0VkaXRvci5leHRlbmQoYmtFdmVudCk7DQoKIAp2YXIgbmljRWRpdG9ySW5zdGFuY2UgPSBia0NsYXNzLmV4dGVuZCh7Cglpc1NlbGVjdGVkIDogZmFsc2UsCgkKCWNvbnN0cnVjdCA6IGZ1bmN0aW9uKGUsb3B0aW9ucyxuaWNFZGl0b3IpIHsKCQl0aGlzLm5lID0gbmljRWRpdG9yOwoJCXRoaXMuZWxtID0gdGhpcy5lID0gZTsKCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCQoJCW5ld1ggPSBwYXJzZUludChlLmdldFN0eWxlKCd3aWR0aCcpKSB8fCBlLmNsaWVudFdpZHRoOwoJCW5ld1kgPSBwYXJzZUludChlLmdldFN0eWxlKCdoZWlnaHQnKSkgfHwgZS5jbGllbnRIZWlnaHQ7CgkJdGhpcy5pbml0aWFsSGVpZ2h0ID0gbmV3WS04OwoJCQoJCXZhciBpc1RleHRhcmVhID0gKGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAidGV4dGFyZWEiKTsKCQlpZihpc1RleHRhcmVhIHx8IHRoaXMub3B0aW9ucy5oYXNQYW5lbCkgewoJCQl2YXIgaWU3cyA9IChia0xpYi5pc01TSUUgJiYgISgodHlwZW9mIGRvY3VtZW50LmJvZHkuc3R5bGUubWF4SGVpZ2h0ICE9ICJ1bmRlZmluZWQiKSAmJiBkb2N1bWVudC5jb21wYXRNb2RlID09ICJDU1MxQ29tcGF0IikpCgkJCXZhciBzID0ge3dpZHRoOiBuZXdYKydweCcsIGJvcmRlciA6ICcxcHggc29saWQgI2NjYycsIGJvcmRlclRvcCA6IDAsIG92ZXJmbG93WSA6ICdhdXRvJywgb3ZlcmZsb3dYOiAnaGlkZGVuJyB9OwoJCQlzWyhpZTdzKSA/ICdoZWlnaHQnIDogJ21heEhlaWdodCddID0gKHRoaXMubmUub3B0aW9ucy5tYXhIZWlnaHQpID8gdGhpcy5uZS5vcHRpb25zLm1heEhlaWdodCsncHgnIDogbnVsbDsKCQkJdGhpcy5lZGl0b3JDb250YWluID0gbmV3IGJrRWxlbWVudCgnRElWJykuc2V0U3R5bGUocykuYXBwZW5kQmVmb3JlKGUpOwoJCQl2YXIgZWRpdG9yRWxtID0gbmV3IGJrRWxlbWVudCgnRElWJykuc2V0U3R5bGUoe3dpZHRoIDogKG5ld1gtOCkrJ3B4JywgbWFyZ2luOiAnNHB4JywgbWluSGVpZ2h0IDogbmV3WSsncHgnfSkuYWRkQ2xhc3MoJ21haW4nKS5hcHBlbmRUbyh0aGlzLmVkaXRvckNvbnRhaW4pOwoKCQkJZS5zZXRTdHlsZSh7ZGlzcGxheSA6ICdub25lJ30pOwoJCQkJCgkJCWVkaXRvckVsbS5pbm5lckhUTUwgPSBlLmlubmVySFRNTDsJCQoJCQlpZihpc1RleHRhcmVhKSB7CgkJCQllZGl0b3JFbG0uc2V0Q29udGVudChlLnZhbHVlKTsKCQkJCXRoaXMuY29weUVsbSA9IGU7CgkJCQl2YXIgZiA9IGUucGFyZW50VGFnKCdGT1JNJyk7CgkJCQlpZihmKSB7IGJrTGliLmFkZEV2ZW50KCBmLCAnc3VibWl0JywgdGhpcy5zYXZlQ29udGVudC5jbG9zdXJlKHRoaXMpKTsgfQoJCQl9CgkJCWVkaXRvckVsbS5zZXRTdHlsZSgoaWU3cykgPyB7aGVpZ2h0IDogbmV3WSsncHgnfSA6IHtvdmVyZmxvdzogJ2hpZGRlbid9KTsKCQkJdGhpcy5lbG0gPSBlZGl0b3JFbG07CQoJCX0KCQl0aGlzLm5lLmFkZEV2ZW50KCdibHVyJyx0aGlzLmJsdXIuY2xvc3VyZSh0aGlzKSk7CgoJCXRoaXMuaW5pdCgpOwoJCXRoaXMuYmx1cigpOwoJfSwKCQoJaW5pdCA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWxtLnNldEF0dHJpYnV0ZSgnY29udGVudEVkaXRhYmxlJywndHJ1ZScpOwkKCQlpZih0aGlzLmdldENvbnRlbnQoKSA9PSAiIikgewoJCQl0aGlzLnNldENvbnRlbnQoJzxiciAvPicpOwoJCX0KCQl0aGlzLmluc3RhbmNlRG9jID0gZG9jdW1lbnQuZGVmYXVsdFZpZXc7CgkJdGhpcy5lbG0uYWRkRXZlbnQoJ21vdXNlZG93bicsdGhpcy5zZWxlY3RlZC5jbG9zdXJlTGlzdGVuZXIodGhpcykpLmFkZEV2ZW50KCdrZXlwcmVzcycsdGhpcy5rZXlEb3duLmNsb3N1cmVMaXN0ZW5lcih0aGlzKSkuYWRkRXZlbnQoJ2ZvY3VzJyx0aGlzLnNlbGVjdGVkLmNsb3N1cmUodGhpcykpLmFkZEV2ZW50KCdibHVyJyx0aGlzLmJsdXIuY2xvc3VyZSh0aGlzKSkuYWRkRXZlbnQoJ2tleXVwJyx0aGlzLnNlbGVjdGVkLmNsb3N1cmUodGhpcykpOwoJCXRoaXMubmUuZmlyZUV2ZW50KCdhZGQnLHRoaXMpOwoJfSwKCQoJcmVtb3ZlIDogZnVuY3Rpb24oKSB7CgkJdGhpcy5zYXZlQ29udGVudCgpOwoJCWlmKHRoaXMuY29weUVsbSB8fCB0aGlzLm9wdGlvbnMuaGFzUGFuZWwpIHsKCQkJdGhpcy5lZGl0b3JDb250YWluLnJlbW92ZSgpOwoJCQl0aGlzLmUuc2V0U3R5bGUoeydkaXNwbGF5JyA6ICdibG9jayd9KTsKCQkJdGhpcy5uZS5yZW1vdmVQYW5lbCgpOwoJCX0KCQl0aGlzLmRpc2FibGUoKTsKCQl0aGlzLm5lLmZpcmVFdmVudCgncmVtb3ZlJyx0aGlzKTsKCX0sCgkKCWRpc2FibGUgOiBmdW5jdGlvbigpIHsKCQl0aGlzLmVsbS5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRFZGl0YWJsZScsJ2ZhbHNlJyk7Cgl9LAoJCglnZXRTZWwgOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gKHdpbmRvdy5nZXRTZWxlY3Rpb24pID8gd2luZG93LmdldFNlbGVjdGlvbigpIDogZG9jdW1lbnQuc2VsZWN0aW9uOwkKCX0sCgkKCWdldFJuZyA6IGZ1bmN0aW9uKCkgewoJCXZhciBzID0gdGhpcy5nZXRTZWwoKTsKCQlpZighcykgeyByZXR1cm4gbnVsbDsgfQoJCXJldHVybiAocy5yYW5nZUNvdW50ID4gMCkgPyBzLmdldFJhbmdlQXQoMCkgOiBzLmNyZWF0ZVJhbmdlKCk7Cgl9LAoJCglzZWxSbmcgOiBmdW5jdGlvbihybmcscykgewoJCWlmKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHsKCQkJcy5yZW1vdmVBbGxSYW5nZXMoKTsKCQkJcy5hZGRSYW5nZShybmcpOwoJCX0gZWxzZSB7CgkJCXJuZy5zZWxlY3QoKTsKCQl9Cgl9LAoJCglzZWxFbG0gOiBmdW5jdGlvbigpIHsKCQl2YXIgciA9IHRoaXMuZ2V0Um5nKCk7CgkJaWYoci5zdGFydENvbnRhaW5lcikgewoJCQl2YXIgY29udGFpbiA9IHIuc3RhcnRDb250YWluZXI7CgkJCWlmKHIuY2xvbmVDb250ZW50cygpLmNoaWxkTm9kZXMubGVuZ3RoID09IDEpIHsKCQkJCWZvcih2YXIgaT0wO2k8Y29udGFpbi5jaGlsZE5vZGVzLmxlbmd0aDtpKyspIHsKCQkJCQl2YXIgcm5nID0gY29udGFpbi5jaGlsZE5vZGVzW2ldLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKCQkJCQlybmcuc2VsZWN0Tm9kZShjb250YWluLmNoaWxkTm9kZXNbaV0pOwkJCQkJCgkJCQkJaWYoci5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuU1RBUlRfVE9fU1RBUlQscm5nKSAhPSAxICYmIAoJCQkJCQlyLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhSYW5nZS5FTkRfVE9fRU5ELHJuZykgIT0gLTEpIHsKCQkJCQkJcmV0dXJuICRCSyhjb250YWluLmNoaWxkTm9kZXNbaV0pOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlyZXR1cm4gJEJLKGNvbnRhaW4pOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkQksoKHRoaXMuZ2V0U2VsKCkudHlwZSA9PSAiQ29udHJvbCIpID8gci5pdGVtKDApIDogci5wYXJlbnRFbGVtZW50KCkpOwoJCX0KCX0sCgkKCXNhdmVSbmcgOiBmdW5jdGlvbigpIHsKCQl0aGlzLnNhdmVkUmFuZ2UgPSB0aGlzLmdldFJuZygpOwoJCXRoaXMuc2F2ZWRTZWwgPSB0aGlzLmdldFNlbCgpOwoJfSwKCQoJcmVzdG9yZVJuZyA6IGZ1bmN0aW9uKCkgewoJCWlmKHRoaXMuc2F2ZWRSYW5nZSkgewoJCQl0aGlzLnNlbFJuZyh0aGlzLnNhdmVkUmFuZ2UsdGhpcy5zYXZlZFNlbCk7CgkJfQoJfSwKCQoJa2V5RG93biA6IGZ1bmN0aW9uKGUsdCkgewoJCWlmKGUuY3RybEtleSkgewoJCQl0aGlzLm5lLmZpcmVFdmVudCgna2V5Jyx0aGlzLGUpOwoJCX0KCX0sCgkKCXNlbGVjdGVkIDogZnVuY3Rpb24oZSx0KSB7CgkJaWYoIXQpIHt0ID0gdGhpcy5zZWxFbG0oKX0KCQlpZighZS5jdHJsS2V5KSB7CgkJCXZhciBzZWxJbnN0YW5jZSA9IHRoaXMubmUuc2VsZWN0ZWRJbnN0YW5jZTsKCQkJaWYoc2VsSW5zdGFuY2UgIT0gdGhpcykgewoJCQkJaWYoc2VsSW5zdGFuY2UpIHsKCQkJCQl0aGlzLm5lLmZpcmVFdmVudCgnYmx1cicsc2VsSW5zdGFuY2UsdCk7CgkJCQl9CgkJCQl0aGlzLm5lLnNlbGVjdGVkSW5zdGFuY2UgPSB0aGlzOwkKCQkJCXRoaXMubmUuZmlyZUV2ZW50KCdmb2N1cycsc2VsSW5zdGFuY2UsdCk7CgkJCX0KCQkJdGhpcy5uZS5maXJlRXZlbnQoJ3NlbGVjdGVkJyxzZWxJbnN0YW5jZSx0KTsKCQkJdGhpcy5pc0ZvY3VzZWQgPSB0cnVlOwoJCQl0aGlzLmVsbS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfSwKCQoJYmx1ciA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNGb2N1c2VkID0gZmFsc2U7CgkJdGhpcy5lbG0ucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7Cgl9LAoJCglzYXZlQ29udGVudCA6IGZ1bmN0aW9uKCkgewoJCWlmKHRoaXMuY29weUVsbSB8fCB0aGlzLm9wdGlvbnMuaGFzUGFuZWwpIHsKCQkJdGhpcy5uZS5maXJlRXZlbnQoJ3NhdmUnLHRoaXMpOwoJCQkodGhpcy5jb3B5RWxtKSA/IHRoaXMuY29weUVsbS52YWx1ZSA9IHRoaXMuZ2V0Q29udGVudCgpIDogdGhpcy5lLmlubmVySFRNTCA9IHRoaXMuZ2V0Q29udGVudCgpOwoJCX0JCgl9LAoJCglnZXRFbG0gOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5lbG07Cgl9LAoJCglnZXRDb250ZW50IDogZnVuY3Rpb24oKSB7CgkJdGhpcy5jb250ZW50ID0gdGhpcy5nZXRFbG0oKS5pbm5lckhUTUw7CgkJdGhpcy5uZS5maXJlRXZlbnQoJ2dldCcsdGhpcyk7CgkJcmV0dXJuIHRoaXMuY29udGVudDsKCX0sCgkKCXNldENvbnRlbnQgOiBmdW5jdGlvbihlKSB7CgkJdGhpcy5jb250ZW50ID0gZTsKCQl0aGlzLm5lLmZpcmVFdmVudCgnc2V0Jyx0aGlzKTsKCQl0aGlzLmVsbS5pbm5lckhUTUwgPSB0aGlzLmNvbnRlbnQ7CQoJfSwKCQoJbmljQ29tbWFuZCA6IGZ1bmN0aW9uKGNtZCxhcmdzKSB7CgkJZG9jdW1lbnQuZXhlY0NvbW1hbmQoY21kLGZhbHNlLGFyZ3MpOwoJfQkJCn0pOwoNCnZhciBuaWNFZGl0b3JJRnJhbWVJbnN0YW5jZSA9IG5pY0VkaXRvckluc3RhbmNlLmV4dGVuZCh7CglzYXZlZFN0eWxlcyA6IFtdLAoJCglpbml0IDogZnVuY3Rpb24oKSB7CQoJCXZhciBjID0gdGhpcy5lbG0uaW5uZXJIVE1MLnJlcGxhY2UoL15ccyt8XHMrJC9nLCAnJyk7CgkJdGhpcy5lbG0uaW5uZXJIVE1MID0gJyc7CgkJKCFjKSA/IGMgPSAiPGJyIC8+IiA6IGM7CgkJdGhpcy5pbml0aWFsQ29udGVudCA9IGM7CgkJCgkJdGhpcy5lbG1GcmFtZSA9IG5ldyBia0VsZW1lbnQoJ2lmcmFtZScpLnNldEF0dHJpYnV0ZXMoeydzcmMnIDogJ2phdmFzY3JpcHQ6OycsICdmcmFtZUJvcmRlcicgOiAwLCAnYWxsb3dUcmFuc3BhcmVuY3knIDogJ3RydWUnLCAnc2Nyb2xsaW5nJyA6ICdubyd9KS5zZXRTdHlsZSh7aGVpZ2h0OiAnMTAwcHgnLCB3aWR0aDogJzEwMCUnfSkuYWRkQ2xhc3MoJ2ZyYW1lJykuYXBwZW5kVG8odGhpcy5lbG0pOwoKCQlpZih0aGlzLmNvcHlFbG0pIHsgdGhpcy5lbG1GcmFtZS5zZXRTdHlsZSh7d2lkdGggOiAodGhpcy5lbG0ub2Zmc2V0V2lkdGgtNCkrJ3B4J30pOyB9CgkJCgkJdmFyIHN0eWxlTGlzdCA9IFsnZm9udC1zaXplJywnZm9udC1mYW1pbHknLCdmb250LXdlaWdodCcsJ2NvbG9yJ107CgkJZm9yKGl0bSBpbiBzdHlsZUxpc3QpIHsKCQkJdGhpcy5zYXZlZFN0eWxlc1tia0xpYi5jYW1lbGl6ZShpdG0pXSA9IHRoaXMuZWxtLmdldFN0eWxlKGl0bSk7CgkJfQogICAgIAkKCQlzZXRUaW1lb3V0KHRoaXMuaW5pdEZyYW1lLmNsb3N1cmUodGhpcyksNTApOwoJfSwKCQoJZGlzYWJsZSA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWxtLmlubmVySFRNTCA9IHRoaXMuZ2V0Q29udGVudCgpOwoJfSwKCQoJaW5pdEZyYW1lIDogZnVuY3Rpb24oKSB7CgkJdmFyIGZkID0gJEJLKHRoaXMuZWxtRnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudCk7CgkJZmQuZGVzaWduTW9kZSA9ICJvbiI7CQkKCQlmZC5vcGVuKCk7CgkJdmFyIGNzcyA9IHRoaXMubmUub3B0aW9ucy5leHRlcm5hbENTUzsKCQlmZC53cml0ZSgnPGh0bWw+PGhlYWQ+JysoKGNzcykgPyAnPGxpbmsgaHJlZj0iJytjc3MrJyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgLz4nIDogJycpKyc8L2hlYWQ+PGJvZHkgaWQ9Im5pY0VkaXRDb250ZW50IiBzdHlsZT0ibWFyZ2luOiAwICFpbXBvcnRhbnQ7IGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7Ij4nK3RoaXMuaW5pdGlhbENvbnRlbnQrJzwvYm9keT48L2h0bWw+Jyk7CgkJZmQuY2xvc2UoKTsKCQl0aGlzLmZyYW1lRG9jID0gZmQ7CgoJCXRoaXMuZnJhbWVXaW4gPSAkQksodGhpcy5lbG1GcmFtZS5jb250ZW50V2luZG93KTsKCQl0aGlzLmZyYW1lQ29udGVudCA9ICRCSyh0aGlzLmZyYW1lV2luLmRvY3VtZW50LmJvZHkpLnNldFN0eWxlKHRoaXMuc2F2ZWRTdHlsZXMpOwoJCXRoaXMuaW5zdGFuY2VEb2MgPSB0aGlzLmZyYW1lV2luLmRvY3VtZW50LmRlZmF1bHRWaWV3OwoJCQoJCXRoaXMuaGVpZ2h0VXBkYXRlKCk7CgkJdGhpcy5mcmFtZURvYy5hZGRFdmVudCgnbW91c2Vkb3duJywgdGhpcy5zZWxlY3RlZC5jbG9zdXJlTGlzdGVuZXIodGhpcykpLmFkZEV2ZW50KCdrZXl1cCcsdGhpcy5oZWlnaHRVcGRhdGUuY2xvc3VyZUxpc3RlbmVyKHRoaXMpKS5hZGRFdmVudCgna2V5ZG93bicsdGhpcy5rZXlEb3duLmNsb3N1cmVMaXN0ZW5lcih0aGlzKSkuYWRkRXZlbnQoJ2tleXVwJyx0aGlzLnNlbGVjdGVkLmNsb3N1cmUodGhpcykpOwoJCXRoaXMubmUuZmlyZUV2ZW50KCdhZGQnLHRoaXMpOwoJfSwKCQoJZ2V0RWxtIDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZnJhbWVDb250ZW50OwoJfSwKCQoJc2V0Q29udGVudCA6IGZ1bmN0aW9uKGMpIHsKCQl0aGlzLmNvbnRlbnQgPSBjOwoJCXRoaXMubmUuZmlyZUV2ZW50KCdzZXQnLHRoaXMpOwoJCXRoaXMuZnJhbWVDb250ZW50LmlubmVySFRNTCA9IHRoaXMuY29udGVudDsJCgkJdGhpcy5oZWlnaHRVcGRhdGUoKTsKCX0sCgkKCWdldFNlbCA6IGZ1bmN0aW9uKCkgewoJCXJldHVybiAodGhpcy5mcmFtZVdpbikgPyB0aGlzLmZyYW1lV2luLmdldFNlbGVjdGlvbigpIDogdGhpcy5mcmFtZURvYy5zZWxlY3Rpb247Cgl9LAoJCgloZWlnaHRVcGRhdGUgOiBmdW5jdGlvbigpIHsJCgkJdGhpcy5lbG1GcmFtZS5zdHlsZS5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmZyYW1lQ29udGVudC5vZmZzZXRIZWlnaHQsdGhpcy5pbml0aWFsSGVpZ2h0KSsncHgnOwoJfSwKICAgIAoJbmljQ29tbWFuZCA6IGZ1bmN0aW9uKGNtZCxhcmdzKSB7CgkJdGhpcy5mcmFtZURvYy5leGVjQ29tbWFuZChjbWQsZmFsc2UsYXJncyk7CgkJc2V0VGltZW91dCh0aGlzLmhlaWdodFVwZGF0ZS5jbG9zdXJlKHRoaXMpLDEwMCk7Cgl9CgoJCn0pOw0KdmFyIG5pY0VkaXRvclBhbmVsID0gYmtDbGFzcy5leHRlbmQoewoJY29uc3RydWN0IDogZnVuY3Rpb24oZSxvcHRpb25zLG5pY0VkaXRvcikgewoJCXRoaXMuZWxtID0gZTsKCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJCXRoaXMubmUgPSBuaWNFZGl0b3I7CgkJdGhpcy5wYW5lbEJ1dHRvbnMgPSBuZXcgQXJyYXkoKTsKCQl0aGlzLmJ1dHRvbkxpc3QgPSBia0V4dGVuZChbXSx0aGlzLm5lLm9wdGlvbnMuYnV0dG9uTGlzdCk7CgkJCgkJdGhpcy5wYW5lbENvbnRhaW4gPSBuZXcgYmtFbGVtZW50KCdESVYnKS5zZXRTdHlsZSh7b3ZlcmZsb3cgOiAnaGlkZGVuJywgd2lkdGggOiAnMTAwJScsIGJvcmRlciA6ICcxcHggc29saWQgI2NjY2NjYycsIGJhY2tncm91bmRDb2xvciA6ICcjZWZlZmVmJ30pLmFkZENsYXNzKCdwYW5lbENvbnRhaW4nKTsKCQl0aGlzLnBhbmVsRWxtID0gbmV3IGJrRWxlbWVudCgnRElWJykuc2V0U3R5bGUoe21hcmdpbiA6ICcycHgnLCBtYXJnaW5Ub3AgOiAnMHB4Jywgem9vbSA6IDEsIG92ZXJmbG93IDogJ2hpZGRlbid9KS5hZGRDbGFzcygncGFuZWwnKS5hcHBlbmRUbyh0aGlzLnBhbmVsQ29udGFpbik7CgkJdGhpcy5wYW5lbENvbnRhaW4uYXBwZW5kVG8oZSk7CgoJCXZhciBvcHQgPSB0aGlzLm5lLm9wdGlvbnM7CgkJdmFyIGJ1dHRvbnMgPSBvcHQuYnV0dG9uczsKCQlmb3IoYnV0dG9uIGluIGJ1dHRvbnMpIHsKCQkJCXRoaXMuYWRkQnV0dG9uKGJ1dHRvbixvcHQsdHJ1ZSk7CgkJfQoJCXRoaXMucmVvcmRlcigpOwoJCWUubm9TZWxlY3QoKTsKCX0sCgkKCWFkZEJ1dHRvbiA6IGZ1bmN0aW9uKGJ1dHRvbk5hbWUsb3B0aW9ucyxub09yZGVyKSB7CgkJdmFyIGJ1dHRvbiA9IG9wdGlvbnMuYnV0dG9uc1tidXR0b25OYW1lXTsKCQl2YXIgdHlwZSA9IChidXR0b25bJ3R5cGUnXSkgPyBldmFsKCcodHlwZW9mKCcrYnV0dG9uWyd0eXBlJ10rJykgPT0gInVuZGVmaW5lZCIpID8gbnVsbCA6ICcrYnV0dG9uWyd0eXBlJ10rJzsnKSA6IG5pY0VkaXRvckJ1dHRvbjsKCQl2YXIgaGFzQnV0dG9uID0gYmtMaWIuaW5BcnJheSh0aGlzLmJ1dHRvbkxpc3QsYnV0dG9uTmFtZSk7CgkJaWYodHlwZSAmJiAoaGFzQnV0dG9uIHx8IHRoaXMubmUub3B0aW9ucy5mdWxsUGFuZWwpKSB7CgkJCXRoaXMucGFuZWxCdXR0b25zLnB1c2gobmV3IHR5cGUodGhpcy5wYW5lbEVsbSxidXR0b25OYW1lLG9wdGlvbnMsdGhpcy5uZSkpOwoJCQlpZighaGFzQnV0dG9uKSB7CQoJCQkJdGhpcy5idXR0b25MaXN0LnB1c2goYnV0dG9uTmFtZSk7CgkJCX0KCQl9Cgl9LAoJCglmaW5kQnV0dG9uIDogZnVuY3Rpb24oaXRtKSB7CgkJZm9yKHZhciBpPTA7aTx0aGlzLnBhbmVsQnV0dG9ucy5sZW5ndGg7aSsrKSB7CgkJCWlmKHRoaXMucGFuZWxCdXR0b25zW2ldLm5hbWUgPT0gaXRtKQoJCQkJcmV0dXJuIHRoaXMucGFuZWxCdXR0b25zW2ldOwoJCX0JCgl9LAoJCglyZW9yZGVyIDogZnVuY3Rpb24oKSB7CgkJdmFyIGJsID0gdGhpcy5idXR0b25MaXN0OwoJCWZvcih2YXIgaT0wO2k8YmwubGVuZ3RoO2krKykgewoJCQl2YXIgYnV0dG9uID0gdGhpcy5maW5kQnV0dG9uKGJsW2ldKTsKCQkJaWYoYnV0dG9uKSB7CgkJCQl0aGlzLnBhbmVsRWxtLmFwcGVuZENoaWxkKGJ1dHRvbi5tYXJnaW4pOwoJCQl9CgkJfQkKCX0sCgkKCXJlbW92ZSA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWxtLnJlbW92ZSgpOwoJfQp9KTsNCnZhciBuaWNFZGl0b3JCdXR0b24gPSBia0NsYXNzLmV4dGVuZCh7CgkKCWNvbnN0cnVjdCA6IGZ1bmN0aW9uKGUsYnV0dG9uTmFtZSxvcHRpb25zLG5pY0VkaXRvcikgewoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnMuYnV0dG9uc1tidXR0b25OYW1lXTsKCQl0aGlzLm5hbWUgPSBidXR0b25OYW1lOwoJCXRoaXMubmUgPSBuaWNFZGl0b3I7CgkJdGhpcy5lbG0gPSBlOwoKCQl0aGlzLm1hcmdpbiA9IG5ldyBia0VsZW1lbnQoJ0RJVicpLnNldFN0eWxlKHsnZmxvYXQnIDogJ2xlZnQnLCBtYXJnaW5Ub3AgOiAnMnB4J30pLmFwcGVuZFRvKGUpOwoJCXRoaXMuY29udGFpbiA9IG5ldyBia0VsZW1lbnQoJ0RJVicpLnNldFN0eWxlKHt3aWR0aCA6ICcyMHB4JywgaGVpZ2h0IDogJzIwcHgnfSkuYWRkQ2xhc3MoJ2J1dHRvbkNvbnRhaW4nKS5hcHBlbmRUbyh0aGlzLm1hcmdpbik7CgkJdGhpcy5ib3JkZXIgPSBuZXcgYmtFbGVtZW50KCdESVYnKS5zZXRTdHlsZSh7YmFja2dyb3VuZENvbG9yIDogJyNlZmVmZWYnLCBib3JkZXIgOiAnMXB4IHNvbGlkICNlZmVmZWYnfSkuYXBwZW5kVG8odGhpcy5jb250YWluKTsKCQl0aGlzLmJ1dHRvbiA9IG5ldyBia0VsZW1lbnQoJ0RJVicpLnNldFN0eWxlKHt3aWR0aCA6ICcxOHB4JywgaGVpZ2h0IDogJzE4cHgnLCBvdmVyZmxvdyA6ICdoaWRkZW4nLCB6b29tIDogMSwgY3Vyc29yIDogJ3BvaW50ZXInfSkuYWRkQ2xhc3MoJ2J1dHRvbicpLnNldFN0eWxlKHRoaXMubmUuZ2V0SWNvbihidXR0b25OYW1lLG9wdGlvbnMpKS5hcHBlbmRUbyh0aGlzLmJvcmRlcik7CgkJdGhpcy5idXR0b24uYWRkRXZlbnQoJ21vdXNlb3ZlcicsIHRoaXMuaG92ZXJPbi5jbG9zdXJlKHRoaXMpKS5hZGRFdmVudCgnbW91c2VvdXQnLHRoaXMuaG92ZXJPZmYuY2xvc3VyZSh0aGlzKSkuYWRkRXZlbnQoJ21vdXNlZG93bicsdGhpcy5tb3VzZUNsaWNrLmNsb3N1cmUodGhpcykpLm5vU2VsZWN0KCk7CgkJCgkJaWYoIXdpbmRvdy5vcGVyYSkgewoJCQl0aGlzLmJ1dHRvbi5vbm1vdXNlZG93biA9IHRoaXMuYnV0dG9uLm9uY2xpY2sgPSBia0xpYi5jYW5jZWxFdmVudDsKCQl9CgkJCgkJbmljRWRpdG9yLmFkZEV2ZW50KCdzZWxlY3RlZCcsIHRoaXMuZW5hYmxlLmNsb3N1cmUodGhpcykpLmFkZEV2ZW50KCdibHVyJywgdGhpcy5kaXNhYmxlLmNsb3N1cmUodGhpcykpLmFkZEV2ZW50KCdrZXknLHRoaXMua2V5LmNsb3N1cmUodGhpcykpOwoJCQoJCXRoaXMuZGlzYWJsZSgpOwoJCXRoaXMuaW5pdCgpOwoJfSwKCQoJaW5pdCA6IGZ1bmN0aW9uKCkgeyAgfSwKCQoJaGlkZSA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuY29udGFpbi5zZXRTdHlsZSh7ZGlzcGxheSA6ICdub25lJ30pOwoJfSwKCQoJdXBkYXRlU3RhdGUgOiBmdW5jdGlvbigpIHsKCQlpZih0aGlzLmlzRGlzYWJsZWQpIHsgdGhpcy5zZXRCZygpOyB9CgkJZWxzZSBpZih0aGlzLmlzSG92ZXIpIHsgdGhpcy5zZXRCZygnaG92ZXInKTsgfQoJCWVsc2UgaWYodGhpcy5pc0FjdGl2ZSkgeyB0aGlzLnNldEJnKCdhY3RpdmUnKTsgfQoJCWVsc2UgeyB0aGlzLnNldEJnKCk7IH0KCX0sCgkKCXNldEJnIDogZnVuY3Rpb24oc3RhdGUpIHsKCQlzd2l0Y2goc3RhdGUpIHsKCQkJY2FzZSAnaG92ZXInOgoJCQkJdmFyIHN0YXRlU3R5bGUgPSB7Ym9yZGVyIDogJzFweCBzb2xpZCAjNjY2JywgYmFja2dyb3VuZENvbG9yIDogJyNkZGQnfTsKCQkJCWJyZWFrOwoJCQljYXNlICdhY3RpdmUnOgoJCQkJdmFyIHN0YXRlU3R5bGUgPSB7Ym9yZGVyIDogJzFweCBzb2xpZCAjNjY2JywgYmFja2dyb3VuZENvbG9yIDogJyNjY2MnfTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJdmFyIHN0YXRlU3R5bGUgPSB7Ym9yZGVyIDogJzFweCBzb2xpZCAjZWZlZmVmJywgYmFja2dyb3VuZENvbG9yIDogJyNlZmVmZWYnfTsJCgkJfQoJCXRoaXMuYm9yZGVyLnNldFN0eWxlKHN0YXRlU3R5bGUpLmFkZENsYXNzKCdidXR0b24tJytzdGF0ZSk7Cgl9LAoJCgljaGVja05vZGVzIDogZnVuY3Rpb24oZSkgewoJCXZhciBlbG0gPSBlOwkKCQlkbyB7CgkJCWlmKHRoaXMub3B0aW9ucy50YWdzICYmIGJrTGliLmluQXJyYXkodGhpcy5vcHRpb25zLnRhZ3MsZWxtLm5vZGVOYW1lKSkgewoJCQkJdGhpcy5hY3RpdmF0ZSgpOwoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9IHdoaWxlKGVsbSA9IGVsbS5wYXJlbnROb2RlICYmIGVsbS5jbGFzc05hbWUgIT0gIm5pY0VkaXQiKTsKCQllbG0gPSAkQksoZSk7CgkJd2hpbGUoZWxtLm5vZGVUeXBlID09IDMpIHsKCQkJZWxtID0gJEJLKGVsbS5wYXJlbnROb2RlKTsKCQl9CgkJaWYodGhpcy5vcHRpb25zLmNzcykgewoJCQlmb3IoaXRtIGluIHRoaXMub3B0aW9ucy5jc3MpIHsKCQkJCWlmKGVsbS5nZXRTdHlsZShpdG0sdGhpcy5uZS5zZWxlY3RlZEluc3RhbmNlLmluc3RhbmNlRG9jKSA9PSB0aGlzLm9wdGlvbnMuY3NzW2l0bV0pIHsKCQkJCQl0aGlzLmFjdGl2YXRlKCk7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQl9CgkJdGhpcy5kZWFjdGl2YXRlKCk7CgkJcmV0dXJuIGZhbHNlOwoJfSwKCQoJYWN0aXZhdGUgOiBmdW5jdGlvbigpIHsKCQlpZighdGhpcy5pc0Rpc2FibGVkKSB7CgkJCXRoaXMuaXNBY3RpdmUgPSB0cnVlOwoJCQl0aGlzLnVwZGF0ZVN0YXRlKCk7CQoJCQl0aGlzLm5lLmZpcmVFdmVudCgnYnV0dG9uQWN0aXZhdGUnLHRoaXMpOwoJCX0KCX0sCgkKCWRlYWN0aXZhdGUgOiBmdW5jdGlvbigpIHsKCQl0aGlzLmlzQWN0aXZlID0gZmFsc2U7CgkJdGhpcy51cGRhdGVTdGF0ZSgpOwkKCQlpZighdGhpcy5pc0Rpc2FibGVkKSB7CgkJCXRoaXMubmUuZmlyZUV2ZW50KCdidXR0b25EZWFjdGl2YXRlJyx0aGlzKTsKCQl9Cgl9LAoJCgllbmFibGUgOiBmdW5jdGlvbihpbnMsdCkgewoJCXRoaXMuaXNEaXNhYmxlZCA9IGZhbHNlOwoJCXRoaXMuY29udGFpbi5zZXRTdHlsZSh7J29wYWNpdHknIDogMX0pLmFkZENsYXNzKCdidXR0b25FbmFibGVkJyk7CgkJdGhpcy51cGRhdGVTdGF0ZSgpOwoJCXRoaXMuY2hlY2tOb2Rlcyh0KTsKCX0sCgkKCWRpc2FibGUgOiBmdW5jdGlvbihpbnMsdCkgewkJCgkJdGhpcy5pc0Rpc2FibGVkID0gdHJ1ZTsKCQl0aGlzLmNvbnRhaW4uc2V0U3R5bGUoeydvcGFjaXR5JyA6IDAuNn0pLnJlbW92ZUNsYXNzKCdidXR0b25FbmFibGVkJyk7CgkJdGhpcy51cGRhdGVTdGF0ZSgpOwkKCX0sCgkKCXRvZ2dsZUFjdGl2ZSA6IGZ1bmN0aW9uKCkgewoJCSh0aGlzLmlzQWN0aXZlKSA/IHRoaXMuZGVhY3RpdmF0ZSgpIDogdGhpcy5hY3RpdmF0ZSgpOwkKCX0sCgkKCWhvdmVyT24gOiBmdW5jdGlvbigpIHsKCQlpZighdGhpcy5pc0Rpc2FibGVkKSB7CgkJCXRoaXMuaXNIb3ZlciA9IHRydWU7CgkJCXRoaXMudXBkYXRlU3RhdGUoKTsKCQkJdGhpcy5uZS5maXJlRXZlbnQoImJ1dHRvbk92ZXIiLHRoaXMpOwoJCX0KCX0sIAoJCglob3Zlck9mZiA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNIb3ZlciA9IGZhbHNlOwoJCXRoaXMudXBkYXRlU3RhdGUoKTsKCQl0aGlzLm5lLmZpcmVFdmVudCgiYnV0dG9uT3V0Iix0aGlzKTsKCX0sCgkKCW1vdXNlQ2xpY2sgOiBmdW5jdGlvbigpIHsKCQlpZih0aGlzLm9wdGlvbnMuY29tbWFuZCkgewoJCQl0aGlzLm5lLm5pY0NvbW1hbmQodGhpcy5vcHRpb25zLmNvbW1hbmQsdGhpcy5vcHRpb25zLmNvbW1hbmRBcmdzKTsKCQkJaWYoIXRoaXMub3B0aW9ucy5ub0FjdGl2ZSkgewoJCQkJdGhpcy50b2dnbGVBY3RpdmUoKTsKCQkJfQoJCX0KCQl0aGlzLm5lLmZpcmVFdmVudCgiYnV0dG9uQ2xpY2siLHRoaXMpOwoJfSwKCQoJa2V5IDogZnVuY3Rpb24obmljSW5zdGFuY2UsZSkgewoJCWlmKHRoaXMub3B0aW9ucy5rZXkgJiYgZS5jdHJsS2V5ICYmIFN0cmluZy5mcm9tQ2hhckNvZGUoZS5rZXlDb2RlIHx8IGUuY2hhckNvZGUpLnRvTG93ZXJDYXNlKCkgPT0gdGhpcy5vcHRpb25zLmtleSkgewoJCQl0aGlzLm1vdXNlQ2xpY2soKTsKCQkJaWYoZS5wcmV2ZW50RGVmYXVsdCkgZS5wcmV2ZW50RGVmYXVsdCgpOwoJCX0KCX0KCQp9KTsNCgogCnZhciBuaWNQbHVnaW4gPSBia0NsYXNzLmV4dGVuZCh7CgkKCWNvbnN0cnVjdCA6IGZ1bmN0aW9uKG5pY0VkaXRvcixvcHRpb25zKSB7CgkJdGhpcy5vcHRpb25zID0gb3B0aW9uczsKCQl0aGlzLm5lID0gbmljRWRpdG9yOwoJCXRoaXMubmUuYWRkRXZlbnQoJ3BhbmVsJyx0aGlzLmxvYWRQYW5lbC5jbG9zdXJlKHRoaXMpKTsKCQkKCQl0aGlzLmluaXQoKTsKCX0sCgoJbG9hZFBhbmVsIDogZnVuY3Rpb24obnApIHsKCQl2YXIgYnV0dG9ucyA9IHRoaXMub3B0aW9ucy5idXR0b25zOwoJCWZvcih2YXIgYnV0dG9uIGluIGJ1dHRvbnMpIHsKCQkJbnAuYWRkQnV0dG9uKGJ1dHRvbix0aGlzLm9wdGlvbnMpOwoJCX0KCQlucC5yZW9yZGVyKCk7Cgl9LAoKCWluaXQgOiBmdW5jdGlvbigpIHsgIH0KfSk7Cg0KDQoKIAogLyogU1RBUlQgQ09ORklHICovCnZhciBuaWNQYW5lT3B0aW9ucyA9IHsgfTsKLyogRU5EIENPTkZJRyAqLwoKdmFyIG5pY0VkaXRvclBhbmUgPSBia0NsYXNzLmV4dGVuZCh7Cgljb25zdHJ1Y3QgOiBmdW5jdGlvbihlbG0sbmljRWRpdG9yLG9wdGlvbnMsb3BlbkJ1dHRvbikgewoJCXRoaXMubmUgPSBuaWNFZGl0b3I7CgkJdGhpcy5lbG0gPSBlbG07CgkJdGhpcy5wb3MgPSBlbG0ucG9zKCk7CgkJCgkJdGhpcy5jb250YWluID0gbmV3IGJrRWxlbWVudCgnZGl2Jykuc2V0U3R5bGUoe3pJbmRleCA6ICc5OTk5OScsIG92ZXJmbG93IDogJ2hpZGRlbicsIHBvc2l0aW9uIDogJ2Fic29sdXRlJywgbGVmdCA6IHRoaXMucG9zWzBdKydweCcsIHRvcCA6IHRoaXMucG9zWzFdKydweCd9KQoJCXRoaXMucGFuZSA9IG5ldyBia0VsZW1lbnQoJ2RpdicpLnNldFN0eWxlKHtmb250U2l6ZSA6ICcxMnB4JywgYm9yZGVyIDogJzFweCBzb2xpZCAjY2NjJywgJ292ZXJmbG93JzogJ2hpZGRlbicsIHBhZGRpbmcgOiAnNHB4JywgdGV4dEFsaWduOiAnbGVmdCcsIGJhY2tncm91bmRDb2xvciA6ICcjZmZmZmM5J30pLmFkZENsYXNzKCdwYW5lJykuc2V0U3R5bGUob3B0aW9ucykuYXBwZW5kVG8odGhpcy5jb250YWluKTsKCQkKCQlpZihvcGVuQnV0dG9uICYmICFvcGVuQnV0dG9uLm9wdGlvbnMubm9DbG9zZSkgewoJCQl0aGlzLmNsb3NlID0gbmV3IGJrRWxlbWVudCgnZGl2Jykuc2V0U3R5bGUoeydmbG9hdCcgOiAncmlnaHQnLCBoZWlnaHQ6ICcxNnB4Jywgd2lkdGggOiAnMTZweCcsIGN1cnNvciA6ICdwb2ludGVyJ30pLnNldFN0eWxlKHRoaXMubmUuZ2V0SWNvbignY2xvc2UnLG5pY1BhbmVPcHRpb25zKSkuYWRkRXZlbnQoJ21vdXNlZG93bicsb3BlbkJ1dHRvbi5yZW1vdmVQYW5lLmNsb3N1cmUodGhpcykpLmFwcGVuZFRvKHRoaXMucGFuZSk7CgkJfQoJCQoJCXRoaXMuY29udGFpbi5ub1NlbGVjdCgpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwoJCQoJCXRoaXMucG9zaXRpb24oKTsKCQl0aGlzLmluaXQoKTsJCgl9LAoJCglpbml0IDogZnVuY3Rpb24oKSB7IH0sCgkKCXBvc2l0aW9uIDogZnVuY3Rpb24oKSB7CgkJaWYodGhpcy5uZS5uaWNQYW5lbCkgewoJCQl2YXIgcGFuZWxFbG0gPSB0aGlzLm5lLm5pY1BhbmVsLmVsbTsJCgkJCXZhciBwYW5lbFBvcyA9IHBhbmVsRWxtLnBvcygpOwoJCQl2YXIgbmV3TGVmdCA9IHBhbmVsUG9zWzBdK3BhcnNlSW50KHBhbmVsRWxtLmdldFN0eWxlKCd3aWR0aCcpKS0ocGFyc2VJbnQodGhpcy5wYW5lLmdldFN0eWxlKCd3aWR0aCcpKSs4KTsKCQkJaWYobmV3TGVmdCA8IHRoaXMucG9zWzBdKSB7CgkJCQl0aGlzLmNvbnRhaW4uc2V0U3R5bGUoe2xlZnQgOiBuZXdMZWZ0KydweCd9KTsKCQkJfQoJCX0KCX0sCgkKCXRvZ2dsZSA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNWaXNpYmxlID0gIXRoaXMuaXNWaXNpYmxlOwoJCXRoaXMuY29udGFpbi5zZXRTdHlsZSh7ZGlzcGxheSA6ICgodGhpcy5pc1Zpc2libGUpID8gJ2Jsb2NrJyA6ICdub25lJyl9KTsKCX0sCgkKCXJlbW92ZSA6IGZ1bmN0aW9uKCkgewoJCWlmKHRoaXMuY29udGFpbikgewoJCQl0aGlzLmNvbnRhaW4ucmVtb3ZlKCk7CgkJCXRoaXMuY29udGFpbiA9IG51bGw7CgkJfQoJfSwKCQoJYXBwZW5kIDogZnVuY3Rpb24oYykgewoJCWMuYXBwZW5kVG8odGhpcy5wYW5lKTsKCX0sCgkKCXNldENvbnRlbnQgOiBmdW5jdGlvbihjKSB7CgkJdGhpcy5wYW5lLnNldENvbnRlbnQoYyk7Cgl9CgkKfSk7DQoNCgogCnZhciBuaWNFZGl0b3JBZHZhbmNlZEJ1dHRvbiA9IG5pY0VkaXRvckJ1dHRvbi5leHRlbmQoewoJCglpbml0IDogZnVuY3Rpb24oKSB7CgkJdGhpcy5uZS5hZGRFdmVudCgnc2VsZWN0ZWQnLHRoaXMucmVtb3ZlUGFuZS5jbG9zdXJlKHRoaXMpKS5hZGRFdmVudCgnYmx1cicsdGhpcy5yZW1vdmVQYW5lLmNsb3N1cmUodGhpcykpOwkKCX0sCgkKCW1vdXNlQ2xpY2sgOiBmdW5jdGlvbigpIHsKCQlpZighdGhpcy5pc0Rpc2FibGVkKSB7CgkJCWlmKHRoaXMucGFuZSAmJiB0aGlzLnBhbmUucGFuZSkgewoJCQkJdGhpcy5yZW1vdmVQYW5lKCk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLnBhbmUgPSBuZXcgbmljRWRpdG9yUGFuZSh0aGlzLmNvbnRhaW4sdGhpcy5uZSx7d2lkdGggOiAodGhpcy53aWR0aCB8fCAnMjcwcHgnKSwgYmFja2dyb3VuZENvbG9yIDogJyNmZmYnfSx0aGlzKTsKCQkJCXRoaXMuYWRkUGFuZSgpOwoJCQkJdGhpcy5uZS5zZWxlY3RlZEluc3RhbmNlLnNhdmVSbmcoKTsKCQkJfQoJCX0KCX0sCgkKCWFkZEZvcm0gOiBmdW5jdGlvbihmLGVsbSkgewoJCXRoaXMuZm9ybSA9IG5ldyBia0VsZW1lbnQoJ2Zvcm0nKS5hZGRFdmVudCgnc3VibWl0Jyx0aGlzLnN1Ym1pdC5jbG9zdXJlTGlzdGVuZXIodGhpcykpOwoJCXRoaXMucGFuZS5hcHBlbmQodGhpcy5mb3JtKTsKCQl0aGlzLmlucHV0cyA9IHt9OwoJCQoJCWZvcihpdG0gaW4gZikgewoJCQl2YXIgZmllbGQgPSBmW2l0bV07CgkJCXZhciB2YWwgPSAnJzsKCQkJaWYoZWxtKSB7CgkJCQl2YWwgPSBlbG0uZ2V0QXR0cmlidXRlKGl0bSk7CgkJCX0KCQkJaWYoIXZhbCkgewoJCQkJdmFsID0gZmllbGRbJ3ZhbHVlJ10gfHwgJyc7CgkJCX0KCQkJdmFyIHR5cGUgPSBmW2l0bV0udHlwZTsKCQkJCgkJCWlmKHR5cGUgPT0gJ3RpdGxlJykgewoJCQkJCW5ldyBia0VsZW1lbnQoJ2RpdicpLnNldENvbnRlbnQoZmllbGQudHh0KS5zZXRTdHlsZSh7Zm9udFNpemUgOiAnMTRweCcsIGZvbnRXZWlnaHQ6ICdib2xkJywgcGFkZGluZyA6ICcwcHgnLCBtYXJnaW4gOiAnMnB4IDAnfSkuYXBwZW5kVG8odGhpcy5mb3JtKTsKCQkJfSBlbHNlIHsKCQkJCXZhciBjb250YWluID0gbmV3IGJrRWxlbWVudCgnZGl2Jykuc2V0U3R5bGUoe292ZXJmbG93IDogJ2hpZGRlbicsIGNsZWFyIDogJ2JvdGgnfSkuYXBwZW5kVG8odGhpcy5mb3JtKTsKCQkJCWlmKGZpZWxkLnR4dCkgewoJCQkJCW5ldyBia0VsZW1lbnQoJ2xhYmVsJykuc2V0QXR0cmlidXRlcyh7J2ZvcicgOiBpdG19KS5zZXRDb250ZW50KGZpZWxkLnR4dCkuc2V0U3R5bGUoe21hcmdpbiA6ICcycHggNHB4JywgZm9udFNpemUgOiAnMTNweCcsIHdpZHRoOiAnNTBweCcsIGxpbmVIZWlnaHQgOiAnMjBweCcsIHRleHRBbGlnbiA6ICdyaWdodCcsICdmbG9hdCcgOiAnbGVmdCd9KS5hcHBlbmRUbyhjb250YWluKTsKCQkJCX0KCQkJCQoJCQkJc3dpdGNoKHR5cGUpIHsKCQkJCQljYXNlICd0ZXh0JzoKCQkJCQkJdGhpcy5pbnB1dHNbaXRtXSA9IG5ldyBia0VsZW1lbnQoJ2lucHV0Jykuc2V0QXR0cmlidXRlcyh7aWQgOiBpdG0sICd2YWx1ZScgOiB2YWwsICd0eXBlJyA6ICd0ZXh0J30pLnNldFN0eWxlKHttYXJnaW4gOiAnMnB4IDAnLCBmb250U2l6ZSA6ICcxM3B4JywgJ2Zsb2F0JyA6ICdsZWZ0JywgaGVpZ2h0IDogJzIwcHgnLCBib3JkZXIgOiAnMXB4IHNvbGlkICNjY2MnLCBvdmVyZmxvdyA6ICdoaWRkZW4nfSkuc2V0U3R5bGUoZmllbGQuc3R5bGUpLmFwcGVuZFRvKGNvbnRhaW4pOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdzZWxlY3QnOgoJCQkJCQl0aGlzLmlucHV0c1tpdG1dID0gbmV3IGJrRWxlbWVudCgnc2VsZWN0Jykuc2V0QXR0cmlidXRlcyh7aWQgOiBpdG19KS5zZXRTdHlsZSh7Ym9yZGVyIDogJzFweCBzb2xpZCAjY2NjJywgJ2Zsb2F0JyA6ICdsZWZ0JywgbWFyZ2luIDogJzJweCAwJ30pLmFwcGVuZFRvKGNvbnRhaW4pOwoJCQkJCQlmb3Iob3B0IGluIGZpZWxkLm9wdGlvbnMpIHsKCQkJCQkJCXZhciBvID0gbmV3IGJrRWxlbWVudCgnb3B0aW9uJykuc2V0QXR0cmlidXRlcyh7dmFsdWUgOiBvcHQsIHNlbGVjdGVkIDogKG9wdCA9PSB2YWwpID8gJ3NlbGVjdGVkJyA6ICcnfSkuc2V0Q29udGVudChmaWVsZC5vcHRpb25zW29wdF0pLmFwcGVuZFRvKHRoaXMuaW5wdXRzW2l0bV0pOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ2NvbnRlbnQnOgoJCQkJCQl0aGlzLmlucHV0c1tpdG1dID0gbmV3IGJrRWxlbWVudCgndGV4dGFyZWEnKS5zZXRBdHRyaWJ1dGVzKHtpZCA6IGl0bX0pLnNldFN0eWxlKHtib3JkZXIgOiAnMXB4IHNvbGlkICNjY2MnLCAnZmxvYXQnIDogJ2xlZnQnfSkuc2V0U3R5bGUoZmllbGQuc3R5bGUpLmFwcGVuZFRvKGNvbnRhaW4pOwoJCQkJCQl0aGlzLmlucHV0c1tpdG1dLnZhbHVlID0gdmFsOwoJCQkJfQkKCQkJfQoJCX0KCQluZXcgYmtFbGVtZW50KCdpbnB1dCcpLnNldEF0dHJpYnV0ZXMoeyd0eXBlJyA6ICdzdWJtaXQnfSkuc2V0U3R5bGUoe2JhY2tncm91bmRDb2xvciA6ICcjZWZlZmVmJyxib3JkZXIgOiAnMXB4IHNvbGlkICNjY2MnLCBtYXJnaW4gOiAnM3B4IDAnLCAnZmxvYXQnIDogJ2xlZnQnLCAnY2xlYXInIDogJ2JvdGgnfSkuYXBwZW5kVG8odGhpcy5mb3JtKTsKCQl0aGlzLmZvcm0ub25zdWJtaXQgPSBia0xpYi5jYW5jZWxFdmVudDsJCgl9LAoJCglzdWJtaXQgOiBmdW5jdGlvbigpIHsgfSwKCQoJZmluZEVsbSA6IGZ1bmN0aW9uKHRhZyxhdHRyLHZhbCkgewoJCXZhciBsaXN0ID0gdGhpcy5uZS5zZWxlY3RlZEluc3RhbmNlLmdldEVsbSgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZyk7CgkJZm9yKHZhciBpPTA7aTxsaXN0Lmxlbmd0aDtpKyspIHsKCQkJaWYobGlzdFtpXS5nZXRBdHRyaWJ1dGUoYXR0cikgPT0gdmFsKSB7CgkJCQlyZXR1cm4gJEJLKGxpc3RbaV0pOwoJCQl9CgkJfQoJfSwKCQoJcmVtb3ZlUGFuZSA6IGZ1bmN0aW9uKCkgewoJCWlmKHRoaXMucGFuZSkgewoJCQl0aGlzLnBhbmUucmVtb3ZlKCk7CgkJCXRoaXMucGFuZSA9IG51bGw7CgkJCXRoaXMubmUuc2VsZWN0ZWRJbnN0YW5jZS5yZXN0b3JlUm5nKCk7CgkJfQkKCX0JCn0pOw0KDQoKdmFyIG5pY0J1dHRvblRpcHMgPSBia0NsYXNzLmV4dGVuZCh7Cgljb25zdHJ1Y3QgOiBmdW5jdGlvbihuaWNFZGl0b3IpIHsKCQl0aGlzLm5lID0gbmljRWRpdG9yOwoJCW5pY0VkaXRvci5hZGRFdmVudCgnYnV0dG9uT3ZlcicsdGhpcy5zaG93LmNsb3N1cmUodGhpcykpLmFkZEV2ZW50KCdidXR0b25PdXQnLHRoaXMuaGlkZS5jbG9zdXJlKHRoaXMpKTsKCgl9LAoJCglzaG93IDogZnVuY3Rpb24oYnV0dG9uKSB7CgkJdGhpcy50aW1lciA9IHNldFRpbWVvdXQodGhpcy5jcmVhdGUuY2xvc3VyZSh0aGlzLGJ1dHRvbiksNDAwKTsKCX0sCgkKCWNyZWF0ZSA6IGZ1bmN0aW9uKGJ1dHRvbikgewoJCXRoaXMudGltZXIgPSBudWxsOwoJCWlmKCF0aGlzLnBhbmUpIHsKCQkJdGhpcy5wYW5lID0gbmV3IG5pY0VkaXRvclBhbmUoYnV0dG9uLmJ1dHRvbix0aGlzLm5lLHtmb250U2l6ZSA6ICcxMnB4JywgbWFyZ2luVG9wIDogJzVweCd9KTsKCQkJdGhpcy5wYW5lLnNldENvbnRlbnQoYnV0dG9uLm9wdGlvbnMubmFtZSk7CgkJfQkJCgl9LAoJCgloaWRlIDogZnVuY3Rpb24oYnV0dG9uKSB7CgkJaWYodGhpcy50aW1lcikgewoJCQljbGVhclRpbWVvdXQodGhpcy50aW1lcik7CgkJfQoJCWlmKHRoaXMucGFuZSkgewoJCQl0aGlzLnBhbmUgPSB0aGlzLnBhbmUucmVtb3ZlKCk7CgkJfQoJfQp9KTsKbmljRWRpdG9ycy5yZWdpc3RlclBsdWdpbihuaWNCdXR0b25UaXBzKTsNCg0KCiAKIC8qIFNUQVJUIENPTkZJRyAqLwp2YXIgbmljU2VsZWN0T3B0aW9ucyA9IHsKCWJ1dHRvbnMgOiB7CgkJJ2ZvbnRTaXplJyA6IHtuYW1lIDogX18oJ1NlbGVjdCBGb250IFNpemUnKSwgdHlwZSA6ICduaWNFZGl0b3JGb250U2l6ZVNlbGVjdCcsIGNvbW1hbmQgOiAnZm9udHNpemUnfSwKCQknZm9udEZhbWlseScgOiB7bmFtZSA6IF9fKCdTZWxlY3QgRm9udCBGYW1pbHknKSwgdHlwZSA6ICduaWNFZGl0b3JGb250RmFtaWx5U2VsZWN0JywgY29tbWFuZCA6ICdmb250bmFtZSd9LAoJCSdmb250Rm9ybWF0JyA6IHtuYW1lIDogX18oJ1NlbGVjdCBGb250IEZvcm1hdCcpLCB0eXBlIDogJ25pY0VkaXRvckZvbnRGb3JtYXRTZWxlY3QnLCBjb21tYW5kIDogJ2Zvcm1hdEJsb2NrJ30KCX0KfTsKLyogRU5EIENPTkZJRyAqLwp2YXIgbmljRWRpdG9yU2VsZWN0ID0gYmtDbGFzcy5leHRlbmQoewoJCgljb25zdHJ1Y3QgOiBmdW5jdGlvbihlLGJ1dHRvbk5hbWUsb3B0aW9ucyxuaWNFZGl0b3IpIHsKCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zLmJ1dHRvbnNbYnV0dG9uTmFtZV07CgkJdGhpcy5lbG0gPSBlOwoJCXRoaXMubmUgPSBuaWNFZGl0b3I7CgkJdGhpcy5uYW1lID0gYnV0dG9uTmFtZTsKCQl0aGlzLnNlbE9wdGlvbnMgPSBuZXcgQXJyYXkoKTsKCQkKCQl0aGlzLm1hcmdpbiA9IG5ldyBia0VsZW1lbnQoJ2RpdicpLnNldFN0eWxlKHsnZmxvYXQnIDogJ2xlZnQnLCBtYXJnaW4gOiAnMnB4IDFweCAwIDFweCd9KS5hcHBlbmRUbyh0aGlzLmVsbSk7CgkJdGhpcy5jb250YWluID0gbmV3IGJrRWxlbWVudCgnZGl2Jykuc2V0U3R5bGUoe3dpZHRoOiAnOTBweCcsIGhlaWdodCA6ICcyMHB4JywgY3Vyc29yIDogJ3BvaW50ZXInLCBvdmVyZmxvdzogJ2hpZGRlbid9KS5hZGRDbGFzcygnc2VsZWN0Q29udGFpbicpLmFkZEV2ZW50KCdjbGljaycsdGhpcy50b2dnbGUuY2xvc3VyZSh0aGlzKSkuYXBwZW5kVG8odGhpcy5tYXJnaW4pOwoJCXRoaXMuaXRlbXMgPSBuZXcgYmtFbGVtZW50KCdkaXYnKS5zZXRTdHlsZSh7b3ZlcmZsb3cgOiAnaGlkZGVuJywgem9vbSA6IDEsIGJvcmRlcjogJzFweCBzb2xpZCAjY2NjJywgcGFkZGluZ0xlZnQgOiAnM3B4JywgYmFja2dyb3VuZENvbG9yIDogJyNmZmYnfSkuYXBwZW5kVG8odGhpcy5jb250YWluKTsKCQl0aGlzLmNvbnRyb2wgPSBuZXcgYmtFbGVtZW50KCdkaXYnKS5zZXRTdHlsZSh7b3ZlcmZsb3cgOiAnaGlkZGVuJywgJ2Zsb2F0JyA6ICdyaWdodCcsIGhlaWdodDogJzE4cHgnLCB3aWR0aCA6ICcxNnB4J30pLmFkZENsYXNzKCdzZWxlY3RDb250cm9sJykuc2V0U3R5bGUodGhpcy5uZS5nZXRJY29uKCdhcnJvdycsb3B0aW9ucykpLmFwcGVuZFRvKHRoaXMuaXRlbXMpOwoJCXRoaXMudHh0ID0gbmV3IGJrRWxlbWVudCgnZGl2Jykuc2V0U3R5bGUoe292ZXJmbG93IDogJ2hpZGRlbicsICdmbG9hdCcgOiAnbGVmdCcsIHdpZHRoIDogJzY2cHgnLCBoZWlnaHQgOiAnMTRweCcsIG1hcmdpblRvcCA6ICcxcHgnLCBmb250RmFtaWx5IDogJ3NhbnMtc2VyaWYnLCB0ZXh0QWxpZ24gOiAnY2VudGVyJywgZm9udFNpemUgOiAnMTJweCd9KS5hZGRDbGFzcygnc2VsZWN0VHh0JykuYXBwZW5kVG8odGhpcy5pdGVtcyk7CgkJCgkJaWYoIXdpbmRvdy5vcGVyYSkgewoJCQl0aGlzLmNvbnRhaW4ub25tb3VzZWRvd24gPSB0aGlzLmNvbnRyb2wub25tb3VzZWRvd24gPSB0aGlzLnR4dC5vbm1vdXNlZG93biA9IGJrTGliLmNhbmNlbEV2ZW50OwoJCX0KCQkKCQl0aGlzLm1hcmdpbi5ub1NlbGVjdCgpOwoJCQoJCXRoaXMubmUuYWRkRXZlbnQoJ3NlbGVjdGVkJywgdGhpcy5lbmFibGUuY2xvc3VyZSh0aGlzKSkuYWRkRXZlbnQoJ2JsdXInLCB0aGlzLmRpc2FibGUuY2xvc3VyZSh0aGlzKSk7CgkJCgkJdGhpcy5kaXNhYmxlKCk7CgkJdGhpcy5pbml0KCk7Cgl9LAoJCglkaXNhYmxlIDogZnVuY3Rpb24oKSB7CgkJdGhpcy5pc0Rpc2FibGVkID0gdHJ1ZTsKCQl0aGlzLmNsb3NlKCk7CgkJdGhpcy5jb250YWluLnNldFN0eWxlKHtvcGFjaXR5IDogMC42fSk7Cgl9LAoJCgllbmFibGUgOiBmdW5jdGlvbih0KSB7CgkJdGhpcy5pc0Rpc2FibGVkID0gZmFsc2U7CgkJdGhpcy5jbG9zZSgpOwoJCXRoaXMuY29udGFpbi5zZXRTdHlsZSh7b3BhY2l0eSA6IDF9KTsKCX0sCgkKCXNldERpc3BsYXkgOiBmdW5jdGlvbih0eHQpIHsKCQl0aGlzLnR4dC5zZXRDb250ZW50KHR4dCk7Cgl9LAoJCgl0b2dnbGUgOiBmdW5jdGlvbigpIHsKCQlpZighdGhpcy5pc0Rpc2FibGVkKSB7CgkJCSh0aGlzLnBhbmUpID8gdGhpcy5jbG9zZSgpIDogdGhpcy5vcGVuKCk7CgkJfQoJfSwKCQoJb3BlbiA6IGZ1bmN0aW9uKCkgewoJCXRoaXMucGFuZSA9IG5ldyBuaWNFZGl0b3JQYW5lKHRoaXMuaXRlbXMsdGhpcy5uZSx7d2lkdGggOiAnODhweCcsIHBhZGRpbmc6ICcwcHgnLCBib3JkZXJUb3AgOiAwLCBib3JkZXJMZWZ0IDogJzFweCBzb2xpZCAjY2NjJywgYm9yZGVyUmlnaHQgOiAnMXB4IHNvbGlkICNjY2MnLCBib3JkZXJCb3R0b20gOiAnMHB4JywgYmFja2dyb3VuZENvbG9yIDogJyNmZmYnfSk7CgkJCgkJZm9yKHZhciBpPTA7aTx0aGlzLnNlbE9wdGlvbnMubGVuZ3RoO2krKykgewoJCQl2YXIgb3B0ID0gdGhpcy5zZWxPcHRpb25zW2ldOwoJCQl2YXIgaXRtQ29udGFpbiA9IG5ldyBia0VsZW1lbnQoJ2RpdicpLnNldFN0eWxlKHtvdmVyZmxvdyA6ICdoaWRkZW4nLCBib3JkZXJCb3R0b20gOiAnMXB4IHNvbGlkICNjY2MnLCB3aWR0aDogJzg4cHgnLCB0ZXh0QWxpZ24gOiAnbGVmdCcsIG92ZXJmbG93IDogJ2hpZGRlbicsIGN1cnNvciA6ICdwb2ludGVyJ30pOwoJCQl2YXIgaXRtID0gbmV3IGJrRWxlbWVudCgnZGl2Jykuc2V0U3R5bGUoe3BhZGRpbmcgOiAnMHB4IDRweCd9KS5zZXRDb250ZW50KG9wdFsxXSkuYXBwZW5kVG8oaXRtQ29udGFpbikubm9TZWxlY3QoKTsKCQkJaXRtLmFkZEV2ZW50KCdjbGljaycsdGhpcy51cGRhdGUuY2xvc3VyZSh0aGlzLG9wdFswXSkpLmFkZEV2ZW50KCdtb3VzZW92ZXInLHRoaXMub3Zlci5jbG9zdXJlKHRoaXMsaXRtKSkuYWRkRXZlbnQoJ21vdXNlb3V0Jyx0aGlzLm91dC5jbG9zdXJlKHRoaXMsaXRtKSkuc2V0QXR0cmlidXRlcygnaWQnLG9wdFswXSk7CgkJCXRoaXMucGFuZS5hcHBlbmQoaXRtQ29udGFpbik7CgkJCWlmKCF3aW5kb3cub3BlcmEpIHsKCQkJCWl0bS5vbm1vdXNlZG93biA9IGJrTGliLmNhbmNlbEV2ZW50OwoJCQl9CgkJfQoJfSwKCQoJY2xvc2UgOiBmdW5jdGlvbigpIHsKCQlpZih0aGlzLnBhbmUpIHsKCQkJdGhpcy5wYW5lID0gdGhpcy5wYW5lLnJlbW92ZSgpOwoJCX0JCgl9LAoJCglvdmVyIDogZnVuY3Rpb24ob3B0KSB7CgkJb3B0LnNldFN0eWxlKHtiYWNrZ3JvdW5kQ29sb3IgOiAnI2NjYyd9KTsJCQkKCX0sCgkKCW91dCA6IGZ1bmN0aW9uKG9wdCkgewoJCW9wdC5zZXRTdHlsZSh7YmFja2dyb3VuZENvbG9yIDogJyNmZmYnfSk7Cgl9LAoJCgkKCWFkZCA6IGZ1bmN0aW9uKGssdikgewoJCXRoaXMuc2VsT3B0aW9ucy5wdXNoKG5ldyBBcnJheShrLHYpKTsJCgl9LAoJCgl1cGRhdGUgOiBmdW5jdGlvbihlbG0pIHsKCQl0aGlzLm5lLm5pY0NvbW1hbmQodGhpcy5vcHRpb25zLmNvbW1hbmQsZWxtKTsKCQl0aGlzLmNsb3NlKCk7CQoJfQp9KTsKCnZhciBuaWNFZGl0b3JGb250U2l6ZVNlbGVjdCA9IG5pY0VkaXRvclNlbGVjdC5leHRlbmQoewoJc2VsIDogezEgOiAnMSZuYnNwOyg4cHQpJywgMiA6ICcyJm5ic3A7KDEwcHQpJywgMyA6ICczJm5ic3A7KDEycHQpJywgNCA6ICc0Jm5ic3A7KDE0cHQpJywgNSA6ICc1Jm5ic3A7KDE4cHQpJywgNiA6ICc2Jm5ic3A7KDI0cHQpJ30sCglpbml0IDogZnVuY3Rpb24oKSB7CgkJdGhpcy5zZXREaXNwbGF5KCdGb250Jm5ic3A7U2l6ZS4uLicpOwoJCWZvcihpdG0gaW4gdGhpcy5zZWwpIHsKCQkJdGhpcy5hZGQoaXRtLCc8Zm9udCBzaXplPSInK2l0bSsnIj4nK3RoaXMuc2VsW2l0bV0rJzwvZm9udD4nKTsKCQl9CQkKCX0KfSk7Cgp2YXIgbmljRWRpdG9yRm9udEZhbWlseVNlbGVjdCA9IG5pY0VkaXRvclNlbGVjdC5leHRlbmQoewoJc2VsIDogeydhcmlhbCcgOiAnQXJpYWwnLCdjb21pYyBzYW5zIG1zJyA6ICdDb21pYyBTYW5zJywnY291cmllciBuZXcnIDogJ0NvdXJpZXIgTmV3JywnZ2VvcmdpYScgOiAnR2VvcmdpYScsICdoZWx2ZXRpY2EnIDogJ0hlbHZldGljYScsICdpbXBhY3QnIDogJ0ltcGFjdCcsICd0aW1lcyBuZXcgcm9tYW4nIDogJ1RpbWVzJywgJ3RyZWJ1Y2hldCBtcycgOiAnVHJlYnVjaGV0JywgJ3ZlcmRhbmEnIDogJ1ZlcmRhbmEnfSwKCQoJaW5pdCA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc2V0RGlzcGxheSgnRm9udCZuYnNwO0ZhbWlseS4uLicpOwoJCWZvcihpdG0gaW4gdGhpcy5zZWwpIHsKCQkJdGhpcy5hZGQoaXRtLCc8Zm9udCBmYWNlPSInK2l0bSsnIj4nK3RoaXMuc2VsW2l0bV0rJzwvZm9udD4nKTsKCQl9Cgl9Cn0pOwoKdmFyIG5pY0VkaXRvckZvbnRGb3JtYXRTZWxlY3QgPSBuaWNFZGl0b3JTZWxlY3QuZXh0ZW5kKHsKCQlzZWwgOiB7J3AnIDogJ1BhcmFncmFwaCcsICdwcmUnIDogJ1ByZScsICdoNicgOiAnSGVhZGluZyZuYnNwOzYnLCAnaDUnIDogJ0hlYWRpbmcmbmJzcDs1JywgJ2g0JyA6ICdIZWFkaW5nJm5ic3A7NCcsICdoMycgOiAnSGVhZGluZyZuYnNwOzMnLCAnaDInIDogJ0hlYWRpbmcmbmJzcDsyJywgJ2gxJyA6ICdIZWFkaW5nJm5ic3A7MSd9LAoJCQoJaW5pdCA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc2V0RGlzcGxheSgnRm9udCZuYnNwO0Zvcm1hdC4uLicpOwoJCWZvcihpdG0gaW4gdGhpcy5zZWwpIHsKCQkJdmFyIHRhZyA9IGl0bS50b1VwcGVyQ2FzZSgpOwoJCQl0aGlzLmFkZCgnPCcrdGFnKyc+JywnPCcraXRtKycgc3R5bGU9InBhZGRpbmc6IDBweDsgbWFyZ2luOiAwcHg7Ij4nK3RoaXMuc2VsW2l0bV0rJzwvJyt0YWcrJz4nKTsKCQl9Cgl9Cn0pOwoKbmljRWRpdG9ycy5yZWdpc3RlclBsdWdpbihuaWNQbHVnaW4sbmljU2VsZWN0T3B0aW9ucyk7DQoNCgoKLyogU1RBUlQgQ09ORklHICovCnZhciBuaWNMaW5rT3B0aW9ucyA9IHsKCWJ1dHRvbnMgOiB7CgkJJ2xpbmsnIDoge25hbWUgOiAnQWRkIExpbmsnLCB0eXBlIDogJ25pY0xpbmtCdXR0b24nLCB0YWdzIDogWydBJ119LAoJCSd1bmxpbmsnIDoge25hbWUgOiAnUmVtb3ZlIExpbmsnLCAgY29tbWFuZCA6ICd1bmxpbmsnLCBub0FjdGl2ZSA6IHRydWV9Cgl9Cn07Ci8qIEVORCBDT05GSUcgKi8KCnZhciBuaWNMaW5rQnV0dG9uID0gbmljRWRpdG9yQWR2YW5jZWRCdXR0b24uZXh0ZW5kKHsJCglhZGRQYW5lIDogZnVuY3Rpb24oKSB7CgkJdGhpcy5sbiA9IHRoaXMubmUuc2VsZWN0ZWRJbnN0YW5jZS5zZWxFbG0oKS5wYXJlbnRUYWcoJ0EnKTsKCQl0aGlzLmFkZEZvcm0oewoJCQknJyA6IHt0eXBlIDogJ3RpdGxlJywgdHh0IDogJ0FkZC9FZGl0IExpbmsnfSwKCQkJJ2hyZWYnIDoge3R5cGUgOiAndGV4dCcsIHR4dCA6ICdVUkwnLCB2YWx1ZSA6ICdodHRwOi8vJywgc3R5bGUgOiB7d2lkdGg6ICcxNTBweCd9fSwKCQkJJ3RpdGxlJyA6IHt0eXBlIDogJ3RleHQnLCB0eHQgOiAnVGl0bGUnfSwKCQkJJ3RhcmdldCcgOiB7dHlwZSA6ICdzZWxlY3QnLCB0eHQgOiAnT3BlbiBJbicsIG9wdGlvbnMgOiB7JycgOiAnQ3VycmVudCBXaW5kb3cnLCAnX2JsYW5rJyA6ICdOZXcgV2luZG93J30sc3R5bGUgOiB7d2lkdGggOiAnMTAwcHgnfX0KCQl9LHRoaXMubG4pOwoJfSwKCQoJc3VibWl0IDogZnVuY3Rpb24oZSkgewoJCXZhciB1cmwgPSB0aGlzLmlucHV0c1snaHJlZiddLnZhbHVlOwoJCWlmKHVybCA9PSAiaHR0cDovLyIgfHwgdXJsID09ICIiKSB7CgkJCWFsZXJ0KCJZb3UgbXVzdCBlbnRlciBhIFVSTCB0byBDcmVhdGUgYSBMaW5rIik7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJdGhpcy5yZW1vdmVQYW5lKCk7CgkJCgkJaWYoIXRoaXMubG4pIHsKCQkJdmFyIHRtcCA9ICdqYXZhc2NyaXB0Om5pY1RlbXAoKTsnOwoJCQl0aGlzLm5lLm5pY0NvbW1hbmQoImNyZWF0ZWxpbmsiLHRtcCk7CgkJCXRoaXMubG4gPSB0aGlzLmZpbmRFbG0oJ0EnLCdocmVmJyx0bXApOwoJCX0KCQlpZih0aGlzLmxuKSB7CgkJCXRoaXMubG4uc2V0QXR0cmlidXRlcyh7CgkJCQlocmVmIDogdGhpcy5pbnB1dHNbJ2hyZWYnXS52YWx1ZSwKCQkJCXRpdGxlIDogdGhpcy5pbnB1dHNbJ3RpdGxlJ10udmFsdWUsCgkJCQl0YXJnZXQgOiB0aGlzLmlucHV0c1sndGFyZ2V0J10ub3B0aW9uc1t0aGlzLmlucHV0c1sndGFyZ2V0J10uc2VsZWN0ZWRJbmRleF0udmFsdWUKCQkJfSk7CgkJfQoJfQp9KTsKCm5pY0VkaXRvcnMucmVnaXN0ZXJQbHVnaW4obmljUGx1Z2luLG5pY0xpbmtPcHRpb25zKTsNCg0KCgovKiBTVEFSVCBDT05GSUcgKi8KdmFyIG5pY0NvbG9yT3B0aW9ucyA9IHsKCWJ1dHRvbnMgOiB7CgkJJ2ZvcmVjb2xvcicgOiB7bmFtZSA6IF9fKCdDaGFuZ2UgVGV4dCBDb2xvcicpLCB0eXBlIDogJ25pY0VkaXRvckNvbG9yQnV0dG9uJywgbm9DbG9zZSA6IHRydWV9LAoJCSdiZ2NvbG9yJyA6IHtuYW1lIDogX18oJ0NoYW5nZSBCYWNrZ3JvdW5kIENvbG9yJyksIHR5cGUgOiAnbmljRWRpdG9yQmdDb2xvckJ1dHRvbicsIG5vQ2xvc2UgOiB0cnVlfQoJfQp9OwovKiBFTkQgQ09ORklHICovCgp2YXIgbmljRWRpdG9yQ29sb3JCdXR0b24gPSBuaWNFZGl0b3JBZHZhbmNlZEJ1dHRvbi5leHRlbmQoewkKCWFkZFBhbmUgOiBmdW5jdGlvbigpIHsKCQkJdmFyIGNvbG9yTGlzdCA9IHswIDogJzAwJywxIDogJzMzJywyIDogJzY2JywzIDonOTknLDQgOiAnQ0MnLDUgOiAnRkYnfTsKCQkJdmFyIGNvbG9ySXRlbXMgPSBuZXcgYmtFbGVtZW50KCdESVYnKS5zZXRTdHlsZSh7d2lkdGg6ICcyNzBweCd9KTsKCQkJCgkJCWZvcih2YXIgciBpbiBjb2xvckxpc3QpIHsKCQkJCWZvcih2YXIgYiBpbiBjb2xvckxpc3QpIHsKCQkJCQlmb3IodmFyIGcgaW4gY29sb3JMaXN0KSB7CgkJCQkJCXZhciBjb2xvckNvZGUgPSAnIycrY29sb3JMaXN0W3JdK2NvbG9yTGlzdFtnXStjb2xvckxpc3RbYl07CgkJCQkJCQoJCQkJCQl2YXIgY29sb3JTcXVhcmUgPSBuZXcgYmtFbGVtZW50KCdESVYnKS5zZXRTdHlsZSh7J2N1cnNvcicgOiAncG9pbnRlcicsICdoZWlnaHQnIDogJzE1cHgnLCAnZmxvYXQnIDogJ2xlZnQnfSkuYXBwZW5kVG8oY29sb3JJdGVtcyk7CgkJCQkJCXZhciBjb2xvckJvcmRlciA9IG5ldyBia0VsZW1lbnQoJ0RJVicpLnNldFN0eWxlKHtib3JkZXI6ICcycHggc29saWQgJytjb2xvckNvZGV9KS5hcHBlbmRUbyhjb2xvclNxdWFyZSk7CgkJCQkJCXZhciBjb2xvcklubmVyID0gbmV3IGJrRWxlbWVudCgnRElWJykuc2V0U3R5bGUoe2JhY2tncm91bmRDb2xvciA6IGNvbG9yQ29kZSwgb3ZlcmZsb3cgOiAnaGlkZGVuJywgd2lkdGggOiAnMTFweCcsIGhlaWdodCA6ICcxMXB4J30pLmFkZEV2ZW50KCdjbGljaycsdGhpcy5jb2xvclNlbGVjdC5jbG9zdXJlKHRoaXMsY29sb3JDb2RlKSkuYWRkRXZlbnQoJ21vdXNlb3ZlcicsdGhpcy5vbi5jbG9zdXJlKHRoaXMsY29sb3JCb3JkZXIpKS5hZGRFdmVudCgnbW91c2VvdXQnLHRoaXMub2ZmLmNsb3N1cmUodGhpcyxjb2xvckJvcmRlcixjb2xvckNvZGUpKS5hcHBlbmRUbyhjb2xvckJvcmRlcik7CgkJCQkJCQoJCQkJCQlpZighd2luZG93Lm9wZXJhKSB7CgkJCQkJCQljb2xvclNxdWFyZS5vbm1vdXNlZG93biA9IGNvbG9ySW5uZXIub25tb3VzZWRvd24gPSBia0xpYi5jYW5jZWxFdmVudDsKCQkJCQkJfQoKCQkJCQl9CQoJCQkJfQkKCQkJfQoJCQl0aGlzLnBhbmUuYXBwZW5kKGNvbG9ySXRlbXMubm9TZWxlY3QoKSk7CQoJfSwKCQoJY29sb3JTZWxlY3QgOiBmdW5jdGlvbihjKSB7CgkJdGhpcy5uZS5uaWNDb21tYW5kKCdmb3JlQ29sb3InLGMpOwoJCXRoaXMucmVtb3ZlUGFuZSgpOwoJfSwKCQoJb24gOiBmdW5jdGlvbihjb2xvckJvcmRlcikgewoJCWNvbG9yQm9yZGVyLnNldFN0eWxlKHtib3JkZXIgOiAnMnB4IHNvbGlkICMwMDAnfSk7Cgl9LAoJCglvZmYgOiBmdW5jdGlvbihjb2xvckJvcmRlcixjb2xvckNvZGUpIHsKCQljb2xvckJvcmRlci5zZXRTdHlsZSh7Ym9yZGVyIDogJzJweCBzb2xpZCAnK2NvbG9yQ29kZX0pOwkJCgl9Cn0pOwoKdmFyIG5pY0VkaXRvckJnQ29sb3JCdXR0b24gPSBuaWNFZGl0b3JDb2xvckJ1dHRvbi5leHRlbmQoewoJY29sb3JTZWxlY3QgOiBmdW5jdGlvbihjKSB7CgkJdGhpcy5uZS5uaWNDb21tYW5kKCdoaWxpdGVDb2xvcicsYyk7CgkJdGhpcy5yZW1vdmVQYW5lKCk7Cgl9CQp9KTsKCm5pY0VkaXRvcnMucmVnaXN0ZXJQbHVnaW4obmljUGx1Z2luLG5pY0NvbG9yT3B0aW9ucyk7DQoNCgoKLyogU1RBUlQgQ09ORklHICovCnZhciBuaWNJbWFnZU9wdGlvbnMgPSB7CglidXR0b25zIDogewoJCSdpbWFnZScgOiB7bmFtZSA6ICdBZGQgSW1hZ2UnLCB0eXBlIDogJ25pY0ltYWdlQnV0dG9uJywgdGFncyA6IFsnSU1HJ119Cgl9CgkKfTsKLyogRU5EIENPTkZJRyAqLwoKdmFyIG5pY0ltYWdlQnV0dG9uID0gbmljRWRpdG9yQWR2YW5jZWRCdXR0b24uZXh0ZW5kKHsJCglhZGRQYW5lIDogZnVuY3Rpb24oKSB7CgkJdGhpcy5pbSA9IHRoaXMubmUuc2VsZWN0ZWRJbnN0YW5jZS5zZWxFbG0oKS5wYXJlbnRUYWcoJ0lNRycpOwoJCXRoaXMuYWRkRm9ybSh7CgkJCScnIDoge3R5cGUgOiAndGl0bGUnLCB0eHQgOiAnQWRkL0VkaXQgSW1hZ2UnfSwKCQkJJ3NyYycgOiB7dHlwZSA6ICd0ZXh0JywgdHh0IDogJ1VSTCcsICd2YWx1ZScgOiAnaHR0cDovLycsIHN0eWxlIDoge3dpZHRoOiAnMTUwcHgnfX0sCgkJCSdhbHQnIDoge3R5cGUgOiAndGV4dCcsIHR4dCA6ICdBbHQgVGV4dCcsIHN0eWxlIDoge3dpZHRoOiAnMTAwcHgnfX0sCgkJCSdhbGlnbicgOiB7dHlwZSA6ICdzZWxlY3QnLCB0eHQgOiAnQWxpZ24nLCBvcHRpb25zIDoge25vbmUgOiAnRGVmYXVsdCcsJ2xlZnQnIDogJ0xlZnQnLCAncmlnaHQnIDogJ1JpZ2h0J319CgkJfSx0aGlzLmltKTsKCX0sCgkKCXN1Ym1pdCA6IGZ1bmN0aW9uKGUpIHsKCQl2YXIgc3JjID0gdGhpcy5pbnB1dHNbJ3NyYyddLnZhbHVlOwoJCWlmKHNyYyA9PSAiIiB8fCBzcmMgPT0gImh0dHA6Ly8iKSB7CgkJCWFsZXJ0KCJZb3UgbXVzdCBlbnRlciBhIEltYWdlIFVSTCB0byBpbnNlcnQiKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQl0aGlzLnJlbW92ZVBhbmUoKTsKCgkJaWYoIXRoaXMuaW0pIHsKCQkJdmFyIHRtcCA9ICdqYXZhc2NyaXB0Om5pY0ltVGVtcCgpOyc7CgkJCXRoaXMubmUubmljQ29tbWFuZCgiaW5zZXJ0SW1hZ2UiLHRtcCk7CgkJCXRoaXMuaW0gPSB0aGlzLmZpbmRFbG0oJ0lNRycsJ3NyYycsdG1wKTsKCQl9CgkJaWYodGhpcy5pbSkgewoJCQl0aGlzLmltLnNldEF0dHJpYnV0ZXMoewoJCQkJc3JjIDogdGhpcy5pbnB1dHNbJ3NyYyddLnZhbHVlLAoJCQkJYWx0IDogdGhpcy5pbnB1dHNbJ2FsdCddLnZhbHVlLAoJCQkJYWxpZ24gOiB0aGlzLmlucHV0c1snYWxpZ24nXS52YWx1ZQoJCQl9KTsKCQl9Cgl9Cn0pOwoKbmljRWRpdG9ycy5yZWdpc3RlclBsdWdpbihuaWNQbHVnaW4sbmljSW1hZ2VPcHRpb25zKTsKDQoNCgoKLyogU1RBUlQgQ09ORklHICovCnZhciBuaWNTYXZlT3B0aW9ucyA9IHsKCWJ1dHRvbnMgOiB7CgkJJ3NhdmUnIDoge25hbWUgOiBfXygnU2F2ZSB0aGlzIGNvbnRlbnQnKSwgdHlwZSA6ICduaWNFZGl0b3JTYXZlQnV0dG9uJ30KCX0KfTsKLyogRU5EIENPTkZJRyAqLwoKdmFyIG5pY0VkaXRvclNhdmVCdXR0b24gPSBuaWNFZGl0b3JCdXR0b24uZXh0ZW5kKHsKCWluaXQgOiBmdW5jdGlvbigpIHsKCQlpZighdGhpcy5uZS5vcHRpb25zLm9uU2F2ZSkgewoJCQl0aGlzLm1hcmdpbi5zZXRTdHlsZSh7J2Rpc3BsYXknIDogJ25vbmUnfSk7CgkJfQoJfSwKCW1vdXNlQ2xpY2sgOiBmdW5jdGlvbigpIHsKCQl2YXIgb25TYXZlID0gdGhpcy5uZS5vcHRpb25zLm9uU2F2ZTsKCQl2YXIgc2VsZWN0ZWRJbnN0YW5jZSA9IHRoaXMubmUuc2VsZWN0ZWRJbnN0YW5jZTsKCQlvblNhdmUoc2VsZWN0ZWRJbnN0YW5jZS5nZXRDb250ZW50KCksIHNlbGVjdGVkSW5zdGFuY2UuZWxtLmlkLCBzZWxlY3RlZEluc3RhbmNlKTsKCX0KfSk7CgpuaWNFZGl0b3JzLnJlZ2lzdGVyUGx1Z2luKG5pY1BsdWdpbixuaWNTYXZlT3B0aW9ucyk7DQoNCgp2YXIgbmljWEhUTUwgPSBia0NsYXNzLmV4dGVuZCh7CglzdHJpcEF0dHJpYnV0ZXMgOiBbJ19tb3pfZGlydHknLCdfbW96X3Jlc2l6aW5nJywnX2V4dGVuZGVkJ10sCglub1Nob3J0IDogWydzdHlsZScsJ3RpdGxlJywnc2NyaXB0JywndGV4dGFyZWEnLCdhJ10sCgljc3NSZXBsYWNlIDogeydmb250LXdlaWdodDpib2xkOycgOiAnc3Ryb25nJywgJ2ZvbnQtc3R5bGU6aXRhbGljOycgOiAnZW0nfSwKCXNpemVzIDogezEgOiAneHgtc21hbGwnLCAyIDogJ3gtc21hbGwnLCAzIDogJ3NtYWxsJywgNCA6ICdtZWRpdW0nLCA1IDogJ2xhcmdlJywgNiA6ICd4LWxhcmdlJ30sCgkKCWNvbnN0cnVjdCA6IGZ1bmN0aW9uKG5pY0VkaXRvcikgewoJCXRoaXMubmUgPSBuaWNFZGl0b3I7CgkJaWYodGhpcy5uZS5vcHRpb25zLnhodG1sKSB7CgkJCW5pY0VkaXRvci5hZGRFdmVudCgnZ2V0Jyx0aGlzLmNsZWFudXAuY2xvc3VyZSh0aGlzKSk7CgkJfQoJfSwKCQoJY2xlYW51cCA6IGZ1bmN0aW9uKG5pKSB7CgkJdmFyIG5vZGUgPSBuaS5nZXRFbG0oKTsKCQl2YXIgeGh0bWwgPSB0aGlzLnRvWEhUTUwobm9kZSk7CgkJbmkuY29udGVudCA9IHhodG1sOwoJfSwKCQoJdG9YSFRNTCA6IGZ1bmN0aW9uKG4scixkKSB7CgkJdmFyIHR4dCA9ICcnOwoJCXZhciBhdHRyVHh0ID0gJyc7CgkJdmFyIGNzc1R4dCA9ICcnOwoJCXZhciBuVHlwZSA9IG4ubm9kZVR5cGU7CgkJdmFyIG5OYW1lID0gbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCXZhciBuQ2hpbGQgPSBuLmhhc0NoaWxkTm9kZXMgJiYgbi5oYXNDaGlsZE5vZGVzKCk7CgkJdmFyIGV4dHJhTm9kZXMgPSBuZXcgQXJyYXkoKTsKCQkKCQlzd2l0Y2goblR5cGUpIHsKCQkJY2FzZSAxOgoJCQkJdmFyIG5BdHRyaWJ1dGVzID0gbi5hdHRyaWJ1dGVzOwoJCQkJCgkJCQlzd2l0Y2gobk5hbWUpIHsKCQkJCQljYXNlICdiJzoKCQkJCQkJbk5hbWUgPSAnc3Ryb25nJzsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnaSc6CgkJCQkJCW5OYW1lID0gJ2VtJzsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnZm9udCc6CgkJCQkJCW5OYW1lID0gJ3NwYW4nOwoJCQkJCQlicmVhazsKCQkJCX0KCQkJCQoJCQkJaWYocikgewoJCQkJCWZvcih2YXIgaT0wO2k8bkF0dHJpYnV0ZXMubGVuZ3RoO2krKykgewoJCQkJCQl2YXIgYXR0ciA9IG5BdHRyaWJ1dGVzW2ldOwoJCQkJCQkKCQkJCQkJdmFyIGF0dHJpYnV0ZU5hbWUgPSBhdHRyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCQkJCXZhciBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHIubm9kZVZhbHVlOwoJCQkJCQkKCQkJCQkJaWYoIWF0dHIuc3BlY2lmaWVkIHx8ICFhdHRyaWJ1dGVWYWx1ZSB8fCBia0xpYi5pbkFycmF5KHRoaXMuc3RyaXBBdHRyaWJ1dGVzLGF0dHJpYnV0ZU5hbWUpIHx8IHR5cGVvZihhdHRyaWJ1dGVWYWx1ZSkgPT0gImZ1bmN0aW9uIikgewoJCQkJCQkJY29udGludWU7CgkJCQkJCX0KCQkJCQkJCgkJCQkJCXN3aXRjaChhdHRyaWJ1dGVOYW1lKSB7CgkJCQkJCQljYXNlICdzdHlsZSc6CgkJCQkJCQkJdmFyIGNzcyA9IGF0dHJpYnV0ZVZhbHVlLnJlcGxhY2UoLyAvZywiIik7CgkJCQkJCQkJZm9yKGl0bSBpbiB0aGlzLmNzc1JlcGxhY2UpIHsKCQkJCQkJCQkJaWYoY3NzLmluZGV4T2YoaXRtKSAhPSAtMSkgewoJCQkJCQkJCQkJZXh0cmFOb2Rlcy5wdXNoKHRoaXMuY3NzUmVwbGFjZVtpdG1dKTsKCQkJCQkJCQkJCWNzcyA9IGNzcy5yZXBsYWNlKGl0bSwnJyk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQkJY3NzVHh0ICs9IGNzczsKCQkJCQkJCQlhdHRyaWJ1dGVWYWx1ZSA9ICIiOwoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdjbGFzcyc6CgkJCQkJCQkJYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVWYWx1ZS5yZXBsYWNlKCJBcHBsZS1zdHlsZS1zcGFuIiwiIik7CgkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3NpemUnOgoJCQkJCQkJCWNzc1R4dCArPSAiZm9udC1zaXplOiIrdGhpcy5zaXplc1thdHRyaWJ1dGVWYWx1ZV0rJzsnOwoJCQkJCQkJCWF0dHJpYnV0ZVZhbHVlID0gIiI7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQkKCQkJCQkJaWYoYXR0cmlidXRlVmFsdWUpIHsKCQkJCQkJCWF0dHJUeHQgKz0gJyAnK2F0dHJpYnV0ZU5hbWUrJz0iJythdHRyaWJ1dGVWYWx1ZSsnIic7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCWlmKGNzc1R4dCkgewoJCQkJCQlhdHRyVHh0ICs9ICcgc3R5bGU9IicrY3NzVHh0KyciJzsKCQkJCQl9CgoJCQkJCWZvcih2YXIgaT0wO2k8ZXh0cmFOb2Rlcy5sZW5ndGg7aSsrKSB7CgkJCQkJCXR4dCArPSAnPCcrZXh0cmFOb2Rlc1tpXSsnPic7CgkJCQkJfQoJCQkJCgkJCQkJaWYoYXR0clR4dCA9PSAiIiAmJiBuTmFtZSA9PSAic3BhbiIpIHsKCQkJCQkJciA9IGZhbHNlOwoJCQkJCX0KCQkJCQlpZihyKSB7CgkJCQkJCXR4dCArPSAnPCcrbk5hbWU7CgkJCQkJCWlmKG5OYW1lICE9ICdicicpIHsKCQkJCQkJCXR4dCArPSBhdHRyVHh0OwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJCgoJCQkJCgkJCQlpZighbkNoaWxkICYmICFia0xpYi5pbkFycmF5KHRoaXMubm9TaG9ydCxhdHRyaWJ1dGVOYW1lKSkgewoJCQkJCWlmKHIpIHsKCQkJCQkJdHh0ICs9ICcgLz4nOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJaWYocikgewoJCQkJCQl0eHQgKz0gJz4nOwoJCQkJCX0KCQkJCQkKCQkJCQlmb3IodmFyIGk9MDtpPG4uY2hpbGROb2Rlcy5sZW5ndGg7aSsrKSB7CgkJCQkJCXZhciByZXN1bHRzID0gdGhpcy50b1hIVE1MKG4uY2hpbGROb2Rlc1tpXSx0cnVlLHRydWUpOwoJCQkJCQlpZihyZXN1bHRzKSB7CgkJCQkJCQl0eHQgKz0gcmVzdWx0czsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCQkKCQkJCWlmKHIgJiYgbkNoaWxkKSB7CgkJCQkJdHh0ICs9ICc8Lycrbk5hbWUrJz4nOwoJCQkJfQoJCQkJCgkJCQlmb3IodmFyIGk9MDtpPGV4dHJhTm9kZXMubGVuZ3RoO2krKykgewoJCQkJCXR4dCArPSAnPC8nK2V4dHJhTm9kZXNbaV0rJz4nOwoJCQkJfQoKCQkJCWJyZWFrOwoJCQljYXNlIDM6CgkJCQkvL2lmKG4ubm9kZVZhbHVlICE9ICdcbicpIHsKCQkJCQl0eHQgKz0gbi5ub2RlVmFsdWU7CgkJCQkvL30KCQkJCWJyZWFrOwoJCX0KCQkKCQlyZXR1cm4gdHh0OwoJfQp9KTsKbmljRWRpdG9ycy5yZWdpc3RlclBsdWdpbihuaWNYSFRNTCk7Cg0KDQoKCi8qIFNUQVJUIENPTkZJRyAqLwp2YXIgbmljQ29kZU9wdGlvbnMgPSB7CglidXR0b25zIDogewoJCSd4aHRtbCcgOiB7bmFtZSA6ICdFZGl0IEhUTUwnLCB0eXBlIDogJ25pY0NvZGVCdXR0b24nfQoJfQoJCn07Ci8qIEVORCBDT05GSUcgKi8KCnZhciBuaWNDb2RlQnV0dG9uID0gbmljRWRpdG9yQWR2YW5jZWRCdXR0b24uZXh0ZW5kKHsKCXdpZHRoIDogJzM1MHB4JywKCQkKCWFkZFBhbmUgOiBmdW5jdGlvbigpIHsKCQl0aGlzLmFkZEZvcm0oewoJCQknJyA6IHt0eXBlIDogJ3RpdGxlJywgdHh0IDogJ0VkaXQgSFRNTCd9LAoJCQknY29kZScgOiB7dHlwZSA6ICdjb250ZW50JywgJ3ZhbHVlJyA6IHRoaXMubmUuc2VsZWN0ZWRJbnN0YW5jZS5nZXRDb250ZW50KCksIHN0eWxlIDoge3dpZHRoOiAnMzQwcHgnLCBoZWlnaHQgOiAnMjAwcHgnfX0KCQl9KTsKCX0sCgkKCXN1Ym1pdCA6IGZ1bmN0aW9uKGUpIHsKCQl2YXIgY29kZSA9IHRoaXMuaW5wdXRzWydjb2RlJ10udmFsdWU7CgkJdGhpcy5uZS5zZWxlY3RlZEluc3RhbmNlLnNldENvbnRlbnQoY29kZSk7CgkJdGhpcy5yZW1vdmVQYW5lKCk7Cgl9Cn0pOwoKbmljRWRpdG9ycy5yZWdpc3RlclBsdWdpbihuaWNQbHVnaW4sbmljQ29kZU9wdGlvbnMpOwoNCg0K]]></data>
	</file>
	<file>
	  <filename>/plugins/nicedit/js/touchInlineEdit.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqICRJZDogdG91Y2hJbmxpbmVFZGl0LmpzIDY2IDIwMTAtMDktMjQgMTQ6MjI6MTJaIHRvdWNoZGVzaWduICQKICoKICogdG91Y2hJbmxpbmVFZGl0IE1vZHVsZQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAgdG91Y2hEZXNpZ24sIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqCiAqIEBjYXRlZ29yeSBNb2R1bGUKICogQGF1dGhvciBDaHJpc3RvcGggR3J1YmVyIDx3d3cudG91Y2hkZXNpZ24uZGU+CiAqIEB2ZXJzaW9uIDEuNwogKiBAY29weXJpZ2h0IDA0LjA4LjIwMTAgdG91Y2hEZXNpZ24KICogQGxpbmsgaHR0cDovL3d3dy50b3VjaGRlc2lnbi5kZS8KICogQGxpbmsgaHR0cDovL3d3dy5ob21lcGFnZS1jb21tdW5pdHkuZGUvaW5kZXgucGhwP3RvcGljPTE2ODAuMAogKiBAbGluayBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3RvdWNoSW5saW5lRWRpdAogKiBAbGljZW5zZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCAyLjApCiAqIEB0b2RvIGFkZCBjb250ZW50X2Jsb2NrIGhhbmRsaW5nCiAqIAogKiAtLQogKgogKiBVc2FnZTogCiAqCiAqIHtjbXNfbW9kdWxlIG1vZHVsZT0idG91Y2hJbmxpbmVFZGl0In0KICoKICoge2NvbnRlbnQgaXNlZGl0YWJsZT0ndHJ1ZSd9CiAqCiAqIC0tCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKICoKICovCgpmdW5jdGlvbiB0b3VjaElubGluZUVkaXRJbml0RWRpdG9yKCl7CgoJY0Jsb2NrTWFpbiA9IG5ldyBuaWNFZGl0b3IoewoJCWZ1bGxQYW5lbDogdGllRnVsbFBhbmVsLAoJCWljb25zUGF0aDogdGllSWNvbnNQYXRoLAoJCW9uU2F2ZTogZnVuY3Rpb24oY29udGVudCxpZCxpbnN0YW5jZSl7dG91Y2hJbmxpbmVFZGl0U2F2ZShpZCxjb250ZW50KX0KCX0pLnBhbmVsSW5zdGFuY2UoCgkJJ3RvdWNoSW5saW5lRWRpdElkJyArIHRpZUNvbnRlbnRJZCwKCQl7aGFzUGFuZWwgOiB0cnVlfQoJKTsKfQoKZnVuY3Rpb24gdG91Y2hJbmxpbmVFZGl0UmVtb3ZlRWRpdG9yKCl7CgoJY0Jsb2NrTWFpbi5yZW1vdmVJbnN0YW5jZSgndG91Y2hJbmxpbmVFZGl0SWQnICsgdGllQ29udGVudElkKTsKCWNCbG9ja01haW4gPSBudWxsOwp9CgpmdW5jdGlvbiB0b3VjaElubGluZUVkaXRUb2dnbGVFZGl0b3IoKXsKCglpZighY0Jsb2NrTWFpbil7CgkJdG91Y2hJbmxpbmVFZGl0SW5pdENvbnRlbnQoKTsKCQl0b3VjaElubGluZUVkaXRJbml0RWRpdG9yKCk7Cgl9ZWxzZXsKCQl0b3VjaElubGluZUVkaXRSZW1vdmVFZGl0b3IoKTsKCX0KfQoKZnVuY3Rpb24gdG91Y2hJbmxpbmVFZGl0SW5pdENvbnRlbnQoKXsKCgkkLmFqYXgoe2FzeW5jOmZhbHNlLAoJCXR5cGU6ICdQT1NUJywKCQl1cmw6IHRpZVJlcXVlc3RVcmksCgkJZGF0YTogJ21ldGhvZD1nZXRDb250ZW50JmlkPScgKyB0aWVDb250ZW50SWQsCgkJc3VjY2VzczogZnVuY3Rpb24oZGF0YSl7CgkJCSQoJyN0b3VjaElubGluZUVkaXRJZCcgKyB0aWVDb250ZW50SWQpLmh0bWwoZGF0YSk7CgkJfQoJfSk7Cn0KCmZ1bmN0aW9uIHRvdWNoSW5saW5lRWRpdFNhdmUoaWQsY29udGVudCl7CgoJJC5wb3N0KHRpZVJlcXVlc3RVcmksIHsgbWV0aG9kOiAidXBkYXRlQ29udGVudCIsIGlkOiB0aWVDb250ZW50SWQsIGNvbnRlbnQ6IGNvbnRlbnQgfSwKCQlmdW5jdGlvbihkYXRhKXsKCQkJaWYodGllVXBkYXRlQWxlcnQpewoJCQkJYWxlcnQodGllVXBkYXRlQWxlcnRNZXNzYWdlKTsKCQkJfQoJCQl0b3VjaElubGluZUVkaXRUb2dnbGVFZGl0b3IoKTsKCQkJJCgnI3RvdWNoSW5saW5lRWRpdElkJyArIHRpZUNvbnRlbnRJZCkuaHRtbChkYXRhKTsKCQl9CgkpOwp9CgpmdW5jdGlvbiBmdW5jdGlvbkV4aXN0cyhuYW1lKXsKCXJldHVybiAodHlwZW9mIG5hbWUgPT0gJ2Z1bmN0aW9uJyk7Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CgoJJCgnLnRvdWNoSW5saW5lRWRpdEJ1dHRvbicpLmNsaWNrKGZ1bmN0aW9uKCl7CgkJdG91Y2hJbmxpbmVFZGl0VG9nZ2xlRWRpdG9yKCk7CgkJcmV0dXJuIGZhbHNlOwoJfSk7CgoJaWYodGllRWRpdE9uRGJsQ2xpY2spewoJCSQoJy50b3VjaElubGluZUVkaXQnKS5kYmxjbGljayhmdW5jdGlvbigpewoJCQl0b3VjaElubGluZUVkaXRUb2dnbGVFZGl0b3IoKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0pOwoJfQp9KTs=]]></data>
	</file>
	<file>
	  <filename>/plugins/nicedit/nicedit.plugin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogbmljZWRpdC5wbHVnaW4ucGhwIDY2IDIwMTAtMDktMjQgMTQ6MjI6MTJaIHRvdWNoZGVzaWduICQKICoKICogdG91Y2hJbmxpbmVFZGl0IG5pY2VkaXQgcGx1Z2luCiAqCiAqIENvcHlyaWdodCAoYykgMjAxMCB0b3VjaERlc2lnbiwgPHd3dy50b3VjaGRlc2lnbi5kZT4KICoKICogQGNhdGVnb3J5IE1vZHVsZQogKiBAYXV0aG9yIENocmlzdG9waCBHcnViZXIgPHd3dy50b3VjaGRlc2lnbi5kZT4KICogQHZlcnNpb24gMS43CiAqIEBjb3B5cmlnaHQgMDQuMDguMjAxMCB0b3VjaERlc2lnbgogKiBAbGluayBodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLwogKiBAbGluayBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wCiAqIEBsaW5rIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hJbmxpbmVFZGl0CiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMIDIuMCkKICogQHRvZG8gYWRkIGNvbnRlbnRfYmxvY2sgaGFuZGxpbmcKICogCiAqIC0tCiAqCiAqIFVzYWdlOiAKICoKICoge2Ntc19tb2R1bGUgbW9kdWxlPSJ0b3VjaElubGluZUVkaXQifQogKgogKiB7Y29udGVudCBpc2VkaXRhYmxlPSd0cnVlJ30KICoKICogLS0KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICogT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAogKgogKi8KCmNsYXNzIG5pY2VkaXQgZXh0ZW5kcyB0b3VjaElubGluZUVkaXQgewoKCXZhciAkbmFtZSA9ICduaWNlZGl0JzsKCXZhciAkc21hcnR5OwoJdmFyICRwbHVnaW5EaXI7CgoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoKXsKCQlnbG9iYWwgJGdDbXM7CgoJCSR0aGlzLT5wbHVnaW5EaXIgPSAnbW9kdWxlcy8nIC4gJHRoaXMtPmdldE5hbWUoKSAuICcvJyAKCQkJLiBUSUVfUExVR0lOX0RJUiAuICR0aGlzLT5uYW1lOwoKCQkkdGhpcy0+c21hcnR5ID0gJiRnQ21zLT5zbWFydHk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoKXsKCQkkdGhpcy0+U2V0UHJlZmVyZW5jZSgidG91Y2hJbmxpbmVFZGl0LiIuJHRoaXMtPm5hbWUuIi5GdWxsUGFuZWwiLCJ0cnVlIik7CgkJJHRoaXMtPlNldFByZWZlcmVuY2UoInRvdWNoSW5saW5lRWRpdC4iLiR0aGlzLT5uYW1lLiIuSlF1ZXJ5TG9hZCIsInRydWUiKTsKCX0KCglwcml2YXRlIGZ1bmN0aW9uIGZldGNoKCR0ZW1wbGF0ZSl7CgkJZ2xvYmFsICRnQ21zOwoKCQkkY29uZmlnID0gJiRnQ21zLT5jb25maWc7CgoJCXJldHVybiAkdGhpcy0+c21hcnR5LT5mZXRjaCgkY29uZmlnWydyb290X3BhdGgnXSAuICcvJwoJCQkuICR0aGlzLT5wbHVnaW5EaXIKCQkJLiAnL3RlbXBsYXRlcy8nIC4gJHRlbXBsYXRlKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gZ2V0QWRtaW5Db25maWcoJGlkLCRyZXR1cm5pZCl7CgoJCSRib29sID0gYXJyYXkoCgkJCSR0aGlzLT5MYW5nKCJ5ZXMiKSA9PiAndHJ1ZScsCgkJCSR0aGlzLT5MYW5nKCJubyIpID0+ICdmYWxzZScKCQkpOwoKCQkvLyBGb3JtIHN0YXJ0CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmb3Jtc3RhcnQnLCR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCJzYXZlZWRpdG9yIiwkcmV0dXJuaWQpKTsKCgkJLy8gRW5hYmxlIGZ1bGwgcGFuZWwgaW4gRkUKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ0Z1bGxQYW5lbF9sYWJlbCcsJHRoaXMtPkxhbmcoJHRoaXMtPm5hbWUuIkZ1bGxQYW5lbF9sYWJlbCIpKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ0Z1bGxQYW5lbF9oZWxwJywkdGhpcy0+TGFuZygkdGhpcy0+bmFtZS4iRnVsbFBhbmVsX2hlbHAiKSk7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidGdWxsUGFuZWxfaW5wdXQnLCR0aGlzLT5DcmVhdGVJbnB1dFJhZGlvR3JvdXAoJGlkLCR0aGlzLT5uYW1lLiJGdWxsUGFuZWwiLAoJCQkkYm9vbCwkdGhpcy0+R2V0UHJlZmVyZW5jZSgidG91Y2hJbmxpbmVFZGl0LiIuJHRoaXMtPm5hbWUuIi5GdWxsUGFuZWwiLCJ0cnVlIiksIiIsIlxuIikpOwoKCQkvLyBqcXVlcnkgbGliCgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5uYW1lLidKUXVlcnlMb2FkX2xhYmVsJywkdGhpcy0+TGFuZygkdGhpcy0+bmFtZS4iSlF1ZXJ5TG9hZF9sYWJlbCIpKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ0pRdWVyeUxvYWRfaGVscCcsJHRoaXMtPkxhbmcoJHRoaXMtPm5hbWUuIkpRdWVyeUxvYWRfaGVscCIpKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPm5hbWUuJ0pRdWVyeUxvYWRfaW5wdXQnLCR0aGlzLT5DcmVhdGVJbnB1dFJhZGlvR3JvdXAoJGlkLCR0aGlzLT5uYW1lLiJKUXVlcnlMb2FkIiwKCQkJJGJvb2wsJHRoaXMtPkdldFByZWZlcmVuY2UoInRvdWNoSW5saW5lRWRpdC4iLiR0aGlzLT5uYW1lLiIuSlF1ZXJ5TG9hZCIsInRydWUiKSwiIiwiXG4iKSk7CgoJCS8vIFN1Ym1pdCAvIGNhbmNlbAoJCSR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCJzdWJtaXQiLCR0aGlzLT5MYW5nKCJzYXZlIikpKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NhbmNlbCcsJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwiY2FuY2VsIiwkdGhpcy0+TGFuZygiY2FuY2VsIikpKTsKCgkJLy8gRm9ybSBlbmQKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Zvcm1lbmQnLCR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwoKCQllY2hvICR0aGlzLT5mZXRjaCgiYWRtaW5lZGl0b3IudHBsIik7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHNhdmVBZG1pbkNvbmZpZygkcGFyYW1zKXsKCgkJaWYoaXNzZXQoJHBhcmFtc1skdGhpcy0+bmFtZS4iRnVsbFBhbmVsIl0pICYmICFlbXB0eSgkcGFyYW1zWyR0aGlzLT5uYW1lLiJGdWxsUGFuZWwiXSkpewoJCQkkdGhpcy0+U2V0UHJlZmVyZW5jZSgidG91Y2hJbmxpbmVFZGl0LiIuJHRoaXMtPm5hbWUuIi5GdWxsUGFuZWwiLCRwYXJhbXNbJHRoaXMtPm5hbWUuIkZ1bGxQYW5lbCJdKTsKCQl9CgkJaWYoaXNzZXQoJHBhcmFtc1skdGhpcy0+bmFtZS4iSlF1ZXJ5TG9hZCJdKSAmJiAhZW1wdHkoJHBhcmFtc1skdGhpcy0+bmFtZS4iSlF1ZXJ5TG9hZCJdKSl7CgkJCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCJ0b3VjaElubGluZUVkaXQuIi4kdGhpcy0+bmFtZS4iLkpRdWVyeUxvYWQiLCRwYXJhbXNbJHRoaXMtPm5hbWUuIkpRdWVyeUxvYWQiXSk7CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXRIZWFkZXIoKXsKCQlnbG9iYWwgJGdDbXM7CgoJCSR0aWVQcmVmID0gJHRoaXMtPkdldFByZWZWYXJzKCk7CgkJJHRpZUxhbmcgPSAkdGhpcy0+R2V0TGFuZ1ZhcnMoKTsKCgkJJGhlYWQgPSAnPCEtLSAnLiR0aGlzLT5nZXROYW1lKCkuJyBtb2R1bGUgLS0+JyAuICJcbiI7CgoJCS8vIG5pY0VkaXQKCQkkaGVhZC49ICc8c2NyaXB0IHNyYz0iJy4kdGhpcy0+cGx1Z2luRGlyLicvanMvbmljRWRpdC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4nIC4gIlxuIjsKCgkJLy8galF1ZXJ5CgkJaWYoKGJvb2wpJHRoaXMtPkdldFByZWZlcmVuY2UoInRvdWNoSW5saW5lRWRpdC4iLiR0aGlzLT5uYW1lLiIuSlF1ZXJ5TG9hZCIpKXsKCQkJJGhlYWQuPSAnPHNjcmlwdCBzcmM9IicuJHRoaXMtPnBsdWdpbkRpci4nL2pzL2pxdWVyeS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4nIC4gIlxuIjsKCQl9CgoJCS8vIHRvdWNoSW5saW5lRWRpdAoJCSRoZWFkLj0gJzxzY3JpcHQgc3JjPSInLiR0aGlzLT5wbHVnaW5EaXIuJy9qcy90b3VjaElubGluZUVkaXQuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+JyAuICJcbiI7CgoJCS8vIFNjcmlwdAoJCSRzY3JpcHQgPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4nIC4gIlxuIjsKCQkkc2NyaXB0Lj0gJwl2YXIgY0Jsb2NrTWFpbjsnIC4gIlxuIjsKCQkkc2NyaXB0Lj0gJwl2YXIgdGllQ29udGVudElkID0gJy4kZ0Ntcy0+dmFyaWFibGVzWydjb250ZW50X2lkJ10uJzsnIC4gIlxuIjsKCQkkc2NyaXB0Lj0gJwl2YXIgdGllUmVxdWVzdFVyaSA9ICInLiRfU0VSVkVSWyJSRVFVRVNUX1VSSSJdLiciOycgLiAiXG4iOwoJCSRzY3JpcHQuPSAnCXZhciB0aWVVcGRhdGVBbGVydCA9ICcuJHRpZVByZWZbJ2ZlVXBkYXRlQWxlcnQnXS4nOycgLiAiXG4iOwoJCSRzY3JpcHQuPSAnCXZhciB0aWVVcGRhdGVBbGVydE1lc3NhZ2UgPSAiJy4kdGllTGFuZ1snZmVVcGRhdGVBbGVydCddLiciOycgLiAiXG4iOwoJCSRzY3JpcHQuPSAnCXZhciB0aWVGdWxsUGFuZWwgPSAnLiR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0b3VjaElubGluZUVkaXQuIi4kdGhpcy0+bmFtZS4iLkZ1bGxQYW5lbCIpLic7JyAuICJcbiI7CgkJJHNjcmlwdC49ICcJdmFyIHRpZUljb25zUGF0aCA9ICInLiR0aGlzLT5wbHVnaW5EaXIuJy9pbWcvbmljRWRpdG9ySWNvbnMuZ2lmIicuICJcbiI7CgkJJHNjcmlwdC49ICcJdmFyIHRpZUVkaXRPbkRibENsaWNrID0gJy4kdGllUHJlZlsnZmVFZGl0T25EYmxDbGljayddLic7JyAuICJcbiI7CgkJJHNjcmlwdC49ICc8L3NjcmlwdD4nIC4gIlxuIjsKCQkkc2NyaXB0Lj0gJzwhLS0gJy4kdGhpcy0+Z2V0TmFtZSgpLicgbW9kdWxlIC0tPicgLiAiXG4iOwoKCQlyZXR1cm4gJGhlYWQgLiAkc2NyaXB0OwoJfQp9Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/plugins/nicedit/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/plugins/nicedit/templates/admineditor.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRmb3Jtc3RhcnR9Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRuaWNlZGl0RnVsbFBhbmVsX2xhYmVsfTwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JG5pY2VkaXRGdWxsUGFuZWxfaW5wdXR9PGJyLz57JG5pY2VkaXRGdWxsUGFuZWxfaGVscH08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG5pY2VkaXRKUXVlcnlMb2FkX2xhYmVsfTwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JG5pY2VkaXRKUXVlcnlMb2FkX2lucHV0fTxici8+eyRuaWNlZGl0SlF1ZXJ5TG9hZF9oZWxwfTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPiZuYnNwOzwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JHN1Ym1pdH17JGNhbmNlbH08L3A+Cgk8L2Rpdj4KeyRmb3JtZW5kfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/admineditor.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRmb3Jtc3RhcnR9Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRmZVBsdWdpbl9sYWJlbH08L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRmZVBsdWdpbl9pbnB1dH08YnIvPnskZmVQbHVnaW5faGVscH08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JGZlRWRpdEJ1dHRvbl9sYWJlbH08L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRmZUVkaXRCdXR0b25faW5wdXR9PGJyLz57JGZlRWRpdEJ1dHRvbl9oZWxwfTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskZmVFZGl0T25EYmxDbGlja19sYWJlbH08L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRmZUVkaXRPbkRibENsaWNrX2lucHV0fTxici8+eyRmZUVkaXRPbkRibENsaWNrX2hlbHB9PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRmZUZ1bGxQYW5lbF9sYWJlbH08L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRmZUZ1bGxQYW5lbF9pbnB1dH08YnIvPnskZmVGdWxsUGFuZWxfaGVscH08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JGZlVXBkYXRlQWxlcnRfbGFiZWx9PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZmVVcGRhdGVBbGVydF9pbnB1dH08YnIvPnskZmVVcGRhdGVBbGVydF9oZWxwfTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskZmVKUXVlcnlMb2FkX2xhYmVsfTwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGZlSlF1ZXJ5TG9hZF9pbnB1dH08YnIvPnskZmVKUXVlcnlMb2FkX2hlbHB9PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRmZUNvbnRleHRNZW51X2xhYmVsfTwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGZlQ29udGV4dE1lbnVfaW5wdXR9PGJyLz57JGZlQ29udGV4dE1lbnVfaGVscH08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgoJPC9kaXY+CnskZm9ybWVuZH0=]]></data>
	</file>
	<file>
	  <filename>/templates/adminedittemplate.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRmb3Jtc3RhcnR9Cgl7JHRlbXBsYXRlfQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskdGVtcGxhdGVfbmFtZX08L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyR0ZW1wbGF0ZV9jb250ZW50fTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPiZuYnNwOzwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JHN1Ym1pdH17JHJlc2V0fTwvcD4KCTwvZGl2Pgp7JGZvcm1lbmR9Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/adminsettings.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRmb3Jtc3RhcnR9Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRmZVBsdWdpbl9sYWJlbH08L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRmZVBsdWdpbl9pbnB1dH08YnIvPnskZmVQbHVnaW5faGVscH08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JGZlRWRpdEJ1dHRvbl9sYWJlbH08L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRmZUVkaXRCdXR0b25faW5wdXR9PGJyLz57JGZlRWRpdEJ1dHRvbl9oZWxwfTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskZmVFZGl0T25EYmxDbGlja19sYWJlbH08L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRmZUVkaXRPbkRibENsaWNrX2lucHV0fTxici8+eyRmZUVkaXRPbkRibENsaWNrX2hlbHB9PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRmZVVwZGF0ZUFsZXJ0X2xhYmVsfTwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGZlVXBkYXRlQWxlcnRfaW5wdXR9PGJyLz57JGZlVXBkYXRlQWxlcnRfaGVscH08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgoJPC9kaXY+CnskZm9ybWVuZH0=]]></data>
	</file>
	<file>
	  <filename>/templates/admintemplates.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2xhc3M9InBhZ2V0YWJsZSI+Cgk8dGhlYWQ+Cgk8dHI+CgkJPHRoIGNsYXNzPSJwYWdldzIwIj57JHRhYmxlX2NvbF90ZW1wbGF0ZX08L3RoPgoJCTx0aCBjbGFzcz0icGFnZXcxMCI+Jm5ic3A7PC90aD4KCTwvdHI+Cgk8L3RoZWFkPgoJe2ZvcmVhY2ggZnJvbT0kaXRlbXMgaXRlbT1jb2x9Cgk8dGJvZHk+Cgk8dHIgY2xhc3M9InskY29sLT5yb3djbGFzc30iPgoJCTx0ZD57JGNvbC0+bmFtZX08L3RkPgoJCTx0ZD57JGNvbC0+ZWRpdGxpbmt9PC90ZD4KCTwvdHI+Cgk8L3Rib2R5PgoJey9mb3JlYWNofQoJPC90YWJsZT4KPC9kaXY+]]></data>
	</file>
	<file>
	  <filename>/touchInlineEdit.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqICRJZDogdG91Y2hJbmxpbmVFZGl0Lm1vZHVsZS5waHAgNjYgMjAxMC0wOS0yNCAxNDoyMjoxMlogdG91Y2hkZXNpZ24gJAogKgogKiB0b3VjaElubGluZUVkaXQgTW9kdWxlCiAqCiAqIENvcHlyaWdodCAoYykgMjAxMCB0b3VjaERlc2lnbiwgPHd3dy50b3VjaGRlc2lnbi5kZT4KICoKICogQGNhdGVnb3J5IE1vZHVsZQogKiBAYXV0aG9yIENocmlzdG9waCBHcnViZXIgPHd3dy50b3VjaGRlc2lnbi5kZT4KICogQHZlcnNpb24gMS43CiAqIEBjb3B5cmlnaHQgMDQuMDguMjAxMCB0b3VjaERlc2lnbgogKiBAbGluayBodHRwOi8vd3d3LnRvdWNoZGVzaWduLmRlLwogKiBAbGluayBodHRwOi8vd3d3LmhvbWVwYWdlLWNvbW11bml0eS5kZS9pbmRleC5waHA/dG9waWM9MTY4MC4wCiAqIEBsaW5rIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvdG91Y2hJbmxpbmVFZGl0CiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMIDIuMCkKICogQHRvZG8gYWRkIGNvbnRlbnRfYmxvY2sgaGFuZGxpbmcKICogCiAqIC0tCiAqCiAqIFVzYWdlOiAKICoKICoge2Ntc19tb2R1bGUgbW9kdWxlPSJ0b3VjaElubGluZUVkaXQifQogKgogKiB7Y29udGVudCBpc2VkaXRhYmxlPSd0cnVlJ30KICoKICogLS0KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICogT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAogKgogKi8KCmRlZmluZSgnVElFX1BMVUdJTl9ESVInLCdwbHVnaW5zLycpOwpkZWZpbmUoJ1RJRV9QTFVHSU5fREVGQVVMVCcsJ25pY2VkaXQnKTsKCmNsYXNzIHRvdWNoSW5saW5lRWRpdCBleHRlbmRzIENNU01vZHVsZSB7CgoJcHVibGljICRlZGl0b3I7CglwdWJsaWMgJHNtYXJ0eTsKCXByaXZhdGUgJGRlZmF1bHRUZW1wbGF0ZSA9IGFycmF5KAoJCSd0b3VjaElubGluZUVkaXRCdXR0b24nID0+ICc8YnV0dG9uIGNsYXNzPSJ0b3VjaElubGluZUVkaXRCdXR0b24iPnskdGllTGFuZy5mZUlubGluZUVkaXRCdXR0b259PC9idXR0b24+JwoJKTsKCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG5hbWU9TlVMTCl7CgkJZ2xvYmFsICRnQ21zOwoKCQkkdGhpcy0+c21hcnR5ID0gJiRnQ21zLT5zbWFydHk7CgkJLy8kdGhpcy0+c21hcnR5LT5mb3JjZV9jb21waWxlID0gdHJ1ZTsKCgkJaWYoISRuYW1lKXsKCQkJJHRoaXMtPmluaXQoKTsKCQl9Cgl9CgoJcHJpdmF0ZSBmdW5jdGlvbiBpbml0KCl7CgoJCSRlZGl0b3IgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgidG91Y2hJbmxpbmVFZGl0LmZlUGx1Z2luIixUSUVfUExVR0lOX0RFRkFVTFQpOwoJCWlmKCRlZGl0b3IpewoJCQkkdGhpcy0+ZWRpdG9yID0gJHRoaXMtPmdldFBsdWdpbkluc3RhbmNlKCRlZGl0b3IpOwoJCQkvLyBUb2RvOiBSZW1vdmUgZnJvbSBjdW5zdHJ1Y3RvcgoJCQlpZigkdGhpcy0+aGFzSW5saW5lRWRpdFJpZ2h0cygpKXsKCQkJCS8vIEFzc2lnbiB2YXJzCgkJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2hhc0lubGluZUVkaXRSaWdodHMnLDEpOwoJCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aWVMYW5nJywkdGhpcy0+R2V0TGFuZ1ZhcnMoKSk7CgkJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpZVByZWYnLCR0aGlzLT5HZXRQcmVmVmFycygpKTsKCQkJCS8vIFByb2Nlc3MgdGVtcGxhdGUKCQkJCSR0aGlzLT5zbWFydHktPmFzc2lnbigndGllVGVtcGxhdGVFZGl0QnV0dG9uJywgJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgndG91Y2hJbmxpbmVFZGl0QnV0dG9uJykpOwoJCQl9CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBHZXROYW1lKCl7IAoJCXJldHVybiAndG91Y2hJbmxpbmVFZGl0JzsgCgl9CgoJcHVibGljIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpeyAKCQlyZXR1cm4gJ0lubGluZUVkaXQnOyAKCX0KCglwdWJsaWMgZnVuY3Rpb24gR2V0VmVyc2lvbigpeyAKCQlyZXR1cm4gJzEuNyc7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIEdldEhlbHAoKXsgCgkJcmV0dXJuICR0aGlzLT5MYW5nKCdoZWxwJyk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCl7CgkJcmV0dXJuIHRydWU7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBIYXNBZG1pbigpewoJCXJldHVybiB0cnVlOyAKCX0KCglwdWJsaWMgZnVuY3Rpb24gR2V0QXV0aG9yKCl7CgkJcmV0dXJuICdDaHJpc3RvcGggR3J1YmVyIDx0b3VjaERlc2lnbi5kZT4nOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpewoJCXJldHVybiAnYy5ncnViZXJAdG91Y2hkZXNpZ24uZGUnOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKXsKCQlyZXR1cm4gJ2V4dGVuc2lvbnMnOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBTZXRQYXJhbWV0ZXJzKCl7CSAgCgkJLyogTm90aGluZyB5ZXQgKi8KCX0KCglwdWJsaWMgZnVuY3Rpb24gSW5zdGFsbFBvc3RNZXNzYWdlKCl7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0aW5zdGFsbCcpOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gVW5pbnN0YWxsUG9zdE1lc3NhZ2UoKXsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3R1bmluc3RhbGwnKTsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIFVuaW5zdGFsbFByZU1lc3NhZ2UoKXsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ3ByZXVuaW5zdGFsbCcpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpewoJCXJldHVybiAiMS42LjgiOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBNYXhpbXVtQ01TVmVyc2lvbigpewoJCXJldHVybiAiMS45LjkiOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBIYW5kbGVzRXZlbnRzKCkgewoJCXJldHVybiB0cnVlOwoJfQoKCS8qIC0tLS0tIEV2ZW50cyAtLS0tLSAqLwoKCXB1YmxpYyBmdW5jdGlvbiBEb0V2ZW50KCAkb3JpZ2luYXRvciwgJGV2ZW50bmFtZSwgJiRwYXJhbXMgKXsKCQlnbG9iYWwgJGdDbXM7CgoJCWlmICgkb3JpZ2luYXRvciA9PSAnQ29yZScgJiYgJGV2ZW50bmFtZSA9PSAnQ29udGVudFBvc3RSZW5kZXInKXsKCQkJaWYoJHRoaXMtPmhhc0lubGluZUVkaXRSaWdodHMoKSl7CgkJCQkvLyBCZWZvcmUgY2xvc2UgaGVhZGVyCgkJCQkkcGFyYW1zWydjb250ZW50J10gPSBzdHJfcmVwbGFjZSgnPC9oZWFkPicsICR0aGlzLT5lZGl0b3ItPmdldEhlYWRlcigpIAoJCQkJCS4gJzwvaGVhZD4nLCAkcGFyYW1zWydjb250ZW50J10pOwoJCQl9CgkJfQoJCWVsc2VpZiAoJG9yaWdpbmF0b3IgPT0gJ0NvcmUnICYmICRldmVudG5hbWUgPT0gJ1NtYXJ0eVByZUNvbXBpbGUnKXsKCQkJLy8gVE9ETzogR3JlcCBibG9ja3MsIGNvbnRlbnQgdW5kZXJzY29yZSBibG9ja25hbWUgLT4gZGVmYXVsdCBpcyBjb250ZW50X2VuCgkJCS8vcHJlZ19tYXRjaF9hbGwoIi9ce2NvbnRlbnQuKj9ibG9jaz1bXCJ8J10oW15cInwnXSspW1wifCddLio/XH0vIiwgJGNvbnRlbnQsICRtYXRjaGVzKTsKCgkJCS8vIEJlZm9yZSBjb250ZW50CgkJCSRjb250ZW50QmVmb3JlID0gJ3tpZiAkaGFzSW5saW5lRWRpdFJpZ2h0c30nOwoJCQkkY29udGVudEJlZm9yZS49ICcJe2lmICR0aWVQcmVmLmZlRWRpdEJ1dHRvbiA9PSAiWSJ9JzsKCQkJJGNvbnRlbnRCZWZvcmUuPSAnCQl7JHRpZVRlbXBsYXRlRWRpdEJ1dHRvbn0nOwoJCQkkY29udGVudEJlZm9yZS49ICcJey9pZn0nOwoJCQkkY29udGVudEJlZm9yZS49ICcJPGRpdiBpZD0idG91Y2hJbmxpbmVFZGl0SWR7JGdDbXMtPnZhcmlhYmxlcy5jb250ZW50X2lkfSIgY2xhc3M9InRvdWNoSW5saW5lRWRpdCI+JzsKCQkJJGNvbnRlbnRCZWZvcmUuPSAney9pZn0nOwoKCQkJLy8gQWZ0ZXIgY29udGVudAoJCQkkY29udGVudEFmdGVyID0gJ3tpZiAkaGFzSW5saW5lRWRpdFJpZ2h0c30nOwoJCQkkY29udGVudEFmdGVyLj0gJwk8L2Rpdj4nOwoJCQkkY29udGVudEFmdGVyLj0gJ3svaWZ9JzsKCgkJCS8vIE1haW4gY29udGVudAoJCQkkcGFyYW1zWydjb250ZW50J10gPSBwcmVnX3JlcGxhY2UoIi9ce2NvbnRlbnQoLiopIGlzZWRpdGFibGU9W1wifCdddHJ1ZVtcInwnXVx9LyIsIAoJCQkJJGNvbnRlbnRCZWZvcmUuIntjb250ZW50IFxcMX0iLiRjb250ZW50QWZ0ZXIsICRwYXJhbXNbJ2NvbnRlbnQnXSk7CgkJfQoJfQoKCS8qIC0tLS0tIEZ1bmN0aW9ucyAtLS0tLSAqLwoJCglwdWJsaWMgZnVuY3Rpb24gaGFzSW5saW5lRWRpdFJpZ2h0cygpewoKCQlpZihjaGVja19sb2dpbih0cnVlKSAmJiAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdVc2UgdG91Y2hJbmxpbmVFZGl0JykpewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBpc0FKQVhSZXF1ZXN0KCl7CgoJCXJldHVybiBpc3NldCgkX1NFUlZFUlsnSFRUUF9YX1JFUVVFU1RFRF9XSVRIJ10pIAoJCQkmJiBzdHJ0b2xvd2VyKCRfU0VSVkVSWydIVFRQX1hfUkVRVUVTVEVEX1dJVEgnXSkgCgkJCT09ICd4bWxodHRwcmVxdWVzdCcgPyB0cnVlIDogZmFsc2U7Cgl9CgoJcHJvdGVjdGVkIGZ1bmN0aW9uIEdldExhbmdWYXJzKCl7CgoJCSRsYW5nID0gYXJyYXkoKTsKCgkJJGxhbmdbJ2ZlSW5saW5lRWRpdEJ1dHRvbiddID0gJHRoaXMtPkxhbmcoImZlSW5saW5lRWRpdEJ1dHRvbiIpOwoJCSRsYW5nWydmZVVwZGF0ZUFsZXJ0J10gPSAkdGhpcy0+TGFuZygiZmVVcGRhdGVBbGVydCIpOwoKCQlyZXR1cm4gJGxhbmc7Cgl9CgoJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldERlZmF1bHRUZW1wbGF0ZSgkdGVtcGxhdGUpewoKCQlpZihpc3NldCgkdGhpcy0+ZGVmYXVsdFRlbXBsYXRlWyR0ZW1wbGF0ZV0pKXsKCQkJcmV0dXJuICR0aGlzLT5kZWZhdWx0VGVtcGxhdGVbJHRlbXBsYXRlXTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCXByb3RlY3RlZCBmdW5jdGlvbiBnZXRQcmVmVmFycygpewoKCQkkcHJlZmVyZW5jZXMgPSBhcnJheSgpOwoKCQkkcHJlZmVyZW5jZXNbJ2ZlRWRpdEJ1dHRvbiddID0gJHRoaXMtPkdldFByZWZlcmVuY2UoInRvdWNoSW5saW5lRWRpdC5mZUVkaXRCdXR0b24iKTsKCQkkcHJlZmVyZW5jZXNbJ2ZlRWRpdE9uRGJsQ2xpY2snXSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0b3VjaElubGluZUVkaXQuZmVFZGl0T25EYmxDbGljayIpOwoJCSRwcmVmZXJlbmNlc1snZmVVcGRhdGVBbGVydCddID0gJHRoaXMtPkdldFByZWZlcmVuY2UoInRvdWNoSW5saW5lRWRpdC5mZVVwZGF0ZUFsZXJ0Iik7CgkJJHByZWZlcmVuY2VzWydmZVBsdWdpbiddID0gJHRoaXMtPkdldFByZWZlcmVuY2UoInRvdWNoSW5saW5lRWRpdC5mZVBsdWdpbiIpOwoKCQlyZXR1cm4gJHByZWZlcmVuY2VzOwoJfQoKCS8qIC0tLS0tIENvbnRlbnQgb3BlcmF0aW9ucyAtLS0tLSAqLwoJCglwcml2YXRlIGZ1bmN0aW9uIGdldENvbnRlbnRPYmooJGNvbnRlbnRJZD1OVUxMKXsKCQlnbG9iYWwgJGdDbXM7CgoJCWlmKCRjb250ZW50SWQgPT09IE5VTEwpewoJCQkkcGFnZUluZm8gPSAmJGdDbXMtPnZhcmlhYmxlc1sncGFnZWluZm8nXTsKCQkJJGNvbnRlbnRJZCA9ICRwYWdlSW5mby0+Y29udGVudF9pZDsKCQl9CgoJCSRtYW5hZ2VyID0gJiRnQ21zLT5HZXRIaWVyYXJjaHlNYW5hZ2VyKCk7CgkJJG5vZGUgPSAmJG1hbmFnZXItPnN1cmVHZXROb2RlQnlJZCgkY29udGVudElkKTsKCgkJaWYoIWlzX29iamVjdCgkbm9kZSkpewoJCQlyZXR1cm4gIkludmFsaWQgQ29udGVudElkOiAiIC4gJGNvbnRlbnRJZDsKCQl9CgkJCgkJcmV0dXJuICRub2RlLT5HZXRDb250ZW50KHRydWUsdHJ1ZSk7Cgl9CgoJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENvbnRlbnQoJGJsb2NrPSJjb250ZW50X2VuIiwkZmV0Y2g9ZmFsc2UpewoKCQkkY29udGVudE9iaiA9ICYkdGhpcy0+Z2V0Q29udGVudE9iaigpOwoKCQkkY29udGVudCA9ICJFbXB0eS4uLiI7CgkJaWYoJGNvbnRlbnRPYmotPkhhc1Byb3BlcnR5KCRibG9jaykpewoJCQkkY29udGVudCA9ICRjb250ZW50T2JqLT5HZXRQcm9wZXJ0eVZhbHVlKCRibG9jayk7CgkJCWlmKCRmZXRjaCl7CgkJCQkvLyBUT0RPOiBjbGVhciBtb2RpZmllZCB0ZW1wbGF0ZSBjbGVhcl9jb21waWxlZF90cGwoJ2NvbnRlbnQ6IC4uLicpCgkJCQkkdGhpcy0+c21hcnR5LT5jbGVhcl9jb21waWxlZF90cGwoKTsKCQkJCS8vIEZldGNoIGNvbnRlbnQuLi4KCQkJCSRjb250ZW50ID0gJHRoaXMtPnNtYXJ0eS0+ZmV0Y2goJ2NvbnRlbnQ6JyAuICRibG9jaywgJycsICRjb250ZW50SWQpOwoJCQl9CgkJfQoKCQlyZXR1cm4gJGNvbnRlbnQ7Cgl9CgoJcHJvdGVjdGVkIGZ1bmN0aW9uIHVwZGF0ZUNvbnRlbnQoJGJsb2NrPSJjb250ZW50X2VuIil7CgkJZ2xvYmFsICRnQ21zOwoKCQkkY29udGVudE9iaiA9ICYkdGhpcy0+Z2V0Q29udGVudE9iaigpOwoKCQkkcGFyYW1zWyRibG9ja10gPSAkX1BPU1RbJ2NvbnRlbnQnXTsKCgkJJGNvbnRlbnRPYmotPkZpbGxQYXJhbXMoJHBhcmFtcyk7CgoJCSRlcnJvcnMgPSAkY29udGVudE9iai0+VmFsaWRhdGVEYXRhKCk7CgkJaWYoJGVycm9ycyAhPT0gZmFsc2UpewoJCQkvLyBUT0RPOiB0aHJvdyBlcnJvcnMKCQkJcmV0dXJuICJJbnZhbGlkIGNvbnRlbnQiOwoJCX0KCgkJJGNvbnRlbnRPYmotPlVwZGF0ZSgpOwoKCQkvLyBMb2cgdXBkYXRlIGluZm8KCQkkdGhpcy0+QXVkaXQoMCwgJHRoaXMtPkdldEZyaWVuZGx5TmFtZSgpLCAKCQkJJHRoaXMtPkxhbmcoJ3Bvc3Rjb250ZW50dXBkYXRlJywgJGNvbnRlbnRJZCkpOwoKCQlyZXR1cm4gJHRoaXMtPmdldENvbnRlbnQoJGJsb2NrLHRydWUpOwoJfQoKCS8qIC0tLS0tIFBsdWdpbiBmdW5jdGlvbnMgLS0tLS0gKi8KCglwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UGx1Z2lucygpewoJCWdsb2JhbCAkZ0NtczsKCgkJJHBsdWdpbnMgPSBhcnJheV9kaWZmKHNjYW5kaXIoJGdDbXMtPmNvbmZpZ1sncm9vdF9wYXRoJ10uJy9tb2R1bGVzLycuJHRoaXMtPmdldE5hbWUoKQoJCQkuJy8nLlRJRV9QTFVHSU5fRElSKSxhcnJheSgnLicsJy4uJywnLnN2bicsJy5odGFjY2VzcycpKTsgCgoJCXJldHVybiBhcnJheV9jb21iaW5lKCRwbHVnaW5zLCRwbHVnaW5zKTsKCX0KCglwcml2YXRlIGZ1bmN0aW9uIGdldFBsdWdpbkluc3RhbmNlKCRwbHVnaW4sICRwYXJhbXMgPSBOVUxMKXsKCQlnbG9iYWwgJGdDbXM7CgoJCWlmKCFpc19zdHJpbmcoJHBsdWdpbikgfHwgIXN0cmxlbigkcGx1Z2luKSl7CgkJCXRocm93IG5ldyBleGNlcHRpb24oJ1VuYWJsZSB0byBsb2FkIHBsdWdpbjogJyAuICRwbHVnaW4pOwoJCX0KCgkJcmVxdWlyZV9vbmNlICRnQ21zLT5jb25maWdbJ3Jvb3RfcGF0aCddIC4gJy9tb2R1bGVzLycgLiBnZXRfY2xhc3MoKSAKCQkJLiAnLycuVElFX1BMVUdJTl9ESVIgIC4gJHBsdWdpbiAuICcvJyAuICRwbHVnaW4gLiAnLnBsdWdpbi5waHAnOwoKCQlyZXR1cm4gbmV3ICRwbHVnaW4oJHBhcmFtcyk7Cgl9Cn0KCj8+]]></data>
	</file>
</module>
