<?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>JQueryTools</name>
	<version>1.2.4</version>
  <mincmsversion>1.11.1</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgaXMgdGhpcz88L2gzPgo8cD5UaGlzIG1vZHVsZSBhZGRzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cuanF1ZXJ5LmNvbSI+alF1ZXJ5PC9hPiBhbmQgdmFyaW91cyBhZGRvbiBsaWJyYXJpZXMgdG8gQ01TIE1hZGUgU2ltcGxlIHBhZ2UsIGFuZCBtb2R1bGVzIChldmVuIGluIHRoZSBhZG1pbiBzZWN0aW9uKSwgY29udmVuaWVudGx5IGFuZCBlYXNpbHkuICBJdCBwcm92aWRlcyBhIGNvbnZlbmllbnQgYW5kIHNpbXBsZSB3YXkgdG8gaW5jbHVkZSBqcXVlcnkgYW5kIGpxdWVyeSBkZXBlbmRlbnQgbGlicmFyaWVzIGludG8geW91ciBDTVNNUyBjb250ZW50IHBhZ2UuPC9wPgo8aDM+SG93IGRvIEkgdXNlIGl0PzwvaDM+CjxwPkVuYWJsaW5nIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBhIHR3byBzdGVwIHByb2Nlc3M6PC9wPgo8dWw+CiAgPGxpPjEuICBFbmFibGUgdGhlIGpxdWVyeSBsaWJyYXJpZXMgdGhhdCB5b3Ugd2FudCBieSBjYWxsaW5nIDxjb2RlPntKUXVlcnlUb29scyBhY3Rpb249cmVxdWlyZSBsaWI9Jmx0O2xpYnJhcnkgbmFtZSZndDsgbm9jYWNoZX08L2NvZGU+IGluIHlvdXIgcGFnZSBjb250ZW50LgogICAgPHA+VGhpcyB0YWcgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byBlbmFibGUgbXVsdGlwbGUgbGlicmFyaWVzLiAgdGhlIGxpYiBhcmd1bWVudCBhbHNvIHN1cHBvcnRzIHBhc3NpbmcgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBsaWJyYXJ5IG5hbWVzLjwvcD4KICA8L2xpPgogIDxsaT4yLiAgQ2FsbCA8Y29kZT57SlFlcnlUb29scyBhY3Rpb249cGxhY2VtYXJrZXIgbm9jYWNoZX08L2NvZGU+IGluIHRoZSBhcHByb3ByaWF0ZSBwYXJ0IG9mIHlvdXIgcGFnZSB0ZW1wbGF0ZS4KICAgIDx1bD4KICAgICAgPGxpPlRvIGVuYWJsZSBKUXVlcnlUb29scyBmb3IgYSBzcGVjaWZpYyBwYWdlIGl0IGlzIG9mdGVuIHVzZWZ1bCB0byBwbGFjZSB0aGUgPGNvZGU+e0pRdWVyeVRvb2xzIGFjdGlvbj1wbGFjZW1hcmtlciBub2NhY2hlfTwvY29kZT4gdGFnIGluIHRoZSBwYWdlIHNwZWNpZmljIG1ldGFkYXRhIGZpZWxkIG9mIGVhY2ggY29udGVudCBwYWdlLjwvbGk+CiAgICAgIDxsaT5UbyBlbmFibGUgSlF1ZXJ5VG9vbHMgb24gYSBzaXRlIHdpZGUgYmFzaXMgdGhlIDxjb2RlPntKcXVlcnlUb29scyBhY3Rpb249cGxhY2VtYXJrZXIgbm9jYWNoZX08L2NvZGU+IHRhZyBjYW4gYmUgcGxhc2VkIGluIHRoZSBnbG9iYWwgbWV0YWRhdGEgZmllbGQgaW4gdGhlIGdsb2JhbCBzZXR0aW5ncy48L2xpPgogICAgICA8bGk+WW91IG1heSBhbHNvIHBsYWNlIHRoZSA8Y29kZT57SlF1ZXJ5VG9vbHMgYWN0aW9uPXBsYWNlbWFya2VyfTwvY29kZT4gdGFnIGluIGVhY2ggc3BlY2lmaWMgcGFnZSB0ZW1wbGF0ZSwgYXQgdGhlIGJvdG9vbSBvZiB0aGUgdGVtcGxhdGUgYWJvdmUgPC9ib2R5PiBvciBhbnl3aGVyZSBpbiB0aGhlIGhlYWQgc2VjdGlvbi48L2xpPgogICAgPC91bD4KICA8L2xpPgo8L3VsPgo8cD5UaGlzIG1vZHVsZSBkb2VzIG5vdCBwcm92aWRlIHNhbXBsZXMgYW5kIGluc3RydWN0aW9ucyBhcyB0byBob3cgdG8gdXNlIGpxdWVyeSBvciB0aGUgdmFyaW91cyBhZGRvbiBsaWJyYXJpZXMgdGhhdCB3ZSBpbmNsdWRlLiAgdG8gbGVhcm4gaG93IHRvIHVzZSB0aGVzZSBsaWJyYXJpZXMgeW91IHdpbGwgbmVlZCB0byByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgcGx1Z2lucyBhdCB0aGVpciByZXNwZWN0aXZlIGhvbWUgcGFnZS48L3A+CiAgCjxoMz5XaGF0IGpxdWVyeSB2ZXJzaW9uIGlzIGluY2x1ZGVkPzwvaDM+CjxwPkN1cnJlbnRseSBKUXVlcnlUb29scyB1c2VzIGpxdWVyeSAxLjguMzwvcD4KPGgzPldoYXQgSlF1ZXJ5IHBsdWdpbnMgYXJlIGluY2x1ZGVkPC9oMz4KPHVsPgogIDxsaT50YWJsZXNvcnRlciA8ZW0+KHNlZSA8YSBocmVmPSJodHRwOi8vdGFibGVzb3J0ZXIuY29tIj5odHRwOi8vdGFibGVzb3J0ZXIuY29tPC9hPiBmb3IgdXNhZ2UgaW5zdHJ1Y3Rpb25zKTwvZW0+CjxwPi0tIFRvIGFsbG93IHNvcnRpbmcgeW91ciB0YWJsZXMsIGdpdmUgdGhlIGZvbGx3aW5nIGNsYXNzZXMgdG8gdGhlIHRhYmxlIGRlZmluaXRpb246IGNtc19zb3J0YWJsZSB0YWJsZXNvcnRlci4gaS5lOiA8Y29kZT4mbHQ7dGFibGUgY2xhc3M9ImNtc19zb3J0YWJsZSB0YWJsZXNvcnRlciImZ3Q7Li4uJmx0Oy90YWJsZSZndDs8L2NvZGU+PC9wPgogIDwvbGk+CiAgPGxpPmpxdWVyeTwvbGk+CiAgPGxpPmpxdWVyeSB1aSAtIHNtb290aG5lc3MgdGhlbWUuPC9saT4KICA8bGk+Y2x1ZXRpcCA8ZW0+KHNlZSA8YSBocmVmPSJodHRwOi8vcGx1Z2lucy5sZWFybmluZ2pxdWVyeS5jb20vY2x1ZXRpcC8iPmh0dHA6Ly9wbHVnaW5zLmxlYXJuaW5nanF1ZXJ5LmNvbS9jbHVldGlwLzwvYT4gZm9yIHVzYWdlIGluc3RydWN0aW9ucyk8L2VtPjwvbGk+CiAgPGxpPmZvcm0gPGVtPihzZWUgPGEgaHJlZj0iaHR0cDovL21hbHN1cC5jb20vanF1ZXJ5L2Zvcm0vIj5odHRwOi8vbWFsc3VwLmNvbS9qcXVlcnkvZm9ybS88L2E+IGZvciB1c2FnZSBpbnN0cnVjdGlvbnMpPC9lbT48L2xpPgogIDxsaT5mYW5jeWJveCA8ZW0+KHNlZSA8YSBocmVmPSJodHRwOi8vZmFuY3kua2xhZGUubHYvIj5odHRwOi8vZmFuY3kua2xhZGUubHYvPC9hPiBmb3IgdXNhZ2UgaW5zdHJ1Y3Rpb25zKTwvZW0+PC9saT4KICA8bGk+anNvbjwvbGk+CiAgPGxpPmxpZ2h0Ym94PC9saT4KICA8bGk+ZmlsZXVwbG9hZCAtIFRoZSBibHVlaW1wIGpxdWVyeSBmaWxlIHVwbG9hZCBsaWJyYXJ5LjwvbGk+CjwvdWw+CjxoMz5FeGFtcGxlOjwvaDM+CiA8cD5TbyB5b3UgaGF2ZSB1cGxvYWRlZCBzb21lIGZpbGVzIHRvIGEgY2F0ZWdvcnkgaW4gdGhlIHVwbG9hZHMgbW9kdWxlLCBhbmQgeW91IHdhbnQgdG8gdXNlIGZhbmN5Ym94IHRvIHByZXZpZXcgdGhlIGltYWdlcyBmcm9tIGFuIFVwbG9hZHMgbW9kdWxlIHN1bW1hcnkgdmlldy4gVGhpcyBpcyBhIHNpbXBsZSAzIHN0ZXAgcHJvY2Vzczo8L3A+CjxvbD4KICAgPGxpPk1vZGlmeSB5b3VyIHVwbG9hZHMgc3VtbWFyeSB0ZW1wbGF0ZSB0byBzb21ldGhpbmcgc2ltaWxhciB0byB0aGlzOgo8cHJlPjxjb2RlPjxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPntKUXVlcnlUb29scyBhY3Rpb249cmVxdWlyZSBsaWI9ZmFuY3lib3ggbm9jYWNoZX08L3NwYW4+Cntmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09J2VudHJ5JyBuYW1lPSd1cGxvYWRzJ30KICAmbHQ7ZGl2IGNsYXNzPSJ1cGxvYWQiIHN0eWxlPSJmbG9hdDogbGVmdDsgd2lkdGg6IDMzJTsiJmd0OwogIHtpZiBpc3NldCgkZW50cnktPnRodW1ibmFpbF91cmwpfQogICZsdDthIGNsYXNzPSJmYW5jeWJveCIgaHJlZj0ieyRlbnRyeS0+b3JpZ2ZpbGVfdXJsfSIgdGl0bGU9InskZW50cnktPnVwbG9hZF9uYW1lfSImZ3Q7Jmx0O2ltZyBzcmM9InskZW50cnktPnRodW1ibmFpbF91cmx9IiBhbHQ9IiIvJmd0OyZsdDsvYSZndDsKICB7L2lmfSAgICAgCiAgJmx0Oy9kaXYmZ3Q7CnsvZm9yZWFjaH0KJmx0O2RpdiBzdHlsZT0iY2xlYXI6IGJvdGg7IiZndDsmZ3Q7L2RpdiZsdDs8L2NvZGU+PC9wcmU+CiAgIDxwPk5vdGUgdGhlIGNhbGwgdG8gSlF1ZXJ5VG9vbHMgdG8gaW5jbHVkZSB0aGUgZmFuY3lib3ggbGlicmFyeS4gQWRkaXRpb25hbGx5LCBub3RlIHRoZSBjbGFzcyBnaXZlbiB0byB0aGUgPGVtPmE8L2VtPiB0YWcuPC9wPgogIDwvbGk+CiAgPGxpPkNhbGwgPGNvZGU+e0pRdWVyeVRvb2xzIGFjdGlvbj1wbGFjZW1hcmtlciBub2NhY2hlfTwvY29kZT4KICAgIDxwPlRoZXJlIGFyZSBhdCBsZWFzdCBmb3VyIGxvY2F0aW9ucyB3aGVyZSB0aGlzIHRhZyBjYW4gYmUgY2FsbGVkOjwvcD4KICAgIDx1bD4KICAgICAgPGxpPkluIHRoZSBwYWdlIHRlbXBsYXRlIGRpcmVjdGx5IGJlZm9yZSB0aGUgPGNvZGU+Jmx0Oy9ib2R5Jmd0OzwvY29kZT4gdGFnLjwvbGk+CiAgICAgIDxsaT5JbiB0aGUgcGFnZSB0ZW1wbGF0ZSBkaXJlY3RseSBiZWZvcmUgdGhlIDxjb2RlPiZsdDsvaGVhZCZndDs8L2NvZGU+IHRhZy48L2xpPgogICAgICA8bGk+SW4gdGhlIHBhZ2UgbWV0YWRhdGEgZmllbGQgd2hlbiBlZGl0aW5nIGNvbnRlbnQuPC9saT4KICAgICAgPGxpPkluIHRoZSBnbG9iYWwgbWV0YWRhdGEgZmllbGQgaW4gdGhlIGdsb2JhbCBzZXR0aW5ncyBwYWdlLjwvbGk+CiAgICA8L3VsPgogIDwvbGk+CiAgPGxpPkNhbGwgdGhlIFVwbG9hZHMgbW9kdWxlIGZyb20gYSBwYWdlLiAgaS5lOjxici8+CiAgICA8cHJlPjxjb2RlPntVcGxvYWRzIGNhdGVnb3J5PWNhdGVnb3J5X25hbWV9PC9jb2RlPjwvcHJlPgogIDwvbGk+Cjwvb2w+CjxoMz5CdWlsdCBpbiBSZWFkeSBTY3JpcHRzPC9oMz4KPHA+VGhpcyBtb2R1bGUgc3VwcG9ydHMgc29tZSBzaW1wbGUgcmVhZHkgc3RhdGVzIHRvIGVhc2UgaW4gZGV2ZWxvcG1lbnQuICBBbGwgb2YgdGhlc2UgY2FuIGJlIG92ZXJ3cml0dGVuIGluIHlvdXIgb3duIGphdmFzY3JpcHQ6PC9wPgo8dWw+CiAgICA8bGk+ZmFuY3lib3ggLSBmYW5jeWJveCB3aWxsIHdvcmsgb24gYW55IGEgdGFnIHdpdGggYSBjbGFzcyBvZiBmYW5jeWJveDogICQoJ2EuZmFuY3lib3gnKS5mYW5jeWJveCgpCiAgICAgIDxwcmU+PGNvZGU+Jmx0O2EgY2xhc3M9JnF1b3Q7ZmFuY3lib3gmcXVvdDsgaHJlZj0mcXVvdDtodHRwOi8vd3d3Lm15c2l0ZS5jb20vdXBsb2Fkcy9pbWFnZXMvaW1hZ2UuanBnJnF1b3Q7Jmd0OyZsdDtpbWcgc3JjPSZxdW90O2h0dHA6Ly93d3cubXlzaXRlLmNvbS91cGxvYWRzL2ltYWdlcy90aHVtYl9pbWFnZS5qcGcmcXVvdDsvJmd0OyZsdDthJmd0OzwvY29kZT48L3ByZT4KCQkgICAgPHA+PHN0cm9uZz5IaW50Ojwvc3Ryb25nPiBVc2UgQ0dTbWFydEltYWdlIHRvIGF2b2lkIGhhdmluZyB0byBjcmVhdGUgYW5kIG1hbmFnZSB0aHVtYm5haWxzIDxlbT4ocmVxdWlyZXMgZG93bmxvYWRpbmcgYW5kIGluc3RhbGxpbmcgdGhlIENHU21hcnRJbWFnZSBtb2R1bGUpPC9lbT46PC9wPgoJCSAgICA8cHJlPjxjb2RlPiZsdDthIGNsYXNzPSZxdW90O2ZhbmN5Ym94JnF1b3Q7IGhyZWY9JnF1b3Q7e0NHU21hcnRJbWFnZSBzcmM9J2ltYWdlcy9pbWFnZS5qcGcnIG5vZW1iZWQ9MX0mcXVvdDsmZ3Q7e0NHU21hcnRJbWFnZSBzcmM9J2ltYWdlcy9pbWFnZS5qcGcnIHdpZHRoPTEwMCBoZWlnaHQ9MTAwfSZsdDthJmd0OzwvcHJlPjwvY29kZT4KICAgIDwvbGk+CiAgICA8bGk+bGlnaHRib3ggLSBsaWdodGJveCB3aWxsIHdvcmsgb24gYW55IGEgdGFnIHdpdGggYSBjbGFzcyBvZiBsaWdodGJveDogICQoJ2EubGlnaHRib3gnKS5saWdodGJveCgpPC9saT4KICAgIDxsaT5jbHVldGlwIC0gY2x1ZXRpcCB3aWxsIHdvcmsgb24gYW55IGEgdGFnIHdpdGggYSBjbGFzcyBvZiBjbHVldGlwOiAgJCgnYS5jbHVldGlwJykuY2x1ZXRpcCgpPC9saT4KICAgIDxsaT50YWJsZXNvcnRlciAtIHRhYmxlc29ydGVyIHdpbGwgd29yayBvbiBhbnkgdGFibGUgdGFnIHdpdGggYSBjbGFzcyBvZiBjbXNfc29ydGFibGU6ICQoJ3RhYmxlLmNtc19zb3J0YWJsZScpLnRhYmxlU29ydGVyKCk8L2xpPgo8L3VsPgo8aDM+QWJvdXQgc21hcnR5IGNhY2hpbmc8L2gzPgo8cD5UaGUgcmVxdWlyZSwgYW5kIHBsYWNlbWFya2VyIGFjdGlvbnMgZG8gbm90IHN1cHBvcnQgc21hcnR5IGNhY2hpbmcuICBJdCBpcyB0aGVyZWZlcmUgY3JpdGljYWwgdGhhdCB0aGUgbm9jYWNoZSBhdHRyaWJ1dGUgYmUgdXNlZCBvbiBjYWxscyB0byB0aGUgSlF1ZXJ5VG9vbHMgbW9kdWxlLjwvcD4KPGgzPkFib3V0IHRoZSBwbGFjZW1hcmtlciBhY3Rpb24uPC9oMz4KPHA+VGhlIHBsYWNlbWFya2VyIGFjdGlvbiBkb2VzIHRoZSBqb2Igb2YgZ2VuZXJhdGluZyB0aGUgaHRtbCB0byBpbnNlcnQgdGhlIGpxdWVyeSBzY3JpcHRzLCBhbmQgdGhlIHZhcmlvdXMgYWRkb24gbGlicmFyaWVzIHRoYXQgd2VyZSByZXF1ZXN0ZWQgdmlhIHRoZSByZXF1aXJlIGFjdGlvbi4gIFRoZXJlZm9yZSB0aGUgcGxhY2VtYXJrZXIgYWN0aW9uIG11c3QgYmUgY2FsbGVkIEFGVEVSIGFsbCBjYWxscyB0byB0aGUgcmVxdWlyZSBhY3Rpb24uICAgUGxlYXNlIGtlZXAgaW4gbWluZCB0aGF0IENNU01TIGRpdmlkZXMgcGFnZSB0ZW1wbGF0ZXMgaW50byB0aHJlZSBwb3J0aW9ucyBhbmQgcHJvY2Vzc2VzIHRoZW0gaW4gdGhpcyBvcmRlcjogIFRoZSB0b3AgcG9ydGlvbiBvZiB0aGUgcGFnZSBiZWZvcmUgdGhlICZsdDtodG1sJmd0OyB0YWcuICBUaGUgYm9keSBzZWN0aW9uLCBhbmQgdGhlIGhlYWQgc2VjdGlvbi48L3A+CjxoMz5TdXBwb3J0PC9oMz4KPHA+VGhpcyBtb2R1bGUgZG9lcyBub3QgaW5jbHVkZSBjb21tZXJjaWFsIHN1cHBvcnQuIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIG51bWJlciBvZiByZXNvdXJjZXMgYXZhaWxhYmxlIHRvIGhlbHAgeW91IHdpdGggaXQ6PC9wPgo8dWw+CjxsaT5Gb3IgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlLCBGQVFzLCBvciB0byBmaWxlIGEgQnVnIFJlcG9ydCBvciBidXkgY29tbWVyY2lhbCBzdXBwb3J0LCBwbGVhc2UgdmlzaXQgY2FsZ3V5XCdzCm1vZHVsZSBob21lcGFnZSBhdCA8YSBocmVmPSJodHRwOi8vY2FsZ3V5MTAwMC5jb20iPmNhbGd1eTEwMDAuY29tPC9hPi48L2xpPgo8bGk+QWRkaXRpb25hbCBkaXNjdXNzaW9uIG9mIHRoaXMgbW9kdWxlIG1heSBhbHNvIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJodHRwOi8vZm9ydW0uY21zbWFkZXNpbXBsZS5vcmciPkNNUyBNYWRlIFNpbXBsZSBGb3J1bXM8L2E+LjwvbGk+CjxsaT5UaGUgYXV0aG9yLCBjYWxndXkxMDAwLCBjYW4gb2Z0ZW4gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9ImlyYzovL2lyYy5mcmVlbm9kZS5uZXQvI2NtcyI+Q01TIElSQyBDaGFubmVsPC9hPi48L2xpPgo8bGk+TGFzdGx5LCB5b3UgbWF5IGhhdmUgc29tZSBzdWNjZXNzIGVtYWlsaW5nIHRoZSBhdXRob3IgZGlyZWN0bHkuPC9saT4gIAo8L3VsPgo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDEyLCBSb2JlcnQgQ2FtcGJlbCA8YSBocmVmPSJtYWlsdG86Y2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZyI+Jmx0O2NhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcmZ3Q7PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPgo8cD5UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQp0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLjwvcD4KPHA+SG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCmFzIGFuIGFkZG9uIG1vZHVsZSB0byBDTVMgTWFkZSBTaW1wbGUuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBzb2Z0d2FyZQppbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCk1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiAKc2VjdGlvbiB0aGF0IHRoZSBzaXRlIHdhcyBidWlsdCB3aXRoIENNUyBNYWRlIHNpbXBsZS48L3A+CjxwPlRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCk9yIHJlYWQgaXQgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5vbmxpbmU8L2E+PC9wPjxoMz5EZXBlbmRlbmNpZXM8L2gzPjx1bD48bGk+Q0dFeHRlbnNpb25zID0mZ3Q7IDEuMzE8L2xpPjwvdWw+PGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgbGFuZ3VhZ2UgdG8gdXNlIGZvciBkaXNwbGF5IG9uIHRoZSBmcm9udGVuZC4gTm90IGFsbCBtb2R1bGVzIHN1cHBvcnQgb3IgbmVlZCB0aGlzLjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gYWN0aW9uPSIiIC0gU3BlY2lmeSB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6PHVsPjxsaT5yZXF1aXJlIC0gTWFya3MgdGhlIHNlbGVjdGVkIGxpYnJhcmllcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcGFnZSBIVE1MLiAgU2VlIHRoZSBsaXN0IGFib3ZlIGZvciB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbGlicmFyaWVzLjwvbGk+PGxpPnBsYWNlbWFya2VyIC0gSW5kaWNhdGVzIHRoZSBwbGFjZSBpbiB0aGUgSFRNTCBvdXRwdXQgd2hlcmUgdGhlIHNlbGVjdGVkIGxpYnJhcmllcyBzaG91bGQgYmUgaW5jbHVkZWQuPC9saT48bGk+aW5janMgLSA8ZW0+KGRlcHJlY2F0ZWQpPC9lbT4gSW5jbHVkZSByZXF1aXJlZCBqYXZhc2NyaXB0IGZpbGVzLjwvbGk+PGxpPnJlYWR5IC0gPGVtPihkZXByZWNhdGVkKTwvZW0+IE91dHB1dCBkZWZhdWx0IHJlYWR5IGZ1bmN0aW9uLjwvbGk+PC91bD48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGV4Y2x1ZGU9IiIgLSBBcHBsaWNhYmxlIG9ubHkgdG8gdGhlIHBsYWNlbWFya2VyIGFuZCBpbmNqcyBhY3Rpb25zLCB0aGlzIHBhcmFtZXRlciBhbGxvd3MgZXhjbHVkaW5nIGNlcnRhaW4ganF1ZXJ5IHBsdWdpbnMgZnJvbSB0aGUgb3V0cHV0IGdlbmVyYXRlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6IHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxpYj0iIiAtIEFwcGxpY2FibGUgb25seSB0byB0aGUgcmVxdWlyZSBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBzcGVjaWZ5aW5nIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YganF1ZXJ5IGxpYnJhcmllcyB0byBpbnN0YWxsLjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbm9fY3NzPSIiIC0gQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhbmQgaW5janMgYWN0aW9ucywgdGhpcyB3aWxsIGV4Y2x1ZGUgY3NzIHRhZ3MgZnJvbSBiZWluZyBvdXRwdXQ8L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IG5vX2Nkbj0iIiAtIEFwcGxpY2FibGUgb25seSB0byB0aGUgcGxhY2VtYXJrZXIgYW5kIGluY2pzIGFjdGlvbnMsIHRoaXMgd2lsbCBwcmV2ZW50IEpRdWVyeVRvb2xzIGZyb20gdXNpbmcgYSBDRE4gVVJMIGZvciB0aGUgamF2YXNjcmlwdCBsaWJyYXJpZXMsIGlmIG9uZSBpcyBhdmFpbGFibGUgKG5vdCBhbGwgbGlicmFyaWVzIGFyZSBhdmFpbGFibGUgYnkgYSBDRE48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IG5vX2pzPSIiIC0gQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhbmQgaW5janMgYWN0aW9ucywgdGhpcyB3aWxsIGV4Y2x1ZGUgc2NyaXB0IHRhZ3MgZnJvbSBiZWluZyBvdXRwdXQ8L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IG5vX2pxdWVyeT0iIiAtIEFwcGxpY2FibGUgb25seSB0byB0aGUgcGxhY2VtYXJrZXIgYW5kIGluY2pzIGFjdGlvbnMsIHRoaXMgd2lsbCBleGNsdWRlIGpxdWVyeSBmcm9tIGJlaW5nIGluY2x1ZGVkPC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBub19yZWFkeT0iIiAtIEFwcGxpY2FibGUgb25seSB0byB0aGUgcGxhY2VtYXJrZXIgYWN0aW9ucywgdGhpcyB3aWxsIGV4Y2x1ZGUgYW55IHJlYWR5IGZ1bmN0aW9ucyBmcm9tIGJlaW5nIG91dHB1dC48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBjYWxndXkxMDAwICZsdDtjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnJmd0OzxiciAvPjxiciAvPlZlcnNpb246IDEuMi40PGJyIC8+PGJyIC8+Q2hhbmdlIEhpc3Rvcnk6PGJyIC8+PHVsPgogIDxsaT4xLjAuNCAtIE9jdG9iZXIgMjAwOQogICAgPHA+QWRkcyBqc29uIHN1cHBvcnQuPC9wPgogIDwvbGk+CiAgPGxpPjEuMC41IC0gTm92ZW1iZXIgMjAwOQogICAgPHA+QWRkcyBub19jc3MgYW5kIG5vX2pzIG9wdGlvbnMgdG8gdGhlIGluY2pzIGFjdGlvbi48L3A+CiAgPC9saT4KICA8bGk+MS4wLjYgLSBBcHJpbCAyMDEwCiAgICA8cD5BZGRzIGNhbGd1eXMgZGF0ZSB1dGlscyBwbHVnaW4uPC9wPgogIDwvbGk+CiAgPGxpPjEuMC45IC0gU2VwdGVtYmVyIDIwMTAKICAgIDxwPkFkZHMgbm9fanF1ZXJ5IG9wdGlvbiB0byB0aGUgaW5janMgYWN0aW9uLjwvcD4KICAgIDxQPkRvIG5vdCBvdXRwdXQganF1ZXJ5IHRhZ3MgZm9yIGFueSBtb2R1bGUgYWN0aW9ucyBvciBhZG1pbiBhY3Rpb25zIGlmIENNUyBWZXJzaW9uIGlzID49IENNUyAxLjktYmV0YTE8L3A+CiAgPC9saT4KICA8bGk+MS4wLjEwIC0gCiAgICA8cD5NaW5vciBmaXhlcy48L3A+CiAgPC9saT4KICA8bGk+MS4wLjExIC0gSnVuZSAyMDExCiAgICA8dWw+IAogICAgICA8bGk+TWlub3IgRml4ZXMuPC9saT4KICAgICAgPGxpPk1vdmVzIENoYW5nZWxvZyBFeHRlcm5hbC48L2xpPgogICAgICA8bGk+TWlub3IgY2hhbmdlIGZvciAxLjEwIGNvbXBhdGliaWxpdHkuPC9saT4KICAgICAgPGxpPlVwZGF0ZSBkZXBlbmRlbmNpZXMuPC9saT4KICAgIDwvdWw+CiAgPC9saT4KICA8bGk+MS4xIC0gSnVseSAyMDEyCiAgIDx1bD4KICAgICA8bGk+TW92ZSBoZWxwIGV4dGVybmFsLjwvbGk+CiAgICAgPGxpPlVwZ3JhZGUganF1ZXJ5IGFuZCBmYW5jeWJveC48L2xpPgogICA8dWw+CiAgPC9saT4KICA8bGk+MS4yIC0gSmFudWFyeSAyMDEzCiAgICA8dWw+CiAgICAgIDxsaT5BZGRzIHRoZSByZXF1aXJlIGFuZCBwbGFjZW1hcmtlciBhY3Rpb25zLjwvbGk+CiAgICAgIDxsaT5VcGdyYWRlcyBhbGwgbGlicmFyaWVzIGFuZCByZWZvcm1hdHMgdGhlbSBpbnRvIGEgZGlmZmVyZW50IHN0cnVjdHVyZS48L2xpPgogICAgICA8bGk+QWRkcyBqcXVlcnkgdWksICBhbmQgQ0ROIHN1cHBvcnQuPC9saT4KICAgIDwvdWw+CiAgPC9saT4KPC91bD4KPGJyIC8+]]></about>
	<description><![CDATA[A toolbox of Jquery utilities to aide in creating dynamic and fancy CMS Made Simple modules and websites]]></description>
	<requires>
	  <requiredname>CGExtensions</requiredname>
	  <requiredversion>1.31</requiredversion>
	</requires>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.incjs.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVRvb2xzIChjKSAyMDA4IGJ5IFJvYmVydCBDYW1wYmVsbCAKIyAgICAgICAgIChjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnKQojICBBIHRvb2xib3ggb2YgY29udmVuaWVuY2VzIHRvIHByb3ZpZGUgZHluYW1pYyBqYXZhc2NyaXB0eSBmdW5jdGlvbmFsaXR5CiMgIGZvciBDTVMgbW9kdWxlcyBhbmQgd2Vic2l0ZSBkZXNpZ25lcnMuCiMgCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCiMgYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCiMgaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwojIE1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiAKIyBzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI0VORF9MSUNFTlNFCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCiRjb25maWcgPSBjbXNtcygpLT5HZXRDb25maWcoKTsKJGJhc2VkaXIgPSAkdGhpcy0+R2V0TW9kdWxlUGF0aCgpLicvbGliJzsKJGRpcnMgPSBnbG9iKCRiYXNlZGlyLicvKi5saWInKTsKCiRsaWJyYXJpZXMgPSBhcnJheSgpOwppZiggaXNfYXJyYXkoJGRpcnMpICYmIGNvdW50KCRkaXJzKSApIHsKICBmb3JlYWNoKCAkZGlycyBhcyAkb25lICkgewogICAgaWYoICFpc19kaXIoJG9uZSkgKSBjb250aW51ZTsKICAgIGlmKCAhZmlsZV9leGlzdHMoJG9uZS4nL2luZm8uZGF0JykgKSBjb250aW51ZTsKICAgICRibiA9IGJhc2VuYW1lKCRvbmUpOwogICAgJG5hbWUgPSBzdWJzdHIoJGJuLDAsLTQpOwogICAgaW5jbHVkZV9vbmNlKCRvbmUuJy9pbmZvLmRhdCcpOwoKICAgICRpbmZvWydiYXNlX2RpciddID0gJG9uZTsKICAgICRpbmZvWydiYXNlX3VybCddID0gJHRoaXMtPkdldE1vZHVsZVVSTFBhdGgoKS4iL2xpYi8kYm4iOwogICAgJGxpYnJhcmllc1skbmFtZV0gPSAkaW5mbzsKCiAgICB1bnNldCgkaW5mbyk7CiAgfQp9CgovLyBsb29wIHRocm91Z2ggdGhlIGxpYnJhcmllcwovLyBmaW5kIHRoZSBvbmVzIHdpdGggbm8gZGVwZW5kZW5jaWVzCgokYmFzZXVybCA9ICRjb25maWctPnNtYXJ0X3Jvb3RfdXJsKCkuJy9tb2R1bGVzLycuJHRoaXMtPkdldE5hbWUoKS4nL2xpYi8nOwokZm10ID0gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiVzIj48L3NjcmlwdD4nLiJcbiI7CiRkb19jc3MgPSAxOwokZG9fanMgPSAxOwokZXhjbHVkZXMgPSBhcnJheSgpOwokZG9fanF1ZXJ5ID0gMTsKCmlmKCAhY21zbXMoKS0+aXNfZnJvbnRlbmRfcmVxdWVzdCgpICkgewogICRleGNsdWRlc1tdID0gJ2pxdWVyeSc7CiAgJGV4Y2x1ZGVzW10gPSAndWknOwogICRleGNsdWRlc1tdID0gJ2ZpbGV1cGxvYWQnOyAvLyB0aGlzIG1heSBiZSBpbmNsdWRlZCBpbiBzb21lIGFkbWluIHRoZW1lcy4KfQppZiggaXNzZXQoJHBhcmFtc1snbm9fanF1ZXJ5J10pICkgewogICRleGNsdWRlc1tdID0gJ2pxdWVyeSc7Cn0KaWYoIGlzc2V0KCRwYXJhbXNbJ25vX2NzcyddKSApIHsKICAkZG9fY3NzID0gMDsKfQppZiggaXNzZXQoJHBhcmFtc1snbm9fanMnXSkgKSB7CiAgJGRvX2pzID0gMDsKfQoKaWYoIGlzc2V0KCRwYXJhbXNbJ2V4Y2x1ZGUnXSkgKSB7CiAgJGV4Y2x1ZGUgPSBleHBsb2RlKCcsJywkcGFyYW1zWydleGNsdWRlJ10pOwogICRleGNsdWRlcyA9IGFycmF5X21lcmdlKCRleGNsdWRlcywkZXhjbHVkZSk7Cn0KJGV4Y2x1ZGVzID0gYXJyYXlfdW5pcXVlKCRleGNsdWRlcyk7CgovLyBhc3NlbWJsZSB0aGUgbGlzdCBvZiBsaWJyYXJpZXMgYW5kIGNzcyBmaWxlcy4KJGxpYnMgPSBhcnJheSgpOwokY3NzID0gYXJyYXkoKTsKaWYoICFmdW5jdGlvbl9leGlzdHMoJ2pxdWVyeXRvb2xzX2luY2pzJykgKSB7CiAgZnVuY3Rpb24ganF1ZXJ5dG9vbHNfaW5janMoJG5hbWUsJiRsaWJyYXJpZXMsJGV4Y2x1ZGVzLCYkbGlicywmJGNzcywkZG9fanMsJGRvX2NzcykgewogICAgaWYoICFpc3NldCgkbGlicmFyaWVzWyRuYW1lXSkgKSByZXR1cm47CiAgICBpZiggaW5fYXJyYXkoJG5hbWUsJGV4Y2x1ZGVzKSApIHJldHVybjsKCiAgICAkaW5mbyA9JiAkbGlicmFyaWVzWyRuYW1lXTsKICAgIGlmKCBpc3NldCgkaW5mb1snaGFuZGxlZCddKSAmJiAkaW5mb1snaGFuZGxlZCddID09IDEgKSByZXR1cm47CgogICAgLy8gZG8gZGVwZW5kZW5jaWVzIGZpcnN0CiAgICBpZiggaXNzZXQoJGluZm9bJ2RlcGVuZHMnXSkgJiYgJGluZm9bJ2RlcGVuZHMnXSApIHsKICAgICAgaWYoICFpc19hcnJheSgkaW5mb1snZGVwZW5kcyddKSApICRpbmZvWydkZXBlbmRzJ10gPSBleHBsb2RlKCcsJywkaW5mb1snZGVwZW5kcyddKTsKCiAgICAgIGZvcmVhY2goICRpbmZvWydkZXBlbmRzJ10gYXMgJGRlcGVuZGVuY3kgKSB7CglqcXVlcnl0b29sc19pbmNqcygkZGVwZW5kZW5jeSwkbGlicmFyaWVzLCRleGNsdWRlcywkbGlicywkY3NzLCRkb19qcywkZG9fY3NzKTsKICAgICAgfQogICAgfQogICAgCiAgICAvLyB0aGVuIHRoaXMgbGlicmFyeQogICAgaWYoICRkb19qcyAmJiBpc3NldCgkaW5mb1snanMnXSkgJiYgJGluZm9bJ2pzJ10gKSB7CiAgICAgIGlmKCAhaXNfYXJyYXkoJGluZm9bJ2pzJ10pICkgJGluZm9bJ2pzJ10gPSBleHBsb2RlKCcsJywkaW5mb1snanMnXSk7CgogICAgICBpZiggaXNzZXQoJGluZm9bJ2NkbiddKSAmJiBjbXNtcygpLT5pc19mcm9udGVuZF9yZXF1ZXN0KCkgKSB7CgkvLyBhc3N1bWUgb25seSBvbmUgcmVjb3JkLgoJJGJuID0gYmFzZW5hbWUoJGluZm9bJ2NkbiddKTsKCWlmKCBpc3NldCgkbGlic1skYm5dKSApIGNvbnRpbnVlOwoJJGxpYnNbJGJuXSA9ICRpbmZvWydjZG4nXTsKICAgICAgfQogICAgICBlbHNlIHsKCWZvcmVhY2goICRpbmZvWydqcyddIGFzICRvbmVfanMgKSB7CgkgICRibiA9IGJhc2VuYW1lKCRvbmVfanMpOwoJICBpZiggaXNzZXQoJGxpYnNbJGJuXSkgKSBjb250aW51ZTsKCgkgICR1cmwgPSAkaW5mb1snYmFzZV91cmwnXS4nLycuJG9uZV9qczsKCSAgJGxpYnNbJGJuXSA9ICR1cmw7Cgl9CiAgICAgIH0KICAgIH0KCiAgICBpZiggJGRvX2NzcyAmJiBpc3NldCgkaW5mb1snY3NzJ10pICYmICRpbmZvWydjc3MnXSApIHsKICAgICAgaWYoICFpc19hcnJheSgkaW5mb1snY3NzJ10pICkgJGluZm9bJ2NzcyddID0gZXhwbG9kZSgnLCcsJGluZm9bJ2NzcyddKTsKCiAgICAgIGZvcmVhY2goICRpbmZvWydjc3MnXSBhcyAkb25lX2NzcyApIHsKCSRibiA9IGJhc2VuYW1lKCRvbmVfY3NzKTsKCWlmKCBpc3NldCgkY3NzWyRibl0pICkgY29udGludWU7CgoJJHVybCA9ICRpbmZvWydiYXNlX3VybCddLicvJy4kb25lX2NzczsKCSRjc3NbJGJuXSA9ICR1cmw7CiAgICAgIH0KICAgIH0KCiAgICAkaW5mb1snaGFuZGxlZCddID0gMTsKICB9Cn0KCiR0aGlzLT5fbGlicyA9IGFycmF5X2tleXMoJGxpYnJhcmllcyk7CmZvcmVhY2goICR0aGlzLT5fbGlicyBhcyAkb25lICkgewogIGpxdWVyeXRvb2xzX2luY2pzKCRvbmUsJGxpYnJhcmllcywkZXhjbHVkZXMsJGxpYnMsJGNzcywkZG9fanMsJGRvX2Nzcyk7Cn0KCiRsaWJzID0gYXJyYXlfdW5pcXVlKCRsaWJzKTsKJGNzcyA9IGFycmF5X3VuaXF1ZSgkY3NzKTsKCmlmKCBjb3VudCgkbGlicykgJiYgJGRvX2pzICkgewogICRzbWFydHktPmFzc2lnbignbGlicycsJGxpYnMpOwp9CmlmKCBjb3VudCgkY3NzKSAmJiAkZG9fY3NzICkgewogICRzbWFydHktPmFzc2lnbignY3NzJywkY3NzKTsKfQoKaWYoIGNvdW50KCRjc3MpIHx8IGNvdW50KCRsaWJzKSApIHsKICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2luY2pzLnRwbCcpOwp9CgojCiMgRU9GCiMKPz4K]]></data>
	</file>
	<file>
	  <filename>/action.placemarker.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVRvb2xzIChjKSAyMDA4IGJ5IFJvYmVydCBDYW1wYmVsbCAKIyAgICAgICAgIChjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnKQojICBBIHRvb2xib3ggb2YgY29udmVuaWVuY2VzIHRvIHByb3ZpZGUgZHluYW1pYyBqYXZhc2NyaXB0eSBmdW5jdGlvbmFsaXR5CiMgIGZvciBDTVMgbW9kdWxlcyBhbmQgd2Vic2l0ZSBkZXNpZ25lcnMuCiMgCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCiMgYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCiMgaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwojIE1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiAKIyBzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI0VORF9MSUNFTlNFCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCi8vIGNoZWNrIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRvIGRvLgppZiggKCFpc19hcnJheSgkdGhpcy0+X2xpYnMpIHx8IGNvdW50KCR0aGlzLT5fbGlicykgPT0gMCkgKSByZXR1cm47CgokY29uZmlnID0gY21zbXMoKS0+R2V0Q29uZmlnKCk7CiRiYXNlZGlyID0gJHRoaXMtPkdldE1vZHVsZVBhdGgoKS4nL2xpYic7CiRkaXJzID0gZ2xvYigkYmFzZWRpci4nLyoubGliJyk7CgokbGlicmFyaWVzID0gYXJyYXkoKTsKaWYoIGlzX2FycmF5KCRkaXJzKSAmJiBjb3VudCgkZGlycykgKSB7CiAgZm9yZWFjaCggJGRpcnMgYXMgJG9uZSApIHsKICAgIGlmKCAhaXNfZGlyKCRvbmUpICkgY29udGludWU7CiAgICBpZiggIWZpbGVfZXhpc3RzKCRvbmUuJy9pbmZvLmRhdCcpICkgY29udGludWU7CiAgICAkYm4gPSBiYXNlbmFtZSgkb25lKTsKICAgICRuYW1lID0gc3Vic3RyKCRibiwwLC00KTsKICAgIGluY2x1ZGVfb25jZSgkb25lLicvaW5mby5kYXQnKTsKCiAgICAkaW5mb1snYmFzZV9kaXInXSA9ICRvbmU7CiAgICAkaW5mb1snYmFzZV91cmwnXSA9ICR0aGlzLT5HZXRNb2R1bGVVUkxQYXRoKCkuIi9saWIvJGJuIjsKICAgICRsaWJyYXJpZXNbJG5hbWVdID0gJGluZm87CgogICAgdW5zZXQoJGluZm8pOwogIH0KfQoKLy8gbG9vcCB0aHJvdWdoIHRoZSBsaWJyYXJpZXMKLy8gZmluZCB0aGUgb25lcyB3aXRoIG5vIGRlcGVuZGVuY2llcwoKJGJhc2V1cmwgPSAkY29uZmlnLT5zbWFydF9yb290X3VybCgpLicvbW9kdWxlcy8nLiR0aGlzLT5HZXROYW1lKCkuJy9saWIvJzsKJGZtdCA9ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIlcyI+PC9zY3JpcHQ+Jy4iXG4iOwokZG9fY3NzID0gMTsKJGRvX2NkbiA9IDE7CiRkb19qcyA9IDE7CiRleGNsdWRlcyA9IGFycmF5KCk7CiRkb19qcXVlcnkgPSAxOwoKaWYoICFjbXNtcygpLT5pc19mcm9udGVuZF9yZXF1ZXN0KCkgKSB7CiAgJGV4Y2x1ZGVzW10gPSAnanF1ZXJ5JzsKICAkZXhjbHVkZXNbXSA9ICd1aSc7CiAgJGV4Y2x1ZGVzW10gPSAnZmlsZXVwbG9hZCc7Cn0KaWYoIGlzc2V0KCRwYXJhbXNbJ25vX2pxdWVyeSddKSApIHsKICAkZXhjbHVkZXNbXSA9ICdqcXVlcnknOwp9CmlmKCBpc3NldCgkcGFyYW1zWydub19jc3MnXSkgKSB7CiAgJGRvX2NzcyA9IDA7Cn0KaWYoIGlzc2V0KCRwYXJhbXNbJ25vX2pzJ10pICkgewogICRkb19qcyA9IDA7Cn0KaWYoIGlzc2V0KCRwYXJhbXNbJ25vX2NkbiddKSApIHsKICAkZG9fY2RuID0gMDsKfQoKaWYoIGlzc2V0KCRwYXJhbXNbJ2V4Y2x1ZGUnXSkgKSB7CiAgJGV4Y2x1ZGUgPSBleHBsb2RlKCcsJywkcGFyYW1zWydleGNsdWRlJ10pOwogICRleGNsdWRlcyA9IGFycmF5X21lcmdlKCRleGNsdWRlcywkZXhjbHVkZSk7Cn0KJGV4Y2x1ZGVzID0gYXJyYXlfdW5pcXVlKCRleGNsdWRlcyk7CgovLyBhc3NlbWJsZSB0aGUgbGlzdCBvZiBsaWJyYXJpZXMgYW5kIGNzcyBmaWxlcy4KJGxpYnMgPSBhcnJheSgpOwokY3NzID0gYXJyYXkoKTsKaWYoICFmdW5jdGlvbl9leGlzdHMoJ2pxdWVyeXRvb2xzX2luY2pzJykgKSB7CiAgZnVuY3Rpb24ganF1ZXJ5dG9vbHNfaW5janMoJG5hbWUsJiRsaWJyYXJpZXMsJGV4Y2x1ZGVzLCYkbGlicywmJGNzcywkZG9fanMsJGRvX2NzcywkZG9fY2RuKSB7CiAgICBpZiggIWlzc2V0KCRsaWJyYXJpZXNbJG5hbWVdKSApIHJldHVybjsKICAgIGlmKCBpbl9hcnJheSgkbmFtZSwkZXhjbHVkZXMpICkgcmV0dXJuOwoKICAgICRpbmZvID0mICRsaWJyYXJpZXNbJG5hbWVdOwogICAgaWYoIGlzc2V0KCRpbmZvWydoYW5kbGVkJ10pICYmICRpbmZvWydoYW5kbGVkJ10gPT0gMSApIHJldHVybjsKCiAgICAvLyBkbyBkZXBlbmRlbmNpZXMgZmlyc3QKICAgIGlmKCBpc3NldCgkaW5mb1snZGVwZW5kcyddKSAmJiAkaW5mb1snZGVwZW5kcyddICkgewogICAgICBpZiggIWlzX2FycmF5KCRpbmZvWydkZXBlbmRzJ10pICkgJGluZm9bJ2RlcGVuZHMnXSA9IGV4cGxvZGUoJywnLCRpbmZvWydkZXBlbmRzJ10pOwoKICAgICAgZm9yZWFjaCggJGluZm9bJ2RlcGVuZHMnXSBhcyAkZGVwZW5kZW5jeSApIHsKCWpxdWVyeXRvb2xzX2luY2pzKCRkZXBlbmRlbmN5LCRsaWJyYXJpZXMsJGV4Y2x1ZGVzLCRsaWJzLCRjc3MsJGRvX2pzLCRkb19jc3MsJGRvX2Nkbik7CiAgICAgIH0KICAgIH0KCiAgICAvLyB0aGVuIHRoaXMgbGlicmFyeQogICAgaWYoICRkb19qcyAmJiBpc3NldCgkaW5mb1snanMnXSkgJiYgJGluZm9bJ2pzJ10gKSB7CiAgICAgIGlmKCAhaXNfYXJyYXkoJGluZm9bJ2pzJ10pICkgJGluZm9bJ2pzJ10gPSBleHBsb2RlKCcsJywkaW5mb1snanMnXSk7CgogICAgICBpZiggaXNzZXQoJGluZm9bJ2NkbiddKSAmJiBjbXNtcygpLT5pc19mcm9udGVuZF9yZXF1ZXN0KCkgJiYgJGRvX2NkbiApIHsKCS8vIGFzc3VtZSBvbmx5IG9uZSByZWNvcmQuCgkkYm4gPSBiYXNlbmFtZSgkaW5mb1snY2RuJ10pOwoJaWYoIGlzc2V0KCRsaWJzWyRibl0pICkgY29udGludWU7CgkkbGlic1skYm5dID0gJGluZm9bJ2NkbiddOwogICAgICB9CiAgICAgIGVsc2UgewoJZm9yZWFjaCggJGluZm9bJ2pzJ10gYXMgJG9uZV9qcyApIHsKCSAgJGJuID0gYmFzZW5hbWUoJG9uZV9qcyk7CgkgIGlmKCBpc3NldCgkbGlic1skYm5dKSApIGNvbnRpbnVlOwoKCSAgJHVybCA9ICRpbmZvWydiYXNlX3VybCddLicvJy4kb25lX2pzOwoJICAkbGlic1skYm5dID0gJHVybDsKCX0KICAgICAgfQogICAgfQoKICAgIGlmKCAkZG9fY3NzICYmIGlzc2V0KCRpbmZvWydjc3MnXSkgJiYgJGluZm9bJ2NzcyddICkgewogICAgICBpZiggIWlzX2FycmF5KCRpbmZvWydjc3MnXSkgKSAkaW5mb1snY3NzJ10gPSBleHBsb2RlKCcsJywkaW5mb1snY3NzJ10pOwoKICAgICAgZm9yZWFjaCggJGluZm9bJ2NzcyddIGFzICRvbmVfY3NzICkgewoJJGJuID0gYmFzZW5hbWUoJG9uZV9jc3MpOwoJaWYoIGlzc2V0KCRjc3NbJGJuXSkgKSBjb250aW51ZTsKCgkkdXJsID0gJGluZm9bJ2Jhc2VfdXJsJ10uJy8nLiRvbmVfY3NzOwoJJGNzc1skYm5dID0gJHVybDsKICAgICAgfQogICAgfQoKICAgICRpbmZvWydoYW5kbGVkJ10gPSAxOwogIH0KfQoKaWYoICFpc19hcnJheSgkdGhpcy0+X2xpYnMpICkgewogICR0aGlzLT5fbGlicyA9IGFycmF5X2tleXMoJGxpYnJhcmllcyk7Cn0KCmZvcmVhY2goICR0aGlzLT5fbGlicyBhcyAkb25lICkgewogIGpxdWVyeXRvb2xzX2luY2pzKCRvbmUsJGxpYnJhcmllcywkZXhjbHVkZXMsJGxpYnMsJGNzcywkZG9fanMsJGRvX2NzcywkZG9fY2RuKTsKfQoKJGxpYnMgPSBhcnJheV91bmlxdWUoJGxpYnMpOwokY3NzID0gYXJyYXlfdW5pcXVlKCRjc3MpOwoKaWYoIGNvdW50KCRsaWJzKSAmJiAkZG9fanMgKSB7CiAgJHNtYXJ0eS0+YXNzaWduKCdsaWJzJywkbGlicyk7Cn0KaWYoIGNvdW50KCRjc3MpICYmICRkb19jc3MgKSB7CiAgJHNtYXJ0eS0+YXNzaWduKCdjc3MnLCRjc3MpOwp9CgppZiggY291bnQoJGNzcykgfHwgY291bnQoJGxpYnMpICkgewogIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnaW5janMudHBsJyk7CiAgJHJlYWR5ID0gVFJVRTsKICBpZiggaXNzZXQoJHBhcmFtc1snbm9fcmVhZHknXSkgKSB7CiAgICAkcmVhZHkgPSAhY21zX3RvX2Jvb2woJHBhcmFtc1snbm9fcmVhZHknXSk7CiAgfQogIGlmKCAkcmVhZHkgKSB7CiAgICAkdGhpcy0+RG9BY3Rpb24oJ3JlYWR5JywnanF0cicsYXJyYXkoKSk7CiAgfQp9CgojCiMgRU9GCiMKPz4K]]></data>
	</file>
	<file>
	  <filename>/action.ready.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVRvb2xzIChjKSAyMDA4IGJ5IFJvYmVydCBDYW1wYmVsbCAKIyAgICAgICAgIChjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnKQojICBBIHRvb2xib3ggb2YgY29udmVuaWVuY2VzIHRvIHByb3ZpZGUgZHluYW1pYyBqYXZhc2NyaXB0eSBmdW5jdGlvbmFsaXR5CiMgIGZvciBDTVMgbW9kdWxlcyBhbmQgd2Vic2l0ZSBkZXNpZ25lcnMuCiMgCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCiMgYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCiMgaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwojIE1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiAKIyBzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI0VORF9MSUNFTlNFCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCiR0X2xpYnMgPSBhcnJheSgpOwppZiggaXNfYXJyYXkoJHRoaXMtPl9saWJzKSApIHsKICBmb3JlYWNoKCR0aGlzLT5fbGlicyBhcyAkb25lKSB7CiAgICAkdF9saWJzWyRvbmVdID0gMTsKICB9Cn0KaWYoIGNvdW50KCR0X2xpYnMpICkgewogICRzbWFydHktPmFzc2lnbignanF1ZXJ5X2xpYnMnLCR0X2xpYnMpOwogIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgncmVhZHkudHBsJyk7Cn0KCiMKIyBFT0YKIwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.require.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVRvb2xzIChjKSAyMDA4IGJ5IFJvYmVydCBDYW1wYmVsbCAKIyAgICAgICAgIChjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnKQojICBBIHRvb2xib3ggb2YgY29udmVuaWVuY2VzIHRvIHByb3ZpZGUgZHluYW1pYyBqYXZhc2NyaXB0eSBmdW5jdGlvbmFsaXR5CiMgIGZvciBDTVMgbW9kdWxlcyBhbmQgd2Vic2l0ZSBkZXNpZ25lcnMuCiMgCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCiMgYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCiMgaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwojIE1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiAKIyBzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI0VORF9MSUNFTlNFCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKaWYoICFpc3NldCgkcGFyYW1zWydsaWInXSkgfHwgJHBhcmFtc1snbGliJ10gPT0gJycgKSByZXR1cm47CgppZiggIWlzX2FycmF5KCR0aGlzLT5fbGlicykgKSAkdGhpcy0+X2xpYnMgPSBhcnJheSgpOwokbGlicyA9IGV4cGxvZGUoJywnLCRwYXJhbXNbJ2xpYiddKTsKZm9yZWFjaCggJGxpYnMgYXMgJGxpYiApIHsKICAkdGhpcy0+X2xpYnNbXSA9IHN0cnRvbG93ZXIodHJpbSgkbGliKSk7Cn0KCi8vIHRoYXQncyBpdCwgbm90aGluZyBtb3JlLgovLyByZW1lbWJlciB0byBjYWxsIHRoaXMgd2l0aCBub2NhY2hlIGF0dHJpYnV0ZS4KCiMKIyBFT0YKIwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/changelog.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgogIDxsaT4xLjAuNCAtIE9jdG9iZXIgMjAwOQogICAgPHA+QWRkcyBqc29uIHN1cHBvcnQuPC9wPgogIDwvbGk+CiAgPGxpPjEuMC41IC0gTm92ZW1iZXIgMjAwOQogICAgPHA+QWRkcyBub19jc3MgYW5kIG5vX2pzIG9wdGlvbnMgdG8gdGhlIGluY2pzIGFjdGlvbi48L3A+CiAgPC9saT4KICA8bGk+MS4wLjYgLSBBcHJpbCAyMDEwCiAgICA8cD5BZGRzIGNhbGd1eXMgZGF0ZSB1dGlscyBwbHVnaW4uPC9wPgogIDwvbGk+CiAgPGxpPjEuMC45IC0gU2VwdGVtYmVyIDIwMTAKICAgIDxwPkFkZHMgbm9fanF1ZXJ5IG9wdGlvbiB0byB0aGUgaW5janMgYWN0aW9uLjwvcD4KICAgIDxQPkRvIG5vdCBvdXRwdXQganF1ZXJ5IHRhZ3MgZm9yIGFueSBtb2R1bGUgYWN0aW9ucyBvciBhZG1pbiBhY3Rpb25zIGlmIENNUyBWZXJzaW9uIGlzID49IENNUyAxLjktYmV0YTE8L3A+CiAgPC9saT4KICA8bGk+MS4wLjEwIC0gCiAgICA8cD5NaW5vciBmaXhlcy48L3A+CiAgPC9saT4KICA8bGk+MS4wLjExIC0gSnVuZSAyMDExCiAgICA8dWw+IAogICAgICA8bGk+TWlub3IgRml4ZXMuPC9saT4KICAgICAgPGxpPk1vdmVzIENoYW5nZWxvZyBFeHRlcm5hbC48L2xpPgogICAgICA8bGk+TWlub3IgY2hhbmdlIGZvciAxLjEwIGNvbXBhdGliaWxpdHkuPC9saT4KICAgICAgPGxpPlVwZGF0ZSBkZXBlbmRlbmNpZXMuPC9saT4KICAgIDwvdWw+CiAgPC9saT4KICA8bGk+MS4xIC0gSnVseSAyMDEyCiAgIDx1bD4KICAgICA8bGk+TW92ZSBoZWxwIGV4dGVybmFsLjwvbGk+CiAgICAgPGxpPlVwZ3JhZGUganF1ZXJ5IGFuZCBmYW5jeWJveC48L2xpPgogICA8dWw+CiAgPC9saT4KICA8bGk+MS4yIC0gSmFudWFyeSAyMDEzCiAgICA8dWw+CiAgICAgIDxsaT5BZGRzIHRoZSByZXF1aXJlIGFuZCBwbGFjZW1hcmtlciBhY3Rpb25zLjwvbGk+CiAgICAgIDxsaT5VcGdyYWRlcyBhbGwgbGlicmFyaWVzIGFuZCByZWZvcm1hdHMgdGhlbSBpbnRvIGEgZGlmZmVyZW50IHN0cnVjdHVyZS48L2xpPgogICAgICA8bGk+QWRkcyBqcXVlcnkgdWksICBhbmQgQ0ROIHN1cHBvcnQuPC9saT4KICAgIDwvdWw+CiAgPC9saT4KPC91bD4K]]></data>
	</file>
	<file>
	  <filename>/help.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgzPldoYXQgaXMgdGhpcz88L2gzPgo8cD5UaGlzIG1vZHVsZSBhZGRzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cuanF1ZXJ5LmNvbSI+alF1ZXJ5PC9hPiBhbmQgdmFyaW91cyBhZGRvbiBsaWJyYXJpZXMgdG8gQ01TIE1hZGUgU2ltcGxlIHBhZ2UsIGFuZCBtb2R1bGVzIChldmVuIGluIHRoZSBhZG1pbiBzZWN0aW9uKSwgY29udmVuaWVudGx5IGFuZCBlYXNpbHkuICBJdCBwcm92aWRlcyBhIGNvbnZlbmllbnQgYW5kIHNpbXBsZSB3YXkgdG8gaW5jbHVkZSBqcXVlcnkgYW5kIGpxdWVyeSBkZXBlbmRlbnQgbGlicmFyaWVzIGludG8geW91ciBDTVNNUyBjb250ZW50IHBhZ2UuPC9wPgo8aDM+SG93IGRvIEkgdXNlIGl0PzwvaDM+CjxwPkVuYWJsaW5nIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBhIHR3byBzdGVwIHByb2Nlc3M6PC9wPgo8dWw+CiAgPGxpPjEuICBFbmFibGUgdGhlIGpxdWVyeSBsaWJyYXJpZXMgdGhhdCB5b3Ugd2FudCBieSBjYWxsaW5nIDxjb2RlPntKUXVlcnlUb29scyBhY3Rpb249cmVxdWlyZSBsaWI9Jmx0O2xpYnJhcnkgbmFtZSZndDsgbm9jYWNoZX08L2NvZGU+IGluIHlvdXIgcGFnZSBjb250ZW50LgogICAgPHA+VGhpcyB0YWcgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byBlbmFibGUgbXVsdGlwbGUgbGlicmFyaWVzLiAgdGhlIGxpYiBhcmd1bWVudCBhbHNvIHN1cHBvcnRzIHBhc3NpbmcgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBsaWJyYXJ5IG5hbWVzLjwvcD4KICA8L2xpPgogIDxsaT4yLiAgQ2FsbCA8Y29kZT57SlFlcnlUb29scyBhY3Rpb249cGxhY2VtYXJrZXIgbm9jYWNoZX08L2NvZGU+IGluIHRoZSBhcHByb3ByaWF0ZSBwYXJ0IG9mIHlvdXIgcGFnZSB0ZW1wbGF0ZS4KICAgIDx1bD4KICAgICAgPGxpPlRvIGVuYWJsZSBKUXVlcnlUb29scyBmb3IgYSBzcGVjaWZpYyBwYWdlIGl0IGlzIG9mdGVuIHVzZWZ1bCB0byBwbGFjZSB0aGUgPGNvZGU+e0pRdWVyeVRvb2xzIGFjdGlvbj1wbGFjZW1hcmtlciBub2NhY2hlfTwvY29kZT4gdGFnIGluIHRoZSBwYWdlIHNwZWNpZmljIG1ldGFkYXRhIGZpZWxkIG9mIGVhY2ggY29udGVudCBwYWdlLjwvbGk+CiAgICAgIDxsaT5UbyBlbmFibGUgSlF1ZXJ5VG9vbHMgb24gYSBzaXRlIHdpZGUgYmFzaXMgdGhlIDxjb2RlPntKcXVlcnlUb29scyBhY3Rpb249cGxhY2VtYXJrZXIgbm9jYWNoZX08L2NvZGU+IHRhZyBjYW4gYmUgcGxhc2VkIGluIHRoZSBnbG9iYWwgbWV0YWRhdGEgZmllbGQgaW4gdGhlIGdsb2JhbCBzZXR0aW5ncy48L2xpPgogICAgICA8bGk+WW91IG1heSBhbHNvIHBsYWNlIHRoZSA8Y29kZT57SlF1ZXJ5VG9vbHMgYWN0aW9uPXBsYWNlbWFya2VyfTwvY29kZT4gdGFnIGluIGVhY2ggc3BlY2lmaWMgcGFnZSB0ZW1wbGF0ZSwgYXQgdGhlIGJvdG9vbSBvZiB0aGUgdGVtcGxhdGUgYWJvdmUgPC9ib2R5PiBvciBhbnl3aGVyZSBpbiB0aGhlIGhlYWQgc2VjdGlvbi48L2xpPgogICAgPC91bD4KICA8L2xpPgo8L3VsPgo8cD5UaGlzIG1vZHVsZSBkb2VzIG5vdCBwcm92aWRlIHNhbXBsZXMgYW5kIGluc3RydWN0aW9ucyBhcyB0byBob3cgdG8gdXNlIGpxdWVyeSBvciB0aGUgdmFyaW91cyBhZGRvbiBsaWJyYXJpZXMgdGhhdCB3ZSBpbmNsdWRlLiAgdG8gbGVhcm4gaG93IHRvIHVzZSB0aGVzZSBsaWJyYXJpZXMgeW91IHdpbGwgbmVlZCB0byByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgcGx1Z2lucyBhdCB0aGVpciByZXNwZWN0aXZlIGhvbWUgcGFnZS48L3A+CiAgCjxoMz5XaGF0IGpxdWVyeSB2ZXJzaW9uIGlzIGluY2x1ZGVkPzwvaDM+CjxwPkN1cnJlbnRseSBKUXVlcnlUb29scyB1c2VzIGpxdWVyeSAxLjguMzwvcD4KPGgzPldoYXQgSlF1ZXJ5IHBsdWdpbnMgYXJlIGluY2x1ZGVkPC9oMz4KPHVsPgogIDxsaT50YWJsZXNvcnRlciA8ZW0+KHNlZSA8YSBocmVmPSJodHRwOi8vdGFibGVzb3J0ZXIuY29tIj5odHRwOi8vdGFibGVzb3J0ZXIuY29tPC9hPiBmb3IgdXNhZ2UgaW5zdHJ1Y3Rpb25zKTwvZW0+CjxwPi0tIFRvIGFsbG93IHNvcnRpbmcgeW91ciB0YWJsZXMsIGdpdmUgdGhlIGZvbGx3aW5nIGNsYXNzZXMgdG8gdGhlIHRhYmxlIGRlZmluaXRpb246IGNtc19zb3J0YWJsZSB0YWJsZXNvcnRlci4gaS5lOiA8Y29kZT4mbHQ7dGFibGUgY2xhc3M9ImNtc19zb3J0YWJsZSB0YWJsZXNvcnRlciImZ3Q7Li4uJmx0Oy90YWJsZSZndDs8L2NvZGU+PC9wPgogIDwvbGk+CiAgPGxpPmpxdWVyeTwvbGk+CiAgPGxpPmpxdWVyeSB1aSAtIHNtb290aG5lc3MgdGhlbWUuPC9saT4KICA8bGk+Y2x1ZXRpcCA8ZW0+KHNlZSA8YSBocmVmPSJodHRwOi8vcGx1Z2lucy5sZWFybmluZ2pxdWVyeS5jb20vY2x1ZXRpcC8iPmh0dHA6Ly9wbHVnaW5zLmxlYXJuaW5nanF1ZXJ5LmNvbS9jbHVldGlwLzwvYT4gZm9yIHVzYWdlIGluc3RydWN0aW9ucyk8L2VtPjwvbGk+CiAgPGxpPmZvcm0gPGVtPihzZWUgPGEgaHJlZj0iaHR0cDovL21hbHN1cC5jb20vanF1ZXJ5L2Zvcm0vIj5odHRwOi8vbWFsc3VwLmNvbS9qcXVlcnkvZm9ybS88L2E+IGZvciB1c2FnZSBpbnN0cnVjdGlvbnMpPC9lbT48L2xpPgogIDxsaT5mYW5jeWJveCA8ZW0+KHNlZSA8YSBocmVmPSJodHRwOi8vZmFuY3kua2xhZGUubHYvIj5odHRwOi8vZmFuY3kua2xhZGUubHYvPC9hPiBmb3IgdXNhZ2UgaW5zdHJ1Y3Rpb25zKTwvZW0+PC9saT4KICA8bGk+anNvbjwvbGk+CiAgPGxpPmxpZ2h0Ym94PC9saT4KICA8bGk+ZmlsZXVwbG9hZCAtIFRoZSBibHVlaW1wIGpxdWVyeSBmaWxlIHVwbG9hZCBsaWJyYXJ5LjwvbGk+CjwvdWw+CjxoMz5FeGFtcGxlOjwvaDM+CiA8cD5TbyB5b3UgaGF2ZSB1cGxvYWRlZCBzb21lIGZpbGVzIHRvIGEgY2F0ZWdvcnkgaW4gdGhlIHVwbG9hZHMgbW9kdWxlLCBhbmQgeW91IHdhbnQgdG8gdXNlIGZhbmN5Ym94IHRvIHByZXZpZXcgdGhlIGltYWdlcyBmcm9tIGFuIFVwbG9hZHMgbW9kdWxlIHN1bW1hcnkgdmlldy4gVGhpcyBpcyBhIHNpbXBsZSAzIHN0ZXAgcHJvY2Vzczo8L3A+CjxvbD4KICAgPGxpPk1vZGlmeSB5b3VyIHVwbG9hZHMgc3VtbWFyeSB0ZW1wbGF0ZSB0byBzb21ldGhpbmcgc2ltaWxhciB0byB0aGlzOgo8cHJlPjxjb2RlPjxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPntKUXVlcnlUb29scyBhY3Rpb249cmVxdWlyZSBsaWI9ZmFuY3lib3ggbm9jYWNoZX08L3NwYW4+Cntmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09J2VudHJ5JyBuYW1lPSd1cGxvYWRzJ30KICAmbHQ7ZGl2IGNsYXNzPSJ1cGxvYWQiIHN0eWxlPSJmbG9hdDogbGVmdDsgd2lkdGg6IDMzJTsiJmd0OwogIHtpZiBpc3NldCgkZW50cnktPnRodW1ibmFpbF91cmwpfQogICZsdDthIGNsYXNzPSJmYW5jeWJveCIgaHJlZj0ieyRlbnRyeS0+b3JpZ2ZpbGVfdXJsfSIgdGl0bGU9InskZW50cnktPnVwbG9hZF9uYW1lfSImZ3Q7Jmx0O2ltZyBzcmM9InskZW50cnktPnRodW1ibmFpbF91cmx9IiBhbHQ9IiIvJmd0OyZsdDsvYSZndDsKICB7L2lmfSAgICAgCiAgJmx0Oy9kaXYmZ3Q7CnsvZm9yZWFjaH0KJmx0O2RpdiBzdHlsZT0iY2xlYXI6IGJvdGg7IiZndDsmZ3Q7L2RpdiZsdDs8L2NvZGU+PC9wcmU+CiAgIDxwPk5vdGUgdGhlIGNhbGwgdG8gSlF1ZXJ5VG9vbHMgdG8gaW5jbHVkZSB0aGUgZmFuY3lib3ggbGlicmFyeS4gQWRkaXRpb25hbGx5LCBub3RlIHRoZSBjbGFzcyBnaXZlbiB0byB0aGUgPGVtPmE8L2VtPiB0YWcuPC9wPgogIDwvbGk+CiAgPGxpPkNhbGwgPGNvZGU+e0pRdWVyeVRvb2xzIGFjdGlvbj1wbGFjZW1hcmtlciBub2NhY2hlfTwvY29kZT4KICAgIDxwPlRoZXJlIGFyZSBhdCBsZWFzdCBmb3VyIGxvY2F0aW9ucyB3aGVyZSB0aGlzIHRhZyBjYW4gYmUgY2FsbGVkOjwvcD4KICAgIDx1bD4KICAgICAgPGxpPkluIHRoZSBwYWdlIHRlbXBsYXRlIGRpcmVjdGx5IGJlZm9yZSB0aGUgPGNvZGU+Jmx0Oy9ib2R5Jmd0OzwvY29kZT4gdGFnLjwvbGk+CiAgICAgIDxsaT5JbiB0aGUgcGFnZSB0ZW1wbGF0ZSBkaXJlY3RseSBiZWZvcmUgdGhlIDxjb2RlPiZsdDsvaGVhZCZndDs8L2NvZGU+IHRhZy48L2xpPgogICAgICA8bGk+SW4gdGhlIHBhZ2UgbWV0YWRhdGEgZmllbGQgd2hlbiBlZGl0aW5nIGNvbnRlbnQuPC9saT4KICAgICAgPGxpPkluIHRoZSBnbG9iYWwgbWV0YWRhdGEgZmllbGQgaW4gdGhlIGdsb2JhbCBzZXR0aW5ncyBwYWdlLjwvbGk+CiAgICA8L3VsPgogIDwvbGk+CiAgPGxpPkNhbGwgdGhlIFVwbG9hZHMgbW9kdWxlIGZyb20gYSBwYWdlLiAgaS5lOjxici8+CiAgICA8cHJlPjxjb2RlPntVcGxvYWRzIGNhdGVnb3J5PWNhdGVnb3J5X25hbWV9PC9jb2RlPjwvcHJlPgogIDwvbGk+Cjwvb2w+CjxoMz5CdWlsdCBpbiBSZWFkeSBTY3JpcHRzPC9oMz4KPHA+VGhpcyBtb2R1bGUgc3VwcG9ydHMgc29tZSBzaW1wbGUgcmVhZHkgc3RhdGVzIHRvIGVhc2UgaW4gZGV2ZWxvcG1lbnQuICBBbGwgb2YgdGhlc2UgY2FuIGJlIG92ZXJ3cml0dGVuIGluIHlvdXIgb3duIGphdmFzY3JpcHQ6PC9wPgo8dWw+CiAgICA8bGk+ZmFuY3lib3ggLSBmYW5jeWJveCB3aWxsIHdvcmsgb24gYW55IGEgdGFnIHdpdGggYSBjbGFzcyBvZiBmYW5jeWJveDogICQoJ2EuZmFuY3lib3gnKS5mYW5jeWJveCgpCiAgICAgIDxwcmU+PGNvZGU+Jmx0O2EgY2xhc3M9JnF1b3Q7ZmFuY3lib3gmcXVvdDsgaHJlZj0mcXVvdDtodHRwOi8vd3d3Lm15c2l0ZS5jb20vdXBsb2Fkcy9pbWFnZXMvaW1hZ2UuanBnJnF1b3Q7Jmd0OyZsdDtpbWcgc3JjPSZxdW90O2h0dHA6Ly93d3cubXlzaXRlLmNvbS91cGxvYWRzL2ltYWdlcy90aHVtYl9pbWFnZS5qcGcmcXVvdDsvJmd0OyZsdDthJmd0OzwvY29kZT48L3ByZT4KCQkgICAgPHA+PHN0cm9uZz5IaW50Ojwvc3Ryb25nPiBVc2UgQ0dTbWFydEltYWdlIHRvIGF2b2lkIGhhdmluZyB0byBjcmVhdGUgYW5kIG1hbmFnZSB0aHVtYm5haWxzIDxlbT4ocmVxdWlyZXMgZG93bmxvYWRpbmcgYW5kIGluc3RhbGxpbmcgdGhlIENHU21hcnRJbWFnZSBtb2R1bGUpPC9lbT46PC9wPgoJCSAgICA8cHJlPjxjb2RlPiZsdDthIGNsYXNzPSZxdW90O2ZhbmN5Ym94JnF1b3Q7IGhyZWY9JnF1b3Q7e0NHU21hcnRJbWFnZSBzcmM9J2ltYWdlcy9pbWFnZS5qcGcnIG5vZW1iZWQ9MX0mcXVvdDsmZ3Q7e0NHU21hcnRJbWFnZSBzcmM9J2ltYWdlcy9pbWFnZS5qcGcnIHdpZHRoPTEwMCBoZWlnaHQ9MTAwfSZsdDthJmd0OzwvcHJlPjwvY29kZT4KICAgIDwvbGk+CiAgICA8bGk+bGlnaHRib3ggLSBsaWdodGJveCB3aWxsIHdvcmsgb24gYW55IGEgdGFnIHdpdGggYSBjbGFzcyBvZiBsaWdodGJveDogICQoJ2EubGlnaHRib3gnKS5saWdodGJveCgpPC9saT4KICAgIDxsaT5jbHVldGlwIC0gY2x1ZXRpcCB3aWxsIHdvcmsgb24gYW55IGEgdGFnIHdpdGggYSBjbGFzcyBvZiBjbHVldGlwOiAgJCgnYS5jbHVldGlwJykuY2x1ZXRpcCgpPC9saT4KICAgIDxsaT50YWJsZXNvcnRlciAtIHRhYmxlc29ydGVyIHdpbGwgd29yayBvbiBhbnkgdGFibGUgdGFnIHdpdGggYSBjbGFzcyBvZiBjbXNfc29ydGFibGU6ICQoJ3RhYmxlLmNtc19zb3J0YWJsZScpLnRhYmxlU29ydGVyKCk8L2xpPgo8L3VsPgo8aDM+QWJvdXQgc21hcnR5IGNhY2hpbmc8L2gzPgo8cD5UaGUgcmVxdWlyZSwgYW5kIHBsYWNlbWFya2VyIGFjdGlvbnMgZG8gbm90IHN1cHBvcnQgc21hcnR5IGNhY2hpbmcuICBJdCBpcyB0aGVyZWZlcmUgY3JpdGljYWwgdGhhdCB0aGUgbm9jYWNoZSBhdHRyaWJ1dGUgYmUgdXNlZCBvbiBjYWxscyB0byB0aGUgSlF1ZXJ5VG9vbHMgbW9kdWxlLjwvcD4KPGgzPkFib3V0IHRoZSBwbGFjZW1hcmtlciBhY3Rpb24uPC9oMz4KPHA+VGhlIHBsYWNlbWFya2VyIGFjdGlvbiBkb2VzIHRoZSBqb2Igb2YgZ2VuZXJhdGluZyB0aGUgaHRtbCB0byBpbnNlcnQgdGhlIGpxdWVyeSBzY3JpcHRzLCBhbmQgdGhlIHZhcmlvdXMgYWRkb24gbGlicmFyaWVzIHRoYXQgd2VyZSByZXF1ZXN0ZWQgdmlhIHRoZSByZXF1aXJlIGFjdGlvbi4gIFRoZXJlZm9yZSB0aGUgcGxhY2VtYXJrZXIgYWN0aW9uIG11c3QgYmUgY2FsbGVkIEFGVEVSIGFsbCBjYWxscyB0byB0aGUgcmVxdWlyZSBhY3Rpb24uICAgUGxlYXNlIGtlZXAgaW4gbWluZCB0aGF0IENNU01TIGRpdmlkZXMgcGFnZSB0ZW1wbGF0ZXMgaW50byB0aHJlZSBwb3J0aW9ucyBhbmQgcHJvY2Vzc2VzIHRoZW0gaW4gdGhpcyBvcmRlcjogIFRoZSB0b3AgcG9ydGlvbiBvZiB0aGUgcGFnZSBiZWZvcmUgdGhlICZsdDtodG1sJmd0OyB0YWcuICBUaGUgYm9keSBzZWN0aW9uLCBhbmQgdGhlIGhlYWQgc2VjdGlvbi48L3A+CjxoMz5TdXBwb3J0PC9oMz4KPHA+VGhpcyBtb2R1bGUgZG9lcyBub3QgaW5jbHVkZSBjb21tZXJjaWFsIHN1cHBvcnQuIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIG51bWJlciBvZiByZXNvdXJjZXMgYXZhaWxhYmxlIHRvIGhlbHAgeW91IHdpdGggaXQ6PC9wPgo8dWw+CjxsaT5Gb3IgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlLCBGQVFzLCBvciB0byBmaWxlIGEgQnVnIFJlcG9ydCBvciBidXkgY29tbWVyY2lhbCBzdXBwb3J0LCBwbGVhc2UgdmlzaXQgY2FsZ3V5XCdzCm1vZHVsZSBob21lcGFnZSBhdCA8YSBocmVmPSJodHRwOi8vY2FsZ3V5MTAwMC5jb20iPmNhbGd1eTEwMDAuY29tPC9hPi48L2xpPgo8bGk+QWRkaXRpb25hbCBkaXNjdXNzaW9uIG9mIHRoaXMgbW9kdWxlIG1heSBhbHNvIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJodHRwOi8vZm9ydW0uY21zbWFkZXNpbXBsZS5vcmciPkNNUyBNYWRlIFNpbXBsZSBGb3J1bXM8L2E+LjwvbGk+CjxsaT5UaGUgYXV0aG9yLCBjYWxndXkxMDAwLCBjYW4gb2Z0ZW4gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9ImlyYzovL2lyYy5mcmVlbm9kZS5uZXQvI2NtcyI+Q01TIElSQyBDaGFubmVsPC9hPi48L2xpPgo8bGk+TGFzdGx5LCB5b3UgbWF5IGhhdmUgc29tZSBzdWNjZXNzIGVtYWlsaW5nIHRoZSBhdXRob3IgZGlyZWN0bHkuPC9saT4gIAo8L3VsPgo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDEyLCBSb2JlcnQgQ2FtcGJlbCA8YSBocmVmPSJtYWlsdG86Y2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZyI+Jmx0O2NhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcmZ3Q7PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPgo8cD5UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQp0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLjwvcD4KPHA+SG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCmFzIGFuIGFkZG9uIG1vZHVsZSB0byBDTVMgTWFkZSBTaW1wbGUuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBzb2Z0d2FyZQppbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCk1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiAKc2VjdGlvbiB0aGF0IHRoZSBzaXRlIHdhcyBidWlsdCB3aXRoIENNUyBNYWRlIHNpbXBsZS48L3A+CjxwPlRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCk9yIHJlYWQgaXQgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5vbmxpbmU8L2E+PC9wPg==]]></data>
	</file>
	<file>
	  <filename>/JQueryTools.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVRvb2xzIChjKSAyMDA2IGJ5IFJvYmVydCBDYW1wYmVsbCAKIyAgICAgICAgIChjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnKQojICBBIHRvb2xib3ggb2YgY29udmVuaWVuY2VzIHRvIHByb3ZpZGUgZHluYW1pYyBqYXZhc2NyaXB0eSBmdW5jdGlvbmFsaXR5CiMgIGZvciBDTVMgbW9kdWxlcyBhbmQgd2Vic2l0ZSBkZXNpZ25lcnMuCiMgCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCiMgYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCiMgaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwojIE1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiAKIyBzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI0VORF9MSUNFTlNFCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KZ2xvYmFsICRDTVNfVkVSU0lPTjsKaWYoICFjbGFzc19leGlzdHMoJ0NHRXh0ZW5zaW9ucycpICkgewogICRjZ2V4dGVuc2lvbnMgPSBjbXNfam9pbl9wYXRoKGNtc21zKCktPmNvbmZpZ1sncm9vdF9wYXRoJ10sJ21vZHVsZXMnLAoJCQkJJ0NHRXh0ZW5zaW9ucycsJ0NHRXh0ZW5zaW9ucy5tb2R1bGUucGhwJyk7CiAgaWYoICFpc19yZWFkYWJsZSggJGNnZXh0ZW5zaW9ucyApICkgewogICAgZWNobyAnPGgxPjxmb250IGNvbG9yPSJyZWQiPkVSUk9SOiBUaGUgQ0dFeHRlbnNpb25zIG1vZHVsZSBjb3VsZCBub3QgYmUgZm91bmQuPC9mb250PjwvaDE+JzsKICAgIHJldHVybjsKICB9CiAgcmVxdWlyZV9vbmNlKCRjZ2V4dGVuc2lvbnMpOwp9Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKY2xhc3MgSlF1ZXJ5VG9vbHMgZXh0ZW5kcyBDR0V4dGVuc2lvbnMKewogIHByaXZhdGUgJF9yZXF1aXJlZF9saWJzOwoKICBmdW5jdGlvbiBHZXROYW1lKCkgeyByZXR1cm4gJ0pRdWVyeVRvb2xzJzsgfQogIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpIHsgcmV0dXJuICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKTsgfQogIGZ1bmN0aW9uIEdldFZlcnNpb24oKSB7IHJldHVybiAnMS4yLjQnOyB9CiAgZnVuY3Rpb24gR2V0SGVscCgpIHsgcmV0dXJuIGZpbGVfZ2V0X2NvbnRlbnRzKGRpcm5hbWUoX19GSUxFX18pLicvaGVscC5pbmMnKTsgfQogIGZ1bmN0aW9uIEdldEF1dGhvcigpIHsgcmV0dXJuICdjYWxndXkxMDAwJzsgfQogIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkgeyByZXR1cm4gJ2NhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcnOyB9CiAgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkgeyByZXR1cm4gQGZpbGVfZ2V0X2NvbnRlbnRzKGRpcm5hbWUoX19GSUxFX18pLicvY2hhbmdlbG9nLmluYycpOyB9CiAgZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKSB7IHJldHVybiB0cnVlOyB9CiAgZnVuY3Rpb24gSGFzQWRtaW4oKSB7IHJldHVybiBmYWxzZTsgfQogIGZ1bmN0aW9uIEdldEFkbWluU2VjdGlvbigpIHsgcmV0dXJuICdleHRlbnNpb25zJzsgfQogIGZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKSB7IHJldHVybiAkdGhpcy0+TGFuZygnbW9kZGVzY3JpcHRpb24nKTsgfQogIGZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpIHsgcmV0dXJuIGZhbHNlOyB9CiAgZnVuY3Rpb24gR2V0RGVwZW5kZW5jaWVzKCkgeyByZXR1cm4gYXJyYXkoJ0NHRXh0ZW5zaW9ucyc9PicxLjMxJyk7IH0KICBmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpIHsgcmV0dXJuICIxLjExLjEiOyB9CiAgZnVuY3Rpb24gSW5zdGFsbFBvc3RNZXNzYWdlKCkgeyByZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3RpbnN0YWxsJyk7IH0KICBmdW5jdGlvbiBVbmluc3RhbGxQb3N0TWVzc2FnZSgpIHsgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0dW5pbnN0YWxsJyk7IH0KICBmdW5jdGlvbiBVbmluc3RhbGxQcmVNZXNzYWdlKCkgeyByZXR1cm4gJHRoaXMtPkxhbmcoJ3ByZXVuaW5zdGFsbCcpOyB9CgogIGZ1bmN0aW9uIEluaXRpYWxpemVGcm9udGVuZCgpCiAgewogICAgJHRoaXMtPlJlc3RyaWN0VW5rbm93blBhcmFtcygpOwogICAgJHRoaXMtPlJlZ2lzdGVyTW9kdWxlUGx1Z2luKCk7CiAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnZXhjbHVkZScsQ0xFQU5fU1RSSU5HKTsKICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdub19jc3MnLENMRUFOX0lOVCk7CiAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnbm9fY2RuJyxDTEVBTl9JTlQpOwogICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ25vX2pzJyxDTEVBTl9JTlQpOwogICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ25vX2pxdWVyeScsQ0xFQU5fSU5UKTsKICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdub19yZWFkeScsQ0xFQU5fSU5UKTsKICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdsaWInLENMRUFOX1NUUklORyk7CiAgfQoKICBmdW5jdGlvbiBJbml0aWFsaXplQWRtaW4oKQogIHsKICAgICR0aGlzLT5SZWdpc3Rlck1vZHVsZVBsdWdpbigpOwogICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignYWN0aW9uJyxudWxsLCR0aGlzLT5MYW5nKCdwYXJhbV9hY3Rpb24nKSk7CiAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdleGNsdWRlJyxudWxsLCR0aGlzLT5MYW5nKCdwYXJhbV9leGNsdWRlJykpOwogICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignbGliJyxudWxsLCR0aGlzLT5MYW5nKCdwYXJhbV9saWInKSk7CiAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdub19jc3MnLG51bGwsJHRoaXMtPkxhbmcoJ3BhcmFtX25vX2NzcycpKTsKICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ25vX2NkbicsbnVsbCwkdGhpcy0+TGFuZygncGFyYW1fbm9fY2RuJykpOwogICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignbm9fanMnLG51bGwsJHRoaXMtPkxhbmcoJ3BhcmFtX25vX2pzJykpOwogICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignbm9fanF1ZXJ5JyxudWxsLCR0aGlzLT5MYW5nKCdwYXJhbV9ub19qcXVlcnknKSk7CiAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdub19yZWFkeScsbnVsbCwkdGhpcy0+TGFuZygncGFyYW1fbm9fcmVhZHknKSk7CiAgfQoKfSAvLyBjbGFzcwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0EKCgojQgoKCiNDCgojRAoKCiNFCgoKI0YKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeSBUb29sYm94JzsKCgojRwoKCiNICgoKI0kKCgojSgoKCiNLCgoKI0wKCgojTQokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdBIHRvb2xib3ggb2YgSnF1ZXJ5IHV0aWxpdGllcyB0byBhaWRlIGluIGNyZWF0aW5nIGR5bmFtaWMgYW5kIGZhbmN5IENNUyBNYWRlIFNpbXBsZSBtb2R1bGVzIGFuZCB3ZWJzaXRlcyc7CgojTgoKCiNPCgoKI1AKJGxhbmdbJ3BhcmFtX2FjdGlvbiddID0gJ1NwZWNpZnkgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWQuICBQb3NzaWJsZSB2YWx1ZXMgYXJlOjx1bD48bGk+cmVxdWlyZSAtIE1hcmtzIHRoZSBzZWxlY3RlZCBsaWJyYXJpZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHBhZ2UgSFRNTC4gIFNlZSB0aGUgbGlzdCBhYm92ZSBmb3IgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGxpYnJhcmllcy48L2xpPjxsaT5wbGFjZW1hcmtlciAtIEluZGljYXRlcyB0aGUgcGxhY2UgaW4gdGhlIEhUTUwgb3V0cHV0IHdoZXJlIHRoZSBzZWxlY3RlZCBsaWJyYXJpZXMgc2hvdWxkIGJlIGluY2x1ZGVkLjwvbGk+PGxpPmluY2pzIC0gPGVtPihkZXByZWNhdGVkKTwvZW0+IEluY2x1ZGUgcmVxdWlyZWQgamF2YXNjcmlwdCBmaWxlcy48L2xpPjxsaT5yZWFkeSAtIDxlbT4oZGVwcmVjYXRlZCk8L2VtPiBPdXRwdXQgZGVmYXVsdCByZWFkeSBmdW5jdGlvbi48L2xpPjwvdWw+JzsKJGxhbmdbJ3BhcmFtX2V4Y2x1ZGUnXSA9ICdBcHBsaWNhYmxlIG9ubHkgdG8gdGhlIHBsYWNlbWFya2VyIGFuZCBpbmNqcyBhY3Rpb25zLCB0aGlzIHBhcmFtZXRlciBhbGxvd3MgZXhjbHVkaW5nIGNlcnRhaW4ganF1ZXJ5IHBsdWdpbnMgZnJvbSB0aGUgb3V0cHV0IGdlbmVyYXRlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6IHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1fbGliJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSByZXF1aXJlIGFjdGlvbiwgdGhpcyBwYXJhbWV0ZXIgYWxsb3dzIHNwZWNpZnlpbmcgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBqcXVlcnkgbGlicmFyaWVzIHRvIGluc3RhbGwuJzsKJGxhbmdbJ3BhcmFtX25vX2NzcyddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgcGxhY2VtYXJrZXIgYW5kIGluY2pzIGFjdGlvbnMsIHRoaXMgd2lsbCBleGNsdWRlIGNzcyB0YWdzIGZyb20gYmVpbmcgb3V0cHV0JzsKJGxhbmdbJ3BhcmFtX25vX2NkbiddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgcGxhY2VtYXJrZXIgYW5kIGluY2pzIGFjdGlvbnMsIHRoaXMgd2lsbCBwcmV2ZW50IEpRdWVyeVRvb2xzIGZyb20gdXNpbmcgYSBDRE4gVVJMIGZvciB0aGUgamF2YXNjcmlwdCBsaWJyYXJpZXMsIGlmIG9uZSBpcyBhdmFpbGFibGUgKG5vdCBhbGwgbGlicmFyaWVzIGFyZSBhdmFpbGFibGUgYnkgYSBDRE4nOwokbGFuZ1sncGFyYW1fbm9fanMnXSA9ICdBcHBsaWNhYmxlIG9ubHkgdG8gdGhlIHBsYWNlbWFya2VyIGFuZCBpbmNqcyBhY3Rpb25zLCB0aGlzIHdpbGwgZXhjbHVkZSBzY3JpcHQgdGFncyBmcm9tIGJlaW5nIG91dHB1dCc7CiRsYW5nWydwYXJhbV9ub19qcXVlcnknXSA9ICdBcHBsaWNhYmxlIG9ubHkgdG8gdGhlIHBsYWNlbWFya2VyIGFuZCBpbmNqcyBhY3Rpb25zLCB0aGlzIHdpbGwgZXhjbHVkZSBqcXVlcnkgZnJvbSBiZWluZyBpbmNsdWRlZCc7CiRsYW5nWydwYXJhbV9ub19yZWFkeSddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgcGxhY2VtYXJrZXIgYWN0aW9ucywgdGhpcyB3aWxsIGV4Y2x1ZGUgYW55IHJlYWR5IGZ1bmN0aW9ucyBmcm9tIGJlaW5nIG91dHB1dC4nOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdUaGUgSlF1ZXJ5VG9vbHMgbW9kdWxlIGhhcyBiZWVuIGluc3RhbGxlZC4uLi4gZ2V0IGNyYWNraW4nOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ1RoZSBKUXVlcnlUb29scyBtb2R1bGUgaGFzIGJlZW4gdW5pbnN0YWxsZWQnOwokbGFuZ1sncHJldW5pbnN0YWxsJ10gPSAnUmVtb3ZpbmcgdGhpcyBtb2R1bGUgY291bGQgZGFtYWdlIHRoZSBhcHBlYXJhbmNlIGFuZCBmdW5jdGlvbmFsaXR5IG9mIHlvdXIgd2Vic2l0ZS4gIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb250aW51ZT8nOwoKI1EKCgojUgoKCiNTCgoKI1QKCgojVQoKCiNWCgoKI1cKCgojWAoKCiNZCgoKI1oKCgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/de_DE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeS1Ub29sYm94JzsKJGxhbmdbJ3BhcmFtX2V4Y2x1ZGUnXSA9ICdLYW5uIG51ciBtaXQgZGVyIEFrdGlvbiAmcXVvdDtpbmNqcyZxdW90OyB2ZXJ3ZW5kZXQgd2VyZGVuLiBEYW1pdCBrJm91bWw7bm5lbiBiZXN0aW1tdGUgalF1ZXJ5LVBsdWdpbnMgdm9uIGRlciBBdXNnYWJlIGF1c2dlc2NobG9zc2VuIHdlcmRlbi4gTSZvdW1sO2dsaWNoZSBXZXJ0ZSBzaW5kOiB0YWJsZXNvcnRlciwgY2x1ZXRpcCwgZm9ybS4nOwokbGFuZ1sncGFyYW1faW5jbHVkZSddID0gJ0thbm4gbnVyIG1pdCBkZXIgQWt0aW9uICZxdW90O2luY2pzJnF1b3Q7IHZlcndlbmRldCB3ZXJkZW4uIERhbWl0IGsmb3VtbDtubmVuIGJlc3RpbW10ZSBqUXVlcnktUGx1Z2lucyBlaW5nZXNjaGxvc3NlbiB3ZXJkZW4sIHcmYXVtbDtocmVuZGRlc3NlbiBhbGxlIGFuZGVyZW4gYXVzZ2VzY2hsb3NzZW4gc2luZC4gV2lyZCBkaWVzZXIgUGFyYW1ldGVyIGFuZ2VnZWJlbiwgd2lyZCBkZXIgZXhjbHVkZS1QYXJhbWV0ZXIgaWdub3JpZXJ0LiBNJm91bWw7Z2xpY2hlIFdlcnRlIHNpbmQ6IHRhYmxlc29ydGVyLCBjbHVldGlwLCBmb3JtLic7CiRsYW5nWydwYXJhbV9ub19jc3MnXSA9ICdLYW5uIG51ciBtaXQgZGVyIEFrdGlvbiAmcXVvdDtpbmNqcyZxdW90OyB2ZXJ3ZW5kZXQgd2VyZGVuLiBEYW1pdCB3ZXJkZW4gZGllIENTUy1UYWdzIHZvbiBkZXIgQXVzZ2FiZSBhdXNnZXNjaGxvc3Nlbi4nOwokbGFuZ1sncGFyYW1fbm9fanMnXSA9ICdLYW5uIG51ciBtaXQgZGVyIEFrdGlvbiAmcXVvdDtpbmNqcyZxdW90OyB2ZXJ3ZW5kZXQgd2VyZGVuLiBEYW1pdCB3ZXJkZW4gZGllIHNjcmlwdC1UYWdzIHZvbiBkZXIgQXVzZ2FiZSBhdXNnZXNjaGxvc3Nlbi4nOwokbGFuZ1sncGFyYW1fbm9fcXVlcnknXSA9ICdLYW5uIG51ciBtaXQgZGVyIEFrdGlvbiAmcXVvdDtpbmNqcyZxdW90OyB2ZXJ3ZW5kZXQgd2VyZGVuLiBEYW1pdCB3aXJkIGpRdWVyeSB2b20gTGFkZW4gYXVzZ2VzY2hsb3NzZW4uJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnRGllIGpRdWVyeS1Ub29scyB3dXJkZW4gaW5zdGFsbGllcnQgLi4uIGxvcyBnZWh0JiMwMzk7cyEnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ0RpZSBqUXVlcnktVG9vbHMgd3VyZGVuIGRlaW5zdGFsbGllcnQuJzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ0RpZSBFbnRmZXJudW5nIGRpZXNlcyBNb2R1bHMga2FubiBkYXMgRXJzY2hlaW51bmdzYmlsZCB1bmQgZGllIEZ1bmt0aW9uYWxpdCZhdW1sO3QgSWhyZXIgV2Vic2VpdGUgZXJoZWJsaWNoIGJlZWludHImYXVtbDtjaHRpZ2VuLiBXb2xsZW4gU2llIGRhcyB3aXJrbGljaD8nOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/fa_FA.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeSDYrNi52KjZhyDYp9io2LLYp9ixJzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnQSB0b29sYm94IG9mIEpxdWVyeSB1dGlsaXRpZXMgdG8gYWlkZSBpbiBjcmVhdGluZyBkeW5hbWljIGFuZCBmYW5jeSBDTVMgTWFkZSBTaW1wbGUgbW9kdWxlcyBhbmQgd2Vic2l0ZXMnOwokbGFuZ1sncGFyYW1fYWN0aW9uJ10gPSAnU3BlY2lmeSB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6PHVsPjxsaT5pbmNqcyAtIEluY2x1ZGUgcmVxdWlyZWQgamF2YXNjcmlwdCBmaWxlcy48L2xpPjxsaT5yZWFkeSAtIE91dHB1dCBkZWZhdWx0IHJlYWR5IGZ1bmN0aW9uLjwvbGk+PC91bD4nOwokbGFuZ1sncGFyYW1fZXhjbHVkZSddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgaW5janMgYWN0aW9uLCB0aGlzIHBhcmFtZXRlciBhbGxvd3MgZXhjbHVkaW5nIGNlcnRhaW4ganF1ZXJ5IHBsdWdpbnMgZnJvbSB0aGUgb3V0cHV0IGdlbmVyYXRlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6IHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1faW5jbHVkZSddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgaW5janMgYWN0aW9uLCB0aGlzIHBhcmFtZXRlciBhbGxvd3MgZXhwbGljaXRseSBpbmNsdWRpbmcgY2VydGFpbiBqcXVlcnkgcGx1Z2lucyB3aGlsc3QgZXhjbHVkaW5nIGFsbCBvdGhlcnMuICBJZiB0aGlzIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIHRoZSBleGNsdWRlIHBhcmFtZXRlciB3aWxsIGJlIGlnbm9yZWQuICBQb3NzaWJsZSB2YWx1ZXMgYXJlIHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1fbm9fY3NzJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgd2lsbCBleGNsdWRlIGNzcyB0YWdzIGZyb20gYmVpbmcgb3V0cHV0JzsKJGxhbmdbJ3BhcmFtX25vX2pzJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgd2lsbCBleGNsdWRlIHNjcmlwdCB0YWdzIGZyb20gYmVpbmcgb3V0cHV0JzsKJGxhbmdbJ3BhcmFtX25vX3F1ZXJ5J10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgd2lsbCBleGNsdWRlIGpxdWVyeSBmcm9tIGJlaW5nIGluY2x1ZGVkJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnVGhlIEpRdWVyeVRvb2xzIG1vZHVsZSBoYXMgYmVlbiBpbnN0YWxsZWQuLi4uIGdldCBjcmFja2luJzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdUaGUgSlF1ZXJ5VG9vbHMgbW9kdWxlIGhhcyBiZWVuIHVuaW5zdGFsbGVkJzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ1JlbW92aW5nIHRoaXMgbW9kdWxlIGNvdWxkIGRhbWFnZSB0aGUgYXBwZWFyYW5jZSBhbmQgZnVuY3Rpb25hbGl0eSBvZiB5b3VyIHdlYnNpdGUuICBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/JzsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/ext/fr_FR.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0JvJmljaXJjO3RlICZhZ3JhdmU7IG91dGlscyBKUXVlcnknOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdVbmUgYm8maWNpcmM7dGUgJmFncmF2ZTsgb3V0aWxzIGRlcyB1dGlsaXRhaXJlcyBKcXVlcnkgcG91ciBhaWRlciAmYWdyYXZlOyBsYSBjciZlYWN1dGU7YXRpb24gZGUgbW9kdWxlcyBldCBkZSBzaXRlcyB3ZWIgZHluYW1pcXVlcyBldCBzb3BoaXN0aXF1JmVhY3V0ZTtzIENNUyBNYWRlIFNpbXBsZSc7CiRsYW5nWydwYXJhbV9hY3Rpb24nXSA9ICdTcCZlYWN1dGU7Y2lmaWVyIGwmIzAzOTthY3Rpb24gJmFncmF2ZTsgcyZlYWN1dGU7bGVjdGlvbm5lci4gIExlcyB2YWxldXJzIHBvc3NpYmxlcyBzb250IDo8dWw+PGxpPmluY2pzIC0gSW5jbHV0IGxlcyBmaWNoaWVycyBqYXZhc2NyaXB0IHJlcXVpcy48L2xpPjxsaT5yZWFkeSAtIGZvbmN0aW9uIEpRdWVyeSAmIzAzOTtyZWFkeSYjMDM5OyBwYXIgZCZlYWN1dGU7ZmF1dC48L2xpPjwvdWw+JzsKJGxhbmdbJ3BhcmFtX2V4Y2x1ZGUnXSA9ICdWYWxhYmxlIHNldWxlbWVudCBwb3VyIGwmIzAzOTthY3Rpb24gaW5janMsIGNlIHBhcmFtJmVncmF2ZTt0cmUgcGVybWV0IGwmIzAzOTtleGNsdXNpb24gZGUgY2VydGFpbnMgcGx1Z2ljaWVscyBqcXVlcnkgZHUgY29udGVudSBnJmVhY3V0ZTtuJmVhY3V0ZTtyJmVhY3V0ZTsuICBMZXMgdmFsZXVycyBwb3NzaWJsZXMgc29udCA6IHRhYmxlc29ydGVyLCBjbHVldGlwLCBmb3JtLic7CiRsYW5nWydwYXJhbV9pbmNsdWRlJ10gPSAnVmFsYWJsZSBzZXVsZW1lbnQgcG91ciBsJiMwMzk7YWN0aW9uIGluY2pzLCBjZSBwYXJhbSZlZ3JhdmU7dHJlIHBlcm1ldCBsJiMwMzk7aW5jbHVzaW9uIGV4cGxpY2l0ZSBkZSBjZXJ0YWlucyBwbHVnaWNpZWxzIGpxdWVyeSB0b3V0IGVuIGV4Y2x1YW50IHRvdXMgbGVzIGF1dHJlcy4gU2kgY2UgcGFyYW0mZWdyYXZlO3RyZSBlc3QgciZlYWN1dGU7ZiZlYWN1dGU7cmVuYyZlYWN1dGU7LCBsZSBwYXJhbSZlZ3JhdmU7dHJlIGQmIzAzOTtleGNsdXNpb24gc2VyYSBpZ25vciZlYWN1dGU7LiAgTGVzIHZhbGV1cnMgcG9zc2libGVzIHNvbnQgdGFibGVzb3J0ZXIsIGNsdWV0aXAsIGZvcm0uJzsKJGxhbmdbJ3BhcmFtX25vX2NzcyddID0gJ1ZhbGFibGUgc2V1bGVtZW50IHBvdXIgbCYjMDM5O2FjdGlvbiBpbmNqcywgY2VjaSBlbXAmZWNpcmM7Y2hlIGxlcyBiYWxpc2VzIGNzcyBkJiMwMzk7JmVjaXJjO3RyZSBnJmVhY3V0ZTtuJmVhY3V0ZTtyJmVhY3V0ZTtlcyc7CiRsYW5nWydwYXJhbV9ub19qcyddID0gJ1ZhbGFibGUgc2V1bGVtZW50IHBvdXIgbCYjMDM5O2FjdGlvbiBpbmNqcywgY2VjaSBlbXAmZWNpcmM7Y2hlIGxlcyBiYWxpc2VzIHNjcmlwdHMgZCYjMDM5OyZlY2lyYzt0cmUgZyZlYWN1dGU7biZlYWN1dGU7ciZlYWN1dGU7ZXMnOwokbGFuZ1sncGFyYW1fbm9fcXVlcnknXSA9ICdWYWxhYmxlIHNldWxlbWVudCBwb3VyIGwmIzAzOTthY3Rpb24gaW5janMsIGNlY2kgZW1wJmVjaXJjO2NoZSBKcXVlcnkgZCYjMDM5OyZlY2lyYzt0cmUgaW5jbHV0JzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnTGUgbW9kdWxlIEpRdWVyeVRvb2xzIGEgJmVhY3V0ZTt0JmVhY3V0ZTsgaW5zdGFsbCZlYWN1dGU7Li4uLiBwYXNzZXogJmFncmF2ZTsgbCYjMDM5O2FjdGlvbic7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnTGUgbW9kdWxlIEpRdWVyeVRvb2xzIGEgJmVhY3V0ZTt0JmVhY3V0ZTsgZCZlYWN1dGU7c2ludGFsbCZlYWN1dGU7JzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ1N1cHByaW1lciBjZSBtb2R1bGUgcG91cnJhaXQgZW5kb21tYWdlciBsJiMwMzk7YXBwYXJlbmNlIGV0IGxhIGZvbmN0aW9ubmFsaXQmZWFjdXRlOyBkZSB2b3RyZSBzaXRlIHdlYi4gICZFY2lyYzt0ZXMtdm91cyBjZXJ0YWluZSBkZSB2b3Vsb2lyIHBvdXJzdWl2cmU/JzsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/ext/hu_HU.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeSBFc3prJm91bWw7enQmYWFjdXRlO3InOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdKcXVlcnkgZXN6ayZvdW1sO3omb3VtbDtrIHQmYWFjdXRlO3JoJmFhY3V0ZTt6YSwgYW1pIHNlZyZpYWN1dGU7dCB2b256Jm9hY3V0ZTsgJmVhY3V0ZTtzIGRpbmFtaWt1cyBDTVMgTWFkZSBTaW1wbGUgbW9kdWxvayAmZWFjdXRlO3Mgc2l0ZS1vayBrJmVhY3V0ZTtzeiZpYWN1dGU7dCZlYWN1dGU7cyZlYWN1dGU7YmVuLic7CiRsYW5nWydwYXJhbV9hY3Rpb24nXSA9ICdBZGQgbWVnIGEgbWVnaCZpYWN1dGU7dmFuZCZvYWN1dGU7IGFrY2kmb2FjdXRlO3QuIExlaGV0cyZlYWN1dGU7Z2VzICZlYWN1dGU7cnQmZWFjdXRlO2tlazo8dWw+PGxpPmluY2pzIC0gU3omdXVtbDtrcyZlYWN1dGU7Z2VzIGphdmFzY3JpcHQgZiZhYWN1dGU7amxvayBpbmNsdWRlLW9sJmFhY3V0ZTtzYS48L2xpPjxsaT5yZWFkeSAtIEFsYXAmZWFjdXRlO3J0ZWxtZXpldHQgcmVhZHkgZiZ1dW1sO2dndiZlYWN1dGU7bnkgdiZlYWN1dGU7Z3JlaGFqdCZhYWN1dGU7c2EuPC9saT48L3VsPic7CiRsYW5nWydwYXJhbV9leGNsdWRlJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBleGNsdWRpbmcgY2VydGFpbiBqcXVlcnkgcGx1Z2lucyBmcm9tIHRoZSBvdXRwdXQgZ2VuZXJhdGVkLiAgUG9zc2libGUgdmFsdWVzIGFyZTogdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwYXJhbV9pbmNsdWRlJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBleHBsaWNpdGx5IGluY2x1ZGluZyBjZXJ0YWluIGpxdWVyeSBwbHVnaW5zIHdoaWxzdCBleGNsdWRpbmcgYWxsIG90aGVycy4gIElmIHRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgdGhlIGV4Y2x1ZGUgcGFyYW1ldGVyIHdpbGwgYmUgaWdub3JlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmUgdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0EgSlF1ZXJ5VG9vbHMgbW9kdWx0IHNpa2VyZXNlbiB0ZWxlcCZpYWN1dGU7dGV0dCZ1dW1sO2suLi4ga2V6ZMWRZGhldCBhIGNyYWNrLWVsJmVhY3V0ZTtzISc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnQSBKUXVlcnlUb29scyBtb2R1bHQgc2lrZXJlc2VuIGVsdCZhYWN1dGU7dm9sJmlhY3V0ZTt0b3R0dWsnOwokbGFuZ1sncHJldW5pbnN0YWxsJ10gPSAnRW5uZWsgYSBtb2R1bG5hayBheiBlbHQmYWFjdXRlO3ZvbCZpYWN1dGU7dCZhYWN1dGU7c2EgdCZvdW1sO25rcmV0ZWhldGkgYSBzaXRlIG1lZ2plbGVuJmVhY3V0ZTtzJmVhY3V0ZTt0IC8gZnVua2Npb25hbGl0JmFhY3V0ZTtzJmFhY3V0ZTt0LiBCaXp0b3MgZm9seXRhdG9kPyc7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/it_IT.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2NoYW5nZWxvZyddID0gJyc7CiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICdKUXVlcnkgVG9vbGJveCc7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ1VuIGtpdCBkaSB1dGlsaXQmYWdyYXZlOyBKcXVlcnkgcGVyIGFpdXRhcmUgbmVsbGEgY3JlYXppb25lIGRpIHNpdGkgZSBtb2R1bGkgQ01TIE1hZGUgU2ltcGxlIGRpbmFtaWNpIGUgYWNjYXR0aXZhbnRpJzsKJGxhbmdbJ3BhcmFtX2FjdGlvbiddID0gJ1NwZWZpZmljYXRlIGwmIzAzOTthemlvbmUgZGEgcmljaGlhbWFyZS4gVmFsb3JpIHBvc3NpYmlsaSBzb25vOjx1bD48bGk+aW5janMgLSBJbmNsdWRlIGkgZmlsZSBqYXZhc2NyaXB0IG5lY2Vzc2FyaS48L2xpPjxsaT5yZWFkeSAtIEluc2VyaXNjZSBsYSBmdW56aW9uZSByZWFkeSBwcmVkZWZpbml0YS48L2xpPjwvdWw+JzsKJGxhbmdbJ3BhcmFtX2V4Y2x1ZGUnXSA9ICdBcHBsaWNhYmlsZSBzb2xvIGFsbCYjMDM5O2F6aW9uZSBpbmNqcywgcXVlc3RvIHBhcmFtZXRybyBwZXJtZXR0ZSBsJiMwMzk7ZXNlY3V6aW9uZSBkaSBhbGN1bmkgcGx1Z2luIGRhbGwmIzAzOTtvdXRwdXQgZ2VuZXJhdG8uIFZhbG9yaSBwb3NzaWJpbGkgc29ubzogdGFibGVzb3J0ZXIsIGNsdWV0aXAsIGZvcm0uJzsKJGxhbmdbJ3BhcmFtX2luY2x1ZGUnXSA9ICdBcHBsaWNhYmlsZSBzb2xvIGFsbCYjMDM5O2F6aW9uZSBpbmNqcywgcXVlc3RvIHBhcmFtZXRybyBwZXJtZXR0ZSBsJiMwMzk7aW5jbHVzaW9uZSBlc3BsaWNpdGEgZGkgYWxjdW5pIHBsdWdpbiBqcXVlcnksIGVzY2x1ZGVuZG8gdHV0dGkgZ2xpIGFsdHJpLCBTZSBxdWVzdG8gcGFyYW1ldHJvIHZpZW5lIHNwZWNpZmljYXRvLHZlcnImYWdyYXZlOyBpZ25vcmF0byBpbCBwYXJhbWV0cm8gZXhjbHVkZS4gVmFsb3JpIHBvc3NpYmlsaSBzb25vOiB0YWJsZXNvcnRlciwgY2x1ZXRpcCwgZm9ybS4nOwokbGFuZ1sncGFyYW1fbm9fY3NzJ10gPSAnQXBwbGljYWJpbGUgc29sbyBhbGwmIzAzOTthemlvbmUgaW5janMsIGVzY2x1ZGVyJmFncmF2ZTsgaSB0YWcgY3NzIGRhbGwmIzAzOTtvdXRwdXQnOwokbGFuZ1sncGFyYW1fbm9fanMnXSA9ICdBcHBsaWNhYmlsZSBzb2xvIGFsbCYjMDM5O2F6aW9uZSBpbmNqcywgZXNjbHVkZXImYWdyYXZlOyBpIHRhZyBzY3JpcHQgZGFsbCYjMDM5O291dHB1dCc7CiRsYW5nWydwYXJhbV9ub19xdWVyeSddID0gJ0FwcGxpY2FiaWxlIHNvbG8gYWxsJiMwMzk7YXppb25lIGluY2pzLCBlc2NsdWRlciZhZ3JhdmU7IGwmIzAzOTtpbmNsdXNpb25lIGRpIGpxdWVyeSc7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0lsIG1vZHVsbyBKUXVlcnlUb29scyAmZWdyYXZlOyBzdGF0byBpbnN0YWxsYXRvJzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdJbCBtb2R1bG8gSlF1ZXJ5VG9vbHMgJmVncmF2ZTsgc3RhdG8gZGlzaW5zdGFsbGF0byc7CiRsYW5nWydwcmV1bmluc3RhbGwnXSA9ICdSaW11b3ZlcmUgcXVlc3RvIG1vZHVsbyBwb3RyZWJiZSBkYW5uZWdnaWFyZSBsJiMwMzk7YXNwZXR0byBlIGxlIGZ1bnppb25hbGl0JmFncmF2ZTsgZGVsIHZvc3RybyBzaXRvLiBTaWV0ZSBjZXJ0aSBkaSB2b2xlcmUgY29udGludWFyZT8nOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nb_NO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeSBUb29sYm94ICc7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ0VuIHZlcmt0Jm9zbGFzaDt5a2Fzc2UgbWVkIEpxdWVyeSB2ZXJrdCZvc2xhc2g7eSBzb20gYmlzdCZhcmluZztyIGkgb3BwcmV0dGVsc2UgYXYgZHluYW1pc2tlIG9nIGZhbmN5IENNUyBNYWRlIFNpbXBsZSBtb2R1bGVyIGdvIG5ldHRzdGVkZXInOwokbGFuZ1sncGFyYW1fYWN0aW9uJ10gPSAnU3Blc2lmaXNlciBoYW5kbGluZ2VuIHNvbSBza2FsIGthbGxlcy4gTXVsaWdlIHZlcmRpZXIgZXI6PHVsPjxsaT5pbmNqcyAtIEluY2x1ZGUgcmVxdWlyZWQgamF2YXNjcmlwdCBmaWxlcy48L2xpPjxsaT5yZWFkeSAtIE91dHB1dCBkZWZhdWx0IHJlYWR5IGZ1bmN0aW9uLjwvbGk+PC91bD4nOwokbGFuZ1sncGFyYW1fZXhjbHVkZSddID0gJ0t1biBneWxkaWcgdGlsIGluY2pzIGhhbmRsaW5nZW4uIERlbm5lIHBhcmFtZXRlcmVuIHRpbGxhdGVyICZhcmluZzsgdXRlbHVra2UgYmVzdGVtdGUganF1ZXJ5IHByb2dyYW10aWxsZWdnIGZyYSB2aXNuaW5nZW4gc29tIGdlbmVyZXJlcy4gTXVsaWdlIHZlcmRpZXIgZXI6IHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1faW5jbHVkZSddID0gJ0t1biBneWxkaWcgdGlsIGluY2pzIGhhbmRsaW5nZW4uIERlbm5lIHBhcmFtZXRlcmVuIHRpbGFsdGVyICZhcmluZzsgZWtzcGxpc2l0dCBpbmtsdWRlcmUgYmVzdGVtdGUganF1ZXJ5IHByb2dyYW10aWxsZWdnIG9nIHV0ZWx1a2tlIGFsbGUgYW5kcmUuIE9tIGRlbm5lIHBhcmFtZXRlcmVuIGVyIHNwZXNpZmlzZXJ0LCB2aWwgZWtzbHVkZXIgcGFyYW1ldGVyZW4gYmxpIGlnbm9yZXJ0LiAgTXVsaWdlIHZlcmRpZXIgZXIgdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwYXJhbV9ub19jc3MnXSA9ICdHamVsZGVyIGt1biB0aWwgaW5janMgaGFuZGxpbmdlbiwgZGV0dGUgdmlsIGVrc2tsdWRlcmUgY3NzIGtvZGVyIGZyYSAmYXJpbmc7IGJsaSBzZW5kdCB1dCc7CiRsYW5nWydwYXJhbV9ub19qcyddID0gJ0dqZWxkZXIga3VuIHRpbCBpbmNqcyBoYW5kbGluZ2VuLCBkZXR0ZSB2aWwgZWtza2x1ZGVyZSBzY3JpcHQta29kZXIgZnJhICZhcmluZzsgYmxpIHNlbmR0IHV0JzsKJGxhbmdbJ3BhcmFtX25vX3F1ZXJ5J10gPSAnR2plbGRlciBrdW4gdGlsIGluY2pzIGhhbmRsaW5nZW4sIGRldHRlIHZpbCBla3NrbHVkZXJlIGpxdWVyeSBmcmEgJmFyaW5nOyBibGkgaW5rbHVkZXJ0JzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnSlF1ZXJ5VG9vbHMgbW9kdWxlbiBhaHIgYmxpdHQgaW5zdGFsbGVydC4uLi4gcHImb3NsYXNoO3YgZGVuJzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdKUXVlcnlUb29scyBtb2R1bGVuIGhhciBibGl0dCBhdmluc3RhbGxlcnQnOwokbGFuZ1sncHJldW5pbnN0YWxsJ10gPSAnJkFyaW5nOyBmamVybmUgZGVubmUgbW9kdWxlbiBrYW4gc2thZGUgb3BwZiZvc2xhc2g7cnNlbGVuIG9nIGZ1bmtzam9uYWxpdGV0ZW4gcCZhcmluZzsgZGl0dCBuZXR0c3RlZC4gRXIgZHUgc2lra2VyIHAmYXJpbmc7IGF0IGR1IHZpbCBmb3J0c2V0dGUgYXZpbnN0YWxsYXNqb25lbj8nOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nl_NL.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeSBUb29sYm94ICc7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ0VlbiB2ZXJ6YW1lbGluZyB2YW4gSnF1ZXJ5IHRvb2xzLCBhbHMgaHVscCBiaWogaGV0IGNyZSZldW1sO3JlbiB2YW4gZHluYW1pc2NoZSBlbiBkZWNvcmF0aWV2ZSBDTVMgTWFkZSBTaW1wbGUgbW9kdWxlcyBlbiB3ZWJzaXRlcyc7CiRsYW5nWydwYXJhbV9hY3Rpb24nXSA9ICdHZWVmIGRlIGJld2Vya2luZyBvcCBkaWUgbW9ldCB3b3JkZW4gYWFuZ2Vyb2VwZW4uICBNb2dlbGlqa2Ugd2FhcmRlbiB6aWpuOjx1bD48bGk+aW5janMgLSBWb2VnIGRlIGJlbm9kaWdkZSBqYXZhc2NyaXB0IGJlc3RhbmRlbiB0b2UuPC9saT48bGk+cmVhZHkgLSBVaXRnYW5nIHN0YW5kYWFyZCBnZXJlZWQgZnVuY3RpZS48L2xpPjwvdWw+JzsKJGxhbmdbJ3BhcmFtX2V4Y2x1ZGUnXSA9ICdVaXRzbHVpdGVuZCB2YW4gdG9lcGFzc2luZyBvcCBkZSBpbmNqcyBiZXdlcmtpbmcsIERlemUgcGFyYW1ldGVyIG1hYWt0IGhldCBtb2dlbGlqayBtZXQgdWl0em9uZGVyaW5nIHZhbiBiZXBhYWxkZSBqcXVlcnkgcGx1Z2lucyB1aXQgdGUgc2x1aXRlbi4gTW9nZWxpamtlIHdhYXJkZW4gemlqbjogdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwYXJhbV9pbmNsdWRlJ10gPSAnVWl0c2x1aXRlbmQgdmFuIHRvZXBhc3Npbmcgb3AgZGUgaW5janMgYmV3ZXJraW5nLCBEZXplIHBhcmFtZXRlciBtYWFrdCBoZXQgbW9nZWxpamsgbWV0IHVpdHpvbmRlcmluZyB2YW4gYmVwYWFsZGUganF1ZXJ5IHBsdWdpbnMgaW4gdGUgc2x1aXRlbiBlbiBkYWFybWVlIGFsbGUgYW5kZXJlIHBhcmFtZXRlcnMgdWl0IHRlIHNsdWl0ZW4gYWxzIGRlemUgemlqbiBvcGdlZ2V2ZW4uIE1vZ2VsaWprZSB3YWFyZGVuIHppam46IHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1fbm9fY3NzJ10gPSAnQWxsZWVuIHRvZSB0ZSBwYXNzZW4gaW4gZGUgaW5janMgYmV3ZXJraW5nLCBkZXplIHphbCBkZSBjc3MgdGFncyB1aXRzbHVpdGVuJzsKJGxhbmdbJ3BhcmFtX25vX2pzJ10gPSAnQWxsZWVuIHRvZSB0ZSBwYXNzZW4gaW4gZGUgaW5janMgYmV3ZXJraW5nLCBkZXplIHphbCBkZSBzY3JpcHQgdGFncyB1aXRzbHVpdGVuJzsKJGxhbmdbJ3BhcmFtX25vX3F1ZXJ5J10gPSAnQWxsZWVuIHRvZSB0ZSBwYXNzZW4gaW4gZGUgaW5janMgYmV3ZXJraW5nLCBkaXQgemFsIGpxdWVyeSB1aXRzbHVpdGVuIHZhbiBpbnRlZ3JhdGllJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnRGUgSlF1ZXJ5VG9vbHMgbW9kdWxlIGlzIGdlJml1bWw7bnN0YWxsZWVyZCc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnRGUgSlF1ZXJ5VG9vbHMgbW9kdWxlIGlzIGdlZGUmaXVtbDtuc3RhbGxlZXJkJzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ0hldCB2ZXJ3aWpkZXJlbiB2YW4gZGV6ZSBtb2R1bGUga2FuIGRlIHZlcnRvbmluZyBlbiBkZSBmdW5jdGlvbmFsaXRlaXQgdmFuIHV3IHdlYnNpdGUgc2NoYWRlIHRvZSBicmVuZ2VuLiBXaWx0IHUgemVrZXIgZGF0IHUgd2lsdCBkb29yZ2Fhbj8nOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/ro_RO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ1Rvb2xib3ggSlF1ZXJ5JzsKJGxhbmdbJ3BhcmFtX2V4Y2x1ZGUnXSA9ICdBcGxpY2FiaWwgbnVtYWkgYWN0aXVuaWkgaW5janMsIGFjZXN0IHBhcmFtZXRydSBwZXJtaXRlIGV4Y2x1ZGVyZWEgdW5vciBwbHVnaW4tdXJpIGpxdWVyeSBkZSBsYSBvdXRwdXQtdWwgZ2VuZXJhdC4gVmFsb3JpIHBvc2liaWxlIHN1bnQ6IHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1faW5jbHVkZSddID0gJ0FwbGljYWJpbCBudW1haSBhY3RpdW5paSBpbmNqcywgYWNlc3QgcGFyYW1ldHJ1IHBlcm1pdGUgaW5jbHVkZXJlYSBleHBsaWNpdGEgYSB1bm9yIHBsdWdpbi11cmkganF1ZXJ5IGluIHRpbXAgY2UgdG9hdGUgY2VsZWxhbHRlIHN1bnQgZXhjbHVzZS4gRGFjYSBhY2VzdCBwYXJhbWV0cnUgZXN0ZSBzcGVjaWZpY2F0LCBwYXJhbWV0cnVsIGV4Y2x1ZGUgdmEgZmkgaWdub3JhdC4gIFZhbG9yaSBwb3NpYmlsZSBzdW50OiB0YWJsZXNvcnRlcixjbHVldGlwLGZvcm0uJzsKJGxhbmdbJ3BhcmFtX25vX2NzcyddID0gJ1NlIGFwbGljYSBudW1haSBhY3RpdW5paSBpbmNqcywgdmEgZXhjbHVkZSBhZmlzYXJlYSB0YWd1cmlsb3IgY3NzJzsKJGxhbmdbJ3BhcmFtX25vX2pzJ10gPSAnU2UgYXBsaWNhIG51bWFpIGFjdGl1bmlpIGluY2pzLCB2YSBleGNsdWRlIGFmaXNhcmVhIHRhZ3VyaWxvciBzY3JvW3QnOwokbGFuZ1sncGFyYW1fbm9fcXVlcnknXSA9ICdTZSBhcGxpY2EgbnVtYWkgYWN0aXVuaWkgaW5janMsIHZhIGV4Y2x1ZGUgaW5jbHVkZXJlYSBsaWJyYXJpZWkganF1ZXJ5JzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnTW9kdWx1bCBKUXVlcnlUb29scyBhIGZvc3QgaW5zdGFsYXQuLi4uIGxhIHRyZWFiYSEnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ01vZHVsdWwgSlF1ZXJ5VG9vbHMgYSBmb3N0IGRlemluc3RhbGF0JzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ0RhY2EgaW5sYXR1cmF0aSBhY2VzdCBtb2R1bCBwdXRldGkgc3RyaWNhIGZ1bmN0aW9uYWxpdGF0ZSBzYXUgYXNwZWN0IGxlZ2F0ZSBkZSBzaXRlLiBTaWd1ciBkb3JpdGkgc2EgY29udGludWF0aT8nOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/ru_RU.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ9CY0L3RgdGC0YDRg9C80LXQvdGC0LDRgNC40LkgSlF1ZXJ5JzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAn0JjQvdGB0YLRgNGD0LzQtdC90YLQsNGA0LjQuSDRg9GC0LjQu9C40YLRiyBKUXVlcnkg0L/QvtC80L7QttC10YIg0LIg0YHQvtC30LTQsNC90LjQuCDQtNC40L3QsNC80LjRh9C90YvRhSDQuCDQv9GA0LjRh9GD0LTQu9C40LLRi9GFIENNUyBNYWRlIFNpbXBsZSDQvNC+0LTRg9C70LXQuSDQuCDQstC10LEg0YHQsNC50YLQvtCyJzsKJGxhbmdbJ3BhcmFtX2FjdGlvbiddID0gJ9Cj0LrQsNC20LjRgtC1INC00LXQudGB0YLQstC40LUsINC60L7RgtC+0YDQvtC1INCx0YPQtNC10YIg0LLRi9C30LLQsNC90L4uICDQktC+0LfQvNC+0LbQvdGL0LUg0LfQvdCw0YfQtdC90LjRjzo8dWw+PGxpPmluY2pzIC0g0J/QvtC00LrQu9GO0YfQsNC10Lwg0L3QtdC+0LHRhdC+0LTQuNC80YvQtSBqYXZhc2NyaXB0INGE0LDQudC70YsuPC9saT48bGk+cmVhZHkgLSBPdXRwdXQgZGVmYXVsdCByZWFkeSBmdW5jdGlvbi48L2xpPjwvdWw+JzsKJGxhbmdbJ3BhcmFtX2V4Y2x1ZGUnXSA9ICfQn9GA0LjQvNC10L3Rj9C10YLRgdGPINGC0L7Qu9GM0LrQviDQuiDQtNC10LnRgdGC0LLQuNGOIGluY2pzLCDRjdGC0L7RgiDQv9Cw0YDQsNC80LXRgtGAINC/0L7Qt9Cy0L7Qu9GP0LXRgiDQuNGB0LrQu9GO0YfQuNGC0Ywg0L3QtdC60L7RgtC+0YDRi9C1INC/0LvQsNCz0LjQvdGLIGpxdWVyeSDQs9C10L3QtdGA0LjRgNGD0LXQvNGL0LUg0L3QsCDQstGL0YXQvtC00LUuICDQktC+0LfQvNC+0LbQvdGL0LUg0LfQvdCw0YfQtdC90LjRjzogdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwYXJhbV9saWInXSA9ICfQn9GA0LjQvNC10L3Rj9C10YLRgdGPINGC0L7Qu9GM0LrQviDQuiDRgtGA0LXQsdGD0LXQvNC+0LzRgyDQtNC10LnRgdGC0LLQuNGOLCDRjdGC0L7RgiDQv9Cw0YDQsNC80LXRgtGAINC/0L7Qt9Cy0L7Qu9GP0LXRgiDQt9Cw0LTQsNGC0Ywg0YHQv9C40YHQvtC6INGA0LDQt9C00LXQu9C10L3QvdGL0YUg0LfQsNC/0Y/RgtGL0LzQuCBKUXVlcnkg0LHQuNCx0LvQuNC+0YLQtdC6INC00LvRjyDRg9GB0YLQsNC90L7QstC60LguJzsKJGxhbmdbJ3BhcmFtX25vX2NzcyddID0gJ9Cf0YDQuNC80LXQvdGP0LXRgtGB0Y8g0YLQvtC70YzQutC+INC6INC00LXQudGB0YLQstC40Y4gaW5janMsINC40YHQutC70Y7Rh9Cw0LXRgiBjc3Mg0YLQtdCz0Lgg0LjQtyDQstGL0YXQvtC00LAnOwokbGFuZ1sncGFyYW1fbm9fY2RuJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhbmQgaW5janMgYWN0aW9ucywgdGhpcyB3aWxsIHByZXZlbnQgSlF1ZXJ5VG9vbHMgZnJvbSB1c2luZyBhIENETiBVUkwgZm9yIHRoZSBqYXZhc2NyaXB0IGxpYnJhcmllcywgaWYgb25lIGlzIGF2YWlsYWJsZSAobm90IGFsbCBsaWJyYXJpZXMgYXJlIGF2YWlsYWJsZSBieSBhIENETic7CiRsYW5nWydwYXJhbV9ub19qcyddID0gJ9Cf0YDQuNC80LXQvdGP0LXRgtGB0Y8g0YLQvtC70YzQutC+INC6INC00LXQudGB0YLQstC40Y4gaW5janMsINC40YHQutC70Y7Rh9Cw0LXRgiBzY3JpcHQg0YLQtdCz0Lgg0LjQtyDQstGL0YXQvtC00LAnOwokbGFuZ1sncGFyYW1fbm9fanF1ZXJ5J10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhbmQgaW5janMgYWN0aW9ucywgdGhpcyB3aWxsIGV4Y2x1ZGUganF1ZXJ5IGZyb20gYmVpbmcgaW5jbHVkZWQnOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICfQnNC+0LTRg9C70YwgSlF1ZXJ5VG9vbHMg0LHRi9C7INGD0YHRgtCw0L3QvtCy0LvQtdC9JzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICfQnNC+0LTRg9C70YwgSlF1ZXJ5VG9vbHMg0LHRi9C7INGD0LTQsNC70LXQvSc7CiRsYW5nWydwcmV1bmluc3RhbGwnXSA9ICfQo9C00LDQu9C10L3QuNC1INC80L7QtNGD0LvRjyDQvNC+0LbQtdGCINC/0L7QstGA0LXQtNC40YLRjCDQstC90LXRiNC90LjQuSDQstC40LQg0Lgg0YTRg9C90LrRhtC40L7QvdCw0LvRjNC90L7RgdGC0Ywg0LLQsNGI0LXQs9C+INGB0LDQudGC0LAuINCS0Ysg0YPQstC10YDQtdC90YssINGH0YLQviDRhdC+0YLQuNGC0LUg0L/RgNC+0LTQvtC70LbQuNGC0Yw/JzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTM1NzY5NTM1Mi4xLjEudXRtY2NuPShkaXJlY3QpfHV0bWNzcj0oZGlyZWN0KXx1dG1jbWQ9KG5vbmUpJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuMjExMDAxNDgyMC4xMzU3Njk1MzUyLjEzNTc3MzAyMzIuMTM1Nzc1MjQyNC41JzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/sr_YU.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeSBhbGF0aSc7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ1NrdXAgcG9tb8SHbmloIGpRdWVyeSBhbGF0YSBrb2ppIHRyZWJhIGRhIHByaXBvbW9nbnUga3JlaXJhbmplIGRpbmFtacSNbmloIGkgbW9kZXJuaWggQ01TIE1hZGUgU2ltcGxlIG1vZHVsYSBpIHNhanRvdmEnOwokbGFuZ1sncGFyYW1fYWN0aW9uJ10gPSAnU3BlY2lmeSB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6PHVsPjxsaT5pbmNqcyAtIEluY2x1ZGUgcmVxdWlyZWQgamF2YXNjcmlwdCBmaWxlcy48L2xpPjxsaT5yZWFkeSAtIE91dHB1dCBkZWZhdWx0IHJlYWR5IGZ1bmN0aW9uLjwvbGk+PC91bD4nOwokbGFuZ1sncGFyYW1fZXhjbHVkZSddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgaW5janMgYWN0aW9uLCB0aGlzIHBhcmFtZXRlciBhbGxvd3MgZXhjbHVkaW5nIGNlcnRhaW4ganF1ZXJ5IHBsdWdpbnMgZnJvbSB0aGUgb3V0cHV0IGdlbmVyYXRlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6IHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1faW5jbHVkZSddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgaW5janMgYWN0aW9uLCB0aGlzIHBhcmFtZXRlciBhbGxvd3MgZXhwbGljaXRseSBpbmNsdWRpbmcgY2VydGFpbiBqcXVlcnkgcGx1Z2lucyB3aGlsc3QgZXhjbHVkaW5nIGFsbCBvdGhlcnMuICBJZiB0aGlzIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIHRoZSBleGNsdWRlIHBhcmFtZXRlciB3aWxsIGJlIGlnbm9yZWQuICBQb3NzaWJsZSB2YWx1ZXMgYXJlIHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1fbm9fY3NzJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgd2lsbCBleGNsdWRlIGNzcyB0YWdzIGZyb20gYmVpbmcgb3V0cHV0JzsKJGxhbmdbJ3BhcmFtX25vX2pzJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgd2lsbCBleGNsdWRlIHNjcmlwdCB0YWdzIGZyb20gYmVpbmcgb3V0cHV0JzsKJGxhbmdbJ3BhcmFtX25vX3F1ZXJ5J10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgd2lsbCBleGNsdWRlIGpxdWVyeSBmcm9tIGJlaW5nIGluY2x1ZGVkJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnSlF1ZXJ5VG9vbHMgbW9kdWwgamUgaW5zdGFsaXJhbic7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnSlF1ZXJ5VG9vbHMgbW9kdWwgamUgZGVpbnN0YWxpcmFuJzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ0JyaXNhbmplIG92b2cgbW9kdWxhIG1vxb5lIG5hJnNjYXJvbjtrb2RpdGkgaXpnbGVkdSBpIGZ1bmtjaW9uYWxub3N0aSBWYSZzY2Fyb247ZWcgc2FqdGEuIERhIGxpIHN0ZSBzaWd1cm5pIGRhIMW+ZWxpdGUgbmFzdGF2aXRpPyc7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/sv_SE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeS1Ub29sYm94JzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnRW4gdmVya3R5Z3NsJmFyaW5nO2RhIHRpbGwgSnF1ZXJ5IGYmb3VtbDtyIGF0dCBza2FwYSBkeW5hbWlza2Egb2NoIHZhY2tyYSBDTVMgTWFkZSBTaW1wbGUgbW9kdWxlciBvY2ggd2ViYnBsYXRzZXInOwokbGFuZ1sncGFyYW1fYWN0aW9uJ10gPSAnQW5nZSB2aWxrYSAmYXJpbmc7dGcmYXVtbDtyZGVyIHNvbSBza2FsbCBrYWxsYXMuIE0mb3VtbDtqbGlnYSB2JmF1bWw7cmRlbiAmYXVtbDtyOiA8dWw+IDxsaT4gaW5janMgLSBJbmtsdWRlcmluZyBrciZhdW1sO3ZzIGYmb3VtbDtyIGphdmFzY3JpcHQgZmlsZXIuIDwvIExpPiA8bGk+IHJlZG8gLSBSZXN1bHRhdHN0YW5kYXJkcyBmdW5rdGlvbi4gPC8gTGk+IDwvIHVsPic7CiRsYW5nWydwYXJhbV9leGNsdWRlJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBleGNsdWRpbmcgY2VydGFpbiBqcXVlcnkgcGx1Z2lucyBmcm9tIHRoZSBvdXRwdXQgZ2VuZXJhdGVkLiAgUG9zc2libGUgdmFsdWVzIGFyZTogdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwYXJhbV9pbmNsdWRlJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBleHBsaWNpdGx5IGluY2x1ZGluZyBjZXJ0YWluIGpxdWVyeSBwbHVnaW5zIHdoaWxzdCBleGNsdWRpbmcgYWxsIG90aGVycy4gIElmIHRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgdGhlIGV4Y2x1ZGUgcGFyYW1ldGVyIHdpbGwgYmUgaWdub3JlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmUgdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0pRdWVyeVRvb2xzIG1vZHVsZW4gJmF1bWw7ciBudSBpbnN0YWxsZXJhZCEnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ0pRdWVyeVRvb2xzIG1vZHVsZW4gJmF1bWw7ciBudSBhdmluc3RhbGxlcmFkISc7CiRsYW5nWydwcmV1bmluc3RhbGwnXSA9ICdCb3J0dGFnbmluZyBhdiBkZW4gaCZhdW1sO3IgbW9kdWxlbiBrYW4gc2thZGEgdXRzZWVuZGV0IG9jaCBmdW5rdGlvbmFsaXRldGVuIHAmYXJpbmc7IGRpbiB3ZWJicGxhdHMuICZBdW1sO3IgZHUgcyZhdW1sO2tlciBwJmFyaW5nOyBhdHQgZHUgdmlsbCBmb3J0cyZhdW1sO3R0YT8nOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/cgform.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/cgform.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSAnanF1ZXJ5LmNnZm9ybS5qcyc7CiRpbmZvWydkZXBlbmRzJ10gPSAnanF1ZXJ5JzsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/cgform.lib/jquery.cgform.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCQpewogICQuZm4ucGFyc2Vfc2VyaWFsaXplZCA9IGZ1bmN0aW9uKGRhdGEpICB7CiAgICB2YXIgcGFybXM9ZGF0YS5yZXBsYWNlKC9hbXA7L2csJycpOwogICAgaWYoIGRhdGEubWF0Y2goL1w/KC4rKSQvKSApIHsKICAgICAgcGFybXMgPSBSZWdFeHAuJDE7CiAgICB9CiAgICB2YXIgcEFyciA9IHBhcm1zLnNwbGl0KCcmJyk7CiAgICB2YXIgcEhhc2ggPSB7fTsKICAgIGZvciggdmFyIGkgPSAwOyBpIDwgcEFyci5sZW5ndGg7IGkrKyApIHsKICAgICAgdmFyIHRtcCA9IHBBcnJbaV0uc3BsaXQoJz0nKTsKICAgICAgcEhhc2hbdG1wWzBdXSA9IHVuZXNjYXBlKHRtcFsxXSk7CiAgICB9CiAgICByZXR1cm4gcEhhc2g7CiAgfQoKCiAgJC5mbi5mb3JtX3BvcHVsYXRlID0gZnVuY3Rpb24oZGF0YSkgewogICAgdmFyIGNvbnRhaW5lciA9ICQodGhpcyk7CiAgICAkLmVhY2goZGF0YSwgZnVuY3Rpb24obmFtZSx2YWx1ZSkgewogICAgICB2YXIgZXhwciA9ICI6aW5wdXRbbmFtZT0nIituYW1lKyInXTpub3QoOmJ1dHRvbiw6cmVzZXQsOnN1Ym1pdCw6aW1hZ2UpIjsKICAgICAgdmFyIGlucHV0ID0gY29udGFpbmVyLmZpbmQoZXhwcik7CiAgICAgIGlucHV0LnZhbCggKCEkLmlzQXJyYXkodmFsdWUpICYmIChpbnB1dC5pcygnOmNoZWNrYm94OicpIHx8IGlucHV0LmlzKCc6cmFkaW8nKSkpID8gW3ZhbHVlXSA6IHZhbHVlICk7CiAgICB9KTsKICB9OwoKCiAgJC5mbi5mb3JtX3BvcHVsYXRlX3NlcmlhbGl6ZWQgPSBmdW5jdGlvbihkYXRhKSB7CiAgICB2YXIgdG1wID0gJCh0aGlzKS5wYXJzZV9zZXJpYWxpemVkKGRhdGEpOwogICAgJCh0aGlzKS5mb3JtX3BvcHVsYXRlKHRtcCk7CiAgfTsKCgogICQuZm4uc2VyaWFsaXplQW55dGhpbmcgPSBmdW5jdGlvbigpIHsKICAgIHZhciB0b1JldHVybiAgICA9IFtdOwogICAgdmFyIGVscyAgICAgICAgID0gJCh0aGlzKS5maW5kKCc6aW5wdXQnKS5nZXQoKTsKICAgICQuZWFjaChlbHMsIGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5uYW1lICYmICF0aGlzLmRpc2FibGVkICYmICh0aGlzLmNoZWNrZWQgfHwgL3NlbGVjdHx0ZXh0YXJlYS9pLnRlc3QodGhpcy5ub2RlTmFtZSkgfHwgL3RleHR8aGlkZGVufHBhc3N3b3JkL2kudGVzdCh0aGlzLnR5cGUpKSkgewogICAgICAgIHZhciB2YWwgPSAkKHRoaXMpLnZhbCgpOwogICAgICAgIHRvUmV0dXJuLnB1c2goIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpICsgIj0iICsgZW5jb2RlVVJJQ29tcG9uZW50KCB2YWwgKSApOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiB0b1JldHVybi5qb2luKCImIikucmVwbGFjZSgvJTIwL2csICIgIik7CiAgfTsKCgogICQuZm4uZm9ybV9nZXRfZGF0ZXRpbWUgPSBmdW5jdGlvbihwcmVmaXgsZG9fdGltZSkgewogICAgZG9fdGltZSA9IHR5cGVvZihkb190aW1lKSAhPSAndW5kZWZpbmVkJyA/IGRvX3RpbWUgOiAwOwogICAgCiAgICB2YXIga2V5ID0gIjppbnB1dFtuYW1lPSciK3ByZWZpeCsiWWVhciddIjsKICAgIHZhciB5ZWFyID0gdGhpcy5maW5kKGtleSkudmFsKCk7CiAgICB2YXIgbW9udGggPSB0aGlzLmZpbmQoIjppbnB1dFtuYW1lPSciK3ByZWZpeCsiTW9udGgnXSIpLnZhbCgpOwogICAgdmFyIGRheSA9IHRoaXMuZmluZCgiOmlucHV0W25hbWU9JyIrcHJlZml4KyJEYXknXSIpLnZhbCgpOwogICAgdmFyIHN0ciA9IG1vbnRoKycvJytkYXkrJy8nK3llYXI7CiAgICB2YXIgaG91ciA9IDA7CiAgICB2YXIgbWludXRlID0gMDsKICAgCiAgICBpZiggZG9fdGltZSApCiAgICAgIHsKCXZhciBob3VyID0gdGhpcy5maW5kKCI6aW5wdXRbbmFtZT0nIitwcmVmaXgrIkhvdXInXSIpLnZhbCgpOwoJdmFyIG1pbnV0ZSA9IHRoaXMuZmluZCgiOmlucHV0W25hbWU9JyIrcHJlZml4KyJNaW51dGUnXSIpLnZhbCgpOwogICAgICAgIHN0ciArPSAnICcraG91cisnOicrbWludXRlKyc6MDAnOwogICAgICB9CiAgICByZXR1cm4gc3RyOwogIH07CgoKICAkLmZuLmZvcm1fc2V0X2RhdGV0aW1lID0gZnVuY3Rpb24oaW5fZGF0ZSxwcmVmaXgsZG9fdGltZSkgewogICAgZG9fdGltZSA9IHR5cGVvZihkb190aW1lKSAhPSAndW5kZWZpbmVkJyA/IGRvX3RpbWUgOiAwOwogCiAgICB2YXIgemVyb3BhZCA9IGZ1bmN0aW9uKG51bSxsZW4pCiAgICB7CiAgICAgIHZhciByZXMgPSBudW0udG9TdHJpbmcoKTsKICAgICAgd2hpbGUoIHJlcy5sZW5ndGggPCBsZW4gKQoJewoJICByZXMgPSAnMCcrcmVzOwoJfQogICAgICByZXR1cm4gcmVzOwogICAgfQoKICAgIHZhciBkYXRlID0gJyc7CiAgICB2YXIgdG1wID0gcGFyc2VJbnQoaW5fZGF0ZSk7CiAgICBpZiggdG1wID4gMCApCiAgICAgIHsKICAgICAgICBkYXRlID0gbmV3IERhdGUodG1wICogMTAwMCk7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewogICAgICAgIGRhdGUgPSBuZXcgRGF0ZShpbl9kYXRlKTsKICAgICAgfQoKICAgIHRoaXMuZmluZCgiOmlucHV0W25hbWU9JyIrcHJlZml4KyJZZWFyJ10iKS52YWwoZGF0ZS5nZXRGdWxsWWVhcigpKTsKICAgIHRoaXMuZmluZCgiOmlucHV0W25hbWU9JyIrcHJlZml4KyJNb250aCddIikudmFsKHplcm9wYWQoZGF0ZS5nZXRNb250aCgpKzEsMikpOwogICAgdGhpcy5maW5kKCI6aW5wdXRbbmFtZT0nIitwcmVmaXgrIkRheSddIikudmFsKGRhdGUuZ2V0RGF0ZSgpKTsKICAgIGlmKCBkb190aW1lICkKICAgIHsKICAgICAgdGhpcy5maW5kKCI6aW5wdXRbbmFtZT0nIitwcmVmaXgrIkhvdXInXSIpLnZhbChkYXRlLmdldEhvdXJzKCkpOwogICAgICB0aGlzLmZpbmQoIjppbnB1dFtuYW1lPSciK3ByZWZpeCsiTWludXRlJ10iKS52YWwoZGF0ZS5nZXRNaW51dGVzKCkpOwogICAgfQoKICB9Owp9KShqUXVlcnkpCg==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/changelog.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CjEuMi4yIC8gMjAxMS0wOS0wMQo9PT09PT09PT09PT09PT09PT0KCiAgKiBmaXggdHlwbyB3aGVuIGNoZWNraW5nIGluZGV4T2Y7IHJlbW92ZSBib3gtc2hhZG93IGlubGluZSBzdHlsZSB3aGVuIGRyb3BTaGFkb3cgb3B0aW9uIGlzIGZhbHNlIG9yIGRyb3BTaGFkb3dTdGVwcyBpcyAwLgogICogb25seSBzaGlmdCBvZmYgaGVhZGluZyBvZiB0aXBQYXJ0cyBpZiBvcHRzLnNob3dUaXRsZSBpcyB0cnVlLiBmaXhlcyAjNTUKICAqIHRyaXZpYWwgY2xlYW51cAo=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/arrowdown.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgALAIABAMzMzP///yH5BAEAAAEALAAAAAAWAAsAAAIchI+pEOsZ4nuxTlXzPbnvDk7g6IwmZp5cmhpsAQA7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/arrowleft.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwAWAIABAMzMzP///yH5BAEAAAEALAAAAAALABYAAAIjjI+AC7rWHIsvtmmTvXBzT4HiKAZkBx6l6mGUK2lcNdNPUgAAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/arrowright.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwAWAIABAMzMzP///yH5BAEAAAEALAAAAAALABYAAAIkRI4JlrqN1oNyutqqvDrqHXyYSJZkeKKf17Ggy3CQOqN1eAcFADs=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/arrowup.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgALAPcBAMzMzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAEALAAAAAAWAAsAAAgyAAMIHEgQAACCCBMWNHhQocMADBk+TBgx4sSBFStezJjxIUeOCj9+RChSJMaSJlGiDAgAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/bl.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhzwPJA/eVAKzG16zI2qm3vaa7xqa2vq3J26nBzazI2avE06/K27XO3ejv8rnR38TY4rHM3L7V4KS3wMnb46zJ2qW3wMrc5K3I2b/V4bLN3K/L26vD07rS38TZ4rjQ3rbP3qq4vazF067K27XP3cXZ46rBzbDL3LLM3Ke7x+jv8ePp666/yLTL2fT296zI2K/J2rrM1LXHz8HV3rjL1bPGz6i3vrLCyPj5+rHL2rLJ1aq5v8jZ4MrW2q28w8fW3LbN2bXDyK/I2Ke3vrfQ3qq3vb7Q19bc3rrGy8rb4rHJ2LPN3crb4a+7wPP19qvBzrDH1efu8ai8x7S/w7nO2qW4wK7I2bHFz6y/yKa4wai/zMXQ1Ke5wbXK1sTY4avF1rzP2LvT37DAyP7+/qi5wam4vsDT3LnQ3LzM0q7Dzsvc5L3L0MbY4fX4+K3CzrTO3aa3vr3S3bbO26a6xqW2vbnHzcDJzarD0q3F067H16i6wrTM28PU2+rv8ay6wK3K263F1Kq+x63H17rGysDQ1sDW4bK/xK67wOft8MXX38XT2bvS3+bt773T3s3V2MHW4au4vau7w/Hz9LfHzqi9x6nAza++xKvI2v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAJUALAAAAADPA8kDAAj/ABecEWFBQ4cLGAoEoMSwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzZscFFDZYYBCiRIICNoMKHUq0qNGjSJMqXcq0qdOnUKN+xNngAQMFDn5K3cq1q9evYMOKHUu2rNmzERdEqHo1K1C0cOPKnUu3rt27ePOaVcsWq1a9gAMLHky4sOHDiI3yter3beLHkCNLnky5suWli9v+vcy5s+fPoEOLBpy58ejTqFOrXs26NcnSbl3Lnk27tu3bg2Fvxs27t+/fwIPH1O1YuPHjyJMr9018ufPn0KNLh9x8uvXr2LNrl1p9u/fv4MOL/x/Zfbz58+jTay+vvr379/Bts49Pv779+5Ln49/Pv7//s/r9J+CABBZYVIAGJqjgggyGhGCDEEYoIYQPTmjhhRjeV2GGHHboIXgbfijiiCQmF2KJKKaoomwnrujiizBe1mKMNNZoY2Az3qjjjjySlWOPQAYpJGZrMRbbkEgmqSSRfR255JNQRgnTj1JWaeWVEFGJ5ZZcLqlll2CGueOXYpZp5opknqnmmh2myeabcDboZpx01vnfnHbmqWd8eO7p55/j9QnooIReJ2ihiCZqYpGaFafoo5B6d2iklFba2qSWZqopaJhu6umn+TFqGqiklupap6amqmpdqK7q6qs+iv/qJKy01lpYq7bmqmtSuO7q66819QrssMSuJGyxyCbroKy7Kevss0MdC+201DokbbXYPnttttwWu2234Pr6bbjk1jpuueiuem667JK6brvwavpuvPRGOm+9+CJ6b778/rlvvwDb+W/ABL85cMEIm3lwwgx3uXDDEFv5cMQUPzlxxRgPeXHGHPO4cccg1/hxyCS7OHLJKJd4csose7hyyzBf+HLMNFPIrKM15yzmzDr3PCDPPgfNH9BCF10f0UYn7R7SSjd9HtNORw3izVJX7THVVmctMtZad20y116HrTLYYpftMtlmpy0z2mq3bXOTzbot94JQz203a3Xfrfdpee//7fdnff8tuGWBD254ZIUfrvhhiS/uuGCNPy45XpFPbvlclV+uOYBsb+75cpl/LrpXoY9uelSln646U6mv7vpRrb8uu1Cxz277TLXfrrtLue/ue0q9/y78a50Pb3yocON8/PLUFc/884QFD/30E0lP/fXWOo/99nJZzz313n8PffjiM09++cefj/7w6q//e/vu7w5//LfPT//s9t//ev76r85//6f7HwBHJ8ABfq6ABtwcAhN4uQUycHIOfODjIijBxVGwgoe7IAYHp8EN/q2DHtwbCEN4txGScG4mPKHbUqhCtbGwhWZ7IQzFJsMZeq2GNtQaDnNotR3yUGo+/KHT/4IoRKURsYhGOyIShabEJfqsiU7UGRSjWLMpUjFmVrxiy7KoxZRxsYsl+yIYQybGMXasjGbMGBrTWLE1sjFibnxjw+Iox4TRsY4FuyMeA6bHPfarj37MFyADWa9BEjJehjxkuxKpyHQxspHleiQkwyXJSXarkpbMFiYzWa1NcnJanvyktrQnyvuFspTJOiUqvUXKVa5Pla4EFixjKa5W0vJ7s7xlrnKpS3PZspfX4yUwXyXMYarrl8Z8XjGTaaplMtNdyHym8ZwpTU9Rs5ryiiY2fXfNbVaqm960lzbDaTtwklNR5jynvsapTtels52Deic8/cXOeZpOnvbUEz7zKf+wevLTc/v8Z5wCKlCD+bOgliMoQtWk0IUq7KAOdVxDIxqmiVLUYRC9qOEsqlEscbSjEssoSP320ZFGqaQmtZhIU2o3lLI0SS59qcZWKtO2xbSmQLopTq+WvJ0ClKY+pSFQg3rDoRJVh0Y9ag+TqlQgMrWpQ3wqVI0o1akmsapWZSJWs/rErXJVil79ahXDKlYskrWsWzwrWr2o1rWGsa1uJSNc43rGudJVjXa9axvzqlc48rWvc/wrYO0o2MHmsbCG5SNiE/vHxTJWkI59bCEjK1lEUrayi7wsZh2p2c1GsrOepSRoQ3vJ0ZJWk6Y9bSdTq1pQsra1o+wpbJum09n/+qe2th3aa3PLStnyVqu+/W1XgytcsBK3uGM9LnLNqtzlprW5zmUrdKP71ulSV67WvW5ds6tdvHK3u3v9Lnj9Kt7xBra85iUsetN72PWyV7HufW9j4ytfyNK3vpO9L34tq9/9Zra//uUsgAP82QETWLQGPnBpE6xg1DK4wat9MIRdK+EJx9ZIcbPwfDGsPA3bl8Mebi+IQwzfEZN4w406McBwq+LjsLjFwnkxjIEj4xkzZ7c23lONc4ybHfNYPjj+cZ18LOTZELnIpwoykg1a4SW76shOVg2Uo4yaKVN5NFa+cmiyrGXAKbnLFf0ymDHa5DFbU8xm9iia0xzSMrPZ/1JcfvNk4ixnxK25zip1M54fRec9I6bPfjYMoAMdvTsTWkiDPjSODK3oHiW60Xl5NKTvIulJs4rRlrZRpTPdPUxzOkab/jRaQi3qvXi61Gg6NapTROpVi6XVrgYLrGNNOlXTWkSzvvVWcq1r1Nm61xziNbCdIuxhs+7XxrZQsZPNK2QzO0LLfrZinC1tBkW72tGiNrYTdO1t26Tb3qYJuMMtk3GTe0raPved0q3u/pi73Sx5N7xVIu95o6Te9jYJvvNNPD3zO0j7/vey/C1wnpq44HQKOMJvwu6Ft0fhDtcIxCOOkYlT3CIWvzhFMq5xiXC841lqOMjD8/GRN6TkJv+nBMpNvvKRtxzkL+94zDU+84vXnOI3j3jOHb7zhfcc4T8veNAFPvR/F53fR8930u299Hk3Hd5Pb3fU1T31c1ed3FcPd9a9vfVtdx3bX6922KU99meXndlnT3bajb32Ybcd2G/vddx1Pfdb153Wd4913l2991X3HdV/L3XgRT34Txee04fPdOItvfhJNx7Sj2905BU9+UNXntCXD3Tm/bz5PXcez5+vc+jlPPo3l57Np09z6s28+jG3Hsyv73LstTz7K9eeyrePcu6dvPsl9x7Jvy9y8IU8/B8Xn8fHz3Hybbz8GTcfxs9vcfRVPP0TV5/E1w9x9j28fQ1338Lfn3D/+CE8/gaXX8HnP3D6Cbz+ALffv+/fb/zxO//61l++939v/tm7//T237z/N14BCF4D2F0FqF0HeF0JSF0LGF0N6FwPuFwRiFwTWFwVKFwX+FsZyFsbmFsdaFsfOFshCFsj2FolqFoneFopSForGFot6FkvuFkxiFkzWFk1KFk3+Fg5yFg7mFg9aFg/OFhBCFhD2FdFqFdHeFdJSFdLGFdN6FZPuFZRiFZTWFZVKFZX+FVZyFVbmFVdaFVfOFVhCFVj2FRlqFRneFRpSFRrGFRt6FNvuFNxiFNzWFN1KFN3+FJ5yFJ7mFJ9aFJ/OFKBCFKD2FGFqFGHeFGJSFGLGFGN/+hQj7hQkYhQk1hQlShQl/hPmchPm5hPnWhPnzhPoQhPo9hOpahOp3hOqUhOqxhOrehNr7hNsYhNs1hNtShNt/hMuchMu5hMvWhMvzhMwQhMw9hLxahLx3hLyUhLyxhLzehKz7hK0YhK01hK1ShK1/hJ2chJ25hJ3WhJ3zhJ4QhJ49hI5ahI53hI6UhI6xhI7ehH77hH8YhH81hH9ShH9/hG+chG+5hG/WhG/zhGAQlGA9lFBalFB3lFCUlFCxlFDelED7lEEYlEE1lEFSlEF/lDGclDG5lDHWlDHzlDIQlDI9lCJalCJ3lCKUlCKxlCLelBL7lBMYlBM1lBNSlBN//5QDnJQDuZQD1pQD85QEEJQEPZP0WpP0dpSiKXctuRlPTjlPEDle4jla+0lEyZHVSJPllZPlspPl2JS1Z5lYYSlmI5HV/JPWe5PWmJPWsZTGRZltHRluDzlnD5HHI5PXc5PnRZl6Czl3y5KAT3l8Hml4JpHHmpTIRZmMFxmOaTmIr5G4y5PJGZPo75mL0xmdNUmZbZY5q5mUAWmJ75NgcXmojWmaTJIqZ5mpeSmqq5GpjJPqzZmqnxmsJDm+8Tm7LJN7iZm6Jhm9y0m7zJKcAZnJ7hm/IznMTJGcapO8tZP8iZnITznNBJGc1ZTtI5ncgzmtj5NaC5nfhRnfhznd7/mRjgKTvluT/iOZ6Mk57qeSvs2Z658Z7wuWjdOZ/vcZ7uJJ/2GWn6uZ+U1p/+eWn1GaDogZ/+A6AE2mkDmqCBgqAMOmoO+qCmtqAS+h0GqjoXGkARWqFjkaH3tKEcGhYeSkAgGqJfMaKig6IHVKIm2hUq+lMU2qJjGaMyapYsWqO+RqM4Ch0vqkA3uqPE9qNAemw6OqTK0aOag6QNJKRG2mxF2qQuxqRQOm1POqWLKaVWmm1VmqU3tqVcyhtKmlBY+qXBMqZkijtmeqbDkaZq+hJhCkFs2qYt8aaSQ6cTFKdyaix4mqfAs6d8ehJ2KlF++qclEagWNKiESh6ImqgD/6edjJoehqo4kZpBi/qoHjGpG1WplsoRmMpBmrqpEvepoFpxojqqGFeqprpxqJqqHreqrBpyXvqqndGpgkOrH+SqsnpyuJqrKreruWqrJOWrsgqsIiSsr0qseoOsJWSsrKqsLcWsqeqsKAStpiqtcmOtK0Sto4qtNqWtoMqtLuStmwquaUOuMSSulmquZaOuQhWrvFoZ7Bo28VpU7vquc4aujzqvXaOvSFWv9mpn/vqvj8GvWUOwSxWwAvtn+MqoBls1DetUCJuwgrawifqwUWOxURWxEltoGruxkEOxhIqxtAWyfyqyVNWxHksaJMunJps0LXtVKJuy/BmzMvufNP9bswLqqDiLHC9bND0LXDq7s4a5snn6s0FjtMMVtEJ7pTe7tHCBtD0DtcaltE7bpVRbtWBKtHIqtTnDtcl1tVh7G15LM2PLXGAbtrVRtjCjts91tmhrZFrbpmzLMnMrXW77tknWtHgronGrpnWLMn9bXXe7t67Zt2cauCSDuNg1uIQ7m4ZLpooLMpG7XYzbuLqpt5bLFZPLMZvrXZWbuVv2uF/auRhDuuH1uaDrZZibulBhuhTjuuSFuqyrnKLLpbALMbd7XrI7u9G5urxLpLv7u/fqu8LrpMFbvM1DvMhLpce7vAqrvM6rpc0bve4JvdT7bbWbpbnLMNurXtN7vR//a73gi6biO75rWr7m66bZa6XdizDtK2Iplr6hi77yG2/rO6XvSzD5W2LxW7/Feb9QShXf6791cQI5wRg+0WEELBknEAEEoQEhgBAKscCc4QRG0AAFcRAJsRAUbBmFkARbIAheEARIQAJ8IAEdbBmJkANpwAiIwAFs4AAgMMEpPBl6wAOGAAOKwAEKcAEkMMMSEMQSEABEXMRGfMRInMRKvMRM3MRO/MRQHMVSPMVUXMVWfMVYnMVavMVc3MVe/MVgHMZiPMZkXMZmfMZonMZqvMZs3MZNLMRqcAh5MAZuQAZvgAc20AJTUAF8fAB+/MeAHMiCPMiEXMiGfMiInMiK/7zIjNzIjvzIkBzJkjzJlFzJlnzJmJzJmrzJnNzJnvzJoBzKojzKpFzKpnzKiVwBLFAJOhAIQ9AFUdADKnAEP2AHfwAAuJzLurzLvNzLvvzLwBzMwjzMxFzMxnzMyJzMyrzMzNzMzvzM0BzN0jzN1FzN1nzN2JzN2rzN3NzN3vzN4BzOxswFlYACaFAGLhADWnADTdAHdfABH4AA8jzP9FzP9nzP+JzP+rzP/NzP/vzPAB3QAj3QBF3QBn3QCJ3QCr3QDN3QDv3QEB3REj3RFF3RFn3RGJ3RGr3R/JwBHk0HlQAGWCAHkPACMkAFZrAGTDACI2AALv3SMB3TMj3TNP9d0zZ90zid0zq90zzd0z7900Ad1EI91ERd1EZ91Eid1Eq91Ezd1E791FAd1VI91VRd1VZ91TotCVdQCZWwAkXgAzTwBSlQBX4QCU9gAiYwAGq91mzd1m791nAd13I913Rd13Z913id13q913zd137914Ad2II92IRd2IZ92Iid2Iq92Izd2I792JAd2ZI92XYNB1xdCY8ACIMwCTvgCHcQBllgBRMw2hMAAaZ92qid2qq92qzd2q792rAd27I927Rd27Z927id27q927zd277928Ad3MI93MRd3MZ93Mid3Mq93Mzd3M793KtN2hMgBZddCTWwCEpACHuAA2IwA0Ca0AYEEN7iPd7kXd7mfd7ond7qvd7s3d7u/d7wHd/yPd/0Xd/2fd/4nd/6vd/83d/+/d8AHuACPuAEXuAGfuAInuAKzt5xQADVzdVLQARzAAWN4AEeIAAYnuEavuEc3uEe/uEgHuIiPuIkXuImfuIonuIqvuIs3uIu/uIwHuMyPuM0XuM2fuM4nuM6vuM83uM+/uNAHuQlLgQBAQA7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/bl.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAA88AAAPJCAMAAAAbDOrsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAcJQTFRFrMbXrMjaqbe9prvGpra+rcnbqcHNrMjZq8TTr8rbtc7d6O/yudHfxNjisczcvtXgpLfAydvjrMnapbfAytzkrcjZv9Xhss3cr8vbq8PTutLfxNniuNDets/eqri9rMXTrsrbtc/dxdnjqsHNsMvcsszcp7vH6O/x4+nrrr/ItMvZ9Pb3rMjYr8nauszUtcfPwdXeuMvVs8bPqLe+ssLI+Pn6scvassnVqrm/yNngytbarbzDx9bcts3ZtcPIr8jYp7e+t9Deqre9vtDX1tzeusbLytviscnYs83dytvhr7vA8/X2q8HOsMfV5+7xqLzHtL/Duc7apbjArsjZscXPrL/IprjBqL/MxdDUp7nBtcrWxNjhq8XWvM/Yu9PfsMDI/v7+qLnBqbi+wNPcudDcvMzSrsPOy9zkvcvQxtjh9fj4rcLOtM7dpre+vdLdts7bprrGpba9ucfNwMnNqsPSrcXTrsfXqLrCtMzbw9Tb6u/xrLrArcrbrcXUqr7HrcfXusbKwNDWwNbhsr/ErrvA5+3wxdffxdPZu9Lf5u3vvdPezdXYwdbhq7i9q7vD8fP0t8fOqL3HqcDNr77Eq8ja////LL4G4QAAAJZ0Uk5T//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AaRLOegAACStJREFUeNrs1QVyFFEARdEeyCAxSBjJTFxxd3d3d5fg7i7BXf5+6bAKftc5S3hVt15SN9hTqraXW/K5P0DckrpCa6m+u39s3haQgZ4bxtXXNuoZstBzk55Bz4CeAT0DegY9A3oG9AzoGdAz6BnQM6BnQM+gZ0DPgJ4BPQN6Bj0Degb0DOgZ9Kxn0DOgZ0DPgJ5Bz4CeAT0Degb0DHoG9AzoGdAz6BnQM6BnQM+AnkHPgJ4BPQN6BvQMegb0DOgZ0DPoGdAzoGdAz4CeQc+AngE9A3oGPesZ9AzoGdAzoGfQM6BnQM+AngE9g54BPQN6BvQMegb0DOgZ0DOgZ9AzoGdAz4CeQc96Bj0Degb0DOgZ9AzoGdAzoGdAz6BnQM+AngE9g54BPQN6BvQM6Bn0DOgZ0DOgZ9CznkHPgJ4BPQN6Bj0Degb0DOgZ0DPoGdAzoGdAz6BnQM+AngE9A3oGPQN6BvQM6Bn0rGfQM6BnQM+AnkHPgJ4BPQN6BvQMegb0DOgZ0DPoGdAzoGdAz4CeQc+AngE9A3oGPesZ9AzoGdAzoGfQM6BnQM+AngE9g54BPQN6BvQMegb0DOgZ0DOgZ9AzoGdAz4CeAT2DngE9A3oG9Ax6BvQM6BnQM6Bn0DOgZ0DPgJ5Bz3oGPQN6BvQM6Bn0DOgZ0DOgZ0DPoGdAz4CeAT2DngE9A3oG9AzoGfQM6BnQM6Bn0LOeQc+AngE9A3oGPQN6BvQM6BnQM+gZ0DOgZ0DPoGdAz4CeAT0DegY9A3oG9AzoGfSsZ9AzoGdAz4CeQc+AngE9A3oG9Ax6BvQM6BnQM+gZ0DOgZ0DPgJ5Bz4CeAT0DegY96xn0DOgZ0DOgZ9AzoGdAz4CeAT2DngE9A3oG9Ax6BvQM6BnQM6Bn0DOgZ0DPgJ5Bz3oGPQN6BvQM6Bn0DOgZ0DOgZ0DPoGdAz4CeAT2DngE9A3oG9AzoGfQM6BnQM6BnQM+gZ0DPgJ4BPYOeAT0Degb0DOgZ9AzoGdAzoGfQs55Bz4CeAT0DegY9A3oG9AzoGdAz6BnQM6BnQM+gZ0DPgJ4BPQN6Bj0Degb0DOgZ9Kxn0DOgZ0DPgJ5Bz4CeAT0Degb0DHoG9AzoGdAz6BnQM6BnQM+AnkHPgJ4BPQN6Bj3rGfQM6BnQM6Bn0DOgZ0DPgJ4BPYOeAT0Degb0DHoG9AzoGdAzoGfQM6BnQM+AnkHPegY9A3oG9AzoGfQM6BnQM6BnQM+gZ0DPgJ4BPYOeAT0Degb0DOgZ9AzoGdAzoGfQs55Bz4CeAT0DegY9A3oG9AzoGdAz6BnQM6BnQM+gZ0DPgJ4BPQN6Bj0Degb0DOgZ0DPoGdAzoGdAz6BnQM+AngE9A3oGPQN6BvQM6Bn0rGfQM6BnQM+AnkHPgJ4BPQN6BvQMegb0DOgZ0DPoGdAzoGdAz4CeQc+AngE9A3oGPesZ9AzoGdAzoGfQM6BnQM+AngE9g54BPQN6BvQMegb0DOgZ0DOgZ9AzoGdAz4CeQc96Bj0Degb0DOgZ9AzoGdAzoGdAz6BnQM+AngE9g54BPQN6BvQM6Bn0DOgZ0DOgZ9CznkHPgJ4BPQN6Bj0Degb0DOgZ0DPoGdAzoGdAz6BnQM+AngE9A3oGPQN6BvQM6Bn0rGfQM6BnQM+AnkHPgJ4BPQN6BvQMegb0DOgZ0DPoGdAzoGdAz4CeQc+AngE9A3oG9Ax6BvQM6BnQM+gZ0DOgZ0DPgJ5Bz4CeAT0DegY96xn0DOgZ0DOgZ9AzoGdAz4CeAT2DngE9A3oG9Ax6BvQM6BnQM6Bn0DOgZ0DPgJ5Bz3oGPQN6BvQM6Bn0DOgZ0DOgZ0DPoGdAz4CeAT2DngE9A3oG9AzoGfQM6BnQM6Bn0LOeQc+AngE9A3oGPQN6BvQM6BnQM+gZ0DOgZ0DPoGdAz4CeAT0DegY9A3oG9AzoGfSsZ9AzoGdAz4CeQc+AngE9A3oG9Ax6BvQM6BnQM+gZ0DOgZ0DPgJ5Bz4CeAT0DegY96xn0DOgZ0DOgZ9AzoGdAz4CeAT2DngE9A3oG9Ax6BvQM6BnQM6Bn0DOgZ0DPgJ4BPYOeAT0Degb0DHoG9AzoGdAzoGfQM6BnQM+AnkHPegY9A3oG9AzoGfQM6BnQM6BnQM+gZ0DPgJ4BPYOeAT0Degb0DOgZ9AzoGdAzoGfQs55Bz4CeAT0DegY9A3oG9AzoGdAz6BnQM6BnQM+gZ0DPgJ4BPQN6Bj0Degb0DOgZ9Kxn0DOgZ0DPgJ5Bz4CeAT0Degb0DHoG9AzoGdAz6BnQM6BnQM+AnkHPgJ4BPQN6Bj3rGfQM6BnQM6Bn0DOgZ0DPgJ4BPYOeAT0Degb0DHoG9AzoGdAzoGfQM6BnQM+AnkHPegY9A3oG9AzoGfQM6BnQM6BnQM+gZ0DPgJ4BPYOeAT0Degb0DOgZ9AzoGdAzoGdAz6BnQM+AngE9g54BPQN6BvQM6Bn0DOgZ0DOgZ9CznkHPgJ4BPQN6Bj0Degb0DOgZ0DPoGdAzoGdAz6BnQM+AngE9A3oGPQN6BvQM6Bn0rGfQM6BnQM+AnkHPgJ4BPQN6BvQMegb0DOgZ0DPoGdAzoGdAz4CeQc+AngE9A3oGPesZ9AzoGdAzoGfQM6BnQM+AngE9g54BPQN6BvQMegb0DOgZ0DOgZ9AzoGdAz4CeQc96Bj0Degb0DOgZ9AzoGdAzoGdAz6BnQM+AngE9g54BPQN6BvQM6Bn0DOgZ0DOgZ9CznkHPgJ4BPQN6Bj0Degb0DOgZ0DPoGdAzoGdAz6BnQM+AngE9A3oGPQN6BvQM6BnQM+gZ+C97LugZstLzxEJr2nO/niELPTf1lKrd5ZZ8zhgQe887NjSUqu16hiz0/Hbz0dcnVm/qe9psDIi954+LL3350Ha1sctBQ/Q9P172btanttpyX1e+OZUD4pT2m1x+/+js9XM3Hi6YvrdYLI4GYlWcloQlr9Ye3718ysaV918kQMSOJWHSxfMzZh9ZuP3Zvc7OMUCkKpXK3SScOnT7x8w5+y5c2dbbOwqI1q+DSQhT16+Yd3Ly/uc/dw4MjASidTPtOXx/+eb30m8PTh8+MCE1HojPcLx7hnsO8z9vGXqy6MzcVddqgFjdqvnXcwhb193Z9bWjYwQQrzV/BRgAKUYs9eGcDMIAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/br.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhDADJA/eAAKzJ2qu+x6u4vKe2vaq4va7J2a7G1K7K26S2v67Dz6vI2aW1vaq3vKm3vau5v/7+/qzG16rE06W3wKW2v6q7wqW5w6a2vqrD0aW5xa3J2qzCzqa8yKzD0LzGyqe5w6rD0qq9xq7H167F06m/y6a8x6i5wazH16a4wK27wK3F0qnC0am3vLDH1LC7wKrBz8nR1OHm56zE06a6xKe+zKW4wKO2v6q4vKW1vq7H1azH2avG1azCzaq9x6y5v6W5xKS4wbjDxqi4v6u7w9bc3+Lm6KW4wrbBxazI2K3I2Ku4vbvFyaa2vam5wKi9yKi3va3H1qvI2Ke2vNDX2qjAzaa7x6rAzanBz6rF1ae9yazBzaq/y/Hz9Ky/yOPn6am5v6vBzqi+y63H16e9yqzG1KvF1P39/avD0am7xa26vqy5vqi6w6zI2ai/zae3vrDJ2Ki2vKa1vKm4vqi7xsbP0qm+yKe9yKq+x63Dzq/H1Ky6wKzI2q3K26q6wq/I2K/J2qvI2v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAIAALAAAAAAMAMkDAAj/AP8IBHDAjxsWCbgIQSHwD0E/ffAkCEAhT0MAeyDiuROAj0WBejJG5OixYUiNJD/+OTnSTkmQIje6VMlS5suVMe/MNJlzJ0yUPnECvVlTJ9GeR4fSRLpUKU+nP1smldqU6lOrUW1W1XqVa1ajW8F2Ffs1aFGzTMeihSoUa1uvb8nGXev27FS4dsPSxZu27F25edX+3Qu479zBiPUmFqy4MePHfh1HhnxYcmXKgSdrvrw5M+fPnkMbFs2WdN3RqEunPq26NevXfF3Hhl1Ydm3ahHMv7rx6tu/bv3VbNh18N+jewJMLx4x8OW/bzo9DN05cOfXm16cPx75dO3Pvz3Fn/xffnfx38+GLl1d/nn166+vht5f/Pnp1+9zn4wcvHX1/9//RF+B+/t03HoAGxkcggvnVd6CACer34IIQNjjghBgqmKGEGnbI4YcOehgiiBeKWCKJEY6o4okrpsjiiy7GaKGM/NFY4Iw41pjjjTr2yOOPDPoYJJAVClkkkRQmuWGLOw7p5JFPKmmijVEuCWOTUGYpJYpYbsmkkV5eCaaVVGpJZpdnjjklmmuqyaWbXyKZppxt0vmmnXFWWaeed/KZp5l7AtqnoH+GWaahbA6KKJxi4tmon48SGumijh46J6SWBkoppokWeqmkmSr66aagdjrpqKhqmqqoqrbK6queuv8aK6ynylorraHOquutu+bK66++BmuqsIwSW+mwyBab7LHKNsvss5w6Gy20pUpbLbWkZrtqr8tO6+2132prq7Hhbgtst+CmKy6u6K7LrbXunguvueSqS2+79847Lr776suuv+9im6/A/RL8r8EBl1uwwgcznLC9C0PcsMQPx1uvxfxOTKkBKV1lgAYdqYQRRB935MBFBxQQggg78EDByQNlUMATKWQBAh89XCQzDhxocQYTaZiERBgxfEGHGl4ksZICa5gwhhkjyFFCHC0okAMUEJBxQRVNeBAEAUAcAcEVEajARh0ynNAGAS/oEMEHVsywgQ80WOCEADBc4MIUYlBNUYEEEwxAgBFlgIEFCRj8UMMNAzQgABGAYFBBEQggsAAcjksBCCASIDDBAktEwQAaQzywuQUDDPDGCgJ0sMXmmzNggwBKzNGF6bADEhAAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/br.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAwAAAPJCAMAAAARZjlPAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAYNQTFRFrMnaq77Hq7i8p7a9qri9rsnZrsbUrsrbpLa/rsPPq8jZpbW9qre8qbe9q7m//v7+rMbXqsTTpbfApba/qrvCpbnDpra+qsPRpbnFrcnarMLOprzIrMPQvMbKp7nDqsPSqr3GrsfXrsXTqb/LprzHqLnBrMfXprjArbvArcXSqcLRqbe8sMfUsLvAqsHPydHU4ebnrMTTprrEp77MpbjAo7a/qri8pbW+rsfVrMfZq8bVrMLNqr3HrLm/pbnEpLjBuMPGqLi/q7vD1tzf4ubopbjCtsHFrMjYrcjYq7i9u8XJpra9qbnAqL3IqLe9rcfWq8jYp7a80NfaqMDNprvHqsDNqcHPqsXVp73JrMHNqr/L8fP0rL/I4+fpqbm/q8HOqL7LrcfXp73KrMbUq8XU/f39q8PRqbvFrbq+rLm+qLrDrMjZqL/Np7e+sMnYqLa8prW8qbi+qLvGxs/Sqb7Ip73Iqr7HrcPOr8fUrLrArMjarcrbqrrCr8jYr8naq8ja////7sj6uQAAAIF0Uk5T//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AksjjTwAAAQtJREFUeNrs28VaQgEYhOGfcwBJ6bC7u1vs7u7u7kD0nEsXgYU71z7PN6t5N3MHI5qmSdrXTbV1a6Bckvh8sxr87wl8xPFqiCUQ/QMvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4nzD//giYM1OQFNKTjwNTQWFXtz+JDNNsxXp+rCeF9uyN06nzxMDYfsPu08XOuGhR22Xp4UnRQ8l9jdg65txHoeXp3H5jn4y6Vz2VV8+NZdfGOun05K00ZfU2B2eUegnVLh4sBbw+1ThyLHtrxeFIS5vqVIZ0CQeGLRb7nVNZ0HXxWnz2yXnH2aArjqCq3lYpOZt6POJoVSYet10/Xf8WYACiIq1QmLEJbAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/darrowdown.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgALAIABAIeHav///yH5BAEAAAEALAAAAAAWAAsAAAIchI+pEOsZ4nuxTlXzPbnvDk7g6IwmZp5cmhpsAQA7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/darrowleft.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwAWAIABAIeHav///yH5BAEAAAEALAAAAAALABYAAAIjjI+AC7rWHIsvtmmTvXBzT4HiKAZkBx6l6mGUK2lcNdNPUgAAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/darrowright.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwAWAIABAIeHav///yH5BAEAAAEALAAAAAALABYAAAIkRI4JlrqN1oNyutqqvDrqHXyYSJZkeKKf17Ggy3CQOqN1eAcFADs=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/darrowup.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgALAIABAIeHav///yH5BAEAAAEALAAAAAAWAAsAAAIcjI8AyJ26nAwQzlbrPTnv3k0g6IwjY5pcqrJsAQA7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/itunes.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAFYAAAAmCAIAAADRFvthAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAACaZJREFUeNrcWn2sFFcVP3d3Zmdnd9/j4ZbHZ4svtHlQaF4jiY3WopZaWkukgcqXGghNsUi0ttQWYrStSKRaUhNoTQ2iobSmPmoKgVRKSUHAWpQv+RAIIEHk9UGXt8vszM7Xvcc/7s7dO7OzC9p/3uvNy77dmXtn5vzu7/zOPWcuYYwBAEqNMSY+5QYDrZFwSyQS4lM0AFCE/dxmSimra/zsgINA2BxpyWSSH+cwKcJ+3nzfp5TyT974cUrpgIMgmUwKm3lTFCWZTHJ0xKci7OeW+77vBY3/5Ch4njfgIFBVlduvKIqiKGrQEFFRFMGUKgTcfs/zXNd1HMd13SVLlsAnq61atSqVSnG/lvUiBIHrurZt27ZdqVQA4JX1G4OOwYg6TWwgkhh3jlzrITFyTXI9vRv8JuFLPDrv6+VyWdd1br+skYrwAs/zHMexbds0TdM0AeDfBYtfBBvfH2Nuj83MAgBCGmAUDCFIGp0V9yVhqKTrkQbwGYbBRV3WSMZYlQXCCyqVimmahmEAAKOszh6sGYFNJuT6Img9p0gUYBILanAU+XOQ0GAOAMHoAG6UUAcukIgYZYEMAWW0egOMfWrS2Ni6SUFoxhMSC0kwHq/D6aSJD66HkQGGYSQSCVkXue1RLXAcx7KscrkMAKwaCDFkFkY97p//OFgqXhk74fa2T+Wx2i/K+6hDNPXjmg0C6Bi/CukTxqgHisH8bLlcVlU1nU67risiHSJGIwKXA8uyBAR1Xhs8RUC8tatX7v9gz8o16/PtQx+ZOaUR69d2v9Nxc2fsVGI8STDi0diYCVXeI4mHFQEALMvSdd1xHB7voxBEiMAjAmVU+DY2jguTp0ztHHfr8JEj03p22kNz+cEjh/afPX1yzC1jJ3R9hh9pbRnEKAtJRRwXUBY3ItyI1IDC+CCDIHeVWBCcqlQqPN4L+2sQCBTE0shxnMYsiMgXfnX67CQhjkcZ4JM//hkX6DUvLD97+uRnPz/pO0/8kPetOH6wxMTQ/GJzJw93xHi1jwcz3MT8+74v7A85Qn1EaLAojvJz5TNPnTh6aPFTz43vmmj41SGUMn4Fw7JFzz9t+sPm7le/8sD0B2fPB4AXVyw7feLY95Yu7xzftee9bb9f99LnJt1z89gJr69bU7HMGd94+L6vzeQ37O35zysv/vT4kQNpPTPpngfmffv7yUQSAI4e+vs7WzYe/NtfKKXtw0f+/OUNqpqKARarcpjL5XK5nOu6nufVHKFJzGKMxQcDDK0WLvVcOHfmlGOVmQQZdx3EEI5G8cq5M6dKfR8xSoHApYsXzp055VQsRqlllM6dOQWIm7tfHd0x5szJ479atfzOL03JZHOWaTzxyEzbtubMW3j8yKE3X1s7qG3wg7PmWWb5mScX+tRf9NjTyWTy6OGDjFKaoNdYtdVnU03O8Sypli+JPxZ8MsoCvUBEcYQxWoUAqjLD/wKvQsaoWHTw9JT3v/ThxZd++8bLv+u+9bbbfc87cuADRumWN18v9hUm3zt1zvxFjy99DgB2btvMKO0rXLbtSktL6x1fmHz/tFlLf/KLpJIUD8D/seDxm5jZnAW0Ps5jdWUttAu5unF3kgMGACBDObIG1ECui1wVhVsCwKTJUwa3jyyUyvkb2gHAc21G6fkzpwDg5Iljzz79XSBACOm5eIEyOnzUTbd1TTxyeP+CWffddff90+csGDZiFPyvHLgGBJQFwSa0NIyVokhCjcj4kGpYCQCpTjuTcaGMUWRcO5jr+jWwGNKAaBk9c9PoTwNAx/yFiEh9j1L2/Jp13Rt+88aGdTvefmvPe9ueX7N+5I0dGL+o/HgsqNNsEloLIwIAQyZrRzUbq7GAkycBAMbVEqO058L5f50+VWUBpRwdAOQ3DfjCGKWjO8bs2bndcZ1vPrxYXKpccQCpYdLpcxdMe2jOs0sfO7R/3653t86at6g+iSH48SHAcJQichBHhOBxGcUaAvw8SjjCuAldALB3146Eou7buzORTAIAY0iFdiAySjEAnTPr3qkzNm187eTxIyt+9IM77vqyVTZOnzw279ElF86f3bV96/iuicNGjOJL0Hw+z4fXZbf4f0PAqtY1z3EwmD4x4Rh1e96r45Zxd37x7vd379y94+3Fjy/buqn76OEDyBijDBmGfEQMZ1RN6yt/+evVL6z46+533//zdkVRR4y6kTEfkB3ct3f7lj8isvZhI2bM/taUqTNsj8YvKpqUGIvFYqVSKZfLpVKpUChcvny5t7e3p6fnxIkTcxcti82MAYm8Xhrcmk2pyaJhOq4vDrdk05m0ZtmOYdry4LZcxrHNbLalXHEy6ZSqJPuumq7n6+lUa1av2G6pbAFAW0tW09SSYdm2CwCqkmzN6b7nlUpXhgwZhgCFYjmZJG2tWd/zSsW+/A3ttuuVrQpi/AKye+0LY8eOHT58+NChQ4cMGZLP5wcNGpTL5XRdVyIlV/kLZZTE5ElRKhT6rtbnLSXDLBlmKHtBBIArJSORIGahCACWVRFXK5uVslkR171SuiqSYABwXHr5iguEJNRMb6HIR/kUei/3ASEJRfvwo76gCkEwXESoKULYupAjyBVl+bukZKTmUhiTFGMdBHHaWe3MaB2OGNsR45YqkfQHqwcb1aYwBEGsmUqk6i7KKRIERE5SQLYXMS7/ra3jZf2sVezwGpU3bCpjjXKscJElhrTCNGF8lQUyKqLkzAusNAxB5KpEylswqOBE6inRbFekegSbB+2GKozXLkvJJRi5G68URVAghCix9nMI3lq/+pNUQeZ21aOgyPaLerumaZ2dnYVCoVgsGoZhmqbINMVitr+9YhOzKqpjmqZls9mWlpa2trZ8Pq9pmqqq3EYZBSUy/6lUStM0XdczmYzjOL7v89cy/PsAgkBRFE3TMpkMT5AzmYyu65qmpVKpCBeqEHD7OXLpdFrYz1+8aJoWqbf1cwjEdOq6zonAUUin04ILHIUoBJwCmUyGVxS4/6TTadu25XpbP7RfRkGeUT6duVyutbWVoxAhAiFEEV7AKaDrOmc7538qlcpkMrzMIrygn7NAloNUKpVOp7PZbC6Xa2lpyWaz3B1UVRW+oEQG6LrO7U8kEvxnfcm1P+81EBDIrq3rOvcIDkEqleK+EMMC4eccFM6i+pJrP3eEWIEXQAg5iLKAv1oSrxw5IoL/YqPBgNhuIhNBcIEDIT5j5FAeL/xC3l8g77sZEBDUL/bEezR5jRSFQMZPVVV5l0m/VcFr6mL9LhOxNKpBAMGWEzmoRPYaQbAlaUCsheUUoMleI97tvwMAb9/jcL6xmmYAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/rarrowdown.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgALAMQeAM/f5q7K28jb5NDg5rnR377V4MPY4rTO3cXZ47jQ3rfQ3sHW4bLM3KzI2tHh56/L29Lh58fb473U4LPN3bbP3q3J27XO3bvT37DL3MTY4r/V4c7f5sze5dTj6P///wAAACH5BAEAAB4ALAAAAAAWAAsAAAVuYCd2zsadaLo5Y+eJgGAsWm3XiyEAoud3G0SBoKBYjhaKglBAbFw+HyRSSEwwj0DggZkkChFIdLzJXA6YSqNRwRwumc14Xj5jtG64fE43WxgMFnp8hAAIEgQEEggAhI4DMjoDjpQdAwNQlI49lCEAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/rarrowleft.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwAWAMQeAM/f5q7K28jb5NDg5rnR377V4MPY4rTO3cXZ47jQ3rfQ3sHW4bLM3KzI2tHh56/L29Lh58fb473U4LPN3bbP3q3J27XO3bvT37DL3MTY4r/V4c7f5sze5dTj6P///wAAACH5BAEAAB4ALAAAAAALABYAAAVooCeOZEeenXmKqXpCG+COW4QIzrllRWFspN0lQVhwRoDM5TBRaI6eAWKJwVCeno5AYsFUHpZnZ2AgMAKNQJgzLp/T6+y2+41Hp4fqFepJLptYNEpERjo8PkA6NjgrHjAyjVkpkZKUWSEAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/rarrowright.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwAWAMQeAM/f5q7K28jb5NDg5rnR377V4MPY4rTO3cXZ47jQ3rfQ3sHW4bLM3KzI2tHh56/L29Lh58fb473U4LPN3bbP3q3J27XO3bvT37DL3MTY4r/V4c7f5sze5dTj6P///wAAACH5BAEAAB4ALAAAAAALABYAAAVlYOeNZNmJpXmmZAdsEOs5AhJt7GYURYaXnAUhcfEBNYrJoQggcTQUDGaJGIyelkcFY5EIRNhAI8AgGAad8Lh8Tmuy2+7X84xOL9UrUsl0ColGJDo8gSQ0Nj8mLzEsJyiNj40yJCEAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/rarrowup.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgALAMQeAM/f5q7K28jb5NDg5rnR377V4MPY4rTO3cXZ47jQ3rfQ3sHW4bLM3KzI2tHh56/L29Lh58fb473U4LPN3bbP3q3J27XO3bvT37DL3MTY4r/V4c7f5sze5dTj6P///wAAACH5BAEAAB4ALAAAAAAWAAsAAAVuoCeOZNeRaFoOw6m+3iAYhjDAKYBIBCEhANxok7lYGAzLJbMREi8HTCCAOSybr2e00mhUqlcVJFJITDCP6QMzSRQiEFRngygQFBSL3kJREAoIGy4eJgAzCxqJiokLNQAmhCYdDhsclpeYGw6SHSEAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/tl.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhzwMMAOZCAMXZ47/V4a/L27bP3rPN3brS373U4LLN3KzI2s7f5qzJ2sHW4bXP3bfQ3sbZ463K27HM3LvS37DL3NLh59Dg5sjb5NHh58LX4q7K28rc5MPY4sDW4ejv8szd5c/f5s3e5cnb5Mfa49Pi6LzT4P3+/vL298ba47vT3+Pt8NPh58vd5NTi6Pn7/Ozy9P7+/vj6+8ze5fH2+Ozy9eHr7+Ls8Orx9M7f5enw88TZ4r7V4LXO3a/K27LM3LnR363J28vd5e3z9avI2v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEIALAAAAADPAwwAAAf/gEKCg0IuMUCIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGZMoRCLDQrExQJHzAdP8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6cwdhDciFgk/ICEmAPY4+Pn6+/z9/v8AAwocSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQwq0NwjFBA8/KgDQsGBDgJc5YsqcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rd+VJQjQkJMji4EMDAiAgFCvRYy7at27dw/+PKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnkzZblohL0R4yABggYEIPRoMGM2AgY7TqFOrXs26tevXsGPLnk27tu3buHPr3s27t+/fwIMLH068uPHjyJMrX868ufPn0F+XHiBkhoUfDjyH1kGAwIEDPMKLH0++vPnz6NOrX8++vfv38OPLn0+/vv37+PPr38+/v///AAYo4IAEFmjggQgmqGB7B5CQQgIVXGBADwMQAIEEEgggwA4cdujhhyCGKOKIJJZo4okopqjiiiy26OKLMMYo44w01mjjjTjmqOOOPPbo449ABinkkEQWeaKGJVDwA8wAAUTQgIUCYPCAD1RWaeWVWGap5ZZcdunll2CGKeaYZJZp5plopqnmmmy26eabcMYp55x01mnnnXjmqeeefPY5Zgs2gKDBhDpAIMADCiiAAAJBNOroo5BGKumklFZq6aWYZqrpppx26umnoIYq6qiklmrqqaimquqqrLbq6quwxirrrLTWaiumi3LwQQgLnPCkBBgocOuwxBZr7LHIJqvsssw26+yz0EYr7bSfcqCCAxsUMMABhwpL7bfghivuuOSWa+656Kar7rqQBgIAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/tl.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAA88AAAAMCAMAAABrwX92AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAMlQTFRFxdnjv9Xhr8vbts/es83dutLfvdTgss3crMjazt/mrMnawdbhtc/dt9Dextnjrcrbsczcu9LfsMvc0uHn0ODmyNvk0eHnwtfirsrbytzkw9jiwNbh6O/yzN3lz9/mzd7lydvkx9rj0+LovNPg/f7+8vb3xtrju9Pf4+3w0+Hny93k1OLo+fv87PL0/v7++Pr7zN7l8fb47PL14evv4uzw6vH0zt/l6fDzxNnivtXgtc7dr8rbsszcudHfrcnby93l7fP1q8ja////pkJuwAAAAEN0Uk5T////////////////////////////////////////////////////////////////////////////////////////AEFiBO8AAADcSURBVHja7NUHTsNAFITht9XdcUnvCZ0UejMsC77/obDCKZ403xFG+jXU/js+/AAAb490qnn/vKv70ep+4QGArcWp57ftMPLrzSURvQMAU13AXc7X9dIPaJrMhBAfAMCUEF3PL3U0yUfCnpXGOADgyhhq77bLCSW2dJlSKk0bAGApTRW1T0OfJ9ZljdZB8AUAbAV0fhMNRtYpXVSVlJ8AwJWUdNH3JMpMF3Lc+wYAzujwup5a1xSyF8dh+AsAXIUhzVeb5CrT1TjGHADM0fw2nxkVdPeMMQCY+xNgAGxG2LimrQDhAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/tr.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhDAAyAOZsAK7K26zJ2qu+x7DL3LLN3K3J26+8wbrS37bP3rjQ3rDJ2K7Dz8DW4bHJ2LrR3cjb5MXY4Mnb48nb4bjK0rDFz7TAxb3S3rHCyrbI0bvT37zT4LfO3LHM3LrO17fO2rC/xbfM1rvS38ze5bTK1c3d5LfQ3rTH0bLG0L7N0sDR2MHO1MnZ37TO3bbFy7LL28DV4LHK2q/AybPJ1a/Ez6u7w8nX3ay/yKq7wrDI1LvQ3LXM2sTY4b7S3K27wL7V4L3Q17O/xa2/yMLU3c/e5LTM27vM0q67wK/K28PX4bPN3bDK2q6+xLjFyr3Kz7XO3bPDysTU26/L26y8w83c4rjGy8fa48LR1628w66/yMHV3rLK2bHI1cLX4rPAxcbV2rDH1MbZ48zd5Kq+x63Dzqq6wq3K26y6wKzI2q/I2K/H1K/J2qvI2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAGwALAAAAAAMADIAAAf9gGyCg4SCImEkQ1M1hWxgVQ8REiteKoQMDFxIOxBQVk2DBxkaPi9ZQikoTIIIJQkHIRY8P0VUQGwESSwICQ45HRMtFWxRAxwEThseIBhPXWwFAAADBEQ6IyYXHwZnAdEDLloyJzFLBmtrZwVHMA1bFFhX5+gBAEoKODNBUkboa/VqFHxZYINGD38A0aRZIOCGGYRl1CgcI4DMQ3RnIk6seDGdxjQULfrLKBGkGJEYP4452ZHkRJYjVcJMWXIlSo81Z+J8edOlyZ4ygeYUyrNlUKNDkRaNmZTpUppPd/5UOtVpVahXpdqkutVqV6xfter0GZbs2KNezzYFq7ZoIAA7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/tr.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAwAAAAyCAMAAABf28oIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUdQTFRFrsrbrMnaq77HsMvcss3crcnbr7zButLfts/euNDesMnYrsPPwNbhscnYutHdyNvkxdjgydvjydvhuMrSsMXPtMDFvdLescLKtsjRu9PfvNPgt87csczcus7Xt87asL/Ft8zWu9LfzN7ltMrVzd3kt9DetMfRssbQvs3SwNHYwc7UydnftM7dtsXLssvbwNXgscrar8DJs8nVr8TPq7vDydfdrL/IqrvCsMjUu9DctczaxNjhvtLcrbvAvtXgvdDXs7/Frb/IwtTdz97ktMzbu8zSrrvAr8rbw9fhs83dsMrarr7EuMXKvcrPtc7ds8PKxNTbr8vbrLzDzdziuMbLx9rjwtHXrbzDrr/IwdXessrZscjVwtfis8DFxtXasMfUxtnjzN3kqr7HrcPOqrrCrcrbrLrArMjar8jYr8fUr8naq8jaAAAAZmJJ4wAAAG10Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AC221EsAAACxSURBVHjaYshBAgxKiSrOwaZQTkIov6CQdpwWmMPDE+NhLRAQ5gvisEtK2elHOmlq+AA5HKqc7IpiNvauIQ45DCyeOhycfJaywrqiOQyBzDIsftJyChL+sTkMrAwMzCwuVspq4vJsDOmMrAzMelFG6obebAzZ2ems7ga80SIR4SBONiODF5eFsWOQG4STxRXPbWZiC+VkZHIzmaeBOalATjJTCpiTToCTNMoZ7ByAAAMAMXnTwpvpjk4AAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/wait.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhKwALAPEAADc8QP///5ianP///yH/C05FVFNDQVBFMi4wAwEAAAAh/h1CdWlsdCB3aXRoIEdJRiBNb3ZpZSBHZWFyIDQuMAAh/hVNYWRlIGJ5IEFqYXhMb2FkLmluZm8AIfkECQoAAAAsAAAAACsACwAAAjKEjgjLltnYg/PFChveVvPLheA2hlhZoWYnfd6avqcMZy1J14fKLvrEs/k+uKAgMkwVAAAh+QQJCgAAACwAAAAAKwALAAACPcSOCMsgD2FjsZqEx6x885hh3veMZJiYn8qhSkNKcCy4B2vNsa3pJA6yAWUUGm9Y8n2Oyk7T4posYlLHrwAAIfkECQoAAAAsAAAAACsACwAAAj2EjgjLMA9hY6maalvcb+IPChO3eeF5jKTUoKi6DqYLwutMYzaJ58nO6flSmpisNcwwjEfK6fKZLGJSqK4AACH5BAkKAAAALAAAAAArAAsAAAJAhI4Iy5bZ2JiUugcbfrH6uWVMqDSfRx5RKnQnxa6p+w6xNpu1nY/9suORZENd7eYrSnbIRRMQvGAizhAV+gIUAAA7AAAAAAAAAAAA]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSBhcnJheSgnbGliL2pxdWVyeS5ob3ZlckludGVudC5qcycsJ2xpYi9qcXVlcnkuYmdpZnJhbWUubWluLmpzJywnanF1ZXJ5LmNsdWV0aXAubWluLmpzJyk7CiRpbmZvWydjc3MnXSA9ICdqcXVlcnkuY2x1ZXRpcC5jc3MnOwokaW5mb1snZGVwZW5kcyddID0gJ2pxdWVyeSc7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.cluetip.all.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBjbHVlVGlwIHBsdWdpbiB2MS4yLjcKICoKICogRGF0ZTogU2F0IE9jdCAxMyAxNzoxNzo0NyAyMDEyIEVEVAogKiBSZXF1aXJlczogalF1ZXJ5IHYxLjMrCiAqCiAqIENvcHlyaWdodCAyMDEyLCBLYXJsIFN3ZWRiZXJnCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAogKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwKICoKICoKICogRXhhbXBsZXMgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly9wbHVnaW5zLmxlYXJuaW5nanF1ZXJ5LmNvbS9jbHVldGlwL2RlbW8vCiAqCiovCgooZnVuY3Rpb24oJCkgewoKICAkLmNsdWV0aXAgPSB7CiAgICB2ZXJzaW9uOiAnMS4yLjcnLAoKICAgIC8vIHRoZSBIVE1MIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgdG9vbHRpcAogICAgdGVtcGxhdGU6IFsnPGRpdj4nLAogICAgICAnPGRpdiBjbGFzcz0iY2x1ZXRpcC1vdXRlciI+JywKICAgICAgICAnPGgzIGNsYXNzPSJjbHVldGlwLXRpdGxlIHVpLXdpZGdldC1oZWFkZXIgdWktY2x1ZXRpcC1oZWFkZXIiPjwvaDM+JywKICAgICAgICAnPGRpdiBjbGFzcz0iY2x1ZXRpcC1pbm5lciB1aS13aWRnZXQtY29udGVudCB1aS1jbHVldGlwLWNvbnRlbnQiPjwvZGl2PicsCiAgICAgICc8L2Rpdj4nLAogICAgICAnPGRpdiBjbGFzcz0iY2x1ZXRpcC1leHRyYSI+PC9kaXY+JywKICAgICc8L2Rpdj4nXS5qb2luKCcnKSwKCiAgICAvKiBjbHVlVGlwIHNldHVwCiAgICAgKiAgdGhlIHNldHVwIG9wdGlvbnMgYXJlIGFwcGxpZWQgZWFjaCB0aW1lIC5jbHVldGlwKCkgaXMgY2FsbGVkLAogICAgICogIEJVVCBvbmx5IGlmIDxkaXYgaWQ9ImNsdWV0aXAiPiBpcyBub3QgYWxyZWFkeSBpbiB0aGUgZG9jdW1lbnQKICAgICovCiAgICBzZXR1cDogewogICAgICAvLyBtZXRob2QgdG8gYmUgdXNlZCBmb3IgaW5zZXJ0aW5nIHRoZSBjbHVlVGlwIGludG8gdGhlIERPTS4KICAgICAgLy8gUGVybWl0dGVkIHZhbHVlcyBhcmUgJ2FwcGVuZFRvJywgJ3ByZXBlbmRUbycsICdpbnNlcnRCZWZvcmUnLCBhbmQgJ2luc2VydEFmdGVyJwogICAgICBpbnNlcnRpb25UeXBlOiAnYXBwZW5kVG8nLAogICAgICAvLyBlbGVtZW50IGluIHRoZSBET00gdGhlIHBsdWdpbiB3aWxsIHJlZmVyZW5jZSB3aGVuIGluc2VydGluZyB0aGUgY2x1ZVRpcC4KICAgICAgaW5zZXJ0aW9uRWxlbWVudDogJ2JvZHknCiAgICB9LAoKICAgIC8qCiAgICAgKiBjbHVlVGlwIG9wdGlvbnMKICAgICAqCiAgICAgKiBlYWNoIG9uZSBjYW4gYmUgZXhwbGljaXRseSBvdmVycmlkZGVuIGJ5IGNoYW5naW5nIGl0cyB2YWx1ZS4KICAgICAqIGZvciBleGFtcGxlOiAkLmNsdWV0aXAuZGVmYXVsdHMud2lkdGggPSAyMDA7CiAgICAgKiAgICAgICAgIG9yOiAkLmZuLmNsdWV0aXAuZGVmYXVsdHMud2lkdGggPSAyMDA7IC8vIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgY2x1ZVRpcCB2ZXJzaW9ucwogICAgICogd291bGQgY2hhbmdlIHRoZSBkZWZhdWx0IHdpZHRoIGZvciBhbGwgY2x1ZVRpcHMgdG8gMjAwLgogICAgICoKICAgICAqIGVhY2ggb25lIGNhbiBhbHNvIGJlIG92ZXJyaWRkZW4gYnkgcGFzc2luZyBhbiBvcHRpb25zIG1hcCB0byB0aGUgY2x1ZXRpcCBtZXRob2QuCiAgICAgKiBmb3IgZXhhbXBsZTogJCgnYS5leGFtcGxlJykuY2x1ZXRpcCh7d2lkdGg6IDIwMH0pOwogICAgICogd291bGQgY2hhbmdlIHRoZSBkZWZhdWx0IHdpZHRoIHRvIDIwMCBmb3IgY2x1ZVRpcHMgaW52b2tlZCBieSBhIGxpbmsgd2l0aCBjbGFzcyBvZiAiZXhhbXBsZSIKICAgICAqCiAgICAqLwogICAgZGVmYXVsdHM6IHsKICAgICAgbXVsdGlwbGU6ICAgICAgICAgZmFsc2UsICAgIC8vIEFsbG93IGEgbmV3IHRvb2x0aXAgdG8gYmUgY3JlYXRlZCBmb3IgZWFjaCAuY2x1ZXRpcCgpIGNhbGwKICAgICAgd2lkdGg6ICAgICAgICAgICAgMjc1LCAgICAgIC8vIFRoZSB3aWR0aCBvZiB0aGUgY2x1ZVRpcAogICAgICBoZWlnaHQ6ICAgICAgICAgICAnYXV0bycsICAgLy8gVGhlIGhlaWdodCBvZiB0aGUgY2x1ZVRpcAogICAgICBjbHVlekluZGV4OiAgICAgICA5NywgICAgICAgLy8gU2V0cyB0aGUgei1pbmRleCBzdHlsZSBwcm9wZXJ0eSBvZiB0aGUgY2x1ZVRpcAogICAgICBwb3NpdGlvbkJ5OiAgICAgICAnYXV0bycsICAgLy8gU2V0cyB0aGUgdHlwZSBvZiBwb3NpdGlvbmluZzogJ2F1dG8nLCAnbW91c2UnLCdib3R0b21Ub3AnLCAndG9wQm90dG9tJywgZml4ZWQnCiAgICAgIHRvcE9mZnNldDogICAgICAgIDE1LCAgICAgICAvLyBOdW1iZXIgb2YgcHggdG8gb2Zmc2V0IGNsdWVUaXAgZnJvbSB0b3Agb2YgaW52b2tpbmcgZWxlbWVudAogICAgICBsZWZ0T2Zmc2V0OiAgICAgICAxNSwgICAgICAgLy8gTnVtYmVyIG9mIHB4IHRvIG9mZnNldCBjbHVlVGlwIGZyb20gbGVmdCBvZiBpbnZva2luZyBlbGVtZW50CiAgICAgIHNuYXBUb0VkZ2U6ICAgICAgIGZhbHNlLCAgICAvLyBGb3IgYm90dG9tVG9wIGFuZCB0b3BCb3R0b20sIHNuYXAgdG8gdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIGVsZW1lbnQuCiAgICAgIGxvY2FsOiAgICAgICAgICAgIGZhbHNlLCAgICAvLyBXaGV0aGVyIHRvIHVzZSBjb250ZW50IGZyb20gdGhlIHNhbWUgcGFnZSBmb3IgdGhlIGNsdWVUaXAncyBib2R5CiAgICAgIGxvY2FsUHJlZml4OiAgICAgIG51bGwsICAgICAvLyBzdHJpbmcgdG8gYmUgcHJlcGVuZGVkIHRvIHRoZSB0aXAgYXR0cmlidXRlIGlmIGxvY2FsIGlzIHRydWUKICAgICAgbG9jYWxJZFN1ZmZpeDogICAgbnVsbCwgICAgIC8vIHN0cmluZyB0byBiZSBhcHBlbmRlZCB0byB0aGUgY2x1ZXRpcCBjb250ZW50IGVsZW1lbnQncyBpZCBpZiBsb2NhbCBpcyB0cnVlCiAgICAgIGhpZGVMb2NhbDogICAgICAgIHRydWUsICAgICAvLyBJZiBsb2NhbCBvcHRpb24gaXMgc2V0IHRvIHRydWUsIHRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIGxvY2FsIGNvbnRlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIHNob3duIGluIGNsdWVUaXAgc2hvdWxkIGJlIGhpZGRlbiBhdCBpdHMgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgYXR0cmlidXRlOiAgICAgICAgJ3JlbCcsICAgIC8vIHRoZSBhdHRyaWJ1dGUgdG8gYmUgdXNlZCBmb3IgZmV0Y2hpbmcgdGhlIGNsdWVUaXAncyBib2R5IGNvbnRlbnQKICAgICAgdGl0bGVBdHRyaWJ1dGU6ICAgJ3RpdGxlJywgIC8vIHRoZSBhdHRyaWJ1dGUgdG8gYmUgdXNlZCBmb3IgZmV0Y2hpbmcgdGhlIGNsdWVUaXAncyB0aXRsZQogICAgICBzcGxpdFRpdGxlOiAgICAgICAnJywgICAgICAgLy8gQSBjaGFyYWN0ZXIgdXNlZCB0byBzcGxpdCB0aGUgdGl0bGUgYXR0cmlidXRlIGludG8gdGhlIGNsdWVUaXAgdGl0bGUgYW5kIGRpdnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgY2x1ZVRpcCBib2R5LiBtb3JlIGluZm8gYmVsb3cgWzZdCiAgICAgIGVzY2FwZVRpdGxlOiAgICAgIGZhbHNlLCAgICAvLyB3aGV0aGVyIHRvIGh0bWwgZXNjYXBlIHRoZSB0aXRsZSBhdHRyaWJ1dGUKICAgICAgc2hvd1RpdGxlOiAgICAgICAgdHJ1ZSwgICAgIC8vIHNob3cgdGl0bGUgYmFyIG9mIHRoZSBjbHVlVGlwLCBldmVuIGlmIHRpdGxlIGF0dHJpYnV0ZSBub3Qgc2V0CiAgICAgIGNsdWV0aXBDbGFzczogICAgICdkZWZhdWx0JywvLyBjbGFzcyBhZGRlZCB0byBvdXRlcm1vc3QgY2x1ZVRpcCBkaXYgaW4gdGhlIGZvcm0gb2YgJ2NsdWV0aXAtJyArIGNsdWVUaXBDbGFzcy4KICAgICAgaG92ZXJDbGFzczogICAgICAgJycsICAgICAgIC8vIGNsYXNzIGFwcGxpZWQgdG8gdGhlIGludm9raW5nIGVsZW1lbnQgb25tb3VzZW92ZXIgYW5kIHJlbW92ZWQgb25tb3VzZW91dAogICAgICB3YWl0SW1hZ2U6ICAgICAgICB0cnVlLCAgICAgLy8gd2hldGhlciB0byBzaG93IGEgImxvYWRpbmciIGltZywgd2hpY2ggaXMgc2V0IGluIGpxdWVyeS5jbHVldGlwLmNzcwogICAgICBjdXJzb3I6ICAgICAgICAgICAnaGVscCcsCiAgICAgIGFycm93czogICAgICAgICAgIGZhbHNlLCAgICAvLyBpZiB0cnVlLCBkaXNwbGF5cyBhcnJvdyBvbiBhcHByb3ByaWF0ZSBzaWRlIG9mIGNsdWVUaXAKICAgICAgZHJvcFNoYWRvdzogICAgICAgdHJ1ZSwgICAgIC8vIHNldCB0byBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgZHJvcC1zaGFkb3cgZWZmZWN0IG9uIHRoZSBjbHVlVGlwCiAgICAgIGRyb3BTaGFkb3dTdGVwczogIDYsICAgICAgICAvLyBhZGp1c3RzIHRoZSBzaXplIG9mIHRoZSBkcm9wIHNoYWRvdwogICAgICBzdGlja3k6ICAgICAgICAgICBmYWxzZSwgICAgLy8ga2VlcCB2aXNpYmxlIHVudGlsIG1hbnVhbGx5IGNsb3NlZAogICAgICBtb3VzZU91dENsb3NlOiAgICBmYWxzZSwgICAgLy8gY2xvc2Ugd2hlbiBjbHVlVGlwIGlzIG1vdXNlZCBvdXQ6IGZhbHNlLCAnY2x1ZXRpcCcsICdsaW5rJywgJ2JvdGgnCiAgICAgIGRlbGF5ZWRDbG9zZTogICAgIDUwLCAgICAgICAgLy8gY2xvc2UgY2x1ZVRpcCBvbiBhIHRpbWVkIGRlbGF5CiAgICAgIGFjdGl2YXRpb246ICAgICAgICdob3ZlcicsICAvLyBzZXQgdG8gJ2NsaWNrJyB0byBmb3JjZSB1c2VyIHRvIGNsaWNrIHRvIHNob3cgY2x1ZVRpcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvICdmb2N1cycgdG8gc2hvdyBvbiBmb2N1cyBvZiBhIGZvcm0gZWxlbWVudCBhbmQgaGlkZSBvbiBibHVyCiAgICAgIGNsaWNrVGhyb3VnaDogICAgIHRydWUsICAgIC8vIGlmIHRydWUsIGFuZCBhY3RpdmF0aW9uIGlzIG5vdCAnY2xpY2snLCB0aGVuIGNsaWNraW5nIG9uIGxpbmsgd2lsbCB0YWtlIHVzZXIgdG8gdGhlIGxpbmsncyBocmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiBocmVmIGFuZCB0aXBBdHRyaWJ1dGUgYXJlIGVxdWFsCiAgICAgIHRyYWNraW5nOiAgICAgICAgIGZhbHNlLCAgICAvLyBpZiB0cnVlLCBjbHVlVGlwIHdpbGwgdHJhY2sgbW91c2UgbW92ZW1lbnQgKGV4cGVyaW1lbnRhbCkKICAgICAgY2xvc2VQb3NpdGlvbjogICAgJ3RvcCcsICAgIC8vIGxvY2F0aW9uIG9mIGNsb3NlIHRleHQgZm9yIHN0aWNreSBjbHVldGlwczsgY2FuIGJlICd0b3AnLCAnYm90dG9tJywgJ3RpdGxlJyBvciAnbm9uZScKICAgICAgY2xvc2VUZXh0OiAgICAgICAgJ0Nsb3NlJywgIC8vIHRleHQgKG9yIEhUTUwpIHRvIHRvIGJlIGNsaWNrZWQgdG8gY2xvc2Ugc3RpY2t5IGNsdWVUaXBzCiAgICAgIHRydW5jYXRlOiAgICAgICAgIDAsICAgICAgICAvLyBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB0cnVuY2F0ZSBjbHVlVGlwJ3MgY29udGVudHMuIGlmIDAsIG5vIHRydW5jYXRpb24gb2NjdXJzCgogICAgICAvLyBlZmZlY3QgYW5kIHNwZWVkIGZvciBvcGVuaW5nIGNsdWVUaXBzCiAgICAgIGZ4OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW46ICAgICAgICdzaG93JywgLy8gY2FuIGJlICdzaG93JyBvciAnc2xpZGVEb3duJyBvciAnZmFkZUluJwogICAgICAgICAgICAgICAgICAgICAgICBvcGVuU3BlZWQ6ICAnJwogICAgICB9LAoKICAgICAgLy8gc2V0dGluZ3MgZm9yIHdoZW4gaG92ZXJJbnRlbnQgcGx1Z2luIGlzIHVzZWQKICAgICAgaG92ZXJJbnRlbnQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc2l0aXZpdHk6ICAzLAogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbDogICAgIDUwLAogICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAgICAgIDAKICAgICAgfSwKCiAgICAgIC8vIHNob3J0LWNpcmN1aXQgZnVuY3Rpb24gdG8gcnVuIGp1c3QgYmVmb3JlIGNsdWVUaXAgaXMgc2hvd24uCiAgICAgIG9uQWN0aXZhdGU6ICAgICAgIGZ1bmN0aW9uKGUpIHtyZXR1cm4gdHJ1ZTt9LAogICAgICAvLyBmdW5jdGlvbiB0byBydW4ganVzdCBhZnRlciBjbHVlVGlwIGlzIHNob3duLgogICAgICBvblNob3c6ICAgICAgICAgICBmdW5jdGlvbihjdCwgY2kpe30sCiAgICAgIC8vIGZ1bmN0aW9uIHRvIHJ1biBqdXN0IGFmdGVyIGNsdWVUaXAgaXMgaGlkZGVuLgogICAgICBvbkhpZGU6ICAgICAgICAgICBmdW5jdGlvbihjdCwgY2kpe30sCiAgICAgIC8vIHdoZXRoZXIgdG8gY2FjaGUgcmVzdWx0cyBvZiBhamF4IHJlcXVlc3QgdG8gYXZvaWQgdW5uZWNlc3NhcnkgaGl0cyB0byBzZXJ2ZXIKICAgICAgYWpheENhY2hlOiAgICAgICAgdHJ1ZSwKCiAgICAgIC8vIHByb2Nlc3MgZGF0YSByZXRyaWV2ZWQgdmlhIHhociBiZWZvcmUgaXQncyBkaXNwbGF5ZWQKICAgICAgYWpheFByb2Nlc3M6ICAgICAgZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoLzwoc2NyaXB0fHN0eWxlfHRpdGxlKVtePF0rPFwvKHNjcmlwdHxzdHlsZXx0aXRsZSk+L2dtLCAnJykucmVwbGFjZSgvPChsaW5rfG1ldGEpW14+XSs+L2csJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICB9LAoKICAgICAgLy8gY2FuIHBhc3MgaW4gc3RhbmRhcmQgJC5hamF4KCkgcGFyYW1ldGVycy4gQ2FsbGJhY2sgZnVuY3Rpb25zLCBzdWNoIGFzIGJlZm9yZVNlbmQsCiAgICAgIC8vIHdpbGwgYmUgcXVldWVkIGZpcnN0IHdpdGhpbiB0aGUgZGVmYXVsdCBjYWxsYmFja3MuCiAgICAgIC8vIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBlcnJvciwgd2hpY2ggb3ZlcnJpZGVzIHRoZSBkZWZhdWx0CiAgICAgIGFqYXhTZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcjogZnVuY3Rpb24oY3QsIGNpKSB7IC8qIG92ZXJyaWRlIGRlZmF1bHQgZXJyb3IgY2FsbGJhY2sgKi8gfSwKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlU2VuZDogZnVuY3Rpb24oY3QsIGNpKSB7IC8qIGNhbGxlZCBmaXJzdCB3aXRoaW4gZGVmYXVsdCBiZWZvcmVTZW5kIGNhbGxiYWNrICovIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnaHRtbCcKICAgICAgfSwKICAgICAgZGVidWc6IGZhbHNlCgogICAgfQogIH07CiAgdmFyICRjbHVldGlwV2FpdCwKICAgICAgc3RhbmRhcmRDbGFzc2VzID0gJ2NsdWV0aXAgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNsdWV0aXAnLAogICAgICBjYWNoZXMgPSB7fSwKICAgICAgY291bnRlciA9IDAsCiAgICAgIGltZ0NvdW50ID0gMDsKCiAgLy8gdXNlICQuZm4ucHJvcCgpIGlmIGF2YWlsYWJsZSAoalF1ZXJ5IDEuNispOyBvdGhlcndpc2UsICQuZm4uYXR0cigpCiAgJC5mbi5hdHRyUHJvcCA9ICQuZm4ucHJvcCB8fCAkLmZuLmF0dHI7CgogIC8vIC5jbHVldGlwKCkgbWV0aG9kCiAgJC5mbi5jbHVldGlwID0gZnVuY3Rpb24oanMsIG9wdGlvbnMpIHsKICAgIHZhciAkY2x1ZXRpcCwgJGNsdWV0aXBJbm5lciwgJGNsdWV0aXBPdXRlciwgJGNsdWV0aXBUaXRsZSwgJGNsdWV0aXBBcnJvd3MsICRkcm9wU2hhZG93OwogICAgaWYgKHR5cGVvZiBqcyA9PSAnb2JqZWN0JykgewogICAgICBvcHRpb25zID0ganM7CiAgICAgIGpzID0gbnVsbDsKICAgIH0KICAgIGlmIChqcyA9PSAnZGVzdHJveScpIHsKICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoJ2NsdWV0aXAnKTsKICAgICAgaWYgKCBkYXRhICkgewogICAgICAgICQoZGF0YS5zZWxlY3RvcikucmVtb3ZlKCk7CiAgICAgICAgJC5yZW1vdmVEYXRhKHRoaXMsICd0aXRsZScpOwogICAgICAgICQucmVtb3ZlRGF0YSh0aGlzLCAnY2x1ZXRpcCcpOwogICAgICAgICQucmVtb3ZlRGF0YSh0aGlzLCAnY2x1ZXRpcE1vYycpOwogICAgICB9CiAgICAgICQoZG9jdW1lbnQpLnVuYmluZCgnLmNsdWV0aXAnKTsKICAgICAgcmV0dXJuIHRoaXMudW5iaW5kKCcuY2x1ZXRpcCcpOwogICAgfQoKICAgIC8vIG1lcmdlIHBlci1jYWxsIG9wdGlvbnMgd2l0aCBkZWZhdWx0cwogICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCAkLmNsdWV0aXAuZGVmYXVsdHMsIG9wdGlvbnMgfHwge30pOwoKICAgIC8qKiA9Y3JlYXRlIGNsdWV0aXAgZGl2cyAqKi8KICAgIGNvdW50ZXIrKzsKICAgIHZhciBjbHVlekluZGV4LAogICAgICAgIGNsdWV0aXBJZCA9ICQuY2x1ZXRpcC5iYWNrQ29tcGF0IHx8ICFvcHRpb25zLm11bHRpcGxlID8gJ2NsdWV0aXAnIDogJ2NsdWV0aXAtJyArIGNvdW50ZXIsCiAgICAgICAgY2x1ZXRpcFNlbGVjdG9yID0gJyMnICsgY2x1ZXRpcElkLAogICAgICAgIHByZWZpeCA9ICQuY2x1ZXRpcC5iYWNrQ29tcGF0ID8gJyMnIDogJy4nLAogICAgICAgIGluc2VydGlvblR5cGUgPSAkLmNsdWV0aXAuc2V0dXAuaW5zZXJ0aW9uVHlwZSwKICAgICAgICBpbnNlcnRpb25FbGVtZW50ID0gJC5jbHVldGlwLnNldHVwLmluc2VydGlvbkVsZW1lbnQgfHwgJ2JvZHknOwoKICAgIGluc2VydGlvblR5cGUgPSAoL2FwcGVuZFRvfHByZXBlbmRUb3xpbnNlcnRCZWZvcmV8aW5zZXJ0QWZ0ZXIvKS50ZXN0KGluc2VydGlvblR5cGUpID8gaW5zZXJ0aW9uVHlwZSA6ICdhcHBlbmRUbyc7CiAgICAkY2x1ZXRpcCA9ICQoY2x1ZXRpcFNlbGVjdG9yKTsKICAgIGlmICghJGNsdWV0aXAubGVuZ3RoKSB7CgogICAgICAkY2x1ZXRpcCA9ICQoJC5jbHVldGlwLnRlbXBsYXRlKQogICAgICBbaW5zZXJ0aW9uVHlwZV0oaW5zZXJ0aW9uRWxlbWVudCkKICAgICAgLmF0dHIoJ2lkJywgY2x1ZXRpcElkKQogICAgICAuY3NzKHtwb3NpdGlvbjogJ2Fic29sdXRlJywgZGlzcGxheTogJ25vbmUnfSk7CgogICAgICBjbHVlekluZGV4ID0gK29wdGlvbnMuY2x1ZXpJbmRleDsKICAgICAgJGNsdWV0aXBPdXRlciA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtb3V0ZXInKS5jc3Moe3Bvc2l0aW9uOiAncmVsYXRpdmUnLCB6SW5kZXg6IGNsdWV6SW5kZXh9KTsKICAgICAgJGNsdWV0aXBJbm5lciA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtaW5uZXInKTsKICAgICAgJGNsdWV0aXBUaXRsZSA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtdGl0bGUnKTsKCiAgICAgICRjbHVldGlwLmJpbmQoJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgJCh0aGlzKS5kYXRhKCdlbnRlcmVkJywgZXZlbnQudHlwZSA9PT0gJ21vdXNlZW50ZXInKTsKICAgICAgfSk7CiAgICB9CgogICAgJGNsdWV0aXBXYWl0ID0gJCgnI2NsdWV0aXAtd2FpdGltYWdlJyk7CiAgICBpZiAoISRjbHVldGlwV2FpdC5sZW5ndGggJiYgb3B0aW9ucy53YWl0SW1hZ2UpIHsKICAgICAgJGNsdWV0aXBXYWl0ID0gJCgnPGRpdj48L2Rpdj4nKS5hdHRyKCdpZCcsICdjbHVldGlwLXdhaXRpbWFnZScpLmNzcyh7cG9zaXRpb246ICdhYnNvbHV0ZSd9KTsKICAgICAgJGNsdWV0aXBXYWl0Lmluc2VydEJlZm9yZSgkY2x1ZXRpcCkuaGlkZSgpOwogICAgfQoKCiAgICB2YXIgY2x1ZXRpcFBhZGRpbmcgPSAocGFyc2VJbnQoJGNsdWV0aXAuY3NzKCdwYWRkaW5nTGVmdCcpLCAxMCkgfHwgMCkgKyAocGFyc2VJbnQoJGNsdWV0aXAuY3NzKCdwYWRkaW5nUmlnaHQnKSwgMTApIHx8IDApOwoKCiAgICB0aGlzLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgdmFyIGxpbmsgPSB0aGlzLAogICAgICAgICAgJGxpbmsgPSAkKHRoaXMpLAogICAgICAgICAgLy8gc3VwcG9ydCBtZXRhZGF0YSBwbHVnaW4gKHYxLjAgYW5kIDIuMCkKICAgICAgICAgIG9wdHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgb3B0aW9ucywgJC5tZXRhZGF0YSA/ICRsaW5rLm1ldGFkYXRhKCkgOiAkLm1ldGEgPyAkbGluay5kYXRhKCkgOiAkbGluay5kYXRhKCdjbHVldGlwJykgfHwge30pLAogICAgICAgICAgLy8gc3RhcnQgb3V0IHdpdGggbm8gY29udGVudHMgKGZvciBhamF4IGFjdGl2YXRpb24pCiAgICAgICAgICBjbHVldGlwQ29udGVudHMgPSBmYWxzZSwKICAgICAgICAgIGlzQWN0aXZlID0gZmFsc2UsCiAgICAgICAgICBjbG9zZU9uRGVsYXkgPSBudWxsLAogICAgICAgICAgdGlwQXR0cmlidXRlID0gb3B0c1tvcHRzLmF0dHJpYnV0ZV0gfHwKICAgICAgICAgICAgKCBvcHRzLmF0dHJpYnV0ZSA9PSAnaHJlZicgPyAkbGluay5hdHRyKG9wdHMuYXR0cmlidXRlKSA6ICRsaW5rLmF0dHJQcm9wKG9wdHMuYXR0cmlidXRlKSB8fCAkbGluay5hdHRyKG9wdHMuYXR0cmlidXRlKSApLAogICAgICAgICAgY3RDbGFzcyA9IG9wdHMuY2x1ZXRpcENsYXNzOwoKICAgICAgY2x1ZXpJbmRleCA9ICtvcHRzLmNsdWV6SW5kZXg7CiAgICAgICRsaW5rLmRhdGEoJ2NsdWV0aXAnLCB7dGl0bGU6IGxpbmsudGl0bGUsIHpJbmRleDogY2x1ZXpJbmRleCwgc2VsZWN0b3I6IGNsdWV0aXBTZWxlY3Rvcn0pOwoKICAgICAgaWYgKG9wdHMuYXJyb3dzICYmICEkY2x1ZXRpcC5maW5kKCcuY2x1ZXRpcC1hcnJvd3MnKS5sZW5ndGgpIHsKICAgICAgICAkY2x1ZXRpcC5hcHBlbmQoJzxkaXYgY2xhc3M9ImNsdWV0aXAtYXJyb3dzIHVpLXN0YXRlLWRlZmF1bHQiPjwvZGl2PicpOwogICAgICB9CgogICAgICBpZiAoIXRpcEF0dHJpYnV0ZSAmJiAhb3B0cy5zcGxpdFRpdGxlICYmICFqcykgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIC8vIGlmIGhpZGVMb2NhbCBpcyBzZXQgdG8gdHJ1ZSwgb24gRE9NIHJlYWR5IGhpZGUgdGhlIGxvY2FsIGNvbnRlbnQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgY2x1ZVRpcAogICAgICBpZiAob3B0cy5sb2NhbCAmJiBvcHRzLmxvY2FsUHJlZml4KSB7dGlwQXR0cmlidXRlID0gb3B0cy5sb2NhbFByZWZpeCArIHRpcEF0dHJpYnV0ZTt9CiAgICAgIGlmIChvcHRzLmxvY2FsICYmIG9wdHMuaGlkZUxvY2FsICYmIHRpcEF0dHJpYnV0ZSkgeyAkKHRpcEF0dHJpYnV0ZSArICc6Zmlyc3QnKS5oaWRlKCk7IH0KCiAgICAgIHZhciB0T2Zmc2V0ID0gcGFyc2VJbnQob3B0cy50b3BPZmZzZXQsIDEwKSwgbE9mZnNldCA9IHBhcnNlSW50KG9wdHMubGVmdE9mZnNldCwgMTApOwogICAgICAvLyB2ZXJ0aWNhbCBtZWFzdXJlbWVudCB2YXJpYWJsZXMKICAgICAgdmFyIHRpcEhlaWdodCwgd0hlaWdodCwKICAgICAgICAgIGRlZkhlaWdodCA9IGlzTmFOKHBhcnNlSW50KG9wdHMuaGVpZ2h0LCAxMCkpID8gJ2F1dG8nIDogKC9cRC9nKS50ZXN0KG9wdHMuaGVpZ2h0KSA/IG9wdHMuaGVpZ2h0IDogb3B0cy5oZWlnaHQgKyAncHgnOwogICAgICB2YXIgc1RvcCwgbGlua1RvcCwgbGlua0JvdHRvbSwgcG9zWSwgdGlwWSwgbW91c2VZLCBiYXNlbGluZTsKICAgICAgLy8gaG9yaXpvbnRhbCBtZWFzdXJlbWVudCB2YXJpYWJsZXMKICAgICAgdmFyIHRpcElubmVyV2lkdGggPSBwYXJzZUludChvcHRzLndpZHRoLCAxMCkgfHwgMjc1LAogICAgICAgICAgdGlwV2lkdGggPSB0aXBJbm5lcldpZHRoICsgY2x1ZXRpcFBhZGRpbmcgKyBvcHRzLmRyb3BTaGFkb3dTdGVwcywKICAgICAgICAgIGxpbmtXaWR0aCA9IHRoaXMub2Zmc2V0V2lkdGgsCiAgICAgICAgICBsaW5rTGVmdCwgcG9zWCwgdGlwWCwgbW91c2VYLCB3aW5XaWR0aDsKCiAgICAgIC8vIHBhcnNlIHRoZSB0aXRsZQogICAgICB2YXIgdGlwUGFydHM7CiAgICAgIHZhciB0aXBUaXRsZSA9IChvcHRzLmF0dHJpYnV0ZSAhPSAndGl0bGUnKSA/ICRsaW5rLmF0dHIob3B0cy50aXRsZUF0dHJpYnV0ZSkgfHwgJycgOiAnJzsKICAgICAgaWYgKG9wdHMuc3BsaXRUaXRsZSkgewogICAgICAgIHRpcFBhcnRzID0gdGlwVGl0bGUuc3BsaXQob3B0cy5zcGxpdFRpdGxlKTsKICAgICAgICB0aXBUaXRsZSA9IG9wdHMuc2hvd1RpdGxlIHx8IHRpcFBhcnRzWzBdID09PSAnJyA/IHRpcFBhcnRzLnNoaWZ0KCkgOiAnJzsKICAgICAgfQogICAgICBpZiAob3B0cy5lc2NhcGVUaXRsZSkgewogICAgICAgIHRpcFRpdGxlID0gdGlwVGl0bGUucmVwbGFjZSgvJi9nLCcmYW1wOycpLnJlcGxhY2UoLz4vZywnJmd0OycpLnJlcGxhY2UoLzwvZywnJmx0OycpOwogICAgICB9CgogICAgICB2YXIgbG9jYWxDb250ZW50OwogICAgICBmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHsgcmV0dXJuIGZhbHNlOyB9CgogICAgICAvLyBLZWVwIHRyYWNrIG9mIG1vdXNlIGVudGVyZWQgc3RhdGUgb24gbGluawogICAgICAkbGluay5iaW5kKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgIHZhciBkYXRhID0gJGxpbmsuZGF0YSgnY2x1ZXRpcCcpOwogICAgICAgIGRhdGEuZW50ZXJlZCA9IGV2ZW50LnR5cGUgPT09ICdlbnRlcmVkJzsKICAgICAgICAkbGluay5kYXRhKCdjbHVldGlwJywgZGF0YSk7CiAgICAgIH0pOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIEFDVElWQVRJT04KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vYWN0aXZhdGUgY2x1ZVRpcAogICAgdmFyIGFjdGl2YXRlID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgdmFyIHBZLCBhamF4TWVyZ2VkU2V0dGluZ3MsIGNhY2hlS2V5LAogICAgICAgICAgY29udGludWVPbiA9IG9wdHMub25BY3RpdmF0ZS5jYWxsKGxpbmssIGV2ZW50KTsKCiAgICAgIGlmIChjb250aW51ZU9uID09PSBmYWxzZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgaXNBY3RpdmUgPSB0cnVlOwoKICAgICAgLy8gYWN0aXZhdGUgZnVuY3Rpb24gbWF5IGdldCBjYWxsZWQgYWZ0ZXIgYW4gaW5pdGlhbGl6YXRpb24gb2YgYQogICAgICAvLyBkaWZmZXJlbnQgdGFyZ2V0IHNvIG5lZWQgdG8gcmUtZ2V0IHRoZSBDb3JyZWN0IENsdWV0aXAgb2JqZWN0IGhlcmUKICAgICAgJGNsdWV0aXAgPSAkKGNsdWV0aXBTZWxlY3RvcikuY3NzKHtwb3NpdGlvbjogJ2Fic29sdXRlJ30pOwogICAgICAkY2x1ZXRpcE91dGVyID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC1vdXRlcicpOwogICAgICAkY2x1ZXRpcElubmVyID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC1pbm5lcicpOwogICAgICAkY2x1ZXRpcFRpdGxlID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC10aXRsZScpOwogICAgICAkY2x1ZXRpcEFycm93cyA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtYXJyb3dzJyk7CiAgICAgICRjbHVldGlwLnJlbW92ZUNsYXNzKCkuY3NzKHt3aWR0aDogdGlwSW5uZXJXaWR0aH0pOwogICAgICBpZiAodGlwQXR0cmlidXRlID09ICRsaW5rLmF0dHIoJ2hyZWYnKSkgewogICAgICAgICRsaW5rLmNzcygnY3Vyc29yJywgb3B0cy5jdXJzb3IpOwogICAgICB9CiAgICAgIGlmIChvcHRzLmhvdmVyQ2xhc3MpIHsKICAgICAgICAkbGluay5hZGRDbGFzcyhvcHRzLmhvdmVyQ2xhc3MpOwogICAgICB9CiAgICAgIGxpbmtUb3AgPSBwb3NZID0gJGxpbmsub2Zmc2V0KCkudG9wOwogICAgICBsaW5rQm90dG9tID0gbGlua1RvcCArICRsaW5rLmlubmVySGVpZ2h0KCk7CiAgICAgIGxpbmtMZWZ0ID0gJGxpbmsub2Zmc2V0KCkubGVmdDsKCiAgICAgIC8vIEZJWDogKGJ1ZyA0NDEyKQogICAgICBsaW5rV2lkdGggPSAkbGluay5pbm5lcldpZHRoKCk7CiAgICAgIGlmICggZXZlbnQudHlwZSA9PSBmb2N1cyApIHsKICAgICAgICAvLyBpbiBmb2N1cyBldmVudCwgbm8gbW91c2UgcG9zaXRpb24gaXMgYXZhaWxhYmxlOyB0aGlzIGlzIG5lZWRlZCB3aXRoIGJvdHRvbVRvcDoKICAgICAgICBtb3VzZVggPSBsaW5rTGVmdCArICAoIGxpbmtXaWR0aCAvIDIgKSArIGxPZmZzZXQ7CiAgICAgICAgJGNsdWV0aXAuY3NzKHtsZWZ0OiBwb3NYfSk7CiAgICAgICAgbW91c2VZID0gcG9zWSArIHRPZmZzZXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbW91c2VYID0gZXZlbnQucGFnZVg7CiAgICAgICAgbW91c2VZID0gZXZlbnQucGFnZVk7CiAgICAgIH0KICAgICAgLy9FTkQgT0YgRklYCgogICAgICBpZiAobGluay50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2FyZWEnKSB7CiAgICAgICAgc1RvcCA9ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpOwogICAgICAgIHdpbldpZHRoID0gJCh3aW5kb3cpLndpZHRoKCk7CiAgICAgIH0KLy8gcG9zaXRpb24gY2x1ZVRpcCBob3Jpem9udGFsbHkKICAgICAgaWYgKG9wdHMucG9zaXRpb25CeSA9PSAnZml4ZWQnKSB7CiAgICAgICAgcG9zWCA9IGxpbmtXaWR0aCArIGxpbmtMZWZ0ICsgbE9mZnNldDsKICAgICAgICAkY2x1ZXRpcC5jc3Moe2xlZnQ6IHBvc1h9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwb3NYID0gKGxpbmtXaWR0aCA+IGxpbmtMZWZ0ICYmIGxpbmtMZWZ0ID4gdGlwV2lkdGgpIHx8CiAgICAgICAgICBsaW5rTGVmdCArIGxpbmtXaWR0aCArIHRpcFdpZHRoICsgbE9mZnNldCA+IHdpbldpZHRoID8KICAgICAgICAgIGxpbmtMZWZ0IC0gdGlwV2lkdGggLSBsT2Zmc2V0IDoKICAgICAgICAgIGxpbmtXaWR0aCArIGxpbmtMZWZ0ICsgbE9mZnNldDsKICAgICAgICBpZiAobGluay50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2FyZWEnIHx8IG9wdHMucG9zaXRpb25CeSA9PSAnbW91c2UnIHx8IGxpbmtXaWR0aCArIHRpcFdpZHRoID4gd2luV2lkdGgpIHsgLy8gcG9zaXRpb24gYnkgbW91c2UKICAgICAgICAgIGlmIChtb3VzZVggKyAyMCArIHRpcFdpZHRoID4gd2luV2lkdGgpIHsKICAgICAgICAgICAgJGNsdWV0aXAuYWRkQ2xhc3MoJ2NsdWV0aXAtJyArIGN0Q2xhc3MpOwogICAgICAgICAgICBwb3NYID0gKG1vdXNlWCAtIHRpcFdpZHRoIC0gbE9mZnNldCkgPj0gMCA/IG1vdXNlWCAtIHRpcFdpZHRoIC0gbE9mZnNldCAtIHBhcnNlSW50KCRjbHVldGlwLmNzcygnbWFyZ2luTGVmdCcpLDEwKSArIHBhcnNlSW50KCRjbHVldGlwSW5uZXIuY3NzKCdtYXJnaW5SaWdodCcpLDEwKSA6ICBtb3VzZVggLSAodGlwV2lkdGgvMik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwb3NYID0gbW91c2VYICsgbE9mZnNldDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcFkgPSBwb3NYIDwgMCA/IGV2ZW50LnBhZ2VZICsgdE9mZnNldCA6IGV2ZW50LnBhZ2VZOwogICAgICAgIGlmIChwb3NYIDwgMCB8fCBvcHRzLnBvc2l0aW9uQnkgPT0gJ2JvdHRvbVRvcCcgIHx8IG9wdHMucG9zaXRpb25CeSA9PSAndG9wQm90dG9tJykgewogICAgICAgICAgcG9zWCA9IChtb3VzZVggKyAodGlwV2lkdGgvMikgPiB3aW5XaWR0aCkgPyB3aW5XaWR0aC8yIC0gdGlwV2lkdGgvMiA6IE1hdGgubWF4KG1vdXNlWCAtICh0aXBXaWR0aC8yKSwwKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICRjbHVldGlwQXJyb3dzLmNzcyh7ekluZGV4OiAkbGluay5kYXRhKCdjbHVldGlwJykuekluZGV4KzF9KTsKICAgICAgJGNsdWV0aXAuY3NzKHsKICAgICAgICBsZWZ0OiBwb3NYLAogICAgICAgIHpJbmRleDogJGxpbmsuZGF0YSgnY2x1ZXRpcCcpLnpJbmRleAogICAgICB9KTsKICAgICAgd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBsb2FkIGEgc3RyaW5nIGZyb20gY2x1ZXRpcCBtZXRob2QncyBmaXJzdCBhcmd1bWVudAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgIGlmIChqcykgewogICAgICAgIGlmICh0eXBlb2YganMgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAganMgPSBqcy5jYWxsKGxpbmspOwogICAgICAgIH0KICAgICAgICAkY2x1ZXRpcElubmVyLmh0bWwoanMpOwogICAgICAgIGNsdWV0aXBTaG93KHBZKTsKICAgICAgfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbG9hZCB0aGUgdGl0bGUgYXR0cmlidXRlIG9ubHkgKG9yIHVzZXItc2VsZWN0ZWQgYXR0cmlidXRlKS4KKiBjbHVlVGlwIHRpdGxlIGlzIHRoZSBzdHJpbmcgYmVmb3JlIHRoZSBmaXJzdCBkZWxpbWl0ZXIKKiBzdWJzZXF1ZW50IGRlbGltaXRlcnMgcGxhY2UgY2x1ZVRpcCBib2R5IHRleHQgb24gc2VwYXJhdGUgbGluZXMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgZWxzZSBpZiAodGlwUGFydHMpIHsKICAgICAgICB2YXIgdHBsID0gdGlwUGFydHMubGVuZ3RoOwogICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCh0cGwgPyB0aXBQYXJ0c1swXSA6ICcnKTsKICAgICAgICBpZiAodHBsID4gMSkgewogICAgICAgICAgZm9yICh2YXIgaT0xOyBpIDwgdHBsOyBpKyspewogICAgICAgICAgICAkY2x1ZXRpcElubmVyLmFwcGVuZCgnPGRpdiBjbGFzcz0ic3BsaXQtYm9keSI+JyArIHRpcFBhcnRzW2ldICsgJzwvZGl2PicpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjbHVldGlwU2hvdyhwWSk7CiAgICAgIH0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGxvYWQgZXh0ZXJuYWwgZmlsZSB2aWEgYWpheAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICBlbHNlIGlmICggIW9wdHMubG9jYWwgJiYgdGlwQXR0cmlidXRlLmluZGV4T2YoJyMnKSAhPT0gMCApIHsKICAgICAgICBpZiAoL1wuKGpwZT9nfHRpZmY/fGdpZnxwbmcpKD86XD8uKik/JC9pLnRlc3QodGlwQXR0cmlidXRlKSkgewogICAgICAgICAgJGNsdWV0aXBJbm5lci5odG1sKCc8aW1nIHNyYz0iJyArIHRpcEF0dHJpYnV0ZSArICciIGFsdD0iJyArIHRpcFRpdGxlICsgJyIgLz4nKTsKICAgICAgICAgIGNsdWV0aXBTaG93KHBZKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIG9wdGlvbkJlZm9yZVNlbmQgPSBvcHRzLmFqYXhTZXR0aW5ncy5iZWZvcmVTZW5kLAogICAgICAgICAgICAgIG9wdGlvbkVycm9yID0gb3B0cy5hamF4U2V0dGluZ3MuZXJyb3IsCiAgICAgICAgICAgICAgb3B0aW9uU3VjY2VzcyA9IG9wdHMuYWpheFNldHRpbmdzLnN1Y2Nlc3MsCiAgICAgICAgICAgICAgb3B0aW9uQ29tcGxldGUgPSBvcHRzLmFqYXhTZXR0aW5ncy5jb21wbGV0ZTsKCiAgICAgICAgICBjYWNoZUtleSA9IGdldENhY2hlS2V5KHRpcEF0dHJpYnV0ZSwgb3B0cy5hamF4U2V0dGluZ3MuZGF0YSk7CgogICAgICAgICAgdmFyIGFqYXhTZXR0aW5ncyA9IHsKICAgICAgICAgICAgY2FjaGU6IG9wdHMuYWpheENhY2hlLCAvLyBmb3JjZSByZXF1ZXN0ZWQgcGFnZSBub3QgdG8gYmUgY2FjaGVkIGJ5IGJyb3dzZXIKICAgICAgICAgICAgdXJsOiB0aXBBdHRyaWJ1dGUsCiAgICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKHhociwgc2V0dGluZ3MpIHsKICAgICAgICAgICAgICBpZiAob3B0aW9uQmVmb3JlU2VuZCkge29wdGlvbkJlZm9yZVNlbmQuY2FsbChsaW5rLCB4aHIsICRjbHVldGlwLCAkY2x1ZXRpcElubmVyLCBzZXR0aW5ncyk7fQogICAgICAgICAgICAgICRjbHVldGlwT3V0ZXIuY2hpbGRyZW4oKS5lbXB0eSgpOwogICAgICAgICAgICAgIGlmIChvcHRzLndhaXRJbWFnZSkgewogICAgICAgICAgICAgICAgJGNsdWV0aXBXYWl0CiAgICAgICAgICAgICAgICAuY3NzKHt0b3A6IG1vdXNlWSsyMCwgbGVmdDogbW91c2VYKzIwLCB6SW5kZXg6ICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS56SW5kZXgtMX0pCiAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKHhociwgdGV4dFN0YXR1cykgewogICAgICAgICAgICAgIGlmICggb3B0aW9ucy5hamF4Q2FjaGUgJiYgIWNhY2hlc1tjYWNoZUtleV0gKSB7CiAgICAgICAgICAgICAgICBjYWNoZXNbY2FjaGVLZXldID0ge3N0YXR1czogJ2Vycm9yJywgdGV4dFN0YXR1czogdGV4dFN0YXR1cywgeGhyOiB4aHJ9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgb3B0aW9uRXJyb3IuY2FsbChsaW5rLCB4aHIsIHRleHRTdGF0dXMsICRjbHVldGlwLCAkY2x1ZXRpcElubmVyKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCgnPGk+c29ycnksIHRoZSBjb250ZW50cyBjb3VsZCBub3QgYmUgbG9hZGVkPC9pPicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSwgdGV4dFN0YXR1cywgeGhyKSB7CiAgICAgICAgICAgICAgaWYgKCBvcHRpb25zLmFqYXhDYWNoZSAmJiAhY2FjaGVzW2NhY2hlS2V5XSApIHsKICAgICAgICAgICAgICAgIGNhY2hlc1tjYWNoZUtleV0gPSB7c3RhdHVzOiAnc3VjY2VzcycsIGRhdGE6IGRhdGEsIHRleHRTdGF0dXM6IHRleHRTdGF0dXMsIHhocjogeGhyfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNsdWV0aXBDb250ZW50cyA9IG9wdHMuYWpheFByb2Nlc3MuY2FsbChsaW5rLCBkYXRhKTsKCiAgICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGNoYW5naW5nIHRoZSB0aXRsZSBiYXNlZCBvbiBkYXRhIHJldHVybmVkIGJ5IHhocgogICAgICAgICAgICAgIGlmICggdHlwZW9mIGNsdWV0aXBDb250ZW50cyA9PSAnb2JqZWN0JyAmJiBjbHVldGlwQ29udGVudHMgIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICB0aXBUaXRsZSA9IGNsdWV0aXBDb250ZW50cy50aXRsZTsKICAgICAgICAgICAgICAgIGNsdWV0aXBDb250ZW50cyA9IGNsdWV0aXBDb250ZW50cy5jb250ZW50OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uU3VjY2VzcykgewogICAgICAgICAgICAgICAgICBvcHRpb25TdWNjZXNzLmNhbGwobGluaywgZGF0YSwgdGV4dFN0YXR1cywgJGNsdWV0aXAsICRjbHVldGlwSW5uZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGNsdWV0aXBJbm5lci5odG1sKGNsdWV0aXBDb250ZW50cyk7CgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKHhociwgdGV4dFN0YXR1cykgewogICAgICAgICAgICAgIGlmIChvcHRpb25Db21wbGV0ZSkgewogICAgICAgICAgICAgICAgb3B0aW9uQ29tcGxldGUuY2FsbChsaW5rLCB4aHIsIHRleHRTdGF0dXMsICRjbHVldGlwLCAkY2x1ZXRpcElubmVyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIGltZ3MgPSAkY2x1ZXRpcElubmVyWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTsKICAgICAgICAgICAgICBpbWdDb3VudCA9IGltZ3MubGVuZ3RoOwogICAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbCA9IGltZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoaW1nc1tpXS5jb21wbGV0ZSkgewogICAgICAgICAgICAgICAgICBpbWdDb3VudC0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoaW1nQ291bnQgJiYgISQuYnJvd3Nlci5vcGVyYSkgewogICAgICAgICAgICAgICAgJChpbWdzKS5iaW5kKCdsb2FkLmN0IGVycm9yLmN0JywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgIGltZ0NvdW50LS07CiAgICAgICAgICAgICAgICAgIGlmIChpbWdDb3VudCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICRjbHVldGlwV2FpdC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgJChpbWdzKS51bmJpbmQoJy5jdCcpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc0FjdGl2ZSkgeyBjbHVldGlwU2hvdyhwWSk7IH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRjbHVldGlwV2FpdC5oaWRlKCk7CiAgICAgICAgICAgICAgICBpZiAoaXNBY3RpdmUpIHsgY2x1ZXRpcFNob3cocFkpOyB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9OwoKICAgICAgICAgIGFqYXhNZXJnZWRTZXR0aW5ncyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBvcHRzLmFqYXhTZXR0aW5ncywgYWpheFNldHRpbmdzKTsKCiAgICAgICAgICBpZiAoIGNhY2hlc1tjYWNoZUtleV0gKSB7CiAgICAgICAgICAgIGNhY2hlZEFqYXgoIGNhY2hlc1tjYWNoZUtleV0sIGFqYXhNZXJnZWRTZXR0aW5ncyApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJC5hamF4KGFqYXhNZXJnZWRTZXR0aW5ncyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBsb2FkIGFuIGVsZW1lbnQgZnJvbSB0aGUgc2FtZSBwYWdlCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgZWxzZSBpZiAob3B0cy5sb2NhbCkgewogICAgICAgIHZhciAkbG9jYWxDb250ZW50ID0gJCh0aXBBdHRyaWJ1dGUgKyAoL14jXFMrJC8udGVzdCh0aXBBdHRyaWJ1dGUpID8gJycgOiAnOmVxKCcgKyBpbmRleCArICcpJykpLmNsb25lKHRydWUpLnNob3coKTsKICAgICAgICBpZiAob3B0cy5sb2NhbElkU3VmZml4KSB7CiAgICAgICAgICAkbG9jYWxDb250ZW50LmF0dHIoJ2lkJywgJGxvY2FsQ29udGVudFswXS5pZCArIG9wdHMubG9jYWxJZFN1ZmZpeCk7CiAgICAgICAgfQogICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCgkbG9jYWxDb250ZW50KTsKICAgICAgICBjbHVldGlwU2hvdyhwWSk7CiAgICAgIH0KICAgIH07CgovLyBnZXQgZGltZW5zaW9ucyBhbmQgb3B0aW9ucyBmb3IgY2x1ZXRpcCBhbmQgcHJlcGFyZSBpdCB0byBiZSBzaG93bgogICAgdmFyIGNsdWV0aXBTaG93ID0gZnVuY3Rpb24oYnBZKSB7CiAgICAgIHZhciAkY2xvc2VMaW5rLCBkeW5hbWljQ2xhc3NlcywgaGVpZ2h0RGlmZiwKICAgICAgICAgIHRpdGxlSFRNTCA9IHRpcFRpdGxlIHx8IG9wdHMuc2hvd1RpdGxlICYmICcmbmJzcDsnLAogICAgICAgICAgYmdZID0gJycsIGRpcmVjdGlvbiA9ICcnLCBpbnN1ZmZpY2llbnRYID0gZmFsc2U7CiAgICAgIHZhciBzdGlja3lDbG9zZSA9IHsKICAgICAgICBib3R0b206IGZ1bmN0aW9uKCRjTGluaykgewogICAgICAgICAgJGNMaW5rLmFwcGVuZFRvKCRjbHVldGlwSW5uZXIpOwogICAgICAgIH0sCiAgICAgICAgdG9wOiBmdW5jdGlvbigkY0xpbmspIHsKICAgICAgICAgICRjTGluay5wcmVwZW5kVG8oJGNsdWV0aXBJbm5lcik7CiAgICAgICAgfSwKICAgICAgICB0aXRsZTogZnVuY3Rpb24oJGNMaW5rKSB7CiAgICAgICAgICAkY0xpbmsucHJlcGVuZFRvKCRjbHVldGlwVGl0bGUpOwogICAgICAgIH0KICAgICAgfTsKCiAgICAgICRjbHVldGlwLmFkZENsYXNzKCdjbHVldGlwLScgKyBjdENsYXNzKTsKICAgICAgaWYgKG9wdHMudHJ1bmNhdGUpIHsKICAgICAgICB2YXIgJHRydW5jbG9hZGVkID0gJGNsdWV0aXBJbm5lci50ZXh0KCkuc2xpY2UoMCxvcHRzLnRydW5jYXRlKSArICcuLi4nOwogICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCgkdHJ1bmNsb2FkZWQpOwogICAgICB9CgogICAgICBpZiAodGl0bGVIVE1MKSB7CiAgICAgICAgJGNsdWV0aXBUaXRsZS5zaG93KCkuaHRtbCh0aXRsZUhUTUwpOwogICAgICB9IGVsc2UgewogICAgICAgICRjbHVldGlwVGl0bGUuaGlkZSgpOwogICAgICB9CgogICAgICBpZiAob3B0cy5zdGlja3kpIHsKICAgICAgICBpZiAoc3RpY2t5Q2xvc2Vbb3B0cy5jbG9zZVBvc2l0aW9uXSkgewogICAgICAgICAgJGNsb3NlTGluayA9ICQoJzxkaXYgY2xhc3M9ImNsdWV0aXAtY2xvc2UiPjxhIGhyZWY9IiMiPicgKyBvcHRzLmNsb3NlVGV4dCArICc8L2E+PC9kaXY+Jyk7CiAgICAgICAgICBzdGlja3lDbG9zZVtvcHRzLmNsb3NlUG9zaXRpb25dKCAkY2xvc2VMaW5rICk7CiAgICAgICAgICAkY2xvc2VMaW5rLmJpbmQoJ2NsaWNrLmNsdWV0aXAnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2x1ZXRpcENsb3NlKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAob3B0cy5tb3VzZU91dENsb3NlKSB7CiAgICAgICAgICAkbGluay51bmJpbmQoJ21vdXNlbGVhdmUuY2x1ZXRpcE1vYycpOwogICAgICAgICAgJGNsdWV0aXAudW5iaW5kKCdtb3VzZWxlYXZlLmNsdWV0aXBNb2MnKTsKICAgICAgICAgIGlmIChvcHRzLm1vdXNlT3V0Q2xvc2UgPT0gJ2JvdGgnIHx8IG9wdHMubW91c2VPdXRDbG9zZSA9PSAnY2x1ZXRpcCcgfHwgb3B0cy5tb3VzZU91dENsb3NlID09PSB0cnVlKSB7IC8vIHRydWUgaW1wbGllcyAnY2x1ZXRpcCcgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5CiAgICAgICAgICAgICRjbHVldGlwLmJpbmQoJ21vdXNlbGVhdmUuY2x1ZXRpcE1vYycsIG1vdXNlT3V0Q2xvc2UpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9wdHMubW91c2VPdXRDbG9zZSA9PSAnYm90aCcgfHwgb3B0cy5tb3VzZU91dENsb3NlID09ICdsaW5rJykgewogICAgICAgICAgICAkbGluay5iaW5kKCdtb3VzZWxlYXZlLmNsdWV0aXBNb2MnLCBtb3VzZU91dENsb3NlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCi8vIG5vdyB0aGF0IGNvbnRlbnQgaXMgbG9hZGVkLCBmaW5pc2ggdGhlIHBvc2l0aW9uaW5nCiAgICAgICRjbHVldGlwT3V0ZXIuY3NzKHt6SW5kZXg6ICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS56SW5kZXgsIG92ZXJmbG93OiBkZWZIZWlnaHQgPT0gJ2F1dG8nID8gJ3Zpc2libGUnIDogJ2F1dG8nLCBoZWlnaHQ6IGRlZkhlaWdodH0pOwogICAgICB0aXBIZWlnaHQgPSBkZWZIZWlnaHQgPT0gJ2F1dG8nID8gTWF0aC5tYXgoJGNsdWV0aXAub3V0ZXJIZWlnaHQoKSwkY2x1ZXRpcC5oZWlnaHQoKSkgOiBwYXJzZUludChkZWZIZWlnaHQsMTApOwogICAgICB0aXBZID0gcG9zWTsKICAgICAgYmFzZWxpbmUgPSBzVG9wICsgd0hlaWdodDsKICAgICAgaW5zdWZmaWNpZW50WCA9IChwb3NYIDwgbW91c2VYICYmIChNYXRoLm1heChwb3NYLCAwKSArIHRpcFdpZHRoID4gbW91c2VYKSk7CiAgICAgIGlmIChvcHRzLnBvc2l0aW9uQnkgPT0gJ2ZpeGVkJykgewogICAgICAgIHRpcFkgPSBwb3NZIC0gb3B0cy5kcm9wU2hhZG93U3RlcHMgKyB0T2Zmc2V0OwogICAgICB9IGVsc2UgaWYgKG9wdHMucG9zaXRpb25CeSA9PSAndG9wQm90dG9tJyB8fCBvcHRzLnBvc2l0aW9uQnkgPT0gJ2JvdHRvbVRvcCcgfHwgaW5zdWZmaWNpZW50WCkgewogICAgICAgIGlmIChvcHRzLnBvc2l0aW9uQnkgPT0gJ3RvcEJvdHRvbScpIHsKICAgICAgICAgIGlmIChwb3NZICsgdGlwSGVpZ2h0ICsgdE9mZnNldCA8IGJhc2VsaW5lICYmIG1vdXNlWSAtIHNUb3AgPCB0aXBIZWlnaHQgKyB0T2Zmc2V0KSB7CiAgICAgICAgICAgIGRpcmVjdGlvbiA9ICdib3R0b20nOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZGlyZWN0aW9uID0gJ3RvcCc7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChvcHRzLnBvc2l0aW9uQnkgPT0gJ2JvdHRvbVRvcCcgfHwgaW5zdWZmaWNpZW50WCkgewogICAgICAgICAgaWYgKHBvc1kgKyB0aXBIZWlnaHQgKyB0T2Zmc2V0ID4gYmFzZWxpbmUgJiYgbW91c2VZIC0gc1RvcCA+IHRpcEhlaWdodCArIHRPZmZzZXQpIHsKICAgICAgICAgICAgZGlyZWN0aW9uID0gJ3RvcCc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkaXJlY3Rpb24gPSAnYm90dG9tJzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdyBoYXZlIGEgZGlyZWN0aW9uLiBDb21wdXRlIHRpcFkKICAgICAgICBpZiAob3B0cy5zbmFwVG9FZGdlKSB7CiAgICAgICAgICBpZiAoZGlyZWN0aW9uID09ICd0b3AnKSB7CiAgICAgICAgICAgIHRpcFkgPSBsaW5rVG9wIC0gdGlwSGVpZ2h0IC0gdE9mZnNldDsKICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09ICdib3R0b20nKSB7CiAgICAgICAgICAgIHRpcFkgPSBsaW5rQm90dG9tICsgdE9mZnNldDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSAndG9wJykgewogICAgICAgICAgICB0aXBZID0gbW91c2VZIC0gdGlwSGVpZ2h0IC0gdE9mZnNldDsKICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09ICdib3R0b20nKSB7CiAgICAgICAgICAgIHRpcFkgPSBtb3VzZVkgKyB0T2Zmc2V0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICggcG9zWSArIHRpcEhlaWdodCArIHRPZmZzZXQgPiBiYXNlbGluZSApIHsKICAgICAgICB0aXBZID0gKHRpcEhlaWdodCA+PSB3SGVpZ2h0KSA/IHNUb3AgOiBiYXNlbGluZSAtIHRpcEhlaWdodCAtIHRPZmZzZXQ7CiAgICAgIH0gZWxzZSBpZiAoJGxpbmsuY3NzKCdkaXNwbGF5JykgPT0gJ2Jsb2NrJyB8fCBsaW5rLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAnYXJlYScgfHwgb3B0cy5wb3NpdGlvbkJ5ID09ICJtb3VzZSIpIHsKICAgICAgICB0aXBZID0gYnBZIC0gdE9mZnNldDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aXBZID0gcG9zWSAtIG9wdHMuZHJvcFNoYWRvd1N0ZXBzOwogICAgICB9CiAgICAgIGlmIChkaXJlY3Rpb24gPT09ICcnKSB7CiAgICAgICAgZGlyZWN0aW9uID0gcG9zWCA8IGxpbmtMZWZ0ID8gJ2xlZnQnIDogICdyaWdodCc7CiAgICAgIH0KICAgICAgLy8gYWRkIGNsYXNzZXMKICAgICAgZHluYW1pY0NsYXNzZXMgPSAnIGNsdWUtJyArIGRpcmVjdGlvbiArICctJyArIGN0Q2xhc3MgKyAnIGNsdWV0aXAtJyArIGN0Q2xhc3M7CiAgICAgIGlmIChjdENsYXNzID09ICdyb3VuZGVkJykgewogICAgICAgIGR5bmFtaWNDbGFzc2VzICs9ICcgdWktY29ybmVyLWFsbCc7CiAgICAgIH0KICAgICAgJGNsdWV0aXAuY3NzKHt0b3A6IHRpcFkgKyAncHgnfSkuYXR0clByb3AoeydjbGFzc05hbWUnOiBzdGFuZGFyZENsYXNzZXMgKyBkeW5hbWljQ2xhc3Nlc30pOwogICAgICAvLyBzZXQgdXAgYXJyb3cgcG9zaXRpb25pbmcgdG8gYWxpZ24gd2l0aCBlbGVtZW50CiAgICAgIGlmIChvcHRzLmFycm93cykgewogICAgICAgIGlmICggLyhsZWZ0fHJpZ2h0KS8udGVzdChkaXJlY3Rpb24pICkgewogICAgICAgICAgaGVpZ2h0RGlmZiA9ICRjbHVldGlwLmhlaWdodCgpIC0gJGNsdWV0aXBBcnJvd3MuaGVpZ2h0KCk7CiAgICAgICAgICBiZ1kgPSBwb3NYID49IDAgJiYgYnBZID4gMCA/IChwb3NZIC0gdGlwWSAtIG9wdHMuZHJvcFNoYWRvd1N0ZXBzKSA6IDA7CiAgICAgICAgICBiZ1kgPSBoZWlnaHREaWZmID4gYmdZID8gYmdZIDogaGVpZ2h0RGlmZjsKICAgICAgICAgIGJnWSArPSAncHgnOwogICAgICAgIH0KICAgICAgICAkY2x1ZXRpcEFycm93cy5jc3Moe3RvcDogYmdZfSkuc2hvdygpOwogICAgICB9IGVsc2UgewogICAgICAgICRjbHVldGlwQXJyb3dzLmhpZGUoKTsKICAgICAgfQoKLy8gKGZpcnN0IGhpZGUsIHRoZW4pICoqKlNIT1cgVEhFIENMVUVUSVAqKioKICAgICAgLy8gaGFuZGxlIGRyb3BzaGFkb3cgZGl2cyBmaXJzdAogICAgICAkZHJvcFNoYWRvdyA9IGNyZWF0ZURyb3BTaGFkb3dzKCRjbHVldGlwLCBvcHRzKTsKICAgICAgaWYgKCRkcm9wU2hhZG93ICYmICRkcm9wU2hhZG93Lmxlbmd0aCkgewogICAgICAgICRkcm9wU2hhZG93LmhpZGUoKS5jc3Moe2hlaWdodDogdGlwSGVpZ2h0LCB3aWR0aDogdGlwSW5uZXJXaWR0aCwgekluZGV4OiAkbGluay5kYXRhKCdjbHVldGlwJykuekluZGV4LTF9KS5zaG93KCk7CiAgICAgIH0KCiAgICAgIGlmICghY2xvc2VPbkRlbGF5KSB7CiAgICAgICAgJGNsdWV0aXAuaGlkZSgpOwogICAgICB9CiAgICAgIGNsZWFyVGltZW91dChjbG9zZU9uRGVsYXkpOwogICAgICBjbG9zZU9uRGVsYXkgPSBudWxsOwoKICAgICAgLy8gc2hvdyB0aGUgY2x1ZXRpcAogICAgICAkY2x1ZXRpcFtvcHRzLmZ4Lm9wZW5dKG9wdHMuZngub3BlblNwZWVkIHx8IDApOwoKICAgICAgaWYgKCQuZm4uYmdpZnJhbWUpIHsgJGNsdWV0aXAuYmdpZnJhbWUoKTsgfQoKICAgICAgLy8gdHJpZ2dlciB0aGUgb3B0aW9uYWwgb25TaG93IGZ1bmN0aW9uCiAgICAgIG9wdHMub25TaG93LmNhbGwobGluaywgJGNsdWV0aXAsICRjbHVldGlwSW5uZXIpOwogICAgfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgPUlOQUNUSVZBVElPTgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgdmFyIGluYWN0aXZhdGUgPSBmdW5jdGlvbihldmVudCkgewogICAgICBpc0FjdGl2ZSA9IGZhbHNlOwogICAgICAkY2x1ZXRpcFdhaXQuaGlkZSgpOwogICAgICBpZiAoIW9wdHMuc3RpY2t5IHx8ICgvY2xpY2t8dG9nZ2xlLykudGVzdChvcHRzLmFjdGl2YXRpb24pICkgewogICAgICAgIC8vIGRlbGF5ZWQgY2xvc2UgKG5vdCBmdWxseSB0ZXN0ZWQpCiAgICAgICAgaWYgKG9wdHMuZGVsYXllZENsb3NlID4gMCkgewogICAgICAgICAgY2xlYXJUaW1lb3V0KGNsb3NlT25EZWxheSk7CiAgICAgICAgICBjbG9zZU9uRGVsYXkgPSBudWxsOwogICAgICAgICAgY2xvc2VPbkRlbGF5ID0gc2V0VGltZW91dChjbHVldGlwQ2xvc2UsIG9wdHMuZGVsYXllZENsb3NlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChvcHRzLmhvdmVyQ2xhc3MpIHsKICAgICAgICAkbGluay5yZW1vdmVDbGFzcyhvcHRzLmhvdmVyQ2xhc3MpOwogICAgICB9CiAgICB9OwoKICAgIC8vIGNsb3NlIGNsdWV0aXAgYW5kIHJlc2V0IHNvbWUgdGhpbmdzCiAgICB2YXIgY2x1ZXRpcENsb3NlID0gZnVuY3Rpb24oZWwpIHsKICAgICAgdmFyICRjbG9zZXIgPSBlbCAmJiBlbC5kYXRhKCdjbHVldGlwJykgPyBlbCA6ICRsaW5rLAogICAgICAgICAgY3QgPSAkY2xvc2VyLmRhdGEoJ2NsdWV0aXAnKSAmJiAkY2xvc2VyLmRhdGEoJ2NsdWV0aXAnKS5zZWxlY3RvciwKICAgICAgICAgIGN0U2VsZWN0b3IgPSBjdCB8fCAnZGl2LmNsdWV0aXAnLAogICAgICAgICAgJGNsdWV0aXAgPSAkKGN0U2VsZWN0b3IpLAogICAgICAgICAgJGNsdWV0aXBJbm5lciA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtaW5uZXInKSwKICAgICAgICAgICRjbHVldGlwQXJyb3dzID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC1hcnJvd3MnKTsKCiAgICAgICRjbHVldGlwLmhpZGUoKS5yZW1vdmVDbGFzcygpOwogICAgICBvcHRzLm9uSGlkZS5jYWxsKCRjbG9zZXJbMF0sICRjbHVldGlwLCAkY2x1ZXRpcElubmVyKTsKCiAgICAgIGlmIChjdCkgewogICAgICAgICRjbG9zZXIucmVtb3ZlQ2xhc3MoJ2NsdWV0aXAtY2xpY2tlZCcpOwogICAgICAgICRjbG9zZXIuY3NzKCdjdXJzb3InLCcnKTsKICAgICAgfQogICAgICBpZiAoY3QgJiYgdGlwVGl0bGUpIHsKICAgICAgICAkY2xvc2VyLmF0dHJQcm9wKG9wdHMudGl0bGVBdHRyaWJ1dGUsIHRpcFRpdGxlKTsKICAgICAgfQoKICAgICAgaWYgKG9wdHMuYXJyb3dzKSB7CiAgICAgICAgJGNsdWV0aXBBcnJvd3MuY3NzKHt0b3A6ICcnfSk7CiAgICAgIH0KICAgIH07CgogICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCBiZSBjbG9zaW5nIGJ5IGNoZWNraW5nIHdoZXJlIHRoZSB1c2VyIGlzIGhvdmVyaW5nLgogICAgLy8gV2UgZG8gYSBzaG9ydCA1MG1zIGRlbGF5IGZvciB0d28gcmVhc29uczogdG8gcHJldmVudCBmbGlja2VyLCBhbmQgdG8gYWxsb3cgdGhlIHVzZXIgdGltZSB0byBob3ZlciBvbiBvdGhlciBlbGVtZW50CiAgICB2YXIgbW91c2VPdXRDbG9zZSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgZWwgPSB0aGlzOwogICAgICBjbGVhclRpbWVvdXQoY2xvc2VPbkRlbGF5KTsKICAgICAgY2xvc2VPbkRlbGF5ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbGlua092ZXIgPSAkbGluay5kYXRhKCdjbHVldGlwJykuZW50ZXJlZCwKICAgICAgICAgICAgY2x1ZXRpcE92ZXIgPSAkY2x1ZXRpcC5kYXRhKCdlbnRlcmVkJyksCiAgICAgICAgICAgIGVudGVyZWQgPSBmYWxzZTsKCiAgICAgICAgaWYgKCBvcHRzLm1vdXNlT3V0Q2xvc2UgPT0gJ2JvdGgnICYmIChsaW5rT3ZlciB8fCBjbHVldGlwT3ZlcikgKSB7CiAgICAgICAgICBlbnRlcmVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gdHJ1ZSBpbXBsaWVzICdjbHVldGlwJyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICAgICAgICBlbHNlIGlmICggKG9wdHMubW91c2VPdXRDbG9zZSA9PT0gdHJ1ZSB8fCBvcHRzLm1vdXNlT3V0Q2xvc2UgPT0gJ2NsdWV0aXAnKSAmJiBjbHVldGlwT3ZlcikgewogICAgICAgICAgZW50ZXJlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdHMubW91c2VPdXRDbG9zZSA9PSAnbGluaycgJiYgbGlua092ZXIpIHsKICAgICAgICAgIGVudGVyZWQgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhZW50ZXJlZCApIHsKICAgICAgICAgIC8vIEFsbCBjaGVja3MgcGFzcywgY2xvc2UgdGhlIGNsdWV0aXAKICAgICAgICAgIGNsdWV0aXBDbG9zZS5jYWxsKGVsKTsKICAgICAgICB9CgogICAgICB9LCBvcHRzLmRlbGF5ZWRDbG9zZSk7CiAgICB9OwoKICAgICQoZG9jdW1lbnQpLnVuYmluZCgnaGlkZUNsdWV0aXAuY2x1ZXRpcCcpLmJpbmQoJ2hpZGVDbHVldGlwLmNsdWV0aXAnLCBmdW5jdGlvbihlKSB7CiAgICAgIGNsdWV0aXBDbG9zZSggJChlLnRhcmdldCkgKTsKICAgIH0pOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgID1CSU5EIEVWRU5UUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogIC8vIGFjdGl2YXRlIGJ5IGNsaWNrCiAgICAgIGlmICggKC9jbGlja3x0b2dnbGUvKS50ZXN0KG9wdHMuYWN0aXZhdGlvbikgKSB7CiAgICAgICAgJGxpbmsuYmluZCgnY2xpY2suY2x1ZXRpcCcsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICBpZiAoJGNsdWV0aXAuaXMoJzpoaWRkZW4nKSB8fCAhJGxpbmsuaXMoJy5jbHVldGlwLWNsaWNrZWQnKSkgewogICAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgICQoJy5jbHVldGlwLWNsaWNrZWQnKS5yZW1vdmVDbGFzcygnY2x1ZXRpcC1jbGlja2VkJyk7CiAgICAgICAgICAgICRsaW5rLmFkZENsYXNzKCdjbHVldGlwLWNsaWNrZWQnKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluYWN0aXZhdGUoZXZlbnQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwogIC8vIGFjdGl2YXRlIGJ5IGZvY3VzOyBpbmFjdGl2YXRlIGJ5IGJsdXIKICAgICAgfSBlbHNlIGlmIChvcHRzLmFjdGl2YXRpb24gPT0gJ2ZvY3VzJykgewogICAgICAgICRsaW5rLmJpbmQoJ2ZvY3VzLmNsdWV0aXAnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgJGxpbmsuYXR0clByb3AoJ3RpdGxlJywnJyk7CiAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgfSk7CiAgICAgICAgJGxpbmsuYmluZCgnYmx1ci5jbHVldGlwJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICRsaW5rLmF0dHJQcm9wKCd0aXRsZScsICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS50aXRsZSk7CiAgICAgICAgICBpbmFjdGl2YXRlKGV2ZW50KTsKICAgICAgICB9KTsKICAvLyBhY3RpdmF0ZSBieSBob3ZlcgogICAgICB9IGVsc2UgewoKICAgICAgICAvLyBjbGlja2luZyBpcyByZXR1cm5lZCBmYWxzZSBpZiBjbGlja1Rocm91Z2ggb3B0aW9uIGlzIHNldCB0byBmYWxzZQogICAgICAgICRsaW5rW29wdHMuY2xpY2tUaHJvdWdoID8gJ3VuYmluZCcgOiAnYmluZCddKCdjbGljay5jbHVldGlwJywgcmV0dXJuRmFsc2UpOwoKICAgICAgICAvL3NldCB1cCBtb3VzZSB0cmFja2luZwogICAgICAgIHZhciBtb3VzZVRyYWNrcyA9IGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgaWYgKG9wdHMudHJhY2tpbmcpIHsKICAgICAgICAgICAgdmFyIHRyYWNrWCA9IHBvc1ggLSBldnQucGFnZVg7CiAgICAgICAgICAgIHZhciB0cmFja1kgPSB0aXBZID8gdGlwWSAtIGV2dC5wYWdlWSA6IHBvc1kgLSBldnQucGFnZVk7CiAgICAgICAgICAgICRsaW5rLmJpbmQoJ21vdXNlbW92ZS5jbHVldGlwJywgZnVuY3Rpb24oZXZ0KSB7CiAgICAgICAgICAgICAgJGNsdWV0aXAuY3NzKHtsZWZ0OiBldnQucGFnZVggKyB0cmFja1gsIHRvcDogZXZ0LnBhZ2VZICsgdHJhY2tZIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBpZiAoJC5mbi5ob3ZlckludGVudCAmJiBvcHRzLmhvdmVySW50ZW50KSB7CiAgICAgICAgICAkbGluay5ob3ZlckludGVudCh7CiAgICAgICAgICAgIHNlbnNpdGl2aXR5OiBvcHRzLmhvdmVySW50ZW50LnNlbnNpdGl2aXR5LAogICAgICAgICAgICBpbnRlcnZhbDogb3B0cy5ob3ZlckludGVudC5pbnRlcnZhbCwKICAgICAgICAgICAgb3ZlcjogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgICAgbW91c2VUcmFja3MoZXZlbnQpOwogICAgICAgICAgICB9LAogICAgICAgICAgICB0aW1lb3V0OiBvcHRzLmhvdmVySW50ZW50LnRpbWVvdXQsCiAgICAgICAgICAgIG91dDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICBpbmFjdGl2YXRlKGV2ZW50KTsKICAgICAgICAgICAgICAkbGluay51bmJpbmQoJ21vdXNlbW92ZS5jbHVldGlwJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkbGluay5iaW5kKCdtb3VzZWVudGVyLmNsdWV0aXAnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgIG1vdXNlVHJhY2tzKGV2ZW50KTsKICAgICAgICAgIH0pCiAgICAgICAgICAuYmluZCgnbW91c2VsZWF2ZS5jbHVldGlwJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgaW5hY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgICRsaW5rLnVuYmluZCgnbW91c2Vtb3ZlLmNsdWV0aXAnKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJGxpbmsuYmluZCgnbW91c2VvdmVyLmNsdWV0aXAnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgJGxpbmsuYXR0clByb3AoJ3RpdGxlJywnJyk7CiAgICAgICAgfSkuYmluZCgnbW91c2VsZWF2ZS5jbHVldGlwJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICRsaW5rLmF0dHJQcm9wKCd0aXRsZScsICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS50aXRsZSk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIC8vIHRyaWdnZXIgYSBjYWNoZWQgQWpheCByZXNwb25zZQogICAgICBmdW5jdGlvbiBjYWNoZWRBamF4KGluZm8sIHNldHRpbmdzKSB7CiAgICAgICAgdmFyIHN0YXR1cyA9IGluZm8uc3RhdHVzOwogICAgICAgIHNldHRpbmdzLmJlZm9yZVNlbmQoaW5mby54aHIsIHNldHRpbmdzKTsKICAgICAgICBpZiAoIHN0YXR1cyA9PSAnZXJyb3InICkgewogICAgICAgICAgc2V0dGluZ3Nbc3RhdHVzXShpbmZvLnhociwgaW5mby50ZXh0U3RhdHVzKTsKICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSAnc3VjY2VzcycpIHsKICAgICAgICAgIHNldHRpbmdzW3N0YXR1c10oaW5mby5kYXRhLCBpbmZvLnRleHRTdGF0dXMsIGluZm8ueGhyKTsKICAgICAgICB9CiAgICAgICAgc2V0dGluZ3MuY29tcGxldGUoaW5mby54aHIsIHNldHRpbmdzLnRleHRTdGF0dXMpOwogICAgICB9CgogICAgfSk7IC8vIGVuZCB0aGlzLmVhY2gKCiAgICAvKiogPXByaXZhdGUgZnVuY3Rpb25zCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAvL2VtcHR5IGZ1bmN0aW9uCiAgICBmdW5jdGlvbiBkb05vdGhpbmcoKSB7fQoKICAgIC8vIGNyZWF0ZSBhIHN0cmluZyB0byBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgZm9yIGFqYXggY2FjaGVzCiAgICBmdW5jdGlvbiBnZXRDYWNoZUtleSh1cmwsIGRhdGEpIHsKICAgICAgdmFyIGNhY2hlS2V5ID0gdXJsIHx8ICcnOwogICAgICBkYXRhID0gZGF0YSB8fCAnJzsKCiAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnb2JqZWN0JykgewogICAgICAgICQuZWFjaChkYXRhLCBmdW5jdGlvbihrZXksIHZhbCkgewogICAgICAgICAgY2FjaGVLZXkgKz0gJy0nICsga2V5ICsgJy0nICsgdmFsOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09ICdzdHJpbmcnKSB7CiAgICAgICAgY2FjaGVLZXkgKz0gZGF0YTsKICAgICAgfQoKICAgICAgcmV0dXJuIGNhY2hlS2V5OwogICAgfQoKICAgIC8qKiA9Y3JlYXRlIGRyb3BzaGFkb3cgZGl2cyAqKi8KCiAgICBmdW5jdGlvbiBjcmVhdGVEcm9wU2hhZG93cygkY2x1ZXRpcCwgb3B0aW9ucywgbmV3RHJvcFNoYWRvdykgewogICAgICB2YXIgZHNTdHlsZSA9ICcnLAogICAgICAgICAgZHJvcFNoYWRvd1N0ZXBzID0gKG9wdGlvbnMuZHJvcFNoYWRvdyAmJiBvcHRpb25zLmRyb3BTaGFkb3dTdGVwcykgPyArb3B0aW9ucy5kcm9wU2hhZG93U3RlcHMgOiAwOwoKICAgICAgaWYgKCQuc3VwcG9ydC5ib3hTaGFkb3cpIHsKICAgICAgICBpZiAoIGRyb3BTaGFkb3dTdGVwcyApIHsKICAgICAgICAgIGRzU3R5bGUgPSAnMXB4IDFweCAnICsgZHJvcFNoYWRvd1N0ZXBzICsgJ3B4IHJnYmEoMCwwLDAsMC41KSc7CiAgICAgICAgfQogICAgICAgIHZhciBkc09mZnNldHMgPSBkcm9wU2hhZG93U3RlcHMgPT09IDAgPyAnMCAwICcgOiAnMXB4IDFweCAnOwogICAgICAgICRjbHVldGlwLmNzcygkLnN1cHBvcnQuYm94U2hhZG93LCBkc1N0eWxlKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIG9sZERyb3BTaGFkb3cgPSAkY2x1ZXRpcC5maW5kKCcuY2x1ZXRpcC1kcm9wLXNoYWRvdycpOwogICAgICBpZiAoZHJvcFNoYWRvd1N0ZXBzID09IG9sZERyb3BTaGFkb3cubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIG9sZERyb3BTaGFkb3c7CiAgICAgIH0KICAgICAgb2xkRHJvcFNoYWRvdy5yZW1vdmUoKTsKICAgICAgdmFyIGRyb3BTaGFkb3dzID0gW107CiAgICAgIGZvciAodmFyIGk9MDsgaSA8IGRyb3BTaGFkb3dTdGVwczspIHsKICAgICAgICBkcm9wU2hhZG93c1tpKytdID0gJzxkaXYgc3R5bGU9InRvcDonICsgaSArICdweDtsZWZ0OicgKyBpICsgJ3B4OyI+PC9kaXY+JzsKICAgICAgfQoKICAgICAgbmV3RHJvcFNoYWRvdyA9ICQoZHJvcFNoYWRvd3Muam9pbignJykpCiAgICAgIC5jc3MoewogICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLAogICAgICAgIGJhY2tncm91bmRDb2xvcjogJyMwMDAnLAogICAgICAgIHpJbmRleDogY2x1ZXpJbmRleCAtMSwKICAgICAgICBvcGFjaXR5OiAwLjEKICAgICAgfSkKICAgICAgLmFkZENsYXNzKCdjbHVldGlwLWRyb3Atc2hhZG93JykKICAgICAgLnByZXBlbmRUbygkY2x1ZXRpcCk7CiAgICAgIHJldHVybiBuZXdEcm9wU2hhZG93OwoKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9OwoKICAoZnVuY3Rpb24oKSB7CiAgICAkLnN1cHBvcnQgPSAkLnN1cHBvcnQgfHwge307CiAgICAvLyBjaGVjayBzdXBwb3J0IGZvciBDU1MzIHByb3BlcnRpZXMgKGN1cnJlbnRseSBvbmx5IGJveFNoYWRvdykKICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwKICAgICAgICBkaXZTdHlsZSA9IGRpdi5zdHlsZSwKICAgICAgICBzdHlsZVByb3BzID0gWydib3hTaGFkb3cnXSwKICAgICAgICBwcmVmaXhlcyA9IFsnbW96JywgJ01veicsICd3ZWJraXQnLCAnbyddOwoKICAgIGZvciAodmFyIGk9MCwgc2wgPSBzdHlsZVByb3BzLmxlbmd0aDsgaSA8IHNsOyBpKyspIHsKICAgICAgdmFyIHByb3AgPSBzdHlsZVByb3BzW2ldLAogICAgICAgICAgdVByb3AgPSBwcm9wLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcC5zbGljZSgxKTsKCiAgICAgIGlmICggdHlwZW9mIGRpdlN0eWxlWyBwcm9wIF0gIT09ICd1bmRlZmluZWQnICkgewogICAgICAgICQuc3VwcG9ydFsgcHJvcCBdID0gcHJvcDsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKHZhciBqPTAsIHBsID0gcHJlZml4ZXMubGVuZ3RoOyBqIDwgcGw7IGorKykgewoKICAgICAgICAgIGlmICh0eXBlb2YgZGl2U3R5bGVbIHByZWZpeGVzW2pdICsgdVByb3AgXSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgJC5zdXBwb3J0WyBwcm9wIF0gPSBwcmVmaXhlc1tqXSArIHVQcm9wOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGRpdiA9IG51bGw7CiAgfSkoKTsKCiAgJC5mbi5jbHVldGlwLmRlZmF1bHRzID0gJC5jbHVldGlwLmRlZmF1bHRzOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKICAvLyBCYWNrLWNvbXBhdCBmaWxlIGZvciBjbHVlVGlwIDEuMgogIC8vIFRoaXMgbW9kaWZpZXMgdGhlICQuZm4uY2x1ZXRpcCBvYmplY3QgdG8gbWFrZSB0aGUgcGx1Z2luIHdvcmsgdGhlIHdheSBpdCBkaWQgYmVmb3JlIGNsdWVUaXAgdmVyc2lvbiAxLjIKICAkLmV4dGVuZCh0cnVlLCAkLmZuLmNsdWV0aXAsIHsKICAgIGJhY2tDb21wYXQ6IHRydWUsCiAgICB0ZW1wbGF0ZTogWyc8ZGl2IGlkPSJjbHVldGlwIj4nLAogICAgICAnPGRpdiBpZD0iY2x1ZXRpcC1vdXRlciIgY2xhc3M9ImNsdWV0aXAtb3V0ZXIiPicsCiAgICAgICAgJzxoMyBpZD0iY2x1ZXRpcC10aXRsZSIgY2xhc3M9ImNsdWV0aXAtdGl0bGUgdWktd2lkZ2V0LWhlYWRlciB1aS1jbHVldGlwLWhlYWRlciI+PC9oMz4nLAogICAgICAgICc8ZGl2IGlkPSJjbHVldGlwLWlubmVyIiBjbGFzcz0iY2x1ZXRpcC1pbm5lciB1aS13aWRnZXQtY29udGVudCB1aS1jbHVldGlwLWNvbnRlbnQiPjwvZGl2PicsCiAgICAgICc8L2Rpdj4nLAogICAgICAnPGRpdiBpZD0iY2x1ZXRpcC1leHRyYSI+PC9kaXY+JywKICAgICAgJzxkaXYgaWQ9ImNsdWV0aXAtYXJyb3dzIiBjbGFzcz0iY2x1ZXRpcC1hcnJvd3MiPjwvZGl2PicsCiAgICAnPC9kaXY+J10uam9pbignJykKICB9KTsKfSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.cluetip.all.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBjbHVlVGlwIHBsdWdpbiB2MS4yLjcKICoKICogRGF0ZTogU2F0IE9jdCAxMyAxNzoxNzo0NyAyMDEyIEVEVAogKiBSZXF1aXJlczogalF1ZXJ5IHYxLjMrCiAqCiAqIENvcHlyaWdodCAyMDEyLCBLYXJsIFN3ZWRiZXJnCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAogKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwKICoKICoKICogRXhhbXBsZXMgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly9wbHVnaW5zLmxlYXJuaW5nanF1ZXJ5LmNvbS9jbHVldGlwL2RlbW8vCiAqCiovCihmdW5jdGlvbihjKXtjLmNsdWV0aXA9e3ZlcnNpb246IjEuMi43Iix0ZW1wbGF0ZTonPGRpdj48ZGl2IGNsYXNzPSJjbHVldGlwLW91dGVyIj48aDMgY2xhc3M9ImNsdWV0aXAtdGl0bGUgdWktd2lkZ2V0LWhlYWRlciB1aS1jbHVldGlwLWhlYWRlciI+PC9oMz48ZGl2IGNsYXNzPSJjbHVldGlwLWlubmVyIHVpLXdpZGdldC1jb250ZW50IHVpLWNsdWV0aXAtY29udGVudCI+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY2x1ZXRpcC1leHRyYSI+PC9kaXY+PC9kaXY+JyxzZXR1cDp7aW5zZXJ0aW9uVHlwZToiYXBwZW5kVG8iLGluc2VydGlvbkVsZW1lbnQ6ImJvZHkifSxkZWZhdWx0czp7bXVsdGlwbGU6ZmFsc2Usd2lkdGg6Mjc1LGhlaWdodDoiYXV0byIsY2x1ZXpJbmRleDo5Nyxwb3NpdGlvbkJ5OiJhdXRvIix0b3BPZmZzZXQ6MTUsbGVmdE9mZnNldDoxNSxzbmFwVG9FZGdlOmZhbHNlLGxvY2FsOmZhbHNlLGxvY2FsUHJlZml4Om51bGwsbG9jYWxJZFN1ZmZpeDpudWxsLGhpZGVMb2NhbDp0cnVlLAphdHRyaWJ1dGU6InJlbCIsdGl0bGVBdHRyaWJ1dGU6InRpdGxlIixzcGxpdFRpdGxlOiIiLGVzY2FwZVRpdGxlOmZhbHNlLHNob3dUaXRsZTp0cnVlLGNsdWV0aXBDbGFzczoiZGVmYXVsdCIsaG92ZXJDbGFzczoiIix3YWl0SW1hZ2U6dHJ1ZSxjdXJzb3I6ImhlbHAiLGFycm93czpmYWxzZSxkcm9wU2hhZG93OnRydWUsZHJvcFNoYWRvd1N0ZXBzOjYsc3RpY2t5OmZhbHNlLG1vdXNlT3V0Q2xvc2U6ZmFsc2UsZGVsYXllZENsb3NlOjUwLGFjdGl2YXRpb246ImhvdmVyIixjbGlja1Rocm91Z2g6dHJ1ZSx0cmFja2luZzpmYWxzZSxjbG9zZVBvc2l0aW9uOiJ0b3AiLGNsb3NlVGV4dDoiQ2xvc2UiLHRydW5jYXRlOjAsZng6e29wZW46InNob3ciLG9wZW5TcGVlZDoiIn0saG92ZXJJbnRlbnQ6e3NlbnNpdGl2aXR5OjMsaW50ZXJ2YWw6NTAsdGltZW91dDowfSxvbkFjdGl2YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRydWV9LG9uU2hvdzpmdW5jdGlvbigpe30sb25IaWRlOmZ1bmN0aW9uKCl7fSwKYWpheENhY2hlOnRydWUsYWpheFByb2Nlc3M6ZnVuY3Rpb24obSl7cmV0dXJuIG09bS5yZXBsYWNlKC88KHNjcmlwdHxzdHlsZXx0aXRsZSlbXjxdKzxcLyhzY3JpcHR8c3R5bGV8dGl0bGUpPi9nbSwiIikucmVwbGFjZSgvPChsaW5rfG1ldGEpW14+XSs+L2csIiIpfSxhamF4U2V0dGluZ3M6e2RhdGFUeXBlOiJodG1sIn0sZGVidWc6ZmFsc2V9fTt2YXIgRSxQPXt9LG1hPTAsVD0wO2MuZm4uYXR0clByb3A9Yy5mbi5wcm9wfHxjLmZuLmF0dHI7Yy5mbi5jbHVldGlwPWZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gVSh6LGspe3ZhciBsPXp8fCIiO2s9a3x8IiI7aWYodHlwZW9mIGs9PSJvYmplY3QiKWMuZWFjaChrLGZ1bmN0aW9uKGosZCl7bCs9Ii0iK2orIi0iK2R9KTtlbHNlIGlmKHR5cGVvZiBrPT0ic3RyaW5nIilsKz1rO3JldHVybiBsfWZ1bmN0aW9uIFYoeixrLGwpe2w9IiI7az1rLmRyb3BTaGFkb3cmJmsuZHJvcFNoYWRvd1N0ZXBzPytrLmRyb3BTaGFkb3dTdGVwczowO2lmKGMuc3VwcG9ydC5ib3hTaGFkb3cpe2lmKGspbD0KIjFweCAxcHggIitrKyJweCByZ2JhKDAsMCwwLDAuNSkiO3ouY3NzKGMuc3VwcG9ydC5ib3hTaGFkb3csbCk7cmV0dXJuIGZhbHNlfWw9ei5maW5kKCIuY2x1ZXRpcC1kcm9wLXNoYWRvdyIpO2lmKGs9PWwubGVuZ3RoKXJldHVybiBsO2wucmVtb3ZlKCk7bD1bXTtmb3IodmFyIGo9MDtqPGs7KWxbaisrXT0nPGRpdiBzdHlsZT0idG9wOicraisicHg7bGVmdDoiK2orJ3B4OyI+PC9kaXY+JztyZXR1cm4gbD1jKGwuam9pbigiIikpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixiYWNrZ3JvdW5kQ29sb3I6IiMwMDAiLHpJbmRleDpXLTEsb3BhY2l0eTowLjF9KS5hZGRDbGFzcygiY2x1ZXRpcC1kcm9wLXNoYWRvdyIpLnByZXBlbmRUbyh6KX12YXIgZSxoLEksdyxKLGdhO2lmKHR5cGVvZiBtPT0ib2JqZWN0Iil7cT1tO209bnVsbH1pZihtPT0iZGVzdHJveSIpe3ZhciBYPXRoaXMuZGF0YSgiY2x1ZXRpcCIpO2lmKFgpe2MoWC5zZWxlY3RvcikucmVtb3ZlKCk7Yy5yZW1vdmVEYXRhKHRoaXMsCiJ0aXRsZSIpO2MucmVtb3ZlRGF0YSh0aGlzLCJjbHVldGlwIik7Yy5yZW1vdmVEYXRhKHRoaXMsImNsdWV0aXBNb2MiKX1jKGRvY3VtZW50KS51bmJpbmQoIi5jbHVldGlwIik7cmV0dXJuIHRoaXMudW5iaW5kKCIuY2x1ZXRpcCIpfXE9Yy5leHRlbmQodHJ1ZSx7fSxjLmNsdWV0aXAuZGVmYXVsdHMscXx8e30pO21hKys7dmFyIFc7WD1jLmNsdWV0aXAuYmFja0NvbXBhdHx8IXEubXVsdGlwbGU/ImNsdWV0aXAiOiJjbHVldGlwLSIrbWE7dmFyIGhhPSIjIitYLEE9Yy5jbHVldGlwLmJhY2tDb21wYXQ/IiMiOiIuIixhYT1jLmNsdWV0aXAuc2V0dXAuaW5zZXJ0aW9uVHlwZSxyYT1jLmNsdWV0aXAuc2V0dXAuaW5zZXJ0aW9uRWxlbWVudHx8ImJvZHkiO2FhPS9hcHBlbmRUb3xwcmVwZW5kVG98aW5zZXJ0QmVmb3JlfGluc2VydEFmdGVyLy50ZXN0KGFhKT9hYToiYXBwZW5kVG8iO2U9YyhoYSk7aWYoIWUubGVuZ3RoKXtlPWMoYy5jbHVldGlwLnRlbXBsYXRlKVthYV0ocmEpLmF0dHIoImlkIiwKWCkuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUifSk7Vz0rcS5jbHVlekluZGV4O0k9ZS5maW5kKEErImNsdWV0aXAtb3V0ZXIiKS5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsekluZGV4Old9KTtoPWUuZmluZChBKyJjbHVldGlwLWlubmVyIik7dz1lLmZpbmQoQSsiY2x1ZXRpcC10aXRsZSIpO2UuYmluZCgibW91c2VlbnRlciBtb3VzZWxlYXZlIixmdW5jdGlvbih6KXtjKHRoaXMpLmRhdGEoImVudGVyZWQiLHoudHlwZT09PSJtb3VzZWVudGVyIil9KX1FPWMoIiNjbHVldGlwLXdhaXRpbWFnZSIpO2lmKCFFLmxlbmd0aCYmcS53YWl0SW1hZ2Upe0U9YygiPGRpdj48L2Rpdj4iKS5hdHRyKCJpZCIsImNsdWV0aXAtd2FpdGltYWdlIikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUifSk7RS5pbnNlcnRCZWZvcmUoZSkuaGlkZSgpfXZhciBzYT0ocGFyc2VJbnQoZS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKSsocGFyc2VJbnQoZS5jc3MoInBhZGRpbmdSaWdodCIpLAoxMCl8fDApO3RoaXMuZWFjaChmdW5jdGlvbih6KXtmdW5jdGlvbiBrKCl7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIGwoYixnKXt2YXIgZj1iLnN0YXR1cztnLmJlZm9yZVNlbmQoYi54aHIsZyk7aWYoZj09ImVycm9yIilnW2ZdKGIueGhyLGIudGV4dFN0YXR1cyk7ZWxzZSBmPT0ic3VjY2VzcyImJmdbZl0oYi5kYXRhLGIudGV4dFN0YXR1cyxiLnhocik7Zy5jb21wbGV0ZShiLnhocixnLnRleHRTdGF0dXMpfXZhciBqPXRoaXMsZD1jKHRoaXMpLGE9Yy5leHRlbmQodHJ1ZSx7fSxxLGMubWV0YWRhdGE/ZC5tZXRhZGF0YSgpOmMubWV0YT9kLmRhdGEoKTpkLmRhdGEoImNsdWV0aXAiKXx8e30pLEs9ZmFsc2UsUT1mYWxzZSxGPW51bGwscD1hW2EuYXR0cmlidXRlXXx8KGEuYXR0cmlidXRlPT0iaHJlZiI/ZC5hdHRyKGEuYXR0cmlidXRlKTpkLmF0dHJQcm9wKGEuYXR0cmlidXRlKXx8ZC5hdHRyKGEuYXR0cmlidXRlKSksWT1hLmNsdWV0aXBDbGFzcztXPSthLmNsdWV6SW5kZXg7ZC5kYXRhKCJjbHVldGlwIiwKe3RpdGxlOmoudGl0bGUsekluZGV4Olcsc2VsZWN0b3I6aGF9KTthLmFycm93cyYmIWUuZmluZCgiLmNsdWV0aXAtYXJyb3dzIikubGVuZ3RoJiZlLmFwcGVuZCgnPGRpdiBjbGFzcz0iY2x1ZXRpcC1hcnJvd3MgdWktc3RhdGUtZGVmYXVsdCI+PC9kaXY+Jyk7aWYoIXAmJiFhLnNwbGl0VGl0bGUmJiFtKXJldHVybiB0cnVlO2lmKGEubG9jYWwmJmEubG9jYWxQcmVmaXgpcD1hLmxvY2FsUHJlZml4K3A7YS5sb2NhbCYmYS5oaWRlTG9jYWwmJnAmJmMocCsiOmZpcnN0IikuaGlkZSgpO3ZhciBvPXBhcnNlSW50KGEudG9wT2Zmc2V0LDEwKSxHPXBhcnNlSW50KGEubGVmdE9mZnNldCwxMCksdCxpYSxiYT1pc05hTihwYXJzZUludChhLmhlaWdodCwxMCkpPyJhdXRvIjovXEQvZy50ZXN0KGEuaGVpZ2h0KT9hLmhlaWdodDphLmhlaWdodCsicHgiLFosamEsbmEseCx1LEwsJCxrYT1wYXJzZUludChhLndpZHRoLDEwKXx8Mjc1LHI9a2Erc2ErYS5kcm9wU2hhZG93U3RlcHMsTT10aGlzLm9mZnNldFdpZHRoLApCLG4scyxSLE4sQz1hLmF0dHJpYnV0ZSE9InRpdGxlIj9kLmF0dHIoYS50aXRsZUF0dHJpYnV0ZSl8fCIiOiIiO2lmKGEuc3BsaXRUaXRsZSl7Tj1DLnNwbGl0KGEuc3BsaXRUaXRsZSk7Qz1hLnNob3dUaXRsZXx8TlswXT09PSIiP04uc2hpZnQoKToiIn1pZihhLmVzY2FwZVRpdGxlKUM9Qy5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvPC9nLCImbHQ7Iik7ZC5iaW5kKCJtb3VzZWVudGVyIG1vdXNlbGVhdmUiLGZ1bmN0aW9uKGIpe3ZhciBnPWQuZGF0YSgiY2x1ZXRpcCIpO2cuZW50ZXJlZD1iLnR5cGU9PT0iZW50ZXJlZCI7ZC5kYXRhKCJjbHVldGlwIixnKX0pO3ZhciBkYT1mdW5jdGlvbihiKXt2YXIgZyxmO2lmKGEub25BY3RpdmF0ZS5jYWxsKGosYik9PT1mYWxzZSlyZXR1cm4gZmFsc2U7UT10cnVlO2U9YyhoYSkuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUifSk7ST1lLmZpbmQoQSsiY2x1ZXRpcC1vdXRlciIpO2g9ZS5maW5kKEErCiJjbHVldGlwLWlubmVyIik7dz1lLmZpbmQoQSsiY2x1ZXRpcC10aXRsZSIpO0o9ZS5maW5kKEErImNsdWV0aXAtYXJyb3dzIik7ZS5yZW1vdmVDbGFzcygpLmNzcyh7d2lkdGg6a2F9KTtwPT1kLmF0dHIoImhyZWYiKSYmZC5jc3MoImN1cnNvciIsYS5jdXJzb3IpO2EuaG92ZXJDbGFzcyYmZC5hZGRDbGFzcyhhLmhvdmVyQ2xhc3MpO2phPXg9ZC5vZmZzZXQoKS50b3A7bmE9amErZC5pbm5lckhlaWdodCgpO0I9ZC5vZmZzZXQoKS5sZWZ0O009ZC5pbm5lcldpZHRoKCk7aWYoYi50eXBlPT1mb2N1cyl7cz1CK00vMitHO2UuY3NzKHtsZWZ0Om59KTtMPXgrb31lbHNle3M9Yi5wYWdlWDtMPWIucGFnZVl9aWYoai50YWdOYW1lLnRvTG93ZXJDYXNlKCkhPSJhcmVhIil7Wj1jKGRvY3VtZW50KS5zY3JvbGxUb3AoKTtSPWMod2luZG93KS53aWR0aCgpfWlmKGEucG9zaXRpb25CeT09ImZpeGVkIil7bj1NK0IrRztlLmNzcyh7bGVmdDpufSl9ZWxzZXtuPU0+QiYmQj5yfHxCK00rcitHPlI/Qi0Kci1HOk0rQitHO2lmKGoudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT0iYXJlYSJ8fGEucG9zaXRpb25CeT09Im1vdXNlInx8TStyPlIpaWYocysyMCtyPlIpe2UuYWRkQ2xhc3MoImNsdWV0aXAtIitZKTtuPXMtci1HPj0wP3Mtci1HLXBhcnNlSW50KGUuY3NzKCJtYXJnaW5MZWZ0IiksMTApK3BhcnNlSW50KGguY3NzKCJtYXJnaW5SaWdodCIpLDEwKTpzLXIvMn1lbHNlIG49cytHO2c9bjwwP2IucGFnZVkrbzpiLnBhZ2VZO2lmKG48MHx8YS5wb3NpdGlvbkJ5PT0iYm90dG9tVG9wInx8YS5wb3NpdGlvbkJ5PT0idG9wQm90dG9tIiluPXMrci8yPlI/Ui8yLXIvMjpNYXRoLm1heChzLXIvMiwwKX1KLmNzcyh7ekluZGV4OmQuZGF0YSgiY2x1ZXRpcCIpLnpJbmRleCsxfSk7ZS5jc3Moe2xlZnQ6bix6SW5kZXg6ZC5kYXRhKCJjbHVldGlwIikuekluZGV4fSk7aWE9Yyh3aW5kb3cpLmhlaWdodCgpO2lmKG0pe2lmKHR5cGVvZiBtPT0iZnVuY3Rpb24iKW09bS5jYWxsKGopO2guaHRtbChtKTtTKGcpfWVsc2UgaWYoTil7Yj0KTi5sZW5ndGg7aC5odG1sKGI/TlswXToiIik7aWYoYj4xKWZvcih2YXIgaT0xO2k8YjtpKyspaC5hcHBlbmQoJzxkaXYgY2xhc3M9InNwbGl0LWJvZHkiPicrTltpXSsiPC9kaXY+Iik7UyhnKX1lbHNlIGlmKCFhLmxvY2FsJiZwLmluZGV4T2YoIiMiKSE9PTApaWYoL1wuKGpwZT9nfHRpZmY/fGdpZnxwbmcpKD86XD8uKik/JC9pLnRlc3QocCkpe2guaHRtbCgnPGltZyBzcmM9IicrcCsnIiBhbHQ9IicrQysnIiAvPicpO1MoZyl9ZWxzZXt2YXIgdj1hLmFqYXhTZXR0aW5ncy5iZWZvcmVTZW5kLGNhPWEuYWpheFNldHRpbmdzLmVycm9yLEg9YS5hamF4U2V0dGluZ3Muc3VjY2VzcyxvYT1hLmFqYXhTZXR0aW5ncy5jb21wbGV0ZTtmPVUocCxhLmFqYXhTZXR0aW5ncy5kYXRhKTtiPWMuZXh0ZW5kKHRydWUse30sYS5hamF4U2V0dGluZ3Mse2NhY2hlOmEuYWpheENhY2hlLHVybDpwLGJlZm9yZVNlbmQ6ZnVuY3Rpb24oeSxEKXt2JiZ2LmNhbGwoaix5LGUsaCxEKTtJLmNoaWxkcmVuKCkuZW1wdHkoKTsKYS53YWl0SW1hZ2UmJkUuY3NzKHt0b3A6TCsyMCxsZWZ0OnMrMjAsekluZGV4OmQuZGF0YSgiY2x1ZXRpcCIpLnpJbmRleC0xfSkuc2hvdygpfSxlcnJvcjpmdW5jdGlvbih5LEQpe2lmKHEuYWpheENhY2hlJiYhUFtmXSlQW2ZdPXtzdGF0dXM6ImVycm9yIix0ZXh0U3RhdHVzOkQseGhyOnl9O2lmKFEpY2E/Y2EuY2FsbChqLHksRCxlLGgpOmguaHRtbCgiPGk+c29ycnksIHRoZSBjb250ZW50cyBjb3VsZCBub3QgYmUgbG9hZGVkPC9pPiIpfSxzdWNjZXNzOmZ1bmN0aW9uKHksRCxPKXtpZihxLmFqYXhDYWNoZSYmIVBbZl0pUFtmXT17c3RhdHVzOiJzdWNjZXNzIixkYXRhOnksdGV4dFN0YXR1czpELHhocjpPfTtLPWEuYWpheFByb2Nlc3MuY2FsbChqLHkpO2lmKHR5cGVvZiBLPT0ib2JqZWN0IiYmSyE9PW51bGwpe0M9Sy50aXRsZTtLPUsuY29udGVudH1pZihRKXtIJiZILmNhbGwoaix5LEQsZSxoKTtoLmh0bWwoSyl9fSxjb21wbGV0ZTpmdW5jdGlvbih5LEQpe29hJiZvYS5jYWxsKGosCnksRCxlLGgpO3ZhciBPPWhbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImltZyIpO1Q9Ty5sZW5ndGg7Zm9yKHZhciBsYT0wLHRhPU8ubGVuZ3RoO2xhPHRhO2xhKyspT1tsYV0uY29tcGxldGUmJlQtLTtpZihUJiYhYy5icm93c2VyLm9wZXJhKWMoTykuYmluZCgibG9hZC5jdCBlcnJvci5jdCIsZnVuY3Rpb24oKXtULS07aWYoVD09PTApe0UuaGlkZSgpO2MoTykudW5iaW5kKCIuY3QiKTtRJiZTKGcpfX0pO2Vsc2V7RS5oaWRlKCk7USYmUyhnKX19fSk7UFtmXT9sKFBbZl0sYik6Yy5hamF4KGIpfWVsc2UgaWYoYS5sb2NhbCl7Yj1jKHArKC9eI1xTKyQvLnRlc3QocCk/IiI6IjplcSgiK3orIikiKSkuY2xvbmUodHJ1ZSkuc2hvdygpO2EubG9jYWxJZFN1ZmZpeCYmYi5hdHRyKCJpZCIsYlswXS5pZCthLmxvY2FsSWRTdWZmaXgpO2guaHRtbChiKTtTKGcpfX0sUz1mdW5jdGlvbihiKXt2YXIgZyxmO2c9Q3x8YS5zaG93VGl0bGUmJiImbmJzcDsiO3ZhciBpPSIiO2Y9IiI7dmFyIHY9ZmFsc2U7CnY9e2JvdHRvbTpmdW5jdGlvbihIKXtILmFwcGVuZFRvKGgpfSx0b3A6ZnVuY3Rpb24oSCl7SC5wcmVwZW5kVG8oaCl9LHRpdGxlOmZ1bmN0aW9uKEgpe0gucHJlcGVuZFRvKHcpfX07ZS5hZGRDbGFzcygiY2x1ZXRpcC0iK1kpO2lmKGEudHJ1bmNhdGUpe3ZhciBjYT1oLnRleHQoKS5zbGljZSgwLGEudHJ1bmNhdGUpKyIuLi4iO2guaHRtbChjYSl9Zz93LnNob3coKS5odG1sKGcpOncuaGlkZSgpO2lmKGEuc3RpY2t5KXtpZih2W2EuY2xvc2VQb3NpdGlvbl0pe2c9YygnPGRpdiBjbGFzcz0iY2x1ZXRpcC1jbG9zZSI+PGEgaHJlZj0iIyI+JythLmNsb3NlVGV4dCsiPC9hPjwvZGl2PiIpO3ZbYS5jbG9zZVBvc2l0aW9uXShnKTtnLmJpbmQoImNsaWNrLmNsdWV0aXAiLGZ1bmN0aW9uKCl7ZWEoKTtyZXR1cm4gZmFsc2V9KX1pZihhLm1vdXNlT3V0Q2xvc2Upe2QudW5iaW5kKCJtb3VzZWxlYXZlLmNsdWV0aXBNb2MiKTtlLnVuYmluZCgibW91c2VsZWF2ZS5jbHVldGlwTW9jIik7aWYoYS5tb3VzZU91dENsb3NlPT0KImJvdGgifHxhLm1vdXNlT3V0Q2xvc2U9PSJjbHVldGlwInx8YS5tb3VzZU91dENsb3NlPT09dHJ1ZSllLmJpbmQoIm1vdXNlbGVhdmUuY2x1ZXRpcE1vYyIscGEpO2lmKGEubW91c2VPdXRDbG9zZT09ImJvdGgifHxhLm1vdXNlT3V0Q2xvc2U9PSJsaW5rIilkLmJpbmQoIm1vdXNlbGVhdmUuY2x1ZXRpcE1vYyIscGEpfX1JLmNzcyh7ekluZGV4OmQuZGF0YSgiY2x1ZXRpcCIpLnpJbmRleCxvdmVyZmxvdzpiYT09ImF1dG8iPyJ2aXNpYmxlIjoiYXV0byIsaGVpZ2h0OmJhfSk7dD1iYT09ImF1dG8iP01hdGgubWF4KGUub3V0ZXJIZWlnaHQoKSxlLmhlaWdodCgpKTpwYXJzZUludChiYSwxMCk7dT14OyQ9WitpYTt2PW48cyYmTWF0aC5tYXgobiwwKStyPnM7aWYoYS5wb3NpdGlvbkJ5PT0iZml4ZWQiKXU9eC1hLmRyb3BTaGFkb3dTdGVwcytvO2Vsc2UgaWYoYS5wb3NpdGlvbkJ5PT0idG9wQm90dG9tInx8YS5wb3NpdGlvbkJ5PT0iYm90dG9tVG9wInx8dil7aWYoYS5wb3NpdGlvbkJ5PT0KInRvcEJvdHRvbSIpZj14K3QrbzwkJiZMLVo8dCtvPyJib3R0b20iOiJ0b3AiO2Vsc2UgaWYoYS5wb3NpdGlvbkJ5PT0iYm90dG9tVG9wInx8dilmPXgrdCtvPiQmJkwtWj50K28/InRvcCI6ImJvdHRvbSI7aWYoYS5zbmFwVG9FZGdlKWlmKGY9PSJ0b3AiKXU9amEtdC1vO2Vsc2V7aWYoZj09ImJvdHRvbSIpdT1uYStvfWVsc2UgaWYoZj09InRvcCIpdT1MLXQtbztlbHNlIGlmKGY9PSJib3R0b20iKXU9TCtvfWVsc2UgdT14K3Qrbz4kP3Q+PWlhP1o6JC10LW86ZC5jc3MoImRpc3BsYXkiKT09ImJsb2NrInx8ai50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJhcmVhInx8YS5wb3NpdGlvbkJ5PT0ibW91c2UiP2Itbzp4LWEuZHJvcFNoYWRvd1N0ZXBzO2lmKGY9PT0iIilmPW48Qj8ibGVmdCI6InJpZ2h0IjtnPSIgY2x1ZS0iK2YrIi0iK1krIiBjbHVldGlwLSIrWTtpZihZPT0icm91bmRlZCIpZys9IiB1aS1jb3JuZXItYWxsIjtlLmNzcyh7dG9wOnUrInB4In0pLmF0dHJQcm9wKHtjbGFzc05hbWU6ImNsdWV0aXAgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNsdWV0aXAiKwpnfSk7aWYoYS5hcnJvd3Mpe2lmKC8obGVmdHxyaWdodCkvLnRlc3QoZikpe2Y9ZS5oZWlnaHQoKS1KLmhlaWdodCgpO2k9bj49MCYmYj4wP3gtdS1hLmRyb3BTaGFkb3dTdGVwczowO2k9Zj5pP2k6ZjtpKz0icHgifUouY3NzKHt0b3A6aX0pLnNob3coKX1lbHNlIEouaGlkZSgpOyhnYT1WKGUsYSkpJiZnYS5sZW5ndGgmJmdhLmhpZGUoKS5jc3Moe2hlaWdodDp0LHdpZHRoOmthLHpJbmRleDpkLmRhdGEoImNsdWV0aXAiKS56SW5kZXgtMX0pLnNob3coKTtGfHxlLmhpZGUoKTtjbGVhclRpbWVvdXQoRik7Rj1udWxsO2VbYS5meC5vcGVuXShhLmZ4Lm9wZW5TcGVlZHx8MCk7Yy5mbi5iZ2lmcmFtZSYmZS5iZ2lmcmFtZSgpO2Eub25TaG93LmNhbGwoaixlLGgpfSxmYT1mdW5jdGlvbigpe1E9ZmFsc2U7RS5oaWRlKCk7aWYoIWEuc3RpY2t5fHwvY2xpY2t8dG9nZ2xlLy50ZXN0KGEuYWN0aXZhdGlvbikpaWYoYS5kZWxheWVkQ2xvc2U+MCl7Y2xlYXJUaW1lb3V0KEYpO0Y9bnVsbDtGPXNldFRpbWVvdXQoZWEsCmEuZGVsYXllZENsb3NlKX1hLmhvdmVyQ2xhc3MmJmQucmVtb3ZlQ2xhc3MoYS5ob3ZlckNsYXNzKX0sZWE9ZnVuY3Rpb24oYil7Yj1iJiZiLmRhdGEoImNsdWV0aXAiKT9iOmQ7dmFyIGc9Yi5kYXRhKCJjbHVldGlwIikmJmIuZGF0YSgiY2x1ZXRpcCIpLnNlbGVjdG9yLGY9YyhnfHwiZGl2LmNsdWV0aXAiKSxpPWYuZmluZChBKyJjbHVldGlwLWlubmVyIiksdj1mLmZpbmQoQSsiY2x1ZXRpcC1hcnJvd3MiKTtmLmhpZGUoKS5yZW1vdmVDbGFzcygpO2Eub25IaWRlLmNhbGwoYlswXSxmLGkpO2lmKGcpe2IucmVtb3ZlQ2xhc3MoImNsdWV0aXAtY2xpY2tlZCIpO2IuY3NzKCJjdXJzb3IiLCIiKX1nJiZDJiZiLmF0dHJQcm9wKGEudGl0bGVBdHRyaWJ1dGUsQyk7YS5hcnJvd3MmJnYuY3NzKHt0b3A6IiJ9KX0scGE9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2NsZWFyVGltZW91dChGKTtGPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZz1kLmRhdGEoImNsdWV0aXAiKS5lbnRlcmVkLGY9ZS5kYXRhKCJlbnRlcmVkIiksCmk9ZmFsc2U7aWYoYS5tb3VzZU91dENsb3NlPT0iYm90aCImJihnfHxmKSlpPXRydWU7ZWxzZSBpZigoYS5tb3VzZU91dENsb3NlPT09dHJ1ZXx8YS5tb3VzZU91dENsb3NlPT0iY2x1ZXRpcCIpJiZmKWk9dHJ1ZTtlbHNlIGlmKGEubW91c2VPdXRDbG9zZT09ImxpbmsiJiZnKWk9dHJ1ZTtpfHxlYS5jYWxsKGIpfSxhLmRlbGF5ZWRDbG9zZSl9O2MoZG9jdW1lbnQpLnVuYmluZCgiaGlkZUNsdWV0aXAuY2x1ZXRpcCIpLmJpbmQoImhpZGVDbHVldGlwLmNsdWV0aXAiLGZ1bmN0aW9uKGIpe2VhKGMoYi50YXJnZXQpKX0pO2lmKC9jbGlja3x0b2dnbGUvLnRlc3QoYS5hY3RpdmF0aW9uKSlkLmJpbmQoImNsaWNrLmNsdWV0aXAiLGZ1bmN0aW9uKGIpe2lmKGUuaXMoIjpoaWRkZW4iKXx8IWQuaXMoIi5jbHVldGlwLWNsaWNrZWQiKSl7ZGEoYik7YygiLmNsdWV0aXAtY2xpY2tlZCIpLnJlbW92ZUNsYXNzKCJjbHVldGlwLWNsaWNrZWQiKTtkLmFkZENsYXNzKCJjbHVldGlwLWNsaWNrZWQiKX1lbHNlIGZhKGIpOwpyZXR1cm4gZmFsc2V9KTtlbHNlIGlmKGEuYWN0aXZhdGlvbj09ImZvY3VzIil7ZC5iaW5kKCJmb2N1cy5jbHVldGlwIixmdW5jdGlvbihiKXtkLmF0dHJQcm9wKCJ0aXRsZSIsIiIpO2RhKGIpfSk7ZC5iaW5kKCJibHVyLmNsdWV0aXAiLGZ1bmN0aW9uKGIpe2QuYXR0clByb3AoInRpdGxlIixkLmRhdGEoImNsdWV0aXAiKS50aXRsZSk7ZmEoYil9KX1lbHNle2RbYS5jbGlja1Rocm91Z2g/InVuYmluZCI6ImJpbmQiXSgiY2xpY2suY2x1ZXRpcCIsayk7dmFyIHFhPWZ1bmN0aW9uKGIpe2lmKGEudHJhY2tpbmcpe3ZhciBnPW4tYi5wYWdlWCxmPXU/dS1iLnBhZ2VZOngtYi5wYWdlWTtkLmJpbmQoIm1vdXNlbW92ZS5jbHVldGlwIixmdW5jdGlvbihpKXtlLmNzcyh7bGVmdDppLnBhZ2VYK2csdG9wOmkucGFnZVkrZn0pfSl9fTtjLmZuLmhvdmVySW50ZW50JiZhLmhvdmVySW50ZW50P2QuaG92ZXJJbnRlbnQoe3NlbnNpdGl2aXR5OmEuaG92ZXJJbnRlbnQuc2Vuc2l0aXZpdHksaW50ZXJ2YWw6YS5ob3ZlckludGVudC5pbnRlcnZhbCwKb3ZlcjpmdW5jdGlvbihiKXtkYShiKTtxYShiKX0sdGltZW91dDphLmhvdmVySW50ZW50LnRpbWVvdXQsb3V0OmZ1bmN0aW9uKGIpe2ZhKGIpO2QudW5iaW5kKCJtb3VzZW1vdmUuY2x1ZXRpcCIpfX0pOmQuYmluZCgibW91c2VlbnRlci5jbHVldGlwIixmdW5jdGlvbihiKXtkYShiKTtxYShiKX0pLmJpbmQoIm1vdXNlbGVhdmUuY2x1ZXRpcCIsZnVuY3Rpb24oYil7ZmEoYik7ZC51bmJpbmQoIm1vdXNlbW92ZS5jbHVldGlwIil9KTtkLmJpbmQoIm1vdXNlb3Zlci5jbHVldGlwIixmdW5jdGlvbigpe2QuYXR0clByb3AoInRpdGxlIiwiIil9KS5iaW5kKCJtb3VzZWxlYXZlLmNsdWV0aXAiLGZ1bmN0aW9uKCl7ZC5hdHRyUHJvcCgidGl0bGUiLGQuZGF0YSgiY2x1ZXRpcCIpLnRpdGxlKX0pfX0pO3JldHVybiB0aGlzfTsoZnVuY3Rpb24oKXtjLnN1cHBvcnQ9Yy5zdXBwb3J0fHx7fTtmb3IodmFyIG09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUscT1bImJveFNoYWRvdyJdLApVPVsibW96IiwiTW96Iiwid2Via2l0IiwibyJdLFY9MCxlPXEubGVuZ3RoO1Y8ZTtWKyspe3ZhciBoPXFbVl0sST1oLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2guc2xpY2UoMSk7aWYodHlwZW9mIG1baF0hPT0idW5kZWZpbmVkIiljLnN1cHBvcnRbaF09aDtlbHNlIGZvcih2YXIgdz0wLEo9VS5sZW5ndGg7dzxKO3crKylpZih0eXBlb2YgbVtVW3ddK0ldIT09InVuZGVmaW5lZCIpe2Muc3VwcG9ydFtoXT1VW3ddK0k7YnJlYWt9fX0pKCk7Yy5mbi5jbHVldGlwLmRlZmF1bHRzPWMuY2x1ZXRpcC5kZWZhdWx0c30pKGpRdWVyeSk7KGZ1bmN0aW9uKGMpe2MuZXh0ZW5kKHRydWUsYy5mbi5jbHVldGlwLHtiYWNrQ29tcGF0OnRydWUsdGVtcGxhdGU6JzxkaXYgaWQ9ImNsdWV0aXAiPjxkaXYgaWQ9ImNsdWV0aXAtb3V0ZXIiIGNsYXNzPSJjbHVldGlwLW91dGVyIj48aDMgaWQ9ImNsdWV0aXAtdGl0bGUiIGNsYXNzPSJjbHVldGlwLXRpdGxlIHVpLXdpZGdldC1oZWFkZXIgdWktY2x1ZXRpcC1oZWFkZXIiPjwvaDM+PGRpdiBpZD0iY2x1ZXRpcC1pbm5lciIgY2xhc3M9ImNsdWV0aXAtaW5uZXIgdWktd2lkZ2V0LWNvbnRlbnQgdWktY2x1ZXRpcC1jb250ZW50Ij48L2Rpdj48L2Rpdj48ZGl2IGlkPSJjbHVldGlwLWV4dHJhIj48L2Rpdj48ZGl2IGlkPSJjbHVldGlwLWFycm93cyIgY2xhc3M9ImNsdWV0aXAtYXJyb3dzIj48L2Rpdj48L2Rpdj4nfSl9KShqUXVlcnkpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.cluetip.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogZ2xvYmFsICovCmRpdi51aS1jbHVldGlwIHsKICBmb250LXNpemU6IDFlbTsKfQoudWktY2x1ZXRpcC1oZWFkZXIsCi51aS1jbHVldGlwLWNvbnRlbnQgewogIHBhZGRpbmc6IDEycHg7Cn0KLnVpLWNsdWV0aXAtaGVhZGVyIHsKICBmb250LXNpemU6IDFlbTsKICBtYXJnaW46IDA7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmNsdWV0aXAtdGl0bGUgLmNsdWV0aXAtY2xvc2UgewogIGZsb2F0OiByaWdodDsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KLmNsdWV0aXAtY2xvc2UgaW1nIHsKICBib3JkZXI6IDA7Cn0KCiNjbHVldGlwLXdhaXRpbWFnZSB7CiAgd2lkdGg6IDQzcHg7CiAgaGVpZ2h0OiAxMXB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3dhaXQuZ2lmKTsKfQouY2x1ZXRpcC1hcnJvd3MgewogIGRpc3BsYXk6IG5vbmU7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogMDsKICBsZWZ0OiAtMTFweDsKICB3aWR0aDogMTFweDsKICBoZWlnaHQ6IDIycHg7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7CiAgYm9yZGVyLXdpZHRoOiAwOwp9Ci5jbHVldGlwLWV4dHJhIHsKICBkaXNwbGF5OiBub25lOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgID1jbHVldGlwQ2xhc3M6ICdkZWZhdWx0JwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLmNsdWV0aXAtZGVmYXVsdCwKLmNsdWV0aXAtZGVmYXVsdCAuY2x1ZXRpcC1vdXRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDljMjsKfQouY2x1ZXRpcC1kZWZhdWx0IC51aS1jbHVldGlwLWhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzg3ODc2YTsKfQoKCi8qCi5jbHVldGlwLWRlZmF1bHQgI2NsdWV0aXAtb3V0ZXIgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBtYXJnaW46IDA7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDljMjsKfQouY2x1ZXRpcC1kZWZhdWx0IGgzI2NsdWV0aXAtdGl0bGUgewogIG1hcmdpbjogMCAwIDVweDsKICBwYWRkaW5nOiA4cHggMTBweCA0cHg7CiAgZm9udC1zaXplOiAxLjFlbTsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGJhY2tncm91bmQtY29sb3I6ICM4Nzg3NmE7CiAgY29sb3I6ICNmZmY7Cn0KLmNsdWV0aXAtZGVmYXVsdCAjY2x1ZXRpcC10aXRsZSBhIHsKICBjb2xvcjogI2Q5ZDljMjsKICBmb250LXNpemU6IDAuOTVlbTsKfQouY2x1ZXRpcC1kZWZhdWx0ICNjbHVldGlwLWlubmVyIHsKICBwYWRkaW5nOiAxMHB4Owp9Ci5jbHVldGlwLWRlZmF1bHQgZGl2I2NsdWV0aXAtY2xvc2UgewogIHRleHQtYWxpZ246IHJpZ2h0OwogIG1hcmdpbjogMCA1cHggNXB4OwogIGNvbG9yOiAjOTAwOwp9CiovCi8qIGRlZmF1bHQgYXJyb3dzICovCmRpdi5jbHVldGlwLWRlZmF1bHQgLmNsdWV0aXAtYXJyb3dzIHsKICBib3JkZXItd2lkdGg6IDA7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgbm9uZTsKfQpkaXYuY2x1ZS1yaWdodC1kZWZhdWx0IC5jbHVldGlwLWFycm93cyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9kYXJyb3dsZWZ0LmdpZik7Cn0KZGl2LmNsdWUtbGVmdC1kZWZhdWx0IC5jbHVldGlwLWFycm93cyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9kYXJyb3dyaWdodC5naWYpOwogIGxlZnQ6IDEwMCU7CiAgbWFyZ2luLXJpZ2h0OiAtMTFweDsKfQpkaXYuY2x1ZS10b3AtZGVmYXVsdCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvZGFycm93ZG93bi5naWYpOwogIHRvcDogMTAwJTsKICBsZWZ0OiA1MCU7CiAgbWFyZ2luLWxlZnQ6IC0xMXB4OwogIHdpZHRoOiAyMnB4OwogIGhlaWdodDogMTFweDsKfQpkaXYuY2x1ZS1ib3R0b20tZGVmYXVsdCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvZGFycm93dXAuZ2lmKTsKICB0b3A6IC0xMXB4OwogIGxlZnQ6IDUwJTsKICBtYXJnaW4tbGVmdDogLTExcHg7CiAgd2lkdGg6IDIycHg7CiAgaGVpZ2h0OiAxMXB4Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgID1jbHVldGlwQ2xhc3M6ICdqdGlwJwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwouY2x1ZXRpcC1qdGlwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwp9Ci5jbHVldGlwLWp0aXAgLmNsdWV0aXAtb3V0ZXIgewogIGJvcmRlcjogMnB4IHNvbGlkICNjY2M7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Cn0KCi5jbHVldGlwLWp0aXAgLmNsdWV0aXAtaW5uZXIgewogIHBhZGRpbmc6IDVweDsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLmNsdWV0aXAtanRpcCBkaXYuY2x1ZXRpcC1jbG9zZSB7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgbWFyZ2luOiAwIDVweCAwOwogIGNvbG9yOiAjOTAwOwp9CgouY2x1ZXRpcC1qdGlwIC51aS1jbHVldGlwLWhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKICBwYWRkaW5nOiA2cHg7Ci8qICBtYXJnaW4tYm90dG9tOiAxZW07Ki8KfQoKLyoganRpcCBhcnJvd3MgKi8KZGl2LmNsdWV0aXAtanRpcCAuY2x1ZXRpcC1hcnJvd3MgewogIGJvcmRlci13aWR0aDogMDsKICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCBub25lOwp9CmRpdi5jbHVlLXJpZ2h0LWp0aXAgLmNsdWV0aXAtYXJyb3dzIHsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2Fycm93bGVmdC5naWYpOwp9CmRpdi5jbHVlLWxlZnQtanRpcCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvYXJyb3dyaWdodC5naWYpOwogIGxlZnQ6IDEwMCU7CiAgbWFyZ2luLXJpZ2h0OiAtMTFweDsKfQpkaXYuY2x1ZS10b3AtanRpcCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvYXJyb3dkb3duLmdpZik7CiAgdG9wOiAxMDAlOwogIGxlZnQ6IDUwJTsKICB3aWR0aDogMjJweDsKICBoZWlnaHQ6IDExcHg7CiAgbWFyZ2luLWxlZnQ6IC0xMXB4Owp9CmRpdi5jbHVlLWJvdHRvbS1qdGlwIC5jbHVldGlwLWFycm93cyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9hcnJvd3VwLmdpZik7CiAgdG9wOiAtMTFweDsKICBsZWZ0OiA1MCU7CiAgd2lkdGg6IDIycHg7CiAgaGVpZ2h0OiAxMXB4OwogIG1hcmdpbi1sZWZ0OiAtMTFweDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICA9Y2x1ZXRpcENsYXNzOiAncm91bmRlZCcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLmNsdWV0aXAtcm91bmRlZCB7CiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA2cHg7CiAgLW1vei1ib3JkZXItcmFkaXVzOiA2cHg7CiAgYm9yZGVyLXJhZGl1czogNnB4OwogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKfQoKLmNsdWV0aXAtcm91bmRlZCAuY2x1ZXRpcC1vdXRlciB7CiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA2cHg7CiAgLW1vei1ib3JkZXItcmFkaXVzOiA2cHg7CiAgYm9yZGVyLXJhZGl1czogNnB4OwogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Cn0KCi5jbHVldGlwLXJvdW5kZWQgIC5jbHVldGlwLWFycm93cyB7CiAgYm9yZGVyLWNvbG9yOiAjY2NjOwp9CgovKiBuZWVkIHRvIGJlIG1vcmUgc3BlY2lmaWMgaGVyZSB0byBvdmVycmlkZSBUaGVtZVJvbGxlciBkZWZhdWx0cyAqLwpkaXYuY2x1ZXRpcC1yb3VuZGVkICAuY2x1ZXRpcC1hcnJvd3MgewogIGZvbnQtc2l6ZTogMDsKICBsaW5lLWhlaWdodDogMCU7CiAgd2lkdGg6IDA7CiAgaGVpZ2h0OiAwOwogIGJvcmRlci1zdHlsZTogc29saWQ7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgbm9uZTsKfQpkaXYuY2x1ZS1yaWdodC1yb3VuZGVkIC5jbHVldGlwLWFycm93cyB7CiAgYm9yZGVyLXdpZHRoOiAxMXB4IDExcHggMTFweCAwOwogIGJvcmRlci10b3AtY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudDsKfQpkaXYuY2x1ZS1sZWZ0LXJvdW5kZWQgLmNsdWV0aXAtYXJyb3dzIHsKICBsZWZ0OiAxMDAlOwogIG1hcmdpbi1yaWdodDogLTExcHg7CiAgYm9yZGVyLXdpZHRoOiAxMXB4IDAgMTFweCAxMXB4OwogIGJvcmRlci10b3AtY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci1yaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7Cgp9CmRpdi5jbHVlLXRvcC1yb3VuZGVkIC5jbHVldGlwLWFycm93cyB7CiAgdG9wOiAxMDAlOwogIGxlZnQ6IDUwJTsKICBib3JkZXItd2lkdGg6IDExcHggMTFweCAwIDExcHg7CiAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICBib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDsKICBib3JkZXItbGVmdC1jb2xvcjogdHJhbnNwYXJlbnQ7Cn0KLmNsdWUtYm90dG9tLXJvdW5kZWQgLmNsdWV0aXAtYXJyb3dzIHsKICB0b3A6IC0xMXB4OwogIGxlZnQ6IDUwJTsKICBib3JkZXItd2lkdGg6IDAgMTFweCAxMXB4IDExcHg7CiAgYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICBib3JkZXItbGVmdC1jb2xvcjogdHJhbnNwYXJlbnQ7Cgp9Ci8qIHN0dXBpZCBJRTYgSGFzTGF5b3V0IGhhY2sgKi8KLmNsdWV0aXAtcm91bmRlZCAuY2x1ZXRpcC10aXRsZSwKLmNsdWV0aXAtcm91bmRlZCAuY2x1ZXRpcC1pbm5lciB7CiAgem9vbTogMTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.cluetip.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBjbHVlVGlwIHBsdWdpbiB2MS4yLjcKICoKICogRGF0ZTogU2F0IE9jdCAxMyAxNzoxNzo0NyAyMDEyIEVEVAogKiBSZXF1aXJlczogalF1ZXJ5IHYxLjMrCiAqCiAqIENvcHlyaWdodCAyMDEyLCBLYXJsIFN3ZWRiZXJnCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAogKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwKICoKICoKICogRXhhbXBsZXMgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly9wbHVnaW5zLmxlYXJuaW5nanF1ZXJ5LmNvbS9jbHVldGlwL2RlbW8vCiAqCiovCgooZnVuY3Rpb24oJCkgewoKICAkLmNsdWV0aXAgPSB7CiAgICB2ZXJzaW9uOiAnMS4yLjcnLAoKICAgIC8vIHRoZSBIVE1MIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgdG9vbHRpcAogICAgdGVtcGxhdGU6IFsnPGRpdj4nLAogICAgICAnPGRpdiBjbGFzcz0iY2x1ZXRpcC1vdXRlciI+JywKICAgICAgICAnPGgzIGNsYXNzPSJjbHVldGlwLXRpdGxlIHVpLXdpZGdldC1oZWFkZXIgdWktY2x1ZXRpcC1oZWFkZXIiPjwvaDM+JywKICAgICAgICAnPGRpdiBjbGFzcz0iY2x1ZXRpcC1pbm5lciB1aS13aWRnZXQtY29udGVudCB1aS1jbHVldGlwLWNvbnRlbnQiPjwvZGl2PicsCiAgICAgICc8L2Rpdj4nLAogICAgICAnPGRpdiBjbGFzcz0iY2x1ZXRpcC1leHRyYSI+PC9kaXY+JywKICAgICc8L2Rpdj4nXS5qb2luKCcnKSwKCiAgICAvKiBjbHVlVGlwIHNldHVwCiAgICAgKiAgdGhlIHNldHVwIG9wdGlvbnMgYXJlIGFwcGxpZWQgZWFjaCB0aW1lIC5jbHVldGlwKCkgaXMgY2FsbGVkLAogICAgICogIEJVVCBvbmx5IGlmIDxkaXYgaWQ9ImNsdWV0aXAiPiBpcyBub3QgYWxyZWFkeSBpbiB0aGUgZG9jdW1lbnQKICAgICovCiAgICBzZXR1cDogewogICAgICAvLyBtZXRob2QgdG8gYmUgdXNlZCBmb3IgaW5zZXJ0aW5nIHRoZSBjbHVlVGlwIGludG8gdGhlIERPTS4KICAgICAgLy8gUGVybWl0dGVkIHZhbHVlcyBhcmUgJ2FwcGVuZFRvJywgJ3ByZXBlbmRUbycsICdpbnNlcnRCZWZvcmUnLCBhbmQgJ2luc2VydEFmdGVyJwogICAgICBpbnNlcnRpb25UeXBlOiAnYXBwZW5kVG8nLAogICAgICAvLyBlbGVtZW50IGluIHRoZSBET00gdGhlIHBsdWdpbiB3aWxsIHJlZmVyZW5jZSB3aGVuIGluc2VydGluZyB0aGUgY2x1ZVRpcC4KICAgICAgaW5zZXJ0aW9uRWxlbWVudDogJ2JvZHknCiAgICB9LAoKICAgIC8qCiAgICAgKiBjbHVlVGlwIG9wdGlvbnMKICAgICAqCiAgICAgKiBlYWNoIG9uZSBjYW4gYmUgZXhwbGljaXRseSBvdmVycmlkZGVuIGJ5IGNoYW5naW5nIGl0cyB2YWx1ZS4KICAgICAqIGZvciBleGFtcGxlOiAkLmNsdWV0aXAuZGVmYXVsdHMud2lkdGggPSAyMDA7CiAgICAgKiAgICAgICAgIG9yOiAkLmZuLmNsdWV0aXAuZGVmYXVsdHMud2lkdGggPSAyMDA7IC8vIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgY2x1ZVRpcCB2ZXJzaW9ucwogICAgICogd291bGQgY2hhbmdlIHRoZSBkZWZhdWx0IHdpZHRoIGZvciBhbGwgY2x1ZVRpcHMgdG8gMjAwLgogICAgICoKICAgICAqIGVhY2ggb25lIGNhbiBhbHNvIGJlIG92ZXJyaWRkZW4gYnkgcGFzc2luZyBhbiBvcHRpb25zIG1hcCB0byB0aGUgY2x1ZXRpcCBtZXRob2QuCiAgICAgKiBmb3IgZXhhbXBsZTogJCgnYS5leGFtcGxlJykuY2x1ZXRpcCh7d2lkdGg6IDIwMH0pOwogICAgICogd291bGQgY2hhbmdlIHRoZSBkZWZhdWx0IHdpZHRoIHRvIDIwMCBmb3IgY2x1ZVRpcHMgaW52b2tlZCBieSBhIGxpbmsgd2l0aCBjbGFzcyBvZiAiZXhhbXBsZSIKICAgICAqCiAgICAqLwogICAgZGVmYXVsdHM6IHsKICAgICAgbXVsdGlwbGU6ICAgICAgICAgZmFsc2UsICAgIC8vIEFsbG93IGEgbmV3IHRvb2x0aXAgdG8gYmUgY3JlYXRlZCBmb3IgZWFjaCAuY2x1ZXRpcCgpIGNhbGwKICAgICAgd2lkdGg6ICAgICAgICAgICAgMjc1LCAgICAgIC8vIFRoZSB3aWR0aCBvZiB0aGUgY2x1ZVRpcAogICAgICBoZWlnaHQ6ICAgICAgICAgICAnYXV0bycsICAgLy8gVGhlIGhlaWdodCBvZiB0aGUgY2x1ZVRpcAogICAgICBjbHVlekluZGV4OiAgICAgICA5NywgICAgICAgLy8gU2V0cyB0aGUgei1pbmRleCBzdHlsZSBwcm9wZXJ0eSBvZiB0aGUgY2x1ZVRpcAogICAgICBwb3NpdGlvbkJ5OiAgICAgICAnYXV0bycsICAgLy8gU2V0cyB0aGUgdHlwZSBvZiBwb3NpdGlvbmluZzogJ2F1dG8nLCAnbW91c2UnLCdib3R0b21Ub3AnLCAndG9wQm90dG9tJywgZml4ZWQnCiAgICAgIHRvcE9mZnNldDogICAgICAgIDE1LCAgICAgICAvLyBOdW1iZXIgb2YgcHggdG8gb2Zmc2V0IGNsdWVUaXAgZnJvbSB0b3Agb2YgaW52b2tpbmcgZWxlbWVudAogICAgICBsZWZ0T2Zmc2V0OiAgICAgICAxNSwgICAgICAgLy8gTnVtYmVyIG9mIHB4IHRvIG9mZnNldCBjbHVlVGlwIGZyb20gbGVmdCBvZiBpbnZva2luZyBlbGVtZW50CiAgICAgIHNuYXBUb0VkZ2U6ICAgICAgIGZhbHNlLCAgICAvLyBGb3IgYm90dG9tVG9wIGFuZCB0b3BCb3R0b20sIHNuYXAgdG8gdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIGVsZW1lbnQuCiAgICAgIGxvY2FsOiAgICAgICAgICAgIGZhbHNlLCAgICAvLyBXaGV0aGVyIHRvIHVzZSBjb250ZW50IGZyb20gdGhlIHNhbWUgcGFnZSBmb3IgdGhlIGNsdWVUaXAncyBib2R5CiAgICAgIGxvY2FsUHJlZml4OiAgICAgIG51bGwsICAgICAvLyBzdHJpbmcgdG8gYmUgcHJlcGVuZGVkIHRvIHRoZSB0aXAgYXR0cmlidXRlIGlmIGxvY2FsIGlzIHRydWUKICAgICAgbG9jYWxJZFN1ZmZpeDogICAgbnVsbCwgICAgIC8vIHN0cmluZyB0byBiZSBhcHBlbmRlZCB0byB0aGUgY2x1ZXRpcCBjb250ZW50IGVsZW1lbnQncyBpZCBpZiBsb2NhbCBpcyB0cnVlCiAgICAgIGhpZGVMb2NhbDogICAgICAgIHRydWUsICAgICAvLyBJZiBsb2NhbCBvcHRpb24gaXMgc2V0IHRvIHRydWUsIHRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIGxvY2FsIGNvbnRlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIHNob3duIGluIGNsdWVUaXAgc2hvdWxkIGJlIGhpZGRlbiBhdCBpdHMgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgYXR0cmlidXRlOiAgICAgICAgJ3JlbCcsICAgIC8vIHRoZSBhdHRyaWJ1dGUgdG8gYmUgdXNlZCBmb3IgZmV0Y2hpbmcgdGhlIGNsdWVUaXAncyBib2R5IGNvbnRlbnQKICAgICAgdGl0bGVBdHRyaWJ1dGU6ICAgJ3RpdGxlJywgIC8vIHRoZSBhdHRyaWJ1dGUgdG8gYmUgdXNlZCBmb3IgZmV0Y2hpbmcgdGhlIGNsdWVUaXAncyB0aXRsZQogICAgICBzcGxpdFRpdGxlOiAgICAgICAnJywgICAgICAgLy8gQSBjaGFyYWN0ZXIgdXNlZCB0byBzcGxpdCB0aGUgdGl0bGUgYXR0cmlidXRlIGludG8gdGhlIGNsdWVUaXAgdGl0bGUgYW5kIGRpdnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgY2x1ZVRpcCBib2R5LiBtb3JlIGluZm8gYmVsb3cgWzZdCiAgICAgIGVzY2FwZVRpdGxlOiAgICAgIGZhbHNlLCAgICAvLyB3aGV0aGVyIHRvIGh0bWwgZXNjYXBlIHRoZSB0aXRsZSBhdHRyaWJ1dGUKICAgICAgc2hvd1RpdGxlOiAgICAgICAgdHJ1ZSwgICAgIC8vIHNob3cgdGl0bGUgYmFyIG9mIHRoZSBjbHVlVGlwLCBldmVuIGlmIHRpdGxlIGF0dHJpYnV0ZSBub3Qgc2V0CiAgICAgIGNsdWV0aXBDbGFzczogICAgICdkZWZhdWx0JywvLyBjbGFzcyBhZGRlZCB0byBvdXRlcm1vc3QgY2x1ZVRpcCBkaXYgaW4gdGhlIGZvcm0gb2YgJ2NsdWV0aXAtJyArIGNsdWVUaXBDbGFzcy4KICAgICAgaG92ZXJDbGFzczogICAgICAgJycsICAgICAgIC8vIGNsYXNzIGFwcGxpZWQgdG8gdGhlIGludm9raW5nIGVsZW1lbnQgb25tb3VzZW92ZXIgYW5kIHJlbW92ZWQgb25tb3VzZW91dAogICAgICB3YWl0SW1hZ2U6ICAgICAgICB0cnVlLCAgICAgLy8gd2hldGhlciB0byBzaG93IGEgImxvYWRpbmciIGltZywgd2hpY2ggaXMgc2V0IGluIGpxdWVyeS5jbHVldGlwLmNzcwogICAgICBjdXJzb3I6ICAgICAgICAgICAnaGVscCcsCiAgICAgIGFycm93czogICAgICAgICAgIGZhbHNlLCAgICAvLyBpZiB0cnVlLCBkaXNwbGF5cyBhcnJvdyBvbiBhcHByb3ByaWF0ZSBzaWRlIG9mIGNsdWVUaXAKICAgICAgZHJvcFNoYWRvdzogICAgICAgdHJ1ZSwgICAgIC8vIHNldCB0byBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgZHJvcC1zaGFkb3cgZWZmZWN0IG9uIHRoZSBjbHVlVGlwCiAgICAgIGRyb3BTaGFkb3dTdGVwczogIDYsICAgICAgICAvLyBhZGp1c3RzIHRoZSBzaXplIG9mIHRoZSBkcm9wIHNoYWRvdwogICAgICBzdGlja3k6ICAgICAgICAgICBmYWxzZSwgICAgLy8ga2VlcCB2aXNpYmxlIHVudGlsIG1hbnVhbGx5IGNsb3NlZAogICAgICBtb3VzZU91dENsb3NlOiAgICBmYWxzZSwgICAgLy8gY2xvc2Ugd2hlbiBjbHVlVGlwIGlzIG1vdXNlZCBvdXQ6IGZhbHNlLCAnY2x1ZXRpcCcsICdsaW5rJywgJ2JvdGgnCiAgICAgIGRlbGF5ZWRDbG9zZTogICAgIDUwLCAgICAgICAgLy8gY2xvc2UgY2x1ZVRpcCBvbiBhIHRpbWVkIGRlbGF5CiAgICAgIGFjdGl2YXRpb246ICAgICAgICdob3ZlcicsICAvLyBzZXQgdG8gJ2NsaWNrJyB0byBmb3JjZSB1c2VyIHRvIGNsaWNrIHRvIHNob3cgY2x1ZVRpcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvICdmb2N1cycgdG8gc2hvdyBvbiBmb2N1cyBvZiBhIGZvcm0gZWxlbWVudCBhbmQgaGlkZSBvbiBibHVyCiAgICAgIGNsaWNrVGhyb3VnaDogICAgIHRydWUsICAgIC8vIGlmIHRydWUsIGFuZCBhY3RpdmF0aW9uIGlzIG5vdCAnY2xpY2snLCB0aGVuIGNsaWNraW5nIG9uIGxpbmsgd2lsbCB0YWtlIHVzZXIgdG8gdGhlIGxpbmsncyBocmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiBocmVmIGFuZCB0aXBBdHRyaWJ1dGUgYXJlIGVxdWFsCiAgICAgIHRyYWNraW5nOiAgICAgICAgIGZhbHNlLCAgICAvLyBpZiB0cnVlLCBjbHVlVGlwIHdpbGwgdHJhY2sgbW91c2UgbW92ZW1lbnQgKGV4cGVyaW1lbnRhbCkKICAgICAgY2xvc2VQb3NpdGlvbjogICAgJ3RvcCcsICAgIC8vIGxvY2F0aW9uIG9mIGNsb3NlIHRleHQgZm9yIHN0aWNreSBjbHVldGlwczsgY2FuIGJlICd0b3AnLCAnYm90dG9tJywgJ3RpdGxlJyBvciAnbm9uZScKICAgICAgY2xvc2VUZXh0OiAgICAgICAgJ0Nsb3NlJywgIC8vIHRleHQgKG9yIEhUTUwpIHRvIHRvIGJlIGNsaWNrZWQgdG8gY2xvc2Ugc3RpY2t5IGNsdWVUaXBzCiAgICAgIHRydW5jYXRlOiAgICAgICAgIDAsICAgICAgICAvLyBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB0cnVuY2F0ZSBjbHVlVGlwJ3MgY29udGVudHMuIGlmIDAsIG5vIHRydW5jYXRpb24gb2NjdXJzCgogICAgICAvLyBlZmZlY3QgYW5kIHNwZWVkIGZvciBvcGVuaW5nIGNsdWVUaXBzCiAgICAgIGZ4OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW46ICAgICAgICdzaG93JywgLy8gY2FuIGJlICdzaG93JyBvciAnc2xpZGVEb3duJyBvciAnZmFkZUluJwogICAgICAgICAgICAgICAgICAgICAgICBvcGVuU3BlZWQ6ICAnJwogICAgICB9LAoKICAgICAgLy8gc2V0dGluZ3MgZm9yIHdoZW4gaG92ZXJJbnRlbnQgcGx1Z2luIGlzIHVzZWQKICAgICAgaG92ZXJJbnRlbnQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc2l0aXZpdHk6ICAzLAogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbDogICAgIDUwLAogICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAgICAgIDAKICAgICAgfSwKCiAgICAgIC8vIHNob3J0LWNpcmN1aXQgZnVuY3Rpb24gdG8gcnVuIGp1c3QgYmVmb3JlIGNsdWVUaXAgaXMgc2hvd24uCiAgICAgIG9uQWN0aXZhdGU6ICAgICAgIGZ1bmN0aW9uKGUpIHtyZXR1cm4gdHJ1ZTt9LAogICAgICAvLyBmdW5jdGlvbiB0byBydW4ganVzdCBhZnRlciBjbHVlVGlwIGlzIHNob3duLgogICAgICBvblNob3c6ICAgICAgICAgICBmdW5jdGlvbihjdCwgY2kpe30sCiAgICAgIC8vIGZ1bmN0aW9uIHRvIHJ1biBqdXN0IGFmdGVyIGNsdWVUaXAgaXMgaGlkZGVuLgogICAgICBvbkhpZGU6ICAgICAgICAgICBmdW5jdGlvbihjdCwgY2kpe30sCiAgICAgIC8vIHdoZXRoZXIgdG8gY2FjaGUgcmVzdWx0cyBvZiBhamF4IHJlcXVlc3QgdG8gYXZvaWQgdW5uZWNlc3NhcnkgaGl0cyB0byBzZXJ2ZXIKICAgICAgYWpheENhY2hlOiAgICAgICAgdHJ1ZSwKCiAgICAgIC8vIHByb2Nlc3MgZGF0YSByZXRyaWV2ZWQgdmlhIHhociBiZWZvcmUgaXQncyBkaXNwbGF5ZWQKICAgICAgYWpheFByb2Nlc3M6ICAgICAgZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoLzwoc2NyaXB0fHN0eWxlfHRpdGxlKVtePF0rPFwvKHNjcmlwdHxzdHlsZXx0aXRsZSk+L2dtLCAnJykucmVwbGFjZSgvPChsaW5rfG1ldGEpW14+XSs+L2csJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICB9LAoKICAgICAgLy8gY2FuIHBhc3MgaW4gc3RhbmRhcmQgJC5hamF4KCkgcGFyYW1ldGVycy4gQ2FsbGJhY2sgZnVuY3Rpb25zLCBzdWNoIGFzIGJlZm9yZVNlbmQsCiAgICAgIC8vIHdpbGwgYmUgcXVldWVkIGZpcnN0IHdpdGhpbiB0aGUgZGVmYXVsdCBjYWxsYmFja3MuCiAgICAgIC8vIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBlcnJvciwgd2hpY2ggb3ZlcnJpZGVzIHRoZSBkZWZhdWx0CiAgICAgIGFqYXhTZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcjogZnVuY3Rpb24oY3QsIGNpKSB7IC8qIG92ZXJyaWRlIGRlZmF1bHQgZXJyb3IgY2FsbGJhY2sgKi8gfSwKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlU2VuZDogZnVuY3Rpb24oY3QsIGNpKSB7IC8qIGNhbGxlZCBmaXJzdCB3aXRoaW4gZGVmYXVsdCBiZWZvcmVTZW5kIGNhbGxiYWNrICovIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnaHRtbCcKICAgICAgfSwKICAgICAgZGVidWc6IGZhbHNlCgogICAgfQogIH07CiAgdmFyICRjbHVldGlwV2FpdCwKICAgICAgc3RhbmRhcmRDbGFzc2VzID0gJ2NsdWV0aXAgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNsdWV0aXAnLAogICAgICBjYWNoZXMgPSB7fSwKICAgICAgY291bnRlciA9IDAsCiAgICAgIGltZ0NvdW50ID0gMDsKCiAgLy8gdXNlICQuZm4ucHJvcCgpIGlmIGF2YWlsYWJsZSAoalF1ZXJ5IDEuNispOyBvdGhlcndpc2UsICQuZm4uYXR0cigpCiAgJC5mbi5hdHRyUHJvcCA9ICQuZm4ucHJvcCB8fCAkLmZuLmF0dHI7CgogIC8vIC5jbHVldGlwKCkgbWV0aG9kCiAgJC5mbi5jbHVldGlwID0gZnVuY3Rpb24oanMsIG9wdGlvbnMpIHsKICAgIHZhciAkY2x1ZXRpcCwgJGNsdWV0aXBJbm5lciwgJGNsdWV0aXBPdXRlciwgJGNsdWV0aXBUaXRsZSwgJGNsdWV0aXBBcnJvd3MsICRkcm9wU2hhZG93OwogICAgaWYgKHR5cGVvZiBqcyA9PSAnb2JqZWN0JykgewogICAgICBvcHRpb25zID0ganM7CiAgICAgIGpzID0gbnVsbDsKICAgIH0KICAgIGlmIChqcyA9PSAnZGVzdHJveScpIHsKICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoJ2NsdWV0aXAnKTsKICAgICAgaWYgKCBkYXRhICkgewogICAgICAgICQoZGF0YS5zZWxlY3RvcikucmVtb3ZlKCk7CiAgICAgICAgJC5yZW1vdmVEYXRhKHRoaXMsICd0aXRsZScpOwogICAgICAgICQucmVtb3ZlRGF0YSh0aGlzLCAnY2x1ZXRpcCcpOwogICAgICAgICQucmVtb3ZlRGF0YSh0aGlzLCAnY2x1ZXRpcE1vYycpOwogICAgICB9CiAgICAgICQoZG9jdW1lbnQpLnVuYmluZCgnLmNsdWV0aXAnKTsKICAgICAgcmV0dXJuIHRoaXMudW5iaW5kKCcuY2x1ZXRpcCcpOwogICAgfQoKICAgIC8vIG1lcmdlIHBlci1jYWxsIG9wdGlvbnMgd2l0aCBkZWZhdWx0cwogICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCAkLmNsdWV0aXAuZGVmYXVsdHMsIG9wdGlvbnMgfHwge30pOwoKICAgIC8qKiA9Y3JlYXRlIGNsdWV0aXAgZGl2cyAqKi8KICAgIGNvdW50ZXIrKzsKICAgIHZhciBjbHVlekluZGV4LAogICAgICAgIGNsdWV0aXBJZCA9ICQuY2x1ZXRpcC5iYWNrQ29tcGF0IHx8ICFvcHRpb25zLm11bHRpcGxlID8gJ2NsdWV0aXAnIDogJ2NsdWV0aXAtJyArIGNvdW50ZXIsCiAgICAgICAgY2x1ZXRpcFNlbGVjdG9yID0gJyMnICsgY2x1ZXRpcElkLAogICAgICAgIHByZWZpeCA9ICQuY2x1ZXRpcC5iYWNrQ29tcGF0ID8gJyMnIDogJy4nLAogICAgICAgIGluc2VydGlvblR5cGUgPSAkLmNsdWV0aXAuc2V0dXAuaW5zZXJ0aW9uVHlwZSwKICAgICAgICBpbnNlcnRpb25FbGVtZW50ID0gJC5jbHVldGlwLnNldHVwLmluc2VydGlvbkVsZW1lbnQgfHwgJ2JvZHknOwoKICAgIGluc2VydGlvblR5cGUgPSAoL2FwcGVuZFRvfHByZXBlbmRUb3xpbnNlcnRCZWZvcmV8aW5zZXJ0QWZ0ZXIvKS50ZXN0KGluc2VydGlvblR5cGUpID8gaW5zZXJ0aW9uVHlwZSA6ICdhcHBlbmRUbyc7CiAgICAkY2x1ZXRpcCA9ICQoY2x1ZXRpcFNlbGVjdG9yKTsKICAgIGlmICghJGNsdWV0aXAubGVuZ3RoKSB7CgogICAgICAkY2x1ZXRpcCA9ICQoJC5jbHVldGlwLnRlbXBsYXRlKQogICAgICBbaW5zZXJ0aW9uVHlwZV0oaW5zZXJ0aW9uRWxlbWVudCkKICAgICAgLmF0dHIoJ2lkJywgY2x1ZXRpcElkKQogICAgICAuY3NzKHtwb3NpdGlvbjogJ2Fic29sdXRlJywgZGlzcGxheTogJ25vbmUnfSk7CgogICAgICBjbHVlekluZGV4ID0gK29wdGlvbnMuY2x1ZXpJbmRleDsKICAgICAgJGNsdWV0aXBPdXRlciA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtb3V0ZXInKS5jc3Moe3Bvc2l0aW9uOiAncmVsYXRpdmUnLCB6SW5kZXg6IGNsdWV6SW5kZXh9KTsKICAgICAgJGNsdWV0aXBJbm5lciA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtaW5uZXInKTsKICAgICAgJGNsdWV0aXBUaXRsZSA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtdGl0bGUnKTsKCiAgICAgICRjbHVldGlwLmJpbmQoJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgJCh0aGlzKS5kYXRhKCdlbnRlcmVkJywgZXZlbnQudHlwZSA9PT0gJ21vdXNlZW50ZXInKTsKICAgICAgfSk7CiAgICB9CgogICAgJGNsdWV0aXBXYWl0ID0gJCgnI2NsdWV0aXAtd2FpdGltYWdlJyk7CiAgICBpZiAoISRjbHVldGlwV2FpdC5sZW5ndGggJiYgb3B0aW9ucy53YWl0SW1hZ2UpIHsKICAgICAgJGNsdWV0aXBXYWl0ID0gJCgnPGRpdj48L2Rpdj4nKS5hdHRyKCdpZCcsICdjbHVldGlwLXdhaXRpbWFnZScpLmNzcyh7cG9zaXRpb246ICdhYnNvbHV0ZSd9KTsKICAgICAgJGNsdWV0aXBXYWl0Lmluc2VydEJlZm9yZSgkY2x1ZXRpcCkuaGlkZSgpOwogICAgfQoKCiAgICB2YXIgY2x1ZXRpcFBhZGRpbmcgPSAocGFyc2VJbnQoJGNsdWV0aXAuY3NzKCdwYWRkaW5nTGVmdCcpLCAxMCkgfHwgMCkgKyAocGFyc2VJbnQoJGNsdWV0aXAuY3NzKCdwYWRkaW5nUmlnaHQnKSwgMTApIHx8IDApOwoKCiAgICB0aGlzLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgdmFyIGxpbmsgPSB0aGlzLAogICAgICAgICAgJGxpbmsgPSAkKHRoaXMpLAogICAgICAgICAgLy8gc3VwcG9ydCBtZXRhZGF0YSBwbHVnaW4gKHYxLjAgYW5kIDIuMCkKICAgICAgICAgIG9wdHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgb3B0aW9ucywgJC5tZXRhZGF0YSA/ICRsaW5rLm1ldGFkYXRhKCkgOiAkLm1ldGEgPyAkbGluay5kYXRhKCkgOiAkbGluay5kYXRhKCdjbHVldGlwJykgfHwge30pLAogICAgICAgICAgLy8gc3RhcnQgb3V0IHdpdGggbm8gY29udGVudHMgKGZvciBhamF4IGFjdGl2YXRpb24pCiAgICAgICAgICBjbHVldGlwQ29udGVudHMgPSBmYWxzZSwKICAgICAgICAgIGlzQWN0aXZlID0gZmFsc2UsCiAgICAgICAgICBjbG9zZU9uRGVsYXkgPSBudWxsLAogICAgICAgICAgdGlwQXR0cmlidXRlID0gb3B0c1tvcHRzLmF0dHJpYnV0ZV0gfHwKICAgICAgICAgICAgKCBvcHRzLmF0dHJpYnV0ZSA9PSAnaHJlZicgPyAkbGluay5hdHRyKG9wdHMuYXR0cmlidXRlKSA6ICRsaW5rLmF0dHJQcm9wKG9wdHMuYXR0cmlidXRlKSB8fCAkbGluay5hdHRyKG9wdHMuYXR0cmlidXRlKSApLAogICAgICAgICAgY3RDbGFzcyA9IG9wdHMuY2x1ZXRpcENsYXNzOwoKICAgICAgY2x1ZXpJbmRleCA9ICtvcHRzLmNsdWV6SW5kZXg7CiAgICAgICRsaW5rLmRhdGEoJ2NsdWV0aXAnLCB7dGl0bGU6IGxpbmsudGl0bGUsIHpJbmRleDogY2x1ZXpJbmRleCwgc2VsZWN0b3I6IGNsdWV0aXBTZWxlY3Rvcn0pOwoKICAgICAgaWYgKG9wdHMuYXJyb3dzICYmICEkY2x1ZXRpcC5maW5kKCcuY2x1ZXRpcC1hcnJvd3MnKS5sZW5ndGgpIHsKICAgICAgICAkY2x1ZXRpcC5hcHBlbmQoJzxkaXYgY2xhc3M9ImNsdWV0aXAtYXJyb3dzIHVpLXN0YXRlLWRlZmF1bHQiPjwvZGl2PicpOwogICAgICB9CgogICAgICBpZiAoIXRpcEF0dHJpYnV0ZSAmJiAhb3B0cy5zcGxpdFRpdGxlICYmICFqcykgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIC8vIGlmIGhpZGVMb2NhbCBpcyBzZXQgdG8gdHJ1ZSwgb24gRE9NIHJlYWR5IGhpZGUgdGhlIGxvY2FsIGNvbnRlbnQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgY2x1ZVRpcAogICAgICBpZiAob3B0cy5sb2NhbCAmJiBvcHRzLmxvY2FsUHJlZml4KSB7dGlwQXR0cmlidXRlID0gb3B0cy5sb2NhbFByZWZpeCArIHRpcEF0dHJpYnV0ZTt9CiAgICAgIGlmIChvcHRzLmxvY2FsICYmIG9wdHMuaGlkZUxvY2FsICYmIHRpcEF0dHJpYnV0ZSkgeyAkKHRpcEF0dHJpYnV0ZSArICc6Zmlyc3QnKS5oaWRlKCk7IH0KCiAgICAgIHZhciB0T2Zmc2V0ID0gcGFyc2VJbnQob3B0cy50b3BPZmZzZXQsIDEwKSwgbE9mZnNldCA9IHBhcnNlSW50KG9wdHMubGVmdE9mZnNldCwgMTApOwogICAgICAvLyB2ZXJ0aWNhbCBtZWFzdXJlbWVudCB2YXJpYWJsZXMKICAgICAgdmFyIHRpcEhlaWdodCwgd0hlaWdodCwKICAgICAgICAgIGRlZkhlaWdodCA9IGlzTmFOKHBhcnNlSW50KG9wdHMuaGVpZ2h0LCAxMCkpID8gJ2F1dG8nIDogKC9cRC9nKS50ZXN0KG9wdHMuaGVpZ2h0KSA/IG9wdHMuaGVpZ2h0IDogb3B0cy5oZWlnaHQgKyAncHgnOwogICAgICB2YXIgc1RvcCwgbGlua1RvcCwgbGlua0JvdHRvbSwgcG9zWSwgdGlwWSwgbW91c2VZLCBiYXNlbGluZTsKICAgICAgLy8gaG9yaXpvbnRhbCBtZWFzdXJlbWVudCB2YXJpYWJsZXMKICAgICAgdmFyIHRpcElubmVyV2lkdGggPSBwYXJzZUludChvcHRzLndpZHRoLCAxMCkgfHwgMjc1LAogICAgICAgICAgdGlwV2lkdGggPSB0aXBJbm5lcldpZHRoICsgY2x1ZXRpcFBhZGRpbmcgKyBvcHRzLmRyb3BTaGFkb3dTdGVwcywKICAgICAgICAgIGxpbmtXaWR0aCA9IHRoaXMub2Zmc2V0V2lkdGgsCiAgICAgICAgICBsaW5rTGVmdCwgcG9zWCwgdGlwWCwgbW91c2VYLCB3aW5XaWR0aDsKCiAgICAgIC8vIHBhcnNlIHRoZSB0aXRsZQogICAgICB2YXIgdGlwUGFydHM7CiAgICAgIHZhciB0aXBUaXRsZSA9IChvcHRzLmF0dHJpYnV0ZSAhPSAndGl0bGUnKSA/ICRsaW5rLmF0dHIob3B0cy50aXRsZUF0dHJpYnV0ZSkgfHwgJycgOiAnJzsKICAgICAgaWYgKG9wdHMuc3BsaXRUaXRsZSkgewogICAgICAgIHRpcFBhcnRzID0gdGlwVGl0bGUuc3BsaXQob3B0cy5zcGxpdFRpdGxlKTsKICAgICAgICB0aXBUaXRsZSA9IG9wdHMuc2hvd1RpdGxlIHx8IHRpcFBhcnRzWzBdID09PSAnJyA/IHRpcFBhcnRzLnNoaWZ0KCkgOiAnJzsKICAgICAgfQogICAgICBpZiAob3B0cy5lc2NhcGVUaXRsZSkgewogICAgICAgIHRpcFRpdGxlID0gdGlwVGl0bGUucmVwbGFjZSgvJi9nLCcmYW1wOycpLnJlcGxhY2UoLz4vZywnJmd0OycpLnJlcGxhY2UoLzwvZywnJmx0OycpOwogICAgICB9CgogICAgICB2YXIgbG9jYWxDb250ZW50OwogICAgICBmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHsgcmV0dXJuIGZhbHNlOyB9CgogICAgICAvLyBLZWVwIHRyYWNrIG9mIG1vdXNlIGVudGVyZWQgc3RhdGUgb24gbGluawogICAgICAkbGluay5iaW5kKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgIHZhciBkYXRhID0gJGxpbmsuZGF0YSgnY2x1ZXRpcCcpOwogICAgICAgIGRhdGEuZW50ZXJlZCA9IGV2ZW50LnR5cGUgPT09ICdlbnRlcmVkJzsKICAgICAgICAkbGluay5kYXRhKCdjbHVldGlwJywgZGF0YSk7CiAgICAgIH0pOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIEFDVElWQVRJT04KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vYWN0aXZhdGUgY2x1ZVRpcAogICAgdmFyIGFjdGl2YXRlID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgdmFyIHBZLCBhamF4TWVyZ2VkU2V0dGluZ3MsIGNhY2hlS2V5LAogICAgICAgICAgY29udGludWVPbiA9IG9wdHMub25BY3RpdmF0ZS5jYWxsKGxpbmssIGV2ZW50KTsKCiAgICAgIGlmIChjb250aW51ZU9uID09PSBmYWxzZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgaXNBY3RpdmUgPSB0cnVlOwoKICAgICAgLy8gYWN0aXZhdGUgZnVuY3Rpb24gbWF5IGdldCBjYWxsZWQgYWZ0ZXIgYW4gaW5pdGlhbGl6YXRpb24gb2YgYQogICAgICAvLyBkaWZmZXJlbnQgdGFyZ2V0IHNvIG5lZWQgdG8gcmUtZ2V0IHRoZSBDb3JyZWN0IENsdWV0aXAgb2JqZWN0IGhlcmUKICAgICAgJGNsdWV0aXAgPSAkKGNsdWV0aXBTZWxlY3RvcikuY3NzKHtwb3NpdGlvbjogJ2Fic29sdXRlJ30pOwogICAgICAkY2x1ZXRpcE91dGVyID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC1vdXRlcicpOwogICAgICAkY2x1ZXRpcElubmVyID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC1pbm5lcicpOwogICAgICAkY2x1ZXRpcFRpdGxlID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC10aXRsZScpOwogICAgICAkY2x1ZXRpcEFycm93cyA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtYXJyb3dzJyk7CiAgICAgICRjbHVldGlwLnJlbW92ZUNsYXNzKCkuY3NzKHt3aWR0aDogdGlwSW5uZXJXaWR0aH0pOwogICAgICBpZiAodGlwQXR0cmlidXRlID09ICRsaW5rLmF0dHIoJ2hyZWYnKSkgewogICAgICAgICRsaW5rLmNzcygnY3Vyc29yJywgb3B0cy5jdXJzb3IpOwogICAgICB9CiAgICAgIGlmIChvcHRzLmhvdmVyQ2xhc3MpIHsKICAgICAgICAkbGluay5hZGRDbGFzcyhvcHRzLmhvdmVyQ2xhc3MpOwogICAgICB9CiAgICAgIGxpbmtUb3AgPSBwb3NZID0gJGxpbmsub2Zmc2V0KCkudG9wOwogICAgICBsaW5rQm90dG9tID0gbGlua1RvcCArICRsaW5rLmlubmVySGVpZ2h0KCk7CiAgICAgIGxpbmtMZWZ0ID0gJGxpbmsub2Zmc2V0KCkubGVmdDsKCiAgICAgIC8vIEZJWDogKGJ1ZyA0NDEyKQogICAgICBsaW5rV2lkdGggPSAkbGluay5pbm5lcldpZHRoKCk7CiAgICAgIGlmICggZXZlbnQudHlwZSA9PSBmb2N1cyApIHsKICAgICAgICAvLyBpbiBmb2N1cyBldmVudCwgbm8gbW91c2UgcG9zaXRpb24gaXMgYXZhaWxhYmxlOyB0aGlzIGlzIG5lZWRlZCB3aXRoIGJvdHRvbVRvcDoKICAgICAgICBtb3VzZVggPSBsaW5rTGVmdCArICAoIGxpbmtXaWR0aCAvIDIgKSArIGxPZmZzZXQ7CiAgICAgICAgJGNsdWV0aXAuY3NzKHtsZWZ0OiBwb3NYfSk7CiAgICAgICAgbW91c2VZID0gcG9zWSArIHRPZmZzZXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbW91c2VYID0gZXZlbnQucGFnZVg7CiAgICAgICAgbW91c2VZID0gZXZlbnQucGFnZVk7CiAgICAgIH0KICAgICAgLy9FTkQgT0YgRklYCgogICAgICBpZiAobGluay50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2FyZWEnKSB7CiAgICAgICAgc1RvcCA9ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpOwogICAgICAgIHdpbldpZHRoID0gJCh3aW5kb3cpLndpZHRoKCk7CiAgICAgIH0KLy8gcG9zaXRpb24gY2x1ZVRpcCBob3Jpem9udGFsbHkKICAgICAgaWYgKG9wdHMucG9zaXRpb25CeSA9PSAnZml4ZWQnKSB7CiAgICAgICAgcG9zWCA9IGxpbmtXaWR0aCArIGxpbmtMZWZ0ICsgbE9mZnNldDsKICAgICAgICAkY2x1ZXRpcC5jc3Moe2xlZnQ6IHBvc1h9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwb3NYID0gKGxpbmtXaWR0aCA+IGxpbmtMZWZ0ICYmIGxpbmtMZWZ0ID4gdGlwV2lkdGgpIHx8CiAgICAgICAgICBsaW5rTGVmdCArIGxpbmtXaWR0aCArIHRpcFdpZHRoICsgbE9mZnNldCA+IHdpbldpZHRoID8KICAgICAgICAgIGxpbmtMZWZ0IC0gdGlwV2lkdGggLSBsT2Zmc2V0IDoKICAgICAgICAgIGxpbmtXaWR0aCArIGxpbmtMZWZ0ICsgbE9mZnNldDsKICAgICAgICBpZiAobGluay50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2FyZWEnIHx8IG9wdHMucG9zaXRpb25CeSA9PSAnbW91c2UnIHx8IGxpbmtXaWR0aCArIHRpcFdpZHRoID4gd2luV2lkdGgpIHsgLy8gcG9zaXRpb24gYnkgbW91c2UKICAgICAgICAgIGlmIChtb3VzZVggKyAyMCArIHRpcFdpZHRoID4gd2luV2lkdGgpIHsKICAgICAgICAgICAgJGNsdWV0aXAuYWRkQ2xhc3MoJ2NsdWV0aXAtJyArIGN0Q2xhc3MpOwogICAgICAgICAgICBwb3NYID0gKG1vdXNlWCAtIHRpcFdpZHRoIC0gbE9mZnNldCkgPj0gMCA/IG1vdXNlWCAtIHRpcFdpZHRoIC0gbE9mZnNldCAtIHBhcnNlSW50KCRjbHVldGlwLmNzcygnbWFyZ2luTGVmdCcpLDEwKSArIHBhcnNlSW50KCRjbHVldGlwSW5uZXIuY3NzKCdtYXJnaW5SaWdodCcpLDEwKSA6ICBtb3VzZVggLSAodGlwV2lkdGgvMik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwb3NYID0gbW91c2VYICsgbE9mZnNldDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcFkgPSBwb3NYIDwgMCA/IGV2ZW50LnBhZ2VZICsgdE9mZnNldCA6IGV2ZW50LnBhZ2VZOwogICAgICAgIGlmIChwb3NYIDwgMCB8fCBvcHRzLnBvc2l0aW9uQnkgPT0gJ2JvdHRvbVRvcCcgIHx8IG9wdHMucG9zaXRpb25CeSA9PSAndG9wQm90dG9tJykgewogICAgICAgICAgcG9zWCA9IChtb3VzZVggKyAodGlwV2lkdGgvMikgPiB3aW5XaWR0aCkgPyB3aW5XaWR0aC8yIC0gdGlwV2lkdGgvMiA6IE1hdGgubWF4KG1vdXNlWCAtICh0aXBXaWR0aC8yKSwwKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICRjbHVldGlwQXJyb3dzLmNzcyh7ekluZGV4OiAkbGluay5kYXRhKCdjbHVldGlwJykuekluZGV4KzF9KTsKICAgICAgJGNsdWV0aXAuY3NzKHsKICAgICAgICBsZWZ0OiBwb3NYLAogICAgICAgIHpJbmRleDogJGxpbmsuZGF0YSgnY2x1ZXRpcCcpLnpJbmRleAogICAgICB9KTsKICAgICAgd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBsb2FkIGEgc3RyaW5nIGZyb20gY2x1ZXRpcCBtZXRob2QncyBmaXJzdCBhcmd1bWVudAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgIGlmIChqcykgewogICAgICAgIGlmICh0eXBlb2YganMgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAganMgPSBqcy5jYWxsKGxpbmspOwogICAgICAgIH0KICAgICAgICAkY2x1ZXRpcElubmVyLmh0bWwoanMpOwogICAgICAgIGNsdWV0aXBTaG93KHBZKTsKICAgICAgfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbG9hZCB0aGUgdGl0bGUgYXR0cmlidXRlIG9ubHkgKG9yIHVzZXItc2VsZWN0ZWQgYXR0cmlidXRlKS4KKiBjbHVlVGlwIHRpdGxlIGlzIHRoZSBzdHJpbmcgYmVmb3JlIHRoZSBmaXJzdCBkZWxpbWl0ZXIKKiBzdWJzZXF1ZW50IGRlbGltaXRlcnMgcGxhY2UgY2x1ZVRpcCBib2R5IHRleHQgb24gc2VwYXJhdGUgbGluZXMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgZWxzZSBpZiAodGlwUGFydHMpIHsKICAgICAgICB2YXIgdHBsID0gdGlwUGFydHMubGVuZ3RoOwogICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCh0cGwgPyB0aXBQYXJ0c1swXSA6ICcnKTsKICAgICAgICBpZiAodHBsID4gMSkgewogICAgICAgICAgZm9yICh2YXIgaT0xOyBpIDwgdHBsOyBpKyspewogICAgICAgICAgICAkY2x1ZXRpcElubmVyLmFwcGVuZCgnPGRpdiBjbGFzcz0ic3BsaXQtYm9keSI+JyArIHRpcFBhcnRzW2ldICsgJzwvZGl2PicpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjbHVldGlwU2hvdyhwWSk7CiAgICAgIH0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGxvYWQgZXh0ZXJuYWwgZmlsZSB2aWEgYWpheAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICBlbHNlIGlmICggIW9wdHMubG9jYWwgJiYgdGlwQXR0cmlidXRlLmluZGV4T2YoJyMnKSAhPT0gMCApIHsKICAgICAgICBpZiAoL1wuKGpwZT9nfHRpZmY/fGdpZnxwbmcpKD86XD8uKik/JC9pLnRlc3QodGlwQXR0cmlidXRlKSkgewogICAgICAgICAgJGNsdWV0aXBJbm5lci5odG1sKCc8aW1nIHNyYz0iJyArIHRpcEF0dHJpYnV0ZSArICciIGFsdD0iJyArIHRpcFRpdGxlICsgJyIgLz4nKTsKICAgICAgICAgIGNsdWV0aXBTaG93KHBZKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIG9wdGlvbkJlZm9yZVNlbmQgPSBvcHRzLmFqYXhTZXR0aW5ncy5iZWZvcmVTZW5kLAogICAgICAgICAgICAgIG9wdGlvbkVycm9yID0gb3B0cy5hamF4U2V0dGluZ3MuZXJyb3IsCiAgICAgICAgICAgICAgb3B0aW9uU3VjY2VzcyA9IG9wdHMuYWpheFNldHRpbmdzLnN1Y2Nlc3MsCiAgICAgICAgICAgICAgb3B0aW9uQ29tcGxldGUgPSBvcHRzLmFqYXhTZXR0aW5ncy5jb21wbGV0ZTsKCiAgICAgICAgICBjYWNoZUtleSA9IGdldENhY2hlS2V5KHRpcEF0dHJpYnV0ZSwgb3B0cy5hamF4U2V0dGluZ3MuZGF0YSk7CgogICAgICAgICAgdmFyIGFqYXhTZXR0aW5ncyA9IHsKICAgICAgICAgICAgY2FjaGU6IG9wdHMuYWpheENhY2hlLCAvLyBmb3JjZSByZXF1ZXN0ZWQgcGFnZSBub3QgdG8gYmUgY2FjaGVkIGJ5IGJyb3dzZXIKICAgICAgICAgICAgdXJsOiB0aXBBdHRyaWJ1dGUsCiAgICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKHhociwgc2V0dGluZ3MpIHsKICAgICAgICAgICAgICBpZiAob3B0aW9uQmVmb3JlU2VuZCkge29wdGlvbkJlZm9yZVNlbmQuY2FsbChsaW5rLCB4aHIsICRjbHVldGlwLCAkY2x1ZXRpcElubmVyLCBzZXR0aW5ncyk7fQogICAgICAgICAgICAgICRjbHVldGlwT3V0ZXIuY2hpbGRyZW4oKS5lbXB0eSgpOwogICAgICAgICAgICAgIGlmIChvcHRzLndhaXRJbWFnZSkgewogICAgICAgICAgICAgICAgJGNsdWV0aXBXYWl0CiAgICAgICAgICAgICAgICAuY3NzKHt0b3A6IG1vdXNlWSsyMCwgbGVmdDogbW91c2VYKzIwLCB6SW5kZXg6ICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS56SW5kZXgtMX0pCiAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKHhociwgdGV4dFN0YXR1cykgewogICAgICAgICAgICAgIGlmICggb3B0aW9ucy5hamF4Q2FjaGUgJiYgIWNhY2hlc1tjYWNoZUtleV0gKSB7CiAgICAgICAgICAgICAgICBjYWNoZXNbY2FjaGVLZXldID0ge3N0YXR1czogJ2Vycm9yJywgdGV4dFN0YXR1czogdGV4dFN0YXR1cywgeGhyOiB4aHJ9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgb3B0aW9uRXJyb3IuY2FsbChsaW5rLCB4aHIsIHRleHRTdGF0dXMsICRjbHVldGlwLCAkY2x1ZXRpcElubmVyKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCgnPGk+c29ycnksIHRoZSBjb250ZW50cyBjb3VsZCBub3QgYmUgbG9hZGVkPC9pPicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSwgdGV4dFN0YXR1cywgeGhyKSB7CiAgICAgICAgICAgICAgaWYgKCBvcHRpb25zLmFqYXhDYWNoZSAmJiAhY2FjaGVzW2NhY2hlS2V5XSApIHsKICAgICAgICAgICAgICAgIGNhY2hlc1tjYWNoZUtleV0gPSB7c3RhdHVzOiAnc3VjY2VzcycsIGRhdGE6IGRhdGEsIHRleHRTdGF0dXM6IHRleHRTdGF0dXMsIHhocjogeGhyfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNsdWV0aXBDb250ZW50cyA9IG9wdHMuYWpheFByb2Nlc3MuY2FsbChsaW5rLCBkYXRhKTsKCiAgICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGNoYW5naW5nIHRoZSB0aXRsZSBiYXNlZCBvbiBkYXRhIHJldHVybmVkIGJ5IHhocgogICAgICAgICAgICAgIGlmICggdHlwZW9mIGNsdWV0aXBDb250ZW50cyA9PSAnb2JqZWN0JyAmJiBjbHVldGlwQ29udGVudHMgIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICB0aXBUaXRsZSA9IGNsdWV0aXBDb250ZW50cy50aXRsZTsKICAgICAgICAgICAgICAgIGNsdWV0aXBDb250ZW50cyA9IGNsdWV0aXBDb250ZW50cy5jb250ZW50OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uU3VjY2VzcykgewogICAgICAgICAgICAgICAgICBvcHRpb25TdWNjZXNzLmNhbGwobGluaywgZGF0YSwgdGV4dFN0YXR1cywgJGNsdWV0aXAsICRjbHVldGlwSW5uZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGNsdWV0aXBJbm5lci5odG1sKGNsdWV0aXBDb250ZW50cyk7CgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKHhociwgdGV4dFN0YXR1cykgewogICAgICAgICAgICAgIGlmIChvcHRpb25Db21wbGV0ZSkgewogICAgICAgICAgICAgICAgb3B0aW9uQ29tcGxldGUuY2FsbChsaW5rLCB4aHIsIHRleHRTdGF0dXMsICRjbHVldGlwLCAkY2x1ZXRpcElubmVyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIGltZ3MgPSAkY2x1ZXRpcElubmVyWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTsKICAgICAgICAgICAgICBpbWdDb3VudCA9IGltZ3MubGVuZ3RoOwogICAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbCA9IGltZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoaW1nc1tpXS5jb21wbGV0ZSkgewogICAgICAgICAgICAgICAgICBpbWdDb3VudC0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoaW1nQ291bnQgJiYgISQuYnJvd3Nlci5vcGVyYSkgewogICAgICAgICAgICAgICAgJChpbWdzKS5iaW5kKCdsb2FkLmN0IGVycm9yLmN0JywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgIGltZ0NvdW50LS07CiAgICAgICAgICAgICAgICAgIGlmIChpbWdDb3VudCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICRjbHVldGlwV2FpdC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgJChpbWdzKS51bmJpbmQoJy5jdCcpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc0FjdGl2ZSkgeyBjbHVldGlwU2hvdyhwWSk7IH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRjbHVldGlwV2FpdC5oaWRlKCk7CiAgICAgICAgICAgICAgICBpZiAoaXNBY3RpdmUpIHsgY2x1ZXRpcFNob3cocFkpOyB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9OwoKICAgICAgICAgIGFqYXhNZXJnZWRTZXR0aW5ncyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBvcHRzLmFqYXhTZXR0aW5ncywgYWpheFNldHRpbmdzKTsKCiAgICAgICAgICBpZiAoIGNhY2hlc1tjYWNoZUtleV0gKSB7CiAgICAgICAgICAgIGNhY2hlZEFqYXgoIGNhY2hlc1tjYWNoZUtleV0sIGFqYXhNZXJnZWRTZXR0aW5ncyApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJC5hamF4KGFqYXhNZXJnZWRTZXR0aW5ncyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBsb2FkIGFuIGVsZW1lbnQgZnJvbSB0aGUgc2FtZSBwYWdlCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgZWxzZSBpZiAob3B0cy5sb2NhbCkgewogICAgICAgIHZhciAkbG9jYWxDb250ZW50ID0gJCh0aXBBdHRyaWJ1dGUgKyAoL14jXFMrJC8udGVzdCh0aXBBdHRyaWJ1dGUpID8gJycgOiAnOmVxKCcgKyBpbmRleCArICcpJykpLmNsb25lKHRydWUpLnNob3coKTsKICAgICAgICBpZiAob3B0cy5sb2NhbElkU3VmZml4KSB7CiAgICAgICAgICAkbG9jYWxDb250ZW50LmF0dHIoJ2lkJywgJGxvY2FsQ29udGVudFswXS5pZCArIG9wdHMubG9jYWxJZFN1ZmZpeCk7CiAgICAgICAgfQogICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCgkbG9jYWxDb250ZW50KTsKICAgICAgICBjbHVldGlwU2hvdyhwWSk7CiAgICAgIH0KICAgIH07CgovLyBnZXQgZGltZW5zaW9ucyBhbmQgb3B0aW9ucyBmb3IgY2x1ZXRpcCBhbmQgcHJlcGFyZSBpdCB0byBiZSBzaG93bgogICAgdmFyIGNsdWV0aXBTaG93ID0gZnVuY3Rpb24oYnBZKSB7CiAgICAgIHZhciAkY2xvc2VMaW5rLCBkeW5hbWljQ2xhc3NlcywgaGVpZ2h0RGlmZiwKICAgICAgICAgIHRpdGxlSFRNTCA9IHRpcFRpdGxlIHx8IG9wdHMuc2hvd1RpdGxlICYmICcmbmJzcDsnLAogICAgICAgICAgYmdZID0gJycsIGRpcmVjdGlvbiA9ICcnLCBpbnN1ZmZpY2llbnRYID0gZmFsc2U7CiAgICAgIHZhciBzdGlja3lDbG9zZSA9IHsKICAgICAgICBib3R0b206IGZ1bmN0aW9uKCRjTGluaykgewogICAgICAgICAgJGNMaW5rLmFwcGVuZFRvKCRjbHVldGlwSW5uZXIpOwogICAgICAgIH0sCiAgICAgICAgdG9wOiBmdW5jdGlvbigkY0xpbmspIHsKICAgICAgICAgICRjTGluay5wcmVwZW5kVG8oJGNsdWV0aXBJbm5lcik7CiAgICAgICAgfSwKICAgICAgICB0aXRsZTogZnVuY3Rpb24oJGNMaW5rKSB7CiAgICAgICAgICAkY0xpbmsucHJlcGVuZFRvKCRjbHVldGlwVGl0bGUpOwogICAgICAgIH0KICAgICAgfTsKCiAgICAgICRjbHVldGlwLmFkZENsYXNzKCdjbHVldGlwLScgKyBjdENsYXNzKTsKICAgICAgaWYgKG9wdHMudHJ1bmNhdGUpIHsKICAgICAgICB2YXIgJHRydW5jbG9hZGVkID0gJGNsdWV0aXBJbm5lci50ZXh0KCkuc2xpY2UoMCxvcHRzLnRydW5jYXRlKSArICcuLi4nOwogICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCgkdHJ1bmNsb2FkZWQpOwogICAgICB9CgogICAgICBpZiAodGl0bGVIVE1MKSB7CiAgICAgICAgJGNsdWV0aXBUaXRsZS5zaG93KCkuaHRtbCh0aXRsZUhUTUwpOwogICAgICB9IGVsc2UgewogICAgICAgICRjbHVldGlwVGl0bGUuaGlkZSgpOwogICAgICB9CgogICAgICBpZiAob3B0cy5zdGlja3kpIHsKICAgICAgICBpZiAoc3RpY2t5Q2xvc2Vbb3B0cy5jbG9zZVBvc2l0aW9uXSkgewogICAgICAgICAgJGNsb3NlTGluayA9ICQoJzxkaXYgY2xhc3M9ImNsdWV0aXAtY2xvc2UiPjxhIGhyZWY9IiMiPicgKyBvcHRzLmNsb3NlVGV4dCArICc8L2E+PC9kaXY+Jyk7CiAgICAgICAgICBzdGlja3lDbG9zZVtvcHRzLmNsb3NlUG9zaXRpb25dKCAkY2xvc2VMaW5rICk7CiAgICAgICAgICAkY2xvc2VMaW5rLmJpbmQoJ2NsaWNrLmNsdWV0aXAnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2x1ZXRpcENsb3NlKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAob3B0cy5tb3VzZU91dENsb3NlKSB7CiAgICAgICAgICAkbGluay51bmJpbmQoJ21vdXNlbGVhdmUuY2x1ZXRpcE1vYycpOwogICAgICAgICAgJGNsdWV0aXAudW5iaW5kKCdtb3VzZWxlYXZlLmNsdWV0aXBNb2MnKTsKICAgICAgICAgIGlmIChvcHRzLm1vdXNlT3V0Q2xvc2UgPT0gJ2JvdGgnIHx8IG9wdHMubW91c2VPdXRDbG9zZSA9PSAnY2x1ZXRpcCcgfHwgb3B0cy5tb3VzZU91dENsb3NlID09PSB0cnVlKSB7IC8vIHRydWUgaW1wbGllcyAnY2x1ZXRpcCcgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5CiAgICAgICAgICAgICRjbHVldGlwLmJpbmQoJ21vdXNlbGVhdmUuY2x1ZXRpcE1vYycsIG1vdXNlT3V0Q2xvc2UpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9wdHMubW91c2VPdXRDbG9zZSA9PSAnYm90aCcgfHwgb3B0cy5tb3VzZU91dENsb3NlID09ICdsaW5rJykgewogICAgICAgICAgICAkbGluay5iaW5kKCdtb3VzZWxlYXZlLmNsdWV0aXBNb2MnLCBtb3VzZU91dENsb3NlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCi8vIG5vdyB0aGF0IGNvbnRlbnQgaXMgbG9hZGVkLCBmaW5pc2ggdGhlIHBvc2l0aW9uaW5nCiAgICAgICRjbHVldGlwT3V0ZXIuY3NzKHt6SW5kZXg6ICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS56SW5kZXgsIG92ZXJmbG93OiBkZWZIZWlnaHQgPT0gJ2F1dG8nID8gJ3Zpc2libGUnIDogJ2F1dG8nLCBoZWlnaHQ6IGRlZkhlaWdodH0pOwogICAgICB0aXBIZWlnaHQgPSBkZWZIZWlnaHQgPT0gJ2F1dG8nID8gTWF0aC5tYXgoJGNsdWV0aXAub3V0ZXJIZWlnaHQoKSwkY2x1ZXRpcC5oZWlnaHQoKSkgOiBwYXJzZUludChkZWZIZWlnaHQsMTApOwogICAgICB0aXBZID0gcG9zWTsKICAgICAgYmFzZWxpbmUgPSBzVG9wICsgd0hlaWdodDsKICAgICAgaW5zdWZmaWNpZW50WCA9IChwb3NYIDwgbW91c2VYICYmIChNYXRoLm1heChwb3NYLCAwKSArIHRpcFdpZHRoID4gbW91c2VYKSk7CiAgICAgIGlmIChvcHRzLnBvc2l0aW9uQnkgPT0gJ2ZpeGVkJykgewogICAgICAgIHRpcFkgPSBwb3NZIC0gb3B0cy5kcm9wU2hhZG93U3RlcHMgKyB0T2Zmc2V0OwogICAgICB9IGVsc2UgaWYgKG9wdHMucG9zaXRpb25CeSA9PSAndG9wQm90dG9tJyB8fCBvcHRzLnBvc2l0aW9uQnkgPT0gJ2JvdHRvbVRvcCcgfHwgaW5zdWZmaWNpZW50WCkgewogICAgICAgIGlmIChvcHRzLnBvc2l0aW9uQnkgPT0gJ3RvcEJvdHRvbScpIHsKICAgICAgICAgIGlmIChwb3NZICsgdGlwSGVpZ2h0ICsgdE9mZnNldCA8IGJhc2VsaW5lICYmIG1vdXNlWSAtIHNUb3AgPCB0aXBIZWlnaHQgKyB0T2Zmc2V0KSB7CiAgICAgICAgICAgIGRpcmVjdGlvbiA9ICdib3R0b20nOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZGlyZWN0aW9uID0gJ3RvcCc7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChvcHRzLnBvc2l0aW9uQnkgPT0gJ2JvdHRvbVRvcCcgfHwgaW5zdWZmaWNpZW50WCkgewogICAgICAgICAgaWYgKHBvc1kgKyB0aXBIZWlnaHQgKyB0T2Zmc2V0ID4gYmFzZWxpbmUgJiYgbW91c2VZIC0gc1RvcCA+IHRpcEhlaWdodCArIHRPZmZzZXQpIHsKICAgICAgICAgICAgZGlyZWN0aW9uID0gJ3RvcCc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkaXJlY3Rpb24gPSAnYm90dG9tJzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdyBoYXZlIGEgZGlyZWN0aW9uLiBDb21wdXRlIHRpcFkKICAgICAgICBpZiAob3B0cy5zbmFwVG9FZGdlKSB7CiAgICAgICAgICBpZiAoZGlyZWN0aW9uID09ICd0b3AnKSB7CiAgICAgICAgICAgIHRpcFkgPSBsaW5rVG9wIC0gdGlwSGVpZ2h0IC0gdE9mZnNldDsKICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09ICdib3R0b20nKSB7CiAgICAgICAgICAgIHRpcFkgPSBsaW5rQm90dG9tICsgdE9mZnNldDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSAndG9wJykgewogICAgICAgICAgICB0aXBZID0gbW91c2VZIC0gdGlwSGVpZ2h0IC0gdE9mZnNldDsKICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09ICdib3R0b20nKSB7CiAgICAgICAgICAgIHRpcFkgPSBtb3VzZVkgKyB0T2Zmc2V0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICggcG9zWSArIHRpcEhlaWdodCArIHRPZmZzZXQgPiBiYXNlbGluZSApIHsKICAgICAgICB0aXBZID0gKHRpcEhlaWdodCA+PSB3SGVpZ2h0KSA/IHNUb3AgOiBiYXNlbGluZSAtIHRpcEhlaWdodCAtIHRPZmZzZXQ7CiAgICAgIH0gZWxzZSBpZiAoJGxpbmsuY3NzKCdkaXNwbGF5JykgPT0gJ2Jsb2NrJyB8fCBsaW5rLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAnYXJlYScgfHwgb3B0cy5wb3NpdGlvbkJ5ID09ICJtb3VzZSIpIHsKICAgICAgICB0aXBZID0gYnBZIC0gdE9mZnNldDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aXBZID0gcG9zWSAtIG9wdHMuZHJvcFNoYWRvd1N0ZXBzOwogICAgICB9CiAgICAgIGlmIChkaXJlY3Rpb24gPT09ICcnKSB7CiAgICAgICAgZGlyZWN0aW9uID0gcG9zWCA8IGxpbmtMZWZ0ID8gJ2xlZnQnIDogICdyaWdodCc7CiAgICAgIH0KICAgICAgLy8gYWRkIGNsYXNzZXMKICAgICAgZHluYW1pY0NsYXNzZXMgPSAnIGNsdWUtJyArIGRpcmVjdGlvbiArICctJyArIGN0Q2xhc3MgKyAnIGNsdWV0aXAtJyArIGN0Q2xhc3M7CiAgICAgIGlmIChjdENsYXNzID09ICdyb3VuZGVkJykgewogICAgICAgIGR5bmFtaWNDbGFzc2VzICs9ICcgdWktY29ybmVyLWFsbCc7CiAgICAgIH0KICAgICAgJGNsdWV0aXAuY3NzKHt0b3A6IHRpcFkgKyAncHgnfSkuYXR0clByb3AoeydjbGFzc05hbWUnOiBzdGFuZGFyZENsYXNzZXMgKyBkeW5hbWljQ2xhc3Nlc30pOwogICAgICAvLyBzZXQgdXAgYXJyb3cgcG9zaXRpb25pbmcgdG8gYWxpZ24gd2l0aCBlbGVtZW50CiAgICAgIGlmIChvcHRzLmFycm93cykgewogICAgICAgIGlmICggLyhsZWZ0fHJpZ2h0KS8udGVzdChkaXJlY3Rpb24pICkgewogICAgICAgICAgaGVpZ2h0RGlmZiA9ICRjbHVldGlwLmhlaWdodCgpIC0gJGNsdWV0aXBBcnJvd3MuaGVpZ2h0KCk7CiAgICAgICAgICBiZ1kgPSBwb3NYID49IDAgJiYgYnBZID4gMCA/IChwb3NZIC0gdGlwWSAtIG9wdHMuZHJvcFNoYWRvd1N0ZXBzKSA6IDA7CiAgICAgICAgICBiZ1kgPSBoZWlnaHREaWZmID4gYmdZID8gYmdZIDogaGVpZ2h0RGlmZjsKICAgICAgICAgIGJnWSArPSAncHgnOwogICAgICAgIH0KICAgICAgICAkY2x1ZXRpcEFycm93cy5jc3Moe3RvcDogYmdZfSkuc2hvdygpOwogICAgICB9IGVsc2UgewogICAgICAgICRjbHVldGlwQXJyb3dzLmhpZGUoKTsKICAgICAgfQoKLy8gKGZpcnN0IGhpZGUsIHRoZW4pICoqKlNIT1cgVEhFIENMVUVUSVAqKioKICAgICAgLy8gaGFuZGxlIGRyb3BzaGFkb3cgZGl2cyBmaXJzdAogICAgICAkZHJvcFNoYWRvdyA9IGNyZWF0ZURyb3BTaGFkb3dzKCRjbHVldGlwLCBvcHRzKTsKICAgICAgaWYgKCRkcm9wU2hhZG93ICYmICRkcm9wU2hhZG93Lmxlbmd0aCkgewogICAgICAgICRkcm9wU2hhZG93LmhpZGUoKS5jc3Moe2hlaWdodDogdGlwSGVpZ2h0LCB3aWR0aDogdGlwSW5uZXJXaWR0aCwgekluZGV4OiAkbGluay5kYXRhKCdjbHVldGlwJykuekluZGV4LTF9KS5zaG93KCk7CiAgICAgIH0KCiAgICAgIGlmICghY2xvc2VPbkRlbGF5KSB7CiAgICAgICAgJGNsdWV0aXAuaGlkZSgpOwogICAgICB9CiAgICAgIGNsZWFyVGltZW91dChjbG9zZU9uRGVsYXkpOwogICAgICBjbG9zZU9uRGVsYXkgPSBudWxsOwoKICAgICAgLy8gc2hvdyB0aGUgY2x1ZXRpcAogICAgICAkY2x1ZXRpcFtvcHRzLmZ4Lm9wZW5dKG9wdHMuZngub3BlblNwZWVkIHx8IDApOwoKICAgICAgaWYgKCQuZm4uYmdpZnJhbWUpIHsgJGNsdWV0aXAuYmdpZnJhbWUoKTsgfQoKICAgICAgLy8gdHJpZ2dlciB0aGUgb3B0aW9uYWwgb25TaG93IGZ1bmN0aW9uCiAgICAgIG9wdHMub25TaG93LmNhbGwobGluaywgJGNsdWV0aXAsICRjbHVldGlwSW5uZXIpOwogICAgfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgPUlOQUNUSVZBVElPTgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgdmFyIGluYWN0aXZhdGUgPSBmdW5jdGlvbihldmVudCkgewogICAgICBpc0FjdGl2ZSA9IGZhbHNlOwogICAgICAkY2x1ZXRpcFdhaXQuaGlkZSgpOwogICAgICBpZiAoIW9wdHMuc3RpY2t5IHx8ICgvY2xpY2t8dG9nZ2xlLykudGVzdChvcHRzLmFjdGl2YXRpb24pICkgewogICAgICAgIC8vIGRlbGF5ZWQgY2xvc2UgKG5vdCBmdWxseSB0ZXN0ZWQpCiAgICAgICAgaWYgKG9wdHMuZGVsYXllZENsb3NlID4gMCkgewogICAgICAgICAgY2xlYXJUaW1lb3V0KGNsb3NlT25EZWxheSk7CiAgICAgICAgICBjbG9zZU9uRGVsYXkgPSBudWxsOwogICAgICAgICAgY2xvc2VPbkRlbGF5ID0gc2V0VGltZW91dChjbHVldGlwQ2xvc2UsIG9wdHMuZGVsYXllZENsb3NlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChvcHRzLmhvdmVyQ2xhc3MpIHsKICAgICAgICAkbGluay5yZW1vdmVDbGFzcyhvcHRzLmhvdmVyQ2xhc3MpOwogICAgICB9CiAgICB9OwoKICAgIC8vIGNsb3NlIGNsdWV0aXAgYW5kIHJlc2V0IHNvbWUgdGhpbmdzCiAgICB2YXIgY2x1ZXRpcENsb3NlID0gZnVuY3Rpb24oZWwpIHsKICAgICAgdmFyICRjbG9zZXIgPSBlbCAmJiBlbC5kYXRhKCdjbHVldGlwJykgPyBlbCA6ICRsaW5rLAogICAgICAgICAgY3QgPSAkY2xvc2VyLmRhdGEoJ2NsdWV0aXAnKSAmJiAkY2xvc2VyLmRhdGEoJ2NsdWV0aXAnKS5zZWxlY3RvciwKICAgICAgICAgIGN0U2VsZWN0b3IgPSBjdCB8fCAnZGl2LmNsdWV0aXAnLAogICAgICAgICAgJGNsdWV0aXAgPSAkKGN0U2VsZWN0b3IpLAogICAgICAgICAgJGNsdWV0aXBJbm5lciA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtaW5uZXInKSwKICAgICAgICAgICRjbHVldGlwQXJyb3dzID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC1hcnJvd3MnKTsKCiAgICAgICRjbHVldGlwLmhpZGUoKS5yZW1vdmVDbGFzcygpOwogICAgICBvcHRzLm9uSGlkZS5jYWxsKCRjbG9zZXJbMF0sICRjbHVldGlwLCAkY2x1ZXRpcElubmVyKTsKCiAgICAgIGlmIChjdCkgewogICAgICAgICRjbG9zZXIucmVtb3ZlQ2xhc3MoJ2NsdWV0aXAtY2xpY2tlZCcpOwogICAgICAgICRjbG9zZXIuY3NzKCdjdXJzb3InLCcnKTsKICAgICAgfQogICAgICBpZiAoY3QgJiYgdGlwVGl0bGUpIHsKICAgICAgICAkY2xvc2VyLmF0dHJQcm9wKG9wdHMudGl0bGVBdHRyaWJ1dGUsIHRpcFRpdGxlKTsKICAgICAgfQoKICAgICAgaWYgKG9wdHMuYXJyb3dzKSB7CiAgICAgICAgJGNsdWV0aXBBcnJvd3MuY3NzKHt0b3A6ICcnfSk7CiAgICAgIH0KICAgIH07CgogICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCBiZSBjbG9zaW5nIGJ5IGNoZWNraW5nIHdoZXJlIHRoZSB1c2VyIGlzIGhvdmVyaW5nLgogICAgLy8gV2UgZG8gYSBzaG9ydCA1MG1zIGRlbGF5IGZvciB0d28gcmVhc29uczogdG8gcHJldmVudCBmbGlja2VyLCBhbmQgdG8gYWxsb3cgdGhlIHVzZXIgdGltZSB0byBob3ZlciBvbiBvdGhlciBlbGVtZW50CiAgICB2YXIgbW91c2VPdXRDbG9zZSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgZWwgPSB0aGlzOwogICAgICBjbGVhclRpbWVvdXQoY2xvc2VPbkRlbGF5KTsKICAgICAgY2xvc2VPbkRlbGF5ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbGlua092ZXIgPSAkbGluay5kYXRhKCdjbHVldGlwJykuZW50ZXJlZCwKICAgICAgICAgICAgY2x1ZXRpcE92ZXIgPSAkY2x1ZXRpcC5kYXRhKCdlbnRlcmVkJyksCiAgICAgICAgICAgIGVudGVyZWQgPSBmYWxzZTsKCiAgICAgICAgaWYgKCBvcHRzLm1vdXNlT3V0Q2xvc2UgPT0gJ2JvdGgnICYmIChsaW5rT3ZlciB8fCBjbHVldGlwT3ZlcikgKSB7CiAgICAgICAgICBlbnRlcmVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gdHJ1ZSBpbXBsaWVzICdjbHVldGlwJyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICAgICAgICBlbHNlIGlmICggKG9wdHMubW91c2VPdXRDbG9zZSA9PT0gdHJ1ZSB8fCBvcHRzLm1vdXNlT3V0Q2xvc2UgPT0gJ2NsdWV0aXAnKSAmJiBjbHVldGlwT3ZlcikgewogICAgICAgICAgZW50ZXJlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdHMubW91c2VPdXRDbG9zZSA9PSAnbGluaycgJiYgbGlua092ZXIpIHsKICAgICAgICAgIGVudGVyZWQgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhZW50ZXJlZCApIHsKICAgICAgICAgIC8vIEFsbCBjaGVja3MgcGFzcywgY2xvc2UgdGhlIGNsdWV0aXAKICAgICAgICAgIGNsdWV0aXBDbG9zZS5jYWxsKGVsKTsKICAgICAgICB9CgogICAgICB9LCBvcHRzLmRlbGF5ZWRDbG9zZSk7CiAgICB9OwoKICAgICQoZG9jdW1lbnQpLnVuYmluZCgnaGlkZUNsdWV0aXAuY2x1ZXRpcCcpLmJpbmQoJ2hpZGVDbHVldGlwLmNsdWV0aXAnLCBmdW5jdGlvbihlKSB7CiAgICAgIGNsdWV0aXBDbG9zZSggJChlLnRhcmdldCkgKTsKICAgIH0pOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgID1CSU5EIEVWRU5UUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogIC8vIGFjdGl2YXRlIGJ5IGNsaWNrCiAgICAgIGlmICggKC9jbGlja3x0b2dnbGUvKS50ZXN0KG9wdHMuYWN0aXZhdGlvbikgKSB7CiAgICAgICAgJGxpbmsuYmluZCgnY2xpY2suY2x1ZXRpcCcsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICBpZiAoJGNsdWV0aXAuaXMoJzpoaWRkZW4nKSB8fCAhJGxpbmsuaXMoJy5jbHVldGlwLWNsaWNrZWQnKSkgewogICAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgICQoJy5jbHVldGlwLWNsaWNrZWQnKS5yZW1vdmVDbGFzcygnY2x1ZXRpcC1jbGlja2VkJyk7CiAgICAgICAgICAgICRsaW5rLmFkZENsYXNzKCdjbHVldGlwLWNsaWNrZWQnKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluYWN0aXZhdGUoZXZlbnQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwogIC8vIGFjdGl2YXRlIGJ5IGZvY3VzOyBpbmFjdGl2YXRlIGJ5IGJsdXIKICAgICAgfSBlbHNlIGlmIChvcHRzLmFjdGl2YXRpb24gPT0gJ2ZvY3VzJykgewogICAgICAgICRsaW5rLmJpbmQoJ2ZvY3VzLmNsdWV0aXAnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgJGxpbmsuYXR0clByb3AoJ3RpdGxlJywnJyk7CiAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgfSk7CiAgICAgICAgJGxpbmsuYmluZCgnYmx1ci5jbHVldGlwJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICRsaW5rLmF0dHJQcm9wKCd0aXRsZScsICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS50aXRsZSk7CiAgICAgICAgICBpbmFjdGl2YXRlKGV2ZW50KTsKICAgICAgICB9KTsKICAvLyBhY3RpdmF0ZSBieSBob3ZlcgogICAgICB9IGVsc2UgewoKICAgICAgICAvLyBjbGlja2luZyBpcyByZXR1cm5lZCBmYWxzZSBpZiBjbGlja1Rocm91Z2ggb3B0aW9uIGlzIHNldCB0byBmYWxzZQogICAgICAgICRsaW5rW29wdHMuY2xpY2tUaHJvdWdoID8gJ3VuYmluZCcgOiAnYmluZCddKCdjbGljay5jbHVldGlwJywgcmV0dXJuRmFsc2UpOwoKICAgICAgICAvL3NldCB1cCBtb3VzZSB0cmFja2luZwogICAgICAgIHZhciBtb3VzZVRyYWNrcyA9IGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgaWYgKG9wdHMudHJhY2tpbmcpIHsKICAgICAgICAgICAgdmFyIHRyYWNrWCA9IHBvc1ggLSBldnQucGFnZVg7CiAgICAgICAgICAgIHZhciB0cmFja1kgPSB0aXBZID8gdGlwWSAtIGV2dC5wYWdlWSA6IHBvc1kgLSBldnQucGFnZVk7CiAgICAgICAgICAgICRsaW5rLmJpbmQoJ21vdXNlbW92ZS5jbHVldGlwJywgZnVuY3Rpb24oZXZ0KSB7CiAgICAgICAgICAgICAgJGNsdWV0aXAuY3NzKHtsZWZ0OiBldnQucGFnZVggKyB0cmFja1gsIHRvcDogZXZ0LnBhZ2VZICsgdHJhY2tZIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBpZiAoJC5mbi5ob3ZlckludGVudCAmJiBvcHRzLmhvdmVySW50ZW50KSB7CiAgICAgICAgICAkbGluay5ob3ZlckludGVudCh7CiAgICAgICAgICAgIHNlbnNpdGl2aXR5OiBvcHRzLmhvdmVySW50ZW50LnNlbnNpdGl2aXR5LAogICAgICAgICAgICBpbnRlcnZhbDogb3B0cy5ob3ZlckludGVudC5pbnRlcnZhbCwKICAgICAgICAgICAgb3ZlcjogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgICAgbW91c2VUcmFja3MoZXZlbnQpOwogICAgICAgICAgICB9LAogICAgICAgICAgICB0aW1lb3V0OiBvcHRzLmhvdmVySW50ZW50LnRpbWVvdXQsCiAgICAgICAgICAgIG91dDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICBpbmFjdGl2YXRlKGV2ZW50KTsKICAgICAgICAgICAgICAkbGluay51bmJpbmQoJ21vdXNlbW92ZS5jbHVldGlwJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkbGluay5iaW5kKCdtb3VzZWVudGVyLmNsdWV0aXAnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgIG1vdXNlVHJhY2tzKGV2ZW50KTsKICAgICAgICAgIH0pCiAgICAgICAgICAuYmluZCgnbW91c2VsZWF2ZS5jbHVldGlwJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgaW5hY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgICRsaW5rLnVuYmluZCgnbW91c2Vtb3ZlLmNsdWV0aXAnKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJGxpbmsuYmluZCgnbW91c2VvdmVyLmNsdWV0aXAnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgJGxpbmsuYXR0clByb3AoJ3RpdGxlJywnJyk7CiAgICAgICAgfSkuYmluZCgnbW91c2VsZWF2ZS5jbHVldGlwJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICRsaW5rLmF0dHJQcm9wKCd0aXRsZScsICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS50aXRsZSk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIC8vIHRyaWdnZXIgYSBjYWNoZWQgQWpheCByZXNwb25zZQogICAgICBmdW5jdGlvbiBjYWNoZWRBamF4KGluZm8sIHNldHRpbmdzKSB7CiAgICAgICAgdmFyIHN0YXR1cyA9IGluZm8uc3RhdHVzOwogICAgICAgIHNldHRpbmdzLmJlZm9yZVNlbmQoaW5mby54aHIsIHNldHRpbmdzKTsKICAgICAgICBpZiAoIHN0YXR1cyA9PSAnZXJyb3InICkgewogICAgICAgICAgc2V0dGluZ3Nbc3RhdHVzXShpbmZvLnhociwgaW5mby50ZXh0U3RhdHVzKTsKICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSAnc3VjY2VzcycpIHsKICAgICAgICAgIHNldHRpbmdzW3N0YXR1c10oaW5mby5kYXRhLCBpbmZvLnRleHRTdGF0dXMsIGluZm8ueGhyKTsKICAgICAgICB9CiAgICAgICAgc2V0dGluZ3MuY29tcGxldGUoaW5mby54aHIsIHNldHRpbmdzLnRleHRTdGF0dXMpOwogICAgICB9CgogICAgfSk7IC8vIGVuZCB0aGlzLmVhY2gKCiAgICAvKiogPXByaXZhdGUgZnVuY3Rpb25zCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAvL2VtcHR5IGZ1bmN0aW9uCiAgICBmdW5jdGlvbiBkb05vdGhpbmcoKSB7fQoKICAgIC8vIGNyZWF0ZSBhIHN0cmluZyB0byBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgZm9yIGFqYXggY2FjaGVzCiAgICBmdW5jdGlvbiBnZXRDYWNoZUtleSh1cmwsIGRhdGEpIHsKICAgICAgdmFyIGNhY2hlS2V5ID0gdXJsIHx8ICcnOwogICAgICBkYXRhID0gZGF0YSB8fCAnJzsKCiAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnb2JqZWN0JykgewogICAgICAgICQuZWFjaChkYXRhLCBmdW5jdGlvbihrZXksIHZhbCkgewogICAgICAgICAgY2FjaGVLZXkgKz0gJy0nICsga2V5ICsgJy0nICsgdmFsOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09ICdzdHJpbmcnKSB7CiAgICAgICAgY2FjaGVLZXkgKz0gZGF0YTsKICAgICAgfQoKICAgICAgcmV0dXJuIGNhY2hlS2V5OwogICAgfQoKICAgIC8qKiA9Y3JlYXRlIGRyb3BzaGFkb3cgZGl2cyAqKi8KCiAgICBmdW5jdGlvbiBjcmVhdGVEcm9wU2hhZG93cygkY2x1ZXRpcCwgb3B0aW9ucywgbmV3RHJvcFNoYWRvdykgewogICAgICB2YXIgZHNTdHlsZSA9ICcnLAogICAgICAgICAgZHJvcFNoYWRvd1N0ZXBzID0gKG9wdGlvbnMuZHJvcFNoYWRvdyAmJiBvcHRpb25zLmRyb3BTaGFkb3dTdGVwcykgPyArb3B0aW9ucy5kcm9wU2hhZG93U3RlcHMgOiAwOwoKICAgICAgaWYgKCQuc3VwcG9ydC5ib3hTaGFkb3cpIHsKICAgICAgICBpZiAoIGRyb3BTaGFkb3dTdGVwcyApIHsKICAgICAgICAgIGRzU3R5bGUgPSAnMXB4IDFweCAnICsgZHJvcFNoYWRvd1N0ZXBzICsgJ3B4IHJnYmEoMCwwLDAsMC41KSc7CiAgICAgICAgfQogICAgICAgIHZhciBkc09mZnNldHMgPSBkcm9wU2hhZG93U3RlcHMgPT09IDAgPyAnMCAwICcgOiAnMXB4IDFweCAnOwogICAgICAgICRjbHVldGlwLmNzcygkLnN1cHBvcnQuYm94U2hhZG93LCBkc1N0eWxlKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIG9sZERyb3BTaGFkb3cgPSAkY2x1ZXRpcC5maW5kKCcuY2x1ZXRpcC1kcm9wLXNoYWRvdycpOwogICAgICBpZiAoZHJvcFNoYWRvd1N0ZXBzID09IG9sZERyb3BTaGFkb3cubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIG9sZERyb3BTaGFkb3c7CiAgICAgIH0KICAgICAgb2xkRHJvcFNoYWRvdy5yZW1vdmUoKTsKICAgICAgdmFyIGRyb3BTaGFkb3dzID0gW107CiAgICAgIGZvciAodmFyIGk9MDsgaSA8IGRyb3BTaGFkb3dTdGVwczspIHsKICAgICAgICBkcm9wU2hhZG93c1tpKytdID0gJzxkaXYgc3R5bGU9InRvcDonICsgaSArICdweDtsZWZ0OicgKyBpICsgJ3B4OyI+PC9kaXY+JzsKICAgICAgfQoKICAgICAgbmV3RHJvcFNoYWRvdyA9ICQoZHJvcFNoYWRvd3Muam9pbignJykpCiAgICAgIC5jc3MoewogICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLAogICAgICAgIGJhY2tncm91bmRDb2xvcjogJyMwMDAnLAogICAgICAgIHpJbmRleDogY2x1ZXpJbmRleCAtMSwKICAgICAgICBvcGFjaXR5OiAwLjEKICAgICAgfSkKICAgICAgLmFkZENsYXNzKCdjbHVldGlwLWRyb3Atc2hhZG93JykKICAgICAgLnByZXBlbmRUbygkY2x1ZXRpcCk7CiAgICAgIHJldHVybiBuZXdEcm9wU2hhZG93OwoKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9OwoKICAoZnVuY3Rpb24oKSB7CiAgICAkLnN1cHBvcnQgPSAkLnN1cHBvcnQgfHwge307CiAgICAvLyBjaGVjayBzdXBwb3J0IGZvciBDU1MzIHByb3BlcnRpZXMgKGN1cnJlbnRseSBvbmx5IGJveFNoYWRvdykKICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwKICAgICAgICBkaXZTdHlsZSA9IGRpdi5zdHlsZSwKICAgICAgICBzdHlsZVByb3BzID0gWydib3hTaGFkb3cnXSwKICAgICAgICBwcmVmaXhlcyA9IFsnbW96JywgJ01veicsICd3ZWJraXQnLCAnbyddOwoKICAgIGZvciAodmFyIGk9MCwgc2wgPSBzdHlsZVByb3BzLmxlbmd0aDsgaSA8IHNsOyBpKyspIHsKICAgICAgdmFyIHByb3AgPSBzdHlsZVByb3BzW2ldLAogICAgICAgICAgdVByb3AgPSBwcm9wLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcC5zbGljZSgxKTsKCiAgICAgIGlmICggdHlwZW9mIGRpdlN0eWxlWyBwcm9wIF0gIT09ICd1bmRlZmluZWQnICkgewogICAgICAgICQuc3VwcG9ydFsgcHJvcCBdID0gcHJvcDsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKHZhciBqPTAsIHBsID0gcHJlZml4ZXMubGVuZ3RoOyBqIDwgcGw7IGorKykgewoKICAgICAgICAgIGlmICh0eXBlb2YgZGl2U3R5bGVbIHByZWZpeGVzW2pdICsgdVByb3AgXSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgJC5zdXBwb3J0WyBwcm9wIF0gPSBwcmVmaXhlc1tqXSArIHVQcm9wOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGRpdiA9IG51bGw7CiAgfSkoKTsKCiAgJC5mbi5jbHVldGlwLmRlZmF1bHRzID0gJC5jbHVldGlwLmRlZmF1bHRzOwoKfSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.cluetip.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBjbHVlVGlwIHBsdWdpbiB2MS4yLjcKICoKICogRGF0ZTogU2F0IE9jdCAxMyAxNzoxNzo0NyAyMDEyIEVEVAogKiBSZXF1aXJlczogalF1ZXJ5IHYxLjMrCiAqCiAqIENvcHlyaWdodCAyMDEyLCBLYXJsIFN3ZWRiZXJnCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAogKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwKICoKICoKICogRXhhbXBsZXMgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly9wbHVnaW5zLmxlYXJuaW5nanF1ZXJ5LmNvbS9jbHVldGlwL2RlbW8vCiAqCiovCihmdW5jdGlvbihjKXtjLmNsdWV0aXA9e3ZlcnNpb246IjEuMi43Iix0ZW1wbGF0ZTonPGRpdj48ZGl2IGNsYXNzPSJjbHVldGlwLW91dGVyIj48aDMgY2xhc3M9ImNsdWV0aXAtdGl0bGUgdWktd2lkZ2V0LWhlYWRlciB1aS1jbHVldGlwLWhlYWRlciI+PC9oMz48ZGl2IGNsYXNzPSJjbHVldGlwLWlubmVyIHVpLXdpZGdldC1jb250ZW50IHVpLWNsdWV0aXAtY29udGVudCI+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY2x1ZXRpcC1leHRyYSI+PC9kaXY+PC9kaXY+JyxzZXR1cDp7aW5zZXJ0aW9uVHlwZToiYXBwZW5kVG8iLGluc2VydGlvbkVsZW1lbnQ6ImJvZHkifSxkZWZhdWx0czp7bXVsdGlwbGU6ZmFsc2Usd2lkdGg6Mjc1LGhlaWdodDoiYXV0byIsY2x1ZXpJbmRleDo5Nyxwb3NpdGlvbkJ5OiJhdXRvIix0b3BPZmZzZXQ6MTUsbGVmdE9mZnNldDoxNSxzbmFwVG9FZGdlOmZhbHNlLGxvY2FsOmZhbHNlLGxvY2FsUHJlZml4Om51bGwsbG9jYWxJZFN1ZmZpeDpudWxsLGhpZGVMb2NhbDp0cnVlLAphdHRyaWJ1dGU6InJlbCIsdGl0bGVBdHRyaWJ1dGU6InRpdGxlIixzcGxpdFRpdGxlOiIiLGVzY2FwZVRpdGxlOmZhbHNlLHNob3dUaXRsZTp0cnVlLGNsdWV0aXBDbGFzczoiZGVmYXVsdCIsaG92ZXJDbGFzczoiIix3YWl0SW1hZ2U6dHJ1ZSxjdXJzb3I6ImhlbHAiLGFycm93czpmYWxzZSxkcm9wU2hhZG93OnRydWUsZHJvcFNoYWRvd1N0ZXBzOjYsc3RpY2t5OmZhbHNlLG1vdXNlT3V0Q2xvc2U6ZmFsc2UsZGVsYXllZENsb3NlOjUwLGFjdGl2YXRpb246ImhvdmVyIixjbGlja1Rocm91Z2g6dHJ1ZSx0cmFja2luZzpmYWxzZSxjbG9zZVBvc2l0aW9uOiJ0b3AiLGNsb3NlVGV4dDoiQ2xvc2UiLHRydW5jYXRlOjAsZng6e29wZW46InNob3ciLG9wZW5TcGVlZDoiIn0saG92ZXJJbnRlbnQ6e3NlbnNpdGl2aXR5OjMsaW50ZXJ2YWw6NTAsdGltZW91dDowfSxvbkFjdGl2YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRydWV9LG9uU2hvdzpmdW5jdGlvbigpe30sb25IaWRlOmZ1bmN0aW9uKCl7fSwKYWpheENhY2hlOnRydWUsYWpheFByb2Nlc3M6ZnVuY3Rpb24obSl7cmV0dXJuIG09bS5yZXBsYWNlKC88KHNjcmlwdHxzdHlsZXx0aXRsZSlbXjxdKzxcLyhzY3JpcHR8c3R5bGV8dGl0bGUpPi9nbSwiIikucmVwbGFjZSgvPChsaW5rfG1ldGEpW14+XSs+L2csIiIpfSxhamF4U2V0dGluZ3M6e2RhdGFUeXBlOiJodG1sIn0sZGVidWc6ZmFsc2V9fTt2YXIgRSxQPXt9LG1hPTAsVD0wO2MuZm4uYXR0clByb3A9Yy5mbi5wcm9wfHxjLmZuLmF0dHI7Yy5mbi5jbHVldGlwPWZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gVSh6LGspe3ZhciBsPXp8fCIiO2s9a3x8IiI7aWYodHlwZW9mIGs9PSJvYmplY3QiKWMuZWFjaChrLGZ1bmN0aW9uKGosZCl7bCs9Ii0iK2orIi0iK2R9KTtlbHNlIGlmKHR5cGVvZiBrPT0ic3RyaW5nIilsKz1rO3JldHVybiBsfWZ1bmN0aW9uIFYoeixrLGwpe2w9IiI7az1rLmRyb3BTaGFkb3cmJmsuZHJvcFNoYWRvd1N0ZXBzPytrLmRyb3BTaGFkb3dTdGVwczowO2lmKGMuc3VwcG9ydC5ib3hTaGFkb3cpe2lmKGspbD0KIjFweCAxcHggIitrKyJweCByZ2JhKDAsMCwwLDAuNSkiO3ouY3NzKGMuc3VwcG9ydC5ib3hTaGFkb3csbCk7cmV0dXJuIGZhbHNlfWw9ei5maW5kKCIuY2x1ZXRpcC1kcm9wLXNoYWRvdyIpO2lmKGs9PWwubGVuZ3RoKXJldHVybiBsO2wucmVtb3ZlKCk7bD1bXTtmb3IodmFyIGo9MDtqPGs7KWxbaisrXT0nPGRpdiBzdHlsZT0idG9wOicraisicHg7bGVmdDoiK2orJ3B4OyI+PC9kaXY+JztyZXR1cm4gbD1jKGwuam9pbigiIikpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixiYWNrZ3JvdW5kQ29sb3I6IiMwMDAiLHpJbmRleDpXLTEsb3BhY2l0eTowLjF9KS5hZGRDbGFzcygiY2x1ZXRpcC1kcm9wLXNoYWRvdyIpLnByZXBlbmRUbyh6KX12YXIgZSxoLEksdyxKLGdhO2lmKHR5cGVvZiBtPT0ib2JqZWN0Iil7cT1tO209bnVsbH1pZihtPT0iZGVzdHJveSIpe3ZhciBYPXRoaXMuZGF0YSgiY2x1ZXRpcCIpO2lmKFgpe2MoWC5zZWxlY3RvcikucmVtb3ZlKCk7Yy5yZW1vdmVEYXRhKHRoaXMsCiJ0aXRsZSIpO2MucmVtb3ZlRGF0YSh0aGlzLCJjbHVldGlwIik7Yy5yZW1vdmVEYXRhKHRoaXMsImNsdWV0aXBNb2MiKX1jKGRvY3VtZW50KS51bmJpbmQoIi5jbHVldGlwIik7cmV0dXJuIHRoaXMudW5iaW5kKCIuY2x1ZXRpcCIpfXE9Yy5leHRlbmQodHJ1ZSx7fSxjLmNsdWV0aXAuZGVmYXVsdHMscXx8e30pO21hKys7dmFyIFc7WD1jLmNsdWV0aXAuYmFja0NvbXBhdHx8IXEubXVsdGlwbGU/ImNsdWV0aXAiOiJjbHVldGlwLSIrbWE7dmFyIGhhPSIjIitYLEE9Yy5jbHVldGlwLmJhY2tDb21wYXQ/IiMiOiIuIixhYT1jLmNsdWV0aXAuc2V0dXAuaW5zZXJ0aW9uVHlwZSxyYT1jLmNsdWV0aXAuc2V0dXAuaW5zZXJ0aW9uRWxlbWVudHx8ImJvZHkiO2FhPS9hcHBlbmRUb3xwcmVwZW5kVG98aW5zZXJ0QmVmb3JlfGluc2VydEFmdGVyLy50ZXN0KGFhKT9hYToiYXBwZW5kVG8iO2U9YyhoYSk7aWYoIWUubGVuZ3RoKXtlPWMoYy5jbHVldGlwLnRlbXBsYXRlKVthYV0ocmEpLmF0dHIoImlkIiwKWCkuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUifSk7Vz0rcS5jbHVlekluZGV4O0k9ZS5maW5kKEErImNsdWV0aXAtb3V0ZXIiKS5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsekluZGV4Old9KTtoPWUuZmluZChBKyJjbHVldGlwLWlubmVyIik7dz1lLmZpbmQoQSsiY2x1ZXRpcC10aXRsZSIpO2UuYmluZCgibW91c2VlbnRlciBtb3VzZWxlYXZlIixmdW5jdGlvbih6KXtjKHRoaXMpLmRhdGEoImVudGVyZWQiLHoudHlwZT09PSJtb3VzZWVudGVyIil9KX1FPWMoIiNjbHVldGlwLXdhaXRpbWFnZSIpO2lmKCFFLmxlbmd0aCYmcS53YWl0SW1hZ2Upe0U9YygiPGRpdj48L2Rpdj4iKS5hdHRyKCJpZCIsImNsdWV0aXAtd2FpdGltYWdlIikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUifSk7RS5pbnNlcnRCZWZvcmUoZSkuaGlkZSgpfXZhciBzYT0ocGFyc2VJbnQoZS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKSsocGFyc2VJbnQoZS5jc3MoInBhZGRpbmdSaWdodCIpLAoxMCl8fDApO3RoaXMuZWFjaChmdW5jdGlvbih6KXtmdW5jdGlvbiBrKCl7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIGwoYixnKXt2YXIgZj1iLnN0YXR1cztnLmJlZm9yZVNlbmQoYi54aHIsZyk7aWYoZj09ImVycm9yIilnW2ZdKGIueGhyLGIudGV4dFN0YXR1cyk7ZWxzZSBmPT0ic3VjY2VzcyImJmdbZl0oYi5kYXRhLGIudGV4dFN0YXR1cyxiLnhocik7Zy5jb21wbGV0ZShiLnhocixnLnRleHRTdGF0dXMpfXZhciBqPXRoaXMsZD1jKHRoaXMpLGE9Yy5leHRlbmQodHJ1ZSx7fSxxLGMubWV0YWRhdGE/ZC5tZXRhZGF0YSgpOmMubWV0YT9kLmRhdGEoKTpkLmRhdGEoImNsdWV0aXAiKXx8e30pLEs9ZmFsc2UsUT1mYWxzZSxGPW51bGwscD1hW2EuYXR0cmlidXRlXXx8KGEuYXR0cmlidXRlPT0iaHJlZiI/ZC5hdHRyKGEuYXR0cmlidXRlKTpkLmF0dHJQcm9wKGEuYXR0cmlidXRlKXx8ZC5hdHRyKGEuYXR0cmlidXRlKSksWT1hLmNsdWV0aXBDbGFzcztXPSthLmNsdWV6SW5kZXg7ZC5kYXRhKCJjbHVldGlwIiwKe3RpdGxlOmoudGl0bGUsekluZGV4Olcsc2VsZWN0b3I6aGF9KTthLmFycm93cyYmIWUuZmluZCgiLmNsdWV0aXAtYXJyb3dzIikubGVuZ3RoJiZlLmFwcGVuZCgnPGRpdiBjbGFzcz0iY2x1ZXRpcC1hcnJvd3MgdWktc3RhdGUtZGVmYXVsdCI+PC9kaXY+Jyk7aWYoIXAmJiFhLnNwbGl0VGl0bGUmJiFtKXJldHVybiB0cnVlO2lmKGEubG9jYWwmJmEubG9jYWxQcmVmaXgpcD1hLmxvY2FsUHJlZml4K3A7YS5sb2NhbCYmYS5oaWRlTG9jYWwmJnAmJmMocCsiOmZpcnN0IikuaGlkZSgpO3ZhciBvPXBhcnNlSW50KGEudG9wT2Zmc2V0LDEwKSxHPXBhcnNlSW50KGEubGVmdE9mZnNldCwxMCksdCxpYSxiYT1pc05hTihwYXJzZUludChhLmhlaWdodCwxMCkpPyJhdXRvIjovXEQvZy50ZXN0KGEuaGVpZ2h0KT9hLmhlaWdodDphLmhlaWdodCsicHgiLFosamEsbmEseCx1LEwsJCxrYT1wYXJzZUludChhLndpZHRoLDEwKXx8Mjc1LHI9a2Erc2ErYS5kcm9wU2hhZG93U3RlcHMsTT10aGlzLm9mZnNldFdpZHRoLApCLG4scyxSLE4sQz1hLmF0dHJpYnV0ZSE9InRpdGxlIj9kLmF0dHIoYS50aXRsZUF0dHJpYnV0ZSl8fCIiOiIiO2lmKGEuc3BsaXRUaXRsZSl7Tj1DLnNwbGl0KGEuc3BsaXRUaXRsZSk7Qz1hLnNob3dUaXRsZXx8TlswXT09PSIiP04uc2hpZnQoKToiIn1pZihhLmVzY2FwZVRpdGxlKUM9Qy5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvPC9nLCImbHQ7Iik7ZC5iaW5kKCJtb3VzZWVudGVyIG1vdXNlbGVhdmUiLGZ1bmN0aW9uKGIpe3ZhciBnPWQuZGF0YSgiY2x1ZXRpcCIpO2cuZW50ZXJlZD1iLnR5cGU9PT0iZW50ZXJlZCI7ZC5kYXRhKCJjbHVldGlwIixnKX0pO3ZhciBkYT1mdW5jdGlvbihiKXt2YXIgZyxmO2lmKGEub25BY3RpdmF0ZS5jYWxsKGosYik9PT1mYWxzZSlyZXR1cm4gZmFsc2U7UT10cnVlO2U9YyhoYSkuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUifSk7ST1lLmZpbmQoQSsiY2x1ZXRpcC1vdXRlciIpO2g9ZS5maW5kKEErCiJjbHVldGlwLWlubmVyIik7dz1lLmZpbmQoQSsiY2x1ZXRpcC10aXRsZSIpO0o9ZS5maW5kKEErImNsdWV0aXAtYXJyb3dzIik7ZS5yZW1vdmVDbGFzcygpLmNzcyh7d2lkdGg6a2F9KTtwPT1kLmF0dHIoImhyZWYiKSYmZC5jc3MoImN1cnNvciIsYS5jdXJzb3IpO2EuaG92ZXJDbGFzcyYmZC5hZGRDbGFzcyhhLmhvdmVyQ2xhc3MpO2phPXg9ZC5vZmZzZXQoKS50b3A7bmE9amErZC5pbm5lckhlaWdodCgpO0I9ZC5vZmZzZXQoKS5sZWZ0O009ZC5pbm5lcldpZHRoKCk7aWYoYi50eXBlPT1mb2N1cyl7cz1CK00vMitHO2UuY3NzKHtsZWZ0Om59KTtMPXgrb31lbHNle3M9Yi5wYWdlWDtMPWIucGFnZVl9aWYoai50YWdOYW1lLnRvTG93ZXJDYXNlKCkhPSJhcmVhIil7Wj1jKGRvY3VtZW50KS5zY3JvbGxUb3AoKTtSPWMod2luZG93KS53aWR0aCgpfWlmKGEucG9zaXRpb25CeT09ImZpeGVkIil7bj1NK0IrRztlLmNzcyh7bGVmdDpufSl9ZWxzZXtuPU0+QiYmQj5yfHxCK00rcitHPlI/Qi0Kci1HOk0rQitHO2lmKGoudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT0iYXJlYSJ8fGEucG9zaXRpb25CeT09Im1vdXNlInx8TStyPlIpaWYocysyMCtyPlIpe2UuYWRkQ2xhc3MoImNsdWV0aXAtIitZKTtuPXMtci1HPj0wP3Mtci1HLXBhcnNlSW50KGUuY3NzKCJtYXJnaW5MZWZ0IiksMTApK3BhcnNlSW50KGguY3NzKCJtYXJnaW5SaWdodCIpLDEwKTpzLXIvMn1lbHNlIG49cytHO2c9bjwwP2IucGFnZVkrbzpiLnBhZ2VZO2lmKG48MHx8YS5wb3NpdGlvbkJ5PT0iYm90dG9tVG9wInx8YS5wb3NpdGlvbkJ5PT0idG9wQm90dG9tIiluPXMrci8yPlI/Ui8yLXIvMjpNYXRoLm1heChzLXIvMiwwKX1KLmNzcyh7ekluZGV4OmQuZGF0YSgiY2x1ZXRpcCIpLnpJbmRleCsxfSk7ZS5jc3Moe2xlZnQ6bix6SW5kZXg6ZC5kYXRhKCJjbHVldGlwIikuekluZGV4fSk7aWE9Yyh3aW5kb3cpLmhlaWdodCgpO2lmKG0pe2lmKHR5cGVvZiBtPT0iZnVuY3Rpb24iKW09bS5jYWxsKGopO2guaHRtbChtKTtTKGcpfWVsc2UgaWYoTil7Yj0KTi5sZW5ndGg7aC5odG1sKGI/TlswXToiIik7aWYoYj4xKWZvcih2YXIgaT0xO2k8YjtpKyspaC5hcHBlbmQoJzxkaXYgY2xhc3M9InNwbGl0LWJvZHkiPicrTltpXSsiPC9kaXY+Iik7UyhnKX1lbHNlIGlmKCFhLmxvY2FsJiZwLmluZGV4T2YoIiMiKSE9PTApaWYoL1wuKGpwZT9nfHRpZmY/fGdpZnxwbmcpKD86XD8uKik/JC9pLnRlc3QocCkpe2guaHRtbCgnPGltZyBzcmM9IicrcCsnIiBhbHQ9IicrQysnIiAvPicpO1MoZyl9ZWxzZXt2YXIgdj1hLmFqYXhTZXR0aW5ncy5iZWZvcmVTZW5kLGNhPWEuYWpheFNldHRpbmdzLmVycm9yLEg9YS5hamF4U2V0dGluZ3Muc3VjY2VzcyxvYT1hLmFqYXhTZXR0aW5ncy5jb21wbGV0ZTtmPVUocCxhLmFqYXhTZXR0aW5ncy5kYXRhKTtiPWMuZXh0ZW5kKHRydWUse30sYS5hamF4U2V0dGluZ3Mse2NhY2hlOmEuYWpheENhY2hlLHVybDpwLGJlZm9yZVNlbmQ6ZnVuY3Rpb24oeSxEKXt2JiZ2LmNhbGwoaix5LGUsaCxEKTtJLmNoaWxkcmVuKCkuZW1wdHkoKTsKYS53YWl0SW1hZ2UmJkUuY3NzKHt0b3A6TCsyMCxsZWZ0OnMrMjAsekluZGV4OmQuZGF0YSgiY2x1ZXRpcCIpLnpJbmRleC0xfSkuc2hvdygpfSxlcnJvcjpmdW5jdGlvbih5LEQpe2lmKHEuYWpheENhY2hlJiYhUFtmXSlQW2ZdPXtzdGF0dXM6ImVycm9yIix0ZXh0U3RhdHVzOkQseGhyOnl9O2lmKFEpY2E/Y2EuY2FsbChqLHksRCxlLGgpOmguaHRtbCgiPGk+c29ycnksIHRoZSBjb250ZW50cyBjb3VsZCBub3QgYmUgbG9hZGVkPC9pPiIpfSxzdWNjZXNzOmZ1bmN0aW9uKHksRCxPKXtpZihxLmFqYXhDYWNoZSYmIVBbZl0pUFtmXT17c3RhdHVzOiJzdWNjZXNzIixkYXRhOnksdGV4dFN0YXR1czpELHhocjpPfTtLPWEuYWpheFByb2Nlc3MuY2FsbChqLHkpO2lmKHR5cGVvZiBLPT0ib2JqZWN0IiYmSyE9PW51bGwpe0M9Sy50aXRsZTtLPUsuY29udGVudH1pZihRKXtIJiZILmNhbGwoaix5LEQsZSxoKTtoLmh0bWwoSyl9fSxjb21wbGV0ZTpmdW5jdGlvbih5LEQpe29hJiZvYS5jYWxsKGosCnksRCxlLGgpO3ZhciBPPWhbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImltZyIpO1Q9Ty5sZW5ndGg7Zm9yKHZhciBsYT0wLHRhPU8ubGVuZ3RoO2xhPHRhO2xhKyspT1tsYV0uY29tcGxldGUmJlQtLTtpZihUJiYhYy5icm93c2VyLm9wZXJhKWMoTykuYmluZCgibG9hZC5jdCBlcnJvci5jdCIsZnVuY3Rpb24oKXtULS07aWYoVD09PTApe0UuaGlkZSgpO2MoTykudW5iaW5kKCIuY3QiKTtRJiZTKGcpfX0pO2Vsc2V7RS5oaWRlKCk7USYmUyhnKX19fSk7UFtmXT9sKFBbZl0sYik6Yy5hamF4KGIpfWVsc2UgaWYoYS5sb2NhbCl7Yj1jKHArKC9eI1xTKyQvLnRlc3QocCk/IiI6IjplcSgiK3orIikiKSkuY2xvbmUodHJ1ZSkuc2hvdygpO2EubG9jYWxJZFN1ZmZpeCYmYi5hdHRyKCJpZCIsYlswXS5pZCthLmxvY2FsSWRTdWZmaXgpO2guaHRtbChiKTtTKGcpfX0sUz1mdW5jdGlvbihiKXt2YXIgZyxmO2c9Q3x8YS5zaG93VGl0bGUmJiImbmJzcDsiO3ZhciBpPSIiO2Y9IiI7dmFyIHY9ZmFsc2U7CnY9e2JvdHRvbTpmdW5jdGlvbihIKXtILmFwcGVuZFRvKGgpfSx0b3A6ZnVuY3Rpb24oSCl7SC5wcmVwZW5kVG8oaCl9LHRpdGxlOmZ1bmN0aW9uKEgpe0gucHJlcGVuZFRvKHcpfX07ZS5hZGRDbGFzcygiY2x1ZXRpcC0iK1kpO2lmKGEudHJ1bmNhdGUpe3ZhciBjYT1oLnRleHQoKS5zbGljZSgwLGEudHJ1bmNhdGUpKyIuLi4iO2guaHRtbChjYSl9Zz93LnNob3coKS5odG1sKGcpOncuaGlkZSgpO2lmKGEuc3RpY2t5KXtpZih2W2EuY2xvc2VQb3NpdGlvbl0pe2c9YygnPGRpdiBjbGFzcz0iY2x1ZXRpcC1jbG9zZSI+PGEgaHJlZj0iIyI+JythLmNsb3NlVGV4dCsiPC9hPjwvZGl2PiIpO3ZbYS5jbG9zZVBvc2l0aW9uXShnKTtnLmJpbmQoImNsaWNrLmNsdWV0aXAiLGZ1bmN0aW9uKCl7ZWEoKTtyZXR1cm4gZmFsc2V9KX1pZihhLm1vdXNlT3V0Q2xvc2Upe2QudW5iaW5kKCJtb3VzZWxlYXZlLmNsdWV0aXBNb2MiKTtlLnVuYmluZCgibW91c2VsZWF2ZS5jbHVldGlwTW9jIik7aWYoYS5tb3VzZU91dENsb3NlPT0KImJvdGgifHxhLm1vdXNlT3V0Q2xvc2U9PSJjbHVldGlwInx8YS5tb3VzZU91dENsb3NlPT09dHJ1ZSllLmJpbmQoIm1vdXNlbGVhdmUuY2x1ZXRpcE1vYyIscGEpO2lmKGEubW91c2VPdXRDbG9zZT09ImJvdGgifHxhLm1vdXNlT3V0Q2xvc2U9PSJsaW5rIilkLmJpbmQoIm1vdXNlbGVhdmUuY2x1ZXRpcE1vYyIscGEpfX1JLmNzcyh7ekluZGV4OmQuZGF0YSgiY2x1ZXRpcCIpLnpJbmRleCxvdmVyZmxvdzpiYT09ImF1dG8iPyJ2aXNpYmxlIjoiYXV0byIsaGVpZ2h0OmJhfSk7dD1iYT09ImF1dG8iP01hdGgubWF4KGUub3V0ZXJIZWlnaHQoKSxlLmhlaWdodCgpKTpwYXJzZUludChiYSwxMCk7dT14OyQ9WitpYTt2PW48cyYmTWF0aC5tYXgobiwwKStyPnM7aWYoYS5wb3NpdGlvbkJ5PT0iZml4ZWQiKXU9eC1hLmRyb3BTaGFkb3dTdGVwcytvO2Vsc2UgaWYoYS5wb3NpdGlvbkJ5PT0idG9wQm90dG9tInx8YS5wb3NpdGlvbkJ5PT0iYm90dG9tVG9wInx8dil7aWYoYS5wb3NpdGlvbkJ5PT0KInRvcEJvdHRvbSIpZj14K3QrbzwkJiZMLVo8dCtvPyJib3R0b20iOiJ0b3AiO2Vsc2UgaWYoYS5wb3NpdGlvbkJ5PT0iYm90dG9tVG9wInx8dilmPXgrdCtvPiQmJkwtWj50K28/InRvcCI6ImJvdHRvbSI7aWYoYS5zbmFwVG9FZGdlKWlmKGY9PSJ0b3AiKXU9amEtdC1vO2Vsc2V7aWYoZj09ImJvdHRvbSIpdT1uYStvfWVsc2UgaWYoZj09InRvcCIpdT1MLXQtbztlbHNlIGlmKGY9PSJib3R0b20iKXU9TCtvfWVsc2UgdT14K3Qrbz4kP3Q+PWlhP1o6JC10LW86ZC5jc3MoImRpc3BsYXkiKT09ImJsb2NrInx8ai50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJhcmVhInx8YS5wb3NpdGlvbkJ5PT0ibW91c2UiP2Itbzp4LWEuZHJvcFNoYWRvd1N0ZXBzO2lmKGY9PT0iIilmPW48Qj8ibGVmdCI6InJpZ2h0IjtnPSIgY2x1ZS0iK2YrIi0iK1krIiBjbHVldGlwLSIrWTtpZihZPT0icm91bmRlZCIpZys9IiB1aS1jb3JuZXItYWxsIjtlLmNzcyh7dG9wOnUrInB4In0pLmF0dHJQcm9wKHtjbGFzc05hbWU6ImNsdWV0aXAgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNsdWV0aXAiKwpnfSk7aWYoYS5hcnJvd3Mpe2lmKC8obGVmdHxyaWdodCkvLnRlc3QoZikpe2Y9ZS5oZWlnaHQoKS1KLmhlaWdodCgpO2k9bj49MCYmYj4wP3gtdS1hLmRyb3BTaGFkb3dTdGVwczowO2k9Zj5pP2k6ZjtpKz0icHgifUouY3NzKHt0b3A6aX0pLnNob3coKX1lbHNlIEouaGlkZSgpOyhnYT1WKGUsYSkpJiZnYS5sZW5ndGgmJmdhLmhpZGUoKS5jc3Moe2hlaWdodDp0LHdpZHRoOmthLHpJbmRleDpkLmRhdGEoImNsdWV0aXAiKS56SW5kZXgtMX0pLnNob3coKTtGfHxlLmhpZGUoKTtjbGVhclRpbWVvdXQoRik7Rj1udWxsO2VbYS5meC5vcGVuXShhLmZ4Lm9wZW5TcGVlZHx8MCk7Yy5mbi5iZ2lmcmFtZSYmZS5iZ2lmcmFtZSgpO2Eub25TaG93LmNhbGwoaixlLGgpfSxmYT1mdW5jdGlvbigpe1E9ZmFsc2U7RS5oaWRlKCk7aWYoIWEuc3RpY2t5fHwvY2xpY2t8dG9nZ2xlLy50ZXN0KGEuYWN0aXZhdGlvbikpaWYoYS5kZWxheWVkQ2xvc2U+MCl7Y2xlYXJUaW1lb3V0KEYpO0Y9bnVsbDtGPXNldFRpbWVvdXQoZWEsCmEuZGVsYXllZENsb3NlKX1hLmhvdmVyQ2xhc3MmJmQucmVtb3ZlQ2xhc3MoYS5ob3ZlckNsYXNzKX0sZWE9ZnVuY3Rpb24oYil7Yj1iJiZiLmRhdGEoImNsdWV0aXAiKT9iOmQ7dmFyIGc9Yi5kYXRhKCJjbHVldGlwIikmJmIuZGF0YSgiY2x1ZXRpcCIpLnNlbGVjdG9yLGY9YyhnfHwiZGl2LmNsdWV0aXAiKSxpPWYuZmluZChBKyJjbHVldGlwLWlubmVyIiksdj1mLmZpbmQoQSsiY2x1ZXRpcC1hcnJvd3MiKTtmLmhpZGUoKS5yZW1vdmVDbGFzcygpO2Eub25IaWRlLmNhbGwoYlswXSxmLGkpO2lmKGcpe2IucmVtb3ZlQ2xhc3MoImNsdWV0aXAtY2xpY2tlZCIpO2IuY3NzKCJjdXJzb3IiLCIiKX1nJiZDJiZiLmF0dHJQcm9wKGEudGl0bGVBdHRyaWJ1dGUsQyk7YS5hcnJvd3MmJnYuY3NzKHt0b3A6IiJ9KX0scGE9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2NsZWFyVGltZW91dChGKTtGPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZz1kLmRhdGEoImNsdWV0aXAiKS5lbnRlcmVkLGY9ZS5kYXRhKCJlbnRlcmVkIiksCmk9ZmFsc2U7aWYoYS5tb3VzZU91dENsb3NlPT0iYm90aCImJihnfHxmKSlpPXRydWU7ZWxzZSBpZigoYS5tb3VzZU91dENsb3NlPT09dHJ1ZXx8YS5tb3VzZU91dENsb3NlPT0iY2x1ZXRpcCIpJiZmKWk9dHJ1ZTtlbHNlIGlmKGEubW91c2VPdXRDbG9zZT09ImxpbmsiJiZnKWk9dHJ1ZTtpfHxlYS5jYWxsKGIpfSxhLmRlbGF5ZWRDbG9zZSl9O2MoZG9jdW1lbnQpLnVuYmluZCgiaGlkZUNsdWV0aXAuY2x1ZXRpcCIpLmJpbmQoImhpZGVDbHVldGlwLmNsdWV0aXAiLGZ1bmN0aW9uKGIpe2VhKGMoYi50YXJnZXQpKX0pO2lmKC9jbGlja3x0b2dnbGUvLnRlc3QoYS5hY3RpdmF0aW9uKSlkLmJpbmQoImNsaWNrLmNsdWV0aXAiLGZ1bmN0aW9uKGIpe2lmKGUuaXMoIjpoaWRkZW4iKXx8IWQuaXMoIi5jbHVldGlwLWNsaWNrZWQiKSl7ZGEoYik7YygiLmNsdWV0aXAtY2xpY2tlZCIpLnJlbW92ZUNsYXNzKCJjbHVldGlwLWNsaWNrZWQiKTtkLmFkZENsYXNzKCJjbHVldGlwLWNsaWNrZWQiKX1lbHNlIGZhKGIpOwpyZXR1cm4gZmFsc2V9KTtlbHNlIGlmKGEuYWN0aXZhdGlvbj09ImZvY3VzIil7ZC5iaW5kKCJmb2N1cy5jbHVldGlwIixmdW5jdGlvbihiKXtkLmF0dHJQcm9wKCJ0aXRsZSIsIiIpO2RhKGIpfSk7ZC5iaW5kKCJibHVyLmNsdWV0aXAiLGZ1bmN0aW9uKGIpe2QuYXR0clByb3AoInRpdGxlIixkLmRhdGEoImNsdWV0aXAiKS50aXRsZSk7ZmEoYil9KX1lbHNle2RbYS5jbGlja1Rocm91Z2g/InVuYmluZCI6ImJpbmQiXSgiY2xpY2suY2x1ZXRpcCIsayk7dmFyIHFhPWZ1bmN0aW9uKGIpe2lmKGEudHJhY2tpbmcpe3ZhciBnPW4tYi5wYWdlWCxmPXU/dS1iLnBhZ2VZOngtYi5wYWdlWTtkLmJpbmQoIm1vdXNlbW92ZS5jbHVldGlwIixmdW5jdGlvbihpKXtlLmNzcyh7bGVmdDppLnBhZ2VYK2csdG9wOmkucGFnZVkrZn0pfSl9fTtjLmZuLmhvdmVySW50ZW50JiZhLmhvdmVySW50ZW50P2QuaG92ZXJJbnRlbnQoe3NlbnNpdGl2aXR5OmEuaG92ZXJJbnRlbnQuc2Vuc2l0aXZpdHksaW50ZXJ2YWw6YS5ob3ZlckludGVudC5pbnRlcnZhbCwKb3ZlcjpmdW5jdGlvbihiKXtkYShiKTtxYShiKX0sdGltZW91dDphLmhvdmVySW50ZW50LnRpbWVvdXQsb3V0OmZ1bmN0aW9uKGIpe2ZhKGIpO2QudW5iaW5kKCJtb3VzZW1vdmUuY2x1ZXRpcCIpfX0pOmQuYmluZCgibW91c2VlbnRlci5jbHVldGlwIixmdW5jdGlvbihiKXtkYShiKTtxYShiKX0pLmJpbmQoIm1vdXNlbGVhdmUuY2x1ZXRpcCIsZnVuY3Rpb24oYil7ZmEoYik7ZC51bmJpbmQoIm1vdXNlbW92ZS5jbHVldGlwIil9KTtkLmJpbmQoIm1vdXNlb3Zlci5jbHVldGlwIixmdW5jdGlvbigpe2QuYXR0clByb3AoInRpdGxlIiwiIil9KS5iaW5kKCJtb3VzZWxlYXZlLmNsdWV0aXAiLGZ1bmN0aW9uKCl7ZC5hdHRyUHJvcCgidGl0bGUiLGQuZGF0YSgiY2x1ZXRpcCIpLnRpdGxlKX0pfX0pO3JldHVybiB0aGlzfTsoZnVuY3Rpb24oKXtjLnN1cHBvcnQ9Yy5zdXBwb3J0fHx7fTtmb3IodmFyIG09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUscT1bImJveFNoYWRvdyJdLApVPVsibW96IiwiTW96Iiwid2Via2l0IiwibyJdLFY9MCxlPXEubGVuZ3RoO1Y8ZTtWKyspe3ZhciBoPXFbVl0sST1oLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2guc2xpY2UoMSk7aWYodHlwZW9mIG1baF0hPT0idW5kZWZpbmVkIiljLnN1cHBvcnRbaF09aDtlbHNlIGZvcih2YXIgdz0wLEo9VS5sZW5ndGg7dzxKO3crKylpZih0eXBlb2YgbVtVW3ddK0ldIT09InVuZGVmaW5lZCIpe2Muc3VwcG9ydFtoXT1VW3ddK0k7YnJlYWt9fX0pKCk7Yy5mbi5jbHVldGlwLmRlZmF1bHRzPWMuY2x1ZXRpcC5kZWZhdWx0c30pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.compat.cluetip.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqID1iYWNrLWNvbXBhdCBjc3MgZmlsZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKVXNlIHRoaXMgaW5zdGVhZCBvZiBqcXVlcnkuY2x1ZXRpcC5jc3MgaWYgYWxzbyB1c2luZyB0aGUKYmFjay1jb21wYXQganMgZmlsZSAtLSBqcXVlcnkuY29tcGF0LmNsdWV0aXAuanMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogZ2xvYmFsICovCmRpdi51aS1jbHVldGlwIHsKICBmb250LXNpemU6IDFlbTsKfQoudWktY2x1ZXRpcC1oZWFkZXIsCi51aS1jbHVldGlwLWNvbnRlbnQgewogIHBhZGRpbmc6IDEycHg7Cn0KLnVpLWNsdWV0aXAtaGVhZGVyIHsKICBmb250LXNpemU6IDFlbTsKICBtYXJnaW46IDA7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKI2NsdWV0aXAtdGl0bGUgI2NsdWV0aXAtY2xvc2UgewogIGZsb2F0OiByaWdodDsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KI2NsdWV0aXAtY2xvc2UgaW1nIHsKICBib3JkZXI6IDA7Cn0KCiNjbHVldGlwLXdhaXRpbWFnZSB7CiAgd2lkdGg6IDQzcHg7CiAgaGVpZ2h0OiAxMXB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3dhaXQuZ2lmKTsKfQouY2x1ZXRpcC1hcnJvd3MgewogIGRpc3BsYXk6IG5vbmU7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogMDsKICBsZWZ0OiAtMTFweDsKICB3aWR0aDogMTFweDsKICBoZWlnaHQ6IDIycHg7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7CiAgYm9yZGVyLXdpZHRoOiAwOwp9CiNjbHVldGlwLWV4dHJhIHsKICBkaXNwbGF5OiBub25lOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgID1jbHVldGlwQ2xhc3M6ICdkZWZhdWx0JwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLmNsdWV0aXAtZGVmYXVsdCB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDljMjsKfQouY2x1ZXRpcC1kZWZhdWx0IC51aS1jbHVldGlwLWhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzg3ODc2YTsKfQoKCi8qCi5jbHVldGlwLWRlZmF1bHQgI2NsdWV0aXAtb3V0ZXIgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBtYXJnaW46IDA7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDljMjsKfQouY2x1ZXRpcC1kZWZhdWx0IGgzI2NsdWV0aXAtdGl0bGUgewogIG1hcmdpbjogMCAwIDVweDsKICBwYWRkaW5nOiA4cHggMTBweCA0cHg7CiAgZm9udC1zaXplOiAxLjFlbTsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGJhY2tncm91bmQtY29sb3I6ICM4Nzg3NmE7CiAgY29sb3I6ICNmZmY7Cn0KLmNsdWV0aXAtZGVmYXVsdCAjY2x1ZXRpcC10aXRsZSBhIHsKICBjb2xvcjogI2Q5ZDljMjsKICBmb250LXNpemU6IDAuOTVlbTsKfQouY2x1ZXRpcC1kZWZhdWx0ICNjbHVldGlwLWlubmVyIHsKICBwYWRkaW5nOiAxMHB4Owp9Ci5jbHVldGlwLWRlZmF1bHQgZGl2I2NsdWV0aXAtY2xvc2UgewogIHRleHQtYWxpZ246IHJpZ2h0OwogIG1hcmdpbjogMCA1cHggNXB4OwogIGNvbG9yOiAjOTAwOwp9CiovCi8qIGRlZmF1bHQgYXJyb3dzICovCmRpdi5jbHVldGlwLWRlZmF1bHQgLmNsdWV0aXAtYXJyb3dzIHsKICBib3JkZXItd2lkdGg6IDA7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgbm9uZTsKfQpkaXYuY2x1ZS1yaWdodC1kZWZhdWx0IC5jbHVldGlwLWFycm93cyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9kYXJyb3dsZWZ0LmdpZik7Cn0KZGl2LmNsdWUtbGVmdC1kZWZhdWx0IC5jbHVldGlwLWFycm93cyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9kYXJyb3dyaWdodC5naWYpOwogIGxlZnQ6IDEwMCU7CiAgbWFyZ2luLXJpZ2h0OiAtMTFweDsKfQpkaXYuY2x1ZS10b3AtZGVmYXVsdCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvZGFycm93ZG93bi5naWYpOwogIHRvcDogMTAwJTsKICBsZWZ0OiA1MCU7CiAgbWFyZ2luLWxlZnQ6IC0xMXB4OwogIHdpZHRoOiAyMnB4OwogIGhlaWdodDogMTFweDsKfQpkaXYuY2x1ZS1ib3R0b20tZGVmYXVsdCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvZGFycm93dXAuZ2lmKTsKICB0b3A6IC0xMXB4OwogIGxlZnQ6IDUwJTsKICBtYXJnaW4tbGVmdDogLTExcHg7CiAgd2lkdGg6IDIycHg7CiAgaGVpZ2h0OiAxMXB4Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgID1jbHVldGlwQ2xhc3M6ICdqdGlwJwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwouY2x1ZXRpcC1qdGlwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwp9Ci5jbHVldGlwLWp0aXAgI2NsdWV0aXAtb3V0ZXIgewogIGJvcmRlcjogMnB4IHNvbGlkICNjY2M7CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgouY2x1ZXRpcC1qdGlwICNjbHVldGlwLWlubmVyIHsKICBwYWRkaW5nOiA1cHg7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Ci5jbHVldGlwLWp0aXAgZGl2I2NsdWV0aXAtY2xvc2UgewogIHRleHQtYWxpZ246IHJpZ2h0OwogIG1hcmdpbjogMCA1cHggMDsKICBjb2xvcjogIzkwMDsKfQoKLmNsdWV0aXAtanRpcCAudWktY2x1ZXRpcC1oZWFkZXIgewogIGJhY2tncm91bmQtY29sb3I6ICNjY2M7CiAgcGFkZGluZzogNnB4OwovKiAgbWFyZ2luLWJvdHRvbTogMWVtOyovCn0KCi8qIGp0aXAgYXJyb3dzICovCmRpdi5jbHVldGlwLWp0aXAgLmNsdWV0aXAtYXJyb3dzIHsKICBib3JkZXItd2lkdGg6IDA7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgbm9uZTsKfQpkaXYuY2x1ZS1yaWdodC1qdGlwIC5jbHVldGlwLWFycm93cyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9hcnJvd2xlZnQuZ2lmKTsKfQpkaXYuY2x1ZS1sZWZ0LWp0aXAgLmNsdWV0aXAtYXJyb3dzIHsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2Fycm93cmlnaHQuZ2lmKTsKICBsZWZ0OiAxMDAlOwogIG1hcmdpbi1yaWdodDogLTExcHg7Cn0KZGl2LmNsdWUtdG9wLWp0aXAgLmNsdWV0aXAtYXJyb3dzIHsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2Fycm93ZG93bi5naWYpOwogIHRvcDogMTAwJTsKICBsZWZ0OiA1MCU7CiAgd2lkdGg6IDIycHg7CiAgaGVpZ2h0OiAxMXB4OwogIG1hcmdpbi1sZWZ0OiAtMTFweDsKfQpkaXYuY2x1ZS1ib3R0b20tanRpcCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvYXJyb3d1cC5naWYpOwogIHRvcDogLTExcHg7CiAgbGVmdDogNTAlOwogIHdpZHRoOiAyMnB4OwogIGhlaWdodDogMTFweDsKICBtYXJnaW4tbGVmdDogLTExcHg7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgPWNsdWV0aXBDbGFzczogJ3JvdW5kZWQnCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5jbHVldGlwLXJvdW5kZWQgewogIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNnB4OwogIC1tb3otYm9yZGVyLXJhZGl1czogNnB4OwogIGJvcmRlci1yYWRpdXM6IDZweDsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Cn0KLmNsdWV0aXAtcm91bmRlZCAgLmNsdWV0aXAtYXJyb3dzIHsKICBib3JkZXItY29sb3I6ICNjY2M7Cn0KCi8qIG5lZWQgdG8gYmUgbW9yZSBzcGVjaWZpYyBoZXJlIHRvIG92ZXJyaWRlIFRoZW1lUm9sbGVyIGRlZmF1bHRzICovCmRpdi5jbHVldGlwLXJvdW5kZWQgIC5jbHVldGlwLWFycm93cyB7CiAgZm9udC1zaXplOiAwOwogIGxpbmUtaGVpZ2h0OiAwJTsKICB3aWR0aDogMDsKICBoZWlnaHQ6IDA7CiAgYm9yZGVyLXN0eWxlOiBzb2xpZDsKICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCBub25lOwp9CmRpdi5jbHVlLXJpZ2h0LXJvdW5kZWQgLmNsdWV0aXAtYXJyb3dzIHsKICBib3JkZXItd2lkdGg6IDExcHggMTFweCAxMXB4IDA7CiAgYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLWxlZnQtY29sb3I6IHRyYW5zcGFyZW50Owp9CmRpdi5jbHVlLWxlZnQtcm91bmRlZCAuY2x1ZXRpcC1hcnJvd3MgewogIGxlZnQ6IDEwMCU7CiAgbWFyZ2luLXJpZ2h0OiAtMTFweDsKICBib3JkZXItd2lkdGg6IDExcHggMCAxMXB4IDExcHg7CiAgYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICBib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDsKCn0KZGl2LmNsdWUtdG9wLXJvdW5kZWQgLmNsdWV0aXAtYXJyb3dzIHsKICB0b3A6IDEwMCU7CiAgbGVmdDogNTAlOwogIGJvcmRlci13aWR0aDogMTFweCAxMXB4IDAgMTFweDsKICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudDsKfQouY2x1ZS1ib3R0b20tcm91bmRlZCAuY2x1ZXRpcC1hcnJvd3MgewogIHRvcDogLTExcHg7CiAgbGVmdDogNTAlOwogIGJvcmRlci13aWR0aDogMCAxMXB4IDExcHggMTFweDsKICBib3JkZXItdG9wLWNvbG9yOiB0cmFuc3BhcmVudDsKICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudDsKCn0KLyogc3R1cGlkIElFNiBIYXNMYXlvdXQgaGFjayAqLwouY2x1ZXRpcC1yb3VuZGVkICNjbHVldGlwLXRpdGxlLAouY2x1ZXRpcC1yb3VuZGVkICNjbHVldGlwLWlubmVyIHsKICB6b29tOiAxOwp9]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.compat.cluetip.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCQpIHsKICAvLyBCYWNrLWNvbXBhdCBmaWxlIGZvciBjbHVlVGlwIDEuMgogIC8vIFRoaXMgbW9kaWZpZXMgdGhlICQuZm4uY2x1ZXRpcCBvYmplY3QgdG8gbWFrZSB0aGUgcGx1Z2luIHdvcmsgdGhlIHdheSBpdCBkaWQgYmVmb3JlIGNsdWVUaXAgdmVyc2lvbiAxLjIKICAkLmV4dGVuZCh0cnVlLCAkLmZuLmNsdWV0aXAsIHsKICAgIGJhY2tDb21wYXQ6IHRydWUsCiAgICB0ZW1wbGF0ZTogWyc8ZGl2IGlkPSJjbHVldGlwIj4nLAogICAgICAnPGRpdiBpZD0iY2x1ZXRpcC1vdXRlciIgY2xhc3M9ImNsdWV0aXAtb3V0ZXIiPicsCiAgICAgICAgJzxoMyBpZD0iY2x1ZXRpcC10aXRsZSIgY2xhc3M9ImNsdWV0aXAtdGl0bGUgdWktd2lkZ2V0LWhlYWRlciB1aS1jbHVldGlwLWhlYWRlciI+PC9oMz4nLAogICAgICAgICc8ZGl2IGlkPSJjbHVldGlwLWlubmVyIiBjbGFzcz0iY2x1ZXRpcC1pbm5lciB1aS13aWRnZXQtY29udGVudCB1aS1jbHVldGlwLWNvbnRlbnQiPjwvZGl2PicsCiAgICAgICc8L2Rpdj4nLAogICAgICAnPGRpdiBpZD0iY2x1ZXRpcC1leHRyYSI+PC9kaXY+JywKICAgICAgJzxkaXYgaWQ9ImNsdWV0aXAtYXJyb3dzIiBjbGFzcz0iY2x1ZXRpcC1hcnJvd3MiPjwvZGl2PicsCiAgICAnPC9kaXY+J10uam9pbignJykKICB9KTsKfSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.compat.cluetip.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKGEpe2EuZXh0ZW5kKHRydWUsYS5mbi5jbHVldGlwLHtiYWNrQ29tcGF0OnRydWUsdGVtcGxhdGU6JzxkaXYgaWQ9ImNsdWV0aXAiPjxkaXYgaWQ9ImNsdWV0aXAtb3V0ZXIiIGNsYXNzPSJjbHVldGlwLW91dGVyIj48aDMgaWQ9ImNsdWV0aXAtdGl0bGUiIGNsYXNzPSJjbHVldGlwLXRpdGxlIHVpLXdpZGdldC1oZWFkZXIgdWktY2x1ZXRpcC1oZWFkZXIiPjwvaDM+PGRpdiBpZD0iY2x1ZXRpcC1pbm5lciIgY2xhc3M9ImNsdWV0aXAtaW5uZXIgdWktd2lkZ2V0LWNvbnRlbnQgdWktY2x1ZXRpcC1jb250ZW50Ij48L2Rpdj48L2Rpdj48ZGl2IGlkPSJjbHVldGlwLWV4dHJhIj48L2Rpdj48ZGl2IGlkPSJjbHVldGlwLWFycm93cyIgY2xhc3M9ImNsdWV0aXAtYXJyb3dzIj48L2Rpdj48L2Rpdj4nfSl9KShqUXVlcnkpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/jquery-1.3.2.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuMy4zcHJlCiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDkgSm9obiBSZXNpZwogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlcy4KICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9MaWNlbnNlCiAqCiAqIERhdGU6IDIwMDktMDYtMDQgMTM6MzY6MjMgLTA0MDAgKFRodSwgMDQgSnVuIDIwMDkpCiAqIFJldmlzaW9uOiA2MzcyCiAqLwooZnVuY3Rpb24od2luZG93LCB1bmRlZmluZWQpewoKLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKdmFyIGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKCQkvLyBUaGUgalF1ZXJ5IG9iamVjdCBpcyBhY3R1YWxseSBqdXN0IHRoZSBpbml0IGNvbnN0cnVjdG9yICdlbmhhbmNlZCcKCQlyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMCA/CgkJCXJvb3RqUXVlcnkgOgoJCQluZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7Cgl9LAoKCS8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZQoJX2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksCgoJLy8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV8kID0gd2luZG93LiQsCgoJLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpCglyb290alF1ZXJ5LAoKCS8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzIG9yIElEIHN0cmluZ3MKCS8vIChib3RoIG9mIHdoaWNoIHdlIG9wdGltaXplIGZvcikKCXF1aWNrRXhwciA9IC9eW148XSooPCgufFxzKSs+KVtePl0qJHxeIyhbXHctXSspJC8sCgoJLy8gSXMgaXQgYSBzaW1wbGUgc2VsZWN0b3IKCWlzU2ltcGxlID0gL14uW146I1xbXC4sXSokLywKCgkvLyBLZWVwIGEgVXNlckFnZW50IHN0cmluZyBmb3IgdXNlIHdpdGggalF1ZXJ5LmJyb3dzZXIKCXVzZXJBZ2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSwKCgkvLyBTYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBjb3JlIHRvU3RyaW5nIG1ldGhvZAoJdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwoKLy8gRXhwb3NlIGpRdWVyeSB0byB0aGUgZ2xvYmFsIG9iamVjdAp3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7CgpqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0gewoJaW5pdDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXZhciBtYXRjaCwgZWxlbSwgcmV0OwoKCQkvLyBIYW5kbGUgJCgiIiksICQobnVsbCksIG9yICQodW5kZWZpbmVkKQoJCWlmICggIXNlbGVjdG9yICkgewoJCQl0aGlzLmxlbmd0aCA9IDA7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJLy8gSGFuZGxlICQoRE9NRWxlbWVudCkKCQlpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkgewoJCQl0aGlzWzBdID0gc2VsZWN0b3I7CgkJCXRoaXMubGVuZ3RoID0gMTsKCQkJdGhpcy5jb250ZXh0ID0gc2VsZWN0b3I7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJLy8gSGFuZGxlIEhUTUwgc3RyaW5ncwoJCWlmICggdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApIHsKCQkJLy8gQXJlIHdlIGRlYWxpbmcgd2l0aCBIVE1MIHN0cmluZyBvciBhbiBJRD8KCQkJbWF0Y2ggPSBxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKCgkJCS8vIFZlcmlmeSBhIG1hdGNoLCBhbmQgdGhhdCBubyBjb250ZXh0IHdhcyBzcGVjaWZpZWQgZm9yICNpZAoJCQlpZiAoIG1hdGNoICYmIChtYXRjaFsxXSB8fCAhY29udGV4dCkgKSB7CgoJCQkJLy8gSEFORExFOiAkKGh0bWwpIC0+ICQoYXJyYXkpCgkJCQlpZiAoIG1hdGNoWzFdICkgewoJCQkJCXNlbGVjdG9yID0galF1ZXJ5LmNsZWFuKCBbIG1hdGNoWzFdIF0sIGNvbnRleHQgKTsKCgkJCQkvLyBIQU5ETEU6ICQoIiNpZCIpCgkJCQl9IGVsc2UgewoJCQkJCWVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbM10gKTsKCgkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFIGFuZCBPcGVyYSByZXR1cm4gaXRlbXMKCQkJCQkvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQKCQkJCQlpZiAoIGVsZW0gJiYgZWxlbS5pZCAhPT0gbWF0Y2hbM10gKSB7CgkJCQkJCXJldHVybiByb290alF1ZXJ5LmZpbmQoIHNlbGVjdG9yICk7CgkJCQkJfQoKCQkJCQkvLyBPdGhlcndpc2UsIHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0CgkJCQkJcmV0ID0galF1ZXJ5KCBlbGVtIHx8IG51bGwgKTsKCQkJCQlyZXQuY29udGV4dCA9IGRvY3VtZW50OwoJCQkJCXJldC5zZWxlY3RvciA9IHNlbGVjdG9yOwoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgoJCQkvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKQoJCQl9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHsKCQkJCXJldHVybiAoY29udGV4dCB8fCByb290alF1ZXJ5KS5maW5kKCBzZWxlY3RvciApOwoKCQkJLy8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpCgkJCS8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGV4dCkuZmluZChleHByKQoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIGpRdWVyeSggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7CgkJCX0KCgkJLy8gSEFORExFOiAkKGZ1bmN0aW9uKQoJCS8vIFNob3J0Y3V0IGZvciBkb2N1bWVudCByZWFkeQoJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgewoJCQlyZXR1cm4gcm9vdGpRdWVyeS5yZWFkeSggc2VsZWN0b3IgKTsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IG9sZCBzZWxlY3RvciBzdGF0ZSBpcyBwYXNzZWQgYWxvbmcKCQlpZiAoIHNlbGVjdG9yLnNlbGVjdG9yICYmIHNlbGVjdG9yLmNvbnRleHQgKSB7CgkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rvci5zZWxlY3RvcjsKCQkJdGhpcy5jb250ZXh0ID0gc2VsZWN0b3IuY29udGV4dDsKCQl9CgoJCXJldHVybiB0aGlzLnNldEFycmF5KGpRdWVyeS5pc0FycmF5KCBzZWxlY3RvciApID8KCQkJc2VsZWN0b3IgOgoJCQlqUXVlcnkubWFrZUFycmF5KHNlbGVjdG9yKSk7Cgl9LAoKCS8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0b3IKCXNlbGVjdG9yOiAiIiwKCgkvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkCglqcXVlcnk6ICIxLjMuM3ByZSIsCgoJLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQKCXNpemU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmxlbmd0aDsKCX0sCgoJLy8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUgoJLy8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXkKCWdldDogZnVuY3Rpb24oIG51bSApIHsKCQlyZXR1cm4gbnVtID09IG51bGwgPwoKCQkJLy8gUmV0dXJuIGEgJ2NsZWFuJyBhcnJheQoJCQlBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggdGhpcyApIDoKCgkJCS8vIFJldHVybiBqdXN0IHRoZSBvYmplY3QKCQkJdGhpc1sgbnVtIF07Cgl9LAoKCS8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sKCS8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KQoJcHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMsIG5hbWUsIHNlbGVjdG9yICkgewoJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CgkJdmFyIHJldCA9IGpRdWVyeSggZWxlbXMgfHwgbnVsbCApOwoKCQkvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKQoJCXJldC5wcmV2T2JqZWN0ID0gdGhpczsKCgkJcmV0LmNvbnRleHQgPSB0aGlzLmNvbnRleHQ7CgoJCWlmICggbmFtZSA9PT0gImZpbmQiICkgewoJCQlyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yICsgKHRoaXMuc2VsZWN0b3IgPyAiICIgOiAiIikgKyBzZWxlY3RvcjsKCQl9IGVsc2UgaWYgKCBuYW1lICkgewoJCQlyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yICsgIi4iICsgbmFtZSArICIoIiArIHNlbGVjdG9yICsgIikiOwoJCX0KCgkJLy8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXQKCQlyZXR1cm4gcmV0OwoJfSwKCgkvLyBGb3JjZSB0aGUgY3VycmVudCBtYXRjaGVkIHNldCBvZiBlbGVtZW50cyB0byBiZWNvbWUKCS8vIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgZWxlbWVudHMgKGRlc3Ryb3lpbmcgdGhlIHN0YWNrIGluIHRoZSBwcm9jZXNzKQoJLy8gWW91IHNob3VsZCB1c2UgcHVzaFN0YWNrKCkgaW4gb3JkZXIgdG8gZG8gdGhpcywgYnV0IG1haW50YWluIHRoZSBzdGFjawoJc2V0QXJyYXk6IGZ1bmN0aW9uKCBlbGVtcyApIHsKCQkvLyBSZXNldHRpbmcgdGhlIGxlbmd0aCB0byAwLCB0aGVuIHVzaW5nIHRoZSBuYXRpdmUgQXJyYXkgcHVzaAoJCS8vIGlzIGEgc3VwZXItZmFzdCB3YXkgdG8gcG9wdWxhdGUgYW4gb2JqZWN0IHdpdGggYXJyYXktbGlrZSBwcm9wZXJ0aWVzCgkJdGhpcy5sZW5ndGggPSAwOwoJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCB0aGlzLCBlbGVtcyApOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KCS8vIChZb3UgY2FuIHNlZWQgdGhlIGFyZ3VtZW50cyB3aXRoIGFuIGFycmF5IG9mIGFyZ3MsIGJ1dCB0aGlzIGlzCgkvLyBvbmx5IHVzZWQgaW50ZXJuYWxseS4pCgllYWNoOiBmdW5jdGlvbiggY2FsbGJhY2ssIGFyZ3MgKSB7CgkJcmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjaywgYXJncyApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCgkvLyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCQlpZiAoICFlbGVtIHx8IHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGpRdWVyeS5pbkFycmF5KCB0aGlzWzBdLAoJCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBzdHJpbmcsIHRoZSBzZWxlY3RvciBpcyB1c2VkCgkJCQkvLyBJZiBpdCByZWNlaXZlcyBub3RoaW5nLCB0aGUgc2libGluZ3MgYXJlIHVzZWQKCQkJCWVsZW0gPyBqUXVlcnkoIGVsZW0gKSA6IHRoaXMucGFyZW50KCkuY2hpbGRyZW4oKSApOwoJCX0KCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoCgkJCS8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAoJCQllbGVtLmpxdWVyeSA/IGVsZW1bMF0gOiBlbGVtLCB0aGlzICk7Cgl9LAoKCWlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuICEhc2VsZWN0b3IgJiYgalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgdGhpcyApLmxlbmd0aCA+IDA7Cgl9LAoKCS8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KCS8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLgoJcHVzaDogW10ucHVzaCwKCXNvcnQ6IFtdLnNvcnQsCglzcGxpY2U6IFtdLnNwbGljZQp9OwoKLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvbgpqUXVlcnkuZm4uaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CgpqUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkgewoJLy8gY29weSByZWZlcmVuY2UgdG8gdGFyZ2V0IG9iamVjdAoJdmFyIHRhcmdldCA9IGFyZ3VtZW50c1swXSB8fCB7fSwgaSA9IDEsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsIGRlZXAgPSBmYWxzZSwgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5OwoKCS8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24KCWlmICggdHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4iICkgewoJCWRlZXAgPSB0YXJnZXQ7CgkJdGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9OwoJCS8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXQKCQlpID0gMjsKCX0KCgkvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSkKCWlmICggdHlwZW9mIHRhcmdldCAhPT0gIm9iamVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gZXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGxlbmd0aCA9PT0gaSApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCS0taTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCgkJaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkgewoJCQkvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0CgkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKCQkJCXNyYyA9IHRhcmdldFsgbmFtZSBdOwoJCQkJY29weSA9IG9wdGlvbnNbIG5hbWUgXTsKCgkJCQkvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wCgkJCQlpZiAoIHRhcmdldCA9PT0gY29weSApIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgb2JqZWN0IHZhbHVlcwoJCQkJaWYgKCBkZWVwICYmIGNvcHkgJiYgdHlwZW9mIGNvcHkgPT09ICJvYmplY3QiICYmICFjb3B5Lm5vZGVUeXBlICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwKCQkJCQkJLy8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtCgkJCQkJCXNyYyB8fCAoIGNvcHkubGVuZ3RoICE9IG51bGwgPyBbIF0gOiB7IH0gKSwgY29weSApOwoKCQkJCS8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXMKCQkJCX0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHsKCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGNvcHk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8gUmV0dXJuIHRoZSBtb2RpZmllZCBvYmplY3QKCXJldHVybiB0YXJnZXQ7Cn07CgpqUXVlcnkuZXh0ZW5kKHsKCW5vQ29uZmxpY3Q6IGZ1bmN0aW9uKCBkZWVwICkgewoJCXdpbmRvdy4kID0gXyQ7CgoJCWlmICggZGVlcCApIHsKCQkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7CgkJfQoKCQlyZXR1cm4galF1ZXJ5OwoJfSwKCgkvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLgoJLy8gU2luY2UgdmVyc2lvbiAxLjMsIERPTSBtZXRob2RzIGFuZCBmdW5jdGlvbnMgbGlrZSBhbGVydAoJLy8gYXJlbid0IHN1cHBvcnRlZC4gVGhleSByZXR1cm4gZmFsc2Ugb24gSUUgKCMyOTY4KS4KCWlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gIltvYmplY3QgRnVuY3Rpb25dIjsKCX0sCgoJaXNBcnJheTogZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAiW29iamVjdCBBcnJheV0iOwoJfSwKCgkvLyBjaGVjayBpZiBhbiBlbGVtZW50IGlzIGluIGEgKG9yIGlzIGFuKSBYTUwgZG9jdW1lbnQKCWlzWE1MRG9jOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8CgkJCSEhZWxlbS5vd25lckRvY3VtZW50ICYmIGVsZW0ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09ICJIVE1MIjsKCX0sCgoJLy8gRXZhbHVsYXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CglnbG9iYWxFdmFsOiBmdW5jdGlvbiggZGF0YSApIHsKCQlpZiAoIGRhdGEgJiYgL1xTLy50ZXN0KGRhdGEpICkgewoJCQkvLyBJbnNwaXJlZCBieSBjb2RlIGJ5IEFuZHJlYSBHaWFtbWFyY2hpCgkJCS8vIGh0dHA6Ly93ZWJyZWZsZWN0aW9uLmJsb2dzcG90LmNvbS8yMDA3LzA4L2dsb2JhbC1zY29wZS1ldmFsdWF0aW9uLWFuZC1kb20uaHRtbAoJCQl2YXIgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAoJCQkJc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CgoJCQlzY3JpcHQudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiOwoJCQlpZiAoIGpRdWVyeS5zdXBwb3J0LnNjcmlwdEV2YWwgKSB7CgkJCQlzY3JpcHQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCBkYXRhICkgKTsKCQkJfSBlbHNlIHsKCQkJCXNjcmlwdC50ZXh0ID0gZGF0YTsKCQkJfQoKCQkJLy8gVXNlIGluc2VydEJlZm9yZSBpbnN0ZWFkIG9mIGFwcGVuZENoaWxkICB0byBjaXJjdW12ZW50IGFuIElFNiBidWcuCgkJCS8vIFRoaXMgYXJpc2VzIHdoZW4gYSBiYXNlIG5vZGUgaXMgdXNlZCAoIzI3MDkpLgoJCQloZWFkLmluc2VydEJlZm9yZSggc2NyaXB0LCBoZWFkLmZpcnN0Q2hpbGQgKTsKCQkJaGVhZC5yZW1vdmVDaGlsZCggc2NyaXB0ICk7CgkJfQoJfSwKCglub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBuYW1lLnRvVXBwZXJDYXNlKCk7Cgl9LAoKCS8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKCWVhY2g6IGZ1bmN0aW9uKCBvYmplY3QsIGNhbGxiYWNrLCBhcmdzICkgewoJCXZhciBuYW1lLCBpID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsKCgkJaWYgKCBhcmdzICkgewoJCQlpZiAoIGxlbmd0aCA9PT0gdW5kZWZpbmVkICkgewoJCQkJZm9yICggbmFtZSBpbiBvYmplY3QgKSB7CgkJCQkJaWYgKCBjYWxsYmFjay5hcHBseSggb2JqZWN0WyBuYW1lIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKSB7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWZvciAoIDsgaSA8IGxlbmd0aDsgKSB7CgkJCQkJaWYgKCBjYWxsYmFjay5hcHBseSggb2JqZWN0WyBpKysgXSwgYXJncyApID09PSBmYWxzZSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCS8vIEEgc3BlY2lhbCwgZmFzdCwgY2FzZSBmb3IgdGhlIG1vc3QgY29tbW9uIHVzZSBvZiBlYWNoCgkJfSBlbHNlIHsKCQkJaWYgKCBsZW5ndGggPT09IHVuZGVmaW5lZCApIHsKCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkgewoJCQkJCWlmICggY2FsbGJhY2suY2FsbCggb2JqZWN0WyBuYW1lIF0sIG5hbWUsIG9iamVjdFsgbmFtZSBdICkgPT09IGZhbHNlICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCB2YXIgdmFsdWUgPSBvYmplY3RbMF07CgkJCQkJaSA8IGxlbmd0aCAmJiBjYWxsYmFjay5jYWxsKCB2YWx1ZSwgaSwgdmFsdWUgKSAhPT0gZmFsc2U7IHZhbHVlID0gb2JqZWN0WysraV0gKSB7fQoJCQl9CgkJfQoKCQlyZXR1cm4gb2JqZWN0OwoJfSwKCgl0cmltOiBmdW5jdGlvbiggdGV4dCApIHsKCQlyZXR1cm4gKHRleHQgfHwgIiIpLnJlcGxhY2UoIC9eXHMrfFxzKyQvZywgIiIgKTsKCX0sCgoJbWFrZUFycmF5OiBmdW5jdGlvbiggYXJyYXkgKSB7CgkJdmFyIHJldCA9IFtdLCBpOwoKCQlpZiAoIGFycmF5ICE9IG51bGwgKSB7CgkJCWkgPSBhcnJheS5sZW5ndGg7CgoJCQkvLyBUaGUgd2luZG93LCBzdHJpbmdzIChhbmQgZnVuY3Rpb25zKSBhbHNvIGhhdmUgJ2xlbmd0aCcKCQkJaWYgKCBpID09IG51bGwgfHwgdHlwZW9mIGFycmF5ID09PSAic3RyaW5nIiB8fCBqUXVlcnkuaXNGdW5jdGlvbihhcnJheSkgfHwgYXJyYXkuc2V0SW50ZXJ2YWwgKSB7CgkJCQlyZXRbMF0gPSBhcnJheTsKCQkJfSBlbHNlIHsKCQkJCXdoaWxlICggaSApIHsKCQkJCQlyZXRbLS1pXSA9IGFycmF5W2ldOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCglpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyYXkgKSB7CgkJZm9yICggdmFyIGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJaWYgKCBhcnJheVsgaSBdID09PSBlbGVtICkgewoJCQkJcmV0dXJuIGk7CgkJCX0KCQl9CgoJCXJldHVybiAtMTsKCX0sCgoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCS8vIFdlIGhhdmUgdG8gbG9vcCB0aGlzIHdheSBiZWNhdXNlIElFICYgT3BlcmEgb3ZlcndyaXRlIHRoZSBsZW5ndGgKCQkvLyBleHBhbmRvIG9mIGdldEVsZW1lbnRzQnlUYWdOYW1lCgkJdmFyIGkgPSAwLCBlbGVtLCBwb3MgPSBmaXJzdC5sZW5ndGg7CgoJCS8vIEFsc28sIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvcnJlY3QgZWxlbWVudHMgYXJlIGJlaW5nIHJldHVybmVkCgkJLy8gKElFIHJldHVybnMgY29tbWVudCBub2RlcyBpbiBhICcqJyBxdWVyeSkKCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5nZXRBbGwgKSB7CgkJCXdoaWxlICggKGVsZW0gPSBzZWNvbmRbIGkrKyBdKSAhPSBudWxsICkgewoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlICE9PSA4ICkgewoJCQkJCWZpcnN0WyBwb3MrKyBdID0gZWxlbTsKCQkJCX0KCQkJfQoKCQl9IGVsc2UgewoJCQl3aGlsZSAoIChlbGVtID0gc2Vjb25kWyBpKysgXSkgIT0gbnVsbCApIHsKCQkJCWZpcnN0WyBwb3MrKyBdID0gZWxlbTsKCQkJfQoJCX0KCgkJcmV0dXJuIGZpcnN0OwoJfSwKCgl1bmlxdWU6IGZ1bmN0aW9uKCBhcnJheSApIHsKCQl2YXIgcmV0ID0gW10sIGRvbmUgPSB7fSwgaWQ7CgoJCXRyeSB7CgkJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlpZCA9IGpRdWVyeS5kYXRhKCBhcnJheVsgaSBdICk7CgoJCQkJaWYgKCAhZG9uZVsgaWQgXSApIHsKCQkJCQlkb25lWyBpZCBdID0gdHJ1ZTsKCQkJCQlyZXQucHVzaCggYXJyYXlbIGkgXSApOwoJCQkJfQoJCQl9CgkJfSBjYXRjaCggZSApIHsKCQkJcmV0ID0gYXJyYXk7CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCglncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnYgKSB7CgkJdmFyIHJldCA9IFtdOwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCgkJLy8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24KCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQlpZiAoICFpbnYgIT09ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApICkgewoJCQkJcmV0LnB1c2goIGVsZW1zWyBpIF0gKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJbWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrICkgewoJCXZhciByZXQgPSBbXSwgdmFsdWU7CgoJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9mIHRoZSBpdGVtcyB0byB0aGVpcgoJCS8vIG5ldyB2YWx1ZSAob3IgdmFsdWVzKS4KCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgoJCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7CgkJCQlyZXRbIHJldC5sZW5ndGggXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0LmNvbmNhdC5hcHBseSggW10sIHJldCApOwoJfSwKCgkvLyBVc2Ugb2YgalF1ZXJ5LmJyb3dzZXIgaXMgZGVwcmVjYXRlZC4KCS8vIEl0J3MgaW5jbHVkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBwbHVnaW5zLAoJLy8gYWx0aG91Z2ggdGhleSBzaG91bGQgd29yayB0byBtaWdyYXRlIGF3YXkuCglicm93c2VyOiB7CgkJdmVyc2lvbjogKHVzZXJBZ2VudC5tYXRjaCggLy4rKD86cnZ8aXR8cmF8aWUpW1wvOiBdKFtcZC5dKykvICkgfHwgWzAsJzAnXSlbMV0sCgkJc2FmYXJpOiAvd2Via2l0Ly50ZXN0KCB1c2VyQWdlbnQgKSwKCQlvcGVyYTogL29wZXJhLy50ZXN0KCB1c2VyQWdlbnQgKSwKCQltc2llOiAvbXNpZS8udGVzdCggdXNlckFnZW50ICkgJiYgIS9vcGVyYS8udGVzdCggdXNlckFnZW50ICksCgkJbW96aWxsYTogL21vemlsbGEvLnRlc3QoIHVzZXJBZ2VudCApICYmICEvKGNvbXBhdGlibGV8d2Via2l0KS8udGVzdCggdXNlckFnZW50ICkKCX0KfSk7CgovLyBBbGwgalF1ZXJ5IG9iamVjdHMgc2hvdWxkIHBvaW50IGJhY2sgdG8gdGhlc2UKcm9vdGpRdWVyeSA9IGpRdWVyeShkb2N1bWVudCk7CgpmdW5jdGlvbiBldmFsU2NyaXB0KCBpLCBlbGVtICkgewoJaWYgKCBlbGVtLnNyYyApIHsKCQlqUXVlcnkuYWpheCh7CgkJCXVybDogZWxlbS5zcmMsCgkJCWFzeW5jOiBmYWxzZSwKCQkJZGF0YVR5cGU6ICJzY3JpcHQiCgkJfSk7Cgl9IGVsc2UgewoJCWpRdWVyeS5nbG9iYWxFdmFsKCBlbGVtLnRleHQgfHwgZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVySFRNTCB8fCAiIiApOwoJfQoKCWlmICggZWxlbS5wYXJlbnROb2RlICkgewoJCWVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOwoJfQp9CgpmdW5jdGlvbiBub3coKSB7CglyZXR1cm4gKG5ldyBEYXRlKS5nZXRUaW1lKCk7Cn0KdmFyIGV4cGFuZG8gPSAialF1ZXJ5IiArIG5vdygpLCB1dWlkID0gMCwgd2luZG93RGF0YSA9IHt9OwoKalF1ZXJ5LmV4dGVuZCh7CgljYWNoZToge30sCgoJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CgkJZWxlbSA9IGVsZW0gPT0gd2luZG93ID8KCQkJd2luZG93RGF0YSA6CgkJCWVsZW07CgoJCXZhciBpZCA9IGVsZW1bIGV4cGFuZG8gXTsKCgkJLy8gQ29tcHV0ZSBhIHVuaXF1ZSBJRCBmb3IgdGhlIGVsZW1lbnQKCQlpZiAoICFpZCApCgkJCWlkID0gZWxlbVsgZXhwYW5kbyBdID0gKyt1dWlkOwoKCQkvLyBPbmx5IGdlbmVyYXRlIHRoZSBkYXRhIGNhY2hlIGlmIHdlJ3JlCgkJLy8gdHJ5aW5nIHRvIGFjY2VzcyBvciBtYW5pcHVsYXRlIGl0CgkJaWYgKCBuYW1lICYmICFqUXVlcnkuY2FjaGVbIGlkIF0gKQoJCQlqUXVlcnkuY2FjaGVbIGlkIF0gPSB7fTsKCgkJLy8gUHJldmVudCBvdmVycmlkaW5nIHRoZSBuYW1lZCBjYWNoZSB3aXRoIHVuZGVmaW5lZCB2YWx1ZXMKCQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApCgkJCWpRdWVyeS5jYWNoZVsgaWQgXVsgbmFtZSBdID0gZGF0YTsKCgkJLy8gUmV0dXJuIHRoZSBuYW1lZCBjYWNoZSBkYXRhLCBvciB0aGUgSUQgZm9yIHRoZSBlbGVtZW50CgkJcmV0dXJuIG5hbWUgPwoJCQlqUXVlcnkuY2FjaGVbIGlkIF1bIG5hbWUgXSA6CgkJCWlkOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQllbGVtID0gZWxlbSA9PSB3aW5kb3cgPwoJCQl3aW5kb3dEYXRhIDoKCQkJZWxlbTsKCgkJdmFyIGlkID0gZWxlbVsgZXhwYW5kbyBdOwoKCQkvLyBJZiB3ZSB3YW50IHRvIHJlbW92ZSBhIHNwZWNpZmljIHNlY3Rpb24gb2YgdGhlIGVsZW1lbnQncyBkYXRhCgkJaWYgKCBuYW1lICkgewoJCQlpZiAoIGpRdWVyeS5jYWNoZVsgaWQgXSApIHsKCQkJCS8vIFJlbW92ZSB0aGUgc2VjdGlvbiBvZiBjYWNoZSBkYXRhCgkJCQlkZWxldGUgalF1ZXJ5LmNhY2hlWyBpZCBdWyBuYW1lIF07CgoJCQkJLy8gSWYgd2UndmUgcmVtb3ZlZCBhbGwgdGhlIGRhdGEsIHJlbW92ZSB0aGUgZWxlbWVudCdzIGNhY2hlCgkJCQluYW1lID0gIiI7CgoJCQkJZm9yICggbmFtZSBpbiBqUXVlcnkuY2FjaGVbIGlkIF0gKQoJCQkJCWJyZWFrOwoKCQkJCWlmICggIW5hbWUgKQoJCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtICk7CgkJCX0KCgkJLy8gT3RoZXJ3aXNlLCB3ZSB3YW50IHRvIHJlbW92ZSBhbGwgb2YgdGhlIGVsZW1lbnQncyBkYXRhCgkJfSBlbHNlIHsKCQkJLy8gQ2xlYW4gdXAgdGhlIGVsZW1lbnQgZXhwYW5kbwoJCQl0cnkgewoJCQkJZGVsZXRlIGVsZW1bIGV4cGFuZG8gXTsKCQkJfSBjYXRjaChlKXsKCQkJCS8vIElFIGhhcyB0cm91YmxlIGRpcmVjdGx5IHJlbW92aW5nIHRoZSBleHBhbmRvCgkJCQkvLyBidXQgaXQncyBvayB3aXRoIHVzaW5nIHJlbW92ZUF0dHJpYnV0ZQoJCQkJaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApCgkJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGV4cGFuZG8gKTsKCQkJfQoKCQkJLy8gQ29tcGxldGVseSByZW1vdmUgdGhlIGRhdGEgY2FjaGUKCQkJZGVsZXRlIGpRdWVyeS5jYWNoZVsgaWQgXTsKCQl9Cgl9LAoJcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgewoJCWlmICggZWxlbSApewoKCQkJdHlwZSA9ICh0eXBlIHx8ICJmeCIpICsgInF1ZXVlIjsKCgkJCXZhciBxID0galF1ZXJ5LmRhdGEoIGVsZW0sIHR5cGUgKTsKCgkJCWlmICggIXEgfHwgalF1ZXJ5LmlzQXJyYXkoZGF0YSkgKQoJCQkJcSA9IGpRdWVyeS5kYXRhKCBlbGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KGRhdGEpICk7CgkJCWVsc2UgaWYoIGRhdGEgKQoJCQkJcS5wdXNoKCBkYXRhICk7CgoJCX0KCQlyZXR1cm4gcTsKCX0sCgoJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKXsKCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSwKCQkJZm4gPSBxdWV1ZS5zaGlmdCgpOwoKCQlpZiggIXR5cGUgfHwgdHlwZSA9PT0gImZ4IiApCgkJCWZuID0gcXVldWVbMF07CgoJCWlmKCBmbiAhPT0gdW5kZWZpbmVkICkKCQkJZm4uY2FsbChlbGVtKTsKCX0KfSk7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICl7CgkJdmFyIHBhcnRzID0ga2V5LnNwbGl0KCIuIik7CgkJcGFydHNbMV0gPSBwYXJ0c1sxXSA/ICIuIiArIHBhcnRzWzFdIDogIiI7CgoJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJdmFyIGRhdGEgPSB0aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF1dKTsKCgkJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIHRoaXMubGVuZ3RoICkKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSwga2V5ICk7CgoJCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkICYmIHBhcnRzWzFdID8KCQkJCXRoaXMuZGF0YSggcGFydHNbMF0gKSA6CgkJCQlkYXRhOwoJCX0gZWxzZQoJCQlyZXR1cm4gdGhpcy50cmlnZ2VyKCJzZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF0sIHZhbHVlXSkuZWFjaChmdW5jdGlvbigpewoJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJfSk7Cgl9LAoKCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKXsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5yZW1vdmVEYXRhKCB0aGlzLCBrZXkgKTsKCQl9KTsKCX0sCglxdWV1ZTogZnVuY3Rpb24odHlwZSwgZGF0YSl7CgkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CgkJCWRhdGEgPSB0eXBlOwoJCQl0eXBlID0gImZ4IjsKCQl9CgoJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICkKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApOwoKCQkJIGlmKCB0eXBlID09ICJmeCIgJiYgcXVldWUubGVuZ3RoID09IDEgKQoJCQkJcXVldWVbMF0uY2FsbCh0aGlzKTsKCQl9KTsKCX0sCglkZXF1ZXVlOiBmdW5jdGlvbih0eXBlKXsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSk7Cgl9Cn0pOy8qIQogKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSAtIHYxLjAKICogIENvcHlyaWdodCAyMDA5LCBUaGUgRG9qbyBGb3VuZGF0aW9uCiAqICBSZWxlYXNlZCB1bmRlciB0aGUgTUlULCBCU0QsIGFuZCBHUEwgTGljZW5zZXMuCiAqICBNb3JlIGluZm9ybWF0aW9uOiBodHRwOi8vc2l6emxlanMuY29tLwogKi8KKGZ1bmN0aW9uKCl7Cgp2YXIgY2h1bmtlciA9IC8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXltcXSciXSspK1xdfFxcLnxbXiA+K34sKFxbXFxdKykrfFs+K35dKShccyosXHMqKT8vZywKCWRvbmUgPSAwLAoJdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAoJaGFzRHVwbGljYXRlID0gZmFsc2U7Cgp2YXIgU2l6emxlID0gZnVuY3Rpb24oc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQpIHsKCXJlc3VsdHMgPSByZXN1bHRzIHx8IFtdOwoJdmFyIG9yaWdDb250ZXh0ID0gY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJaWYgKCBjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkgKSB7CgkJcmV0dXJuIFtdOwoJfQoJCglpZiAoICFzZWxlY3RvciB8fCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCXJldHVybiByZXN1bHRzOwoJfQoKCXZhciBwYXJ0cyA9IFtdLCBtLCBzZXQsIGNoZWNrU2V0LCBjaGVjaywgbW9kZSwgZXh0cmEsIHBydW5lID0gdHJ1ZSwgY29udGV4dFhNTCA9IGlzWE1MKGNvbnRleHQpOwoJCgkvLyBSZXNldCB0aGUgcG9zaXRpb24gb2YgdGhlIGNodW5rZXIgcmVnZXhwIChzdGFydCBmcm9tIGhlYWQpCgljaHVua2VyLmxhc3RJbmRleCA9IDA7CgkKCXdoaWxlICggKG0gPSBjaHVua2VyLmV4ZWMoc2VsZWN0b3IpKSAhPT0gbnVsbCApIHsKCQlwYXJ0cy5wdXNoKCBtWzFdICk7CgkJCgkJaWYgKCBtWzJdICkgewoJCQlleHRyYSA9IFJlZ0V4cC5yaWdodENvbnRleHQ7CgkJCWJyZWFrOwoJCX0KCX0KCglpZiAoIHBhcnRzLmxlbmd0aCA+IDEgJiYgb3JpZ1BPUy5leGVjKCBzZWxlY3RvciApICkgewoJCWlmICggcGFydHMubGVuZ3RoID09PSAyICYmIEV4cHIucmVsYXRpdmVbIHBhcnRzWzBdIF0gKSB7CgkJCXNldCA9IHBvc1Byb2Nlc3MoIHBhcnRzWzBdICsgcGFydHNbMV0sIGNvbnRleHQgKTsKCQl9IGVsc2UgewoJCQlzZXQgPSBFeHByLnJlbGF0aXZlWyBwYXJ0c1swXSBdID8KCQkJCVsgY29udGV4dCBdIDoKCQkJCVNpenpsZSggcGFydHMuc2hpZnQoKSwgY29udGV4dCApOwoKCQkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCQlzZWxlY3RvciA9IHBhcnRzLnNoaWZ0KCk7CgoJCQkJaWYgKCBFeHByLnJlbGF0aXZlWyBzZWxlY3RvciBdICkKCQkJCQlzZWxlY3RvciArPSBwYXJ0cy5zaGlmdCgpOwoKCQkJCXNldCA9IHBvc1Byb2Nlc3MoIHNlbGVjdG9yLCBzZXQgKTsKCQkJfQoJCX0KCX0gZWxzZSB7CgkJLy8gVGFrZSBhIHNob3J0Y3V0IGFuZCBzZXQgdGhlIGNvbnRleHQgaWYgdGhlIHJvb3Qgc2VsZWN0b3IgaXMgYW4gSUQKCQkvLyAoYnV0IG5vdCBpZiBpdCdsbCBiZSBmYXN0ZXIgaWYgdGhlIGlubmVyIHNlbGVjdG9yIGlzIGFuIElEKQoJCWlmICggIXNlZWQgJiYgcGFydHMubGVuZ3RoID4gMSAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmICFjb250ZXh0WE1MICYmCgkJCQlFeHByLm1hdGNoLklELnRlc3QocGFydHNbMF0pICYmICFFeHByLm1hdGNoLklELnRlc3QocGFydHNbcGFydHMubGVuZ3RoIC0gMV0pICkgewoJCQl2YXIgcmV0ID0gU2l6emxlLmZpbmQoIHBhcnRzLnNoaWZ0KCksIGNvbnRleHQsIGNvbnRleHRYTUwgKTsKCQkJY29udGV4dCA9IHJldC5leHByID8gU2l6emxlLmZpbHRlciggcmV0LmV4cHIsIHJldC5zZXQgKVswXSA6IHJldC5zZXRbMF07CgkJfQoKCQlpZiAoIGNvbnRleHQgKSB7CgkJCXZhciByZXQgPSBzZWVkID8KCQkJCXsgZXhwcjogcGFydHMucG9wKCksIHNldDogbWFrZUFycmF5KHNlZWQpIH0gOgoJCQkJU2l6emxlLmZpbmQoIHBhcnRzLnBvcCgpLCBwYXJ0cy5sZW5ndGggPT09IDEgJiYgKHBhcnRzWzBdID09PSAifiIgfHwgcGFydHNbMF0gPT09ICIrIikgJiYgY29udGV4dC5wYXJlbnROb2RlID8gY29udGV4dC5wYXJlbnROb2RlIDogY29udGV4dCwgY29udGV4dFhNTCApOwoJCQlzZXQgPSByZXQuZXhwciA/IFNpenpsZS5maWx0ZXIoIHJldC5leHByLCByZXQuc2V0ICkgOiByZXQuc2V0OwoKCQkJaWYgKCBwYXJ0cy5sZW5ndGggPiAwICkgewoJCQkJY2hlY2tTZXQgPSBtYWtlQXJyYXkoc2V0KTsKCQkJfSBlbHNlIHsKCQkJCXBydW5lID0gZmFsc2U7CgkJCX0KCgkJCXdoaWxlICggcGFydHMubGVuZ3RoICkgewoJCQkJdmFyIGN1ciA9IHBhcnRzLnBvcCgpLCBwb3AgPSBjdXI7CgoJCQkJaWYgKCAhRXhwci5yZWxhdGl2ZVsgY3VyIF0gKSB7CgkJCQkJY3VyID0gIiI7CgkJCQl9IGVsc2UgewoJCQkJCXBvcCA9IHBhcnRzLnBvcCgpOwoJCQkJfQoKCQkJCWlmICggcG9wID09IG51bGwgKSB7CgkJCQkJcG9wID0gY29udGV4dDsKCQkJCX0KCgkJCQlFeHByLnJlbGF0aXZlWyBjdXIgXSggY2hlY2tTZXQsIHBvcCwgY29udGV4dFhNTCApOwoJCQl9CgkJfSBlbHNlIHsKCQkJY2hlY2tTZXQgPSBwYXJ0cyA9IFtdOwoJCX0KCX0KCglpZiAoICFjaGVja1NldCApIHsKCQljaGVja1NldCA9IHNldDsKCX0KCglpZiAoICFjaGVja1NldCApIHsKCQl0aHJvdyAiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIChjdXIgfHwgc2VsZWN0b3IpOwoJfQoKCWlmICggdG9TdHJpbmcuY2FsbChjaGVja1NldCkgPT09ICJbb2JqZWN0IEFycmF5XSIgKSB7CgkJaWYgKCAhcHJ1bmUgKSB7CgkJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgY2hlY2tTZXQgKTsKCQl9IGVsc2UgaWYgKCBjb250ZXh0ICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDEgKSB7CgkJCWZvciAoIHZhciBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiAoY2hlY2tTZXRbaV0gPT09IHRydWUgfHwgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgJiYgY29udGFpbnMoY29udGV4dCwgY2hlY2tTZXRbaV0pKSApIHsKCQkJCQlyZXN1bHRzLnB1c2goIHNldFtpXSApOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwOyBjaGVja1NldFtpXSAhPSBudWxsOyBpKysgKSB7CgkJCQlpZiAoIGNoZWNrU2V0W2ldICYmIGNoZWNrU2V0W2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCXJlc3VsdHMucHVzaCggc2V0W2ldICk7CgkJCQl9CgkJCX0KCQl9Cgl9IGVsc2UgewoJCW1ha2VBcnJheSggY2hlY2tTZXQsIHJlc3VsdHMgKTsKCX0KCglpZiAoIGV4dHJhICkgewoJCVNpenpsZSggZXh0cmEsIG9yaWdDb250ZXh0LCByZXN1bHRzLCBzZWVkICk7CgkJU2l6emxlLnVuaXF1ZVNvcnQoIHJlc3VsdHMgKTsKCX0KCglyZXR1cm4gcmVzdWx0czsKfTsKClNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24ocmVzdWx0cyl7CglpZiAoIHNvcnRPcmRlciApIHsKCQloYXNEdXBsaWNhdGUgPSBmYWxzZTsKCQlyZXN1bHRzLnNvcnQoc29ydE9yZGVyKTsKCgkJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJCWZvciAoIHZhciBpID0gMTsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIHJlc3VsdHNbaV0gPT09IHJlc3VsdHNbaS0xXSApIHsKCQkJCQlyZXN1bHRzLnNwbGljZShpLS0sIDEpOwoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbihleHByLCBzZXQpewoJcmV0dXJuIFNpenpsZShleHByLCBudWxsLCBudWxsLCBzZXQpOwp9OwoKU2l6emxlLmZpbmQgPSBmdW5jdGlvbihleHByLCBjb250ZXh0LCBpc1hNTCl7Cgl2YXIgc2V0LCBtYXRjaDsKCglpZiAoICFleHByICkgewoJCXJldHVybiBbXTsKCX0KCglmb3IgKCB2YXIgaSA9IDAsIGwgPSBFeHByLm9yZGVyLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgdHlwZSA9IEV4cHIub3JkZXJbaV0sIG1hdGNoOwoJCQoJCWlmICggKG1hdGNoID0gRXhwci5tYXRjaFsgdHlwZSBdLmV4ZWMoIGV4cHIgKSkgKSB7CgkJCXZhciBsZWZ0ID0gUmVnRXhwLmxlZnRDb250ZXh0OwoKCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgIT09ICJcXCIgKSB7CgkJCQltYXRjaFsxXSA9IChtYXRjaFsxXSB8fCAiIikucmVwbGFjZSgvXFwvZywgIiIpOwoJCQkJc2V0ID0gRXhwci5maW5kWyB0eXBlIF0oIG1hdGNoLCBjb250ZXh0LCBpc1hNTCApOwoJCQkJaWYgKCBzZXQgIT0gbnVsbCApIHsKCQkJCQlleHByID0gZXhwci5yZXBsYWNlKCBFeHByLm1hdGNoWyB0eXBlIF0sICIiICk7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJaWYgKCAhc2V0ICkgewoJCXNldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKCX0KCglyZXR1cm4ge3NldDogc2V0LCBleHByOiBleHByfTsKfTsKClNpenpsZS5maWx0ZXIgPSBmdW5jdGlvbihleHByLCBzZXQsIGlucGxhY2UsIG5vdCl7Cgl2YXIgb2xkID0gZXhwciwgcmVzdWx0ID0gW10sIGN1ckxvb3AgPSBzZXQsIG1hdGNoLCBhbnlGb3VuZCwKCQlpc1hNTEZpbHRlciA9IHNldCAmJiBzZXRbMF0gJiYgaXNYTUwoc2V0WzBdKTsKCgl3aGlsZSAoIGV4cHIgJiYgc2V0Lmxlbmd0aCApIHsKCQlmb3IgKCB2YXIgdHlwZSBpbiBFeHByLmZpbHRlciApIHsKCQkJaWYgKCAobWF0Y2ggPSBFeHByLm1hdGNoWyB0eXBlIF0uZXhlYyggZXhwciApKSAhPSBudWxsICkgewoJCQkJdmFyIGZpbHRlciA9IEV4cHIuZmlsdGVyWyB0eXBlIF0sIGZvdW5kLCBpdGVtOwoJCQkJYW55Rm91bmQgPSBmYWxzZTsKCgkJCQlpZiAoIGN1ckxvb3AgPT0gcmVzdWx0ICkgewoJCQkJCXJlc3VsdCA9IFtdOwoJCQkJfQoKCQkJCWlmICggRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSApIHsKCQkJCQltYXRjaCA9IEV4cHIucHJlRmlsdGVyWyB0eXBlIF0oIG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCwgaXNYTUxGaWx0ZXIgKTsKCgkJCQkJaWYgKCAhbWF0Y2ggKSB7CgkJCQkJCWFueUZvdW5kID0gZm91bmQgPSB0cnVlOwoJCQkJCX0gZWxzZSBpZiAoIG1hdGNoID09PSB0cnVlICkgewoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCBtYXRjaCApIHsKCQkJCQlmb3IgKCB2YXIgaSA9IDA7IChpdGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJCQlpZiAoIGl0ZW0gKSB7CgkJCQkJCQlmb3VuZCA9IGZpbHRlciggaXRlbSwgbWF0Y2gsIGksIGN1ckxvb3AgKTsKCQkJCQkJCXZhciBwYXNzID0gbm90IF4gISFmb3VuZDsKCgkJCQkJCQlpZiAoIGlucGxhY2UgJiYgZm91bmQgIT0gbnVsbCApIHsKCQkJCQkJCQlpZiAoIHBhc3MgKSB7CgkJCQkJCQkJCWFueUZvdW5kID0gdHJ1ZTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQljdXJMb29wW2ldID0gZmFsc2U7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlIGlmICggcGFzcyApIHsKCQkJCQkJCQlyZXN1bHQucHVzaCggaXRlbSApOwoJCQkJCQkJCWFueUZvdW5kID0gdHJ1ZTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlpZiAoIGZvdW5kICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJaWYgKCAhaW5wbGFjZSApIHsKCQkJCQkJY3VyTG9vcCA9IHJlc3VsdDsKCQkJCQl9CgoJCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsKCgkJCQkJaWYgKCAhYW55Rm91bmQgKSB7CgkJCQkJCXJldHVybiBbXTsKCQkJCQl9CgoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBJbXByb3BlciBleHByZXNzaW9uCgkJaWYgKCBleHByID09IG9sZCApIHsKCQkJaWYgKCBhbnlGb3VuZCA9PSBudWxsICkgewoJCQkJdGhyb3cgIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBleHByOwoJCQl9IGVsc2UgewoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCW9sZCA9IGV4cHI7Cgl9CgoJcmV0dXJuIGN1ckxvb3A7Cn07Cgp2YXIgRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7CglvcmRlcjogWyAiSUQiLCAiTkFNRSIsICJUQUciIF0sCgltYXRjaDogewoJCUlEOiAvIygoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKS8sCgkJQ0xBU1M6IC9cLigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKS8sCgkJTkFNRTogL1xbbmFtZT1bJyJdKigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKVsnIl0qXF0vLAoJCUFUVFI6IC9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKVxzKig/OihcUz89KVxzKihbJyJdKikoLio/KVwzfClccypcXS8sCgkJVEFHOiAvXigoPzpbXHdcdTAwYzAtXHVGRkZGXCpfLV18XFwuKSspLywKCQlDSElMRDogLzoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcKChldmVufG9kZHxbXGRuKy1dKilcKSk/LywKCQlQT1M6IC86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W14tXXwkKS8sCgkJUFNFVURPOiAvOigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKSg/OlwoKFsnIl0qKSgoPzpcKFteXCldK1wpfFteXDJcKFwpXSopKylcMlwpKT8vCgl9LAoJYXR0ck1hcDogewoJCSJjbGFzcyI6ICJjbGFzc05hbWUiLAoJCSJmb3IiOiAiaHRtbEZvciIKCX0sCglhdHRySGFuZGxlOiB7CgkJaHJlZjogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwoJCX0KCX0sCglyZWxhdGl2ZTogewoJCSIrIjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQsIGlzWE1MKXsKCQkJdmFyIGlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiwKCQkJCWlzVGFnID0gaXNQYXJ0U3RyICYmICEvXFcvLnRlc3QocGFydCksCgkJCQlpc1BhcnRTdHJOb3RUYWcgPSBpc1BhcnRTdHIgJiYgIWlzVGFnOwoKCQkJaWYgKCBpc1RhZyAmJiAhaXNYTUwgKSB7CgkJCQlwYXJ0ID0gcGFydC50b1VwcGVyQ2FzZSgpOwoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGgsIGVsZW07IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIChlbGVtID0gY2hlY2tTZXRbaV0pICkgewoJCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtLnByZXZpb3VzU2libGluZykgJiYgZWxlbS5ub2RlVHlwZSAhPT0gMSApIHt9CgoJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyTm90VGFnIHx8IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSA9PT0gcGFydCA/CgkJCQkJCWVsZW0gfHwgZmFsc2UgOgoJCQkJCQllbGVtID09PSBwYXJ0OwoJCQkJfQoJCQl9CgoJCQlpZiAoIGlzUGFydFN0ck5vdFRhZyApIHsKCQkJCVNpenpsZS5maWx0ZXIoIHBhcnQsIGNoZWNrU2V0LCB0cnVlICk7CgkJCX0KCQl9LAoJCSI+IjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQsIGlzWE1MKXsKCQkJdmFyIGlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIjsKCgkJCWlmICggaXNQYXJ0U3RyICYmICEvXFcvLnRlc3QocGFydCkgKSB7CgkJCQlwYXJ0ID0gaXNYTUwgPyBwYXJ0IDogcGFydC50b1VwcGVyQ2FzZSgpOwoKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoJCQkJCWlmICggZWxlbSApIHsKCQkJCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJCQkJY2hlY2tTZXRbaV0gPSBwYXJlbnQubm9kZU5hbWUgPT09IHBhcnQgPyBwYXJlbnQgOiBmYWxzZTsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJdmFyIGVsZW0gPSBjaGVja1NldFtpXTsKCQkJCQlpZiAoIGVsZW0gKSB7CgkJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyID8KCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA6CgkJCQkJCQllbGVtLnBhcmVudE5vZGUgPT09IHBhcnQ7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggaXNQYXJ0U3RyICkgewoJCQkJCVNpenpsZS5maWx0ZXIoIHBhcnQsIGNoZWNrU2V0LCB0cnVlICk7CgkJCQl9CgkJCX0KCQl9LAoJCSIiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpewoJCQl2YXIgZG9uZU5hbWUgPSBkb25lKyssIGNoZWNrRm4gPSBkaXJDaGVjazsKCgkJCWlmICggIXBhcnQubWF0Y2goL1xXLykgKSB7CgkJCQl2YXIgbm9kZUNoZWNrID0gcGFydCA9IGlzWE1MID8gcGFydCA6IHBhcnQudG9VcHBlckNhc2UoKTsKCQkJCWNoZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CgkJCX0KCgkJCWNoZWNrRm4oInBhcmVudE5vZGUiLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwpOwoJCX0sCgkJIn4iOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpewoJCQl2YXIgZG9uZU5hbWUgPSBkb25lKyssIGNoZWNrRm4gPSBkaXJDaGVjazsKCgkJCWlmICggdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciICYmICFwYXJ0Lm1hdGNoKC9cVy8pICkgewoJCQkJdmFyIG5vZGVDaGVjayA9IHBhcnQgPSBpc1hNTCA/IHBhcnQgOiBwYXJ0LnRvVXBwZXJDYXNlKCk7CgkJCQljaGVja0ZuID0gZGlyTm9kZUNoZWNrOwoJCQl9CgoJCQljaGVja0ZuKCJwcmV2aW91c1NpYmxpbmciLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwpOwoJCX0KCX0sCglmaW5kOiB7CgkJSUQ6IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0LCBpc1hNTCl7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09ICJ1bmRlZmluZWQiICYmICFpc1hNTCApIHsKCQkJCXZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZChtYXRjaFsxXSk7CgkJCQlyZXR1cm4gbSA/IFttXSA6IFtdOwoJCQl9CgkJfSwKCQlOQU1FOiBmdW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lICE9PSAidW5kZWZpbmVkIiApIHsKCQkJCXZhciByZXQgPSBbXSwgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUobWF0Y2hbMV0pOwoKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHJlc3VsdHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWlmICggcmVzdWx0c1tpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSA9PT0gbWF0Y2hbMV0gKSB7CgkJCQkJCXJldC5wdXNoKCByZXN1bHRzW2ldICk7CgkJCQkJfQoJCQkJfQoKCQkJCXJldHVybiByZXQubGVuZ3RoID09PSAwID8gbnVsbCA6IHJldDsKCQkJfQoJCX0sCgkJVEFHOiBmdW5jdGlvbihtYXRjaCwgY29udGV4dCl7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKG1hdGNoWzFdKTsKCQl9Cgl9LAoJcHJlRmlsdGVyOiB7CgkJQ0xBU1M6IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCwgaXNYTUwpewoJCQltYXRjaCA9ICIgIiArIG1hdGNoWzFdLnJlcGxhY2UoL1xcL2csICIiKSArICIgIjsKCgkJCWlmICggaXNYTUwgKSB7CgkJCQlyZXR1cm4gbWF0Y2g7CgkJCX0KCgkJCWZvciAoIHZhciBpID0gMCwgZWxlbTsgKGVsZW0gPSBjdXJMb29wW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCQlpZiAoIGVsZW0gKSB7CgkJCQkJaWYgKCBub3QgXiAoZWxlbS5jbGFzc05hbWUgJiYgKCIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiKS5pbmRleE9mKG1hdGNoKSA+PSAwKSApIHsKCQkJCQkJaWYgKCAhaW5wbGFjZSApCgkJCQkJCQlyZXN1bHQucHVzaCggZWxlbSApOwoJCQkJCX0gZWxzZSBpZiAoIGlucGxhY2UgKSB7CgkJCQkJCWN1ckxvb3BbaV0gPSBmYWxzZTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCXJldHVybiBmYWxzZTsKCQl9LAoJCUlEOiBmdW5jdGlvbihtYXRjaCl7CgkJCXJldHVybiBtYXRjaFsxXS5yZXBsYWNlKC9cXC9nLCAiIik7CgkJfSwKCQlUQUc6IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29wKXsKCQkJZm9yICggdmFyIGkgPSAwOyBjdXJMb29wW2ldID09PSBmYWxzZTsgaSsrICl7fQoJCQlyZXR1cm4gY3VyTG9vcFtpXSAmJiBpc1hNTChjdXJMb29wW2ldKSA/IG1hdGNoWzFdIDogbWF0Y2hbMV0udG9VcHBlckNhc2UoKTsKCQl9LAoJCUNISUxEOiBmdW5jdGlvbihtYXRjaCl7CgkJCWlmICggbWF0Y2hbMV0gPT0gIm50aCIgKSB7CgkJCQkvLyBwYXJzZSBlcXVhdGlvbnMgbGlrZSAnZXZlbicsICdvZGQnLCAnNScsICcybicsICczbisyJywgJzRuLTEnLCAnLW4rNicKCQkJCXZhciB0ZXN0ID0gLygtPykoXGQqKW4oKD86XCt8LSk/XGQqKS8uZXhlYygKCQkJCQltYXRjaFsyXSA9PSAiZXZlbiIgJiYgIjJuIiB8fCBtYXRjaFsyXSA9PSAib2RkIiAmJiAiMm4rMSIgfHwKCQkJCQkhL1xELy50ZXN0KCBtYXRjaFsyXSApICYmICIwbisiICsgbWF0Y2hbMl0gfHwgbWF0Y2hbMl0pOwoKCQkJCS8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVycyAoZmlyc3QpbisobGFzdCkgaW5jbHVkaW5nIGlmIHRoZXkgYXJlIG5lZ2F0aXZlCgkJCQltYXRjaFsyXSA9ICh0ZXN0WzFdICsgKHRlc3RbMl0gfHwgMSkpIC0gMDsKCQkJCW1hdGNoWzNdID0gdGVzdFszXSAtIDA7CgkJCX0KCgkJCS8vIFRPRE86IE1vdmUgdG8gbm9ybWFsIGNhY2hpbmcgc3lzdGVtCgkJCW1hdGNoWzBdID0gZG9uZSsrOwoKCQkJcmV0dXJuIG1hdGNoOwoJCX0sCgkJQVRUUjogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTCl7CgkJCXZhciBuYW1lID0gbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpOwoJCQkKCQkJaWYgKCAhaXNYTUwgJiYgRXhwci5hdHRyTWFwW25hbWVdICkgewoJCQkJbWF0Y2hbMV0gPSBFeHByLmF0dHJNYXBbbmFtZV07CgkJCX0KCgkJCWlmICggbWF0Y2hbMl0gPT09ICJ+PSIgKSB7CgkJCQltYXRjaFs0XSA9ICIgIiArIG1hdGNoWzRdICsgIiAiOwoJCQl9CgoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCQlQU0VVRE86IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCl7CgkJCWlmICggbWF0Y2hbMV0gPT09ICJub3QiICkgewoJCQkJLy8gSWYgd2UncmUgZGVhbGluZyB3aXRoIGEgY29tcGxleCBleHByZXNzaW9uLCBvciBhIHNpbXBsZSBvbmUKCQkJCWlmICggbWF0Y2hbM10ubWF0Y2goY2h1bmtlcikubGVuZ3RoID4gMSB8fCAvXlx3Ly50ZXN0KG1hdGNoWzNdKSApIHsKCQkJCQltYXRjaFszXSA9IFNpenpsZShtYXRjaFszXSwgbnVsbCwgbnVsbCwgY3VyTG9vcCk7CgkJCQl9IGVsc2UgewoJCQkJCXZhciByZXQgPSBTaXp6bGUuZmlsdGVyKG1hdGNoWzNdLCBjdXJMb29wLCBpbnBsYWNlLCB0cnVlIF4gbm90KTsKCQkJCQlpZiAoICFpbnBsYWNlICkgewoJCQkJCQlyZXN1bHQucHVzaC5hcHBseSggcmVzdWx0LCByZXQgKTsKCQkJCQl9CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9IGVsc2UgaWYgKCBFeHByLm1hdGNoLlBPUy50ZXN0KCBtYXRjaFswXSApIHx8IEV4cHIubWF0Y2guQ0hJTEQudGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJCQoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCQlQT1M6IGZ1bmN0aW9uKG1hdGNoKXsKCQkJbWF0Y2gudW5zaGlmdCggdHJ1ZSApOwoJCQlyZXR1cm4gbWF0Y2g7CgkJfQoJfSwKCWZpbHRlcnM6IHsKCQllbmFibGVkOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICYmIGVsZW0udHlwZSAhPT0gImhpZGRlbiI7CgkJfSwKCQlkaXNhYmxlZDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlOwoJCX0sCgkJY2hlY2tlZDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiBlbGVtLmNoZWNrZWQgPT09IHRydWU7CgkJfSwKCQlzZWxlY3RlZDogZnVuY3Rpb24oZWxlbSl7CgkJCS8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHQKCQkJLy8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseQoJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7CgkJfSwKCQlwYXJlbnQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gISFlbGVtLmZpcnN0Q2hpbGQ7CgkJfSwKCQllbXB0eTogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAhZWxlbS5maXJzdENoaWxkOwoJCX0sCgkJaGFzOiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7CgkJCXJldHVybiAhIVNpenpsZSggbWF0Y2hbM10sIGVsZW0gKS5sZW5ndGg7CgkJfSwKCQloZWFkZXI6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gL2hcZC9pLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKCQl9LAoJCXRleHQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gInRleHQiID09PSBlbGVtLnR5cGU7CgkJfSwKCQlyYWRpbzogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAicmFkaW8iID09PSBlbGVtLnR5cGU7CgkJfSwKCQljaGVja2JveDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAiY2hlY2tib3giID09PSBlbGVtLnR5cGU7CgkJfSwKCQlmaWxlOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJmaWxlIiA9PT0gZWxlbS50eXBlOwoJCX0sCgkJcGFzc3dvcmQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gInBhc3N3b3JkIiA9PT0gZWxlbS50eXBlOwoJCX0sCgkJc3VibWl0OiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJzdWJtaXQiID09PSBlbGVtLnR5cGU7CgkJfSwKCQlpbWFnZTogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAiaW1hZ2UiID09PSBlbGVtLnR5cGU7CgkJfSwKCQlyZXNldDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAicmVzZXQiID09PSBlbGVtLnR5cGU7CgkJfSwKCQlidXR0b246IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gImJ1dHRvbiIgPT09IGVsZW0udHlwZSB8fCBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICJCVVRUT04iOwoJCX0sCgkJaW5wdXQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaS50ZXN0KGVsZW0ubm9kZU5hbWUpOwoJCX0KCX0sCglzZXRGaWx0ZXJzOiB7CgkJZmlyc3Q6IGZ1bmN0aW9uKGVsZW0sIGkpewoJCQlyZXR1cm4gaSA9PT0gMDsKCQl9LAoJCWxhc3Q6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoLCBhcnJheSl7CgkJCXJldHVybiBpID09PSBhcnJheS5sZW5ndGggLSAxOwoJCX0sCgkJZXZlbjogZnVuY3Rpb24oZWxlbSwgaSl7CgkJCXJldHVybiBpICUgMiA9PT0gMDsKCQl9LAoJCW9kZDogZnVuY3Rpb24oZWxlbSwgaSl7CgkJCXJldHVybiBpICUgMiA9PT0gMTsKCQl9LAoJCWx0OiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7CgkJCXJldHVybiBpIDwgbWF0Y2hbM10gLSAwOwoJCX0sCgkJZ3Q6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKCQkJcmV0dXJuIGkgPiBtYXRjaFszXSAtIDA7CgkJfSwKCQludGg6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PSBpOwoJCX0sCgkJZXE6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PSBpOwoJCX0KCX0sCglmaWx0ZXI6IHsKCQlQU0VVRE86IGZ1bmN0aW9uKGVsZW0sIG1hdGNoLCBpLCBhcnJheSl7CgkJCXZhciBuYW1lID0gbWF0Y2hbMV0sIGZpbHRlciA9IEV4cHIuZmlsdGVyc1sgbmFtZSBdOwoKCQkJaWYgKCBmaWx0ZXIgKSB7CgkJCQlyZXR1cm4gZmlsdGVyKCBlbGVtLCBpLCBtYXRjaCwgYXJyYXkgKTsKCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gImNvbnRhaW5zIiApIHsKCQkJCXJldHVybiAoZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCAiIikuaW5kZXhPZihtYXRjaFszXSkgPj0gMDsKCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gIm5vdCIgKSB7CgkJCQl2YXIgbm90ID0gbWF0Y2hbM107CgoJCQkJZm9yICggaSA9IDAsIGwgPSBub3QubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWlmICggbm90W2ldID09PSBlbGVtICkgewoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJfQoKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfSwKCQlDSElMRDogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpewoJCQl2YXIgdHlwZSA9IG1hdGNoWzFdLCBub2RlID0gZWxlbTsKCQkJc3dpdGNoICh0eXBlKSB7CgkJCQljYXNlICdvbmx5JzoKCQkJCWNhc2UgJ2ZpcnN0JzoKCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcpICkgIHsKCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCQlpZiAoIHR5cGUgPT0gJ2ZpcnN0JykgcmV0dXJuIHRydWU7CgkJCQkJbm9kZSA9IGVsZW07CgkJCQljYXNlICdsYXN0JzoKCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZS5uZXh0U2libGluZykgKSAgewoJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSByZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJCXJldHVybiB0cnVlOwoJCQkJY2FzZSAnbnRoJzoKCQkJCQl2YXIgZmlyc3QgPSBtYXRjaFsyXSwgbGFzdCA9IG1hdGNoWzNdOwoKCQkJCQlpZiAoIGZpcnN0ID09IDEgJiYgbGFzdCA9PSAwICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQkJCgkJCQkJdmFyIGRvbmVOYW1lID0gbWF0Y2hbMF0sCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQoJCQkJCWlmICggcGFyZW50ICYmIChwYXJlbnQuc2l6Y2FjaGUgIT09IGRvbmVOYW1lIHx8ICFlbGVtLm5vZGVJbmRleCkgKSB7CgkJCQkJCXZhciBjb3VudCA9IDA7CgkJCQkJCWZvciAoIG5vZGUgPSBwYXJlbnQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcgKSB7CgkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJCQkJbm9kZS5ub2RlSW5kZXggPSArK2NvdW50OwoJCQkJCQkJfQoJCQkJCQl9IAoJCQkJCQlwYXJlbnQuc2l6Y2FjaGUgPSBkb25lTmFtZTsKCQkJCQl9CgkJCQkJCgkJCQkJdmFyIGRpZmYgPSBlbGVtLm5vZGVJbmRleCAtIGxhc3Q7CgkJCQkJaWYgKCBmaXJzdCA9PSAwICkgewoJCQkJCQlyZXR1cm4gZGlmZiA9PSAwOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldHVybiAoIGRpZmYgJSBmaXJzdCA9PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAwICk7CgkJCQkJfQoJCQl9CgkJfSwKCQlJRDogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpewoJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSA9PT0gbWF0Y2g7CgkJfSwKCQlUQUc6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKCQkJcmV0dXJuIChtYXRjaCA9PT0gIioiICYmIGVsZW0ubm9kZVR5cGUgPT09IDEpIHx8IGVsZW0ubm9kZU5hbWUgPT09IG1hdGNoOwoJCX0sCgkJQ0xBU1M6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKCQkJcmV0dXJuICgiICIgKyAoZWxlbS5jbGFzc05hbWUgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpICsgIiAiKQoJCQkJLmluZGV4T2YoIG1hdGNoICkgPiAtMTsKCQl9LAoJCUFUVFI6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwKCQkJCXJlc3VsdCA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZSBdID8KCQkJCQlFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSggZWxlbSApIDoKCQkJCQllbGVtWyBuYW1lIF0gIT0gbnVsbCA/CgkJCQkJCWVsZW1bIG5hbWUgXSA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICksCgkJCQl2YWx1ZSA9IHJlc3VsdCArICIiLAoJCQkJdHlwZSA9IG1hdGNoWzJdLAoJCQkJY2hlY2sgPSBtYXRjaFs0XTsKCgkJCXJldHVybiByZXN1bHQgPT0gbnVsbCA/CgkJCQl0eXBlID09PSAiIT0iIDoKCQkJCXR5cGUgPT09ICI9IiA/CgkJCQl2YWx1ZSA9PT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gIio9IiA/CgkJCQl2YWx1ZS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKCQkJCXR5cGUgPT09ICJ+PSIgPwoJCQkJKCIgIiArIHZhbHVlICsgIiAiKS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKCQkJCSFjaGVjayA/CgkJCQl2YWx1ZSAmJiByZXN1bHQgIT09IGZhbHNlIDoKCQkJCXR5cGUgPT09ICIhPSIgPwoJCQkJdmFsdWUgIT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gIl49IiA/CgkJCQl2YWx1ZS5pbmRleE9mKGNoZWNrKSA9PT0gMCA6CgkJCQl0eXBlID09PSAiJD0iID8KCQkJCXZhbHVlLnN1YnN0cih2YWx1ZS5sZW5ndGggLSBjaGVjay5sZW5ndGgpID09PSBjaGVjayA6CgkJCQl0eXBlID09PSAifD0iID8KCQkJCXZhbHVlID09PSBjaGVjayB8fCB2YWx1ZS5zdWJzdHIoMCwgY2hlY2subGVuZ3RoICsgMSkgPT09IGNoZWNrICsgIi0iIDoKCQkJCWZhbHNlOwoJCX0sCgkJUE9TOiBmdW5jdGlvbihlbGVtLCBtYXRjaCwgaSwgYXJyYXkpewoJCQl2YXIgbmFtZSA9IG1hdGNoWzJdLCBmaWx0ZXIgPSBFeHByLnNldEZpbHRlcnNbIG5hbWUgXTsKCgkJCWlmICggZmlsdGVyICkgewoJCQkJcmV0dXJuIGZpbHRlciggZWxlbSwgaSwgbWF0Y2gsIGFycmF5ICk7CgkJCX0KCQl9Cgl9Cn07Cgp2YXIgb3JpZ1BPUyA9IEV4cHIubWF0Y2guUE9TOwoKZm9yICggdmFyIHR5cGUgaW4gRXhwci5tYXRjaCApIHsKCUV4cHIubWF0Y2hbIHR5cGUgXSA9IG5ldyBSZWdFeHAoIEV4cHIubWF0Y2hbIHR5cGUgXS5zb3VyY2UgKyAvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UgKTsKfQoKdmFyIG1ha2VBcnJheSA9IGZ1bmN0aW9uKGFycmF5LCByZXN1bHRzKSB7CglhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcnJheSApOwoKCWlmICggcmVzdWx0cyApIHsKCQlyZXN1bHRzLnB1c2guYXBwbHkoIHJlc3VsdHMsIGFycmF5ICk7CgkJcmV0dXJuIHJlc3VsdHM7Cgl9CgkKCXJldHVybiBhcnJheTsKfTsKCi8vIFBlcmZvcm0gYSBzaW1wbGUgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRoZSBicm93c2VyIGlzIGNhcGFibGUgb2YKLy8gY29udmVydGluZyBhIE5vZGVMaXN0IHRvIGFuIGFycmF5IHVzaW5nIGJ1aWx0aW4gbWV0aG9kcy4KdHJ5IHsKCUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcyApOwoKLy8gUHJvdmlkZSBhIGZhbGxiYWNrIG1ldGhvZCBpZiBpdCBkb2VzIG5vdCB3b3JrCn0gY2F0Y2goZSl7CgltYWtlQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0cykgewoJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdOwoKCQlpZiAoIHRvU3RyaW5nLmNhbGwoYXJyYXkpID09PSAiW29iamVjdCBBcnJheV0iICkgewoJCQlBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggcmV0LCBhcnJheSApOwoJCX0gZWxzZSB7CgkJCWlmICggdHlwZW9mIGFycmF5Lmxlbmd0aCA9PT0gIm51bWJlciIgKSB7CgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCB2YXIgaSA9IDA7IGFycmF5W2ldOyBpKysgKSB7CgkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiByZXQ7Cgl9Owp9Cgp2YXIgc29ydE9yZGVyOwoKaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQl2YXIgcmV0ID0gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDQgPyAtMSA6IGEgPT09IGIgPyAwIDogMTsKCQlpZiAoIHJldCA9PT0gMCApIHsKCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsKCQl9CgkJcmV0dXJuIHJldDsKCX07Cn0gZWxzZSBpZiAoICJzb3VyY2VJbmRleCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICkgewoJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7CgkJdmFyIHJldCA9IGEuc291cmNlSW5kZXggLSBiLnNvdXJjZUluZGV4OwoJCWlmICggcmV0ID09PSAwICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCX0KCQlyZXR1cm4gcmV0OwoJfTsKfSBlbHNlIGlmICggZG9jdW1lbnQuY3JlYXRlUmFuZ2UgKSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQl2YXIgYVJhbmdlID0gYS5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCksIGJSYW5nZSA9IGIub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOwoJCWFSYW5nZS5zZWxlY3ROb2RlKGEpOwoJCWFSYW5nZS5jb2xsYXBzZSh0cnVlKTsKCQliUmFuZ2Uuc2VsZWN0Tm9kZShiKTsKCQliUmFuZ2UuY29sbGFwc2UodHJ1ZSk7CgkJdmFyIHJldCA9IGFSYW5nZS5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuU1RBUlRfVE9fRU5ELCBiUmFuZ2UpOwoJCWlmICggcmV0ID09PSAwICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCX0KCQlyZXR1cm4gcmV0OwoJfTsKfQoKLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBicm93c2VyIHJldHVybnMgZWxlbWVudHMgYnkgbmFtZSB3aGVuCi8vIHF1ZXJ5aW5nIGJ5IGdldEVsZW1lbnRCeUlkIChhbmQgcHJvdmlkZSBhIHdvcmthcm91bmQpCihmdW5jdGlvbigpewoJLy8gV2UncmUgZ29pbmcgdG8gaW5qZWN0IGEgZmFrZSBpbnB1dCBlbGVtZW50IHdpdGggYSBzcGVjaWZpZWQgbmFtZQoJdmFyIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKCQlpZCA9ICJzY3JpcHQiICsgKG5ldyBEYXRlKS5nZXRUaW1lKCk7Cglmb3JtLmlubmVySFRNTCA9ICI8YSBuYW1lPSciICsgaWQgKyAiJy8+IjsKCgkvLyBJbmplY3QgaXQgaW50byB0aGUgcm9vdCBlbGVtZW50LCBjaGVjayBpdHMgc3RhdHVzLCBhbmQgcmVtb3ZlIGl0IHF1aWNrbHkKCXZhciByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwoJcm9vdC5pbnNlcnRCZWZvcmUoIGZvcm0sIHJvb3QuZmlyc3RDaGlsZCApOwoKCS8vIFRoZSB3b3JrYXJvdW5kIGhhcyB0byBkbyBhZGRpdGlvbmFsIGNoZWNrcyBhZnRlciBhIGdldEVsZW1lbnRCeUlkCgkvLyBXaGljaCBzbG93cyB0aGluZ3MgZG93biBmb3Igb3RoZXIgYnJvd3NlcnMgKGhlbmNlIHRoZSBicmFuY2hpbmcpCglpZiAoICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIGlkICkgKSB7CgkJRXhwci5maW5kLklEID0gZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKXsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgIWlzWE1MICkgewoJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsKCQkJCXJldHVybiBtID8gbS5pZCA9PT0gbWF0Y2hbMV0gfHwgdHlwZW9mIG0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gInVuZGVmaW5lZCIgJiYgbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1ZSA9PT0gbWF0Y2hbMV0gPyBbbV0gOiB1bmRlZmluZWQgOiBbXTsKCQkJfQoJCX07CgoJCUV4cHIuZmlsdGVyLklEID0gZnVuY3Rpb24oZWxlbSwgbWF0Y2gpewoJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgbm9kZSAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gbWF0Y2g7CgkJfTsKCX0KCglyb290LnJlbW92ZUNoaWxkKCBmb3JtICk7Cglyb290ID0gZm9ybSA9IG51bGw7IC8vIHJlbGVhc2UgbWVtb3J5IGluIElFCn0pKCk7CgooZnVuY3Rpb24oKXsKCS8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYnJvd3NlciByZXR1cm5zIG9ubHkgZWxlbWVudHMKCS8vIHdoZW4gZG9pbmcgZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKQoKCS8vIENyZWF0ZSBhIGZha2UgZWxlbWVudAoJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOwoKCS8vIE1ha2Ugc3VyZSBubyBjb21tZW50cyBhcmUgZm91bmQKCWlmICggZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoID4gMCApIHsKCQlFeHByLmZpbmQuVEFHID0gZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQpewoJCQl2YXIgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobWF0Y2hbMV0pOwoKCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cwoJCQlpZiAoIG1hdGNoWzFdID09PSAiKiIgKSB7CgkJCQl2YXIgdG1wID0gW107CgoJCQkJZm9yICggdmFyIGkgPSAwOyByZXN1bHRzW2ldOyBpKysgKSB7CgkJCQkJaWYgKCByZXN1bHRzW2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQl0bXAucHVzaCggcmVzdWx0c1tpXSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXN1bHRzID0gdG1wOwoJCQl9CgoJCQlyZXR1cm4gcmVzdWx0czsKCQl9OwoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiBhbiBhdHRyaWJ1dGUgcmV0dXJucyBub3JtYWxpemVkIGhyZWYgYXR0cmlidXRlcwoJZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScjJz48L2E+IjsKCWlmICggZGl2LmZpcnN0Q2hpbGQgJiYgdHlwZW9mIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYKCQkJZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgIT09ICIjIiApIHsKCQlFeHByLmF0dHJIYW5kbGUuaHJlZiA9IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImhyZWYiLCAyKTsKCQl9OwoJfQoKCWRpdiA9IG51bGw7IC8vIHJlbGVhc2UgbWVtb3J5IGluIElFCn0pKCk7CgppZiAoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwgKSAoZnVuY3Rpb24oKXsKCXZhciBvbGRTaXp6bGUgPSBTaXp6bGUsIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJZGl2LmlubmVySFRNTCA9ICI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7CgoJLy8gU2FmYXJpIGNhbid0IGhhbmRsZSB1cHBlcmNhc2Ugb3IgdW5pY29kZSBjaGFyYWN0ZXJzIHdoZW4KCS8vIGluIHF1aXJrcyBtb2RlLgoJaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCAmJiBkaXYucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGggPT09IDAgKSB7CgkJcmV0dXJuOwoJfQoJCglTaXp6bGUgPSBmdW5jdGlvbihxdWVyeSwgY29udGV4dCwgZXh0cmEsIHNlZWQpewoJCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OwoKCQkvLyBPbmx5IHVzZSBxdWVyeVNlbGVjdG9yQWxsIG9uIG5vbi1YTUwgZG9jdW1lbnRzCgkJLy8gKElEIHNlbGVjdG9ycyBkb24ndCB3b3JrIGluIG5vbi1IVE1MIGRvY3VtZW50cykKCQlpZiAoICFzZWVkICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgIWlzWE1MKGNvbnRleHQpICkgewoJCQl0cnkgewoJCQkJcmV0dXJuIG1ha2VBcnJheSggY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSwgZXh0cmEgKTsKCQkJfSBjYXRjaChlKXt9CgkJfQoJCQoJCXJldHVybiBvbGRTaXp6bGUocXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkKTsKCX07CgoJZm9yICggdmFyIHByb3AgaW4gb2xkU2l6emxlICkgewoJCVNpenpsZVsgcHJvcCBdID0gb2xkU2l6emxlWyBwcm9wIF07Cgl9CgoJZGl2ID0gbnVsbDsgLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKfSkoKTsKCmlmICggZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIChmdW5jdGlvbigpewoJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJZGl2LmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPSd0ZXN0IGUnPjwvZGl2PjxkaXYgY2xhc3M9J3Rlc3QnPjwvZGl2PiI7CgoJLy8gT3BlcmEgY2FuJ3QgZmluZCBhIHNlY29uZCBjbGFzc25hbWUgKGluIDkuNikKCWlmICggZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggPT09IDAgKQoJCXJldHVybjsKCgkvLyBTYWZhcmkgY2FjaGVzIGNsYXNzIGF0dHJpYnV0ZXMsIGRvZXNuJ3QgY2F0Y2ggY2hhbmdlcyAoaW4gMy4yKQoJZGl2Lmxhc3RDaGlsZC5jbGFzc05hbWUgPSAiZSI7CgoJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMSApCgkJcmV0dXJuOwoKCUV4cHIub3JkZXIuc3BsaWNlKDEsIDAsICJDTEFTUyIpOwoJRXhwci5maW5kLkNMQVNTID0gZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKSB7CgkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobWF0Y2hbMV0pOwoJCX0KCX07CgoJZGl2ID0gbnVsbDsgLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKfSkoKTsKCmZ1bmN0aW9uIGRpck5vZGVDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsKCXZhciBzaWJEaXIgPSBkaXIgPT0gInByZXZpb3VzU2libGluZyIgJiYgIWlzWE1MOwoJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CgkJaWYgKCBlbGVtICkgewoJCQlpZiAoIHNpYkRpciAmJiBlbGVtLm5vZGVUeXBlID09PSAxICl7CgkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQllbGVtLnNpenNldCA9IGk7CgkJCX0KCQkJZWxlbSA9IGVsZW1bZGlyXTsKCQkJdmFyIG1hdGNoID0gZmFsc2U7CgoJCQl3aGlsZSAoIGVsZW0gKSB7CgkJCQlpZiAoIGVsZW0uc2l6Y2FjaGUgPT09IGRvbmVOYW1lICkgewoJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNYTUwgKXsKCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJZWxlbS5zaXpzZXQgPSBpOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlTmFtZSA9PT0gY3VyICkgewoJCQkJCW1hdGNoID0gZWxlbTsKCQkJCQlicmVhazsKCQkJCX0KCgkJCQllbGVtID0gZWxlbVtkaXJdOwoJCQl9CgoJCQljaGVja1NldFtpXSA9IG1hdGNoOwoJCX0KCX0KfQoKZnVuY3Rpb24gZGlyQ2hlY2soIGRpciwgY3VyLCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKSB7Cgl2YXIgc2liRGlyID0gZGlyID09ICJwcmV2aW91c1NpYmxpbmciICYmICFpc1hNTDsKCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoJCWlmICggZWxlbSApIHsKCQkJaWYgKCBzaWJEaXIgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCWVsZW0uc2l6Y2FjaGUgPSBkb25lTmFtZTsKCQkJCWVsZW0uc2l6c2V0ID0gaTsKCQkJfQoJCQllbGVtID0gZWxlbVtkaXJdOwoJCQl2YXIgbWF0Y2ggPSBmYWxzZTsKCgkJCXdoaWxlICggZWxlbSApIHsKCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7CgkJCQkJbWF0Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWlmICggIWlzWE1MICkgewoJCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJCWVsZW0uc2l6c2V0ID0gaTsKCQkJCQl9CgkJCQkJaWYgKCB0eXBlb2YgY3VyICE9PSAic3RyaW5nIiApIHsKCQkJCQkJaWYgKCBlbGVtID09PSBjdXIgKSB7CgkJCQkJCQltYXRjaCA9IHRydWU7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoKCQkJCQl9IGVsc2UgaWYgKCBTaXp6bGUuZmlsdGVyKCBjdXIsIFtlbGVtXSApLmxlbmd0aCA+IDAgKSB7CgkJCQkJCW1hdGNoID0gZWxlbTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoKCQkJCWVsZW0gPSBlbGVtW2Rpcl07CgkJCX0KCgkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7CgkJfQoJfQp9Cgp2YXIgY29udGFpbnMgPSBkb2N1bWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/ICBmdW5jdGlvbihhLCBiKXsKCXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgMTY7Cn0gOiBmdW5jdGlvbihhLCBiKXsKCXJldHVybiBhICE9PSBiICYmIChhLmNvbnRhaW5zID8gYS5jb250YWlucyhiKSA6IHRydWUpOwp9OwoKdmFyIGlzWE1MID0gZnVuY3Rpb24oZWxlbSl7CglyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8CgkJISFlbGVtLm93bmVyRG9jdW1lbnQgJiYgZWxlbS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiOwp9OwoKdmFyIHBvc1Byb2Nlc3MgPSBmdW5jdGlvbihzZWxlY3RvciwgY29udGV4dCl7Cgl2YXIgdG1wU2V0ID0gW10sIGxhdGVyID0gIiIsIG1hdGNoLAoJCXJvb3QgPSBjb250ZXh0Lm5vZGVUeXBlID8gW2NvbnRleHRdIDogY29udGV4dDsKCgkvLyBQb3NpdGlvbiBzZWxlY3RvcnMgbXVzdCBiZSBkb25lIGFmdGVyIHRoZSBmaWx0ZXIKCS8vIEFuZCBzbyBtdXN0IDpub3QocG9zaXRpb25hbCkgc28gd2UgbW92ZSBhbGwgUFNFVURPcyB0byB0aGUgZW5kCgl3aGlsZSAoIChtYXRjaCA9IEV4cHIubWF0Y2guUFNFVURPLmV4ZWMoIHNlbGVjdG9yICkpICkgewoJCWxhdGVyICs9IG1hdGNoWzBdOwoJCXNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSggRXhwci5tYXRjaC5QU0VVRE8sICIiICk7Cgl9CgoJc2VsZWN0b3IgPSBFeHByLnJlbGF0aXZlW3NlbGVjdG9yXSA/IHNlbGVjdG9yICsgIioiIDogc2VsZWN0b3I7CgoJZm9yICggdmFyIGkgPSAwLCBsID0gcm9vdC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJU2l6emxlKCBzZWxlY3Rvciwgcm9vdFtpXSwgdG1wU2V0ICk7Cgl9CgoJcmV0dXJuIFNpenpsZS5maWx0ZXIoIGxhdGVyLCB0bXBTZXQgKTsKfTsKCi8vIEVYUE9TRQpqUXVlcnkuZmluZCA9IFNpenpsZTsKalF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzOwpqUXVlcnkuZXhwclsiOiJdID0galF1ZXJ5LmV4cHIuZmlsdGVyczsKClNpenpsZS5zZWxlY3RvcnMuZmlsdGVycy5oaWRkZW4gPSBmdW5jdGlvbihlbGVtKXsKCXZhciB3aWR0aCA9IGVsZW0ub2Zmc2V0V2lkdGgsIGhlaWdodCA9IGVsZW0ub2Zmc2V0SGVpZ2h0OwoJcmV0dXJuICggd2lkdGggPT09IDAgJiYgaGVpZ2h0ID09PSAwICkgPwoJCXRydWUgOgoJCSggd2lkdGggIT09IDAgJiYgaGVpZ2h0ICE9PSAwICkgPwoJCQlmYWxzZSA6CgkJCSEhKCBqUXVlcnkuY3VyQ1NTKGVsZW0sICJkaXNwbGF5IikgPT09ICJub25lIiApOwp9OwoKU2l6emxlLnNlbGVjdG9ycy5maWx0ZXJzLnZpc2libGUgPSBmdW5jdGlvbihlbGVtKXsKCXZhciB3aWR0aCA9IGVsZW0ub2Zmc2V0V2lkdGgsIGhlaWdodCA9IGVsZW0ub2Zmc2V0SGVpZ2h0OwoJcmV0dXJuICggd2lkdGggPT09IDAgJiYgaGVpZ2h0ID09PSAwICkgPwoJCWZhbHNlIDoKCQkoIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwICkgPwoJCQl0cnVlIDoKCQkJISEoIGpRdWVyeS5jdXJDU1MoZWxlbSwgImRpc3BsYXkiKSAhPT0gIm5vbmUiICk7Cn07CgpTaXp6bGUuc2VsZWN0b3JzLmZpbHRlcnMuYW5pbWF0ZWQgPSBmdW5jdGlvbihlbGVtKXsKCXJldHVybiBqUXVlcnkuZ3JlcChqUXVlcnkudGltZXJzLCBmdW5jdGlvbihmbil7CgkJcmV0dXJuIGVsZW0gPT09IGZuLmVsZW07Cgl9KS5sZW5ndGg7Cn07CgpqUXVlcnkuZmlsdGVyID0galF1ZXJ5Lm11bHRpRmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7CglpZiAoIG5vdCApIHsKCQlleHByID0gIjpub3QoIiArIGV4cHIgKyAiKSI7Cgl9CgoJcmV0dXJuIFNpenpsZS5tYXRjaGVzKGV4cHIsIGVsZW1zKTsKfTsKCmpRdWVyeS5kaXIgPSBmdW5jdGlvbiggZWxlbSwgZGlyICl7Cgl2YXIgbWF0Y2hlZCA9IFtdLCBjdXIgPSBlbGVtW2Rpcl07Cgl3aGlsZSAoIGN1ciAmJiBjdXIgIT0gZG9jdW1lbnQgKSB7CgkJaWYgKCBjdXIubm9kZVR5cGUgPT0gMSApCgkJCW1hdGNoZWQucHVzaCggY3VyICk7CgkJY3VyID0gY3VyW2Rpcl07Cgl9CglyZXR1cm4gbWF0Y2hlZDsKfTsKCmpRdWVyeS5udGggPSBmdW5jdGlvbihjdXIsIHJlc3VsdCwgZGlyLCBlbGVtKXsKCXJlc3VsdCA9IHJlc3VsdCB8fCAxOwoJdmFyIG51bSA9IDA7CgoJZm9yICggOyBjdXI7IGN1ciA9IGN1cltkaXJdICkKCQlpZiAoIGN1ci5ub2RlVHlwZSA9PSAxICYmICsrbnVtID09IHJlc3VsdCApCgkJCWJyZWFrOwoKCXJldHVybiBjdXI7Cn07CgpqUXVlcnkuc2libGluZyA9IGZ1bmN0aW9uKG4sIGVsZW0pewoJdmFyIHIgPSBbXTsKCglmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkgewoJCWlmICggbi5ub2RlVHlwZSA9PSAxICYmIG4gIT0gZWxlbSApCgkJCXIucHVzaCggbiApOwoJfQoKCXJldHVybiByOwp9OwoKcmV0dXJuOwoKd2luZG93LlNpenpsZSA9IFNpenpsZTsKCn0pKCk7CmpRdWVyeS5mbi5leHRlbmQoewoJZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciByZXQgPSB0aGlzLnB1c2hTdGFjayggIiIsICJmaW5kIiwgc2VsZWN0b3IgKSwgbGVuZ3RoID0gMDsKCgkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCWxlbmd0aCA9IHJldC5sZW5ndGg7CgkJCWpRdWVyeS5maW5kKCBzZWxlY3RvciwgdGhpc1tpXSwgcmV0ICk7CgoJCQlpZiAoIGkgPiAwICkgewoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHJlc3VsdHMgYXJlIHVuaXF1ZQoJCQkJZm9yICggdmFyIG4gPSBsZW5ndGg7IG4gPCByZXQubGVuZ3RoOyBuKysgKSB7CgkJCQkJZm9yICggdmFyIHIgPSAwOyByIDwgbGVuZ3RoOyByKysgKSB7CgkJCQkJCWlmICggcmV0W3JdID09PSByZXRbbl0gKSB7CgkJCQkJCQlyZXQuc3BsaWNlKG4tLSwgMSk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKAoJCQlqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSAmJgoJCQlqUXVlcnkuZ3JlcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBpKXsKCQkJCXJldHVybiBzZWxlY3Rvci5jYWxsKCBlbGVtLCBpICk7CgkJCX0pIHx8CgoJCQlqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCBqUXVlcnkuZ3JlcCh0aGlzLCBmdW5jdGlvbihlbGVtKXsKCQkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxOwoJCQl9KSApLCAiZmlsdGVyIiwgc2VsZWN0b3IgKTsKCX0sCgoJY2xvc2VzdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBwb3MgPSBqUXVlcnkuZXhwci5tYXRjaC5QT1MudGVzdCggc2VsZWN0b3IgKSA/IGpRdWVyeShzZWxlY3RvcikgOiBudWxsLAoJCQljbG9zZXIgPSAwOwoKCQlyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXsKCQkJdmFyIGN1ciA9IHRoaXM7CgkJCXdoaWxlICggY3VyICYmIGN1ci5vd25lckRvY3VtZW50ICkgewoJCQkJaWYgKCBwb3MgPyBwb3MuaW5kZXgoY3VyKSA+IC0xIDogalF1ZXJ5KGN1cikuaXMoc2VsZWN0b3IpICkgewoJCQkJCWpRdWVyeS5kYXRhKGN1ciwgImNsb3Nlc3QiLCBjbG9zZXIpOwoJCQkJCXJldHVybiBjdXI7CgkJCQl9CgkJCQljdXIgPSBjdXIucGFyZW50Tm9kZTsKCQkJCWNsb3NlcisrOwoJCQl9CgkJfSk7Cgl9LAoKCW5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCWlmICggdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApCgkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIHdoZXJlIGp1c3Qgb25lIHNlbGVjdG9yIGlzIHBhc3NlZCBpbgoJCQlpZiAoIGlzU2ltcGxlLnRlc3QoIHNlbGVjdG9yICkgKQoJCQkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCB0aGlzLCB0cnVlICksICJub3QiLCBzZWxlY3RvciApOwoJCQllbHNlCgkJCQlzZWxlY3RvciA9IGpRdWVyeS5tdWx0aUZpbHRlciggc2VsZWN0b3IsIHRoaXMgKTsKCgkJdmFyIGlzQXJyYXlMaWtlID0gc2VsZWN0b3IubGVuZ3RoICYmIHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCAtIDFdICE9PSB1bmRlZmluZWQgJiYgIXNlbGVjdG9yLm5vZGVUeXBlOwoJCXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJcmV0dXJuIGlzQXJyYXlMaWtlID8galF1ZXJ5LmluQXJyYXkoIHRoaXMsIHNlbGVjdG9yICkgPCAwIDogdGhpcyAhPSBzZWxlY3RvcjsKCQl9KTsKCX0sCgoJYWRkOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkudW5pcXVlKCBqUXVlcnkubWVyZ2UoCgkJCXRoaXMuZ2V0KCksCgkJCXR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgPwoJCQkJalF1ZXJ5KCBzZWxlY3RvciApIDoKCQkJCWpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yICkKCQkpKSk7Cgl9LAoKCWVxOiBmdW5jdGlvbiggaSApIHsKCQlyZXR1cm4gdGhpcy5zbGljZSggaSwgK2kgKyAxICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICksCgkJCSJzbGljZSIsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpICk7Cgl9LAoKCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBpKXsKCQkJcmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsKCQl9KSk7Cgl9LAoKCWFuZFNlbGY6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmFkZCggdGhpcy5wcmV2T2JqZWN0ICk7Cgl9LAoKCWVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCBqUXVlcnkobnVsbCk7Cgl9Cn0pOwoKalF1ZXJ5LmVhY2goewoJcGFyZW50OiBmdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxlbS5wYXJlbnROb2RlO30sCglwYXJlbnRzOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LmRpcihlbGVtLCJwYXJlbnROb2RlIik7fSwKCW5leHQ6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubnRoKGVsZW0sMiwibmV4dFNpYmxpbmciKTt9LAoJcHJldjogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5udGgoZWxlbSwyLCJwcmV2aW91c1NpYmxpbmciKTt9LAoJbmV4dEFsbDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwibmV4dFNpYmxpbmciKTt9LAoJcHJldkFsbDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwicHJldmlvdXNTaWJsaW5nIik7fSwKCXNpYmxpbmdzOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsZWxlbSk7fSwKCWNoaWxkcmVuOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5maXJzdENoaWxkKTt9LAoJY29udGVudHM6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubm9kZU5hbWUoZWxlbSwiaWZyYW1lIik/ZWxlbS5jb250ZW50RG9jdW1lbnR8fGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudDpqUXVlcnkubWFrZUFycmF5KGVsZW0uY2hpbGROb2Rlcyk7fQp9LCBmdW5jdGlvbihuYW1lLCBmbil7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgcmV0ID0galF1ZXJ5Lm1hcCggdGhpcywgZm4gKTsKCgkJaWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT0gInN0cmluZyIgKQoJCQlyZXQgPSBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsKCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkudW5pcXVlKCByZXQgKSwgbmFtZSwgc2VsZWN0b3IgKTsKCX07Cn0pO2pRdWVyeS5mbi5leHRlbmQoewoJYXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewoJCXZhciBvcHRpb25zID0gbmFtZSwgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApOwoKCQlpZiAoIHR5cGVvZiBuYW1lID09PSAic3RyaW5nIiApIHsKCQkJLy8gQXJlIHdlIHNldHRpbmcgdGhlIGF0dHJpYnV0ZT8KCQkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgewoJCQkJcmV0dXJuIHRoaXMubGVuZ3RoID8KCQkJCQlqUXVlcnkuYXR0ciggdGhpc1swXSwgbmFtZSApIDoKCQkJCQludWxsOwoKCQkJLy8gQ29udmVydCBuYW1lLCB2YWx1ZSBwYXJhbXMgdG8gb3B0aW9ucyBoYXNoIGZvcm1hdAoJCQl9IGVsc2UgewoJCQkJb3B0aW9ucyA9IHt9OwoJCQkJb3B0aW9uc1sgbmFtZSBdID0gdmFsdWU7CgkJCX0KCQl9CgoJCS8vIEZvciBlYWNoIGVsZW1lbnQuLi4KCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJdmFyIGVsZW0gPSB0aGlzW2ldOwoKCQkJLy8gU2V0IGFsbCB0aGUgYXR0cmlidXRlcwoJCQlmb3IgKCB2YXIgcHJvcCBpbiBvcHRpb25zICkgewoJCQkJdmFsdWUgPSBvcHRpb25zW3Byb3BdOwoKCQkJCWlmICggaXNGdW5jdGlvbiApIHsKCQkJCQl2YWx1ZSA9IHZhbHVlLmNhbGwoIGVsZW0sIGkgKTsKCQkJCX0KCgkJCQlqUXVlcnkuYXR0ciggZWxlbSwgcHJvcCwgdmFsdWUgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuICEhc2VsZWN0b3IgJiYgdGhpcy5pcyggIi4iICsgc2VsZWN0b3IgKTsKCX0sCgoJdmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgewoJCQl2YXIgZWxlbSA9IHRoaXNbMF07CgoJCQlpZiAoIGVsZW0gKSB7CgkJCQlpZiggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAnb3B0aW9uJyApICkKCQkJCQlyZXR1cm4gKGVsZW0uYXR0cmlidXRlcy52YWx1ZSB8fCB7fSkuc3BlY2lmaWVkID8gZWxlbS52YWx1ZSA6IGVsZW0udGV4dDsKCgkJCQkvLyBXZSBuZWVkIHRvIGhhbmRsZSBzZWxlY3QgYm94ZXMgc3BlY2lhbAoJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJzZWxlY3QiICkgKSB7CgkJCQkJdmFyIGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAoJCQkJCQl2YWx1ZXMgPSBbXSwKCQkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKCQkJCQkJb25lID0gZWxlbS50eXBlID09ICJzZWxlY3Qtb25lIjsKCgkJCQkJLy8gTm90aGluZyB3YXMgc2VsZWN0ZWQKCQkJCQlpZiAoIGluZGV4IDwgMCApCgkJCQkJCXJldHVybiBudWxsOwoKCQkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCgkJCQkJZm9yICggdmFyIGkgPSBvbmUgPyBpbmRleCA6IDAsIG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoOyBpIDwgbWF4OyBpKysgKSB7CgkJCQkJCXZhciBvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCQlpZiAoIG9wdGlvbi5zZWxlY3RlZCApIHsKCQkJCQkJCS8vIEdldCB0aGUgc3BlY2lmYyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgoJCQkJCQkJdmFsdWUgPSBqUXVlcnkob3B0aW9uKS52YWwoKTsKCgkJCQkJCQkvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0cwoJCQkJCQkJaWYgKCBvbmUgKQoJCQkJCQkJCXJldHVybiB2YWx1ZTsKCgkJCQkJCQkvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheQoJCQkJCQkJdmFsdWVzLnB1c2goIHZhbHVlICk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCXJldHVybiB2YWx1ZXM7CgkJCQl9CgoJCQkJLy8gRXZlcnl0aGluZyBlbHNlLCB3ZSBqdXN0IGdyYWIgdGhlIHZhbHVlCgkJCQlyZXR1cm4gKGVsZW0udmFsdWUgfHwgIiIpLnJlcGxhY2UoL1xyL2csICIiKTsKCgkJCX0KCgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gIm51bWJlciIgKQoJCQl2YWx1ZSArPSAnJzsKCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpewoJCQlpZiAoIHRoaXMubm9kZVR5cGUgIT0gMSApCgkJCQlyZXR1cm47CgoJCQlpZiAoIGpRdWVyeS5pc0FycmF5KHZhbHVlKSAmJiAvcmFkaW98Y2hlY2tib3gvLnRlc3QoIHRoaXMudHlwZSApICkKCQkJCXRoaXMuY2hlY2tlZCA9IChqUXVlcnkuaW5BcnJheSh0aGlzLnZhbHVlLCB2YWx1ZSkgPj0gMCB8fAoJCQkJCWpRdWVyeS5pbkFycmF5KHRoaXMubmFtZSwgdmFsdWUpID49IDApOwoKCQkJZWxzZSBpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgInNlbGVjdCIgKSApIHsKCQkJCXZhciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KHZhbHVlKTsKCgkJCQlqUXVlcnkoICJvcHRpb24iLCB0aGlzICkuZWFjaChmdW5jdGlvbigpewoJCQkJCXRoaXMuc2VsZWN0ZWQgPSAoalF1ZXJ5LmluQXJyYXkoIHRoaXMudmFsdWUsIHZhbHVlcyApID49IDAgfHwKCQkJCQkJalF1ZXJ5LmluQXJyYXkoIHRoaXMudGV4dCwgdmFsdWVzICkgPj0gMCk7CgkJCQl9KTsKCgkJCQlpZiAoICF2YWx1ZXMubGVuZ3RoICkKCQkJCQl0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTsKCgkJCX0gZWxzZQoJCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwoJCX0pOwoJfQp9KTsKCmpRdWVyeS5lYWNoKHsKCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgewoJCWpRdWVyeS5hdHRyKCB0aGlzLCBuYW1lLCAiIiApOwoJCWlmICh0aGlzLm5vZGVUeXBlID09IDEpCgkJCXRoaXMucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7Cgl9LAoKCWFkZENsYXNzOiBmdW5jdGlvbiggY2xhc3NOYW1lcyApIHsKCQlqUXVlcnkuY2xhc3NOYW1lLmFkZCggdGhpcywgY2xhc3NOYW1lcyApOwoJfSwKCglyZW1vdmVDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMgKSB7CgkJalF1ZXJ5LmNsYXNzTmFtZS5yZW1vdmUoIHRoaXMsIGNsYXNzTmFtZXMgKTsKCX0sCgoJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCBjbGFzc05hbWVzLCBzdGF0ZSApIHsKCQl2YXIgdHlwZSA9IHR5cGVvZiBjbGFzc05hbWVzOwoJCWlmICggdHlwZSA9PT0gInN0cmluZyIgKSB7CgkJCS8vIHRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzCgkJCXZhciBpc0Jvb2wgPSB0eXBlb2Ygc3RhdGUgPT09ICJib29sZWFuIiwgY2xhc3NOYW1lLCBpID0gMCwKCQkJCWNsYXNzTmFtZXMgPSBjbGFzc05hbWVzLnNwbGl0KCAvXHMrLyApOwoJCQl3aGlsZSAoIChjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSkgKSB7CgkJCQkvLyBjaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwZXJhdGVkIGxpc3QKCQkJCXN0YXRlID0gaXNCb29sID8gc3RhdGUgOiAhalF1ZXJ5LmNsYXNzTmFtZS5oYXMoIHRoaXMsIGNsYXNzTmFtZSApOwoJCQkJalF1ZXJ5LmNsYXNzTmFtZVsgc3RhdGUgPyAiYWRkIiA6ICJyZW1vdmUiIF0oIHRoaXMsIGNsYXNzTmFtZSApOwoJCQl9CgkJfSBlbHNlIGlmICggdHlwZSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZSA9PT0gImJvb2xlYW4iICkgewoJCQlpZiAoIHRoaXMuY2xhc3NOYW1lICkgewoJCQkJLy8gc3RvcmUgY2xhc3NOYW1lIGlmIHNldAoJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgdGhpcy5jbGFzc05hbWUgKTsKCQkJfQoJCQkvLyB0b2dnbGUgd2hvbGUgY2xhc3NOYW1lCgkJCXRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUgfHwgY2xhc3NOYW1lcyA9PT0gZmFsc2UgPyAiIiA6IGpRdWVyeS5kYXRhKCB0aGlzLCAiX19jbGFzc05hbWVfXyIgKSB8fCAiIjsKCQl9Cgl9Cn0sIGZ1bmN0aW9uKG5hbWUsIGZuKXsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oKXsKCQlyZXR1cm4gdGhpcy5lYWNoKCBmbiwgYXJndW1lbnRzICk7Cgl9Owp9KTsKCmpRdWVyeS5leHRlbmQoewoJY2xhc3NOYW1lOiB7CgkJLy8gaW50ZXJuYWwgb25seSwgdXNlIGFkZENsYXNzKCJjbGFzcyIpCgkJYWRkOiBmdW5jdGlvbiggZWxlbSwgY2xhc3NOYW1lcyApIHsKCQkJalF1ZXJ5LmVhY2goKGNsYXNzTmFtZXMgfHwgIiIpLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oaSwgY2xhc3NOYW1lKXsKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PSAxICYmICFqUXVlcnkuY2xhc3NOYW1lLmhhcyggZWxlbS5jbGFzc05hbWUsIGNsYXNzTmFtZSApICkKCQkJCQllbGVtLmNsYXNzTmFtZSArPSAoZWxlbS5jbGFzc05hbWUgPyAiICIgOiAiIikgKyBjbGFzc05hbWU7CgkJCX0pOwoJCX0sCgoJCS8vIGludGVybmFsIG9ubHksIHVzZSByZW1vdmVDbGFzcygiY2xhc3MiKQoJCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIGNsYXNzTmFtZXMgKSB7CgkJCWlmIChlbGVtLm5vZGVUeXBlID09IDEpCgkJCQllbGVtLmNsYXNzTmFtZSA9IGNsYXNzTmFtZXMgIT09IHVuZGVmaW5lZCA/CgkJCQkJalF1ZXJ5LmdyZXAoZWxlbS5jbGFzc05hbWUuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihjbGFzc05hbWUpewoJCQkJCQlyZXR1cm4gIWpRdWVyeS5jbGFzc05hbWUuaGFzKCBjbGFzc05hbWVzLCBjbGFzc05hbWUgKTsKCQkJCQl9KS5qb2luKCIgIikgOgoJCQkJCSIiOwoJCX0sCgoJCS8vIGludGVybmFsIG9ubHksIHVzZSBoYXNDbGFzcygiY2xhc3MiKQoJCWhhczogZnVuY3Rpb24oIGVsZW0sIGNsYXNzTmFtZSApIHsKCQkJcmV0dXJuIGVsZW0gJiYgalF1ZXJ5LmluQXJyYXkoIGNsYXNzTmFtZSwgKGVsZW0uY2xhc3NOYW1lIHx8IGVsZW0pLnRvU3RyaW5nKCkuc3BsaXQoL1xzKy8pICkgPiAtMTsKCQl9Cgl9LAoKCWF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKCQkvLyBkb24ndCBzZXQgYXR0cmlidXRlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDgpCgkJCXJldHVybiB1bmRlZmluZWQ7CgoJCXZhciBub3R4bWwgPSAhZWxlbS50YWdOYW1lIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSwKCQkJLy8gV2hldGhlciB3ZSBhcmUgc2V0dGluZyAob3IgZ2V0dGluZykKCQkJc2V0ID0gdmFsdWUgIT09IHVuZGVmaW5lZDsKCgkJLy8gVHJ5IHRvIG5vcm1hbGl6ZS9maXggdGhlIG5hbWUKCQluYW1lID0gbm90eG1sICYmIGpRdWVyeS5wcm9wc1sgbmFtZSBdIHx8IG5hbWU7CgoJCS8vIE9ubHkgZG8gYWxsIHRoZSBmb2xsb3dpbmcgaWYgdGhpcyBpcyBhIG5vZGUgKGZhc3RlciBmb3Igc3R5bGUpCgkJaWYgKCBlbGVtLnRhZ05hbWUgKSB7CgoJCQkvLyBUaGVzZSBhdHRyaWJ1dGVzIHJlcXVpcmUgc3BlY2lhbCB0cmVhdG1lbnQKCQkJdmFyIHNwZWNpYWwgPSAvaHJlZnxzcmN8c3R5bGUvLnRlc3QoIG5hbWUgKTsKCgkJCS8vIFNhZmFyaSBtaXMtcmVwb3J0cyB0aGUgZGVmYXVsdCBzZWxlY3RlZCBwcm9wZXJ0eSBvZiBhIGhpZGRlbiBvcHRpb24KCQkJLy8gQWNjZXNzaW5nIHRoZSBwYXJlbnQncyBzZWxlY3RlZEluZGV4IHByb3BlcnR5IGZpeGVzIGl0CgkJCWlmICggbmFtZSA9PSAic2VsZWN0ZWQiICYmIGVsZW0ucGFyZW50Tm9kZSApCgkJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCgkJCS8vIElmIGFwcGxpY2FibGUsIGFjY2VzcyB0aGUgYXR0cmlidXRlIHZpYSB0aGUgRE9NIDAgd2F5CgkJCWlmICggbmFtZSBpbiBlbGVtICYmIG5vdHhtbCAmJiAhc3BlY2lhbCApIHsKCQkJCWlmICggc2V0ICl7CgkJCQkJLy8gV2UgY2FuJ3QgYWxsb3cgdGhlIHR5cGUgcHJvcGVydHkgdG8gYmUgY2hhbmdlZCAoc2luY2UgaXQgY2F1c2VzIHByb2JsZW1zIGluIElFKQoJCQkJCWlmICggbmFtZSA9PSAidHlwZSIgJiYgZWxlbS5ub2RlTmFtZS5tYXRjaCgvKGJ1dHRvbnxpbnB1dCkvaSkgJiYgZWxlbS5wYXJlbnROb2RlICkKCQkJCQkJdGhyb3cgInR5cGUgcHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCI7CgoJCQkJCWVsZW1bIG5hbWUgXSA9IHZhbHVlOwoJCQkJfQoKCQkJCS8vIGJyb3dzZXJzIGluZGV4IGVsZW1lbnRzIGJ5IGlkL25hbWUgb24gZm9ybXMsIGdpdmUgcHJpb3JpdHkgdG8gYXR0cmlidXRlcy4KCQkJCWlmKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJmb3JtIiApICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSApCgkJCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApLm5vZGVWYWx1ZTsKCgkJCQkvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0CgkJCQkvLyBodHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0LwoJCQkJaWYgKCBuYW1lID09ICJ0YWJJbmRleCIgKSB7CgkJCQkJdmFyIGF0dHJpYnV0ZU5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoICJ0YWJJbmRleCIgKTsKCQkJCQlyZXR1cm4gYXR0cmlidXRlTm9kZSAmJiBhdHRyaWJ1dGVOb2RlLnNwZWNpZmllZAoJCQkJCQk/IGF0dHJpYnV0ZU5vZGUudmFsdWUKCQkJCQkJOiBlbGVtLm5vZGVOYW1lLm1hdGNoKC8oYnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpL2kpCgkJCQkJCQk/IDAKCQkJCQkJCTogZWxlbS5ub2RlTmFtZS5tYXRjaCgvXihhfGFyZWEpJC9pKSAmJiBlbGVtLmhyZWYKCQkJCQkJCQk/IDAKCQkJCQkJCQk6IHVuZGVmaW5lZDsKCQkJCX0KCgkJCQlyZXR1cm4gZWxlbVsgbmFtZSBdOwoJCQl9CgoJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5zdHlsZSAmJiBub3R4bWwgJiYgbmFtZSA9PSAic3R5bGUiICkgewoJCQkJaWYgKCBzZXQgKQoJCQkJCWVsZW0uc3R5bGUuY3NzVGV4dCA9ICIiICsgdmFsdWU7CgoJCQkJcmV0dXJuIGVsZW0uc3R5bGUuY3NzVGV4dDsKCQkJfQoKCQkJaWYgKCBzZXQgKQoJCQkJLy8gY29udmVydCB0aGUgdmFsdWUgdG8gYSBzdHJpbmcgKGFsbCBicm93c2VycyBkbyB0aGlzIGJ1dCBJRSkgc2VlICMxMDcwCgkJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgIiIgKyB2YWx1ZSApOwoKCQkJdmFyIGF0dHIgPSAhalF1ZXJ5LnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWQgJiYgbm90eG1sICYmIHNwZWNpYWwKCQkJCQkvLyBTb21lIGF0dHJpYnV0ZXMgcmVxdWlyZSBhIHNwZWNpYWwgY2FsbCBvbiBJRQoJCQkJCT8gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIDIgKQoJCQkJCTogZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKCgkJCS8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkCgkJCXJldHVybiBhdHRyID09PSBudWxsID8gdW5kZWZpbmVkIDogYXR0cjsKCQl9CgoJCS8vIGVsZW0gaXMgYWN0dWFsbHkgZWxlbS5zdHlsZSAuLi4gc2V0IHRoZSBzdHlsZQoJCS8vIFVzaW5nIGF0dHIgZm9yIHNwZWNpZmljIHN0eWxlIGluZm9ybWF0aW9uIGlzIG5vdyBkZXByZWNhdGVkLiBVc2Ugc3R5bGUgaW5zZWFkLgoJCXJldHVybiBqUXVlcnkuc3R5bGUoZWxlbSwgbmFtZSwgdmFsdWUpOwoJfQp9KTtqUXVlcnkuZm4uZXh0ZW5kKHsKCXRleHQ6IGZ1bmN0aW9uKCB0ZXh0ICkgewoJCWlmICggdHlwZW9mIHRleHQgIT09ICJvYmplY3QiICYmIHRleHQgIT0gbnVsbCApCgkJCXJldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCAodGhpc1swXSAmJiB0aGlzWzBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKCB0ZXh0ICkgKTsKCgkJdmFyIHJldCA9ICIiOwoKCQlqUXVlcnkuZWFjaCggdGV4dCB8fCB0aGlzLCBmdW5jdGlvbigpewoJCQlqUXVlcnkuZWFjaCggdGhpcy5jaGlsZE5vZGVzLCBmdW5jdGlvbigpewoJCQkJaWYgKCB0aGlzLm5vZGVUeXBlICE9IDggKQoJCQkJCXJldCArPSB0aGlzLm5vZGVUeXBlICE9IDEgPwoJCQkJCQl0aGlzLm5vZGVWYWx1ZSA6CgkJCQkJCWpRdWVyeS5mbi50ZXh0KCBbIHRoaXMgXSApOwoJCQl9KTsKCQl9KTsKCgkJcmV0dXJuIHJldDsKCX0sCgoJd3JhcEFsbDogZnVuY3Rpb24oIGh0bWwgKSB7CgkJaWYgKCB0aGlzWzBdICkgewoJCQkvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZAoJCQl2YXIgd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1swXS5vd25lckRvY3VtZW50ICkuY2xvbmUoKTsKCgkJCWlmICggdGhpc1swXS5wYXJlbnROb2RlICkKCQkJCXdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWzBdICk7CgoJCQl3cmFwLm1hcChmdW5jdGlvbigpewoJCQkJdmFyIGVsZW0gPSB0aGlzOwoKCQkJCXdoaWxlICggZWxlbS5maXJzdENoaWxkICkKCQkJCQllbGVtID0gZWxlbS5maXJzdENoaWxkOwoKCQkJCXJldHVybiBlbGVtOwoJCQl9KS5hcHBlbmQodGhpcyk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeSggdGhpcyApLmNvbnRlbnRzKCkud3JhcEFsbCggaHRtbCApOwoJCX0pOwoJfSwKCgl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWwgKTsKCQl9KTsKCX0sCgoJYXBwZW5kOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUsIGZ1bmN0aW9uKGVsZW0pewoJCQlpZiAodGhpcy5ub2RlVHlwZSA9PSAxKQoJCQkJdGhpcy5hcHBlbmRDaGlsZCggZWxlbSApOwoJCX0pOwoJfSwKCglwcmVwZW5kOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUsIGZ1bmN0aW9uKGVsZW0pewoJCQlpZiAodGhpcy5ub2RlVHlwZSA9PSAxKQoJCQkJdGhpcy5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMuZmlyc3RDaGlsZCApOwoJCX0pOwoJfSwKCgliZWZvcmU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKGVsZW0pewoJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7CgkJfSk7Cgl9LAoKCWFmdGVyOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIGZhbHNlLCBmdW5jdGlvbihlbGVtKXsKCQkJdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5uZXh0U2libGluZyApOwoJCX0pOwoJfSwKCgljbG9uZTogZnVuY3Rpb24oIGV2ZW50cyApIHsKCQkvLyBEbyB0aGUgY2xvbmUKCQl2YXIgcmV0ID0gdGhpcy5tYXAoZnVuY3Rpb24oKXsKCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50ICYmICFqUXVlcnkuaXNYTUxEb2ModGhpcykgKSB7CgkJCQkvLyBJRSBjb3BpZXMgZXZlbnRzIGJvdW5kIHZpYSBhdHRhY2hFdmVudCB3aGVuCgkJCQkvLyB1c2luZyBjbG9uZU5vZGUuIENhbGxpbmcgZGV0YWNoRXZlbnQgb24gdGhlCgkJCQkvLyBjbG9uZSB3aWxsIGFsc28gcmVtb3ZlIHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ25hbAoJCQkJLy8gSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSB1c2UgaW5uZXJIVE1MLgoJCQkJLy8gVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucyBzb21lIG1vZGlmaWNhdGlvbnMgdG8KCQkJCS8vIGF0dHJpYnV0ZXMgaW4gSUUgdGhhdCBhcmUgYWN0dWFsbHkgb25seSBzdG9yZWQKCQkJCS8vIGFzIHByb3BlcnRpZXMgd2lsbCBub3QgYmUgY29waWVkIChzdWNoIGFzIHRoZQoJCQkJLy8gdGhlIG5hbWUgYXR0cmlidXRlIG9uIGFuIGlucHV0KS4KCQkJCXZhciBodG1sID0gdGhpcy5vdXRlckhUTUwsIG93bmVyRG9jdW1lbnQgPSB0aGlzLm93bmVyRG9jdW1lbnQ7CgkJCQlpZiAoICFodG1sICkgewoJCQkJCXZhciBkaXYgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJCQkJCWRpdi5hcHBlbmRDaGlsZCggdGhpcy5jbG9uZU5vZGUodHJ1ZSkgKTsKCQkJCQlodG1sID0gZGl2LmlubmVySFRNTDsKCQkJCX0KCgkJCQlyZXR1cm4galF1ZXJ5LmNsZWFuKFtodG1sLnJlcGxhY2UoLyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZywgIiIpLnJlcGxhY2UoL15ccyovLCAiIildLCBvd25lckRvY3VtZW50KVswXTsKCQkJfSBlbHNlCgkJCQlyZXR1cm4gdGhpcy5jbG9uZU5vZGUodHJ1ZSk7CgkJfSk7CgoJCS8vIENvcHkgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCB0byB0aGUgY2xvbmUKCQlpZiAoIGV2ZW50cyA9PT0gdHJ1ZSApIHsKCQkJdmFyIG9yaWcgPSB0aGlzLmZpbmQoIioiKS5hbmRTZWxmKCksIGkgPSAwOwoKCQkJcmV0LmZpbmQoIioiKS5hbmRTZWxmKCkuZWFjaChmdW5jdGlvbigpewoJCQkJaWYgKCB0aGlzLm5vZGVOYW1lICE9PSBvcmlnW2ldLm5vZGVOYW1lICkKCQkJCQlyZXR1cm47CgoJCQkJdmFyIGV2ZW50cyA9IGpRdWVyeS5kYXRhKCBvcmlnW2ldLCAiZXZlbnRzIiApOwoKCQkJCWZvciAoIHZhciB0eXBlIGluIGV2ZW50cyApIHsKCQkJCQlmb3IgKCB2YXIgaGFuZGxlciBpbiBldmVudHNbIHR5cGUgXSApIHsKCQkJCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGhhbmRsZXIgXSwgZXZlbnRzWyB0eXBlIF1bIGhhbmRsZXIgXS5kYXRhICk7CgkJCQkJfQoJCQkJfQoKCQkJCWkrKzsKCQkJfSk7CgkJfQoKCQkvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXQKCQlyZXR1cm4gcmV0OwoJfSwKCglodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwoJCQkodGhpc1swXSA/CgkJCQl0aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKC8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csICIiKSA6CgkJCQludWxsKSA6CgkJCXRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7Cgl9LAoKCXJlcGxhY2VXaXRoOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIHRoaXMuYWZ0ZXIoIHZhbHVlICkucmVtb3ZlKCk7Cgl9LAoKCWRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgdGFibGUsIGNhbGxiYWNrICkgewoJCWlmICggdGhpc1swXSApIHsKCQkJdmFyIGZyYWdtZW50ID0gKHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCB0aGlzWzBdKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksCgkJCQlzY3JpcHRzID0galF1ZXJ5LmNsZWFuKCBhcmdzLCAodGhpc1swXS5vd25lckRvY3VtZW50IHx8IHRoaXNbMF0pLCBmcmFnbWVudCApLAoJCQkJZmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkOwoKCQkJaWYgKCBmaXJzdCApCgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApCgkJCQkJY2FsbGJhY2suY2FsbCggcm9vdCh0aGlzW2ldLCBmaXJzdCksIHRoaXMubGVuZ3RoID4gMSB8fCBpID4gMCA/CgkJCQkJCQlmcmFnbWVudC5jbG9uZU5vZGUodHJ1ZSkgOiBmcmFnbWVudCApOwoKCQkJaWYgKCBzY3JpcHRzICkKCQkJCWpRdWVyeS5lYWNoKCBzY3JpcHRzLCBldmFsU2NyaXB0ICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCgkJZnVuY3Rpb24gcm9vdCggZWxlbSwgY3VyICkgewoJCQlyZXR1cm4gdGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICJ0YWJsZSIpICYmIGpRdWVyeS5ub2RlTmFtZShjdXIsICJ0ciIpID8KCQkJCShlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdIHx8CgkJCQllbGVtLmFwcGVuZENoaWxkKGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKSkgOgoJCQkJZWxlbTsKCQl9Cgl9Cn0pOwoKalF1ZXJ5LmVhY2goewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKG5hbWUsIG9yaWdpbmFsKXsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciByZXQgPSBbXSwgaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApOwoKCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbnNlcnQubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQl2YXIgZWxlbXMgPSAoaSA+IDAgPyB0aGlzLmNsb25lKHRydWUpIDogdGhpcykuZ2V0KCk7CgkJCWpRdWVyeS5mblsgb3JpZ2luYWwgXS5hcHBseSggalF1ZXJ5KGluc2VydFtpXSksIGVsZW1zICk7CgkJCXJldCA9IHJldC5jb25jYXQoIGVsZW1zICk7CgkJfQoKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgc2VsZWN0b3IgKTsKCX07Cn0pOwoKalF1ZXJ5LmVhY2goewoJcmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJaWYgKCAhc2VsZWN0b3IgfHwgalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgWyB0aGlzIF0gKS5sZW5ndGggKSB7CgkJCWlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCWNsZWFuRGF0YSggalF1ZXJ5KCIqIiwgdGhpcykuYWRkKHRoaXMpICk7CgkJCX0KCgkJCWlmICggdGhpcy5wYXJlbnROb2RlICkgewoJCQkJdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0aGlzICk7CgkJCX0KCQl9Cgl9LAoKCWVtcHR5OiBmdW5jdGlvbigpIHsKCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgKSB7CgkJCWNsZWFuRGF0YSggalF1ZXJ5KCIqIiwgdGhpcykgKTsKCQl9CgoJCS8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCgkJd2hpbGUgKCB0aGlzLmZpcnN0Q2hpbGQgKSB7CgkJCXRoaXMucmVtb3ZlQ2hpbGQoIHRoaXMuZmlyc3RDaGlsZCApOwoJCX0KCX0KfSwgZnVuY3Rpb24obmFtZSwgZm4pewoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbigpewoJCXJldHVybiB0aGlzLmVhY2goIGZuLCBhcmd1bWVudHMgKTsKCX07Cn0pOwoKalF1ZXJ5LmV4dGVuZCh7CgljbGVhbjogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0LCBmcmFnbWVudCApIHsKCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKCgkJLy8gIWNvbnRleHQuY3JlYXRlRWxlbWVudCBmYWlscyBpbiBJRSB3aXRoIGFuIGVycm9yIGJ1dCByZXR1cm5zIHR5cGVvZiAnb2JqZWN0JwoJCWlmICggdHlwZW9mIGNvbnRleHQuY3JlYXRlRWxlbWVudCA9PT0gInVuZGVmaW5lZCIgKQoJCQljb250ZXh0ID0gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHRbMF0gJiYgY29udGV4dFswXS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50OwoKCQkvLyBJZiBhIHNpbmdsZSBzdHJpbmcgaXMgcGFzc2VkIGluIGFuZCBpdCdzIGEgc2luZ2xlIHRhZwoJCS8vIGp1c3QgZG8gYSBjcmVhdGVFbGVtZW50IGFuZCBza2lwIHRoZSByZXN0CgkJaWYgKCAhZnJhZ21lbnQgJiYgZWxlbXMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBlbGVtc1swXSA9PT0gInN0cmluZyIgKSB7CgkJCXZhciBtYXRjaCA9IC9ePChcdyspXHMqXC8/PiQvLmV4ZWMoZWxlbXNbMF0pOwoJCQlpZiAoIG1hdGNoICkKCQkJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggbWF0Y2hbMV0gKSBdOwoJCX0KCgkJdmFyIHJldCA9IFtdLCBzY3JpcHRzID0gW10sIGRpdiA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgoJCWpRdWVyeS5lYWNoKGVsZW1zLCBmdW5jdGlvbihpLCBlbGVtKXsKCQkJaWYgKCB0eXBlb2YgZWxlbSA9PT0gIm51bWJlciIgKQoJCQkJZWxlbSArPSAnJzsKCgkJCWlmICggIWVsZW0gKQoJCQkJcmV0dXJuOwoKCQkJLy8gQ29udmVydCBodG1sIHN0cmluZyBpbnRvIERPTSBub2RlcwoJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKCQkJCS8vIEZpeCAiWEhUTUwiLXN0eWxlIHRhZ3MgaW4gYWxsIGJyb3dzZXJzCgkJCQllbGVtID0gZWxlbS5yZXBsYWNlKC8oPChcdyspW14+XSo/KVwvPi9nLCBmdW5jdGlvbihhbGwsIGZyb250LCB0YWcpewoJCQkJCXJldHVybiB0YWcubWF0Y2goL14oYWJicnxicnxjb2x8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbXxocnxhcmVhfGVtYmVkKSQvaSkgPwoJCQkJCQlhbGwgOgoJCQkJCQlmcm9udCArICI+PC8iICsgdGFnICsgIj4iOwoJCQkJfSk7CgoJCQkJLy8gVHJpbSB3aGl0ZXNwYWNlLCBvdGhlcndpc2UgaW5kZXhPZiB3b24ndCB3b3JrIGFzIGV4cGVjdGVkCgkJCQl2YXIgdGFncyA9IGVsZW0ucmVwbGFjZSgvXlxzKy8sICIiKS5zdWJzdHJpbmcoMCwgMTApLnRvTG93ZXJDYXNlKCk7CgoJCQkJdmFyIHdyYXAgPQoJCQkJCS8vIG9wdGlvbiBvciBvcHRncm91cAoJCQkJCSF0YWdzLmluZGV4T2YoIjxvcHQiKSAmJgoJCQkJCVsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdIHx8CgoJCQkJCSF0YWdzLmluZGV4T2YoIjxsZWciKSAmJgoJCQkJCVsgMSwgIjxmaWVsZHNldD4iLCAiPC9maWVsZHNldD4iIF0gfHwKCgkJCQkJdGFncy5tYXRjaCgvXjwodGhlYWR8dGJvZHl8dGZvb3R8Y29sZ3xjYXApLykgJiYKCQkJCQlbIDEsICI8dGFibGU+IiwgIjwvdGFibGU+IiBdIHx8CgoJCQkJCSF0YWdzLmluZGV4T2YoIjx0ciIpICYmCgkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSB8fAoKCQkJCSAJLy8gPHRoZWFkPiBtYXRjaGVkIGFib3ZlCgkJCQkJKCF0YWdzLmluZGV4T2YoIjx0ZCIpIHx8ICF0YWdzLmluZGV4T2YoIjx0aCIpKSAmJgoJCQkJCVsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iIF0gfHwKCgkJCQkJIXRhZ3MuaW5kZXhPZigiPGNvbCIpICYmCgkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCAiPC9jb2xncm91cD48L3RhYmxlPiIgXSB8fAoKCQkJCQkvLyBJRSBjYW4ndCBzZXJpYWxpemUgPGxpbms+IGFuZCA8c2NyaXB0PiB0YWdzIG5vcm1hbGx5CgkJCQkJIWpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgJiYKCQkJCQlbIDEsICJkaXY8ZGl2PiIsICI8L2Rpdj4iIF0gfHwKCgkJCQkJWyAwLCAiIiwgIiIgXTsKCgkJCQkvLyBHbyB0byBodG1sIGFuZCBiYWNrLCB0aGVuIHBlZWwgb2ZmIGV4dHJhIHdyYXBwZXJzCgkJCQlkaXYuaW5uZXJIVE1MID0gd3JhcFsxXSArIGVsZW0gKyB3cmFwWzJdOwoKCQkJCS8vIE1vdmUgdG8gdGhlIHJpZ2h0IGRlcHRoCgkJCQl3aGlsZSAoIHdyYXBbMF0tLSApCgkJCQkJZGl2ID0gZGl2Lmxhc3RDaGlsZDsKCgkJCQkvLyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50cwoJCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQudGJvZHkgKSB7CgoJCQkJCS8vIFN0cmluZyB3YXMgYSA8dGFibGU+LCAqbWF5KiBoYXZlIHNwdXJpb3VzIDx0Ym9keT4KCQkJCQl2YXIgaGFzQm9keSA9IC88dGJvZHkvaS50ZXN0KGVsZW0pLAoJCQkJCQl0Ym9keSA9ICF0YWdzLmluZGV4T2YoIjx0YWJsZSIpICYmICFoYXNCb2R5ID8KCQkJCQkJCWRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxkLmNoaWxkTm9kZXMgOgoKCQkJCQkJLy8gU3RyaW5nIHdhcyBhIGJhcmUgPHRoZWFkPiBvciA8dGZvb3Q+CgkJCQkJCXdyYXBbMV0gPT0gIjx0YWJsZT4iICYmICFoYXNCb2R5ID8KCQkJCQkJCWRpdi5jaGlsZE5vZGVzIDoKCQkJCQkJCVtdOwoKCQkJCQlmb3IgKCB2YXIgaiA9IHRib2R5Lmxlbmd0aCAtIDE7IGogPj0gMCA7IC0taiApCgkJCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0Ym9keVsgaiBdLCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5ndGggKQoJCQkJCQkJdGJvZHlbIGogXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0Ym9keVsgaiBdICk7CgoJCQkJCX0KCgkJCQkvLyBJRSBjb21wbGV0ZWx5IGtpbGxzIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVuIGlubmVySFRNTCBpcyB1c2VkCgkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSAmJiAvXlxzLy50ZXN0KCBlbGVtICkgKQoJCQkJCWRpdi5pbnNlcnRCZWZvcmUoIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIGVsZW0ubWF0Y2goL15ccyovKVswXSApLCBkaXYuZmlyc3RDaGlsZCApOwoKCQkJCWVsZW0gPSBqUXVlcnkubWFrZUFycmF5KCBkaXYuY2hpbGROb2RlcyApOwoJCQl9CgoJCQlpZiAoIGVsZW0ubm9kZVR5cGUgKQoJCQkJcmV0LnB1c2goIGVsZW0gKTsKCQkJZWxzZQoJCQkJcmV0ID0galF1ZXJ5Lm1lcmdlKCByZXQsIGVsZW0gKTsKCgkJfSk7CgoJCWlmICggZnJhZ21lbnQgKSB7CgkJCWZvciAoIHZhciBpID0gMDsgcmV0W2ldOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggcmV0W2ldLCAic2NyaXB0IiApICYmICghcmV0W2ldLnR5cGUgfHwgcmV0W2ldLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gInRleHQvamF2YXNjcmlwdCIpICkgewoJCQkJCXNjcmlwdHMucHVzaCggcmV0W2ldLnBhcmVudE5vZGUgPyByZXRbaV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggcmV0W2ldICkgOiByZXRbaV0gKTsKCQkJCX0gZWxzZSB7CgkJCQkJaWYgKCByZXRbaV0ubm9kZVR5cGUgPT09IDEgKQoJCQkJCQlyZXQuc3BsaWNlLmFwcGx5KCByZXQsIFtpICsgMSwgMF0uY29uY2F0KGpRdWVyeS5tYWtlQXJyYXkocmV0W2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSkpICk7CgkJCQkJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIHJldFtpXSApOwoJCQkJfQoJCQl9CgoJCQlyZXR1cm4gc2NyaXB0czsKCQl9CgoJCXJldHVybiByZXQ7Cgl9Cn0pOwoKZnVuY3Rpb24gY2xlYW5EYXRhKCBlbGVtcyApIHsKCWZvciAoIHZhciBpID0gMCwgbCA9IGVsZW1zLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgaWQgPSBlbGVtc1tpXVtleHBhbmRvXTsKCQlpZiAoIGlkICkgewoJCQlkZWxldGUgalF1ZXJ5LmNhY2hlWyBpZCBdOwoJCX0KCX0KfQovKgogKiBBIG51bWJlciBvZiBoZWxwZXIgZnVuY3Rpb25zIHVzZWQgZm9yIG1hbmFnaW5nIGV2ZW50cy4KICogTWFueSBvZiB0aGUgaWRlYXMgYmVoaW5kIHRoaXMgY29kZSBvcmlnaW5hdGVkIGZyb20KICogRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5LgogKi8KalF1ZXJ5LmV2ZW50ID0gewoKCS8vIEJpbmQgYW4gZXZlbnQgdG8gYW4gZWxlbWVudAoJLy8gT3JpZ2luYWwgYnkgRGVhbiBFZHdhcmRzCglhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSApIHsKCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gRm9yIHdoYXRldmVyIHJlYXNvbiwgSUUgaGFzIHRyb3VibGUgcGFzc2luZyB0aGUgd2luZG93IG9iamVjdAoJCS8vIGFyb3VuZCwgY2F1c2luZyBpdCB0byBiZSBjbG9uZWQgaW4gdGhlIHByb2Nlc3MKCQlpZiAoIGVsZW0uc2V0SW50ZXJ2YWwgJiYgKCBlbGVtICE9PSB3aW5kb3cgJiYgIWVsZW0uZnJhbWVFbGVtZW50ICkgKSB7CgkJCWVsZW0gPSB3aW5kb3c7CgkJfQoKCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZnVuY3Rpb24gYmVpbmcgZXhlY3V0ZWQgaGFzIGEgdW5pcXVlIElECgkJaWYgKCAhaGFuZGxlci5ndWlkICkgewoJCQloYW5kbGVyLmd1aWQgPSB0aGlzLmd1aWQrKzsKCQl9CgoJCS8vIGlmIGRhdGEgaXMgcGFzc2VkLCBiaW5kIHRvIGhhbmRsZXIKCQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHsKCQkJLy8gQ3JlYXRlIHRlbXBvcmFyeSBmdW5jdGlvbiBwb2ludGVyIHRvIG9yaWdpbmFsIGhhbmRsZXIKCQkJdmFyIGZuID0gaGFuZGxlcjsKCgkJCS8vIENyZWF0ZSB1bmlxdWUgaGFuZGxlciBmdW5jdGlvbiwgd3JhcHBlZCBhcm91bmQgb3JpZ2luYWwgaGFuZGxlcgoJCQloYW5kbGVyID0gdGhpcy5wcm94eSggZm4gKTsKCgkJCS8vIFN0b3JlIGRhdGEgaW4gdW5pcXVlIGhhbmRsZXIKCQkJaGFuZGxlci5kYXRhID0gZGF0YTsKCQl9CgoJCS8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUKCQl2YXIgZXZlbnRzID0galF1ZXJ5LmRhdGEoIGVsZW0sICJldmVudHMiICkgfHwgalF1ZXJ5LmRhdGEoIGVsZW0sICJldmVudHMiLCB7fSApLAoJCQloYW5kbGUgPSBqUXVlcnkuZGF0YSggZWxlbSwgImhhbmRsZSIgKSB8fCBqUXVlcnkuZGF0YSggZWxlbSwgImhhbmRsZSIsIGZ1bmN0aW9uKCkgewoJCQkJLy8gSGFuZGxlIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSB0cmlnZ2VyIGFuZCB3aGVuCgkJCQkvLyBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZAoJCQkJcmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09ICJ1bmRlZmluZWQiICYmICFqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID8KCQkJCQlqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KCBhcmd1bWVudHMuY2FsbGVlLmVsZW0sIGFyZ3VtZW50cyApIDoKCQkJCQl1bmRlZmluZWQ7CgkJCX0pOwoJCS8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2YgdGhlIGhhbmRsZSBmdW5jdGlvbgoJCS8vIFRoaXMgaXMgdG8gcHJldmVudCBhIG1lbW9yeSBsZWFrIHdpdGggbm9uLW5hdGl2ZQoJCS8vIGV2ZW50IGluIElFLgoJCWhhbmRsZS5lbGVtID0gZWxlbTsKCgkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZQoJCS8vIGpRdWVyeSguLi4pLmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKCQl0eXBlcyA9IHR5cGVzLnNwbGl0KCAvXHMrLyApOwoJCXZhciB0eXBlLCBpPTA7CgkJd2hpbGUgKCAodHlwZSA9IHR5cGVzWyBpKysgXSkgKSB7CgkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKCQkJdmFyIG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7CgkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCWhhbmRsZXIudHlwZSA9IG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLiIpOwoKCQkJLy8gR2V0IHRoZSBjdXJyZW50IGxpc3Qgb2YgZnVuY3Rpb25zIGJvdW5kIHRvIHRoaXMgZXZlbnQKCQkJdmFyIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0sCgkJCQlzcGVjaWFsID0gdGhpcy5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQlpZiAoIHNwZWNpYWwuYWRkICkgewoJCQkJdmFyIG1vZGlmaWVkSGFuZGxlciA9IHNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZXIsIGRhdGEsIG5hbWVzcGFjZXMgKTsKCQkJCWlmICggbW9kaWZpZWRIYW5kbGVyICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBtb2RpZmllZEhhbmRsZXIgKSApIHsKCQkJCQltb2RpZmllZEhhbmRsZXIuZ3VpZCA9IG1vZGlmaWVkSGFuZGxlci5ndWlkIHx8IGhhbmRsZXIuZ3VpZDsKCQkJCQloYW5kbGVyID0gbW9kaWZpZWRIYW5kbGVyOwoJCQkJfQoJCQl9CgoJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlCgkJCWlmICggIWhhbmRsZXJzICkgewoJCQkJaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSA9IHt9OwoKCQkJCS8vIENoZWNrIGZvciBhIHNwZWNpYWwgZXZlbnQgaGFuZGxlcgoJCQkJLy8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lci9hdHRhY2hFdmVudCBpZiB0aGUgc3BlY2lhbAoJCQkJLy8gZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fCBzcGVjaWFsLnNldHVwLmNhbGwoIGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMgKSA9PT0gZmFsc2UgKSB7CgkJCQkJLy8gQmluZCB0aGUgZ2xvYmFsIGV2ZW50IGhhbmRsZXIgdG8gdGhlIGVsZW1lbnQKCQkJCQlpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHsKCQkJCQkJZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUsIGZhbHNlICk7CgkJCQkJfSBlbHNlIGlmICggZWxlbS5hdHRhY2hFdmVudCApIHsKCQkJCQkJZWxlbS5hdHRhY2hFdmVudCggIm9uIiArIHR5cGUsIGhhbmRsZSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdAoJCQloYW5kbGVyc1sgaGFuZGxlci5ndWlkIF0gPSBoYW5kbGVyOwoKCQkJLy8gS2VlcCB0cmFjayBvZiB3aGljaCBldmVudHMgaGF2ZSBiZWVuIHVzZWQsIGZvciBnbG9iYWwgdHJpZ2dlcmluZwoJCQl0aGlzLmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTsKCQl9CgoJCS8vIE51bGxpZnkgZWxlbSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiBJRQoJCWVsZW0gPSBudWxsOwoJfSwKCglndWlkOiAxLAoJZ2xvYmFsOiB7fSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyICkgewoJCS8vIGRvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciBldmVudHMgPSBqUXVlcnkuZGF0YSggZWxlbSwgImV2ZW50cyIgKSwgcmV0LCB0eXBlOwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgZm9yIHRoZSBlbGVtZW50CgkJCWlmICggdHlwZXMgPT09IHVuZGVmaW5lZCB8fCAodHlwZW9mIHR5cGVzID09PSAic3RyaW5nIiAmJiB0eXBlcy5jaGFyQXQoMCkgPT09ICIuIikgKSB7CgkJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCQl0aGlzLnJlbW92ZSggZWxlbSwgdHlwZSArICh0eXBlcyB8fCAiIikgKTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCS8vIHR5cGVzIGlzIGFjdHVhbGx5IGFuIGV2ZW50IG9iamVjdCBoZXJlCgkJCQlpZiAoIHR5cGVzLnR5cGUgKSB7CgkJCQkJaGFuZGxlciA9IHR5cGVzLmhhbmRsZXI7CgkJCQkJdHlwZXMgPSB0eXBlcy50eXBlOwoJCQkJfQoKCQkJCS8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwZXJhdGVkIGJ5IGEgc3BhY2UKCQkJCS8vIGpRdWVyeSguLi4pLnVuYmluZCgibW91c2VvdmVyIG1vdXNlb3V0IiwgZm4pOwoJCQkJdHlwZXMgPSB0eXBlcy5zcGxpdCgvXHMrLyk7CgkJCQl2YXIgaSA9IDA7CgkJCQl3aGlsZSAoICh0eXBlID0gdHlwZXNbIGkrKyBdKSApIHsKCQkJCQkvLyBOYW1lc3BhY2VkIGV2ZW50IGhhbmRsZXJzCgkJCQkJdmFyIG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7CgkJCQkJdHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKCQkJCQl2YXIgYWxsID0gIW5hbWVzcGFjZXMubGVuZ3RoLAoJCQkJCQluYW1lc3BhY2UgPSBuZXcgUmVnRXhwKCIoXnxcXC4pIiArIG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLipcXC4iKSArICIoXFwufCQpIiksCgkJCQkJCXNwZWNpYWwgPSB0aGlzLnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCgkJCQkJaWYgKCBldmVudHNbIHR5cGUgXSApIHsKCQkJCQkJLy8gcmVtb3ZlIHRoZSBnaXZlbiBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gdHlwZQoJCQkJCQlpZiAoIGhhbmRsZXIgKSB7CgkJCQkJCQlkZWxldGUgZXZlbnRzWyB0eXBlIF1bIGhhbmRsZXIuZ3VpZCBdOwoKCQkJCQkJLy8gcmVtb3ZlIGFsbCBoYW5kbGVycyBmb3IgdGhlIGdpdmVuIHR5cGUKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCWZvciAoIHZhciBoYW5kbGUgaW4gZXZlbnRzWyB0eXBlIF0gKSB7CgkJCQkJCQkJLy8gSGFuZGxlIHRoZSByZW1vdmFsIG9mIG5hbWVzcGFjZWQgZXZlbnRzCgkJCQkJCQkJaWYgKCBhbGwgfHwgbmFtZXNwYWNlLnRlc3QoIGV2ZW50c1sgdHlwZSBdWyBoYW5kbGUgXS50eXBlICkgKSB7CgkJCQkJCQkJCWRlbGV0ZSBldmVudHNbIHR5cGUgXVsgaGFuZGxlIF07CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlpZiAoIHNwZWNpYWwucmVtb3ZlICkgewoJCQkJCQkJc3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgbmFtZXNwYWNlcyApOwoJCQkJCQl9CgoJCQkJCQkvLyByZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlmIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3QKCQkJCQkJZm9yICggcmV0IGluIGV2ZW50c1sgdHlwZSBdICkgewoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJaWYgKCAhcmV0ICkgewoJCQkJCQkJaWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fCBzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMgKSA9PT0gZmFsc2UgKSB7CgkJCQkJCQkJaWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7CgkJCQkJCQkJCWVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgalF1ZXJ5LmRhdGEoIGVsZW0sICJoYW5kbGUiICksIGZhbHNlICk7CgkJCQkJCQkJfSBlbHNlIGlmICggZWxlbS5kZXRhY2hFdmVudCApIHsKCQkJCQkJCQkJZWxlbS5kZXRhY2hFdmVudCggIm9uIiArIHR5cGUsIGpRdWVyeS5kYXRhKCBlbGVtLCAiaGFuZGxlIiApICk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJcmV0ID0gbnVsbDsKCQkJCQkJCWRlbGV0ZSBldmVudHNbIHR5cGUgXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWQKCQkJZm9yICggcmV0IGluIGV2ZW50cyApIHsKCQkJCWJyZWFrOwoJCQl9CgkJCWlmICggIXJldCApIHsKCQkJCXZhciBoYW5kbGUgPSBqUXVlcnkuZGF0YSggZWxlbSwgImhhbmRsZSIgKTsKCQkJCWlmICggaGFuZGxlICkgewoJCQkJCWhhbmRsZS5lbGVtID0gbnVsbDsKCQkJCX0KCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCAiZXZlbnRzIiApOwoJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sICJoYW5kbGUiICk7CgkJCX0KCQl9Cgl9LAoKCS8vIGJ1YmJsaW5nIGlzIGludGVybmFsCgl0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0gLyosIGJ1YmJsaW5nICovICkgewoJCS8vIEV2ZW50IG9iamVjdCBvciBldmVudCB0eXBlCgkJdmFyIHR5cGUgPSBldmVudC50eXBlIHx8IGV2ZW50LAoJCQlidWJibGluZyA9IGFyZ3VtZW50c1szXTsKCgkJaWYgKCAhYnViYmxpbmcgKSB7CgkJCWV2ZW50ID0gdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiA/CgkJCQkvLyBqUXVlcnkuRXZlbnQgb2JqZWN0CgkJCQlldmVudFtleHBhbmRvXSA/IGV2ZW50IDoKCQkJCS8vIE9iamVjdCBsaXRlcmFsCgkJCQlqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuRXZlbnQodHlwZSksIGV2ZW50ICkgOgoJCQkJLy8gSnVzdCB0aGUgZXZlbnQgdHlwZSAoc3RyaW5nKQoJCQkJalF1ZXJ5LkV2ZW50KHR5cGUpOwoKCQkJaWYgKCB0eXBlLmluZGV4T2YoIiEiKSA+PSAwICkgewoJCQkJZXZlbnQudHlwZSA9IHR5cGUgPSB0eXBlLnNsaWNlKDAsIC0xKTsKCQkJCWV2ZW50LmV4Y2x1c2l2ZSA9IHRydWU7CgkJCX0KCgkJCS8vIEhhbmRsZSBhIGdsb2JhbCB0cmlnZ2VyCgkJCWlmICggIWVsZW0gKSB7CgkJCQkvLyBEb24ndCBidWJibGUgY3VzdG9tIGV2ZW50cyB3aGVuIGdsb2JhbCAodG8gYXZvaWQgdG9vIG11Y2ggb3ZlcmhlYWQpCgkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCS8vIE9ubHkgdHJpZ2dlciBpZiB3ZSd2ZSBldmVyIGJvdW5kIGFuIGV2ZW50IGZvciBpdAoJCQkJaWYgKCB0aGlzLmdsb2JhbFsgdHlwZSBdICkgewoJCQkJCWpRdWVyeS5lYWNoKCBqUXVlcnkuY2FjaGUsIGZ1bmN0aW9uKCkgewoJCQkJCQlpZiAoIHRoaXMuZXZlbnRzICYmIHRoaXMuZXZlbnRzW3R5cGVdICkgewoJCQkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhLCB0aGlzLmhhbmRsZS5lbGVtICk7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0KCQkJfQoKCQkJLy8gSGFuZGxlIHRyaWdnZXJpbmcgYSBzaW5nbGUgZWxlbWVudAoKCQkJLy8gZG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKCQkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7CgkJCQlyZXR1cm4gdW5kZWZpbmVkOwoJCQl9CgoJCQkvLyBDbGVhbiB1cCBpbiBjYXNlIGl0IGlzIHJldXNlZAoJCQlldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7CgkJCWV2ZW50LnRhcmdldCA9IGVsZW07CgoJCQkvLyBDbG9uZSB0aGUgaW5jb21pbmcgZGF0YSwgaWYgYW55CgkJCWRhdGEgPSBqUXVlcnkubWFrZUFycmF5KCBkYXRhICk7CgkJCWRhdGEudW5zaGlmdCggZXZlbnQgKTsKCQl9CgoJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBlbGVtOwoKCQkvLyBUcmlnZ2VyIHRoZSBldmVudCwgaXQgaXMgYXNzdW1lZCB0aGF0ICJoYW5kbGUiIGlzIGEgZnVuY3Rpb24KCQl2YXIgaGFuZGxlID0galF1ZXJ5LmRhdGEoIGVsZW0sICJoYW5kbGUiICk7CgkJaWYgKCBoYW5kbGUgKSB7CgkJCWhhbmRsZS5hcHBseSggZWxlbSwgZGF0YSApOwoJCX0KCgkJLy8gSGFuZGxlIHRyaWdnZXJpbmcgbmF0aXZlIC5vbmZvbyBoYW5kbGVycyAoYW5kIG9uIGxpbmtzIHNpbmNlIHdlIGRvbid0IGNhbGwgLmNsaWNrKCkgZm9yIGxpbmtzKQoJCWlmICggKCFlbGVtWyB0eXBlIF0gfHwgKGpRdWVyeS5ub2RlTmFtZShlbGVtLCAnYScpICYmIHR5cGUgPT09ICJjbGljayIpKSAmJiBlbGVtWyJvbiIrdHlwZV0gJiYgZWxlbVsib24iK3R5cGVdLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkgewoJCQlldmVudC5yZXN1bHQgPSBmYWxzZTsKCQl9CgoJCS8vIFRyaWdnZXIgdGhlIG5hdGl2ZSBldmVudHMgKGV4Y2VwdCBmb3IgY2xpY2tzIG9uIGxpbmtzKQoJCWlmICggIWJ1YmJsaW5nICYmIGVsZW1bIHR5cGUgXSAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgJiYgIShqUXVlcnkubm9kZU5hbWUoZWxlbSwgJ2EnKSAmJiB0eXBlID09PSAiY2xpY2siKSApIHsKCQkJdGhpcy50cmlnZ2VyZWQgPSB0cnVlOwoJCQl0cnkgewoJCQkJZWxlbVsgdHlwZSBdKCk7CgkJCS8vIHByZXZlbnQgSUUgZnJvbSB0aHJvd2luZyBhbiBlcnJvciBmb3Igc29tZSBoaWRkZW4gZWxlbWVudHMKCQkJfSBjYXRjaCAoZSkge30KCQl9CgoJCXRoaXMudHJpZ2dlcmVkID0gZmFsc2U7CgoJCWlmICggIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGUgfHwgZWxlbS5vd25lckRvY3VtZW50OwoJCQlpZiAoIHBhcmVudCApIHsKCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgcGFyZW50LCB0cnVlICk7CgkJCX0KCQl9Cgl9LAoKCWhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCS8vIHJldHVybmVkIHVuZGVmaW5lZCBvciBmYWxzZQoJCXZhciBhbGwsIGhhbmRsZXJzOwoKCQlldmVudCA9IGFyZ3VtZW50c1swXSA9IGpRdWVyeS5ldmVudC5maXgoIGV2ZW50IHx8IHdpbmRvdy5ldmVudCApOwoJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSB0aGlzOwoKCQkvLyBOYW1lc3BhY2VkIGV2ZW50IGhhbmRsZXJzCgkJdmFyIG5hbWVzcGFjZXMgPSBldmVudC50eXBlLnNwbGl0KCIuIik7CgkJZXZlbnQudHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKCgkJLy8gQ2FjaGUgdGhpcyBub3csIGFsbCA9IHRydWUgbWVhbnMsIGFueSBoYW5kbGVyCgkJYWxsID0gIW5hbWVzcGFjZXMubGVuZ3RoICYmICFldmVudC5leGNsdXNpdmU7CgoJCXZhciBuYW1lc3BhY2UgPSBuZXcgUmVnRXhwKCIoXnxcXC4pIiArIG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLipcXC4iKSArICIoXFwufCQpIik7CgoJCWhhbmRsZXJzID0gKCBqUXVlcnkuZGF0YSh0aGlzLCAiZXZlbnRzIikgfHwge30gKVsgZXZlbnQudHlwZSBdOwoKCQlmb3IgKCB2YXIgaiBpbiBoYW5kbGVycyApIHsKCQkJdmFyIGhhbmRsZXIgPSBoYW5kbGVyc1sgaiBdOwoKCQkJLy8gRmlsdGVyIHRoZSBmdW5jdGlvbnMgYnkgY2xhc3MKCQkJaWYgKCBhbGwgfHwgbmFtZXNwYWNlLnRlc3QoaGFuZGxlci50eXBlKSApIHsKCQkJCS8vIFBhc3MgaW4gYSByZWZlcmVuY2UgdG8gdGhlIGhhbmRsZXIgZnVuY3Rpb24gaXRzZWxmCgkJCQkvLyBTbyB0aGF0IHdlIGNhbiBsYXRlciByZW1vdmUgaXQKCQkJCWV2ZW50LmhhbmRsZXIgPSBoYW5kbGVyOwoJCQkJZXZlbnQuZGF0YSA9IGhhbmRsZXIuZGF0YTsKCgkJCQl2YXIgcmV0ID0gaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgoJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQlldmVudC5yZXN1bHQgPSByZXQ7CgkJCQkJaWYgKCByZXQgPT09IGZhbHNlICkgewoJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCBldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgewoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJfQoJCX0KCX0sCgoJcHJvcHM6ICJhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGJ1dHRvbiBjYW5jZWxhYmxlIGNoYXJDb2RlIGNsaWVudFggY2xpZW50WSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZGF0YSBkZXRhaWwgZXZlbnRQaGFzZSBmcm9tRWxlbWVudCBoYW5kbGVyIGtleUNvZGUgbGF5ZXJYIGxheWVyWSBtZXRhS2V5IG5ld1ZhbHVlIG9mZnNldFggb2Zmc2V0WSBvcmlnaW5hbFRhcmdldCBwYWdlWCBwYWdlWSBwcmV2VmFsdWUgcmVsYXRlZE5vZGUgcmVsYXRlZFRhcmdldCBzY3JlZW5YIHNjcmVlblkgc2hpZnRLZXkgc3JjRWxlbWVudCB0YXJnZXQgdG9FbGVtZW50IHZpZXcgd2hlZWxEZWx0YSB3aGljaCIuc3BsaXQoIiAiKSwKCglmaXg6IGZ1bmN0aW9uKCBldmVudCApIHsKCQlpZiAoIGV2ZW50WyBleHBhbmRvIF0gKSB7CgkJCXJldHVybiBldmVudDsKCQl9CgoJCS8vIHN0b3JlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0CgkJLy8gYW5kICJjbG9uZSIgdG8gc2V0IHJlYWQtb25seSBwcm9wZXJ0aWVzCgkJdmFyIG9yaWdpbmFsRXZlbnQgPSBldmVudDsKCQlldmVudCA9IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApOwoKCQlmb3IgKCB2YXIgaSA9IHRoaXMucHJvcHMubGVuZ3RoLCBwcm9wOyBpOyApIHsKCQkJcHJvcCA9IHRoaXMucHJvcHNbIC0taSBdOwoJCQlldmVudFsgcHJvcCBdID0gb3JpZ2luYWxFdmVudFsgcHJvcCBdOwoJCX0KCgkJLy8gRml4IHRhcmdldCBwcm9wZXJ0eSwgaWYgbmVjZXNzYXJ5CgkJaWYgKCAhZXZlbnQudGFyZ2V0ICkgewoJCQlldmVudC50YXJnZXQgPSBldmVudC5zcmNFbGVtZW50IHx8IGRvY3VtZW50OyAvLyBGaXhlcyAjMTkyNSB3aGVyZSBzcmNFbGVtZW50IG1pZ2h0IG5vdCBiZSBkZWZpbmVkIGVpdGhlcgoJCX0KCgkJLy8gY2hlY2sgaWYgdGFyZ2V0IGlzIGEgdGV4dG5vZGUgKHNhZmFyaSkKCQlpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0gMyApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7CgkJfQoKCQkvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5CgkJaWYgKCAhZXZlbnQucmVsYXRlZFRhcmdldCAmJiBldmVudC5mcm9tRWxlbWVudCApIHsKCQkJZXZlbnQucmVsYXRlZFRhcmdldCA9IGV2ZW50LmZyb21FbGVtZW50ID09PSBldmVudC50YXJnZXQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDsKCQl9CgoJCS8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGUKCQlpZiAoIGV2ZW50LnBhZ2VYID09IG51bGwgJiYgZXZlbnQuY2xpZW50WCAhPSBudWxsICkgewoJCQl2YXIgZG9jID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBib2R5ID0gZG9jdW1lbnQuYm9keTsKCQkJZXZlbnQucGFnZVggPSBldmVudC5jbGllbnRYICsgKGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwKSAtIChkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCk7CgkJCWV2ZW50LnBhZ2VZID0gZXZlbnQuY2xpZW50WSArIChkb2MgJiYgZG9jLnNjcm9sbFRvcCAgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCAgfHwgMCkgLSAoZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDApOwoJCX0KCgkJLy8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzCgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgKChldmVudC5jaGFyQ29kZSB8fCBldmVudC5jaGFyQ29kZSA9PT0gMCkgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGUpICkgewoJCQlldmVudC53aGljaCA9IGV2ZW50LmNoYXJDb2RlIHx8IGV2ZW50LmtleUNvZGU7CgkJfQoKCQkvLyBBZGQgbWV0YUtleSB0byBub24tTWFjIGJyb3dzZXJzICh1c2UgY3RybCBmb3IgUEMncyBhbmQgTWV0YSBmb3IgTWFjcykKCQlpZiAoICFldmVudC5tZXRhS2V5ICYmIGV2ZW50LmN0cmxLZXkgKSB7CgkJCWV2ZW50Lm1ldGFLZXkgPSBldmVudC5jdHJsS2V5OwoJCX0KCgkJLy8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PSBsZWZ0OyAyID09IG1pZGRsZTsgMyA9PSByaWdodAoJCS8vIE5vdGU6IGJ1dHRvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28gZG9uJ3QgdXNlIGl0CgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgZXZlbnQuYnV0dG9uICkgewoJCQlldmVudC53aGljaCA9IChldmVudC5idXR0b24gJiAxID8gMSA6ICggZXZlbnQuYnV0dG9uICYgMiA/IDMgOiAoIGV2ZW50LmJ1dHRvbiAmIDQgPyAyIDogMCApICkpOwoJCX0KCgkJcmV0dXJuIGV2ZW50OwoJfSwKCglwcm94eTogZnVuY3Rpb24oIGZuLCBwcm94eSwgdGhpc09iamVjdCApIHsKCQlpZiAoIHByb3h5ICE9PSB1bmRlZmluZWQgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKCBwcm94eSApICkgewoJCQl0aGlzT2JqZWN0ID0gcHJveHk7CgkJCXByb3h5ID0gdW5kZWZpbmVkOwoJCX0KCQkvLyBGSVhNRTogU2hvdWxkIHByb3h5IGJlIHJlZGVmaW5lZCB0byBiZSBhcHBsaWVkIHdpdGggdGhpc09iamVjdCBpZiBkZWZpbmVkPwoJCXByb3h5ID0gcHJveHkgfHwgZnVuY3Rpb24oKSB7IHJldHVybiBmbi5hcHBseSggdGhpc09iamVjdCAhPT0gdW5kZWZpbmVkID8gdGhpc09iamVjdCA6IHRoaXMsIGFyZ3VtZW50cyApOyB9OwoJCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAoJCXByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBwcm94eS5ndWlkIHx8IHRoaXMuZ3VpZCsrOwoJCS8vIFNvIHByb3h5IGNhbiBiZSBkZWNsYXJlZCBhcyBhbiBhcmd1bWVudAoJCXJldHVybiBwcm94eTsKCX0sCgoJc3BlY2lhbDogewoJCXJlYWR5OiB7CgkJCS8vIE1ha2Ugc3VyZSB0aGUgcmVhZHkgZXZlbnQgaXMgc2V0dXAKCQkJc2V0dXA6IGJpbmRSZWFkeSwKCQkJdGVhcmRvd246IGZ1bmN0aW9uKCkge30KCQl9LAoKCQlsaXZlOiB7CgkJCWFkZDogZnVuY3Rpb24oIHByb3h5LCBkYXRhLCBuYW1lc3BhY2VzICkgewoJCQkJalF1ZXJ5LmV4dGVuZCggcHJveHksIGRhdGEgfHwge30gKTsKCQkJCXByb3h5Lmd1aWQgKz0gZGF0YS5zZWxlY3RvciArIGRhdGEubGl2ZTsKCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIGRhdGEubGl2ZSwgbGl2ZUhhbmRsZXIgKTsKCQkJfSwKCgkJCXJlbW92ZTogZnVuY3Rpb24oIG5hbWVzcGFjZXMgKSB7CgkJCQlpZiAoIG5hbWVzcGFjZXMubGVuZ3RoICkgewoJCQkJCXZhciByZW1vdmUgPSAwLCBuYW1lID0gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBuYW1lc3BhY2VzWzBdICsgIihcXC58JCkiKTsKCgkJCQkJalF1ZXJ5LmVhY2goIChqUXVlcnkuZGF0YSh0aGlzLCAiZXZlbnRzIikubGl2ZSB8fCB7fSksIGZ1bmN0aW9uKCkgewoJCQkJCQlpZiAoIG5hbWUudGVzdCh0aGlzLnR5cGUpICkgewoJCQkJCQkJcmVtb3ZlKys7CgkJCQkJCX0KCQkJCQl9KTsKCgkJCQkJaWYgKCByZW1vdmUgPCAxICkgewoJCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCBuYW1lc3BhY2VzWzBdLCBsaXZlSGFuZGxlciApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KfTsKCmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMgKXsKCS8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZAoJaWYgKCAhdGhpcy5wcmV2ZW50RGVmYXVsdCApIHsKCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjICk7Cgl9CgoJLy8gRXZlbnQgb2JqZWN0CglpZiAoIHNyYyAmJiBzcmMudHlwZSApIHsKCQl0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7CgkJdGhpcy50eXBlID0gc3JjLnR5cGU7CgkvLyBFdmVudCB0eXBlCgl9IGVsc2UgewoJCXRoaXMudHlwZSA9IHNyYzsKCX0KCgkvLyB0aW1lU3RhbXAgaXMgYnVnZ3kgZm9yIHNvbWUgZXZlbnRzIG9uIEZpcmVmb3goIzM4NDMpCgkvLyBTbyB3ZSB3b24ndCByZWx5IG9uIHRoZSBuYXRpdmUgdmFsdWUKCXRoaXMudGltZVN0YW1wID0gbm93KCk7CgoJLy8gTWFyayBpdCBhcyBmaXhlZAoJdGhpc1sgZXhwYW5kbyBdID0gdHJ1ZTsKfTsKCmZ1bmN0aW9uIHJldHVybkZhbHNlKCkgewoJcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIHJldHVyblRydWUoKSB7CglyZXR1cm4gdHJ1ZTsKfQoKLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbApqUXVlcnkuRXZlbnQucHJvdG90eXBlID0gewoJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgkJaWYgKCAhZSApIHsKCQkJcmV0dXJuOwoJCX0KCQkvLyBpZiBwcmV2ZW50RGVmYXVsdCBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudAoJCWlmICggZS5wcmV2ZW50RGVmYXVsdCApIHsKCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCX0KCQkvLyBvdGhlcndpc2Ugc2V0IHRoZSByZXR1cm5WYWx1ZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gZmFsc2UgKElFKQoJCWUucmV0dXJuVmFsdWUgPSBmYWxzZTsKCX0sCglzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQl2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKCQlpZiAoICFlICkgewoJCQlyZXR1cm47CgkJfQoJCS8vIGlmIHN0b3BQcm9wYWdhdGlvbiBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudAoJCWlmICggZS5zdG9wUHJvcGFnYXRpb24gKSB7CgkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJfQoJCS8vIG90aGVyd2lzZSBzZXQgdGhlIGNhbmNlbEJ1YmJsZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gdHJ1ZSAoSUUpCgkJZS5jYW5jZWxCdWJibGUgPSB0cnVlOwoJfSwKCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKXsKCQl0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwoJfSwKCWlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsCglpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsCglpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UKfTsKLy8gQ2hlY2tzIGlmIGFuIGV2ZW50IGhhcHBlbmVkIG9uIGFuIGVsZW1lbnQgd2l0aGluIGFub3RoZXIgZWxlbWVudAovLyBVc2VkIGluIGpRdWVyeS5ldmVudC5zcGVjaWFsLm1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgaGFuZGxlcnMKdmFyIHdpdGhpbkVsZW1lbnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7CgkvLyBDaGVjayBpZiBtb3VzZShvdmVyfG91dCkgYXJlIHN0aWxsIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQgZWxlbWVudAoJdmFyIHBhcmVudCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7CgkvLyBUcmF2ZXJzZSB1cCB0aGUgdHJlZQoJd2hpbGUgKCBwYXJlbnQgJiYgcGFyZW50ICE9IHRoaXMgKSB7CgkJLy8gRmlyZWZveCBzb21ldGltZXMgYXNzaWducyByZWxhdGVkVGFyZ2V0IGEgWFVMIGVsZW1lbnQKCQkvLyB3aGljaCB3ZSBjYW5ub3QgYWNjZXNzIHRoZSBwYXJlbnROb2RlIHByb3BlcnR5IG9mCgkJdHJ5IHsgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7IH0KCQkvLyBhc3N1bWluZyB3ZSd2ZSBsZWZ0IHRoZSBlbGVtZW50IHNpbmNlIHdlIG1vc3QgbGlrZWx5IG1vdXNlZG92ZXIgYSB4dWwgZWxlbWVudAoJCWNhdGNoKGUpIHsgYnJlYWs7IH0KCX0KCglpZiAoIHBhcmVudCAhPSB0aGlzICkgewoJCS8vIHNldCB0aGUgY29ycmVjdCBldmVudCB0eXBlCgkJZXZlbnQudHlwZSA9IGV2ZW50LmRhdGE7CgkJLy8gaGFuZGxlIGV2ZW50IGlmIHdlIGFjdHVhbGx5IGp1c3QgbW91c2VkIG9uIHRvIGEgbm9uIHN1Yi1lbGVtZW50CgkJalF1ZXJ5LmV2ZW50LmhhbmRsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7Cgl9Cn07CgpqUXVlcnkuZWFjaCh7Cgltb3VzZW92ZXI6ICdtb3VzZWVudGVyJywKCW1vdXNlb3V0OiAnbW91c2VsZWF2ZScKfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHsKCWpRdWVyeS5ldmVudC5zcGVjaWFsWyBmaXggXSA9IHsKCQlzZXR1cDogZnVuY3Rpb24oKXsKCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgb3JpZywgd2l0aGluRWxlbWVudCwgZml4ICk7CgkJfSwKCQl0ZWFyZG93bjogZnVuY3Rpb24oKXsKCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgb3JpZywgd2l0aGluRWxlbWVudCApOwoJCX0KCX07Cn0pOwoKalF1ZXJ5LmZuLmV4dGVuZCh7CgliaW5kOiBmdW5jdGlvbiggdHlwZSwgZGF0YSwgZm4sIHRoaXNPYmplY3QgKSB7CgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgewoJCQlpZiAoIGZuICE9PSB1bmRlZmluZWQgKSB7CgkJCQl0aGlzT2JqZWN0ID0gZm47CgkJCX0KCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCQlmbiA9IHRoaXNPYmplY3QgPT09IHVuZGVmaW5lZCA/IGZuIDogalF1ZXJ5LmV2ZW50LnByb3h5KCBmbiwgdGhpc09iamVjdCApOwoJCXJldHVybiB0eXBlID09PSAidW5sb2FkIiA/IHRoaXMub25lKHR5cGUsIGRhdGEsIGZuLCB0aGlzT2JqZWN0KSA6IHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZSwgZm4sIGRhdGEgKTsKCQl9KTsKCX0sCgoJb25lOiBmdW5jdGlvbiggdHlwZSwgZGF0YSwgZm4sIHRoaXNPYmplY3QgKSB7CgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgewoJCQlpZiAoIGZuICE9PSB1bmRlZmluZWQgKSB7CgkJCQl0aGlzT2JqZWN0ID0gZm47CgkJCX0KCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCQlmbiA9IHRoaXNPYmplY3QgPT09IHVuZGVmaW5lZCA/IGZuIDogalF1ZXJ5LmV2ZW50LnByb3h5KCBmbiwgdGhpc09iamVjdCApOwoJCXZhciBvbmUgPSBqUXVlcnkuZXZlbnQucHJveHkoIGZuLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCWpRdWVyeSggdGhpcyApLnVuYmluZCggZXZlbnQsIG9uZSApOwoJCQlyZXR1cm4gZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCX0pOwoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGUsIG9uZSwgZGF0YSApOwoJCX0pOwoJfSwKCgl1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlLCBmbiApOwoJCX0pOwoJfSwKCgl0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOwoJCX0pOwoJfSwKCgl0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CgkJaWYgKCB0aGlzWzBdICkgewoJCQl2YXIgZXZlbnQgPSBqUXVlcnkuRXZlbnQoIHR5cGUgKTsKCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgdGhpc1swXSApOwoJCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJCX0KCX0sCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4gKSB7CgkJLy8gU2F2ZSByZWZlcmVuY2UgdG8gYXJndW1lbnRzIGZvciBhY2Nlc3MgaW4gY2xvc3VyZQoJCXZhciBhcmdzID0gYXJndW1lbnRzLCBpID0gMTsKCgkJLy8gbGluayBhbGwgdGhlIGZ1bmN0aW9ucywgc28gYW55IG9mIHRoZW0gY2FuIHVuYmluZCB0aGlzIGNsaWNrIGhhbmRsZXIKCQl3aGlsZSggaSA8IGFyZ3MubGVuZ3RoICkgewoJCQlqUXVlcnkuZXZlbnQucHJveHkoIGZuLCBhcmdzWyBpKysgXSApOwoJCX0KCgkJcmV0dXJuIHRoaXMuY2xpY2soIGpRdWVyeS5ldmVudC5wcm94eSggZm4sIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJLy8gRmlndXJlIG91dCB3aGljaCBmdW5jdGlvbiB0byBleGVjdXRlCgkJCXRoaXMubGFzdFRvZ2dsZSA9ICggdGhpcy5sYXN0VG9nZ2xlIHx8IDAgKSAlIGk7CgoJCQkvLyBNYWtlIHN1cmUgdGhhdCBjbGlja3Mgc3RvcAoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKCQkJLy8gYW5kIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uCgkJCXJldHVybiBhcmdzWyB0aGlzLmxhc3RUb2dnbGUrKyBdLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSB8fCBmYWxzZTsKCQl9KSk7Cgl9LAoKCWhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHsKCQlyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTsKCX0sCgoJcmVhZHk6IGZ1bmN0aW9uKCBmbiApIHsKCQkvLyBBdHRhY2ggdGhlIGxpc3RlbmVycwoJCWJpbmRSZWFkeSgpOwoKCQkvLyBJZiB0aGUgRE9NIGlzIGFscmVhZHkgcmVhZHkKCQlpZiAoIGpRdWVyeS5pc1JlYWR5ICkgewoJCQkvLyBFeGVjdXRlIHRoZSBmdW5jdGlvbiBpbW1lZGlhdGVseQoJCQlmbi5jYWxsKCBkb2N1bWVudCwgalF1ZXJ5ICk7CgoJCS8vIE90aGVyd2lzZSwgcmVtZW1iZXIgdGhlIGZ1bmN0aW9uIGZvciBsYXRlcgoJCX0gZWxzZSB7CgkJCS8vIEFkZCB0aGUgZnVuY3Rpb24gdG8gdGhlIHdhaXQgbGlzdAoJCQlqUXVlcnkucmVhZHlMaXN0LnB1c2goIGZuICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJbGl2ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEsIGZuLCB0aGlzT2JqZWN0ICkgewoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJaWYgKCBmbiAhPT0gdW5kZWZpbmVkICkgewoJCQkJdGhpc09iamVjdCA9IGZuOwoJCQl9CgkJCWZuID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgkJalF1ZXJ5KCB0aGlzLmNvbnRleHQgKS5iaW5kKCBsaXZlQ29udmVydCggdHlwZSwgdGhpcy5zZWxlY3RvciApLCB7CgkJCWRhdGE6IGRhdGEsIHNlbGVjdG9yOiB0aGlzLnNlbGVjdG9yLCBsaXZlOiB0eXBlCgkJfSwgZm4sIHRoaXNPYmplY3QgKTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJZGllOiBmdW5jdGlvbiggdHlwZSwgZm4gKSB7CgkJalF1ZXJ5KCB0aGlzLmNvbnRleHQgKS51bmJpbmQoIGxpdmVDb252ZXJ0KCB0eXBlLCB0aGlzLnNlbGVjdG9yICksIGZuID8geyBndWlkOiBmbi5ndWlkICsgdGhpcy5zZWxlY3RvciArIHR5cGUgfSA6IG51bGwgKTsKCQlyZXR1cm4gdGhpczsKCX0KfSk7CgpmdW5jdGlvbiBsaXZlSGFuZGxlciggZXZlbnQgKSB7Cgl2YXIgc3RvcCA9IHRydWUsIGVsZW1zID0gW10sIGFyZ3MgPSBhcmd1bWVudHM7CgoJalF1ZXJ5LmVhY2goIGpRdWVyeS5kYXRhKCB0aGlzLCAiZXZlbnRzIiApLmxpdmUgfHwgW10sIGZ1bmN0aW9uKCBpLCBmbiApIHsKCQlpZiAoIGZuLmxpdmUgPT09IGV2ZW50LnR5cGUgKSB7CgkJCXZhciBlbGVtID0galF1ZXJ5KCBldmVudC50YXJnZXQgKS5jbG9zZXN0KCBmbi5zZWxlY3RvciApWzBdOwoJCQlpZiAoIGVsZW0gKSB7CgkJCQllbGVtcy5wdXNoKHsgZWxlbTogZWxlbSwgZm46IGZuIH0pOwoJCQl9CgkJfQoJfSk7CgoJZWxlbXMuc29ydChmdW5jdGlvbiggYSwgYiApIHsKCQlyZXR1cm4galF1ZXJ5LmRhdGEoIGEuZWxlbSwgImNsb3Nlc3QiICkgLSBqUXVlcnkuZGF0YSggYi5lbGVtLCAiY2xvc2VzdCIgKTsKCX0pOwoKCWpRdWVyeS5lYWNoKGVsZW1zLCBmdW5jdGlvbigpIHsKCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gdGhpcy5lbGVtOwoJCWV2ZW50LmRhdGEgPSB0aGlzLmZuLmRhdGE7CgkJaWYgKCB0aGlzLmZuLmFwcGx5KCB0aGlzLmVsZW0sIGFyZ3MgKSA9PT0gZmFsc2UgKSB7CgkJCXJldHVybiAoc3RvcCA9IGZhbHNlKTsKCQl9Cgl9KTsKCglyZXR1cm4gc3RvcDsKfQoKZnVuY3Rpb24gbGl2ZUNvbnZlcnQoIHR5cGUsIHNlbGVjdG9yICkgewoJcmV0dXJuIFsibGl2ZSIsIHR5cGUsIHNlbGVjdG9yLnJlcGxhY2UoL1wuL2csICJgIikucmVwbGFjZSgvIC9nLCAifCIpXS5qb2luKCIuIik7Cn0KCmpRdWVyeS5leHRlbmQoewoJaXNSZWFkeTogZmFsc2UsCglyZWFkeUxpc3Q6IFtdLAoJLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQoJcmVhZHk6IGZ1bmN0aW9uKCkgewoJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBET00gaXMgbm90IGFscmVhZHkgbG9hZGVkCgkJaWYgKCAhalF1ZXJ5LmlzUmVhZHkgKSB7CgkJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCQlqUXVlcnkuaXNSZWFkeSA9IHRydWU7CgoJCQkvLyBJZiB0aGVyZSBhcmUgZnVuY3Rpb25zIGJvdW5kLCB0byBleGVjdXRlCgkJCWlmICggalF1ZXJ5LnJlYWR5TGlzdCApIHsKCQkJCS8vIEV4ZWN1dGUgYWxsIG9mIHRoZW0KCQkJCXZhciBmbiwgaSA9IDA7CgkJCQl3aGlsZSAoIChmbiA9IGpRdWVyeS5yZWFkeUxpc3RbIGkrKyBdKSApIHsKCQkJCQlmbi5jYWxsKCBkb2N1bWVudCwgalF1ZXJ5ICk7CgkJCQl9CgoJCQkJLy8gUmVzZXQgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zCgkJCQlqUXVlcnkucmVhZHlMaXN0ID0gbnVsbDsKCQkJfQoKCQkJLy8gVHJpZ2dlciBhbnkgYm91bmQgcmVhZHkgZXZlbnRzCgkJCWpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VySGFuZGxlciggInJlYWR5IiApOwoJCX0KCX0KfSk7Cgp2YXIgcmVhZHlCb3VuZCA9IGZhbHNlOwoKZnVuY3Rpb24gYmluZFJlYWR5KCkgewoJaWYgKCByZWFkeUJvdW5kICkgcmV0dXJuOwoJcmVhZHlCb3VuZCA9IHRydWU7CgoJLy8gTW96aWxsYSwgT3BlcmEgYW5kIHdlYmtpdCBuaWdodGxpZXMgY3VycmVudGx5IHN1cHBvcnQgdGhpcyBldmVudAoJaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgewoJCS8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2sKCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgewoJCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlICk7CgkJCWpRdWVyeS5yZWFkeSgpOwoJCX0sIGZhbHNlICk7CgoJLy8gSWYgSUUgZXZlbnQgbW9kZWwgaXMgdXNlZAoJfSBlbHNlIGlmICggZG9jdW1lbnQuYXR0YWNoRXZlbnQgKSB7CgkJLy8gZW5zdXJlIGZpcmluZyBiZWZvcmUgb25sb2FkLAoJCS8vIG1heWJlIGxhdGUgYnV0IHNhZmUgYWxzbyBmb3IgaWZyYW1lcwoJCWRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsKCQkJaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgewoJCQkJZG9jdW1lbnQuZGV0YWNoRXZlbnQoICJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlICk7CgkJCQlqUXVlcnkucmVhZHkoKTsKCQkJfQoJCX0pOwoKCQkvLyBJZiBJRSBhbmQgbm90IGFuIGlmcmFtZQoJCS8vIGNvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKCQlpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCAmJiB3aW5kb3cgPT09IHdpbmRvdy50b3AgKSAoZnVuY3Rpb24oKSB7CgkJCWlmICggalF1ZXJ5LmlzUmVhZHkgKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCXRyeSB7CgkJCQkvLyBJZiBJRSBpcyB1c2VkLCB1c2UgdGhlIHRyaWNrIGJ5IERpZWdvIFBlcmluaQoJCQkJLy8gaHR0cDovL2phdmFzY3JpcHQubndib3guY29tL0lFQ29udGVudExvYWRlZC8KCQkJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpOwoJCQl9IGNhdGNoKCBlcnJvciApIHsKCQkJCXNldFRpbWVvdXQoIGFyZ3VtZW50cy5jYWxsZWUsIDAgKTsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gYW5kIGV4ZWN1dGUgYW55IHdhaXRpbmcgZnVuY3Rpb25zCgkJCWpRdWVyeS5yZWFkeSgpOwoJCX0pKCk7Cgl9CgoJLy8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmsKCWpRdWVyeS5ldmVudC5hZGQoIHdpbmRvdywgImxvYWQiLCBqUXVlcnkucmVhZHkgKTsKfQoKalF1ZXJ5LmVhY2goICgiYmx1cixmb2N1cyxsb2FkLHJlc2l6ZSxzY3JvbGwsdW5sb2FkLGNsaWNrLGRibGNsaWNrLCIgKwoJIm1vdXNlZG93bixtb3VzZXVwLG1vdXNlbW92ZSxtb3VzZW92ZXIsbW91c2VvdXQsbW91c2VlbnRlcixtb3VzZWxlYXZlLCIgKwoJImNoYW5nZSxzZWxlY3Qsc3VibWl0LGtleWRvd24sa2V5cHJlc3Msa2V5dXAsZXJyb3IiKS5zcGxpdCgiLCIpLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCgkvLyBIYW5kbGUgZXZlbnQgYmluZGluZwoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZm4gKSB7CgkJcmV0dXJuIGZuID8gdGhpcy5iaW5kKCBuYW1lLCBmbiApIDogdGhpcy50cmlnZ2VyKCBuYW1lICk7Cgl9Owp9KTsKCi8vIFByZXZlbnQgbWVtb3J5IGxlYWtzIGluIElFCi8vIEFuZCBwcmV2ZW50IGVycm9ycyBvbiByZWZyZXNoIHdpdGggZXZlbnRzIGxpa2UgbW91c2VvdmVyIGluIG90aGVyIGJyb3dzZXJzCi8vIFdpbmRvdyBpc24ndCBpbmNsdWRlZCBzbyBhcyBub3QgdG8gdW5iaW5kIGV4aXN0aW5nIHVubG9hZCBldmVudHMKLy8gTW9yZSBpbmZvOgovLyAgLSBodHRwOi8vaXNhYWNzY2hsdWV0ZXIuY29tLzIwMDYvMTAvbXNpZS1tZW1vcnktbGVha3MvCi8vICAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTI1MjU0MgpqUXVlcnkoIHdpbmRvdyApLmJpbmQoICd1bmxvYWQnLCBmdW5jdGlvbigpIHsKCWZvciAoIHZhciBpZCBpbiBqUXVlcnkuY2FjaGUgKSB7CgkJLy8gU2tpcCB0aGUgd2luZG93CgkJaWYgKCBpZCAhPSAxICYmIGpRdWVyeS5jYWNoZVsgaWQgXS5oYW5kbGUgKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIGpRdWVyeS5jYWNoZVsgaWQgXS5oYW5kbGUuZWxlbSApOwoJCX0KCX0KfSk7CihmdW5jdGlvbigpewoKCWpRdWVyeS5zdXBwb3J0ID0ge307CgoJdmFyIHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCgkJc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksCgkJZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksCgkJaWQgPSAic2NyaXB0IiArIChuZXcgRGF0ZSkuZ2V0VGltZSgpOwoKCWRpdi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoJZGl2LmlubmVySFRNTCA9ICcgICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0iL2EiIHN0eWxlPSJjb2xvcjpyZWQ7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41OyI+YTwvYT48c2VsZWN0PjxvcHRpb24+dGV4dDwvb3B0aW9uPjwvc2VsZWN0Pic7CgoJdmFyIGFsbCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLAoJCWEgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXTsKCgkvLyBDYW4ndCBnZXQgYmFzaWMgdGVzdCBzdXBwb3J0CglpZiAoICFhbGwgfHwgIWFsbC5sZW5ndGggfHwgIWEgKSB7CgkJcmV0dXJuOwoJfQoKCWpRdWVyeS5zdXBwb3J0ID0gewoJCS8vIElFIHN0cmlwcyBsZWFkaW5nIHdoaXRlc3BhY2Ugd2hlbiAuaW5uZXJIVE1MIGlzIHVzZWQKCQlsZWFkaW5nV2hpdGVzcGFjZTogZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT0gMywKCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGJvZHkgZWxlbWVudHMgYXJlbid0IGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQKCQkvLyBJRSB3aWxsIGluc2VydCB0aGVtIGludG8gZW1wdHkgdGFibGVzCgkJdGJvZHk6ICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLAoKCQkvLyBNYWtlIHN1cmUgdGhhdCBsaW5rIGVsZW1lbnRzIGdldCBzZXJpYWxpemVkIGNvcnJlY3RseSBieSBpbm5lckhUTUwKCQkvLyBUaGlzIHJlcXVpcmVzIGEgd3JhcHBlciBlbGVtZW50IGluIElFCgkJaHRtbFNlcmlhbGl6ZTogISFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsCgoJCS8vIEdldCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gZnJvbSBnZXRBdHRyaWJ1dGUKCQkvLyAoSUUgdXNlcyAuY3NzVGV4dCBpbnN0ZWQpCgkJc3R5bGU6IC9yZWQvLnRlc3QoIGEuZ2V0QXR0cmlidXRlKCJzdHlsZSIpICksCgoJCS8vIE1ha2Ugc3VyZSB0aGF0IFVSTHMgYXJlbid0IG1hbmlwdWxhdGVkCgkJLy8gKElFIG5vcm1hbGl6ZXMgaXQgYnkgZGVmYXVsdCkKCQlocmVmTm9ybWFsaXplZDogYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSA9PT0gIi9hIiwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgZWxlbWVudCBvcGFjaXR5IGV4aXN0cwoJCS8vIChJRSB1c2VzIGZpbHRlciBpbnN0ZWFkKQoJCW9wYWNpdHk6IGEuc3R5bGUub3BhY2l0eSA9PT0gIjAuNSIsCgoJCS8vIFZlcmlmeSBzdHlsZSBmbG9hdCBleGlzdGVuY2UKCQkvLyAoSUUgdXNlcyBzdHlsZUZsb2F0IGluc3RlYWQgb2YgY3NzRmxvYXQpCgkJY3NzRmxvYXQ6ICEhYS5zdHlsZS5jc3NGbG9hdCwKCgkJLy8gV2lsbCBiZSBkZWZpbmVkIGxhdGVyCgkJc2NyaXB0RXZhbDogZmFsc2UsCgkJbm9DbG9uZUV2ZW50OiB0cnVlLAoJCWJveE1vZGVsOiBudWxsCgl9OwoKCXNjcmlwdC50eXBlID0gInRleHQvamF2YXNjcmlwdCI7Cgl0cnkgewoJCXNjcmlwdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoICJ3aW5kb3cuIiArIGlkICsgIj0xOyIgKSApOwoJfSBjYXRjaChlKXt9CgoJcm9vdC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgcm9vdC5maXJzdENoaWxkICk7CgoJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGV4ZWN1dGlvbiBvZiBjb2RlIHdvcmtzIGJ5IGluamVjdGluZyBhIHNjcmlwdAoJLy8gdGFnIHdpdGggYXBwZW5kQ2hpbGQvY3JlYXRlVGV4dE5vZGUKCS8vIChJRSBkb2Vzbid0IHN1cHBvcnQgdGhpcywgZmFpbHMsIGFuZCB1c2VzIC50ZXh0IGluc3RlYWQpCglpZiAoIHdpbmRvd1sgaWQgXSApIHsKCQlqUXVlcnkuc3VwcG9ydC5zY3JpcHRFdmFsID0gdHJ1ZTsKCQlkZWxldGUgd2luZG93WyBpZCBdOwoJfQoKCXJvb3QucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoKCWlmICggZGl2LmF0dGFjaEV2ZW50ICYmIGRpdi5maXJlRXZlbnQgKSB7CgkJZGl2LmF0dGFjaEV2ZW50KCJvbmNsaWNrIiwgZnVuY3Rpb24gY2xpY2soKXsKCQkJLy8gQ2xvbmluZyBhIG5vZGUgc2hvdWxkbid0IGNvcHkgb3ZlciBhbnkKCQkJLy8gYm91bmQgZXZlbnQgaGFuZGxlcnMgKElFIGRvZXMgdGhpcykKCQkJalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50ID0gZmFsc2U7CgkJCWRpdi5kZXRhY2hFdmVudCgib25jbGljayIsIGNsaWNrKTsKCQl9KTsKCQlkaXYuY2xvbmVOb2RlKHRydWUpLmZpcmVFdmVudCgib25jbGljayIpOwoJfQoKCS8vIEZpZ3VyZSBvdXQgaWYgdGhlIFczQyBib3ggbW9kZWwgd29ya3MgYXMgZXhwZWN0ZWQKCS8vIGRvY3VtZW50LmJvZHkgbXVzdCBleGlzdCBiZWZvcmUgd2UgY2FuIGRvIHRoaXMKCWpRdWVyeShmdW5jdGlvbigpewoJCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCQlkaXYuc3R5bGUud2lkdGggPSBkaXYuc3R5bGUucGFkZGluZ0xlZnQgPSAiMXB4IjsKCgkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCggZGl2ICk7CgkJalF1ZXJ5LmJveE1vZGVsID0galF1ZXJ5LnN1cHBvcnQuYm94TW9kZWwgPSBkaXYub2Zmc2V0V2lkdGggPT09IDI7CgkJZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCggZGl2ICkuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKCQlkaXYgPSBudWxsOwoJfSk7CgoJLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKCXJvb3QgPSBzY3JpcHQgPSBkaXYgPSBhbGwgPSBhID0gbnVsbDsKfSkoKTsKCmpRdWVyeS5wcm9wcyA9IHsKCSJmb3IiOiAiaHRtbEZvciIsCgkiY2xhc3MiOiAiY2xhc3NOYW1lIiwKCXJlYWRvbmx5OiAicmVhZE9ubHkiLAoJbWF4bGVuZ3RoOiAibWF4TGVuZ3RoIiwKCWNlbGxzcGFjaW5nOiAiY2VsbFNwYWNpbmciLAoJcm93c3BhbjogInJvd1NwYW4iLAoJY29sc3BhbjogImNvbFNwYW4iLAoJdGFiaW5kZXg6ICJ0YWJJbmRleCIKfTsKLy8gZXhjbHVkZSB0aGUgZm9sbG93aW5nIGNzcyBwcm9wZXJ0aWVzIHRvIGFkZCBweAp2YXIgZXhjbHVkZSA9IC96LT9pbmRleHxmb250LT93ZWlnaHR8b3BhY2l0eXx6b29tfGxpbmUtP2hlaWdodC9pLAoJLy8gY2FjaGUgY2hlY2sgZm9yIGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUKCWdldENvbXB1dGVkU3R5bGUgPSBkb2N1bWVudC5kZWZhdWx0VmlldyAmJiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlLAoJLy8gbm9ybWFsaXplIGZsb2F0IGNzcyBwcm9wZXJ0eQoJc3R5bGVGbG9hdCA9IGpRdWVyeS5zdXBwb3J0LmNzc0Zsb2F0ID8gImNzc0Zsb2F0IiA6ICJzdHlsZUZsb2F0IjsKCmpRdWVyeS5mbi5jc3MgPSBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7Cgl2YXIgb3B0aW9ucyA9IG5hbWUsIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTsKCglpZiAoIHR5cGVvZiBuYW1lID09PSAic3RyaW5nIiApIHsKCQkvLyBBcmUgd2Ugc2V0dGluZyB0aGUgc3R5bGU/CgkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgewoJCQlyZXR1cm4gdGhpcy5sZW5ndGggPwoJCQkJalF1ZXJ5LmNzcyggdGhpc1swXSwgbmFtZSApIDoKCQkJCW51bGw7CgoJCS8vIENvbnZlcnQgbmFtZSwgdmFsdWUgcGFyYW1zIHRvIG9wdGlvbnMgaGFzaCBmb3JtYXQKCQl9IGVsc2UgewoJCQlvcHRpb25zID0ge307CgkJCW9wdGlvbnNbIG5hbWUgXSA9IHZhbHVlOwoJCX0KCX0KCgkvLyBGb3IgZWFjaCBlbGVtZW50Li4uCglmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgZWxlbSA9IHRoaXNbaV07CgoJCS8vIFNldCBhbGwgdGhlIHN0eWxlcwoJCWZvciAoIHZhciBwcm9wIGluIG9wdGlvbnMgKSB7CgkJCXZhbHVlID0gb3B0aW9uc1twcm9wXTsKCgkJCWlmICggaXNGdW5jdGlvbiApIHsKCQkJCXZhbHVlID0gdmFsdWUuY2FsbCggZWxlbSwgaSApOwoJCQl9CgoJCQlpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gIm51bWJlciIgJiYgIWV4Y2x1ZGUudGVzdChwcm9wKSApIHsKCQkJCXZhbHVlID0gdmFsdWUgKyAicHgiOwoJCQl9CgoJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIHZhbHVlICk7CgkJfQoJfQoKCXJldHVybiB0aGlzOwp9OwoKalF1ZXJ5LmV4dGVuZCh7CglzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCS8vIGRvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICghZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4KQoJCQlyZXR1cm4gdW5kZWZpbmVkOwoKCQkvLyBpZ25vcmUgbmVnYXRpdmUgd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMgIzE1OTkKCQlpZiAoIChuYW1lID09ICd3aWR0aCcgfHwgbmFtZSA9PSAnaGVpZ2h0JykgJiYgcGFyc2VGbG9hdCh2YWx1ZSkgPCAwICkKCQkJdmFsdWUgPSB1bmRlZmluZWQ7CgoJCXZhciBzdHlsZSA9IGVsZW0uc3R5bGUgfHwgZWxlbSwgc2V0ID0gdmFsdWUgIT09IHVuZGVmaW5lZDsKCgkJLy8gSUUgdXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5CgkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQub3BhY2l0eSAmJiBuYW1lID09ICJvcGFjaXR5IiApIHsKCQkJaWYgKCBzZXQgKSB7CgkJCQkvLyBJRSBoYXMgdHJvdWJsZSB3aXRoIG9wYWNpdHkgaWYgaXQgZG9lcyBub3QgaGF2ZSBsYXlvdXQKCQkJCS8vIEZvcmNlIGl0IGJ5IHNldHRpbmcgdGhlIHpvb20gbGV2ZWwKCQkJCXN0eWxlLnpvb20gPSAxOwoKCQkJCS8vIFNldCB0aGUgYWxwaGEgZmlsdGVyIHRvIHNldCB0aGUgb3BhY2l0eQoJCQkJc3R5bGUuZmlsdGVyID0gKHN0eWxlLmZpbHRlciB8fCAiIikucmVwbGFjZSggL2FscGhhXChbXildKlwpLywgIiIgKSArCgkJCQkJKHBhcnNlSW50KCB2YWx1ZSApICsgJycgPT0gIk5hTiIgPyAiIiA6ICJhbHBoYShvcGFjaXR5PSIgKyB2YWx1ZSAqIDEwMCArICIpIik7CgkJCX0KCgkJCXJldHVybiBzdHlsZS5maWx0ZXIgJiYgc3R5bGUuZmlsdGVyLmluZGV4T2YoIm9wYWNpdHk9IikgPj0gMCA/CgkJCQkocGFyc2VGbG9hdCggc3R5bGUuZmlsdGVyLm1hdGNoKC9vcGFjaXR5PShbXildKikvKVsxXSApIC8gMTAwKSArICcnOgoJCQkJIiI7CgkJfQoKCQkvLyBNYWtlIHN1cmUgd2UncmUgdXNpbmcgdGhlIHJpZ2h0IG5hbWUgZm9yIGdldHRpbmcgdGhlIGZsb2F0IHZhbHVlCgkJaWYgKCAvZmxvYXQvaS50ZXN0KCBuYW1lICkgKQoJCQluYW1lID0gc3R5bGVGbG9hdDsKCgkJbmFtZSA9IG5hbWUucmVwbGFjZSgvLShbYS16XSkvaWcsIGZ1bmN0aW9uKGFsbCwgbGV0dGVyKXsKCQkJcmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpOwoJCX0pOwoKCQlpZiAoIHNldCApCgkJCXN0eWxlWyBuYW1lIF0gPSB2YWx1ZTsKCgkJcmV0dXJuIHN0eWxlWyBuYW1lIF07Cgl9LAoKCWNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGZvcmNlLCBleHRyYSApIHsKCQlpZiAoIG5hbWUgPT0gIndpZHRoIiB8fCBuYW1lID09ICJoZWlnaHQiICkgewoJCQl2YXIgdmFsLCBwcm9wcyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiJibG9jayIgfSwgd2hpY2ggPSBuYW1lID09ICJ3aWR0aCIgPyBbICJMZWZ0IiwgIlJpZ2h0IiBdIDogWyAiVG9wIiwgIkJvdHRvbSIgXTsKCgkJCWZ1bmN0aW9uIGdldFdIKCkgewoJCQkJdmFsID0gbmFtZSA9PSAid2lkdGgiID8gZWxlbS5vZmZzZXRXaWR0aCA6IGVsZW0ub2Zmc2V0SGVpZ2h0OwoKCQkJCWlmICggZXh0cmEgPT09ICJib3JkZXIiICkKCQkJCQlyZXR1cm47CgoJCQkJalF1ZXJ5LmVhY2goIHdoaWNoLCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoICFleHRyYSApCgkJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVsZW0sICJwYWRkaW5nIiArIHRoaXMsIHRydWUpKSB8fCAwOwoJCQkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkKCQkJCQkJdmFsICs9IHBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyggZWxlbSwgIm1hcmdpbiIgKyB0aGlzLCB0cnVlKSkgfHwgMDsKCQkJCQllbHNlCgkJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVsZW0sICJib3JkZXIiICsgdGhpcyArICJXaWR0aCIsIHRydWUpKSB8fCAwOwoJCQkJfSk7CgkJCX0KCgkJCWlmICggZWxlbS5vZmZzZXRXaWR0aCAhPT0gMCApCgkJCQlnZXRXSCgpOwoJCQllbHNlCgkJCQlqUXVlcnkuc3dhcCggZWxlbSwgcHJvcHMsIGdldFdIICk7CgoJCQlyZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCh2YWwpKTsKCQl9CgoJCXJldHVybiBqUXVlcnkuY3VyQ1NTKCBlbGVtLCBuYW1lLCBmb3JjZSApOwoJfSwKCgljdXJDU1M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBmb3JjZSApIHsKCQl2YXIgcmV0LCBzdHlsZSA9IGVsZW0uc3R5bGUsIGZpbHRlcjsKCgkJLy8gSUUgdXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5CgkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQub3BhY2l0eSAmJiBuYW1lID09PSAib3BhY2l0eSIgJiYgZWxlbS5jdXJyZW50U3R5bGUgKSB7CgkJCXJldCA9IChlbGVtLmN1cnJlbnRTdHlsZS5maWx0ZXIgfHwgIiIpLm1hdGNoKC9vcGFjaXR5PShbXildKikvKSA/CgkJCQkocGFyc2VGbG9hdChSZWdFeHAuJDEpIC8gMTAwKSArICIiIDoKCQkJCSIiOwoKCQkJcmV0dXJuIHJldCA9PT0gIiIgPwoJCQkJIjEiIDoKCQkJCXJldDsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB3ZSdyZSB1c2luZyB0aGUgcmlnaHQgbmFtZSBmb3IgZ2V0dGluZyB0aGUgZmxvYXQgdmFsdWUKCQlpZiAoIC9mbG9hdC9pLnRlc3QoIG5hbWUgKSApCgkJCW5hbWUgPSBzdHlsZUZsb2F0OwoKCQlpZiAoICFmb3JjZSAmJiBzdHlsZSAmJiBzdHlsZVsgbmFtZSBdICkgewoJCQlyZXQgPSBzdHlsZVsgbmFtZSBdOwoKCQl9IGVsc2UgaWYgKCBnZXRDb21wdXRlZFN0eWxlICkgewoKCQkJLy8gT25seSAiZmxvYXQiIGlzIG5lZWRlZCBoZXJlCgkJCWlmICggL2Zsb2F0L2kudGVzdCggbmFtZSApICkKCQkJCW5hbWUgPSAiZmxvYXQiOwoKCQkJbmFtZSA9IG5hbWUucmVwbGFjZSggLyhbQS1aXSkvZywgIi0kMSIgKS50b0xvd2VyQ2FzZSgpOwoKCQkJdmFyIGNvbXB1dGVkU3R5bGUgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSwgbnVsbCApOwoKCQkJaWYgKCBjb21wdXRlZFN0eWxlICkKCQkJCXJldCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApOwoKCQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKCQkJaWYgKCBuYW1lID09ICJvcGFjaXR5IiAmJiByZXQgPT0gIiIgKQoJCQkJcmV0ID0gIjEiOwoKCQl9IGVsc2UgaWYgKCBlbGVtLmN1cnJlbnRTdHlsZSApIHsKCQkJdmFyIGNhbWVsQ2FzZSA9IG5hbWUucmVwbGFjZSgvXC0oXHcpL2csIGZ1bmN0aW9uKGFsbCwgbGV0dGVyKXsKCQkJCXJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTsKCQkJfSk7CgoJCQlyZXQgPSBlbGVtLmN1cnJlbnRTdHlsZVsgbmFtZSBdIHx8IGVsZW0uY3VycmVudFN0eWxlWyBjYW1lbENhc2UgXTsKCgkJCS8vIEZyb20gdGhlIGF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMKCQkJLy8gaHR0cDovL2VyaWsuZWFlLm5ldC9hcmNoaXZlcy8yMDA3LzA3LzI3LzE4LjU0LjE1LyNjb21tZW50LTEwMjI5MQoKCQkJLy8gSWYgd2UncmUgbm90IGRlYWxpbmcgd2l0aCBhIHJlZ3VsYXIgcGl4ZWwgbnVtYmVyCgkJCS8vIGJ1dCBhIG51bWJlciB0aGF0IGhhcyBhIHdlaXJkIGVuZGluZywgd2UgbmVlZCB0byBjb252ZXJ0IGl0IHRvIHBpeGVscwoJCQlpZiAoICEvXlxkKyhweCk/JC9pLnRlc3QoIHJldCApICYmIC9eXGQvLnRlc3QoIHJldCApICkgewoJCQkJLy8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlcwoJCQkJdmFyIGxlZnQgPSBzdHlsZS5sZWZ0LCByc0xlZnQgPSBlbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0OwoKCQkJCS8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXQKCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSBlbGVtLmN1cnJlbnRTdHlsZS5sZWZ0OwoJCQkJc3R5bGUubGVmdCA9IHJldCB8fCAwOwoJCQkJcmV0ID0gc3R5bGUucGl4ZWxMZWZ0ICsgInB4IjsKCgkJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCgkJCQlzdHlsZS5sZWZ0ID0gbGVmdDsKCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSByc0xlZnQ7CgkJCX0KCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCS8vIEEgbWV0aG9kIGZvciBxdWlja2x5IHN3YXBwaW5nIGluL291dCBDU1MgcHJvcGVydGllcyB0byBnZXQgY29ycmVjdCBjYWxjdWxhdGlvbnMKCXN3YXA6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQl2YXIgb2xkID0ge307CgkJLy8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzCgkJZm9yICggdmFyIG5hbWUgaW4gb3B0aW9ucyApIHsKCQkJb2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07CgkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTsKCQl9CgoJCWNhbGxiYWNrLmNhbGwoIGVsZW0gKTsKCgkJLy8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzCgkJZm9yICggdmFyIG5hbWUgaW4gb3B0aW9ucyApCgkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJfQp9KTtqUXVlcnkuZm4uZXh0ZW5kKHsKCS8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9hZAoJX2xvYWQ6IGpRdWVyeS5mbi5sb2FkLAoKCWxvYWQ6IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7CgkJaWYgKCB0eXBlb2YgdXJsICE9PSAic3RyaW5nIiApCgkJCXJldHVybiB0aGlzLl9sb2FkKCB1cmwgKTsKCgkJdmFyIG9mZiA9IHVybC5pbmRleE9mKCIgIik7CgkJaWYgKCBvZmYgPj0gMCApIHsKCQkJdmFyIHNlbGVjdG9yID0gdXJsLnNsaWNlKG9mZiwgdXJsLmxlbmd0aCk7CgkJCXVybCA9IHVybC5zbGljZSgwLCBvZmYpOwoJCX0KCgkJLy8gRGVmYXVsdCB0byBhIEdFVCByZXF1ZXN0CgkJdmFyIHR5cGUgPSAiR0VUIjsKCgkJLy8gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkCgkJaWYgKCBwYXJhbXMgKQoJCQkvLyBJZiBpdCdzIGEgZnVuY3Rpb24KCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7CgkJCQkvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFjawoJCQkJY2FsbGJhY2sgPSBwYXJhbXM7CgkJCQlwYXJhbXMgPSBudWxsOwoKCQkJLy8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZwoJCQl9IGVsc2UgaWYoIHR5cGVvZiBwYXJhbXMgPT09ICJvYmplY3QiICkgewoJCQkJcGFyYW1zID0galF1ZXJ5LnBhcmFtKCBwYXJhbXMgKTsKCQkJCXR5cGUgPSAiUE9TVCI7CgkJCX0KCgkJdmFyIHNlbGYgPSB0aGlzOwoKCQkvLyBSZXF1ZXN0IHRoZSByZW1vdGUgZG9jdW1lbnQKCQlqUXVlcnkuYWpheCh7CgkJCXVybDogdXJsLAoJCQl0eXBlOiB0eXBlLAoJCQlkYXRhVHlwZTogImh0bWwiLAoJCQlkYXRhOiBwYXJhbXMsCgkJCWNvbXBsZXRlOiBmdW5jdGlvbihyZXMsIHN0YXR1cyl7CgkJCQkvLyBJZiBzdWNjZXNzZnVsLCBpbmplY3QgdGhlIEhUTUwgaW50byBhbGwgdGhlIG1hdGNoZWQgZWxlbWVudHMKCQkJCWlmICggc3RhdHVzID09ICJzdWNjZXNzIiB8fCBzdGF0dXMgPT0gIm5vdG1vZGlmaWVkIiApCgkJCQkJLy8gU2VlIGlmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZAoJCQkJCXNlbGYuaHRtbCggc2VsZWN0b3IgPwoJCQkJCQkvLyBDcmVhdGUgYSBkdW1teSBkaXYgdG8gaG9sZCB0aGUgcmVzdWx0cwoJCQkJCQlqUXVlcnkoIjxkaXYvPiIpCgkJCQkJCQkvLyBpbmplY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBkb2N1bWVudCBpbiwgcmVtb3ZpbmcgdGhlIHNjcmlwdHMKCQkJCQkJCS8vIHRvIGF2b2lkIGFueSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9ycyBpbiBJRQoJCQkJCQkJLmFwcGVuZChyZXMucmVzcG9uc2VUZXh0LnJlcGxhY2UoLzxzY3JpcHQoLnxccykqP1wvc2NyaXB0Pi9nLCAiIikpCgoJCQkJCQkJLy8gTG9jYXRlIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMKCQkJCQkJCS5maW5kKHNlbGVjdG9yKSA6CgoJCQkJCQkvLyBJZiBub3QsIGp1c3QgaW5qZWN0IHRoZSBmdWxsIHJlc3VsdAoJCQkJCQlyZXMucmVzcG9uc2VUZXh0ICk7CgoJCQkJaWYoIGNhbGxiYWNrICkKCQkJCQlzZWxmLmVhY2goIGNhbGxiYWNrLCBbcmVzLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCByZXNdICk7CgkJCX0KCQl9KTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJc2VyaWFsaXplOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5LnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSk7Cgl9LAoJc2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpewoJCQlyZXR1cm4gdGhpcy5lbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkodGhpcy5lbGVtZW50cykgOiB0aGlzOwoJCX0pCgkJLmZpbHRlcihmdW5jdGlvbigpewoJCQlyZXR1cm4gdGhpcy5uYW1lICYmICF0aGlzLmRpc2FibGVkICYmCgkJCQkodGhpcy5jaGVja2VkIHx8IC9zZWxlY3R8dGV4dGFyZWEvaS50ZXN0KHRoaXMubm9kZU5hbWUpIHx8CgkJCQkJL3RleHR8aGlkZGVufHBhc3N3b3JkfHNlYXJjaC9pLnRlc3QodGhpcy50eXBlKSk7CgkJfSkKCQkubWFwKGZ1bmN0aW9uKGksIGVsZW0pewoJCQl2YXIgdmFsID0galF1ZXJ5KHRoaXMpLnZhbCgpOwoJCQlyZXR1cm4gdmFsID09IG51bGwgPyBudWxsIDoKCQkJCWpRdWVyeS5pc0FycmF5KHZhbCkgPwoJCQkJCWpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24odmFsLCBpKXsKCQkJCQkJcmV0dXJuIHtuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWx9OwoJCQkJCX0pIDoKCQkJCQl7bmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsfTsKCQl9KS5nZXQoKTsKCX0KfSk7CgovLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50cwpqUXVlcnkuZWFjaCggImFqYXhTdGFydCxhamF4U3RvcCxhamF4Q29tcGxldGUsYWpheEVycm9yLGFqYXhTdWNjZXNzLGFqYXhTZW5kIi5zcGxpdCgiLCIpLCBmdW5jdGlvbihpLG8pewoJalF1ZXJ5LmZuW29dID0gZnVuY3Rpb24oZil7CgkJcmV0dXJuIHRoaXMuYmluZChvLCBmKTsKCX07Cn0pOwoKdmFyIGpzYyA9IG5vdygpOwoKalF1ZXJ5LmV4dGVuZCh7CgoJZ2V0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCQkvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21taXRlZAoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJY2FsbGJhY2sgPSBkYXRhOwoJCQlkYXRhID0gbnVsbDsKCQl9CgoJCXJldHVybiBqUXVlcnkuYWpheCh7CgkJCXR5cGU6ICJHRVQiLAoJCQl1cmw6IHVybCwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2ssCgkJCWRhdGFUeXBlOiB0eXBlCgkJfSk7Cgl9LAoKCWdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIGpRdWVyeS5nZXQodXJsLCBudWxsLCBjYWxsYmFjaywgInNjcmlwdCIpOwoJfSwKCglnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmdldCh1cmwsIGRhdGEsIGNhbGxiYWNrLCAianNvbiIpOwoJfSwKCglwb3N0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkgKSB7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHt9OwoJCX0KCgkJcmV0dXJuIGpRdWVyeS5hamF4KHsKCQkJdHlwZTogIlBPU1QiLAoJCQl1cmw6IHVybCwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2ssCgkJCWRhdGFUeXBlOiB0eXBlCgkJfSk7Cgl9LAoKCWFqYXhTZXR1cDogZnVuY3Rpb24oIHNldHRpbmdzICkgewoJCWpRdWVyeS5leHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHNldHRpbmdzICk7Cgl9LAoKCWFqYXhTZXR0aW5nczogewoJCXVybDogbG9jYXRpb24uaHJlZiwKCQlnbG9iYWw6IHRydWUsCgkJdHlwZTogIkdFVCIsCgkJY29udGVudFR5cGU6ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLAoJCXByb2Nlc3NEYXRhOiB0cnVlLAoJCWFzeW5jOiB0cnVlLAoJCS8qCgkJdGltZW91dDogMCwKCQlkYXRhOiBudWxsLAoJCXVzZXJuYW1lOiBudWxsLAoJCXBhc3N3b3JkOiBudWxsLAoJCSovCgkJLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdDsgTWljcm9zb2Z0IGZhaWxlZCB0byBwcm9wZXJseQoJCS8vIGltcGxlbWVudCB0aGUgWE1MSHR0cFJlcXVlc3QgaW4gSUU3LCBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUKCQkvLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBvdmVycmlkZW4gYnkgY2FsbGluZyBqUXVlcnkuYWpheFNldHVwCgkJeGhyOmZ1bmN0aW9uKCl7CgkJCXJldHVybiB3aW5kb3cuQWN0aXZlWE9iamVjdCA/IG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpIDogbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CgkJfSwKCQlhY2NlcHRzOiB7CgkJCXhtbDogImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLAoJCQlodG1sOiAidGV4dC9odG1sIiwKCQkJc2NyaXB0OiAidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IiwKCQkJanNvbjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsCgkJCXRleHQ6ICJ0ZXh0L3BsYWluIiwKCQkJX2RlZmF1bHQ6ICIqLyoiCgkJfQoJfSwKCgkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0CglsYXN0TW9kaWZpZWQ6IHt9LAoKCWFqYXg6IGZ1bmN0aW9uKCBzICkgewoJCS8vIEV4dGVuZCB0aGUgc2V0dGluZ3MsIGJ1dCByZS1leHRlbmQgJ3MnIHNvIHRoYXQgaXQgY2FuIGJlCgkJLy8gY2hlY2tlZCBhZ2FpbiBsYXRlciAoaW4gdGhlIHRlc3Qgc3VpdGUsIHNwZWNpZmljYWxseSkKCQlzID0galF1ZXJ5LmV4dGVuZCh0cnVlLCBzLCBqUXVlcnkuZXh0ZW5kKHRydWUsIHt9LCBqUXVlcnkuYWpheFNldHRpbmdzLCBzKSk7CgoJCXZhciBqc29ucCwganNyZSA9IC89XD8oJnwkKS9nLCBzdGF0dXMsIGRhdGEsCgkJCXR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKCgkJLy8gY29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nCgkJaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApCgkJCXMuZGF0YSA9IGpRdWVyeS5wYXJhbShzLmRhdGEpOwoKCQkvLyBIYW5kbGUgSlNPTlAgUGFyYW1ldGVyIENhbGxiYWNrcwoJCWlmICggcy5kYXRhVHlwZSA9PSAianNvbnAiICkgewoJCQlpZiAoIHR5cGUgPT0gIkdFVCIgKSB7CgkJCQlpZiAoICFzLnVybC5tYXRjaChqc3JlKSApCgkJCQkJcy51cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArIChzLmpzb25wIHx8ICJjYWxsYmFjayIpICsgIj0/IjsKCQkJfSBlbHNlIGlmICggIXMuZGF0YSB8fCAhcy5kYXRhLm1hdGNoKGpzcmUpICkKCQkJCXMuZGF0YSA9IChzLmRhdGEgPyBzLmRhdGEgKyAiJiIgOiAiIikgKyAocy5qc29ucCB8fCAiY2FsbGJhY2siKSArICI9PyI7CgkJCXMuZGF0YVR5cGUgPSAianNvbiI7CgkJfQoKCQkvLyBCdWlsZCB0ZW1wb3JhcnkgSlNPTlAgZnVuY3Rpb24KCQlpZiAoIHMuZGF0YVR5cGUgPT0gImpzb24iICYmIChzLmRhdGEgJiYgcy5kYXRhLm1hdGNoKGpzcmUpIHx8IHMudXJsLm1hdGNoKGpzcmUpKSApIHsKCQkJanNvbnAgPSAianNvbnAiICsganNjKys7CgoJCQkvLyBSZXBsYWNlIHRoZSA9PyBzZXF1ZW5jZSBib3RoIGluIHRoZSBxdWVyeSBzdHJpbmcgYW5kIHRoZSBkYXRhCgkJCWlmICggcy5kYXRhICkKCQkJCXMuZGF0YSA9IChzLmRhdGEgKyAiIikucmVwbGFjZShqc3JlLCAiPSIgKyBqc29ucCArICIkMSIpOwoJCQlzLnVybCA9IHMudXJsLnJlcGxhY2UoanNyZSwgIj0iICsganNvbnAgKyAiJDEiKTsKCgkJCS8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlCgkJCS8vIHRoYXQgYSBKU09OUCBzdHlsZSByZXNwb25zZSBpcyBleGVjdXRlZCBwcm9wZXJseQoJCQlzLmRhdGFUeXBlID0gInNjcmlwdCI7CgoJCQkvLyBIYW5kbGUgSlNPTlAtc3R5bGUgbG9hZGluZwoJCQl3aW5kb3dbIGpzb25wIF0gPSBmdW5jdGlvbih0bXApewoJCQkJZGF0YSA9IHRtcDsKCQkJCXN1Y2Nlc3MoKTsKCQkJCWNvbXBsZXRlKCk7CgkJCQkvLyBHYXJiYWdlIGNvbGxlY3QKCQkJCXdpbmRvd1sganNvbnAgXSA9IHVuZGVmaW5lZDsKCQkJCXRyeXsgZGVsZXRlIHdpbmRvd1sganNvbnAgXTsgfSBjYXRjaChlKXt9CgkJCQlpZiAoIGhlYWQgKQoJCQkJCWhlYWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJCQl9OwoJCX0KCgkJaWYgKCBzLmRhdGFUeXBlID09ICJzY3JpcHQiICYmIHMuY2FjaGUgPT0gbnVsbCApCgkJCXMuY2FjaGUgPSBmYWxzZTsKCgkJaWYgKCBzLmNhY2hlID09PSBmYWxzZSAmJiB0eXBlID09ICJHRVQiICkgewoJCQl2YXIgdHMgPSBub3coKTsKCQkJLy8gdHJ5IHJlcGxhY2luZyBfPSBpZiBpdCBpcyB0aGVyZQoJCQl2YXIgcmV0ID0gcy51cmwucmVwbGFjZSgvKFw/fCYpXz0uKj8oJnwkKS8sICIkMV89IiArIHRzICsgIiQyIik7CgkJCS8vIGlmIG5vdGhpbmcgd2FzIHJlcGxhY2VkLCBhZGQgdGltZXN0YW1wIHRvIHRoZSBlbmQKCQkJcy51cmwgPSByZXQgKyAoKHJldCA9PSBzLnVybCkgPyAocy51cmwubWF0Y2goL1w/LykgPyAiJiIgOiAiPyIpICsgIl89IiArIHRzIDogIiIpOwoJCX0KCgkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBkYXRhIHRvIHVybCBmb3IgZ2V0IHJlcXVlc3RzCgkJaWYgKCBzLmRhdGEgJiYgdHlwZSA9PSAiR0VUIiApIHsKCQkJcy51cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArIHMuZGF0YTsKCQl9CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIHMuZ2xvYmFsICYmICEgalF1ZXJ5LmFjdGl2ZSsrICkKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgoJCS8vIE1hdGNoZXMgYW4gYWJzb2x1dGUgVVJMLCBhbmQgc2F2ZXMgdGhlIGRvbWFpbgoJCXZhciBwYXJ0cyA9IC9eKFx3KzopP1wvXC8oW15cLz8jXSspLy5leGVjKCBzLnVybCApOwoKCQkvLyBJZiB3ZSdyZSByZXF1ZXN0aW5nIGEgcmVtb3RlIGRvY3VtZW50CgkJLy8gYW5kIHRyeWluZyB0byBsb2FkIEpTT04gb3IgU2NyaXB0IHdpdGggYSBHRVQKCQlpZiAoIHMuZGF0YVR5cGUgPT0gInNjcmlwdCIgJiYgdHlwZSA9PSAiR0VUIiAmJiBwYXJ0cwoJCQkmJiAoIHBhcnRzWzFdICYmIHBhcnRzWzFdICE9IGxvY2F0aW9uLnByb3RvY29sIHx8IHBhcnRzWzJdICE9IGxvY2F0aW9uLmhvc3QgKSl7CgoJCQl2YXIgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07CgkJCXZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKCQkJc2NyaXB0LnNyYyA9IHMudXJsOwoJCQlpZiAocy5zY3JpcHRDaGFyc2V0KQoJCQkJc2NyaXB0LmNoYXJzZXQgPSBzLnNjcmlwdENoYXJzZXQ7CgoJCQkvLyBIYW5kbGUgU2NyaXB0IGxvYWRpbmcKCQkJaWYgKCAhanNvbnAgKSB7CgkJCQl2YXIgZG9uZSA9IGZhbHNlOwoKCQkJCS8vIEF0dGFjaCBoYW5kbGVycyBmb3IgYWxsIGJyb3dzZXJzCgkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCl7CgkJCQkJaWYgKCAhZG9uZSAmJiAoIXRoaXMucmVhZHlTdGF0ZSB8fAoJCQkJCQkJdGhpcy5yZWFkeVN0YXRlID09ICJsb2FkZWQiIHx8IHRoaXMucmVhZHlTdGF0ZSA9PSAiY29tcGxldGUiKSApIHsKCQkJCQkJZG9uZSA9IHRydWU7CgkJCQkJCXN1Y2Nlc3MoKTsKCQkJCQkJY29tcGxldGUoKTsKCgkJCQkJCS8vIEhhbmRsZSBtZW1vcnkgbGVhayBpbiBJRQoJCQkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7CgkJCQkJCWhlYWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJCQkJCX0KCQkJCX07CgkJCX0KCgkJCS8vIFVzZSBpbnNlcnRCZWZvcmUgaW5zdGVhZCBvZiBhcHBlbmRDaGlsZCAgdG8gY2lyY3VtdmVudCBhbiBJRTYgYnVnLgoJCQkvLyBUaGlzIGFyaXNlcyB3aGVuIGEgYmFzZSBub2RlIGlzIHVzZWQgKCMyNzA5IGFuZCAjNDM3OCkuCgkJCWhlYWQuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIGhlYWQuZmlyc3RDaGlsZCApOwoKCQkJLy8gV2UgaGFuZGxlIGV2ZXJ5dGhpbmcgdXNpbmcgdGhlIHNjcmlwdCBlbGVtZW50IGluamVjdGlvbgoJCQlyZXR1cm4gdW5kZWZpbmVkOwoJCX0KCgkJdmFyIHJlcXVlc3REb25lID0gZmFsc2U7CgoJCS8vIENyZWF0ZSB0aGUgcmVxdWVzdCBvYmplY3QKCQl2YXIgeGhyID0gcy54aHIoKTsKCgkJLy8gT3BlbiB0aGUgc29ja2V0CgkJLy8gUGFzc2luZyBudWxsIHVzZXJuYW1lLCBnZW5lcmF0ZXMgYSBsb2dpbiBwb3B1cCBvbiBPcGVyYSAoIzI4NjUpCgkJaWYoIHMudXNlcm5hbWUgKQoJCQl4aHIub3Blbih0eXBlLCBzLnVybCwgcy5hc3luYywgcy51c2VybmFtZSwgcy5wYXNzd29yZCk7CgkJZWxzZQoJCQl4aHIub3Blbih0eXBlLCBzLnVybCwgcy5hc3luYyk7CgoJCS8vIE5lZWQgYW4gZXh0cmEgdHJ5L2NhdGNoIGZvciBjcm9zcyBkb21haW4gcmVxdWVzdHMgaW4gRmlyZWZveCAzCgkJdHJ5IHsKCQkJLy8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50CgkJCWlmICggcy5kYXRhICkKCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCBzLmNvbnRlbnRUeXBlKTsKCgkJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgaGVhZGVyLCBpZiBpZk1vZGlmaWVkIG1vZGUuCgkJCWlmICggcy5pZk1vZGlmaWVkICkKCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsCgkJCQkJalF1ZXJ5Lmxhc3RNb2RpZmllZFtzLnVybF0gfHwgIlRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UIiApOwoKCQkJLy8gU2V0IGhlYWRlciBzbyB0aGUgY2FsbGVkIHNjcmlwdCBrbm93cyB0aGF0IGl0J3MgYW4gWE1MSHR0cFJlcXVlc3QKCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIlgtUmVxdWVzdGVkLVdpdGgiLCAiWE1MSHR0cFJlcXVlc3QiKTsKCgkJCS8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGUKCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsIHMuZGF0YVR5cGUgJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlIF0gPwoJCQkJcy5hY2NlcHRzWyBzLmRhdGFUeXBlIF0gKyAiLCAqLyoiIDoKCQkJCXMuYWNjZXB0cy5fZGVmYXVsdCApOwoJCX0gY2F0Y2goZSl7fQoKCQkvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0CgkJaWYgKCBzLmJlZm9yZVNlbmQgJiYgcy5iZWZvcmVTZW5kKHhociwgcykgPT09IGZhbHNlICkgewoJCQkvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXIKCQkJaWYgKCBzLmdsb2JhbCAmJiAhIC0talF1ZXJ5LmFjdGl2ZSApCgkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhTdG9wIiApOwoJCQkvLyBjbG9zZSBvcGVuZGVkIHNvY2tldAoJCQl4aHIuYWJvcnQoKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYgKCBzLmdsb2JhbCApCgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCJhamF4U2VuZCIsIFt4aHIsIHNdKTsKCgkJLy8gV2FpdCBmb3IgYSByZXNwb25zZSB0byBjb21lIGJhY2sKCQl2YXIgb25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oaXNUaW1lb3V0KXsKCQkJLy8gVGhlIHJlcXVlc3Qgd2FzIGFib3J0ZWQsIGNsZWFyIHRoZSBpbnRlcnZhbCBhbmQgZGVjcmVtZW50IGpRdWVyeS5hY3RpdmUKCQkJaWYgKHhoci5yZWFkeVN0YXRlID09IDApIHsKCQkJCWlmIChpdmFsKSB7CgkJCQkJLy8gY2xlYXIgcG9sbCBpbnRlcnZhbAoJCQkJCWNsZWFySW50ZXJ2YWwoaXZhbCk7CgkJCQkJaXZhbCA9IG51bGw7CgkJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQkJaWYgKCBzLmdsb2JhbCAmJiAhIC0talF1ZXJ5LmFjdGl2ZSApCgkJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCS8vIFRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZSBhbmQgdGhlIGRhdGEgaXMgYXZhaWxhYmxlLCBvciB0aGUgcmVxdWVzdCB0aW1lZCBvdXQKCQkJfSBlbHNlIGlmICggIXJlcXVlc3REb25lICYmIHhociAmJiAoeGhyLnJlYWR5U3RhdGUgPT0gNCB8fCBpc1RpbWVvdXQgPT0gInRpbWVvdXQiKSApIHsKCQkJCXJlcXVlc3REb25lID0gdHJ1ZTsKCgkJCQkvLyBjbGVhciBwb2xsIGludGVydmFsCgkJCQlpZiAoaXZhbCkgewoJCQkJCWNsZWFySW50ZXJ2YWwoaXZhbCk7CgkJCQkJaXZhbCA9IG51bGw7CgkJCQl9CgoJCQkJc3RhdHVzID0gaXNUaW1lb3V0ID09ICJ0aW1lb3V0IiA/ICJ0aW1lb3V0IiA6CgkJCQkJIWpRdWVyeS5odHRwU3VjY2VzcyggeGhyICkgPyAiZXJyb3IiIDoKCQkJCQlzLmlmTW9kaWZpZWQgJiYgalF1ZXJ5Lmh0dHBOb3RNb2RpZmllZCggeGhyLCBzLnVybCApID8gIm5vdG1vZGlmaWVkIiA6CgkJCQkJInN1Y2Nlc3MiOwoKCQkJCWlmICggc3RhdHVzID09ICJzdWNjZXNzIiApIHsKCQkJCQkvLyBXYXRjaCBmb3IsIGFuZCBjYXRjaCwgWE1MIGRvY3VtZW50IHBhcnNlIGVycm9ycwoJCQkJCXRyeSB7CgkJCQkJCS8vIHByb2Nlc3MgdGhlIGRhdGEgKHJ1bnMgdGhlIHhtbCB0aHJvdWdoIGh0dHBEYXRhIHJlZ2FyZGxlc3Mgb2YgY2FsbGJhY2spCgkJCQkJCWRhdGEgPSBqUXVlcnkuaHR0cERhdGEoIHhociwgcy5kYXRhVHlwZSwgcyApOwoJCQkJCX0gY2F0Y2goZSkgewoJCQkJCQlzdGF0dXMgPSAicGFyc2VyZXJyb3IiOwoJCQkJCX0KCQkJCX0KCgkJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bCBvciBub3Rtb2RpZmllZAoJCQkJaWYgKCBzdGF0dXMgPT0gInN1Y2Nlc3MiICkgewoJCQkJCS8vIENhY2hlIExhc3QtTW9kaWZpZWQgaGVhZGVyLCBpZiBpZk1vZGlmaWVkIG1vZGUuCgkJCQkJdmFyIG1vZFJlczsKCQkJCQl0cnkgewoJCQkJCQltb2RSZXMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTsKCQkJCQl9IGNhdGNoKGUpIHt9IC8vIHN3YWxsb3cgZXhjZXB0aW9uIHRocm93biBieSBGRiBpZiBoZWFkZXIgaXMgbm90IGF2YWlsYWJsZQoKCQkJCQlpZiAoIHMuaWZNb2RpZmllZCAmJiBtb2RSZXMgKQoJCQkJCQlqUXVlcnkubGFzdE1vZGlmaWVkW3MudXJsXSA9IG1vZFJlczsKCgkJCQkJLy8gSlNPTlAgaGFuZGxlcyBpdHMgb3duIHN1Y2Nlc3MgY2FsbGJhY2sKCQkJCQlpZiAoICFqc29ucCApCgkJCQkJCXN1Y2Nlc3MoKTsKCQkJCX0gZWxzZQoJCQkJCWpRdWVyeS5oYW5kbGVFcnJvcihzLCB4aHIsIHN0YXR1cyk7CgoJCQkJLy8gRmlyZSB0aGUgY29tcGxldGUgaGFuZGxlcnMKCQkJCWNvbXBsZXRlKCk7CgoJCQkJaWYgKCBpc1RpbWVvdXQgKQoJCQkJCXhoci5hYm9ydCgpOwoKCQkJCS8vIFN0b3AgbWVtb3J5IGxlYWtzCgkJCQlpZiAoIHMuYXN5bmMgKQoJCQkJCXhociA9IG51bGw7CgkJCX0KCQl9OwoKCQlpZiAoIHMuYXN5bmMgKSB7CgkJCS8vIGRvbid0IGF0dGFjaCB0aGUgaGFuZGxlciB0byB0aGUgcmVxdWVzdCwganVzdCBwb2xsIGl0IGluc3RlYWQKCQkJdmFyIGl2YWwgPSBzZXRJbnRlcnZhbChvbnJlYWR5c3RhdGVjaGFuZ2UsIDEzKTsKCgkJCS8vIFRpbWVvdXQgY2hlY2tlcgoJCQlpZiAoIHMudGltZW91dCA+IDAgKQoJCQkJc2V0VGltZW91dChmdW5jdGlvbigpewoJCQkJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGUgcmVxdWVzdCBpcyBzdGlsbCBoYXBwZW5pbmcKCQkJCQlpZiAoIHhociAmJiAhcmVxdWVzdERvbmUgKQoJCQkJCQlvbnJlYWR5c3RhdGVjaGFuZ2UoICJ0aW1lb3V0IiApOwoJCQkJfSwgcy50aW1lb3V0KTsKCQl9CgoJCS8vIFNlbmQgdGhlIGRhdGEKCQl0cnkgewoJCQl4aHIuc2VuZCggdHlwZSA9PT0gIlBPU1QiID8gcy5kYXRhIDogbnVsbCApOwoJCX0gY2F0Y2goZSkgewoJCQlqUXVlcnkuaGFuZGxlRXJyb3IocywgeGhyLCBudWxsLCBlKTsKCQl9CgoJCS8vIGZpcmVmb3ggMS41IGRvZXNuJ3QgZmlyZSBzdGF0ZWNoYW5nZSBmb3Igc3luYyByZXF1ZXN0cwoJCWlmICggIXMuYXN5bmMgKQoJCQlvbnJlYWR5c3RhdGVjaGFuZ2UoKTsKCgkJZnVuY3Rpb24gc3VjY2VzcygpewoJCQkvLyBJZiBhIGxvY2FsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIGZpcmUgaXQgYW5kIHBhc3MgaXQgdGhlIGRhdGEKCQkJaWYgKCBzLnN1Y2Nlc3MgKQoJCQkJcy5zdWNjZXNzKCBkYXRhLCBzdGF0dXMgKTsKCgkJCS8vIEZpcmUgdGhlIGdsb2JhbCBjYWxsYmFjawoJCQlpZiAoIHMuZ2xvYmFsICkKCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN1Y2Nlc3MiLCBbeGhyLCBzXSApOwoJCX0KCgkJZnVuY3Rpb24gY29tcGxldGUoKXsKCQkJLy8gUHJvY2VzcyByZXN1bHQKCQkJaWYgKCBzLmNvbXBsZXRlICkKCQkJCXMuY29tcGxldGUoeGhyLCBzdGF0dXMpOwoKCQkJLy8gVGhlIHJlcXVlc3Qgd2FzIGNvbXBsZXRlZAoJCQlpZiAoIHMuZ2xvYmFsICkKCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgW3hociwgc10gKTsKCgkJCS8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlcgoJCQlpZiAoIHMuZ2xvYmFsICYmICEgLS1qUXVlcnkuYWN0aXZlICkKCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJfQoKCQkvLyByZXR1cm4gWE1MSHR0cFJlcXVlc3QgdG8gYWxsb3cgYWJvcnRpbmcgdGhlIHJlcXVlc3QgZXRjLgoJCXJldHVybiB4aHI7Cgl9LAoKCWhhbmRsZUVycm9yOiBmdW5jdGlvbiggcywgeGhyLCBzdGF0dXMsIGUgKSB7CgkJLy8gSWYgYSBsb2NhbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCBmaXJlIGl0CgkJaWYgKCBzLmVycm9yICkgcy5lcnJvciggeGhyLCBzdGF0dXMsIGUgKTsKCgkJLy8gRmlyZSB0aGUgZ2xvYmFsIGNhbGxiYWNrCgkJaWYgKCBzLmdsb2JhbCApCgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheEVycm9yIiwgW3hociwgcywgZV0gKTsKCX0sCgoJLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzCglhY3RpdmU6IDAsCgoJLy8gRGV0ZXJtaW5lcyBpZiBhbiBYTUxIdHRwUmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bCBvciBub3QKCWh0dHBTdWNjZXNzOiBmdW5jdGlvbiggeGhyICkgewoJCXRyeSB7CgkJCS8vIElFIGVycm9yIHNvbWV0aW1lcyByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0IHNvIHRyZWF0IGl0IGFzIHN1Y2Nlc3MsIHNlZSAjMTQ1MAoJCQlyZXR1cm4gIXhoci5zdGF0dXMgJiYgbG9jYXRpb24ucHJvdG9jb2wgPT0gImZpbGU6IiB8fAoJCQkJKCB4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwICkgfHwgeGhyLnN0YXR1cyA9PSAzMDQgfHwgeGhyLnN0YXR1cyA9PSAxMjIzOwoJCX0gY2F0Y2goZSl7fQoJCXJldHVybiBmYWxzZTsKCX0sCgoJLy8gRGV0ZXJtaW5lcyBpZiBhbiBYTUxIdHRwUmVxdWVzdCByZXR1cm5zIE5vdE1vZGlmaWVkCglodHRwTm90TW9kaWZpZWQ6IGZ1bmN0aW9uKCB4aHIsIHVybCApIHsKCQl0cnkgewoJCQl2YXIgeGhyUmVzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIik7CgoJCQkvLyBGaXJlZm94IGFsd2F5cyByZXR1cm5zIDIwMC4gY2hlY2sgTGFzdC1Nb2RpZmllZCBkYXRlCgkJCXJldHVybiB4aHIuc3RhdHVzID09IDMwNCB8fCB4aHJSZXMgPT0galF1ZXJ5Lmxhc3RNb2RpZmllZFt1cmxdOwoJCX0gY2F0Y2goZSl7fQoJCXJldHVybiBmYWxzZTsKCX0sCgoJaHR0cERhdGE6IGZ1bmN0aW9uKCB4aHIsIHR5cGUsIHMgKSB7CgkJdmFyIGN0ID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJjb250ZW50LXR5cGUiKSwKCQkJeG1sID0gdHlwZSA9PSAieG1sIiB8fCAhdHlwZSAmJiBjdCAmJiBjdC5pbmRleE9mKCJ4bWwiKSA+PSAwLAoJCQlkYXRhID0geG1sID8geGhyLnJlc3BvbnNlWE1MIDogeGhyLnJlc3BvbnNlVGV4dDsKCgkJaWYgKCB4bWwgJiYgZGF0YS5kb2N1bWVudEVsZW1lbnQudGFnTmFtZSA9PSAicGFyc2VyZXJyb3IiICkgewoJCQl0aHJvdyAicGFyc2VyZXJyb3IiOwoJCX0KCgkJLy8gQWxsb3cgYSBwcmUtZmlsdGVyaW5nIGZ1bmN0aW9uIHRvIHNhbml0aXplIHRoZSByZXNwb25zZQoJCS8vIHMgIT0gbnVsbCBpcyBjaGVja2VkIHRvIGtlZXAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKCQlpZiAoIHMgJiYgcy5kYXRhRmlsdGVyICkgewoJCQlkYXRhID0gcy5kYXRhRmlsdGVyKCBkYXRhLCB0eXBlICk7CgkJfQoKCQkvLyBUaGUgZmlsdGVyIGNhbiBhY3R1YWxseSBwYXJzZSB0aGUgcmVzcG9uc2UKCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKCgkJCS8vIElmIHRoZSB0eXBlIGlzICJzY3JpcHQiLCBldmFsIGl0IGluIGdsb2JhbCBjb250ZXh0CgkJCWlmICggdHlwZSA9PT0gInNjcmlwdCIgKSB7CgkJCQlqUXVlcnkuZ2xvYmFsRXZhbCggZGF0YSApOwoJCQl9CgoJCQkvLyBHZXQgdGhlIEphdmFTY3JpcHQgb2JqZWN0LCBpZiBKU09OIGlzIHVzZWQuCgkJCWlmICggdHlwZSA9PSAianNvbiIgKSB7CgkJCQlpZiAoIHR5cGVvZiBKU09OID09PSAib2JqZWN0IiAmJiBKU09OLnBhcnNlICkgewoJCQkJCWRhdGEgPSBKU09OLnBhcnNlKCBkYXRhICk7CgkJCQl9IGVsc2UgewoJCQkJCWRhdGEgPSAobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIiArIGRhdGEpKSgpOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gZGF0YTsKCX0sCgoJLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2YKCS8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwoJcGFyYW06IGZ1bmN0aW9uKCBhICkgewoJCXZhciBzID0gWyBdOwoKCQlmdW5jdGlvbiBhZGQoIGtleSwgdmFsdWUgKXsKCQkJc1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKCQl9OwoKCQkvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheQoJCS8vIG9mIGZvcm0gZWxlbWVudHMKCQlpZiAoIGpRdWVyeS5pc0FycmF5KGEpIHx8IGEuanF1ZXJ5ICkKCQkJLy8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzCgkJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpewoJCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKCQkJfSk7CgoJCS8vIE90aGVyd2lzZSwgYXNzdW1lIHRoYXQgaXQncyBhbiBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzCgkJZWxzZQoJCQkvLyBTZXJpYWxpemUgdGhlIGtleS92YWx1ZXMKCQkJZm9yICggdmFyIGogaW4gYSApCgkJCQkvLyBJZiB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgdGhlbiB0aGUga2V5IG5hbWVzIG5lZWQgdG8gYmUgcmVwZWF0ZWQKCQkJCWlmICggalF1ZXJ5LmlzQXJyYXkoYVtqXSkgKQoJCQkJCWpRdWVyeS5lYWNoKCBhW2pdLCBmdW5jdGlvbigpewoJCQkJCQlhZGQoIGosIHRoaXMgKTsKCQkJCQl9KTsKCQkJCWVsc2UKCQkJCQlhZGQoIGosIGpRdWVyeS5pc0Z1bmN0aW9uKGFbal0pID8gYVtqXSgpIDogYVtqXSApOwoKCQkvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uCgkJcmV0dXJuIHMuam9pbigiJiIpLnJlcGxhY2UoLyUyMC9nLCAiKyIpOwoJfQoKfSk7CnZhciBlbGVtZGlzcGxheSA9IHt9LAoJdGltZXJJZCwKCWZ4QXR0cnMgPSBbCgkJLy8gaGVpZ2h0IGFuaW1hdGlvbnMKCQlbICJoZWlnaHQiLCAibWFyZ2luVG9wIiwgIm1hcmdpbkJvdHRvbSIsICJwYWRkaW5nVG9wIiwgInBhZGRpbmdCb3R0b20iIF0sCgkJLy8gd2lkdGggYW5pbWF0aW9ucwoJCVsgIndpZHRoIiwgIm1hcmdpbkxlZnQiLCAibWFyZ2luUmlnaHQiLCAicGFkZGluZ0xlZnQiLCAicGFkZGluZ1JpZ2h0IiBdLAoJCS8vIG9wYWNpdHkgYW5pbWF0aW9ucwoJCVsgIm9wYWNpdHkiIF0KCV07CgpmdW5jdGlvbiBnZW5GeCggdHlwZSwgbnVtICl7Cgl2YXIgb2JqID0ge307CglqUXVlcnkuZWFjaCggZnhBdHRycy5jb25jYXQuYXBwbHkoW10sIGZ4QXR0cnMuc2xpY2UoMCxudW0pKSwgZnVuY3Rpb24oKXsKCQlvYmpbIHRoaXMgXSA9IHR5cGU7Cgl9KTsKCXJldHVybiBvYmo7Cn0KCmpRdWVyeS5mbi5leHRlbmQoewoJc2hvdzogZnVuY3Rpb24oc3BlZWQsY2FsbGJhY2spewoJCWlmICggc3BlZWQgKSB7CgkJCXJldHVybiB0aGlzLmFuaW1hdGUoIGdlbkZ4KCJzaG93IiwgMyksIHNwZWVkLCBjYWxsYmFjayk7CgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKXsKCQkJCXZhciBvbGQgPSBqUXVlcnkuZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIpOwoKCQkJCXRoaXNbaV0uc3R5bGUuZGlzcGxheSA9IG9sZCB8fCAiIjsKCgkJCQlpZiAoIGpRdWVyeS5jc3ModGhpc1tpXSwgImRpc3BsYXkiKSA9PT0gIm5vbmUiICkgewoJCQkJCXZhciB0YWdOYW1lID0gdGhpc1tpXS50YWdOYW1lLCBkaXNwbGF5OwoKCQkJCQlpZiAoIGVsZW1kaXNwbGF5WyB0YWdOYW1lIF0gKSB7CgkJCQkJCWRpc3BsYXkgPSBlbGVtZGlzcGxheVsgdGFnTmFtZSBdOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXZhciBlbGVtID0galF1ZXJ5KCI8IiArIHRhZ05hbWUgKyAiIC8+IikuYXBwZW5kVG8oImJvZHkiKTsKCgkJCQkJCWRpc3BsYXkgPSBlbGVtLmNzcygiZGlzcGxheSIpOwoJCQkJCQlpZiAoIGRpc3BsYXkgPT09ICJub25lIiApCgkJCQkJCQlkaXNwbGF5ID0gImJsb2NrIjsKCgkJCQkJCWVsZW0ucmVtb3ZlKCk7CgoJCQkJCQllbGVtZGlzcGxheVsgdGFnTmFtZSBdID0gZGlzcGxheTsKCQkJCQl9CgoJCQkJCWpRdWVyeS5kYXRhKHRoaXNbaV0sICJvbGRkaXNwbGF5IiwgZGlzcGxheSk7CgkJCQl9CgkJCX0KCgkJCS8vIFNldCB0aGUgZGlzcGxheSBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAoJCQkvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93CgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CgkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSBqUXVlcnkuZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIpIHx8ICIiOwoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCQl9Cgl9LAoKCWhpZGU6IGZ1bmN0aW9uKHNwZWVkLGNhbGxiYWNrKXsKCQlpZiAoIHNwZWVkICkgewoJCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBnZW5GeCgiaGlkZSIsIDMpLCBzcGVlZCwgY2FsbGJhY2spOwoJCX0gZWxzZSB7CgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CgkJCQl2YXIgb2xkID0galF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiKTsKCQkJCWlmICggIW9sZCAmJiBvbGQgIT09ICJub25lIiApCgkJCQkJalF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiLCBqUXVlcnkuY3NzKHRoaXNbaV0sICJkaXNwbGF5IikpOwoJCQl9CgoJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdwoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApewoJCQkJdGhpc1tpXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCQl9Cgl9LAoKCS8vIFNhdmUgdGhlIG9sZCB0b2dnbGUgZnVuY3Rpb24KCV90b2dnbGU6IGpRdWVyeS5mbi50b2dnbGUsCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4sIGZuMiApewoJCXZhciBib29sID0gdHlwZW9mIGZuID09PSAiYm9vbGVhbiI7CgoJCXJldHVybiBqUXVlcnkuaXNGdW5jdGlvbihmbikgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oZm4yKSA/CgkJCXRoaXMuX3RvZ2dsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgOgoJCQlmbiA9PSBudWxsIHx8IGJvb2wgPwoJCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCQkJdmFyIHN0YXRlID0gYm9vbCA/IGZuIDogalF1ZXJ5KHRoaXMpLmlzKCI6aGlkZGVuIik7CgkJCQkJalF1ZXJ5KHRoaXMpWyBzdGF0ZSA/ICJzaG93IiA6ICJoaWRlIiBdKCk7CgkJCQl9KSA6CgkJCQl0aGlzLmFuaW1hdGUoZ2VuRngoInRvZ2dsZSIsIDMpLCBmbiwgZm4yKTsKCX0sCgoJZmFkZVRvOiBmdW5jdGlvbihzcGVlZCx0byxjYWxsYmFjayl7CgkJcmV0dXJuIHRoaXMuZmlsdGVyKCI6aGlkZGVuIikuY3NzKCdvcGFjaXR5JywgMCkuc2hvdygpLmVuZCgpCgkJCQkJLmFuaW1hdGUoe29wYWNpdHk6IHRvfSwgc3BlZWQsIGNhbGxiYWNrKTsKCX0sCgoJYW5pbWF0ZTogZnVuY3Rpb24oIHByb3AsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXZhciBvcHRhbGwgPSBqUXVlcnkuc3BlZWQoc3BlZWQsIGVhc2luZywgY2FsbGJhY2spOwoKCQlyZXR1cm4gdGhpc1sgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/ICJlYWNoIiA6ICJxdWV1ZSIgXShmdW5jdGlvbigpewoKCQkJdmFyIG9wdCA9IGpRdWVyeS5leHRlbmQoe30sIG9wdGFsbCksIHAsCgkJCQloaWRkZW4gPSB0aGlzLm5vZGVUeXBlID09IDEgJiYgalF1ZXJ5KHRoaXMpLmlzKCI6aGlkZGVuIiksCgkJCQlzZWxmID0gdGhpczsKCgkJCWZvciAoIHAgaW4gcHJvcCApIHsKCQkJCWlmICggcHJvcFtwXSA9PSAiaGlkZSIgJiYgaGlkZGVuIHx8IHByb3BbcF0gPT0gInNob3ciICYmICFoaWRkZW4gKQoJCQkJCXJldHVybiBvcHQuY29tcGxldGUuY2FsbCh0aGlzKTsKCgkJCQlpZiAoICggcCA9PSAiaGVpZ2h0IiB8fCBwID09ICJ3aWR0aCIgKSAmJiB0aGlzLnN0eWxlICkgewoJCQkJCS8vIFN0b3JlIGRpc3BsYXkgcHJvcGVydHkKCQkJCQlvcHQuZGlzcGxheSA9IGpRdWVyeS5jc3ModGhpcywgImRpc3BsYXkiKTsKCgkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0CgkJCQkJb3B0Lm92ZXJmbG93ID0gdGhpcy5zdHlsZS5vdmVyZmxvdzsKCQkJCX0KCQkJfQoKCQkJaWYgKCBvcHQub3ZlcmZsb3cgIT0gbnVsbCApCgkJCQl0aGlzLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgoJCQlvcHQuY3VyQW5pbSA9IGpRdWVyeS5leHRlbmQoe30sIHByb3ApOwoKCQkJalF1ZXJ5LmVhY2goIHByb3AsIGZ1bmN0aW9uKG5hbWUsIHZhbCl7CgkJCQl2YXIgZSA9IG5ldyBqUXVlcnkuZngoIHNlbGYsIG9wdCwgbmFtZSApOwoKCQkJCWlmICggL3RvZ2dsZXxzaG93fGhpZGUvLnRlc3QodmFsKSApCgkJCQkJZVsgdmFsID09ICJ0b2dnbGUiID8gaGlkZGVuID8gInNob3ciIDogImhpZGUiIDogdmFsIF0oIHByb3AgKTsKCQkJCWVsc2UgewoJCQkJCXZhciBwYXJ0cyA9IHZhbC50b1N0cmluZygpLm1hdGNoKC9eKFsrLV09KT8oW1xkKy0uXSspKC4qKSQvKSwKCQkJCQkJc3RhcnQgPSBlLmN1cih0cnVlKSB8fCAwOwoKCQkJCQlpZiAoIHBhcnRzICkgewoJCQkJCQl2YXIgZW5kID0gcGFyc2VGbG9hdChwYXJ0c1syXSksCgkJCQkJCQl1bml0ID0gcGFydHNbM10gfHwgInB4IjsKCgkJCQkJCS8vIFdlIG5lZWQgdG8gY29tcHV0ZSBzdGFydGluZyB2YWx1ZQoJCQkJCQlpZiAoIHVuaXQgIT0gInB4IiApIHsKCQkJCQkJCXNlbGYuc3R5bGVbIG5hbWUgXSA9IChlbmQgfHwgMSkgKyB1bml0OwoJCQkJCQkJc3RhcnQgPSAoKGVuZCB8fCAxKSAvIGUuY3VyKHRydWUpKSAqIHN0YXJ0OwoJCQkJCQkJc2VsZi5zdHlsZVsgbmFtZSBdID0gc3RhcnQgKyB1bml0OwoJCQkJCQl9CgoJCQkJCQkvLyBJZiBhICs9Ly09IHRva2VuIHdhcyBwcm92aWRlZCwgd2UncmUgZG9pbmcgYSByZWxhdGl2ZSBhbmltYXRpb24KCQkJCQkJaWYgKCBwYXJ0c1sxXSApCgkJCQkJCQllbmQgPSAoKHBhcnRzWzFdID09ICItPSIgPyAtMSA6IDEpICogZW5kKSArIHN0YXJ0OwoKCQkJCQkJZS5jdXN0b20oIHN0YXJ0LCBlbmQsIHVuaXQgKTsKCQkJCQl9IGVsc2UKCQkJCQkJZS5jdXN0b20oIHN0YXJ0LCB2YWwsICIiICk7CgkJCQl9CgkJCX0pOwoKCQkJLy8gRm9yIEpTIHN0cmljdCBjb21wbGlhbmNlCgkJCXJldHVybiB0cnVlOwoJCX0pOwoJfSwKCglzdG9wOiBmdW5jdGlvbihjbGVhclF1ZXVlLCBnb3RvRW5kKXsKCQl2YXIgdGltZXJzID0galF1ZXJ5LnRpbWVyczsKCgkJaWYgKGNsZWFyUXVldWUpCgkJCXRoaXMucXVldWUoW10pOwoKCQl0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkJLy8gZ28gaW4gcmV2ZXJzZSBvcmRlciBzbyBhbnl0aGluZyBhZGRlZCB0byB0aGUgcXVldWUgZHVyaW5nIHRoZSBsb29wIGlzIGlnbm9yZWQKCQkJZm9yICggdmFyIGkgPSB0aW1lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKQoJCQkJaWYgKCB0aW1lcnNbaV0uZWxlbSA9PSB0aGlzICkgewoJCQkJCWlmIChnb3RvRW5kKQoJCQkJCQkvLyBmb3JjZSB0aGUgbmV4dCBzdGVwIHRvIGJlIHRoZSBsYXN0CgkJCQkJCXRpbWVyc1tpXSh0cnVlKTsKCQkJCQl0aW1lcnMuc3BsaWNlKGksIDEpOwoJCQkJfQoJCX0pOwoKCQkvLyBzdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3YXNuJ3QgZm9yY2VkCgkJaWYgKCFnb3RvRW5kKQoJCQl0aGlzLmRlcXVldWUoKTsKCgkJcmV0dXJuIHRoaXM7Cgl9Cgp9KTsKCi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnMKalF1ZXJ5LmVhY2goewoJc2xpZGVEb3duOiBnZW5GeCgic2hvdyIsIDEpLAoJc2xpZGVVcDogZ2VuRngoImhpZGUiLCAxKSwKCXNsaWRlVG9nZ2xlOiBnZW5GeCgidG9nZ2xlIiwgMSksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApewoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGNhbGxiYWNrICl7CgkJcmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBjYWxsYmFjayApOwoJfTsKfSk7CgpqUXVlcnkuZXh0ZW5kKHsKCglzcGVlZDogZnVuY3Rpb24oc3BlZWQsIGVhc2luZywgZm4pIHsKCQl2YXIgb3B0ID0gdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IHNwZWVkIDogewoJCQljb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fAoJCQkJalF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsCgkJCWR1cmF0aW9uOiBzcGVlZCwKCQkJZWFzaW5nOiBmbiAmJiBlYXNpbmcgfHwgZWFzaW5nICYmICFqUXVlcnkuaXNGdW5jdGlvbihlYXNpbmcpICYmIGVhc2luZwoJCX07CgoJCW9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5vZmYgPyAwIDogdHlwZW9mIG9wdC5kdXJhdGlvbiA9PT0gIm51bWJlciIgPyBvcHQuZHVyYXRpb24gOgoJCQlqUXVlcnkuZnguc3BlZWRzW29wdC5kdXJhdGlvbl0gfHwgalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKCgkJLy8gUXVldWVpbmcKCQlvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoJCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCl7CgkJCWlmICggb3B0LnF1ZXVlICE9PSBmYWxzZSApCgkJCQlqUXVlcnkodGhpcykuZGVxdWV1ZSgpOwoJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHQub2xkICkgKQoJCQkJb3B0Lm9sZC5jYWxsKCB0aGlzICk7CgkJfTsKCgkJcmV0dXJuIG9wdDsKCX0sCgoJZWFzaW5nOiB7CgkJbGluZWFyOiBmdW5jdGlvbiggcCwgbiwgZmlyc3ROdW0sIGRpZmYgKSB7CgkJCXJldHVybiBmaXJzdE51bSArIGRpZmYgKiBwOwoJCX0sCgkJc3dpbmc6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51bSwgZGlmZiApIHsKCQkJcmV0dXJuICgoLU1hdGguY29zKHAqTWF0aC5QSSkvMikgKyAwLjUpICogZGlmZiArIGZpcnN0TnVtOwoJCX0KCX0sCgoJdGltZXJzOiBbXSwKCglmeDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AgKXsKCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCgkJaWYgKCAhb3B0aW9ucy5vcmlnICkKCQkJb3B0aW9ucy5vcmlnID0ge307Cgl9Cgp9KTsKCmpRdWVyeS5meC5wcm90b3R5cGUgPSB7CgoJLy8gU2ltcGxlIGZ1bmN0aW9uIGZvciBzZXR0aW5nIGEgc3R5bGUgdmFsdWUKCXVwZGF0ZTogZnVuY3Rpb24oKXsKCQlpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoKCQkoalF1ZXJ5LmZ4LnN0ZXBbdGhpcy5wcm9wXSB8fCBqUXVlcnkuZnguc3RlcC5fZGVmYXVsdCkoIHRoaXMgKTsKCgkJLy8gU2V0IGRpc3BsYXkgcHJvcGVydHkgdG8gYmxvY2sgZm9yIGhlaWdodC93aWR0aCBhbmltYXRpb25zCgkJaWYgKCAoIHRoaXMucHJvcCA9PSAiaGVpZ2h0IiB8fCB0aGlzLnByb3AgPT0gIndpZHRoIiApICYmIHRoaXMuZWxlbS5zdHlsZSApCgkJCXRoaXMuZWxlbS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKCX0sCgoJLy8gR2V0IHRoZSBjdXJyZW50IHNpemUKCWN1cjogZnVuY3Rpb24oZm9yY2UpewoJCWlmICggdGhpcy5lbGVtW3RoaXMucHJvcF0gIT0gbnVsbCAmJiAoIXRoaXMuZWxlbS5zdHlsZSB8fCB0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXSA9PSBudWxsKSApCgkJCXJldHVybiB0aGlzLmVsZW1bIHRoaXMucHJvcCBdOwoKCQl2YXIgciA9IHBhcnNlRmxvYXQoalF1ZXJ5LmNzcyh0aGlzLmVsZW0sIHRoaXMucHJvcCwgZm9yY2UpKTsKCQlyZXR1cm4gciAmJiByID4gLTEwMDAwID8gciA6IHBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyh0aGlzLmVsZW0sIHRoaXMucHJvcCkpIHx8IDA7Cgl9LAoKCS8vIFN0YXJ0IGFuIGFuaW1hdGlvbiBmcm9tIG9uZSBudW1iZXIgdG8gYW5vdGhlcgoJY3VzdG9tOiBmdW5jdGlvbihmcm9tLCB0bywgdW5pdCl7CgkJdGhpcy5zdGFydFRpbWUgPSBub3coKTsKCQl0aGlzLnN0YXJ0ID0gZnJvbTsKCQl0aGlzLmVuZCA9IHRvOwoJCXRoaXMudW5pdCA9IHVuaXQgfHwgdGhpcy51bml0IHx8ICJweCI7CgkJdGhpcy5ub3cgPSB0aGlzLnN0YXJ0OwoJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDA7CgoJCXZhciBzZWxmID0gdGhpczsKCQlmdW5jdGlvbiB0KGdvdG9FbmQpewoJCQlyZXR1cm4gc2VsZi5zdGVwKGdvdG9FbmQpOwoJCX0KCgkJdC5lbGVtID0gdGhpcy5lbGVtOwoKCQlpZiAoIHQoKSAmJiBqUXVlcnkudGltZXJzLnB1c2godCkgJiYgIXRpbWVySWQgKQoJCQl0aW1lcklkID0gc2V0SW50ZXJ2YWwoalF1ZXJ5LmZ4LnRpY2ssIDEzKTsKCX0sCgoJLy8gU2ltcGxlICdzaG93JyBmdW5jdGlvbgoJc2hvdzogZnVuY3Rpb24oKXsKCQkvLyBSZW1lbWJlciB3aGVyZSB3ZSBzdGFydGVkLCBzbyB0aGF0IHdlIGNhbiBnbyBiYWNrIHRvIGl0IGxhdGVyCgkJdGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXSA9IGpRdWVyeS5zdHlsZSggdGhpcy5lbGVtLCB0aGlzLnByb3AgKTsKCQl0aGlzLm9wdGlvbnMuc2hvdyA9IHRydWU7CgoJCS8vIEJlZ2luIHRoZSBhbmltYXRpb24KCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBzdGFydCBhdCBhIHNtYWxsIHdpZHRoL2hlaWdodCB0byBhdm9pZCBhbnkKCQkvLyBmbGFzaCBvZiBjb250ZW50CgkJdGhpcy5jdXN0b20odGhpcy5wcm9wID09ICJ3aWR0aCIgfHwgdGhpcy5wcm9wID09ICJoZWlnaHQiID8gMSA6IDAsIHRoaXMuY3VyKCkpOwoKCQkvLyBTdGFydCBieSBzaG93aW5nIHRoZSBlbGVtZW50CgkJalF1ZXJ5KHRoaXMuZWxlbSkuc2hvdygpOwoJfSwKCgkvLyBTaW1wbGUgJ2hpZGUnIGZ1bmN0aW9uCgloaWRlOiBmdW5jdGlvbigpewoJCS8vIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKCQl0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdID0galF1ZXJ5LnN0eWxlKCB0aGlzLmVsZW0sIHRoaXMucHJvcCApOwoJCXRoaXMub3B0aW9ucy5oaWRlID0gdHJ1ZTsKCgkJLy8gQmVnaW4gdGhlIGFuaW1hdGlvbgoJCXRoaXMuY3VzdG9tKHRoaXMuY3VyKCksIDApOwoJfSwKCgkvLyBFYWNoIHN0ZXAgb2YgYW4gYW5pbWF0aW9uCglzdGVwOiBmdW5jdGlvbihnb3RvRW5kKXsKCQl2YXIgdCA9IG5vdygpOwoKCQlpZiAoIGdvdG9FbmQgfHwgdCA+PSB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKyB0aGlzLnN0YXJ0VGltZSApIHsKCQkJdGhpcy5ub3cgPSB0aGlzLmVuZDsKCQkJdGhpcy5wb3MgPSB0aGlzLnN0YXRlID0gMTsKCQkJdGhpcy51cGRhdGUoKTsKCgkJCXRoaXMub3B0aW9ucy5jdXJBbmltWyB0aGlzLnByb3AgXSA9IHRydWU7CgoJCQl2YXIgZG9uZSA9IHRydWU7CgkJCWZvciAoIHZhciBpIGluIHRoaXMub3B0aW9ucy5jdXJBbmltICkKCQkJCWlmICggdGhpcy5vcHRpb25zLmN1ckFuaW1baV0gIT09IHRydWUgKQoJCQkJCWRvbmUgPSBmYWxzZTsKCgkJCWlmICggZG9uZSApIHsKCQkJCWlmICggdGhpcy5vcHRpb25zLmRpc3BsYXkgIT0gbnVsbCApIHsKCQkJCQkvLyBSZXNldCB0aGUgb3ZlcmZsb3cKCQkJCQl0aGlzLmVsZW0uc3R5bGUub3ZlcmZsb3cgPSB0aGlzLm9wdGlvbnMub3ZlcmZsb3c7CgoJCQkJCS8vIFJlc2V0IHRoZSBkaXNwbGF5CgkJCQkJdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXkgPSB0aGlzLm9wdGlvbnMuZGlzcGxheTsKCQkJCQlpZiAoIGpRdWVyeS5jc3ModGhpcy5lbGVtLCAiZGlzcGxheSIpID09ICJub25lIiApCgkJCQkJCXRoaXMuZWxlbS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKCQkJCX0KCgkJCQkvLyBIaWRlIHRoZSBlbGVtZW50IGlmIHRoZSAiaGlkZSIgb3BlcmF0aW9uIHdhcyBkb25lCgkJCQlpZiAoIHRoaXMub3B0aW9ucy5oaWRlICkKCQkJCQlqUXVlcnkodGhpcy5lbGVtKS5oaWRlKCk7CgoJCQkJLy8gUmVzZXQgdGhlIHByb3BlcnRpZXMsIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGhpZGRlbiBvciBzaG93bgoJCQkJaWYgKCB0aGlzLm9wdGlvbnMuaGlkZSB8fCB0aGlzLm9wdGlvbnMuc2hvdyApCgkJCQkJZm9yICggdmFyIHAgaW4gdGhpcy5vcHRpb25zLmN1ckFuaW0gKQoJCQkJCQlqUXVlcnkuc3R5bGUodGhpcy5lbGVtLCBwLCB0aGlzLm9wdGlvbnMub3JpZ1twXSk7CgoJCQkJLy8gRXhlY3V0ZSB0aGUgY29tcGxldGUgZnVuY3Rpb24KCQkJCXRoaXMub3B0aW9ucy5jb21wbGV0ZS5jYWxsKCB0aGlzLmVsZW0gKTsKCQkJfQoKCQkJcmV0dXJuIGZhbHNlOwoJCX0gZWxzZSB7CgkJCXZhciBuID0gdCAtIHRoaXMuc3RhcnRUaW1lOwoJCQl0aGlzLnN0YXRlID0gbiAvIHRoaXMub3B0aW9ucy5kdXJhdGlvbjsKCgkJCS8vIFBlcmZvcm0gdGhlIGVhc2luZyBmdW5jdGlvbiwgZGVmYXVsdHMgdG8gc3dpbmcKCQkJdGhpcy5wb3MgPSBqUXVlcnkuZWFzaW5nW3RoaXMub3B0aW9ucy5lYXNpbmcgfHwgKGpRdWVyeS5lYXNpbmcuc3dpbmcgPyAic3dpbmciIDogImxpbmVhciIpXSh0aGlzLnN0YXRlLCBuLCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24pOwoJCQl0aGlzLm5vdyA9IHRoaXMuc3RhcnQgKyAoKHRoaXMuZW5kIC0gdGhpcy5zdGFydCkgKiB0aGlzLnBvcyk7CgoJCQkvLyBQZXJmb3JtIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGFuaW1hdGlvbgoJCQl0aGlzLnVwZGF0ZSgpOwoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9Cgp9OwoKalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmZ4LCB7CgoJdGljazpmdW5jdGlvbigpewoJCXZhciB0aW1lcnMgPSBqUXVlcnkudGltZXJzOwoKCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKQoJCQlpZiAoICF0aW1lcnNbaV0oKSApCgkJCQl0aW1lcnMuc3BsaWNlKGktLSwgMSk7CgoJCWlmICggIXRpbWVycy5sZW5ndGggKQoJCQlqUXVlcnkuZnguc3RvcCgpOwoJfSwKCQkKCXN0b3A6ZnVuY3Rpb24oKXsKCQljbGVhckludGVydmFsKCB0aW1lcklkICk7CgkJdGltZXJJZCA9IG51bGw7Cgl9LAoJCglzcGVlZHM6ewoJCXNsb3c6IDYwMCwKIAkJZmFzdDogMjAwLAogCQkvLyBEZWZhdWx0IHNwZWVkCiAJCV9kZWZhdWx0OiA0MDAKCX0sCgoJc3RlcDogewoKCQlvcGFjaXR5OiBmdW5jdGlvbihmeCl7CgkJCWpRdWVyeS5zdHlsZShmeC5lbGVtLCAib3BhY2l0eSIsIGZ4Lm5vdyk7CgkJfSwKCgkJX2RlZmF1bHQ6IGZ1bmN0aW9uKGZ4KXsKCQkJaWYgKCBmeC5lbGVtLnN0eWxlICYmIGZ4LmVsZW0uc3R5bGVbIGZ4LnByb3AgXSAhPSBudWxsICkKCQkJCWZ4LmVsZW0uc3R5bGVbIGZ4LnByb3AgXSA9IGZ4Lm5vdyArIGZ4LnVuaXQ7CgkJCWVsc2UKCQkJCWZ4LmVsZW1bIGZ4LnByb3AgXSA9IGZ4Lm5vdzsKCQl9Cgl9Cn0pOwppZiAoICJnZXRCb3VuZGluZ0NsaWVudFJlY3QiIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCApCglqUXVlcnkuZm4ub2Zmc2V0ID0gZnVuY3Rpb24oKSB7CgkJdmFyIGVsZW0gPSB0aGlzWzBdOwoJCWlmICggIWVsZW0gfHwgIWVsZW0ub3duZXJEb2N1bWVudCApIHJldHVybiBudWxsOwoJCWlmICggZWxlbSA9PT0gZWxlbS5vd25lckRvY3VtZW50LmJvZHkgKSByZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCBlbGVtICk7CgkJdmFyIGJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCwgYm9keSA9IGRvYy5ib2R5LCBkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudCwKCQkJY2xpZW50VG9wID0gZG9jRWxlbS5jbGllbnRUb3AgfHwgYm9keS5jbGllbnRUb3AgfHwgMCwgY2xpZW50TGVmdCA9IGRvY0VsZW0uY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMCwKCQkJdG9wICA9IGJveC50b3AgICsgKHNlbGYucGFnZVlPZmZzZXQgfHwgalF1ZXJ5LnN1cHBvcnQuYm94TW9kZWwgJiYgZG9jRWxlbS5zY3JvbGxUb3AgIHx8IGJvZHkuc2Nyb2xsVG9wICkgLSBjbGllbnRUb3AsCgkJCWxlZnQgPSBib3gubGVmdCArIChzZWxmLnBhZ2VYT2Zmc2V0IHx8IGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsTGVmdCB8fCBib2R5LnNjcm9sbExlZnQpIC0gY2xpZW50TGVmdDsKCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OwoJfTsKZWxzZQoJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCkgewoJCXZhciBlbGVtID0gdGhpc1swXTsKCQlpZiAoICFlbGVtIHx8ICFlbGVtLm93bmVyRG9jdW1lbnQgKSByZXR1cm4gbnVsbDsKCQlpZiAoIGVsZW0gPT09IGVsZW0ub3duZXJEb2N1bWVudC5ib2R5ICkgcmV0dXJuIGpRdWVyeS5vZmZzZXQuYm9keU9mZnNldCggZWxlbSApOwoJCWpRdWVyeS5vZmZzZXQuaW5pdGlhbGl6ZSgpOwoKCQl2YXIgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQsIHByZXZPZmZzZXRQYXJlbnQgPSBlbGVtLAoJCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsIGNvbXB1dGVkU3R5bGUsIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50LAoJCQlib2R5ID0gZG9jLmJvZHksIGRlZmF1bHRWaWV3ID0gZG9jLmRlZmF1bHRWaWV3LAoJCQlwcmV2Q29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgbnVsbCksCgkJCXRvcCA9IGVsZW0ub2Zmc2V0VG9wLCBsZWZ0ID0gZWxlbS5vZmZzZXRMZWZ0OwoKCQl3aGlsZSAoIChlbGVtID0gZWxlbS5wYXJlbnROb2RlKSAmJiBlbGVtICE9PSBib2R5ICYmIGVsZW0gIT09IGRvY0VsZW0gKSB7CgkJCWlmICggalF1ZXJ5Lm9mZnNldC5zdXBwb3J0c0ZpeGVkUG9zaXRpb24gJiYgcHJldkNvbXB1dGVkU3R5bGUucG9zaXRpb24gPT09ICJmaXhlZCIgKSBicmVhazsKCQkJY29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgbnVsbCk7CgkJCXRvcCAtPSBlbGVtLnNjcm9sbFRvcCwgbGVmdCAtPSBlbGVtLnNjcm9sbExlZnQ7CgkJCWlmICggZWxlbSA9PT0gb2Zmc2V0UGFyZW50ICkgewoJCQkJdG9wICs9IGVsZW0ub2Zmc2V0VG9wLCBsZWZ0ICs9IGVsZW0ub2Zmc2V0TGVmdDsKCQkJCWlmICggalF1ZXJ5Lm9mZnNldC5kb2VzTm90QWRkQm9yZGVyICYmICEoalF1ZXJ5Lm9mZnNldC5kb2VzQWRkQm9yZGVyRm9yVGFibGVBbmRDZWxscyAmJiAvXnQoYWJsZXxkfGgpJC9pLnRlc3QoZWxlbS50YWdOYW1lKSkgKQoJCQkJCXRvcCAgKz0gcGFyc2VGbG9hdCggY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCAgKSB8fCAwLAoJCQkJCWxlZnQgKz0gcGFyc2VGbG9hdCggY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGggKSB8fCAwOwoJCQkJcHJldk9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudCwgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQ7CgkJCX0KCQkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSAmJiBjb21wdXRlZFN0eWxlLm92ZXJmbG93ICE9PSAidmlzaWJsZSIgKQoJCQkJdG9wICArPSBwYXJzZUZsb2F0KCBjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoICApIHx8IDAsCgkJCQlsZWZ0ICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoICkgfHwgMDsKCQkJcHJldkNvbXB1dGVkU3R5bGUgPSBjb21wdXRlZFN0eWxlOwoJCX0KCgkJaWYgKCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gInJlbGF0aXZlIiB8fCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gInN0YXRpYyIgKQoJCQl0b3AgICs9IGJvZHkub2Zmc2V0VG9wLAoJCQlsZWZ0ICs9IGJvZHkub2Zmc2V0TGVmdDsKCgkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiAmJiBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApCgkJCXRvcCAgKz0gTWF0aC5tYXgoIGRvY0VsZW0uc2Nyb2xsVG9wLCBib2R5LnNjcm9sbFRvcCApLAoJCQlsZWZ0ICs9IE1hdGgubWF4KCBkb2NFbGVtLnNjcm9sbExlZnQsIGJvZHkuc2Nyb2xsTGVmdCApOwoKCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OwoJfTsKCmpRdWVyeS5vZmZzZXQgPSB7Cglpbml0aWFsaXplOiBmdW5jdGlvbigpIHsKCQl2YXIgYm9keSA9IGRvY3VtZW50LmJvZHksIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLCBpbm5lckRpdiwgY2hlY2tEaXYsIHRhYmxlLCB0ZCwgYm9keU1hcmdpblRvcCA9IHBhcnNlRmxvYXQoIGpRdWVyeS5jdXJDU1MoYm9keSwgJ21hcmdpblRvcCcsIHRydWUpICkgfHwgMCwKCQkJaHRtbCA9ICc8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7bWFyZ2luOjA7Ym9yZGVyOjVweCBzb2xpZCAjMDAwO3BhZGRpbmc6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDsiPjxkaXY+PC9kaXY+PC9kaXY+PHRhYmxlIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7bWFyZ2luOjA7Ym9yZGVyOjVweCBzb2xpZCAjMDAwO3BhZGRpbmc6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDsiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+PHRyPjx0ZD48L3RkPjwvdHI+PC90YWJsZT4nOwoKCQlqUXVlcnkuZXh0ZW5kKCBjb250YWluZXIuc3R5bGUsIHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIHRvcDogMCwgbGVmdDogMCwgbWFyZ2luOiAwLCBib3JkZXI6IDAsIHdpZHRoOiAnMXB4JywgaGVpZ2h0OiAnMXB4JywgdmlzaWJpbGl0eTogJ2hpZGRlbicgfSApOwoKCQljb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDsKCQlib2R5Lmluc2VydEJlZm9yZSggY29udGFpbmVyLCBib2R5LmZpcnN0Q2hpbGQgKTsKCQlpbm5lckRpdiA9IGNvbnRhaW5lci5maXJzdENoaWxkLCBjaGVja0RpdiA9IGlubmVyRGl2LmZpcnN0Q2hpbGQsIHRkID0gaW5uZXJEaXYubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkOwoKCQl0aGlzLmRvZXNOb3RBZGRCb3JkZXIgPSAoY2hlY2tEaXYub2Zmc2V0VG9wICE9PSA1KTsKCQl0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzID0gKHRkLm9mZnNldFRvcCA9PT0gNSk7CgoJCWNoZWNrRGl2LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJywgY2hlY2tEaXYuc3R5bGUudG9wID0gJzIwcHgnOwoJCXRoaXMuc3VwcG9ydHNGaXhlZFBvc2l0aW9uID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gMjAgfHwgY2hlY2tEaXYub2Zmc2V0VG9wID09PSAxNSk7IC8vIHNhZmFyaSBzdWJ0cmFjdHMgcGFyZW50IGJvcmRlciB3aWR0aCBoZXJlIHdoaWNoIGlzIDVweAoJCWNoZWNrRGl2LnN0eWxlLnBvc2l0aW9uID0gJycsIGNoZWNrRGl2LnN0eWxlLnRvcCA9ICcnOwoKCQlpbm5lckRpdi5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nLCBpbm5lckRpdi5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7CgkJdGhpcy5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGUgPSAoY2hlY2tEaXYub2Zmc2V0VG9wID09PSAtNSk7CgoJCXRoaXMuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgPSAoYm9keS5vZmZzZXRUb3AgIT09IGJvZHlNYXJnaW5Ub3ApOwoKCQlib2R5LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKCQlqUXVlcnkub2Zmc2V0LmluaXRpYWxpemUgPSBmdW5jdGlvbigpe307CgkJCgkJYm9keSA9IGNvbnRhaW5lciA9IGlubmVyRGl2ID0gY2hlY2tEaXYgPSB0YWJsZSA9IHRkID0gbnVsbDsKCX0sCgoJYm9keU9mZnNldDogZnVuY3Rpb24oYm9keSkgewoJCWpRdWVyeS5vZmZzZXQuaW5pdGlhbGl6ZSgpOwoJCXZhciB0b3AgPSBib2R5Lm9mZnNldFRvcCwgbGVmdCA9IGJvZHkub2Zmc2V0TGVmdDsKCQlpZiAoIGpRdWVyeS5vZmZzZXQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgKQoJCQl0b3AgICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jdXJDU1MoYm9keSwgJ21hcmdpblRvcCcsICB0cnVlKSApIHx8IDAsCgkJCWxlZnQgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmN1ckNTUyhib2R5LCAnbWFyZ2luTGVmdCcsIHRydWUpICkgfHwgMDsKCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OwoJfQp9OwoKCmpRdWVyeS5mbi5leHRlbmQoewoJcG9zaXRpb246IGZ1bmN0aW9uKCkgewoJCWlmICggIXRoaXNbMF0gKSByZXR1cm4gbnVsbDsKCgkJdmFyIGVsZW0gPSB0aGlzWzBdLAoKCQkvLyBHZXQgKnJlYWwqIG9mZnNldFBhcmVudAoJCW9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50KCksCgoJCS8vIEdldCBjb3JyZWN0IG9mZnNldHMKCQlvZmZzZXQgICAgICAgPSB0aGlzLm9mZnNldCgpLAoJCXBhcmVudE9mZnNldCA9IC9eYm9keXxodG1sJC9pLnRlc3Qob2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUpID8geyB0b3A6IDAsIGxlZnQ6IDAgfSA6IG9mZnNldFBhcmVudC5vZmZzZXQoKTsKCgkJLy8gU3VidHJhY3QgZWxlbWVudCBtYXJnaW5zCgkJLy8gbm90ZTogd2hlbiBhbiBlbGVtZW50IGhhcyBtYXJnaW46IGF1dG8gdGhlIG9mZnNldExlZnQgYW5kIG1hcmdpbkxlZnQKCQkvLyBhcmUgdGhlIHNhbWUgaW4gU2FmYXJpIGNhdXNpbmcgb2Zmc2V0LmxlZnQgdG8gaW5jb3JyZWN0bHkgYmUgMAoJCW9mZnNldC50b3AgIC09IHBhcnNlRmxvYXQoIGpRdWVyeS5jdXJDU1MoZWxlbSwgJ21hcmdpblRvcCcsICB0cnVlKSApIHx8IDA7CgkJb2Zmc2V0LmxlZnQgLT0gcGFyc2VGbG9hdCggalF1ZXJ5LmN1ckNTUyhlbGVtLCAnbWFyZ2luTGVmdCcsIHRydWUpICkgfHwgMDsKCgkJLy8gQWRkIG9mZnNldFBhcmVudCBib3JkZXJzCgkJcGFyZW50T2Zmc2V0LnRvcCAgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmN1ckNTUyhvZmZzZXRQYXJlbnRbMF0sICdib3JkZXJUb3BXaWR0aCcsICB0cnVlKSApIHx8IDA7CgkJcGFyZW50T2Zmc2V0LmxlZnQgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmN1ckNTUyhvZmZzZXRQYXJlbnRbMF0sICdib3JkZXJMZWZ0V2lkdGgnLCB0cnVlKSApIHx8IDA7CgoJCS8vIFN1YnRyYWN0IHRoZSB0d28gb2Zmc2V0cwoJCXJldHVybiB7CgkJCXRvcDogIG9mZnNldC50b3AgIC0gcGFyZW50T2Zmc2V0LnRvcCwKCQkJbGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdAoJCX07Cgl9LAoKCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7CgkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXNbMF0ub2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50LmJvZHk7CgkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgKCEvXmJvZHl8aHRtbCQvaS50ZXN0KG9mZnNldFBhcmVudC50YWdOYW1lKSAmJiBqUXVlcnkuY3NzKG9mZnNldFBhcmVudCwgJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSApCgkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7CgkJcmV0dXJuIGpRdWVyeSggb2Zmc2V0UGFyZW50ICk7Cgl9Cn0pOwoKCi8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kcwpqUXVlcnkuZWFjaCggWydMZWZ0JywgJ1RvcCddLCBmdW5jdGlvbihpLCBuYW1lKSB7Cgl2YXIgbWV0aG9kID0gJ3Njcm9sbCcgKyBuYW1lOwoKCWpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbih2YWwpIHsKCQlpZiAoICF0aGlzWzBdICkgcmV0dXJuIG51bGw7CgkJCgkJdmFyIGVsZW0gPSB0aGlzWzBdLCB3aW4gPSAoInNjcm9sbFRvIiBpbiBlbGVtICYmIGVsZW0uZG9jdW1lbnQpID8gZWxlbSA6CgkJCShlbGVtLm5vZGVOYW1lID09PSAiI2RvY3VtZW50IikgPyBlbGVtLmRlZmF1bHRWaWV3IHx8IGVsZW0ucGFyZW50V2luZG93IDoKCQkJCWZhbHNlOwoKCQlyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgPwoKCQkJLy8gU2V0IHRoZSBzY3JvbGwgb2Zmc2V0CgkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCXdpbiA9ICgic2Nyb2xsVG8iIGluIHRoaXMgJiYgdGhpcy5kb2N1bWVudCkgPyB0aGlzIDogCgkJCQkJKHRoaXMubm9kZU5hbWUgPT09ICIjZG9jdW1lbnQiKSA/IHRoaXMuZGVmYXVsdFZpZXcgfHwgdGhpcy5wYXJlbnRXaW5kb3cgOgoJCQkJCQlmYWxzZTsKCQkJCQoJCQkJd2luID8KCQkJCQl3aW4uc2Nyb2xsVG8oCgkJCQkJCSFpID8gdmFsIDogalF1ZXJ5KHdpbikuc2Nyb2xsTGVmdCgpLAoJCQkJCQkgaSA/IHZhbCA6IGpRdWVyeSh3aW4pLnNjcm9sbFRvcCgpCgkJCQkJKSA6CgkJCQkJdGhpc1sgbWV0aG9kIF0gPSB2YWw7CgkJCX0pIDoKCgkJCS8vIFJldHVybiB0aGUgc2Nyb2xsIG9mZnNldAoJCQl3aW4gPwoJCQkJd2luWyBpID8gJ3BhZ2VZT2Zmc2V0JyA6ICdwYWdlWE9mZnNldCcgXSB8fAoJCQkJCWpRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIG1ldGhvZCBdIHx8CgkJCQkJd2luLmRvY3VtZW50LmJvZHlbIG1ldGhvZCBdIDoKCQkJCWVsZW1bIG1ldGhvZCBdOwoJfTsKfSk7Ci8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcwpqUXVlcnkuZWFjaChbICJIZWlnaHQiLCAiV2lkdGgiIF0sIGZ1bmN0aW9uKGksIG5hbWUpewoKCXZhciB0eXBlID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKCS8vIGlubmVySGVpZ2h0IGFuZCBpbm5lcldpZHRoCglqUXVlcnkuZm5bImlubmVyIiArIG5hbWVdID0gZnVuY3Rpb24oKXsKCQlyZXR1cm4gdGhpc1swXSA/CgkJCWpRdWVyeS5jc3MoIHRoaXNbMF0sIHR5cGUsIGZhbHNlLCAicGFkZGluZyIgKSA6CgkJCW51bGw7Cgl9OwoKCS8vIG91dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRoCglqUXVlcnkuZm5bIm91dGVyIiArIG5hbWVdID0gZnVuY3Rpb24obWFyZ2luKSB7CgkJcmV0dXJuIHRoaXNbMF0gPwoJCQlqUXVlcnkuY3NzKCB0aGlzWzBdLCB0eXBlLCBmYWxzZSwgbWFyZ2luID8gIm1hcmdpbiIgOiAiYm9yZGVyIiApIDoKCQkJbnVsbDsKCX07CgoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggc2l6ZSApIHsKCQkvLyBHZXQgd2luZG93IHdpZHRoIG9yIGhlaWdodAoJCXZhciBlbGVtID0gdGhpc1swXTsKCQlpZiAoICFlbGVtICkgcmV0dXJuIG51bGw7CgkJcmV0dXJuICgic2Nyb2xsVG8iIGluIGVsZW0gJiYgZWxlbS5kb2N1bWVudCkgPyAvLyBkb2VzIGl0IHdhbGsgYW5kIHF1YWNrIGxpa2UgYSB3aW5kb3c/CgkJCS8vIEV2ZXJ5b25lIGVsc2UgdXNlIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCBvciBkb2N1bWVudC5ib2R5IGRlcGVuZGluZyBvbiBRdWlya3MgdnMgU3RhbmRhcmRzIG1vZGUKCQkJZWxlbS5kb2N1bWVudC5jb21wYXRNb2RlID09PSAiQ1NTMUNvbXBhdCIgJiYgZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdIHx8CgkJCWVsZW0uZG9jdW1lbnQuYm9keVsgImNsaWVudCIgKyBuYW1lIF0gOgoKCQkJLy8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodAoJCQkoZWxlbS5ub2RlTmFtZSA9PT0gIiNkb2N1bWVudCIpID8gLy8gaXMgaXQgYSBkb2N1bWVudAoJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdLCB3aGljaGV2ZXIgaXMgZ3JlYXRlcgoJCQkJTWF0aC5tYXgoCgkJCQkJZWxlbS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIgKyBuYW1lXSwKCQkJCQllbGVtLmJvZHlbInNjcm9sbCIgKyBuYW1lXSwgZWxlbS5kb2N1bWVudEVsZW1lbnRbInNjcm9sbCIgKyBuYW1lXSwKCQkJCQllbGVtLmJvZHlbIm9mZnNldCIgKyBuYW1lXSwgZWxlbS5kb2N1bWVudEVsZW1lbnRbIm9mZnNldCIgKyBuYW1lXQoJCQkJKSA6CgoJCQkJLy8gR2V0IG9yIHNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCXNpemUgPT09IHVuZGVmaW5lZCA/CgkJCQkJLy8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudAoJCQkJCWpRdWVyeS5jc3MoIGVsZW0sIHR5cGUgKSA6CgoJCQkJCS8vIFNldCB0aGUgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50IChkZWZhdWx0IHRvIHBpeGVscyBpZiB2YWx1ZSBpcyB1bml0bGVzcykKCQkJCQl0aGlzLmNzcyggdHlwZSwgdHlwZW9mIHNpemUgPT09ICJzdHJpbmciID8gc2l6ZSA6IHNpemUgKyAicHgiICk7Cgl9OwoKfSk7Cn0pKHdpbmRvdyk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/jquery-1.7.1.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSB2MS43LjEganF1ZXJ5LmNvbSB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLwooZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjeShhKXtyZXR1cm4gZi5pc1dpbmRvdyhhKT9hOmEubm9kZVR5cGU9PT05P2EuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93OiExfWZ1bmN0aW9uIGN2KGEpe2lmKCFja1thXSl7dmFyIGI9Yy5ib2R5LGQ9ZigiPCIrYSsiPiIpLmFwcGVuZFRvKGIpLGU9ZC5jc3MoImRpc3BsYXkiKTtkLnJlbW92ZSgpO2lmKGU9PT0ibm9uZSJ8fGU9PT0iIil7Y2x8fChjbD1jLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGNsLmZyYW1lQm9yZGVyPWNsLndpZHRoPWNsLmhlaWdodD0wKSxiLmFwcGVuZENoaWxkKGNsKTtpZighY218fCFjbC5jcmVhdGVFbGVtZW50KWNtPShjbC5jb250ZW50V2luZG93fHxjbC5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LGNtLndyaXRlKChjLmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCI/IjwhZG9jdHlwZSBodG1sPiI6IiIpKyI8aHRtbD48Ym9keT4iKSxjbS5jbG9zZSgpO2Q9Y20uY3JlYXRlRWxlbWVudChhKSxjbS5ib2R5LmFwcGVuZENoaWxkKGQpLGU9Zi5jc3MoZCwiZGlzcGxheSIpLGIucmVtb3ZlQ2hpbGQoY2wpfWNrW2FdPWV9cmV0dXJuIGNrW2FdfWZ1bmN0aW9uIGN1KGEsYil7dmFyIGM9e307Zi5lYWNoKGNxLmNvbmNhdC5hcHBseShbXSxjcS5zbGljZSgwLGIpKSxmdW5jdGlvbigpe2NbdGhpc109YX0pO3JldHVybiBjfWZ1bmN0aW9uIGN0KCl7Y3I9Yn1mdW5jdGlvbiBjcygpe3NldFRpbWVvdXQoY3QsMCk7cmV0dXJuIGNyPWYubm93KCl9ZnVuY3Rpb24gY2ooKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1mdW5jdGlvbiBjaSgpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiBjYyhhLGMpe2EuZGF0YUZpbHRlciYmKGM9YS5kYXRhRmlsdGVyKGMsYS5kYXRhVHlwZSkpO3ZhciBkPWEuZGF0YVR5cGVzLGU9e30sZyxoLGk9ZC5sZW5ndGgsaixrPWRbMF0sbCxtLG4sbyxwO2ZvcihnPTE7ZzxpO2crKyl7aWYoZz09PTEpZm9yKGggaW4gYS5jb252ZXJ0ZXJzKXR5cGVvZiBoPT0ic3RyaW5nIiYmKGVbaC50b0xvd2VyQ2FzZSgpXT1hLmNvbnZlcnRlcnNbaF0pO2w9ayxrPWRbZ107aWYoaz09PSIqIilrPWw7ZWxzZSBpZihsIT09IioiJiZsIT09ayl7bT1sKyIgIitrLG49ZVttXXx8ZVsiKiAiK2tdO2lmKCFuKXtwPWI7Zm9yKG8gaW4gZSl7aj1vLnNwbGl0KCIgIik7aWYoalswXT09PWx8fGpbMF09PT0iKiIpe3A9ZVtqWzFdKyIgIitrXTtpZihwKXtvPWVbb10sbz09PSEwP249cDpwPT09ITAmJihuPW8pO2JyZWFrfX19fSFuJiYhcCYmZi5lcnJvcigiTm8gY29udmVyc2lvbiBmcm9tICIrbS5yZXBsYWNlKCIgIiwiIHRvICIpKSxuIT09ITAmJihjPW4/bihjKTpwKG8oYykpKX19cmV0dXJuIGN9ZnVuY3Rpb24gY2IoYSxjLGQpe3ZhciBlPWEuY29udGVudHMsZj1hLmRhdGFUeXBlcyxnPWEucmVzcG9uc2VGaWVsZHMsaCxpLGosaztmb3IoaSBpbiBnKWkgaW4gZCYmKGNbZ1tpXV09ZFtpXSk7d2hpbGUoZlswXT09PSIqIilmLnNoaWZ0KCksaD09PWImJihoPWEubWltZVR5cGV8fGMuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpKTtpZihoKWZvcihpIGluIGUpaWYoZVtpXSYmZVtpXS50ZXN0KGgpKXtmLnVuc2hpZnQoaSk7YnJlYWt9aWYoZlswXWluIGQpaj1mWzBdO2Vsc2V7Zm9yKGkgaW4gZCl7aWYoIWZbMF18fGEuY29udmVydGVyc1tpKyIgIitmWzBdXSl7aj1pO2JyZWFrfWt8fChrPWkpfWo9anx8a31pZihqKXtqIT09ZlswXSYmZi51bnNoaWZ0KGopO3JldHVybiBkW2pdfX1mdW5jdGlvbiBjYShhLGIsYyxkKXtpZihmLmlzQXJyYXkoYikpZi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxiRS50ZXN0KGEpP2QoYSxlKTpjYShhKyJbIisodHlwZW9mIGU9PSJvYmplY3QifHxmLmlzQXJyYXkoZSk/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoIWMmJmIhPW51bGwmJnR5cGVvZiBiPT0ib2JqZWN0Iilmb3IodmFyIGUgaW4gYiljYShhKyJbIitlKyJdIixiW2VdLGMsZCk7ZWxzZSBkKGEsYil9ZnVuY3Rpb24gYl8oYSxjKXt2YXIgZCxlLGc9Zi5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGMpY1tkXSE9PWImJigoZ1tkXT9hOmV8fChlPXt9KSlbZF09Y1tkXSk7ZSYmZi5leHRlbmQoITAsYSxlKX1mdW5jdGlvbiBiJChhLGMsZCxlLGYsZyl7Zj1mfHxjLmRhdGFUeXBlc1swXSxnPWd8fHt9LGdbZl09ITA7dmFyIGg9YVtmXSxpPTAsaj1oP2gubGVuZ3RoOjAsaz1hPT09YlQsbDtmb3IoO2k8aiYmKGt8fCFsKTtpKyspbD1oW2ldKGMsZCxlKSx0eXBlb2YgbD09InN0cmluZyImJigha3x8Z1tsXT9sPWI6KGMuZGF0YVR5cGVzLnVuc2hpZnQobCksbD1iJChhLGMsZCxlLGwsZykpKTsoa3x8IWwpJiYhZ1siKiJdJiYobD1iJChhLGMsZCxlLCIqIixnKSk7cmV0dXJuIGx9ZnVuY3Rpb24gYlooYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7dHlwZW9mIGIhPSJzdHJpbmciJiYoYz1iLGI9IioiKTtpZihmLmlzRnVuY3Rpb24oYykpe3ZhciBkPWIudG9Mb3dlckNhc2UoKS5zcGxpdChiUCksZT0wLGc9ZC5sZW5ndGgsaCxpLGo7Zm9yKDtlPGc7ZSsrKWg9ZFtlXSxqPS9eXCsvLnRlc3QoaCksaiYmKGg9aC5zdWJzdHIoMSl8fCIqIiksaT1hW2hdPWFbaF18fFtdLGlbaj8idW5zaGlmdCI6InB1c2giXShjKX19fWZ1bmN0aW9uIGJDKGEsYixjKXt2YXIgZD1iPT09IndpZHRoIj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0LGU9Yj09PSJ3aWR0aCI/Yng6YnksZz0wLGg9ZS5sZW5ndGg7aWYoZD4wKXtpZihjIT09ImJvcmRlciIpZm9yKDtnPGg7ZysrKWN8fChkLT1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK2VbZ10pKXx8MCksYz09PSJtYXJnaW4iP2QrPXBhcnNlRmxvYXQoZi5jc3MoYSxjK2VbZ10pKXx8MDpkLT1wYXJzZUZsb2F0KGYuY3NzKGEsImJvcmRlciIrZVtnXSsiV2lkdGgiKSl8fDA7cmV0dXJuIGQrInB4In1kPWJ6KGEsYixiKTtpZihkPDB8fGQ9PW51bGwpZD1hLnN0eWxlW2JdfHwwO2Q9cGFyc2VGbG9hdChkKXx8MDtpZihjKWZvcig7ZzxoO2crKylkKz1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK2VbZ10pKXx8MCxjIT09InBhZGRpbmciJiYoZCs9cGFyc2VGbG9hdChmLmNzcyhhLCJib3JkZXIiK2VbZ10rIldpZHRoIikpfHwwKSxjPT09Im1hcmdpbiImJihkKz1wYXJzZUZsb2F0KGYuY3NzKGEsYytlW2ddKSl8fDApO3JldHVybiBkKyJweCJ9ZnVuY3Rpb24gYnAoYSxiKXtiLnNyYz9mLmFqYXgoe3VybDpiLnNyYyxhc3luYzohMSxkYXRhVHlwZToic2NyaXB0In0pOmYuZ2xvYmFsRXZhbCgoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpLnJlcGxhY2UoYmYsIi8qJDAqLyIpKSxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBibyhhKXt2YXIgYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2JoLmFwcGVuZENoaWxkKGIpLGIuaW5uZXJIVE1MPWEub3V0ZXJIVE1MO3JldHVybiBiLmZpcnN0Q2hpbGR9ZnVuY3Rpb24gYm4oYSl7dmFyIGI9KGEubm9kZU5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpO2I9PT0iaW5wdXQiP2JtKGEpOmIhPT0ic2NyaXB0IiYmdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiZmLmdyZXAoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxibSl9ZnVuY3Rpb24gYm0oYSl7aWYoYS50eXBlPT09ImNoZWNrYm94Inx8YS50eXBlPT09InJhZGlvIilhLmRlZmF1bHRDaGVja2VkPWEuY2hlY2tlZH1mdW5jdGlvbiBibChhKXtyZXR1cm4gdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTp0eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsIT0idW5kZWZpbmVkIj9hLnF1ZXJ5U2VsZWN0b3JBbGwoIioiKTpbXX1mdW5jdGlvbiBiayhhLGIpe3ZhciBjO2lmKGIubm9kZVR5cGU9PT0xKXtiLmNsZWFyQXR0cmlidXRlcyYmYi5jbGVhckF0dHJpYnV0ZXMoKSxiLm1lcmdlQXR0cmlidXRlcyYmYi5tZXJnZUF0dHJpYnV0ZXMoYSksYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoYz09PSJvYmplY3QiKWIub3V0ZXJIVE1MPWEub3V0ZXJIVE1MO2Vsc2UgaWYoYyE9PSJpbnB1dCJ8fGEudHlwZSE9PSJjaGVja2JveCImJmEudHlwZSE9PSJyYWRpbyIpe2lmKGM9PT0ib3B0aW9uIiliLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkO2Vsc2UgaWYoYz09PSJpbnB1dCJ8fGM9PT0idGV4dGFyZWEiKWIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlfWVsc2UgYS5jaGVja2VkJiYoYi5kZWZhdWx0Q2hlY2tlZD1iLmNoZWNrZWQ9YS5jaGVja2VkKSxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSk7Yi5yZW1vdmVBdHRyaWJ1dGUoZi5leHBhbmRvKX19ZnVuY3Rpb24gYmooYSxiKXtpZihiLm5vZGVUeXBlPT09MSYmISFmLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxnPWYuX2RhdGEoYSksaD1mLl9kYXRhKGIsZyksaT1nLmV2ZW50cztpZihpKXtkZWxldGUgaC5oYW5kbGUsaC5ldmVudHM9e307Zm9yKGMgaW4gaSlmb3IoZD0wLGU9aVtjXS5sZW5ndGg7ZDxlO2QrKylmLmV2ZW50LmFkZChiLGMrKGlbY11bZF0ubmFtZXNwYWNlPyIuIjoiIikraVtjXVtkXS5uYW1lc3BhY2UsaVtjXVtkXSxpW2NdW2RdLmRhdGEpfWguZGF0YSYmKGguZGF0YT1mLmV4dGVuZCh7fSxoLmRhdGEpKX19ZnVuY3Rpb24gYmkoYSxiKXtyZXR1cm4gZi5ub2RlTmFtZShhLCJ0YWJsZSIpP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmF9ZnVuY3Rpb24gVShhKXt2YXIgYj1WLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfWZ1bmN0aW9uIFQoYSxiLGMpe2I9Ynx8MDtpZihmLmlzRnVuY3Rpb24oYikpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7dmFyIGU9ISFiLmNhbGwoYSxkLGEpO3JldHVybiBlPT09Y30pO2lmKGIubm9kZVR5cGUpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuIGE9PT1iPT09Y30pO2lmKHR5cGVvZiBiPT0ic3RyaW5nIil7dmFyIGQ9Zi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZVR5cGU9PT0xfSk7aWYoTy50ZXN0KGIpKXJldHVybiBmLmZpbHRlcihiLGQsIWMpO2I9Zi5maWx0ZXIoYixkKX1yZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gZi5pbkFycmF5KGEsYik+PTA9PT1jfSl9ZnVuY3Rpb24gUyhhKXtyZXR1cm4hYXx8IWEucGFyZW50Tm9kZXx8YS5wYXJlbnROb2RlLm5vZGVUeXBlPT09MTF9ZnVuY3Rpb24gSygpe3JldHVybiEwfWZ1bmN0aW9uIEooKXtyZXR1cm4hMX1mdW5jdGlvbiBuKGEsYixjKXt2YXIgZD1iKyJkZWZlciIsZT1iKyJxdWV1ZSIsZz1iKyJtYXJrIixoPWYuX2RhdGEoYSxkKTtoJiYoYz09PSJxdWV1ZSJ8fCFmLl9kYXRhKGEsZSkpJiYoYz09PSJtYXJrInx8IWYuX2RhdGEoYSxnKSkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXshZi5fZGF0YShhLGUpJiYhZi5fZGF0YShhLGcpJiYoZi5yZW1vdmVEYXRhKGEsZCwhMCksaC5maXJlKCkpfSwwKX1mdW5jdGlvbiBtKGEpe2Zvcih2YXIgYiBpbiBhKXtpZihiPT09ImRhdGEiJiZmLmlzRW1wdHlPYmplY3QoYVtiXSkpY29udGludWU7aWYoYiE9PSJ0b0pTT04iKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGwoYSxjLGQpe2lmKGQ9PT1iJiZhLm5vZGVUeXBlPT09MSl7dmFyIGU9ImRhdGEtIitjLnJlcGxhY2UoaywiLSQxIikudG9Mb3dlckNhc2UoKTtkPWEuZ2V0QXR0cmlidXRlKGUpO2lmKHR5cGVvZiBkPT0ic3RyaW5nIil7dHJ5e2Q9ZD09PSJ0cnVlIj8hMDpkPT09ImZhbHNlIj8hMTpkPT09Im51bGwiP251bGw6Zi5pc051bWVyaWMoZCk/cGFyc2VGbG9hdChkKTpqLnRlc3QoZCk/Zi5wYXJzZUpTT04oZCk6ZH1jYXRjaChnKXt9Zi5kYXRhKGEsYyxkKX1lbHNlIGQ9Yn1yZXR1cm4gZH1mdW5jdGlvbiBoKGEpe3ZhciBiPWdbYV09e30sYyxkO2E9YS5zcGxpdCgvXHMrLyk7Zm9yKGM9MCxkPWEubGVuZ3RoO2M8ZDtjKyspYlthW2NdXT0hMDtyZXR1cm4gYn12YXIgYz1hLmRvY3VtZW50LGQ9YS5uYXZpZ2F0b3IsZT1hLmxvY2F0aW9uLGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBKKCl7aWYoIWUuaXNSZWFkeSl7dHJ5e2MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7c2V0VGltZW91dChKLDEpO3JldHVybn1lLnJlYWR5KCl9fXZhciBlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBlLmZuLmluaXQoYSxiLGgpfSxmPWEualF1ZXJ5LGc9YS4kLGgsaT0vXig/OlteIzxdKig8W1x3XFddKz4pW14+XSokfCMoW1x3XC1dKikkKS8saj0vXFMvLGs9L15ccysvLGw9L1xzKyQvLG09L148KFx3KylccypcLz8+KD86PFwvXDE+KT8kLyxuPS9eW1xdLDp7fVxzXSokLyxvPS9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2cscD0vIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2cscT0vKD86Xnw6fCwpKD86XHMqXFspKy9nLHI9Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8scz0vKG9wZXJhKSg/Oi4qdmVyc2lvbik/WyBcL10oW1x3Ll0rKS8sdD0vKG1zaWUpIChbXHcuXSspLyx1PS8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sdj0vLShbYS16XXxbMC05XSkvaWcsdz0vXi1tcy0vLHg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYisiIikudG9VcHBlckNhc2UoKX0seT1kLnVzZXJBZ2VudCx6LEEsQixDPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsRD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEU9QXJyYXkucHJvdG90eXBlLnB1c2gsRj1BcnJheS5wcm90b3R5cGUuc2xpY2UsRz1TdHJpbmcucHJvdG90eXBlLnRyaW0sSD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZixJPXt9O2UuZm49ZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmUsaW5pdDpmdW5jdGlvbihhLGQsZil7dmFyIGcsaCxqLGs7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSl7dGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKGE9PT0iYm9keSImJiFkJiZjLmJvZHkpe3RoaXMuY29udGV4dD1jLHRoaXNbMF09Yy5ib2R5LHRoaXMuc2VsZWN0b3I9YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT0ic3RyaW5nIil7YS5jaGFyQXQoMCkhPT0iPCJ8fGEuY2hhckF0KGEubGVuZ3RoLTEpIT09Ij4ifHxhLmxlbmd0aDwzP2c9aS5leGVjKGEpOmc9W251bGwsYSxudWxsXTtpZihnJiYoZ1sxXXx8IWQpKXtpZihnWzFdKXtkPWQgaW5zdGFuY2VvZiBlP2RbMF06ZCxrPWQ/ZC5vd25lckRvY3VtZW50fHxkOmMsaj1tLmV4ZWMoYSksaj9lLmlzUGxhaW5PYmplY3QoZCk/KGE9W2MuY3JlYXRlRWxlbWVudChqWzFdKV0sZS5mbi5hdHRyLmNhbGwoYSxkLCEwKSk6YT1bay5jcmVhdGVFbGVtZW50KGpbMV0pXTooaj1lLmJ1aWxkRnJhZ21lbnQoW2dbMV1dLFtrXSksYT0oai5jYWNoZWFibGU/ZS5jbG9uZShqLmZyYWdtZW50KTpqLmZyYWdtZW50KS5jaGlsZE5vZGVzKTtyZXR1cm4gZS5tZXJnZSh0aGlzLGEpfWg9Yy5nZXRFbGVtZW50QnlJZChnWzJdKTtpZihoJiZoLnBhcmVudE5vZGUpe2lmKGguaWQhPT1nWzJdKXJldHVybiBmLmZpbmQoYSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPWh9dGhpcy5jb250ZXh0PWMsdGhpcy5zZWxlY3Rvcj1hO3JldHVybiB0aGlzfXJldHVybiFkfHxkLmpxdWVyeT8oZHx8ZikuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGQpLmZpbmQoYSl9aWYoZS5pc0Z1bmN0aW9uKGEpKXJldHVybiBmLnJlYWR5KGEpO2Euc2VsZWN0b3IhPT1iJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpO3JldHVybiBlLm1ha2VBcnJheShhLHRoaXMpfSxzZWxlY3RvcjoiIixqcXVlcnk6IjEuNy4xIixsZW5ndGg6MCxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIEYuY2FsbCh0aGlzLDApfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/dGhpcy50b0FycmF5KCk6YTwwP3RoaXNbdGhpcy5sZW5ndGgrYV06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLmNvbnN0cnVjdG9yKCk7ZS5pc0FycmF5KGEpP0UuYXBwbHkoZCxhKTplLm1lcmdlKGQsYSksZC5wcmV2T2JqZWN0PXRoaXMsZC5jb250ZXh0PXRoaXMuY29udGV4dCxiPT09ImZpbmQiP2Quc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhpcy5zZWxlY3Rvcj8iICI6IiIpK2M6YiYmKGQuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrYisiKCIrYysiKSIpO3JldHVybiBkfSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGUuZWFjaCh0aGlzLGEsYil9LHJlYWR5OmZ1bmN0aW9uKGEpe2UuYmluZFJlYWR5KCksQS5hZGQoYSk7cmV0dXJuIHRoaXN9LGVxOmZ1bmN0aW9uKGEpe2E9K2E7cmV0dXJuIGE9PT0tMT90aGlzLnNsaWNlKGEpOnRoaXMuc2xpY2UoYSxhKzEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhGLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwic2xpY2UiLEYuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOkUsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9LGUuZm4uaW5pdC5wcm90b3R5cGU9ZS5mbixlLmV4dGVuZD1lLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGMsZCxmLGcsaCxpPWFyZ3VtZW50c1swXXx8e30saj0xLGs9YXJndW1lbnRzLmxlbmd0aCxsPSExO3R5cGVvZiBpPT0iYm9vbGVhbiImJihsPWksaT1hcmd1bWVudHNbMV18fHt9LGo9MiksdHlwZW9mIGkhPSJvYmplY3QiJiYhZS5pc0Z1bmN0aW9uKGkpJiYoaT17fSksaz09PWomJihpPXRoaXMsLS1qKTtmb3IoO2o8aztqKyspaWYoKGE9YXJndW1lbnRzW2pdKSE9bnVsbClmb3IoYyBpbiBhKXtkPWlbY10sZj1hW2NdO2lmKGk9PT1mKWNvbnRpbnVlO2wmJmYmJihlLmlzUGxhaW5PYmplY3QoZil8fChnPWUuaXNBcnJheShmKSkpPyhnPyhnPSExLGg9ZCYmZS5pc0FycmF5KGQpP2Q6W10pOmg9ZCYmZS5pc1BsYWluT2JqZWN0KGQpP2Q6e30saVtjXT1lLmV4dGVuZChsLGgsZikpOmYhPT1iJiYoaVtjXT1mKX1yZXR1cm4gaX0sZS5leHRlbmQoe25vQ29uZmxpY3Q6ZnVuY3Rpb24oYil7YS4kPT09ZSYmKGEuJD1nKSxiJiZhLmpRdWVyeT09PWUmJihhLmpRdWVyeT1mKTtyZXR1cm4gZX0saXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9lLnJlYWR5V2FpdCsrOmUucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITAmJiEtLWUucmVhZHlXYWl0fHxhIT09ITAmJiFlLmlzUmVhZHkpe2lmKCFjLmJvZHkpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtlLmlzUmVhZHk9ITA7aWYoYSE9PSEwJiYtLWUucmVhZHlXYWl0PjApcmV0dXJuO0EuZmlyZVdpdGgoYyxbZV0pLGUuZm4udHJpZ2dlciYmZShjKS50cmlnZ2VyKCJyZWFkeSIpLm9mZigicmVhZHkiKX19LGJpbmRSZWFkeTpmdW5jdGlvbigpe2lmKCFBKXtBPWUuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpO2lmKGMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtpZihjLmFkZEV2ZW50TGlzdGVuZXIpYy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUucmVhZHksITEpO2Vsc2UgaWYoYy5hdHRhY2hFdmVudCl7Yy5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLGUucmVhZHkpO3ZhciBiPSExO3RyeXtiPWEuZnJhbWVFbGVtZW50PT1udWxsfWNhdGNoKGQpe31jLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmYiYmSigpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJmdW5jdGlvbiJ9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJhcnJheSJ9LGlzV2luZG93OmZ1bmN0aW9uKGEpe3JldHVybiBhJiZ0eXBlb2YgYT09Im9iamVjdCImJiJzZXRJbnRlcnZhbCJpbiBhfSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoYSkpJiZpc0Zpbml0ZShhKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD9TdHJpbmcoYSk6SVtDLmNhbGwoYSldfHwib2JqZWN0In0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXtpZighYXx8ZS50eXBlKGEpIT09Im9iamVjdCJ8fGEubm9kZVR5cGV8fGUuaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFELmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIUQuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfXZhciBkO2ZvcihkIGluIGEpO3JldHVybiBkPT09Ynx8RC5jYWxsKGEsZCl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIGEpcmV0dXJuITE7cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcihhKX0scGFyc2VKU09OOmZ1bmN0aW9uKGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nInx8IWIpcmV0dXJuIG51bGw7Yj1lLnRyaW0oYik7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKTtpZihuLnRlc3QoYi5yZXBsYWNlKG8sIkAiKS5yZXBsYWNlKHAsIl0iKS5yZXBsYWNlKHEsIiIpKSlyZXR1cm4obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiKSkoKTtlLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LHBhcnNlWE1MOmZ1bmN0aW9uKGMpe3ZhciBkLGY7dHJ5e2EuRE9NUGFyc2VyPyhmPW5ldyBET01QYXJzZXIsZD1mLnBhcnNlRnJvbVN0cmluZyhjLCJ0ZXh0L3htbCIpKTooZD1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGQuYXN5bmM9ImZhbHNlIixkLmxvYWRYTUwoYykpfWNhdGNoKGcpe2Q9Yn0oIWR8fCFkLmRvY3VtZW50RWxlbWVudHx8ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGgpJiZlLmVycm9yKCJJbnZhbGlkIFhNTDogIitjKTtyZXR1cm4gZH0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZqLnRlc3QoYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UodywibXMtIikucmVwbGFjZSh2LHgpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT1iLnRvVXBwZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGc9MCxoPWEubGVuZ3RoLGk9aD09PWJ8fGUuaXNGdW5jdGlvbihhKTtpZihkKXtpZihpKXtmb3IoZiBpbiBhKWlmKGMuYXBwbHkoYVtmXSxkKT09PSExKWJyZWFrfWVsc2UgZm9yKDtnPGg7KWlmKGMuYXBwbHkoYVtnKytdLGQpPT09ITEpYnJlYWt9ZWxzZSBpZihpKXtmb3IoZiBpbiBhKWlmKGMuY2FsbChhW2ZdLGYsYVtmXSk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmNhbGwoYVtnXSxnLGFbZysrXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpHP2Z1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOkcuY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6KGErIiIpLnJlcGxhY2UoaywiIikucmVwbGFjZShsLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107aWYoYSE9bnVsbCl7dmFyIGQ9ZS50eXBlKGEpO2EubGVuZ3RoPT1udWxsfHxkPT09InN0cmluZyJ8fGQ9PT0iZnVuY3Rpb24ifHxkPT09InJlZ2V4cCJ8fGUuaXNXaW5kb3coYSk/RS5jYWxsKGMsYSk6ZS5tZXJnZShjLGEpfXJldHVybiBjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihIKXJldHVybiBILmNhbGwoYixhLGMpO2Q9Yi5sZW5ndGgsYz1jP2M8MD9NYXRoLm1heCgwLGQrYyk6YzowO2Zvcig7YzxkO2MrKylpZihjIGluIGImJmJbY109PT1hKXJldHVybiBjfXJldHVybi0xfSxtZXJnZTpmdW5jdGlvbihhLGMpe3ZhciBkPWEubGVuZ3RoLGU9MDtpZih0eXBlb2YgYy5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZj1jLmxlbmd0aDtlPGY7ZSsrKWFbZCsrXT1jW2VdO2Vsc2Ugd2hpbGUoY1tlXSE9PWIpYVtkKytdPWNbZSsrXTthLmxlbmd0aD1kO3JldHVybiBhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlO2M9ISFjO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGg7ZjxnO2YrKyllPSEhYihhW2ZdLGYpLGMhPT1lJiZkLnB1c2goYVtmXSk7cmV0dXJuIGR9LG1hcDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoPVtdLGk9MCxqPWEubGVuZ3RoLGs9YSBpbnN0YW5jZW9mIGV8fGohPT1iJiZ0eXBlb2Ygaj09Im51bWJlciImJihqPjAmJmFbMF0mJmFbai0xXXx8aj09PTB8fGUuaXNBcnJheShhKSk7aWYoaylmb3IoO2k8ajtpKyspZj1jKGFbaV0saSxkKSxmIT1udWxsJiYoaFtoLmxlbmd0aF09Zik7ZWxzZSBmb3IoZyBpbiBhKWY9YyhhW2ddLGcsZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO3JldHVybiBoLmNvbmNhdC5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYyl7aWYodHlwZW9mIGM9PSJzdHJpbmciKXt2YXIgZD1hW2NdO2M9YSxhPWR9aWYoIWUuaXNGdW5jdGlvbihhKSlyZXR1cm4gYjt2YXIgZj1GLmNhbGwoYXJndW1lbnRzLDIpLGc9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShjLGYuY29uY2F0KEYuY2FsbChhcmd1bWVudHMpKSl9O2cuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxnLmd1aWR8fGUuZ3VpZCsrO3JldHVybiBnfSxhY2Nlc3M6ZnVuY3Rpb24oYSxjLGQsZixnLGgpe3ZhciBpPWEubGVuZ3RoO2lmKHR5cGVvZiBjPT0ib2JqZWN0Iil7Zm9yKHZhciBqIGluIGMpZS5hY2Nlc3MoYSxqLGNbal0sZixnLGQpO3JldHVybiBhfWlmKGQhPT1iKXtmPSFoJiZmJiZlLmlzRnVuY3Rpb24oZCk7Zm9yKHZhciBrPTA7azxpO2srKylnKGFba10sYyxmP2QuY2FsbChhW2tdLGssZyhhW2tdLGMpKTpkLGgpO3JldHVybiBhfXJldHVybiBpP2coYVswXSxjKTpifSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdWFNYXRjaDpmdW5jdGlvbihhKXthPWEudG9Mb3dlckNhc2UoKTt2YXIgYj1yLmV4ZWMoYSl8fHMuZXhlYyhhKXx8dC5leGVjKGEpfHxhLmluZGV4T2YoImNvbXBhdGlibGUiKTwwJiZ1LmV4ZWMoYSl8fFtdO3JldHVybnticm93c2VyOmJbMV18fCIiLHZlcnNpb246YlsyXXx8IjAifX0sc3ViOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGMpe3JldHVybiBuZXcgYS5mbi5pbml0KGIsYyl9ZS5leHRlbmQoITAsYSx0aGlzKSxhLnN1cGVyY2xhc3M9dGhpcyxhLmZuPWEucHJvdG90eXBlPXRoaXMoKSxhLmZuLmNvbnN0cnVjdG9yPWEsYS5zdWI9dGhpcy5zdWIsYS5mbi5pbml0PWZ1bmN0aW9uKGQsZil7ZiYmZiBpbnN0YW5jZW9mIGUmJiEoZiBpbnN0YW5jZW9mIGEpJiYoZj1hKGYpKTtyZXR1cm4gZS5mbi5pbml0LmNhbGwodGhpcyxkLGYsYil9LGEuZm4uaW5pdC5wcm90b3R5cGU9YS5mbjt2YXIgYj1hKGMpO3JldHVybiBhfSxicm93c2VyOnt9fSksZS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7SVsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KSx6PWUudWFNYXRjaCh5KSx6LmJyb3dzZXImJihlLmJyb3dzZXJbei5icm93c2VyXT0hMCxlLmJyb3dzZXIudmVyc2lvbj16LnZlcnNpb24pLGUuYnJvd3Nlci53ZWJraXQmJihlLmJyb3dzZXIuc2FmYXJpPSEwKSxqLnRlc3QoIiAiKSYmKGs9L15bXHNceEEwXSsvLGw9L1tcc1x4QTBdKyQvKSxoPWUoYyksYy5hZGRFdmVudExpc3RlbmVyP0I9ZnVuY3Rpb24oKXtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIsITEpLGUucmVhZHkoKX06Yy5hdHRhY2hFdmVudCYmKEI9ZnVuY3Rpb24oKXtjLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiJiYoYy5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxlLnJlYWR5KCkpfSk7cmV0dXJuIGV9KCksZz17fTtmLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPWE/Z1thXXx8aChhKTp7fTt2YXIgYz1bXSxkPVtdLGUsaSxqLGssbCxtPWZ1bmN0aW9uKGIpe3ZhciBkLGUsZyxoLGk7Zm9yKGQ9MCxlPWIubGVuZ3RoO2Q8ZTtkKyspZz1iW2RdLGg9Zi50eXBlKGcpLGg9PT0iYXJyYXkiP20oZyk6aD09PSJmdW5jdGlvbiImJighYS51bmlxdWV8fCFvLmhhcyhnKSkmJmMucHVzaChnKX0sbj1mdW5jdGlvbihiLGYpe2Y9Znx8W10sZT0hYS5tZW1vcnl8fFtiLGZdLGk9ITAsbD1qfHwwLGo9MCxrPWMubGVuZ3RoO2Zvcig7YyYmbDxrO2wrKylpZihjW2xdLmFwcGx5KGIsZik9PT0hMSYmYS5zdG9wT25GYWxzZSl7ZT0hMDticmVha31pPSExLGMmJihhLm9uY2U/ZT09PSEwP28uZGlzYWJsZSgpOmM9W106ZCYmZC5sZW5ndGgmJihlPWQuc2hpZnQoKSxvLmZpcmVXaXRoKGVbMF0sZVsxXSkpKX0sbz17YWRkOmZ1bmN0aW9uKCl7aWYoYyl7dmFyIGE9Yy5sZW5ndGg7bShhcmd1bWVudHMpLGk/az1jLmxlbmd0aDplJiZlIT09ITAmJihqPWEsbihlWzBdLGVbMV0pKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7aWYoYyl7dmFyIGI9YXJndW1lbnRzLGQ9MCxlPWIubGVuZ3RoO2Zvcig7ZDxlO2QrKylmb3IodmFyIGY9MDtmPGMubGVuZ3RoO2YrKylpZihiW2RdPT09Y1tmXSl7aSYmZjw9ayYmKGstLSxmPD1sJiZsLS0pLGMuc3BsaWNlKGYtLSwxKTtpZihhLnVuaXF1ZSlicmVha319cmV0dXJuIHRoaXN9LGhhczpmdW5jdGlvbihhKXtpZihjKXt2YXIgYj0wLGQ9Yy5sZW5ndGg7Zm9yKDtiPGQ7YisrKWlmKGE9PT1jW2JdKXJldHVybiEwfXJldHVybiExfSxlbXB0eTpmdW5jdGlvbigpe2M9W107cmV0dXJuIHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtjPWQ9ZT1iO3JldHVybiB0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFjfSxsb2NrOmZ1bmN0aW9uKCl7ZD1iLCghZXx8ZT09PSEwKSYmby5kaXNhYmxlKCk7cmV0dXJuIHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiFkfSxmaXJlV2l0aDpmdW5jdGlvbihiLGMpe2QmJihpP2Eub25jZXx8ZC5wdXNoKFtiLGNdKTooIWEub25jZXx8IWUpJiZuKGIsYykpO3JldHVybiB0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7by5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFlfX07cmV0dXJuIG99O3ZhciBpPVtdLnNsaWNlO2YuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgYj1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxjPWYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGQ9Zi5DYWxsYmFja3MoIm1lbW9yeSIpLGU9InBlbmRpbmciLGc9e3Jlc29sdmU6YixyZWplY3Q6Yyxub3RpZnk6ZH0saD17ZG9uZTpiLmFkZCxmYWlsOmMuYWRkLHByb2dyZXNzOmQuYWRkLHN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGV9LGlzUmVzb2x2ZWQ6Yi5maXJlZCxpc1JlamVjdGVkOmMuZmlyZWQsdGhlbjpmdW5jdGlvbihhLGIsYyl7aS5kb25lKGEpLmZhaWwoYikucHJvZ3Jlc3MoYyk7cmV0dXJuIHRoaXN9LGFsd2F5czpmdW5jdGlvbigpe2kuZG9uZS5hcHBseShpLGFyZ3VtZW50cykuZmFpbC5hcHBseShpLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LHBpcGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLkRlZmVycmVkKGZ1bmN0aW9uKGQpe2YuZWFjaCh7ZG9uZTpbYSwicmVzb2x2ZSJdLGZhaWw6W2IsInJlamVjdCJdLHByb2dyZXNzOltjLCJub3RpZnkiXX0sZnVuY3Rpb24oYSxiKXt2YXIgYz1iWzBdLGU9YlsxXSxnO2YuaXNGdW5jdGlvbihjKT9pW2FdKGZ1bmN0aW9uKCl7Zz1jLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxnJiZmLmlzRnVuY3Rpb24oZy5wcm9taXNlKT9nLnByb21pc2UoKS50aGVuKGQucmVzb2x2ZSxkLnJlamVjdCxkLm5vdGlmeSk6ZFtlKyJXaXRoIl0odGhpcz09PWk/ZDp0aGlzLFtnXSl9KTppW2FdKGRbZV0pfSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClhPWg7ZWxzZSBmb3IodmFyIGIgaW4gaClhW2JdPWhbYl07cmV0dXJuIGF9fSxpPWgucHJvbWlzZSh7fSksajtmb3IoaiBpbiBnKWlbal09Z1tqXS5maXJlLGlbaisiV2l0aCJdPWdbal0uZmlyZVdpdGg7aS5kb25lKGZ1bmN0aW9uKCl7ZT0icmVzb2x2ZWQifSxjLmRpc2FibGUsZC5sb2NrKS5mYWlsKGZ1bmN0aW9uKCl7ZT0icmVqZWN0ZWQifSxiLmRpc2FibGUsZC5sb2NrKSxhJiZhLmNhbGwoaSxpKTtyZXR1cm4gaX0sd2hlbjpmdW5jdGlvbihhKXtmdW5jdGlvbiBtKGEpe3JldHVybiBmdW5jdGlvbihiKXtlW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9pLmNhbGwoYXJndW1lbnRzLDApOmIsai5ub3RpZnlXaXRoKGssZSl9fWZ1bmN0aW9uIGwoYSl7cmV0dXJuIGZ1bmN0aW9uKGMpe2JbYV09YXJndW1lbnRzLmxlbmd0aD4xP2kuY2FsbChhcmd1bWVudHMsMCk6YywtLWd8fGoucmVzb2x2ZVdpdGgoaixiKX19dmFyIGI9aS5jYWxsKGFyZ3VtZW50cywwKSxjPTAsZD1iLmxlbmd0aCxlPUFycmF5KGQpLGc9ZCxoPWQsaj1kPD0xJiZhJiZmLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hOmYuRGVmZXJyZWQoKSxrPWoucHJvbWlzZSgpO2lmKGQ+MSl7Zm9yKDtjPGQ7YysrKWJbY10mJmJbY10ucHJvbWlzZSYmZi5pc0Z1bmN0aW9uKGJbY10ucHJvbWlzZSk/YltjXS5wcm9taXNlKCkudGhlbihsKGMpLGoucmVqZWN0LG0oYykpOi0tZztnfHxqLnJlc29sdmVXaXRoKGosYil9ZWxzZSBqIT09YSYmai5yZXNvbHZlV2l0aChqLGQ/W2FdOltdKTtyZXR1cm4ga319KSxmLnN1cHBvcnQ9ZnVuY3Rpb24oKXt2YXIgYixkLGUsZyxoLGksaixrLGwsbSxuLG8scCxxPWMuY3JlYXRlRWxlbWVudCgiZGl2Iikscj1jLmRvY3VtZW50RWxlbWVudDtxLnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLHEuaW5uZXJIVE1MPSIgICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnIHN0eWxlPSd0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksZT1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF07aWYoIWR8fCFkLmxlbmd0aHx8IWUpcmV0dXJue307Zz1jLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGg9Zy5hcHBlbmRDaGlsZChjLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxpPXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0sYj17bGVhZGluZ1doaXRlc3BhY2U6cS5maXJzdENoaWxkLm5vZGVUeXBlPT09Myx0Ym9keTohcS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsaHRtbFNlcmlhbGl6ZTohIXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsc3R5bGU6L3RvcC8udGVzdChlLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksaHJlZk5vcm1hbGl6ZWQ6ZS5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIvYSIsb3BhY2l0eTovXjAuNTUvLnRlc3QoZS5zdHlsZS5vcGFjaXR5KSxjc3NGbG9hdDohIWUuc3R5bGUuY3NzRmxvYXQsY2hlY2tPbjppLnZhbHVlPT09Im9uIixvcHRTZWxlY3RlZDpoLnNlbGVjdGVkLGdldFNldEF0dHJpYnV0ZTpxLmNsYXNzTmFtZSE9PSJ0IixlbmN0eXBlOiEhYy5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSxodG1sNUNsb25lOmMuY3JlYXRlRWxlbWVudCgibmF2IikuY2xvbmVOb2RlKCEwKS5vdXRlckhUTUwhPT0iPDpuYXY+PC86bmF2PiIsc3VibWl0QnViYmxlczohMCxjaGFuZ2VCdWJibGVzOiEwLGZvY3VzaW5CdWJibGVzOiExLGRlbGV0ZUV4cGFuZG86ITAsbm9DbG9uZUV2ZW50OiEwLGlubGluZUJsb2NrTmVlZHNMYXlvdXQ6ITEsc2hyaW5rV3JhcEJsb2NrczohMSxyZWxpYWJsZU1hcmdpblJpZ2h0OiEwfSxpLmNoZWNrZWQ9ITAsYi5ub0Nsb25lQ2hlY2tlZD1pLmNsb25lTm9kZSghMCkuY2hlY2tlZCxnLmRpc2FibGVkPSEwLGIub3B0RGlzYWJsZWQ9IWguZGlzYWJsZWQ7dHJ5e2RlbGV0ZSBxLnRlc3R9Y2F0Y2gocyl7Yi5kZWxldGVFeHBhbmRvPSExfSFxLmFkZEV2ZW50TGlzdGVuZXImJnEuYXR0YWNoRXZlbnQmJnEuZmlyZUV2ZW50JiYocS5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24oKXtiLm5vQ2xvbmVFdmVudD0hMX0pLHEuY2xvbmVOb2RlKCEwKS5maXJlRXZlbnQoIm9uY2xpY2siKSksaT1jLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksaS52YWx1ZT0idCIsaS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGIucmFkaW9WYWx1ZT1pLnZhbHVlPT09InQiLGkuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLHEuYXBwZW5kQ2hpbGQoaSksaz1jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxrLmFwcGVuZENoaWxkKHEubGFzdENoaWxkKSxiLmNoZWNrQ2xvbmU9ay5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsYi5hcHBlbmRDaGVja2VkPWkuY2hlY2tlZCxrLnJlbW92ZUNoaWxkKGkpLGsuYXBwZW5kQ2hpbGQocSkscS5pbm5lckhUTUw9IiIsYS5nZXRDb21wdXRlZFN0eWxlJiYoaj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGouc3R5bGUud2lkdGg9IjAiLGouc3R5bGUubWFyZ2luUmlnaHQ9IjAiLHEuc3R5bGUud2lkdGg9IjJweCIscS5hcHBlbmRDaGlsZChqKSxiLnJlbGlhYmxlTWFyZ2luUmlnaHQ9KHBhcnNlSW50KChhLmdldENvbXB1dGVkU3R5bGUoaixudWxsKXx8e21hcmdpblJpZ2h0OjB9KS5tYXJnaW5SaWdodCwxMCl8fDApPT09MCk7aWYocS5hdHRhY2hFdmVudClmb3IobyBpbntzdWJtaXQ6MSxjaGFuZ2U6MSxmb2N1c2luOjF9KW49Im9uIitvLHA9biBpbiBxLHB8fChxLnNldEF0dHJpYnV0ZShuLCJyZXR1cm47IikscD10eXBlb2YgcVtuXT09ImZ1bmN0aW9uIiksYltvKyJCdWJibGVzIl09cDtrLnJlbW92ZUNoaWxkKHEpLGs9Zz1oPWo9cT1pPW51bGwsZihmdW5jdGlvbigpe3ZhciBhLGQsZSxnLGgsaSxqLGssbSxuLG8scj1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07IXJ8fChqPTEsaz0icG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjFweDtoZWlnaHQ6MXB4O21hcmdpbjowOyIsbT0idmlzaWJpbGl0eTpoaWRkZW47Ym9yZGVyOjA7IixuPSJzdHlsZT0nIitrKyJib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowOyciLG89IjxkaXYgIituKyI+PGRpdj48L2Rpdj48L2Rpdj4iKyI8dGFibGUgIituKyIgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz4iKyI8dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiIsYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGEuc3R5bGUuY3NzVGV4dD1tKyJ3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOnN0YXRpYzt0b3A6MDttYXJnaW4tdG9wOiIraisicHgiLHIuaW5zZXJ0QmVmb3JlKGEsci5maXJzdENoaWxkKSxxPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksYS5hcHBlbmRDaGlsZChxKSxxLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQgc3R5bGU9J3BhZGRpbmc6MDtib3JkZXI6MDtkaXNwbGF5Om5vbmUnPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGw9cS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxwPWxbMF0ub2Zmc2V0SGVpZ2h0PT09MCxsWzBdLnN0eWxlLmRpc3BsYXk9IiIsbFsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixiLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cz1wJiZsWzBdLm9mZnNldEhlaWdodD09PTAscS5pbm5lckhUTUw9IiIscS5zdHlsZS53aWR0aD1xLnN0eWxlLnBhZGRpbmdMZWZ0PSIxcHgiLGYuYm94TW9kZWw9Yi5ib3hNb2RlbD1xLm9mZnNldFdpZHRoPT09Mix0eXBlb2YgcS5zdHlsZS56b29tIT0idW5kZWZpbmVkIiYmKHEuc3R5bGUuZGlzcGxheT0iaW5saW5lIixxLnN0eWxlLnpvb209MSxiLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9cS5vZmZzZXRXaWR0aD09PTIscS5zdHlsZS5kaXNwbGF5PSIiLHEuaW5uZXJIVE1MPSI8ZGl2IHN0eWxlPSd3aWR0aDo0cHg7Jz48L2Rpdj4iLGIuc2hyaW5rV3JhcEJsb2Nrcz1xLm9mZnNldFdpZHRoIT09MikscS5zdHlsZS5jc3NUZXh0PWsrbSxxLmlubmVySFRNTD1vLGQ9cS5maXJzdENoaWxkLGU9ZC5maXJzdENoaWxkLGg9ZC5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQsaT17ZG9lc05vdEFkZEJvcmRlcjplLm9mZnNldFRvcCE9PTUsZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHM6aC5vZmZzZXRUb3A9PT01fSxlLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsZS5zdHlsZS50b3A9IjIwcHgiLGkuZml4ZWRQb3NpdGlvbj1lLm9mZnNldFRvcD09PTIwfHxlLm9mZnNldFRvcD09PTE1LGUuc3R5bGUucG9zaXRpb249ZS5zdHlsZS50b3A9IiIsZC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixkLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaS5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGU9ZS5vZmZzZXRUb3A9PT0tNSxpLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PXIub2Zmc2V0VG9wIT09aixyLnJlbW92ZUNoaWxkKGEpLHE9YT1udWxsLGYuZXh0ZW5kKGIsaSkpfSk7cmV0dXJuIGJ9KCk7dmFyIGo9L14oPzpcey4qXH18XFsuKlxdKSQvLGs9LyhbQS1aXSkvZztmLmV4dGVuZCh7Y2FjaGU6e30sdXVpZDowLGV4cGFuZG86ImpRdWVyeSIrKGYuZm4uanF1ZXJ5K01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vRGF0YTp7ZW1iZWQ6ITAsb2JqZWN0OiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLGFwcGxldDohMH0saGFzRGF0YTpmdW5jdGlvbihhKXthPWEubm9kZVR5cGU/Zi5jYWNoZVthW2YuZXhwYW5kb11dOmFbZi5leHBhbmRvXTtyZXR1cm4hIWEmJiFtKGEpfSxkYXRhOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKCEhZi5hY2NlcHREYXRhKGEpKXt2YXIgZyxoLGksaj1mLmV4cGFuZG8saz10eXBlb2YgYz09InN0cmluZyIsbD1hLm5vZGVUeXBlLG09bD9mLmNhY2hlOmEsbj1sP2Fbal06YVtqXSYmaixvPWM9PT0iZXZlbnRzIjtpZigoIW58fCFtW25dfHwhbyYmIWUmJiFtW25dLmRhdGEpJiZrJiZkPT09YilyZXR1cm47bnx8KGw/YVtqXT1uPSsrZi51dWlkOm49aiksbVtuXXx8KG1bbl09e30sbHx8KG1bbl0udG9KU09OPWYubm9vcCkpO2lmKHR5cGVvZiBjPT0ib2JqZWN0Inx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZT9tW25dPWYuZXh0ZW5kKG1bbl0sYyk6bVtuXS5kYXRhPWYuZXh0ZW5kKG1bbl0uZGF0YSxjKTtnPWg9bVtuXSxlfHwoaC5kYXRhfHwoaC5kYXRhPXt9KSxoPWguZGF0YSksZCE9PWImJihoW2YuY2FtZWxDYXNlKGMpXT1kKTtpZihvJiYhaFtjXSlyZXR1cm4gZy5ldmVudHM7az8oaT1oW2NdLGk9PW51bGwmJihpPWhbZi5jYW1lbENhc2UoYyldKSk6aT1oO3JldHVybiBpfX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIsYyl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBkLGUsZyxoPWYuZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP2YuY2FjaGU6YSxrPWk/YVtoXTpoO2lmKCFqW2tdKXJldHVybjtpZihiKXtkPWM/altrXTpqW2tdLmRhdGE7aWYoZCl7Zi5pc0FycmF5KGIpfHwoYiBpbiBkP2I9W2JdOihiPWYuY2FtZWxDYXNlKGIpLGIgaW4gZD9iPVtiXTpiPWIuc3BsaXQoIiAiKSkpO2ZvcihlPTAsZz1iLmxlbmd0aDtlPGc7ZSsrKWRlbGV0ZSBkW2JbZV1dO2lmKCEoYz9tOmYuaXNFbXB0eU9iamVjdCkoZCkpcmV0dXJufX1pZighYyl7ZGVsZXRlIGpba10uZGF0YTtpZighbShqW2tdKSlyZXR1cm59Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG98fCFqLnNldEludGVydmFsP2RlbGV0ZSBqW2tdOmpba109bnVsbCxpJiYoZi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8/ZGVsZXRlIGFbaF06YS5yZW1vdmVBdHRyaWJ1dGU/YS5yZW1vdmVBdHRyaWJ1dGUoaCk6YVtoXT1udWxsKX19LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kYXRhKGEsYixjLCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihhKXtpZihhLm5vZGVOYW1lKXt2YXIgYj1mLm5vRGF0YVthLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO2lmKGIpcmV0dXJuIGIhPT0hMCYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PWJ9cmV0dXJuITB9fSksZi5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlLGcsaD1udWxsO2lmKHR5cGVvZiBhPT0idW5kZWZpbmVkIil7aWYodGhpcy5sZW5ndGgpe2g9Zi5kYXRhKHRoaXNbMF0pO2lmKHRoaXNbMF0ubm9kZVR5cGU9PT0xJiYhZi5fZGF0YSh0aGlzWzBdLCJwYXJzZWRBdHRycyIpKXtlPXRoaXNbMF0uYXR0cmlidXRlcztmb3IodmFyIGk9MCxqPWUubGVuZ3RoO2k8ajtpKyspZz1lW2ldLm5hbWUsZy5pbmRleE9mKCJkYXRhLSIpPT09MCYmKGc9Zi5jYW1lbENhc2UoZy5zdWJzdHJpbmcoNSkpLGwodGhpc1swXSxnLGhbZ10pKTtmLl9kYXRhKHRoaXNbMF0sInBhcnNlZEF0dHJzIiwhMCl9fXJldHVybiBofWlmKHR5cGVvZiBhPT0ib2JqZWN0IilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kYXRhKHRoaXMsYSl9KTtkPWEuc3BsaXQoIi4iKSxkWzFdPWRbMV0/Ii4iK2RbMV06IiI7aWYoYz09PWIpe2g9dGhpcy50cmlnZ2VySGFuZGxlcigiZ2V0RGF0YSIrZFsxXSsiISIsW2RbMF1dKSxoPT09YiYmdGhpcy5sZW5ndGgmJihoPWYuZGF0YSh0aGlzWzBdLGEpLGg9bCh0aGlzWzBdLGEsaCkpO3JldHVybiBoPT09YiYmZFsxXT90aGlzLmRhdGEoZFswXSk6aH1yZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxlPVtkWzBdLGNdO2IudHJpZ2dlckhhbmRsZXIoInNldERhdGEiK2RbMV0rIiEiLGUpLGYuZGF0YSh0aGlzLGEsYyksYi50cmlnZ2VySGFuZGxlcigiY2hhbmdlRGF0YSIrZFsxXSsiISIsZSl9KX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5yZW1vdmVEYXRhKHRoaXMsYSl9KX19KSxmLmV4dGVuZCh7X21hcms6ZnVuY3Rpb24oYSxiKXthJiYoYj0oYnx8ImZ4IikrIm1hcmsiLGYuX2RhdGEoYSxiLChmLl9kYXRhKGEsYil8fDApKzEpKX0sX3VubWFyazpmdW5jdGlvbihhLGIsYyl7YSE9PSEwJiYoYz1iLGI9YSxhPSExKTtpZihiKXtjPWN8fCJmeCI7dmFyIGQ9YysibWFyayIsZT1hPzA6KGYuX2RhdGEoYixkKXx8MSktMTtlP2YuX2RhdGEoYixkLGUpOihmLnJlbW92ZURhdGEoYixkLCEwKSxuKGIsYywibWFyayIpKX19LHF1ZXVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihhKXtiPShifHwiZngiKSsicXVldWUiLGQ9Zi5fZGF0YShhLGIpLGMmJighZHx8Zi5pc0FycmF5KGMpP2Q9Zi5fZGF0YShhLGIsZi5tYWtlQXJyYXkoYykpOmQucHVzaChjKSk7cmV0dXJuIGR8fFtdfX0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8ImZ4Ijt2YXIgYz1mLnF1ZXVlKGEsYiksZD1jLnNoaWZ0KCksZT17fTtkPT09ImlucHJvZ3Jlc3MiJiYoZD1jLnNoaWZ0KCkpLGQmJihiPT09ImZ4IiYmYy51bnNoaWZ0KCJpbnByb2dyZXNzIiksZi5fZGF0YShhLGIrIi5ydW4iLGUpLGQuY2FsbChhLGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKGEsYil9LGUpKSxjLmxlbmd0aHx8KGYucmVtb3ZlRGF0YShhLGIrInF1ZXVlICIrYisiLnJ1biIsITApLG4oYSxiLCJxdWV1ZSIpKX19KSxmLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxjKXt0eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT0iZngiKTtpZihjPT09YilyZXR1cm4gZi5xdWV1ZSh0aGlzWzBdLGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1mLnF1ZXVlKHRoaXMsYSxjKTthPT09ImZ4IiYmYlswXSE9PSJpbnByb2dyZXNzIiYmZi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVsYXk6ZnVuY3Rpb24oYSxiKXthPWYuZng/Zi5meC5zcGVlZHNbYV18fGE6YSxiPWJ8fCJmeCI7cmV0dXJuIHRoaXMucXVldWUoYixmdW5jdGlvbihiLGMpe3ZhciBkPXNldFRpbWVvdXQoYixhKTtjLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZCl9fSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBtKCl7LS1ofHxkLnJlc29sdmVXaXRoKGUsW2VdKX10eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT1iKSxhPWF8fCJmeCI7dmFyIGQ9Zi5EZWZlcnJlZCgpLGU9dGhpcyxnPWUubGVuZ3RoLGg9MSxpPWErImRlZmVyIixqPWErInF1ZXVlIixrPWErIm1hcmsiLGw7d2hpbGUoZy0tKWlmKGw9Zi5kYXRhKGVbZ10saSxiLCEwKXx8KGYuZGF0YShlW2ddLGosYiwhMCl8fGYuZGF0YShlW2ddLGssYiwhMCkpJiZmLmRhdGEoZVtnXSxpLGYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCEwKSloKyssbC5hZGQobSk7bSgpO3JldHVybiBkLnByb21pc2UoKX19KTt2YXIgbz0vW1xuXHRccl0vZyxwPS9ccysvLHE9L1xyL2cscj0vXig/OmJ1dHRvbnxpbnB1dCkkL2kscz0vXig/OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSx0PS9eYSg/OnJlYSk/JC9pLHU9L14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZHxzZWxlY3RlZCkkL2ksdj1mLnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlLHcseCx5O2YuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGYuYWNjZXNzKHRoaXMsYSxiLCEwLGYuYXR0cil9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlQXR0cih0aGlzLGEpfSl9LHByb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGIsITAsZi5wcm9wKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXthPWYucHJvcEZpeFthXXx8YTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09YixkZWxldGUgdGhpc1thXX1jYXRjaChjKXt9fSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGcsaCxpO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmdHlwZW9mIGE9PSJzdHJpbmciKXtiPWEuc3BsaXQocCk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2U9dGhpc1tjXTtpZihlLm5vZGVUeXBlPT09MSlpZighZS5jbGFzc05hbWUmJmIubGVuZ3RoPT09MSllLmNsYXNzTmFtZT1hO2Vsc2V7Zz0iICIrZS5jbGFzc05hbWUrIiAiO2ZvcihoPTAsaT1iLmxlbmd0aDtoPGk7aCsrKX5nLmluZGV4T2YoIiAiK2JbaF0rIiAiKXx8KGcrPWJbaF0rIiAiKTtlLmNsYXNzTmFtZT1mLnRyaW0oZyl9fX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGMsZCxlLGcsaCxpLGo7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihhJiZ0eXBlb2YgYT09InN0cmluZyJ8fGE9PT1iKXtjPShhfHwiIikuc3BsaXQocCk7Zm9yKGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspe2c9dGhpc1tkXTtpZihnLm5vZGVUeXBlPT09MSYmZy5jbGFzc05hbWUpaWYoYSl7aD0oIiAiK2cuY2xhc3NOYW1lKyIgIikucmVwbGFjZShvLCIgIik7Zm9yKGk9MCxqPWMubGVuZ3RoO2k8ajtpKyspaD1oLnJlcGxhY2UoIiAiK2NbaV0rIiAiLCIgIik7Zy5jbGFzc05hbWU9Zi50cmltKGgpfWVsc2UgZy5jbGFzc05hbWU9IiJ9fXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhLGQ9dHlwZW9mIGI9PSJib29sZWFuIjtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtmKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoYz09PSJzdHJpbmciKXt2YXIgZSxnPTAsaD1mKHRoaXMpLGk9YixqPWEuc3BsaXQocCk7d2hpbGUoZT1qW2crK10paT1kP2k6IWguaGFzQ2xhc3MoZSksaFtpPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oZSl9ZWxzZSBpZihjPT09InVuZGVmaW5lZCJ8fGM9PT0iYm9vbGVhbiIpdGhpcy5jbGFzc05hbWUmJmYuX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxhPT09ITE/IiI6Zi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIifSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiPSIgIithKyIgIixjPTAsZD10aGlzLmxlbmd0aDtmb3IoO2M8ZDtjKyspaWYodGhpc1tjXS5ub2RlVHlwZT09PTEmJigiICIrdGhpc1tjXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKG8sIiAiKS5pbmRleE9mKGIpPi0xKXJldHVybiEwO3JldHVybiExfSx2YWw6ZnVuY3Rpb24oYSl7dmFyIGMsZCxlLGc9dGhpc1swXTt7aWYoISFhcmd1bWVudHMubGVuZ3RoKXtlPWYuaXNGdW5jdGlvbihhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGQpe3ZhciBnPWYodGhpcyksaDtpZih0aGlzLm5vZGVUeXBlPT09MSl7ZT9oPWEuY2FsbCh0aGlzLGQsZy52YWwoKSk6aD1hLGg9PW51bGw/aD0iIjp0eXBlb2YgaD09Im51bWJlciI/aCs9IiI6Zi5pc0FycmF5KGgpJiYoaD1mLm1hcChoLGZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOmErIiJ9KSksYz1mLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV18fGYudmFsSG9va3NbdGhpcy50eXBlXTtpZighY3x8ISgic2V0ImluIGMpfHxjLnNldCh0aGlzLGgsInZhbHVlIik9PT1iKXRoaXMudmFsdWU9aH19KX1pZihnKXtjPWYudmFsSG9va3NbZy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXXx8Zi52YWxIb29rc1tnLnR5cGVdO2lmKGMmJiJnZXQiaW4gYyYmKGQ9Yy5nZXQoZywidmFsdWUiKSkhPT1iKXJldHVybiBkO2Q9Zy52YWx1ZTtyZXR1cm4gdHlwZW9mIGQ9PSJzdHJpbmciP2QucmVwbGFjZShxLCIiKTpkPT1udWxsPyIiOmR9fX19KSxmLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEuYXR0cmlidXRlcy52YWx1ZTtyZXR1cm4hYnx8Yi5zcGVjaWZpZWQ/YS52YWx1ZTphLnRleHR9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxnPWEuc2VsZWN0ZWRJbmRleCxoPVtdLGk9YS5vcHRpb25zLGo9YS50eXBlPT09InNlbGVjdC1vbmUiO2lmKGc8MClyZXR1cm4gbnVsbDtjPWo/ZzowLGQ9aj9nKzE6aS5sZW5ndGg7Zm9yKDtjPGQ7YysrKXtlPWlbY107aWYoZS5zZWxlY3RlZCYmKGYuc3VwcG9ydC5vcHREaXNhYmxlZD8hZS5kaXNhYmxlZDplLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKT09PW51bGwpJiYoIWUucGFyZW50Tm9kZS5kaXNhYmxlZHx8IWYubm9kZU5hbWUoZS5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7Yj1mKGUpLnZhbCgpO2lmKGopcmV0dXJuIGI7aC5wdXNoKGIpfX1pZihqJiYhaC5sZW5ndGgmJmkubGVuZ3RoKXJldHVybiBmKGlbZ10pLnZhbCgpO3JldHVybiBofSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1mLm1ha2VBcnJheShiKTtmKGEpLmZpbmQoIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPWYuaW5BcnJheShmKHRoaXMpLnZhbCgpLGMpPj0wfSksYy5sZW5ndGh8fChhLnNlbGVjdGVkSW5kZXg9LTEpO3JldHVybiBjfX19LGF0dHJGbjp7dmFsOiEwLGNzczohMCxodG1sOiEwLHRleHQ6ITAsZGF0YTohMCx3aWR0aDohMCxoZWlnaHQ6ITAsb2Zmc2V0OiEwfSxhdHRyOmZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBnLGgsaSxqPWEubm9kZVR5cGU7aWYoISFhJiZqIT09MyYmaiE9PTgmJmohPT0yKXtpZihlJiZjIGluIGYuYXR0ckZuKXJldHVybiBmKGEpW2NdKGQpO2lmKHR5cGVvZiBhLmdldEF0dHJpYnV0ZT09InVuZGVmaW5lZCIpcmV0dXJuIGYucHJvcChhLGMsZCk7aT1qIT09MXx8IWYuaXNYTUxEb2MoYSksaSYmKGM9Yy50b0xvd2VyQ2FzZSgpLGg9Zi5hdHRySG9va3NbY118fCh1LnRlc3QoYyk/eDp3KSk7aWYoZCE9PWIpe2lmKGQ9PT1udWxsKXtmLnJlbW92ZUF0dHIoYSxjKTtyZXR1cm59aWYoaCYmInNldCJpbiBoJiZpJiYoZz1oLnNldChhLGQsYykpIT09YilyZXR1cm4gZzthLnNldEF0dHJpYnV0ZShjLCIiK2QpO3JldHVybiBkfWlmKGgmJiJnZXQiaW4gaCYmaSYmKGc9aC5nZXQoYSxjKSkhPT1udWxsKXJldHVybiBnO2c9YS5nZXRBdHRyaWJ1dGUoYyk7cmV0dXJuIGc9PT1udWxsP2I6Z319LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZyxoPTA7aWYoYiYmYS5ub2RlVHlwZT09PTEpe2Q9Yi50b0xvd2VyQ2FzZSgpLnNwbGl0KHApLGc9ZC5sZW5ndGg7Zm9yKDtoPGc7aCsrKWU9ZFtoXSxlJiYoYz1mLnByb3BGaXhbZV18fGUsZi5hdHRyKGEsZSwiIiksYS5yZW1vdmVBdHRyaWJ1dGUodj9lOmMpLHUudGVzdChlKSYmYyBpbiBhJiYoYVtjXT0hMSkpfX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oYSxiKXtpZihyLnRlc3QoYS5ub2RlTmFtZSkmJmEucGFyZW50Tm9kZSlmLmVycm9yKCJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiKTtlbHNlIGlmKCFmLnN1cHBvcnQucmFkaW9WYWx1ZSYmYj09PSJyYWRpbyImJmYubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTthLnNldEF0dHJpYnV0ZSgidHlwZSIsYiksYyYmKGEudmFsdWU9Yyk7cmV0dXJuIGJ9fX0sdmFsdWU6e2dldDpmdW5jdGlvbihhLGIpe2lmKHcmJmYubm9kZU5hbWUoYSwiYnV0dG9uIikpcmV0dXJuIHcuZ2V0KGEsYik7cmV0dXJuIGIgaW4gYT9hLnZhbHVlOm51bGx9LHNldDpmdW5jdGlvbihhLGIsYyl7aWYodyYmZi5ub2RlTmFtZShhLCJidXR0b24iKSlyZXR1cm4gdy5zZXQoYSxiLGMpO2EudmFsdWU9Yn19fSxwcm9wRml4Ont0YWJpbmRleDoidGFiSW5kZXgiLHJlYWRvbmx5OiJyZWFkT25seSIsImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIsY2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixyb3dzcGFuOiJyb3dTcGFuIixjb2xzcGFuOiJjb2xTcGFuIix1c2VtYXA6InVzZU1hcCIsZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIixjb250ZW50ZWRpdGFibGU6ImNvbnRlbnRFZGl0YWJsZSJ9LHByb3A6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGcsaCxpPWEubm9kZVR5cGU7aWYoISFhJiZpIT09MyYmaSE9PTgmJmkhPT0yKXtoPWkhPT0xfHwhZi5pc1hNTERvYyhhKSxoJiYoYz1mLnByb3BGaXhbY118fGMsZz1mLnByb3BIb29rc1tjXSk7cmV0dXJuIGQhPT1iP2cmJiJzZXQiaW4gZyYmKGU9Zy5zZXQoYSxkLGMpKSE9PWI/ZTphW2NdPWQ6ZyYmImdldCJpbiBnJiYoZT1nLmdldChhLGMpKSE9PW51bGw/ZTphW2NdfX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKTtyZXR1cm4gYyYmYy5zcGVjaWZpZWQ/cGFyc2VJbnQoYy52YWx1ZSwxMCk6cy50ZXN0KGEubm9kZU5hbWUpfHx0LnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOmJ9fX19KSxmLmF0dHJIb29rcy50YWJpbmRleD1mLnByb3BIb29rcy50YWJJbmRleCx4PXtnZXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlPWYucHJvcChhLGMpO3JldHVybiBlPT09ITB8fHR5cGVvZiBlIT0iYm9vbGVhbiImJihkPWEuZ2V0QXR0cmlidXRlTm9kZShjKSkmJmQubm9kZVZhbHVlIT09ITE/Yy50b0xvd2VyQ2FzZSgpOmJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7Yj09PSExP2YucmVtb3ZlQXR0cihhLGMpOihkPWYucHJvcEZpeFtjXXx8YyxkIGluIGEmJihhW2RdPSEwKSxhLnNldEF0dHJpYnV0ZShjLGMudG9Mb3dlckNhc2UoKSkpO3JldHVybiBjfX0sdnx8KHk9e25hbWU6ITAsaWQ6ITB9LHc9Zi52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkO2Q9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkJiYoeVtjXT9kLm5vZGVWYWx1ZSE9PSIiOmQuc3BlY2lmaWVkKT9kLm5vZGVWYWx1ZTpifSxzZXQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEuZ2V0QXR0cmlidXRlTm9kZShkKTtlfHwoZT1jLmNyZWF0ZUF0dHJpYnV0ZShkKSxhLnNldEF0dHJpYnV0ZU5vZGUoZSkpO3JldHVybiBlLm5vZGVWYWx1ZT1iKyIifX0sZi5hdHRySG9va3MudGFiaW5kZXguc2V0PXcuc2V0LGYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtmLmF0dHJIb29rc1tiXT1mLmV4dGVuZChmLmF0dHJIb29rc1tiXSx7c2V0OmZ1bmN0aW9uKGEsYyl7aWYoYz09PSIiKXthLnNldEF0dHJpYnV0ZShiLCJhdXRvIik7cmV0dXJuIGN9fX0pfSksZi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtnZXQ6dy5nZXQsc2V0OmZ1bmN0aW9uKGEsYixjKXtiPT09IiImJihiPSJmYWxzZSIpLHcuc2V0KGEsYixjKX19KSxmLnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWR8fGYuZWFjaChbImhyZWYiLCJzcmMiLCJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYyl7Zi5hdHRySG9va3NbY109Zi5leHRlbmQoZi5hdHRySG9va3NbY10se2dldDpmdW5jdGlvbihhKXt2YXIgZD1hLmdldEF0dHJpYnV0ZShjLDIpO3JldHVybiBkPT09bnVsbD9iOmR9fSl9KSxmLnN1cHBvcnQuc3R5bGV8fChmLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKXx8Yn0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD0iIitifX0pLGYuc3VwcG9ydC5vcHRTZWxlY3RlZHx8KGYucHJvcEhvb2tzLnNlbGVjdGVkPWYuZXh0ZW5kKGYucHJvcEhvb2tzLnNlbGVjdGVkLHtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO2ImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCk7cmV0dXJuIG51bGx9fSkpLGYuc3VwcG9ydC5lbmN0eXBlfHwoZi5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIiksZi5zdXBwb3J0LmNoZWNrT258fGYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2YudmFsSG9va3NbdGhpc109e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT1udWxsPyJvbiI6YS52YWx1ZX19fSksZi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT1mLmV4dGVuZChmLnZhbEhvb2tzW3RoaXNdLHtzZXQ6ZnVuY3Rpb24oYSxiKXtpZihmLmlzQXJyYXkoYikpcmV0dXJuIGEuY2hlY2tlZD1mLmluQXJyYXkoZihhKS52YWwoKSxiKT49MH19KX0pO3ZhciB6PS9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSxBPS9eKFteXC5dKik/KD86XC4oLispKT8kLyxCPS9cYmhvdmVyKFwuXFMrKT9cYi8sQz0vXmtleS8sRD0vXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sRT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sRj0vXihcdyopKD86IyhbXHdcLV0rKSk/KD86XC4oW1x3XC1dKykpPyQvLEc9ZnVuY3Rpb24oYSl7dmFyIGI9Ri5leGVjKGEpO2ImJihiWzFdPShiWzFdfHwiIikudG9Mb3dlckNhc2UoKSxiWzNdPWJbM10mJm5ldyBSZWdFeHAoIig/Ol58XFxzKSIrYlszXSsiKD86XFxzfCQpIikpO3JldHVybiBifSxIPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5hdHRyaWJ1dGVzfHx7fTtyZXR1cm4oIWJbMV18fGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJbMV0pJiYoIWJbMl18fChjLmlkfHx7fSkudmFsdWU9PT1iWzJdKSYmKCFiWzNdfHxiWzNdLnRlc3QoKGNbImNsYXNzIl18fHt9KS52YWx1ZSkpfSxJPWZ1bmN0aW9uKGEpe3JldHVybiBmLmV2ZW50LnNwZWNpYWwuaG92ZXI/YTphLnJlcGxhY2UoQiwibW91c2VlbnRlciQxIG1vdXNlbGVhdmUkMSIpfTsKZi5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYyxkLGUsZyl7dmFyIGgsaSxqLGssbCxtLG4sbyxwLHEscixzO2lmKCEoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhY3x8IWR8fCEoaD1mLl9kYXRhKGEpKSkpe2QuaGFuZGxlciYmKHA9ZCxkPXAuaGFuZGxlciksZC5ndWlkfHwoZC5ndWlkPWYuZ3VpZCsrKSxqPWguZXZlbnRzLGp8fChoLmV2ZW50cz1qPXt9KSxpPWguaGFuZGxlLGl8fChoLmhhbmRsZT1pPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgZiE9InVuZGVmaW5lZCImJighYXx8Zi5ldmVudC50cmlnZ2VyZWQhPT1hLnR5cGUpP2YuZXZlbnQuZGlzcGF0Y2guYXBwbHkoaS5lbGVtLGFyZ3VtZW50cyk6Yn0saS5lbGVtPWEpLGM9Zi50cmltKEkoYykpLnNwbGl0KCIgIik7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKyl7bD1BLmV4ZWMoY1trXSl8fFtdLG09bFsxXSxuPShsWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCkscz1mLmV2ZW50LnNwZWNpYWxbbV18fHt9LG09KGc/cy5kZWxlZ2F0ZVR5cGU6cy5iaW5kVHlwZSl8fG0scz1mLmV2ZW50LnNwZWNpYWxbbV18fHt9LG89Zi5leHRlbmQoe3R5cGU6bSxvcmlnVHlwZTpsWzFdLGRhdGE6ZSxoYW5kbGVyOmQsZ3VpZDpkLmd1aWQsc2VsZWN0b3I6ZyxxdWljazpHKGcpLG5hbWVzcGFjZTpuLmpvaW4oIi4iKX0scCkscj1qW21dO2lmKCFyKXtyPWpbbV09W10sci5kZWxlZ2F0ZUNvdW50PTA7aWYoIXMuc2V0dXB8fHMuc2V0dXAuY2FsbChhLGUsbixpKT09PSExKWEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIobSxpLCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbSxpKX1zLmFkZCYmKHMuYWRkLmNhbGwoYSxvKSxvLmhhbmRsZXIuZ3VpZHx8KG8uaGFuZGxlci5ndWlkPWQuZ3VpZCkpLGc/ci5zcGxpY2Uoci5kZWxlZ2F0ZUNvdW50KyssMCxvKTpyLnB1c2gobyksZi5ldmVudC5nbG9iYWxbbV09ITB9YT1udWxsfX0sZ2xvYmFsOnt9LHJlbW92ZTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBnPWYuaGFzRGF0YShhKSYmZi5fZGF0YShhKSxoLGksaixrLGwsbSxuLG8scCxxLHIscztpZighIWcmJiEhKG89Zy5ldmVudHMpKXtiPWYudHJpbShJKGJ8fCIiKSkuc3BsaXQoIiAiKTtmb3IoaD0wO2g8Yi5sZW5ndGg7aCsrKXtpPUEuZXhlYyhiW2hdKXx8W10saj1rPWlbMV0sbD1pWzJdO2lmKCFqKXtmb3IoaiBpbiBvKWYuZXZlbnQucmVtb3ZlKGEsaitiW2hdLGMsZCwhMCk7Y29udGludWV9cD1mLmV2ZW50LnNwZWNpYWxbal18fHt9LGo9KGQ/cC5kZWxlZ2F0ZVR5cGU6cC5iaW5kVHlwZSl8fGoscj1vW2pdfHxbXSxtPXIubGVuZ3RoLGw9bD9uZXcgUmVnRXhwKCIoXnxcXC4pIitsLnNwbGl0KCIuIikuc29ydCgpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpOm51bGw7Zm9yKG49MDtuPHIubGVuZ3RoO24rKylzPXJbbl0sKGV8fGs9PT1zLm9yaWdUeXBlKSYmKCFjfHxjLmd1aWQ9PT1zLmd1aWQpJiYoIWx8fGwudGVzdChzLm5hbWVzcGFjZSkpJiYoIWR8fGQ9PT1zLnNlbGVjdG9yfHxkPT09IioqIiYmcy5zZWxlY3RvcikmJihyLnNwbGljZShuLS0sMSkscy5zZWxlY3RvciYmci5kZWxlZ2F0ZUNvdW50LS0scC5yZW1vdmUmJnAucmVtb3ZlLmNhbGwoYSxzKSk7ci5sZW5ndGg9PT0wJiZtIT09ci5sZW5ndGgmJigoIXAudGVhcmRvd258fHAudGVhcmRvd24uY2FsbChhLGwpPT09ITEpJiZmLnJlbW92ZUV2ZW50KGEsaixnLmhhbmRsZSksZGVsZXRlIG9bal0pfWYuaXNFbXB0eU9iamVjdChvKSYmKHE9Zy5oYW5kbGUscSYmKHEuZWxlbT1udWxsKSxmLnJlbW92ZURhdGEoYSxbImV2ZW50cyIsImhhbmRsZSJdLCEwKSl9fSxjdXN0b21FdmVudDp7Z2V0RGF0YTohMCxzZXREYXRhOiEwLGNoYW5nZURhdGE6ITB9LHRyaWdnZXI6ZnVuY3Rpb24oYyxkLGUsZyl7aWYoIWV8fGUubm9kZVR5cGUhPT0zJiZlLm5vZGVUeXBlIT09OCl7dmFyIGg9Yy50eXBlfHxjLGk9W10saixrLGwsbSxuLG8scCxxLHIscztpZihFLnRlc3QoaCtmLmV2ZW50LnRyaWdnZXJlZCkpcmV0dXJuO2guaW5kZXhPZigiISIpPj0wJiYoaD1oLnNsaWNlKDAsLTEpLGs9ITApLGguaW5kZXhPZigiLiIpPj0wJiYoaT1oLnNwbGl0KCIuIiksaD1pLnNoaWZ0KCksaS5zb3J0KCkpO2lmKCghZXx8Zi5ldmVudC5jdXN0b21FdmVudFtoXSkmJiFmLmV2ZW50Lmdsb2JhbFtoXSlyZXR1cm47Yz10eXBlb2YgYz09Im9iamVjdCI/Y1tmLmV4cGFuZG9dP2M6bmV3IGYuRXZlbnQoaCxjKTpuZXcgZi5FdmVudChoKSxjLnR5cGU9aCxjLmlzVHJpZ2dlcj0hMCxjLmV4Y2x1c2l2ZT1rLGMubmFtZXNwYWNlPWkuam9pbigiLiIpLGMubmFtZXNwYWNlX3JlPWMubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK2kuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIik6bnVsbCxvPWguaW5kZXhPZigiOiIpPDA/Im9uIitoOiIiO2lmKCFlKXtqPWYuY2FjaGU7Zm9yKGwgaW4gailqW2xdLmV2ZW50cyYmaltsXS5ldmVudHNbaF0mJmYuZXZlbnQudHJpZ2dlcihjLGQsaltsXS5oYW5kbGUuZWxlbSwhMCk7cmV0dXJufWMucmVzdWx0PWIsYy50YXJnZXR8fChjLnRhcmdldD1lKSxkPWQhPW51bGw/Zi5tYWtlQXJyYXkoZCk6W10sZC51bnNoaWZ0KGMpLHA9Zi5ldmVudC5zcGVjaWFsW2hdfHx7fTtpZihwLnRyaWdnZXImJnAudHJpZ2dlci5hcHBseShlLGQpPT09ITEpcmV0dXJuO3I9W1tlLHAuYmluZFR5cGV8fGhdXTtpZighZyYmIXAubm9CdWJibGUmJiFmLmlzV2luZG93KGUpKXtzPXAuZGVsZWdhdGVUeXBlfHxoLG09RS50ZXN0KHMraCk/ZTplLnBhcmVudE5vZGUsbj1udWxsO2Zvcig7bTttPW0ucGFyZW50Tm9kZSlyLnB1c2goW20sc10pLG49bTtuJiZuPT09ZS5vd25lckRvY3VtZW50JiZyLnB1c2goW24uZGVmYXVsdFZpZXd8fG4ucGFyZW50V2luZG93fHxhLHNdKX1mb3IobD0wO2w8ci5sZW5ndGgmJiFjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7bCsrKW09cltsXVswXSxjLnR5cGU9cltsXVsxXSxxPShmLl9kYXRhKG0sImV2ZW50cyIpfHx7fSlbYy50eXBlXSYmZi5fZGF0YShtLCJoYW5kbGUiKSxxJiZxLmFwcGx5KG0sZCkscT1vJiZtW29dLHEmJmYuYWNjZXB0RGF0YShtKSYmcS5hcHBseShtLGQpPT09ITEmJmMucHJldmVudERlZmF1bHQoKTtjLnR5cGU9aCwhZyYmIWMuaXNEZWZhdWx0UHJldmVudGVkKCkmJighcC5fZGVmYXVsdHx8cC5fZGVmYXVsdC5hcHBseShlLm93bmVyRG9jdW1lbnQsZCk9PT0hMSkmJihoIT09ImNsaWNrInx8IWYubm9kZU5hbWUoZSwiYSIpKSYmZi5hY2NlcHREYXRhKGUpJiZvJiZlW2hdJiYoaCE9PSJmb2N1cyImJmghPT0iYmx1ciJ8fGMudGFyZ2V0Lm9mZnNldFdpZHRoIT09MCkmJiFmLmlzV2luZG93KGUpJiYobj1lW29dLG4mJihlW29dPW51bGwpLGYuZXZlbnQudHJpZ2dlcmVkPWgsZVtoXSgpLGYuZXZlbnQudHJpZ2dlcmVkPWIsbiYmKGVbb109bikpO3JldHVybiBjLnJlc3VsdH19LGRpc3BhdGNoOmZ1bmN0aW9uKGMpe2M9Zi5ldmVudC5maXgoY3x8YS5ldmVudCk7dmFyIGQ9KGYuX2RhdGEodGhpcywiZXZlbnRzIil8fHt9KVtjLnR5cGVdfHxbXSxlPWQuZGVsZWdhdGVDb3VudCxnPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLGg9IWMuZXhjbHVzaXZlJiYhYy5uYW1lc3BhY2UsaT1bXSxqLGssbCxtLG4sbyxwLHEscixzLHQ7Z1swXT1jLGMuZGVsZWdhdGVUYXJnZXQ9dGhpcztpZihlJiYhYy50YXJnZXQuZGlzYWJsZWQmJighYy5idXR0b258fGMudHlwZSE9PSJjbGljayIpKXttPWYodGhpcyksbS5jb250ZXh0PXRoaXMub3duZXJEb2N1bWVudHx8dGhpcztmb3IobD1jLnRhcmdldDtsIT10aGlzO2w9bC5wYXJlbnROb2RlfHx0aGlzKXtvPXt9LHE9W10sbVswXT1sO2ZvcihqPTA7ajxlO2orKylyPWRbal0scz1yLnNlbGVjdG9yLG9bc109PT1iJiYob1tzXT1yLnF1aWNrP0gobCxyLnF1aWNrKTptLmlzKHMpKSxvW3NdJiZxLnB1c2gocik7cS5sZW5ndGgmJmkucHVzaCh7ZWxlbTpsLG1hdGNoZXM6cX0pfX1kLmxlbmd0aD5lJiZpLnB1c2goe2VsZW06dGhpcyxtYXRjaGVzOmQuc2xpY2UoZSl9KTtmb3Ioaj0wO2o8aS5sZW5ndGgmJiFjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7aisrKXtwPWlbal0sYy5jdXJyZW50VGFyZ2V0PXAuZWxlbTtmb3Ioaz0wO2s8cC5tYXRjaGVzLmxlbmd0aCYmIWMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTtrKyspe3I9cC5tYXRjaGVzW2tdO2lmKGh8fCFjLm5hbWVzcGFjZSYmIXIubmFtZXNwYWNlfHxjLm5hbWVzcGFjZV9yZSYmYy5uYW1lc3BhY2VfcmUudGVzdChyLm5hbWVzcGFjZSkpYy5kYXRhPXIuZGF0YSxjLmhhbmRsZU9iaj1yLG49KChmLmV2ZW50LnNwZWNpYWxbci5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fHIuaGFuZGxlcikuYXBwbHkocC5lbGVtLGcpLG4hPT1iJiYoYy5yZXN1bHQ9bixuPT09ITEmJihjLnByZXZlbnREZWZhdWx0KCksYy5zdG9wUHJvcGFnYXRpb24oKSkpfX1yZXR1cm4gYy5yZXN1bHR9LHByb3BzOiJhdHRyQ2hhbmdlIGF0dHJOYW1lIHJlbGF0ZWROb2RlIHNyY0VsZW1lbnQgYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXthLndoaWNoPT1udWxsJiYoYS53aGljaD1iLmNoYXJDb2RlIT1udWxsP2IuY2hhckNvZGU6Yi5rZXlDb2RlKTtyZXR1cm4gYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsZCl7dmFyIGUsZixnLGg9ZC5idXR0b24saT1kLmZyb21FbGVtZW50O2EucGFnZVg9PW51bGwmJmQuY2xpZW50WCE9bnVsbCYmKGU9YS50YXJnZXQub3duZXJEb2N1bWVudHx8YyxmPWUuZG9jdW1lbnRFbGVtZW50LGc9ZS5ib2R5LGEucGFnZVg9ZC5jbGllbnRYKyhmJiZmLnNjcm9sbExlZnR8fGcmJmcuc2Nyb2xsTGVmdHx8MCktKGYmJmYuY2xpZW50TGVmdHx8ZyYmZy5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPWQuY2xpZW50WSsoZiYmZi5zY3JvbGxUb3B8fGcmJmcuc2Nyb2xsVG9wfHwwKS0oZiYmZi5jbGllbnRUb3B8fGcmJmcuY2xpZW50VG9wfHwwKSksIWEucmVsYXRlZFRhcmdldCYmaSYmKGEucmVsYXRlZFRhcmdldD1pPT09YS50YXJnZXQ/ZC50b0VsZW1lbnQ6aSksIWEud2hpY2gmJmghPT1iJiYoYS53aGljaD1oJjE/MTpoJjI/MzpoJjQ/MjowKTtyZXR1cm4gYX19LGZpeDpmdW5jdGlvbihhKXtpZihhW2YuZXhwYW5kb10pcmV0dXJuIGE7dmFyIGQsZSxnPWEsaD1mLmV2ZW50LmZpeEhvb2tzW2EudHlwZV18fHt9LGk9aC5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChoLnByb3BzKTp0aGlzLnByb3BzO2E9Zi5FdmVudChnKTtmb3IoZD1pLmxlbmd0aDtkOyllPWlbLS1kXSxhW2VdPWdbZV07YS50YXJnZXR8fChhLnRhcmdldD1nLnNyY0VsZW1lbnR8fGMpLGEudGFyZ2V0Lm5vZGVUeXBlPT09MyYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT09PWImJihhLm1ldGFLZXk9YS5jdHJsS2V5KTtyZXR1cm4gaC5maWx0ZXI/aC5maWx0ZXIoYSxnKTphfSxzcGVjaWFsOntyZWFkeTp7c2V0dXA6Zi5iaW5kUmVhZHl9LGxvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7ZGVsZWdhdGVUeXBlOiJmb2N1c2luIn0sYmx1cjp7ZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGJlZm9yZXVubG9hZDp7c2V0dXA6ZnVuY3Rpb24oYSxiLGMpe2YuaXNXaW5kb3codGhpcykmJih0aGlzLm9uYmVmb3JldW5sb2FkPWMpfSx0ZWFyZG93bjpmdW5jdGlvbihhLGIpe3RoaXMub25iZWZvcmV1bmxvYWQ9PT1iJiYodGhpcy5vbmJlZm9yZXVubG9hZD1udWxsKX19fSxzaW11bGF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1mLmV4dGVuZChuZXcgZi5FdmVudCxjLHt0eXBlOmEsaXNTaW11bGF0ZWQ6ITAsb3JpZ2luYWxFdmVudDp7fX0pO2Q/Zi5ldmVudC50cmlnZ2VyKGUsbnVsbCxiKTpmLmV2ZW50LmRpc3BhdGNoLmNhbGwoYixlKSxlLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZjLnByZXZlbnREZWZhdWx0KCl9fSxmLmV2ZW50LmhhbmRsZT1mLmV2ZW50LmRpc3BhdGNoLGYucmVtb3ZlRXZlbnQ9Yy5yZW1vdmVFdmVudExpc3RlbmVyP2Z1bmN0aW9uKGEsYixjKXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfTpmdW5jdGlvbihhLGIsYyl7YS5kZXRhY2hFdmVudCYmYS5kZXRhY2hFdmVudCgib24iK2IsYyl9LGYuRXZlbnQ9ZnVuY3Rpb24oYSxiKXtpZighKHRoaXMgaW5zdGFuY2VvZiBmLkV2ZW50KSlyZXR1cm4gbmV3IGYuRXZlbnQoYSxiKTthJiZhLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1hLHRoaXMudHlwZT1hLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS5kZWZhdWx0UHJldmVudGVkfHxhLnJldHVyblZhbHVlPT09ITF8fGEuZ2V0UHJldmVudERlZmF1bHQmJmEuZ2V0UHJldmVudERlZmF1bHQoKT9LOkopOnRoaXMudHlwZT1hLGImJmYuZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fGYubm93KCksdGhpc1tmLmV4cGFuZG9dPSEwfSxmLkV2ZW50LnByb3RvdHlwZT17cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1LO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDshYXx8KGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUs7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50OyFhfHwoYS5zdG9wUHJvcGFnYXRpb24mJmEuc3RvcFByb3BhZ2F0aW9uKCksYS5jYW5jZWxCdWJibGU9ITApfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUssdGhpcy5zdG9wUHJvcGFnYXRpb24oKX0saXNEZWZhdWx0UHJldmVudGVkOkosaXNQcm9wYWdhdGlvblN0b3BwZWQ6Sixpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpKfSxmLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihhLGIpe2YuZXZlbnQuc3BlY2lhbFthXT17ZGVsZWdhdGVUeXBlOmIsYmluZFR5cGU6YixoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkPWEucmVsYXRlZFRhcmdldCxlPWEuaGFuZGxlT2JqLGc9ZS5zZWxlY3RvcixoO2lmKCFkfHxkIT09YyYmIWYuY29udGFpbnMoYyxkKSlhLnR5cGU9ZS5vcmlnVHlwZSxoPWUuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWI7cmV0dXJuIGh9fX0pLGYuc3VwcG9ydC5zdWJtaXRCdWJibGVzfHwoZi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtpZihmLm5vZGVOYW1lKHRoaXMsImZvcm0iKSlyZXR1cm4hMTtmLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBjPWEudGFyZ2V0LGQ9Zi5ub2RlTmFtZShjLCJpbnB1dCIpfHxmLm5vZGVOYW1lKGMsImJ1dHRvbiIpP2MuZm9ybTpiO2QmJiFkLl9zdWJtaXRfYXR0YWNoZWQmJihmLmV2ZW50LmFkZChkLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiYhYS5pc1RyaWdnZXImJmYuZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksZC5fc3VibWl0X2F0dGFjaGVkPSEwKX0pfSx0ZWFyZG93bjpmdW5jdGlvbigpe2lmKGYubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0Iil9fSksZi5zdXBwb3J0LmNoYW5nZUJ1YmJsZXN8fChmLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe2lmKHoudGVzdCh0aGlzLm5vZGVOYW1lKSl7aWYodGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIilmLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXthLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lPT09ImNoZWNrZWQiJiYodGhpcy5fanVzdF9jaGFuZ2VkPSEwKX0pLGYuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMuX2p1c3RfY2hhbmdlZCYmIWEuaXNUcmlnZ2VyJiYodGhpcy5fanVzdF9jaGFuZ2VkPSExLGYuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKSl9KTtyZXR1cm4hMX1mLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDt6LnRlc3QoYi5ub2RlTmFtZSkmJiFiLl9jaGFuZ2VfYXR0YWNoZWQmJihmLmV2ZW50LmFkZChiLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiYhYS5pc1NpbXVsYXRlZCYmIWEuaXNUcmlnZ2VyJiZmLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMucGFyZW50Tm9kZSxhLCEwKX0pLGIuX2NoYW5nZV9hdHRhY2hlZD0hMCl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMhPT1ifHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8Yi50eXBlIT09InJhZGlvIiYmYi50eXBlIT09ImNoZWNrYm94IilyZXR1cm4gYS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7Zi5ldmVudC5yZW1vdmUodGhpcywiLl9jaGFuZ2UiKTtyZXR1cm4gei50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLGYuc3VwcG9ydC5mb2N1c2luQnViYmxlc3x8Zi5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBkPTAsZT1mdW5jdGlvbihhKXtmLmV2ZW50LnNpbXVsYXRlKGIsYS50YXJnZXQsZi5ldmVudC5maXgoYSksITApfTtmLmV2ZW50LnNwZWNpYWxbYl09e3NldHVwOmZ1bmN0aW9uKCl7ZCsrPT09MCYmYy5hZGRFdmVudExpc3RlbmVyKGEsZSwhMCl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7LS1kPT09MCYmYy5yZW1vdmVFdmVudExpc3RlbmVyKGEsZSwhMCl9fX0pLGYuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGMsZCxlLGcpe3ZhciBoLGk7aWYodHlwZW9mIGE9PSJvYmplY3QiKXt0eXBlb2YgYyE9InN0cmluZyImJihkPWMsYz1iKTtmb3IoaSBpbiBhKXRoaXMub24oaSxjLGQsYVtpXSxnKTtyZXR1cm4gdGhpc31kPT1udWxsJiZlPT1udWxsPyhlPWMsZD1jPWIpOmU9PW51bGwmJih0eXBlb2YgYz09InN0cmluZyI/KGU9ZCxkPWIpOihlPWQsZD1jLGM9YikpO2lmKGU9PT0hMSllPUo7ZWxzZSBpZighZSlyZXR1cm4gdGhpcztnPT09MSYmKGg9ZSxlPWZ1bmN0aW9uKGEpe2YoKS5vZmYoYSk7cmV0dXJuIGguYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLmd1aWQ9aC5ndWlkfHwoaC5ndWlkPWYuZ3VpZCsrKSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQuYWRkKHRoaXMsYSxlLGQsYyl9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uLmNhbGwodGhpcyxhLGIsYyxkLDEpfSxvZmY6ZnVuY3Rpb24oYSxjLGQpe2lmKGEmJmEucHJldmVudERlZmF1bHQmJmEuaGFuZGxlT2JqKXt2YXIgZT1hLmhhbmRsZU9iajtmKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihlLm5hbWVzcGFjZT9lLnR5cGUrIi4iK2UubmFtZXNwYWNlOmUudHlwZSxlLnNlbGVjdG9yLGUuaGFuZGxlcik7cmV0dXJuIHRoaXN9aWYodHlwZW9mIGE9PSJvYmplY3QiKXtmb3IodmFyIGcgaW4gYSl0aGlzLm9mZihnLGMsYVtnXSk7cmV0dXJuIHRoaXN9aWYoYz09PSExfHx0eXBlb2YgYz09ImZ1bmN0aW9uIilkPWMsYz1iO2Q9PT0hMSYmKGQ9Sik7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQucmVtb3ZlKHRoaXMsYSxkLGMpfSl9LGJpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxsaXZlOmZ1bmN0aW9uKGEsYixjKXtmKHRoaXMuY29udGV4dCkub24oYSx0aGlzLnNlbGVjdG9yLGIsYyk7cmV0dXJuIHRoaXN9LGRpZTpmdW5jdGlvbihhLGIpe2YodGhpcy5jb250ZXh0KS5vZmYoYSx0aGlzLnNlbGVjdG9yfHwiKioiLGIpO3JldHVybiB0aGlzfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PTE/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGEsYyl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe2lmKHRoaXNbMF0pcmV0dXJuIGYuZXZlbnQudHJpZ2dlcihhLGIsdGhpc1swXSwhMCl9LHRvZ2dsZTpmdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHMsYz1hLmd1aWR8fGYuZ3VpZCsrLGQ9MCxlPWZ1bmN0aW9uKGMpe3ZhciBlPShmLl9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCl8fDApJWQ7Zi5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQsZSsxKSxjLnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIGJbZV0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHwhMX07ZS5ndWlkPWM7d2hpbGUoZDxiLmxlbmd0aCliW2QrK10uZ3VpZD1jO3JldHVybiB0aGlzLmNsaWNrKGUpfSxob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX19KSxmLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtmLmZuW2JdPWZ1bmN0aW9uKGEsYyl7Yz09bnVsbCYmKGM9YSxhPW51bGwpO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbihiLG51bGwsYSxjKTp0aGlzLnRyaWdnZXIoYil9LGYuYXR0ckZuJiYoZi5hdHRyRm5bYl09ITApLEMudGVzdChiKSYmKGYuZXZlbnQuZml4SG9va3NbYl09Zi5ldmVudC5rZXlIb29rcyksRC50ZXN0KGIpJiYoZi5ldmVudC5maXhIb29rc1tiXT1mLmV2ZW50Lm1vdXNlSG9va3MpfSksZnVuY3Rpb24oKXtmdW5jdGlvbiB4KGEsYixjLGUsZixnKXtmb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoail7dmFyIGs9ITE7aj1qW2FdO3doaWxlKGope2lmKGpbZF09PT1jKXtrPWVbai5zaXpzZXRdO2JyZWFrfWlmKGoubm9kZVR5cGU9PT0xKXtnfHwoaltkXT1jLGouc2l6c2V0PWgpO2lmKHR5cGVvZiBiIT0ic3RyaW5nIil7aWYoaj09PWIpe2s9ITA7YnJlYWt9fWVsc2UgaWYobS5maWx0ZXIoYixbal0pLmxlbmd0aD4wKXtrPWo7YnJlYWt9fWo9althXX1lW2hdPWt9fX1mdW5jdGlvbiB3KGEsYixjLGUsZixnKXtmb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoail7dmFyIGs9ITE7aj1qW2FdO3doaWxlKGope2lmKGpbZF09PT1jKXtrPWVbai5zaXpzZXRdO2JyZWFrfWoubm9kZVR5cGU9PT0xJiYhZyYmKGpbZF09YyxqLnNpenNldD1oKTtpZihqLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iKXtrPWo7YnJlYWt9aj1qW2FdfWVbaF09a319fXZhciBhPS8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teXFtcXV0qXF18WyciXVteJyJdKlsnIl18W15cW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPygoPzoufFxyfFxuKSopL2csZD0ic2l6Y2FjaGUiKyhNYXRoLnJhbmRvbSgpKyIiKS5yZXBsYWNlKCIuIiwiIiksZT0wLGc9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoPSExLGk9ITAsaj0vXFwvZyxrPS9cclxuL2csbD0vXFcvO1swLDBdLnNvcnQoZnVuY3Rpb24oKXtpPSExO3JldHVybiAwfSk7dmFyIG09ZnVuY3Rpb24oYixkLGUsZil7ZT1lfHxbXSxkPWR8fGM7dmFyIGg9ZDtpZihkLm5vZGVUeXBlIT09MSYmZC5ub2RlVHlwZSE9PTkpcmV0dXJuW107aWYoIWJ8fHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gZTt2YXIgaSxqLGssbCxuLHEscix0LHU9ITAsdj1tLmlzWE1MKGQpLHc9W10seD1iO2Rve2EuZXhlYygiIiksaT1hLmV4ZWMoeCk7aWYoaSl7eD1pWzNdLHcucHVzaChpWzFdKTtpZihpWzJdKXtsPWlbM107YnJlYWt9fX13aGlsZShpKTtpZih3Lmxlbmd0aD4xJiZwLmV4ZWMoYikpaWYody5sZW5ndGg9PT0yJiZvLnJlbGF0aXZlW3dbMF1dKWo9eSh3WzBdK3dbMV0sZCxmKTtlbHNle2o9by5yZWxhdGl2ZVt3WzBdXT9bZF06bSh3LnNoaWZ0KCksZCk7d2hpbGUody5sZW5ndGgpYj13LnNoaWZ0KCksby5yZWxhdGl2ZVtiXSYmKGIrPXcuc2hpZnQoKSksaj15KGIsaixmKX1lbHNleyFmJiZ3Lmxlbmd0aD4xJiZkLm5vZGVUeXBlPT09OSYmIXYmJm8ubWF0Y2guSUQudGVzdCh3WzBdKSYmIW8ubWF0Y2guSUQudGVzdCh3W3cubGVuZ3RoLTFdKSYmKG49bS5maW5kKHcuc2hpZnQoKSxkLHYpLGQ9bi5leHByP20uZmlsdGVyKG4uZXhwcixuLnNldClbMF06bi5zZXRbMF0pO2lmKGQpe249Zj97ZXhwcjp3LnBvcCgpLHNldDpzKGYpfTptLmZpbmQody5wb3AoKSx3Lmxlbmd0aD09PTEmJih3WzBdPT09In4ifHx3WzBdPT09IisiKSYmZC5wYXJlbnROb2RlP2QucGFyZW50Tm9kZTpkLHYpLGo9bi5leHByP20uZmlsdGVyKG4uZXhwcixuLnNldCk6bi5zZXQsdy5sZW5ndGg+MD9rPXMoaik6dT0hMTt3aGlsZSh3Lmxlbmd0aClxPXcucG9wKCkscj1xLG8ucmVsYXRpdmVbcV0/cj13LnBvcCgpOnE9IiIscj09bnVsbCYmKHI9ZCksby5yZWxhdGl2ZVtxXShrLHIsdil9ZWxzZSBrPXc9W119a3x8KGs9aiksa3x8bS5lcnJvcihxfHxiKTtpZihnLmNhbGwoayk9PT0iW29iamVjdCBBcnJheV0iKWlmKCF1KWUucHVzaC5hcHBseShlLGspO2Vsc2UgaWYoZCYmZC5ub2RlVHlwZT09PTEpZm9yKHQ9MDtrW3RdIT1udWxsO3QrKylrW3RdJiYoa1t0XT09PSEwfHxrW3RdLm5vZGVUeXBlPT09MSYmbS5jb250YWlucyhkLGtbdF0pKSYmZS5wdXNoKGpbdF0pO2Vsc2UgZm9yKHQ9MDtrW3RdIT1udWxsO3QrKylrW3RdJiZrW3RdLm5vZGVUeXBlPT09MSYmZS5wdXNoKGpbdF0pO2Vsc2UgcyhrLGUpO2wmJihtKGwsaCxlLGYpLG0udW5pcXVlU29ydChlKSk7cmV0dXJuIGV9O20udW5pcXVlU29ydD1mdW5jdGlvbihhKXtpZih1KXtoPWksYS5zb3J0KHUpO2lmKGgpZm9yKHZhciBiPTE7YjxhLmxlbmd0aDtiKyspYVtiXT09PWFbYi0xXSYmYS5zcGxpY2UoYi0tLDEpfXJldHVybiBhfSxtLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShhLG51bGwsbnVsbCxiKX0sbS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShiLG51bGwsbnVsbCxbYV0pLmxlbmd0aD4wfSxtLmZpbmQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaTtpZighYSlyZXR1cm5bXTtmb3IoZT0wLGY9by5vcmRlci5sZW5ndGg7ZTxmO2UrKyl7aD1vLm9yZGVyW2VdO2lmKGc9by5sZWZ0TWF0Y2hbaF0uZXhlYyhhKSl7aT1nWzFdLGcuc3BsaWNlKDEsMSk7aWYoaS5zdWJzdHIoaS5sZW5ndGgtMSkhPT0iXFwiKXtnWzFdPShnWzFdfHwiIikucmVwbGFjZShqLCIiKSxkPW8uZmluZFtoXShnLGIsYyk7aWYoZCE9bnVsbCl7YT1hLnJlcGxhY2Uoby5tYXRjaFtoXSwiIik7YnJlYWt9fX19ZHx8KGQ9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTpbXSk7cmV0dXJue3NldDpkLGV4cHI6YX19LG0uZmlsdGVyPWZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG4scCxxPWEscj1bXSxzPWMsdD1jJiZjWzBdJiZtLmlzWE1MKGNbMF0pO3doaWxlKGEmJmMubGVuZ3RoKXtmb3IoaCBpbiBvLmZpbHRlcilpZigoZj1vLmxlZnRNYXRjaFtoXS5leGVjKGEpKSE9bnVsbCYmZlsyXSl7az1vLmZpbHRlcltoXSxsPWZbMV0sZz0hMSxmLnNwbGljZSgxLDEpO2lmKGwuc3Vic3RyKGwubGVuZ3RoLTEpPT09IlxcIiljb250aW51ZTtzPT09ciYmKHI9W10pO2lmKG8ucHJlRmlsdGVyW2hdKXtmPW8ucHJlRmlsdGVyW2hdKGYscyxkLHIsZSx0KTtpZighZilnPWk9ITA7ZWxzZSBpZihmPT09ITApY29udGludWV9aWYoZilmb3Iobj0wOyhqPXNbbl0pIT1udWxsO24rKylqJiYoaT1rKGosZixuLHMpLHA9ZV5pLGQmJmkhPW51bGw/cD9nPSEwOnNbbl09ITE6cCYmKHIucHVzaChqKSxnPSEwKSk7aWYoaSE9PWIpe2R8fChzPXIpLGE9YS5yZXBsYWNlKG8ubWF0Y2hbaF0sIiIpO2lmKCFnKXJldHVybltdO2JyZWFrfX1pZihhPT09cSlpZihnPT1udWxsKW0uZXJyb3IoYSk7ZWxzZSBicmVhaztxPWF9cmV0dXJuIHN9LG0uZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2EpfTt2YXIgbj1tLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPWEubm9kZVR5cGUsZT0iIjtpZihkKXtpZihkPT09MXx8ZD09PTkpe2lmKHR5cGVvZiBhLnRleHRDb250ZW50PT0ic3RyaW5nIilyZXR1cm4gYS50ZXh0Q29udGVudDtpZih0eXBlb2YgYS5pbm5lclRleHQ9PSJzdHJpbmciKXJldHVybiBhLmlubmVyVGV4dC5yZXBsYWNlKGssIiIpO2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyllKz1uKGEpfWVsc2UgaWYoZD09PTN8fGQ9PT00KXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIGZvcihiPTA7Yz1hW2JdO2IrKyljLm5vZGVUeXBlIT09OCYmKGUrPW4oYykpO3JldHVybiBlfSxvPW0uc2VsZWN0b3JzPXtvcmRlcjpbIklEIiwiTkFNRSIsIlRBRyJdLG1hdGNoOntJRDovIygoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sQ0xBU1M6L1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxOQU1FOi9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLyxBVFRSOi9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVxzKig/OihcUz89KVxzKig/OihbJyJdKSguKj8pXDN8KCM/KD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKil8KXwpXHMqXF0vLFRBRzovXigoPzpbXHdcdTAwYzAtXHVGRkZGXCpcLV18XFwuKSspLyxDSElMRDovOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoXHMqKGV2ZW58b2RkfCg/OlsrXC1dP1xkK3woPzpbK1wtXT9cZCopP25ccyooPzpbK1wtXVxzKlxkKyk/KSlccypcKSk/LyxQT1M6LzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXlwtXXwkKS8sUFNFVURPOi86KCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspKD86XCgoWyciXT8pKCg/OlwoW15cKV0rXCl8W15cKFwpXSopKylcMlwpKT8vfSxsZWZ0TWF0Y2g6e30sYXR0ck1hcDp7ImNsYXNzIjoiY2xhc3NOYW1lIiwiZm9yIjoiaHRtbEZvciJ9LGF0dHJIYW5kbGU6e2hyZWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJocmVmIil9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJ0eXBlIil9fSxyZWxhdGl2ZTp7IisiOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGI9PSJzdHJpbmciLGQ9YyYmIWwudGVzdChiKSxlPWMmJiFkO2QmJihiPWIudG9Mb3dlckNhc2UoKSk7Zm9yKHZhciBmPTAsZz1hLmxlbmd0aCxoO2Y8ZztmKyspaWYoaD1hW2ZdKXt3aGlsZSgoaD1oLnByZXZpb3VzU2libGluZykmJmgubm9kZVR5cGUhPT0xKTthW2ZdPWV8fGgmJmgubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/aHx8ITE6aD09PWJ9ZSYmbS5maWx0ZXIoYixhLCEwKX0sIj4iOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD10eXBlb2YgYj09InN0cmluZyIsZT0wLGY9YS5sZW5ndGg7aWYoZCYmIWwudGVzdChiKSl7Yj1iLnRvTG93ZXJDYXNlKCk7Zm9yKDtlPGY7ZSsrKXtjPWFbZV07aWYoYyl7dmFyIGc9Yy5wYXJlbnROb2RlO2FbZV09Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yj9nOiExfX19ZWxzZXtmb3IoO2U8ZjtlKyspYz1hW2VdLGMmJihhW2VdPWQ/Yy5wYXJlbnROb2RlOmMucGFyZW50Tm9kZT09PWIpO2QmJm0uZmlsdGVyKGIsYSwhMCl9fSwiIjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj1lKyssZz14O3R5cGVvZiBiPT0ic3RyaW5nIiYmIWwudGVzdChiKSYmKGI9Yi50b0xvd2VyQ2FzZSgpLGQ9YixnPXcpLGcoInBhcmVudE5vZGUiLGIsZixhLGQsYyl9LCJ+IjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj1lKyssZz14O3R5cGVvZiBiPT0ic3RyaW5nIiYmIWwudGVzdChiKSYmKGI9Yi50b0xvd2VyQ2FzZSgpLGQ9YixnPXcpLGcoInByZXZpb3VzU2libGluZyIsYixmLGEsZCxjKX19LGZpbmQ6e0lEOmZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50QnlJZCE9InVuZGVmaW5lZCImJiFjKXt2YXIgZD1iLmdldEVsZW1lbnRCeUlkKGFbMV0pO3JldHVybiBkJiZkLnBhcmVudE5vZGU/W2RdOltdfX0sTkFNRTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlOYW1lIT0idW5kZWZpbmVkIil7dmFyIGM9W10sZD1iLmdldEVsZW1lbnRzQnlOYW1lKGFbMV0pO2Zvcih2YXIgZT0wLGY9ZC5sZW5ndGg7ZTxmO2UrKylkW2VdLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09YVsxXSYmYy5wdXNoKGRbZV0pO3JldHVybiBjLmxlbmd0aD09PTA/bnVsbDpjfX0sVEFHOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiKXJldHVybiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGFbMV0pfX0scHJlRmlsdGVyOntDTEFTUzpmdW5jdGlvbihhLGIsYyxkLGUsZil7YT0iICIrYVsxXS5yZXBsYWNlKGosIiIpKyIgIjtpZihmKXJldHVybiBhO2Zvcih2YXIgZz0wLGg7KGg9YltnXSkhPW51bGw7ZysrKWgmJihlXihoLmNsYXNzTmFtZSYmKCIgIitoLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoL1tcdFxuXHJdL2csIiAiKS5pbmRleE9mKGEpPj0wKT9jfHxkLnB1c2goaCk6YyYmKGJbZ109ITEpKTtyZXR1cm4hMX0sSUQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV0ucmVwbGFjZShqLCIiKX0sVEFHOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGFbMV0ucmVwbGFjZShqLCIiKS50b0xvd2VyQ2FzZSgpfSxDSElMRDpmdW5jdGlvbihhKXtpZihhWzFdPT09Im50aCIpe2FbMl18fG0uZXJyb3IoYVswXSksYVsyXT1hWzJdLnJlcGxhY2UoL15cK3xccyovZywiIik7dmFyIGI9LygtPykoXGQqKSg/Om4oWytcLV0/XGQqKSk/Ly5leGVjKGFbMl09PT0iZXZlbiImJiIybiJ8fGFbMl09PT0ib2RkIiYmIjJuKzEifHwhL1xELy50ZXN0KGFbMl0pJiYiMG4rIithWzJdfHxhWzJdKTthWzJdPWJbMV0rKGJbMl18fDEpLTAsYVszXT1iWzNdLTB9ZWxzZSBhWzJdJiZtLmVycm9yKGFbMF0pO2FbMF09ZSsrO3JldHVybiBhfSxBVFRSOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZz1hWzFdPWFbMV0ucmVwbGFjZShqLCIiKTshZiYmby5hdHRyTWFwW2ddJiYoYVsxXT1vLmF0dHJNYXBbZ10pLGFbNF09KGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGosIiIpLGFbMl09PT0ifj0iJiYoYVs0XT0iICIrYVs0XSsiICIpO3JldHVybiBhfSxQU0VVRE86ZnVuY3Rpb24oYixjLGQsZSxmKXtpZihiWzFdPT09Im5vdCIpaWYoKGEuZXhlYyhiWzNdKXx8IiIpLmxlbmd0aD4xfHwvXlx3Ly50ZXN0KGJbM10pKWJbM109bShiWzNdLG51bGwsbnVsbCxjKTtlbHNle3ZhciBnPW0uZmlsdGVyKGJbM10sYyxkLCEwXmYpO2R8fGUucHVzaC5hcHBseShlLGcpO3JldHVybiExfWVsc2UgaWYoby5tYXRjaC5QT1MudGVzdChiWzBdKXx8by5tYXRjaC5DSElMRC50ZXN0KGJbMF0pKXJldHVybiEwO3JldHVybiBifSxQT1M6ZnVuY3Rpb24oYSl7YS51bnNoaWZ0KCEwKTtyZXR1cm4gYX19LGZpbHRlcnM6e2VuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMSYmYS50eXBlIT09ImhpZGRlbiJ9LGRpc2FibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2hlY2tlZD09PSEwfSxzZWxlY3RlZDpmdW5jdGlvbihhKXthLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O3JldHVybiBhLnNlbGVjdGVkPT09ITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hIWEuZmlyc3RDaGlsZH0sZW1wdHk6ZnVuY3Rpb24oYSl7cmV0dXJuIWEuZmlyc3RDaGlsZH0saGFzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIW0oY1szXSxhKS5sZW5ndGh9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4vaFxkL2kudGVzdChhLm5vZGVOYW1lKX0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpLGM9YS50eXBlO3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYidGV4dCI9PT1jJiYoYj09PWN8fGI9PT1udWxsKX0scmFkaW86ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJyYWRpbyI9PT1hLnR5cGV9LGNoZWNrYm94OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiY2hlY2tib3giPT09YS50eXBlfSxmaWxlOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiZmlsZSI9PT1hLnR5cGV9LHBhc3N3b3JkOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYicGFzc3dvcmQiPT09YS50eXBlfSxzdWJtaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihiPT09ImlucHV0Inx8Yj09PSJidXR0b24iKSYmInN1Ym1pdCI9PT1hLnR5cGV9LGltYWdlOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiaW1hZ2UiPT09YS50eXBlfSxyZXNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKGI9PT0iaW5wdXQifHxiPT09ImJ1dHRvbiIpJiYicmVzZXQiPT09YS50eXBlfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBiPT09ImlucHV0IiYmImJ1dHRvbiI9PT1hLnR5cGV8fGI9PT0iYnV0dG9uIn0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaS50ZXN0KGEubm9kZU5hbWUpfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PWEub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50fX0sc2V0RmlsdGVyczp7Zmlyc3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PTB9LGxhc3Q6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGI9PT1kLmxlbmd0aC0xfSxldmVuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIlMj09PTB9LG9kZDpmdW5jdGlvbihhLGIpe3JldHVybiBiJTI9PT0xfSxsdDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI8Y1szXS0wfSxndDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI+Y1szXS0wfSxudGg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifSxlcTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGNbM10tMD09PWJ9fSxmaWx0ZXI6e1BTRVVETzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzFdLGY9by5maWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCk7aWYoZT09PSJjb250YWlucyIpcmV0dXJuKGEudGV4dENvbnRlbnR8fGEuaW5uZXJUZXh0fHxuKFthXSl8fCIiKS5pbmRleE9mKGJbM10pPj0wO2lmKGU9PT0ibm90Iil7dmFyIGc9YlszXTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspaWYoZ1toXT09PWEpcmV0dXJuITE7cmV0dXJuITB9bS5lcnJvcihlKX0sQ0hJTEQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPWJbMV0sbD1hO3N3aXRjaChrKXtjYXNlIm9ubHkiOmNhc2UiZmlyc3QiOndoaWxlKGw9bC5wcmV2aW91c1NpYmxpbmcpaWYobC5ub2RlVHlwZT09PTEpcmV0dXJuITE7aWYoaz09PSJmaXJzdCIpcmV0dXJuITA7bD1hO2Nhc2UibGFzdCI6d2hpbGUobD1sLm5leHRTaWJsaW5nKWlmKGwubm9kZVR5cGU9PT0xKXJldHVybiExO3JldHVybiEwO2Nhc2UibnRoIjpjPWJbMl0sZT1iWzNdO2lmKGM9PT0xJiZlPT09MClyZXR1cm4hMDtmPWJbMF0sZz1hLnBhcmVudE5vZGU7aWYoZyYmKGdbZF0hPT1mfHwhYS5ub2RlSW5kZXgpKXtpPTA7Zm9yKGw9Zy5maXJzdENoaWxkO2w7bD1sLm5leHRTaWJsaW5nKWwubm9kZVR5cGU9PT0xJiYobC5ub2RlSW5kZXg9KytpKTtnW2RdPWZ9aj1hLm5vZGVJbmRleC1lO3JldHVybiBjPT09MD9qPT09MDpqJWM9PT0wJiZqL2M+PTB9fSxJRDpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVUeXBlPT09MSYmYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifSxUQUc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PSIqIiYmYS5ub2RlVHlwZT09PTF8fCEhYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn0sQ0xBU1M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oIiAiKyhhLmNsYXNzTmFtZXx8YS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpKyIgIikuaW5kZXhPZihiKT4tMX0sQVRUUjpmdW5jdGlvbihhLGIpe3ZhciBjPWJbMV0sZD1tLmF0dHI/bS5hdHRyKGEsYyk6by5hdHRySGFuZGxlW2NdP28uYXR0ckhhbmRsZVtjXShhKTphW2NdIT1udWxsP2FbY106YS5nZXRBdHRyaWJ1dGUoYyksZT1kKyIiLGY9YlsyXSxnPWJbNF07cmV0dXJuIGQ9PW51bGw/Zj09PSIhPSI6IWYmJm0uYXR0cj9kIT1udWxsOmY9PT0iPSI/ZT09PWc6Zj09PSIqPSI/ZS5pbmRleE9mKGcpPj0wOmY9PT0ifj0iPygiICIrZSsiICIpLmluZGV4T2YoZyk+PTA6Zz9mPT09IiE9Ij9lIT09ZzpmPT09Il49Ij9lLmluZGV4T2YoZyk9PT0wOmY9PT0iJD0iP2Uuc3Vic3RyKGUubGVuZ3RoLWcubGVuZ3RoKT09PWc6Zj09PSJ8PSI/ZT09PWd8fGUuc3Vic3RyKDAsZy5sZW5ndGgrMSk9PT1nKyItIjohMTplJiZkIT09ITF9LFBPUzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzJdLGY9by5zZXRGaWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCl9fX0scD1vLm1hdGNoLlBPUyxxPWZ1bmN0aW9uKGEsYil7cmV0dXJuIlxcIisoYi0wKzEpfTtmb3IodmFyIHIgaW4gby5tYXRjaClvLm1hdGNoW3JdPW5ldyBSZWdFeHAoby5tYXRjaFtyXS5zb3VyY2UrLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlKSxvLmxlZnRNYXRjaFtyXT1uZXcgUmVnRXhwKC8oXig/Oi58XHJ8XG4pKj8pLy5zb3VyY2Urby5tYXRjaFtyXS5zb3VyY2UucmVwbGFjZSgvXFwoXGQrKS9nLHEpKTt2YXIgcz1mdW5jdGlvbihhLGIpe2E9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwwKTtpZihiKXtiLnB1c2guYXBwbHkoYixhKTtyZXR1cm4gYn1yZXR1cm4gYX07dHJ5e0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2godCl7cz1mdW5jdGlvbihhLGIpe3ZhciBjPTAsZD1ifHxbXTtpZihnLmNhbGwoYSk9PT0iW29iamVjdCBBcnJheV0iKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGQsYSk7ZWxzZSBpZih0eXBlb2YgYS5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZT1hLmxlbmd0aDtjPGU7YysrKWQucHVzaChhW2NdKTtlbHNlIGZvcig7YVtjXTtjKyspZC5wdXNoKGFbY10pO3JldHVybiBkfX12YXIgdSx2O2MuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP3U9ZnVuY3Rpb24oYSxiKXtpZihhPT09Yil7aD0hMDtyZXR1cm4gMH1pZighYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8IWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24pcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/LTE6MTtyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSY0Py0xOjF9Oih1PWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2g9ITA7cmV0dXJuIDB9aWYoYS5zb3VyY2VJbmRleCYmYi5zb3VyY2VJbmRleClyZXR1cm4gYS5zb3VyY2VJbmRleC1iLnNvdXJjZUluZGV4O3ZhciBjLGQsZT1bXSxmPVtdLGc9YS5wYXJlbnROb2RlLGk9Yi5wYXJlbnROb2RlLGo9ZztpZihnPT09aSlyZXR1cm4gdihhLGIpO2lmKCFnKXJldHVybi0xO2lmKCFpKXJldHVybiAxO3doaWxlKGopZS51bnNoaWZ0KGopLGo9ai5wYXJlbnROb2RlO2o9aTt3aGlsZShqKWYudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtjPWUubGVuZ3RoLGQ9Zi5sZW5ndGg7Zm9yKHZhciBrPTA7azxjJiZrPGQ7aysrKWlmKGVba10hPT1mW2tdKXJldHVybiB2KGVba10sZltrXSk7cmV0dXJuIGs9PT1jP3YoYSxmW2tdLC0xKTp2KGVba10sYiwxKX0sdj1mdW5jdGlvbihhLGIsYyl7aWYoYT09PWIpcmV0dXJuIGM7dmFyIGQ9YS5uZXh0U2libGluZzt3aGlsZShkKXtpZihkPT09YilyZXR1cm4tMTtkPWQubmV4dFNpYmxpbmd9cmV0dXJuIDF9KSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZD0ic2NyaXB0IisobmV3IERhdGUpLmdldFRpbWUoKSxlPWMuZG9jdW1lbnRFbGVtZW50O2EuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2QrIicvPiIsZS5pbnNlcnRCZWZvcmUoYSxlLmZpcnN0Q2hpbGQpLGMuZ2V0RWxlbWVudEJ5SWQoZCkmJihvLmZpbmQuSUQ9ZnVuY3Rpb24oYSxjLGQpe2lmKHR5cGVvZiBjLmdldEVsZW1lbnRCeUlkIT0idW5kZWZpbmVkIiYmIWQpe3ZhciBlPWMuZ2V0RWxlbWVudEJ5SWQoYVsxXSk7cmV0dXJuIGU/ZS5pZD09PWFbMV18fHR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlPT09YVsxXT9bZV06YjpbXX19LG8uZmlsdGVyLklEPWZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSE9InVuZGVmaW5lZCImJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmMmJmMubm9kZVZhbHVlPT09Yn0pLGUucmVtb3ZlQ2hpbGQoYSksZT1hPW51bGx9KCksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYXBwZW5kQ2hpbGQoYy5jcmVhdGVDb21tZW50KCIiKSksYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aD4wJiYoby5maW5kLlRBRz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYVsxXSk7aWYoYVsxXT09PSIqIil7dmFyIGQ9W107Zm9yKHZhciBlPTA7Y1tlXTtlKyspY1tlXS5ub2RlVHlwZT09PTEmJmQucHVzaChjW2VdKTtjPWR9cmV0dXJuIGN9KSxhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsYS5maXJzdENoaWxkJiZ0eXBlb2YgYS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9InVuZGVmaW5lZCImJmEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSE9PSIjIiYmKG8uYXR0ckhhbmRsZS5ocmVmPWZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9KSxhPW51bGx9KCksYy5xdWVyeVNlbGVjdG9yQWxsJiZmdW5jdGlvbigpe3ZhciBhPW0sYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9Il9fc2l6emxlX18iO2IuaW5uZXJIVE1MPSI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7aWYoIWIucXVlcnlTZWxlY3RvckFsbHx8Yi5xdWVyeVNlbGVjdG9yQWxsKCIuVEVTVCIpLmxlbmd0aCE9PTApe209ZnVuY3Rpb24oYixlLGYsZyl7ZT1lfHxjO2lmKCFnJiYhbS5pc1hNTChlKSl7dmFyIGg9L14oXHcrJCl8XlwuKFtcd1wtXSskKXxeIyhbXHdcLV0rJCkvLmV4ZWMoYik7aWYoaCYmKGUubm9kZVR5cGU9PT0xfHxlLm5vZGVUeXBlPT09OSkpe2lmKGhbMV0pcmV0dXJuIHMoZS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKSxmKTtpZihoWzJdJiZvLmZpbmQuQ0xBU1MmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gcyhlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaFsyXSksZil9aWYoZS5ub2RlVHlwZT09PTkpe2lmKGI9PT0iYm9keSImJmUuYm9keSlyZXR1cm4gcyhbZS5ib2R5XSxmKTtpZihoJiZoWzNdKXt2YXIgaT1lLmdldEVsZW1lbnRCeUlkKGhbM10pO2lmKCFpfHwhaS5wYXJlbnROb2RlKXJldHVybiBzKFtdLGYpO2lmKGkuaWQ9PT1oWzNdKXJldHVybiBzKFtpXSxmKX10cnl7cmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKGIpLGYpfWNhdGNoKGope319ZWxzZSBpZihlLm5vZGVUeXBlPT09MSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im9iamVjdCIpe3ZhciBrPWUsbD1lLmdldEF0dHJpYnV0ZSgiaWQiKSxuPWx8fGQscD1lLnBhcmVudE5vZGUscT0vXlxzKlsrfl0vLnRlc3QoYik7bD9uPW4ucmVwbGFjZSgvJy9nLCJcXCQmIik6ZS5zZXRBdHRyaWJ1dGUoImlkIixuKSxxJiZwJiYoZT1lLnBhcmVudE5vZGUpO3RyeXtpZighcXx8cClyZXR1cm4gcyhlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZD0nIituKyInXSAiK2IpLGYpfWNhdGNoKHIpe31maW5hbGx5e2x8fGsucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGEoYixlLGYsZyl9O2Zvcih2YXIgZSBpbiBhKW1bZV09YVtlXTtiPW51bGx9fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5kb2N1bWVudEVsZW1lbnQsYj1hLm1hdGNoZXNTZWxlY3Rvcnx8YS5tb3pNYXRjaGVzU2VsZWN0b3J8fGEud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxhLm1zTWF0Y2hlc1NlbGVjdG9yO2lmKGIpe3ZhciBkPSFiLmNhbGwoYy5jcmVhdGVFbGVtZW50KCJkaXYiKSwiZGl2IiksZT0hMTt0cnl7Yi5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LCJbdGVzdCE9JyddOnNpenpsZSIpfWNhdGNoKGYpe2U9ITB9bS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxjKXtjPWMucmVwbGFjZSgvXD1ccyooW14nIlxdXSopXHMqXF0vZywiPSckMSddIik7aWYoIW0uaXNYTUwoYSkpdHJ5e2lmKGV8fCFvLm1hdGNoLlBTRVVETy50ZXN0KGMpJiYhLyE9Ly50ZXN0KGMpKXt2YXIgZj1iLmNhbGwoYSxjKTtpZihmfHwhZHx8YS5kb2N1bWVudCYmYS5kb2N1bWVudC5ub2RlVHlwZSE9PTExKXJldHVybiBmfX1jYXRjaChnKXt9cmV0dXJuIG0oYyxudWxsLG51bGwsW2FdKS5sZW5ndGg+MH19fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCEhYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGghPT0wKXthLmxhc3RDaGlsZC5jbGFzc05hbWU9ImUiO2lmKGEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD09PTEpcmV0dXJuO28ub3JkZXIuc3BsaWNlKDEsMCwiQ0xBU1MiKSxvLmZpbmQuQ0xBU1M9ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPSJ1bmRlZmluZWQiJiYhYylyZXR1cm4gYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGFbMV0pfSxhPW51bGx9fSgpLGMuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zP20uY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSE9PWImJihhLmNvbnRhaW5zP2EuY29udGFpbnMoYik6ITApfTpjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9tLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNil9Om0uY29udGFpbnM9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbS5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj0oYT9hLm93bmVyRG9jdW1lbnR8fGE6MCkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiP2Iubm9kZU5hbWUhPT0iSFRNTCI6ITF9O3ZhciB5PWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPVtdLGY9IiIsZz1iLm5vZGVUeXBlP1tiXTpiO3doaWxlKGQ9by5tYXRjaC5QU0VVRE8uZXhlYyhhKSlmKz1kWzBdLGE9YS5yZXBsYWNlKG8ubWF0Y2guUFNFVURPLCIiKTthPW8ucmVsYXRpdmVbYV0/YSsiKiI6YTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspbShhLGdbaF0sZSxjKTtyZXR1cm4gbS5maWx0ZXIoZixlKX07bS5hdHRyPWYuYXR0cixtLnNlbGVjdG9ycy5hdHRyTWFwPXt9LGYuZmluZD1tLGYuZXhwcj1tLnNlbGVjdG9ycyxmLmV4cHJbIjoiXT1mLmV4cHIuZmlsdGVycyxmLnVuaXF1ZT1tLnVuaXF1ZVNvcnQsZi50ZXh0PW0uZ2V0VGV4dCxmLmlzWE1MRG9jPW0uaXNYTUwsZi5jb250YWlucz1tLmNvbnRhaW5zfSgpO3ZhciBMPS9VbnRpbCQvLE09L14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sTj0vLC8sTz0vXi5bXjojXFtcLixdKiQvLFA9QXJyYXkucHJvdG90eXBlLnNsaWNlLFE9Zi5leHByLm1hdGNoLlBPUyxSPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2YuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYyxkO2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4gZihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylpZihmLmNvbnRhaW5zKGJbY10sdGhpcykpcmV0dXJuITB9KTt2YXIgZT10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsYSksZyxoLGk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2c9ZS5sZW5ndGgsZi5maW5kKGEsdGhpc1tjXSxlKTtpZihjPjApZm9yKGg9ZztoPGUubGVuZ3RoO2grKylmb3IoaT0wO2k8ZztpKyspaWYoZVtpXT09PWVbaF0pe2Uuc3BsaWNlKGgtLSwxKTticmVha319cmV0dXJuIGV9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1mKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGM9Yi5sZW5ndGg7YTxjO2ErKylpZihmLmNvbnRhaW5zKHRoaXMsYlthXSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhUKHRoaXMsYSwhMSksIm5vdCIsYSl9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlzLGEsITApLCJmaWx0ZXIiLGEpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJih0eXBlb2YgYT09InN0cmluZyI/US50ZXN0KGEpP2YoYSx0aGlzLmNvbnRleHQpLmluZGV4KHRoaXNbMF0pPj0wOmYuZmlsdGVyKGEsdGhpcykubGVuZ3RoPjA6dGhpcy5maWx0ZXIoYSkubGVuZ3RoPjApfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZCxlLGc9dGhpc1swXTtpZihmLmlzQXJyYXkoYSkpe3ZhciBoPTE7d2hpbGUoZyYmZy5vd25lckRvY3VtZW50JiZnIT09Yil7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmKGcpLmlzKGFbZF0pJiZjLnB1c2goe3NlbGVjdG9yOmFbZF0sZWxlbTpnLGxldmVsOmh9KTtnPWcucGFyZW50Tm9kZSxoKyt9cmV0dXJuIGN9dmFyIGk9US50ZXN0KGEpfHx0eXBlb2YgYSE9InN0cmluZyI/ZihhLGJ8fHRoaXMuY29udGV4dCk6MDtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO3doaWxlKGcpe2lmKGk/aS5pbmRleChnKT4tMTpmLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGcsYSkpe2MucHVzaChnKTticmVha31nPWcucGFyZW50Tm9kZTtpZighZ3x8IWcub3duZXJEb2N1bWVudHx8Zz09PWJ8fGcubm9kZVR5cGU9PT0xMSlicmVha319Yz1jLmxlbmd0aD4xP2YudW5pcXVlKGMpOmM7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGMsImNsb3Nlc3QiLGEpfSxpbmRleDpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMucHJldkFsbCgpLmxlbmd0aDotMTtpZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGYuaW5BcnJheSh0aGlzWzBdLGYoYSkpO3JldHVybiBmLmluQXJyYXkoYS5qcXVlcnk/YVswXTphLHRoaXMpfSxhZGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYT09InN0cmluZyI/ZihhLGIpOmYubWFrZUFycmF5KGEmJmEubm9kZVR5cGU/W2FdOmEpLGQ9Zi5tZXJnZSh0aGlzLmdldCgpLGMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhTKGNbMF0pfHxTKGRbMF0pP2Q6Zi51bmlxdWUoZCkpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSksZi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiZiLm5vZGVUeXBlIT09MTE/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubnRoKGEsMiwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpmLm1ha2VBcnJheShhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGMsZCl7dmFyIGU9Zi5tYXAodGhpcyxiLGMpO0wudGVzdChhKXx8KGQ9YyksZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiYoZT1mLmZpbHRlcihkLGUpKSxlPXRoaXMubGVuZ3RoPjEmJiFSW2FdP2YudW5pcXVlKGUpOmUsKHRoaXMubGVuZ3RoPjF8fE4udGVzdChkKSkmJk0udGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsUC5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KSxmLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixjKXtjJiYoYT0iOm5vdCgiK2ErIikiKTtyZXR1cm4gYi5sZW5ndGg9PT0xP2YuZmluZC5tYXRjaGVzU2VsZWN0b3IoYlswXSxhKT9bYlswXV06W106Zi5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1bXSxnPWFbY107d2hpbGUoZyYmZy5ub2RlVHlwZSE9PTkmJihkPT09Ynx8Zy5ub2RlVHlwZSE9PTF8fCFmKGcpLmlzKGQpKSlnLm5vZGVUeXBlPT09MSYmZS5wdXNoKGcpLGc9Z1tjXTtyZXR1cm4gZX0sbnRoOmZ1bmN0aW9uKGEsYixjLGQpe2I9Ynx8MTt2YXIgZT0wO2Zvcig7YTthPWFbY10paWYoYS5ub2RlVHlwZT09PTEmJisrZT09PWIpYnJlYWs7cmV0dXJuIGF9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IoO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PT0xJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pO3ZhciBWPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98Y2FudmFzfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1lfHZpZGVvIixXPS8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csWD0vXlxzKy8sWT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLFo9LzwoW1x3Ol0rKS8sJD0vPHRib2R5L2ksXz0vPHwmIz9cdys7LyxiYT0vPCg/OnNjcmlwdHxzdHlsZSkvaSxiYj0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLGJjPW5ldyBSZWdFeHAoIjwoPzoiK1YrIikiLCJpIiksYmQ9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksYmU9L1wvKGphdmF8ZWNtYSlzY3JpcHQvaSxiZj0vXlxzKjwhKD86XFtDREFUQVxbfFwtXC0pLyxiZz17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfSxiaD1VKGMpO2JnLm9wdGdyb3VwPWJnLm9wdGlvbixiZy50Ym9keT1iZy50Zm9vdD1iZy5jb2xncm91cD1iZy5jYXB0aW9uPWJnLnRoZWFkLGJnLnRoPWJnLnRkLGYuc3VwcG9ydC5odG1sU2VyaWFsaXplfHwoYmcuX2RlZmF1bHQ9WzEsImRpdjxkaXY+IiwiPC9kaXY+Il0pLGYuZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Yy50ZXh0KGEuY2FsbCh0aGlzLGIsYy50ZXh0KCkpKX0pO2lmKHR5cGVvZiBhIT0ib2JqZWN0IiYmYSE9PWIpcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8YykuY3JlYXRlVGV4dE5vZGUoYSkpO3JldHVybiBmLnRleHQodGhpcyl9LHdyYXBBbGw6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPWYoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJmEuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTEpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtmKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Zi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGYodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuYXBwZW5kQ2hpbGQoYSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMCxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9Zi5jbGVhbihhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLHRoaXMudG9BcnJheSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYSwiYmVmb3JlIixhcmd1bWVudHMpfX0sYWZ0ZXI6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIixhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLGYuY2xlYW4oYXJndW1lbnRzKSk7cmV0dXJuIGF9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkOyhkPXRoaXNbY10pIT1udWxsO2MrKylpZighYXx8Zi5maWx0ZXIoYSxbZF0pLmxlbmd0aCkhYiYmZC5ub2RlVHlwZT09PTEmJihmLmNsZWFuRGF0YShkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLGYuY2xlYW5EYXRhKFtkXSkpLGQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpCntmb3IodmFyIGE9MCxiOyhiPXRoaXNbYV0pIT1udWxsO2ErKyl7Yi5ub2RlVHlwZT09PTEmJmYuY2xlYW5EYXRhKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7d2hpbGUoYi5maXJzdENoaWxkKWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX1yZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSxiKXthPWE9PW51bGw/ITE6YSxiPWI9PW51bGw/YTpiO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBmLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe2lmKGE9PT1iKXJldHVybiB0aGlzWzBdJiZ0aGlzWzBdLm5vZGVUeXBlPT09MT90aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKFcsIiIpOm51bGw7aWYodHlwZW9mIGE9PSJzdHJpbmciJiYhYmEudGVzdChhKSYmKGYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZXx8IVgudGVzdChhKSkmJiFiZ1soWi5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1hLnJlcGxhY2UoWSwiPCQxPjwvJDI+Iik7dHJ5e2Zvcih2YXIgYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKyl0aGlzW2NdLm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKHRoaXNbY10uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksdGhpc1tjXS5pbm5lckhUTUw9YSl9Y2F0Y2goZSl7dGhpcy5lbXB0eSgpLmFwcGVuZChhKX19ZWxzZSBmLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Yy5odG1sKGEuY2FsbCh0aGlzLGIsYy5odG1sKCkpKX0pOnRoaXMuZW1wdHkoKS5hcHBlbmQoYSk7cmV0dXJuIHRoaXN9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9Zih0aGlzKSxkPWMuaHRtbCgpO2MucmVwbGFjZVdpdGgoYS5jYWxsKHRoaXMsYixkKSl9KTt0eXBlb2YgYSE9InN0cmluZyImJihhPWYoYSkuZGV0YWNoKCkpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5leHRTaWJsaW5nLGM9dGhpcy5wYXJlbnROb2RlO2YodGhpcykucmVtb3ZlKCksYj9mKGIpLmJlZm9yZShhKTpmKGMpLmFwcGVuZChhKX0pfXJldHVybiB0aGlzLmxlbmd0aD90aGlzLnB1c2hTdGFjayhmKGYuaXNGdW5jdGlvbihhKT9hKCk6YSksInJlcGxhY2VXaXRoIixhKTp0aGlzfSxkZXRhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVtb3ZlKGEsITApfSxkb21NYW5pcDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZyxoLGksaj1hWzBdLGs9W107aWYoIWYuc3VwcG9ydC5jaGVja0Nsb25lJiZhcmd1bWVudHMubGVuZ3RoPT09MyYmdHlwZW9mIGo9PSJzdHJpbmciJiZiZC50ZXN0KGopKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmKHRoaXMpLmRvbU1hbmlwKGEsYyxkLCEwKX0pO2lmKGYuaXNGdW5jdGlvbihqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBnPWYodGhpcyk7YVswXT1qLmNhbGwodGhpcyxlLGM/Zy5odG1sKCk6YiksZy5kb21NYW5pcChhLGMsZCl9KTtpZih0aGlzWzBdKXtpPWomJmoucGFyZW50Tm9kZSxmLnN1cHBvcnQucGFyZW50Tm9kZSYmaSYmaS5ub2RlVHlwZT09PTExJiZpLmNoaWxkTm9kZXMubGVuZ3RoPT09dGhpcy5sZW5ndGg/ZT17ZnJhZ21lbnQ6aX06ZT1mLmJ1aWxkRnJhZ21lbnQoYSx0aGlzLGspLGg9ZS5mcmFnbWVudCxoLmNoaWxkTm9kZXMubGVuZ3RoPT09MT9nPWg9aC5maXJzdENoaWxkOmc9aC5maXJzdENoaWxkO2lmKGcpe2M9YyYmZi5ub2RlTmFtZShnLCJ0ciIpO2Zvcih2YXIgbD0wLG09dGhpcy5sZW5ndGgsbj1tLTE7bDxtO2wrKylkLmNhbGwoYz9iaSh0aGlzW2xdLGcpOnRoaXNbbF0sZS5jYWNoZWFibGV8fG0+MSYmbDxuP2YuY2xvbmUoaCwhMCwhMCk6aCl9ay5sZW5ndGgmJmYuZWFjaChrLGJwKX1yZXR1cm4gdGhpc319KSxmLmJ1aWxkRnJhZ21lbnQ9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGcsaCxpLGo9YVswXTtiJiZiWzBdJiYoaT1iWzBdLm93bmVyRG9jdW1lbnR8fGJbMF0pLGkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudHx8KGk9YyksYS5sZW5ndGg9PT0xJiZ0eXBlb2Ygaj09InN0cmluZyImJmoubGVuZ3RoPDUxMiYmaT09PWMmJmouY2hhckF0KDApPT09IjwiJiYhYmIudGVzdChqKSYmKGYuc3VwcG9ydC5jaGVja0Nsb25lfHwhYmQudGVzdChqKSkmJihmLnN1cHBvcnQuaHRtbDVDbG9uZXx8IWJjLnRlc3QoaikpJiYoZz0hMCxoPWYuZnJhZ21lbnRzW2pdLGgmJmghPT0xJiYoZT1oKSksZXx8KGU9aS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksZi5jbGVhbihhLGksZSxkKSksZyYmKGYuZnJhZ21lbnRzW2pdPWg/ZToxKTtyZXR1cm57ZnJhZ21lbnQ6ZSxjYWNoZWFibGU6Z319LGYuZnJhZ21lbnRzPXt9LGYuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihjKXt2YXIgZD1bXSxlPWYoYyksZz10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtpZihnJiZnLm5vZGVUeXBlPT09MTEmJmcuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiZlLmxlbmd0aD09PTEpe2VbYl0odGhpc1swXSk7cmV0dXJuIHRoaXN9Zm9yKHZhciBoPTAsaT1lLmxlbmd0aDtoPGk7aCsrKXt2YXIgaj0oaD4wP3RoaXMuY2xvbmUoITApOnRoaXMpLmdldCgpO2YoZVtoXSlbYl0oaiksZD1kLmNvbmNhdChqKX1yZXR1cm4gdGhpcy5wdXNoU3RhY2soZCxhLGUuc2VsZWN0b3IpfX0pLGYuZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxnLGg9Zi5zdXBwb3J0Lmh0bWw1Q2xvbmV8fCFiYy50ZXN0KCI8IithLm5vZGVOYW1lKT9hLmNsb25lTm9kZSghMCk6Ym8oYSk7aWYoKCFmLnN1cHBvcnQubm9DbG9uZUV2ZW50fHwhZi5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkKSYmKGEubm9kZVR5cGU9PT0xfHxhLm5vZGVUeXBlPT09MTEpJiYhZi5pc1hNTERvYyhhKSl7YmsoYSxoKSxkPWJsKGEpLGU9YmwoaCk7Zm9yKGc9MDtkW2ddOysrZyllW2ddJiZiayhkW2ddLGVbZ10pfWlmKGIpe2JqKGEsaCk7aWYoYyl7ZD1ibChhKSxlPWJsKGgpO2ZvcihnPTA7ZFtnXTsrK2cpYmooZFtnXSxlW2ddKX19ZD1lPW51bGw7cmV0dXJuIGh9LGNsZWFuOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBnO2I9Ynx8Yyx0eXBlb2YgYi5jcmVhdGVFbGVtZW50PT0idW5kZWZpbmVkIiYmKGI9Yi5vd25lckRvY3VtZW50fHxiWzBdJiZiWzBdLm93bmVyRG9jdW1lbnR8fGMpO3ZhciBoPVtdLGk7Zm9yKHZhciBqPTAsazsoaz1hW2pdKSE9bnVsbDtqKyspe3R5cGVvZiBrPT0ibnVtYmVyIiYmKGsrPSIiKTtpZighayljb250aW51ZTtpZih0eXBlb2Ygaz09InN0cmluZyIpaWYoIV8udGVzdChrKSlrPWIuY3JlYXRlVGV4dE5vZGUoayk7ZWxzZXtrPWsucmVwbGFjZShZLCI8JDE+PC8kMj4iKTt2YXIgbD0oWi5leGVjKGspfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLG09YmdbbF18fGJnLl9kZWZhdWx0LG49bVswXSxvPWIuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yj09PWM/YmguYXBwZW5kQ2hpbGQobyk6VShiKS5hcHBlbmRDaGlsZChvKSxvLmlubmVySFRNTD1tWzFdK2srbVsyXTt3aGlsZShuLS0pbz1vLmxhc3RDaGlsZDtpZighZi5zdXBwb3J0LnRib2R5KXt2YXIgcD0kLnRlc3QoaykscT1sPT09InRhYmxlIiYmIXA/by5maXJzdENoaWxkJiZvLmZpcnN0Q2hpbGQuY2hpbGROb2RlczptWzFdPT09Ijx0YWJsZT4iJiYhcD9vLmNoaWxkTm9kZXM6W107Zm9yKGk9cS5sZW5ndGgtMTtpPj0wOy0taSlmLm5vZGVOYW1lKHFbaV0sInRib2R5IikmJiFxW2ldLmNoaWxkTm9kZXMubGVuZ3RoJiZxW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocVtpXSl9IWYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmWC50ZXN0KGspJiZvLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKFguZXhlYyhrKVswXSksby5maXJzdENoaWxkKSxrPW8uY2hpbGROb2Rlc312YXIgcjtpZighZi5zdXBwb3J0LmFwcGVuZENoZWNrZWQpaWYoa1swXSYmdHlwZW9mIChyPWsubGVuZ3RoKT09Im51bWJlciIpZm9yKGk9MDtpPHI7aSsrKWJuKGtbaV0pO2Vsc2UgYm4oayk7ay5ub2RlVHlwZT9oLnB1c2goayk6aD1mLm1lcmdlKGgsayl9aWYoZCl7Zz1mdW5jdGlvbihhKXtyZXR1cm4hYS50eXBlfHxiZS50ZXN0KGEudHlwZSl9O2ZvcihqPTA7aFtqXTtqKyspaWYoZSYmZi5ub2RlTmFtZShoW2pdLCJzY3JpcHQiKSYmKCFoW2pdLnR5cGV8fGhbal0udHlwZS50b0xvd2VyQ2FzZSgpPT09InRleHQvamF2YXNjcmlwdCIpKWUucHVzaChoW2pdLnBhcmVudE5vZGU/aFtqXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGhbal0pOmhbal0pO2Vsc2V7aWYoaFtqXS5ub2RlVHlwZT09PTEpe3ZhciBzPWYuZ3JlcChoW2pdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxnKTtoLnNwbGljZS5hcHBseShoLFtqKzEsMF0uY29uY2F0KHMpKX1kLmFwcGVuZENoaWxkKGhbal0pfX1yZXR1cm4gaH0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1mLmNhY2hlLGU9Zi5ldmVudC5zcGVjaWFsLGc9Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG87Zm9yKHZhciBoPTAsaTsoaT1hW2hdKSE9bnVsbDtoKyspe2lmKGkubm9kZU5hbWUmJmYubm9EYXRhW2kubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pY29udGludWU7Yz1pW2YuZXhwYW5kb107aWYoYyl7Yj1kW2NdO2lmKGImJmIuZXZlbnRzKXtmb3IodmFyIGogaW4gYi5ldmVudHMpZVtqXT9mLmV2ZW50LnJlbW92ZShpLGopOmYucmVtb3ZlRXZlbnQoaSxqLGIuaGFuZGxlKTtiLmhhbmRsZSYmKGIuaGFuZGxlLmVsZW09bnVsbCl9Zz9kZWxldGUgaVtmLmV4cGFuZG9dOmkucmVtb3ZlQXR0cmlidXRlJiZpLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pLGRlbGV0ZSBkW2NdfX19fSk7dmFyIGJxPS9hbHBoYVwoW14pXSpcKS9pLGJyPS9vcGFjaXR5PShbXildKikvLGJzPS8oW0EtWl18Xm1zKS9nLGJ0PS9eLT9cZCsoPzpweCk/JC9pLGJ1PS9eLT9cZC8sYnY9L14oW1wtK10pPShbXC0rLlxkZV0rKS8sYnc9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJ4PVsiTGVmdCIsIlJpZ2h0Il0sYnk9WyJUb3AiLCJCb3R0b20iXSxieixiQSxiQjtmLmZuLmNzcz1mdW5jdGlvbihhLGMpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0yJiZjPT09YilyZXR1cm4gdGhpcztyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGMsITAsZnVuY3Rpb24oYSxjLGQpe3JldHVybiBkIT09Yj9mLnN0eWxlKGEsYyxkKTpmLmNzcyhhLGMpfSl9LGYuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9YnooYSwib3BhY2l0eSIsIm9wYWNpdHkiKTtyZXR1cm4gYz09PSIiPyIxIjpjfXJldHVybiBhLnN0eWxlLm9wYWNpdHl9fX0sY3NzTnVtYmVyOntmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6Zi5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGMsZCxlKXtpZighIWEmJmEubm9kZVR5cGUhPT0zJiZhLm5vZGVUeXBlIT09OCYmISFhLnN0eWxlKXt2YXIgZyxoLGk9Zi5jYW1lbENhc2UoYyksaj1hLnN0eWxlLGs9Zi5jc3NIb29rc1tpXTtjPWYuY3NzUHJvcHNbaV18fGk7aWYoZD09PWIpe2lmKGsmJiJnZXQiaW4gayYmKGc9ay5nZXQoYSwhMSxlKSkhPT1iKXJldHVybiBnO3JldHVybiBqW2NdfWg9dHlwZW9mIGQsaD09PSJzdHJpbmciJiYoZz1idi5leGVjKGQpKSYmKGQ9KyhnWzFdKzEpKitnWzJdK3BhcnNlRmxvYXQoZi5jc3MoYSxjKSksaD0ibnVtYmVyIik7aWYoZD09bnVsbHx8aD09PSJudW1iZXIiJiZpc05hTihkKSlyZXR1cm47aD09PSJudW1iZXIiJiYhZi5jc3NOdW1iZXJbaV0mJihkKz0icHgiKTtpZigha3x8ISgic2V0ImluIGspfHwoZD1rLnNldChhLGQpKSE9PWIpdHJ5e2pbY109ZH1jYXRjaChsKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnO2M9Zi5jYW1lbENhc2UoYyksZz1mLmNzc0hvb2tzW2NdLGM9Zi5jc3NQcm9wc1tjXXx8YyxjPT09ImNzc0Zsb2F0IiYmKGM9ImZsb2F0Iik7aWYoZyYmImdldCJpbiBnJiYoZT1nLmdldChhLCEwLGQpKSE9PWIpcmV0dXJuIGU7aWYoYnopcmV0dXJuIGJ6KGEsYyl9LHN3YXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt9O2Zvcih2YXIgZSBpbiBiKWRbZV09YS5zdHlsZVtlXSxhLnN0eWxlW2VdPWJbZV07Yy5jYWxsKGEpO2ZvcihlIGluIGIpYS5zdHlsZVtlXT1kW2VdfX0pLGYuY3VyQ1NTPWYuY3NzLGYuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtmLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlO2lmKGMpe2lmKGEub2Zmc2V0V2lkdGghPT0wKXJldHVybiBiQyhhLGIsZCk7Zi5zd2FwKGEsYncsZnVuY3Rpb24oKXtlPWJDKGEsYixkKX0pO3JldHVybiBlfX0sc2V0OmZ1bmN0aW9uKGEsYil7aWYoIWJ0LnRlc3QoYikpcmV0dXJuIGI7Yj1wYXJzZUZsb2F0KGIpO2lmKGI+PTApcmV0dXJuIGIrInB4In19fSksZi5zdXBwb3J0Lm9wYWNpdHl8fChmLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBici50ZXN0KChiJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5maWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/cGFyc2VGbG9hdChSZWdFeHAuJDEpLzEwMCsiIjpiPyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zdHlsZSxkPWEuY3VycmVudFN0eWxlLGU9Zi5pc051bWVyaWMoYik/ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSI6IiIsZz1kJiZkLmZpbHRlcnx8Yy5maWx0ZXJ8fCIiO2Muem9vbT0xO2lmKGI+PTEmJmYudHJpbShnLnJlcGxhY2UoYnEsIiIpKT09PSIiKXtjLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIik7aWYoZCYmIWQuZmlsdGVyKXJldHVybn1jLmZpbHRlcj1icS50ZXN0KGcpP2cucmVwbGFjZShicSxlKTpnKyIgIitlfX0pLGYoZnVuY3Rpb24oKXtmLnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KGYuY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihhLGIpe3ZhciBjO2Yuc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxmdW5jdGlvbigpe2I/Yz1ieihhLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW5SaWdodCIpOmM9YS5zdHlsZS5tYXJnaW5SaWdodH0pO3JldHVybiBjfX0pfSksYy5kZWZhdWx0VmlldyYmYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlJiYoYkE9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU7Yj1iLnJlcGxhY2UoYnMsIi0kMSIpLnRvTG93ZXJDYXNlKCksKGQ9YS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSYmKGU9ZC5nZXRDb21wdXRlZFN0eWxlKGEsbnVsbCkpJiYoYz1lLmdldFByb3BlcnR5VmFsdWUoYiksYz09PSIiJiYhZi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGEpJiYoYz1mLnN0eWxlKGEsYikpKTtyZXR1cm4gY30pLGMuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKGJCPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9YS5jdXJyZW50U3R5bGUmJmEuY3VycmVudFN0eWxlW2JdLGc9YS5zdHlsZTtmPT09bnVsbCYmZyYmKGU9Z1tiXSkmJihmPWUpLCFidC50ZXN0KGYpJiZidS50ZXN0KGYpJiYoYz1nLmxlZnQsZD1hLnJ1bnRpbWVTdHlsZSYmYS5ydW50aW1lU3R5bGUubGVmdCxkJiYoYS5ydW50aW1lU3R5bGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxnLmxlZnQ9Yj09PSJmb250U2l6ZSI/IjFlbSI6Znx8MCxmPWcucGl4ZWxMZWZ0KyJweCIsZy5sZWZ0PWMsZCYmKGEucnVudGltZVN0eWxlLmxlZnQ9ZCkpO3JldHVybiBmPT09IiI/ImF1dG8iOmZ9KSxiej1iQXx8YkIsZi5leHByJiZmLmV4cHIuZmlsdGVycyYmKGYuZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldFdpZHRoLGM9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGI9PT0wJiZjPT09MHx8IWYuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMmJihhLnN0eWxlJiZhLnN0eWxlLmRpc3BsYXl8fGYuY3NzKGEsImRpc3BsYXkiKSk9PT0ibm9uZSJ9LGYuZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIWYuZXhwci5maWx0ZXJzLmhpZGRlbihhKX0pO3ZhciBiRD0vJTIwL2csYkU9L1xbXF0kLyxiRj0vXHI/XG4vZyxiRz0vIy4qJC8sYkg9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9tZyxiST0vXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksYko9L14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxiSz0vXig/OkdFVHxIRUFEKSQvLGJMPS9eXC9cLy8sYk09L1w/LyxiTj0vPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSxiTz0vXig/OnNlbGVjdHx0ZXh0YXJlYSkvaSxiUD0vXHMrLyxiUT0vKFs/Jl0pXz1bXiZdKi8sYlI9L14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKSk/KT8vLGJTPWYuZm4ubG9hZCxiVD17fSxiVT17fSxiVixiVyxiWD1bIiovIl0rWyIqIl07dHJ5e2JWPWUuaHJlZn1jYXRjaChiWSl7YlY9Yy5jcmVhdGVFbGVtZW50KCJhIiksYlYuaHJlZj0iIixiVj1iVi5ocmVmfWJXPWJSLmV4ZWMoYlYudG9Mb3dlckNhc2UoKSl8fFtdLGYuZm4uZXh0ZW5kKHtsb2FkOmZ1bmN0aW9uKGEsYyxkKXtpZih0eXBlb2YgYSE9InN0cmluZyImJmJTKXJldHVybiBiUy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoIXRoaXMubGVuZ3RoKXJldHVybiB0aGlzO3ZhciBlPWEuaW5kZXhPZigiICIpO2lmKGU+PTApe3ZhciBnPWEuc2xpY2UoZSxhLmxlbmd0aCk7YT1hLnNsaWNlKDAsZSl9dmFyIGg9IkdFVCI7YyYmKGYuaXNGdW5jdGlvbihjKT8oZD1jLGM9Yik6dHlwZW9mIGM9PSJvYmplY3QiJiYoYz1mLnBhcmFtKGMsZi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLGg9IlBPU1QiKSk7dmFyIGk9dGhpcztmLmFqYXgoe3VybDphLHR5cGU6aCxkYXRhVHlwZToiaHRtbCIsZGF0YTpjLGNvbXBsZXRlOmZ1bmN0aW9uKGEsYixjKXtjPWEucmVzcG9uc2VUZXh0LGEuaXNSZXNvbHZlZCgpJiYoYS5kb25lKGZ1bmN0aW9uKGEpe2M9YX0pLGkuaHRtbChnP2YoIjxkaXY+IikuYXBwZW5kKGMucmVwbGFjZShiTiwiIikpLmZpbmQoZyk6YykpLGQmJmkuZWFjaChkLFtjLGIsYV0pfX0pO3JldHVybiB0aGlzfSxzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP2YubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8Yk8udGVzdCh0aGlzLm5vZGVOYW1lKXx8YkkudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPWYodGhpcykudmFsKCk7cmV0dXJuIGM9PW51bGw/bnVsbDpmLmlzQXJyYXkoYyk/Zi5tYXAoYyxmdW5jdGlvbihhLGMpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoYkYsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGJGLCJcclxuIil9fSkuZ2V0KCl9fSksZi5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2YuZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxmLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxjKXtmW2NdPWZ1bmN0aW9uKGEsZCxlLGcpe2YuaXNGdW5jdGlvbihkKSYmKGc9Z3x8ZSxlPWQsZD1iKTtyZXR1cm4gZi5hamF4KHt0eXBlOmMsdXJsOmEsZGF0YTpkLHN1Y2Nlc3M6ZSxkYXRhVHlwZTpnfSl9fSksZi5leHRlbmQoe2dldFNjcmlwdDpmdW5jdGlvbihhLGMpe3JldHVybiBmLmdldChhLGIsYywic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmdldChhLGIsYywianNvbiIpfSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtiP2JfKGEsZi5hamF4U2V0dGluZ3MpOihiPWEsYT1mLmFqYXhTZXR0aW5ncyksYl8oYSxiKTtyZXR1cm4gYX0sYWpheFNldHRpbmdzOnt1cmw6YlYsaXNMb2NhbDpiSi50ZXN0KGJXWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6Ylh9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjphLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpmLnBhcnNlSlNPTiwidGV4dCB4bWwiOmYucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEwLHVybDohMH19LGFqYXhQcmVmaWx0ZXI6YlooYlQpLGFqYXhUcmFuc3BvcnQ6YlooYlUpLGFqYXg6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiB3KGEsYyxsLG0pe2lmKHMhPT0yKXtzPTIscSYmY2xlYXJUaW1lb3V0KHEpLHA9YixuPW18fCIiLHYucmVhZHlTdGF0ZT1hPjA/NDowO3ZhciBvLHIsdSx3PWMseD1sP2NiKGQsdixsKTpiLHksejtpZihhPj0yMDAmJmE8MzAwfHxhPT09MzA0KXtpZihkLmlmTW9kaWZpZWQpe2lmKHk9di5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKWYubGFzdE1vZGlmaWVkW2tdPXk7aWYoej12LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIikpZi5ldGFnW2tdPXp9aWYoYT09PTMwNCl3PSJub3Rtb2RpZmllZCIsbz0hMDtlbHNlIHRyeXtyPWNjKGQseCksdz0ic3VjY2VzcyIsbz0hMH1jYXRjaChBKXt3PSJwYXJzZXJlcnJvciIsdT1BfX1lbHNle3U9dztpZighd3x8YSl3PSJlcnJvciIsYTwwJiYoYT0wKX12LnN0YXR1cz1hLHYuc3RhdHVzVGV4dD0iIisoY3x8dyksbz9oLnJlc29sdmVXaXRoKGUsW3Isdyx2XSk6aC5yZWplY3RXaXRoKGUsW3Ysdyx1XSksdi5zdGF0dXNDb2RlKGopLGo9Yix0JiZnLnRyaWdnZXIoImFqYXgiKyhvPyJTdWNjZXNzIjoiRXJyb3IiKSxbdixkLG8/cjp1XSksaS5maXJlV2l0aChlLFt2LHddKSx0JiYoZy50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt2LGRdKSwtLWYuYWN0aXZlfHxmLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfX10eXBlb2YgYT09Im9iamVjdCImJihjPWEsYT1iKSxjPWN8fHt9O3ZhciBkPWYuYWpheFNldHVwKHt9LGMpLGU9ZC5jb250ZXh0fHxkLGc9ZSE9PWQmJihlLm5vZGVUeXBlfHxlIGluc3RhbmNlb2YgZik/ZihlKTpmLmV2ZW50LGg9Zi5EZWZlcnJlZCgpLGk9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksaj1kLnN0YXR1c0NvZGV8fHt9LGssbD17fSxtPXt9LG4sbyxwLHEscixzPTAsdCx1LHY9e3JlYWR5U3RhdGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7aWYoIXMpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTthPW1bY109bVtjXXx8YSxsW2FdPWJ9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBzPT09Mj9uOm51bGx9LGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBjO2lmKHM9PT0yKXtpZighbyl7bz17fTt3aGlsZShjPWJILmV4ZWMobikpb1tjWzFdLnRvTG93ZXJDYXNlKCldPWNbMl19Yz1vW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIGM9PT1iP251bGw6Y30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtzfHwoZC5taW1lVHlwZT1hKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7YT1hfHwiYWJvcnQiLHAmJnAuYWJvcnQoYSksdygwLGEpO3JldHVybiB0aGlzfX07aC5wcm9taXNlKHYpLHYuc3VjY2Vzcz12LmRvbmUsdi5lcnJvcj12LmZhaWwsdi5jb21wbGV0ZT1pLmFkZCx2LnN0YXR1c0NvZGU9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI7aWYoczwyKWZvcihiIGluIGEpaltiXT1baltiXSxhW2JdXTtlbHNlIGI9YVt2LnN0YXR1c10sdi50aGVuKGIsYil9cmV0dXJuIHRoaXN9LGQudXJsPSgoYXx8ZC51cmwpKyIiKS5yZXBsYWNlKGJHLCIiKS5yZXBsYWNlKGJMLGJXWzFdKyIvLyIpLGQuZGF0YVR5cGVzPWYudHJpbShkLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoYlApLGQuY3Jvc3NEb21haW49PW51bGwmJihyPWJSLmV4ZWMoZC51cmwudG9Mb3dlckNhc2UoKSksZC5jcm9zc0RvbWFpbj0hKCFyfHxyWzFdPT1iV1sxXSYmclsyXT09YldbMl0mJihyWzNdfHwoclsxXT09PSJodHRwOiI/ODA6NDQzKSk9PShiV1szXXx8KGJXWzFdPT09Imh0dHA6Ij84MDo0NDMpKSkpLGQuZGF0YSYmZC5wcm9jZXNzRGF0YSYmdHlwZW9mIGQuZGF0YSE9InN0cmluZyImJihkLmRhdGE9Zi5wYXJhbShkLmRhdGEsZC50cmFkaXRpb25hbCkpLGIkKGJULGQsYyx2KTtpZihzPT09MilyZXR1cm4hMTt0PWQuZ2xvYmFsLGQudHlwZT1kLnR5cGUudG9VcHBlckNhc2UoKSxkLmhhc0NvbnRlbnQ9IWJLLnRlc3QoZC50eXBlKSx0JiZmLmFjdGl2ZSsrPT09MCYmZi5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtpZighZC5oYXNDb250ZW50KXtkLmRhdGEmJihkLnVybCs9KGJNLnRlc3QoZC51cmwpPyImIjoiPyIpK2QuZGF0YSxkZWxldGUgZC5kYXRhKSxrPWQudXJsO2lmKGQuY2FjaGU9PT0hMSl7dmFyIHg9Zi5ub3coKSx5PWQudXJsLnJlcGxhY2UoYlEsIiQxXz0iK3gpO2QudXJsPXkrKHk9PT1kLnVybD8oYk0udGVzdChkLnVybCk/IiYiOiI/IikrIl89Iit4OiIiKX19KGQuZGF0YSYmZC5oYXNDb250ZW50JiZkLmNvbnRlbnRUeXBlIT09ITF8fGMuY29udGVudFR5cGUpJiZ2LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsZC5jb250ZW50VHlwZSksZC5pZk1vZGlmaWVkJiYoaz1rfHxkLnVybCxmLmxhc3RNb2RpZmllZFtrXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsZi5sYXN0TW9kaWZpZWRba10pLGYuZXRhZ1trXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixmLmV0YWdba10pKSx2LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZC5kYXRhVHlwZXNbMF0mJmQuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0/ZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXSsoZC5kYXRhVHlwZXNbMF0hPT0iKiI/IiwgIitiWCsiOyBxPTAuMDEiOiIiKTpkLmFjY2VwdHNbIioiXSk7Zm9yKHUgaW4gZC5oZWFkZXJzKXYuc2V0UmVxdWVzdEhlYWRlcih1LGQuaGVhZGVyc1t1XSk7aWYoZC5iZWZvcmVTZW5kJiYoZC5iZWZvcmVTZW5kLmNhbGwoZSx2LGQpPT09ITF8fHM9PT0yKSl7di5hYm9ydCgpO3JldHVybiExfWZvcih1IGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbdV0oZFt1XSk7cD1iJChiVSxkLGMsdik7aWYoIXApdygtMSwiTm8gVHJhbnNwb3J0Iik7ZWxzZXt2LnJlYWR5U3RhdGU9MSx0JiZnLnRyaWdnZXIoImFqYXhTZW5kIixbdixkXSksZC5hc3luYyYmZC50aW1lb3V0PjAmJihxPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2LmFib3J0KCJ0aW1lb3V0Iil9LGQudGltZW91dCkpO3RyeXtzPTEscC5zZW5kKGwsdyl9Y2F0Y2goeil7aWYoczwyKXcoLTEseik7ZWxzZSB0aHJvdyB6fX1yZXR1cm4gdn0scGFyYW06ZnVuY3Rpb24oYSxjKXt2YXIgZD1bXSxlPWZ1bmN0aW9uKGEsYil7Yj1mLmlzRnVuY3Rpb24oYik/YigpOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2M9PT1iJiYoYz1mLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCk7aWYoZi5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIWYuaXNQbGFpbk9iamVjdChhKSlmLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IodmFyIGcgaW4gYSljYShnLGFbZ10sYyxlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZShiRCwiKyIpfX0pLGYuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fX0pO3ZhciBjZD1mLm5vdygpLGNlPS8oXD0pXD8oJnwkKXxcP1w/L2k7Zi5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3JldHVybiBmLmV4cGFuZG8rIl8iK2NkKyt9fSksZi5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihiLGMsZCl7dmFyIGU9Yi5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiJiZ0eXBlb2YgYi5kYXRhPT0ic3RyaW5nIjtpZihiLmRhdGFUeXBlc1swXT09PSJqc29ucCJ8fGIuanNvbnAhPT0hMSYmKGNlLnRlc3QoYi51cmwpfHxlJiZjZS50ZXN0KGIuZGF0YSkpKXt2YXIgZyxoPWIuanNvbnBDYWxsYmFjaz1mLmlzRnVuY3Rpb24oYi5qc29ucENhbGxiYWNrKT9iLmpzb25wQ2FsbGJhY2soKTpiLmpzb25wQ2FsbGJhY2ssaT1hW2hdLGo9Yi51cmwsaz1iLmRhdGEsbD0iJDEiK2grIiQyIjtiLmpzb25wIT09ITEmJihqPWoucmVwbGFjZShjZSxsKSxiLnVybD09PWomJihlJiYoaz1rLnJlcGxhY2UoY2UsbCkpLGIuZGF0YT09PWsmJihqKz0oL1w/Ly50ZXN0KGopPyImIjoiPyIpK2IuanNvbnArIj0iK2gpKSksYi51cmw9aixiLmRhdGE9ayxhW2hdPWZ1bmN0aW9uKGEpe2c9W2FdfSxkLmFsd2F5cyhmdW5jdGlvbigpe2FbaF09aSxnJiZmLmlzRnVuY3Rpb24oaSkmJmFbaF0oZ1swXSl9KSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtnfHxmLmVycm9yKGgrIiB3YXMgbm90IGNhbGxlZCIpO3JldHVybiBnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiI7cmV0dXJuInNjcmlwdCJ9fSksZi5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9qYXZhc2NyaXB0fGVjbWFzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe2YuZ2xvYmFsRXZhbChhKTtyZXR1cm4gYX19fSksZi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2EuY2FjaGU9PT1iJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIixhLmdsb2JhbD0hMSl9KSxmLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbil7dmFyIGQsZT1jLmhlYWR8fGMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8Yy5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZixnKXtkPWMuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksZC5hc3luYz0iYXN5bmMiLGEuc2NyaXB0Q2hhcnNldCYmKGQuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGQuc3JjPWEudXJsLGQub25sb2FkPWQub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7aWYoY3x8IWQucmVhZHlTdGF0ZXx8L2xvYWRlZHxjb21wbGV0ZS8udGVzdChkLnJlYWR5U3RhdGUpKWQub25sb2FkPWQub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsZSYmZC5wYXJlbnROb2RlJiZlLnJlbW92ZUNoaWxkKGQpLGQ9YixjfHxnKDIwMCwic3VjY2VzcyIpfSxlLmluc2VydEJlZm9yZShkLGUuZmlyc3RDaGlsZCl9LGFib3J0OmZ1bmN0aW9uKCl7ZCYmZC5vbmxvYWQoMCwxKX19fX0pO3ZhciBjZj1hLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gY2gpY2hbYV0oMCwxKX06ITEsY2c9MCxjaDtmLmFqYXhTZXR0aW5ncy54aHI9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmY2koKXx8Y2ooKX06Y2ksZnVuY3Rpb24oYSl7Zi5leHRlbmQoZi5zdXBwb3J0LHthamF4OiEhYSxjb3JzOiEhYSYmIndpdGhDcmVkZW50aWFscyJpbiBhfSl9KGYuYWpheFNldHRpbmdzLnhocigpKSxmLnN1cHBvcnQuYWpheCYmZi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGMpe2lmKCFjLmNyb3NzRG9tYWlufHxmLnN1cHBvcnQuY29ycyl7dmFyIGQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSxnKXt2YXIgaD1jLnhocigpLGksajtjLnVzZXJuYW1lP2gub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyxjLnVzZXJuYW1lLGMucGFzc3dvcmQpOmgub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyk7aWYoYy54aHJGaWVsZHMpZm9yKGogaW4gYy54aHJGaWVsZHMpaFtqXT1jLnhockZpZWxkc1tqXTtjLm1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUmJmgub3ZlcnJpZGVNaW1lVHlwZShjLm1pbWVUeXBlKSwhYy5jcm9zc0RvbWFpbiYmIWVbIlgtUmVxdWVzdGVkLVdpdGgiXSYmKGVbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7Zm9yKGogaW4gZSloLnNldFJlcXVlc3RIZWFkZXIoaixlW2pdKX1jYXRjaChrKXt9aC5zZW5kKGMuaGFzQ29udGVudCYmYy5kYXRhfHxudWxsKSxkPWZ1bmN0aW9uKGEsZSl7dmFyIGosayxsLG0sbjt0cnl7aWYoZCYmKGV8fGgucmVhZHlTdGF0ZT09PTQpKXtkPWIsaSYmKGgub25yZWFkeXN0YXRlY2hhbmdlPWYubm9vcCxjZiYmZGVsZXRlIGNoW2ldKTtpZihlKWgucmVhZHlTdGF0ZSE9PTQmJmguYWJvcnQoKTtlbHNle2o9aC5zdGF0dXMsbD1oLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLG09e30sbj1oLnJlc3BvbnNlWE1MLG4mJm4uZG9jdW1lbnRFbGVtZW50JiYobS54bWw9biksbS50ZXh0PWgucmVzcG9uc2VUZXh0O3RyeXtrPWguc3RhdHVzVGV4dH1jYXRjaChvKXtrPSIifSFqJiZjLmlzTG9jYWwmJiFjLmNyb3NzRG9tYWluP2o9bS50ZXh0PzIwMDo0MDQ6aj09PTEyMjMmJihqPTIwNCl9fX1jYXRjaChwKXtlfHxnKC0xLHApfW0mJmcoaixrLG0sbCl9LCFjLmFzeW5jfHxoLnJlYWR5U3RhdGU9PT00P2QoKTooaT0rK2NnLGNmJiYoY2h8fChjaD17fSxmKGEpLnVubG9hZChjZikpLGNoW2ldPWQpLGgub25yZWFkeXN0YXRlY2hhbmdlPWQpfSxhYm9ydDpmdW5jdGlvbigpe2QmJmQoMCwxKX19fX0pO3ZhciBjaz17fSxjbCxjbSxjbj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sY289L14oWytcLV09KT8oW1xkKy5cLV0rKShbYS16JV0qKSQvaSxjcCxjcT1bWyJoZWlnaHQiLCJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLFsid2lkdGgiLCJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdLFsib3BhY2l0eSJdXSxjcjtmLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGN1KCJzaG93IiwzKSxhLGIsYyk7Zm9yKHZhciBnPTAsaD10aGlzLmxlbmd0aDtnPGg7ZysrKWQ9dGhpc1tnXSxkLnN0eWxlJiYoZT1kLnN0eWxlLmRpc3BsYXksIWYuX2RhdGEoZCwib2xkZGlzcGxheSIpJiZlPT09Im5vbmUiJiYoZT1kLnN0eWxlLmRpc3BsYXk9IiIpLGU9PT0iIiYmZi5jc3MoZCwiZGlzcGxheSIpPT09Im5vbmUiJiZmLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGN2KGQubm9kZU5hbWUpKSk7Zm9yKGc9MDtnPGg7ZysrKXtkPXRoaXNbZ107aWYoZC5zdHlsZSl7ZT1kLnN0eWxlLmRpc3BsYXk7aWYoZT09PSIifHxlPT09Im5vbmUiKWQuc3R5bGUuZGlzcGxheT1mLl9kYXRhKGQsIm9sZGRpc3BsYXkiKXx8IiJ9fXJldHVybiB0aGlzfSxoaWRlOmZ1bmN0aW9uKGEsYixjKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGN1KCJoaWRlIiwzKSxhLGIsYyk7dmFyIGQsZSxnPTAsaD10aGlzLmxlbmd0aDtmb3IoO2c8aDtnKyspZD10aGlzW2ddLGQuc3R5bGUmJihlPWYuY3NzKGQsImRpc3BsYXkiKSxlIT09Im5vbmUiJiYhZi5fZGF0YShkLCJvbGRkaXNwbGF5IikmJmYuX2RhdGEoZCwib2xkZGlzcGxheSIsZSkpO2ZvcihnPTA7ZzxoO2crKyl0aGlzW2ddLnN0eWxlJiYodGhpc1tnXS5zdHlsZS5kaXNwbGF5PSJub25lIik7cmV0dXJuIHRoaXN9LF90b2dnbGU6Zi5mbi50b2dnbGUsdG9nZ2xlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10eXBlb2YgYT09ImJvb2xlYW4iO2YuaXNGdW5jdGlvbihhKSYmZi5pc0Z1bmN0aW9uKGIpP3RoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YT09bnVsbHx8ZD90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1kP2E6Zih0aGlzKS5pcygiOmhpZGRlbiIpO2YodGhpcylbYj8ic2hvdyI6ImhpZGUiXSgpfSk6dGhpcy5hbmltYXRlKGN1KCJ0b2dnbGUiLDMpLGEsYixjKTtyZXR1cm4gdGhpc30sZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe2Z1bmN0aW9uIGcoKXtlLnF1ZXVlPT09ITEmJmYuX21hcmsodGhpcyk7dmFyIGI9Zi5leHRlbmQoe30sZSksYz10aGlzLm5vZGVUeXBlPT09MSxkPWMmJmYodGhpcykuaXMoIjpoaWRkZW4iKSxnLGgsaSxqLGssbCxtLG4sbztiLmFuaW1hdGVkUHJvcGVydGllcz17fTtmb3IoaSBpbiBhKXtnPWYuY2FtZWxDYXNlKGkpLGkhPT1nJiYoYVtnXT1hW2ldLGRlbGV0ZSBhW2ldKSxoPWFbZ10sZi5pc0FycmF5KGgpPyhiLmFuaW1hdGVkUHJvcGVydGllc1tnXT1oWzFdLGg9YVtnXT1oWzBdKTpiLmFuaW1hdGVkUHJvcGVydGllc1tnXT1iLnNwZWNpYWxFYXNpbmcmJmIuc3BlY2lhbEVhc2luZ1tnXXx8Yi5lYXNpbmd8fCJzd2luZyI7aWYoaD09PSJoaWRlIiYmZHx8aD09PSJzaG93IiYmIWQpcmV0dXJuIGIuY29tcGxldGUuY2FsbCh0aGlzKTtjJiYoZz09PSJoZWlnaHQifHxnPT09IndpZHRoIikmJihiLm92ZXJmbG93PVt0aGlzLnN0eWxlLm92ZXJmbG93LHRoaXMuc3R5bGUub3ZlcmZsb3dYLHRoaXMuc3R5bGUub3ZlcmZsb3dZXSxmLmNzcyh0aGlzLCJkaXNwbGF5Iik9PT0iaW5saW5lIiYmZi5jc3ModGhpcywiZmxvYXQiKT09PSJub25lIiYmKCFmLnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dHx8Y3YodGhpcy5ub2RlTmFtZSk9PT0iaW5saW5lIj90aGlzLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI6dGhpcy5zdHlsZS56b29tPTEpKX1iLm92ZXJmbG93IT1udWxsJiYodGhpcy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIik7Zm9yKGkgaW4gYSlqPW5ldyBmLmZ4KHRoaXMsYixpKSxoPWFbaV0sY24udGVzdChoKT8obz1mLl9kYXRhKHRoaXMsInRvZ2dsZSIraSl8fChoPT09InRvZ2dsZSI/ZD8ic2hvdyI6ImhpZGUiOjApLG8/KGYuX2RhdGEodGhpcywidG9nZ2xlIitpLG89PT0ic2hvdyI/ImhpZGUiOiJzaG93IiksaltvXSgpKTpqW2hdKCkpOihrPWNvLmV4ZWMoaCksbD1qLmN1cigpLGs/KG09cGFyc2VGbG9hdChrWzJdKSxuPWtbM118fChmLmNzc051bWJlcltpXT8iIjoicHgiKSxuIT09InB4IiYmKGYuc3R5bGUodGhpcyxpLChtfHwxKStuKSxsPShtfHwxKS9qLmN1cigpKmwsZi5zdHlsZSh0aGlzLGksbCtuKSksa1sxXSYmKG09KGtbMV09PT0iLT0iPy0xOjEpKm0rbCksai5jdXN0b20obCxtLG4pKTpqLmN1c3RvbShsLGgsIiIpKTtyZXR1cm4hMH12YXIgZT1mLnNwZWVkKGIsYyxkKTtpZihmLmlzRW1wdHlPYmplY3QoYSkpcmV0dXJuIHRoaXMuZWFjaChlLmNvbXBsZXRlLFshMV0pO2E9Zi5leHRlbmQoe30sYSk7cmV0dXJuIGUucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShlLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYyxkKXt0eXBlb2YgYSE9InN0cmluZyImJihkPWMsYz1hLGE9YiksYyYmYSE9PSExJiZ0aGlzLnF1ZXVlKGF8fCJmeCIsW10pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGEsYixjKXt2YXIgZT1iW2NdO2YucmVtb3ZlRGF0YShhLGMsITApLGUuc3RvcChkKX12YXIgYixjPSExLGU9Zi50aW1lcnMsZz1mLl9kYXRhKHRoaXMpO2R8fGYuX3VubWFyayghMCx0aGlzKTtpZihhPT1udWxsKWZvcihiIGluIGcpZ1tiXSYmZ1tiXS5zdG9wJiZiLmluZGV4T2YoIi5ydW4iKT09PWIubGVuZ3RoLTQmJmgodGhpcyxnLGIpO2Vsc2UgZ1tiPWErIi5ydW4iXSYmZ1tiXS5zdG9wJiZoKHRoaXMsZyxiKTtmb3IoYj1lLmxlbmd0aDtiLS07KWVbYl0uZWxlbT09PXRoaXMmJihhPT1udWxsfHxlW2JdLnF1ZXVlPT09YSkmJihkP2VbYl0oITApOmVbYl0uc2F2ZVN0YXRlKCksYz0hMCxlLnNwbGljZShiLDEpKTsoIWR8fCFjKSYmZi5kZXF1ZXVlKHRoaXMsYSl9KX19KSxmLmVhY2goe3NsaWRlRG93bjpjdSgic2hvdyIsMSksc2xpZGVVcDpjdSgiaGlkZSIsMSksc2xpZGVUb2dnbGU6Y3UoInRvZ2dsZSIsMSksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe2YuZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksZi5leHRlbmQoe3NwZWVkOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hJiZ0eXBlb2YgYT09Im9iamVjdCI/Zi5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmN8fCFjJiZifHxmLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6YyYmYnx8YiYmIWYuaXNGdW5jdGlvbihiKSYmYn07ZC5kdXJhdGlvbj1mLmZ4Lm9mZj8wOnR5cGVvZiBkLmR1cmF0aW9uPT0ibnVtYmVyIj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gZi5meC5zcGVlZHM/Zi5meC5zcGVlZHNbZC5kdXJhdGlvbl06Zi5meC5zcGVlZHMuX2RlZmF1bHQ7aWYoZC5xdWV1ZT09bnVsbHx8ZC5xdWV1ZT09PSEwKWQucXVldWU9ImZ4IjtkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oYSl7Zi5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlP2YuZGVxdWV1ZSh0aGlzLGQucXVldWUpOmEhPT0hMSYmZi5fdW5tYXJrKHRoaXMpfTtyZXR1cm4gZH0sZWFzaW5nOntsaW5lYXI6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGMrZCphfSxzd2luZzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4oLU1hdGguY29zKGEqTWF0aC5QSSkvMisuNSkqZCtjfX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGEsYixjKXt0aGlzLm9wdGlvbnM9Yix0aGlzLmVsZW09YSx0aGlzLnByb3A9YyxiLm9yaWc9Yi5vcmlnfHx7fX19KSxmLmZ4LnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLChmLmZ4LnN0ZXBbdGhpcy5wcm9wXXx8Zi5meC5zdGVwLl9kZWZhdWx0KSh0aGlzKX0sY3VyOmZ1bmN0aW9uKCl7aWYodGhpcy5lbGVtW3RoaXMucHJvcF0hPW51bGwmJighdGhpcy5lbGVtLnN0eWxlfHx0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXT09bnVsbCkpcmV0dXJuIHRoaXMuZWxlbVt0aGlzLnByb3BdO3ZhciBhLGI9Zi5jc3ModGhpcy5lbGVtLHRoaXMucHJvcCk7cmV0dXJuIGlzTmFOKGE9cGFyc2VGbG9hdChiKSk/IWJ8fGI9PT0iYXV0byI/MDpiOmF9LGN1c3RvbTpmdW5jdGlvbihhLGMsZCl7ZnVuY3Rpb24gaChhKXtyZXR1cm4gZS5zdGVwKGEpfXZhciBlPXRoaXMsZz1mLmZ4O3RoaXMuc3RhcnRUaW1lPWNyfHxjcygpLHRoaXMuZW5kPWMsdGhpcy5ub3c9dGhpcy5zdGFydD1hLHRoaXMucG9zPXRoaXMuc3RhdGU9MCx0aGlzLnVuaXQ9ZHx8dGhpcy51bml0fHwoZi5jc3NOdW1iZXJbdGhpcy5wcm9wXT8iIjoicHgiKSxoLnF1ZXVlPXRoaXMub3B0aW9ucy5xdWV1ZSxoLmVsZW09dGhpcy5lbGVtLGguc2F2ZVN0YXRlPWZ1bmN0aW9uKCl7ZS5vcHRpb25zLmhpZGUmJmYuX2RhdGEoZS5lbGVtLCJmeHNob3ciK2UucHJvcCk9PT1iJiZmLl9kYXRhKGUuZWxlbSwiZnhzaG93IitlLnByb3AsZS5zdGFydCl9LGgoKSYmZi50aW1lcnMucHVzaChoKSYmIWNwJiYoY3A9c2V0SW50ZXJ2YWwoZy50aWNrLGcuaW50ZXJ2YWwpKX0sc2hvdzpmdW5jdGlvbigpe3ZhciBhPWYuX2RhdGEodGhpcy5lbGVtLCJmeHNob3ciK3RoaXMucHJvcCk7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1hfHxmLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApLHRoaXMub3B0aW9ucy5zaG93PSEwLGEhPT1iP3RoaXMuY3VzdG9tKHRoaXMuY3VyKCksYSk6dGhpcy5jdXN0b20odGhpcy5wcm9wPT09IndpZHRoInx8dGhpcy5wcm9wPT09ImhlaWdodCI/MTowLHRoaXMuY3VyKCkpLGYodGhpcy5lbGVtKS5zaG93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWYuX2RhdGEodGhpcy5lbGVtLCJmeHNob3ciK3RoaXMucHJvcCl8fGYuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCksdGhpcy5vcHRpb25zLmhpZGU9ITAsdGhpcy5jdXN0b20odGhpcy5jdXIoKSwwKX0sc3RlcDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT1jcnx8Y3MoKSxnPSEwLGg9dGhpcy5lbGVtLGk9dGhpcy5vcHRpb25zO2lmKGF8fGU+PWkuZHVyYXRpb24rdGhpcy5zdGFydFRpbWUpe3RoaXMubm93PXRoaXMuZW5kLHRoaXMucG9zPXRoaXMuc3RhdGU9MSx0aGlzLnVwZGF0ZSgpLGkuYW5pbWF0ZWRQcm9wZXJ0aWVzW3RoaXMucHJvcF09ITA7Zm9yKGIgaW4gaS5hbmltYXRlZFByb3BlcnRpZXMpaS5hbmltYXRlZFByb3BlcnRpZXNbYl0hPT0hMCYmKGc9ITEpO2lmKGcpe2kub3ZlcmZsb3chPW51bGwmJiFmLnN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyYmZi5lYWNoKFsiIiwiWCIsIlkiXSxmdW5jdGlvbihhLGIpe2guc3R5bGVbIm92ZXJmbG93IitiXT1pLm92ZXJmbG93W2FdfSksaS5oaWRlJiZmKGgpLmhpZGUoKTtpZihpLmhpZGV8fGkuc2hvdylmb3IoYiBpbiBpLmFuaW1hdGVkUHJvcGVydGllcylmLnN0eWxlKGgsYixpLm9yaWdbYl0pLGYucmVtb3ZlRGF0YShoLCJmeHNob3ciK2IsITApLGYucmVtb3ZlRGF0YShoLCJ0b2dnbGUiK2IsITApO2Q9aS5jb21wbGV0ZSxkJiYoaS5jb21wbGV0ZT0hMSxkLmNhbGwoaCkpfXJldHVybiExfWkuZHVyYXRpb249PUluZmluaXR5P3RoaXMubm93PWU6KGM9ZS10aGlzLnN0YXJ0VGltZSx0aGlzLnN0YXRlPWMvaS5kdXJhdGlvbix0aGlzLnBvcz1mLmVhc2luZ1tpLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdXSh0aGlzLnN0YXRlLGMsMCwxLGkuZHVyYXRpb24pLHRoaXMubm93PXRoaXMuc3RhcnQrKHRoaXMuZW5kLXRoaXMuc3RhcnQpKnRoaXMucG9zKSx0aGlzLnVwZGF0ZSgpO3JldHVybiEwfX0sZi5leHRlbmQoZi5meCx7dGljazpmdW5jdGlvbigpe3ZhciBhLGI9Zi50aW1lcnMsYz0wO2Zvcig7YzxiLmxlbmd0aDtjKyspYT1iW2NdLCFhKCkmJmJbY109PT1hJiZiLnNwbGljZShjLS0sMSk7Yi5sZW5ndGh8fGYuZnguc3RvcCgpfSxpbnRlcnZhbDoxMyxzdG9wOmZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChjcCksY3A9bnVsbH0sc3BlZWRzOntzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LHN0ZXA6e29wYWNpdHk6ZnVuY3Rpb24oYSl7Zi5zdHlsZShhLmVsZW0sIm9wYWNpdHkiLGEubm93KX0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7YS5lbGVtLnN0eWxlJiZhLmVsZW0uc3R5bGVbYS5wcm9wXSE9bnVsbD9hLmVsZW0uc3R5bGVbYS5wcm9wXT1hLm5vdythLnVuaXQ6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0pLGYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtmLmZ4LnN0ZXBbYl09ZnVuY3Rpb24oYSl7Zi5zdHlsZShhLmVsZW0sYixNYXRoLm1heCgwLGEubm93KSthLnVuaXQpfX0pLGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gZi5ncmVwKGYudGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofSk7dmFyIGN3PS9edCg/OmFibGV8ZHxoKSQvaSxjeD0vXig/OmJvZHl8aHRtbCkkL2k7ImdldEJvdW5kaW5nQ2xpZW50UmVjdCJpbiBjLmRvY3VtZW50RWxlbWVudD9mLmZuLm9mZnNldD1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdLGM7aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dHJ5e2M9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jYXRjaChkKXt9dmFyIGU9Yi5vd25lckRvY3VtZW50LGc9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoIWN8fCFmLmNvbnRhaW5zKGcsYikpcmV0dXJuIGM/e3RvcDpjLnRvcCxsZWZ0OmMubGVmdH06e3RvcDowLGxlZnQ6MH07dmFyIGg9ZS5ib2R5LGk9Y3koZSksaj1nLmNsaWVudFRvcHx8aC5jbGllbnRUb3B8fDAsaz1nLmNsaWVudExlZnR8fGguY2xpZW50TGVmdHx8MCxsPWkucGFnZVlPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmZy5zY3JvbGxUb3B8fGguc2Nyb2xsVG9wLG09aS5wYWdlWE9mZnNldHx8Zi5zdXBwb3J0LmJveE1vZGVsJiZnLnNjcm9sbExlZnR8fGguc2Nyb2xsTGVmdCxuPWMudG9wK2wtaixvPWMubGVmdCttLWs7cmV0dXJue3RvcDpuLGxlZnQ6b319OmYuZm4ub2Zmc2V0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dmFyIGMsZD1iLm9mZnNldFBhcmVudCxlPWIsZz1iLm93bmVyRG9jdW1lbnQsaD1nLmRvY3VtZW50RWxlbWVudCxpPWcuYm9keSxqPWcuZGVmYXVsdFZpZXcsaz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGw9Yi5vZmZzZXRUb3AsbT1iLm9mZnNldExlZnQ7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmYiE9PWkmJmIhPT1oKXtpZihmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiYmay5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7Yz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGwtPWIuc2Nyb2xsVG9wLG0tPWIuc2Nyb2xsTGVmdCxiPT09ZCYmKGwrPWIub2Zmc2V0VG9wLG0rPWIub2Zmc2V0TGVmdCxmLnN1cHBvcnQuZG9lc05vdEFkZEJvcmRlciYmKCFmLnN1cHBvcnQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHN8fCFjdy50ZXN0KGIubm9kZU5hbWUpKSYmKGwrPXBhcnNlRmxvYXQoYy5ib3JkZXJUb3BXaWR0aCl8fDAsbSs9cGFyc2VGbG9hdChjLmJvcmRlckxlZnRXaWR0aCl8fDApLGU9ZCxkPWIub2Zmc2V0UGFyZW50KSxmLnN1cHBvcnQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZjLm92ZXJmbG93IT09InZpc2libGUiJiYobCs9cGFyc2VGbG9hdChjLmJvcmRlclRvcFdpZHRoKXx8MCxtKz1wYXJzZUZsb2F0KGMuYm9yZGVyTGVmdFdpZHRoKXx8MCksaz1jfWlmKGsucG9zaXRpb249PT0icmVsYXRpdmUifHxrLnBvc2l0aW9uPT09InN0YXRpYyIpbCs9aS5vZmZzZXRUb3AsbSs9aS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5maXhlZFBvc2l0aW9uJiZrLnBvc2l0aW9uPT09ImZpeGVkIiYmKGwrPU1hdGgubWF4KGguc2Nyb2xsVG9wLGkuc2Nyb2xsVG9wKSxtKz1NYXRoLm1heChoLnNjcm9sbExlZnQsaS5zY3JvbGxMZWZ0KSk7cmV0dXJue3RvcDpsLGxlZnQ6bX19LGYub2Zmc2V0PXtib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGM9YS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCYmKGIrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCk7cmV0dXJue3RvcDpiLGxlZnQ6Y319LHNldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9Zi5jc3MoYSwicG9zaXRpb24iKTtkPT09InN0YXRpYyImJihhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBlPWYoYSksZz1lLm9mZnNldCgpLGg9Zi5jc3MoYSwidG9wIiksaT1mLmNzcyhhLCJsZWZ0Iiksaj0oZD09PSJhYnNvbHV0ZSJ8fGQ9PT0iZml4ZWQiKSYmZi5pbkFycmF5KCJhdXRvIixbaCxpXSk+LTEsaz17fSxsPXt9LG0sbjtqPyhsPWUucG9zaXRpb24oKSxtPWwudG9wLG49bC5sZWZ0KToobT1wYXJzZUZsb2F0KGgpfHwwLG49cGFyc2VGbG9hdChpKXx8MCksZi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGcpKSxiLnRvcCE9bnVsbCYmKGsudG9wPWIudG9wLWcudG9wK20pLGIubGVmdCE9bnVsbCYmKGsubGVmdD1iLmxlZnQtZy5sZWZ0K24pLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLGspOmUuY3NzKGspfX0sZi5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuIG51bGw7dmFyIGE9dGhpc1swXSxiPXRoaXMub2Zmc2V0UGFyZW50KCksYz10aGlzLm9mZnNldCgpLGQ9Y3gudGVzdChiWzBdLm5vZGVOYW1lKT97dG9wOjAsbGVmdDowfTpiLm9mZnNldCgpO2MudG9wLT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjLmxlZnQtPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCxkLnRvcCs9cGFyc2VGbG9hdChmLmNzcyhiWzBdLCJib3JkZXJUb3BXaWR0aCIpKXx8MCxkLmxlZnQrPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyTGVmdFdpZHRoIikpfHwwO3JldHVybnt0b3A6Yy50b3AtZC50b3AsbGVmdDpjLmxlZnQtZC5sZWZ0fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fGMuYm9keTt3aGlsZShhJiYhY3gudGVzdChhLm5vZGVOYW1lKSYmZi5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiKWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF9KX19KSxmLmVhY2goWyJMZWZ0IiwiVG9wIl0sZnVuY3Rpb24oYSxjKXt2YXIgZD0ic2Nyb2xsIitjO2YuZm5bZF09ZnVuY3Rpb24oYyl7dmFyIGUsZztpZihjPT09Yil7ZT10aGlzWzBdO2lmKCFlKXJldHVybiBudWxsO2c9Y3koZSk7cmV0dXJuIGc/InBhZ2VYT2Zmc2V0ImluIGc/Z1thPyJwYWdlWU9mZnNldCI6InBhZ2VYT2Zmc2V0Il06Zi5zdXBwb3J0LmJveE1vZGVsJiZnLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8Zy5kb2N1bWVudC5ib2R5W2RdOmVbZF19cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2c9Y3kodGhpcyksZz9nLnNjcm9sbFRvKGE/ZihnKS5zY3JvbGxMZWZ0KCk6YyxhP2M6ZihnKS5zY3JvbGxUb3AoKSk6dGhpc1tkXT1jfSl9fSksZi5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGMpe3ZhciBkPWMudG9Mb3dlckNhc2UoKTtmLmZuWyJpbm5lciIrY109ZnVuY3Rpb24oKXt2YXIgYT10aGlzWzBdO3JldHVybiBhP2Euc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhhLGQsInBhZGRpbmciKSk6dGhpc1tkXSgpOm51bGx9LGYuZm5bIm91dGVyIitjXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO3JldHVybiBiP2Iuc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhiLGQsYT8ibWFyZ2luIjoiYm9yZGVyIikpOnRoaXNbZF0oKTpudWxsfSxmLmZuW2RdPWZ1bmN0aW9uKGEpe3ZhciBlPXRoaXNbMF07aWYoIWUpcmV0dXJuIGE9PW51bGw/bnVsbDp0aGlzO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Y1tkXShhLmNhbGwodGhpcyxiLGNbZF0oKSkpfSk7aWYoZi5pc1dpbmRvdyhlKSl7dmFyIGc9ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10saD1lLmRvY3VtZW50LmJvZHk7cmV0dXJuIGUuZG9jdW1lbnQuY29tcGF0TW9kZT09PSJDU1MxQ29tcGF0IiYmZ3x8aCYmaFsiY2xpZW50IitjXXx8Z31pZihlLm5vZGVUeXBlPT09OSlyZXR1cm4gTWF0aC5tYXgoZS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10sZS5ib2R5WyJzY3JvbGwiK2NdLGUuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiK2NdLGUuYm9keVsib2Zmc2V0IitjXSxlLmRvY3VtZW50RWxlbWVudFsib2Zmc2V0IitjXSk7aWYoYT09PWIpe3ZhciBpPWYuY3NzKGUsZCksaj1wYXJzZUZsb2F0KGkpO3JldHVybiBmLmlzTnVtZXJpYyhqKT9qOml9cmV0dXJuIHRoaXMuY3NzKGQsdHlwZW9mIGE9PSJzdHJpbmciP2E6YSsicHgiKX19KSxhLmpRdWVyeT1hLiQ9Zix0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUuYW1kLmpRdWVyeSYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KX0pKHdpbmRvdyk7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/jquery.bgiframe.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIENvcHlyaWdodCAoYykgMjAxMCBCcmFuZG9uIEFhcm9uIChodHRwOi8vYnJhbmRvbmFhcm9uLm5ldCkKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChMSUNFTlNFLnR4dCkuCiAqCiAqIFZlcnNpb24gMi4xLjMtcHJlCiAqLwoKKGZ1bmN0aW9uKCQpewoKJC5mbi5iZ2lmcmFtZSA9ICgkLmJyb3dzZXIubXNpZSAmJiAvbXNpZSA2XC4wL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSA/IGZ1bmN0aW9uKHMpIHsKICAgIHMgPSAkLmV4dGVuZCh7CiAgICAgICAgdG9wICAgICA6ICdhdXRvJywgLy8gYXV0byA9PSAuY3VycmVudFN0eWxlLmJvcmRlclRvcFdpZHRoCiAgICAgICAgbGVmdCAgICA6ICdhdXRvJywgLy8gYXV0byA9PSAuY3VycmVudFN0eWxlLmJvcmRlckxlZnRXaWR0aAogICAgICAgIHdpZHRoICAgOiAnYXV0bycsIC8vIGF1dG8gPT0gb2Zmc2V0V2lkdGgKICAgICAgICBoZWlnaHQgIDogJ2F1dG8nLCAvLyBhdXRvID09IG9mZnNldEhlaWdodAogICAgICAgIG9wYWNpdHkgOiB0cnVlLAogICAgICAgIHNyYyAgICAgOiAnamF2YXNjcmlwdDpmYWxzZTsnCiAgICB9LCBzKTsKICAgIHZhciBodG1sID0gJzxpZnJhbWUgY2xhc3M9ImJnaWZyYW1lImZyYW1lYm9yZGVyPSIwInRhYmluZGV4PSItMSJzcmM9Iicrcy5zcmMrJyInKwogICAgICAgICAgICAgICAgICAgJ3N0eWxlPSJkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6LTE7JysKICAgICAgICAgICAgICAgICAgICAgICAocy5vcGFjaXR5ICE9PSBmYWxzZT8nZmlsdGVyOkFscGhhKE9wYWNpdHk9XCcwXCcpOyc6JycpKwogICAgICAgICAgICAgICAgICAgICAgICd0b3A6Jysocy50b3A9PSdhdXRvJz8nZXhwcmVzc2lvbigoKHBhcnNlSW50KHRoaXMucGFyZW50Tm9kZS5jdXJyZW50U3R5bGUuYm9yZGVyVG9wV2lkdGgpfHwwKSotMSkrXCdweFwnKSc6cHJvcChzLnRvcCkpKyc7JysKICAgICAgICAgICAgICAgICAgICAgICAnbGVmdDonKyhzLmxlZnQ9PSdhdXRvJz8nZXhwcmVzc2lvbigoKHBhcnNlSW50KHRoaXMucGFyZW50Tm9kZS5jdXJyZW50U3R5bGUuYm9yZGVyTGVmdFdpZHRoKXx8MCkqLTEpK1wncHhcJyknOnByb3Aocy5sZWZ0KSkrJzsnKwogICAgICAgICAgICAgICAgICAgICAgICd3aWR0aDonKyhzLndpZHRoPT0nYXV0byc/J2V4cHJlc3Npb24odGhpcy5wYXJlbnROb2RlLm9mZnNldFdpZHRoK1wncHhcJyknOnByb3Aocy53aWR0aCkpKyc7JysKICAgICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0OicrKHMuaGVpZ2h0PT0nYXV0byc/J2V4cHJlc3Npb24odGhpcy5wYXJlbnROb2RlLm9mZnNldEhlaWdodCtcJ3B4XCcpJzpwcm9wKHMuaGVpZ2h0KSkrJzsnKwogICAgICAgICAgICAgICAgJyIvPic7CiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIGlmICggJCh0aGlzKS5jaGlsZHJlbignaWZyYW1lLmJnaWZyYW1lJykubGVuZ3RoID09PSAwICkKICAgICAgICAgICAgdGhpcy5pbnNlcnRCZWZvcmUoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaHRtbCksIHRoaXMuZmlyc3RDaGlsZCApOwogICAgfSk7Cn0gOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pOwoKLy8gb2xkIGFsaWFzCiQuZm4uYmdJZnJhbWUgPSAkLmZuLmJnaWZyYW1lOwoKZnVuY3Rpb24gcHJvcChuKSB7CiAgICByZXR1cm4gbiAmJiBuLmNvbnN0cnVjdG9yID09PSBOdW1iZXIgPyBuICsgJ3B4JyA6IG47Cn0KCn0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/jquery.bgiframe.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIENvcHlyaWdodCAoYykgMjAxMCBCcmFuZG9uIEFhcm9uIChodHRwOi8vYnJhbmRvbmFhcm9uLm5ldCkKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChMSUNFTlNFLnR4dCkuCiAqCiAqIFZlcnNpb24gMi4xLjMtcHJlCiAqLwooZnVuY3Rpb24oJCl7JC5mbi5iZ2lmcmFtZT0oJC5icm93c2VyLm1zaWUmJi9tc2llIDZcLjAvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpP2Z1bmN0aW9uKHMpe3M9JC5leHRlbmQoe3RvcDonYXV0bycsbGVmdDonYXV0bycsd2lkdGg6J2F1dG8nLGhlaWdodDonYXV0bycsb3BhY2l0eTp0cnVlLHNyYzonamF2YXNjcmlwdDpmYWxzZTsnfSxzKTt2YXIgaHRtbD0nPGlmcmFtZSBjbGFzcz0iYmdpZnJhbWUiZnJhbWVib3JkZXI9IjAidGFiaW5kZXg9Ii0xInNyYz0iJytzLnNyYysnIicrJ3N0eWxlPSJkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6LTE7JysKKHMub3BhY2l0eSE9PWZhbHNlPydmaWx0ZXI6QWxwaGEoT3BhY2l0eT1cJzBcJyk7JzonJykrJ3RvcDonKyhzLnRvcD09J2F1dG8nPydleHByZXNzaW9uKCgocGFyc2VJbnQodGhpcy5wYXJlbnROb2RlLmN1cnJlbnRTdHlsZS5ib3JkZXJUb3BXaWR0aCl8fDApKi0xKStcJ3B4XCcpJzpwcm9wKHMudG9wKSkrJzsnKydsZWZ0OicrKHMubGVmdD09J2F1dG8nPydleHByZXNzaW9uKCgocGFyc2VJbnQodGhpcy5wYXJlbnROb2RlLmN1cnJlbnRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgpfHwwKSotMSkrXCdweFwnKSc6cHJvcChzLmxlZnQpKSsnOycrJ3dpZHRoOicrKHMud2lkdGg9PSdhdXRvJz8nZXhwcmVzc2lvbih0aGlzLnBhcmVudE5vZGUub2Zmc2V0V2lkdGgrXCdweFwnKSc6cHJvcChzLndpZHRoKSkrJzsnKydoZWlnaHQ6Jysocy5oZWlnaHQ9PSdhdXRvJz8nZXhwcmVzc2lvbih0aGlzLnBhcmVudE5vZGUub2Zmc2V0SGVpZ2h0K1wncHhcJyknOnByb3Aocy5oZWlnaHQpKSsnOycrJyIvPic7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKCQodGhpcykuY2hpbGRyZW4oJ2lmcmFtZS5iZ2lmcmFtZScpLmxlbmd0aD09PTApCnRoaXMuaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaHRtbCksdGhpcy5maXJzdENoaWxkKTt9KTt9OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM7fSk7JC5mbi5iZ0lmcmFtZT0kLmZuLmJnaWZyYW1lO2Z1bmN0aW9uIHByb3Aobil7cmV0dXJuIG4mJm4uY29uc3RydWN0b3I9PT1OdW1iZXI/bisncHgnOm47fX0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/jquery.hoverIntent.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/LyoqCiogaG92ZXJJbnRlbnQgaXMgc2ltaWxhciB0byBqUXVlcnkncyBidWlsdC1pbiAiaG92ZXIiIGZ1bmN0aW9uIGV4Y2VwdCB0aGF0CiogaW5zdGVhZCBvZiBmaXJpbmcgdGhlIG9uTW91c2VPdmVyIGV2ZW50IGltbWVkaWF0ZWx5LCBob3ZlckludGVudCBjaGVja3MKKiB0byBzZWUgaWYgdGhlIHVzZXIncyBtb3VzZSBoYXMgc2xvd2VkIGRvd24gKGJlbmVhdGggdGhlIHNlbnNpdGl2aXR5CiogdGhyZXNob2xkKSBiZWZvcmUgZmlyaW5nIHRoZSBvbk1vdXNlT3ZlciBldmVudC4KKiAKKiBob3ZlckludGVudCByNSAvLyAyMDA3LjAzLjI3IC8vIGpRdWVyeSAxLjEuMgoqIDxodHRwOi8vY2hlcm5lLm5ldC9icmlhbi9yZXNvdXJjZXMvanF1ZXJ5LmhvdmVySW50ZW50Lmh0bWw+CiogCiogaG92ZXJJbnRlbnQgaXMgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdXNlIGluIGFsbCBwZXJzb25hbCBvciBjb21tZXJjaWFsIAoqIHByb2plY3RzIHVuZGVyIGJvdGggTUlUIGFuZCBHUEwgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIGNob29zZSAKKiB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0LCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgoqIAoqIC8vIGJhc2ljIHVzYWdlIChqdXN0IGxpa2UgLmhvdmVyKSByZWNlaXZlcyBvbk1vdXNlT3ZlciBhbmQgb25Nb3VzZU91dCBmdW5jdGlvbnMKKiAkKCJ1bCBsaSIpLmhvdmVySW50ZW50KCBzaG93TmF2ICwgaGlkZU5hdiApOwoqIAoqIC8vIGFkdmFuY2VkIHVzYWdlIHJlY2VpdmVzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IG9ubHkKKiAkKCJ1bCBsaSIpLmhvdmVySW50ZW50KHsKKglzZW5zaXRpdml0eTogMiwgLy8gbnVtYmVyID0gc2Vuc2l0aXZpdHkgdGhyZXNob2xkIChtdXN0IGJlIDEgb3IgaGlnaGVyKQoqCWludGVydmFsOiA1MCwgICAvLyBudW1iZXIgPSBtaWxsaXNlY29uZHMgb2YgcG9sbGluZyBpbnRlcnZhbAoqCW92ZXI6IHNob3dOYXYsICAvLyBmdW5jdGlvbiA9IG9uTW91c2VPdmVyIGNhbGxiYWNrIChyZXF1aXJlZCkKKgl0aW1lb3V0OiAxMDAsICAgLy8gbnVtYmVyID0gbWlsbGlzZWNvbmRzIGRlbGF5IGJlZm9yZSBvbk1vdXNlT3V0IGZ1bmN0aW9uIGNhbGwKKglvdXQ6IGhpZGVOYXYgICAgLy8gZnVuY3Rpb24gPSBvbk1vdXNlT3V0IGNhbGxiYWNrIChyZXF1aXJlZCkKKiB9KTsKKiAKKiBAcGFyYW0gIGYgIG9uTW91c2VPdmVyIGZ1bmN0aW9uIHx8IEFuIG9iamVjdCB3aXRoIGNvbmZpZ3VyYXRpb24gb3B0aW9ucwoqIEBwYXJhbSAgZyAgb25Nb3VzZU91dCBmdW5jdGlvbiAgfHwgTm90aGluZyAodXNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvYmplY3QpCiogQHJldHVybiAgICBUaGUgb2JqZWN0IChha2EgInRoaXMiKSB0aGF0IGNhbGxlZCBob3ZlckludGVudCwgYW5kIHRoZSBldmVudCBvYmplY3QKKiBAYXV0aG9yICAgIEJyaWFuIENoZXJuZSA8YnJpYW5AY2hlcm5lLm5ldD4KKiAKKiBtb2RpZmllZCBieSBLYXJsIFN3ZWRiZXJnLiBOYW1lc3BhY2VkIGV2ZW50cyBpbiBvcmRlciB0byB3b3JrIGJldHRlciB3aXRoIGNsdWVUaXAgcGx1Z2luCiovCihmdW5jdGlvbigkKSB7CgkkLmZuLmhvdmVySW50ZW50ID0gZnVuY3Rpb24oZixnKSB7CgkJLy8gZGVmYXVsdCBjb25maWd1cmF0aW9uIG9wdGlvbnMKCQl2YXIgY2ZnID0gewoJCQlzZW5zaXRpdml0eTogNywKCQkJaW50ZXJ2YWw6IDEwMCwKCQkJdGltZW91dDogMAoJCX07CgkJLy8gb3ZlcnJpZGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHdpdGggdXNlciBzdXBwbGllZCBvYmplY3QKCQljZmcgPSAkLmV4dGVuZChjZmcsIGcgPyB7IG92ZXI6IGYsIG91dDogZyB9IDogZiApOwoKCQkvLyBpbnN0YW50aWF0ZSB2YXJpYWJsZXMKCQkvLyBjWCwgY1kgPSBjdXJyZW50IFggYW5kIFkgcG9zaXRpb24gb2YgbW91c2UsIHVwZGF0ZWQgYnkgbW91c2Vtb3ZlIGV2ZW50CgkJLy8gcFgsIHBZID0gcHJldmlvdXMgWCBhbmQgWSBwb3NpdGlvbiBvZiBtb3VzZSwgc2V0IGJ5IG1vdXNlb3ZlciBhbmQgcG9sbGluZyBpbnRlcnZhbAoJCXZhciBjWCwgY1ksIHBYLCBwWTsKCgkJLy8gQSBwcml2YXRlIGZ1bmN0aW9uIGZvciBnZXR0aW5nIG1vdXNlIHBvc2l0aW9uCgkJdmFyIHRyYWNrID0gZnVuY3Rpb24oZXYpIHsKCQkJY1ggPSBldi5wYWdlWDsKCQkJY1kgPSBldi5wYWdlWTsKCQl9OwoKCQkvLyBBIHByaXZhdGUgZnVuY3Rpb24gZm9yIGNvbXBhcmluZyBjdXJyZW50IGFuZCBwcmV2aW91cyBtb3VzZSBwb3NpdGlvbgoJCXZhciBjb21wYXJlID0gZnVuY3Rpb24oZXYsb2IpIHsKCQkJb2IuaG92ZXJJbnRlbnRfdCA9IGNsZWFyVGltZW91dChvYi5ob3ZlckludGVudF90KTsKCQkJLy8gY29tcGFyZSBtb3VzZSBwb3NpdGlvbnMgdG8gc2VlIGlmIHRoZXkndmUgY3Jvc3NlZCB0aGUgdGhyZXNob2xkCgkJCWlmICggKCBNYXRoLmFicyhwWC1jWCkgKyBNYXRoLmFicyhwWS1jWSkgKSA8IGNmZy5zZW5zaXRpdml0eSApIHsKCQkJCSQob2IpLnVuYmluZCgibW91c2Vtb3ZlIix0cmFjayk7CgkJCQkvLyBzZXQgaG92ZXJJbnRlbnQgc3RhdGUgdG8gdHJ1ZSAoc28gbW91c2VPdXQgY2FuIGJlIGNhbGxlZCkKCQkJCW9iLmhvdmVySW50ZW50X3MgPSAxOwoJCQkJcmV0dXJuIGNmZy5vdmVyLmFwcGx5KG9iLFtldl0pOwoJCQl9IGVsc2UgewoJCQkJLy8gc2V0IHByZXZpb3VzIGNvb3JkaW5hdGVzIGZvciBuZXh0IHRpbWUKCQkJCXBYID0gY1g7IHBZID0gY1k7CgkJCQkvLyB1c2Ugc2VsZi1jYWxsaW5nIHRpbWVvdXQsIGd1YXJhbnRlZXMgaW50ZXJ2YWxzIGFyZSBzcGFjZWQgb3V0IHByb3Blcmx5IChhdm9pZHMgSmF2YVNjcmlwdCB0aW1lciBidWdzKQoJCQkJb2IuaG92ZXJJbnRlbnRfdCA9IHNldFRpbWVvdXQoIGZ1bmN0aW9uKCl7Y29tcGFyZShldiwgb2IpO30gLCBjZmcuaW50ZXJ2YWwgKTsKCQkJfQoJCX07CgoJCS8vIEEgcHJpdmF0ZSBmdW5jdGlvbiBmb3IgZGVsYXlpbmcgdGhlIG1vdXNlT3V0IGZ1bmN0aW9uCgkJdmFyIGRlbGF5ID0gZnVuY3Rpb24oZXYsb2IpIHsKCQkJb2IuaG92ZXJJbnRlbnRfdCA9IGNsZWFyVGltZW91dChvYi5ob3ZlckludGVudF90KTsKCQkJb2IuaG92ZXJJbnRlbnRfcyA9IDA7CgkJCXJldHVybiBjZmcub3V0LmFwcGx5KG9iLFtldl0pOwoJCX07CgoJCS8vIEEgcHJpdmF0ZSBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgbW91c2UgJ2hvdmVyaW5nJwoJCXZhciBoYW5kbGVIb3ZlciA9IGZ1bmN0aW9uKGUpIHsKCQkJLy8gbmV4dCB0aHJlZSBsaW5lcyBjb3BpZWQgZnJvbSBqUXVlcnkuaG92ZXIsIGlnbm9yZSBjaGlsZHJlbiBvbk1vdXNlT3Zlci9vbk1vdXNlT3V0CgkJCXZhciBwID0gKGUudHlwZSA9PSAibW91c2VvdmVyIiA/IGUuZnJvbUVsZW1lbnQgOiBlLnRvRWxlbWVudCkgfHwgZS5yZWxhdGVkVGFyZ2V0OwoJCQl3aGlsZSAoIHAgJiYgcCAhPSB0aGlzICkgeyB0cnkgeyBwID0gcC5wYXJlbnROb2RlOyB9IGNhdGNoKGUpIHsgcCA9IHRoaXM7IH0gfQoJCQlpZiAoIHAgPT0gdGhpcyApIHsgcmV0dXJuIGZhbHNlOyB9CgoJCQkvLyBjb3B5IG9iamVjdHMgdG8gYmUgcGFzc2VkIGludG8gdCAocmVxdWlyZWQgZm9yIGV2ZW50IG9iamVjdCB0byBiZSBwYXNzZWQgaW4gSUUpCgkJCXZhciBldiA9IGpRdWVyeS5leHRlbmQoe30sZSk7CgkJCXZhciBvYiA9IHRoaXM7CgoJCQkvLyBjYW5jZWwgaG92ZXJJbnRlbnQgdGltZXIgaWYgaXQgZXhpc3RzCgkJCWlmIChvYi5ob3ZlckludGVudF90KSB7IG9iLmhvdmVySW50ZW50X3QgPSBjbGVhclRpbWVvdXQob2IuaG92ZXJJbnRlbnRfdCk7IH0KCgkJCS8vIGVsc2UgZS50eXBlID09ICJvbm1vdXNlb3ZlciIKCQkJaWYgKGUudHlwZSA9PSAibW91c2VvdmVyIikgewoJCQkJLy8gc2V0ICJwcmV2aW91cyIgWCBhbmQgWSBwb3NpdGlvbiBiYXNlZCBvbiBpbml0aWFsIGVudHJ5IHBvaW50CgkJCQlwWCA9IGV2LnBhZ2VYOyBwWSA9IGV2LnBhZ2VZOwoJCQkJLy8gdXBkYXRlICJjdXJyZW50IiBYIGFuZCBZIHBvc2l0aW9uIGJhc2VkIG9uIG1vdXNlbW92ZQoJCQkJJChvYikuYmluZCgibW91c2Vtb3ZlLmNsdWV0aXAiLHRyYWNrKTsKCQkJCS8vIHN0YXJ0IHBvbGxpbmcgaW50ZXJ2YWwgKHNlbGYtY2FsbGluZyB0aW1lb3V0KSB0byBjb21wYXJlIG1vdXNlIGNvb3JkaW5hdGVzIG92ZXIgdGltZQoJCQkJaWYgKG9iLmhvdmVySW50ZW50X3MgIT0gMSkgeyBvYi5ob3ZlckludGVudF90ID0gc2V0VGltZW91dCggZnVuY3Rpb24oKXtjb21wYXJlKGV2LG9iKTt9ICwgY2ZnLmludGVydmFsICk7fQoKCQkJLy8gZWxzZSBlLnR5cGUgPT0gIm9ubW91c2VvdXQiCgkJCX0gZWxzZSB7CgkJCQkvLyB1bmJpbmQgZXhwZW5zaXZlIG1vdXNlbW92ZSBldmVudAoJCQkJJChvYikudW5iaW5kKCJtb3VzZW1vdmUuY2x1ZXRpcCIsdHJhY2spOwoJCQkJLy8gaWYgaG92ZXJJbnRlbnQgc3RhdGUgaXMgdHJ1ZSwgdGhlbiBjYWxsIHRoZSBtb3VzZU91dCBmdW5jdGlvbiBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5CgkJCQlpZiAob2IuaG92ZXJJbnRlbnRfcyA9PSAxKSB7IG9iLmhvdmVySW50ZW50X3QgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpe2RlbGF5KGV2LG9iKTt9ICwgY2ZnLnRpbWVvdXQgKTt9CgkJCX0KCQl9OwoKCQkvLyBiaW5kIHRoZSBmdW5jdGlvbiB0byB0aGUgdHdvIGV2ZW50IGxpc3RlbmVycwoJCXJldHVybiB0aGlzLmJpbmQoJ21vdXNlb3Zlci5jbHVldGlwJywgaGFuZGxlSG92ZXIpLmJpbmQoJ21vdXNlb3V0LmNsdWV0aXAnLCBoYW5kbGVIb3Zlcik7Cgl9Owp9KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/jquery.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuNi4zCiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBDb3B5cmlnaHQgMjAxMSwgSm9obiBSZXNpZwogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cDovL3NpenpsZWpzLmNvbS8KICogQ29weXJpZ2h0IDIwMTEsIFRoZSBEb2pvIEZvdW5kYXRpb24KICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLgogKgogKiBEYXRlOiBXZWQgQXVnIDMxIDEwOjUwOjMzIDIwMTEgLTA0MDAKICovCihmdW5jdGlvbiggd2luZG93LCB1bmRlZmluZWQgKSB7CgovLyBVc2UgdGhlIGNvcnJlY3QgZG9jdW1lbnQgYWNjb3JkaW5nbHkgd2l0aCB3aW5kb3cgYXJndW1lbnQgKHNhbmRib3gpCnZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCwKCW5hdmlnYXRvciA9IHdpbmRvdy5uYXZpZ2F0b3IsCglsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjsKdmFyIGpRdWVyeSA9IChmdW5jdGlvbigpIHsKCi8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5CnZhciBqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CgkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCgkJcmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnkgKTsKCX0sCgoJLy8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3ZlcndyaXRlCglfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSwKCgkvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZQoJXyQgPSB3aW5kb3cuJCwKCgkvLyBBIGNlbnRyYWwgcmVmZXJlbmNlIHRvIHRoZSByb290IGpRdWVyeShkb2N1bWVudCkKCXJvb3RqUXVlcnksCgoJLy8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Mgb3IgSUQgc3RyaW5ncwoJLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQoJcXVpY2tFeHByID0gL14oPzpbXiM8XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSopJCkvLAoKCS8vIENoZWNrIGlmIGEgc3RyaW5nIGhhcyBhIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpbiBpdAoJcm5vdHdoaXRlID0gL1xTLywKCgkvLyBVc2VkIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlCgl0cmltTGVmdCA9IC9eXHMrLywKCXRyaW1SaWdodCA9IC9ccyskLywKCgkvLyBDaGVjayBmb3IgZGlnaXRzCglyZGlnaXQgPSAvXGQvLAoKCS8vIE1hdGNoIGEgc3RhbmRhbG9uZSB0YWcKCXJzaW5nbGVUYWcgPSAvXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT4pPyQvLAoKCS8vIEpTT04gUmVnRXhwCglydmFsaWRjaGFycyA9IC9eW1xdLDp7fVxzXSokLywKCXJ2YWxpZGVzY2FwZSA9IC9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2csCglydmFsaWR0b2tlbnMgPSAvIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2csCglydmFsaWRicmFjZXMgPSAvKD86Xnw6fCwpKD86XHMqXFspKy9nLAoKCS8vIFVzZXJhZ2VudCBSZWdFeHAKCXJ3ZWJraXQgPSAvKHdlYmtpdClbIFwvXShbXHcuXSspLywKCXJvcGVyYSA9IC8ob3BlcmEpKD86Lip2ZXJzaW9uKT9bIFwvXShbXHcuXSspLywKCXJtc2llID0gLyhtc2llKSAoW1x3Ll0rKS8sCglybW96aWxsYSA9IC8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sCgoJLy8gTWF0Y2hlcyBkYXNoZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nCglyZGFzaEFscGhhID0gLy0oW2Etel18WzAtOV0pL2lnLAoJcm1zUHJlZml4ID0gL14tbXMtLywKCgkvLyBVc2VkIGJ5IGpRdWVyeS5jYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpCglmY2FtZWxDYXNlID0gZnVuY3Rpb24oIGFsbCwgbGV0dGVyICkgewoJCXJldHVybiAoIGxldHRlciArICIiICkudG9VcHBlckNhc2UoKTsKCX0sCgoJLy8gS2VlcCBhIFVzZXJBZ2VudCBzdHJpbmcgZm9yIHVzZSB3aXRoIGpRdWVyeS5icm93c2VyCgl1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50LAoKCS8vIEZvciBtYXRjaGluZyB0aGUgZW5naW5lIGFuZCB2ZXJzaW9uIG9mIHRoZSBicm93c2VyCglicm93c2VyTWF0Y2gsCgoJLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5CglyZWFkeUxpc3QsCgoJLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIKCURPTUNvbnRlbnRMb2FkZWQsCgoJLy8gU2F2ZSBhIHJlZmVyZW5jZSB0byBzb21lIGNvcmUgbWV0aG9kcwoJdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAoJaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSwKCXB1c2ggPSBBcnJheS5wcm90b3R5cGUucHVzaCwKCXNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLAoJdHJpbSA9IFN0cmluZy5wcm90b3R5cGUudHJpbSwKCWluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiwKCgkvLyBbW0NsYXNzXV0gLT4gdHlwZSBwYWlycwoJY2xhc3MydHlwZSA9IHt9OwoKalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKCWNvbnN0cnVjdG9yOiBqUXVlcnksCglpbml0OiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnkgKSB7CgkJdmFyIG1hdGNoLCBlbGVtLCByZXQsIGRvYzsKCgkJLy8gSGFuZGxlICQoIiIpLCAkKG51bGwpLCBvciAkKHVuZGVmaW5lZCkKCQlpZiAoICFzZWxlY3RvciApIHsKCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQkvLyBIYW5kbGUgJChET01FbGVtZW50KQoJCWlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7CgkJCXRoaXMuY29udGV4dCA9IHRoaXNbMF0gPSBzZWxlY3RvcjsKCQkJdGhpcy5sZW5ndGggPSAxOwoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCS8vIFRoZSBib2R5IGVsZW1lbnQgb25seSBleGlzdHMgb25jZSwgb3B0aW1pemUgZmluZGluZyBpdAoJCWlmICggc2VsZWN0b3IgPT09ICJib2R5IiAmJiAhY29udGV4dCAmJiBkb2N1bWVudC5ib2R5ICkgewoJCQl0aGlzLmNvbnRleHQgPSBkb2N1bWVudDsKCQkJdGhpc1swXSA9IGRvY3VtZW50LmJvZHk7CgkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKCQkJdGhpcy5sZW5ndGggPSAxOwoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCS8vIEFyZSB3ZSBkZWFsaW5nIHdpdGggSFRNTCBzdHJpbmcgb3IgYW4gSUQ/CgkJCWlmICggc2VsZWN0b3IuY2hhckF0KDApID09PSAiPCIgJiYgc2VsZWN0b3IuY2hhckF0KCBzZWxlY3Rvci5sZW5ndGggLSAxICkgPT09ICI+IiAmJiBzZWxlY3Rvci5sZW5ndGggPj0gMyApIHsKCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrCgkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKCgkJCX0gZWxzZSB7CgkJCQltYXRjaCA9IHF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApOwoJCQl9CgoJCQkvLyBWZXJpZnkgYSBtYXRjaCwgYW5kIHRoYXQgbm8gY29udGV4dCB3YXMgc3BlY2lmaWVkIGZvciAjaWQKCQkJaWYgKCBtYXRjaCAmJiAobWF0Y2hbMV0gfHwgIWNvbnRleHQpICkgewoKCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQoJCQkJaWYgKCBtYXRjaFsxXSApIHsKCQkJCQljb250ZXh0ID0gY29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbMF0gOiBjb250ZXh0OwoJCQkJCWRvYyA9IChjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCk7CgoJCQkJCS8vIElmIGEgc2luZ2xlIHN0cmluZyBpcyBwYXNzZWQgaW4gYW5kIGl0J3MgYSBzaW5nbGUgdGFnCgkJCQkJLy8ganVzdCBkbyBhIGNyZWF0ZUVsZW1lbnQgYW5kIHNraXAgdGhlIHJlc3QKCQkJCQlyZXQgPSByc2luZ2xlVGFnLmV4ZWMoIHNlbGVjdG9yICk7CgoJCQkJCWlmICggcmV0ICkgewoJCQkJCQlpZiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CgkJCQkJCQlzZWxlY3RvciA9IFsgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggcmV0WzFdICkgXTsKCQkJCQkJCWpRdWVyeS5mbi5hdHRyLmNhbGwoIHNlbGVjdG9yLCBjb250ZXh0LCB0cnVlICk7CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJc2VsZWN0b3IgPSBbIGRvYy5jcmVhdGVFbGVtZW50KCByZXRbMV0gKSBdOwoJCQkJCQl9CgoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBbIG1hdGNoWzFdIF0sIFsgZG9jIF0gKTsKCQkJCQkJc2VsZWN0b3IgPSAocmV0LmNhY2hlYWJsZSA/IGpRdWVyeS5jbG9uZShyZXQuZnJhZ21lbnQpIDogcmV0LmZyYWdtZW50KS5jaGlsZE5vZGVzOwoJCQkJCX0KCgkJCQkJcmV0dXJuIGpRdWVyeS5tZXJnZSggdGhpcywgc2VsZWN0b3IgKTsKCgkJCQkvLyBIQU5ETEU6ICQoIiNpZCIpCgkJCQl9IGVsc2UgewoJCQkJCWVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbMl0gKTsKCgkJCQkJLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMKCQkJCQkvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzCgkJCQkJaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFIGFuZCBPcGVyYSByZXR1cm4gaXRlbXMKCQkJCQkJLy8gYnkgbmFtZSBpbnN0ZWFkIG9mIElECgkJCQkJCWlmICggZWxlbS5pZCAhPT0gbWF0Y2hbMl0gKSB7CgkJCQkJCQlyZXR1cm4gcm9vdGpRdWVyeS5maW5kKCBzZWxlY3RvciApOwoJCQkJCQl9CgoJCQkJCQkvLyBPdGhlcndpc2UsIHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0CgkJCQkJCXRoaXMubGVuZ3RoID0gMTsKCQkJCQkJdGhpc1swXSA9IGVsZW07CgkJCQkJfQoKCQkJCQl0aGlzLmNvbnRleHQgPSBkb2N1bWVudDsKCQkJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9CgoJCQkvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKQoJCQl9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHsKCQkJCXJldHVybiAoY29udGV4dCB8fCByb290alF1ZXJ5KS5maW5kKCBzZWxlY3RvciApOwoKCQkJLy8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpCgkJCS8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGV4dCkuZmluZChleHByKQoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIHRoaXMuY29uc3RydWN0b3IoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApOwoJCQl9CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKCQl9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHsKCQkJcmV0dXJuIHJvb3RqUXVlcnkucmVhZHkoIHNlbGVjdG9yICk7CgkJfQoKCQlpZiAoc2VsZWN0b3Iuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCkgewoJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7CgkJCXRoaXMuY29udGV4dCA9IHNlbGVjdG9yLmNvbnRleHQ7CgkJfQoKCQlyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTsKCX0sCgoJLy8gU3RhcnQgd2l0aCBhbiBlbXB0eSBzZWxlY3RvcgoJc2VsZWN0b3I6ICIiLAoKCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKCWpxdWVyeTogIjEuNi4zIiwKCgkvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDAKCWxlbmd0aDogMCwKCgkvLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldAoJc2l6ZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubGVuZ3RoOwoJfSwKCgl0b0FycmF5OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gc2xpY2UuY2FsbCggdGhpcywgMCApOwoJfSwKCgkvLyBHZXQgdGhlIE50aCBlbGVtZW50IGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0IE9SCgkvLyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheQoJZ2V0OiBmdW5jdGlvbiggbnVtICkgewoJCXJldHVybiBudW0gPT0gbnVsbCA/CgoJCQkvLyBSZXR1cm4gYSAnY2xlYW4nIGFycmF5CgkJCXRoaXMudG9BcnJheSgpIDoKCgkJCS8vIFJldHVybiBqdXN0IHRoZSBvYmplY3QKCQkJKCBudW0gPCAwID8gdGhpc1sgdGhpcy5sZW5ndGggKyBudW0gXSA6IHRoaXNbIG51bSBdICk7Cgl9LAoKCS8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sKCS8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KQoJcHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMsIG5hbWUsIHNlbGVjdG9yICkgewoJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CgkJdmFyIHJldCA9IHRoaXMuY29uc3RydWN0b3IoKTsKCgkJaWYgKCBqUXVlcnkuaXNBcnJheSggZWxlbXMgKSApIHsKCQkJcHVzaC5hcHBseSggcmV0LCBlbGVtcyApOwoKCQl9IGVsc2UgewoJCQlqUXVlcnkubWVyZ2UoIHJldCwgZWxlbXMgKTsKCQl9CgoJCS8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpCgkJcmV0LnByZXZPYmplY3QgPSB0aGlzOwoKCQlyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDsKCgkJaWYgKCBuYW1lID09PSAiZmluZCIgKSB7CgkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAodGhpcy5zZWxlY3RvciA/ICIgIiA6ICIiKSArIHNlbGVjdG9yOwoJCX0gZWxzZSBpZiAoIG5hbWUgKSB7CgkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAiLiIgKyBuYW1lICsgIigiICsgc2VsZWN0b3IgKyAiKSI7CgkJfQoKCQkvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldAoJCXJldHVybiByZXQ7Cgl9LAoKCS8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuCgkvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpcwoJLy8gb25seSB1c2VkIGludGVybmFsbHkuKQoJZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrLCBhcmdzICkgewoJCXJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2ssIGFyZ3MgKTsKCX0sCgoJcmVhZHk6IGZ1bmN0aW9uKCBmbiApIHsKCQkvLyBBdHRhY2ggdGhlIGxpc3RlbmVycwoJCWpRdWVyeS5iaW5kUmVhZHkoKTsKCgkJLy8gQWRkIHRoZSBjYWxsYmFjawoJCXJlYWR5TGlzdC5kb25lKCBmbiApOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZXE6IGZ1bmN0aW9uKCBpICkgewoJCXJldHVybiBpID09PSAtMSA/CgkJCXRoaXMuc2xpY2UoIGkgKSA6CgkJCXRoaXMuc2xpY2UoIGksICtpICsgMSApOwoJfSwKCglmaXJzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKCX0sCgoJbGFzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIC0xICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSwKCQkJInNsaWNlIiwgc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSApOwoJfSwKCgltYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAodGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CgkJfSkpOwoJfSwKCgllbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcihudWxsKTsKCX0sCgoJLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgoJLy8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuCglwdXNoOiBwdXNoLAoJc29ydDogW10uc29ydCwKCXNwbGljZTogW10uc3BsaWNlCn07CgovLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uCmpRdWVyeS5mbi5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjsKCmpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7Cgl2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsCgkJdGFyZ2V0ID0gYXJndW1lbnRzWzBdIHx8IHt9LAoJCWkgPSAxLAoJCWxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsCgkJZGVlcCA9IGZhbHNlOwoKCS8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24KCWlmICggdHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4iICkgewoJCWRlZXAgPSB0YXJnZXQ7CgkJdGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9OwoJCS8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXQKCQlpID0gMjsKCX0KCgkvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSkKCWlmICggdHlwZW9mIHRhcmdldCAhPT0gIm9iamVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gZXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGxlbmd0aCA9PT0gaSApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCS0taTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCgkJaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkgewoJCQkvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0CgkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKCQkJCXNyYyA9IHRhcmdldFsgbmFtZSBdOwoJCQkJY29weSA9IG9wdGlvbnNbIG5hbWUgXTsKCgkJCQkvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wCgkJCQlpZiAoIHRhcmdldCA9PT0gY29weSApIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXMKCQkJCWlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0galF1ZXJ5LmlzQXJyYXkoY29weSkpICkgKSB7CgkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdOwoKCQkJCQl9IGVsc2UgewoJCQkJCQljbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdChzcmMpID8gc3JjIDoge307CgkJCQkJfQoKCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAoJcmV0dXJuIHRhcmdldDsKfTsKCmpRdWVyeS5leHRlbmQoewoJbm9Db25mbGljdDogZnVuY3Rpb24oIGRlZXAgKSB7CgkJaWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkgewoJCQl3aW5kb3cuJCA9IF8kOwoJCX0KCgkJaWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSApIHsKCQkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7CgkJfQoKCQlyZXR1cm4galF1ZXJ5OwoJfSwKCgkvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLgoJaXNSZWFkeTogZmFsc2UsCgoJLy8gQSBjb3VudGVyIHRvIHRyYWNrIGhvdyBtYW55IGl0ZW1zIHRvIHdhaXQgZm9yIGJlZm9yZQoJLy8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODEKCXJlYWR5V2FpdDogMSwKCgkvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnQKCWhvbGRSZWFkeTogZnVuY3Rpb24oIGhvbGQgKSB7CgkJaWYgKCBob2xkICkgewoJCQlqUXVlcnkucmVhZHlXYWl0Kys7CgkJfSBlbHNlIHsKCQkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7CgkJfQoJfSwKCgkvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5CglyZWFkeTogZnVuY3Rpb24oIHdhaXQgKSB7CgkJLy8gRWl0aGVyIGEgcmVsZWFzZWQgaG9sZCBvciBhbiBET01yZWFkeS9sb2FkIGV2ZW50IGFuZCBub3QgeWV0IHJlYWR5CgkJaWYgKCAod2FpdCA9PT0gdHJ1ZSAmJiAhLS1qUXVlcnkucmVhZHlXYWl0KSB8fCAod2FpdCAhPT0gdHJ1ZSAmJiAhalF1ZXJ5LmlzUmVhZHkpICkgewoJCQkvLyBNYWtlIHN1cmUgYm9keSBleGlzdHMsIGF0IGxlYXN0LCBpbiBjYXNlIElFIGdldHMgYSBsaXR0bGUgb3ZlcnplYWxvdXMgKHRpY2tldCAjNTQ0MykuCgkJCWlmICggIWRvY3VtZW50LmJvZHkgKSB7CgkJCQlyZXR1cm4gc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5LCAxICk7CgkJCX0KCgkJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCQlqUXVlcnkuaXNSZWFkeSA9IHRydWU7CgoJCQkvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZQoJCQlpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCQlyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7CgoJCQkvLyBUcmlnZ2VyIGFueSBib3VuZCByZWFkeSBldmVudHMKCQkJaWYgKCBqUXVlcnkuZm4udHJpZ2dlciApIHsKCQkJCWpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VyKCAicmVhZHkiICkudW5iaW5kKCAicmVhZHkiICk7CgkJCX0KCQl9Cgl9LAoKCWJpbmRSZWFkeTogZnVuY3Rpb24oKSB7CgkJaWYgKCByZWFkeUxpc3QgKSB7CgkJCXJldHVybjsKCQl9CgoJCXJlYWR5TGlzdCA9IGpRdWVyeS5fRGVmZXJyZWQoKTsKCgkJLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWQgYWZ0ZXIgdGhlCgkJLy8gYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KCQlpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgKSB7CgkJCS8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQoJCQlyZXR1cm4gc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5LCAxICk7CgkJfQoKCQkvLyBNb3ppbGxhLCBPcGVyYSBhbmQgd2Via2l0IG5pZ2h0bGllcyBjdXJyZW50bHkgc3VwcG9ydCB0aGlzIGV2ZW50CgkJaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgewoJCQkvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrCgkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgRE9NQ29udGVudExvYWRlZCwgZmFsc2UgKTsKCgkJCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAibG9hZCIsIGpRdWVyeS5yZWFkeSwgZmFsc2UgKTsKCgkJLy8gSWYgSUUgZXZlbnQgbW9kZWwgaXMgdXNlZAoJCX0gZWxzZSBpZiAoIGRvY3VtZW50LmF0dGFjaEV2ZW50ICkgewoJCQkvLyBlbnN1cmUgZmlyaW5nIGJlZm9yZSBvbmxvYWQsCgkJCS8vIG1heWJlIGxhdGUgYnV0IHNhZmUgYWxzbyBmb3IgaWZyYW1lcwoJCQlkb2N1bWVudC5hdHRhY2hFdmVudCggIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIERPTUNvbnRlbnRMb2FkZWQgKTsKCgkJCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgkJCXdpbmRvdy5hdHRhY2hFdmVudCggIm9ubG9hZCIsIGpRdWVyeS5yZWFkeSApOwoKCQkJLy8gSWYgSUUgYW5kIG5vdCBhIGZyYW1lCgkJCS8vIGNvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKCQkJdmFyIHRvcGxldmVsID0gZmFsc2U7CgoJCQl0cnkgewoJCQkJdG9wbGV2ZWwgPSB3aW5kb3cuZnJhbWVFbGVtZW50ID09IG51bGw7CgkJCX0gY2F0Y2goZSkge30KCgkJCWlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsICYmIHRvcGxldmVsICkgewoJCQkJZG9TY3JvbGxDaGVjaygpOwoJCQl9CgkJfQoJfSwKCgkvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLgoJLy8gU2luY2UgdmVyc2lvbiAxLjMsIERPTSBtZXRob2RzIGFuZCBmdW5jdGlvbnMgbGlrZSBhbGVydAoJLy8gYXJlbid0IHN1cHBvcnRlZC4gVGhleSByZXR1cm4gZmFsc2Ugb24gSUUgKCMyOTY4KS4KCWlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIGpRdWVyeS50eXBlKG9iaikgPT09ICJmdW5jdGlvbiI7Cgl9LAoKCWlzQXJyYXk6IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gImFycmF5IjsKCX0sCgoJLy8gQSBjcnVkZSB3YXkgb2YgZGV0ZXJtaW5pbmcgaWYgYW4gb2JqZWN0IGlzIGEgd2luZG93Cglpc1dpbmRvdzogZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICJvYmplY3QiICYmICJzZXRJbnRlcnZhbCIgaW4gb2JqOwoJfSwKCglpc05hTjogZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4gb2JqID09IG51bGwgfHwgIXJkaWdpdC50ZXN0KCBvYmogKSB8fCBpc05hTiggb2JqICk7Cgl9LAoKCXR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIG9iaiA9PSBudWxsID8KCQkJU3RyaW5nKCBvYmogKSA6CgkJCWNsYXNzMnR5cGVbIHRvU3RyaW5nLmNhbGwob2JqKSBdIHx8ICJvYmplY3QiOwoJfSwKCglpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkgewoJCS8vIE11c3QgYmUgYW4gT2JqZWN0LgoJCS8vIEJlY2F1c2Ugb2YgSUUsIHdlIGFsc28gaGF2ZSB0byBjaGVjayB0aGUgcHJlc2VuY2Ugb2YgdGhlIGNvbnN0cnVjdG9yIHByb3BlcnR5LgoJCS8vIE1ha2Ugc3VyZSB0aGF0IERPTSBub2RlcyBhbmQgd2luZG93IG9iamVjdHMgZG9uJ3QgcGFzcyB0aHJvdWdoLCBhcyB3ZWxsCgkJaWYgKCAhb2JqIHx8IGpRdWVyeS50eXBlKG9iaikgIT09ICJvYmplY3QiIHx8IG9iai5ub2RlVHlwZSB8fCBqUXVlcnkuaXNXaW5kb3coIG9iaiApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQl0cnkgewoJCQkvLyBOb3Qgb3duIGNvbnN0cnVjdG9yIHByb3BlcnR5IG11c3QgYmUgT2JqZWN0CgkJCWlmICggb2JqLmNvbnN0cnVjdG9yICYmCgkJCQkhaGFzT3duLmNhbGwob2JqLCAiY29uc3RydWN0b3IiKSAmJgoJCQkJIWhhc093bi5jYWxsKG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsICJpc1Byb3RvdHlwZU9mIikgKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9IGNhdGNoICggZSApIHsKCQkJLy8gSUU4LDkgV2lsbCB0aHJvdyBleGNlcHRpb25zIG9uIGNlcnRhaW4gaG9zdCBvYmplY3RzICM5ODk3CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIE93biBwcm9wZXJ0aWVzIGFyZSBlbnVtZXJhdGVkIGZpcnN0bHksIHNvIHRvIHNwZWVkIHVwLAoJCS8vIGlmIGxhc3Qgb25lIGlzIG93biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duLgoKCQl2YXIga2V5OwoJCWZvciAoIGtleSBpbiBvYmogKSB7fQoKCQlyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgfHwgaGFzT3duLmNhbGwoIG9iaiwga2V5ICk7Cgl9LAoKCWlzRW1wdHlPYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7CgkJZm9yICggdmFyIG5hbWUgaW4gb2JqICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfSwKCgllcnJvcjogZnVuY3Rpb24oIG1zZyApIHsKCQl0aHJvdyBtc2c7Cgl9LAoKCXBhcnNlSlNPTjogZnVuY3Rpb24oIGRhdGEgKSB7CgkJaWYgKCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgfHwgIWRhdGEgKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCgkJLy8gTWFrZSBzdXJlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyByZW1vdmVkIChJRSBjYW4ndCBoYW5kbGUgaXQpCgkJZGF0YSA9IGpRdWVyeS50cmltKCBkYXRhICk7CgoJCS8vIEF0dGVtcHQgdG8gcGFyc2UgdXNpbmcgdGhlIG5hdGl2ZSBKU09OIHBhcnNlciBmaXJzdAoJCWlmICggd2luZG93LkpTT04gJiYgd2luZG93LkpTT04ucGFyc2UgKSB7CgkJCXJldHVybiB3aW5kb3cuSlNPTi5wYXJzZSggZGF0YSApOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoZSBpbmNvbWluZyBkYXRhIGlzIGFjdHVhbCBKU09OCgkJLy8gTG9naWMgYm9ycm93ZWQgZnJvbSBodHRwOi8vanNvbi5vcmcvanNvbjIuanMKCQlpZiAoIHJ2YWxpZGNoYXJzLnRlc3QoIGRhdGEucmVwbGFjZSggcnZhbGlkZXNjYXBlLCAiQCIgKQoJCQkucmVwbGFjZSggcnZhbGlkdG9rZW5zLCAiXSIgKQoJCQkucmVwbGFjZSggcnZhbGlkYnJhY2VzLCAiIikpICkgewoKCQkJcmV0dXJuIChuZXcgRnVuY3Rpb24oICJyZXR1cm4gIiArIGRhdGEgKSkoKTsKCgkJfQoJCWpRdWVyeS5lcnJvciggIkludmFsaWQgSlNPTjogIiArIGRhdGEgKTsKCX0sCgoJLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFyc2luZwoJcGFyc2VYTUw6IGZ1bmN0aW9uKCBkYXRhICkgewoJCXZhciB4bWwsIHRtcDsKCQl0cnkgewoJCQlpZiAoIHdpbmRvdy5ET01QYXJzZXIgKSB7IC8vIFN0YW5kYXJkCgkJCQl0bXAgPSBuZXcgRE9NUGFyc2VyKCk7CgkJCQl4bWwgPSB0bXAucGFyc2VGcm9tU3RyaW5nKCBkYXRhICwgInRleHQveG1sIiApOwoJCQl9IGVsc2UgeyAvLyBJRQoJCQkJeG1sID0gbmV3IEFjdGl2ZVhPYmplY3QoICJNaWNyb3NvZnQuWE1MRE9NIiApOwoJCQkJeG1sLmFzeW5jID0gImZhbHNlIjsKCQkJCXhtbC5sb2FkWE1MKCBkYXRhICk7CgkJCX0KCQl9IGNhdGNoKCBlICkgewoJCQl4bWwgPSB1bmRlZmluZWQ7CgkJfQoJCWlmICggIXhtbCB8fCAheG1sLmRvY3VtZW50RWxlbWVudCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJwYXJzZXJlcnJvciIgKS5sZW5ndGggKSB7CgkJCWpRdWVyeS5lcnJvciggIkludmFsaWQgWE1MOiAiICsgZGF0YSApOwoJCX0KCQlyZXR1cm4geG1sOwoJfSwKCglub29wOiBmdW5jdGlvbigpIHt9LAoKCS8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CgkvLyBXb3JrYXJvdW5kcyBiYXNlZCBvbiBmaW5kaW5ncyBieSBKaW0gRHJpc2NvbGwKCS8vIGh0dHA6Ly93ZWJsb2dzLmphdmEubmV0L2Jsb2cvZHJpc2NvbGwvYXJjaGl2ZS8yMDA5LzA5LzA4L2V2YWwtamF2YXNjcmlwdC1nbG9iYWwtY29udGV4dAoJZ2xvYmFsRXZhbDogZnVuY3Rpb24oIGRhdGEgKSB7CgkJaWYgKCBkYXRhICYmIHJub3R3aGl0ZS50ZXN0KCBkYXRhICkgKSB7CgkJCS8vIFdlIHVzZSBleGVjU2NyaXB0IG9uIEludGVybmV0IEV4cGxvcmVyCgkJCS8vIFdlIHVzZSBhbiBhbm9ueW1vdXMgZnVuY3Rpb24gc28gdGhhdCBjb250ZXh0IGlzIHdpbmRvdwoJCQkvLyByYXRoZXIgdGhhbiBqUXVlcnkgaW4gRmlyZWZveAoJCQkoIHdpbmRvdy5leGVjU2NyaXB0IHx8IGZ1bmN0aW9uKCBkYXRhICkgewoJCQkJd2luZG93WyAiZXZhbCIgXS5jYWxsKCB3aW5kb3csIGRhdGEgKTsKCQkJfSApKCBkYXRhICk7CgkJfQoJfSwKCgkvLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzCgkvLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpCgljYW1lbENhc2U6IGZ1bmN0aW9uKCBzdHJpbmcgKSB7CgkJcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwoJfSwKCglub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBuYW1lLnRvVXBwZXJDYXNlKCk7Cgl9LAoKCS8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKCWVhY2g6IGZ1bmN0aW9uKCBvYmplY3QsIGNhbGxiYWNrLCBhcmdzICkgewoJCXZhciBuYW1lLCBpID0gMCwKCQkJbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aCwKCQkJaXNPYmogPSBsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNGdW5jdGlvbiggb2JqZWN0ICk7CgoJCWlmICggYXJncyApIHsKCQkJaWYgKCBpc09iaiApIHsKCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkgewoJCQkJCWlmICggY2FsbGJhY2suYXBwbHkoIG9iamVjdFsgbmFtZSBdLCBhcmdzICkgPT09IGZhbHNlICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCA7IGkgPCBsZW5ndGg7ICkgewoJCQkJCWlmICggY2FsbGJhY2suYXBwbHkoIG9iamVjdFsgaSsrIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKSB7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkvLyBBIHNwZWNpYWwsIGZhc3QsIGNhc2UgZm9yIHRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgZWFjaAoJCX0gZWxzZSB7CgkJCWlmICggaXNPYmogKSB7CgkJCQlmb3IgKCBuYW1lIGluIG9iamVjdCApIHsKCQkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9iamVjdFsgbmFtZSBdLCBuYW1lLCBvYmplY3RbIG5hbWUgXSApID09PSBmYWxzZSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZm9yICggOyBpIDwgbGVuZ3RoOyApIHsKCQkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9iamVjdFsgaSBdLCBpLCBvYmplY3RbIGkrKyBdICkgPT09IGZhbHNlICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBvYmplY3Q7Cgl9LAoKCS8vIFVzZSBuYXRpdmUgU3RyaW5nLnRyaW0gZnVuY3Rpb24gd2hlcmV2ZXIgcG9zc2libGUKCXRyaW06IHRyaW0gPwoJCWZ1bmN0aW9uKCB0ZXh0ICkgewoJCQlyZXR1cm4gdGV4dCA9PSBudWxsID8KCQkJCSIiIDoKCQkJCXRyaW0uY2FsbCggdGV4dCApOwoJCX0gOgoKCQkvLyBPdGhlcndpc2UgdXNlIG91ciBvd24gdHJpbW1pbmcgZnVuY3Rpb25hbGl0eQoJCWZ1bmN0aW9uKCB0ZXh0ICkgewoJCQlyZXR1cm4gdGV4dCA9PSBudWxsID8KCQkJCSIiIDoKCQkJCXRleHQudG9TdHJpbmcoKS5yZXBsYWNlKCB0cmltTGVmdCwgIiIgKS5yZXBsYWNlKCB0cmltUmlnaHQsICIiICk7CgkJfSwKCgkvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgltYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnJheSwgcmVzdWx0cyApIHsKCQl2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTsKCgkJaWYgKCBhcnJheSAhPSBudWxsICkgewoJCQkvLyBUaGUgd2luZG93LCBzdHJpbmdzIChhbmQgZnVuY3Rpb25zKSBhbHNvIGhhdmUgJ2xlbmd0aCcKCQkJLy8gVGhlIGV4dHJhIHR5cGVvZiBmdW5jdGlvbiBjaGVjayBpcyB0byBwcmV2ZW50IGNyYXNoZXMKCQkJLy8gaW4gU2FmYXJpIDIgKFNlZTogIzMwMzkpCgkJCS8vIFR3ZWFrZWQgbG9naWMgc2xpZ2h0bHkgdG8gaGFuZGxlIEJsYWNrYmVycnkgNC43IFJlZ0V4cCBpc3N1ZXMgIzY5MzAKCQkJdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggYXJyYXkgKTsKCgkJCWlmICggYXJyYXkubGVuZ3RoID09IG51bGwgfHwgdHlwZSA9PT0gInN0cmluZyIgfHwgdHlwZSA9PT0gImZ1bmN0aW9uIiB8fCB0eXBlID09PSAicmVnZXhwIiB8fCBqUXVlcnkuaXNXaW5kb3coIGFycmF5ICkgKSB7CgkJCQlwdXNoLmNhbGwoIHJldCwgYXJyYXkgKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeS5tZXJnZSggcmV0LCBhcnJheSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCglpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyYXkgKSB7CgkJaWYgKCAhYXJyYXkgKSB7CgkJCXJldHVybiAtMTsKCQl9CgoJCWlmICggaW5kZXhPZiApIHsKCQkJcmV0dXJuIGluZGV4T2YuY2FsbCggYXJyYXksIGVsZW0gKTsKCQl9CgoJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCWlmICggYXJyYXlbIGkgXSA9PT0gZWxlbSApIHsKCQkJCXJldHVybiBpOwoJCQl9CgkJfQoKCQlyZXR1cm4gLTE7Cgl9LAoKCW1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHsKCQl2YXIgaSA9IGZpcnN0Lmxlbmd0aCwKCQkJaiA9IDA7CgoJCWlmICggdHlwZW9mIHNlY29uZC5sZW5ndGggPT09ICJudW1iZXIiICkgewoJCQlmb3IgKCB2YXIgbCA9IHNlY29uZC5sZW5ndGg7IGogPCBsOyBqKysgKSB7CgkJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsKCQkJfQoKCQl9IGVsc2UgewoJCQl3aGlsZSAoIHNlY29uZFtqXSAhPT0gdW5kZWZpbmVkICkgewoJCQkJZmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqKysgXTsKCQkJfQoJCX0KCgkJZmlyc3QubGVuZ3RoID0gaTsKCgkJcmV0dXJuIGZpcnN0OwoJfSwKCglncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnYgKSB7CgkJdmFyIHJldCA9IFtdLCByZXRWYWw7CgkJaW52ID0gISFpbnY7CgoJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXMKCQkvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvbgoJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCXJldFZhbCA9ICEhY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTsKCQkJaWYgKCBpbnYgIT09IHJldFZhbCApIHsKCQkJCXJldC5wdXNoKCBlbGVtc1sgaSBdICk7CgkJCX0KCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCS8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQoJbWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7CgkJdmFyIHZhbHVlLCBrZXksIHJldCA9IFtdLAoJCQlpID0gMCwKCQkJbGVuZ3RoID0gZWxlbXMubGVuZ3RoLAoJCQkvLyBqcXVlcnkgb2JqZWN0cyBhcmUgdHJlYXRlZCBhcyBhcnJheXMKCQkJaXNBcnJheSA9IGVsZW1zIGluc3RhbmNlb2YgalF1ZXJ5IHx8IGxlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBsZW5ndGggPT09ICJudW1iZXIiICYmICggKCBsZW5ndGggPiAwICYmIGVsZW1zWyAwIF0gJiYgZWxlbXNbIGxlbmd0aCAtMSBdICkgfHwgbGVuZ3RoID09PSAwIHx8IGpRdWVyeS5pc0FycmF5KCBlbGVtcyApICkgOwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIKCQlpZiAoIGlzQXJyYXkgKSB7CgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCgkJLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCwKCQl9IGVsc2UgewoJCQlmb3IgKCBrZXkgaW4gZWxlbXMgKSB7CgkJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sga2V5IF0sIGtleSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXMKCQlyZXR1cm4gcmV0LmNvbmNhdC5hcHBseSggW10sIHJldCApOwoJfSwKCgkvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHMKCWd1aWQ6IDEsCgoJLy8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55CgkvLyBhcmd1bWVudHMuCglwcm94eTogZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgewoJCWlmICggdHlwZW9mIGNvbnRleHQgPT09ICJzdHJpbmciICkgewoJCQl2YXIgdG1wID0gZm5bIGNvbnRleHQgXTsKCQkJY29udGV4dCA9IGZuOwoJCQlmbiA9IHRtcDsKCQl9CgoJCS8vIFF1aWNrIGNoZWNrIHRvIGRldGVybWluZSBpZiB0YXJnZXQgaXMgY2FsbGFibGUsIGluIHRoZSBzcGVjCgkJLy8gdGhpcyB0aHJvd3MgYSBUeXBlRXJyb3IsIGJ1dCB3ZSB3aWxsIGp1c3QgcmV0dXJuIHVuZGVmaW5lZC4KCQlpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHsKCQkJcmV0dXJuIHVuZGVmaW5lZDsKCQl9CgoJCS8vIFNpbXVsYXRlZCBiaW5kCgkJdmFyIGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKSwKCQkJcHJveHkgPSBmdW5jdGlvbigpIHsKCQkJCXJldHVybiBmbi5hcHBseSggY29udGV4dCwgYXJncy5jb25jYXQoIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApICkgKTsKCQkJfTsKCgkJLy8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkCgkJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IHByb3h5Lmd1aWQgfHwgalF1ZXJ5Lmd1aWQrKzsKCgkJcmV0dXJuIHByb3h5OwoJfSwKCgkvLyBNdXRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIHRvIGEgY29sbGVjdGlvbgoJLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uCglhY2Nlc3M6IGZ1bmN0aW9uKCBlbGVtcywga2V5LCB2YWx1ZSwgZXhlYywgZm4sIHBhc3MgKSB7CgkJdmFyIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKCgkJLy8gU2V0dGluZyBtYW55IGF0dHJpYnV0ZXMKCQlpZiAoIHR5cGVvZiBrZXkgPT09ICJvYmplY3QiICkgewoJCQlmb3IgKCB2YXIgayBpbiBrZXkgKSB7CgkJCQlqUXVlcnkuYWNjZXNzKCBlbGVtcywgaywga2V5W2tdLCBleGVjLCBmbiwgdmFsdWUgKTsKCQkJfQoJCQlyZXR1cm4gZWxlbXM7CgkJfQoKCQkvLyBTZXR0aW5nIG9uZSBhdHRyaWJ1dGUKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCS8vIE9wdGlvbmFsbHksIGZ1bmN0aW9uIHZhbHVlcyBnZXQgZXhlY3V0ZWQgaWYgZXhlYyBpcyB0cnVlCgkJCWV4ZWMgPSAhcGFzcyAmJiBleGVjICYmIGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKTsKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQkJZm4oIGVsZW1zW2ldLCBrZXksIGV4ZWMgPyB2YWx1ZS5jYWxsKCBlbGVtc1tpXSwgaSwgZm4oIGVsZW1zW2ldLCBrZXkgKSApIDogdmFsdWUsIHBhc3MgKTsKCQkJfQoKCQkJcmV0dXJuIGVsZW1zOwoJCX0KCgkJLy8gR2V0dGluZyBhbiBhdHRyaWJ1dGUKCQlyZXR1cm4gbGVuZ3RoID8gZm4oIGVsZW1zWzBdLCBrZXkgKSA6IHVuZGVmaW5lZDsKCX0sCgoJbm93OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKCX0sCgoJLy8gVXNlIG9mIGpRdWVyeS5icm93c2VyIGlzIGZyb3duZWQgdXBvbi4KCS8vIE1vcmUgZGV0YWlsczogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VdGlsaXRpZXMvalF1ZXJ5LmJyb3dzZXIKCXVhTWF0Y2g6IGZ1bmN0aW9uKCB1YSApIHsKCQl1YSA9IHVhLnRvTG93ZXJDYXNlKCk7CgoJCXZhciBtYXRjaCA9IHJ3ZWJraXQuZXhlYyggdWEgKSB8fAoJCQlyb3BlcmEuZXhlYyggdWEgKSB8fAoJCQlybXNpZS5leGVjKCB1YSApIHx8CgkJCXVhLmluZGV4T2YoImNvbXBhdGlibGUiKSA8IDAgJiYgcm1vemlsbGEuZXhlYyggdWEgKSB8fAoJCQlbXTsKCgkJcmV0dXJuIHsgYnJvd3NlcjogbWF0Y2hbMV0gfHwgIiIsIHZlcnNpb246IG1hdGNoWzJdIHx8ICIwIiB9OwoJfSwKCglzdWI6IGZ1bmN0aW9uKCkgewoJCWZ1bmN0aW9uIGpRdWVyeVN1Yiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CgkJCXJldHVybiBuZXcgalF1ZXJ5U3ViLmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7CgkJfQoJCWpRdWVyeS5leHRlbmQoIHRydWUsIGpRdWVyeVN1YiwgdGhpcyApOwoJCWpRdWVyeVN1Yi5zdXBlcmNsYXNzID0gdGhpczsKCQlqUXVlcnlTdWIuZm4gPSBqUXVlcnlTdWIucHJvdG90eXBlID0gdGhpcygpOwoJCWpRdWVyeVN1Yi5mbi5jb25zdHJ1Y3RvciA9IGpRdWVyeVN1YjsKCQlqUXVlcnlTdWIuc3ViID0gdGhpcy5zdWI7CgkJalF1ZXJ5U3ViLmZuLmluaXQgPSBmdW5jdGlvbiBpbml0KCBzZWxlY3RvciwgY29udGV4dCApIHsKCQkJaWYgKCBjb250ZXh0ICYmIGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgJiYgIShjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5U3ViKSApIHsKCQkJCWNvbnRleHQgPSBqUXVlcnlTdWIoIGNvbnRleHQgKTsKCQkJfQoKCQkJcmV0dXJuIGpRdWVyeS5mbi5pbml0LmNhbGwoIHRoaXMsIHNlbGVjdG9yLCBjb250ZXh0LCByb290alF1ZXJ5U3ViICk7CgkJfTsKCQlqUXVlcnlTdWIuZm4uaW5pdC5wcm90b3R5cGUgPSBqUXVlcnlTdWIuZm47CgkJdmFyIHJvb3RqUXVlcnlTdWIgPSBqUXVlcnlTdWIoZG9jdW1lbnQpOwoJCXJldHVybiBqUXVlcnlTdWI7Cgl9LAoKCWJyb3dzZXI6IHt9Cn0pOwoKLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCmpRdWVyeS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLCBmdW5jdGlvbihpLCBuYW1lKSB7CgljbGFzczJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOwp9KTsKCmJyb3dzZXJNYXRjaCA9IGpRdWVyeS51YU1hdGNoKCB1c2VyQWdlbnQgKTsKaWYgKCBicm93c2VyTWF0Y2guYnJvd3NlciApIHsKCWpRdWVyeS5icm93c2VyWyBicm93c2VyTWF0Y2guYnJvd3NlciBdID0gdHJ1ZTsKCWpRdWVyeS5icm93c2VyLnZlcnNpb24gPSBicm93c2VyTWF0Y2gudmVyc2lvbjsKfQoKLy8gRGVwcmVjYXRlZCwgdXNlIGpRdWVyeS5icm93c2VyLndlYmtpdCBpbnN0ZWFkCmlmICggalF1ZXJ5LmJyb3dzZXIud2Via2l0ICkgewoJalF1ZXJ5LmJyb3dzZXIuc2FmYXJpID0gdHJ1ZTsKfQoKLy8gSUUgZG9lc24ndCBtYXRjaCBub24tYnJlYWtpbmcgc3BhY2VzIHdpdGggXHMKaWYgKCBybm90d2hpdGUudGVzdCggIlx4QTAiICkgKSB7Cgl0cmltTGVmdCA9IC9eW1xzXHhBMF0rLzsKCXRyaW1SaWdodCA9IC9bXHNceEEwXSskLzsKfQoKLy8gQWxsIGpRdWVyeSBvYmplY3RzIHNob3VsZCBwb2ludCBiYWNrIHRvIHRoZXNlCnJvb3RqUXVlcnkgPSBqUXVlcnkoZG9jdW1lbnQpOwoKLy8gQ2xlYW51cCBmdW5jdGlvbnMgZm9yIHRoZSBkb2N1bWVudCByZWFkeSBtZXRob2QKaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgewoJRE9NQ29udGVudExvYWRlZCA9IGZ1bmN0aW9uKCkgewoJCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgRE9NQ29udGVudExvYWRlZCwgZmFsc2UgKTsKCQlqUXVlcnkucmVhZHkoKTsKCX07Cgp9IGVsc2UgaWYgKCBkb2N1bWVudC5hdHRhY2hFdmVudCApIHsKCURPTUNvbnRlbnRMb2FkZWQgPSBmdW5jdGlvbigpIHsKCQkvLyBNYWtlIHN1cmUgYm9keSBleGlzdHMsIGF0IGxlYXN0LCBpbiBjYXNlIElFIGdldHMgYSBsaXR0bGUgb3ZlcnplYWxvdXMgKHRpY2tldCAjNTQ0MykuCgkJaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgewoJCQlkb2N1bWVudC5kZXRhY2hFdmVudCggIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIERPTUNvbnRlbnRMb2FkZWQgKTsKCQkJalF1ZXJ5LnJlYWR5KCk7CgkJfQoJfTsKfQoKLy8gVGhlIERPTSByZWFkeSBjaGVjayBmb3IgSW50ZXJuZXQgRXhwbG9yZXIKZnVuY3Rpb24gZG9TY3JvbGxDaGVjaygpIHsKCWlmICggalF1ZXJ5LmlzUmVhZHkgKSB7CgkJcmV0dXJuOwoJfQoKCXRyeSB7CgkJLy8gSWYgSUUgaXMgdXNlZCwgdXNlIHRoZSB0cmljayBieSBEaWVnbyBQZXJpbmkKCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLwoJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpOwoJfSBjYXRjaChlKSB7CgkJc2V0VGltZW91dCggZG9TY3JvbGxDaGVjaywgMSApOwoJCXJldHVybjsKCX0KCgkvLyBhbmQgZXhlY3V0ZSBhbnkgd2FpdGluZyBmdW5jdGlvbnMKCWpRdWVyeS5yZWFkeSgpOwp9CgpyZXR1cm4galF1ZXJ5OwoKfSkoKTsKCgp2YXIgLy8gUHJvbWlzZSBtZXRob2RzCglwcm9taXNlTWV0aG9kcyA9ICJkb25lIGZhaWwgaXNSZXNvbHZlZCBpc1JlamVjdGVkIHByb21pc2UgdGhlbiBhbHdheXMgcGlwZSIuc3BsaXQoICIgIiApLAoJLy8gU3RhdGljIHJlZmVyZW5jZSB0byBzbGljZQoJc2xpY2VEZWZlcnJlZCA9IFtdLnNsaWNlOwoKalF1ZXJ5LmV4dGVuZCh7CgkvLyBDcmVhdGUgYSBzaW1wbGUgZGVmZXJyZWQgKG9uZSBjYWxsYmFja3MgbGlzdCkKCV9EZWZlcnJlZDogZnVuY3Rpb24oKSB7CgkJdmFyIC8vIGNhbGxiYWNrcyBsaXN0CgkJCWNhbGxiYWNrcyA9IFtdLAoJCQkvLyBzdG9yZWQgWyBjb250ZXh0ICwgYXJncyBdCgkJCWZpcmVkLAoJCQkvLyB0byBhdm9pZCBmaXJpbmcgd2hlbiBhbHJlYWR5IGRvaW5nIHNvCgkJCWZpcmluZywKCQkJLy8gZmxhZyB0byBrbm93IGlmIHRoZSBkZWZlcnJlZCBoYXMgYmVlbiBjYW5jZWxsZWQKCQkJY2FuY2VsbGVkLAoJCQkvLyB0aGUgZGVmZXJyZWQgaXRzZWxmCgkJCWRlZmVycmVkICA9IHsKCgkJCQkvLyBkb25lKCBmMSwgZjIsIC4uLikKCQkJCWRvbmU6IGZ1bmN0aW9uKCkgewoJCQkJCWlmICggIWNhbmNlbGxlZCApIHsKCQkJCQkJdmFyIGFyZ3MgPSBhcmd1bWVudHMsCgkJCQkJCQlpLAoJCQkJCQkJbGVuZ3RoLAoJCQkJCQkJZWxlbSwKCQkJCQkJCXR5cGUsCgkJCQkJCQlfZmlyZWQ7CgkJCQkJCWlmICggZmlyZWQgKSB7CgkJCQkJCQlfZmlyZWQgPSBmaXJlZDsKCQkJCQkJCWZpcmVkID0gMDsKCQkJCQkJfQoJCQkJCQlmb3IgKCBpID0gMCwgbGVuZ3RoID0gYXJncy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJCQkJCWVsZW0gPSBhcmdzWyBpIF07CgkJCQkJCQl0eXBlID0galF1ZXJ5LnR5cGUoIGVsZW0gKTsKCQkJCQkJCWlmICggdHlwZSA9PT0gImFycmF5IiApIHsKCQkJCQkJCQlkZWZlcnJlZC5kb25lLmFwcGx5KCBkZWZlcnJlZCwgZWxlbSApOwoJCQkJCQkJfSBlbHNlIGlmICggdHlwZSA9PT0gImZ1bmN0aW9uIiApIHsKCQkJCQkJCQljYWxsYmFja3MucHVzaCggZWxlbSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWlmICggX2ZpcmVkICkgewoJCQkJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIF9maXJlZFsgMCBdLCBfZmlyZWRbIDEgXSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCgkJCQkvLyByZXNvbHZlIHdpdGggZ2l2ZW4gY29udGV4dCBhbmQgYXJncwoJCQkJcmVzb2x2ZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkgewoJCQkJCWlmICggIWNhbmNlbGxlZCAmJiAhZmlyZWQgJiYgIWZpcmluZyApIHsKCQkJCQkJLy8gbWFrZSBzdXJlIGFyZ3MgYXJlIGF2YWlsYWJsZSAoIzg0MjEpCgkJCQkJCWFyZ3MgPSBhcmdzIHx8IFtdOwoJCQkJCQlmaXJpbmcgPSAxOwoJCQkJCQl0cnkgewoJCQkJCQkJd2hpbGUoIGNhbGxiYWNrc1sgMCBdICkgewoJCQkJCQkJCWNhbGxiYWNrcy5zaGlmdCgpLmFwcGx5KCBjb250ZXh0LCBhcmdzICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZmluYWxseSB7CgkJCQkJCQlmaXJlZCA9IFsgY29udGV4dCwgYXJncyBdOwoJCQkJCQkJZmlyaW5nID0gMDsKCQkJCQkJfQoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0sCgoJCQkJLy8gcmVzb2x2ZSB3aXRoIHRoaXMgYXMgY29udGV4dCBhbmQgZ2l2ZW4gYXJndW1lbnRzCgkJCQlyZXNvbHZlOiBmdW5jdGlvbigpIHsKCQkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggdGhpcywgYXJndW1lbnRzICk7CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIEhhcyB0aGlzIGRlZmVycmVkIGJlZW4gcmVzb2x2ZWQ/CgkJCQlpc1Jlc29sdmVkOiBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gISEoIGZpcmluZyB8fCBmaXJlZCApOwoJCQkJfSwKCgkJCQkvLyBDYW5jZWwKCQkJCWNhbmNlbDogZnVuY3Rpb24oKSB7CgkJCQkJY2FuY2VsbGVkID0gMTsKCQkJCQljYWxsYmFja3MgPSBbXTsKCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCQkJfTsKCgkJcmV0dXJuIGRlZmVycmVkOwoJfSwKCgkvLyBGdWxsIGZsZWRnZWQgZGVmZXJyZWQgKHR3byBjYWxsYmFja3MgbGlzdCkKCURlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKCQl2YXIgZGVmZXJyZWQgPSBqUXVlcnkuX0RlZmVycmVkKCksCgkJCWZhaWxEZWZlcnJlZCA9IGpRdWVyeS5fRGVmZXJyZWQoKSwKCQkJcHJvbWlzZTsKCQkvLyBBZGQgZXJyb3JEZWZlcnJlZCBtZXRob2RzLCB0aGVuIGFuZCBwcm9taXNlCgkJalF1ZXJ5LmV4dGVuZCggZGVmZXJyZWQsIHsKCQkJdGhlbjogZnVuY3Rpb24oIGRvbmVDYWxsYmFja3MsIGZhaWxDYWxsYmFja3MgKSB7CgkJCQlkZWZlcnJlZC5kb25lKCBkb25lQ2FsbGJhY2tzICkuZmFpbCggZmFpbENhbGxiYWNrcyApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCWFsd2F5czogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gZGVmZXJyZWQuZG9uZS5hcHBseSggZGVmZXJyZWQsIGFyZ3VtZW50cyApLmZhaWwuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQl9LAoJCQlmYWlsOiBmYWlsRGVmZXJyZWQuZG9uZSwKCQkJcmVqZWN0V2l0aDogZmFpbERlZmVycmVkLnJlc29sdmVXaXRoLAoJCQlyZWplY3Q6IGZhaWxEZWZlcnJlZC5yZXNvbHZlLAoJCQlpc1JlamVjdGVkOiBmYWlsRGVmZXJyZWQuaXNSZXNvbHZlZCwKCQkJcGlwZTogZnVuY3Rpb24oIGZuRG9uZSwgZm5GYWlsICkgewoJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZChmdW5jdGlvbiggbmV3RGVmZXIgKSB7CgkJCQkJalF1ZXJ5LmVhY2goIHsKCQkJCQkJZG9uZTogWyBmbkRvbmUsICJyZXNvbHZlIiBdLAoJCQkJCQlmYWlsOiBbIGZuRmFpbCwgInJlamVjdCIgXQoJCQkJCX0sIGZ1bmN0aW9uKCBoYW5kbGVyLCBkYXRhICkgewoJCQkJCQl2YXIgZm4gPSBkYXRhWyAwIF0sCgkJCQkJCQlhY3Rpb24gPSBkYXRhWyAxIF0sCgkJCQkJCQlyZXR1cm5lZDsKCQkJCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHsKCQkJCQkJCWRlZmVycmVkWyBoYW5kbGVyIF0oZnVuY3Rpb24oKSB7CgkJCQkJCQkJcmV0dXJuZWQgPSBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQkJCQkJaWYgKCByZXR1cm5lZCAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgewoJCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkudGhlbiggbmV3RGVmZXIucmVzb2x2ZSwgbmV3RGVmZXIucmVqZWN0ICk7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJbmV3RGVmZXJbIGFjdGlvbiArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IG5ld0RlZmVyIDogdGhpcywgWyByZXR1cm5lZCBdICk7CgkJCQkJCQkJfQoJCQkJCQkJfSk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlkZWZlcnJlZFsgaGFuZGxlciBdKCBuZXdEZWZlclsgYWN0aW9uIF0gKTsKCQkJCQkJfQoJCQkJCX0pOwoJCQkJfSkucHJvbWlzZSgpOwoJCQl9LAoJCQkvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCgkJCS8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3QKCQkJcHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHsKCQkJCWlmICggb2JqID09IG51bGwgKSB7CgkJCQkJaWYgKCBwcm9taXNlICkgewoJCQkJCQlyZXR1cm4gcHJvbWlzZTsKCQkJCQl9CgkJCQkJcHJvbWlzZSA9IG9iaiA9IHt9OwoJCQkJfQoJCQkJdmFyIGkgPSBwcm9taXNlTWV0aG9kcy5sZW5ndGg7CgkJCQl3aGlsZSggaS0tICkgewoJCQkJCW9ialsgcHJvbWlzZU1ldGhvZHNbaV0gXSA9IGRlZmVycmVkWyBwcm9taXNlTWV0aG9kc1tpXSBdOwoJCQkJfQoJCQkJcmV0dXJuIG9iajsKCQkJfQoJCX0pOwoJCS8vIE1ha2Ugc3VyZSBvbmx5IG9uZSBjYWxsYmFjayBsaXN0IHdpbGwgYmUgdXNlZAoJCWRlZmVycmVkLmRvbmUoIGZhaWxEZWZlcnJlZC5jYW5jZWwgKS5mYWlsKCBkZWZlcnJlZC5jYW5jZWwgKTsKCQkvLyBVbmV4cG9zZSBjYW5jZWwKCQlkZWxldGUgZGVmZXJyZWQuY2FuY2VsOwoJCS8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnkKCQlpZiAoIGZ1bmMgKSB7CgkJCWZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7CgkJfQoJCXJldHVybiBkZWZlcnJlZDsKCX0sCgoJLy8gRGVmZXJyZWQgaGVscGVyCgl3aGVuOiBmdW5jdGlvbiggZmlyc3RQYXJhbSApIHsKCQl2YXIgYXJncyA9IGFyZ3VtZW50cywKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGFyZ3MubGVuZ3RoLAoJCQljb3VudCA9IGxlbmd0aCwKCQkJZGVmZXJyZWQgPSBsZW5ndGggPD0gMSAmJiBmaXJzdFBhcmFtICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBmaXJzdFBhcmFtLnByb21pc2UgKSA/CgkJCQlmaXJzdFBhcmFtIDoKCQkJCWpRdWVyeS5EZWZlcnJlZCgpOwoJCWZ1bmN0aW9uIHJlc29sdmVGdW5jKCBpICkgewoJCQlyZXR1cm4gZnVuY3Rpb24oIHZhbHVlICkgewoJCQkJYXJnc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZURlZmVycmVkLmNhbGwoIGFyZ3VtZW50cywgMCApIDogdmFsdWU7CgkJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCQkvLyBTdHJhbmdlIGJ1ZyBpbiBGRjQ6CgkJCQkJLy8gVmFsdWVzIGNoYW5nZWQgb250byB0aGUgYXJndW1lbnRzIG9iamVjdCBzb21ldGltZXMgZW5kIHVwIGFzIHVuZGVmaW5lZCB2YWx1ZXMKCQkJCQkvLyBvdXRzaWRlIHRoZSAkLndoZW4gbWV0aG9kLiBDbG9uaW5nIHRoZSBvYmplY3QgaW50byBhIGZyZXNoIGFycmF5IHNvbHZlcyB0aGUgaXNzdWUKCQkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggZGVmZXJyZWQsIHNsaWNlRGVmZXJyZWQuY2FsbCggYXJncywgMCApICk7CgkJCQl9CgkJCX07CgkJfQoJCWlmICggbGVuZ3RoID4gMSApIHsKCQkJZm9yKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJCWlmICggYXJnc1sgaSBdICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBhcmdzWyBpIF0ucHJvbWlzZSApICkgewoJCQkJCWFyZ3NbIGkgXS5wcm9taXNlKCkudGhlbiggcmVzb2x2ZUZ1bmMoaSksIGRlZmVycmVkLnJlamVjdCApOwoJCQkJfSBlbHNlIHsKCQkJCQktLWNvdW50OwoJCQkJfQoJCQl9CgkJCWlmICggIWNvdW50ICkgewoJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGRlZmVycmVkLCBhcmdzICk7CgkJCX0KCQl9IGVsc2UgaWYgKCBkZWZlcnJlZCAhPT0gZmlyc3RQYXJhbSApIHsKCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGRlZmVycmVkLCBsZW5ndGggPyBbIGZpcnN0UGFyYW0gXSA6IFtdICk7CgkJfQoJCXJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7Cgl9Cn0pOwoKCgpqUXVlcnkuc3VwcG9ydCA9IChmdW5jdGlvbigpIHsKCgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSwKCQlkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCgkJYWxsLAoJCWEsCgkJc2VsZWN0LAoJCW9wdCwKCQlpbnB1dCwKCQltYXJnaW5EaXYsCgkJc3VwcG9ydCwKCQlmcmFnbWVudCwKCQlib2R5LAoJCXRlc3RFbGVtZW50UGFyZW50LAoJCXRlc3RFbGVtZW50LAoJCXRlc3RFbGVtZW50U3R5bGUsCgkJdGRzLAoJCWV2ZW50cywKCQlldmVudE5hbWUsCgkJaSwKCQlpc1N1cHBvcnRlZDsKCgkvLyBQcmVsaW1pbmFyeSB0ZXN0cwoJZGl2LnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwgInQiKTsKCWRpdi5pbm5lckhUTUwgPSAiICAgPGxpbms+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnIHN0eWxlPSd0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPWNoZWNrYm94PiI7CgoKCWFsbCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICk7CglhID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCAiYSIgKVsgMCBdOwoKCS8vIENhbid0IGdldCBiYXNpYyB0ZXN0IHN1cHBvcnQKCWlmICggIWFsbCB8fCAhYWxsLmxlbmd0aCB8fCAhYSApIHsKCQlyZXR1cm4ge307Cgl9CgoJLy8gRmlyc3QgYmF0Y2ggb2Ygc3VwcG9ydHMgdGVzdHMKCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICk7CglvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpICk7CglpbnB1dCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggImlucHV0IiApWyAwIF07CgoJc3VwcG9ydCA9IHsKCQkvLyBJRSBzdHJpcHMgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gLmlubmVySFRNTCBpcyB1c2VkCgkJbGVhZGluZ1doaXRlc3BhY2U6ICggZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDMgKSwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGJvZHkgZWxlbWVudHMgYXJlbid0IGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQKCQkvLyBJRSB3aWxsIGluc2VydCB0aGVtIGludG8gZW1wdHkgdGFibGVzCgkJdGJvZHk6ICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJ0Ym9keSIgKS5sZW5ndGgsCgoJCS8vIE1ha2Ugc3VyZSB0aGF0IGxpbmsgZWxlbWVudHMgZ2V0IHNlcmlhbGl6ZWQgY29ycmVjdGx5IGJ5IGlubmVySFRNTAoJCS8vIFRoaXMgcmVxdWlyZXMgYSB3cmFwcGVyIGVsZW1lbnQgaW4gSUUKCQlodG1sU2VyaWFsaXplOiAhIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggImxpbmsiICkubGVuZ3RoLAoKCQkvLyBHZXQgdGhlIHN0eWxlIGluZm9ybWF0aW9uIGZyb20gZ2V0QXR0cmlidXRlCgkJLy8gKElFIHVzZXMgLmNzc1RleHQgaW5zdGVhZCkKCQlzdHlsZTogL3RvcC8udGVzdCggYS5nZXRBdHRyaWJ1dGUoInN0eWxlIikgKSwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgVVJMcyBhcmVuJ3QgbWFuaXB1bGF0ZWQKCQkvLyAoSUUgbm9ybWFsaXplcyBpdCBieSBkZWZhdWx0KQoJCWhyZWZOb3JtYWxpemVkOiAoIGEuZ2V0QXR0cmlidXRlKCAiaHJlZiIgKSA9PT0gIi9hIiApLAoKCQkvLyBNYWtlIHN1cmUgdGhhdCBlbGVtZW50IG9wYWNpdHkgZXhpc3RzCgkJLy8gKElFIHVzZXMgZmlsdGVyIGluc3RlYWQpCgkJLy8gVXNlIGEgcmVnZXggdG8gd29yayBhcm91bmQgYSBXZWJLaXQgaXNzdWUuIFNlZSAjNTE0NQoJCW9wYWNpdHk6IC9eMC41NSQvLnRlc3QoIGEuc3R5bGUub3BhY2l0eSApLAoKCQkvLyBWZXJpZnkgc3R5bGUgZmxvYXQgZXhpc3RlbmNlCgkJLy8gKElFIHVzZXMgc3R5bGVGbG9hdCBpbnN0ZWFkIG9mIGNzc0Zsb2F0KQoJCWNzc0Zsb2F0OiAhIWEuc3R5bGUuY3NzRmxvYXQsCgoJCS8vIE1ha2Ugc3VyZSB0aGF0IGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCBmb3IgYSBjaGVja2JveAoJCS8vIHRoYXQgaXQgZGVmYXVsdHMgdG8gIm9uIi4KCQkvLyAoV2ViS2l0IGRlZmF1bHRzIHRvICIiIGluc3RlYWQpCgkJY2hlY2tPbjogKCBpbnB1dC52YWx1ZSA9PT0gIm9uIiApLAoKCQkvLyBNYWtlIHN1cmUgdGhhdCBhIHNlbGVjdGVkLWJ5LWRlZmF1bHQgb3B0aW9uIGhhcyBhIHdvcmtpbmcgc2VsZWN0ZWQgcHJvcGVydHkuCgkJLy8gKFdlYktpdCBkZWZhdWx0cyB0byBmYWxzZSBpbnN0ZWFkIG9mIHRydWUsIElFIHRvbywgaWYgaXQncyBpbiBhbiBvcHRncm91cCkKCQlvcHRTZWxlY3RlZDogb3B0LnNlbGVjdGVkLAoKCQkvLyBUZXN0IHNldEF0dHJpYnV0ZSBvbiBjYW1lbENhc2UgY2xhc3MuIElmIGl0IHdvcmtzLCB3ZSBuZWVkIGF0dHJGaXhlcyB3aGVuIGRvaW5nIGdldC9zZXRBdHRyaWJ1dGUgKGllNi83KQoJCWdldFNldEF0dHJpYnV0ZTogZGl2LmNsYXNzTmFtZSAhPT0gInQiLAoKCQkvLyBXaWxsIGJlIGRlZmluZWQgbGF0ZXIKCQlzdWJtaXRCdWJibGVzOiB0cnVlLAoJCWNoYW5nZUJ1YmJsZXM6IHRydWUsCgkJZm9jdXNpbkJ1YmJsZXM6IGZhbHNlLAoJCWRlbGV0ZUV4cGFuZG86IHRydWUsCgkJbm9DbG9uZUV2ZW50OiB0cnVlLAoJCWlubGluZUJsb2NrTmVlZHNMYXlvdXQ6IGZhbHNlLAoJCXNocmlua1dyYXBCbG9ja3M6IGZhbHNlLAoJCXJlbGlhYmxlTWFyZ2luUmlnaHQ6IHRydWUKCX07CgoJLy8gTWFrZSBzdXJlIGNoZWNrZWQgc3RhdHVzIGlzIHByb3Blcmx5IGNsb25lZAoJaW5wdXQuY2hlY2tlZCA9IHRydWU7CglzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gaW5wdXQuY2xvbmVOb2RlKCB0cnVlICkuY2hlY2tlZDsKCgkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgb3B0aW9ucyBpbnNpZGUgZGlzYWJsZWQgc2VsZWN0cyBhcmVuJ3QgbWFya2VkIGFzIGRpc2FibGVkCgkvLyAoV2ViS2l0IG1hcmtzIHRoZW0gYXMgZGlzYWJsZWQpCglzZWxlY3QuZGlzYWJsZWQgPSB0cnVlOwoJc3VwcG9ydC5vcHREaXNhYmxlZCA9ICFvcHQuZGlzYWJsZWQ7CgoJLy8gVGVzdCB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0byBkZWxldGUgYW4gZXhwYW5kbyBmcm9tIGFuIGVsZW1lbnQKCS8vIEZhaWxzIGluIEludGVybmV0IEV4cGxvcmVyCgl0cnkgewoJCWRlbGV0ZSBkaXYudGVzdDsKCX0gY2F0Y2goIGUgKSB7CgkJc3VwcG9ydC5kZWxldGVFeHBhbmRvID0gZmFsc2U7Cgl9CgoJaWYgKCAhZGl2LmFkZEV2ZW50TGlzdGVuZXIgJiYgZGl2LmF0dGFjaEV2ZW50ICYmIGRpdi5maXJlRXZlbnQgKSB7CgkJZGl2LmF0dGFjaEV2ZW50KCAib25jbGljayIsIGZ1bmN0aW9uKCkgewoJCQkvLyBDbG9uaW5nIGEgbm9kZSBzaG91bGRuJ3QgY29weSBvdmVyIGFueQoJCQkvLyBib3VuZCBldmVudCBoYW5kbGVycyAoSUUgZG9lcyB0aGlzKQoJCQlzdXBwb3J0Lm5vQ2xvbmVFdmVudCA9IGZhbHNlOwoJCX0pOwoJCWRpdi5jbG9uZU5vZGUoIHRydWUgKS5maXJlRXZlbnQoICJvbmNsaWNrIiApOwoJfQoKCS8vIENoZWNrIGlmIGEgcmFkaW8gbWFpbnRhaW5zIGl0J3MgdmFsdWUKCS8vIGFmdGVyIGJlaW5nIGFwcGVuZGVkIHRvIHRoZSBET00KCWlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKCWlucHV0LnZhbHVlID0gInQiOwoJaW5wdXQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgInJhZGlvIik7CglzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gInQiOwoKCWlucHV0LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsICJjaGVja2VkIik7CglkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICk7CglmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKCWZyYWdtZW50LmFwcGVuZENoaWxkKCBkaXYuZmlyc3RDaGlsZCApOwoKCS8vIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50cwoJc3VwcG9ydC5jaGVja0Nsb25lID0gZnJhZ21lbnQuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7CgoJZGl2LmlubmVySFRNTCA9ICIiOwoKCS8vIEZpZ3VyZSBvdXQgaWYgdGhlIFczQyBib3ggbW9kZWwgd29ya3MgYXMgZXhwZWN0ZWQKCWRpdi5zdHlsZS53aWR0aCA9IGRpdi5zdHlsZS5wYWRkaW5nTGVmdCA9ICIxcHgiOwoKCWJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImJvZHkiIClbIDAgXTsKCS8vIFdlIHVzZSBvdXIgb3duLCBpbnZpc2libGUsIGJvZHkgdW5sZXNzIHRoZSBib2R5IGlzIGFscmVhZHkgcHJlc2VudAoJLy8gaW4gd2hpY2ggY2FzZSB3ZSB1c2UgYSBkaXYgKCM5MjM5KQoJdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBib2R5ID8gImRpdiIgOiAiYm9keSIgKTsKCXRlc3RFbGVtZW50U3R5bGUgPSB7CgkJdmlzaWJpbGl0eTogImhpZGRlbiIsCgkJd2lkdGg6IDAsCgkJaGVpZ2h0OiAwLAoJCWJvcmRlcjogMCwKCQltYXJnaW46IDAsCgkJYmFja2dyb3VuZDogIm5vbmUiCgl9OwoJaWYgKCBib2R5ICkgewoJCWpRdWVyeS5leHRlbmQoIHRlc3RFbGVtZW50U3R5bGUsIHsKCQkJcG9zaXRpb246ICJhYnNvbHV0ZSIsCgkJCWxlZnQ6ICItMTAwMHB4IiwKCQkJdG9wOiAiLTEwMDBweCIKCQl9KTsKCX0KCWZvciAoIGkgaW4gdGVzdEVsZW1lbnRTdHlsZSApIHsKCQl0ZXN0RWxlbWVudC5zdHlsZVsgaSBdID0gdGVzdEVsZW1lbnRTdHlsZVsgaSBdOwoJfQoJdGVzdEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGRpdiApOwoJdGVzdEVsZW1lbnRQYXJlbnQgPSBib2R5IHx8IGRvY3VtZW50RWxlbWVudDsKCXRlc3RFbGVtZW50UGFyZW50Lmluc2VydEJlZm9yZSggdGVzdEVsZW1lbnQsIHRlc3RFbGVtZW50UGFyZW50LmZpcnN0Q2hpbGQgKTsKCgkvLyBDaGVjayBpZiBhIGRpc2Nvbm5lY3RlZCBjaGVja2JveCB3aWxsIHJldGFpbiBpdHMgY2hlY2tlZAoJLy8gdmFsdWUgb2YgdHJ1ZSBhZnRlciBhcHBlbmRlZCB0byB0aGUgRE9NIChJRTYvNykKCXN1cHBvcnQuYXBwZW5kQ2hlY2tlZCA9IGlucHV0LmNoZWNrZWQ7CgoJc3VwcG9ydC5ib3hNb2RlbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMjsKCglpZiAoICJ6b29tIiBpbiBkaXYuc3R5bGUgKSB7CgkJLy8gQ2hlY2sgaWYgbmF0aXZlbHkgYmxvY2stbGV2ZWwgZWxlbWVudHMgYWN0IGxpa2UgaW5saW5lLWJsb2NrCgkJLy8gZWxlbWVudHMgd2hlbiBzZXR0aW5nIHRoZWlyIGRpc3BsYXkgdG8gJ2lubGluZScgYW5kIGdpdmluZwoJCS8vIHRoZW0gbGF5b3V0CgkJLy8gKElFIDwgOCBkb2VzIHRoaXMpCgkJZGl2LnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIjsKCQlkaXYuc3R5bGUuem9vbSA9IDE7CgkJc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0ID0gKCBkaXYub2Zmc2V0V2lkdGggPT09IDIgKTsKCgkJLy8gQ2hlY2sgaWYgZWxlbWVudHMgd2l0aCBsYXlvdXQgc2hyaW5rLXdyYXAgdGhlaXIgY2hpbGRyZW4KCQkvLyAoSUUgNiBkb2VzIHRoaXMpCgkJZGl2LnN0eWxlLmRpc3BsYXkgPSAiIjsKCQlkaXYuaW5uZXJIVE1MID0gIjxkaXYgc3R5bGU9J3dpZHRoOjRweDsnPjwvZGl2PiI7CgkJc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzID0gKCBkaXYub2Zmc2V0V2lkdGggIT09IDIgKTsKCX0KCglkaXYuaW5uZXJIVE1MID0gIjx0YWJsZT48dHI+PHRkIHN0eWxlPSdwYWRkaW5nOjA7Ym9yZGVyOjA7ZGlzcGxheTpub25lJz48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+IjsKCXRkcyA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggInRkIiApOwoKCS8vIENoZWNrIGlmIHRhYmxlIGNlbGxzIHN0aWxsIGhhdmUgb2Zmc2V0V2lkdGgvSGVpZ2h0IHdoZW4gdGhleSBhcmUgc2V0CgkvLyB0byBkaXNwbGF5Om5vbmUgYW5kIHRoZXJlIGFyZSBzdGlsbCBvdGhlciB2aXNpYmxlIHRhYmxlIGNlbGxzIGluIGEKCS8vIHRhYmxlIHJvdzsgaWYgc28sIG9mZnNldFdpZHRoL0hlaWdodCBhcmUgbm90IHJlbGlhYmxlIGZvciB1c2Ugd2hlbgoJLy8gZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBoYXMgYmVlbiBoaWRkZW4gZGlyZWN0bHkgdXNpbmcKCS8vIGRpc3BsYXk6bm9uZSAoaXQgaXMgc3RpbGwgc2FmZSB0byB1c2Ugb2Zmc2V0cyBpZiBhIHBhcmVudCBlbGVtZW50IGlzCgkvLyBoaWRkZW47IGRvbiBzYWZldHkgZ29nZ2xlcyBhbmQgc2VlIGJ1ZyAjNDUxMiBmb3IgbW9yZSBpbmZvcm1hdGlvbikuCgkvLyAob25seSBJRSA4IGZhaWxzIHRoaXMgdGVzdCkKCWlzU3VwcG9ydGVkID0gKCB0ZHNbIDAgXS5vZmZzZXRIZWlnaHQgPT09IDAgKTsKCgl0ZHNbIDAgXS5zdHlsZS5kaXNwbGF5ID0gIiI7Cgl0ZHNbIDEgXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoKCS8vIENoZWNrIGlmIGVtcHR5IHRhYmxlIGNlbGxzIHN0aWxsIGhhdmUgb2Zmc2V0V2lkdGgvSGVpZ2h0CgkvLyAoSUUgPCA4IGZhaWwgdGhpcyB0ZXN0KQoJc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMgPSBpc1N1cHBvcnRlZCAmJiAoIHRkc1sgMCBdLm9mZnNldEhlaWdodCA9PT0gMCApOwoJZGl2LmlubmVySFRNTCA9ICIiOwoKCS8vIENoZWNrIGlmIGRpdiB3aXRoIGV4cGxpY2l0IHdpZHRoIGFuZCBubyBtYXJnaW4tcmlnaHQgaW5jb3JyZWN0bHkKCS8vIGdldHMgY29tcHV0ZWQgbWFyZ2luLXJpZ2h0IGJhc2VkIG9uIHdpZHRoIG9mIGNvbnRhaW5lci4gRm9yIG1vcmUKCS8vIGluZm8gc2VlIGJ1ZyAjMzMzMwoJLy8gRmFpbHMgaW4gV2ViS2l0IGJlZm9yZSBGZWIgMjAxMSBuaWdodGxpZXMKCS8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodAoJaWYgKCBkb2N1bWVudC5kZWZhdWx0VmlldyAmJiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlICkgewoJCW1hcmdpbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICk7CgkJbWFyZ2luRGl2LnN0eWxlLndpZHRoID0gIjAiOwoJCW1hcmdpbkRpdi5zdHlsZS5tYXJnaW5SaWdodCA9ICIwIjsKCQlkaXYuYXBwZW5kQ2hpbGQoIG1hcmdpbkRpdiApOwoJCXN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCA9CgkJCSggcGFyc2VJbnQoICggZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggbWFyZ2luRGl2LCBudWxsICkgfHwgeyBtYXJnaW5SaWdodDogMCB9ICkubWFyZ2luUmlnaHQsIDEwICkgfHwgMCApID09PSAwOwoJfQoKCS8vIFJlbW92ZSB0aGUgYm9keSBlbGVtZW50IHdlIGFkZGVkCgl0ZXN0RWxlbWVudC5pbm5lckhUTUwgPSAiIjsKCXRlc3RFbGVtZW50UGFyZW50LnJlbW92ZUNoaWxkKCB0ZXN0RWxlbWVudCApOwoKCS8vIFRlY2huaXF1ZSBmcm9tIEp1cml5IFpheXRzZXYKCS8vIGh0dHA6Ly90aGlua3dlYjIuY29tL3Byb2plY3RzL3Byb3RvdHlwZS9kZXRlY3RpbmctZXZlbnQtc3VwcG9ydC13aXRob3V0LWJyb3dzZXItc25pZmZpbmcvCgkvLyBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGNhc2Ugd2hlcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHN5c3RlbXMKCS8vIGFyZSB1c2VkLCBuYW1lbHkgaW4gSUUuIFNob3J0LWNpcmN1aXRpbmcgaGVyZSBoZWxwcyB1cyB0bwoJLy8gYXZvaWQgYW4gZXZhbCBjYWxsIChpbiBzZXRBdHRyaWJ1dGUpIHdoaWNoIGNhbiBjYXVzZSBDU1AKCS8vIHRvIGdvIGhheXdpcmUuIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vU2VjdXJpdHkvQ1NQCglpZiAoIGRpdi5hdHRhY2hFdmVudCApIHsKCQlmb3IoIGkgaW4gewoJCQlzdWJtaXQ6IDEsCgkJCWNoYW5nZTogMSwKCQkJZm9jdXNpbjogMQoJCX0gKSB7CgkJCWV2ZW50TmFtZSA9ICJvbiIgKyBpOwoJCQlpc1N1cHBvcnRlZCA9ICggZXZlbnROYW1lIGluIGRpdiApOwoJCQlpZiAoICFpc1N1cHBvcnRlZCApIHsKCQkJCWRpdi5zZXRBdHRyaWJ1dGUoIGV2ZW50TmFtZSwgInJldHVybjsiICk7CgkJCQlpc1N1cHBvcnRlZCA9ICggdHlwZW9mIGRpdlsgZXZlbnROYW1lIF0gPT09ICJmdW5jdGlvbiIgKTsKCQkJfQoJCQlzdXBwb3J0WyBpICsgIkJ1YmJsZXMiIF0gPSBpc1N1cHBvcnRlZDsKCQl9Cgl9CgoJLy8gTnVsbCBjb25uZWN0ZWQgZWxlbWVudHMgdG8gYXZvaWQgbGVha3MgaW4gSUUKCXRlc3RFbGVtZW50ID0gZnJhZ21lbnQgPSBzZWxlY3QgPSBvcHQgPSBib2R5ID0gbWFyZ2luRGl2ID0gZGl2ID0gaW5wdXQgPSBudWxsOwoKCXJldHVybiBzdXBwb3J0Owp9KSgpOwoKLy8gS2VlcCB0cmFjayBvZiBib3hNb2RlbApqUXVlcnkuYm94TW9kZWwgPSBqUXVlcnkuc3VwcG9ydC5ib3hNb2RlbDsKCgoKCnZhciByYnJhY2UgPSAvXig/Olx7LipcfXxcWy4qXF0pJC8sCglybXVsdGlEYXNoID0gLyhbYS16XSkoW0EtWl0pL2c7CgpqUXVlcnkuZXh0ZW5kKHsKCWNhY2hlOiB7fSwKCgkvLyBQbGVhc2UgdXNlIHdpdGggY2F1dGlvbgoJdXVpZDogMCwKCgkvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKCS8vIE5vbi1kaWdpdHMgcmVtb3ZlZCB0byBtYXRjaCByaW5saW5lalF1ZXJ5CglleHBhbmRvOiAialF1ZXJ5IiArICggalF1ZXJ5LmZuLmpxdWVyeSArIE1hdGgucmFuZG9tKCkgKS5yZXBsYWNlKCAvXEQvZywgIiIgKSwKCgkvLyBUaGUgZm9sbG93aW5nIGVsZW1lbnRzIHRocm93IHVuY2F0Y2hhYmxlIGV4Y2VwdGlvbnMgaWYgeW91CgkvLyBhdHRlbXB0IHRvIGFkZCBleHBhbmRvIHByb3BlcnRpZXMgdG8gdGhlbS4KCW5vRGF0YTogewoJCSJlbWJlZCI6IHRydWUsCgkJLy8gQmFuIGFsbCBvYmplY3RzIGV4Y2VwdCBmb3IgRmxhc2ggKHdoaWNoIGhhbmRsZSBleHBhbmRvcykKCQkib2JqZWN0IjogImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsCgkJImFwcGxldCI6IHRydWUKCX0sCgoJaGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7CgkJZWxlbSA9IGVsZW0ubm9kZVR5cGUgPyBqUXVlcnkuY2FjaGVbIGVsZW1balF1ZXJ5LmV4cGFuZG9dIF0gOiBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdOwoKCQlyZXR1cm4gISFlbGVtICYmICFpc0VtcHR5RGF0YU9iamVjdCggZWxlbSApOwoJfSwKCglkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSwgcHZ0IC8qIEludGVybmFsIFVzZSBPbmx5ICovICkgewoJCWlmICggIWpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciB0aGlzQ2FjaGUsIHJldCwKCQkJaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywKCQkJZ2V0QnlOYW1lID0gdHlwZW9mIG5hbWUgPT09ICJzdHJpbmciLAoKCQkJLy8gV2UgaGF2ZSB0byBoYW5kbGUgRE9NIG5vZGVzIGFuZCBKUyBvYmplY3RzIGRpZmZlcmVudGx5IGJlY2F1c2UgSUU2LTcKCQkJLy8gY2FuJ3QgR0Mgb2JqZWN0IHJlZmVyZW5jZXMgcHJvcGVybHkgYWNyb3NzIHRoZSBET00tSlMgYm91bmRhcnkKCQkJaXNOb2RlID0gZWxlbS5ub2RlVHlwZSwKCgkJCS8vIE9ubHkgRE9NIG5vZGVzIG5lZWQgdGhlIGdsb2JhbCBqUXVlcnkgY2FjaGU7IEpTIG9iamVjdCBkYXRhIGlzCgkJCS8vIGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBvYmplY3Qgc28gR0MgY2FuIG9jY3VyIGF1dG9tYXRpY2FsbHkKCQkJY2FjaGUgPSBpc05vZGUgPyBqUXVlcnkuY2FjaGUgOiBlbGVtLAoKCQkJLy8gT25seSBkZWZpbmluZyBhbiBJRCBmb3IgSlMgb2JqZWN0cyBpZiBpdHMgY2FjaGUgYWxyZWFkeSBleGlzdHMgYWxsb3dzCgkJCS8vIHRoZSBjb2RlIHRvIHNob3J0Y3V0IG9uIHRoZSBzYW1lIHBhdGggYXMgYSBET00gbm9kZSB3aXRoIG5vIGNhY2hlCgkJCWlkID0gaXNOb2RlID8gZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXSA6IGVsZW1bIGpRdWVyeS5leHBhbmRvIF0gJiYgalF1ZXJ5LmV4cGFuZG87CgoJCS8vIEF2b2lkIGRvaW5nIGFueSBtb3JlIHdvcmsgdGhhbiB3ZSBuZWVkIHRvIHdoZW4gdHJ5aW5nIHRvIGdldCBkYXRhIG9uIGFuCgkJLy8gb2JqZWN0IHRoYXQgaGFzIG5vIGRhdGEgYXQgYWxsCgkJaWYgKCAoIWlkIHx8IChwdnQgJiYgaWQgJiYgKGNhY2hlWyBpZCBdICYmICFjYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXSkpKSAmJiBnZXRCeU5hbWUgJiYgZGF0YSA9PT0gdW5kZWZpbmVkICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoICFpZCApIHsKCQkJLy8gT25seSBET00gbm9kZXMgbmVlZCBhIG5ldyB1bmlxdWUgSUQgZm9yIGVhY2ggZWxlbWVudCBzaW5jZSB0aGVpciBkYXRhCgkJCS8vIGVuZHMgdXAgaW4gdGhlIGdsb2JhbCBjYWNoZQoJCQlpZiAoIGlzTm9kZSApIHsKCQkJCWVsZW1bIGpRdWVyeS5leHBhbmRvIF0gPSBpZCA9ICsralF1ZXJ5LnV1aWQ7CgkJCX0gZWxzZSB7CgkJCQlpZCA9IGpRdWVyeS5leHBhbmRvOwoJCQl9CgkJfQoKCQlpZiAoICFjYWNoZVsgaWQgXSApIHsKCQkJY2FjaGVbIGlkIF0gPSB7fTsKCgkJCS8vIFRPRE86IFRoaXMgaXMgYSBoYWNrIGZvciAxLjUgT05MWS4gQXZvaWRzIGV4cG9zaW5nIGpRdWVyeQoJCQkvLyBtZXRhZGF0YSBvbiBwbGFpbiBKUyBvYmplY3RzIHdoZW4gdGhlIG9iamVjdCBpcyBzZXJpYWxpemVkIHVzaW5nCgkJCS8vIEpTT04uc3RyaW5naWZ5CgkJCWlmICggIWlzTm9kZSApIHsKCQkJCWNhY2hlWyBpZCBdLnRvSlNPTiA9IGpRdWVyeS5ub29wOwoJCQl9CgkJfQoKCQkvLyBBbiBvYmplY3QgY2FuIGJlIHBhc3NlZCB0byBqUXVlcnkuZGF0YSBpbnN0ZWFkIG9mIGEga2V5L3ZhbHVlIHBhaXI7IHRoaXMgZ2V0cwoJCS8vIHNoYWxsb3cgY29waWVkIG92ZXIgb250byB0aGUgZXhpc3RpbmcgY2FjaGUKCQlpZiAoIHR5cGVvZiBuYW1lID09PSAib2JqZWN0IiB8fCB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiApIHsKCQkJaWYgKCBwdnQgKSB7CgkJCQljYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXSA9IGpRdWVyeS5leHRlbmQoY2FjaGVbIGlkIF1bIGludGVybmFsS2V5IF0sIG5hbWUpOwoJCQl9IGVsc2UgewoJCQkJY2FjaGVbIGlkIF0gPSBqUXVlcnkuZXh0ZW5kKGNhY2hlWyBpZCBdLCBuYW1lKTsKCQkJfQoJCX0KCgkJdGhpc0NhY2hlID0gY2FjaGVbIGlkIF07CgoJCS8vIEludGVybmFsIGpRdWVyeSBkYXRhIGlzIHN0b3JlZCBpbiBhIHNlcGFyYXRlIG9iamVjdCBpbnNpZGUgdGhlIG9iamVjdCdzIGRhdGEKCQkvLyBjYWNoZSBpbiBvcmRlciB0byBhdm9pZCBrZXkgY29sbGlzaW9ucyBiZXR3ZWVuIGludGVybmFsIGRhdGEgYW5kIHVzZXItZGVmaW5lZAoJCS8vIGRhdGEKCQlpZiAoIHB2dCApIHsKCQkJaWYgKCAhdGhpc0NhY2hlWyBpbnRlcm5hbEtleSBdICkgewoJCQkJdGhpc0NhY2hlWyBpbnRlcm5hbEtleSBdID0ge307CgkJCX0KCgkJCXRoaXNDYWNoZSA9IHRoaXNDYWNoZVsgaW50ZXJuYWxLZXkgXTsKCQl9CgoJCWlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkgewoJCQl0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdID0gZGF0YTsKCQl9CgoJCS8vIFRPRE86IFRoaXMgaXMgYSBoYWNrIGZvciAxLjUgT05MWS4gSXQgd2lsbCBiZSByZW1vdmVkIGluIDEuNi4gVXNlcnMgc2hvdWxkCgkJLy8gbm90IGF0dGVtcHQgdG8gaW5zcGVjdCB0aGUgaW50ZXJuYWwgZXZlbnRzIG9iamVjdCB1c2luZyBqUXVlcnkuZGF0YSwgYXMgdGhpcwoJCS8vIGludGVybmFsIGRhdGEgb2JqZWN0IGlzIHVuZG9jdW1lbnRlZCBhbmQgc3ViamVjdCB0byBjaGFuZ2UuCgkJaWYgKCBuYW1lID09PSAiZXZlbnRzIiAmJiAhdGhpc0NhY2hlW25hbWVdICkgewoJCQlyZXR1cm4gdGhpc0NhY2hlWyBpbnRlcm5hbEtleSBdICYmIHRoaXNDYWNoZVsgaW50ZXJuYWxLZXkgXS5ldmVudHM7CgkJfQoKCQkvLyBDaGVjayBmb3IgYm90aCBjb252ZXJ0ZWQtdG8tY2FtZWwgYW5kIG5vbi1jb252ZXJ0ZWQgZGF0YSBwcm9wZXJ0eSBuYW1lcwoJCS8vIElmIGEgZGF0YSBwcm9wZXJ0eSB3YXMgc3BlY2lmaWVkCgkJaWYgKCBnZXRCeU5hbWUgKSB7CgoJCQkvLyBGaXJzdCBUcnkgdG8gZmluZCBhcy1pcyBwcm9wZXJ0eSBkYXRhCgkJCXJldCA9IHRoaXNDYWNoZVsgbmFtZSBdOwoKCQkJLy8gVGVzdCBmb3IgbnVsbHx1bmRlZmluZWQgcHJvcGVydHkgZGF0YQoJCQlpZiAoIHJldCA9PSBudWxsICkgewoKCQkJCS8vIFRyeSB0byBmaW5kIHRoZSBjYW1lbENhc2VkIHByb3BlcnR5CgkJCQlyZXQgPSB0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdOwoJCQl9CgkJfSBlbHNlIHsKCQkJcmV0ID0gdGhpc0NhY2hlOwoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHB2dCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHsKCQlpZiAoICFqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgdGhpc0NhY2hlLAoKCQkJLy8gUmVmZXJlbmNlIHRvIGludGVybmFsIGRhdGEgY2FjaGUga2V5CgkJCWludGVybmFsS2V5ID0galF1ZXJ5LmV4cGFuZG8sCgoJCQlpc05vZGUgPSBlbGVtLm5vZGVUeXBlLAoKCQkJLy8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGluZm9ybWF0aW9uCgkJCWNhY2hlID0gaXNOb2RlID8galF1ZXJ5LmNhY2hlIDogZWxlbSwKCgkJCS8vIFNlZSBqUXVlcnkuZGF0YSBmb3IgbW9yZSBpbmZvcm1hdGlvbgoJCQlpZCA9IGlzTm9kZSA/IGVsZW1bIGpRdWVyeS5leHBhbmRvIF0gOiBqUXVlcnkuZXhwYW5kbzsKCgkJLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBubyBjYWNoZSBlbnRyeSBmb3IgdGhpcyBvYmplY3QsIHRoZXJlIGlzIG5vCgkJLy8gcHVycG9zZSBpbiBjb250aW51aW5nCgkJaWYgKCAhY2FjaGVbIGlkIF0gKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggbmFtZSApIHsKCgkJCXRoaXNDYWNoZSA9IHB2dCA/IGNhY2hlWyBpZCBdWyBpbnRlcm5hbEtleSBdIDogY2FjaGVbIGlkIF07CgoJCQlpZiAoIHRoaXNDYWNoZSApIHsKCgkJCQkvLyBTdXBwb3J0IGludGVyb3BlcmFibGUgcmVtb3ZhbCBvZiBoeXBoZW5hdGVkIG9yIGNhbWVsY2FzZWQga2V5cwoJCQkJaWYgKCAhdGhpc0NhY2hlWyBuYW1lIF0gKSB7CgkJCQkJbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKTsKCQkJCX0KCgkJCQlkZWxldGUgdGhpc0NhY2hlWyBuYW1lIF07CgoJCQkJLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSBsZWZ0IGluIHRoZSBjYWNoZSwgd2Ugd2FudCB0byBjb250aW51ZQoJCQkJLy8gYW5kIGxldCB0aGUgY2FjaGUgb2JqZWN0IGl0c2VsZiBnZXQgZGVzdHJveWVkCgkJCQlpZiAoICFpc0VtcHR5RGF0YU9iamVjdCh0aGlzQ2FjaGUpICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGluZm9ybWF0aW9uCgkJaWYgKCBwdnQgKSB7CgkJCWRlbGV0ZSBjYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXTsKCgkJCS8vIERvbid0IGRlc3Ryb3kgdGhlIHBhcmVudCBjYWNoZSB1bmxlc3MgdGhlIGludGVybmFsIGRhdGEgb2JqZWN0CgkJCS8vIGhhZCBiZWVuIHRoZSBvbmx5IHRoaW5nIGxlZnQgaW4gaXQKCQkJaWYgKCAhaXNFbXB0eURhdGFPYmplY3QoY2FjaGVbIGlkIF0pICkgewoJCQkJcmV0dXJuOwoJCQl9CgkJfQoKCQl2YXIgaW50ZXJuYWxDYWNoZSA9IGNhY2hlWyBpZCBdWyBpbnRlcm5hbEtleSBdOwoKCQkvLyBCcm93c2VycyB0aGF0IGZhaWwgZXhwYW5kbyBkZWxldGlvbiBhbHNvIHJlZnVzZSB0byBkZWxldGUgZXhwYW5kb3Mgb24KCQkvLyB0aGUgd2luZG93LCBidXQgaXQgd2lsbCBhbGxvdyBpdCBvbiBhbGwgb3RoZXIgSlMgb2JqZWN0czsgb3RoZXIgYnJvd3NlcnMKCQkvLyBkb24ndCBjYXJlCgkJLy8gRW5zdXJlIHRoYXQgYGNhY2hlYCBpcyBub3QgYSB3aW5kb3cgb2JqZWN0ICMxMDA4MAoJCWlmICggalF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyB8fCAhY2FjaGUuc2V0SW50ZXJ2YWwgKSB7CgkJCWRlbGV0ZSBjYWNoZVsgaWQgXTsKCQl9IGVsc2UgewoJCQljYWNoZVsgaWQgXSA9IG51bGw7CgkJfQoKCQkvLyBXZSBkZXN0cm95ZWQgdGhlIGVudGlyZSB1c2VyIGNhY2hlIGF0IG9uY2UgYmVjYXVzZSBpdCdzIGZhc3RlciB0aGFuCgkJLy8gaXRlcmF0aW5nIHRocm91Z2ggZWFjaCBrZXksIGJ1dCB3ZSBuZWVkIHRvIGNvbnRpbnVlIHRvIHBlcnNpc3QgaW50ZXJuYWwKCQkvLyBkYXRhIGlmIGl0IGV4aXN0ZWQKCQlpZiAoIGludGVybmFsQ2FjaGUgKSB7CgkJCWNhY2hlWyBpZCBdID0ge307CgkJCS8vIFRPRE86IFRoaXMgaXMgYSBoYWNrIGZvciAxLjUgT05MWS4gQXZvaWRzIGV4cG9zaW5nIGpRdWVyeQoJCQkvLyBtZXRhZGF0YSBvbiBwbGFpbiBKUyBvYmplY3RzIHdoZW4gdGhlIG9iamVjdCBpcyBzZXJpYWxpemVkIHVzaW5nCgkJCS8vIEpTT04uc3RyaW5naWZ5CgkJCWlmICggIWlzTm9kZSApIHsKCQkJCWNhY2hlWyBpZCBdLnRvSlNPTiA9IGpRdWVyeS5ub29wOwoJCQl9CgoJCQljYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXSA9IGludGVybmFsQ2FjaGU7CgoJCS8vIE90aGVyd2lzZSwgd2UgbmVlZCB0byBlbGltaW5hdGUgdGhlIGV4cGFuZG8gb24gdGhlIG5vZGUgdG8gYXZvaWQKCQkvLyBmYWxzZSBsb29rdXBzIGluIHRoZSBjYWNoZSBmb3IgZW50cmllcyB0aGF0IG5vIGxvbmdlciBleGlzdAoJCX0gZWxzZSBpZiAoIGlzTm9kZSApIHsKCQkJLy8gSUUgZG9lcyBub3QgYWxsb3cgdXMgdG8gZGVsZXRlIGV4cGFuZG8gcHJvcGVydGllcyBmcm9tIG5vZGVzLAoJCQkvLyBub3IgZG9lcyBpdCBoYXZlIGEgcmVtb3ZlQXR0cmlidXRlIGZ1bmN0aW9uIG9uIERvY3VtZW50IG5vZGVzOwoJCQkvLyB3ZSBtdXN0IGhhbmRsZSBhbGwgb2YgdGhlc2UgY2FzZXMKCQkJaWYgKCBqUXVlcnkuc3VwcG9ydC5kZWxldGVFeHBhbmRvICkgewoJCQkJZGVsZXRlIGVsZW1bIGpRdWVyeS5leHBhbmRvIF07CgkJCX0gZWxzZSBpZiAoIGVsZW0ucmVtb3ZlQXR0cmlidXRlICkgewoJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGpRdWVyeS5leHBhbmRvICk7CgkJCX0gZWxzZSB7CgkJCQllbGVtWyBqUXVlcnkuZXhwYW5kbyBdID0gbnVsbDsKCQkJfQoJCX0KCX0sCgoJLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgoJX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgewoJCXJldHVybiBqUXVlcnkuZGF0YSggZWxlbSwgbmFtZSwgZGF0YSwgdHJ1ZSApOwoJfSwKCgkvLyBBIG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgaWYgYSBET00gbm9kZSBjYW4gaGFuZGxlIHRoZSBkYXRhIGV4cGFuZG8KCWFjY2VwdERhdGE6IGZ1bmN0aW9uKCBlbGVtICkgewoJCWlmICggZWxlbS5ub2RlTmFtZSApIHsKCQkJdmFyIG1hdGNoID0galF1ZXJ5Lm5vRGF0YVsgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQlpZiAoIG1hdGNoICkgewoJCQkJcmV0dXJuICEobWF0Y2ggPT09IHRydWUgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKSAhPT0gbWF0Y2gpOwoJCQl9CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0KfSk7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCXZhciBkYXRhID0gbnVsbDsKCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAidW5kZWZpbmVkIiApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSApOwoKCQkJCWlmICggdGhpc1swXS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJICAgIHZhciBhdHRyID0gdGhpc1swXS5hdHRyaWJ1dGVzLCBuYW1lOwoJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGF0dHIubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCQluYW1lID0gYXR0cltpXS5uYW1lOwoKCQkJCQkJaWYgKCBuYW1lLmluZGV4T2YoICJkYXRhLSIgKSA9PT0gMCApIHsKCQkJCQkJCW5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lLnN1YnN0cmluZyg1KSApOwoKCQkJCQkJCWRhdGFBdHRyKCB0aGlzWzBdLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGRhdGE7CgoJCX0gZWxzZSBpZiAoIHR5cGVvZiBrZXkgPT09ICJvYmplY3QiICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSApOwoJCQl9KTsKCQl9CgoJCXZhciBwYXJ0cyA9IGtleS5zcGxpdCgiLiIpOwoJCXBhcnRzWzFdID0gcGFydHNbMV0gPyAiLiIgKyBwYXJ0c1sxXSA6ICIiOwoKCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJCWRhdGEgPSB0aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF1dKTsKCgkJCS8vIFRyeSB0byBmZXRjaCBhbnkgaW50ZXJuYWxseSBzdG9yZWQgZGF0YSBmaXJzdAoJCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSwga2V5ICk7CgkJCQlkYXRhID0gZGF0YUF0dHIoIHRoaXNbMF0sIGtleSwgZGF0YSApOwoJCQl9CgoJCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkICYmIHBhcnRzWzFdID8KCQkJCXRoaXMuZGF0YSggcGFydHNbMF0gKSA6CgkJCQlkYXRhOwoKCQl9IGVsc2UgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyICR0aGlzID0galF1ZXJ5KCB0aGlzICksCgkJCQkJYXJncyA9IFsgcGFydHNbMF0sIHZhbHVlIF07CgoJCQkJJHRoaXMudHJpZ2dlckhhbmRsZXIoICJzZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBhcmdzICk7CgkJCQlqUXVlcnkuZGF0YSggdGhpcywga2V5LCB2YWx1ZSApOwoJCQkJJHRoaXMudHJpZ2dlckhhbmRsZXIoICJjaGFuZ2VEYXRhIiArIHBhcnRzWzFdICsgIiEiLCBhcmdzICk7CgkJCX0pOwoJCX0KCX0sCgoJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlRGF0YSggdGhpcywga2V5ICk7CgkJfSk7Cgl9Cn0pOwoKZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHsKCS8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBmZXRjaCBhbnkKCS8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZQoJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQl2YXIgbmFtZSA9ICJkYXRhLSIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgIiQxLSQyIiApLnRvTG93ZXJDYXNlKCk7CgoJCWRhdGEgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOwoKCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKCQkJdHJ5IHsKCQkJCWRhdGEgPSBkYXRhID09PSAidHJ1ZSIgPyB0cnVlIDoKCQkJCWRhdGEgPT09ICJmYWxzZSIgPyBmYWxzZSA6CgkJCQlkYXRhID09PSAibnVsbCIgPyBudWxsIDoKCQkJCSFqUXVlcnkuaXNOYU4oIGRhdGEgKSA/IHBhcnNlRmxvYXQoIGRhdGEgKSA6CgkJCQkJcmJyYWNlLnRlc3QoIGRhdGEgKSA/IGpRdWVyeS5wYXJzZUpTT04oIGRhdGEgKSA6CgkJCQkJZGF0YTsKCQkJfSBjYXRjaCggZSApIHt9CgoJCQkvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKCQkJalF1ZXJ5LmRhdGEoIGVsZW0sIGtleSwgZGF0YSApOwoKCQl9IGVsc2UgewoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCX0KCglyZXR1cm4gZGF0YTsKfQoKLy8gVE9ETzogVGhpcyBpcyBhIGhhY2sgZm9yIDEuNSBPTkxZIHRvIGFsbG93IG9iamVjdHMgd2l0aCBhIHNpbmdsZSB0b0pTT04KLy8gcHJvcGVydHkgdG8gYmUgY29uc2lkZXJlZCBlbXB0eSBvYmplY3RzOyB0aGlzIHByb3BlcnR5IGFsd2F5cyBleGlzdHMgaW4KLy8gb3JkZXIgdG8gbWFrZSBzdXJlIEpTT04uc3RyaW5naWZ5IGRvZXMgbm90IGV4cG9zZSBpbnRlcm5hbCBtZXRhZGF0YQpmdW5jdGlvbiBpc0VtcHR5RGF0YU9iamVjdCggb2JqICkgewoJZm9yICggdmFyIG5hbWUgaW4gb2JqICkgewoJCWlmICggbmFtZSAhPT0gInRvSlNPTiIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJcmV0dXJuIHRydWU7Cn0KCgoKCmZ1bmN0aW9uIGhhbmRsZVF1ZXVlTWFya0RlZmVyKCBlbGVtLCB0eXBlLCBzcmMgKSB7Cgl2YXIgZGVmZXJEYXRhS2V5ID0gdHlwZSArICJkZWZlciIsCgkJcXVldWVEYXRhS2V5ID0gdHlwZSArICJxdWV1ZSIsCgkJbWFya0RhdGFLZXkgPSB0eXBlICsgIm1hcmsiLAoJCWRlZmVyID0galF1ZXJ5LmRhdGEoIGVsZW0sIGRlZmVyRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICk7CglpZiAoIGRlZmVyICYmCgkJKCBzcmMgPT09ICJxdWV1ZSIgfHwgIWpRdWVyeS5kYXRhKCBlbGVtLCBxdWV1ZURhdGFLZXksIHVuZGVmaW5lZCwgdHJ1ZSApICkgJiYKCQkoIHNyYyA9PT0gIm1hcmsiIHx8ICFqUXVlcnkuZGF0YSggZWxlbSwgbWFya0RhdGFLZXksIHVuZGVmaW5lZCwgdHJ1ZSApICkgKSB7CgkJLy8gR2l2ZSByb29tIGZvciBoYXJkLWNvZGVkIGNhbGxiYWNrcyB0byBmaXJlIGZpcnN0CgkJLy8gYW5kIGV2ZW50dWFsbHkgbWFyay9xdWV1ZSBzb21ldGhpbmcgZWxzZSBvbiB0aGUgZWxlbWVudAoJCXNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQlpZiAoICFqUXVlcnkuZGF0YSggZWxlbSwgcXVldWVEYXRhS2V5LCB1bmRlZmluZWQsIHRydWUgKSAmJgoJCQkJIWpRdWVyeS5kYXRhKCBlbGVtLCBtYXJrRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICkgKSB7CgkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgZGVmZXJEYXRhS2V5LCB0cnVlICk7CgkJCQlkZWZlci5yZXNvbHZlKCk7CgkJCX0KCQl9LCAwICk7Cgl9Cn0KCmpRdWVyeS5leHRlbmQoewoKCV9tYXJrOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQlpZiAoIGVsZW0gKSB7CgkJCXR5cGUgPSAodHlwZSB8fCAiZngiKSArICJtYXJrIjsKCQkJalF1ZXJ5LmRhdGEoIGVsZW0sIHR5cGUsIChqUXVlcnkuZGF0YShlbGVtLHR5cGUsdW5kZWZpbmVkLHRydWUpIHx8IDApICsgMSwgdHJ1ZSApOwoJCX0KCX0sCgoJX3VubWFyazogZnVuY3Rpb24oIGZvcmNlLCBlbGVtLCB0eXBlICkgewoJCWlmICggZm9yY2UgIT09IHRydWUgKSB7CgkJCXR5cGUgPSBlbGVtOwoJCQllbGVtID0gZm9yY2U7CgkJCWZvcmNlID0gZmFsc2U7CgkJfQoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCQkJdmFyIGtleSA9IHR5cGUgKyAibWFyayIsCgkJCQljb3VudCA9IGZvcmNlID8gMCA6ICggKGpRdWVyeS5kYXRhKCBlbGVtLCBrZXksIHVuZGVmaW5lZCwgdHJ1ZSkgfHwgMSApIC0gMSApOwoJCQlpZiAoIGNvdW50ICkgewoJCQkJalF1ZXJ5LmRhdGEoIGVsZW0sIGtleSwgY291bnQsIHRydWUgKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCBrZXksIHRydWUgKTsKCQkJCWhhbmRsZVF1ZXVlTWFya0RlZmVyKCBlbGVtLCB0eXBlLCAibWFyayIgKTsKCQkJfQoJCX0KCX0sCgoJcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgewoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9ICh0eXBlIHx8ICJmeCIpICsgInF1ZXVlIjsKCQkJdmFyIHEgPSBqUXVlcnkuZGF0YSggZWxlbSwgdHlwZSwgdW5kZWZpbmVkLCB0cnVlICk7CgkJCS8vIFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGluZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1c3QgYSBsb29rdXAKCQkJaWYgKCBkYXRhICkgewoJCQkJaWYgKCAhcSB8fCBqUXVlcnkuaXNBcnJheShkYXRhKSApIHsKCQkJCQlxID0galF1ZXJ5LmRhdGEoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoZGF0YSksIHRydWUgKTsKCQkJCX0gZWxzZSB7CgkJCQkJcS5wdXNoKCBkYXRhICk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHEgfHwgW107CgkJfQoJfSwKCglkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQl0eXBlID0gdHlwZSB8fCAiZngiOwoKCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSwKCQkJZm4gPSBxdWV1ZS5zaGlmdCgpLAoJCQlkZWZlcjsKCgkJLy8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVkLCBhbHdheXMgcmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbAoJCWlmICggZm4gPT09ICJpbnByb2dyZXNzIiApIHsKCQkJZm4gPSBxdWV1ZS5zaGlmdCgpOwoJCX0KCgkJaWYgKCBmbiApIHsKCQkJLy8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8gcHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZwoJCQkvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkCgkJCWlmICggdHlwZSA9PT0gImZ4IiApIHsKCQkJCXF1ZXVlLnVuc2hpZnQoImlucHJvZ3Jlc3MiKTsKCQkJfQoKCQkJZm4uY2FsbChlbGVtLCBmdW5jdGlvbigpIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKGVsZW0sIHR5cGUpOwoJCQl9KTsKCQl9CgoJCWlmICggIXF1ZXVlLmxlbmd0aCApIHsKCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sIHR5cGUgKyAicXVldWUiLCB0cnVlICk7CgkJCWhhbmRsZVF1ZXVlTWFya0RlZmVyKCBlbGVtLCB0eXBlLCAicXVldWUiICk7CgkJfQoJfQp9KTsKCmpRdWVyeS5mbi5leHRlbmQoewoJcXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCWlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgewoJCQlkYXRhID0gdHlwZTsKCQkJdHlwZSA9ICJmeCI7CgkJfQoKCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOwoJCX0KCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKCgkJCWlmICggdHlwZSA9PT0gImZ4IiAmJiBxdWV1ZVswXSAhPT0gImlucHJvZ3Jlc3MiICkgewoJCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKCQkJfQoJCX0pOwoJfSwKCWRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSk7Cgl9LAoJLy8gQmFzZWQgb2ZmIG9mIHRoZSBwbHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBwZXJtaXNzaW9uLgoJLy8gaHR0cDovL2JsaW5kc2lnbmFscy5jb20vaW5kZXgucGhwLzIwMDkvMDcvanF1ZXJ5LWRlbGF5LwoJZGVsYXk6IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkgewoJCXRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzW3RpbWVdIHx8IHRpbWUgOiB0aW1lOwoJCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbigpIHsKCQkJdmFyIGVsZW0gPSB0aGlzOwoJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTsKCQkJfSwgdGltZSApOwoJCX0pOwoJfSwKCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7Cgl9LAoJLy8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZQoJLy8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpCglwcm9taXNlOiBmdW5jdGlvbiggdHlwZSwgb2JqZWN0ICkgewoJCWlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgewoJCQlvYmplY3QgPSB0eXBlOwoJCQl0eXBlID0gdW5kZWZpbmVkOwoJCX0KCQl0eXBlID0gdHlwZSB8fCAiZngiOwoJCXZhciBkZWZlciA9IGpRdWVyeS5EZWZlcnJlZCgpLAoJCQllbGVtZW50cyA9IHRoaXMsCgkJCWkgPSBlbGVtZW50cy5sZW5ndGgsCgkJCWNvdW50ID0gMSwKCQkJZGVmZXJEYXRhS2V5ID0gdHlwZSArICJkZWZlciIsCgkJCXF1ZXVlRGF0YUtleSA9IHR5cGUgKyAicXVldWUiLAoJCQltYXJrRGF0YUtleSA9IHR5cGUgKyAibWFyayIsCgkJCXRtcDsKCQlmdW5jdGlvbiByZXNvbHZlKCkgewoJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCWRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7CgkJCX0KCQl9CgkJd2hpbGUoIGktLSApIHsKCQkJaWYgKCggdG1wID0galF1ZXJ5LmRhdGEoIGVsZW1lbnRzWyBpIF0sIGRlZmVyRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICkgfHwKCQkJCQkoIGpRdWVyeS5kYXRhKCBlbGVtZW50c1sgaSBdLCBxdWV1ZURhdGFLZXksIHVuZGVmaW5lZCwgdHJ1ZSApIHx8CgkJCQkJCWpRdWVyeS5kYXRhKCBlbGVtZW50c1sgaSBdLCBtYXJrRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICkgKSAmJgoJCQkJCWpRdWVyeS5kYXRhKCBlbGVtZW50c1sgaSBdLCBkZWZlckRhdGFLZXksIGpRdWVyeS5fRGVmZXJyZWQoKSwgdHJ1ZSApICkpIHsKCQkJCWNvdW50Kys7CgkJCQl0bXAuZG9uZSggcmVzb2x2ZSApOwoJCQl9CgkJfQoJCXJlc29sdmUoKTsKCQlyZXR1cm4gZGVmZXIucHJvbWlzZSgpOwoJfQp9KTsKCgoKCnZhciByY2xhc3MgPSAvW1xuXHRccl0vZywKCXJzcGFjZSA9IC9ccysvLAoJcnJldHVybiA9IC9cci9nLAoJcnR5cGUgPSAvXig/OmJ1dHRvbnxpbnB1dCkkL2ksCglyZm9jdXNhYmxlID0gL14oPzpidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksCglyY2xpY2thYmxlID0gL15hKD86cmVhKT8kL2ksCglyYm9vbGVhbiA9IC9eKD86YXV0b2ZvY3VzfGF1dG9wbGF5fGFzeW5jfGNoZWNrZWR8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWR8c2VsZWN0ZWQpJC9pLAoJbm9kZUhvb2ssIGJvb2xIb29rOwoKalF1ZXJ5LmZuLmV4dGVuZCh7CglhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIG5hbWUsIHZhbHVlLCB0cnVlLCBqUXVlcnkuYXR0ciApOwoJfSwKCglyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApOwoJCX0pOwoJfSwKCQoJcHJvcDogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewoJCXJldHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBuYW1lLCB2YWx1ZSwgdHJ1ZSwgalF1ZXJ5LnByb3AgKTsKCX0sCgkKCXJlbW92ZVByb3A6IGZ1bmN0aW9uKCBuYW1lICkgewoJCW5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJLy8gdHJ5L2NhdGNoIGhhbmRsZXMgY2FzZXMgd2hlcmUgSUUgYmFsa3MgKHN1Y2ggYXMgcmVtb3ZpbmcgYSBwcm9wZXJ0eSBvbiB3aW5kb3cpCgkJCXRyeSB7CgkJCQl0aGlzWyBuYW1lIF0gPSB1bmRlZmluZWQ7CgkJCQlkZWxldGUgdGhpc1sgbmFtZSBdOwoJCQl9IGNhdGNoKCBlICkge30KCQl9KTsKCX0sCgoJYWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQl2YXIgY2xhc3NOYW1lcywgaSwgbCwgZWxlbSwKCQkJc2V0Q2xhc3MsIGMsIGNsOwoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkgewoJCQkJalF1ZXJ5KCB0aGlzICkuYWRkQ2xhc3MoIHZhbHVlLmNhbGwodGhpcywgaiwgdGhpcy5jbGFzc05hbWUpICk7CgkJCX0pOwoJCX0KCgkJaWYgKCB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICkgewoJCQljbGFzc05hbWVzID0gdmFsdWUuc3BsaXQoIHJzcGFjZSApOwoKCQkJZm9yICggaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCWVsZW0gPSB0aGlzWyBpIF07CgoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWlmICggIWVsZW0uY2xhc3NOYW1lICYmIGNsYXNzTmFtZXMubGVuZ3RoID09PSAxICkgewoJCQkJCQllbGVtLmNsYXNzTmFtZSA9IHZhbHVlOwoKCQkJCQl9IGVsc2UgewoJCQkJCQlzZXRDbGFzcyA9ICIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiOwoKCQkJCQkJZm9yICggYyA9IDAsIGNsID0gY2xhc3NOYW1lcy5sZW5ndGg7IGMgPCBjbDsgYysrICkgewoJCQkJCQkJaWYgKCAhfnNldENsYXNzLmluZGV4T2YoICIgIiArIGNsYXNzTmFtZXNbIGMgXSArICIgIiApICkgewoJCQkJCQkJCXNldENsYXNzICs9IGNsYXNzTmFtZXNbIGMgXSArICIgIjsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbGVtLmNsYXNzTmFtZSA9IGpRdWVyeS50cmltKCBzZXRDbGFzcyApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzTmFtZXMsIGksIGwsIGVsZW0sIGNsYXNzTmFtZSwgYywgY2w7CgoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBqLCB0aGlzLmNsYXNzTmFtZSkgKTsKCQkJfSk7CgkJfQoKCQlpZiAoICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciKSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgewoJCQljbGFzc05hbWVzID0gKHZhbHVlIHx8ICIiKS5zcGxpdCggcnNwYWNlICk7CgoJCQlmb3IgKCBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJZWxlbSA9IHRoaXNbIGkgXTsKCgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgZWxlbS5jbGFzc05hbWUgKSB7CgkJCQkJaWYgKCB2YWx1ZSApIHsKCQkJCQkJY2xhc3NOYW1lID0gKCIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiKS5yZXBsYWNlKCByY2xhc3MsICIgIiApOwoJCQkJCQlmb3IgKCBjID0gMCwgY2wgPSBjbGFzc05hbWVzLmxlbmd0aDsgYyA8IGNsOyBjKysgKSB7CgkJCQkJCQljbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgiICIgKyBjbGFzc05hbWVzWyBjIF0gKyAiICIsICIgIik7CgkJCQkJCX0KCQkJCQkJZWxlbS5jbGFzc05hbWUgPSBqUXVlcnkudHJpbSggY2xhc3NOYW1lICk7CgoJCQkJCX0gZWxzZSB7CgkJCQkJCWVsZW0uY2xhc3NOYW1lID0gIiI7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7CgkJdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsCgkJCWlzQm9vbCA9IHR5cGVvZiBzdGF0ZVZhbCA9PT0gImJvb2xlYW4iOwoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewoJCQkJalF1ZXJ5KCB0aGlzICkudG9nZ2xlQ2xhc3MoIHZhbHVlLmNhbGwodGhpcywgaSwgdGhpcy5jbGFzc05hbWUsIHN0YXRlVmFsKSwgc3RhdGVWYWwgKTsKCQkJfSk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlpZiAoIHR5cGUgPT09ICJzdHJpbmciICkgewoJCQkJLy8gdG9nZ2xlIGluZGl2aWR1YWwgY2xhc3MgbmFtZXMKCQkJCXZhciBjbGFzc05hbWUsCgkJCQkJaSA9IDAsCgkJCQkJc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJCXN0YXRlID0gc3RhdGVWYWwsCgkJCQkJY2xhc3NOYW1lcyA9IHZhbHVlLnNwbGl0KCByc3BhY2UgKTsKCgkJCQl3aGlsZSAoIChjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSkgKSB7CgkJCQkJLy8gY2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGVyYXRlZCBsaXN0CgkJCQkJc3RhdGUgPSBpc0Jvb2wgPyBzdGF0ZSA6ICFzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKTsKCQkJCQlzZWxmWyBzdGF0ZSA/ICJhZGRDbGFzcyIgOiAicmVtb3ZlQ2xhc3MiIF0oIGNsYXNzTmFtZSApOwoJCQkJfQoKCQkJfSBlbHNlIGlmICggdHlwZSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZSA9PT0gImJvb2xlYW4iICkgewoJCQkJaWYgKCB0aGlzLmNsYXNzTmFtZSApIHsKCQkJCQkvLyBzdG9yZSBjbGFzc05hbWUgaWYgc2V0CgkJCQkJalF1ZXJ5Ll9kYXRhKCB0aGlzLCAiX19jbGFzc05hbWVfXyIsIHRoaXMuY2xhc3NOYW1lICk7CgkJCQl9CgoJCQkJLy8gdG9nZ2xlIHdob2xlIGNsYXNzTmFtZQoJCQkJdGhpcy5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgPyAiIiA6IGpRdWVyeS5fZGF0YSggdGhpcywgIl9fY2xhc3NOYW1lX18iICkgfHwgIiI7CgkJCX0KCQl9KTsKCX0sCgoJaGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgY2xhc3NOYW1lID0gIiAiICsgc2VsZWN0b3IgKyAiICI7CgkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCWlmICggdGhpc1tpXS5ub2RlVHlwZSA9PT0gMSAmJiAoIiAiICsgdGhpc1tpXS5jbGFzc05hbWUgKyAiICIpLnJlcGxhY2UocmNsYXNzLCAiICIpLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfSwKCgl2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQl2YXIgaG9va3MsIHJldCwKCQkJZWxlbSA9IHRoaXNbMF07CgkJCgkJaWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJaWYgKCBlbGVtICkgewoJCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF07CgoJCQkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCAidmFsdWUiICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIHJldDsKCQkJCX0KCgkJCQlyZXQgPSBlbGVtLnZhbHVlOwoKCQkJCXJldHVybiB0eXBlb2YgcmV0ID09PSAic3RyaW5nIiA/IAoJCQkJCS8vIGhhbmRsZSBtb3N0IGNvbW1vbiBzdHJpbmcgY2FzZXMKCQkJCQlyZXQucmVwbGFjZShycmV0dXJuLCAiIikgOiAKCQkJCQkvLyBoYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXIKCQkJCQlyZXQgPT0gbnVsbCA/ICIiIDogcmV0OwoJCQl9CgoJCQlyZXR1cm4gdW5kZWZpbmVkOwoJCX0KCgkJdmFyIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTsKCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKCQkJdmFyIHNlbGYgPSBqUXVlcnkodGhpcyksIHZhbDsKCgkJCWlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCBpc0Z1bmN0aW9uICkgewoJCQkJdmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgc2VsZi52YWwoKSApOwoJCQl9IGVsc2UgewoJCQkJdmFsID0gdmFsdWU7CgkJCX0KCgkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nCgkJCWlmICggdmFsID09IG51bGwgKSB7CgkJCQl2YWwgPSAiIjsKCQkJfSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gIm51bWJlciIgKSB7CgkJCQl2YWwgKz0gIiI7CgkJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWwgKSApIHsKCQkJCXZhbCA9IGpRdWVyeS5tYXAodmFsLCBmdW5jdGlvbiAoIHZhbHVlICkgewoJCQkJCXJldHVybiB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSArICIiOwoJCQkJfSk7CgkJCX0KCgkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXSB8fCBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdOwoKCQkJLy8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmcKCQkJaWYgKCAhaG9va3MgfHwgISgic2V0IiBpbiBob29rcykgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsICJ2YWx1ZSIgKSA9PT0gdW5kZWZpbmVkICkgewoJCQkJdGhpcy52YWx1ZSA9IHZhbDsKCQkJfQoJCX0pOwoJfQp9KTsKCmpRdWVyeS5leHRlbmQoewoJdmFsSG9va3M6IHsKCQlvcHRpb246IHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCS8vIGF0dHJpYnV0ZXMudmFsdWUgaXMgdW5kZWZpbmVkIGluIEJsYWNrYmVycnkgNC43IGJ1dAoJCQkJLy8gdXNlcyAudmFsdWUuIFNlZSAjNjkzMgoJCQkJdmFyIHZhbCA9IGVsZW0uYXR0cmlidXRlcy52YWx1ZTsKCQkJCXJldHVybiAhdmFsIHx8IHZhbC5zcGVjaWZpZWQgPyBlbGVtLnZhbHVlIDogZWxlbS50ZXh0OwoJCQl9CgkJfSwKCQlzZWxlY3Q6IHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXZhciB2YWx1ZSwKCQkJCQlpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCwKCQkJCQl2YWx1ZXMgPSBbXSwKCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAoJCQkJCW9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiOwoKCQkJCS8vIE5vdGhpbmcgd2FzIHNlbGVjdGVkCgkJCQlpZiAoIGluZGV4IDwgMCApIHsKCQkJCQlyZXR1cm4gbnVsbDsKCQkJCX0KCgkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCgkJCQlmb3IgKCB2YXIgaSA9IG9uZSA/IGluZGV4IDogMCwgbWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKyApIHsKCQkJCQl2YXIgb3B0aW9uID0gb3B0aW9uc1sgaSBdOwoKCQkJCQkvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwCgkJCQkJaWYgKCBvcHRpb24uc2VsZWN0ZWQgJiYgKGpRdWVyeS5zdXBwb3J0Lm9wdERpc2FibGVkID8gIW9wdGlvbi5kaXNhYmxlZCA6IG9wdGlvbi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT09IG51bGwpICYmCgkJCQkJCQkoIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFqUXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkpICkgewoKCQkJCQkJLy8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgoJCQkJCQl2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7CgoJCQkJCQkvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0cwoJCQkJCQlpZiAoIG9uZSApIHsKCQkJCQkJCXJldHVybiB2YWx1ZTsKCQkJCQkJfQoKCQkJCQkJLy8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXkKCQkJCQkJdmFsdWVzLnB1c2goIHZhbHVlICk7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIEZpeGVzIEJ1ZyAjMjU1MSAtLSBzZWxlY3QudmFsKCkgYnJva2VuIGluIElFIGFmdGVyIGZvcm0ucmVzZXQoKQoJCQkJaWYgKCBvbmUgJiYgIXZhbHVlcy5sZW5ndGggJiYgb3B0aW9ucy5sZW5ndGggKSB7CgkJCQkJcmV0dXJuIGpRdWVyeSggb3B0aW9uc1sgaW5kZXggXSApLnZhbCgpOwoJCQkJfQoKCQkJCXJldHVybiB2YWx1ZXM7CgkJCX0sCgoJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJCXZhciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApOwoKCQkJCWpRdWVyeShlbGVtKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJCXRoaXMuc2VsZWN0ZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KHRoaXMpLnZhbCgpLCB2YWx1ZXMgKSA+PSAwOwoJCQkJfSk7CgoJCQkJaWYgKCAhdmFsdWVzLmxlbmd0aCApIHsKCQkJCQllbGVtLnNlbGVjdGVkSW5kZXggPSAtMTsKCQkJCX0KCQkJCXJldHVybiB2YWx1ZXM7CgkJCX0KCQl9Cgl9LAoKCWF0dHJGbjogewoJCXZhbDogdHJ1ZSwKCQljc3M6IHRydWUsCgkJaHRtbDogdHJ1ZSwKCQl0ZXh0OiB0cnVlLAoJCWRhdGE6IHRydWUsCgkJd2lkdGg6IHRydWUsCgkJaGVpZ2h0OiB0cnVlLAoJCW9mZnNldDogdHJ1ZQoJfSwKCQoJYXR0ckZpeDogewoJCS8vIEFsd2F5cyBub3JtYWxpemUgdG8gZW5zdXJlIGhvb2sgdXNhZ2UKCQl0YWJpbmRleDogInRhYkluZGV4IgoJfSwKCQoJYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBwYXNzICkgewoJCXZhciBuVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgkJCgkJLy8gZG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2RlcwoJCWlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7CgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIHBhc3MgJiYgbmFtZSBpbiBqUXVlcnkuYXR0ckZuICkgewoJCQlyZXR1cm4galF1ZXJ5KCBlbGVtIClbIG5hbWUgXSggdmFsdWUgKTsKCQl9CgoJCS8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkCgkJaWYgKCAhKCJnZXRBdHRyaWJ1dGUiIGluIGVsZW0pICkgewoJCQlyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7CgkJfQoKCQl2YXIgcmV0LCBob29rcywKCQkJbm90eG1sID0gblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApOwoKCQkvLyBOb3JtYWxpemUgdGhlIG5hbWUgaWYgbmVlZGVkCgkJaWYgKCBub3R4bWwgKSB7CgkJCW5hbWUgPSBqUXVlcnkuYXR0ckZpeFsgbmFtZSBdIHx8IG5hbWU7CgoJCQlob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXTsKCgkJCWlmICggIWhvb2tzICkgewoJCQkJLy8gVXNlIGJvb2xIb29rIGZvciBib29sZWFuIGF0dHJpYnV0ZXMKCQkJCWlmICggcmJvb2xlYW4udGVzdCggbmFtZSApICkgewoJCQkJCWhvb2tzID0gYm9vbEhvb2s7CgoJCQkJLy8gVXNlIG5vZGVIb29rIGlmIGF2YWlsYWJsZSggSUU2LzcgKQoJCQkJfSBlbHNlIGlmICggbm9kZUhvb2sgKSB7CgkJCQkJaG9va3MgPSBub2RlSG9vazsKCQkJCX0KCQkJfQoJCX0KCgkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoKCQkJaWYgKCB2YWx1ZSA9PT0gbnVsbCApIHsKCQkJCWpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7CgkJCQlyZXR1cm4gdW5kZWZpbmVkOwoKCQkJfSBlbHNlIGlmICggaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYgbm90eG1sICYmIChyZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoKCQkJfSBlbHNlIHsKCQkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCAiIiArIHZhbHVlICk7CgkJCQlyZXR1cm4gdmFsdWU7CgkJCX0KCgkJfSBlbHNlIGlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgbm90eG1sICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7CgkJCXJldHVybiByZXQ7CgoJCX0gZWxzZSB7CgoJCQlyZXQgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOwoKCQkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWQKCQkJcmV0dXJuIHJldCA9PT0gbnVsbCA/CgkJCQl1bmRlZmluZWQgOgoJCQkJcmV0OwoJCX0KCX0sCgoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJdmFyIHByb3BOYW1lOwoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJbmFtZSA9IGpRdWVyeS5hdHRyRml4WyBuYW1lIF0gfHwgbmFtZTsKCgkJCWpRdWVyeS5hdHRyKCBlbGVtLCBuYW1lLCAiIiApOwoJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggbmFtZSApOwoKCQkJLy8gU2V0IGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdG8gZmFsc2UgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwoJCQlpZiAoIHJib29sZWFuLnRlc3QoIG5hbWUgKSAmJiAocHJvcE5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWUpIGluIGVsZW0gKSB7CgkJCQllbGVtWyBwcm9wTmFtZSBdID0gZmFsc2U7CgkJCX0KCQl9Cgl9LAoKCWF0dHJIb29rczogewoJCXR5cGU6IHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQkvLyBXZSBjYW4ndCBhbGxvdyB0aGUgdHlwZSBwcm9wZXJ0eSB0byBiZSBjaGFuZ2VkIChzaW5jZSBpdCBjYXVzZXMgcHJvYmxlbXMgaW4gSUUpCgkJCQlpZiAoIHJ0eXBlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQkJalF1ZXJ5LmVycm9yKCAidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIiApOwoJCQkJfSBlbHNlIGlmICggIWpRdWVyeS5zdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYgalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICJpbnB1dCIpICkgewoJCQkJCS8vIFNldHRpbmcgdGhlIHR5cGUgb24gYSByYWRpbyBidXR0b24gYWZ0ZXIgdGhlIHZhbHVlIHJlc2V0cyB0aGUgdmFsdWUgaW4gSUU2LTkKCQkJCQkvLyBSZXNldCB2YWx1ZSB0byBpdCdzIGRlZmF1bHQgaW4gY2FzZSB0eXBlIGlzIHNldCBhZnRlciB2YWx1ZQoJCQkJCS8vIFRoaXMgaXMgZm9yIGVsZW1lbnQgY3JlYXRpb24KCQkJCQl2YXIgdmFsID0gZWxlbS52YWx1ZTsKCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggInR5cGUiLCB2YWx1ZSApOwoJCQkJCWlmICggdmFsICkgewoJCQkJCQllbGVtLnZhbHVlID0gdmFsOwoJCQkJCX0KCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQl9CgkJCX0KCQl9LAoJCS8vIFVzZSB0aGUgdmFsdWUgcHJvcGVydHkgZm9yIGJhY2sgY29tcGF0CgkJLy8gVXNlIHRoZSBub2RlSG9vayBmb3IgYnV0dG9uIGVsZW1lbnRzIGluIElFNi83ICgjMTk1NCkKCQl2YWx1ZTogewoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCQkJaWYgKCBub2RlSG9vayAmJiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJidXR0b24iICkgKSB7CgkJCQkJcmV0dXJuIG5vZGVIb29rLmdldCggZWxlbSwgbmFtZSApOwoJCQkJfQoJCQkJcmV0dXJuIG5hbWUgaW4gZWxlbSA/CgkJCQkJZWxlbS52YWx1ZSA6CgkJCQkJbnVsbDsKCQkJfSwKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7CgkJCQlpZiAoIG5vZGVIb29rICYmIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImJ1dHRvbiIgKSApIHsKCQkJCQlyZXR1cm4gbm9kZUhvb2suc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApOwoJCQkJfQoJCQkJLy8gRG9lcyBub3QgcmV0dXJuIHNvIHRoYXQgc2V0QXR0cmlidXRlIGlzIGFsc28gdXNlZAoJCQkJZWxlbS52YWx1ZSA9IHZhbHVlOwoJCQl9CgkJfQoJfSwKCglwcm9wRml4OiB7CgkJdGFiaW5kZXg6ICJ0YWJJbmRleCIsCgkJcmVhZG9ubHk6ICJyZWFkT25seSIsCgkJImZvciI6ICJodG1sRm9yIiwKCQkiY2xhc3MiOiAiY2xhc3NOYW1lIiwKCQltYXhsZW5ndGg6ICJtYXhMZW5ndGgiLAoJCWNlbGxzcGFjaW5nOiAiY2VsbFNwYWNpbmciLAoJCWNlbGxwYWRkaW5nOiAiY2VsbFBhZGRpbmciLAoJCXJvd3NwYW46ICJyb3dTcGFuIiwKCQljb2xzcGFuOiAiY29sU3BhbiIsCgkJdXNlbWFwOiAidXNlTWFwIiwKCQlmcmFtZWJvcmRlcjogImZyYW1lQm9yZGVyIiwKCQljb250ZW50ZWRpdGFibGU6ICJjb250ZW50RWRpdGFibGUiCgl9LAoJCglwcm9wOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CgkJdmFyIG5UeXBlID0gZWxlbS5ub2RlVHlwZTsKCgkJLy8gZG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2RlcwoJCWlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7CgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQl2YXIgcmV0LCBob29rcywKCQkJbm90eG1sID0gblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApOwoKCQlpZiAoIG5vdHhtbCApIHsKCQkJLy8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rcwoJCQluYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lOwoJCQlob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTsKCQl9CgoJCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJaWYgKCBob29rcyAmJiAic2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkICkgewoJCQkJcmV0dXJuIHJldDsKCgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gKGVsZW1bIG5hbWUgXSA9IHZhbHVlKTsKCQkJfQoKCQl9IGVsc2UgewoJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7CgkJCQlyZXR1cm4gcmV0OwoKCQkJfSBlbHNlIHsKCQkJCXJldHVybiBlbGVtWyBuYW1lIF07CgkJCX0KCQl9Cgl9LAoJCglwcm9wSG9va3M6IHsKCQl0YWJJbmRleDogewoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IHNldAoJCQkJLy8gaHR0cDovL2ZsdWlkcHJvamVjdC5vcmcvYmxvZy8yMDA4LzAxLzA5L2dldHRpbmctc2V0dGluZy1hbmQtcmVtb3ZpbmctdGFiaW5kZXgtdmFsdWVzLXdpdGgtamF2YXNjcmlwdC8KCQkJCXZhciBhdHRyaWJ1dGVOb2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJ0YWJpbmRleCIpOwoKCQkJCXJldHVybiBhdHRyaWJ1dGVOb2RlICYmIGF0dHJpYnV0ZU5vZGUuc3BlY2lmaWVkID8KCQkJCQlwYXJzZUludCggYXR0cmlidXRlTm9kZS52YWx1ZSwgMTAgKSA6CgkJCQkJcmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHwgcmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYgZWxlbS5ocmVmID8KCQkJCQkJMCA6CgkJCQkJCXVuZGVmaW5lZDsKCQkJfQoJCX0KCX0KfSk7CgovLyBBZGQgdGhlIHRhYmluZGV4IHByb3BIb29rIHRvIGF0dHJIb29rcyBmb3IgYmFjay1jb21wYXQKalF1ZXJ5LmF0dHJIb29rcy50YWJJbmRleCA9IGpRdWVyeS5wcm9wSG9va3MudGFiSW5kZXg7CgovLyBIb29rIGZvciBib29sZWFuIGF0dHJpYnV0ZXMKYm9vbEhvb2sgPSB7CglnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCS8vIEFsaWduIGJvb2xlYW4gYXR0cmlidXRlcyB3aXRoIGNvcnJlc3BvbmRpbmcgcHJvcGVydGllcwoJCS8vIEZhbGwgYmFjayB0byBhdHRyaWJ1dGUgcHJlc2VuY2Ugd2hlcmUgc29tZSBib29sZWFucyBhcmUgbm90IHN1cHBvcnRlZAoJCXZhciBhdHRyTm9kZTsKCQlyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUgKSA9PT0gdHJ1ZSB8fCAoIGF0dHJOb2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkgKSAmJiBhdHRyTm9kZS5ub2RlVmFsdWUgIT09IGZhbHNlID8KCQkJbmFtZS50b0xvd2VyQ2FzZSgpIDoKCQkJdW5kZWZpbmVkOwoJfSwKCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCXZhciBwcm9wTmFtZTsKCQlpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKCQkJLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQoJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCX0gZWxzZSB7CgkJCS8vIHZhbHVlIGlzIHRydWUgc2luY2Ugd2Uga25vdyBhdCB0aGlzIHBvaW50IGl0J3MgdHlwZSBib29sZWFuIGFuZCBub3QgZmFsc2UKCQkJLy8gU2V0IGJvb2xlYW4gYXR0cmlidXRlcyB0byB0aGUgc2FtZSBuYW1lIGFuZCBzZXQgdGhlIERPTSBwcm9wZXJ0eQoJCQlwcm9wTmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJaWYgKCBwcm9wTmFtZSBpbiBlbGVtICkgewoJCQkJLy8gT25seSBzZXQgdGhlIElETCBzcGVjaWZpY2FsbHkgaWYgaXQgYWxyZWFkeSBleGlzdHMgb24gdGhlIGVsZW1lbnQKCQkJCWVsZW1bIHByb3BOYW1lIF0gPSB0cnVlOwoJCQl9CgoJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpICk7CgkJfQoJCXJldHVybiBuYW1lOwoJfQp9OwoKLy8gSUU2LzcgZG8gbm90IHN1cHBvcnQgZ2V0dGluZy9zZXR0aW5nIHNvbWUgYXR0cmlidXRlcyB3aXRoIGdldC9zZXRBdHRyaWJ1dGUKaWYgKCAhalF1ZXJ5LnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlICkgewoJCgkvLyBVc2UgdGhpcyBmb3IgYW55IGF0dHJpYnV0ZSBpbiBJRTYvNwoJLy8gVGhpcyBmaXhlcyBhbG1vc3QgZXZlcnkgSUU2LzcgaXNzdWUKCW5vZGVIb29rID0galF1ZXJ5LnZhbEhvb2tzLmJ1dHRvbiA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCQl2YXIgcmV0OwoJCQlyZXQgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKTsKCQkJLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBub2RlVmFsdWUgaXMgZW1wdHkgc3RyaW5nCgkJCXJldHVybiByZXQgJiYgcmV0Lm5vZGVWYWx1ZSAhPT0gIiIgPwoJCQkJcmV0Lm5vZGVWYWx1ZSA6CgkJCQl1bmRlZmluZWQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHsKCQkJLy8gU2V0IHRoZSBleGlzdGluZyBvciBjcmVhdGUgYSBuZXcgYXR0cmlidXRlIG5vZGUKCQkJdmFyIHJldCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApOwoJCQlpZiAoICFyZXQgKSB7CgkJCQlyZXQgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoIG5hbWUgKTsKCQkJCWVsZW0uc2V0QXR0cmlidXRlTm9kZSggcmV0ICk7CgkJCX0KCQkJcmV0dXJuIChyZXQubm9kZVZhbHVlID0gdmFsdWUgKyAiIik7CgkJfQoJfTsKCgkvLyBTZXQgd2lkdGggYW5kIGhlaWdodCB0byBhdXRvIGluc3RlYWQgb2YgMCBvbiBlbXB0eSBzdHJpbmcoIEJ1ZyAjODE1MCApCgkvLyBUaGlzIGlzIGZvciByZW1vdmFscwoJalF1ZXJ5LmVhY2goWyAid2lkdGgiLCAiaGVpZ2h0IiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCQlqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0sIHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQlpZiAoIHZhbHVlID09PSAiIiApIHsKCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgImF1dG8iICk7CgkJCQkJcmV0dXJuIHZhbHVlOwoJCQkJfQoJCQl9CgkJfSk7Cgl9KTsKfQoKCi8vIFNvbWUgYXR0cmlidXRlcyByZXF1aXJlIGEgc3BlY2lhbCBjYWxsIG9uIElFCmlmICggIWpRdWVyeS5zdXBwb3J0LmhyZWZOb3JtYWxpemVkICkgewoJalF1ZXJ5LmVhY2goWyAiaHJlZiIsICJzcmMiLCAid2lkdGgiLCAiaGVpZ2h0IiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCQlqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0sIHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgMiApOwoJCQkJcmV0dXJuIHJldCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDsKCQkJfQoJCX0pOwoJfSk7Cn0KCmlmICggIWpRdWVyeS5zdXBwb3J0LnN0eWxlICkgewoJalF1ZXJ5LmF0dHJIb29rcy5zdHlsZSA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkvLyBSZXR1cm4gdW5kZWZpbmVkIGluIHRoZSBjYXNlIG9mIGVtcHR5IHN0cmluZwoJCQkvLyBOb3JtYWxpemUgdG8gbG93ZXJjYXNlIHNpbmNlIElFIHVwcGVyY2FzZXMgY3NzIHByb3BlcnR5IG5hbWVzCgkJCXJldHVybiBlbGVtLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKSB8fCB1bmRlZmluZWQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJcmV0dXJuIChlbGVtLnN0eWxlLmNzc1RleHQgPSAiIiArIHZhbHVlKTsKCQl9Cgl9Owp9CgovLyBTYWZhcmkgbWlzLXJlcG9ydHMgdGhlIGRlZmF1bHQgc2VsZWN0ZWQgcHJvcGVydHkgb2YgYW4gb3B0aW9uCi8vIEFjY2Vzc2luZyB0aGUgcGFyZW50J3Mgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eSBmaXhlcyBpdAppZiAoICFqUXVlcnkuc3VwcG9ydC5vcHRTZWxlY3RlZCApIHsKCWpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkLCB7CgkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCgkJCWlmICggcGFyZW50ICkgewoJCQkJcGFyZW50LnNlbGVjdGVkSW5kZXg7CgoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgaXQgYWxzbyB3b3JrcyB3aXRoIG9wdGdyb3Vwcywgc2VlICM1NzAxCgkJCQlpZiAoIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJCXBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIG51bGw7CgkJfQoJfSk7Cn0KCi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyCmlmICggIWpRdWVyeS5zdXBwb3J0LmNoZWNrT24gKSB7CglqUXVlcnkuZWFjaChbICJyYWRpbyIsICJjaGVja2JveCIgXSwgZnVuY3Rpb24oKSB7CgkJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgaW4gV2Via2l0ICIiIGlzIHJldHVybmVkIGluc3RlYWQgb2YgIm9uIiBpZiBhIHZhbHVlIGlzbid0IHNwZWNpZmllZAoJCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpID09PSBudWxsID8gIm9uIiA6IGVsZW0udmFsdWU7CgkJCX0KCQl9OwoJfSk7Cn0KalF1ZXJ5LmVhY2goWyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0aW9uKCkgewoJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkudmFsSG9va3NbIHRoaXMgXSwgewoJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCQlpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkgewoJCQkJcmV0dXJuIChlbGVtLmNoZWNrZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KGVsZW0pLnZhbCgpLCB2YWx1ZSApID49IDApOwoJCQl9CgkJfQoJfSk7Cn0pOwoKCgoKdmFyIHJuYW1lc3BhY2VzID0gL1wuKC4qKSQvLAoJcmZvcm1FbGVtcyA9IC9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSwKCXJwZXJpb2QgPSAvXC4vZywKCXJzcGFjZXMgPSAvIC9nLAoJcmVzY2FwZSA9IC9bXlx3XHMufGBdL2csCglmY2xlYW51cCA9IGZ1bmN0aW9uKCBubSApIHsKCQlyZXR1cm4gbm0ucmVwbGFjZShyZXNjYXBlLCAiXFwkJiIpOwoJfTsKCi8qCiAqIEEgbnVtYmVyIG9mIGhlbHBlciBmdW5jdGlvbnMgdXNlZCBmb3IgbWFuYWdpbmcgZXZlbnRzLgogKiBNYW55IG9mIHRoZSBpZGVhcyBiZWhpbmQgdGhpcyBjb2RlIG9yaWdpbmF0ZWQgZnJvbQogKiBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkuCiAqLwpqUXVlcnkuZXZlbnQgPSB7CgoJLy8gQmluZCBhbiBldmVudCB0byBhbiBlbGVtZW50CgkvLyBPcmlnaW5hbCBieSBEZWFuIEVkd2FyZHMKCWFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhICkgewoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIGhhbmRsZXIgPT09IGZhbHNlICkgewoJCQloYW5kbGVyID0gcmV0dXJuRmFsc2U7CgkJfSBlbHNlIGlmICggIWhhbmRsZXIgKSB7CgkJCS8vIEZpeGVzIGJ1ZyAjNzIyOS4gRml4IHJlY29tbWVuZGVkIGJ5IGpkYWx0b24KCQkJcmV0dXJuOwoJCX0KCgkJdmFyIGhhbmRsZU9iakluLCBoYW5kbGVPYmo7CgoJCWlmICggaGFuZGxlci5oYW5kbGVyICkgewoJCQloYW5kbGVPYmpJbiA9IGhhbmRsZXI7CgkJCWhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGJlaW5nIGV4ZWN1dGVkIGhhcyBhIHVuaXF1ZSBJRAoJCWlmICggIWhhbmRsZXIuZ3VpZCApIHsKCQkJaGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKzsKCQl9CgoJCS8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUKCQl2YXIgZWxlbURhdGEgPSBqUXVlcnkuX2RhdGEoIGVsZW0gKTsKCgkJLy8gSWYgbm8gZWxlbURhdGEgaXMgZm91bmQgdGhlbiB3ZSBtdXN0IGJlIHRyeWluZyB0byBiaW5kIHRvIG9uZSBvZiB0aGUKCQkvLyBiYW5uZWQgbm9EYXRhIGVsZW1lbnRzCgkJaWYgKCAhZWxlbURhdGEgKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMsCgkJCWV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlOwoKCQlpZiAoICFldmVudHMgKSB7CgkJCWVsZW1EYXRhLmV2ZW50cyA9IGV2ZW50cyA9IHt9OwoJCX0KCgkJaWYgKCAhZXZlbnRIYW5kbGUgKSB7CgkJCWVsZW1EYXRhLmhhbmRsZSA9IGV2ZW50SGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7CgkJCQkvLyBEaXNjYXJkIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSBqUXVlcnkuZXZlbnQudHJpZ2dlcigpIGFuZAoJCQkJLy8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZAoJCQkJcmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09ICJ1bmRlZmluZWQiICYmICghZSB8fCBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUpID8KCQkJCQlqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KCBldmVudEhhbmRsZS5lbGVtLCBhcmd1bWVudHMgKSA6CgkJCQkJdW5kZWZpbmVkOwoJCQl9OwoJCX0KCgkJLy8gQWRkIGVsZW0gYXMgYSBwcm9wZXJ0eSBvZiB0aGUgaGFuZGxlIGZ1bmN0aW9uCgkJLy8gVGhpcyBpcyB0byBwcmV2ZW50IGEgbWVtb3J5IGxlYWsgd2l0aCBub24tbmF0aXZlIGV2ZW50cyBpbiBJRS4KCQlldmVudEhhbmRsZS5lbGVtID0gZWxlbTsKCgkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZQoJCS8vIGpRdWVyeSguLi4pLmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKCQl0eXBlcyA9IHR5cGVzLnNwbGl0KCIgIik7CgoJCXZhciB0eXBlLCBpID0gMCwgbmFtZXNwYWNlczsKCgkJd2hpbGUgKCAodHlwZSA9IHR5cGVzWyBpKysgXSkgKSB7CgkJCWhhbmRsZU9iaiA9IGhhbmRsZU9iakluID8KCQkJCWpRdWVyeS5leHRlbmQoe30sIGhhbmRsZU9iakluKSA6CgkJCQl7IGhhbmRsZXI6IGhhbmRsZXIsIGRhdGE6IGRhdGEgfTsKCgkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKCQkJaWYgKCB0eXBlLmluZGV4T2YoIi4iKSA+IC0xICkgewoJCQkJbmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIi4iKTsKCQkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCQloYW5kbGVPYmoubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5zbGljZSgwKS5zb3J0KCkuam9pbigiLiIpOwoKCQkJfSBlbHNlIHsKCQkJCW5hbWVzcGFjZXMgPSBbXTsKCQkJCWhhbmRsZU9iai5uYW1lc3BhY2UgPSAiIjsKCQkJfQoKCQkJaGFuZGxlT2JqLnR5cGUgPSB0eXBlOwoJCQlpZiAoICFoYW5kbGVPYmouZ3VpZCApIHsKCQkJCWhhbmRsZU9iai5ndWlkID0gaGFuZGxlci5ndWlkOwoJCQl9CgoJCQkvLyBHZXQgdGhlIGN1cnJlbnQgbGlzdCBvZiBmdW5jdGlvbnMgYm91bmQgdG8gdGhpcyBldmVudAoJCQl2YXIgaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSwKCQkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJLy8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZQoJCQlpZiAoICFoYW5kbGVycyApIHsKCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKCgkJCQkvLyBDaGVjayBmb3IgYSBzcGVjaWFsIGV2ZW50IGhhbmRsZXIKCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNoRXZlbnQgaWYgdGhlIHNwZWNpYWwKCQkJCS8vIGV2ZW50cyBoYW5kbGVyIHJldHVybnMgZmFsc2UKCQkJCWlmICggIXNwZWNpYWwuc2V0dXAgfHwgc3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHsKCQkJCQkvLyBCaW5kIHRoZSBnbG9iYWwgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxlbWVudAoJCQkJCWlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgewoJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlLCBmYWxzZSApOwoKCQkJCQl9IGVsc2UgaWYgKCBlbGVtLmF0dGFjaEV2ZW50ICkgewoJCQkJCQllbGVtLmF0dGFjaEV2ZW50KCAib24iICsgdHlwZSwgZXZlbnRIYW5kbGUgKTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWlmICggc3BlY2lhbC5hZGQgKSB7CgkJCQlzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKCgkJCQlpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkgewoJCQkJCWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7CgkJCQl9CgkJCX0KCgkJCS8vIEFkZCB0aGUgZnVuY3Rpb24gdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QKCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgoJCQkvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGJlZW4gdXNlZCwgZm9yIGV2ZW50IG9wdGltaXphdGlvbgoJCQlqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlOwoJCX0KCgkJLy8gTnVsbGlmeSBlbGVtIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzIGluIElFCgkJZWxlbSA9IG51bGw7Cgl9LAoKCWdsb2JhbDoge30sCgoJLy8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50CglyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgcG9zICkgewoJCS8vIGRvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggaGFuZGxlciA9PT0gZmFsc2UgKSB7CgkJCWhhbmRsZXIgPSByZXR1cm5GYWxzZTsKCQl9CgoJCXZhciByZXQsIHR5cGUsIGZuLCBqLCBpID0gMCwgYWxsLCBuYW1lc3BhY2VzLCBuYW1lc3BhY2UsIHNwZWNpYWwsIGV2ZW50VHlwZSwgaGFuZGxlT2JqLCBvcmlnVHlwZSwKCQkJZWxlbURhdGEgPSBqUXVlcnkuaGFzRGF0YSggZWxlbSApICYmIGpRdWVyeS5fZGF0YSggZWxlbSApLAoJCQlldmVudHMgPSBlbGVtRGF0YSAmJiBlbGVtRGF0YS5ldmVudHM7CgoJCWlmICggIWVsZW1EYXRhIHx8ICFldmVudHMgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIHR5cGVzIGlzIGFjdHVhbGx5IGFuIGV2ZW50IG9iamVjdCBoZXJlCgkJaWYgKCB0eXBlcyAmJiB0eXBlcy50eXBlICkgewoJCQloYW5kbGVyID0gdHlwZXMuaGFuZGxlcjsKCQkJdHlwZXMgPSB0eXBlcy50eXBlOwoJCX0KCgkJLy8gVW5iaW5kIGFsbCBldmVudHMgZm9yIHRoZSBlbGVtZW50CgkJaWYgKCAhdHlwZXMgfHwgdHlwZW9mIHR5cGVzID09PSAic3RyaW5nIiAmJiB0eXBlcy5jaGFyQXQoMCkgPT09ICIuIiApIHsKCQkJdHlwZXMgPSB0eXBlcyB8fCAiIjsKCgkJCWZvciAoIHR5cGUgaW4gZXZlbnRzICkgewoJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzICk7CgkJCX0KCgkJCXJldHVybjsKCQl9CgoJCS8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UKCQkvLyBqUXVlcnkoLi4uKS51bmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKCQl0eXBlcyA9IHR5cGVzLnNwbGl0KCIgIik7CgoJCXdoaWxlICggKHR5cGUgPSB0eXBlc1sgaSsrIF0pICkgewoJCQlvcmlnVHlwZSA9IHR5cGU7CgkJCWhhbmRsZU9iaiA9IG51bGw7CgkJCWFsbCA9IHR5cGUuaW5kZXhPZigiLiIpIDwgMDsKCQkJbmFtZXNwYWNlcyA9IFtdOwoKCQkJaWYgKCAhYWxsICkgewoJCQkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVycwoJCQkJbmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIi4iKTsKCQkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgoJCQkJbmFtZXNwYWNlID0gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKwoJCQkJCWpRdWVyeS5tYXAoIG5hbWVzcGFjZXMuc2xpY2UoMCkuc29ydCgpLCBmY2xlYW51cCApLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSArICIoXFwufCQpIik7CgkJCX0KCgkJCWV2ZW50VHlwZSA9IGV2ZW50c1sgdHlwZSBdOwoKCQkJaWYgKCAhZXZlbnRUeXBlICkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmICggIWhhbmRsZXIgKSB7CgkJCQlmb3IgKCBqID0gMDsgaiA8IGV2ZW50VHlwZS5sZW5ndGg7IGorKyApIHsKCQkJCQloYW5kbGVPYmogPSBldmVudFR5cGVbIGogXTsKCgkJCQkJaWYgKCBhbGwgfHwgbmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKCQkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgb3JpZ1R5cGUsIGhhbmRsZU9iai5oYW5kbGVyLCBqICk7CgkJCQkJCWV2ZW50VHlwZS5zcGxpY2UoIGotLSwgMSApOwoJCQkJCX0KCQkJCX0KCgkJCQljb250aW51ZTsKCQkJfQoKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQlmb3IgKCBqID0gcG9zIHx8IDA7IGogPCBldmVudFR5cGUubGVuZ3RoOyBqKysgKSB7CgkJCQloYW5kbGVPYmogPSBldmVudFR5cGVbIGogXTsKCgkJCQlpZiAoIGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSB7CgkJCQkJLy8gcmVtb3ZlIHRoZSBnaXZlbiBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gdHlwZQoJCQkJCWlmICggYWxsIHx8IG5hbWVzcGFjZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7CgkJCQkJCWlmICggcG9zID09IG51bGwgKSB7CgkJCQkJCQlldmVudFR5cGUuc3BsaWNlKCBqLS0sIDEgKTsKCQkJCQkJfQoKCQkJCQkJaWYgKCBzcGVjaWFsLnJlbW92ZSApIHsKCQkJCQkJCXNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQlpZiAoIHBvcyAhPSBudWxsICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIHJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgbm8gbW9yZSBoYW5kbGVycyBleGlzdAoJCQlpZiAoIGV2ZW50VHlwZS5sZW5ndGggPT09IDAgfHwgcG9zICE9IG51bGwgJiYgZXZlbnRUeXBlLmxlbmd0aCA9PT0gMSApIHsKCQkJCWlmICggIXNwZWNpYWwudGVhcmRvd24gfHwgc3BlY2lhbC50ZWFyZG93bi5jYWxsKCBlbGVtLCBuYW1lc3BhY2VzICkgPT09IGZhbHNlICkgewoJCQkJCWpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7CgkJCQl9CgoJCQkJcmV0ID0gbnVsbDsKCQkJCWRlbGV0ZSBldmVudHNbIHR5cGUgXTsKCQkJfQoJCX0KCgkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWQKCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHsKCQkJdmFyIGhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZTsKCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQloYW5kbGUuZWxlbSA9IG51bGw7CgkJCX0KCgkJCWRlbGV0ZSBlbGVtRGF0YS5ldmVudHM7CgkJCWRlbGV0ZSBlbGVtRGF0YS5oYW5kbGU7CgoJCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBlbGVtRGF0YSApICkgewoJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sIHVuZGVmaW5lZCwgdHJ1ZSApOwoJCQl9CgkJfQoJfSwKCQoJLy8gRXZlbnRzIHRoYXQgYXJlIHNhZmUgdG8gc2hvcnQtY2lyY3VpdCBpZiBubyBoYW5kbGVycyBhcmUgYXR0YWNoZWQuCgkvLyBOYXRpdmUgRE9NIGV2ZW50cyBzaG91bGQgbm90IGJlIGFkZGVkLCB0aGV5IG1heSBoYXZlIGlubGluZSBoYW5kbGVycy4KCWN1c3RvbUV2ZW50OiB7CgkJImdldERhdGEiOiB0cnVlLAoJCSJzZXREYXRhIjogdHJ1ZSwKCQkiY2hhbmdlRGF0YSI6IHRydWUKCX0sCgoJdHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7CgkJLy8gRXZlbnQgb2JqZWN0IG9yIGV2ZW50IHR5cGUKCQl2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgZXZlbnQsCgkJCW5hbWVzcGFjZXMgPSBbXSwKCQkJZXhjbHVzaXZlOwoKCQlpZiAoIHR5cGUuaW5kZXhPZigiISIpID49IDAgKSB7CgkJCS8vIEV4Y2x1c2l2ZSBldmVudHMgdHJpZ2dlciBvbmx5IGZvciB0aGUgZXhhY3QgZXZlbnQgKG5vIG5hbWVzcGFjZXMpCgkJCXR5cGUgPSB0eXBlLnNsaWNlKDAsIC0xKTsKCQkJZXhjbHVzaXZlID0gdHJ1ZTsKCQl9CgoJCWlmICggdHlwZS5pbmRleE9mKCIuIikgPj0gMCApIHsKCQkJLy8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKQoJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCgiLiIpOwoJCQl0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOwoJCQluYW1lc3BhY2VzLnNvcnQoKTsKCQl9CgoJCWlmICggKCFlbGVtIHx8IGpRdWVyeS5ldmVudC5jdXN0b21FdmVudFsgdHlwZSBdKSAmJiAhalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdICkgewoJCQkvLyBObyBqUXVlcnkgaGFuZGxlcnMgZm9yIHRoaXMgZXZlbnQgdHlwZSwgYW5kIGl0IGNhbid0IGhhdmUgaW5saW5lIGhhbmRsZXJzCgkJCXJldHVybjsKCQl9CgoJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBFdmVudCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nCgkJZXZlbnQgPSB0eXBlb2YgZXZlbnQgPT09ICJvYmplY3QiID8KCQkJLy8galF1ZXJ5LkV2ZW50IG9iamVjdAoJCQlldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/IGV2ZW50IDoKCQkJLy8gT2JqZWN0IGxpdGVyYWwKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgZXZlbnQgKSA6CgkJCS8vIEp1c3QgdGhlIGV2ZW50IHR5cGUgKHN0cmluZykKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSApOwoKCQlldmVudC50eXBlID0gdHlwZTsKCQlldmVudC5leGNsdXNpdmUgPSBleGNsdXNpdmU7CgkJZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCIuIik7CgkJZXZlbnQubmFtZXNwYWNlX3JlID0gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBuYW1lc3BhY2VzLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSArICIoXFwufCQpIik7CgkJCgkJLy8gdHJpZ2dlckhhbmRsZXIoKSBhbmQgZ2xvYmFsIGV2ZW50cyBkb24ndCBidWJibGUgb3IgcnVuIHRoZSBkZWZhdWx0IGFjdGlvbgoJCWlmICggb25seUhhbmRsZXJzIHx8ICFlbGVtICkgewoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQl9CgoJCS8vIEhhbmRsZSBhIGdsb2JhbCB0cmlnZ2VyCgkJaWYgKCAhZWxlbSApIHsKCQkJLy8gVE9ETzogU3RvcCB0YXVudGluZyB0aGUgZGF0YSBjYWNoZTsgcmVtb3ZlIGdsb2JhbCBldmVudHMgYW5kIGFsd2F5cyBhdHRhY2ggdG8gZG9jdW1lbnQKCQkJalF1ZXJ5LmVhY2goIGpRdWVyeS5jYWNoZSwgZnVuY3Rpb24oKSB7CgkJCQkvLyBpbnRlcm5hbEtleSB2YXJpYWJsZSBpcyBqdXN0IHVzZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZmluZAoJCQkJLy8gYW5kIHBvdGVudGlhbGx5IGNoYW5nZSB0aGlzIHN0dWZmIGxhdGVyOyBjdXJyZW50bHkgaXQganVzdAoJCQkJLy8gcG9pbnRzIHRvIGpRdWVyeS5leHBhbmRvCgkJCQl2YXIgaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywKCQkJCQlpbnRlcm5hbENhY2hlID0gdGhpc1sgaW50ZXJuYWxLZXkgXTsKCQkJCWlmICggaW50ZXJuYWxDYWNoZSAmJiBpbnRlcm5hbENhY2hlLmV2ZW50cyAmJiBpbnRlcm5hbENhY2hlLmV2ZW50c1sgdHlwZSBdICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgaW50ZXJuYWxDYWNoZS5oYW5kbGUuZWxlbSApOwoJCQkJfQoJCQl9KTsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gRG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCgkJZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOwoJCWV2ZW50LnRhcmdldCA9IGVsZW07CgoJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKCQlkYXRhID0gZGF0YSAhPSBudWxsID8galF1ZXJ5Lm1ha2VBcnJheSggZGF0YSApIDogW107CgkJZGF0YS51bnNoaWZ0KCBldmVudCApOwoKCQl2YXIgY3VyID0gZWxlbSwKCQkJLy8gSUUgZG9lc24ndCBsaWtlIG1ldGhvZCBuYW1lcyB3aXRoIGEgY29sb24gKCMzNTMzLCAjODI3MikKCQkJb250eXBlID0gdHlwZS5pbmRleE9mKCI6IikgPCAwID8gIm9uIiArIHR5cGUgOiAiIjsKCgkJLy8gRmlyZSBldmVudCBvbiB0aGUgY3VycmVudCBlbGVtZW50LCB0aGVuIGJ1YmJsZSB1cCB0aGUgRE9NIHRyZWUKCQlkbyB7CgkJCXZhciBoYW5kbGUgPSBqUXVlcnkuX2RhdGEoIGN1ciwgImhhbmRsZSIgKTsKCgkJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBjdXI7CgkJCWlmICggaGFuZGxlICkgewoJCQkJaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKCQkJfQoKCQkJLy8gVHJpZ2dlciBhbiBpbmxpbmUgYm91bmQgc2NyaXB0CgkJCWlmICggb250eXBlICYmIGpRdWVyeS5hY2NlcHREYXRhKCBjdXIgKSAmJiBjdXJbIG9udHlwZSBdICYmIGN1clsgb250eXBlIF0uYXBwbHkoIGN1ciwgZGF0YSApID09PSBmYWxzZSApIHsKCQkJCWV2ZW50LnJlc3VsdCA9IGZhbHNlOwoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJfQoKCQkJLy8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdwoJCQljdXIgPSBjdXIucGFyZW50Tm9kZSB8fCBjdXIub3duZXJEb2N1bWVudCB8fCBjdXIgPT09IGV2ZW50LnRhcmdldC5vd25lckRvY3VtZW50ICYmIHdpbmRvdzsKCQl9IHdoaWxlICggY3VyICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICk7CgoJCS8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3cKCQlpZiAoICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCQkJdmFyIG9sZCwKCQkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJaWYgKCAoIXNwZWNpYWwuX2RlZmF1bHQgfHwgc3BlY2lhbC5fZGVmYXVsdC5jYWxsKCBlbGVtLm93bmVyRG9jdW1lbnQsIGV2ZW50ICkgPT09IGZhbHNlKSAmJgoJCQkJISh0eXBlID09PSAiY2xpY2siICYmIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImEiICkpICYmIGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7CgoJCQkJLy8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIG5hbWUgYXMgdGhlIGV2ZW50LgoJCQkJLy8gQ2FuJ3QgdXNlIGFuIC5pc0Z1bmN0aW9uKSgpIGNoZWNrIGhlcmUgYmVjYXVzZSBJRTYvNyBmYWlscyB0aGF0IHRlc3QuCgkJCQkvLyBJRTw5IGRpZXMgb24gZm9jdXMgdG8gaGlkZGVuIGVsZW1lbnQgKCMxNDg2KSwgbWF5IHdhbnQgdG8gcmV2aXNpdCBhIHRyeS9jYXRjaC4KCQkJCXRyeSB7CgkJCQkJaWYgKCBvbnR5cGUgJiYgZWxlbVsgdHlwZSBdICkgewoJCQkJCQkvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kCgkJCQkJCW9sZCA9IGVsZW1bIG9udHlwZSBdOwoKCQkJCQkJaWYgKCBvbGQgKSB7CgkJCQkJCQllbGVtWyBvbnR5cGUgXSA9IG51bGw7CgkJCQkJCX0KCgkJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlOwoJCQkJCQllbGVtWyB0eXBlIF0oKTsKCQkJCQl9CgkJCQl9IGNhdGNoICggaWVFcnJvciApIHt9CgoJCQkJaWYgKCBvbGQgKSB7CgkJCQkJZWxlbVsgb250eXBlIF0gPSBvbGQ7CgkJCQl9CgoJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDsKCQkJfQoJCX0KCQkKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgloYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQlldmVudCA9IGpRdWVyeS5ldmVudC5maXgoIGV2ZW50IHx8IHdpbmRvdy5ldmVudCApOwoJCS8vIFNuYXBzaG90IHRoZSBoYW5kbGVycyBsaXN0IHNpbmNlIGEgY2FsbGVkIGhhbmRsZXIgbWF5IGFkZC9yZW1vdmUgZXZlbnRzLgoJCXZhciBoYW5kbGVycyA9ICgoalF1ZXJ5Ll9kYXRhKCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9KVsgZXZlbnQudHlwZSBdIHx8IFtdKS5zbGljZSgwKSwKCQkJcnVuX2FsbCA9ICFldmVudC5leGNsdXNpdmUgJiYgIWV2ZW50Lm5hbWVzcGFjZSwKCQkJYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMsIDAgKTsKCgkJLy8gVXNlIHRoZSBmaXgtZWQgRXZlbnQgcmF0aGVyIHRoYW4gdGhlIChyZWFkLW9ubHkpIG5hdGl2ZSBldmVudAoJCWFyZ3NbMF0gPSBldmVudDsKCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gdGhpczsKCgkJZm9yICggdmFyIGogPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoOyBqIDwgbDsgaisrICkgewoJCQl2YXIgaGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTsKCgkJCS8vIFRyaWdnZXJlZCBldmVudCBtdXN0IDEpIGJlIG5vbi1leGNsdXNpdmUgYW5kIGhhdmUgbm8gbmFtZXNwYWNlLCBvcgoJCQkvLyAyKSBoYXZlIG5hbWVzcGFjZShzKSBhIHN1YnNldCBvciBlcXVhbCB0byB0aG9zZSBpbiB0aGUgYm91bmQgZXZlbnQuCgkJCWlmICggcnVuX2FsbCB8fCBldmVudC5uYW1lc3BhY2VfcmUudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgewoJCQkJLy8gUGFzcyBpbiBhIHJlZmVyZW5jZSB0byB0aGUgaGFuZGxlciBmdW5jdGlvbiBpdHNlbGYKCQkJCS8vIFNvIHRoYXQgd2UgY2FuIGxhdGVyIHJlbW92ZSBpdAoJCQkJZXZlbnQuaGFuZGxlciA9IGhhbmRsZU9iai5oYW5kbGVyOwoJCQkJZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhOwoJCQkJZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOwoKCQkJCXZhciByZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJncyApOwoKCQkJCWlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJZXZlbnQucmVzdWx0ID0gcmV0OwoJCQkJCWlmICggcmV0ID09PSBmYWxzZSApIHsKCQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCQkJZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCglwcm9wczogImFsdEtleSBhdHRyQ2hhbmdlIGF0dHJOYW1lIGJ1YmJsZXMgYnV0dG9uIGNhbmNlbGFibGUgY2hhckNvZGUgY2xpZW50WCBjbGllbnRZIGN0cmxLZXkgY3VycmVudFRhcmdldCBkYXRhIGRldGFpbCBldmVudFBoYXNlIGZyb21FbGVtZW50IGhhbmRsZXIga2V5Q29kZSBsYXllclggbGF5ZXJZIG1ldGFLZXkgbmV3VmFsdWUgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHByZXZWYWx1ZSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNjcmVlblggc2NyZWVuWSBzaGlmdEtleSBzcmNFbGVtZW50IHRhcmdldCB0b0VsZW1lbnQgdmlldyB3aGVlbERlbHRhIHdoaWNoIi5zcGxpdCgiICIpLAoKCWZpeDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCWlmICggZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gKSB7CgkJCXJldHVybiBldmVudDsKCQl9CgoJCS8vIHN0b3JlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0CgkJLy8gYW5kICJjbG9uZSIgdG8gc2V0IHJlYWQtb25seSBwcm9wZXJ0aWVzCgkJdmFyIG9yaWdpbmFsRXZlbnQgPSBldmVudDsKCQlldmVudCA9IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApOwoKCQlmb3IgKCB2YXIgaSA9IHRoaXMucHJvcHMubGVuZ3RoLCBwcm9wOyBpOyApIHsKCQkJcHJvcCA9IHRoaXMucHJvcHNbIC0taSBdOwoJCQlldmVudFsgcHJvcCBdID0gb3JpZ2luYWxFdmVudFsgcHJvcCBdOwoJCX0KCgkJLy8gRml4IHRhcmdldCBwcm9wZXJ0eSwgaWYgbmVjZXNzYXJ5CgkJaWYgKCAhZXZlbnQudGFyZ2V0ICkgewoJCQkvLyBGaXhlcyAjMTkyNSB3aGVyZSBzcmNFbGVtZW50IG1pZ2h0IG5vdCBiZSBkZWZpbmVkIGVpdGhlcgoJCQlldmVudC50YXJnZXQgPSBldmVudC5zcmNFbGVtZW50IHx8IGRvY3VtZW50OwoJCX0KCgkJLy8gY2hlY2sgaWYgdGFyZ2V0IGlzIGEgdGV4dG5vZGUgKHNhZmFyaSkKCQlpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0gMyApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7CgkJfQoKCQkvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5CgkJaWYgKCAhZXZlbnQucmVsYXRlZFRhcmdldCAmJiBldmVudC5mcm9tRWxlbWVudCApIHsKCQkJZXZlbnQucmVsYXRlZFRhcmdldCA9IGV2ZW50LmZyb21FbGVtZW50ID09PSBldmVudC50YXJnZXQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDsKCQl9CgoJCS8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGUKCQlpZiAoIGV2ZW50LnBhZ2VYID09IG51bGwgJiYgZXZlbnQuY2xpZW50WCAhPSBudWxsICkgewoJCQl2YXIgZXZlbnREb2N1bWVudCA9IGV2ZW50LnRhcmdldC5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50LAoJCQkJZG9jID0gZXZlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCgkJCQlib2R5ID0gZXZlbnREb2N1bWVudC5ib2R5OwoKCQkJZXZlbnQucGFnZVggPSBldmVudC5jbGllbnRYICsgKGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwKSAtIChkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCk7CgkJCWV2ZW50LnBhZ2VZID0gZXZlbnQuY2xpZW50WSArIChkb2MgJiYgZG9jLnNjcm9sbFRvcCAgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCAgfHwgMCkgLSAoZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDApOwoJCX0KCgkJLy8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzCgkJaWYgKCBldmVudC53aGljaCA9PSBudWxsICYmIChldmVudC5jaGFyQ29kZSAhPSBudWxsIHx8IGV2ZW50LmtleUNvZGUgIT0gbnVsbCkgKSB7CgkJCWV2ZW50LndoaWNoID0gZXZlbnQuY2hhckNvZGUgIT0gbnVsbCA/IGV2ZW50LmNoYXJDb2RlIDogZXZlbnQua2V5Q29kZTsKCQl9CgoJCS8vIEFkZCBtZXRhS2V5IHRvIG5vbi1NYWMgYnJvd3NlcnMgKHVzZSBjdHJsIGZvciBQQydzIGFuZCBNZXRhIGZvciBNYWNzKQoJCWlmICggIWV2ZW50Lm1ldGFLZXkgJiYgZXZlbnQuY3RybEtleSApIHsKCQkJZXZlbnQubWV0YUtleSA9IGV2ZW50LmN0cmxLZXk7CgkJfQoKCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CgkJLy8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyBkb24ndCB1c2UgaXQKCQlpZiAoICFldmVudC53aGljaCAmJiBldmVudC5idXR0b24gIT09IHVuZGVmaW5lZCApIHsKCQkJZXZlbnQud2hpY2ggPSAoZXZlbnQuYnV0dG9uICYgMSA/IDEgOiAoIGV2ZW50LmJ1dHRvbiAmIDIgPyAzIDogKCBldmVudC5idXR0b24gJiA0ID8gMiA6IDAgKSApKTsKCQl9CgoJCXJldHVybiBldmVudDsKCX0sCgoJLy8gRGVwcmVjYXRlZCwgdXNlIGpRdWVyeS5ndWlkIGluc3RlYWQKCWd1aWQ6IDFFOCwKCgkvLyBEZXByZWNhdGVkLCB1c2UgalF1ZXJ5LnByb3h5IGluc3RlYWQKCXByb3h5OiBqUXVlcnkucHJveHksCgoJc3BlY2lhbDogewoJCXJlYWR5OiB7CgkJCS8vIE1ha2Ugc3VyZSB0aGUgcmVhZHkgZXZlbnQgaXMgc2V0dXAKCQkJc2V0dXA6IGpRdWVyeS5iaW5kUmVhZHksCgkJCXRlYXJkb3duOiBqUXVlcnkubm9vcAoJCX0sCgoJCWxpdmU6IHsKCQkJYWRkOiBmdW5jdGlvbiggaGFuZGxlT2JqICkgewoJCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywKCQkJCQlsaXZlQ29udmVydCggaGFuZGxlT2JqLm9yaWdUeXBlLCBoYW5kbGVPYmouc2VsZWN0b3IgKSwKCQkJCQlqUXVlcnkuZXh0ZW5kKHt9LCBoYW5kbGVPYmosIHtoYW5kbGVyOiBsaXZlSGFuZGxlciwgZ3VpZDogaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZH0pICk7CgkJCX0sCgoJCQlyZW1vdmU6IGZ1bmN0aW9uKCBoYW5kbGVPYmogKSB7CgkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCBsaXZlQ29udmVydCggaGFuZGxlT2JqLm9yaWdUeXBlLCBoYW5kbGVPYmouc2VsZWN0b3IgKSwgaGFuZGxlT2JqICk7CgkJCX0KCQl9LAoKCQliZWZvcmV1bmxvYWQ6IHsKCQkJc2V0dXA6IGZ1bmN0aW9uKCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApIHsKCQkJCS8vIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIHNwZWNpYWwgY2FzZSBvbiB3aW5kb3dzCgkJCQlpZiAoIGpRdWVyeS5pc1dpbmRvdyggdGhpcyApICkgewoJCQkJCXRoaXMub25iZWZvcmV1bmxvYWQgPSBldmVudEhhbmRsZTsKCQkJCX0KCQkJfSwKCgkJCXRlYXJkb3duOiBmdW5jdGlvbiggbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSB7CgkJCQlpZiAoIHRoaXMub25iZWZvcmV1bmxvYWQgPT09IGV2ZW50SGFuZGxlICkgewoJCQkJCXRoaXMub25iZWZvcmV1bmxvYWQgPSBudWxsOwoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKalF1ZXJ5LnJlbW92ZUV2ZW50ID0gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciA/CglmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkgewoJCWlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkgewoJCQllbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSwgZmFsc2UgKTsKCQl9Cgl9IDoKCWZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7CgkJaWYgKCBlbGVtLmRldGFjaEV2ZW50ICkgewoJCQllbGVtLmRldGFjaEV2ZW50KCAib24iICsgdHlwZSwgaGFuZGxlICk7CgkJfQoJfTsKCmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkgewoJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCglpZiAoICF0aGlzLnByZXZlbnREZWZhdWx0ICkgewoJCXJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7Cgl9CgoJLy8gRXZlbnQgb2JqZWN0CglpZiAoIHNyYyAmJiBzcmMudHlwZSApIHsKCQl0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7CgkJdGhpcy50eXBlID0gc3JjLnR5cGU7CgoJCS8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkCgkJLy8gYnkgYSBoYW5kbGVyIGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuCgkJdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSAoc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwgc3JjLnJldHVyblZhbHVlID09PSBmYWxzZSB8fAoJCQlzcmMuZ2V0UHJldmVudERlZmF1bHQgJiYgc3JjLmdldFByZXZlbnREZWZhdWx0KCkpID8gcmV0dXJuVHJ1ZSA6IHJldHVybkZhbHNlOwoKCS8vIEV2ZW50IHR5cGUKCX0gZWxzZSB7CgkJdGhpcy50eXBlID0gc3JjOwoJfQoKCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CglpZiAoIHByb3BzICkgewoJCWpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7Cgl9CgoJLy8gdGltZVN0YW1wIGlzIGJ1Z2d5IGZvciBzb21lIGV2ZW50cyBvbiBGaXJlZm94KCMzODQzKQoJLy8gU28gd2Ugd29uJ3QgcmVseSBvbiB0aGUgbmF0aXZlIHZhbHVlCgl0aGlzLnRpbWVTdGFtcCA9IGpRdWVyeS5ub3coKTsKCgkvLyBNYXJrIGl0IGFzIGZpeGVkCgl0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTsKfTsKCmZ1bmN0aW9uIHJldHVybkZhbHNlKCkgewoJcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIHJldHVyblRydWUoKSB7CglyZXR1cm4gdHJ1ZTsKfQoKLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbApqUXVlcnkuRXZlbnQucHJvdG90eXBlID0gewoJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgkJaWYgKCAhZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gaWYgcHJldmVudERlZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKCQlpZiAoIGUucHJldmVudERlZmF1bHQgKSB7CgkJCWUucHJldmVudERlZmF1bHQoKTsKCgkJLy8gb3RoZXJ3aXNlIHNldCB0aGUgcmV0dXJuVmFsdWUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIGZhbHNlIChJRSkKCQl9IGVsc2UgewoJCQllLnJldHVyblZhbHVlID0gZmFsc2U7CgkJfQoJfSwKCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7CgoJCXZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OwoJCWlmICggIWUgKSB7CgkJCXJldHVybjsKCQl9CgkJLy8gaWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CgkJaWYgKCBlLnN0b3BQcm9wYWdhdGlvbiApIHsKCQkJZS5zdG9wUHJvcGFnYXRpb24oKTsKCQl9CgkJLy8gb3RoZXJ3aXNlIHNldCB0aGUgY2FuY2VsQnViYmxlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byB0cnVlIChJRSkKCQllLmNhbmNlbEJ1YmJsZSA9IHRydWU7Cgl9LAoJc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsKCQl0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwoJfSwKCWlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsCglpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsCglpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UKfTsKCi8vIENoZWNrcyBpZiBhbiBldmVudCBoYXBwZW5lZCBvbiBhbiBlbGVtZW50IHdpdGhpbiBhbm90aGVyIGVsZW1lbnQKLy8gVXNlZCBpbiBqUXVlcnkuZXZlbnQuc3BlY2lhbC5tb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlIGhhbmRsZXJzCnZhciB3aXRoaW5FbGVtZW50ID0gZnVuY3Rpb24oIGV2ZW50ICkgewoKCS8vIENoZWNrIGlmIG1vdXNlKG92ZXJ8b3V0KSBhcmUgc3RpbGwgd2l0aGluIHRoZSBzYW1lIHBhcmVudCBlbGVtZW50Cgl2YXIgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQsCgkJaW5zaWRlID0gZmFsc2UsCgkJZXZlbnRUeXBlID0gZXZlbnQudHlwZTsKCglldmVudC50eXBlID0gZXZlbnQuZGF0YTsKCglpZiAoIHJlbGF0ZWQgIT09IHRoaXMgKSB7CgoJCWlmICggcmVsYXRlZCApIHsKCQkJaW5zaWRlID0galF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCByZWxhdGVkICk7CgkJfQoKCQlpZiAoICFpbnNpZGUgKSB7CgoJCQlqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCgkJCWV2ZW50LnR5cGUgPSBldmVudFR5cGU7CgkJfQoJfQp9LAoKLy8gSW4gY2FzZSBvZiBldmVudCBkZWxlZ2F0aW9uLCB3ZSBvbmx5IG5lZWQgdG8gcmVuYW1lIHRoZSBldmVudC50eXBlLAovLyBsaXZlSGFuZGxlciB3aWxsIHRha2UgY2FyZSBvZiB0aGUgcmVzdC4KZGVsZWdhdGUgPSBmdW5jdGlvbiggZXZlbnQgKSB7CglldmVudC50eXBlID0gZXZlbnQuZGF0YTsKCWpRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwp9OwoKLy8gQ3JlYXRlIG1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgZXZlbnRzCmpRdWVyeS5lYWNoKHsKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0Igp9LCBmdW5jdGlvbiggb3JpZywgZml4ICkgewoJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHsKCQlzZXR1cDogZnVuY3Rpb24oIGRhdGEgKSB7CgkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIGZpeCwgZGF0YSAmJiBkYXRhLnNlbGVjdG9yID8gZGVsZWdhdGUgOiB3aXRoaW5FbGVtZW50LCBvcmlnICk7CgkJfSwKCQl0ZWFyZG93bjogZnVuY3Rpb24oIGRhdGEgKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIGZpeCwgZGF0YSAmJiBkYXRhLnNlbGVjdG9yID8gZGVsZWdhdGUgOiB3aXRoaW5FbGVtZW50ICk7CgkJfQoJfTsKfSk7CgovLyBzdWJtaXQgZGVsZWdhdGlvbgppZiAoICFqUXVlcnkuc3VwcG9ydC5zdWJtaXRCdWJibGVzICkgewoKCWpRdWVyeS5ldmVudC5zcGVjaWFsLnN1Ym1pdCA9IHsKCQlzZXR1cDogZnVuY3Rpb24oIGRhdGEsIG5hbWVzcGFjZXMgKSB7CgkJCWlmICggIWpRdWVyeS5ub2RlTmFtZSggdGhpcywgImZvcm0iICkgKSB7CgkJCQlqUXVlcnkuZXZlbnQuYWRkKHRoaXMsICJjbGljay5zcGVjaWFsU3VibWl0IiwgZnVuY3Rpb24oIGUgKSB7CgkJCQkJdmFyIGVsZW0gPSBlLnRhcmdldCwKCQkJCQkJdHlwZSA9IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApID8gZWxlbS50eXBlIDogIiI7CgoJCQkJCWlmICggKHR5cGUgPT09ICJzdWJtaXQiIHx8IHR5cGUgPT09ICJpbWFnZSIpICYmIGpRdWVyeSggZWxlbSApLmNsb3Nlc3QoImZvcm0iKS5sZW5ndGggKSB7CgkJCQkJCXRyaWdnZXIoICJzdWJtaXQiLCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCQl9CgkJCQl9KTsKCgkJCQlqUXVlcnkuZXZlbnQuYWRkKHRoaXMsICJrZXlwcmVzcy5zcGVjaWFsU3VibWl0IiwgZnVuY3Rpb24oIGUgKSB7CgkJCQkJdmFyIGVsZW0gPSBlLnRhcmdldCwKCQkJCQkJdHlwZSA9IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApID8gZWxlbS50eXBlIDogIiI7CgoJCQkJCWlmICggKHR5cGUgPT09ICJ0ZXh0IiB8fCB0eXBlID09PSAicGFzc3dvcmQiKSAmJiBqUXVlcnkoIGVsZW0gKS5jbG9zZXN0KCJmb3JtIikubGVuZ3RoICYmIGUua2V5Q29kZSA9PT0gMTMgKSB7CgkJCQkJCXRyaWdnZXIoICJzdWJtaXQiLCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCQl9CgkJCQl9KTsKCgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9LAoKCQl0ZWFyZG93bjogZnVuY3Rpb24oIG5hbWVzcGFjZXMgKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuc3BlY2lhbFN1Ym1pdCIgKTsKCQl9Cgl9OwoKfQoKLy8gY2hhbmdlIGRlbGVnYXRpb24sIGhhcHBlbnMgaGVyZSBzbyB3ZSBoYXZlIGJpbmQuCmlmICggIWpRdWVyeS5zdXBwb3J0LmNoYW5nZUJ1YmJsZXMgKSB7CgoJdmFyIGNoYW5nZUZpbHRlcnMsCgoJZ2V0VmFsID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHR5cGUgPSBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSA/IGVsZW0udHlwZSA6ICIiLAoJCQl2YWwgPSBlbGVtLnZhbHVlOwoKCQlpZiAoIHR5cGUgPT09ICJyYWRpbyIgfHwgdHlwZSA9PT0gImNoZWNrYm94IiApIHsKCQkJdmFsID0gZWxlbS5jaGVja2VkOwoKCQl9IGVsc2UgaWYgKCB0eXBlID09PSAic2VsZWN0LW11bHRpcGxlIiApIHsKCQkJdmFsID0gZWxlbS5zZWxlY3RlZEluZGV4ID4gLTEgPwoJCQkJalF1ZXJ5Lm1hcCggZWxlbS5vcHRpb25zLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZDsKCQkJCX0pLmpvaW4oIi0iKSA6CgkJCQkiIjsKCgkJfSBlbHNlIGlmICggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2VsZWN0IiApICkgewoJCQl2YWwgPSBlbGVtLnNlbGVjdGVkSW5kZXg7CgkJfQoKCQlyZXR1cm4gdmFsOwoJfSwKCgl0ZXN0Q2hhbmdlID0gZnVuY3Rpb24gdGVzdENoYW5nZSggZSApIHsKCQl2YXIgZWxlbSA9IGUudGFyZ2V0LCBkYXRhLCB2YWw7CgoJCWlmICggIXJmb3JtRWxlbXMudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8IGVsZW0ucmVhZE9ubHkgKSB7CgkJCXJldHVybjsKCQl9CgoJCWRhdGEgPSBqUXVlcnkuX2RhdGEoIGVsZW0sICJfY2hhbmdlX2RhdGEiICk7CgkJdmFsID0gZ2V0VmFsKGVsZW0pOwoKCQkvLyB0aGUgY3VycmVudCBkYXRhIHdpbGwgYmUgYWxzbyByZXRyaWV2ZWQgYnkgYmVmb3JlYWN0aXZhdGUKCQlpZiAoIGUudHlwZSAhPT0gImZvY3Vzb3V0IiB8fCBlbGVtLnR5cGUgIT09ICJyYWRpbyIgKSB7CgkJCWpRdWVyeS5fZGF0YSggZWxlbSwgIl9jaGFuZ2VfZGF0YSIsIHZhbCApOwoJCX0KCgkJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBkYXRhICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIGRhdGEgIT0gbnVsbCB8fCB2YWwgKSB7CgkJCWUudHlwZSA9ICJjaGFuZ2UiOwoJCQllLmxpdmVGaXJlZCA9IHVuZGVmaW5lZDsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIGFyZ3VtZW50c1sxXSwgZWxlbSApOwoJCX0KCX07CgoJalF1ZXJ5LmV2ZW50LnNwZWNpYWwuY2hhbmdlID0gewoJCWZpbHRlcnM6IHsKCQkJZm9jdXNvdXQ6IHRlc3RDaGFuZ2UsCgoJCQliZWZvcmVkZWFjdGl2YXRlOiB0ZXN0Q2hhbmdlLAoKCQkJY2xpY2s6IGZ1bmN0aW9uKCBlICkgewoJCQkJdmFyIGVsZW0gPSBlLnRhcmdldCwgdHlwZSA9IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApID8gZWxlbS50eXBlIDogIiI7CgoJCQkJaWYgKCB0eXBlID09PSAicmFkaW8iIHx8IHR5cGUgPT09ICJjaGVja2JveCIgfHwgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2VsZWN0IiApICkgewoJCQkJCXRlc3RDaGFuZ2UuY2FsbCggdGhpcywgZSApOwoJCQkJfQoJCQl9LAoKCQkJLy8gQ2hhbmdlIGhhcyB0byBiZSBjYWxsZWQgYmVmb3JlIHN1Ym1pdAoJCQkvLyBLZXlkb3duIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBrZXlwcmVzcywgd2hpY2ggaXMgdXNlZCBpbiBzdWJtaXQtZXZlbnQgZGVsZWdhdGlvbgoJCQlrZXlkb3duOiBmdW5jdGlvbiggZSApIHsKCQkJCXZhciBlbGVtID0gZS50YXJnZXQsIHR5cGUgPSBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSA/IGVsZW0udHlwZSA6ICIiOwoKCQkJCWlmICggKGUua2V5Q29kZSA9PT0gMTMgJiYgIWpRdWVyeS5ub2RlTmFtZSggZWxlbSwgInRleHRhcmVhIiApICkgfHwKCQkJCQkoZS5rZXlDb2RlID09PSAzMiAmJiAodHlwZSA9PT0gImNoZWNrYm94IiB8fCB0eXBlID09PSAicmFkaW8iKSkgfHwKCQkJCQl0eXBlID09PSAic2VsZWN0LW11bHRpcGxlIiApIHsKCQkJCQl0ZXN0Q2hhbmdlLmNhbGwoIHRoaXMsIGUgKTsKCQkJCX0KCQkJfSwKCgkJCS8vIEJlZm9yZWFjdGl2YXRlIGhhcHBlbnMgYWxzbyBiZWZvcmUgdGhlIHByZXZpb3VzIGVsZW1lbnQgaXMgYmx1cnJlZAoJCQkvLyB3aXRoIHRoaXMgZXZlbnQgeW91IGNhbid0IHRyaWdnZXIgYSBjaGFuZ2UgZXZlbnQsIGJ1dCB5b3UgY2FuIHN0b3JlCgkJCS8vIGluZm9ybWF0aW9uCgkJCWJlZm9yZWFjdGl2YXRlOiBmdW5jdGlvbiggZSApIHsKCQkJCXZhciBlbGVtID0gZS50YXJnZXQ7CgkJCQlqUXVlcnkuX2RhdGEoIGVsZW0sICJfY2hhbmdlX2RhdGEiLCBnZXRWYWwoZWxlbSkgKTsKCQkJfQoJCX0sCgoJCXNldHVwOiBmdW5jdGlvbiggZGF0YSwgbmFtZXNwYWNlcyApIHsKCQkJaWYgKCB0aGlzLnR5cGUgPT09ICJmaWxlIiApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJZm9yICggdmFyIHR5cGUgaW4gY2hhbmdlRmlsdGVycyApIHsKCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGUgKyAiLnNwZWNpYWxDaGFuZ2UiLCBjaGFuZ2VGaWx0ZXJzW3R5cGVdICk7CgkJCX0KCgkJCXJldHVybiByZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKTsKCQl9LAoKCQl0ZWFyZG93bjogZnVuY3Rpb24oIG5hbWVzcGFjZXMgKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuc3BlY2lhbENoYW5nZSIgKTsKCgkJCXJldHVybiByZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKTsKCQl9Cgl9OwoKCWNoYW5nZUZpbHRlcnMgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbC5jaGFuZ2UuZmlsdGVyczsKCgkvLyBIYW5kbGUgd2hlbiB0aGUgaW5wdXQgaXMgLmZvY3VzKCknZAoJY2hhbmdlRmlsdGVycy5mb2N1cyA9IGNoYW5nZUZpbHRlcnMuYmVmb3JlYWN0aXZhdGU7Cn0KCmZ1bmN0aW9uIHRyaWdnZXIoIHR5cGUsIGVsZW0sIGFyZ3MgKSB7CgkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUuCgkvLyBGYWtlIG9yaWdpbmFsRXZlbnQgdG8gYXZvaWQgZG9ub3IncyBzdG9wUHJvcGFnYXRpb24sIGJ1dCBpZiB0aGUKCS8vIHNpbXVsYXRlZCBldmVudCBwcmV2ZW50cyBkZWZhdWx0IHRoZW4gd2UgZG8gdGhlIHNhbWUgb24gdGhlIGRvbm9yLgoJLy8gRG9uJ3QgcGFzcyBhcmdzIG9yIHJlbWVtYmVyIGxpdmVGaXJlZDsgdGhleSBhcHBseSB0byB0aGUgZG9ub3IgZXZlbnQuCgl2YXIgZXZlbnQgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgYXJnc1sgMCBdICk7CglldmVudC50eXBlID0gdHlwZTsKCWV2ZW50Lm9yaWdpbmFsRXZlbnQgPSB7fTsKCWV2ZW50LmxpdmVGaXJlZCA9IHVuZGVmaW5lZDsKCWpRdWVyeS5ldmVudC5oYW5kbGUuY2FsbCggZWxlbSwgZXZlbnQgKTsKCWlmICggZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7CgkJYXJnc1sgMCBdLnByZXZlbnREZWZhdWx0KCk7Cgl9Cn0KCi8vIENyZWF0ZSAiYnViYmxpbmciIGZvY3VzIGFuZCBibHVyIGV2ZW50cwppZiAoICFqUXVlcnkuc3VwcG9ydC5mb2N1c2luQnViYmxlcyApIHsKCWpRdWVyeS5lYWNoKHsgZm9jdXM6ICJmb2N1c2luIiwgYmx1cjogImZvY3Vzb3V0IiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkgewoKCQkvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0CgkJdmFyIGF0dGFjaGVzID0gMDsKCgkJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0gewoJCQlzZXR1cDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIGF0dGFjaGVzKysgPT09IDAgKSB7CgkJCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQl9LAoJCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIC0tYXR0YWNoZXMgPT09IDAgKSB7CgkJCQkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQl9CgkJfTsKCgkJZnVuY3Rpb24gaGFuZGxlciggZG9ub3IgKSB7CgkJCS8vIERvbm9yIGV2ZW50IGlzIGFsd2F5cyBhIG5hdGl2ZSBvbmU7IGZpeCBpdCBhbmQgc3dpdGNoIGl0cyB0eXBlLgoJCQkvLyBMZXQgZm9jdXNpbi9vdXQgaGFuZGxlciBjYW5jZWwgdGhlIGRvbm9yIGZvY3VzL2JsdXIgZXZlbnQuCgkJCXZhciBlID0galF1ZXJ5LmV2ZW50LmZpeCggZG9ub3IgKTsKCQkJZS50eXBlID0gZml4OwoJCQllLm9yaWdpbmFsRXZlbnQgPSB7fTsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGUudGFyZ2V0ICk7CgkJCWlmICggZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCQkJCWRvbm9yLnByZXZlbnREZWZhdWx0KCk7CgkJCX0KCQl9Cgl9KTsKfQoKalF1ZXJ5LmVhY2goWyJiaW5kIiwgIm9uZSJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHR5cGUsIGRhdGEsIGZuICkgewoJCXZhciBoYW5kbGVyOwoKCQkvLyBIYW5kbGUgb2JqZWN0IGxpdGVyYWxzCgkJaWYgKCB0eXBlb2YgdHlwZSA9PT0gIm9iamVjdCIgKSB7CgkJCWZvciAoIHZhciBrZXkgaW4gdHlwZSApIHsKCQkJCXRoaXNbIG5hbWUgXShrZXksIGRhdGEsIHR5cGVba2V5XSwgZm4pOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAyIHx8IGRhdGEgPT09IGZhbHNlICkgewoJCQlmbiA9IGRhdGE7CgkJCWRhdGEgPSB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIG5hbWUgPT09ICJvbmUiICkgewoJCQloYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJalF1ZXJ5KCB0aGlzICkudW5iaW5kKCBldmVudCwgaGFuZGxlciApOwoJCQkJcmV0dXJuIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJfTsKCQkJaGFuZGxlci5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrOwoJCX0gZWxzZSB7CgkJCWhhbmRsZXIgPSBmbjsKCQl9CgoJCWlmICggdHlwZSA9PT0gInVubG9hZCIgJiYgbmFtZSAhPT0gIm9uZSIgKSB7CgkJCXRoaXMub25lKCB0eXBlLCBkYXRhLCBmbiApOwoKCQl9IGVsc2UgewoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXNbaV0sIHR5cGUsIGhhbmRsZXIsIGRhdGEgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9Owp9KTsKCmpRdWVyeS5mbi5leHRlbmQoewoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZSwgZm4gKSB7CgkJLy8gSGFuZGxlIG9iamVjdCBsaXRlcmFscwoJCWlmICggdHlwZW9mIHR5cGUgPT09ICJvYmplY3QiICYmICF0eXBlLnByZXZlbnREZWZhdWx0ICkgewoJCQlmb3IgKCB2YXIga2V5IGluIHR5cGUgKSB7CgkJCQl0aGlzLnVuYmluZChrZXksIHR5cGVba2V5XSk7CgkJCX0KCgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzW2ldLCB0eXBlLCBmbiApOwoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGRhdGEsIGZuICkgewoJCXJldHVybiB0aGlzLmxpdmUoIHR5cGVzLCBkYXRhLCBmbiwgc2VsZWN0b3IgKTsKCX0sCgoJdW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7CgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQlyZXR1cm4gdGhpcy51bmJpbmQoICJsaXZlIiApOwoKCQl9IGVsc2UgewoJCQlyZXR1cm4gdGhpcy5kaWUoIHR5cGVzLCBudWxsLCBmbiwgc2VsZWN0b3IgKTsKCQl9Cgl9LAoKCXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7CgkJfSk7Cgl9LAoKCXRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKCQlpZiAoIHRoaXNbMF0gKSB7CgkJCXJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpc1swXSwgdHJ1ZSApOwoJCX0KCX0sCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4gKSB7CgkJLy8gU2F2ZSByZWZlcmVuY2UgdG8gYXJndW1lbnRzIGZvciBhY2Nlc3MgaW4gY2xvc3VyZQoJCXZhciBhcmdzID0gYXJndW1lbnRzLAoJCQlndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrLAoJCQlpID0gMCwKCQkJdG9nZ2xlciA9IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggZnVuY3Rpb24gdG8gZXhlY3V0ZQoJCQkJdmFyIGxhc3RUb2dnbGUgPSAoIGpRdWVyeS5kYXRhKCB0aGlzLCAibGFzdFRvZ2dsZSIgKyBmbi5ndWlkICkgfHwgMCApICUgaTsKCQkJCWpRdWVyeS5kYXRhKCB0aGlzLCAibGFzdFRvZ2dsZSIgKyBmbi5ndWlkLCBsYXN0VG9nZ2xlICsgMSApOwoKCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IGNsaWNrcyBzdG9wCgkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKCQkJCS8vIGFuZCBleGVjdXRlIHRoZSBmdW5jdGlvbgoJCQkJcmV0dXJuIGFyZ3NbIGxhc3RUb2dnbGUgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgfHwgZmFsc2U7CgkJCX07CgoJCS8vIGxpbmsgYWxsIHRoZSBmdW5jdGlvbnMsIHNvIGFueSBvZiB0aGVtIGNhbiB1bmJpbmQgdGhpcyBjbGljayBoYW5kbGVyCgkJdG9nZ2xlci5ndWlkID0gZ3VpZDsKCQl3aGlsZSAoIGkgPCBhcmdzLmxlbmd0aCApIHsKCQkJYXJnc1sgaSsrIF0uZ3VpZCA9IGd1aWQ7CgkJfQoKCQlyZXR1cm4gdGhpcy5jbGljayggdG9nZ2xlciApOwoJfSwKCglob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7CgkJcmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7Cgl9Cn0pOwoKdmFyIGxpdmVNYXAgPSB7Cglmb2N1czogImZvY3VzaW4iLAoJYmx1cjogImZvY3Vzb3V0IiwKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0Igp9OwoKalF1ZXJ5LmVhY2goWyJsaXZlIiwgImRpZSJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiwgb3JpZ1NlbGVjdG9yIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkgewoJCXZhciB0eXBlLCBpID0gMCwgbWF0Y2gsIG5hbWVzcGFjZXMsIHByZVR5cGUsCgkJCXNlbGVjdG9yID0gb3JpZ1NlbGVjdG9yIHx8IHRoaXMuc2VsZWN0b3IsCgkJCWNvbnRleHQgPSBvcmlnU2VsZWN0b3IgPyB0aGlzIDogalF1ZXJ5KCB0aGlzLmNvbnRleHQgKTsKCgkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICYmICF0eXBlcy5wcmV2ZW50RGVmYXVsdCApIHsKCQkJZm9yICggdmFyIGtleSBpbiB0eXBlcyApIHsKCQkJCWNvbnRleHRbIG5hbWUgXSgga2V5LCBkYXRhLCB0eXBlc1trZXldLCBzZWxlY3RvciApOwoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCWlmICggbmFtZSA9PT0gImRpZSIgJiYgIXR5cGVzICYmCgkJCQkJb3JpZ1NlbGVjdG9yICYmIG9yaWdTZWxlY3Rvci5jaGFyQXQoMCkgPT09ICIuIiApIHsKCgkJCWNvbnRleHQudW5iaW5kKCBvcmlnU2VsZWN0b3IgKTsKCgkJCXJldHVybiB0aGlzOwoJCX0KCgkJaWYgKCBkYXRhID09PSBmYWxzZSB8fCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgewoJCQlmbiA9IGRhdGEgfHwgcmV0dXJuRmFsc2U7CgkJCWRhdGEgPSB1bmRlZmluZWQ7CgkJfQoKCQl0eXBlcyA9ICh0eXBlcyB8fCAiIikuc3BsaXQoIiAiKTsKCgkJd2hpbGUgKCAodHlwZSA9IHR5cGVzWyBpKysgXSkgIT0gbnVsbCApIHsKCQkJbWF0Y2ggPSBybmFtZXNwYWNlcy5leGVjKCB0eXBlICk7CgkJCW5hbWVzcGFjZXMgPSAiIjsKCgkJCWlmICggbWF0Y2ggKSAgewoJCQkJbmFtZXNwYWNlcyA9IG1hdGNoWzBdOwoJCQkJdHlwZSA9IHR5cGUucmVwbGFjZSggcm5hbWVzcGFjZXMsICIiICk7CgkJCX0KCgkJCWlmICggdHlwZSA9PT0gImhvdmVyIiApIHsKCQkJCXR5cGVzLnB1c2goICJtb3VzZWVudGVyIiArIG5hbWVzcGFjZXMsICJtb3VzZWxlYXZlIiArIG5hbWVzcGFjZXMgKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlwcmVUeXBlID0gdHlwZTsKCgkJCWlmICggbGl2ZU1hcFsgdHlwZSBdICkgewoJCQkJdHlwZXMucHVzaCggbGl2ZU1hcFsgdHlwZSBdICsgbmFtZXNwYWNlcyApOwoJCQkJdHlwZSA9IHR5cGUgKyBuYW1lc3BhY2VzOwoKCQkJfSBlbHNlIHsKCQkJCXR5cGUgPSAobGl2ZU1hcFsgdHlwZSBdIHx8IHR5cGUpICsgbmFtZXNwYWNlczsKCQkJfQoKCQkJaWYgKCBuYW1lID09PSAibGl2ZSIgKSB7CgkJCQkvLyBiaW5kIGxpdmUgaGFuZGxlcgoJCQkJZm9yICggdmFyIGogPSAwLCBsID0gY29udGV4dC5sZW5ndGg7IGogPCBsOyBqKysgKSB7CgkJCQkJalF1ZXJ5LmV2ZW50LmFkZCggY29udGV4dFtqXSwgImxpdmUuIiArIGxpdmVDb252ZXJ0KCB0eXBlLCBzZWxlY3RvciApLAoJCQkJCQl7IGRhdGE6IGRhdGEsIHNlbGVjdG9yOiBzZWxlY3RvciwgaGFuZGxlcjogZm4sIG9yaWdUeXBlOiB0eXBlLCBvcmlnSGFuZGxlcjogZm4sIHByZVR5cGU6IHByZVR5cGUgfSApOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCS8vIHVuYmluZCBsaXZlIGhhbmRsZXIKCQkJCWNvbnRleHQudW5iaW5kKCAibGl2ZS4iICsgbGl2ZUNvbnZlcnQoIHR5cGUsIHNlbGVjdG9yICksIGZuICk7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfTsKfSk7CgpmdW5jdGlvbiBsaXZlSGFuZGxlciggZXZlbnQgKSB7Cgl2YXIgc3RvcCwgbWF4TGV2ZWwsIHJlbGF0ZWQsIG1hdGNoLCBoYW5kbGVPYmosIGVsZW0sIGosIGksIGwsIGRhdGEsIGNsb3NlLCBuYW1lc3BhY2UsIHJldCwKCQllbGVtcyA9IFtdLAoJCXNlbGVjdG9ycyA9IFtdLAoJCWV2ZW50cyA9IGpRdWVyeS5fZGF0YSggdGhpcywgImV2ZW50cyIgKTsKCgkvLyBNYWtlIHN1cmUgd2UgYXZvaWQgbm9uLWxlZnQtY2xpY2sgYnViYmxpbmcgaW4gRmlyZWZveCAoIzM4NjEpIGFuZCBkaXNhYmxlZCBlbGVtZW50cyBpbiBJRSAoIzY5MTEpCglpZiAoIGV2ZW50LmxpdmVGaXJlZCA9PT0gdGhpcyB8fCAhZXZlbnRzIHx8ICFldmVudHMubGl2ZSB8fCBldmVudC50YXJnZXQuZGlzYWJsZWQgfHwgZXZlbnQuYnV0dG9uICYmIGV2ZW50LnR5cGUgPT09ICJjbGljayIgKSB7CgkJcmV0dXJuOwoJfQoKCWlmICggZXZlbnQubmFtZXNwYWNlICkgewoJCW5hbWVzcGFjZSA9IG5ldyBSZWdFeHAoIihefFxcLikiICsgZXZlbnQubmFtZXNwYWNlLnNwbGl0KCIuIikuam9pbigiXFwuKD86LipcXC4pPyIpICsgIihcXC58JCkiKTsKCX0KCglldmVudC5saXZlRmlyZWQgPSB0aGlzOwoKCXZhciBsaXZlID0gZXZlbnRzLmxpdmUuc2xpY2UoMCk7CgoJZm9yICggaiA9IDA7IGogPCBsaXZlLmxlbmd0aDsgaisrICkgewoJCWhhbmRsZU9iaiA9IGxpdmVbal07CgoJCWlmICggaGFuZGxlT2JqLm9yaWdUeXBlLnJlcGxhY2UoIHJuYW1lc3BhY2VzLCAiIiApID09PSBldmVudC50eXBlICkgewoJCQlzZWxlY3RvcnMucHVzaCggaGFuZGxlT2JqLnNlbGVjdG9yICk7CgoJCX0gZWxzZSB7CgkJCWxpdmUuc3BsaWNlKCBqLS0sIDEgKTsKCQl9Cgl9CgoJbWF0Y2ggPSBqUXVlcnkoIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoIHNlbGVjdG9ycywgZXZlbnQuY3VycmVudFRhcmdldCApOwoKCWZvciAoIGkgPSAwLCBsID0gbWF0Y2gubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCWNsb3NlID0gbWF0Y2hbaV07CgoJCWZvciAoIGogPSAwOyBqIDwgbGl2ZS5sZW5ndGg7IGorKyApIHsKCQkJaGFuZGxlT2JqID0gbGl2ZVtqXTsKCgkJCWlmICggY2xvc2Uuc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciAmJiAoIW5hbWVzcGFjZSB8fCBuYW1lc3BhY2UudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApKSAmJiAhY2xvc2UuZWxlbS5kaXNhYmxlZCApIHsKCQkJCWVsZW0gPSBjbG9zZS5lbGVtOwoJCQkJcmVsYXRlZCA9IG51bGw7CgoJCQkJLy8gVGhvc2UgdHdvIGV2ZW50cyByZXF1aXJlIGFkZGl0aW9uYWwgY2hlY2tpbmcKCQkJCWlmICggaGFuZGxlT2JqLnByZVR5cGUgPT09ICJtb3VzZWVudGVyIiB8fCBoYW5kbGVPYmoucHJlVHlwZSA9PT0gIm1vdXNlbGVhdmUiICkgewoJCQkJCWV2ZW50LnR5cGUgPSBoYW5kbGVPYmoucHJlVHlwZTsKCQkJCQlyZWxhdGVkID0galF1ZXJ5KCBldmVudC5yZWxhdGVkVGFyZ2V0ICkuY2xvc2VzdCggaGFuZGxlT2JqLnNlbGVjdG9yIClbMF07CgoJCQkJCS8vIE1ha2Ugc3VyZSBub3QgdG8gYWNjaWRlbnRhbGx5IG1hdGNoIGEgY2hpbGQgZWxlbWVudCB3aXRoIHRoZSBzYW1lIHNlbGVjdG9yCgkJCQkJaWYgKCByZWxhdGVkICYmIGpRdWVyeS5jb250YWlucyggZWxlbSwgcmVsYXRlZCApICkgewoJCQkJCQlyZWxhdGVkID0gZWxlbTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCAhcmVsYXRlZCB8fCByZWxhdGVkICE9PSBlbGVtICkgewoJCQkJCWVsZW1zLnB1c2goeyBlbGVtOiBlbGVtLCBoYW5kbGVPYmo6IGhhbmRsZU9iaiwgbGV2ZWw6IGNsb3NlLmxldmVsIH0pOwoJCQkJfQoJCQl9CgkJfQoJfQoKCWZvciAoIGkgPSAwLCBsID0gZWxlbXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCW1hdGNoID0gZWxlbXNbaV07CgoJCWlmICggbWF4TGV2ZWwgJiYgbWF0Y2gubGV2ZWwgPiBtYXhMZXZlbCApIHsKCQkJYnJlYWs7CgkJfQoKCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2guZWxlbTsKCQlldmVudC5kYXRhID0gbWF0Y2guaGFuZGxlT2JqLmRhdGE7CgkJZXZlbnQuaGFuZGxlT2JqID0gbWF0Y2guaGFuZGxlT2JqOwoKCQlyZXQgPSBtYXRjaC5oYW5kbGVPYmoub3JpZ0hhbmRsZXIuYXBwbHkoIG1hdGNoLmVsZW0sIGFyZ3VtZW50cyApOwoKCQlpZiAoIHJldCA9PT0gZmFsc2UgfHwgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJbWF4TGV2ZWwgPSBtYXRjaC5sZXZlbDsKCgkJCWlmICggcmV0ID09PSBmYWxzZSApIHsKCQkJCXN0b3AgPSBmYWxzZTsKCQkJfQoJCQlpZiAoIGV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCglyZXR1cm4gc3RvcDsKfQoKZnVuY3Rpb24gbGl2ZUNvbnZlcnQoIHR5cGUsIHNlbGVjdG9yICkgewoJcmV0dXJuICh0eXBlICYmIHR5cGUgIT09ICIqIiA/IHR5cGUgKyAiLiIgOiAiIikgKyBzZWxlY3Rvci5yZXBsYWNlKHJwZXJpb2QsICJgIikucmVwbGFjZShyc3BhY2VzLCAiJiIpOwp9CgpqUXVlcnkuZWFjaCggKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayAiICsKCSJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSAiICsKCSJjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIikuc3BsaXQoIiAiKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CgoJLy8gSGFuZGxlIGV2ZW50IGJpbmRpbmcKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkgewoJCWlmICggZm4gPT0gbnVsbCApIHsKCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gbnVsbDsKCQl9CgoJCXJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/CgkJCXRoaXMuYmluZCggbmFtZSwgZGF0YSwgZm4gKSA6CgkJCXRoaXMudHJpZ2dlciggbmFtZSApOwoJfTsKCglpZiAoIGpRdWVyeS5hdHRyRm4gKSB7CgkJalF1ZXJ5LmF0dHJGblsgbmFtZSBdID0gdHJ1ZTsKCX0KfSk7CgoKCi8qIQogKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZQogKiAgQ29weXJpZ2h0IDIwMTEsIFRoZSBEb2pvIEZvdW5kYXRpb24KICogIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQsIEJTRCwgYW5kIEdQTCBMaWNlbnNlcy4KICogIE1vcmUgaW5mb3JtYXRpb246IGh0dHA6Ly9zaXp6bGVqcy5jb20vCiAqLwooZnVuY3Rpb24oKXsKCnZhciBjaHVua2VyID0gLygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZywKCWRvbmUgPSAwLAoJdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAoJaGFzRHVwbGljYXRlID0gZmFsc2UsCgliYXNlSGFzRHVwbGljYXRlID0gdHJ1ZSwKCXJCYWNrc2xhc2ggPSAvXFwvZywKCXJOb25Xb3JkID0gL1xXLzsKCi8vIEhlcmUgd2UgY2hlY2sgaWYgdGhlIEphdmFTY3JpcHQgZW5naW5lIGlzIHVzaW5nIHNvbWUgc29ydCBvZgovLyBvcHRpbWl6YXRpb24gd2hlcmUgaXQgZG9lcyBub3QgYWx3YXlzIGNhbGwgb3VyIGNvbXBhcmlzaW9uCi8vIGZ1bmN0aW9uLiBJZiB0aGF0IGlzIHRoZSBjYXNlLCBkaXNjYXJkIHRoZSBoYXNEdXBsaWNhdGUgdmFsdWUuCi8vICAgVGh1cyBmYXIgdGhhdCBpbmNsdWRlcyBHb29nbGUgQ2hyb21lLgpbMCwgMF0uc29ydChmdW5jdGlvbigpIHsKCWJhc2VIYXNEdXBsaWNhdGUgPSBmYWxzZTsKCXJldHVybiAwOwp9KTsKCnZhciBTaXp6bGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7CglyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OwoKCXZhciBvcmlnQ29udGV4dCA9IGNvbnRleHQ7CgoJaWYgKCBjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkgKSB7CgkJcmV0dXJuIFtdOwoJfQoJCglpZiAoICFzZWxlY3RvciB8fCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCXJldHVybiByZXN1bHRzOwoJfQoKCXZhciBtLCBzZXQsIGNoZWNrU2V0LCBleHRyYSwgcmV0LCBjdXIsIHBvcCwgaSwKCQlwcnVuZSA9IHRydWUsCgkJY29udGV4dFhNTCA9IFNpenpsZS5pc1hNTCggY29udGV4dCApLAoJCXBhcnRzID0gW10sCgkJc29GYXIgPSBzZWxlY3RvcjsKCQoJLy8gUmVzZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaHVua2VyIHJlZ2V4cCAoc3RhcnQgZnJvbSBoZWFkKQoJZG8gewoJCWNodW5rZXIuZXhlYyggIiIgKTsKCQltID0gY2h1bmtlci5leGVjKCBzb0ZhciApOwoKCQlpZiAoIG0gKSB7CgkJCXNvRmFyID0gbVszXTsKCQkKCQkJcGFydHMucHVzaCggbVsxXSApOwoJCQoJCQlpZiAoIG1bMl0gKSB7CgkJCQlleHRyYSA9IG1bM107CgkJCQlicmVhazsKCQkJfQoJCX0KCX0gd2hpbGUgKCBtICk7CgoJaWYgKCBwYXJ0cy5sZW5ndGggPiAxICYmIG9yaWdQT1MuZXhlYyggc2VsZWN0b3IgKSApIHsKCgkJaWYgKCBwYXJ0cy5sZW5ndGggPT09IDIgJiYgRXhwci5yZWxhdGl2ZVsgcGFydHNbMF0gXSApIHsKCQkJc2V0ID0gcG9zUHJvY2VzcyggcGFydHNbMF0gKyBwYXJ0c1sxXSwgY29udGV4dCApOwoKCQl9IGVsc2UgewoJCQlzZXQgPSBFeHByLnJlbGF0aXZlWyBwYXJ0c1swXSBdID8KCQkJCVsgY29udGV4dCBdIDoKCQkJCVNpenpsZSggcGFydHMuc2hpZnQoKSwgY29udGV4dCApOwoKCQkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCQlzZWxlY3RvciA9IHBhcnRzLnNoaWZ0KCk7CgoJCQkJaWYgKCBFeHByLnJlbGF0aXZlWyBzZWxlY3RvciBdICkgewoJCQkJCXNlbGVjdG9yICs9IHBhcnRzLnNoaWZ0KCk7CgkJCQl9CgkJCQkKCQkJCXNldCA9IHBvc1Byb2Nlc3MoIHNlbGVjdG9yLCBzZXQgKTsKCQkJfQoJCX0KCgl9IGVsc2UgewoJCS8vIFRha2UgYSBzaG9ydGN1dCBhbmQgc2V0IHRoZSBjb250ZXh0IGlmIHRoZSByb290IHNlbGVjdG9yIGlzIGFuIElECgkJLy8gKGJ1dCBub3QgaWYgaXQnbGwgYmUgZmFzdGVyIGlmIHRoZSBpbm5lciBzZWxlY3RvciBpcyBhbiBJRCkKCQlpZiAoICFzZWVkICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYgY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiAhY29udGV4dFhNTCAmJgoJCQkJRXhwci5tYXRjaC5JRC50ZXN0KHBhcnRzWzBdKSAmJiAhRXhwci5tYXRjaC5JRC50ZXN0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKSApIHsKCgkJCXJldCA9IFNpenpsZS5maW5kKCBwYXJ0cy5zaGlmdCgpLCBjb250ZXh0LCBjb250ZXh0WE1MICk7CgkJCWNvbnRleHQgPSByZXQuZXhwciA/CgkJCQlTaXp6bGUuZmlsdGVyKCByZXQuZXhwciwgcmV0LnNldCApWzBdIDoKCQkJCXJldC5zZXRbMF07CgkJfQoKCQlpZiAoIGNvbnRleHQgKSB7CgkJCXJldCA9IHNlZWQgPwoJCQkJeyBleHByOiBwYXJ0cy5wb3AoKSwgc2V0OiBtYWtlQXJyYXkoc2VlZCkgfSA6CgkJCQlTaXp6bGUuZmluZCggcGFydHMucG9wKCksIHBhcnRzLmxlbmd0aCA9PT0gMSAmJiAocGFydHNbMF0gPT09ICJ+IiB8fCBwYXJ0c1swXSA9PT0gIisiKSAmJiBjb250ZXh0LnBhcmVudE5vZGUgPyBjb250ZXh0LnBhcmVudE5vZGUgOiBjb250ZXh0LCBjb250ZXh0WE1MICk7CgoJCQlzZXQgPSByZXQuZXhwciA/CgkJCQlTaXp6bGUuZmlsdGVyKCByZXQuZXhwciwgcmV0LnNldCApIDoKCQkJCXJldC5zZXQ7CgoJCQlpZiAoIHBhcnRzLmxlbmd0aCA+IDAgKSB7CgkJCQljaGVja1NldCA9IG1ha2VBcnJheSggc2V0ICk7CgoJCQl9IGVsc2UgewoJCQkJcHJ1bmUgPSBmYWxzZTsKCQkJfQoKCQkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCQljdXIgPSBwYXJ0cy5wb3AoKTsKCQkJCXBvcCA9IGN1cjsKCgkJCQlpZiAoICFFeHByLnJlbGF0aXZlWyBjdXIgXSApIHsKCQkJCQljdXIgPSAiIjsKCQkJCX0gZWxzZSB7CgkJCQkJcG9wID0gcGFydHMucG9wKCk7CgkJCQl9CgoJCQkJaWYgKCBwb3AgPT0gbnVsbCApIHsKCQkJCQlwb3AgPSBjb250ZXh0OwoJCQkJfQoKCQkJCUV4cHIucmVsYXRpdmVbIGN1ciBdKCBjaGVja1NldCwgcG9wLCBjb250ZXh0WE1MICk7CgkJCX0KCgkJfSBlbHNlIHsKCQkJY2hlY2tTZXQgPSBwYXJ0cyA9IFtdOwoJCX0KCX0KCglpZiAoICFjaGVja1NldCApIHsKCQljaGVja1NldCA9IHNldDsKCX0KCglpZiAoICFjaGVja1NldCApIHsKCQlTaXp6bGUuZXJyb3IoIGN1ciB8fCBzZWxlY3RvciApOwoJfQoKCWlmICggdG9TdHJpbmcuY2FsbChjaGVja1NldCkgPT09ICJbb2JqZWN0IEFycmF5XSIgKSB7CgkJaWYgKCAhcHJ1bmUgKSB7CgkJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgY2hlY2tTZXQgKTsKCgkJfSBlbHNlIGlmICggY29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSAxICkgewoJCQlmb3IgKCBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiAoY2hlY2tTZXRbaV0gPT09IHRydWUgfHwgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgJiYgU2l6emxlLmNvbnRhaW5zKGNvbnRleHQsIGNoZWNrU2V0W2ldKSkgKSB7CgkJCQkJcmVzdWx0cy5wdXNoKCBzZXRbaV0gKTsKCQkJCX0KCQkJfQoKCQl9IGVsc2UgewoJCQlmb3IgKCBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiBjaGVja1NldFtpXS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCQlyZXN1bHRzLnB1c2goIHNldFtpXSApOwoJCQkJfQoJCQl9CgkJfQoKCX0gZWxzZSB7CgkJbWFrZUFycmF5KCBjaGVja1NldCwgcmVzdWx0cyApOwoJfQoKCWlmICggZXh0cmEgKSB7CgkJU2l6emxlKCBleHRyYSwgb3JpZ0NvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTsKCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOwoJfQoKCXJldHVybiByZXN1bHRzOwp9OwoKU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHsKCWlmICggc29ydE9yZGVyICkgewoJCWhhc0R1cGxpY2F0ZSA9IGJhc2VIYXNEdXBsaWNhdGU7CgkJcmVzdWx0cy5zb3J0KCBzb3J0T3JkZXIgKTsKCgkJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJCWZvciAoIHZhciBpID0gMTsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIHJlc3VsdHNbaV0gPT09IHJlc3VsdHNbIGkgLSAxIF0gKSB7CgkJCQkJcmVzdWx0cy5zcGxpY2UoIGktLSwgMSApOwoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiByZXN1bHRzOwp9OwoKU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgc2V0ICkgewoJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgc2V0ICk7Cn07CgpTaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIG5vZGUsIGV4cHIgKSB7CglyZXR1cm4gU2l6emxlKCBleHByLCBudWxsLCBudWxsLCBbbm9kZV0gKS5sZW5ndGggPiAwOwp9OwoKU2l6emxlLmZpbmQgPSBmdW5jdGlvbiggZXhwciwgY29udGV4dCwgaXNYTUwgKSB7Cgl2YXIgc2V0OwoKCWlmICggIWV4cHIgKSB7CgkJcmV0dXJuIFtdOwoJfQoKCWZvciAoIHZhciBpID0gMCwgbCA9IEV4cHIub3JkZXIubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCXZhciBtYXRjaCwKCQkJdHlwZSA9IEV4cHIub3JkZXJbaV07CgkJCgkJaWYgKCAobWF0Y2ggPSBFeHByLmxlZnRNYXRjaFsgdHlwZSBdLmV4ZWMoIGV4cHIgKSkgKSB7CgkJCXZhciBsZWZ0ID0gbWF0Y2hbMV07CgkJCW1hdGNoLnNwbGljZSggMSwgMSApOwoKCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgIT09ICJcXCIgKSB7CgkJCQltYXRjaFsxXSA9IChtYXRjaFsxXSB8fCAiIikucmVwbGFjZSggckJhY2tzbGFzaCwgIiIgKTsKCQkJCXNldCA9IEV4cHIuZmluZFsgdHlwZSBdKCBtYXRjaCwgY29udGV4dCwgaXNYTUwgKTsKCgkJCQlpZiAoIHNldCAhPSBudWxsICkgewoJCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCX0KCglpZiAoICFzZXQgKSB7CgkJc2V0ID0gdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiID8KCQkJY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICkgOgoJCQlbXTsKCX0KCglyZXR1cm4geyBzZXQ6IHNldCwgZXhwcjogZXhwciB9Owp9OwoKU2l6emxlLmZpbHRlciA9IGZ1bmN0aW9uKCBleHByLCBzZXQsIGlucGxhY2UsIG5vdCApIHsKCXZhciBtYXRjaCwgYW55Rm91bmQsCgkJb2xkID0gZXhwciwKCQlyZXN1bHQgPSBbXSwKCQljdXJMb29wID0gc2V0LAoJCWlzWE1MRmlsdGVyID0gc2V0ICYmIHNldFswXSAmJiBTaXp6bGUuaXNYTUwoIHNldFswXSApOwoKCXdoaWxlICggZXhwciAmJiBzZXQubGVuZ3RoICkgewoJCWZvciAoIHZhciB0eXBlIGluIEV4cHIuZmlsdGVyICkgewoJCQlpZiAoIChtYXRjaCA9IEV4cHIubGVmdE1hdGNoWyB0eXBlIF0uZXhlYyggZXhwciApKSAhPSBudWxsICYmIG1hdGNoWzJdICkgewoJCQkJdmFyIGZvdW5kLCBpdGVtLAoJCQkJCWZpbHRlciA9IEV4cHIuZmlsdGVyWyB0eXBlIF0sCgkJCQkJbGVmdCA9IG1hdGNoWzFdOwoKCQkJCWFueUZvdW5kID0gZmFsc2U7CgoJCQkJbWF0Y2guc3BsaWNlKDEsMSk7CgoJCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgPT09ICJcXCIgKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJaWYgKCBjdXJMb29wID09PSByZXN1bHQgKSB7CgkJCQkJcmVzdWx0ID0gW107CgkJCQl9CgoJCQkJaWYgKCBFeHByLnByZUZpbHRlclsgdHlwZSBdICkgewoJCQkJCW1hdGNoID0gRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSggbWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTEZpbHRlciApOwoKCQkJCQlpZiAoICFtYXRjaCApIHsKCQkJCQkJYW55Rm91bmQgPSBmb3VuZCA9IHRydWU7CgoJCQkJCX0gZWxzZSBpZiAoIG1hdGNoID09PSB0cnVlICkgewoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCBtYXRjaCApIHsKCQkJCQlmb3IgKCB2YXIgaSA9IDA7IChpdGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJCQlpZiAoIGl0ZW0gKSB7CgkJCQkJCQlmb3VuZCA9IGZpbHRlciggaXRlbSwgbWF0Y2gsIGksIGN1ckxvb3AgKTsKCQkJCQkJCXZhciBwYXNzID0gbm90IF4gISFmb3VuZDsKCgkJCQkJCQlpZiAoIGlucGxhY2UgJiYgZm91bmQgIT0gbnVsbCApIHsKCQkJCQkJCQlpZiAoIHBhc3MgKSB7CgkJCQkJCQkJCWFueUZvdW5kID0gdHJ1ZTsKCgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJY3VyTG9vcFtpXSA9IGZhbHNlOwoJCQkJCQkJCX0KCgkJCQkJCQl9IGVsc2UgaWYgKCBwYXNzICkgewoJCQkJCQkJCXJlc3VsdC5wdXNoKCBpdGVtICk7CgkJCQkJCQkJYW55Rm91bmQgPSB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggZm91bmQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQlpZiAoICFpbnBsYWNlICkgewoJCQkJCQljdXJMb29wID0gcmVzdWx0OwoJCQkJCX0KCgkJCQkJZXhwciA9IGV4cHIucmVwbGFjZSggRXhwci5tYXRjaFsgdHlwZSBdLCAiIiApOwoKCQkJCQlpZiAoICFhbnlGb3VuZCApIHsKCQkJCQkJcmV0dXJuIFtdOwoJCQkJCX0KCgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEltcHJvcGVyIGV4cHJlc3Npb24KCQlpZiAoIGV4cHIgPT09IG9sZCApIHsKCQkJaWYgKCBhbnlGb3VuZCA9PSBudWxsICkgewoJCQkJU2l6emxlLmVycm9yKCBleHByICk7CgoJCQl9IGVsc2UgewoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCW9sZCA9IGV4cHI7Cgl9CgoJcmV0dXJuIGN1ckxvb3A7Cn07CgpTaXp6bGUuZXJyb3IgPSBmdW5jdGlvbiggbXNnICkgewoJdGhyb3cgIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2c7Cn07Cgp2YXIgRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7CglvcmRlcjogWyAiSUQiLCAiTkFNRSIsICJUQUciIF0sCgoJbWF0Y2g6IHsKCQlJRDogLyMoKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLAoJCUNMQVNTOiAvXC4oKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLAoJCU5BTUU6IC9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLywKCQlBVFRSOiAvXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylccyooPzooXFM/PSlccyooPzooWyciXSkoLio/KVwzfCgjPyg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSopfCl8KVxzKlxdLywKCQlUQUc6IC9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKlwtXXxcXC4pKykvLAoJCUNISUxEOiAvOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoXHMqKGV2ZW58b2RkfCg/OlsrXC1dP1xkK3woPzpbK1wtXT9cZCopP25ccyooPzpbK1wtXVxzKlxkKyk/KSlccypcKSk/LywKCQlQT1M6IC86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLAoJCVBTRVVETzogLzooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykoPzpcKChbJyJdPykoKD86XChbXlwpXStcKXxbXlwoXCldKikrKVwyXCkpPy8KCX0sCgoJbGVmdE1hdGNoOiB7fSwKCglhdHRyTWFwOiB7CgkJImNsYXNzIjogImNsYXNzTmFtZSIsCgkJImZvciI6ICJodG1sRm9yIgoJfSwKCglhdHRySGFuZGxlOiB7CgkJaHJlZjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggImhyZWYiICk7CgkJfSwKCQl0eXBlOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCAidHlwZSIgKTsKCQl9Cgl9LAoKCXJlbGF0aXZlOiB7CgkJIisiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCl7CgkJCXZhciBpc1BhcnRTdHIgPSB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIsCgkJCQlpc1RhZyA9IGlzUGFydFN0ciAmJiAhck5vbldvcmQudGVzdCggcGFydCApLAoJCQkJaXNQYXJ0U3RyTm90VGFnID0gaXNQYXJ0U3RyICYmICFpc1RhZzsKCgkJCWlmICggaXNUYWcgKSB7CgkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOwoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGgsIGVsZW07IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIChlbGVtID0gY2hlY2tTZXRbaV0pICkgewoJCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtLnByZXZpb3VzU2libGluZykgJiYgZWxlbS5ub2RlVHlwZSAhPT0gMSApIHt9CgoJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyTm90VGFnIHx8IGVsZW0gJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJ0ID8KCQkJCQkJZWxlbSB8fCBmYWxzZSA6CgkJCQkJCWVsZW0gPT09IHBhcnQ7CgkJCQl9CgkJCX0KCgkJCWlmICggaXNQYXJ0U3RyTm90VGFnICkgewoJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsKCQkJfQoJCX0sCgoJCSI+IjogZnVuY3Rpb24oIGNoZWNrU2V0LCBwYXJ0ICkgewoJCQl2YXIgZWxlbSwKCQkJCWlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiwKCQkJCWkgPSAwLAoJCQkJbCA9IGNoZWNrU2V0Lmxlbmd0aDsKCgkJCWlmICggaXNQYXJ0U3RyICYmICFyTm9uV29yZC50ZXN0KCBwYXJ0ICkgKSB7CgkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOwoKCQkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJCQllbGVtID0gY2hlY2tTZXRbaV07CgoJCQkJCWlmICggZWxlbSApIHsKCQkJCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJCQkJY2hlY2tTZXRbaV0gPSBwYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGFydCA/IHBhcmVudCA6IGZhbHNlOwoJCQkJCX0KCQkJCX0KCgkJCX0gZWxzZSB7CgkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQkJZWxlbSA9IGNoZWNrU2V0W2ldOwoKCQkJCQlpZiAoIGVsZW0gKSB7CgkJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyID8KCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA6CgkJCQkJCQllbGVtLnBhcmVudE5vZGUgPT09IHBhcnQ7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggaXNQYXJ0U3RyICkgewoJCQkJCVNpenpsZS5maWx0ZXIoIHBhcnQsIGNoZWNrU2V0LCB0cnVlICk7CgkJCQl9CgkJCX0KCQl9LAoKCQkiIjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQsIGlzWE1MKXsKCQkJdmFyIG5vZGVDaGVjaywKCQkJCWRvbmVOYW1lID0gZG9uZSsrLAoJCQkJY2hlY2tGbiA9IGRpckNoZWNrOwoKCQkJaWYgKCB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIgJiYgIXJOb25Xb3JkLnRlc3QoIHBhcnQgKSApIHsKCQkJCXBhcnQgPSBwYXJ0LnRvTG93ZXJDYXNlKCk7CgkJCQlub2RlQ2hlY2sgPSBwYXJ0OwoJCQkJY2hlY2tGbiA9IGRpck5vZGVDaGVjazsKCQkJfQoKCQkJY2hlY2tGbiggInBhcmVudE5vZGUiLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKTsKCQl9LAoKCQkifiI6IGZ1bmN0aW9uKCBjaGVja1NldCwgcGFydCwgaXNYTUwgKSB7CgkJCXZhciBub2RlQ2hlY2ssCgkJCQlkb25lTmFtZSA9IGRvbmUrKywKCQkJCWNoZWNrRm4gPSBkaXJDaGVjazsKCgkJCWlmICggdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciICYmICFyTm9uV29yZC50ZXN0KCBwYXJ0ICkgKSB7CgkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOwoJCQkJbm9kZUNoZWNrID0gcGFydDsKCQkJCWNoZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CgkJCX0KCgkJCWNoZWNrRm4oICJwcmV2aW91c1NpYmxpbmciLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKTsKCQl9Cgl9LAoKCWZpbmQ6IHsKCQlJRDogZnVuY3Rpb24oIG1hdGNoLCBjb250ZXh0LCBpc1hNTCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgIWlzWE1MICkgewoJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsKCQkJCS8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCgkJCQkvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzCgkJCQlyZXR1cm4gbSAmJiBtLnBhcmVudE5vZGUgPyBbbV0gOiBbXTsKCQkJfQoJCX0sCgoJCU5BTUU6IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSAhPT0gInVuZGVmaW5lZCIgKSB7CgkJCQl2YXIgcmV0ID0gW10sCgkJCQkJcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUoIG1hdGNoWzFdICk7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcmVzdWx0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJaWYgKCByZXN1bHRzW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpID09PSBtYXRjaFsxXSApIHsKCQkJCQkJcmV0LnB1c2goIHJlc3VsdHNbaV0gKTsKCQkJCQl9CgkJCQl9CgoJCQkJcmV0dXJuIHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0OwoJCQl9CgkJfSwKCgkJVEFHOiBmdW5jdGlvbiggbWF0Y2gsIGNvbnRleHQgKSB7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIG1hdGNoWzFdICk7CgkJCX0KCQl9Cgl9LAoJcHJlRmlsdGVyOiB7CgkJQ0xBU1M6IGZ1bmN0aW9uKCBtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MICkgewoJCQltYXRjaCA9ICIgIiArIG1hdGNoWzFdLnJlcGxhY2UoIHJCYWNrc2xhc2gsICIiICkgKyAiICI7CgoJCQlpZiAoIGlzWE1MICkgewoJCQkJcmV0dXJuIG1hdGNoOwoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBlbGVtICkgewoJCQkJCWlmICggbm90IF4gKGVsZW0uY2xhc3NOYW1lICYmICgiICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIikucmVwbGFjZSgvW1x0XG5ccl0vZywgIiAiKS5pbmRleE9mKG1hdGNoKSA+PSAwKSApIHsKCQkJCQkJaWYgKCAhaW5wbGFjZSApIHsKCQkJCQkJCXJlc3VsdC5wdXNoKCBlbGVtICk7CgkJCQkJCX0KCgkJCQkJfSBlbHNlIGlmICggaW5wbGFjZSApIHsKCQkJCQkJY3VyTG9vcFtpXSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGZhbHNlOwoJCX0sCgoJCUlEOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCXJldHVybiBtYXRjaFsxXS5yZXBsYWNlKCByQmFja3NsYXNoLCAiIiApOwoJCX0sCgoJCVRBRzogZnVuY3Rpb24oIG1hdGNoLCBjdXJMb29wICkgewoJCQlyZXR1cm4gbWF0Y2hbMV0ucmVwbGFjZSggckJhY2tzbGFzaCwgIiIgKS50b0xvd2VyQ2FzZSgpOwoJCX0sCgoJCUNISUxEOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCWlmICggbWF0Y2hbMV0gPT09ICJudGgiICkgewoJCQkJaWYgKCAhbWF0Y2hbMl0gKSB7CgkJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOwoJCQkJfQoKCQkJCW1hdGNoWzJdID0gbWF0Y2hbMl0ucmVwbGFjZSgvXlwrfFxzKi9nLCAnJyk7CgoJCQkJLy8gcGFyc2UgZXF1YXRpb25zIGxpa2UgJ2V2ZW4nLCAnb2RkJywgJzUnLCAnMm4nLCAnM24rMicsICc0bi0xJywgJy1uKzYnCgkJCQl2YXIgdGVzdCA9IC8oLT8pKFxkKikoPzpuKFsrXC1dP1xkKikpPy8uZXhlYygKCQkJCQltYXRjaFsyXSA9PT0gImV2ZW4iICYmICIybiIgfHwgbWF0Y2hbMl0gPT09ICJvZGQiICYmICIybisxIiB8fAoJCQkJCSEvXEQvLnRlc3QoIG1hdGNoWzJdICkgJiYgIjBuKyIgKyBtYXRjaFsyXSB8fCBtYXRjaFsyXSk7CgoJCQkJLy8gY2FsY3VsYXRlIHRoZSBudW1iZXJzIChmaXJzdCluKyhsYXN0KSBpbmNsdWRpbmcgaWYgdGhleSBhcmUgbmVnYXRpdmUKCQkJCW1hdGNoWzJdID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkgLSAwOwoJCQkJbWF0Y2hbM10gPSB0ZXN0WzNdIC0gMDsKCQkJfQoJCQllbHNlIGlmICggbWF0Y2hbMl0gKSB7CgkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CgkJCX0KCgkJCS8vIFRPRE86IE1vdmUgdG8gbm9ybWFsIGNhY2hpbmcgc3lzdGVtCgkJCW1hdGNoWzBdID0gZG9uZSsrOwoKCQkJcmV0dXJuIG1hdGNoOwoJCX0sCgoJCUFUVFI6IGZ1bmN0aW9uKCBtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MICkgewoJCQl2YXIgbmFtZSA9IG1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggckJhY2tzbGFzaCwgIiIgKTsKCQkJCgkJCWlmICggIWlzWE1MICYmIEV4cHIuYXR0ck1hcFtuYW1lXSApIHsKCQkJCW1hdGNoWzFdID0gRXhwci5hdHRyTWFwW25hbWVdOwoJCQl9CgoJCQkvLyBIYW5kbGUgaWYgYW4gdW4tcXVvdGVkIHZhbHVlIHdhcyB1c2VkCgkJCW1hdGNoWzRdID0gKCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJCYWNrc2xhc2gsICIiICk7CgoJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgewoJCQkJbWF0Y2hbNF0gPSAiICIgKyBtYXRjaFs0XSArICIgIjsKCQkJfQoKCQkJcmV0dXJuIG1hdGNoOwoJCX0sCgoJCVBTRVVETzogZnVuY3Rpb24oIG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCApIHsKCQkJaWYgKCBtYXRjaFsxXSA9PT0gIm5vdCIgKSB7CgkJCQkvLyBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBjb21wbGV4IGV4cHJlc3Npb24sIG9yIGEgc2ltcGxlIG9uZQoJCQkJaWYgKCAoIGNodW5rZXIuZXhlYyhtYXRjaFszXSkgfHwgIiIgKS5sZW5ndGggPiAxIHx8IC9eXHcvLnRlc3QobWF0Y2hbM10pICkgewoJCQkJCW1hdGNoWzNdID0gU2l6emxlKG1hdGNoWzNdLCBudWxsLCBudWxsLCBjdXJMb29wKTsKCgkJCQl9IGVsc2UgewoJCQkJCXZhciByZXQgPSBTaXp6bGUuZmlsdGVyKG1hdGNoWzNdLCBjdXJMb29wLCBpbnBsYWNlLCB0cnVlIF4gbm90KTsKCgkJCQkJaWYgKCAhaW5wbGFjZSApIHsKCQkJCQkJcmVzdWx0LnB1c2guYXBwbHkoIHJlc3VsdCwgcmV0ICk7CgkJCQkJfQoKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgoJCQl9IGVsc2UgaWYgKCBFeHByLm1hdGNoLlBPUy50ZXN0KCBtYXRjaFswXSApIHx8IEV4cHIubWF0Y2guQ0hJTEQudGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJCQoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCgkJUE9TOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCW1hdGNoLnVuc2hpZnQoIHRydWUgKTsKCgkJCXJldHVybiBtYXRjaDsKCQl9Cgl9LAoJCglmaWx0ZXJzOiB7CgkJZW5hYmxlZDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSAmJiBlbGVtLnR5cGUgIT09ICJoaWRkZW4iOwoJCX0sCgoJCWRpc2FibGVkOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7CgkJfSwKCgkJY2hlY2tlZDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmNoZWNrZWQgPT09IHRydWU7CgkJfSwKCQkKCQlzZWxlY3RlZDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCS8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHQKCQkJLy8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseQoJCQlpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OwoJCQl9CgkJCQoJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTsKCQl9LAoKCQlwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gISFlbGVtLmZpcnN0Q2hpbGQ7CgkJfSwKCgkJZW1wdHk6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gIWVsZW0uZmlyc3RDaGlsZDsKCQl9LAoKCQloYXM6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuICEhU2l6emxlKCBtYXRjaFszXSwgZWxlbSApLmxlbmd0aDsKCQl9LAoKCQloZWFkZXI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gKC9oXGQvaSkudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgoJCXRleHQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCAidHlwZSIgKSwgdHlwZSA9IGVsZW0udHlwZTsKCQkJLy8gSUU2IGFuZCA3IHdpbGwgbWFwIGVsZW0udHlwZSB0byAndGV4dCcgZm9yIG5ldyBIVE1MNSB0eXBlcyAoc2VhcmNoLCBldGMpIAoJCQkvLyB1c2UgZ2V0QXR0cmlidXRlIGluc3RlYWQgdG8gdGVzdCB0aGlzIGNhc2UKCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiAmJiAidGV4dCIgPT09IHR5cGUgJiYgKCBhdHRyID09PSB0eXBlIHx8IGF0dHIgPT09IG51bGwgKTsKCQl9LAoKCQlyYWRpbzogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYgInJhZGlvIiA9PT0gZWxlbS50eXBlOwoJCX0sCgoJCWNoZWNrYm94OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiAmJiAiY2hlY2tib3giID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJZmlsZTogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYgImZpbGUiID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJcGFzc3dvcmQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAiaW5wdXQiICYmICJwYXNzd29yZCIgPT09IGVsZW0udHlwZTsKCQl9LAoKCQlzdWJtaXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChuYW1lID09PSAiaW5wdXQiIHx8IG5hbWUgPT09ICJidXR0b24iKSAmJiAic3VibWl0IiA9PT0gZWxlbS50eXBlOwoJCX0sCgoJCWltYWdlOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiAmJiAiaW1hZ2UiID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJcmVzZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChuYW1lID09PSAiaW5wdXQiIHx8IG5hbWUgPT09ICJidXR0b24iKSAmJiAicmVzZXQiID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJYnV0dG9uOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXJldHVybiBuYW1lID09PSAiaW5wdXQiICYmICJidXR0b24iID09PSBlbGVtLnR5cGUgfHwgbmFtZSA9PT0gImJ1dHRvbiI7CgkJfSwKCgkJaW5wdXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gKC9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kpLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKCQl9LAoKCQlmb2N1czogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtID09PSBlbGVtLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCQl9Cgl9LAoJc2V0RmlsdGVyczogewoJCWZpcnN0OiBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuIGkgPT09IDA7CgkJfSwKCgkJbGFzdDogZnVuY3Rpb24oIGVsZW0sIGksIG1hdGNoLCBhcnJheSApIHsKCQkJcmV0dXJuIGkgPT09IGFycmF5Lmxlbmd0aCAtIDE7CgkJfSwKCgkJZXZlbjogZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBpICUgMiA9PT0gMDsKCQl9LAoKCQlvZGQ6IGZ1bmN0aW9uKCBlbGVtLCBpICkgewoJCQlyZXR1cm4gaSAlIDIgPT09IDE7CgkJfSwKCgkJbHQ6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuIGkgPCBtYXRjaFszXSAtIDA7CgkJfSwKCgkJZ3Q6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuIGkgPiBtYXRjaFszXSAtIDA7CgkJfSwKCgkJbnRoOiBmdW5jdGlvbiggZWxlbSwgaSwgbWF0Y2ggKSB7CgkJCXJldHVybiBtYXRjaFszXSAtIDAgPT09IGk7CgkJfSwKCgkJZXE6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PT0gaTsKCQl9Cgl9LAoJZmlsdGVyOiB7CgkJUFNFVURPOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2gsIGksIGFycmF5ICkgewoJCQl2YXIgbmFtZSA9IG1hdGNoWzFdLAoJCQkJZmlsdGVyID0gRXhwci5maWx0ZXJzWyBuYW1lIF07CgoJCQlpZiAoIGZpbHRlciApIHsKCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOwoKCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gImNvbnRhaW5zIiApIHsKCQkJCXJldHVybiAoZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCBTaXp6bGUuZ2V0VGV4dChbIGVsZW0gXSkgfHwgIiIpLmluZGV4T2YobWF0Y2hbM10pID49IDA7CgoJCQl9IGVsc2UgaWYgKCBuYW1lID09PSAibm90IiApIHsKCQkJCXZhciBub3QgPSBtYXRjaFszXTsKCgkJCQlmb3IgKCB2YXIgaiA9IDAsIGwgPSBub3QubGVuZ3RoOyBqIDwgbDsgaisrICkgewoJCQkJCWlmICggbm90W2pdID09PSBlbGVtICkgewoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJfQoKCQkJCXJldHVybiB0cnVlOwoKCQkJfSBlbHNlIHsKCQkJCVNpenpsZS5lcnJvciggbmFtZSApOwoJCQl9CgkJfSwKCgkJQ0hJTEQ6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJdmFyIHR5cGUgPSBtYXRjaFsxXSwKCQkJCW5vZGUgPSBlbGVtOwoKCQkJc3dpdGNoICggdHlwZSApIHsKCQkJCWNhc2UgIm9ubHkiOgoJCQkJY2FzZSAiZmlyc3QiOgoJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZykgKQkgewoJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7IAoJCQkJCQkJcmV0dXJuIGZhbHNlOyAKCQkJCQkJfQoJCQkJCX0KCgkJCQkJaWYgKCB0eXBlID09PSAiZmlyc3QiICkgeyAKCQkJCQkJcmV0dXJuIHRydWU7IAoJCQkJCX0KCgkJCQkJbm9kZSA9IGVsZW07CgoJCQkJY2FzZSAibGFzdCI6CgkJCQkJd2hpbGUgKCAobm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpICkJIHsKCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgeyAKCQkJCQkJCXJldHVybiBmYWxzZTsgCgkJCQkJCX0KCQkJCQl9CgoJCQkJCXJldHVybiB0cnVlOwoKCQkJCWNhc2UgIm50aCI6CgkJCQkJdmFyIGZpcnN0ID0gbWF0Y2hbMl0sCgkJCQkJCWxhc3QgPSBtYXRjaFszXTsKCgkJCQkJaWYgKCBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQkJCgkJCQkJdmFyIGRvbmVOYW1lID0gbWF0Y2hbMF0sCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQoJCQkJCWlmICggcGFyZW50ICYmIChwYXJlbnQuc2l6Y2FjaGUgIT09IGRvbmVOYW1lIHx8ICFlbGVtLm5vZGVJbmRleCkgKSB7CgkJCQkJCXZhciBjb3VudCA9IDA7CgkJCQkJCQoJCQkJCQlmb3IgKCBub2RlID0gcGFyZW50LmZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nICkgewoJCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJCW5vZGUubm9kZUluZGV4ID0gKytjb3VudDsKCQkJCQkJCX0KCQkJCQkJfSAKCgkJCQkJCXBhcmVudC5zaXpjYWNoZSA9IGRvbmVOYW1lOwoJCQkJCX0KCQkJCQkKCQkJCQl2YXIgZGlmZiA9IGVsZW0ubm9kZUluZGV4IC0gbGFzdDsKCgkJCQkJaWYgKCBmaXJzdCA9PT0gMCApIHsKCQkJCQkJcmV0dXJuIGRpZmYgPT09IDA7CgoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldHVybiAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJfQoJCX0sCgoJCUlEOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2ggKSB7CgkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxICYmIGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpID09PSBtYXRjaDsKCQl9LAoKCQlUQUc6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJcmV0dXJuIChtYXRjaCA9PT0gIioiICYmIGVsZW0ubm9kZVR5cGUgPT09IDEpIHx8IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbWF0Y2g7CgkJfSwKCQkKCQlDTEFTUzogZnVuY3Rpb24oIGVsZW0sIG1hdGNoICkgewoJCQlyZXR1cm4gKCIgIiArIChlbGVtLmNsYXNzTmFtZSB8fCBlbGVtLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkgKyAiICIpCgkJCQkuaW5kZXhPZiggbWF0Y2ggKSA+IC0xOwoJCX0sCgoJCUFUVFI6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwKCQkJCXJlc3VsdCA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZSBdID8KCQkJCQlFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSggZWxlbSApIDoKCQkJCQllbGVtWyBuYW1lIF0gIT0gbnVsbCA/CgkJCQkJCWVsZW1bIG5hbWUgXSA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICksCgkJCQl2YWx1ZSA9IHJlc3VsdCArICIiLAoJCQkJdHlwZSA9IG1hdGNoWzJdLAoJCQkJY2hlY2sgPSBtYXRjaFs0XTsKCgkJCXJldHVybiByZXN1bHQgPT0gbnVsbCA/CgkJCQl0eXBlID09PSAiIT0iIDoKCQkJCXR5cGUgPT09ICI9IiA/CgkJCQl2YWx1ZSA9PT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gIio9IiA/CgkJCQl2YWx1ZS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKCQkJCXR5cGUgPT09ICJ+PSIgPwoJCQkJKCIgIiArIHZhbHVlICsgIiAiKS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKCQkJCSFjaGVjayA/CgkJCQl2YWx1ZSAmJiByZXN1bHQgIT09IGZhbHNlIDoKCQkJCXR5cGUgPT09ICIhPSIgPwoJCQkJdmFsdWUgIT09IGNoZWNrIDoKCQkJCXR5cGUgPT09ICJePSIgPwoJCQkJdmFsdWUuaW5kZXhPZihjaGVjaykgPT09IDAgOgoJCQkJdHlwZSA9PT0gIiQ9IiA/CgkJCQl2YWx1ZS5zdWJzdHIodmFsdWUubGVuZ3RoIC0gY2hlY2subGVuZ3RoKSA9PT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gInw9IiA/CgkJCQl2YWx1ZSA9PT0gY2hlY2sgfHwgdmFsdWUuc3Vic3RyKDAsIGNoZWNrLmxlbmd0aCArIDEpID09PSBjaGVjayArICItIiA6CgkJCQlmYWxzZTsKCQl9LAoKCQlQT1M6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCwgaSwgYXJyYXkgKSB7CgkJCXZhciBuYW1lID0gbWF0Y2hbMl0sCgkJCQlmaWx0ZXIgPSBFeHByLnNldEZpbHRlcnNbIG5hbWUgXTsKCgkJCWlmICggZmlsdGVyICkgewoJCQkJcmV0dXJuIGZpbHRlciggZWxlbSwgaSwgbWF0Y2gsIGFycmF5ICk7CgkJCX0KCQl9Cgl9Cn07Cgp2YXIgb3JpZ1BPUyA9IEV4cHIubWF0Y2guUE9TLAoJZmVzY2FwZSA9IGZ1bmN0aW9uKGFsbCwgbnVtKXsKCQlyZXR1cm4gIlxcIiArIChudW0gLSAwICsgMSk7Cgl9OwoKZm9yICggdmFyIHR5cGUgaW4gRXhwci5tYXRjaCApIHsKCUV4cHIubWF0Y2hbIHR5cGUgXSA9IG5ldyBSZWdFeHAoIEV4cHIubWF0Y2hbIHR5cGUgXS5zb3VyY2UgKyAoLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlKSApOwoJRXhwci5sZWZ0TWF0Y2hbIHR5cGUgXSA9IG5ldyBSZWdFeHAoIC8oXig/Oi58XHJ8XG4pKj8pLy5zb3VyY2UgKyBFeHByLm1hdGNoWyB0eXBlIF0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZywgZmVzY2FwZSkgKTsKfQoKdmFyIG1ha2VBcnJheSA9IGZ1bmN0aW9uKCBhcnJheSwgcmVzdWx0cyApIHsKCWFycmF5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFycmF5LCAwICk7CgoJaWYgKCByZXN1bHRzICkgewoJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgYXJyYXkgKTsKCQlyZXR1cm4gcmVzdWx0czsKCX0KCQoJcmV0dXJuIGFycmF5Owp9OwoKLy8gUGVyZm9ybSBhIHNpbXBsZSBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGhlIGJyb3dzZXIgaXMgY2FwYWJsZSBvZgovLyBjb252ZXJ0aW5nIGEgTm9kZUxpc3QgdG8gYW4gYXJyYXkgdXNpbmcgYnVpbHRpbiBtZXRob2RzLgovLyBBbHNvIHZlcmlmaWVzIHRoYXQgdGhlIHJldHVybmVkIGFycmF5IGhvbGRzIERPTSBub2RlcwovLyAod2hpY2ggaXMgbm90IHRoZSBjYXNlIGluIHRoZSBCbGFja2JlcnJ5IGJyb3dzZXIpCnRyeSB7CglBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsIDAgKVswXS5ub2RlVHlwZTsKCi8vIFByb3ZpZGUgYSBmYWxsYmFjayBtZXRob2QgaWYgaXQgZG9lcyBub3Qgd29yawp9IGNhdGNoKCBlICkgewoJbWFrZUFycmF5ID0gZnVuY3Rpb24oIGFycmF5LCByZXN1bHRzICkgewoJCXZhciBpID0gMCwKCQkJcmV0ID0gcmVzdWx0cyB8fCBbXTsKCgkJaWYgKCB0b1N0cmluZy5jYWxsKGFycmF5KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsKCQkJQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoIHJldCwgYXJyYXkgKTsKCgkJfSBlbHNlIHsKCQkJaWYgKCB0eXBlb2YgYXJyYXkubGVuZ3RoID09PSAibnVtYmVyIiApIHsKCQkJCWZvciAoIHZhciBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCXJldC5wdXNoKCBhcnJheVtpXSApOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCWZvciAoIDsgYXJyYXlbaV07IGkrKyApIHsKCQkJCQlyZXQucHVzaCggYXJyYXlbaV0gKTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX07Cn0KCnZhciBzb3J0T3JkZXIsIHNpYmxpbmdDaGVjazsKCmlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICkgewoJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7CgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCWlmICggIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gfHwgIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7CgkJCXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID8gLTEgOiAxOwoJCX0KCgkJcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgJiA0ID8gLTEgOiAxOwoJfTsKCn0gZWxzZSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQkvLyBUaGUgbm9kZXMgYXJlIGlkZW50aWNhbCwgd2UgY2FuIGV4aXQgZWFybHkKCQlpZiAoIGEgPT09IGIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJCXJldHVybiAwOwoKCQkvLyBGYWxsYmFjayB0byB1c2luZyBzb3VyY2VJbmRleCAoaW4gSUUpIGlmIGl0J3MgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXMKCQl9IGVsc2UgaWYgKCBhLnNvdXJjZUluZGV4ICYmIGIuc291cmNlSW5kZXggKSB7CgkJCXJldHVybiBhLnNvdXJjZUluZGV4IC0gYi5zb3VyY2VJbmRleDsKCQl9CgoJCXZhciBhbCwgYmwsCgkJCWFwID0gW10sCgkJCWJwID0gW10sCgkJCWF1cCA9IGEucGFyZW50Tm9kZSwKCQkJYnVwID0gYi5wYXJlbnROb2RlLAoJCQljdXIgPSBhdXA7CgoJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MgKG9yIGlkZW50aWNhbCkgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2sKCQlpZiAoIGF1cCA9PT0gYnVwICkgewoJCQlyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7CgoJCS8vIElmIG5vIHBhcmVudHMgd2VyZSBmb3VuZCB0aGVuIHRoZSBub2RlcyBhcmUgZGlzY29ubmVjdGVkCgkJfSBlbHNlIGlmICggIWF1cCApIHsKCQkJcmV0dXJuIC0xOwoKCQl9IGVsc2UgaWYgKCAhYnVwICkgewoJCQlyZXR1cm4gMTsKCQl9CgoJCS8vIE90aGVyd2lzZSB0aGV5J3JlIHNvbWV3aGVyZSBlbHNlIGluIHRoZSB0cmVlIHNvIHdlIG5lZWQKCQkvLyB0byBidWlsZCB1cCBhIGZ1bGwgbGlzdCBvZiB0aGUgcGFyZW50Tm9kZXMgZm9yIGNvbXBhcmlzb24KCQl3aGlsZSAoIGN1ciApIHsKCQkJYXAudW5zaGlmdCggY3VyICk7CgkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCX0KCgkJY3VyID0gYnVwOwoKCQl3aGlsZSAoIGN1ciApIHsKCQkJYnAudW5zaGlmdCggY3VyICk7CgkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCX0KCgkJYWwgPSBhcC5sZW5ndGg7CgkJYmwgPSBicC5sZW5ndGg7CgoJCS8vIFN0YXJ0IHdhbGtpbmcgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5CgkJZm9yICggdmFyIGkgPSAwOyBpIDwgYWwgJiYgaSA8IGJsOyBpKysgKSB7CgkJCWlmICggYXBbaV0gIT09IGJwW2ldICkgewoJCQkJcmV0dXJuIHNpYmxpbmdDaGVjayggYXBbaV0sIGJwW2ldICk7CgkJCX0KCQl9CgoJCS8vIFdlIGVuZGVkIHNvbWVwbGFjZSB1cCB0aGUgdHJlZSBzbyBkbyBhIHNpYmxpbmcgY2hlY2sKCQlyZXR1cm4gaSA9PT0gYWwgPwoJCQlzaWJsaW5nQ2hlY2soIGEsIGJwW2ldLCAtMSApIDoKCQkJc2libGluZ0NoZWNrKCBhcFtpXSwgYiwgMSApOwoJfTsKCglzaWJsaW5nQ2hlY2sgPSBmdW5jdGlvbiggYSwgYiwgcmV0ICkgewoJCWlmICggYSA9PT0gYiApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXZhciBjdXIgPSBhLm5leHRTaWJsaW5nOwoKCQl3aGlsZSAoIGN1ciApIHsKCQkJaWYgKCBjdXIgPT09IGIgKSB7CgkJCQlyZXR1cm4gLTE7CgkJCX0KCgkJCWN1ciA9IGN1ci5uZXh0U2libGluZzsKCQl9CgoJCXJldHVybiAxOwoJfTsKfQoKLy8gVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmVpdmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbXMgKSB7Cgl2YXIgcmV0ID0gIiIsIGVsZW07CgoJZm9yICggdmFyIGkgPSAwOyBlbGVtc1tpXTsgaSsrICkgewoJCWVsZW0gPSBlbGVtc1tpXTsKCgkJLy8gR2V0IHRoZSB0ZXh0IGZyb20gdGV4dCBub2RlcyBhbmQgQ0RBVEEgbm9kZXMKCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gNCApIHsKCQkJcmV0ICs9IGVsZW0ubm9kZVZhbHVlOwoKCQkvLyBUcmF2ZXJzZSBldmVyeXRoaW5nIGVsc2UsIGV4Y2VwdCBjb21tZW50IG5vZGVzCgkJfSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSAhPT0gOCApIHsKCQkJcmV0ICs9IFNpenpsZS5nZXRUZXh0KCBlbGVtLmNoaWxkTm9kZXMgKTsKCQl9Cgl9CgoJcmV0dXJuIHJldDsKfTsKCi8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYnJvd3NlciByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUgd2hlbgovLyBxdWVyeWluZyBieSBnZXRFbGVtZW50QnlJZCAoYW5kIHByb3ZpZGUgYSB3b3JrYXJvdW5kKQooZnVuY3Rpb24oKXsKCS8vIFdlJ3JlIGdvaW5nIHRvIGluamVjdCBhIGZha2UgaW5wdXQgZWxlbWVudCB3aXRoIGEgc3BlY2lmaWVkIG5hbWUKCXZhciBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksCgkJaWQgPSAic2NyaXB0IiArIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCksCgkJcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCglmb3JtLmlubmVySFRNTCA9ICI8YSBuYW1lPSciICsgaWQgKyAiJy8+IjsKCgkvLyBJbmplY3QgaXQgaW50byB0aGUgcm9vdCBlbGVtZW50LCBjaGVjayBpdHMgc3RhdHVzLCBhbmQgcmVtb3ZlIGl0IHF1aWNrbHkKCXJvb3QuaW5zZXJ0QmVmb3JlKCBmb3JtLCByb290LmZpcnN0Q2hpbGQgKTsKCgkvLyBUaGUgd29ya2Fyb3VuZCBoYXMgdG8gZG8gYWRkaXRpb25hbCBjaGVja3MgYWZ0ZXIgYSBnZXRFbGVtZW50QnlJZAoJLy8gV2hpY2ggc2xvd3MgdGhpbmdzIGRvd24gZm9yIG90aGVyIGJyb3dzZXJzIChoZW5jZSB0aGUgYnJhbmNoaW5nKQoJaWYgKCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggaWQgKSApIHsKCQlFeHByLmZpbmQuSUQgPSBmdW5jdGlvbiggbWF0Y2gsIGNvbnRleHQsIGlzWE1MICkgewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOwoKCQkJCXJldHVybiBtID8KCQkJCQltLmlkID09PSBtYXRjaFsxXSB8fCB0eXBlb2YgbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSAidW5kZWZpbmVkIiAmJiBtLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlID09PSBtYXRjaFsxXSA/CgkJCQkJCVttXSA6CgkJCQkJCXVuZGVmaW5lZCA6CgkJCQkJW107CgkJCX0KCQl9OwoKCQlFeHByLmZpbHRlci5JRCA9IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJdmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSAidW5kZWZpbmVkIiAmJiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7CgoJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlICYmIG5vZGUubm9kZVZhbHVlID09PSBtYXRjaDsKCQl9OwoJfQoKCXJvb3QucmVtb3ZlQ2hpbGQoIGZvcm0gKTsKCgkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJcm9vdCA9IGZvcm0gPSBudWxsOwp9KSgpOwoKKGZ1bmN0aW9uKCl7CgkvLyBDaGVjayB0byBzZWUgaWYgdGhlIGJyb3dzZXIgcmV0dXJucyBvbmx5IGVsZW1lbnRzCgkvLyB3aGVuIGRvaW5nIGdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikKCgkvLyBDcmVhdGUgYSBmYWtlIGVsZW1lbnQKCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCWRpdi5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgiIikgKTsKCgkvLyBNYWtlIHN1cmUgbm8gY29tbWVudHMgYXJlIGZvdW5kCglpZiAoIGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aCA+IDAgKSB7CgkJRXhwci5maW5kLlRBRyA9IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCApIHsKCQkJdmFyIHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBtYXRjaFsxXSApOwoKCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cwoJCQlpZiAoIG1hdGNoWzFdID09PSAiKiIgKSB7CgkJCQl2YXIgdG1wID0gW107CgoJCQkJZm9yICggdmFyIGkgPSAwOyByZXN1bHRzW2ldOyBpKysgKSB7CgkJCQkJaWYgKCByZXN1bHRzW2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQl0bXAucHVzaCggcmVzdWx0c1tpXSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXN1bHRzID0gdG1wOwoJCQl9CgoJCQlyZXR1cm4gcmVzdWx0czsKCQl9OwoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiBhbiBhdHRyaWJ1dGUgcmV0dXJucyBub3JtYWxpemVkIGhyZWYgYXR0cmlidXRlcwoJZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScjJz48L2E+IjsKCglpZiAoIGRpdi5maXJzdENoaWxkICYmIHR5cGVvZiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUgIT09ICJ1bmRlZmluZWQiICYmCgkJCWRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpICE9PSAiIyIgKSB7CgoJCUV4cHIuYXR0ckhhbmRsZS5ocmVmID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggImhyZWYiLCAyICk7CgkJfTsKCX0KCgkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJZGl2ID0gbnVsbDsKfSkoKTsKCmlmICggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApIHsKCShmdW5jdGlvbigpewoJCXZhciBvbGRTaXp6bGUgPSBTaXp6bGUsCgkJCWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAoJCQlpZCA9ICJfX3NpenpsZV9fIjsKCgkJZGl2LmlubmVySFRNTCA9ICI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7CgoJCS8vIFNhZmFyaSBjYW4ndCBoYW5kbGUgdXBwZXJjYXNlIG9yIHVuaWNvZGUgY2hhcmFjdGVycyB3aGVuCgkJLy8gaW4gcXVpcmtzIG1vZGUuCgkJaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCAmJiBkaXYucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGggPT09IDAgKSB7CgkJCXJldHVybjsKCQl9CgkKCQlTaXp6bGUgPSBmdW5jdGlvbiggcXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkICkgewoJCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKCgkJCS8vIE9ubHkgdXNlIHF1ZXJ5U2VsZWN0b3JBbGwgb24gbm9uLVhNTCBkb2N1bWVudHMKCQkJLy8gKElEIHNlbGVjdG9ycyBkb24ndCB3b3JrIGluIG5vbi1IVE1MIGRvY3VtZW50cykKCQkJaWYgKCAhc2VlZCAmJiAhU2l6emxlLmlzWE1MKGNvbnRleHQpICkgewoJCQkJLy8gU2VlIGlmIHdlIGZpbmQgYSBzZWxlY3RvciB0byBzcGVlZCB1cAoJCQkJdmFyIG1hdGNoID0gL14oXHcrJCl8XlwuKFtcd1wtXSskKXxeIyhbXHdcLV0rJCkvLmV4ZWMoIHF1ZXJ5ICk7CgkJCQkKCQkJCWlmICggbWF0Y2ggJiYgKGNvbnRleHQubm9kZVR5cGUgPT09IDEgfHwgY29udGV4dC5ub2RlVHlwZSA9PT0gOSkgKSB7CgkJCQkJLy8gU3BlZWQtdXA6IFNpenpsZSgiVEFHIikKCQkJCQlpZiAoIG1hdGNoWzFdICkgewoJCQkJCQlyZXR1cm4gbWFrZUFycmF5KCBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBxdWVyeSApLCBleHRyYSApOwoJCQkJCQoJCQkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoIi5DTEFTUyIpCgkJCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gJiYgRXhwci5maW5kLkNMQVNTICYmIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHsKCQkJCQkJcmV0dXJuIG1ha2VBcnJheSggY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBtYXRjaFsyXSApLCBleHRyYSApOwoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJaWYgKCBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICkgewoJCQkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoImJvZHkiKQoJCQkJCS8vIFRoZSBib2R5IGVsZW1lbnQgb25seSBleGlzdHMgb25jZSwgb3B0aW1pemUgZmluZGluZyBpdAoJCQkJCWlmICggcXVlcnkgPT09ICJib2R5IiAmJiBjb250ZXh0LmJvZHkgKSB7CgkJCQkJCXJldHVybiBtYWtlQXJyYXkoIFsgY29udGV4dC5ib2R5IF0sIGV4dHJhICk7CgkJCQkJCQoJCQkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoIiNJRCIpCgkJCQkJfSBlbHNlIGlmICggbWF0Y2ggJiYgbWF0Y2hbM10gKSB7CgkJCQkJCXZhciBlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbM10gKTsKCgkJCQkJCS8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCgkJCQkJCS8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjMKCQkJCQkJaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBJRSBhbmQgT3BlcmEgcmV0dXJuIGl0ZW1zCgkJCQkJCQkvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQKCQkJCQkJCWlmICggZWxlbS5pZCA9PT0gbWF0Y2hbM10gKSB7CgkJCQkJCQkJcmV0dXJuIG1ha2VBcnJheSggWyBlbGVtIF0sIGV4dHJhICk7CgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXJldHVybiBtYWtlQXJyYXkoIFtdLCBleHRyYSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJCQoJCQkJCXRyeSB7CgkJCQkJCXJldHVybiBtYWtlQXJyYXkoIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbChxdWVyeSksIGV4dHJhICk7CgkJCQkJfSBjYXRjaChxc2FFcnJvcikge30KCgkJCQkvLyBxU0Egd29ya3Mgc3RyYW5nZWx5IG9uIEVsZW1lbnQtcm9vdGVkIHF1ZXJpZXMKCQkJCS8vIFdlIGNhbiB3b3JrIGFyb3VuZCB0aGlzIGJ5IHNwZWNpZnlpbmcgYW4gZXh0cmEgSUQgb24gdGhlIHJvb3QKCQkJCS8vIGFuZCB3b3JraW5nIHVwIGZyb20gdGhlcmUgKFRoYW5rcyB0byBBbmRyZXcgRHVwb250IGZvciB0aGUgdGVjaG5pcXVlKQoJCQkJLy8gSUUgOCBkb2Vzbid0IHdvcmsgb24gb2JqZWN0IGVsZW1lbnRzCgkJCQl9IGVsc2UgaWYgKCBjb250ZXh0Lm5vZGVUeXBlID09PSAxICYmIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7CgkJCQkJdmFyIG9sZENvbnRleHQgPSBjb250ZXh0LAoJCQkJCQlvbGQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZSggImlkIiApLAoJCQkJCQluaWQgPSBvbGQgfHwgaWQsCgkJCQkJCWhhc1BhcmVudCA9IGNvbnRleHQucGFyZW50Tm9kZSwKCQkJCQkJcmVsYXRpdmVIaWVyYXJjaHlTZWxlY3RvciA9IC9eXHMqWyt+XS8udGVzdCggcXVlcnkgKTsKCgkJCQkJaWYgKCAhb2xkICkgewoJCQkJCQljb250ZXh0LnNldEF0dHJpYnV0ZSggImlkIiwgbmlkICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJbmlkID0gbmlkLnJlcGxhY2UoIC8nL2csICJcXCQmIiApOwoJCQkJCX0KCQkJCQlpZiAoIHJlbGF0aXZlSGllcmFyY2h5U2VsZWN0b3IgJiYgaGFzUGFyZW50ICkgewoJCQkJCQljb250ZXh0ID0gY29udGV4dC5wYXJlbnROb2RlOwoJCQkJCX0KCgkJCQkJdHJ5IHsKCQkJCQkJaWYgKCAhcmVsYXRpdmVIaWVyYXJjaHlTZWxlY3RvciB8fCBoYXNQYXJlbnQgKSB7CgkJCQkJCQlyZXR1cm4gbWFrZUFycmF5KCBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoICJbaWQ9JyIgKyBuaWQgKyAiJ10gIiArIHF1ZXJ5ICksIGV4dHJhICk7CgkJCQkJCX0KCgkJCQkJfSBjYXRjaChwc2V1ZG9FcnJvcikgewoJCQkJCX0gZmluYWxseSB7CgkJCQkJCWlmICggIW9sZCApIHsKCQkJCQkJCW9sZENvbnRleHQucmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkKCQkJcmV0dXJuIG9sZFNpenpsZShxdWVyeSwgY29udGV4dCwgZXh0cmEsIHNlZWQpOwoJCX07CgoJCWZvciAoIHZhciBwcm9wIGluIG9sZFNpenpsZSApIHsKCQkJU2l6emxlWyBwcm9wIF0gPSBvbGRTaXp6bGVbIHByb3AgXTsKCQl9CgoJCS8vIHJlbGVhc2UgbWVtb3J5IGluIElFCgkJZGl2ID0gbnVsbDsKCX0pKCk7Cn0KCihmdW5jdGlvbigpewoJdmFyIGh0bWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCgkJbWF0Y2hlcyA9IGh0bWwubWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwubXNNYXRjaGVzU2VsZWN0b3I7CgoJaWYgKCBtYXRjaGVzICkgewoJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgoJCS8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUgKElFIDkgZmFpbHMgdGhpcykKCQl2YXIgZGlzY29ubmVjdGVkTWF0Y2ggPSAhbWF0Y2hlcy5jYWxsKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApLCAiZGl2IiApLAoJCQlwc2V1ZG9Xb3JrcyA9IGZhbHNlOwoKCQl0cnkgewoJCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uCgkJCS8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWQKCQkJbWF0Y2hlcy5jYWxsKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICJbdGVzdCE9JyddOnNpenpsZSIgKTsKCQoJCX0gY2F0Y2goIHBzZXVkb0Vycm9yICkgewoJCQlwc2V1ZG9Xb3JrcyA9IHRydWU7CgkJfQoKCQlTaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIG5vZGUsIGV4cHIgKSB7CgkJCS8vIE1ha2Ugc3VyZSB0aGF0IGF0dHJpYnV0ZSBzZWxlY3RvcnMgYXJlIHF1b3RlZAoJCQlleHByID0gZXhwci5yZXBsYWNlKC9cPVxzKihbXiciXF1dKilccypcXS9nLCAiPSckMSddIik7CgoJCQlpZiAoICFTaXp6bGUuaXNYTUwoIG5vZGUgKSApIHsKCQkJCXRyeSB7IAoJCQkJCWlmICggcHNldWRvV29ya3MgfHwgIUV4cHIubWF0Y2guUFNFVURPLnRlc3QoIGV4cHIgKSAmJiAhLyE9Ly50ZXN0KCBleHByICkgKSB7CgkJCQkJCXZhciByZXQgPSBtYXRjaGVzLmNhbGwoIG5vZGUsIGV4cHIgKTsKCgkJCQkJCS8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXMKCQkJCQkJaWYgKCByZXQgfHwgIWRpc2Nvbm5lY3RlZE1hdGNoIHx8CgkJCQkJCQkJLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnQKCQkJCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5LCBzbyBjaGVjayBmb3IgdGhhdAoJCQkJCQkJCW5vZGUuZG9jdW1lbnQgJiYgbm9kZS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7CgkJCQkJCQlyZXR1cm4gcmV0OwoJCQkJCQl9CgkJCQkJfQoJCQkJfSBjYXRjaChlKSB7fQoJCQl9CgoJCQlyZXR1cm4gU2l6emxlKGV4cHIsIG51bGwsIG51bGwsIFtub2RlXSkubGVuZ3RoID4gMDsKCQl9OwoJfQp9KSgpOwoKKGZ1bmN0aW9uKCl7Cgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgoJZGl2LmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPSd0ZXN0IGUnPjwvZGl2PjxkaXYgY2xhc3M9J3Rlc3QnPjwvZGl2PiI7CgoJLy8gT3BlcmEgY2FuJ3QgZmluZCBhIHNlY29uZCBjbGFzc25hbWUgKGluIDkuNikKCS8vIEFsc28sIG1ha2Ugc3VyZSB0aGF0IGdldEVsZW1lbnRzQnlDbGFzc05hbWUgYWN0dWFsbHkgZXhpc3RzCglpZiAoICFkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSB8fCBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMCApIHsKCQlyZXR1cm47Cgl9CgoJLy8gU2FmYXJpIGNhY2hlcyBjbGFzcyBhdHRyaWJ1dGVzLCBkb2Vzbid0IGNhdGNoIGNoYW5nZXMgKGluIDMuMikKCWRpdi5sYXN0Q2hpbGQuY2xhc3NOYW1lID0gImUiOwoKCWlmICggZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggPT09IDEgKSB7CgkJcmV0dXJuOwoJfQoJCglFeHByLm9yZGVyLnNwbGljZSgxLCAwLCAiQ0xBU1MiKTsKCUV4cHIuZmluZC5DTEFTUyA9IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCwgaXNYTUwgKSB7CgkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobWF0Y2hbMV0pOwoJCX0KCX07CgoJLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKCWRpdiA9IG51bGw7Cn0pKCk7CgpmdW5jdGlvbiBkaXJOb2RlQ2hlY2soIGRpciwgY3VyLCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKSB7Cglmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJdmFyIGVsZW0gPSBjaGVja1NldFtpXTsKCgkJaWYgKCBlbGVtICkgewoJCQl2YXIgbWF0Y2ggPSBmYWxzZTsKCgkJCWVsZW0gPSBlbGVtW2Rpcl07CgoJCQl3aGlsZSAoIGVsZW0gKSB7CgkJCQlpZiAoIGVsZW0uc2l6Y2FjaGUgPT09IGRvbmVOYW1lICkgewoJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNYTUwgKXsKCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJZWxlbS5zaXpzZXQgPSBpOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBjdXIgKSB7CgkJCQkJbWF0Y2ggPSBlbGVtOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWVsZW0gPSBlbGVtW2Rpcl07CgkJCX0KCgkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7CgkJfQoJfQp9CgpmdW5jdGlvbiBkaXJDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsKCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoKCQlpZiAoIGVsZW0gKSB7CgkJCXZhciBtYXRjaCA9IGZhbHNlOwoJCQkKCQkJZWxlbSA9IGVsZW1bZGlyXTsKCgkJCXdoaWxlICggZWxlbSApIHsKCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7CgkJCQkJbWF0Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWlmICggIWlzWE1MICkgewoJCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJCWVsZW0uc2l6c2V0ID0gaTsKCQkJCQl9CgoJCQkJCWlmICggdHlwZW9mIGN1ciAhPT0gInN0cmluZyIgKSB7CgkJCQkJCWlmICggZWxlbSA9PT0gY3VyICkgewoJCQkJCQkJbWF0Y2ggPSB0cnVlOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCgkJCQkJfSBlbHNlIGlmICggU2l6emxlLmZpbHRlciggY3VyLCBbZWxlbV0gKS5sZW5ndGggPiAwICkgewoJCQkJCQltYXRjaCA9IGVsZW07CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCgkJCQllbGVtID0gZWxlbVtkaXJdOwoJCQl9CgoJCQljaGVja1NldFtpXSA9IG1hdGNoOwoJCX0KCX0KfQoKaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnMgKSB7CglTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlyZXR1cm4gYSAhPT0gYiAmJiAoYS5jb250YWlucyA/IGEuY29udGFpbnMoYikgOiB0cnVlKTsKCX07Cgp9IGVsc2UgaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7CglTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlyZXR1cm4gISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDE2KTsKCX07Cgp9IGVsc2UgewoJU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZhbHNlOwoJfTsKfQoKU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CgkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykgCgl2YXIgZG9jdW1lbnRFbGVtZW50ID0gKGVsZW0gPyBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSA6IDApLmRvY3VtZW50RWxlbWVudDsKCglyZXR1cm4gZG9jdW1lbnRFbGVtZW50ID8gZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lICE9PSAiSFRNTCIgOiBmYWxzZTsKfTsKCnZhciBwb3NQcm9jZXNzID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJdmFyIG1hdGNoLAoJCXRtcFNldCA9IFtdLAoJCWxhdGVyID0gIiIsCgkJcm9vdCA9IGNvbnRleHQubm9kZVR5cGUgPyBbY29udGV4dF0gOiBjb250ZXh0OwoKCS8vIFBvc2l0aW9uIHNlbGVjdG9ycyBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIGZpbHRlcgoJLy8gQW5kIHNvIG11c3QgOm5vdChwb3NpdGlvbmFsKSBzbyB3ZSBtb3ZlIGFsbCBQU0VVRE9zIHRvIHRoZSBlbmQKCXdoaWxlICggKG1hdGNoID0gRXhwci5tYXRjaC5QU0VVRE8uZXhlYyggc2VsZWN0b3IgKSkgKSB7CgkJbGF0ZXIgKz0gbWF0Y2hbMF07CgkJc2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKCBFeHByLm1hdGNoLlBTRVVETywgIiIgKTsKCX0KCglzZWxlY3RvciA9IEV4cHIucmVsYXRpdmVbc2VsZWN0b3JdID8gc2VsZWN0b3IgKyAiKiIgOiBzZWxlY3RvcjsKCglmb3IgKCB2YXIgaSA9IDAsIGwgPSByb290Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQlTaXp6bGUoIHNlbGVjdG9yLCByb290W2ldLCB0bXBTZXQgKTsKCX0KCglyZXR1cm4gU2l6emxlLmZpbHRlciggbGF0ZXIsIHRtcFNldCApOwp9OwoKLy8gRVhQT1NFCmpRdWVyeS5maW5kID0gU2l6emxlOwpqUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7CmpRdWVyeS5leHByWyI6Il0gPSBqUXVlcnkuZXhwci5maWx0ZXJzOwpqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7CmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKalF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOwoKCn0pKCk7CgoKdmFyIHJ1bnRpbCA9IC9VbnRpbCQvLAoJcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sCgkvLyBOb3RlOiBUaGlzIFJlZ0V4cCBzaG91bGQgYmUgaW1wcm92ZWQsIG9yIGxpa2VseSBwdWxsZWQgZnJvbSBTaXp6bGUKCXJtdWx0aXNlbGVjdG9yID0gLywvLAoJaXNTaW1wbGUgPSAvXi5bXjojXFtcLixdKiQvLAoJc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UsCglQT1MgPSBqUXVlcnkuZXhwci5tYXRjaC5QT1MsCgkvLyBtZXRob2RzIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBhIHVuaXF1ZSBzZXQgd2hlbiBzdGFydGluZyBmcm9tIGEgdW5pcXVlIHNldAoJZ3VhcmFudGVlZFVuaXF1ZSA9IHsKCQljaGlsZHJlbjogdHJ1ZSwKCQljb250ZW50czogdHJ1ZSwKCQluZXh0OiB0cnVlLAoJCXByZXY6IHRydWUKCX07CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgc2VsZiA9IHRoaXMsCgkJCWksIGw7CgoJCWlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCQlmb3IgKCBpID0gMCwgbCA9IHNlbGYubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQl9CgoJCXZhciByZXQgPSB0aGlzLnB1c2hTdGFjayggIiIsICJmaW5kIiwgc2VsZWN0b3IgKSwKCQkJbGVuZ3RoLCBuLCByOwoKCQlmb3IgKCBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQlsZW5ndGggPSByZXQubGVuZ3RoOwoJCQlqUXVlcnkuZmluZCggc2VsZWN0b3IsIHRoaXNbaV0sIHJldCApOwoKCQkJaWYgKCBpID4gMCApIHsKCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXN1bHRzIGFyZSB1bmlxdWUKCQkJCWZvciAoIG4gPSBsZW5ndGg7IG4gPCByZXQubGVuZ3RoOyBuKysgKSB7CgkJCQkJZm9yICggciA9IDA7IHIgPCBsZW5ndGg7IHIrKyApIHsKCQkJCQkJaWYgKCByZXRbcl0gPT09IHJldFtuXSApIHsKCQkJCQkJCXJldC5zcGxpY2Uobi0tLCAxKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCgloYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7CgkJdmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCApOwoJCXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGFyZ2V0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1tpXSApICkgewoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9CgkJfSk7Cgl9LAoKCW5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yLCBmYWxzZSksICJub3QiLCBzZWxlY3Rvcik7Cgl9LAoKCWZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yLCB0cnVlKSwgImZpbHRlciIsIHNlbGVjdG9yICk7Cgl9LAoKCWlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuICEhc2VsZWN0b3IgJiYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KCQkJalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIHRoaXMgKS5sZW5ndGggPiAwIDoKCQkJdGhpcy5maWx0ZXIoIHNlbGVjdG9yICkubGVuZ3RoID4gMCApOwoJfSwKCgljbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkgewoJCXZhciByZXQgPSBbXSwgaSwgbCwgY3VyID0gdGhpc1swXTsKCQkKCQkvLyBBcnJheQoJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHNlbGVjdG9ycyApICkgewoJCQl2YXIgbWF0Y2gsIHNlbGVjdG9yLAoJCQkJbWF0Y2hlcyA9IHt9LAoJCQkJbGV2ZWwgPSAxOwoKCQkJaWYgKCBjdXIgJiYgc2VsZWN0b3JzLmxlbmd0aCApIHsKCQkJCWZvciAoIGkgPSAwLCBsID0gc2VsZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCQlzZWxlY3RvciA9IHNlbGVjdG9yc1tpXTsKCgkJCQkJaWYgKCAhbWF0Y2hlc1sgc2VsZWN0b3IgXSApIHsKCQkJCQkJbWF0Y2hlc1sgc2VsZWN0b3IgXSA9IFBPUy50ZXN0KCBzZWxlY3RvciApID8KCQkJCQkJCWpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOgoJCQkJCQkJc2VsZWN0b3I7CgkJCQkJfQoJCQkJfQoKCQkJCXdoaWxlICggY3VyICYmIGN1ci5vd25lckRvY3VtZW50ICYmIGN1ciAhPT0gY29udGV4dCApIHsKCQkJCQlmb3IgKCBzZWxlY3RvciBpbiBtYXRjaGVzICkgewoJCQkJCQltYXRjaCA9IG1hdGNoZXNbIHNlbGVjdG9yIF07CgoJCQkJCQlpZiAoIG1hdGNoLmpxdWVyeSA/IG1hdGNoLmluZGV4KCBjdXIgKSA+IC0xIDogalF1ZXJ5KCBjdXIgKS5pcyggbWF0Y2ggKSApIHsKCQkJCQkJCXJldC5wdXNoKHsgc2VsZWN0b3I6IHNlbGVjdG9yLCBlbGVtOiBjdXIsIGxldmVsOiBsZXZlbCB9KTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJY3VyID0gY3VyLnBhcmVudE5vZGU7CgkJCQkJbGV2ZWwrKzsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIHJldDsKCQl9CgoJCS8vIFN0cmluZwoJCXZhciBwb3MgPSBQT1MudGVzdCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgPwoJCQkJalF1ZXJ5KCBzZWxlY3RvcnMsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOgoJCQkJMDsKCgkJZm9yICggaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJY3VyID0gdGhpc1tpXTsKCgkJCXdoaWxlICggY3VyICkgewoJCQkJaWYgKCBwb3MgPyBwb3MuaW5kZXgoY3VyKSA+IC0xIDogalF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKGN1ciwgc2VsZWN0b3JzKSApIHsKCQkJCQlyZXQucHVzaCggY3VyICk7CgkJCQkJYnJlYWs7CgoJCQkJfSBlbHNlIHsKCQkJCQljdXIgPSBjdXIucGFyZW50Tm9kZTsKCQkJCQlpZiAoICFjdXIgfHwgIWN1ci5vd25lckRvY3VtZW50IHx8IGN1ciA9PT0gY29udGV4dCB8fCBjdXIubm9kZVR5cGUgPT09IDExICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJldCA9IHJldC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQ7CgoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0LCAiY2xvc2VzdCIsIHNlbGVjdG9ycyApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCgkvLyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gKCB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50Tm9kZSApID8gdGhpcy5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CgkJfQoKCQkvLyBpbmRleCBpbiBzZWxlY3RvcgoJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoIHRoaXNbMF0sIGpRdWVyeSggZWxlbSApICk7CgkJfQoKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoCgkJCS8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAoJCQllbGVtLmpxdWVyeSA/IGVsZW1bMF0gOiBlbGVtLCB0aGlzICk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXZhciBzZXQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KCQkJCWpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSA6CgkJCQlqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciAmJiBzZWxlY3Rvci5ub2RlVHlwZSA/IFsgc2VsZWN0b3IgXSA6IHNlbGVjdG9yICksCgkJCWFsbCA9IGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgc2V0ICk7CgoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggaXNEaXNjb25uZWN0ZWQoIHNldFswXSApIHx8IGlzRGlzY29ubmVjdGVkKCBhbGxbMF0gKSA/CgkJCWFsbCA6CgkJCWpRdWVyeS51bmlxdWUoIGFsbCApICk7Cgl9LAoKCWFuZFNlbGY6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmFkZCggdGhpcy5wcmV2T2JqZWN0ICk7Cgl9Cn0pOwoKLy8gQSBwYWluZnVsbHkgc2ltcGxlIGNoZWNrIHRvIHNlZSBpZiBhbiBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZAovLyBmcm9tIGEgZG9jdW1lbnQgKHNob3VsZCBiZSBpbXByb3ZlZCwgd2hlcmUgZmVhc2libGUpLgpmdW5jdGlvbiBpc0Rpc2Nvbm5lY3RlZCggbm9kZSApIHsKCXJldHVybiAhbm9kZSB8fCAhbm9kZS5wYXJlbnROb2RlIHx8IG5vZGUucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMTE7Cn0KCmpRdWVyeS5lYWNoKHsKCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQlyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsOwoJfSwKCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicGFyZW50Tm9kZSIgKTsKCX0sCglwYXJlbnRzVW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInBhcmVudE5vZGUiLCB1bnRpbCApOwoJfSwKCW5leHQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkubnRoKCBlbGVtLCAyLCAibmV4dFNpYmxpbmciICk7Cgl9LAoJcHJldjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5udGgoIGVsZW0sIDIsICJwcmV2aW91c1NpYmxpbmciICk7Cgl9LAoJbmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsKCX0sCglwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIgKTsKCX0sCgluZXh0VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgIm5leHRTaWJsaW5nIiwgdW50aWwgKTsKCX0sCglwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7Cgl9LAoJc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuc2libGluZyggZWxlbS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsIGVsZW0gKTsKCX0sCgljaGlsZHJlbjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCBlbGVtLmZpcnN0Q2hpbGQgKTsKCX0sCgljb250ZW50czogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlmcmFtZSIgKSA/CgkJCWVsZW0uY29udGVudERvY3VtZW50IHx8IGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudCA6CgkJCWpRdWVyeS5tYWtlQXJyYXkoIGVsZW0uY2hpbGROb2RlcyApOwoJfQp9LCBmdW5jdGlvbiggbmFtZSwgZm4gKSB7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7CgkJdmFyIHJldCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApLAoJCQkvLyBUaGUgdmFyaWFibGUgJ2FyZ3MnIHdhcyBpbnRyb2R1Y2VkIGluCgkJCS8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L2NvbW1pdC81MmEwMjM4CgkJCS8vIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIENocm9tZSAxMCAoRGV2KSBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiB0aGUgYnVnIGlzIGZpeGVkLgoJCQkvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMDUwCgkJCWFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7CgoJCWlmICggIXJ1bnRpbC50ZXN0KCBuYW1lICkgKSB7CgkJCXNlbGVjdG9yID0gdW50aWw7CgkJfQoKCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCXJldCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsKCQl9CgoJCXJldCA9IHRoaXMubGVuZ3RoID4gMSAmJiAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQ7CgoJCWlmICggKHRoaXMubGVuZ3RoID4gMSB8fCBybXVsdGlzZWxlY3Rvci50ZXN0KCBzZWxlY3RvciApKSAmJiBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkgewoJCQlyZXQgPSByZXQucmV2ZXJzZSgpOwoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQsIG5hbWUsIGFyZ3Muam9pbigiLCIpICk7Cgl9Owp9KTsKCmpRdWVyeS5leHRlbmQoewoJZmlsdGVyOiBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHsKCQlpZiAoIG5vdCApIHsKCQkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOwoJCX0KCgkJcmV0dXJuIGVsZW1zLmxlbmd0aCA9PT0gMSA/CgkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihlbGVtc1swXSwgZXhwcikgPyBbIGVsZW1zWzBdIF0gOiBbXSA6CgkJCWpRdWVyeS5maW5kLm1hdGNoZXMoZXhwciwgZWxlbXMpOwoJfSwKCglkaXI6IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgewoJCXZhciBtYXRjaGVkID0gW10sCgkJCWN1ciA9IGVsZW1bIGRpciBdOwoKCQl3aGlsZSAoIGN1ciAmJiBjdXIubm9kZVR5cGUgIT09IDkgJiYgKHVudGlsID09PSB1bmRlZmluZWQgfHwgY3VyLm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkoIGN1ciApLmlzKCB1bnRpbCApKSApIHsKCQkJaWYgKCBjdXIubm9kZVR5cGUgPT09IDEgKSB7CgkJCQltYXRjaGVkLnB1c2goIGN1ciApOwoJCQl9CgkJCWN1ciA9IGN1cltkaXJdOwoJCX0KCQlyZXR1cm4gbWF0Y2hlZDsKCX0sCgoJbnRoOiBmdW5jdGlvbiggY3VyLCByZXN1bHQsIGRpciwgZWxlbSApIHsKCQlyZXN1bHQgPSByZXN1bHQgfHwgMTsKCQl2YXIgbnVtID0gMDsKCgkJZm9yICggOyBjdXI7IGN1ciA9IGN1cltkaXJdICkgewoJCQlpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSAmJiArK251bSA9PT0gcmVzdWx0ICkgewoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCXJldHVybiBjdXI7Cgl9LAoKCXNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVtICkgewoJCXZhciByID0gW107CgoJCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CgkJCWlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkgewoJCQkJci5wdXNoKCBuICk7CgkJCX0KCQl9CgoJCXJldHVybiByOwoJfQp9KTsKCi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90CmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwga2VlcCApIHsKCgkvLyBDYW4ndCBwYXNzIG51bGwgb3IgdW5kZWZpbmVkIHRvIGluZGV4T2YgaW4gRmlyZWZveCA0CgkvLyBTZXQgdG8gMCB0byBza2lwIHN0cmluZyBjaGVjawoJcXVhbGlmaWVyID0gcXVhbGlmaWVyIHx8IDA7CgoJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJdmFyIHJldFZhbCA9ICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsKCQkJcmV0dXJuIHJldFZhbCA9PT0ga2VlcDsKCQl9KTsKCgl9IGVsc2UgaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuIChlbGVtID09PSBxdWFsaWZpZXIpID09PSBrZWVwOwoJCX0pOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBxdWFsaWZpZXIgPT09ICJzdHJpbmciICkgewoJCXZhciBmaWx0ZXJlZCA9IGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7CgkJfSk7CgoJCWlmICggaXNTaW1wbGUudGVzdCggcXVhbGlmaWVyICkgKSB7CgkJCXJldHVybiBqUXVlcnkuZmlsdGVyKHF1YWxpZmllciwgZmlsdGVyZWQsICFrZWVwKTsKCQl9IGVsc2UgewoJCQlxdWFsaWZpZXIgPSBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGZpbHRlcmVkICk7CgkJfQoJfQoKCXJldHVybiBqUXVlcnkuZ3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJcmV0dXJuIChqUXVlcnkuaW5BcnJheSggZWxlbSwgcXVhbGlmaWVyICkgPj0gMCkgPT09IGtlZXA7Cgl9KTsKfQoKCgoKdmFyIHJpbmxpbmVqUXVlcnkgPSAvIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLAoJcmxlYWRpbmdXaGl0ZXNwYWNlID0gL15ccysvLAoJcnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9pZywKCXJ0YWdOYW1lID0gLzwoW1x3Ol0rKS8sCglydGJvZHkgPSAvPHRib2R5L2ksCglyaHRtbCA9IC88fCYjP1x3KzsvLAoJcm5vY2FjaGUgPSAvPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLAoJLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAoJcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKCXJzY3JpcHRUeXBlID0gL1wvKGphdmF8ZWNtYSlzY3JpcHQvaSwKCXJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8XC1cLSkvLAoJd3JhcE1hcCA9IHsKCQlvcHRpb246IFsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdLAoJCWxlZ2VuZDogWyAxLCAiPGZpZWxkc2V0PiIsICI8L2ZpZWxkc2V0PiIgXSwKCQl0aGVhZDogWyAxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiIgXSwKCQl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKCQl0ZDogWyAzLCAiPHRhYmxlPjx0Ym9keT48dHI+IiwgIjwvdHI+PC90Ym9keT48L3RhYmxlPiIgXSwKCQljb2w6IFsgMiwgIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCgkJYXJlYTogWyAxLCAiPG1hcD4iLCAiPC9tYXA+IiBdLAoJCV9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCgl9OwoKd3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uOwp3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkOwp3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKCi8vIElFIGNhbid0IHNlcmlhbGl6ZSA8bGluaz4gYW5kIDxzY3JpcHQ+IHRhZ3Mgbm9ybWFsbHkKaWYgKCAhalF1ZXJ5LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSApIHsKCXdyYXBNYXAuX2RlZmF1bHQgPSBbIDEsICJkaXY8ZGl2PiIsICI8L2Rpdj4iIF07Cn0KCmpRdWVyeS5mbi5leHRlbmQoewoJdGV4dDogZnVuY3Rpb24oIHRleHQgKSB7CgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbih0ZXh0KSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApOwoKCQkJCXNlbGYudGV4dCggdGV4dC5jYWxsKHRoaXMsIGksIHNlbGYudGV4dCgpKSApOwoJCQl9KTsKCQl9CgoJCWlmICggdHlwZW9mIHRleHQgIT09ICJvYmplY3QiICYmIHRleHQgIT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoICh0aGlzWzBdICYmIHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUoIHRleHQgKSApOwoJCX0KCgkJcmV0dXJuIGpRdWVyeS50ZXh0KCB0aGlzICk7Cgl9LAoKCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQlqUXVlcnkodGhpcykud3JhcEFsbCggaHRtbC5jYWxsKHRoaXMsIGkpICk7CgkJCX0pOwoJCX0KCgkJaWYgKCB0aGlzWzBdICkgewoJCQkvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZAoJCQl2YXIgd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1swXS5vd25lckRvY3VtZW50ICkuZXEoMCkuY2xvbmUodHJ1ZSk7CgoJCQlpZiAoIHRoaXNbMF0ucGFyZW50Tm9kZSApIHsKCQkJCXdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWzBdICk7CgkJCX0KCgkJCXdyYXAubWFwKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGVsZW0gPSB0aGlzOwoKCQkJCXdoaWxlICggZWxlbS5maXJzdENoaWxkICYmIGVsZW0uZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCQllbGVtID0gZWxlbS5maXJzdENoaWxkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtOwoJCQl9KS5hcHBlbmQoIHRoaXMgKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgl3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQlqUXVlcnkodGhpcykud3JhcElubmVyKCBodG1sLmNhbGwodGhpcywgaSkgKTsKCQkJfSk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CgoJCQlpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKCQkJCWNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKCgkJCX0gZWxzZSB7CgkJCQlzZWxmLmFwcGVuZCggaHRtbCApOwoJCQl9CgkJfSk7Cgl9LAoKCXdyYXA6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWwgKTsKCQl9KTsKCX0sCgoJdW53cmFwOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQlpZiAoICFqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJib2R5IiApICkgewoJCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApOwoJCQl9CgkJfSkuZW5kKCk7Cgl9LAoKCWFwcGVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxICkgewoJCQkJdGhpcy5hcHBlbmRDaGlsZCggZWxlbSApOwoJCQl9CgkJfSk7Cgl9LAoKCXByZXBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCWlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCXRoaXMuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLmZpcnN0Q2hpbGQgKTsKCQkJfQoJCX0pOwoJfSwKCgliZWZvcmU6IGZ1bmN0aW9uKCkgewoJCWlmICggdGhpc1swXSAmJiB0aGlzWzBdLnBhcmVudE5vZGUgKSB7CgkJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApOwoJCQl9KTsKCQl9IGVsc2UgaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQl2YXIgc2V0ID0galF1ZXJ5KGFyZ3VtZW50c1swXSk7CgkJCXNldC5wdXNoLmFwcGx5KCBzZXQsIHRoaXMudG9BcnJheSgpICk7CgkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggc2V0LCAiYmVmb3JlIiwgYXJndW1lbnRzICk7CgkJfQoJfSwKCglhZnRlcjogZnVuY3Rpb24oKSB7CgkJaWYgKCB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50Tm9kZSApIHsKCQkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCBmYWxzZSwgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJCX0pOwoJCX0gZWxzZSBpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXZhciBzZXQgPSB0aGlzLnB1c2hTdGFjayggdGhpcywgImFmdGVyIiwgYXJndW1lbnRzICk7CgkJCXNldC5wdXNoLmFwcGx5KCBzZXQsIGpRdWVyeShhcmd1bWVudHNbMF0pLnRvQXJyYXkoKSApOwoJCQlyZXR1cm4gc2V0OwoJCX0KCX0sCgoJLy8ga2VlcERhdGEgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LS1kbyBub3QgZG9jdW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCBrZWVwRGF0YSApIHsKCQlmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gdGhpc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoICFzZWxlY3RvciB8fCBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgWyBlbGVtIF0gKS5sZW5ndGggKSB7CgkJCQlpZiAoICFrZWVwRGF0YSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSApOwoJCQkJCWpRdWVyeS5jbGVhbkRhdGEoIFsgZWxlbSBdICk7CgkJCQl9CgoJCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQkJZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgllbXB0eTogZnVuY3Rpb24oKSB7CgkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7IGkrKyApIHsKCQkJLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCgkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSApOwoJCQl9CgoJCQkvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2RlcwoJCQl3aGlsZSAoIGVsZW0uZmlyc3RDaGlsZCApIHsKCQkJCWVsZW0ucmVtb3ZlQ2hpbGQoIGVsZW0uZmlyc3RDaGlsZCApOwoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJY2xvbmU6IGZ1bmN0aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQlkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzOwoJCWRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50czsKCgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbiAoKSB7CgkJCXJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7CgkJfSk7Cgl9LAoKCWh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiB0aGlzWzBdICYmIHRoaXNbMF0ubm9kZVR5cGUgPT09IDEgPwoJCQkJdGhpc1swXS5pbm5lckhUTUwucmVwbGFjZShyaW5saW5lalF1ZXJ5LCAiIikgOgoJCQkJbnVsbDsKCgkJLy8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTAoJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgIXJub2NhY2hlLnRlc3QoIHZhbHVlICkgJiYKCQkJKGpRdWVyeS5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlIHx8ICFybGVhZGluZ1doaXRlc3BhY2UudGVzdCggdmFsdWUgKSkgJiYKCQkJIXdyYXBNYXBbIChydGFnTmFtZS5leGVjKCB2YWx1ZSApIHx8IFsiIiwgIiJdKVsxXS50b0xvd2VyQ2FzZSgpIF0gKSB7CgoJCQl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocnhodG1sVGFnLCAiPCQxPjwvJDI+Iik7CgoJCQl0cnkgewoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCgkJCQkJaWYgKCB0aGlzW2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQlqUXVlcnkuY2xlYW5EYXRhKCB0aGlzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikgKTsKCQkJCQkJdGhpc1tpXS5pbm5lckhUTUwgPSB2YWx1ZTsKCQkJCQl9CgkJCQl9CgoJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKCQkJfSBjYXRjaChlKSB7CgkJCQl0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApOwoJCQl9CgoJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQl0aGlzLmVhY2goZnVuY3Rpb24oaSl7CgkJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApOwoKCQkJCXNlbGYuaHRtbCggdmFsdWUuY2FsbCh0aGlzLCBpLCBzZWxmLmh0bWwoKSkgKTsKCQkJfSk7CgoJCX0gZWxzZSB7CgkJCXRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJcmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQlpZiAoIHRoaXNbMF0gJiYgdGhpc1swXS5wYXJlbnROb2RlICkgewoJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZWxlbWVudHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGJlZm9yZSB0aGV5IGFyZSBpbnNlcnRlZAoJCQkvLyB0aGlzIGNhbiBoZWxwIGZpeCByZXBsYWNpbmcgYSBwYXJlbnQgd2l0aCBjaGlsZCBlbGVtZW50cwoJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQkJdmFyIHNlbGYgPSBqUXVlcnkodGhpcyksIG9sZCA9IHNlbGYuaHRtbCgpOwoJCQkJCXNlbGYucmVwbGFjZVdpdGgoIHZhbHVlLmNhbGwoIHRoaXMsIGksIG9sZCApICk7CgkJCQl9KTsKCQkJfQoKCQkJaWYgKCB0eXBlb2YgdmFsdWUgIT09ICJzdHJpbmciICkgewoJCQkJdmFsdWUgPSBqUXVlcnkoIHZhbHVlICkuZGV0YWNoKCk7CgkJCX0KCgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQl2YXIgbmV4dCA9IHRoaXMubmV4dFNpYmxpbmcsCgkJCQkJcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwoKCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZSgpOwoKCQkJCWlmICggbmV4dCApIHsKCQkJCQlqUXVlcnkobmV4dCkuYmVmb3JlKCB2YWx1ZSApOwoJCQkJfSBlbHNlIHsKCQkJCQlqUXVlcnkocGFyZW50KS5hcHBlbmQoIHZhbHVlICk7CgkJCQl9CgkJCX0pOwoJCX0gZWxzZSB7CgkJCXJldHVybiB0aGlzLmxlbmd0aCA/CgkJCQl0aGlzLnB1c2hTdGFjayggalF1ZXJ5KGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlKCkgOiB2YWx1ZSksICJyZXBsYWNlV2l0aCIsIHZhbHVlICkgOgoJCQkJdGhpczsKCQl9Cgl9LAoKCWRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnJlbW92ZSggc2VsZWN0b3IsIHRydWUgKTsKCX0sCgoJZG9tTWFuaXA6IGZ1bmN0aW9uKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sgKSB7CgkJdmFyIHJlc3VsdHMsIGZpcnN0LCBmcmFnbWVudCwgcGFyZW50LAoJCQl2YWx1ZSA9IGFyZ3NbMF0sCgkJCXNjcmlwdHMgPSBbXTsKCgkJLy8gV2UgY2FuJ3QgY2xvbmVOb2RlIGZyYWdtZW50cyB0aGF0IGNvbnRhaW4gY2hlY2tlZCwgaW4gV2ViS2l0CgkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuY2hlY2tDbG9uZSAmJiBhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCWpRdWVyeSh0aGlzKS5kb21NYW5pcCggYXJncywgdGFibGUsIGNhbGxiYWNrLCB0cnVlICk7CgkJCX0pOwoJCX0KCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbih2YWx1ZSkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgewoJCQkJdmFyIHNlbGYgPSBqUXVlcnkodGhpcyk7CgkJCQlhcmdzWzBdID0gdmFsdWUuY2FsbCh0aGlzLCBpLCB0YWJsZSA/IHNlbGYuaHRtbCgpIDogdW5kZWZpbmVkKTsKCQkJCXNlbGYuZG9tTWFuaXAoIGFyZ3MsIHRhYmxlLCBjYWxsYmFjayApOwoJCQl9KTsKCQl9CgoJCWlmICggdGhpc1swXSApIHsKCQkJcGFyZW50ID0gdmFsdWUgJiYgdmFsdWUucGFyZW50Tm9kZTsKCgkJCS8vIElmIHdlJ3JlIGluIGEgZnJhZ21lbnQsIGp1c3QgdXNlIHRoYXQgaW5zdGVhZCBvZiBidWlsZGluZyBhIG5ldyBvbmUKCQkJaWYgKCBqUXVlcnkuc3VwcG9ydC5wYXJlbnROb2RlICYmIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgPT09IDExICYmIHBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gdGhpcy5sZW5ndGggKSB7CgkJCQlyZXN1bHRzID0geyBmcmFnbWVudDogcGFyZW50IH07CgoJCQl9IGVsc2UgewoJCQkJcmVzdWx0cyA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBhcmdzLCB0aGlzLCBzY3JpcHRzICk7CgkJCX0KCgkJCWZyYWdtZW50ID0gcmVzdWx0cy5mcmFnbWVudDsKCgkJCWlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7CgkJCQlmaXJzdCA9IGZyYWdtZW50ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCQkJfSBlbHNlIHsKCQkJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCQkJfQoKCQkJaWYgKCBmaXJzdCApIHsKCQkJCXRhYmxlID0gdGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBmaXJzdCwgInRyIiApOwoKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoLCBsYXN0SW5kZXggPSBsIC0gMTsgaSA8IGw7IGkrKyApIHsKCQkJCQljYWxsYmFjay5jYWxsKAoJCQkJCQl0YWJsZSA/CgkJCQkJCQlyb290KHRoaXNbaV0sIGZpcnN0KSA6CgkJCQkJCQl0aGlzW2ldLAoJCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3QgbGVhayBtZW1vcnkgYnkgaW5hZHZlcnRlbnRseSBkaXNjYXJkaW5nCgkJCQkJCS8vIHRoZSBvcmlnaW5hbCBmcmFnbWVudCAod2hpY2ggbWlnaHQgaGF2ZSBhdHRhY2hlZCBkYXRhKSBpbnN0ZWFkIG9mCgkJCQkJCS8vIHVzaW5nIGl0OyBpbiBhZGRpdGlvbiwgdXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBvYmplY3QgZm9yIHRoZSBsYXN0CgkJCQkJCS8vIGl0ZW0gaW5zdGVhZCBvZiBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAgYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseQoJCQkJCQkvLyBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKEJ1ZyAjODA3MCkuCgkJCQkJCS8vIEZyYWdtZW50cyBmcm9tIHRoZSBmcmFnbWVudCBjYWNoZSBtdXN0IGFsd2F5cyBiZSBjbG9uZWQgYW5kIG5ldmVyIHVzZWQKCQkJCQkJLy8gaW4gcGxhY2UuCgkJCQkJCXJlc3VsdHMuY2FjaGVhYmxlIHx8IChsID4gMSAmJiBpIDwgbGFzdEluZGV4KSA/CgkJCQkJCQlqUXVlcnkuY2xvbmUoIGZyYWdtZW50LCB0cnVlLCB0cnVlICkgOgoJCQkJCQkJZnJhZ21lbnQKCQkJCQkpOwoJCQkJfQoJCQl9CgoJCQlpZiAoIHNjcmlwdHMubGVuZ3RoICkgewoJCQkJalF1ZXJ5LmVhY2goIHNjcmlwdHMsIGV2YWxTY3JpcHQgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9Cn0pOwoKZnVuY3Rpb24gcm9vdCggZWxlbSwgY3VyICkgewoJcmV0dXJuIGpRdWVyeS5ub2RlTmFtZShlbGVtLCAidGFibGUiKSA/CgkJKGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF0gfHwKCQllbGVtLmFwcGVuZENoaWxkKGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKSkgOgoJCWVsZW07Cn0KCmZ1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7CgoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkuaGFzRGF0YSggc3JjICkgKSB7CgkJcmV0dXJuOwoJfQoKCXZhciBpbnRlcm5hbEtleSA9IGpRdWVyeS5leHBhbmRvLAoJCW9sZERhdGEgPSBqUXVlcnkuZGF0YSggc3JjICksCgkJY3VyRGF0YSA9IGpRdWVyeS5kYXRhKCBkZXN0LCBvbGREYXRhICk7CgoJLy8gU3dpdGNoIHRvIHVzZSB0aGUgaW50ZXJuYWwgZGF0YSBvYmplY3QsIGlmIGl0IGV4aXN0cywgZm9yIHRoZSBuZXh0CgkvLyBzdGFnZSBvZiBkYXRhIGNvcHlpbmcKCWlmICggKG9sZERhdGEgPSBvbGREYXRhWyBpbnRlcm5hbEtleSBdKSApIHsKCQl2YXIgZXZlbnRzID0gb2xkRGF0YS5ldmVudHM7CgkJCQljdXJEYXRhID0gY3VyRGF0YVsgaW50ZXJuYWxLZXkgXSA9IGpRdWVyeS5leHRlbmQoe30sIG9sZERhdGEpOwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJZGVsZXRlIGN1ckRhdGEuaGFuZGxlOwoJCQljdXJEYXRhLmV2ZW50cyA9IHt9OwoKCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkgewoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUgKyAoIGV2ZW50c1sgdHlwZSBdWyBpIF0ubmFtZXNwYWNlID8gIi4iIDogIiIgKSArIGV2ZW50c1sgdHlwZSBdWyBpIF0ubmFtZXNwYWNlLCBldmVudHNbIHR5cGUgXVsgaSBdLCBldmVudHNbIHR5cGUgXVsgaSBdLmRhdGEgKTsKCQkJCX0KCQkJfQoJCX0KCX0KfQoKZnVuY3Rpb24gY2xvbmVGaXhBdHRyaWJ1dGVzKCBzcmMsIGRlc3QgKSB7Cgl2YXIgbm9kZU5hbWU7CgoJLy8gV2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcgZm9yIG5vbi1FbGVtZW50cwoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkgewoJCXJldHVybjsKCX0KCgkvLyBjbGVhckF0dHJpYnV0ZXMgcmVtb3ZlcyB0aGUgYXR0cmlidXRlcywgd2hpY2ggd2UgZG9uJ3Qgd2FudCwKCS8vIGJ1dCBhbHNvIHJlbW92ZXMgdGhlIGF0dGFjaEV2ZW50IGV2ZW50cywgd2hpY2ggd2UgKmRvKiB3YW50CglpZiAoIGRlc3QuY2xlYXJBdHRyaWJ1dGVzICkgewoJCWRlc3QuY2xlYXJBdHRyaWJ1dGVzKCk7Cgl9CgoJLy8gbWVyZ2VBdHRyaWJ1dGVzLCBpbiBjb250cmFzdCwgb25seSBtZXJnZXMgYmFjayBvbiB0aGUKCS8vIG9yaWdpbmFsIGF0dHJpYnV0ZXMsIG5vdCB0aGUgZXZlbnRzCglpZiAoIGRlc3QubWVyZ2VBdHRyaWJ1dGVzICkgewoJCWRlc3QubWVyZ2VBdHRyaWJ1dGVzKCBzcmMgKTsKCX0KCglub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCgkvLyBJRTYtOCBmYWlsIHRvIGNsb25lIGNoaWxkcmVuIGluc2lkZSBvYmplY3QgZWxlbWVudHMgdGhhdCB1c2UKCS8vIHRoZSBwcm9wcmlldGFyeSBjbGFzc2lkIGF0dHJpYnV0ZSB2YWx1ZSAocmF0aGVyIHRoYW4gdGhlIHR5cGUKCS8vIGF0dHJpYnV0ZSkgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgY29udGVudCB0byBkaXNwbGF5CglpZiAoIG5vZGVOYW1lID09PSAib2JqZWN0IiApIHsKCQlkZXN0Lm91dGVySFRNTCA9IHNyYy5vdXRlckhUTUw7CgoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgKHNyYy50eXBlID09PSAiY2hlY2tib3giIHx8IHNyYy50eXBlID09PSAicmFkaW8iKSApIHsKCQkvLyBJRTYtOCBmYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94CgkJLy8gb3IgcmFkaW8gYnV0dG9uLiBXb3JzZSwgSUU2LTcgZmFpbCB0byBnaXZlIHRoZSBjbG9uZWQgZWxlbWVudAoJCS8vIGEgY2hlY2tlZCBhcHBlYXJhbmNlIGlmIHRoZSBkZWZhdWx0Q2hlY2tlZCB2YWx1ZSBpc24ndCBhbHNvIHNldAoJCWlmICggc3JjLmNoZWNrZWQgKSB7CgkJCWRlc3QuZGVmYXVsdENoZWNrZWQgPSBkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKCQl9CgoJCS8vIElFNi03IGdldCBjb25mdXNlZCBhbmQgZW5kIHVwIHNldHRpbmcgdGhlIHZhbHVlIG9mIGEgY2xvbmVkCgkJLy8gY2hlY2tib3gvcmFkaW8gYnV0dG9uIHRvIGFuIGVtcHR5IHN0cmluZyBpbnN0ZWFkIG9mICJvbiIKCQlpZiAoIGRlc3QudmFsdWUgIT09IHNyYy52YWx1ZSApIHsKCQkJZGVzdC52YWx1ZSA9IHNyYy52YWx1ZTsKCQl9CgoJLy8gSUU2LTggZmFpbHMgdG8gcmV0dXJuIHRoZSBzZWxlY3RlZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQKCS8vIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zCgl9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gIm9wdGlvbiIgKSB7CgkJZGVzdC5zZWxlY3RlZCA9IHNyYy5kZWZhdWx0U2VsZWN0ZWQ7CgoJLy8gSUU2LTggZmFpbHMgdG8gc2V0IHRoZSBkZWZhdWx0VmFsdWUgdG8gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbgoJLy8gY2xvbmluZyBvdGhlciB0eXBlcyBvZiBpbnB1dCBmaWVsZHMKCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAiaW5wdXQiIHx8IG5vZGVOYW1lID09PSAidGV4dGFyZWEiICkgewoJCWRlc3QuZGVmYXVsdFZhbHVlID0gc3JjLmRlZmF1bHRWYWx1ZTsKCX0KCgkvLyBFdmVudCBkYXRhIGdldHMgcmVmZXJlbmNlZCBpbnN0ZWFkIG9mIGNvcGllZCBpZiB0aGUgZXhwYW5kbwoJLy8gZ2V0cyBjb3BpZWQgdG9vCglkZXN0LnJlbW92ZUF0dHJpYnV0ZSggalF1ZXJ5LmV4cGFuZG8gKTsKfQoKalF1ZXJ5LmJ1aWxkRnJhZ21lbnQgPSBmdW5jdGlvbiggYXJncywgbm9kZXMsIHNjcmlwdHMgKSB7Cgl2YXIgZnJhZ21lbnQsIGNhY2hlYWJsZSwgY2FjaGVyZXN1bHRzLCBkb2M7CgogIC8vIG5vZGVzIG1heSBjb250YWluIGVpdGhlciBhbiBleHBsaWNpdCBkb2N1bWVudCBvYmplY3QsCiAgLy8gYSBqUXVlcnkgY29sbGVjdGlvbiBvciBjb250ZXh0IG9iamVjdC4KICAvLyBJZiBub2Rlc1swXSBjb250YWlucyBhIHZhbGlkIG9iamVjdCB0byBhc3NpZ24gdG8gZG9jCiAgaWYgKCBub2RlcyAmJiBub2Rlc1swXSApIHsKICAgIGRvYyA9IG5vZGVzWzBdLm93bmVyRG9jdW1lbnQgfHwgbm9kZXNbMF07CiAgfQoKICAvLyBFbnN1cmUgdGhhdCBhbiBhdHRyIG9iamVjdCBkb2Vzbid0IGluY29ycmVjdGx5IHN0YW5kIGluIGFzIGEgZG9jdW1lbnQgb2JqZWN0CgkvLyBDaHJvbWUgYW5kIEZpcmVmb3ggc2VlbSB0byBhbGxvdyB0aGlzIHRvIG9jY3VyIGFuZCB3aWxsIHRocm93IGV4Y2VwdGlvbgoJLy8gRml4ZXMgIzg5NTAKCWlmICggIWRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50ICkgewoJCWRvYyA9IGRvY3VtZW50OwoJfQoKCS8vIE9ubHkgY2FjaGUgInNtYWxsIiAoMS8yIEtCKSBIVE1MIHN0cmluZ3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYWluIGRvY3VtZW50CgkvLyBDbG9uaW5nIG9wdGlvbnMgbG9zZXMgdGhlIHNlbGVjdGVkIHN0YXRlLCBzbyBkb24ndCBjYWNoZSB0aGVtCgkvLyBJRSA2IGRvZXNuJ3QgbGlrZSBpdCB3aGVuIHlvdSBwdXQgPG9iamVjdD4gb3IgPGVtYmVkPiBlbGVtZW50cyBpbiBhIGZyYWdtZW50CgkvLyBBbHNvLCBXZWJLaXQgZG9lcyBub3QgY2xvbmUgJ2NoZWNrZWQnIGF0dHJpYnV0ZXMgb24gY2xvbmVOb2RlLCBzbyBkb24ndCBjYWNoZQoJaWYgKCBhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gInN0cmluZyIgJiYgYXJnc1swXS5sZW5ndGggPCA1MTIgJiYgZG9jID09PSBkb2N1bWVudCAmJgoJCWFyZ3NbMF0uY2hhckF0KDApID09PSAiPCIgJiYgIXJub2NhY2hlLnRlc3QoIGFyZ3NbMF0gKSAmJiAoalF1ZXJ5LnN1cHBvcnQuY2hlY2tDbG9uZSB8fCAhcmNoZWNrZWQudGVzdCggYXJnc1swXSApKSApIHsKCgkJY2FjaGVhYmxlID0gdHJ1ZTsKCgkJY2FjaGVyZXN1bHRzID0galF1ZXJ5LmZyYWdtZW50c1sgYXJnc1swXSBdOwoJCWlmICggY2FjaGVyZXN1bHRzICYmIGNhY2hlcmVzdWx0cyAhPT0gMSApIHsKCQkJZnJhZ21lbnQgPSBjYWNoZXJlc3VsdHM7CgkJfQoJfQoKCWlmICggIWZyYWdtZW50ICkgewoJCWZyYWdtZW50ID0gZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKCQlqUXVlcnkuY2xlYW4oIGFyZ3MsIGRvYywgZnJhZ21lbnQsIHNjcmlwdHMgKTsKCX0KCglpZiAoIGNhY2hlYWJsZSApIHsKCQlqUXVlcnkuZnJhZ21lbnRzWyBhcmdzWzBdIF0gPSBjYWNoZXJlc3VsdHMgPyBmcmFnbWVudCA6IDE7Cgl9CgoJcmV0dXJuIHsgZnJhZ21lbnQ6IGZyYWdtZW50LCBjYWNoZWFibGU6IGNhY2hlYWJsZSB9Owp9OwoKalF1ZXJ5LmZyYWdtZW50cyA9IHt9OwoKalF1ZXJ5LmVhY2goewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciByZXQgPSBbXSwKCQkJaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLAoJCQlwYXJlbnQgPSB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzWzBdLnBhcmVudE5vZGU7CgoJCWlmICggcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSA9PT0gMTEgJiYgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICYmIGluc2VydC5sZW5ndGggPT09IDEgKSB7CgkJCWluc2VydFsgb3JpZ2luYWwgXSggdGhpc1swXSApOwoJCQlyZXR1cm4gdGhpczsKCgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gaW5zZXJ0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCXZhciBlbGVtcyA9IChpID4gMCA/IHRoaXMuY2xvbmUodHJ1ZSkgOiB0aGlzKS5nZXQoKTsKCQkJCWpRdWVyeSggaW5zZXJ0W2ldIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7CgkJCQlyZXQgPSByZXQuY29uY2F0KCBlbGVtcyApOwoJCQl9CgoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgaW5zZXJ0LnNlbGVjdG9yICk7CgkJfQoJfTsKfSk7CgpmdW5jdGlvbiBnZXRBbGwoIGVsZW0gKSB7CglpZiAoICJnZXRFbGVtZW50c0J5VGFnTmFtZSIgaW4gZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICk7CgoJfSBlbHNlIGlmICggInF1ZXJ5U2VsZWN0b3JBbGwiIGluIGVsZW0gKSB7CgkJcmV0dXJuIGVsZW0ucXVlcnlTZWxlY3RvckFsbCggIioiICk7CgoJfSBlbHNlIHsKCQlyZXR1cm4gW107Cgl9Cn0KCi8vIFVzZWQgaW4gY2xlYW4sIGZpeGVzIHRoZSBkZWZhdWx0Q2hlY2tlZCBwcm9wZXJ0eQpmdW5jdGlvbiBmaXhEZWZhdWx0Q2hlY2tlZCggZWxlbSApIHsKCWlmICggZWxlbS50eXBlID09PSAiY2hlY2tib3giIHx8IGVsZW0udHlwZSA9PT0gInJhZGlvIiApIHsKCQllbGVtLmRlZmF1bHRDaGVja2VkID0gZWxlbS5jaGVja2VkOwoJfQp9Ci8vIEZpbmRzIGFsbCBpbnB1dHMgYW5kIHBhc3NlcyB0aGVtIHRvIGZpeERlZmF1bHRDaGVja2VkCmZ1bmN0aW9uIGZpbmRJbnB1dHMoIGVsZW0gKSB7CglpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApICkgewoJCWZpeERlZmF1bHRDaGVja2VkKCBlbGVtICk7Cgl9IGVsc2UgaWYgKCAiZ2V0RWxlbWVudHNCeVRhZ05hbWUiIGluIGVsZW0gKSB7CgkJalF1ZXJ5LmdyZXAoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IiksIGZpeERlZmF1bHRDaGVja2VkICk7Cgl9Cn0KCmpRdWVyeS5leHRlbmQoewoJY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQl2YXIgY2xvbmUgPSBlbGVtLmNsb25lTm9kZSh0cnVlKSwKCQkJCXNyY0VsZW1lbnRzLAoJCQkJZGVzdEVsZW1lbnRzLAoJCQkJaTsKCgkJaWYgKCAoIWpRdWVyeS5zdXBwb3J0Lm5vQ2xvbmVFdmVudCB8fCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUNoZWNrZWQpICYmCgkJCQkoZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSkgJiYgIWpRdWVyeS5pc1hNTERvYyhlbGVtKSApIHsKCQkJLy8gSUUgY29waWVzIGV2ZW50cyBib3VuZCB2aWEgYXR0YWNoRXZlbnQgd2hlbiB1c2luZyBjbG9uZU5vZGUuCgkJCS8vIENhbGxpbmcgZGV0YWNoRXZlbnQgb24gdGhlIGNsb25lIHdpbGwgYWxzbyByZW1vdmUgdGhlIGV2ZW50cwoJCQkvLyBmcm9tIHRoZSBvcmlnaW5hbC4gSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSB1c2Ugc29tZQoJCQkvLyBwcm9wcmlldGFyeSBtZXRob2RzIHRvIGNsZWFyIHRoZSBldmVudHMuIFRoYW5rcyB0byBNb29Ub29scwoJCQkvLyBndXlzIGZvciB0aGlzIGhvdG5lc3MuCgoJCQljbG9uZUZpeEF0dHJpYnV0ZXMoIGVsZW0sIGNsb25lICk7CgoJCQkvLyBVc2luZyBTaXp6bGUgaGVyZSBpcyBjcmF6eSBzbG93LCBzbyB3ZSB1c2UgZ2V0RWxlbWVudHNCeVRhZ05hbWUKCQkJLy8gaW5zdGVhZAoJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoJCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7CgoJCQkvLyBXZWlyZCBpdGVyYXRpb24gYmVjYXVzZSBJRSB3aWxsIHJlcGxhY2UgdGhlIGxlbmd0aCBwcm9wZXJ0eQoJCQkvLyB3aXRoIGFuIGVsZW1lbnQgaWYgeW91IGFyZSBjbG9uaW5nIHRoZSBib2R5IGFuZCBvbmUgb2YgdGhlCgkJCS8vIGVsZW1lbnRzIG9uIHRoZSBwYWdlIGhhcyBhIG5hbWUgb3IgaWQgb2YgImxlbmd0aCIKCQkJZm9yICggaSA9IDA7IHNyY0VsZW1lbnRzW2ldOyArK2kgKSB7CgkJCQkvLyBFbnN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gbm9kZSBpcyBub3QgbnVsbDsgRml4ZXMgIzk1ODcKCQkJCWlmICggZGVzdEVsZW1lbnRzW2ldICkgewoJCQkJCWNsb25lRml4QXR0cmlidXRlcyggc3JjRWxlbWVudHNbaV0sIGRlc3RFbGVtZW50c1tpXSApOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lCgkJaWYgKCBkYXRhQW5kRXZlbnRzICkgewoJCQljbG9uZUNvcHlFdmVudCggZWxlbSwgY2xvbmUgKTsKCgkJCWlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7CgkJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoJCQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOwoKCQkJCWZvciAoIGkgPSAwOyBzcmNFbGVtZW50c1tpXTsgKytpICkgewoJCQkJCWNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1tpXSwgZGVzdEVsZW1lbnRzW2ldICk7CgkJCQl9CgkJCX0KCQl9CgoJCXNyY0VsZW1lbnRzID0gZGVzdEVsZW1lbnRzID0gbnVsbDsKCgkJLy8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0CgkJcmV0dXJuIGNsb25lOwoJfSwKCgljbGVhbjogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0LCBmcmFnbWVudCwgc2NyaXB0cyApIHsKCQl2YXIgY2hlY2tTY3JpcHRUeXBlOwoKCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKCgkJLy8gIWNvbnRleHQuY3JlYXRlRWxlbWVudCBmYWlscyBpbiBJRSB3aXRoIGFuIGVycm9yIGJ1dCByZXR1cm5zIHR5cGVvZiAnb2JqZWN0JwoJCWlmICggdHlwZW9mIGNvbnRleHQuY3JlYXRlRWxlbWVudCA9PT0gInVuZGVmaW5lZCIgKSB7CgkJCWNvbnRleHQgPSBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dFswXSAmJiBjb250ZXh0WzBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7CgkJfQoKCQl2YXIgcmV0ID0gW10sIGo7CgoJCWZvciAoIHZhciBpID0gMCwgZWxlbTsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAibnVtYmVyIiApIHsKCQkJCWVsZW0gKz0gIiI7CgkJCX0KCgkJCWlmICggIWVsZW0gKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gQ29udmVydCBodG1sIHN0cmluZyBpbnRvIERPTSBub2RlcwoJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKCQkJCWlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHsKCQkJCQllbGVtID0gY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApOwoJCQkJfSBlbHNlIHsKCQkJCQkvLyBGaXggIlhIVE1MIi1zdHlsZSB0YWdzIGluIGFsbCBicm93c2VycwoJCQkJCWVsZW0gPSBlbGVtLnJlcGxhY2UocnhodG1sVGFnLCAiPCQxPjwvJDI+Iik7CgoJCQkJCS8vIFRyaW0gd2hpdGVzcGFjZSwgb3RoZXJ3aXNlIGluZGV4T2Ygd29uJ3Qgd29yayBhcyBleHBlY3RlZAoJCQkJCXZhciB0YWcgPSAocnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFsiIiwgIiJdKVsxXS50b0xvd2VyQ2FzZSgpLAoJCQkJCQl3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVmYXVsdCwKCQkJCQkJZGVwdGggPSB3cmFwWzBdLAoJCQkJCQlkaXYgPSBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoKCQkJCQkvLyBHbyB0byBodG1sIGFuZCBiYWNrLCB0aGVuIHBlZWwgb2ZmIGV4dHJhIHdyYXBwZXJzCgkJCQkJZGl2LmlubmVySFRNTCA9IHdyYXBbMV0gKyBlbGVtICsgd3JhcFsyXTsKCgkJCQkJLy8gTW92ZSB0byB0aGUgcmlnaHQgZGVwdGgKCQkJCQl3aGlsZSAoIGRlcHRoLS0gKSB7CgkJCQkJCWRpdiA9IGRpdi5sYXN0Q2hpbGQ7CgkJCQkJfQoKCQkJCQkvLyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50cwoJCQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LnRib2R5ICkgewoKCQkJCQkJLy8gU3RyaW5nIHdhcyBhIDx0YWJsZT4sICptYXkqIGhhdmUgc3B1cmlvdXMgPHRib2R5PgoJCQkJCQl2YXIgaGFzQm9keSA9IHJ0Ym9keS50ZXN0KGVsZW0pLAoJCQkJCQkJdGJvZHkgPSB0YWcgPT09ICJ0YWJsZSIgJiYgIWhhc0JvZHkgPwoJCQkJCQkJCWRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxkLmNoaWxkTm9kZXMgOgoKCQkJCQkJCQkvLyBTdHJpbmcgd2FzIGEgYmFyZSA8dGhlYWQ+IG9yIDx0Zm9vdD4KCQkJCQkJCQl3cmFwWzFdID09PSAiPHRhYmxlPiIgJiYgIWhhc0JvZHkgPwoJCQkJCQkJCQlkaXYuY2hpbGROb2RlcyA6CgkJCQkJCQkJCVtdOwoKCQkJCQkJZm9yICggaiA9IHRib2R5Lmxlbmd0aCAtIDE7IGogPj0gMCA7IC0taiApIHsKCQkJCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0Ym9keVsgaiBdLCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5ndGggKSB7CgkJCQkJCQkJdGJvZHlbIGogXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0Ym9keVsgaiBdICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIElFIGNvbXBsZXRlbHkga2lsbHMgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gaW5uZXJIVE1MIGlzIHVzZWQKCQkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSAmJiBybGVhZGluZ1doaXRlc3BhY2UudGVzdCggZWxlbSApICkgewoJCQkJCQlkaXYuaW5zZXJ0QmVmb3JlKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBybGVhZGluZ1doaXRlc3BhY2UuZXhlYyhlbGVtKVswXSApLCBkaXYuZmlyc3RDaGlsZCApOwoJCQkJCX0KCgkJCQkJZWxlbSA9IGRpdi5jaGlsZE5vZGVzOwoJCQkJfQoJCQl9CgoJCQkvLyBSZXNldHMgZGVmYXVsdENoZWNrZWQgZm9yIGFueSByYWRpb3MgYW5kIGNoZWNrYm94ZXMKCQkJLy8gYWJvdXQgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIERPTSBpbiBJRSA2LzcgKCM4MDYwKQoJCQl2YXIgbGVuOwoJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5hcHBlbmRDaGVja2VkICkgewoJCQkJaWYgKCBlbGVtWzBdICYmIHR5cGVvZiAobGVuID0gZWxlbS5sZW5ndGgpID09PSAibnVtYmVyIiApIHsKCQkJCQlmb3IgKCBqID0gMDsgaiA8IGxlbjsgaisrICkgewoJCQkJCQlmaW5kSW5wdXRzKCBlbGVtW2pdICk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQlmaW5kSW5wdXRzKCBlbGVtICk7CgkJCQl9CgkJCX0KCgkJCWlmICggZWxlbS5ub2RlVHlwZSApIHsKCQkJCXJldC5wdXNoKCBlbGVtICk7CgkJCX0gZWxzZSB7CgkJCQlyZXQgPSBqUXVlcnkubWVyZ2UoIHJldCwgZWxlbSApOwoJCQl9CgkJfQoKCQlpZiAoIGZyYWdtZW50ICkgewoJCQljaGVja1NjcmlwdFR5cGUgPSBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiAhZWxlbS50eXBlIHx8IHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSApOwoJCQl9OwoJCQlmb3IgKCBpID0gMDsgcmV0W2ldOyBpKysgKSB7CgkJCQlpZiAoIHNjcmlwdHMgJiYgalF1ZXJ5Lm5vZGVOYW1lKCByZXRbaV0sICJzY3JpcHQiICkgJiYgKCFyZXRbaV0udHlwZSB8fCByZXRbaV0udHlwZS50b0xvd2VyQ2FzZSgpID09PSAidGV4dC9qYXZhc2NyaXB0IikgKSB7CgkJCQkJc2NyaXB0cy5wdXNoKCByZXRbaV0ucGFyZW50Tm9kZSA/IHJldFtpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCByZXRbaV0gKSA6IHJldFtpXSApOwoKCQkJCX0gZWxzZSB7CgkJCQkJaWYgKCByZXRbaV0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJCXZhciBqc1RhZ3MgPSBqUXVlcnkuZ3JlcCggcmV0W2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCAic2NyaXB0IiApLCBjaGVja1NjcmlwdFR5cGUgKTsKCgkJCQkJCXJldC5zcGxpY2UuYXBwbHkoIHJldCwgW2kgKyAxLCAwXS5jb25jYXQoIGpzVGFncyApICk7CgkJCQkJfQoJCQkJCWZyYWdtZW50LmFwcGVuZENoaWxkKCByZXRbaV0gKTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJY2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGRhdGEsIGlkLCBjYWNoZSA9IGpRdWVyeS5jYWNoZSwgaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywgc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsLAoJCQlkZWxldGVFeHBhbmRvID0galF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbzsKCgkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCWlmICggZWxlbS5ub2RlTmFtZSAmJiBqUXVlcnkubm9EYXRhW2VsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0gKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWQgPSBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdOwoKCQkJaWYgKCBpZCApIHsKCQkJCWRhdGEgPSBjYWNoZVsgaWQgXSAmJiBjYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXTsKCgkJCQlpZiAoIGRhdGEgJiYgZGF0YS5ldmVudHMgKSB7CgkJCQkJZm9yICggdmFyIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CgkJCQkJCWlmICggc3BlY2lhbFsgdHlwZSBdICkgewoJCQkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApOwoKCQkJCQkJLy8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZAoJCQkJCQl9IGVsc2UgewoJCQkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBOdWxsIHRoZSBET00gcmVmZXJlbmNlIHRvIGF2b2lkIElFNi83LzggbGVhayAoIzcwNTQpCgkJCQkJaWYgKCBkYXRhLmhhbmRsZSApIHsKCQkJCQkJZGF0YS5oYW5kbGUuZWxlbSA9IG51bGw7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggZGVsZXRlRXhwYW5kbyApIHsKCQkJCQlkZWxldGUgZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXTsKCgkJCQl9IGVsc2UgaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApIHsKCQkJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggalF1ZXJ5LmV4cGFuZG8gKTsKCQkJCX0KCgkJCQlkZWxldGUgY2FjaGVbIGlkIF07CgkJCX0KCQl9Cgl9Cn0pOwoKZnVuY3Rpb24gZXZhbFNjcmlwdCggaSwgZWxlbSApIHsKCWlmICggZWxlbS5zcmMgKSB7CgkJalF1ZXJ5LmFqYXgoewoJCQl1cmw6IGVsZW0uc3JjLAoJCQlhc3luYzogZmFsc2UsCgkJCWRhdGFUeXBlOiAic2NyaXB0IgoJCX0pOwoJfSBlbHNlIHsKCQlqUXVlcnkuZ2xvYmFsRXZhbCggKCBlbGVtLnRleHQgfHwgZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVySFRNTCB8fCAiIiApLnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgIi8qJDAqLyIgKSApOwoJfQoKCWlmICggZWxlbS5wYXJlbnROb2RlICkgewoJCWVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOwoJfQp9CgoKCgp2YXIgcmFscGhhID0gL2FscGhhXChbXildKlwpL2ksCglyb3BhY2l0eSA9IC9vcGFjaXR5PShbXildKikvLAoJLy8gZml4ZWQgZm9yIElFOSwgc2VlICM4MzQ2CglydXBwZXIgPSAvKFtBLVpdfF5tcykvZywKCXJudW1weCA9IC9eLT9cZCsoPzpweCk/JC9pLAoJcm51bSA9IC9eLT9cZC8sCglycmVsTnVtID0gL14oW1wtK10pPShbXC0rLlxkZV0rKS8sCgoJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCgljc3NXaWR0aCA9IFsgIkxlZnQiLCAiUmlnaHQiIF0sCgljc3NIZWlnaHQgPSBbICJUb3AiLCAiQm90dG9tIiBdLAoJY3VyQ1NTLAoKCWdldENvbXB1dGVkU3R5bGUsCgljdXJyZW50U3R5bGU7CgpqUXVlcnkuZm4uY3NzID0gZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewoJLy8gU2V0dGluZyAndW5kZWZpbmVkJyBpcyBhIG5vLW9wCglpZiAoIGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQlyZXR1cm4gdGhpczsKCX0KCglyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgbmFtZSwgdmFsdWUsIHRydWUsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/CgkJCWpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6CgkJCWpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTsKCX0pOwp9OwoKalF1ZXJ5LmV4dGVuZCh7CgkvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQKCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQoJY3NzSG9va3M6IHsKCQlvcGFjaXR5OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJaWYgKCBjb21wdXRlZCApIHsKCQkJCQkvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eQoJCQkJCXZhciByZXQgPSBjdXJDU1MoIGVsZW0sICJvcGFjaXR5IiwgIm9wYWNpdHkiICk7CgkJCQkJcmV0dXJuIHJldCA9PT0gIiIgPyAiMSIgOiByZXQ7CgoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gZWxlbS5zdHlsZS5vcGFjaXR5OwoJCQkJfQoJCQl9CgkJfQoJfSwKCgkvLyBFeGNsdWRlIHRoZSBmb2xsb3dpbmcgY3NzIHByb3BlcnRpZXMgdG8gYWRkIHB4Cgljc3NOdW1iZXI6IHsKCQkiZmlsbE9wYWNpdHkiOiB0cnVlLAoJCSJmb250V2VpZ2h0IjogdHJ1ZSwKCQkibGluZUhlaWdodCI6IHRydWUsCgkJIm9wYWNpdHkiOiB0cnVlLAoJCSJvcnBoYW5zIjogdHJ1ZSwKCQkid2lkb3dzIjogdHJ1ZSwKCQkiekluZGV4IjogdHJ1ZSwKCQkiem9vbSI6IHRydWUKCX0sCgoJLy8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQoJLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQoJY3NzUHJvcHM6IHsKCQkvLyBub3JtYWxpemUgZmxvYXQgY3NzIHByb3BlcnR5CgkJImZsb2F0IjogalF1ZXJ5LnN1cHBvcnQuY3NzRmxvYXQgPyAiY3NzRmxvYXQiIDogInN0eWxlRmxvYXQiCgl9LAoKCS8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCglzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHsKCQkvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKCQlpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lCgkJdmFyIHJldCwgdHlwZSwgb3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICksCgkJCXN0eWxlID0gZWxlbS5zdHlsZSwgaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CgoJCW5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHwgb3JpZ05hbWU7CgoJCS8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZQoJCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJdHlwZSA9IHR5cGVvZiB2YWx1ZTsKCgkJCS8vIGNvbnZlcnQgcmVsYXRpdmUgbnVtYmVyIHN0cmluZ3MgKCs9IG9yIC09KSB0byByZWxhdGl2ZSBudW1iZXJzLiAjNzM0NQoJCQlpZiAoIHR5cGUgPT09ICJzdHJpbmciICYmIChyZXQgPSBycmVsTnVtLmV4ZWMoIHZhbHVlICkpICkgewoJCQkJdmFsdWUgPSAoICsoIHJldFsxXSArIDEpICogK3JldFsyXSApICsgcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApICk7CgkJCQkvLyBGaXhlcyBidWcgIzkyMzcKCQkJCXR5cGUgPSAibnVtYmVyIjsKCQkJfQoKCQkJLy8gTWFrZSBzdXJlIHRoYXQgTmFOIGFuZCBudWxsIHZhbHVlcyBhcmVuJ3Qgc2V0LiBTZWU6ICM3MTE2CgkJCWlmICggdmFsdWUgPT0gbnVsbCB8fCB0eXBlID09PSAibnVtYmVyIiAmJiBpc05hTiggdmFsdWUgKSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkICdweCcgdG8gdGhlIChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpCgkJCWlmICggdHlwZSA9PT0gIm51bWJlciIgJiYgIWpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gKSB7CgkJCQl2YWx1ZSArPSAicHgiOwoJCQl9CgoJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUKCQkJaWYgKCAhaG9va3MgfHwgISgic2V0IiBpbiBob29rcykgfHwgKHZhbHVlID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSApKSAhPT0gdW5kZWZpbmVkICkgewoJCQkJLy8gV3JhcHBlZCB0byBwcmV2ZW50IElFIGZyb20gdGhyb3dpbmcgZXJyb3JzIHdoZW4gJ2ludmFsaWQnIHZhbHVlcyBhcmUgcHJvdmlkZWQKCQkJCS8vIEZpeGVzIGJ1ZyAjNTUwOQoJCQkJdHJ5IHsKCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9IGNhdGNoKGUpIHt9CgkJCX0KCgkJfSBlbHNlIHsKCQkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCgkJCWlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoJCQl9CgoJCQkvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdAoJCQlyZXR1cm4gc3R5bGVbIG5hbWUgXTsKCQl9Cgl9LAoKCWNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhICkgewoJCXZhciByZXQsIGhvb2tzOwoKCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUKCQluYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApOwoJCWhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF07CgkJbmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdIHx8IG5hbWU7CgoJCS8vIGNzc0Zsb2F0IG5lZWRzIGEgc3BlY2lhbCB0cmVhdG1lbnQKCQlpZiAoIG5hbWUgPT09ICJjc3NGbG9hdCIgKSB7CgkJCW5hbWUgPSAiZmxvYXQiOwoJCX0KCgkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmUKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiByZXQ7CgoJCS8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0CgkJfSBlbHNlIGlmICggY3VyQ1NTICkgewoJCQlyZXR1cm4gY3VyQ1NTKCBlbGVtLCBuYW1lICk7CgkJfQoJfSwKCgkvLyBBIG1ldGhvZCBmb3IgcXVpY2tseSBzd2FwcGluZyBpbi9vdXQgQ1NTIHByb3BlcnRpZXMgdG8gZ2V0IGNvcnJlY3QgY2FsY3VsYXRpb25zCglzd2FwOiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2sgKSB7CgkJdmFyIG9sZCA9IHt9OwoKCQkvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXMKCQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkgewoJCQlvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdOwoJCX0KCgkJY2FsbGJhY2suY2FsbCggZWxlbSApOwoKCQkvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXMKCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJCX0KCX0KfSk7CgovLyBERVBSRUNBVEVELCBVc2UgalF1ZXJ5LmNzcygpIGluc3RlYWQKalF1ZXJ5LmN1ckNTUyA9IGpRdWVyeS5jc3M7CgpqUXVlcnkuZWFjaChbImhlaWdodCIsICJ3aWR0aCJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCWpRdWVyeS5jc3NIb29rc1sgbmFtZSBdID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKCQkJdmFyIHZhbDsKCgkJCWlmICggY29tcHV0ZWQgKSB7CgkJCQlpZiAoIGVsZW0ub2Zmc2V0V2lkdGggIT09IDAgKSB7CgkJCQkJcmV0dXJuIGdldFdIKCBlbGVtLCBuYW1lLCBleHRyYSApOwoJCQkJfSBlbHNlIHsKCQkJCQlqUXVlcnkuc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7CgkJCQkJCXZhbCA9IGdldFdIKCBlbGVtLCBuYW1lLCBleHRyYSApOwoJCQkJCX0pOwoJCQkJfQoKCQkJCXJldHVybiB2YWw7CgkJCX0KCQl9LAoKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJaWYgKCBybnVtcHgudGVzdCggdmFsdWUgKSApIHsKCQkJCS8vIGlnbm9yZSBuZWdhdGl2ZSB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyAjMTU5OQoJCQkJdmFsdWUgPSBwYXJzZUZsb2F0KCB2YWx1ZSApOwoKCQkJCWlmICggdmFsdWUgPj0gMCApIHsKCQkJCQlyZXR1cm4gdmFsdWUgKyAicHgiOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB2YWx1ZTsKCQkJfQoJCX0KCX07Cn0pOwoKaWYgKCAhalF1ZXJ5LnN1cHBvcnQub3BhY2l0eSApIHsKCWpRdWVyeS5jc3NIb29rcy5vcGFjaXR5ID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkvLyBJRSB1c2VzIGZpbHRlcnMgZm9yIG9wYWNpdHkKCQkJcmV0dXJuIHJvcGFjaXR5LnRlc3QoIChjb21wdXRlZCAmJiBlbGVtLmN1cnJlbnRTdHlsZSA/IGVsZW0uY3VycmVudFN0eWxlLmZpbHRlciA6IGVsZW0uc3R5bGUuZmlsdGVyKSB8fCAiIiApID8KCQkJCSggcGFyc2VGbG9hdCggUmVnRXhwLiQxICkgLyAxMDAgKSArICIiIDoKCQkJCWNvbXB1dGVkID8gIjEiIDogIiI7CgkJfSwKCgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCXZhciBzdHlsZSA9IGVsZW0uc3R5bGUsCgkJCQljdXJyZW50U3R5bGUgPSBlbGVtLmN1cnJlbnRTdHlsZSwKCQkJCW9wYWNpdHkgPSBqUXVlcnkuaXNOYU4oIHZhbHVlICkgPyAiIiA6ICJhbHBoYShvcGFjaXR5PSIgKyB2YWx1ZSAqIDEwMCArICIpIiwKCQkJCWZpbHRlciA9IGN1cnJlbnRTdHlsZSAmJiBjdXJyZW50U3R5bGUuZmlsdGVyIHx8IHN0eWxlLmZpbHRlciB8fCAiIjsKCgkJCS8vIElFIGhhcyB0cm91YmxlIHdpdGggb3BhY2l0eSBpZiBpdCBkb2VzIG5vdCBoYXZlIGxheW91dAoJCQkvLyBGb3JjZSBpdCBieSBzZXR0aW5nIHRoZSB6b29tIGxldmVsCgkJCXN0eWxlLnpvb20gPSAxOwoKCQkJLy8gaWYgc2V0dGluZyBvcGFjaXR5IHRvIDEsIGFuZCBubyBvdGhlciBmaWx0ZXJzIGV4aXN0IC0gYXR0ZW1wdCB0byByZW1vdmUgZmlsdGVyIGF0dHJpYnV0ZSAjNjY1MgoJCQlpZiAoIHZhbHVlID49IDEgJiYgalF1ZXJ5LnRyaW0oIGZpbHRlci5yZXBsYWNlKCByYWxwaGEsICIiICkgKSA9PT0gIiIgKSB7CgoJCQkJLy8gU2V0dGluZyBzdHlsZS5maWx0ZXIgdG8gbnVsbCwgIiIgJiAiICIgc3RpbGwgbGVhdmUgImZpbHRlcjoiIGluIHRoZSBjc3NUZXh0CgkJCQkvLyBpZiAiZmlsdGVyOiIgaXMgcHJlc2VudCBhdCBhbGwsIGNsZWFyVHlwZSBpcyBkaXNhYmxlZCwgd2Ugd2FudCB0byBhdm9pZCB0aGlzCgkJCQkvLyBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUgaXMgSUUgT25seSwgYnV0IHNvIGFwcGFyZW50bHkgaXMgdGhpcyBjb2RlIHBhdGguLi4KCQkJCXN0eWxlLnJlbW92ZUF0dHJpYnV0ZSggImZpbHRlciIgKTsKCgkJCQkvLyBpZiB0aGVyZSB0aGVyZSBpcyBubyBmaWx0ZXIgc3R5bGUgYXBwbGllZCBpbiBhIGNzcyBydWxlLCB3ZSBhcmUgZG9uZQoJCQkJaWYgKCBjdXJyZW50U3R5bGUgJiYgIWN1cnJlbnRTdHlsZS5maWx0ZXIgKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQl9CgoJCQkvLyBvdGhlcndpc2UsIHNldCBuZXcgZmlsdGVyIHZhbHVlcwoJCQlzdHlsZS5maWx0ZXIgPSByYWxwaGEudGVzdCggZmlsdGVyICkgPwoJCQkJZmlsdGVyLnJlcGxhY2UoIHJhbHBoYSwgb3BhY2l0eSApIDoKCQkJCWZpbHRlciArICIgIiArIG9wYWNpdHk7CgkJfQoJfTsKfQoKalF1ZXJ5KGZ1bmN0aW9uKCkgewoJLy8gVGhpcyBob29rIGNhbm5vdCBiZSBhZGRlZCB1bnRpbCBET00gcmVhZHkgYmVjYXVzZSB0aGUgc3VwcG9ydCB0ZXN0CgkvLyBmb3IgaXQgaXMgbm90IHJ1biB1bnRpbCBhZnRlciBET00gcmVhZHkKCWlmICggIWpRdWVyeS5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHQgKSB7CgkJalF1ZXJ5LmNzc0hvb2tzLm1hcmdpblJpZ2h0ID0gewoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKCQkJCS8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodAoJCQkJLy8gV29yayBhcm91bmQgYnkgdGVtcG9yYXJpbHkgc2V0dGluZyBlbGVtZW50IGRpc3BsYXkgdG8gaW5saW5lLWJsb2NrCgkJCQl2YXIgcmV0OwoJCQkJalF1ZXJ5LnN3YXAoIGVsZW0sIHsgImRpc3BsYXkiOiAiaW5saW5lLWJsb2NrIiB9LCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIGNvbXB1dGVkICkgewoJCQkJCQlyZXQgPSBjdXJDU1MoIGVsZW0sICJtYXJnaW4tcmlnaHQiLCAibWFyZ2luUmlnaHQiICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJcmV0ID0gZWxlbS5zdHlsZS5tYXJnaW5SaWdodDsKCQkJCQl9CgkJCQl9KTsKCQkJCXJldHVybiByZXQ7CgkJCX0KCQl9OwoJfQp9KTsKCmlmICggZG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKCWdldENvbXB1dGVkU3R5bGUgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQl2YXIgcmV0LCBkZWZhdWx0VmlldywgY29tcHV0ZWRTdHlsZTsKCgkJbmFtZSA9IG5hbWUucmVwbGFjZSggcnVwcGVyLCAiLSQxIiApLnRvTG93ZXJDYXNlKCk7CgoJCWlmICggIShkZWZhdWx0VmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgKSB7CgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIChjb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSwgbnVsbCApKSApIHsKCQkJcmV0ID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICk7CgkJCWlmICggcmV0ID09PSAiIiAmJiAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBlbGVtICkgKSB7CgkJCQlyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX07Cn0KCmlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSApIHsKCWN1cnJlbnRTdHlsZSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCXZhciBsZWZ0LAoJCQlyZXQgPSBlbGVtLmN1cnJlbnRTdHlsZSAmJiBlbGVtLmN1cnJlbnRTdHlsZVsgbmFtZSBdLAoJCQlyc0xlZnQgPSBlbGVtLnJ1bnRpbWVTdHlsZSAmJiBlbGVtLnJ1bnRpbWVTdHlsZVsgbmFtZSBdLAoJCQlzdHlsZSA9IGVsZW0uc3R5bGU7CgoJCS8vIEZyb20gdGhlIGF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMKCQkvLyBodHRwOi8vZXJpay5lYWUubmV0L2FyY2hpdmVzLzIwMDcvMDcvMjcvMTguNTQuMTUvI2NvbW1lbnQtMTAyMjkxCgoJCS8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFyIHBpeGVsIG51bWJlcgoJCS8vIGJ1dCBhIG51bWJlciB0aGF0IGhhcyBhIHdlaXJkIGVuZGluZywgd2UgbmVlZCB0byBjb252ZXJ0IGl0IHRvIHBpeGVscwoJCWlmICggIXJudW1weC50ZXN0KCByZXQgKSAmJiBybnVtLnRlc3QoIHJldCApICkgewoJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCgkJCWxlZnQgPSBzdHlsZS5sZWZ0OwoKCQkJLy8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dAoJCQlpZiAoIHJzTGVmdCApIHsKCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSBlbGVtLmN1cnJlbnRTdHlsZS5sZWZ0OwoJCQl9CgkJCXN0eWxlLmxlZnQgPSBuYW1lID09PSAiZm9udFNpemUiID8gIjFlbSIgOiAocmV0IHx8IDApOwoJCQlyZXQgPSBzdHlsZS5waXhlbExlZnQgKyAicHgiOwoKCQkJLy8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlcwoJCQlzdHlsZS5sZWZ0ID0gbGVmdDsKCQkJaWYgKCByc0xlZnQgKSB7CgkJCQllbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gcnNMZWZ0OwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0ID09PSAiIiA/ICJhdXRvIiA6IHJldDsKCX07Cn0KCmN1ckNTUyA9IGdldENvbXB1dGVkU3R5bGUgfHwgY3VycmVudFN0eWxlOwoKZnVuY3Rpb24gZ2V0V0goIGVsZW0sIG5hbWUsIGV4dHJhICkgewoKCS8vIFN0YXJ0IHdpdGggb2Zmc2V0IHByb3BlcnR5Cgl2YXIgdmFsID0gbmFtZSA9PT0gIndpZHRoIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodCwKCQl3aGljaCA9IG5hbWUgPT09ICJ3aWR0aCIgPyBjc3NXaWR0aCA6IGNzc0hlaWdodDsKCglpZiAoIHZhbCA+IDAgKSB7CgkJaWYgKCBleHRyYSAhPT0gImJvcmRlciIgKSB7CgkJCWpRdWVyeS5lYWNoKCB3aGljaCwgZnVuY3Rpb24oKSB7CgkJCQlpZiAoICFleHRyYSApIHsKCQkJCQl2YWwgLT0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgInBhZGRpbmciICsgdGhpcyApICkgfHwgMDsKCQkJCX0KCQkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkgewoJCQkJCXZhbCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCBleHRyYSArIHRoaXMgKSApIHx8IDA7CgkJCQl9IGVsc2UgewoJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIHRoaXMgKyAiV2lkdGgiICkgKSB8fCAwOwoJCQkJfQoJCQl9KTsKCQl9CgoJCXJldHVybiB2YWwgKyAicHgiOwoJfQoKCS8vIEZhbGwgYmFjayB0byBjb21wdXRlZCB0aGVuIHVuY29tcHV0ZWQgY3NzIGlmIG5lY2Vzc2FyeQoJdmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBuYW1lICk7CglpZiAoIHZhbCA8IDAgfHwgdmFsID09IG51bGwgKSB7CgkJdmFsID0gZWxlbS5zdHlsZVsgbmFtZSBdIHx8IDA7Cgl9CgkvLyBOb3JtYWxpemUgIiIsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYQoJdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsKCgkvLyBBZGQgcGFkZGluZywgYm9yZGVyLCBtYXJnaW4KCWlmICggZXh0cmEgKSB7CgkJalF1ZXJ5LmVhY2goIHdoaWNoLCBmdW5jdGlvbigpIHsKCQkJdmFsICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIHRoaXMgKSApIHx8IDA7CgkJCWlmICggZXh0cmEgIT09ICJwYWRkaW5nIiApIHsKCQkJCXZhbCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIHRoaXMgKyAiV2lkdGgiICkgKSB8fCAwOwoJCQl9CgkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkgewoJCQkJdmFsICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIGV4dHJhICsgdGhpcyApICkgfHwgMDsKCQkJfQoJCX0pOwoJfQoKCXJldHVybiB2YWwgKyAicHgiOwp9CgppZiAoIGpRdWVyeS5leHByICYmIGpRdWVyeS5leHByLmZpbHRlcnMgKSB7CglqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciB3aWR0aCA9IGVsZW0ub2Zmc2V0V2lkdGgsCgkJCWhlaWdodCA9IGVsZW0ub2Zmc2V0SGVpZ2h0OwoKCQlyZXR1cm4gKHdpZHRoID09PSAwICYmIGhlaWdodCA9PT0gMCkgfHwgKCFqUXVlcnkuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMgJiYgKGVsZW0uc3R5bGUuZGlzcGxheSB8fCBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSkgPT09ICJub25lIik7Cgl9OwoKCWpRdWVyeS5leHByLmZpbHRlcnMudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhalF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4oIGVsZW0gKTsKCX07Cn0KCgoKCnZhciByMjAgPSAvJTIwL2csCglyYnJhY2tldCA9IC9cW1xdJC8sCglyQ1JMRiA9IC9ccj9cbi9nLAoJcmhhc2ggPSAvIy4qJC8sCglyaGVhZGVycyA9IC9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsIC8vIElFIGxlYXZlcyBhbiBcciBjaGFyYWN0ZXIgYXQgRU9MCglyaW5wdXQgPSAvXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksCgkvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb24KCXJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLywKCXJub0NvbnRlbnQgPSAvXig/OkdFVHxIRUFEKSQvLAoJcnByb3RvY29sID0gL15cL1wvLywKCXJxdWVyeSA9IC9cPy8sCglyc2NyaXB0ID0gLzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksCglyc2VsZWN0VGV4dGFyZWEgPSAvXig/OnNlbGVjdHx0ZXh0YXJlYSkvaSwKCXJzcGFjZXNBamF4ID0gL1xzKy8sCglydHMgPSAvKFs/Jl0pXz1bXiZdKi8sCglydXJsID0gL14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKSk/KT8vLAoKCS8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9hZCBtZXRob2QKCV9sb2FkID0galF1ZXJ5LmZuLmxvYWQsCgoJLyogUHJlZmlsdGVycwoJICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKCSAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CgkgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0CgkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCgkgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCgkgKi8KCXByZWZpbHRlcnMgPSB7fSwKCgkvKiBUcmFuc3BvcnRzIGJpbmRpbmdzCgkgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlmIG5lZWRlZAoJICovCgl0cmFuc3BvcnRzID0ge30sCgoJLy8gRG9jdW1lbnQgbG9jYXRpb24KCWFqYXhMb2NhdGlvbiwKCgkvLyBEb2N1bWVudCBsb2NhdGlvbiBzZWdtZW50cwoJYWpheExvY1BhcnRzLAoJCgkvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb24KCWFsbFR5cGVzID0gWyIqLyJdICsgWyIqIl07CgovLyAjODEzOCwgSUUgbWF5IHRocm93IGFuIGV4Y2VwdGlvbiB3aGVuIGFjY2Vzc2luZwovLyBhIGZpZWxkIGZyb20gd2luZG93LmxvY2F0aW9uIGlmIGRvY3VtZW50LmRvbWFpbiBoYXMgYmVlbiBzZXQKdHJ5IHsKCWFqYXhMb2NhdGlvbiA9IGxvY2F0aW9uLmhyZWY7Cn0gY2F0Y2goIGUgKSB7CgkvLyBVc2UgdGhlIGhyZWYgYXR0cmlidXRlIG9mIGFuIEEgZWxlbWVudAoJLy8gc2luY2UgSUUgd2lsbCBtb2RpZnkgaXQgZ2l2ZW4gZG9jdW1lbnQubG9jYXRpb24KCWFqYXhMb2NhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOwoJYWpheExvY2F0aW9uLmhyZWYgPSAiIjsKCWFqYXhMb2NhdGlvbiA9IGFqYXhMb2NhdGlvbi5ocmVmOwp9CgovLyBTZWdtZW50IGxvY2F0aW9uIGludG8gcGFydHMKYWpheExvY1BhcnRzID0gcnVybC5leGVjKCBhamF4TG9jYXRpb24udG9Mb3dlckNhc2UoKSApIHx8IFtdOwoKLy8gQmFzZSAiY29uc3RydWN0b3IiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnQKZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CgoJLy8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAiKiIKCXJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgewoKCQlpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09ICJzdHJpbmciICkgewoJCQlmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOwoJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBmdW5jICkgKSB7CgkJCXZhciBkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5zcGxpdCggcnNwYWNlc0FqYXggKSwKCQkJCWkgPSAwLAoJCQkJbGVuZ3RoID0gZGF0YVR5cGVzLmxlbmd0aCwKCQkJCWRhdGFUeXBlLAoJCQkJbGlzdCwKCQkJCXBsYWNlQmVmb3JlOwoKCQkJLy8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvbgoJCQlmb3IoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlc1sgaSBdOwoJCQkJLy8gV2UgY29udHJvbCBpZiB3ZSdyZSBhc2tlZCB0byBhZGQgYmVmb3JlCgkJCQkvLyBhbnkgZXhpc3RpbmcgZWxlbWVudAoJCQkJcGxhY2VCZWZvcmUgPSAvXlwrLy50ZXN0KCBkYXRhVHlwZSApOwoJCQkJaWYgKCBwbGFjZUJlZm9yZSApIHsKCQkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlLnN1YnN0ciggMSApIHx8ICIqIjsKCQkJCX0KCQkJCWxpc3QgPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW107CgkJCQkvLyB0aGVuIHdlIGFkZCB0byB0aGUgc3RydWN0dXJlIGFjY29yZGluZ2x5CgkJCQlsaXN0WyBwbGFjZUJlZm9yZSA/ICJ1bnNoaWZ0IiA6ICJwdXNoIiBdKCBmdW5jICk7CgkJCX0KCQl9Cgl9Owp9CgovLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiwKCQlkYXRhVHlwZSAvKiBpbnRlcm5hbCAqLywgaW5zcGVjdGVkIC8qIGludGVybmFsICovICkgewoKCWRhdGFUeXBlID0gZGF0YVR5cGUgfHwgb3B0aW9ucy5kYXRhVHlwZXNbIDAgXTsKCWluc3BlY3RlZCA9IGluc3BlY3RlZCB8fCB7fTsKCglpbnNwZWN0ZWRbIGRhdGFUeXBlIF0gPSB0cnVlOwoKCXZhciBsaXN0ID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdLAoJCWkgPSAwLAoJCWxlbmd0aCA9IGxpc3QgPyBsaXN0Lmxlbmd0aCA6IDAsCgkJZXhlY3V0ZU9ubHkgPSAoIHN0cnVjdHVyZSA9PT0gcHJlZmlsdGVycyApLAoJCXNlbGVjdGlvbjsKCglmb3IoOyBpIDwgbGVuZ3RoICYmICggZXhlY3V0ZU9ubHkgfHwgIXNlbGVjdGlvbiApOyBpKysgKSB7CgkJc2VsZWN0aW9uID0gbGlzdFsgaSBdKCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7CgkJLy8gSWYgd2UgZ290IHJlZGlyZWN0ZWQgdG8gYW5vdGhlciBkYXRhVHlwZQoJCS8vIHdlIHRyeSB0aGVyZSBpZiBleGVjdXRpbmcgb25seSBhbmQgbm90IGRvbmUgYWxyZWFkeQoJCWlmICggdHlwZW9mIHNlbGVjdGlvbiA9PT0gInN0cmluZyIgKSB7CgkJCWlmICggIWV4ZWN1dGVPbmx5IHx8IGluc3BlY3RlZFsgc2VsZWN0aW9uIF0gKSB7CgkJCQlzZWxlY3Rpb24gPSB1bmRlZmluZWQ7CgkJCX0gZWxzZSB7CgkJCQlvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBzZWxlY3Rpb24gKTsKCQkJCXNlbGVjdGlvbiA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKAoJCQkJCQlzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIsIHNlbGVjdGlvbiwgaW5zcGVjdGVkICk7CgkJCX0KCQl9Cgl9CgkvLyBJZiB3ZSdyZSBvbmx5IGV4ZWN1dGluZyBvciBub3RoaW5nIHdhcyBzZWxlY3RlZAoJLy8gd2UgdHJ5IHRoZSBjYXRjaGFsbCBkYXRhVHlwZSBpZiBub3QgZG9uZSBhbHJlYWR5CglpZiAoICggZXhlY3V0ZU9ubHkgfHwgIXNlbGVjdGlvbiApICYmICFpbnNwZWN0ZWRbICIqIiBdICkgewoJCXNlbGVjdGlvbiA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKAoJCQkJc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSLCAiKiIsIGluc3BlY3RlZCApOwoJfQoJLy8gdW5uZWNlc3Nhcnkgd2hlbiBvbmx5IGV4ZWN1dGluZyAocHJlZmlsdGVycykKCS8vIGJ1dCBpdCdsbCBiZSBpZ25vcmVkIGJ5IHRoZSBjYWxsZXIgaW4gdGhhdCBjYXNlCglyZXR1cm4gc2VsZWN0aW9uOwp9CgovLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnMKLy8gdGhhdCB0YWtlcyAiZmxhdCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpCi8vIEZpeGVzICM5ODg3CmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkgewoJdmFyIGtleSwgZGVlcCwKCQlmbGF0T3B0aW9ucyA9IGpRdWVyeS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnMgfHwge307Cglmb3IoIGtleSBpbiBzcmMgKSB7CgkJaWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7CgkJCSggZmxhdE9wdGlvbnNbIGtleSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8ICggZGVlcCA9IHt9ICkgKSApWyBrZXkgXSA9IHNyY1sga2V5IF07CgkJfQoJfQoJaWYgKCBkZWVwICkgewoJCWpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApOwoJfQp9CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWxvYWQ6IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7CgkJaWYgKCB0eXBlb2YgdXJsICE9PSAic3RyaW5nIiAmJiBfbG9hZCApIHsKCQkJcmV0dXJuIF9sb2FkLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCgkJLy8gRG9uJ3QgZG8gYSByZXF1ZXN0IGlmIG5vIGVsZW1lbnRzIGFyZSBiZWluZyByZXF1ZXN0ZWQKCQl9IGVsc2UgaWYgKCAhdGhpcy5sZW5ndGggKSB7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJdmFyIG9mZiA9IHVybC5pbmRleE9mKCAiICIgKTsKCQlpZiAoIG9mZiA+PSAwICkgewoJCQl2YXIgc2VsZWN0b3IgPSB1cmwuc2xpY2UoIG9mZiwgdXJsLmxlbmd0aCApOwoJCQl1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApOwoJCX0KCgkJLy8gRGVmYXVsdCB0byBhIEdFVCByZXF1ZXN0CgkJdmFyIHR5cGUgPSAiR0VUIjsKCgkJLy8gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkCgkJaWYgKCBwYXJhbXMgKSB7CgkJCS8vIElmIGl0J3MgYSBmdW5jdGlvbgoJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHsKCQkJCS8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrCgkJCQljYWxsYmFjayA9IHBhcmFtczsKCQkJCXBhcmFtcyA9IHVuZGVmaW5lZDsKCgkJCS8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmcKCQkJfSBlbHNlIGlmICggdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7CgkJCQlwYXJhbXMgPSBqUXVlcnkucGFyYW0oIHBhcmFtcywgalF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCApOwoJCQkJdHlwZSA9ICJQT1NUIjsKCQkJfQoJCX0KCgkJdmFyIHNlbGYgPSB0aGlzOwoKCQkvLyBSZXF1ZXN0IHRoZSByZW1vdGUgZG9jdW1lbnQKCQlqUXVlcnkuYWpheCh7CgkJCXVybDogdXJsLAoJCQl0eXBlOiB0eXBlLAoJCQlkYXRhVHlwZTogImh0bWwiLAoJCQlkYXRhOiBwYXJhbXMsCgkJCS8vIENvbXBsZXRlIGNhbGxiYWNrIChyZXNwb25zZVRleHQgaXMgdXNlZCBpbnRlcm5hbGx5KQoJCQljb21wbGV0ZTogZnVuY3Rpb24oIGpxWEhSLCBzdGF0dXMsIHJlc3BvbnNlVGV4dCApIHsKCQkJCS8vIFN0b3JlIHRoZSByZXNwb25zZSBhcyBzcGVjaWZpZWQgYnkgdGhlIGpxWEhSIG9iamVjdAoJCQkJcmVzcG9uc2VUZXh0ID0ganFYSFIucmVzcG9uc2VUZXh0OwoJCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaW5qZWN0IHRoZSBIVE1MIGludG8gYWxsIHRoZSBtYXRjaGVkIGVsZW1lbnRzCgkJCQlpZiAoIGpxWEhSLmlzUmVzb2x2ZWQoKSApIHsKCQkJCQkvLyAjNDgyNTogR2V0IHRoZSBhY3R1YWwgcmVzcG9uc2UgaW4gY2FzZQoJCQkJCS8vIGEgZGF0YUZpbHRlciBpcyBwcmVzZW50IGluIGFqYXhTZXR0aW5ncwoJCQkJCWpxWEhSLmRvbmUoZnVuY3Rpb24oIHIgKSB7CgkJCQkJCXJlc3BvbnNlVGV4dCA9IHI7CgkJCQkJfSk7CgkJCQkJLy8gU2VlIGlmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZAoJCQkJCXNlbGYuaHRtbCggc2VsZWN0b3IgPwoJCQkJCQkvLyBDcmVhdGUgYSBkdW1teSBkaXYgdG8gaG9sZCB0aGUgcmVzdWx0cwoJCQkJCQlqUXVlcnkoIjxkaXY+IikKCQkJCQkJCS8vIGluamVjdCB0aGUgY29udGVudHMgb2YgdGhlIGRvY3VtZW50IGluLCByZW1vdmluZyB0aGUgc2NyaXB0cwoJCQkJCQkJLy8gdG8gYXZvaWQgYW55ICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzIGluIElFCgkJCQkJCQkuYXBwZW5kKHJlc3BvbnNlVGV4dC5yZXBsYWNlKHJzY3JpcHQsICIiKSkKCgkJCQkJCQkvLyBMb2NhdGUgdGhlIHNwZWNpZmllZCBlbGVtZW50cwoJCQkJCQkJLmZpbmQoc2VsZWN0b3IpIDoKCgkJCQkJCS8vIElmIG5vdCwganVzdCBpbmplY3QgdGhlIGZ1bGwgcmVzdWx0CgkJCQkJCXJlc3BvbnNlVGV4dCApOwoJCQkJfQoKCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJc2VsZi5lYWNoKCBjYWxsYmFjaywgWyByZXNwb25zZVRleHQsIHN0YXR1cywganFYSFIgXSApOwoJCQkJfQoJCQl9CgkJfSk7CgoJCXJldHVybiB0aGlzOwoJfSwKCglzZXJpYWxpemU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApOwoJfSwKCglzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7CgkJCXJldHVybiB0aGlzLmVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggdGhpcy5lbGVtZW50cyApIDogdGhpczsKCQl9KQoJCS5maWx0ZXIoZnVuY3Rpb24oKXsKCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhdGhpcy5kaXNhYmxlZCAmJgoJCQkJKCB0aGlzLmNoZWNrZWQgfHwgcnNlbGVjdFRleHRhcmVhLnRlc3QoIHRoaXMubm9kZU5hbWUgKSB8fAoJCQkJCXJpbnB1dC50ZXN0KCB0aGlzLnR5cGUgKSApOwoJCX0pCgkJLm1hcChmdW5jdGlvbiggaSwgZWxlbSApewoJCQl2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7CgoJCQlyZXR1cm4gdmFsID09IG51bGwgPwoJCQkJbnVsbCA6CgkJCQlqUXVlcnkuaXNBcnJheSggdmFsICkgPwoJCQkJCWpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCwgaSApewoJCQkJCQlyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CgkJCQkJfSkgOgoJCQkJCXsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCAiXHJcbiIgKSB9OwoJCX0pLmdldCgpOwoJfQp9KTsKCi8vIEF0dGFjaCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY29tbW9uIEFKQVggZXZlbnRzCmpRdWVyeS5lYWNoKCAiYWpheFN0YXJ0IGFqYXhTdG9wIGFqYXhDb21wbGV0ZSBhamF4RXJyb3IgYWpheFN1Y2Nlc3MgYWpheFNlbmQiLnNwbGl0KCAiICIgKSwgZnVuY3Rpb24oIGksIG8gKXsKCWpRdWVyeS5mblsgbyBdID0gZnVuY3Rpb24oIGYgKXsKCQlyZXR1cm4gdGhpcy5iaW5kKCBvLCBmICk7Cgl9Owp9KTsKCmpRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKCWpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCQkvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21pdHRlZAoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgoJCXJldHVybiBqUXVlcnkuYWpheCh7CgkJCXR5cGU6IG1ldGhvZCwKCQkJdXJsOiB1cmwsCgkJCWRhdGE6IGRhdGEsCgkJCXN1Y2Nlc3M6IGNhbGxiYWNrLAoJCQlkYXRhVHlwZTogdHlwZQoJCX0pOwoJfTsKfSk7CgpqUXVlcnkuZXh0ZW5kKHsKCglnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssICJzY3JpcHQiICk7Cgl9LAoKCWdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCAianNvbiIgKTsKCX0sCgoJLy8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXQKCS8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy4KCS8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuCglhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkgewoJCWlmICggc2V0dGluZ3MgKSB7CgkJCS8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0CgkJCWFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApOwoJCX0gZWxzZSB7CgkJCS8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3MKCQkJc2V0dGluZ3MgPSB0YXJnZXQ7CgkJCXRhcmdldCA9IGpRdWVyeS5hamF4U2V0dGluZ3M7CgkJfQoJCWFqYXhFeHRlbmQoIHRhcmdldCwgc2V0dGluZ3MgKTsKCQlyZXR1cm4gdGFyZ2V0OwoJfSwKCglhamF4U2V0dGluZ3M6IHsKCQl1cmw6IGFqYXhMb2NhdGlvbiwKCQlpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBhamF4TG9jUGFydHNbIDEgXSApLAoJCWdsb2JhbDogdHJ1ZSwKCQl0eXBlOiAiR0VUIiwKCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCgkJcHJvY2Vzc0RhdGE6IHRydWUsCgkJYXN5bmM6IHRydWUsCgkJLyoKCQl0aW1lb3V0OiAwLAoJCWRhdGE6IG51bGwsCgkJZGF0YVR5cGU6IG51bGwsCgkJdXNlcm5hbWU6IG51bGwsCgkJcGFzc3dvcmQ6IG51bGwsCgkJY2FjaGU6IG51bGwsCgkJdHJhZGl0aW9uYWw6IGZhbHNlLAoJCWhlYWRlcnM6IHt9LAoJCSovCgoJCWFjY2VwdHM6IHsKCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCgkJCWh0bWw6ICJ0ZXh0L2h0bWwiLAoJCQl0ZXh0OiAidGV4dC9wbGFpbiIsCgkJCWpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLAoJCQkiKiI6IGFsbFR5cGVzCgkJfSwKCgkJY29udGVudHM6IHsKCQkJeG1sOiAveG1sLywKCQkJaHRtbDogL2h0bWwvLAoJCQlqc29uOiAvanNvbi8KCQl9LAoKCQlyZXNwb25zZUZpZWxkczogewoJCQl4bWw6ICJyZXNwb25zZVhNTCIsCgkJCXRleHQ6ICJyZXNwb25zZVRleHQiCgkJfSwKCgkJLy8gTGlzdCBvZiBkYXRhIGNvbnZlcnRlcnMKCQkvLyAxKSBrZXkgZm9ybWF0IGlzICJzb3VyY2VfdHlwZSBkZXN0aW5hdGlvbl90eXBlIiAoYSBzaW5nbGUgc3BhY2UgaW4tYmV0d2VlbikKCQkvLyAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZCBmb3Igc291cmNlX3R5cGUKCQljb252ZXJ0ZXJzOiB7CgoJCQkvLyBDb252ZXJ0IGFueXRoaW5nIHRvIHRleHQKCQkJIiogdGV4dCI6IHdpbmRvdy5TdHJpbmcsCgoJCQkvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbikKCQkJInRleHQgaHRtbCI6IHRydWUsCgoJCQkvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uCgkJCSJ0ZXh0IGpzb24iOiBqUXVlcnkucGFyc2VKU09OLAoKCQkJLy8gUGFyc2UgdGV4dCBhcyB4bWwKCQkJInRleHQgeG1sIjogalF1ZXJ5LnBhcnNlWE1MCgkJfSwKCgkJLy8gRm9yIG9wdGlvbnMgdGhhdCBzaG91bGRuJ3QgYmUgZGVlcCBleHRlbmRlZDoKCQkvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmCgkJLy8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmUKCQkvLyBkZWVwIGV4dGVuZGVkIChzZWUgYWpheEV4dGVuZCkKCQlmbGF0T3B0aW9uczogewoJCQljb250ZXh0OiB0cnVlLAoJCQl1cmw6IHRydWUKCQl9Cgl9LAoKCWFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAoJYWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksCgoJLy8gTWFpbiBtZXRob2QKCWFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7CgoJCS8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCgkJaWYgKCB0eXBlb2YgdXJsID09PSAib2JqZWN0IiApIHsKCQkJb3B0aW9ucyA9IHVybDsKCQkJdXJsID0gdW5kZWZpbmVkOwoJCX0KCgkJLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCgkJdmFyIC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3QKCQkJcyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksCgkJCS8vIENhbGxiYWNrcyBjb250ZXh0CgkJCWNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAoJCQkvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzCgkJCS8vIEl0J3MgdGhlIGNhbGxiYWNrQ29udGV4dCBpZiBvbmUgd2FzIHByb3ZpZGVkIGluIHRoZSBvcHRpb25zCgkJCS8vIGFuZCBpZiBpdCdzIGEgRE9NIG5vZGUgb3IgYSBqUXVlcnkgY29sbGVjdGlvbgoJCQlnbG9iYWxFdmVudENvbnRleHQgPSBjYWxsYmFja0NvbnRleHQgIT09IHMgJiYKCQkJCSggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSApID8KCQkJCQkJalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6IGpRdWVyeS5ldmVudCwKCQkJLy8gRGVmZXJyZWRzCgkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuX0RlZmVycmVkKCksCgkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCgkJCXN0YXR1c0NvZGUgPSBzLnN0YXR1c0NvZGUgfHwge30sCgkJCS8vIGlmTW9kaWZpZWQga2V5CgkJCWlmTW9kaWZpZWRLZXksCgkJCS8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpCgkJCXJlcXVlc3RIZWFkZXJzID0ge30sCgkJCXJlcXVlc3RIZWFkZXJzTmFtZXMgPSB7fSwKCQkJLy8gUmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcsCgkJCXJlc3BvbnNlSGVhZGVycywKCQkJLy8gdHJhbnNwb3J0CgkJCXRyYW5zcG9ydCwKCQkJLy8gdGltZW91dCBoYW5kbGUKCQkJdGltZW91dFRpbWVyLAoJCQkvLyBDcm9zcy1kb21haW4gZGV0ZWN0aW9uIHZhcnMKCQkJcGFydHMsCgkJCS8vIFRoZSBqcVhIUiBzdGF0ZQoJCQlzdGF0ZSA9IDAsCgkJCS8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZAoJCQlmaXJlR2xvYmFscywKCQkJLy8gTG9vcCB2YXJpYWJsZQoJCQlpLAoJCQkvLyBGYWtlIHhocgoJCQlqcVhIUiA9IHsKCgkJCQlyZWFkeVN0YXRlOiAwLAoKCQkJCS8vIENhY2hlcyB0aGUgaGVhZGVyCgkJCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJCQkJaWYgKCAhc3RhdGUgKSB7CgkJCQkJCXZhciBsbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCQkJCQkJbmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdIHx8IG5hbWU7CgkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIFJhdyBzdHJpbmcKCQkJCWdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIHN0YXRlID09PSAyID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDsKCQkJCX0sCgoJCQkJLy8gQnVpbGRzIGhlYWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZAoJCQkJZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7CgkJCQkJdmFyIG1hdGNoOwoJCQkJCWlmICggc3RhdGUgPT09IDIgKSB7CgkJCQkJCWlmICggIXJlc3BvbnNlSGVhZGVycyApIHsKCQkJCQkJCXJlc3BvbnNlSGVhZGVycyA9IHt9OwoJCQkJCQkJd2hpbGUoICggbWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSApICkgewoJCQkJCQkJCXJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbMV0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQltYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTsKCQkJCQl9CgkJCQkJcmV0dXJuIG1hdGNoID09PSB1bmRlZmluZWQgPyBudWxsIDogbWF0Y2g7CgkJCQl9LAoKCQkJCS8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCgkJCQlvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlpZiAoICFzdGF0ZSApIHsKCQkJCQkJcy5taW1lVHlwZSA9IHR5cGU7CgkJCQkJfQoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCgkJCQkvLyBDYW5jZWwgdGhlIHJlcXVlc3QKCQkJCWFib3J0OiBmdW5jdGlvbiggc3RhdHVzVGV4dCApIHsKCQkJCQlzdGF0dXNUZXh0ID0gc3RhdHVzVGV4dCB8fCAiYWJvcnQiOwoJCQkJCWlmICggdHJhbnNwb3J0ICkgewoJCQkJCQl0cmFuc3BvcnQuYWJvcnQoIHN0YXR1c1RleHQgKTsKCQkJCQl9CgkJCQkJZG9uZSggMCwgc3RhdHVzVGV4dCApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfQoJCQl9OwoKCQkvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmUKCQkvLyBJdCBpcyBkZWZpbmVkIGhlcmUgYmVjYXVzZSBqc2xpbnQgY29tcGxhaW5zIGlmIGl0IGlzIGRlY2xhcmVkCgkJLy8gYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24gKHdoaWNoIHdvdWxkIGJlIG1vcmUgbG9naWNhbCBhbmQgcmVhZGFibGUpCgkJZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRpdmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7CgoJCQkvLyBDYWxsZWQgb25jZQoJCQlpZiAoIHN0YXRlID09PSAyICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBTdGF0ZSBpcyAiZG9uZSIgbm93CgkJCXN0YXRlID0gMjsKCgkJCS8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzCgkJCWlmICggdGltZW91dFRpbWVyICkgewoJCQkJY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTsKCQkJfQoKCQkJLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24KCQkJLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKCQkJdHJhbnNwb3J0ID0gdW5kZWZpbmVkOwoKCQkJLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOwoKCQkJLy8gU2V0IHJlYWR5U3RhdGUKCQkJanFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKCgkJCXZhciBpc1N1Y2Nlc3MsCgkJCQlzdWNjZXNzLAoJCQkJZXJyb3IsCgkJCQlzdGF0dXNUZXh0ID0gbmF0aXZlU3RhdHVzVGV4dCwKCQkJCXJlc3BvbnNlID0gcmVzcG9uc2VzID8gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIDogdW5kZWZpbmVkLAoJCQkJbGFzdE1vZGlmaWVkLAoJCQkJZXRhZzsKCgkJCS8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nCgkJCWlmICggc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQgKSB7CgoJCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KCQkJCWlmICggcy5pZk1vZGlmaWVkICkgewoKCQkJCQlpZiAoICggbGFzdE1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJMYXN0LU1vZGlmaWVkIiApICkgKSB7CgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSA9IGxhc3RNb2RpZmllZDsKCQkJCQl9CgkJCQkJaWYgKCAoIGV0YWcgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggIkV0YWciICkgKSApIHsKCQkJCQkJalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSA9IGV0YWc7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIElmIG5vdCBtb2RpZmllZAoJCQkJaWYgKCBzdGF0dXMgPT09IDMwNCApIHsKCgkJCQkJc3RhdHVzVGV4dCA9ICJub3Rtb2RpZmllZCI7CgkJCQkJaXNTdWNjZXNzID0gdHJ1ZTsKCgkJCQkvLyBJZiB3ZSBoYXZlIGRhdGEKCQkJCX0gZWxzZSB7CgoJCQkJCXRyeSB7CgkJCQkJCXN1Y2Nlc3MgPSBhamF4Q29udmVydCggcywgcmVzcG9uc2UgKTsKCQkJCQkJc3RhdHVzVGV4dCA9ICJzdWNjZXNzIjsKCQkJCQkJaXNTdWNjZXNzID0gdHJ1ZTsKCQkJCQl9IGNhdGNoKGUpIHsKCQkJCQkJLy8gV2UgaGF2ZSBhIHBhcnNlcmVycm9yCgkJCQkJCXN0YXR1c1RleHQgPSAicGFyc2VyZXJyb3IiOwoJCQkJCQllcnJvciA9IGU7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgewoJCQkJLy8gV2UgZXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQKCQkJCS8vIHRoZW4gbm9ybWFsaXplIHN0YXR1c1RleHQgYW5kIHN0YXR1cyBmb3Igbm9uLWFib3J0cwoJCQkJZXJyb3IgPSBzdGF0dXNUZXh0OwoJCQkJaWYoICFzdGF0dXNUZXh0IHx8IHN0YXR1cyApIHsKCQkJCQlzdGF0dXNUZXh0ID0gImVycm9yIjsKCQkJCQlpZiAoIHN0YXR1cyA8IDAgKSB7CgkJCQkJCXN0YXR1cyA9IDA7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdAoJCQlqcVhIUi5zdGF0dXMgPSBzdGF0dXM7CgkJCWpxWEhSLnN0YXR1c1RleHQgPSAiIiArICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICk7CgoJCQkvLyBTdWNjZXNzL0Vycm9yCgkJCWlmICggaXNTdWNjZXNzICkgewoJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7CgkJCX0gZWxzZSB7CgkJCQlkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTsKCQkJfQoKCQkJLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKCQkJanFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApOwoJCQlzdGF0dXNDb2RlID0gdW5kZWZpbmVkOwoKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheCIgKyAoIGlzU3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJFcnJvciIgKSwKCQkJCQkJWyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTsKCQkJfQoKCQkJLy8gQ29tcGxldGUKCQkJY29tcGxldGVEZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTsKCgkJCWlmICggZmlyZUdsb2JhbHMgKSB7CgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhDb21wbGV0ZSIsIFsganFYSFIsIHMgXSApOwoJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQlpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEF0dGFjaCBkZWZlcnJlZHMKCQlkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApOwoJCWpxWEhSLnN1Y2Nlc3MgPSBqcVhIUi5kb25lOwoJCWpxWEhSLmVycm9yID0ganFYSFIuZmFpbDsKCQlqcVhIUi5jb21wbGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuZG9uZTsKCgkJLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKCQlqcVhIUi5zdGF0dXNDb2RlID0gZnVuY3Rpb24oIG1hcCApIHsKCQkJaWYgKCBtYXAgKSB7CgkJCQl2YXIgdG1wOwoJCQkJaWYgKCBzdGF0ZSA8IDIgKSB7CgkJCQkJZm9yKCB0bXAgaW4gbWFwICkgewoJCQkJCQlzdGF0dXNDb2RlWyB0bXAgXSA9IFsgc3RhdHVzQ29kZVt0bXBdLCBtYXBbdG1wXSBdOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJdG1wID0gbWFwWyBqcVhIUi5zdGF0dXMgXTsKCQkJCQlqcVhIUi50aGVuKCB0bXAsIHRtcCApOwoJCQkJfQoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX07CgoJCS8vIFJlbW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKQoJCS8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKCM1ODY2OiBJRTcgaXNzdWUgd2l0aCBwcm90b2NvbC1sZXNzIHVybHMpCgkJLy8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlCgkJcy51cmwgPSAoICggdXJsIHx8IHMudXJsICkgKyAiIiApLnJlcGxhY2UoIHJoYXNoLCAiIiApLnJlcGxhY2UoIHJwcm90b2NvbCwgYWpheExvY1BhcnRzWyAxIF0gKyAiLy8iICk7CgoJCS8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3QKCQlzLmRhdGFUeXBlcyA9IGpRdWVyeS50cmltKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkuc3BsaXQoIHJzcGFjZXNBamF4ICk7CgoJCS8vIERldGVybWluZSBpZiBhIGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyCgkJaWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7CgkJCXBhcnRzID0gcnVybC5leGVjKCBzLnVybC50b0xvd2VyQ2FzZSgpICk7CgkJCXMuY3Jvc3NEb21haW4gPSAhISggcGFydHMgJiYKCQkJCSggcGFydHNbIDEgXSAhPSBhamF4TG9jUGFydHNbIDEgXSB8fCBwYXJ0c1sgMiBdICE9IGFqYXhMb2NQYXJ0c1sgMiBdIHx8CgkJCQkJKCBwYXJ0c1sgMyBdIHx8ICggcGFydHNbIDEgXSA9PT0gImh0dHA6IiA/IDgwIDogNDQzICkgKSAhPQoJCQkJCQkoIGFqYXhMb2NQYXJ0c1sgMyBdIHx8ICggYWpheExvY1BhcnRzWyAxIF0gPT09ICJodHRwOiIgPyA4MCA6IDQ0MyApICkgKQoJCQkpOwoJCX0KCgkJLy8gQ29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nCgkJaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApIHsKCQkJcy5kYXRhID0galF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTsKCQl9CgoJCS8vIEFwcGx5IHByZWZpbHRlcnMKCQlpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWxlciwgc3RvcCB0aGVyZQoJCWlmICggc3RhdGUgPT09IDIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvCgkJZmlyZUdsb2JhbHMgPSBzLmdsb2JhbDsKCgkJLy8gVXBwZXJjYXNlIHRoZSB0eXBlCgkJcy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7CgoJCS8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50CgkJcy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgkJfQoKCQkvLyBNb3JlIG9wdGlvbnMgaGFuZGxpbmcgZm9yIHJlcXVlc3RzIHdpdGggbm8gY29udGVudAoJCWlmICggIXMuaGFzQ29udGVudCApIHsKCgkJCS8vIElmIGRhdGEgaXMgYXZhaWxhYmxlLCBhcHBlbmQgZGF0YSB0byB1cmwKCQkJaWYgKCBzLmRhdGEgKSB7CgkJCQlzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gIiYiIDogIj8iICkgKyBzLmRhdGE7CgkJCQkvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5CgkJCQlkZWxldGUgcy5kYXRhOwoJCQl9CgoJCQkvLyBHZXQgaWZNb2RpZmllZEtleSBiZWZvcmUgYWRkaW5nIHRoZSBhbnRpLWNhY2hlIHBhcmFtZXRlcgoJCQlpZk1vZGlmaWVkS2V5ID0gcy51cmw7CgoJCQkvLyBBZGQgYW50aS1jYWNoZSBpbiB1cmwgaWYgbmVlZGVkCgkJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7CgoJCQkJdmFyIHRzID0galF1ZXJ5Lm5vdygpLAoJCQkJCS8vIHRyeSByZXBsYWNpbmcgXz0gaWYgaXQgaXMgdGhlcmUKCQkJCQlyZXQgPSBzLnVybC5yZXBsYWNlKCBydHMsICIkMV89IiArIHRzICk7CgoJCQkJLy8gaWYgbm90aGluZyB3YXMgcmVwbGFjZWQsIGFkZCB0aW1lc3RhbXAgdG8gdGhlIGVuZAoJCQkJcy51cmwgPSByZXQgKyAoIChyZXQgPT09IHMudXJsICkgPyAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gIiYiIDogIj8iICkgKyAiXz0iICsgdHMgOiAiIiApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQlpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUgKTsKCQl9CgoJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCgkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CgkJCWlmTW9kaWZpZWRLZXkgPSBpZk1vZGlmaWVkS2V5IHx8IHMudXJsOwoJCQlpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSApOwoJCQl9CgkJCWlmICggalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Ob25lLU1hdGNoIiwgalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlCgkJanFYSFIuc2V0UmVxdWVzdEhlYWRlcigKCQkJIkFjY2VwdCIsCgkJCXMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdID8KCQkJCXMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbMF0gXSArICggcy5kYXRhVHlwZXNbIDAgXSAhPT0gIioiID8gIiwgIiArIGFsbFR5cGVzICsgIjsgcT0wLjAxIiA6ICIiICkgOgoJCQkJcy5hY2NlcHRzWyAiKiIgXQoJCSk7CgoJCS8vIENoZWNrIGZvciBoZWFkZXJzIG9wdGlvbgoJCWZvciAoIGkgaW4gcy5oZWFkZXJzICkgewoJCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApOwoJCX0KCgkJLy8gQWxsb3cgY3VzdG9tIGhlYWRlcnMvbWltZXR5cGVzIGFuZCBlYXJseSBhYm9ydAoJCWlmICggcy5iZWZvcmVTZW5kICYmICggcy5iZWZvcmVTZW5kLmNhbGwoIGNhbGxiYWNrQ29udGV4dCwganFYSFIsIHMgKSA9PT0gZmFsc2UgfHwgc3RhdGUgPT09IDIgKSApIHsKCQkJCS8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkKCQkJCWpxWEhSLmFib3J0KCk7CgkJCQlyZXR1cm4gZmFsc2U7CgoJCX0KCgkJLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCgkJZm9yICggaSBpbiB7IHN1Y2Nlc3M6IDEsIGVycm9yOiAxLCBjb21wbGV0ZTogMSB9ICkgewoJCQlqcVhIUlsgaSBdKCBzWyBpIF0gKTsKCQl9CgoJCS8vIEdldCB0cmFuc3BvcnQKCQl0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0CgkJaWYgKCAhdHJhbnNwb3J0ICkgewoJCQlkb25lKCAtMSwgIk5vIFRyYW5zcG9ydCIgKTsKCQl9IGVsc2UgewoJCQlqcVhIUi5yZWFkeVN0YXRlID0gMTsKCQkJLy8gU2VuZCBnbG9iYWwgZXZlbnQKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheFNlbmQiLCBbIGpxWEhSLCBzIF0gKTsKCQkJfQoJCQkvLyBUaW1lb3V0CgkJCWlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgewoJCQkJdGltZW91dFRpbWVyID0gc2V0VGltZW91dCggZnVuY3Rpb24oKXsKCQkJCQlqcVhIUi5hYm9ydCggInRpbWVvdXQiICk7CgkJCQl9LCBzLnRpbWVvdXQgKTsKCQkJfQoKCQkJdHJ5IHsKCQkJCXN0YXRlID0gMTsKCQkJCXRyYW5zcG9ydC5zZW5kKCByZXF1ZXN0SGVhZGVycywgZG9uZSApOwoJCQl9IGNhdGNoIChlKSB7CgkJCQkvLyBQcm9wYWdhdGUgZXhjZXB0aW9uIGFzIGVycm9yIGlmIG5vdCBkb25lCgkJCQlpZiAoIHN0YXRlIDwgMiApIHsKCQkJCQlkb25lKCAtMSwgZSApOwoJCQkJLy8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlCgkJCQl9IGVsc2UgewoJCQkJCWpRdWVyeS5lcnJvciggZSApOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4ganFYSFI7Cgl9LAoKCS8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCgkvLyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmcKCXBhcmFtOiBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7CgkJdmFyIHMgPSBbXSwKCQkJYWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJCQkvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUKCQkJCXZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2YWx1ZSgpIDogdmFsdWU7CgkJCQlzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgKTsKCQkJfTsKCgkJLy8gU2V0IHRyYWRpdGlvbmFsIHRvIHRydWUgZm9yIGpRdWVyeSA8PSAxLjMuMiBiZWhhdmlvci4KCQlpZiAoIHRyYWRpdGlvbmFsID09PSB1bmRlZmluZWQgKSB7CgkJCXRyYWRpdGlvbmFsID0galF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbDsKCQl9CgoJCS8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuCgkJaWYgKCBqUXVlcnkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHsKCQkJLy8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzCgkJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHsKCQkJCWFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7CgkJCX0pOwoKCQl9IGVsc2UgewoJCQkvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSAib2xkIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXIKCQkJLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCgkJCWZvciAoIHZhciBwcmVmaXggaW4gYSApIHsKCQkJCWJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJCX0KCQl9CgoJCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KCQlyZXR1cm4gcy5qb2luKCAiJiIgKS5yZXBsYWNlKCByMjAsICIrIiApOwoJfQp9KTsKCmZ1bmN0aW9uIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHsKCWlmICggalF1ZXJ5LmlzQXJyYXkoIG9iaiApICkgewoJCS8vIFNlcmlhbGl6ZSBhcnJheSBpdGVtLgoJCWpRdWVyeS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBpLCB2ICkgewoJCQlpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkgewoJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLgoJCQkJYWRkKCBwcmVmaXgsIHYgKTsKCgkJCX0gZWxzZSB7CgkJCQkvLyBJZiBhcnJheSBpdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMKCQkJCS8vIG51bWVyaWMgaW5kZXggdG8gcmVzb2x2ZSBkZXNlcmlhbGl6YXRpb24gYW1iaWd1aXR5IGlzc3Vlcy4KCQkJCS8vIE5vdGUgdGhhdCByYWNrIChhcyBvZiAxLjAuMCkgY2FuJ3QgY3VycmVudGx5IGRlc2VyaWFsaXplCgkJCQkvLyBuZXN0ZWQgYXJyYXlzIHByb3Blcmx5LCBhbmQgYXR0ZW1wdGluZyB0byBkbyBzbyBtYXkgY2F1c2UKCQkJCS8vIGEgc2VydmVyIGVycm9yLiBQb3NzaWJsZSBmaXhlcyBhcmUgdG8gbW9kaWZ5IHJhY2sncwoJCQkJLy8gZGVzZXJpYWxpemF0aW9uIGFsZ29yaXRobSBvciB0byBwcm92aWRlIGFuIG9wdGlvbiBvciBmbGFnCgkJCQkvLyB0byBmb3JjZSBhcnJheSBzZXJpYWxpemF0aW9uIHRvIGJlIHNoYWxsb3cuCgkJCQlidWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgKCB0eXBlb2YgdiA9PT0gIm9iamVjdCIgfHwgalF1ZXJ5LmlzQXJyYXkodikgPyBpIDogIiIgKSArICJdIiwgdiwgdHJhZGl0aW9uYWwsIGFkZCApOwoJCQl9CgkJfSk7CgoJfSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIG9iaiAhPSBudWxsICYmIHR5cGVvZiBvYmogPT09ICJvYmplY3QiICkgewoJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KCQlmb3IgKCB2YXIgbmFtZSBpbiBvYmogKSB7CgkJCWJ1aWxkUGFyYW1zKCBwcmVmaXggKyAiWyIgKyBuYW1lICsgIl0iLCBvYmpbIG5hbWUgXSwgdHJhZGl0aW9uYWwsIGFkZCApOwoJCX0KCgl9IGVsc2UgewoJCS8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KCQlhZGQoIHByZWZpeCwgb2JqICk7Cgl9Cn0KCi8vIFRoaXMgaXMgc3RpbGwgb24gdGhlIGpRdWVyeSBvYmplY3QuLi4gZm9yIG5vdwovLyBXYW50IHRvIG1vdmUgdGhpcyB0byBqUXVlcnkuYWpheCBzb21lIGRheQpqUXVlcnkuZXh0ZW5kKHsKCgkvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXMKCWFjdGl2ZTogMCwKCgkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0CglsYXN0TW9kaWZpZWQ6IHt9LAoJZXRhZzoge30KCn0pOwoKLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OgogKiAtIHNldHMgYWxsIHJlc3BvbnNlWFhYIGZpZWxkcyBhY2NvcmRpbmdseQogKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKQogKiAtIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKICovCmZ1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7CgoJdmFyIGNvbnRlbnRzID0gcy5jb250ZW50cywKCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcywKCQlyZXNwb25zZUZpZWxkcyA9IHMucmVzcG9uc2VGaWVsZHMsCgkJY3QsCgkJdHlwZSwKCQlmaW5hbERhdGFUeXBlLAoJCWZpcnN0RGF0YVR5cGU7CgoJLy8gRmlsbCByZXNwb25zZVhYWCBmaWVsZHMKCWZvciggdHlwZSBpbiByZXNwb25zZUZpZWxkcyApIHsKCQlpZiAoIHR5cGUgaW4gcmVzcG9uc2VzICkgewoJCQlqcVhIUlsgcmVzcG9uc2VGaWVsZHNbdHlwZV0gXSA9IHJlc3BvbnNlc1sgdHlwZSBdOwoJCX0KCX0KCgkvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2VzcwoJd2hpbGUoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIgKSB7CgkJZGF0YVR5cGVzLnNoaWZ0KCk7CgkJaWYgKCBjdCA9PT0gdW5kZWZpbmVkICkgewoJCQljdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJjb250ZW50LXR5cGUiICk7CgkJfQoJfQoKCS8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZQoJaWYgKCBjdCApIHsKCQlmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgewoJCQlpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkgewoJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZQoJaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CgkJZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdOwoJfSBlbHNlIHsKCQkvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzCgkJZm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7CgkJCWlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArICIgIiArIGRhdGFUeXBlc1swXSBdICkgewoJCQkJZmluYWxEYXRhVHlwZSA9IHR5cGU7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoICFmaXJzdERhdGFUeXBlICkgewoJCQkJZmlyc3REYXRhVHlwZSA9IHR5cGU7CgkJCX0KCQl9CgkJLy8gT3IganVzdCB1c2UgZmlyc3Qgb25lCgkJZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTsKCX0KCgkvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlCgkvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRoZSBsaXN0IGlmIG5lZWRlZAoJLy8gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQoJaWYgKCBmaW5hbERhdGFUeXBlICkgewoJCWlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7CgkJCWRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7CgkJfQoJCXJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTsKCX0KfQoKLy8gQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZQpmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UgKSB7CgoJLy8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWQKCWlmICggcy5kYXRhRmlsdGVyICkgewoJCXJlc3BvbnNlID0gcy5kYXRhRmlsdGVyKCByZXNwb25zZSwgcy5kYXRhVHlwZSApOwoJfQoKCXZhciBkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcywKCQljb252ZXJ0ZXJzID0ge30sCgkJaSwKCQlrZXksCgkJbGVuZ3RoID0gZGF0YVR5cGVzLmxlbmd0aCwKCQl0bXAsCgkJLy8gQ3VycmVudCBhbmQgcHJldmlvdXMgZGF0YVR5cGVzCgkJY3VycmVudCA9IGRhdGFUeXBlc1sgMCBdLAoJCXByZXYsCgkJLy8gQ29udmVyc2lvbiBleHByZXNzaW9uCgkJY29udmVyc2lvbiwKCQkvLyBDb252ZXJzaW9uIGZ1bmN0aW9uCgkJY29udiwKCQkvLyBDb252ZXJzaW9uIGZ1bmN0aW9ucyAodHJhbnNpdGl2ZSBjb252ZXJzaW9uKQoJCWNvbnYxLAoJCWNvbnYyOwoKCS8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBjaGFpbgoJZm9yKCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrICkgewoKCQkvLyBDcmVhdGUgY29udmVydGVycyBtYXAKCQkvLyB3aXRoIGxvd2VyY2FzZWQga2V5cwoJCWlmICggaSA9PT0gMSApIHsKCQkJZm9yKCBrZXkgaW4gcy5jb252ZXJ0ZXJzICkgewoJCQkJaWYoIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICkgewoJCQkJCWNvbnZlcnRlcnNbIGtleS50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGtleSBdOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBHZXQgdGhlIGRhdGFUeXBlcwoJCXByZXYgPSBjdXJyZW50OwoJCWN1cnJlbnQgPSBkYXRhVHlwZXNbIGkgXTsKCgkJLy8gSWYgY3VycmVudCBpcyBhdXRvIGRhdGFUeXBlLCB1cGRhdGUgaXQgdG8gcHJldgoJCWlmKCBjdXJyZW50ID09PSAiKiIgKSB7CgkJCWN1cnJlbnQgPSBwcmV2OwoJCS8vIElmIG5vIGF1dG8gYW5kIGRhdGFUeXBlcyBhcmUgYWN0dWFsbHkgZGlmZmVyZW50CgkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7CgoJCQkvLyBHZXQgdGhlIGNvbnZlcnRlcgoJCQljb252ZXJzaW9uID0gcHJldiArICIgIiArIGN1cnJlbnQ7CgkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBjb252ZXJzaW9uIF0gfHwgY29udmVydGVyc1sgIiogIiArIGN1cnJlbnQgXTsKCgkJCS8vIElmIHRoZXJlIGlzIG5vIGRpcmVjdCBjb252ZXJ0ZXIsIHNlYXJjaCB0cmFuc2l0aXZlbHkKCQkJaWYgKCAhY29udiApIHsKCQkJCWNvbnYyID0gdW5kZWZpbmVkOwoJCQkJZm9yKCBjb252MSBpbiBjb252ZXJ0ZXJzICkgewoJCQkJCXRtcCA9IGNvbnYxLnNwbGl0KCAiICIgKTsKCQkJCQlpZiAoIHRtcFsgMCBdID09PSBwcmV2IHx8IHRtcFsgMCBdID09PSAiKiIgKSB7CgkJCQkJCWNvbnYyID0gY29udmVydGVyc1sgdG1wWzFdICsgIiAiICsgY3VycmVudCBdOwoJCQkJCQlpZiAoIGNvbnYyICkgewoJCQkJCQkJY29udjEgPSBjb252ZXJ0ZXJzWyBjb252MSBdOwoJCQkJCQkJaWYgKCBjb252MSA9PT0gdHJ1ZSApIHsKCQkJCQkJCQljb252ID0gY29udjI7CgkJCQkJCQl9IGVsc2UgaWYgKCBjb252MiA9PT0gdHJ1ZSApIHsKCQkJCQkJCQljb252ID0gY29udjE7CgkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQkvLyBJZiB3ZSBmb3VuZCBubyBjb252ZXJ0ZXIsIGRpc3BhdGNoIGFuIGVycm9yCgkJCWlmICggISggY29udiB8fCBjb252MiApICkgewoJCQkJalF1ZXJ5LmVycm9yKCAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBjb252ZXJzaW9uLnJlcGxhY2UoIiAiLCIgdG8gIikgKTsKCQkJfQoJCQkvLyBJZiBmb3VuZCBjb252ZXJ0ZXIgaXMgbm90IGFuIGVxdWl2YWxlbmNlCgkJCWlmICggY29udiAhPT0gdHJ1ZSApIHsKCQkJCS8vIENvbnZlcnQgd2l0aCAxIG9yIDIgY29udmVydGVycyBhY2NvcmRpbmdseQoJCQkJcmVzcG9uc2UgPSBjb252ID8gY29udiggcmVzcG9uc2UgKSA6IGNvbnYyKCBjb252MShyZXNwb25zZSkgKTsKCQkJfQoJCX0KCX0KCXJldHVybiByZXNwb25zZTsKfQoKCgoKdmFyIGpzYyA9IGpRdWVyeS5ub3coKSwKCWpzcmUgPSAvKFw9KVw/KCZ8JCl8XD9cPy9pOwoKLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5ncwpqUXVlcnkuYWpheFNldHVwKHsKCWpzb25wOiAiY2FsbGJhY2siLAoJanNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGpRdWVyeS5leHBhbmRvICsgIl8iICsgKCBqc2MrKyApOwoJfQp9KTsKCi8vIERldGVjdCwgbm9ybWFsaXplIG9wdGlvbnMgYW5kIGluc3RhbGwgY2FsbGJhY2tzIGZvciBqc29ucCByZXF1ZXN0cwpqUXVlcnkuYWpheFByZWZpbHRlciggImpzb24ganNvbnAiLCBmdW5jdGlvbiggcywgb3JpZ2luYWxTZXR0aW5ncywganFYSFIgKSB7CgoJdmFyIGluc3BlY3REYXRhID0gcy5jb250ZW50VHlwZSA9PT0gImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgJiYKCQkoIHR5cGVvZiBzLmRhdGEgPT09ICJzdHJpbmciICk7CgoJaWYgKCBzLmRhdGFUeXBlc1sgMCBdID09PSAianNvbnAiIHx8CgkJcy5qc29ucCAhPT0gZmFsc2UgJiYgKCBqc3JlLnRlc3QoIHMudXJsICkgfHwKCQkJCWluc3BlY3REYXRhICYmIGpzcmUudGVzdCggcy5kYXRhICkgKSApIHsKCgkJdmFyIHJlc3BvbnNlQ29udGFpbmVyLAoJCQlqc29ucENhbGxiYWNrID0gcy5qc29ucENhbGxiYWNrID0KCQkJCWpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/IHMuanNvbnBDYWxsYmFjaygpIDogcy5qc29ucENhbGxiYWNrLAoJCQlwcmV2aW91cyA9IHdpbmRvd1sganNvbnBDYWxsYmFjayBdLAoJCQl1cmwgPSBzLnVybCwKCQkJZGF0YSA9IHMuZGF0YSwKCQkJcmVwbGFjZSA9ICIkMSIgKyBqc29ucENhbGxiYWNrICsgIiQyIjsKCgkJaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKCQkJdXJsID0gdXJsLnJlcGxhY2UoIGpzcmUsIHJlcGxhY2UgKTsKCQkJaWYgKCBzLnVybCA9PT0gdXJsICkgewoJCQkJaWYgKCBpbnNwZWN0RGF0YSApIHsKCQkJCQlkYXRhID0gZGF0YS5yZXBsYWNlKCBqc3JlLCByZXBsYWNlICk7CgkJCQl9CgkJCQlpZiAoIHMuZGF0YSA9PT0gZGF0YSApIHsKCQkJCQkvLyBBZGQgY2FsbGJhY2sgbWFudWFsbHkKCQkJCQl1cmwgKz0gKC9cPy8udGVzdCggdXJsICkgPyAiJiIgOiAiPyIpICsgcy5qc29ucCArICI9IiArIGpzb25wQ2FsbGJhY2s7CgkJCQl9CgkJCX0KCQl9CgoJCXMudXJsID0gdXJsOwoJCXMuZGF0YSA9IGRhdGE7CgoJCS8vIEluc3RhbGwgY2FsbGJhY2sKCQl3aW5kb3dbIGpzb25wQ2FsbGJhY2sgXSA9IGZ1bmN0aW9uKCByZXNwb25zZSApIHsKCQkJcmVzcG9uc2VDb250YWluZXIgPSBbIHJlc3BvbnNlIF07CgkJfTsKCgkJLy8gQ2xlYW4tdXAgZnVuY3Rpb24KCQlqcVhIUi5hbHdheXMoZnVuY3Rpb24oKSB7CgkJCS8vIFNldCBjYWxsYmFjayBiYWNrIHRvIHByZXZpb3VzIHZhbHVlCgkJCXdpbmRvd1sganNvbnBDYWxsYmFjayBdID0gcHJldmlvdXM7CgkJCS8vIENhbGwgaWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25zZQoJCQlpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBwcmV2aW91cyApICkgewoJCQkJd2luZG93WyBqc29ucENhbGxiYWNrIF0oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTsKCQkJfQoJCX0pOwoKCQkvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uCgkJcy5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdID0gZnVuY3Rpb24oKSB7CgkJCWlmICggIXJlc3BvbnNlQ29udGFpbmVyICkgewoJCQkJalF1ZXJ5LmVycm9yKCBqc29ucENhbGxiYWNrICsgIiB3YXMgbm90IGNhbGxlZCIgKTsKCQkJfQoJCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKCQl9OwoKCQkvLyBmb3JjZSBqc29uIGRhdGFUeXBlCgkJcy5kYXRhVHlwZXNbIDAgXSA9ICJqc29uIjsKCgkJLy8gRGVsZWdhdGUgdG8gc2NyaXB0CgkJcmV0dXJuICJzY3JpcHQiOwoJfQp9KTsKCgoKCi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlCmpRdWVyeS5hamF4U2V0dXAoewoJYWNjZXB0czogewoJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0IgoJfSwKCWNvbnRlbnRzOiB7CgkJc2NyaXB0OiAvamF2YXNjcmlwdHxlY21hc2NyaXB0LwoJfSwKCWNvbnZlcnRlcnM6IHsKCQkidGV4dCBzY3JpcHQiOiBmdW5jdGlvbiggdGV4dCApIHsKCQkJalF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTsKCQkJcmV0dXJuIHRleHQ7CgkJfQoJfQp9KTsKCi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgZ2xvYmFsCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAic2NyaXB0IiwgZnVuY3Rpb24oIHMgKSB7CglpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHsKCQlzLmNhY2hlID0gZmFsc2U7Cgl9CglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJcy50eXBlID0gIkdFVCI7CgkJcy5nbG9iYWwgPSBmYWxzZTsKCX0KfSk7CgovLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnQKalF1ZXJ5LmFqYXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbihzKSB7CgoJLy8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1ZXN0cwoJaWYgKCBzLmNyb3NzRG9tYWluICkgewoKCQl2YXIgc2NyaXB0LAoJCQloZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwoKCQlyZXR1cm4gewoKCQkJc2VuZDogZnVuY3Rpb24oIF8sIGNhbGxiYWNrICkgewoKCQkJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzY3JpcHQiICk7CgoJCQkJc2NyaXB0LmFzeW5jID0gImFzeW5jIjsKCgkJCQlpZiAoIHMuc2NyaXB0Q2hhcnNldCApIHsKCQkJCQlzY3JpcHQuY2hhcnNldCA9IHMuc2NyaXB0Q2hhcnNldDsKCQkJCX0KCgkJCQlzY3JpcHQuc3JjID0gcy51cmw7CgoJCQkJLy8gQXR0YWNoIGhhbmRsZXJzIGZvciBhbGwgYnJvd3NlcnMKCQkJCXNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7CgoJCQkJCWlmICggaXNBYm9ydCB8fCAhc2NyaXB0LnJlYWR5U3RhdGUgfHwgL2xvYWRlZHxjb21wbGV0ZS8udGVzdCggc2NyaXB0LnJlYWR5U3RhdGUgKSApIHsKCgkJCQkJCS8vIEhhbmRsZSBtZW1vcnkgbGVhayBpbiBJRQoJCQkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7CgoJCQkJCQkvLyBSZW1vdmUgdGhlIHNjcmlwdAoJCQkJCQlpZiAoIGhlYWQgJiYgc2NyaXB0LnBhcmVudE5vZGUgKSB7CgkJCQkJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKCQkJCQkJfQoKCQkJCQkJLy8gRGVyZWZlcmVuY2UgdGhlIHNjcmlwdAoJCQkJCQlzY3JpcHQgPSB1bmRlZmluZWQ7CgoJCQkJCQkvLyBDYWxsYmFjayBpZiBub3QgYWJvcnQKCQkJCQkJaWYgKCAhaXNBYm9ydCApIHsKCQkJCQkJCWNhbGxiYWNrKCAyMDAsICJzdWNjZXNzIiApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfTsKCQkJCS8vIFVzZSBpbnNlcnRCZWZvcmUgaW5zdGVhZCBvZiBhcHBlbmRDaGlsZCAgdG8gY2lyY3VtdmVudCBhbiBJRTYgYnVnLgoJCQkJLy8gVGhpcyBhcmlzZXMgd2hlbiBhIGJhc2Ugbm9kZSBpcyB1c2VkICgjMjcwOSBhbmQgIzQzNzgpLgoJCQkJaGVhZC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgaGVhZC5maXJzdENoaWxkICk7CgkJCX0sCgoJCQlhYm9ydDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIHNjcmlwdCApIHsKCQkJCQlzY3JpcHQub25sb2FkKCAwLCAxICk7CgkJCQl9CgkJCX0KCQl9OwoJfQp9KTsKCgoKCnZhciAvLyAjNTI4MDogSW50ZXJuZXQgRXhwbG9yZXIgd2lsbCBrZWVwIGNvbm5lY3Rpb25zIGFsaXZlIGlmIHdlIGRvbid0IGFib3J0IG9uIHVubG9hZAoJeGhyT25VbmxvYWRBYm9ydCA9IHdpbmRvdy5BY3RpdmVYT2JqZWN0ID8gZnVuY3Rpb24oKSB7CgkJLy8gQWJvcnQgYWxsIHBlbmRpbmcgcmVxdWVzdHMKCQlmb3IgKCB2YXIga2V5IGluIHhockNhbGxiYWNrcyApIHsKCQkJeGhyQ2FsbGJhY2tzWyBrZXkgXSggMCwgMSApOwoJCX0KCX0gOiBmYWxzZSwKCXhocklkID0gMCwKCXhockNhbGxiYWNrczsKCi8vIEZ1bmN0aW9ucyB0byBjcmVhdGUgeGhycwpmdW5jdGlvbiBjcmVhdGVTdGFuZGFyZFhIUigpIHsKCXRyeSB7CgkJcmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTsKCX0gY2F0Y2goIGUgKSB7fQp9CgpmdW5jdGlvbiBjcmVhdGVBY3RpdmVYSFIoKSB7Cgl0cnkgewoJCXJldHVybiBuZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoICJNaWNyb3NvZnQuWE1MSFRUUCIgKTsKCX0gY2F0Y2goIGUgKSB7fQp9CgovLyBDcmVhdGUgdGhlIHJlcXVlc3Qgb2JqZWN0Ci8vIChUaGlzIGlzIHN0aWxsIGF0dGFjaGVkIHRvIGFqYXhTZXR0aW5ncyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkKalF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSB3aW5kb3cuQWN0aXZlWE9iamVjdCA/CgkvKiBNaWNyb3NvZnQgZmFpbGVkIHRvIHByb3Blcmx5CgkgKiBpbXBsZW1lbnQgdGhlIFhNTEh0dHBSZXF1ZXN0IGluIElFNyAoY2FuJ3QgcmVxdWVzdCBsb2NhbCBmaWxlcyksCgkgKiBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUKCSAqIEFkZGl0aW9uYWxseSBYTUxIdHRwUmVxdWVzdCBjYW4gYmUgZGlzYWJsZWQgaW4gSUU3L0lFOCBzbwoJICogd2UgbmVlZCBhIGZhbGxiYWNrLgoJICovCglmdW5jdGlvbigpIHsKCQlyZXR1cm4gIXRoaXMuaXNMb2NhbCAmJiBjcmVhdGVTdGFuZGFyZFhIUigpIHx8IGNyZWF0ZUFjdGl2ZVhIUigpOwoJfSA6CgkvLyBGb3IgYWxsIG90aGVyIGJyb3dzZXJzLCB1c2UgdGhlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IG9iamVjdAoJY3JlYXRlU3RhbmRhcmRYSFI7CgovLyBEZXRlcm1pbmUgc3VwcG9ydCBwcm9wZXJ0aWVzCihmdW5jdGlvbiggeGhyICkgewoJalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LnN1cHBvcnQsIHsKCQlhamF4OiAhIXhociwKCQljb3JzOiAhIXhociAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhociApCgl9KTsKfSkoIGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCkgKTsKCi8vIENyZWF0ZSB0cmFuc3BvcnQgaWYgdGhlIGJyb3dzZXIgY2FuIHByb3ZpZGUgYW4geGhyCmlmICggalF1ZXJ5LnN1cHBvcnQuYWpheCApIHsKCglqUXVlcnkuYWpheFRyYW5zcG9ydChmdW5jdGlvbiggcyApIHsKCQkvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CgkJaWYgKCAhcy5jcm9zc0RvbWFpbiB8fCBqUXVlcnkuc3VwcG9ydC5jb3JzICkgewoKCQkJdmFyIGNhbGxiYWNrOwoKCQkJcmV0dXJuIHsKCQkJCXNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHsKCgkJCQkJLy8gR2V0IGEgbmV3IHhocgoJCQkJCXZhciB4aHIgPSBzLnhocigpLAoJCQkJCQloYW5kbGUsCgkJCQkJCWk7CgoJCQkJCS8vIE9wZW4gdGhlIHNvY2tldAoJCQkJCS8vIFBhc3NpbmcgbnVsbCB1c2VybmFtZSwgZ2VuZXJhdGVzIGEgbG9naW4gcG9wdXAgb24gT3BlcmEgKCMyODY1KQoJCQkJCWlmICggcy51c2VybmFtZSApIHsKCQkJCQkJeGhyLm9wZW4oIHMudHlwZSwgcy51cmwsIHMuYXN5bmMsIHMudXNlcm5hbWUsIHMucGFzc3dvcmQgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQl4aHIub3Blbiggcy50eXBlLCBzLnVybCwgcy5hc3luYyApOwoJCQkJCX0KCgkJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAoJCQkJCWlmICggcy54aHJGaWVsZHMgKSB7CgkJCQkJCWZvciAoIGkgaW4gcy54aHJGaWVsZHMgKSB7CgkJCQkJCQl4aHJbIGkgXSA9IHMueGhyRmllbGRzWyBpIF07CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKCQkJCQlpZiAoIHMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7CgkJCQkJCXhoci5vdmVycmlkZU1pbWVUeXBlKCBzLm1pbWVUeXBlICk7CgkJCQkJfQoKCQkJCQkvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlcgoJCQkJCS8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmUKCQkJCQkvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLgoJCQkJCS8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKQoJCQkJCS8vIEZvciBzYW1lLWRvbWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLgoJCQkJCWlmICggIXMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbIlgtUmVxdWVzdGVkLVdpdGgiXSApIHsKCQkJCQkJaGVhZGVyc1sgIlgtUmVxdWVzdGVkLVdpdGgiIF0gPSAiWE1MSHR0cFJlcXVlc3QiOwoJCQkJCX0KCgkJCQkJLy8gTmVlZCBhbiBleHRyYSB0cnkvY2F0Y2ggZm9yIGNyb3NzIGRvbWFpbiByZXF1ZXN0cyBpbiBGaXJlZm94IDMKCQkJCQl0cnkgewoJCQkJCQlmb3IgKCBpIGluIGhlYWRlcnMgKSB7CgkJCQkJCQl4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7CgkJCQkJCX0KCQkJCQl9IGNhdGNoKCBfICkge30KCgkJCQkJLy8gRG8gc2VuZCB0aGUgcmVxdWVzdAoJCQkJCS8vIFRoaXMgbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGljaCBpcyBhY3R1YWxseQoJCQkJCS8vIGhhbmRsZWQgaW4galF1ZXJ5LmFqYXggKHNvIG5vIHRyeS9jYXRjaCBoZXJlKQoJCQkJCXhoci5zZW5kKCAoIHMuaGFzQ29udGVudCAmJiBzLmRhdGEgKSB8fCBudWxsICk7CgoJCQkJCS8vIExpc3RlbmVyCgkJCQkJY2FsbGJhY2sgPSBmdW5jdGlvbiggXywgaXNBYm9ydCApIHsKCgkJCQkJCXZhciBzdGF0dXMsCgkJCQkJCQlzdGF0dXNUZXh0LAoJCQkJCQkJcmVzcG9uc2VIZWFkZXJzLAoJCQkJCQkJcmVzcG9uc2VzLAoJCQkJCQkJeG1sOwoKCQkJCQkJLy8gRmlyZWZveCB0aHJvd3MgZXhjZXB0aW9ucyB3aGVuIGFjY2Vzc2luZyBwcm9wZXJ0aWVzCgkJCQkJCS8vIG9mIGFuIHhociB3aGVuIGEgbmV0d29yayBlcnJvciBvY2N1cmVkCgkJCQkJCS8vIGh0dHA6Ly9oZWxwZnVsLmtub2JzLWRpYWxzLmNvbS9pbmRleC5waHAvQ29tcG9uZW50X3JldHVybmVkX2ZhaWx1cmVfY29kZTpfMHg4MDA0MDExMV8oTlNfRVJST1JfTk9UX0FWQUlMQUJMRSkKCQkJCQkJdHJ5IHsKCgkJCQkJCQkvLyBXYXMgbmV2ZXIgY2FsbGVkIGFuZCBpcyBhYm9ydGVkIG9yIGNvbXBsZXRlCgkJCQkJCQlpZiAoIGNhbGxiYWNrICYmICggaXNBYm9ydCB8fCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApICkgewoKCQkJCQkJCQkvLyBPbmx5IGNhbGxlZCBvbmNlCgkJCQkJCQkJY2FsbGJhY2sgPSB1bmRlZmluZWQ7CgoJCQkJCQkJCS8vIERvIG5vdCBrZWVwIGFzIGFjdGl2ZSBhbnltb3JlCgkJCQkJCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQkJCQkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBqUXVlcnkubm9vcDsKCQkJCQkJCQkJaWYgKCB4aHJPblVubG9hZEFib3J0ICkgewoJCQkJCQkJCQkJZGVsZXRlIHhockNhbGxiYWNrc1sgaGFuZGxlIF07CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgoJCQkJCQkJCS8vIElmIGl0J3MgYW4gYWJvcnQKCQkJCQkJCQlpZiAoIGlzQWJvcnQgKSB7CgkJCQkJCQkJCS8vIEFib3J0IGl0IG1hbnVhbGx5IGlmIG5lZWRlZAoJCQkJCQkJCQlpZiAoIHhoci5yZWFkeVN0YXRlICE9PSA0ICkgewoJCQkJCQkJCQkJeGhyLmFib3J0KCk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQlzdGF0dXMgPSB4aHIuc3RhdHVzOwoJCQkJCQkJCQlyZXNwb25zZUhlYWRlcnMgPSB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CgkJCQkJCQkJCXJlc3BvbnNlcyA9IHt9OwoJCQkJCQkJCQl4bWwgPSB4aHIucmVzcG9uc2VYTUw7CgoJCQkJCQkJCQkvLyBDb25zdHJ1Y3QgcmVzcG9uc2UgbGlzdAoJCQkJCQkJCQlpZiAoIHhtbCAmJiB4bWwuZG9jdW1lbnRFbGVtZW50IC8qICM0OTU4ICovICkgewoJCQkJCQkJCQkJcmVzcG9uc2VzLnhtbCA9IHhtbDsKCQkJCQkJCQkJfQoJCQkJCQkJCQlyZXNwb25zZXMudGV4dCA9IHhoci5yZXNwb25zZVRleHQ7CgoJCQkJCQkJCQkvLyBGaXJlZm94IHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmcKCQkJCQkJCQkJLy8gc3RhdHVzVGV4dCBmb3IgZmF1bHR5IGNyb3NzLWRvbWFpbiByZXF1ZXN0cwoJCQkJCQkJCQl0cnkgewoJCQkJCQkJCQkJc3RhdHVzVGV4dCA9IHhoci5zdGF0dXNUZXh0OwoJCQkJCQkJCQl9IGNhdGNoKCBlICkgewoJCQkJCQkJCQkJLy8gV2Ugbm9ybWFsaXplIHdpdGggV2Via2l0IGdpdmluZyBhbiBlbXB0eSBzdGF0dXNUZXh0CgkJCQkJCQkJCQlzdGF0dXNUZXh0ID0gIiI7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vIEZpbHRlciBzdGF0dXMgZm9yIG5vbiBzdGFuZGFyZCBiZWhhdmlvcnMKCgkJCQkJCQkJCS8vIElmIHRoZSByZXF1ZXN0IGlzIGxvY2FsIGFuZCB3ZSBoYXZlIGRhdGE6IGFzc3VtZSBhIHN1Y2Nlc3MKCQkJCQkJCQkJLy8gKHN1Y2Nlc3Mgd2l0aCBubyBkYXRhIHdvbid0IGdldCBub3RpZmllZCwgdGhhdCdzIHRoZSBiZXN0IHdlCgkJCQkJCQkJCS8vIGNhbiBkbyBnaXZlbiBjdXJyZW50IGltcGxlbWVudGF0aW9ucykKCQkJCQkJCQkJaWYgKCAhc3RhdHVzICYmIHMuaXNMb2NhbCAmJiAhcy5jcm9zc0RvbWFpbiApIHsKCQkJCQkJCQkJCXN0YXR1cyA9IHJlc3BvbnNlcy50ZXh0ID8gMjAwIDogNDA0OwoJCQkJCQkJCQkvLyBJRSAtICMxNDUwOiBzb21ldGltZXMgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAoJCQkJCQkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDEyMjMgKSB7CgkJCQkJCQkJCQlzdGF0dXMgPSAyMDQ7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0gY2F0Y2goIGZpcmVmb3hBY2Nlc3NFeGNlcHRpb24gKSB7CgkJCQkJCQlpZiAoICFpc0Fib3J0ICkgewoJCQkJCQkJCWNvbXBsZXRlKCAtMSwgZmlyZWZveEFjY2Vzc0V4Y2VwdGlvbiApOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQkvLyBDYWxsIGNvbXBsZXRlIGlmIG5lZWRlZAoJCQkJCQlpZiAoIHJlc3BvbnNlcyApIHsKCQkJCQkJCWNvbXBsZXRlKCBzdGF0dXMsIHN0YXR1c1RleHQsIHJlc3BvbnNlcywgcmVzcG9uc2VIZWFkZXJzICk7CgkJCQkJCX0KCQkJCQl9OwoKCQkJCQkvLyBpZiB3ZSdyZSBpbiBzeW5jIG1vZGUgb3IgaXQncyBpbiBjYWNoZQoJCQkJCS8vIGFuZCBoYXMgYmVlbiByZXRyaWV2ZWQgZGlyZWN0bHkgKElFNiAmIElFNykKCQkJCQkvLyB3ZSBuZWVkIHRvIG1hbnVhbGx5IGZpcmUgdGhlIGNhbGxiYWNrCgkJCQkJaWYgKCAhcy5hc3luYyB8fCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKCQkJCQkJY2FsbGJhY2soKTsKCQkJCQl9IGVsc2UgewoJCQkJCQloYW5kbGUgPSArK3hocklkOwoJCQkJCQlpZiAoIHhock9uVW5sb2FkQWJvcnQgKSB7CgkJCQkJCQkvLyBDcmVhdGUgdGhlIGFjdGl2ZSB4aHJzIGNhbGxiYWNrcyBsaXN0IGlmIG5lZWRlZAoJCQkJCQkJLy8gYW5kIGF0dGFjaCB0aGUgdW5sb2FkIGhhbmRsZXIKCQkJCQkJCWlmICggIXhockNhbGxiYWNrcyApIHsKCQkJCQkJCQl4aHJDYWxsYmFja3MgPSB7fTsKCQkJCQkJCQlqUXVlcnkoIHdpbmRvdyApLnVubG9hZCggeGhyT25VbmxvYWRBYm9ydCApOwoJCQkJCQkJfQoJCQkJCQkJLy8gQWRkIHRvIGxpc3Qgb2YgYWN0aXZlIHhocnMgY2FsbGJhY2tzCgkJCQkJCQl4aHJDYWxsYmFja3NbIGhhbmRsZSBdID0gY2FsbGJhY2s7CgkJCQkJCX0KCQkJCQkJeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGNhbGxiYWNrOwoJCQkJCX0KCQkJCX0sCgoJCQkJYWJvcnQ6IGZ1bmN0aW9uKCkgewoJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCWNhbGxiYWNrKDAsMSk7CgkJCQkJfQoJCQkJfQoJCQl9OwoJCX0KCX0pOwp9CgoKCgp2YXIgZWxlbWRpc3BsYXkgPSB7fSwKCWlmcmFtZSwgaWZyYW1lRG9jLAoJcmZ4dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sCglyZnhudW0gPSAvXihbK1wtXT0pPyhbXGQrLlwtXSspKFthLXolXSopJC9pLAoJdGltZXJJZCwKCWZ4QXR0cnMgPSBbCgkJLy8gaGVpZ2h0IGFuaW1hdGlvbnMKCQlbICJoZWlnaHQiLCAibWFyZ2luVG9wIiwgIm1hcmdpbkJvdHRvbSIsICJwYWRkaW5nVG9wIiwgInBhZGRpbmdCb3R0b20iIF0sCgkJLy8gd2lkdGggYW5pbWF0aW9ucwoJCVsgIndpZHRoIiwgIm1hcmdpbkxlZnQiLCAibWFyZ2luUmlnaHQiLCAicGFkZGluZ0xlZnQiLCAicGFkZGluZ1JpZ2h0IiBdLAoJCS8vIG9wYWNpdHkgYW5pbWF0aW9ucwoJCVsgIm9wYWNpdHkiIF0KCV0sCglmeE5vdzsKCmpRdWVyeS5mbi5leHRlbmQoewoJc2hvdzogZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXZhciBlbGVtLCBkaXNwbGF5OwoKCQlpZiAoIHNwZWVkIHx8IHNwZWVkID09PSAwICkgewoJCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBnZW5GeCgic2hvdyIsIDMpLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayk7CgoJCX0gZWxzZSB7CgkJCWZvciAoIHZhciBpID0gMCwgaiA9IHRoaXMubGVuZ3RoOyBpIDwgajsgaSsrICkgewoJCQkJZWxlbSA9IHRoaXNbaV07CgoJCQkJaWYgKCBlbGVtLnN0eWxlICkgewoJCQkJCWRpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7CgoJCQkJCS8vIFJlc2V0IHRoZSBpbmxpbmUgZGlzcGxheSBvZiB0aGlzIGVsZW1lbnQgdG8gbGVhcm4gaWYgaXQgaXMKCQkJCQkvLyBiZWluZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90CgkJCQkJaWYgKCAhalF1ZXJ5Ll9kYXRhKGVsZW0sICJvbGRkaXNwbGF5IikgJiYgZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQkJCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CgkJCQkJfQoKCQkJCQkvLyBTZXQgZWxlbWVudHMgd2hpY2ggaGF2ZSBiZWVuIG92ZXJyaWRkZW4gd2l0aCBkaXNwbGF5OiBub25lCgkJCQkJLy8gaW4gYSBzdHlsZXNoZWV0IHRvIHdoYXRldmVyIHRoZSBkZWZhdWx0IGJyb3dzZXIgc3R5bGUgaXMKCQkJCQkvLyBmb3Igc3VjaCBhbiBlbGVtZW50CgkJCQkJaWYgKCBkaXNwbGF5ID09PSAiIiAmJiBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSA9PT0gIm5vbmUiICkgewoJCQkJCQlqUXVlcnkuX2RhdGEoZWxlbSwgIm9sZGRpc3BsYXkiLCBkZWZhdWx0RGlzcGxheShlbGVtLm5vZGVOYW1lKSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgbW9zdCBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAoJCQkvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93CgkJCWZvciAoIGkgPSAwOyBpIDwgajsgaSsrICkgewoJCQkJZWxlbSA9IHRoaXNbaV07CgoJCQkJaWYgKCBlbGVtLnN0eWxlICkgewoJCQkJCWRpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7CgoJCQkJCWlmICggZGlzcGxheSA9PT0gIiIgfHwgZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQkJCQllbGVtLnN0eWxlLmRpc3BsYXkgPSBqUXVlcnkuX2RhdGEoZWxlbSwgIm9sZGRpc3BsYXkiKSB8fCAiIjsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCXJldHVybiB0aGlzOwoJCX0KCX0sCgoJaGlkZTogZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCWlmICggc3BlZWQgfHwgc3BlZWQgPT09IDAgKSB7CgkJCXJldHVybiB0aGlzLmFuaW1hdGUoIGdlbkZ4KCJoaWRlIiwgMyksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrKTsKCgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBqID0gdGhpcy5sZW5ndGg7IGkgPCBqOyBpKysgKSB7CgkJCQlpZiAoIHRoaXNbaV0uc3R5bGUgKSB7CgkJCQkJdmFyIGRpc3BsYXkgPSBqUXVlcnkuY3NzKCB0aGlzW2ldLCAiZGlzcGxheSIgKTsKCgkJCQkJaWYgKCBkaXNwbGF5ICE9PSAibm9uZSIgJiYgIWpRdWVyeS5fZGF0YSggdGhpc1tpXSwgIm9sZGRpc3BsYXkiICkgKSB7CgkJCQkJCWpRdWVyeS5fZGF0YSggdGhpc1tpXSwgIm9sZGRpc3BsYXkiLCBkaXNwbGF5ICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdwoJCQlmb3IgKCBpID0gMDsgaSA8IGo7IGkrKyApIHsKCQkJCWlmICggdGhpc1tpXS5zdHlsZSApIHsKCQkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CgkJCQl9CgkJCX0KCgkJCXJldHVybiB0aGlzOwoJCX0KCX0sCgoJLy8gU2F2ZSB0aGUgb2xkIHRvZ2dsZSBmdW5jdGlvbgoJX3RvZ2dsZTogalF1ZXJ5LmZuLnRvZ2dsZSwKCgl0b2dnbGU6IGZ1bmN0aW9uKCBmbiwgZm4yLCBjYWxsYmFjayApIHsKCQl2YXIgYm9vbCA9IHR5cGVvZiBmbiA9PT0gImJvb2xlYW4iOwoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKGZuKSAmJiBqUXVlcnkuaXNGdW5jdGlvbihmbjIpICkgewoJCQl0aGlzLl90b2dnbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQl9IGVsc2UgaWYgKCBmbiA9PSBudWxsIHx8IGJvb2wgKSB7CgkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCXZhciBzdGF0ZSA9IGJvb2wgPyBmbiA6IGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpOwoJCQkJalF1ZXJ5KHRoaXMpWyBzdGF0ZSA/ICJzaG93IiA6ICJoaWRlIiBdKCk7CgkJCX0pOwoKCQl9IGVsc2UgewoJCQl0aGlzLmFuaW1hdGUoZ2VuRngoInRvZ2dsZSIsIDMpLCBmbiwgZm4yLCBjYWxsYmFjayk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsIDApLnNob3coKS5lbmQoKQoJCQkJCS5hbmltYXRlKHtvcGFjaXR5OiB0b30sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrKTsKCX0sCgoJYW5pbWF0ZTogZnVuY3Rpb24oIHByb3AsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXZhciBvcHRhbGwgPSBqUXVlcnkuc3BlZWQoc3BlZWQsIGVhc2luZywgY2FsbGJhY2spOwoKCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBwcm9wICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goIG9wdGFsbC5jb21wbGV0ZSwgWyBmYWxzZSBdICk7CgkJfQoKCQkvLyBEbyBub3QgY2hhbmdlIHJlZmVyZW5jZWQgcHJvcGVydGllcyBhcyBwZXItcHJvcGVydHkgZWFzaW5nIHdpbGwgYmUgbG9zdAoJCXByb3AgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApOwoKCQlyZXR1cm4gdGhpc1sgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/ICJlYWNoIiA6ICJxdWV1ZSIgXShmdW5jdGlvbigpIHsKCQkJLy8gWFhYICd0aGlzJyBkb2VzIG5vdCBhbHdheXMgaGF2ZSBhIG5vZGVOYW1lIHdoZW4gcnVubmluZyB0aGUKCQkJLy8gdGVzdCBzdWl0ZQoKCQkJaWYgKCBvcHRhbGwucXVldWUgPT09IGZhbHNlICkgewoJCQkJalF1ZXJ5Ll9tYXJrKCB0aGlzICk7CgkJCX0KCgkJCXZhciBvcHQgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgb3B0YWxsICksCgkJCQlpc0VsZW1lbnQgPSB0aGlzLm5vZGVUeXBlID09PSAxLAoJCQkJaGlkZGVuID0gaXNFbGVtZW50ICYmIGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpLAoJCQkJbmFtZSwgdmFsLCBwLAoJCQkJZGlzcGxheSwgZSwKCQkJCXBhcnRzLCBzdGFydCwgZW5kLCB1bml0OwoKCQkJLy8gd2lsbCBzdG9yZSBwZXIgcHJvcGVydHkgZWFzaW5nIGFuZCBiZSB1c2VkIHRvIGRldGVybWluZSB3aGVuIGFuIGFuaW1hdGlvbiBpcyBjb21wbGV0ZQoJCQlvcHQuYW5pbWF0ZWRQcm9wZXJ0aWVzID0ge307CgoJCQlmb3IgKCBwIGluIHByb3AgKSB7CgoJCQkJLy8gcHJvcGVydHkgbmFtZSBub3JtYWxpemF0aW9uCgkJCQluYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggcCApOwoJCQkJaWYgKCBwICE9PSBuYW1lICkgewoJCQkJCXByb3BbIG5hbWUgXSA9IHByb3BbIHAgXTsKCQkJCQlkZWxldGUgcHJvcFsgcCBdOwoJCQkJfQoKCQkJCXZhbCA9IHByb3BbIG5hbWUgXTsKCgkJCQkvLyBlYXNpbmcgcmVzb2x1dGlvbjogcGVyIHByb3BlcnR5ID4gb3B0LnNwZWNpYWxFYXNpbmcgPiBvcHQuZWFzaW5nID4gJ3N3aW5nJyAoZGVmYXVsdCkKCQkJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkgewoJCQkJCW9wdC5hbmltYXRlZFByb3BlcnRpZXNbIG5hbWUgXSA9IHZhbFsgMSBdOwoJCQkJCXZhbCA9IHByb3BbIG5hbWUgXSA9IHZhbFsgMCBdOwoJCQkJfSBlbHNlIHsKCQkJCQlvcHQuYW5pbWF0ZWRQcm9wZXJ0aWVzWyBuYW1lIF0gPSBvcHQuc3BlY2lhbEVhc2luZyAmJiBvcHQuc3BlY2lhbEVhc2luZ1sgbmFtZSBdIHx8IG9wdC5lYXNpbmcgfHwgJ3N3aW5nJzsKCQkJCX0KCgkJCQlpZiAoIHZhbCA9PT0gImhpZGUiICYmIGhpZGRlbiB8fCB2YWwgPT09ICJzaG93IiAmJiAhaGlkZGVuICkgewoJCQkJCXJldHVybiBvcHQuY29tcGxldGUuY2FsbCggdGhpcyApOwoJCQkJfQoKCQkJCWlmICggaXNFbGVtZW50ICYmICggbmFtZSA9PT0gImhlaWdodCIgfHwgbmFtZSA9PT0gIndpZHRoIiApICkgewoJCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IG5vdGhpbmcgc25lYWtzIG91dAoJCQkJCS8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QKCQkJCQkvLyBjaGFuZ2UgdGhlIG92ZXJmbG93IGF0dHJpYnV0ZSB3aGVuIG92ZXJmbG93WCBhbmQKCQkJCQkvLyBvdmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZQoJCQkJCW9wdC5vdmVyZmxvdyA9IFsgdGhpcy5zdHlsZS5vdmVyZmxvdywgdGhpcy5zdHlsZS5vdmVyZmxvd1gsIHRoaXMuc3R5bGUub3ZlcmZsb3dZIF07CgoJCQkJCS8vIFNldCBkaXNwbGF5IHByb3BlcnR5IHRvIGlubGluZS1ibG9jayBmb3IgaGVpZ2h0L3dpZHRoCgkJCQkJLy8gYW5pbWF0aW9ucyBvbiBpbmxpbmUgZWxlbWVudHMgdGhhdCBhcmUgaGF2aW5nIHdpZHRoL2hlaWdodAoJCQkJCS8vIGFuaW1hdGVkCgkJCQkJaWYgKCBqUXVlcnkuY3NzKCB0aGlzLCAiZGlzcGxheSIgKSA9PT0gImlubGluZSIgJiYKCQkJCQkJCWpRdWVyeS5jc3MoIHRoaXMsICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgewoJCQkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0ICkgewoJCQkJCQkJdGhpcy5zdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJZGlzcGxheSA9IGRlZmF1bHREaXNwbGF5KCB0aGlzLm5vZGVOYW1lICk7CgoJCQkJCQkJLy8gaW5saW5lLWxldmVsIGVsZW1lbnRzIGFjY2VwdCBpbmxpbmUtYmxvY2s7CgkJCQkJCQkvLyBibG9jay1sZXZlbCBlbGVtZW50cyBuZWVkIHRvIGJlIGlubGluZSB3aXRoIGxheW91dAoJCQkJCQkJaWYgKCBkaXNwbGF5ID09PSAiaW5saW5lIiApIHsKCQkJCQkJCQl0aGlzLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lLWJsb2NrIjsKCgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCXRoaXMuc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUiOwoJCQkJCQkJCXRoaXMuc3R5bGUuem9vbSA9IDE7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWlmICggb3B0Lm92ZXJmbG93ICE9IG51bGwgKSB7CgkJCQl0aGlzLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgkJCX0KCgkJCWZvciAoIHAgaW4gcHJvcCApIHsKCQkJCWUgPSBuZXcgalF1ZXJ5LmZ4KCB0aGlzLCBvcHQsIHAgKTsKCQkJCXZhbCA9IHByb3BbIHAgXTsKCgkJCQlpZiAoIHJmeHR5cGVzLnRlc3QodmFsKSApIHsKCQkJCQllWyB2YWwgPT09ICJ0b2dnbGUiID8gaGlkZGVuID8gInNob3ciIDogImhpZGUiIDogdmFsIF0oKTsKCgkJCQl9IGVsc2UgewoJCQkJCXBhcnRzID0gcmZ4bnVtLmV4ZWMoIHZhbCApOwoJCQkJCXN0YXJ0ID0gZS5jdXIoKTsKCgkJCQkJaWYgKCBwYXJ0cyApIHsKCQkJCQkJZW5kID0gcGFyc2VGbG9hdCggcGFydHNbMl0gKTsKCQkJCQkJdW5pdCA9IHBhcnRzWzNdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgcCBdID8gIiIgOiAicHgiICk7CgoJCQkJCQkvLyBXZSBuZWVkIHRvIGNvbXB1dGUgc3RhcnRpbmcgdmFsdWUKCQkJCQkJaWYgKCB1bml0ICE9PSAicHgiICkgewoJCQkJCQkJalF1ZXJ5LnN0eWxlKCB0aGlzLCBwLCAoZW5kIHx8IDEpICsgdW5pdCk7CgkJCQkJCQlzdGFydCA9ICgoZW5kIHx8IDEpIC8gZS5jdXIoKSkgKiBzdGFydDsKCQkJCQkJCWpRdWVyeS5zdHlsZSggdGhpcywgcCwgc3RhcnQgKyB1bml0KTsKCQkJCQkJfQoKCQkJCQkJLy8gSWYgYSArPS8tPSB0b2tlbiB3YXMgcHJvdmlkZWQsIHdlJ3JlIGRvaW5nIGEgcmVsYXRpdmUgYW5pbWF0aW9uCgkJCQkJCWlmICggcGFydHNbMV0gKSB7CgkJCQkJCQllbmQgPSAoIChwYXJ0c1sgMSBdID09PSAiLT0iID8gLTEgOiAxKSAqIGVuZCApICsgc3RhcnQ7CgkJCQkJCX0KCgkJCQkJCWUuY3VzdG9tKCBzdGFydCwgZW5kLCB1bml0ICk7CgoJCQkJCX0gZWxzZSB7CgkJCQkJCWUuY3VzdG9tKCBzdGFydCwgdmFsLCAiIiApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gRm9yIEpTIHN0cmljdCBjb21wbGlhbmNlCgkJCXJldHVybiB0cnVlOwoJCX0pOwoJfSwKCglzdG9wOiBmdW5jdGlvbiggY2xlYXJRdWV1ZSwgZ290b0VuZCApIHsKCQlpZiAoIGNsZWFyUXVldWUgKSB7CgkJCXRoaXMucXVldWUoW10pOwoJCX0KCgkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWkgPSB0aW1lcnMubGVuZ3RoOwoJCQkvLyBjbGVhciBtYXJrZXIgY291bnRlcnMgaWYgd2Uga25vdyB0aGV5IHdvbid0IGJlCgkJCWlmICggIWdvdG9FbmQgKSB7CgkJCQlqUXVlcnkuX3VubWFyayggdHJ1ZSwgdGhpcyApOwoJCQl9CgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCB0aW1lcnNbaV0uZWxlbSA9PT0gdGhpcyApIHsKCQkJCQlpZiAoZ290b0VuZCkgewoJCQkJCQkvLyBmb3JjZSB0aGUgbmV4dCBzdGVwIHRvIGJlIHRoZSBsYXN0CgkJCQkJCXRpbWVyc1tpXSh0cnVlKTsKCQkJCQl9CgoJCQkJCXRpbWVycy5zcGxpY2UoaSwgMSk7CgkJCQl9CgkJCX0KCQl9KTsKCgkJLy8gc3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZAoJCWlmICggIWdvdG9FbmQgKSB7CgkJCXRoaXMuZGVxdWV1ZSgpOwoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9Cgp9KTsKCi8vIEFuaW1hdGlvbnMgY3JlYXRlZCBzeW5jaHJvbm91c2x5IHdpbGwgcnVuIHN5bmNocm9ub3VzbHkKZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7CglzZXRUaW1lb3V0KCBjbGVhckZ4Tm93LCAwICk7CglyZXR1cm4gKCBmeE5vdyA9IGpRdWVyeS5ub3coKSApOwp9CgpmdW5jdGlvbiBjbGVhckZ4Tm93KCkgewoJZnhOb3cgPSB1bmRlZmluZWQ7Cn0KCi8vIEdlbmVyYXRlIHBhcmFtZXRlcnMgdG8gY3JlYXRlIGEgc3RhbmRhcmQgYW5pbWF0aW9uCmZ1bmN0aW9uIGdlbkZ4KCB0eXBlLCBudW0gKSB7Cgl2YXIgb2JqID0ge307CgoJalF1ZXJ5LmVhY2goIGZ4QXR0cnMuY29uY2F0LmFwcGx5KFtdLCBmeEF0dHJzLnNsaWNlKDAsbnVtKSksIGZ1bmN0aW9uKCkgewoJCW9ialsgdGhpcyBdID0gdHlwZTsKCX0pOwoKCXJldHVybiBvYmo7Cn0KCi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnMKalF1ZXJ5LmVhY2goewoJc2xpZGVEb3duOiBnZW5GeCgic2hvdyIsIDEpLAoJc2xpZGVVcDogZ2VuRngoImhpZGUiLCAxKSwKCXNsaWRlVG9nZ2xlOiBnZW5GeCgidG9nZ2xlIiwgMSksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9LAoJZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSk7CgpqUXVlcnkuZXh0ZW5kKHsKCXNwZWVkOiBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7CgkJdmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gIm9iamVjdCIgPyBqUXVlcnkuZXh0ZW5kKHt9LCBzcGVlZCkgOiB7CgkJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCQlqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCwKCQkJZHVyYXRpb246IHNwZWVkLAoJCQllYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKGVhc2luZykgJiYgZWFzaW5nCgkJfTsKCgkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0LmR1cmF0aW9uID09PSAibnVtYmVyIiA/IG9wdC5kdXJhdGlvbiA6CgkJCW9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzID8galF1ZXJ5LmZ4LnNwZWVkc1tvcHQuZHVyYXRpb25dIDogalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKCgkJLy8gUXVldWVpbmcKCQlvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoJCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCBub1VubWFyayApIHsKCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgewoJCQkJb3B0Lm9sZC5jYWxsKCB0aGlzICk7CgkJCX0KCgkJCWlmICggb3B0LnF1ZXVlICE9PSBmYWxzZSApIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzICk7CgkJCX0gZWxzZSBpZiAoIG5vVW5tYXJrICE9PSBmYWxzZSApIHsKCQkJCWpRdWVyeS5fdW5tYXJrKCB0aGlzICk7CgkJCX0KCQl9OwoKCQlyZXR1cm4gb3B0OwoJfSwKCgllYXNpbmc6IHsKCQlsaW5lYXI6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51bSwgZGlmZiApIHsKCQkJcmV0dXJuIGZpcnN0TnVtICsgZGlmZiAqIHA7CgkJfSwKCQlzd2luZzogZnVuY3Rpb24oIHAsIG4sIGZpcnN0TnVtLCBkaWZmICkgewoJCQlyZXR1cm4gKCgtTWF0aC5jb3MocCpNYXRoLlBJKS8yKSArIDAuNSkgKiBkaWZmICsgZmlyc3ROdW07CgkJfQoJfSwKCgl0aW1lcnM6IFtdLAoKCWZ4OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCApIHsKCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCgkJb3B0aW9ucy5vcmlnID0gb3B0aW9ucy5vcmlnIHx8IHt9OwoJfQoKfSk7CgpqUXVlcnkuZngucHJvdG90eXBlID0gewoJLy8gU2ltcGxlIGZ1bmN0aW9uIGZvciBzZXR0aW5nIGEgc3R5bGUgdmFsdWUKCXVwZGF0ZTogZnVuY3Rpb24oKSB7CgkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoJCX0KCgkJKGpRdWVyeS5meC5zdGVwW3RoaXMucHJvcF0gfHwgalF1ZXJ5LmZ4LnN0ZXAuX2RlZmF1bHQpKCB0aGlzICk7Cgl9LAoKCS8vIEdldCB0aGUgY3VycmVudCBzaXplCgljdXI6IGZ1bmN0aW9uKCkgewoJCWlmICggdGhpcy5lbGVtW3RoaXMucHJvcF0gIT0gbnVsbCAmJiAoIXRoaXMuZWxlbS5zdHlsZSB8fCB0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXSA9PSBudWxsKSApIHsKCQkJcmV0dXJuIHRoaXMuZWxlbVsgdGhpcy5wcm9wIF07CgkJfQoKCQl2YXIgcGFyc2VkLAoJCQlyID0galF1ZXJ5LmNzcyggdGhpcy5lbGVtLCB0aGlzLnByb3AgKTsKCQkvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmluZWQgYW5kICJhdXRvIiBhcmUgY29udmVydGVkIHRvIDAsCgkJLy8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyAicm90YXRlKDFyYWQpIiBhcmUgcmV0dXJuZWQgYXMgaXMsCgkJLy8gc2ltcGxlIHZhbHVlcyBzdWNoIGFzICIxMHB4IiBhcmUgcGFyc2VkIHRvIEZsb2F0LgoJCXJldHVybiBpc05hTiggcGFyc2VkID0gcGFyc2VGbG9hdCggciApICkgPyAhciB8fCByID09PSAiYXV0byIgPyAwIDogciA6IHBhcnNlZDsKCX0sCgoJLy8gU3RhcnQgYW4gYW5pbWF0aW9uIGZyb20gb25lIG51bWJlciB0byBhbm90aGVyCgljdXN0b206IGZ1bmN0aW9uKCBmcm9tLCB0bywgdW5pdCApIHsKCQl2YXIgc2VsZiA9IHRoaXMsCgkJCWZ4ID0galF1ZXJ5LmZ4OwoKCQl0aGlzLnN0YXJ0VGltZSA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCk7CgkJdGhpcy5zdGFydCA9IGZyb207CgkJdGhpcy5lbmQgPSB0bzsKCQl0aGlzLnVuaXQgPSB1bml0IHx8IHRoaXMudW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHRoaXMucHJvcCBdID8gIiIgOiAicHgiICk7CgkJdGhpcy5ub3cgPSB0aGlzLnN0YXJ0OwoJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDA7CgoJCWZ1bmN0aW9uIHQoIGdvdG9FbmQgKSB7CgkJCXJldHVybiBzZWxmLnN0ZXAoZ290b0VuZCk7CgkJfQoKCQl0LmVsZW0gPSB0aGlzLmVsZW07CgoJCWlmICggdCgpICYmIGpRdWVyeS50aW1lcnMucHVzaCh0KSAmJiAhdGltZXJJZCApIHsKCQkJdGltZXJJZCA9IHNldEludGVydmFsKCBmeC50aWNrLCBmeC5pbnRlcnZhbCApOwoJCX0KCX0sCgoJLy8gU2ltcGxlICdzaG93JyBmdW5jdGlvbgoJc2hvdzogZnVuY3Rpb24oKSB7CgkJLy8gUmVtZW1iZXIgd2hlcmUgd2Ugc3RhcnRlZCwgc28gdGhhdCB3ZSBjYW4gZ28gYmFjayB0byBpdCBsYXRlcgoJCXRoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF0gPSBqUXVlcnkuc3R5bGUoIHRoaXMuZWxlbSwgdGhpcy5wcm9wICk7CgkJdGhpcy5vcHRpb25zLnNob3cgPSB0cnVlOwoKCQkvLyBCZWdpbiB0aGUgYW5pbWF0aW9uCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2Ugc3RhcnQgYXQgYSBzbWFsbCB3aWR0aC9oZWlnaHQgdG8gYXZvaWQgYW55CgkJLy8gZmxhc2ggb2YgY29udGVudAoJCXRoaXMuY3VzdG9tKHRoaXMucHJvcCA9PT0gIndpZHRoIiB8fCB0aGlzLnByb3AgPT09ICJoZWlnaHQiID8gMSA6IDAsIHRoaXMuY3VyKCkpOwoKCQkvLyBTdGFydCBieSBzaG93aW5nIHRoZSBlbGVtZW50CgkJalF1ZXJ5KCB0aGlzLmVsZW0gKS5zaG93KCk7Cgl9LAoKCS8vIFNpbXBsZSAnaGlkZScgZnVuY3Rpb24KCWhpZGU6IGZ1bmN0aW9uKCkgewoJCS8vIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKCQl0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdID0galF1ZXJ5LnN0eWxlKCB0aGlzLmVsZW0sIHRoaXMucHJvcCApOwoJCXRoaXMub3B0aW9ucy5oaWRlID0gdHJ1ZTsKCgkJLy8gQmVnaW4gdGhlIGFuaW1hdGlvbgoJCXRoaXMuY3VzdG9tKHRoaXMuY3VyKCksIDApOwoJfSwKCgkvLyBFYWNoIHN0ZXAgb2YgYW4gYW5pbWF0aW9uCglzdGVwOiBmdW5jdGlvbiggZ290b0VuZCApIHsKCQl2YXIgdCA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksCgkJCWRvbmUgPSB0cnVlLAoJCQllbGVtID0gdGhpcy5lbGVtLAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zLAoJCQlpLCBuOwoKCQlpZiAoIGdvdG9FbmQgfHwgdCA+PSBvcHRpb25zLmR1cmF0aW9uICsgdGhpcy5zdGFydFRpbWUgKSB7CgkJCXRoaXMubm93ID0gdGhpcy5lbmQ7CgkJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDE7CgkJCXRoaXMudXBkYXRlKCk7CgoJCQlvcHRpb25zLmFuaW1hdGVkUHJvcGVydGllc1sgdGhpcy5wcm9wIF0gPSB0cnVlOwoKCQkJZm9yICggaSBpbiBvcHRpb25zLmFuaW1hdGVkUHJvcGVydGllcyApIHsKCQkJCWlmICggb3B0aW9ucy5hbmltYXRlZFByb3BlcnRpZXNbaV0gIT09IHRydWUgKSB7CgkJCQkJZG9uZSA9IGZhbHNlOwoJCQkJfQoJCQl9CgoJCQlpZiAoIGRvbmUgKSB7CgkJCQkvLyBSZXNldCB0aGUgb3ZlcmZsb3cKCQkJCWlmICggb3B0aW9ucy5vdmVyZmxvdyAhPSBudWxsICYmICFqUXVlcnkuc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzICkgewoKCQkJCQlqUXVlcnkuZWFjaCggWyAiIiwgIlgiLCAiWSIgXSwgZnVuY3Rpb24gKGluZGV4LCB2YWx1ZSkgewoJCQkJCQllbGVtLnN0eWxlWyAib3ZlcmZsb3ciICsgdmFsdWUgXSA9IG9wdGlvbnMub3ZlcmZsb3dbaW5kZXhdOwoJCQkJCX0pOwoJCQkJfQoKCQkJCS8vIEhpZGUgdGhlIGVsZW1lbnQgaWYgdGhlICJoaWRlIiBvcGVyYXRpb24gd2FzIGRvbmUKCQkJCWlmICggb3B0aW9ucy5oaWRlICkgewoJCQkJCWpRdWVyeShlbGVtKS5oaWRlKCk7CgkJCQl9CgoJCQkJLy8gUmVzZXQgdGhlIHByb3BlcnRpZXMsIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGhpZGRlbiBvciBzaG93bgoJCQkJaWYgKCBvcHRpb25zLmhpZGUgfHwgb3B0aW9ucy5zaG93ICkgewoJCQkJCWZvciAoIHZhciBwIGluIG9wdGlvbnMuYW5pbWF0ZWRQcm9wZXJ0aWVzICkgewoJCQkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHAsIG9wdGlvbnMub3JpZ1twXSApOwoJCQkJCX0KCQkJCX0KCgkJCQkvLyBFeGVjdXRlIHRoZSBjb21wbGV0ZSBmdW5jdGlvbgoJCQkJb3B0aW9ucy5jb21wbGV0ZS5jYWxsKCBlbGVtICk7CgkJCX0KCgkJCXJldHVybiBmYWxzZTsKCgkJfSBlbHNlIHsKCQkJLy8gY2xhc3NpY2FsIGVhc2luZyBjYW5ub3QgYmUgdXNlZCB3aXRoIGFuIEluZmluaXR5IGR1cmF0aW9uCgkJCWlmICggb3B0aW9ucy5kdXJhdGlvbiA9PSBJbmZpbml0eSApIHsKCQkJCXRoaXMubm93ID0gdDsKCQkJfSBlbHNlIHsKCQkJCW4gPSB0IC0gdGhpcy5zdGFydFRpbWU7CgkJCQl0aGlzLnN0YXRlID0gbiAvIG9wdGlvbnMuZHVyYXRpb247CgoJCQkJLy8gUGVyZm9ybSB0aGUgZWFzaW5nIGZ1bmN0aW9uLCBkZWZhdWx0cyB0byBzd2luZwoJCQkJdGhpcy5wb3MgPSBqUXVlcnkuZWFzaW5nWyBvcHRpb25zLmFuaW1hdGVkUHJvcGVydGllc1sgdGhpcy5wcm9wIF0gXSggdGhpcy5zdGF0ZSwgbiwgMCwgMSwgb3B0aW9ucy5kdXJhdGlvbiApOwoJCQkJdGhpcy5ub3cgPSB0aGlzLnN0YXJ0ICsgKCh0aGlzLmVuZCAtIHRoaXMuc3RhcnQpICogdGhpcy5wb3MpOwoJCQl9CgkJCS8vIFBlcmZvcm0gdGhlIG5leHQgc3RlcCBvZiB0aGUgYW5pbWF0aW9uCgkJCXRoaXMudXBkYXRlKCk7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0KfTsKCmpRdWVyeS5leHRlbmQoIGpRdWVyeS5meCwgewoJdGljazogZnVuY3Rpb24oKSB7CgkJZm9yICggdmFyIHRpbWVycyA9IGpRdWVyeS50aW1lcnMsIGkgPSAwIDsgaSA8IHRpbWVycy5sZW5ndGggOyArK2kgKSB7CgkJCWlmICggIXRpbWVyc1tpXSgpICkgewoJCQkJdGltZXJzLnNwbGljZShpLS0sIDEpOwoJCQl9CgkJfQoKCQlpZiAoICF0aW1lcnMubGVuZ3RoICkgewoJCQlqUXVlcnkuZnguc3RvcCgpOwoJCX0KCX0sCgoJaW50ZXJ2YWw6IDEzLAoKCXN0b3A6IGZ1bmN0aW9uKCkgewoJCWNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTsKCQl0aW1lcklkID0gbnVsbDsKCX0sCgoJc3BlZWRzOiB7CgkJc2xvdzogNjAwLAoJCWZhc3Q6IDIwMCwKCQkvLyBEZWZhdWx0IHNwZWVkCgkJX2RlZmF1bHQ6IDQwMAoJfSwKCglzdGVwOiB7CgkJb3BhY2l0eTogZnVuY3Rpb24oIGZ4ICkgewoJCQlqUXVlcnkuc3R5bGUoIGZ4LmVsZW0sICJvcGFjaXR5IiwgZngubm93ICk7CgkJfSwKCgkJX2RlZmF1bHQ6IGZ1bmN0aW9uKCBmeCApIHsKCQkJaWYgKCBmeC5lbGVtLnN0eWxlICYmIGZ4LmVsZW0uc3R5bGVbIGZ4LnByb3AgXSAhPSBudWxsICkgewoJCQkJZnguZWxlbS5zdHlsZVsgZngucHJvcCBdID0gKGZ4LnByb3AgPT09ICJ3aWR0aCIgfHwgZngucHJvcCA9PT0gImhlaWdodCIgPyBNYXRoLm1heCgwLCBmeC5ub3cpIDogZngubm93KSArIGZ4LnVuaXQ7CgkJCX0gZWxzZSB7CgkJCQlmeC5lbGVtWyBmeC5wcm9wIF0gPSBmeC5ub3c7CgkJCX0KCQl9Cgl9Cn0pOwoKaWYgKCBqUXVlcnkuZXhwciAmJiBqUXVlcnkuZXhwci5maWx0ZXJzICkgewoJalF1ZXJ5LmV4cHIuZmlsdGVycy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuZ3JlcChqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7CgkJCXJldHVybiBlbGVtID09PSBmbi5lbGVtOwoJCX0pLmxlbmd0aDsKCX07Cn0KCi8vIFRyeSB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGRpc3BsYXkgdmFsdWUgb2YgYW4gZWxlbWVudApmdW5jdGlvbiBkZWZhdWx0RGlzcGxheSggbm9kZU5hbWUgKSB7CgoJaWYgKCAhZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF0gKSB7CgoJCXZhciBib2R5ID0gZG9jdW1lbnQuYm9keSwKCQkJZWxlbSA9IGpRdWVyeSggIjwiICsgbm9kZU5hbWUgKyAiPiIgKS5hcHBlbmRUbyggYm9keSApLAoJCQlkaXNwbGF5ID0gZWxlbS5jc3MoICJkaXNwbGF5IiApOwoKCQllbGVtLnJlbW92ZSgpOwoKCQkvLyBJZiB0aGUgc2ltcGxlIHdheSBmYWlscywKCQkvLyBnZXQgZWxlbWVudCdzIHJlYWwgZGVmYXVsdCBkaXNwbGF5IGJ5IGF0dGFjaGluZyBpdCB0byBhIHRlbXAgaWZyYW1lCgkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgfHwgZGlzcGxheSA9PT0gIiIgKSB7CgkJCS8vIE5vIGlmcmFtZSB0byB1c2UgeWV0LCBzbyBjcmVhdGUgaXQKCQkJaWYgKCAhaWZyYW1lICkgewoJCQkJaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlmcmFtZSIgKTsKCQkJCWlmcmFtZS5mcmFtZUJvcmRlciA9IGlmcmFtZS53aWR0aCA9IGlmcmFtZS5oZWlnaHQgPSAwOwoJCQl9CgoJCQlib2R5LmFwcGVuZENoaWxkKCBpZnJhbWUgKTsKCgkJCS8vIENyZWF0ZSBhIGNhY2hlYWJsZSBjb3B5IG9mIHRoZSBpZnJhbWUgZG9jdW1lbnQgb24gZmlyc3QgY2FsbC4KCQkJLy8gSUUgYW5kIE9wZXJhIHdpbGwgYWxsb3cgdXMgdG8gcmV1c2UgdGhlIGlmcmFtZURvYyB3aXRob3V0IHJlLXdyaXRpbmcgdGhlIGZha2UgSFRNTAoJCQkvLyBkb2N1bWVudCB0byBpdDsgV2ViS2l0ICYgRmlyZWZveCB3b24ndCBhbGxvdyByZXVzaW5nIHRoZSBpZnJhbWUgZG9jdW1lbnQuCgkJCWlmICggIWlmcmFtZURvYyB8fCAhaWZyYW1lLmNyZWF0ZUVsZW1lbnQgKSB7CgkJCQlpZnJhbWVEb2MgPSAoIGlmcmFtZS5jb250ZW50V2luZG93IHx8IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgKS5kb2N1bWVudDsKCQkJCWlmcmFtZURvYy53cml0ZSggKCBkb2N1bWVudC5jb21wYXRNb2RlID09PSAiQ1NTMUNvbXBhdCIgPyAiPCFkb2N0eXBlIGh0bWw+IiA6ICIiICkgKyAiPGh0bWw+PGJvZHk+IiApOwoJCQkJaWZyYW1lRG9jLmNsb3NlKCk7CgkJCX0KCgkJCWVsZW0gPSBpZnJhbWVEb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKTsKCgkJCWlmcmFtZURvYy5ib2R5LmFwcGVuZENoaWxkKCBlbGVtICk7CgoJCQlkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICk7CgoJCQlib2R5LnJlbW92ZUNoaWxkKCBpZnJhbWUgKTsKCQl9CgoJCS8vIFN0b3JlIHRoZSBjb3JyZWN0IGRlZmF1bHQgZGlzcGxheQoJCWVsZW1kaXNwbGF5WyBub2RlTmFtZSBdID0gZGlzcGxheTsKCX0KCglyZXR1cm4gZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF07Cn0KCgoKCnZhciBydGFibGUgPSAvXnQoPzphYmxlfGR8aCkkL2ksCglycm9vdCA9IC9eKD86Ym9keXxodG1sKSQvaTsKCmlmICggImdldEJvdW5kaW5nQ2xpZW50UmVjdCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICkgewoJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoJCXZhciBlbGVtID0gdGhpc1swXSwgYm94OwoKCQlpZiAoIG9wdGlvbnMgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOwoJCQl9KTsKCQl9CgoJCWlmICggIWVsZW0gfHwgIWVsZW0ub3duZXJEb2N1bWVudCApIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoKCQlpZiAoIGVsZW0gPT09IGVsZW0ub3duZXJEb2N1bWVudC5ib2R5ICkgewoJCQlyZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCBlbGVtICk7CgkJfQoKCQl0cnkgewoJCQlib3ggPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCX0gY2F0Y2goZSkge30KCgkJdmFyIGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCwKCQkJZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7CgoJCS8vIE1ha2Ugc3VyZSB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgZGlzY29ubmVjdGVkIERPTSBub2RlCgkJaWYgKCAhYm94IHx8ICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHsKCQkJcmV0dXJuIGJveCA/IHsgdG9wOiBib3gudG9wLCBsZWZ0OiBib3gubGVmdCB9IDogeyB0b3A6IDAsIGxlZnQ6IDAgfTsKCQl9CgoJCXZhciBib2R5ID0gZG9jLmJvZHksCgkJCXdpbiA9IGdldFdpbmRvdyhkb2MpLAoJCQljbGllbnRUb3AgID0gZG9jRWxlbS5jbGllbnRUb3AgIHx8IGJvZHkuY2xpZW50VG9wICB8fCAwLAoJCQljbGllbnRMZWZ0ID0gZG9jRWxlbS5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVmdCB8fCAwLAoJCQlzY3JvbGxUb3AgID0gd2luLnBhZ2VZT2Zmc2V0IHx8IGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsVG9wICB8fCBib2R5LnNjcm9sbFRvcCwKCQkJc2Nyb2xsTGVmdCA9IHdpbi5wYWdlWE9mZnNldCB8fCBqUXVlcnkuc3VwcG9ydC5ib3hNb2RlbCAmJiBkb2NFbGVtLnNjcm9sbExlZnQgfHwgYm9keS5zY3JvbGxMZWZ0LAoJCQl0b3AgID0gYm94LnRvcCAgKyBzY3JvbGxUb3AgIC0gY2xpZW50VG9wLAoJCQlsZWZ0ID0gYm94LmxlZnQgKyBzY3JvbGxMZWZ0IC0gY2xpZW50TGVmdDsKCgkJcmV0dXJuIHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfTsKCX07Cgp9IGVsc2UgewoJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoJCXZhciBlbGVtID0gdGhpc1swXTsKCgkJaWYgKCBvcHRpb25zICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewoJCQkJalF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTsKCQkJfSk7CgkJfQoKCQlpZiAoICFlbGVtIHx8ICFlbGVtLm93bmVyRG9jdW1lbnQgKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCgkJaWYgKCBlbGVtID09PSBlbGVtLm93bmVyRG9jdW1lbnQuYm9keSApIHsKCQkJcmV0dXJuIGpRdWVyeS5vZmZzZXQuYm9keU9mZnNldCggZWxlbSApOwoJCX0KCgkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplKCk7CgoJCXZhciBjb21wdXRlZFN0eWxlLAoJCQlvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudCwKCQkJcHJldk9mZnNldFBhcmVudCA9IGVsZW0sCgkJCWRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCwKCQkJZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQsCgkJCWJvZHkgPSBkb2MuYm9keSwKCQkJZGVmYXVsdFZpZXcgPSBkb2MuZGVmYXVsdFZpZXcsCgkJCXByZXZDb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcgPyBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICkgOiBlbGVtLmN1cnJlbnRTdHlsZSwKCQkJdG9wID0gZWxlbS5vZmZzZXRUb3AsCgkJCWxlZnQgPSBlbGVtLm9mZnNldExlZnQ7CgoJCXdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0gIT09IGJvZHkgJiYgZWxlbSAhPT0gZG9jRWxlbSApIHsKCQkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiAmJiBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApIHsKCQkJCWJyZWFrOwoJCQl9CgoJCQljb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcgPyBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpIDogZWxlbS5jdXJyZW50U3R5bGU7CgkJCXRvcCAgLT0gZWxlbS5zY3JvbGxUb3A7CgkJCWxlZnQgLT0gZWxlbS5zY3JvbGxMZWZ0OwoKCQkJaWYgKCBlbGVtID09PSBvZmZzZXRQYXJlbnQgKSB7CgkJCQl0b3AgICs9IGVsZW0ub2Zmc2V0VG9wOwoJCQkJbGVmdCArPSBlbGVtLm9mZnNldExlZnQ7CgoJCQkJaWYgKCBqUXVlcnkub2Zmc2V0LmRvZXNOb3RBZGRCb3JkZXIgJiYgIShqUXVlcnkub2Zmc2V0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzICYmIHJ0YWJsZS50ZXN0KGVsZW0ubm9kZU5hbWUpKSApIHsKCQkJCQl0b3AgICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyVG9wV2lkdGggICkgfHwgMDsKCQkJCQlsZWZ0ICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoICkgfHwgMDsKCQkJCX0KCgkJCQlwcmV2T2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50OwoJCQkJb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQ7CgkJCX0KCgkJCWlmICggalF1ZXJ5Lm9mZnNldC5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGUgJiYgY29tcHV0ZWRTdHlsZS5vdmVyZmxvdyAhPT0gInZpc2libGUiICkgewoJCQkJdG9wICArPSBwYXJzZUZsb2F0KCBjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoICApIHx8IDA7CgkJCQlsZWZ0ICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoICkgfHwgMDsKCQkJfQoKCQkJcHJldkNvbXB1dGVkU3R5bGUgPSBjb21wdXRlZFN0eWxlOwoJCX0KCgkJaWYgKCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gInJlbGF0aXZlIiB8fCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCXRvcCAgKz0gYm9keS5vZmZzZXRUb3A7CgkJCWxlZnQgKz0gYm9keS5vZmZzZXRMZWZ0OwoJCX0KCgkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiAmJiBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApIHsKCQkJdG9wICArPSBNYXRoLm1heCggZG9jRWxlbS5zY3JvbGxUb3AsIGJvZHkuc2Nyb2xsVG9wICk7CgkJCWxlZnQgKz0gTWF0aC5tYXgoIGRvY0VsZW0uc2Nyb2xsTGVmdCwgYm9keS5zY3JvbGxMZWZ0ICk7CgkJfQoKCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OwoJfTsKfQoKalF1ZXJ5Lm9mZnNldCA9IHsKCWluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewoJCXZhciBib2R5ID0gZG9jdW1lbnQuYm9keSwgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksIGlubmVyRGl2LCBjaGVja0RpdiwgdGFibGUsIHRkLCBib2R5TWFyZ2luVG9wID0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhib2R5LCAibWFyZ2luVG9wIikgKSB8fCAwLAoJCQlodG1sID0gIjxkaXYgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4Oyc+PGRpdj48L2Rpdj48L2Rpdj48dGFibGUgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OycgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz48dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiI7CgoJCWpRdWVyeS5leHRlbmQoIGNvbnRhaW5lci5zdHlsZSwgeyBwb3NpdGlvbjogImFic29sdXRlIiwgdG9wOiAwLCBsZWZ0OiAwLCBtYXJnaW46IDAsIGJvcmRlcjogMCwgd2lkdGg6ICIxcHgiLCBoZWlnaHQ6ICIxcHgiLCB2aXNpYmlsaXR5OiAiaGlkZGVuIiB9ICk7CgoJCWNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sOwoJCWJvZHkuaW5zZXJ0QmVmb3JlKCBjb250YWluZXIsIGJvZHkuZmlyc3RDaGlsZCApOwoJCWlubmVyRGl2ID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7CgkJY2hlY2tEaXYgPSBpbm5lckRpdi5maXJzdENoaWxkOwoJCXRkID0gaW5uZXJEaXYubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkOwoKCQl0aGlzLmRvZXNOb3RBZGRCb3JkZXIgPSAoY2hlY2tEaXYub2Zmc2V0VG9wICE9PSA1KTsKCQl0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzID0gKHRkLm9mZnNldFRvcCA9PT0gNSk7CgoJCWNoZWNrRGl2LnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIjsKCQljaGVja0Rpdi5zdHlsZS50b3AgPSAiMjBweCI7CgoJCS8vIHNhZmFyaSBzdWJ0cmFjdHMgcGFyZW50IGJvcmRlciB3aWR0aCBoZXJlIHdoaWNoIGlzIDVweAoJCXRoaXMuc3VwcG9ydHNGaXhlZFBvc2l0aW9uID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gMjAgfHwgY2hlY2tEaXYub2Zmc2V0VG9wID09PSAxNSk7CgkJY2hlY2tEaXYuc3R5bGUucG9zaXRpb24gPSBjaGVja0Rpdi5zdHlsZS50b3AgPSAiIjsKCgkJaW5uZXJEaXYuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKCQlpbm5lckRpdi5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CgoJCXRoaXMuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gLTUpOwoKCQl0aGlzLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0ID0gKGJvZHkub2Zmc2V0VG9wICE9PSBib2R5TWFyZ2luVG9wKTsKCgkJYm9keS5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7CgkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplID0galF1ZXJ5Lm5vb3A7Cgl9LAoKCWJvZHlPZmZzZXQ6IGZ1bmN0aW9uKCBib2R5ICkgewoJCXZhciB0b3AgPSBib2R5Lm9mZnNldFRvcCwKCQkJbGVmdCA9IGJvZHkub2Zmc2V0TGVmdDsKCgkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplKCk7CgoJCWlmICggalF1ZXJ5Lm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCApIHsKCQkJdG9wICArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKGJvZHksICJtYXJnaW5Ub3AiKSApIHx8IDA7CgkJCWxlZnQgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhib2R5LCAibWFyZ2luTGVmdCIpICkgfHwgMDsKCQl9CgoJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07Cgl9LAoKCXNldE9mZnNldDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGkgKSB7CgkJdmFyIHBvc2l0aW9uID0galF1ZXJ5LmNzcyggZWxlbSwgInBvc2l0aW9uIiApOwoKCQkvLyBzZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCgkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCWVsZW0uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwoJCX0KCgkJdmFyIGN1ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSwKCQkJY3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKSwKCQkJY3VyQ1NTVG9wID0galF1ZXJ5LmNzcyggZWxlbSwgInRvcCIgKSwKCQkJY3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sICJsZWZ0IiApLAoJCQljYWxjdWxhdGVQb3NpdGlvbiA9IChwb3NpdGlvbiA9PT0gImFic29sdXRlIiB8fCBwb3NpdGlvbiA9PT0gImZpeGVkIikgJiYgalF1ZXJ5LmluQXJyYXkoImF1dG8iLCBbY3VyQ1NTVG9wLCBjdXJDU1NMZWZ0XSkgPiAtMSwKCQkJcHJvcHMgPSB7fSwgY3VyUG9zaXRpb24gPSB7fSwgY3VyVG9wLCBjdXJMZWZ0OwoKCQkvLyBuZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlciB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWQKCQlpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkgewoJCQljdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTsKCQkJY3VyVG9wID0gY3VyUG9zaXRpb24udG9wOwoJCQljdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDsKCQl9IGVsc2UgewoJCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwOwoJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7CgkJCW9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGN1ck9mZnNldCApOwoJCX0KCgkJaWYgKG9wdGlvbnMudG9wICE9IG51bGwpIHsKCQkJcHJvcHMudG9wID0gKG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCkgKyBjdXJUb3A7CgkJfQoJCWlmIChvcHRpb25zLmxlZnQgIT0gbnVsbCkgewoJCQlwcm9wcy5sZWZ0ID0gKG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0KSArIGN1ckxlZnQ7CgkJfQoKCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKCQkJb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOwoJCX0gZWxzZSB7CgkJCWN1ckVsZW0uY3NzKCBwcm9wcyApOwoJCX0KCX0KfTsKCgpqUXVlcnkuZm4uZXh0ZW5kKHsKCXBvc2l0aW9uOiBmdW5jdGlvbigpIHsKCQlpZiAoICF0aGlzWzBdICkgewoJCQlyZXR1cm4gbnVsbDsKCQl9CgoJCXZhciBlbGVtID0gdGhpc1swXSwKCgkJLy8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnQKCQlvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCgpLAoKCQkvLyBHZXQgY29ycmVjdCBvZmZzZXRzCgkJb2Zmc2V0ICAgICAgID0gdGhpcy5vZmZzZXQoKSwKCQlwYXJlbnRPZmZzZXQgPSBycm9vdC50ZXN0KG9mZnNldFBhcmVudFswXS5ub2RlTmFtZSkgPyB7IHRvcDogMCwgbGVmdDogMCB9IDogb2Zmc2V0UGFyZW50Lm9mZnNldCgpOwoKCQkvLyBTdWJ0cmFjdCBlbGVtZW50IG1hcmdpbnMKCQkvLyBub3RlOiB3aGVuIGFuIGVsZW1lbnQgaGFzIG1hcmdpbjogYXV0byB0aGUgb2Zmc2V0TGVmdCBhbmQgbWFyZ2luTGVmdAoJCS8vIGFyZSB0aGUgc2FtZSBpbiBTYWZhcmkgY2F1c2luZyBvZmZzZXQubGVmdCB0byBpbmNvcnJlY3RseSBiZSAwCgkJb2Zmc2V0LnRvcCAgLT0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhlbGVtLCAibWFyZ2luVG9wIikgKSB8fCAwOwoJCW9mZnNldC5sZWZ0IC09IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoZWxlbSwgIm1hcmdpbkxlZnQiKSApIHx8IDA7CgoJCS8vIEFkZCBvZmZzZXRQYXJlbnQgYm9yZGVycwoJCXBhcmVudE9mZnNldC50b3AgICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50WzBdLCAiYm9yZGVyVG9wV2lkdGgiKSApIHx8IDA7CgkJcGFyZW50T2Zmc2V0LmxlZnQgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhvZmZzZXRQYXJlbnRbMF0sICJib3JkZXJMZWZ0V2lkdGgiKSApIHx8IDA7CgoJCS8vIFN1YnRyYWN0IHRoZSB0d28gb2Zmc2V0cwoJCXJldHVybiB7CgkJCXRvcDogIG9mZnNldC50b3AgIC0gcGFyZW50T2Zmc2V0LnRvcCwKCQkJbGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdAoJCX07Cgl9LAoKCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkgewoJCQl2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnQuYm9keTsKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgKCFycm9vdC50ZXN0KG9mZnNldFBhcmVudC5ub2RlTmFtZSkgJiYgalF1ZXJ5LmNzcyhvZmZzZXRQYXJlbnQsICJwb3NpdGlvbiIpID09PSAic3RhdGljIikgKSB7CgkJCQlvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50OwoJCQl9CgkJCXJldHVybiBvZmZzZXRQYXJlbnQ7CgkJfSk7Cgl9Cn0pOwoKCi8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kcwpqUXVlcnkuZWFjaCggWyJMZWZ0IiwgIlRvcCJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCXZhciBtZXRob2QgPSAic2Nyb2xsIiArIG5hbWU7CgoJalF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7CgkJdmFyIGVsZW0sIHdpbjsKCgkJaWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHsKCQkJZWxlbSA9IHRoaXNbIDAgXTsKCgkJCWlmICggIWVsZW0gKSB7CgkJCQlyZXR1cm4gbnVsbDsKCQkJfQoKCQkJd2luID0gZ2V0V2luZG93KCBlbGVtICk7CgoJCQkvLyBSZXR1cm4gdGhlIHNjcm9sbCBvZmZzZXQKCQkJcmV0dXJuIHdpbiA/ICgicGFnZVhPZmZzZXQiIGluIHdpbikgPyB3aW5bIGkgPyAicGFnZVlPZmZzZXQiIDogInBhZ2VYT2Zmc2V0IiBdIDoKCQkJCWpRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIG1ldGhvZCBdIHx8CgkJCQkJd2luLmRvY3VtZW50LmJvZHlbIG1ldGhvZCBdIDoKCQkJCWVsZW1bIG1ldGhvZCBdOwoJCX0KCgkJLy8gU2V0IHRoZSBzY3JvbGwgb2Zmc2V0CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJd2luID0gZ2V0V2luZG93KCB0aGlzICk7CgoJCQlpZiAoIHdpbiApIHsKCQkJCXdpbi5zY3JvbGxUbygKCQkJCQkhaSA/IHZhbCA6IGpRdWVyeSggd2luICkuc2Nyb2xsTGVmdCgpLAoJCQkJCSBpID8gdmFsIDogalF1ZXJ5KCB3aW4gKS5zY3JvbGxUb3AoKQoJCQkJKTsKCgkJCX0gZWxzZSB7CgkJCQl0aGlzWyBtZXRob2QgXSA9IHZhbDsKCQkJfQoJCX0pOwoJfTsKfSk7CgpmdW5jdGlvbiBnZXRXaW5kb3coIGVsZW0gKSB7CglyZXR1cm4galF1ZXJ5LmlzV2luZG93KCBlbGVtICkgPwoJCWVsZW0gOgoJCWVsZW0ubm9kZVR5cGUgPT09IDkgPwoJCQllbGVtLmRlZmF1bHRWaWV3IHx8IGVsZW0ucGFyZW50V2luZG93IDoKCQkJZmFsc2U7Cn0KCgoKCi8vIENyZWF0ZSB3aWR0aCwgaGVpZ2h0LCBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcwpqUXVlcnkuZWFjaChbICJIZWlnaHQiLCAiV2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewoKCXZhciB0eXBlID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKCS8vIGlubmVySGVpZ2h0IGFuZCBpbm5lcldpZHRoCglqUXVlcnkuZm5bICJpbm5lciIgKyBuYW1lIF0gPSBmdW5jdGlvbigpIHsKCQl2YXIgZWxlbSA9IHRoaXNbMF07CgkJcmV0dXJuIGVsZW0gJiYgZWxlbS5zdHlsZSA/CgkJCXBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsICJwYWRkaW5nIiApICkgOgoJCQludWxsOwoJfTsKCgkvLyBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aAoJalF1ZXJ5LmZuWyAib3V0ZXIiICsgbmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiApIHsKCQl2YXIgZWxlbSA9IHRoaXNbMF07CgkJcmV0dXJuIGVsZW0gJiYgZWxlbS5zdHlsZSA/CgkJCXBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIG1hcmdpbiA/ICJtYXJnaW4iIDogImJvcmRlciIgKSApIDoKCQkJbnVsbDsKCX07CgoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggc2l6ZSApIHsKCQkvLyBHZXQgd2luZG93IHdpZHRoIG9yIGhlaWdodAoJCXZhciBlbGVtID0gdGhpc1swXTsKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gc2l6ZSA9PSBudWxsID8gbnVsbCA6IHRoaXM7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzaXplICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApOwoJCQkJc2VsZlsgdHlwZSBdKCBzaXplLmNhbGwoIHRoaXMsIGksIHNlbGZbIHR5cGUgXSgpICkgKTsKCQkJfSk7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgewoJCQkvLyBFdmVyeW9uZSBlbHNlIHVzZSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgb3IgZG9jdW1lbnQuYm9keSBkZXBlbmRpbmcgb24gUXVpcmtzIHZzIFN0YW5kYXJkcyBtb2RlCgkJCS8vIDNyZCBjb25kaXRpb24gYWxsb3dzIE5va2lhIHN1cHBvcnQsIGFzIGl0IHN1cHBvcnRzIHRoZSBkb2NFbGVtIHByb3AgYnV0IG5vdCBDU1MxQ29tcGF0CgkJCXZhciBkb2NFbGVtUHJvcCA9IGVsZW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyAiY2xpZW50IiArIG5hbWUgXSwKCQkJCWJvZHkgPSBlbGVtLmRvY3VtZW50LmJvZHk7CgkJCXJldHVybiBlbGVtLmRvY3VtZW50LmNvbXBhdE1vZGUgPT09ICJDU1MxQ29tcGF0IiAmJiBkb2NFbGVtUHJvcCB8fAoJCQkJYm9keSAmJiBib2R5WyAiY2xpZW50IiArIG5hbWUgXSB8fCBkb2NFbGVtUHJvcDsKCgkJLy8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodAoJCX0gZWxzZSBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7CgkJCS8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSwgd2hpY2hldmVyIGlzIGdyZWF0ZXIKCQkJcmV0dXJuIE1hdGgubWF4KAoJCQkJZWxlbS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIgKyBuYW1lXSwKCQkJCWVsZW0uYm9keVsic2Nyb2xsIiArIG5hbWVdLCBlbGVtLmRvY3VtZW50RWxlbWVudFsic2Nyb2xsIiArIG5hbWVdLAoJCQkJZWxlbS5ib2R5WyJvZmZzZXQiICsgbmFtZV0sIGVsZW0uZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiICsgbmFtZV0KCQkJKTsKCgkJLy8gR2V0IG9yIHNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQl9IGVsc2UgaWYgKCBzaXplID09PSB1bmRlZmluZWQgKSB7CgkJCXZhciBvcmlnID0galF1ZXJ5LmNzcyggZWxlbSwgdHlwZSApLAoJCQkJcmV0ID0gcGFyc2VGbG9hdCggb3JpZyApOwoKCQkJcmV0dXJuIGpRdWVyeS5pc05hTiggcmV0ICkgPyBvcmlnIDogcmV0OwoKCQkvLyBTZXQgdGhlIHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCAoZGVmYXVsdCB0byBwaXhlbHMgaWYgdmFsdWUgaXMgdW5pdGxlc3MpCgkJfSBlbHNlIHsKCQkJcmV0dXJuIHRoaXMuY3NzKCB0eXBlLCB0eXBlb2Ygc2l6ZSA9PT0gInN0cmluZyIgPyBzaXplIDogc2l6ZSArICJweCIgKTsKCQl9Cgl9OwoKfSk7CgoKLy8gRXhwb3NlIGpRdWVyeSB0byB0aGUgZ2xvYmFsIG9iamVjdAp3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7Cn0pKHdpbmRvdyk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/themeswitchertool.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogalF1ZXJ5IHBsdWdpbiB0aGVtZXN3aXRjaGVyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiQuZm4udGhlbWVzd2l0Y2hlciA9IGZ1bmN0aW9uKHNldHRpbmdzKXsKCXZhciBvcHRpb25zID0galF1ZXJ5LmV4dGVuZCh7CgkJbG9hZFRoZW1lOiBudWxsLAoJCWluaXRpYWxUZXh0OiAnU3dpdGNoIFRoZW1lJywKCQl3aWR0aDogMTUwLAoJCWhlaWdodDogMjAwLAoJCWJ1dHRvblByZVRleHQ6ICdUaGVtZTogJywKCQljbG9zZU9uU2VsZWN0OiB0cnVlLAoJCWJ1dHRvbkhlaWdodDogMTQsCgkJY29va2llTmFtZTogJ2pxdWVyeS11aS10aGVtZScsCgkJb25PcGVuOiBmdW5jdGlvbigpe30sCgkJb25DbG9zZTogZnVuY3Rpb24oKXt9LAoJCW9uU2VsZWN0OiBmdW5jdGlvbigpe30KCX0sIHNldHRpbmdzKTsKCgkvL21hcmt1cCAKCXZhciBidXR0b24gPSAkKCc8YSBocmVmPSIjIiBjbGFzcz0ianF1ZXJ5LXVpLXRoZW1lc3dpdGNoZXItdHJpZ2dlciI+PHNwYW4gY2xhc3M9ImpxdWVyeS11aS10aGVtZXN3aXRjaGVyLWljb24iPjwvc3Bhbj48c3BhbiBjbGFzcz0ianF1ZXJ5LXVpLXRoZW1lc3dpdGNoZXItdGl0bGUiPicrIG9wdGlvbnMuaW5pdGlhbFRleHQgKyc8L3NwYW4+PC9hPicpOwoJdmFyIHN3aXRjaGVycGFuZSA9ICQoJzxkaXYgY2xhc3M9ImpxdWVyeS11aS10aGVtZXN3aXRjaGVyIj48ZGl2IGlkPSJ0aGVtZUdhbGxlcnkiPgk8dWw+CQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1UcmVidWNoZXQrTVMsK1RhaG9tYSwrVmVyZGFuYSwrQXJpYWwsK3NhbnMtc2VyaWYmYW1wO2Z3RGVmYXVsdD1ib2xkJmFtcDtmc0RlZmF1bHQ9MS4xZW0mYW1wO2Nvcm5lclJhZGl1cz00cHgmYW1wO2JnQ29sb3JIZWFkZXI9ZjZhODI4JmFtcDtiZ1RleHR1cmVIZWFkZXI9MTJfZ2xvc3Nfd2F2ZS5wbmcmYW1wO2JnSW1nT3BhY2l0eUhlYWRlcj0zNSZhbXA7Ym9yZGVyQ29sb3JIZWFkZXI9ZTc4ZjA4JmFtcDtmY0hlYWRlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhlYWRlcj1mZmZmZmYmYW1wO2JnQ29sb3JDb250ZW50PWVlZWVlZSZhbXA7YmdUZXh0dXJlQ29udGVudD0wM19oaWdobGlnaHRfc29mdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUNvbnRlbnQ9MTAwJmFtcDtib3JkZXJDb2xvckNvbnRlbnQ9ZGRkZGRkJmFtcDtmY0NvbnRlbnQ9MzMzMzMzJmFtcDtpY29uQ29sb3JDb250ZW50PTIyMjIyMiZhbXA7YmdDb2xvckRlZmF1bHQ9ZjZmNmY2JmFtcDtiZ1RleHR1cmVEZWZhdWx0PTAyX2dsYXNzLnBuZyZhbXA7YmdJbWdPcGFjaXR5RGVmYXVsdD0xMDAmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD1jY2NjY2MmYW1wO2ZjRGVmYXVsdD0xYzk0YzQmYW1wO2ljb25Db2xvckRlZmF1bHQ9ZWY4YzA4JmFtcDtiZ0NvbG9ySG92ZXI9ZmRmNWNlJmFtcDtiZ1RleHR1cmVIb3Zlcj0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTEwMCZhbXA7Ym9yZGVyQ29sb3JIb3Zlcj1mYmNiMDkmYW1wO2ZjSG92ZXI9Yzc3NDA1JmFtcDtpY29uQ29sb3JIb3Zlcj1lZjhjMDgmYW1wO2JnQ29sb3JBY3RpdmU9ZmZmZmZmJmFtcDtiZ1RleHR1cmVBY3RpdmU9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlBY3RpdmU9NjUmYW1wO2JvcmRlckNvbG9yQWN0aXZlPWZiZDg1MCZhbXA7ZmNBY3RpdmU9ZWI4ZjAwJmFtcDtpY29uQ29sb3JBY3RpdmU9ZWY4YzA4JmFtcDtiZ0NvbG9ySGlnaGxpZ2h0PWZmZTQ1YyZhbXA7YmdUZXh0dXJlSGlnaGxpZ2h0PTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZhbXA7YmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTc1JmFtcDtib3JkZXJDb2xvckhpZ2hsaWdodD1mZWQyMmYmYW1wO2ZjSGlnaGxpZ2h0PTM2MzYzNiZhbXA7aWNvbkNvbG9ySGlnaGxpZ2h0PTIyOGVmMSZhbXA7YmdDb2xvckVycm9yPWI4MTkwMCZhbXA7YmdUZXh0dXJlRXJyb3I9MDhfZGlhZ29uYWxzX3RoaWNrLnBuZyZhbXA7YmdJbWdPcGFjaXR5RXJyb3I9MTgmYW1wO2JvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmFtcDtmY0Vycm9yPWZmZmZmZiZhbXA7aWNvbkNvbG9yRXJyb3I9ZmZkMjdhJmFtcDtiZ0NvbG9yT3ZlcmxheT02NjY2NjYmYW1wO2JnVGV4dHVyZU92ZXJsYXk9MDhfZGlhZ29uYWxzX3RoaWNrLnBuZyZhbXA7YmdJbWdPcGFjaXR5T3ZlcmxheT0yMCZhbXA7b3BhY2l0eU92ZXJsYXk9NTAmYW1wO2JnQ29sb3JTaGFkb3c9MDAwMDAwJmFtcDtiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eVNoYWRvdz0xMCZhbXA7b3BhY2l0eVNoYWRvdz0yMCZhbXA7dGhpY2tuZXNzU2hhZG93PTVweCZhbXA7b2Zmc2V0VG9wU2hhZG93PS01cHgmYW1wO29mZnNldExlZnRTaGFkb3c9LTVweCZhbXA7Y29ybmVyUmFkaXVzU2hhZG93PTVweCI+CQkJPGltZyBzcmM9Imh0dHA6Ly9sZWFybmluZ2pxdWVyeS5rc3dlZGJlcmcubmV0ZG5hLWNkbi5jb20vd3AtY29udGVudC91cGxvYWRzL3RoZW1lcm9sbGVyL3RoZW1lXzkwX3VpX2xpZ2h0LnBuZyIgYWx0PSJVSSBMaWdodG5lc3MiIHRpdGxlPSJVSSBMaWdodG5lc3MiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+VUkgbGlnaHRuZXNzPC9zcGFuPgkJPC9hPjwvbGk+CQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PVNlZ29lK1VJJTJDK0FyaWFsJTJDK3NhbnMtc2VyaWYmYW1wO2Z3RGVmYXVsdD1ib2xkJmFtcDtmc0RlZmF1bHQ9MS4xZW0mYW1wO2Nvcm5lclJhZGl1cz02cHgmYW1wO2JnQ29sb3JIZWFkZXI9MzMzMzMzJmFtcDtiZ1RleHR1cmVIZWFkZXI9MTJfZ2xvc3Nfd2F2ZS5wbmcmYW1wO2JnSW1nT3BhY2l0eUhlYWRlcj0yNSZhbXA7Ym9yZGVyQ29sb3JIZWFkZXI9MzMzMzMzJmFtcDtmY0hlYWRlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhlYWRlcj1mZmZmZmYmYW1wO2JnQ29sb3JDb250ZW50PTAwMDAwMCZhbXA7YmdUZXh0dXJlQ29udGVudD0wNV9pbnNldF9zb2Z0LnBuZyZhbXA7YmdJbWdPcGFjaXR5Q29udGVudD0yNSZhbXA7Ym9yZGVyQ29sb3JDb250ZW50PTY2NjY2NiZhbXA7ZmNDb250ZW50PWZmZmZmZiZhbXA7aWNvbkNvbG9yQ29udGVudD1jY2NjY2MmYW1wO2JnQ29sb3JEZWZhdWx0PTU1NTU1NSZhbXA7YmdUZXh0dXJlRGVmYXVsdD0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9MjAmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD02NjY2NjYmYW1wO2ZjRGVmYXVsdD1lZWVlZWUmYW1wO2ljb25Db2xvckRlZmF1bHQ9Y2NjY2NjJmFtcDtiZ0NvbG9ySG92ZXI9MDA3OGEzJmFtcDtiZ1RleHR1cmVIb3Zlcj0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTQwJmFtcDtib3JkZXJDb2xvckhvdmVyPTU5YjRkNCZhbXA7ZmNIb3Zlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhvdmVyPWZmZmZmZiZhbXA7YmdDb2xvckFjdGl2ZT1mNTg0MDAmYW1wO2JnVGV4dHVyZUFjdGl2ZT0wNV9pbnNldF9zb2Z0LnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTMwJmFtcDtib3JkZXJDb2xvckFjdGl2ZT1mZmFmMGYmYW1wO2ZjQWN0aXZlPWZmZmZmZiZhbXA7aWNvbkNvbG9yQWN0aXZlPTIyMjIyMiZhbXA7YmdDb2xvckhpZ2hsaWdodD1lZWVlZWUmYW1wO2JnVGV4dHVyZUhpZ2hsaWdodD0wM19oaWdobGlnaHRfc29mdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD04MCZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9Y2NjY2NjJmFtcDtmY0hpZ2hsaWdodD0yZTdkYjImYW1wO2ljb25Db2xvckhpZ2hsaWdodD00YjhlMGImYW1wO2JnQ29sb3JFcnJvcj1mZmM3M2QmYW1wO2JnVGV4dHVyZUVycm9yPTAyX2dsYXNzLnBuZyZhbXA7YmdJbWdPcGFjaXR5RXJyb3I9NDAmYW1wO2JvcmRlckNvbG9yRXJyb3I9ZmZiNzNkJmFtcDtmY0Vycm9yPTExMTExMSZhbXA7aWNvbkNvbG9yRXJyb3I9YTgzMzAwJmFtcDtiZ0NvbG9yT3ZlcmxheT01YzVjNWMmYW1wO2JnVGV4dHVyZU92ZXJsYXk9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eU92ZXJsYXk9NTAmYW1wO29wYWNpdHlPdmVybGF5PTgwJmFtcDtiZ0NvbG9yU2hhZG93PWNjY2NjYyZhbXA7YmdUZXh0dXJlU2hhZG93PTAxX2ZsYXQucG5nJmFtcDtiZ0ltZ09wYWNpdHlTaGFkb3c9MzAmYW1wO29wYWNpdHlTaGFkb3c9NjAmYW1wO3RoaWNrbmVzc1NoYWRvdz03cHgmYW1wO29mZnNldFRvcFNoYWRvdz0tN3B4JmFtcDtvZmZzZXRMZWZ0U2hhZG93PS03cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz04cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF91aV9kYXJrLnBuZyIgYWx0PSJVSSBEYXJrbmVzcyIgdGl0bGU9IlVJIERhcmtuZXNzIiAvPgkJCTxzcGFuIGNsYXNzPSJ0aGVtZU5hbWUiPlVJIGRhcmtuZXNzPC9zcGFuPgkJPC9hPjwvbGk+CQkJPGxpPjxhIGhyZWY9Imh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvY3NzL3BhcnNlVGhlbWUuY3NzLnBocD9mZkRlZmF1bHQ9VmVyZGFuYSxBcmlhbCxzYW5zLXNlcmlmJmFtcDtmd0RlZmF1bHQ9bm9ybWFsJmFtcDtmc0RlZmF1bHQ9MS4xZW0mYW1wO2Nvcm5lclJhZGl1cz00cHgmYW1wO2JnQ29sb3JIZWFkZXI9Y2NjY2NjJmFtcDtiZ1RleHR1cmVIZWFkZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmFtcDtiZ0ltZ09wYWNpdHlIZWFkZXI9NzUmYW1wO2JvcmRlckNvbG9ySGVhZGVyPWFhYWFhYSZhbXA7ZmNIZWFkZXI9MjIyMjIyJmFtcDtpY29uQ29sb3JIZWFkZXI9MjIyMjIyJmFtcDtiZ0NvbG9yQ29udGVudD1mZmZmZmYmYW1wO2JnVGV4dHVyZUNvbnRlbnQ9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUNvbnRlbnQ9NzUmYW1wO2JvcmRlckNvbG9yQ29udGVudD1hYWFhYWEmYW1wO2ZjQ29udGVudD0yMjIyMjImYW1wO2ljb25Db2xvckNvbnRlbnQ9MjIyMjIyJmFtcDtiZ0NvbG9yRGVmYXVsdD1lNmU2ZTYmYW1wO2JnVGV4dHVyZURlZmF1bHQ9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlEZWZhdWx0PTc1JmFtcDtib3JkZXJDb2xvckRlZmF1bHQ9ZDNkM2QzJmFtcDtmY0RlZmF1bHQ9NTU1NTU1JmFtcDtpY29uQ29sb3JEZWZhdWx0PTg4ODg4OCZhbXA7YmdDb2xvckhvdmVyPWRhZGFkYSZhbXA7YmdUZXh0dXJlSG92ZXI9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlIb3Zlcj03NSZhbXA7Ym9yZGVyQ29sb3JIb3Zlcj05OTk5OTkmYW1wO2ZjSG92ZXI9MjEyMTIxJmFtcDtpY29uQ29sb3JIb3Zlcj00NTQ1NDUmYW1wO2JnQ29sb3JBY3RpdmU9ZmZmZmZmJmFtcDtiZ1RleHR1cmVBY3RpdmU9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlBY3RpdmU9NjUmYW1wO2JvcmRlckNvbG9yQWN0aXZlPWFhYWFhYSZhbXA7ZmNBY3RpdmU9MjEyMTIxJmFtcDtpY29uQ29sb3JBY3RpdmU9NDU0NTQ1JmFtcDtiZ0NvbG9ySGlnaGxpZ2h0PWZiZjllZSZhbXA7YmdUZXh0dXJlSGlnaGxpZ2h0PTAyX2dsYXNzLnBuZyZhbXA7YmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTU1JmFtcDtib3JkZXJDb2xvckhpZ2hsaWdodD1mY2VmYTEmYW1wO2ZjSGlnaGxpZ2h0PTM2MzYzNiZhbXA7aWNvbkNvbG9ySGlnaGxpZ2h0PTJlODNmZiZhbXA7YmdDb2xvckVycm9yPWZlZjFlYyZhbXA7YmdUZXh0dXJlRXJyb3I9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlFcnJvcj05NSZhbXA7Ym9yZGVyQ29sb3JFcnJvcj1jZDBhMGEmYW1wO2ZjRXJyb3I9Y2QwYTBhJmFtcDtpY29uQ29sb3JFcnJvcj1jZDBhMGEmYW1wO2JnQ29sb3JPdmVybGF5PWFhYWFhYSZhbXA7YmdUZXh0dXJlT3ZlcmxheT0wMV9mbGF0LnBuZyZhbXA7YmdJbWdPcGFjaXR5T3ZlcmxheT0wJmFtcDtvcGFjaXR5T3ZlcmxheT0zMCZhbXA7YmdDb2xvclNoYWRvdz1hYWFhYWEmYW1wO2JnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZhbXA7YmdJbWdPcGFjaXR5U2hhZG93PTAmYW1wO29wYWNpdHlTaGFkb3c9MzAmYW1wO3RoaWNrbmVzc1NoYWRvdz04cHgmYW1wO29mZnNldFRvcFNoYWRvdz0tOHB4JmFtcDtvZmZzZXRMZWZ0U2hhZG93PS04cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz04cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9zbW9vdGhuZXNzLnBuZyIgYWx0PSJTbW9vdGhuZXNzIiB0aXRsZT0iU21vb3RobmVzcyIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5TbW9vdGhuZXNzPC9zcGFuPgkJPC9hPjwvbGk+CQkJCQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PVZlcmRhbmElMkNBcmlhbCUyQ3NhbnMtc2VyaWYmYW1wO2Z3RGVmYXVsdD1ub3JtYWwmYW1wO2ZzRGVmYXVsdD0xLjFlbSZhbXA7Y29ybmVyUmFkaXVzPTVweCZhbXA7YmdDb2xvckhlYWRlcj0yMTkxYzAmYW1wO2JnVGV4dHVyZUhlYWRlcj0xMl9nbG9zc193YXZlLnBuZyZhbXA7YmdJbWdPcGFjaXR5SGVhZGVyPTc1JmFtcDtib3JkZXJDb2xvckhlYWRlcj00Mjk3ZDcmYW1wO2ZjSGVhZGVyPWVhZjVmNyZhbXA7aWNvbkNvbG9ySGVhZGVyPWQ4ZTdmMyZhbXA7YmdDb2xvckNvbnRlbnQ9ZmNmZGZkJmFtcDtiZ1RleHR1cmVDb250ZW50PTA2X2luc2V0X2hhcmQucG5nJmFtcDtiZ0ltZ09wYWNpdHlDb250ZW50PTEwMCZhbXA7Ym9yZGVyQ29sb3JDb250ZW50PWE2YzllMiZhbXA7ZmNDb250ZW50PTIyMjIyMiZhbXA7aWNvbkNvbG9yQ29udGVudD0wMDc4YWUmYW1wO2JnQ29sb3JEZWZhdWx0PTAwNzhhZSZhbXA7YmdUZXh0dXJlRGVmYXVsdD0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9NDUmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD03N2Q1ZjcmYW1wO2ZjRGVmYXVsdD1mZmZmZmYmYW1wO2ljb25Db2xvckRlZmF1bHQ9ZTBmZGZmJmFtcDtiZ0NvbG9ySG92ZXI9NzljOWVjJmFtcDtiZ1RleHR1cmVIb3Zlcj0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTc1JmFtcDtib3JkZXJDb2xvckhvdmVyPTQ0OGRhZSZhbXA7ZmNIb3Zlcj0wMjY4OTAmYW1wO2ljb25Db2xvckhvdmVyPTA1NmI5MyZhbXA7YmdDb2xvckFjdGl2ZT02ZWFjMmMmYW1wO2JnVGV4dHVyZUFjdGl2ZT0xMl9nbG9zc193YXZlLnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTUwJmFtcDtib3JkZXJDb2xvckFjdGl2ZT1hY2RkNGEmYW1wO2ZjQWN0aXZlPWZmZmZmZiZhbXA7aWNvbkNvbG9yQWN0aXZlPWY1ZTE3NSZhbXA7YmdDb2xvckhpZ2hsaWdodD1mOGRhNGUmYW1wO2JnVGV4dHVyZUhpZ2hsaWdodD0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9ZmNkMTEzJmFtcDtmY0hpZ2hsaWdodD05MTU2MDgmYW1wO2ljb25Db2xvckhpZ2hsaWdodD1mN2E1MGQmYW1wO2JnQ29sb3JFcnJvcj1lMTRmMWMmYW1wO2JnVGV4dHVyZUVycm9yPTEyX2dsb3NzX3dhdmUucG5nJmFtcDtiZ0ltZ09wYWNpdHlFcnJvcj00NSZhbXA7Ym9yZGVyQ29sb3JFcnJvcj1jZDBhMGEmYW1wO2ZjRXJyb3I9ZmZmZmZmJmFtcDtpY29uQ29sb3JFcnJvcj1mY2QxMTMmYW1wO2JnQ29sb3JPdmVybGF5PWFhYWFhYSZhbXA7YmdUZXh0dXJlT3ZlcmxheT0wMV9mbGF0LnBuZyZhbXA7YmdJbWdPcGFjaXR5T3ZlcmxheT03NSZhbXA7b3BhY2l0eU92ZXJsYXk9MzAmYW1wO2JnQ29sb3JTaGFkb3c9OTk5OTk5JmFtcDtiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eVNoYWRvdz01NSZhbXA7b3BhY2l0eVNoYWRvdz00NSZhbXA7dGhpY2tuZXNzU2hhZG93PTBweCZhbXA7b2Zmc2V0VG9wU2hhZG93PTVweCZhbXA7b2Zmc2V0TGVmdFNoYWRvdz01cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz01cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9zdGFydF9tZW51LnBuZyIgYWx0PSJTdGFydCIgdGl0bGU9IlN0YXJ0IiAvPgkJCTxzcGFuIGNsYXNzPSJ0aGVtZU5hbWUiPlN0YXJ0PC9zcGFuPgkJPC9hPjwvbGk+CQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PUx1Y2lkYStHcmFuZGUsK0x1Y2lkYStTYW5zLCtBcmlhbCwrc2Fucy1zZXJpZiZhbXA7ZndEZWZhdWx0PWJvbGQmYW1wO2ZzRGVmYXVsdD0xLjFlbSZhbXA7Y29ybmVyUmFkaXVzPTVweCZhbXA7YmdDb2xvckhlYWRlcj01YzljY2MmYW1wO2JnVGV4dHVyZUhlYWRlcj0xMl9nbG9zc193YXZlLnBuZyZhbXA7YmdJbWdPcGFjaXR5SGVhZGVyPTU1JmFtcDtib3JkZXJDb2xvckhlYWRlcj00Mjk3ZDcmYW1wO2ZjSGVhZGVyPWZmZmZmZiZhbXA7aWNvbkNvbG9ySGVhZGVyPWQ4ZTdmMyZhbXA7YmdDb2xvckNvbnRlbnQ9ZmNmZGZkJmFtcDtiZ1RleHR1cmVDb250ZW50PTA2X2luc2V0X2hhcmQucG5nJmFtcDtiZ0ltZ09wYWNpdHlDb250ZW50PTEwMCZhbXA7Ym9yZGVyQ29sb3JDb250ZW50PWE2YzllMiZhbXA7ZmNDb250ZW50PTIyMjIyMiZhbXA7aWNvbkNvbG9yQ29udGVudD00NjliZGQmYW1wO2JnQ29sb3JEZWZhdWx0PWRmZWZmYyZhbXA7YmdUZXh0dXJlRGVmYXVsdD0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9ODUmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD1jNWRiZWMmYW1wO2ZjRGVmYXVsdD0yZTZlOWUmYW1wO2ljb25Db2xvckRlZmF1bHQ9NmRhOGQ1JmFtcDtiZ0NvbG9ySG92ZXI9ZDBlNWY1JmFtcDtiZ1RleHR1cmVIb3Zlcj0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTc1JmFtcDtib3JkZXJDb2xvckhvdmVyPTc5YjdlNyZhbXA7ZmNIb3Zlcj0xZDU5ODcmYW1wO2ljb25Db2xvckhvdmVyPTIxN2JjMCZhbXA7YmdDb2xvckFjdGl2ZT1mNWY4ZjkmYW1wO2JnVGV4dHVyZUFjdGl2ZT0wNl9pbnNldF9oYXJkLnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTEwMCZhbXA7Ym9yZGVyQ29sb3JBY3RpdmU9NzliN2U3JmFtcDtmY0FjdGl2ZT1lMTcwMDkmYW1wO2ljb25Db2xvckFjdGl2ZT1mOWJkMDEmYW1wO2JnQ29sb3JIaWdobGlnaHQ9ZmJlYzg4JmFtcDtiZ1RleHR1cmVIaWdobGlnaHQ9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9ZmFkNDJlJmFtcDtmY0hpZ2hsaWdodD0zNjM2MzYmYW1wO2ljb25Db2xvckhpZ2hsaWdodD0yZTgzZmYmYW1wO2JnQ29sb3JFcnJvcj1mZWYxZWMmYW1wO2JnVGV4dHVyZUVycm9yPTAyX2dsYXNzLnBuZyZhbXA7YmdJbWdPcGFjaXR5RXJyb3I9OTUmYW1wO2JvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmFtcDtmY0Vycm9yPWNkMGEwYSZhbXA7aWNvbkNvbG9yRXJyb3I9Y2QwYTBhJmFtcDtiZ0NvbG9yT3ZlcmxheT1hYWFhYWEmYW1wO2JnVGV4dHVyZU92ZXJsYXk9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eU92ZXJsYXk9MCZhbXA7b3BhY2l0eU92ZXJsYXk9MzAmYW1wO2JnQ29sb3JTaGFkb3c9YWFhYWFhJmFtcDtiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eVNoYWRvdz0wJmFtcDtvcGFjaXR5U2hhZG93PTMwJmFtcDt0aGlja25lc3NTaGFkb3c9OHB4JmFtcDtvZmZzZXRUb3BTaGFkb3c9LThweCZhbXA7b2Zmc2V0TGVmdFNoYWRvdz0tOHB4JmFtcDtjb3JuZXJSYWRpdXNTaGFkb3c9OHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfd2luZG96ZS5wbmciIGFsdD0iUmVkbW9uZCIgdGl0bGU9IlJlZG1vbmQiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+UmVkbW9uZDwvc3Bhbj4JCTwvYT48L2xpPgkJCQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PVNlZ29lK1VJJTJDK0FyaWFsJTJDK3NhbnMtc2VyaWYmZndEZWZhdWx0PWJvbGQmZnNEZWZhdWx0PTEuMWVtJmNvcm5lclJhZGl1cz04cHgmYmdDb2xvckhlYWRlcj04MTc4NjUmYmdUZXh0dXJlSGVhZGVyPTEyX2dsb3NzX3dhdmUucG5nJmJnSW1nT3BhY2l0eUhlYWRlcj00NSZib3JkZXJDb2xvckhlYWRlcj00OTQ0MzcmZmNIZWFkZXI9ZmZmZmZmJmljb25Db2xvckhlYWRlcj1mYWRjN2EmYmdDb2xvckNvbnRlbnQ9ZmVlZWJkJmJnVGV4dHVyZUNvbnRlbnQ9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUNvbnRlbnQ9MTAwJmJvcmRlckNvbG9yQ29udGVudD04ZTg0NmImZmNDb250ZW50PTM4MzgzOCZpY29uQ29sb3JDb250ZW50PWQxOTQwNSZiZ0NvbG9yRGVmYXVsdD1mZWNlMmYmYmdUZXh0dXJlRGVmYXVsdD0xMl9nbG9zc193YXZlLnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTYwJmJvcmRlckNvbG9yRGVmYXVsdD1kMTk0MDUmZmNEZWZhdWx0PTRjMzAwMCZpY29uQ29sb3JEZWZhdWx0PTNkM2QzZCZiZ0NvbG9ySG92ZXI9ZmZkZDU3JmJnVGV4dHVyZUhvdmVyPTEyX2dsb3NzX3dhdmUucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTcwJmJvcmRlckNvbG9ySG92ZXI9YTQ1YjEzJmZjSG92ZXI9MzgxZjAwJmljb25Db2xvckhvdmVyPWJkN2IwMCZiZ0NvbG9yQWN0aXZlPWZmZmZmZiZiZ1RleHR1cmVBY3RpdmU9MDVfaW5zZXRfc29mdC5wbmcmYmdJbWdPcGFjaXR5QWN0aXZlPTMwJmJvcmRlckNvbG9yQWN0aXZlPTY1NWU0ZSZmY0FjdGl2ZT0wMDc0YzcmaWNvbkNvbG9yQWN0aXZlPWViOTkwZiZiZ0NvbG9ySGlnaGxpZ2h0PWZmZjllNSZiZ1RleHR1cmVIaWdobGlnaHQ9MTJfZ2xvc3Nfd2F2ZS5wbmcmYmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTkwJmJvcmRlckNvbG9ySGlnaGxpZ2h0PWVlYjQyMCZmY0hpZ2hsaWdodD0xZjFmMWYmaWNvbkNvbG9ySGlnaGxpZ2h0PWVkOWYyNiZiZ0NvbG9yRXJyb3I9ZDM0ZDE3JmJnVGV4dHVyZUVycm9yPTA3X2RpYWdvbmFsc19tZWRpdW0ucG5nJmJnSW1nT3BhY2l0eUVycm9yPTIwJmJvcmRlckNvbG9yRXJyb3I9ZmZiNzNkJmZjRXJyb3I9ZmZmZmZmJmljb25Db2xvckVycm9yPWZmZTE4MCZiZ0NvbG9yT3ZlcmxheT01YzVjNWMmYmdUZXh0dXJlT3ZlcmxheT0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTUwJm9wYWNpdHlPdmVybGF5PTgwJmJnQ29sb3JTaGFkb3c9Y2NjY2NjJmJnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9MzAmb3BhY2l0eVNoYWRvdz02MCZ0aGlja25lc3NTaGFkb3c9N3B4Jm9mZnNldFRvcFNoYWRvdz0tN3B4Jm9mZnNldExlZnRTaGFkb3c9LTdweCZjb3JuZXJSYWRpdXNTaGFkb3c9OHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfc3VubnkucG5nIiBhbHQ9IlN1bm55IiB0aXRsZT0iU3VubnkiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+U3Vubnk8L3NwYW4+CQk8L2E+PC9saT4JCQkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1UcmVidWNoZXQrTVMlMkMrSGVsdmV0aWNhJTJDK0FyaWFsJTJDK3NhbnMtc2VyaWYmZndEZWZhdWx0PWJvbGQmZnNEZWZhdWx0PTEuMWVtJmNvcm5lclJhZGl1cz02cHgmYmdDb2xvckhlYWRlcj1kZGRkZGQmYmdUZXh0dXJlSGVhZGVyPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlIZWFkZXI9MzUmYm9yZGVyQ29sb3JIZWFkZXI9YmJiYmJiJmZjSGVhZGVyPTQ0NDQ0NCZpY29uQ29sb3JIZWFkZXI9OTk5OTk5JmJnQ29sb3JDb250ZW50PWM5YzljOSZiZ1RleHR1cmVDb250ZW50PTA1X2luc2V0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUNvbnRlbnQ9NTAmYm9yZGVyQ29sb3JDb250ZW50PWFhYWFhYSZmY0NvbnRlbnQ9MzMzMzMzJmljb25Db2xvckNvbnRlbnQ9OTk5OTk5JmJnQ29sb3JEZWZhdWx0PWVlZWVlZSZiZ1RleHR1cmVEZWZhdWx0PTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTYwJmJvcmRlckNvbG9yRGVmYXVsdD1jY2NjY2MmZmNEZWZhdWx0PTMzODNiYiZpY29uQ29sb3JEZWZhdWx0PTcwYjJlMSZiZ0NvbG9ySG92ZXI9ZjhmOGY4JmJnVGV4dHVyZUhvdmVyPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlIb3Zlcj0xMDAmYm9yZGVyQ29sb3JIb3Zlcj1iYmJiYmImZmNIb3Zlcj01OTlmY2YmaWNvbkNvbG9ySG92ZXI9MzM4M2JiJmJnQ29sb3JBY3RpdmU9OTk5OTk5JmJnVGV4dHVyZUFjdGl2ZT0wNl9pbnNldF9oYXJkLnBuZyZiZ0ltZ09wYWNpdHlBY3RpdmU9NzUmYm9yZGVyQ29sb3JBY3RpdmU9OTk5OTk5JmZjQWN0aXZlPWZmZmZmZiZpY29uQ29sb3JBY3RpdmU9NDU0NTQ1JmJnQ29sb3JIaWdobGlnaHQ9ZWVlZWVlJmJnVGV4dHVyZUhpZ2hsaWdodD0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NTUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9ZmZmZmZmJmZjSGlnaGxpZ2h0PTQ0NDQ0NCZpY29uQ29sb3JIaWdobGlnaHQ9MzM4M2JiJmJnQ29sb3JFcnJvcj1jMDQwMmEmYmdUZXh0dXJlRXJyb3I9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5RXJyb3I9NTUmYm9yZGVyQ29sb3JFcnJvcj1jMDQwMmEmZmNFcnJvcj1mZmZmZmYmaWNvbkNvbG9yRXJyb3I9ZmJjODU2JmJnQ29sb3JPdmVybGF5PWVlZWVlZSZiZ1RleHR1cmVPdmVybGF5PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eU92ZXJsYXk9MCZvcGFjaXR5T3ZlcmxheT04MCZiZ0NvbG9yU2hhZG93PWFhYWFhYSZiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5U2hhZG93PTAmb3BhY2l0eVNoYWRvdz02MCZ0aGlja25lc3NTaGFkb3c9NHB4Jm9mZnNldFRvcFNoYWRvdz0tNHB4Jm9mZnNldExlZnRTaGFkb3c9LTRweCZjb3JuZXJSYWRpdXNTaGFkb3c9MHB4ZG93JTNEMHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfb3ZlcmNhc3QucG5nIiBhbHQ9Ik92ZXJjYXN0IiB0aXRsZT0iT3ZlcmNhc3QiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+T3ZlcmNhc3Q8L3NwYW4+CQkJCTwvYT48L2xpPgkJCQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PUx1Y2lkYStHcmFuZGUlMkMrTHVjaWRhK1NhbnMlMkMrQXJpYWwlMkMrc2Fucy1zZXJpZiZmd0RlZmF1bHQ9bm9ybWFsJmZzRGVmYXVsdD0xLjFlbSZjb3JuZXJSYWRpdXM9MTBweCZiZ0NvbG9ySGVhZGVyPTNhODEwNCZiZ1RleHR1cmVIZWFkZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhlYWRlcj0zMyZib3JkZXJDb2xvckhlYWRlcj0zZjc1MDYmZmNIZWFkZXI9ZmZmZmZmJmljb25Db2xvckhlYWRlcj1mZmZmZmYmYmdDb2xvckNvbnRlbnQ9Mjg1YzAwJmJnVGV4dHVyZUNvbnRlbnQ9MDVfaW5zZXRfc29mdC5wbmcmYmdJbWdPcGFjaXR5Q29udGVudD0xMCZib3JkZXJDb2xvckNvbnRlbnQ9NzJiNDJkJmZjQ29udGVudD1mZmZmZmYmaWNvbkNvbG9yQ29udGVudD03MmI0MmQmYmdDb2xvckRlZmF1bHQ9NGNhMjBiJmJnVGV4dHVyZURlZmF1bHQ9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eURlZmF1bHQ9NjAmYm9yZGVyQ29sb3JEZWZhdWx0PTQ1OTMwYiZmY0RlZmF1bHQ9ZmZmZmZmJmljb25Db2xvckRlZmF1bHQ9ZmZmZmZmJmJnQ29sb3JIb3Zlcj00ZWIzMDUmYmdUZXh0dXJlSG92ZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTUwJmJvcmRlckNvbG9ySG92ZXI9OGJkODNiJmZjSG92ZXI9ZmZmZmZmJmljb25Db2xvckhvdmVyPWZmZmZmZiZiZ0NvbG9yQWN0aXZlPTI4NWMwMCZiZ1RleHR1cmVBY3RpdmU9MDRfaGlnaGxpZ2h0X2hhcmQucG5nJmJnSW1nT3BhY2l0eUFjdGl2ZT0zMCZib3JkZXJDb2xvckFjdGl2ZT03MmI0MmQmZmNBY3RpdmU9ZmZmZmZmJmljb25Db2xvckFjdGl2ZT1mZmZmZmYmYmdDb2xvckhpZ2hsaWdodD1mYmY1ZDAmYmdUZXh0dXJlSGlnaGxpZ2h0PTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NTUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9ZjlkZDM0JmZjSGlnaGxpZ2h0PTM2MzYzNiZpY29uQ29sb3JIaWdobGlnaHQ9NGViMzA1JmJnQ29sb3JFcnJvcj1mZmRjMmUmYmdUZXh0dXJlRXJyb3I9MDhfZGlhZ29uYWxzX3RoaWNrLnBuZyZiZ0ltZ09wYWNpdHlFcnJvcj05NSZib3JkZXJDb2xvckVycm9yPWZhZDAwMCZmY0Vycm9yPTJiMmIyYiZpY29uQ29sb3JFcnJvcj1jZDBhMGEmYmdDb2xvck92ZXJsYXk9NDQ0NDQ0JmJnVGV4dHVyZU92ZXJsYXk9MDhfZGlhZ29uYWxzX3RoaWNrLnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTE1Jm9wYWNpdHlPdmVybGF5PTMwJmJnQ29sb3JTaGFkb3c9YWFhYWFhJmJnVGV4dHVyZVNoYWRvdz0wN19kaWFnb25hbHNfc21hbGwucG5nJmJnSW1nT3BhY2l0eVNoYWRvdz0wJm9wYWNpdHlTaGFkb3c9MzAmdGhpY2tuZXNzU2hhZG93PTBweCZvZmZzZXRUb3BTaGFkb3c9NHB4Jm9mZnNldExlZnRTaGFkb3c9NHB4JmNvcm5lclJhZGl1c1NoYWRvdz00cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9sZV9mcm9nLnBuZyIgYWx0PSJMZSBGcm9nIiB0aXRsZT0iTGUgRnJvZyIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5MZSBGcm9nPC9zcGFuPgkJPC9hPjwvbGk+CQkJCQkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1IZWx2ZXRpY2ElMkMrQXJpYWwlMkMrc2Fucy1zZXJpZiZmd0RlZmF1bHQ9Ym9sZCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTJweCZiZ0NvbG9ySGVhZGVyPWRkZGRkZCZiZ1RleHR1cmVIZWFkZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhlYWRlcj01MCZib3JkZXJDb2xvckhlYWRlcj1kZGRkZGQmZmNIZWFkZXI9NDQ0NDQ0Jmljb25Db2xvckhlYWRlcj0wMDczZWEmYmdDb2xvckNvbnRlbnQ9ZmZmZmZmJmJnVGV4dHVyZUNvbnRlbnQ9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5Q29udGVudD03NSZib3JkZXJDb2xvckNvbnRlbnQ9ZGRkZGRkJmZjQ29udGVudD00NDQ0NDQmaWNvbkNvbG9yQ29udGVudD1mZjAwODQmYmdDb2xvckRlZmF1bHQ9ZjZmNmY2JmJnVGV4dHVyZURlZmF1bHQ9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eURlZmF1bHQ9MTAwJmJvcmRlckNvbG9yRGVmYXVsdD1kZGRkZGQmZmNEZWZhdWx0PTAwNzNlYSZpY29uQ29sb3JEZWZhdWx0PTY2NjY2NiZiZ0NvbG9ySG92ZXI9MDA3M2VhJmJnVGV4dHVyZUhvdmVyPTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlIb3Zlcj0yNSZib3JkZXJDb2xvckhvdmVyPTAwNzNlYSZmY0hvdmVyPWZmZmZmZiZpY29uQ29sb3JIb3Zlcj1mZmZmZmYmYmdDb2xvckFjdGl2ZT1mZmZmZmYmYmdUZXh0dXJlQWN0aXZlPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlBY3RpdmU9NjUmYm9yZGVyQ29sb3JBY3RpdmU9ZGRkZGRkJmZjQWN0aXZlPWZmMDA4NCZpY29uQ29sb3JBY3RpdmU9NDU0NTQ1JmJnQ29sb3JIaWdobGlnaHQ9ZmZmZmZmJmJnVGV4dHVyZUhpZ2hsaWdodD0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NTUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9Y2NjY2NjJmZjSGlnaGxpZ2h0PTQ0NDQ0NCZpY29uQ29sb3JIaWdobGlnaHQ9MDA3M2VhJmJnQ29sb3JFcnJvcj1mZmZmZmYmYmdUZXh0dXJlRXJyb3I9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5RXJyb3I9NTUmYm9yZGVyQ29sb3JFcnJvcj1mZjAwODQmZmNFcnJvcj0yMjIyMjImaWNvbkNvbG9yRXJyb3I9ZmYwMDg0JmJnQ29sb3JPdmVybGF5PWVlZWVlZSZiZ1RleHR1cmVPdmVybGF5PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eU92ZXJsYXk9MCZvcGFjaXR5T3ZlcmxheT04MCZiZ0NvbG9yU2hhZG93PWFhYWFhYSZiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5U2hhZG93PTAmb3BhY2l0eVNoYWRvdz02MCZ0aGlja25lc3NTaGFkb3c9NHB4Jm9mZnNldFRvcFNoYWRvdz0tNHB4Jm9mZnNldExlZnRTaGFkb3c9LTRweCZjb3JuZXJSYWRpdXNTaGFkb3c9MHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfZmxpY2sucG5nIiBhbHQ9IkZsaWNrIiB0aXRsZT0iRmxpY2siIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+RmxpY2s8L3NwYW4+CQkJCTwvYT48L2xpPgkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1UcmVidWNoZXQrTVMlMkMrVGFob21hJTJDK1ZlcmRhbmElMkMrQXJpYWwlMkMrc2Fucy1zZXJpZiZmd0RlZmF1bHQ9Ym9sZCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTZweCZiZ0NvbG9ySGVhZGVyPWZmZmZmZiZiZ1RleHR1cmVIZWFkZXI9MjNfZmluZV9ncmFpbi5wbmcmYmdJbWdPcGFjaXR5SGVhZGVyPTE1JmJvcmRlckNvbG9ySGVhZGVyPWQ0ZDFiZiZmY0hlYWRlcj00NTM4MjEmaWNvbkNvbG9ySGVhZGVyPWI4MzQwMCZiZ0NvbG9yQ29udGVudD1lY2VhZGYmYmdUZXh0dXJlQ29udGVudD0yM19maW5lX2dyYWluLnBuZyZiZ0ltZ09wYWNpdHlDb250ZW50PTEwJmJvcmRlckNvbG9yQ29udGVudD1kOWQ2YzQmZmNDb250ZW50PTFmMWYxZiZpY29uQ29sb3JDb250ZW50PTIyMjIyMiZiZ0NvbG9yRGVmYXVsdD1mOGY3ZjYmYmdUZXh0dXJlRGVmYXVsdD0yM19maW5lX2dyYWluLnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTEwJmJvcmRlckNvbG9yRGVmYXVsdD1jYmM3YmQmZmNEZWZhdWx0PTY1NGIyNCZpY29uQ29sb3JEZWZhdWx0PWI4MzQwMCZiZ0NvbG9ySG92ZXI9NjU0YjI0JmJnVGV4dHVyZUhvdmVyPTIzX2ZpbmVfZ3JhaW4ucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTY1JmJvcmRlckNvbG9ySG92ZXI9NjU0YjI0JmZjSG92ZXI9ZmZmZmZmJmljb25Db2xvckhvdmVyPWZmZmZmZiZiZ0NvbG9yQWN0aXZlPWVjZWFkZiZiZ1RleHR1cmVBY3RpdmU9MjNfZmluZV9ncmFpbi5wbmcmYmdJbWdPcGFjaXR5QWN0aXZlPTE1JmJvcmRlckNvbG9yQWN0aXZlPWQ5ZDZjNCZmY0FjdGl2ZT0xNDBmMDYmaWNvbkNvbG9yQWN0aXZlPThjMjkxZCZiZ0NvbG9ySGlnaGxpZ2h0PWY3ZjNkZSZiZ1RleHR1cmVIaWdobGlnaHQ9MjNfZmluZV9ncmFpbi5wbmcmYmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTE1JmJvcmRlckNvbG9ySGlnaGxpZ2h0PWIyYTI2NiZmY0hpZ2hsaWdodD0zYTM0MjcmaWNvbkNvbG9ySGlnaGxpZ2h0PTM1NzJhYyZiZ0NvbG9yRXJyb3I9YjgzNDAwJmJnVGV4dHVyZUVycm9yPTIzX2ZpbmVfZ3JhaW4ucG5nJmJnSW1nT3BhY2l0eUVycm9yPTY4JmJvcmRlckNvbG9yRXJyb3I9NjgxODE4JmZjRXJyb3I9ZmZmZmZmJmljb25Db2xvckVycm9yPWZiZGI5MyZiZ0NvbG9yT3ZlcmxheT02ZTRmMWMmYmdUZXh0dXJlT3ZlcmxheT0xNl9kaWFnb25hbF9tYXplLnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTIwJm9wYWNpdHlPdmVybGF5PTYwJmJnQ29sb3JTaGFkb3c9MDAwMDAwJmJnVGV4dHVyZVNoYWRvdz0xNl9kaWFnb25hbF9tYXplLnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9NDAmb3BhY2l0eVNoYWRvdz02MCZ0aGlja25lc3NTaGFkb3c9NXB4Jm9mZnNldFRvcFNoYWRvdz0wJm9mZnNldExlZnRTaGFkb3c9LTEwcHgmY29ybmVyUmFkaXVzU2hhZG93PTE4cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9wZXBwZXJfZ3JpbmRlci5wbmciIGFsdD0iUGVwcGVyIEdyaW5kZXIiIHRpdGxlPSJQZXBwZXIgR3JpbmRlciIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5QZXBwZXIgR3JpbmRlcjwvc3Bhbj4JCQkJPC9hPjwvbGk+CQkJCQkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1MdWNpZGErR3JhbmRlJTJDK0x1Y2lkYStTYW5zJTJDK0FyaWFsJTJDK3NhbnMtc2VyaWYmZndEZWZhdWx0PWJvbGQmZnNEZWZhdWx0PTEuMWVtJmNvcm5lclJhZGl1cz02cHgmYmdDb2xvckhlYWRlcj0zMDI3M2EmYmdUZXh0dXJlSGVhZGVyPTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlIZWFkZXI9MjUmYm9yZGVyQ29sb3JIZWFkZXI9MjMxZDJiJmZjSGVhZGVyPWZmZmZmZiZpY29uQ29sb3JIZWFkZXI9YThhM2FlJmJnQ29sb3JDb250ZW50PTNkMzY0NCZiZ1RleHR1cmVDb250ZW50PTEyX2dsb3NzX3dhdmUucG5nJmJnSW1nT3BhY2l0eUNvbnRlbnQ9MzAmYm9yZGVyQ29sb3JDb250ZW50PTdlNzc4MyZmY0NvbnRlbnQ9ZmZmZmZmJmljb25Db2xvckNvbnRlbnQ9ZmZmZmZmJmJnQ29sb3JEZWZhdWx0PWRjZDlkZSZiZ1RleHR1cmVEZWZhdWx0PTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTEwMCZib3JkZXJDb2xvckRlZmF1bHQ9ZGNkOWRlJmZjRGVmYXVsdD02NjU4NzQmaWNvbkNvbG9yRGVmYXVsdD04ZDc4YTUmYmdDb2xvckhvdmVyPWVhZTZlYSZiZ1RleHR1cmVIb3Zlcj0wM19oaWdobGlnaHRfc29mdC5wbmcmYmdJbWdPcGFjaXR5SG92ZXI9MTAwJmJvcmRlckNvbG9ySG92ZXI9ZDFjNWQ4JmZjSG92ZXI9NzM0ZDk5Jmljb25Db2xvckhvdmVyPTczNGQ5OSZiZ0NvbG9yQWN0aXZlPTVmNTk2NCZiZ1RleHR1cmVBY3RpdmU9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUFjdGl2ZT00NSZib3JkZXJDb2xvckFjdGl2ZT03ZTc3ODMmZmNBY3RpdmU9ZmZmZmZmJmljb25Db2xvckFjdGl2ZT00NTQ1NDUmYmdDb2xvckhpZ2hsaWdodD1mYWZhZmEmYmdUZXh0dXJlSGlnaGxpZ2h0PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZib3JkZXJDb2xvckhpZ2hsaWdodD1mZmRiMWYmZmNIaWdobGlnaHQ9MzMzMzMzJmljb25Db2xvckhpZ2hsaWdodD04ZDc4YTUmYmdDb2xvckVycm9yPTk5NGQ1MyZiZ1RleHR1cmVFcnJvcj0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlFcnJvcj01NSZib3JkZXJDb2xvckVycm9yPTk5NGQ1MyZmY0Vycm9yPWZmZmZmZiZpY29uQ29sb3JFcnJvcj1lYmNjY2UmYmdDb2xvck92ZXJsYXk9ZWVlZWVlJmJnVGV4dHVyZU92ZXJsYXk9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5T3ZlcmxheT0wJm9wYWNpdHlPdmVybGF5PTgwJmJnQ29sb3JTaGFkb3c9YWFhYWFhJmJnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9MCZvcGFjaXR5U2hhZG93PTYwJnRoaWNrbmVzc1NoYWRvdz00cHgmb2Zmc2V0VG9wU2hhZG93PS00cHgmb2Zmc2V0TGVmdFNoYWRvdz0tNHB4JmNvcm5lclJhZGl1c1NoYWRvdz0wcHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9lZ2dwbGFudC5wbmciIGFsdD0iRWdncGxhbnQiIHRpdGxlPSJFZ2dwbGFudCIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5FZ2dwbGFudDwvc3Bhbj4JCQkJPC9hPjwvbGk+CQkJCQkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1WZXJkYW5hJTJDK0FyaWFsJTJDK3NhbnMtc2VyaWYmZndEZWZhdWx0PW5vcm1hbCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTZweCZiZ0NvbG9ySGVhZGVyPTQ0NDQ0NCZiZ1RleHR1cmVIZWFkZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhlYWRlcj00NCZib3JkZXJDb2xvckhlYWRlcj0zMzMzMzMmZmNIZWFkZXI9ZmZmZmZmJmljb25Db2xvckhlYWRlcj1mZmZmZmYmYmdDb2xvckNvbnRlbnQ9MDAwMDAwJmJnVGV4dHVyZUNvbnRlbnQ9MTRfbG9vcC5wbmcmYmdJbWdPcGFjaXR5Q29udGVudD0yNSZib3JkZXJDb2xvckNvbnRlbnQ9NTU1NTU1JmZjQ29udGVudD1mZmZmZmYmaWNvbkNvbG9yQ29udGVudD1jY2NjY2MmYmdDb2xvckRlZmF1bHQ9MjIyMjIyJmJnVGV4dHVyZURlZmF1bHQ9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eURlZmF1bHQ9MzUmYm9yZGVyQ29sb3JEZWZhdWx0PTQ0NDQ0NCZmY0RlZmF1bHQ9ZWVlZWVlJmljb25Db2xvckRlZmF1bHQ9Y2NjY2NjJmJnQ29sb3JIb3Zlcj0wMDMxNDcmYmdUZXh0dXJlSG92ZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTMzJmJvcmRlckNvbG9ySG92ZXI9MGI5M2Q1JmZjSG92ZXI9ZmZmZmZmJmljb25Db2xvckhvdmVyPWZmZmZmZiZiZ0NvbG9yQWN0aXZlPTA5NzJhNSZiZ1RleHR1cmVBY3RpdmU9MDRfaGlnaGxpZ2h0X2hhcmQucG5nJmJnSW1nT3BhY2l0eUFjdGl2ZT0yMCZib3JkZXJDb2xvckFjdGl2ZT0yNmIzZjcmZmNBY3RpdmU9ZmZmZmZmJmljb25Db2xvckFjdGl2ZT0yMjIyMjImYmdDb2xvckhpZ2hsaWdodD1lZWVlZWUmYmdUZXh0dXJlSGlnaGxpZ2h0PTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9ODAmYm9yZGVyQ29sb3JIaWdobGlnaHQ9Y2NjY2NjJmZjSGlnaGxpZ2h0PTJlN2RiMiZpY29uQ29sb3JIaWdobGlnaHQ9NGI4ZTBiJmJnQ29sb3JFcnJvcj1mZmM3M2QmYmdUZXh0dXJlRXJyb3I9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUVycm9yPTQwJmJvcmRlckNvbG9yRXJyb3I9ZmZiNzNkJmZjRXJyb3I9MTExMTExJmljb25Db2xvckVycm9yPWE4MzMwMCZiZ0NvbG9yT3ZlcmxheT01YzVjNWMmYmdUZXh0dXJlT3ZlcmxheT0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTUwJm9wYWNpdHlPdmVybGF5PTgwJmJnQ29sb3JTaGFkb3c9Y2NjY2NjJmJnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9MzAmb3BhY2l0eVNoYWRvdz02MCZ0aGlja25lc3NTaGFkb3c9N3B4Jm9mZnNldFRvcFNoYWRvdz0tN3B4Jm9mZnNldExlZnRTaGFkb3c9LTdweCZjb3JuZXJSYWRpdXNTaGFkb3c9OHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfZGFya19oaXZlLnBuZyIgYWx0PSJEYXJrIEhpdmUiIHRpdGxlPSJEYXJrIEhpdmUiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+RGFyayBIaXZlPC9zcGFuPgkJPC9hPjwvbGk+CQkJCQkJCQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PUx1Y2lkYStHcmFuZGUlMkMrTHVjaWRhK1NhbnMlMkMrQXJpYWwlMkMrc2Fucy1zZXJpZiZmd0RlZmF1bHQ9Ym9sZCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTZweCZiZ0NvbG9ySGVhZGVyPWRlZWRmNyZiZ1RleHR1cmVIZWFkZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhlYWRlcj0xMDAmYm9yZGVyQ29sb3JIZWFkZXI9YWVkMGVhJmZjSGVhZGVyPTIyMjIyMiZpY29uQ29sb3JIZWFkZXI9NzJhN2NmJmJnQ29sb3JDb250ZW50PWYyZjVmNyZiZ1RleHR1cmVDb250ZW50PTA0X2hpZ2hsaWdodF9oYXJkLnBuZyZiZ0ltZ09wYWNpdHlDb250ZW50PTEwMCZib3JkZXJDb2xvckNvbnRlbnQ9ZGRkZGRkJmZjQ29udGVudD0zNjJiMzYmaWNvbkNvbG9yQ29udGVudD03MmE3Y2YmYmdDb2xvckRlZmF1bHQ9ZDdlYmY5JmJnVGV4dHVyZURlZmF1bHQ9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eURlZmF1bHQ9ODAmYm9yZGVyQ29sb3JEZWZhdWx0PWFlZDBlYSZmY0RlZmF1bHQ9Mjc3OWFhJmljb25Db2xvckRlZmF1bHQ9M2Q4MGIzJmJnQ29sb3JIb3Zlcj1lNGYxZmImYmdUZXh0dXJlSG92ZXI9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTEwMCZib3JkZXJDb2xvckhvdmVyPTc0YjJlMiZmY0hvdmVyPTAwNzBhMyZpY29uQ29sb3JIb3Zlcj0yNjk0ZTgmYmdDb2xvckFjdGl2ZT0zYmFhZTMmYmdUZXh0dXJlQWN0aXZlPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlBY3RpdmU9NTAmYm9yZGVyQ29sb3JBY3RpdmU9MjY5NGU4JmZjQWN0aXZlPWZmZmZmZiZpY29uQ29sb3JBY3RpdmU9ZmZmZmZmJmJnQ29sb3JIaWdobGlnaHQ9ZmZlZjhmJmJnVGV4dHVyZUhpZ2hsaWdodD0wM19oaWdobGlnaHRfc29mdC5wbmcmYmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTI1JmJvcmRlckNvbG9ySGlnaGxpZ2h0PWY5ZGQzNCZmY0hpZ2hsaWdodD0zNjM2MzYmaWNvbkNvbG9ySGlnaGxpZ2h0PTJlODNmZiZiZ0NvbG9yRXJyb3I9Y2QwYTBhJmJnVGV4dHVyZUVycm9yPTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eUVycm9yPTE1JmJvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmZjRXJyb3I9ZmZmZmZmJmljb25Db2xvckVycm9yPWZmZmZmZiZiZ0NvbG9yT3ZlcmxheT1lZWVlZWUmYmdUZXh0dXJlT3ZlcmxheT0wOF9kaWFnb25hbHNfdGhpY2sucG5nJmJnSW1nT3BhY2l0eU92ZXJsYXk9OTAmb3BhY2l0eU92ZXJsYXk9ODAmYmdDb2xvclNoYWRvdz0wMDAwMDAmYmdUZXh0dXJlU2hhZG93PTA0X2hpZ2hsaWdodF9oYXJkLnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9NzAmb3BhY2l0eVNoYWRvdz0zMCZ0aGlja25lc3NTaGFkb3c9N3B4Jm9mZnNldFRvcFNoYWRvdz0tN3B4Jm9mZnNldExlZnRTaGFkb3c9LTdweCZjb3JuZXJSYWRpdXNTaGFkb3c9OHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfY3VwZXJ0aW5vLnBuZyIgYWx0PSJDdXBlcnRpbm8iIHRpdGxlPSJDdXBlcnRpbm8iIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+Q3VwZXJ0aW5vPC9zcGFuPgkJCQk8L2E+PC9saT4JCQkJPGxpPjxhIGhyZWY9Imh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvY3NzL3BhcnNlVGhlbWUuY3NzLnBocD9mZkRlZmF1bHQ9c2Vnb2UrdWklMkMrQXJpYWwlMkMrc2Fucy1zZXJpZiZmd0RlZmF1bHQ9Ym9sZCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTZweCZiZ0NvbG9ySGVhZGVyPWVjZThkYSZiZ1RleHR1cmVIZWFkZXI9MTJfZ2xvc3Nfd2F2ZS5wbmcmYmdJbWdPcGFjaXR5SGVhZGVyPTEwMCZib3JkZXJDb2xvckhlYWRlcj1kNGNjYjAmZmNIZWFkZXI9NDMzZjM4Jmljb25Db2xvckhlYWRlcj04NDdlNzEmYmdDb2xvckNvbnRlbnQ9ZjVmM2U1JmJnVGV4dHVyZUNvbnRlbnQ9MDRfaGlnaGxpZ2h0X2hhcmQucG5nJmJnSW1nT3BhY2l0eUNvbnRlbnQ9MTAwJmJvcmRlckNvbG9yQ29udGVudD1kZmQ5YzMmZmNDb250ZW50PTMxMmUyNSZpY29uQ29sb3JDb250ZW50PTgwODA4MCZiZ0NvbG9yRGVmYXVsdD00NTllMDAmYmdUZXh0dXJlRGVmYXVsdD0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYmdJbWdPcGFjaXR5RGVmYXVsdD0xNSZib3JkZXJDb2xvckRlZmF1bHQ9MzI3RTA0JmZjRGVmYXVsdD1mZmZmZmYmaWNvbkNvbG9yRGVmYXVsdD1lZWVlZWUmYmdDb2xvckhvdmVyPTY3YjAyMSZiZ1RleHR1cmVIb3Zlcj0wM19oaWdobGlnaHRfc29mdC5wbmcmYmdJbWdPcGFjaXR5SG92ZXI9MjUmYm9yZGVyQ29sb3JIb3Zlcj0zMjdFMDQmZmNIb3Zlcj1mZmZmZmYmaWNvbkNvbG9ySG92ZXI9ZmZmZmZmJmJnQ29sb3JBY3RpdmU9ZmFmYWY0JmJnVGV4dHVyZUFjdGl2ZT0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYmdJbWdPcGFjaXR5QWN0aXZlPTEwMCZib3JkZXJDb2xvckFjdGl2ZT1kNGNjYjAmZmNBY3RpdmU9NDU5ZTAwJmljb25Db2xvckFjdGl2ZT04REMyNjImYmdDb2xvckhpZ2hsaWdodD1mY2YwYmEmYmdUZXh0dXJlSGlnaGxpZ2h0PTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NTUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9ZThlMWI1JmZjSGlnaGxpZ2h0PTM2MzYzNiZpY29uQ29sb3JIaWdobGlnaHQ9OERDMjYyJmJnQ29sb3JFcnJvcj1mZmVkYWQmYmdUZXh0dXJlRXJyb3I9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUVycm9yPTk1JmJvcmRlckNvbG9yRXJyb3I9ZTNhMzQ1JmZjRXJyb3I9Y2Q1YzBhJmljb25Db2xvckVycm9yPWNkMGEwYSZiZ0NvbG9yT3ZlcmxheT0yYjI5MjImYmdUZXh0dXJlT3ZlcmxheT0wNV9pbnNldF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTE1Jm9wYWNpdHlPdmVybGF5PTkwJmJnQ29sb3JTaGFkb3c9Y2NjY2NjJmJnVGV4dHVyZVNoYWRvdz0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYmdJbWdPcGFjaXR5U2hhZG93PTk1Jm9wYWNpdHlTaGFkb3c9MjAmdGhpY2tuZXNzU2hhZG93PTEycHgmb2Zmc2V0VG9wU2hhZG93PS0xMnB4Jm9mZnNldExlZnRTaGFkb3c9LTEycHgmY29ybmVyUmFkaXVzU2hhZG93PTEwcHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9zb3V0aF9zdHJlZXQucG5nIiBhbHQ9IlNvdXRoIFN0IiB0aXRsZT0iU291dGggU3QiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+U291dGggU3RyZWV0PC9zcGFuPgkJCQk8L2E+PC9saT4JCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PUFyaWFsLHNhbnMtc2VyaWYmZndEZWZhdWx0PWJvbGQmZnNEZWZhdWx0PTEuMWVtJmNvcm5lclJhZGl1cz02cHgmYmdDb2xvckhlYWRlcj1jYzAwMDAmYmdUZXh0dXJlSGVhZGVyPTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlIZWFkZXI9MTUmYm9yZGVyQ29sb3JIZWFkZXI9ZTNhMWExJmZjSGVhZGVyPWZmZmZmZiZpY29uQ29sb3JIZWFkZXI9ZmZmZmZmJmJnQ29sb3JDb250ZW50PWZmZmZmZiZiZ1RleHR1cmVDb250ZW50PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eUNvbnRlbnQ9NzUmYm9yZGVyQ29sb3JDb250ZW50PWVlZWVlZSZmY0NvbnRlbnQ9MzMzMzMzJmljb25Db2xvckNvbnRlbnQ9Y2MwMDAwJmJnQ29sb3JEZWZhdWx0PWVlZWVlZSZiZ1RleHR1cmVEZWZhdWx0PTA0X2hpZ2hsaWdodF9oYXJkLnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTEwMCZib3JkZXJDb2xvckRlZmF1bHQ9ZDhkY2RmJmZjRGVmYXVsdD0wMDQyNzYmaWNvbkNvbG9yRGVmYXVsdD1jYzAwMDAmYmdDb2xvckhvdmVyPWY2ZjZmNiZiZ1RleHR1cmVIb3Zlcj0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYmdJbWdPcGFjaXR5SG92ZXI9MTAwJmJvcmRlckNvbG9ySG92ZXI9Y2RkNWRhJmZjSG92ZXI9MTExMTExJmljb25Db2xvckhvdmVyPWNjMDAwMCZiZ0NvbG9yQWN0aXZlPWZmZmZmZiZiZ1RleHR1cmVBY3RpdmU9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5QWN0aXZlPTY1JmJvcmRlckNvbG9yQWN0aXZlPWVlZWVlZSZmY0FjdGl2ZT1jYzAwMDAmaWNvbkNvbG9yQWN0aXZlPWNjMDAwMCZiZ0NvbG9ySGlnaGxpZ2h0PWZiZjhlZSZiZ1RleHR1cmVIaWdobGlnaHQ9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZib3JkZXJDb2xvckhpZ2hsaWdodD1mY2QzYTEmZmNIaWdobGlnaHQ9NDQ0NDQ0Jmljb25Db2xvckhpZ2hsaWdodD0wMDQyNzYmYmdDb2xvckVycm9yPWYzZDhkOCZiZ1RleHR1cmVFcnJvcj0wOF9kaWFnb25hbHNfdGhpY2sucG5nJmJnSW1nT3BhY2l0eUVycm9yPTc1JmJvcmRlckNvbG9yRXJyb3I9Y2MwMDAwJmZjRXJyb3I9MmUyZTJlJmljb25Db2xvckVycm9yPWNjMDAwMCZiZ0NvbG9yT3ZlcmxheT1hNmE2YTYmYmdUZXh0dXJlT3ZlcmxheT0wOV9kb3RzX3NtYWxsLnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTY1Jm9wYWNpdHlPdmVybGF5PTQwJmJnQ29sb3JTaGFkb3c9MzMzMzMzJmJnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9MCZvcGFjaXR5U2hhZG93PTEwJnRoaWNrbmVzc1NoYWRvdz04cHgmb2Zmc2V0VG9wU2hhZG93PS04cHgmb2Zmc2V0TGVmdFNoYWRvdz0tOHB4JmNvcm5lclJhZGl1c1NoYWRvdz04cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9ibGl0emVyLnBuZyIgYWx0PSJCbGl0emVyIiB0aXRsZT0iQmxpdHplciIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5CbGl0emVyPC9zcGFuPgkJPC9hPjwvbGk+CQkJPGxpPjxhIGhyZWY9Imh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvY3NzL3BhcnNlVGhlbWUuY3NzLnBocD90cj1mZkRlZmF1bHQ9SGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWYmYW1wO2Z3RGVmYXVsdD1ub3JtYWwmYW1wO2ZzRGVmYXVsdD0xLjFlbSZhbXA7Y29ybmVyUmFkaXVzPTZweCZhbXA7YmdDb2xvckhlYWRlcj1jYjg0MmUmYW1wO2JnVGV4dHVyZUhlYWRlcj0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhlYWRlcj0yNSZhbXA7Ym9yZGVyQ29sb3JIZWFkZXI9ZDQ5NzY4JmFtcDtmY0hlYWRlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhlYWRlcj1mZmZmZmYmYW1wO2JnQ29sb3JDb250ZW50PWY0ZjBlYyZhbXA7YmdUZXh0dXJlQ29udGVudD0wNV9pbnNldF9zb2Z0LnBuZyZhbXA7YmdJbWdPcGFjaXR5Q29udGVudD0xMDAmYW1wO2JvcmRlckNvbG9yQ29udGVudD1lMGNmYzImYW1wO2ZjQ29udGVudD0xZTFiMWQmYW1wO2ljb25Db2xvckNvbnRlbnQ9YzQ3YTIzJmFtcDtiZ0NvbG9yRGVmYXVsdD1lZGU0ZDQmYW1wO2JnVGV4dHVyZURlZmF1bHQ9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlEZWZhdWx0PTcwJmFtcDtib3JkZXJDb2xvckRlZmF1bHQ9Y2RjM2I3JmFtcDtmY0RlZmF1bHQ9M2YzNzMxJmFtcDtpY29uQ29sb3JEZWZhdWx0PWYwODAwMCZhbXA7YmdDb2xvckhvdmVyPWY1ZjBlNSZhbXA7YmdUZXh0dXJlSG92ZXI9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlIb3Zlcj0xMDAmYW1wO2JvcmRlckNvbG9ySG92ZXI9ZjVhZDY2JmFtcDtmY0hvdmVyPWE0NjMxMyZhbXA7aWNvbkNvbG9ySG92ZXI9ZjA4MDAwJmFtcDtiZ0NvbG9yQWN0aXZlPWY0ZjBlYyZhbXA7YmdUZXh0dXJlQWN0aXZlPTA0X2hpZ2hsaWdodF9oYXJkLnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTEwMCZhbXA7Ym9yZGVyQ29sb3JBY3RpdmU9ZTBjZmMyJmFtcDtmY0FjdGl2ZT1iODU3MDAmYW1wO2ljb25Db2xvckFjdGl2ZT1mMzVmMDcmYW1wO2JnQ29sb3JIaWdobGlnaHQ9ZjVmNWI1JmFtcDtiZ1RleHR1cmVIaWdobGlnaHQ9MDRfaGlnaGxpZ2h0X2hhcmQucG5nJmFtcDtiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NzUmYW1wO2JvcmRlckNvbG9ySGlnaGxpZ2h0PWQ5YmI3MyZhbXA7ZmNIaWdobGlnaHQ9MDYwMjAwJmFtcDtpY29uQ29sb3JIaWdobGlnaHQ9Y2I2NzJiJmFtcDtiZ0NvbG9yRXJyb3I9ZmVlNGJkJmFtcDtiZ1RleHR1cmVFcnJvcj0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYW1wO2JnSW1nT3BhY2l0eUVycm9yPTY1JmFtcDtib3JkZXJDb2xvckVycm9yPWY4ODkzZiZhbXA7ZmNFcnJvcj01OTIwMDMmYW1wO2ljb25Db2xvckVycm9yPWZmNzUxOSZhbXA7YmdDb2xvck92ZXJsYXk9YWFhYWFhJmFtcDtiZ1RleHR1cmVPdmVybGF5PTAxX2ZsYXQucG5nJmFtcDtiZ0ltZ09wYWNpdHlPdmVybGF5PTc1JmFtcDtvcGFjaXR5T3ZlcmxheT0zMCZhbXA7YmdDb2xvclNoYWRvdz1hYWFhYWEmYW1wO2JnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZhbXA7YmdJbWdPcGFjaXR5U2hhZG93PTc1JmFtcDtvcGFjaXR5U2hhZG93PTMwJmFtcDt0aGlja25lc3NTaGFkb3c9OHB4JmFtcDtvZmZzZXRUb3BTaGFkb3c9LThweCZhbXA7b2Zmc2V0TGVmdFNoYWRvdz0tOHB4JmFtcDtjb3JuZXJSYWRpdXNTaGFkb3c9OHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfaHVtYW5pdHkucG5nIiBhbHQ9Ikh1bWFuaXR5IiB0aXRsZT0iSHVtYW5pdHkiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+SHVtYW5pdHk8L3NwYW4+CQk8L2E+PC9saT4JCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1HaWxsK1NhbnMsQXJpYWwsc2Fucy1zZXJpZiZhbXA7ZndEZWZhdWx0PWJvbGQmYW1wO2ZzRGVmYXVsdD0xLjJlbSZhbXA7Y29ybmVyUmFkaXVzPTRweCZhbXA7YmdDb2xvckhlYWRlcj0zNTQxNGYmYW1wO2JnVGV4dHVyZUhlYWRlcj0wOV9kb3RzX3NtYWxsLnBuZyZhbXA7YmdJbWdPcGFjaXR5SGVhZGVyPTM1JmFtcDtib3JkZXJDb2xvckhlYWRlcj0yYzQzNTkmYW1wO2ZjSGVhZGVyPWUxZTQ2MyZhbXA7aWNvbkNvbG9ySGVhZGVyPWUxZTQ2MyZhbXA7YmdDb2xvckNvbnRlbnQ9ZmZmZmZmJmFtcDtiZ1RleHR1cmVDb250ZW50PTAxX2ZsYXQucG5nJmFtcDtiZ0ltZ09wYWNpdHlDb250ZW50PTc1JmFtcDtib3JkZXJDb2xvckNvbnRlbnQ9YWFhYWFhJmFtcDtmY0NvbnRlbnQ9MmM0MzU5JmFtcDtpY29uQ29sb3JDb250ZW50PWMwMjY2OSZhbXA7YmdDb2xvckRlZmF1bHQ9OTNjM2NkJmFtcDtiZ1RleHR1cmVEZWZhdWx0PTA3X2RpYWdvbmFsc19zbWFsbC5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9NTAmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD05M2MzY2QmYW1wO2ZjRGVmYXVsdD0zMzMzMzMmYW1wO2ljb25Db2xvckRlZmF1bHQ9ZmZmZmZmJmFtcDtiZ0NvbG9ySG92ZXI9Y2NkMjMyJmFtcDtiZ1RleHR1cmVIb3Zlcj0wN19kaWFnb25hbHNfc21hbGwucG5nJmFtcDtiZ0ltZ09wYWNpdHlIb3Zlcj03NSZhbXA7Ym9yZGVyQ29sb3JIb3Zlcj05OTk5OTkmYW1wO2ZjSG92ZXI9MjEyMTIxJmFtcDtpY29uQ29sb3JIb3Zlcj00NTQ1NDUmYW1wO2JnQ29sb3JBY3RpdmU9ZGI0ODY1JmFtcDtiZ1RleHR1cmVBY3RpdmU9MDdfZGlhZ29uYWxzX3NtYWxsLnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTQwJmFtcDtib3JkZXJDb2xvckFjdGl2ZT1mZjZiN2YmYW1wO2ZjQWN0aXZlPWZmZmZmZiZhbXA7aWNvbkNvbG9yQWN0aXZlPWZmZmZmZiZhbXA7YmdDb2xvckhpZ2hsaWdodD1mZmZmMzgmYW1wO2JnVGV4dHVyZUhpZ2hsaWdodD0xMF9kb3RzX21lZGl1bS5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD04MCZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9YjRkMTAwJmFtcDtmY0hpZ2hsaWdodD0zNjM2MzYmYW1wO2ljb25Db2xvckhpZ2hsaWdodD04OGEyMDYmYW1wO2JnQ29sb3JFcnJvcj1mZjM4NTMmYW1wO2JnVGV4dHVyZUVycm9yPTA3X2RpYWdvbmFsc19zbWFsbC5wbmcmYW1wO2JnSW1nT3BhY2l0eUVycm9yPTUwJmFtcDtib3JkZXJDb2xvckVycm9yPWZmNmI3ZiZhbXA7ZmNFcnJvcj1mZmZmZmYmYW1wO2ljb25Db2xvckVycm9yPWZmZWIzMyZhbXA7YmdDb2xvck92ZXJsYXk9ZjdmN2JhJmFtcDtiZ1RleHR1cmVPdmVybGF5PTExX3doaXRlX2xpbmVzLnBuZyZhbXA7YmdJbWdPcGFjaXR5T3ZlcmxheT04NSZhbXA7b3BhY2l0eU92ZXJsYXk9ODAmYW1wO2JnQ29sb3JTaGFkb3c9YmE5MjE3JmFtcDtiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eVNoYWRvdz03NSZhbXA7b3BhY2l0eVNoYWRvdz0yMCZhbXA7dGhpY2tuZXNzU2hhZG93PTEwcHgmYW1wO29mZnNldFRvcFNoYWRvdz04cHgmYW1wO29mZnNldExlZnRTaGFkb3c9OHB4JmFtcDtjb3JuZXJSYWRpdXNTaGFkb3c9NXB4Ij4JCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9ob3Rfc25lYWtzLnBuZyIgYWx0PSJIb3QgU25lYWtzIiB0aXRsZT0iSG90IFNuZWFrcyIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5Ib3Qgc25lYWtzPC9zcGFuPgkJPC9hPjwvbGk+CQkJPGxpPjxhIGhyZWY9Imh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvY3NzL3BhcnNlVGhlbWUuY3NzLnBocD9mZkRlZmF1bHQ9c2Vnb2UrdWksK0FyaWFsLCtzYW5zLXNlcmlmJmFtcDtmd0RlZmF1bHQ9Ym9sZCZhbXA7ZnNEZWZhdWx0PTEuMWVtJmFtcDtjb3JuZXJSYWRpdXM9M3B4JmFtcDtiZ0NvbG9ySGVhZGVyPWY5ZjlmOSZhbXA7YmdUZXh0dXJlSGVhZGVyPTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZhbXA7YmdJbWdPcGFjaXR5SGVhZGVyPTEwMCZhbXA7Ym9yZGVyQ29sb3JIZWFkZXI9Y2NjY2NjJmFtcDtmY0hlYWRlcj1lNjk3MDAmYW1wO2ljb25Db2xvckhlYWRlcj01ZmE1ZTMmYW1wO2JnQ29sb3JDb250ZW50PWVlZWVlZSZhbXA7YmdUZXh0dXJlQ29udGVudD0wNl9pbnNldF9oYXJkLnBuZyZhbXA7YmdJbWdPcGFjaXR5Q29udGVudD0xMDAmYW1wO2JvcmRlckNvbG9yQ29udGVudD1hYWFhYWEmYW1wO2ZjQ29udGVudD0yMjIyMjImYW1wO2ljb25Db2xvckNvbnRlbnQ9MGE4MmViJmFtcDtiZ0NvbG9yRGVmYXVsdD0xNDg0ZTYmYW1wO2JnVGV4dHVyZURlZmF1bHQ9MDhfZGlhZ29uYWxzX3RoaWNrLnBuZyZhbXA7YmdJbWdPcGFjaXR5RGVmYXVsdD0yMiZhbXA7Ym9yZGVyQ29sb3JEZWZhdWx0PWZmZmZmZiZhbXA7ZmNEZWZhdWx0PWZmZmZmZiZhbXA7aWNvbkNvbG9yRGVmYXVsdD1mY2RkNGEmYW1wO2JnQ29sb3JIb3Zlcj0yMjkzZjcmYW1wO2JnVGV4dHVyZUhvdmVyPTA4X2RpYWdvbmFsc190aGljay5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTI2JmFtcDtib3JkZXJDb2xvckhvdmVyPTIyOTNmNyZhbXA7ZmNIb3Zlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhvdmVyPWZmZmZmZiZhbXA7YmdDb2xvckFjdGl2ZT1lNjk3MDAmYW1wO2JnVGV4dHVyZUFjdGl2ZT0wOF9kaWFnb25hbHNfdGhpY2sucG5nJmFtcDtiZ0ltZ09wYWNpdHlBY3RpdmU9MjAmYW1wO2JvcmRlckNvbG9yQWN0aXZlPWU2OTcwMCZhbXA7ZmNBY3RpdmU9ZmZmZmZmJmFtcDtpY29uQ29sb3JBY3RpdmU9ZmZmZmZmJmFtcDtiZ0NvbG9ySGlnaGxpZ2h0PWM1ZGRmYyZhbXA7YmdUZXh0dXJlSGlnaGxpZ2h0PTA3X2RpYWdvbmFsc19zbWFsbC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD0yNSZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9ZmZmZmZmJmFtcDtmY0hpZ2hsaWdodD0zMzMzMzMmYW1wO2ljb25Db2xvckhpZ2hsaWdodD0wYjU0ZDUmYW1wO2JnQ29sb3JFcnJvcj1lNjk3MDAmYW1wO2JnVGV4dHVyZUVycm9yPTA4X2RpYWdvbmFsc190aGljay5wbmcmYW1wO2JnSW1nT3BhY2l0eUVycm9yPTIwJmFtcDtib3JkZXJDb2xvckVycm9yPWU2OTcwMCZhbXA7ZmNFcnJvcj1mZmZmZmYmYW1wO2ljb25Db2xvckVycm9yPWZmZmZmZiZhbXA7YmdDb2xvck92ZXJsYXk9ZTZiOTAwJmFtcDtiZ1RleHR1cmVPdmVybGF5PTAxX2ZsYXQucG5nJmFtcDtiZ0ltZ09wYWNpdHlPdmVybGF5PTAmYW1wO29wYWNpdHlPdmVybGF5PTMwJmFtcDtiZ0NvbG9yU2hhZG93PWU2OTcwMCZhbXA7YmdUZXh0dXJlU2hhZG93PTAxX2ZsYXQucG5nJmFtcDtiZ0ltZ09wYWNpdHlTaGFkb3c9MCZhbXA7b3BhY2l0eVNoYWRvdz0yMCZhbXA7dGhpY2tuZXNzU2hhZG93PTBweCZhbXA7b2Zmc2V0VG9wU2hhZG93PTZweCZhbXA7b2Zmc2V0TGVmdFNoYWRvdz02cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz0zcHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9leGNpdGVfYmlrZS5wbmciIGFsdD0iRXhjaXRlIEJpa2UiIHRpdGxlPSJFeGNpdGUgQmlrZSIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5FeGNpdGUgQmlrZTwvc3Bhbj4JCQk8L2E+PC9saT4JCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/dHImYW1wO2ZmRGVmYXVsdD1IZWx2ZXRpY2EsK0FyaWFsLCtzYW5zLXNlcmlmJmFtcDtmd0RlZmF1bHQ9bm9ybWFsJmFtcDtmc0RlZmF1bHQ9MS4xJmFtcDtmc0RlZmF1bHRVbml0PWVtJmFtcDtjb3JuZXJSYWRpdXM9NSZhbXA7Y29ybmVyUmFkaXVzVW5pdD1weCZhbXA7YmdDb2xvckhlYWRlcj04ODg4ODgmYW1wO2JnVGV4dHVyZUhlYWRlcj0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhlYWRlcj0xNSZhbXA7Ym9yZGVyQ29sb3JIZWFkZXI9NDA0MDQwJmFtcDtmY0hlYWRlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhlYWRlcj1jY2NjY2MmYW1wO2JnQ29sb3JDb250ZW50PTEyMTIxMiZhbXA7YmdUZXh0dXJlQ29udGVudD0xMl9nbG9zc193YXZlLnBuZyZhbXA7YmdJbWdPcGFjaXR5Q29udGVudD0xNiZhbXA7Ym9yZGVyQ29sb3JDb250ZW50PTQwNDA0MCZhbXA7ZmNDb250ZW50PWVlZWVlZSZhbXA7aWNvbkNvbG9yQ29udGVudD1iYmJiYmImYW1wO2JnQ29sb3JEZWZhdWx0PWFkYWRhZCZhbXA7YmdUZXh0dXJlRGVmYXVsdD0wM19oaWdobGlnaHRfc29mdC5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9MzUmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD1jY2NjY2MmYW1wO2ZjRGVmYXVsdD0zMzMzMzMmYW1wO2ljb25Db2xvckRlZmF1bHQ9NjY2NjY2JmFtcDtiZ0NvbG9ySG92ZXI9ZGRkZGRkJmFtcDtiZ1RleHR1cmVIb3Zlcj0wM19oaWdobGlnaHRfc29mdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTYwJmFtcDtib3JkZXJDb2xvckhvdmVyPWRkZGRkZCZhbXA7ZmNIb3Zlcj0wMDAwMDAmYW1wO2ljb25Db2xvckhvdmVyPWM5ODAwMCZhbXA7YmdDb2xvckFjdGl2ZT0xMjEyMTImYW1wO2JnVGV4dHVyZUFjdGl2ZT0wNV9pbnNldF9zb2Z0LnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTE1JmFtcDtib3JkZXJDb2xvckFjdGl2ZT0wMDAwMDAmYW1wO2ZjQWN0aXZlPWZmZmZmZiZhbXA7aWNvbkNvbG9yQWN0aXZlPWYyOWEwMCZhbXA7YmdDb2xvckhpZ2hsaWdodD01NTU1NTUmYW1wO2JnVGV4dHVyZUhpZ2hsaWdodD0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9NDA0MDQwJmFtcDtmY0hpZ2hsaWdodD1jY2NjY2MmYW1wO2ljb25Db2xvckhpZ2hsaWdodD1hYWFhYWEmYW1wO2JnQ29sb3JFcnJvcj1mZWYxZWMmYW1wO2JnVGV4dHVyZUVycm9yPTAyX2dsYXNzLnBuZyZhbXA7YmdJbWdPcGFjaXR5RXJyb3I9OTUmYW1wO2JvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmFtcDtmY0Vycm9yPWNkMGEwYSZhbXA7aWNvbkNvbG9yRXJyb3I9Y2QwYTBhIj4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfYmxhY2tfbWF0dGUucG5nIiBhbHQ9IlZhZGVyIiB0aXRsZT0iVmFkZXIiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+VmFkZXI8L3NwYW4+CQkJPC9hPjwvbGk+CQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PUFyaWFsLCtzYW5zLXNlcmlmJmFtcDtmd0RlZmF1bHQ9Ym9sZCZhbXA7ZnNEZWZhdWx0PTEuM2VtJmFtcDtjb3JuZXJSYWRpdXM9NHB4JmFtcDtiZ0NvbG9ySGVhZGVyPTBiM2U2ZiZhbXA7YmdUZXh0dXJlSGVhZGVyPTA4X2RpYWdvbmFsc190aGljay5wbmcmYW1wO2JnSW1nT3BhY2l0eUhlYWRlcj0xNSZhbXA7Ym9yZGVyQ29sb3JIZWFkZXI9MGIzZTZmJmFtcDtmY0hlYWRlcj1mNmY2ZjYmYW1wO2ljb25Db2xvckhlYWRlcj05OGQyZmImYW1wO2JnQ29sb3JDb250ZW50PTExMTExMSZhbXA7YmdUZXh0dXJlQ29udGVudD0xMl9nbG9zc193YXZlLnBuZyZhbXA7YmdJbWdPcGFjaXR5Q29udGVudD0yMCZhbXA7Ym9yZGVyQ29sb3JDb250ZW50PTAwMDAwMCZhbXA7ZmNDb250ZW50PWQ5ZDlkOSZhbXA7aWNvbkNvbG9yQ29udGVudD05Y2NkZmMmYW1wO2JnQ29sb3JEZWZhdWx0PTMzMzMzMyZhbXA7YmdUZXh0dXJlRGVmYXVsdD0wOV9kb3RzX3NtYWxsLnBuZyZhbXA7YmdJbWdPcGFjaXR5RGVmYXVsdD0yMCZhbXA7Ym9yZGVyQ29sb3JEZWZhdWx0PTMzMzMzMyZhbXA7ZmNEZWZhdWx0PWZmZmZmZiZhbXA7aWNvbkNvbG9yRGVmYXVsdD05Y2NkZmMmYW1wO2JnQ29sb3JIb3Zlcj0wMDQ5OGYmYW1wO2JnVGV4dHVyZUhvdmVyPTA5X2RvdHNfc21hbGwucG5nJmFtcDtiZ0ltZ09wYWNpdHlIb3Zlcj00MCZhbXA7Ym9yZGVyQ29sb3JIb3Zlcj0yMjIyMjImYW1wO2ZjSG92ZXI9ZmZmZmZmJmFtcDtpY29uQ29sb3JIb3Zlcj1mZmZmZmYmYW1wO2JnQ29sb3JBY3RpdmU9MjkyOTI5JmFtcDtiZ1RleHR1cmVBY3RpdmU9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUFjdGl2ZT00MCZhbXA7Ym9yZGVyQ29sb3JBY3RpdmU9MDk2YWM4JmFtcDtmY0FjdGl2ZT03NWFiZmYmYW1wO2ljb25Db2xvckFjdGl2ZT0wMDQ5OGYmYW1wO2JnQ29sb3JIaWdobGlnaHQ9MGI1OGEyJmFtcDtiZ1RleHR1cmVIaWdobGlnaHQ9MTBfZG90c19tZWRpdW0ucG5nJmFtcDtiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9MzAmYW1wO2JvcmRlckNvbG9ySGlnaGxpZ2h0PTA1MmY1NyZhbXA7ZmNIaWdobGlnaHQ9ZmZmZmZmJmFtcDtpY29uQ29sb3JIaWdobGlnaHQ9ZmZmZmZmJmFtcDtiZ0NvbG9yRXJyb3I9YTMyZDAwJmFtcDtiZ1RleHR1cmVFcnJvcj0wOV9kb3RzX3NtYWxsLnBuZyZhbXA7YmdJbWdPcGFjaXR5RXJyb3I9MzAmYW1wO2JvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmFtcDtmY0Vycm9yPWZmZmZmZiZhbXA7aWNvbkNvbG9yRXJyb3I9ZmZmZmZmJmFtcDtiZ0NvbG9yT3ZlcmxheT1hYWFhYWEmYW1wO2JnVGV4dHVyZU92ZXJsYXk9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eU92ZXJsYXk9MCZhbXA7b3BhY2l0eU92ZXJsYXk9MzAmYW1wO2JnQ29sb3JTaGFkb3c9YWFhYWFhJmFtcDtiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eVNoYWRvdz0wJmFtcDtvcGFjaXR5U2hhZG93PTMwJmFtcDt0aGlja25lc3NTaGFkb3c9OHB4JmFtcDtvZmZzZXRUb3BTaGFkb3c9LThweCZhbXA7b2Zmc2V0TGVmdFNoYWRvdz0tOHB4JmFtcDtjb3JuZXJSYWRpdXNTaGFkb3c9OHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfZG90X2x1di5wbmciIGFsdD0iRG90IEx1diIgdGl0bGU9IkRvdCBMdXYiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+RG90IEx1djwvc3Bhbj4JCQk8L2E+PC9saT4JCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1TZWdvZStVSSUyQytIZWx2ZXRpY2ElMkMrQXJpYWwlMkMrc2Fucy1zZXJpZiZmd0RlZmF1bHQ9Ym9sZCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTRweCZiZ0NvbG9ySGVhZGVyPTQ1MzMyNiZiZ1RleHR1cmVIZWFkZXI9MTJfZ2xvc3Nfd2F2ZS5wbmcmYmdJbWdPcGFjaXR5SGVhZGVyPTI1JmJvcmRlckNvbG9ySGVhZGVyPTY5NTY0OSZmY0hlYWRlcj1lM2RkYzkmaWNvbkNvbG9ySGVhZGVyPWUzZGRjOSZiZ0NvbG9yQ29udGVudD0yMDE5MTMmYmdUZXh0dXJlQ29udGVudD0wNV9pbnNldF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlDb250ZW50PTEwJmJvcmRlckNvbG9yQ29udGVudD05Yzk0N2MmZmNDb250ZW50PWZmZmZmZiZpY29uQ29sb3JDb250ZW50PTIyMjIyMiZiZ0NvbG9yRGVmYXVsdD0xYzE2MGQmYmdUZXh0dXJlRGVmYXVsdD0xMl9nbG9zc193YXZlLnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTIwJmJvcmRlckNvbG9yRGVmYXVsdD02OTU0NDQmZmNEZWZhdWx0PTliY2M2MCZpY29uQ29sb3JEZWZhdWx0PTliY2M2MCZiZ0NvbG9ySG92ZXI9NDQzNzJjJmJnVGV4dHVyZUhvdmVyPTEyX2dsb3NzX3dhdmUucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTMwJmJvcmRlckNvbG9ySG92ZXI9OWM5NDdjJmZjSG92ZXI9YmFlYzdlJmljb25Db2xvckhvdmVyPWFkZDk3OCZiZ0NvbG9yQWN0aXZlPTIwMTkxMyZiZ1RleHR1cmVBY3RpdmU9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUFjdGl2ZT0yMCZib3JkZXJDb2xvckFjdGl2ZT05Yzk0N2MmZmNBY3RpdmU9ZTNkZGM5Jmljb25Db2xvckFjdGl2ZT1lM2RkYzkmYmdDb2xvckhpZ2hsaWdodD02MTkyMjYmYmdUZXh0dXJlSGlnaGxpZ2h0PTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9MjAmYm9yZGVyQ29sb3JIaWdobGlnaHQ9YWRkOTc4JmZjSGlnaGxpZ2h0PWZmZmZmZiZpY29uQ29sb3JIaWdobGlnaHQ9ZmZmZmZmJmJnQ29sb3JFcnJvcj01ZjM5MWImYmdUZXh0dXJlRXJyb3I9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUVycm9yPTE1JmJvcmRlckNvbG9yRXJyb3I9NWYzOTFiJmZjRXJyb3I9ZmZmZmZmJmljb25Db2xvckVycm9yPWYxZmQ4NiZiZ0NvbG9yT3ZlcmxheT1hYWFhYWEmYmdUZXh0dXJlT3ZlcmxheT0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTAmb3BhY2l0eU92ZXJsYXk9MzAmYmdDb2xvclNoYWRvdz1hYWFhYWEmYmdUZXh0dXJlU2hhZG93PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eVNoYWRvdz0wJm9wYWNpdHlTaGFkb3c9MzAmdGhpY2tuZXNzU2hhZG93PThweCZvZmZzZXRUb3BTaGFkb3c9LThweCZvZmZzZXRMZWZ0U2hhZG93PS04cHgmY29ybmVyUmFkaXVzU2hhZG93PThweCI+CQkJPGltZyBzcmM9Imh0dHA6Ly9sZWFybmluZ2pxdWVyeS5rc3dlZGJlcmcubmV0ZG5hLWNkbi5jb20vd3AtY29udGVudC91cGxvYWRzL3RoZW1lcm9sbGVyL3RoZW1lXzkwX21pbnRfY2hvY28ucG5nIiBhbHQ9Ik1pbnQgQ2hvYyIgdGl0bGU9Ik1pbnQgQ2hvYyIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5NaW50IENob2M8L3NwYW4+CQk8L2E+PC9saT4JCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PVZlcmRhbmEsK0FyaWFsLCtzYW5zLXNlcmlmJmFtcDtmd0RlZmF1bHQ9bm9ybWFsJmFtcDtmc0RlZmF1bHQ9MS4xZW0mYW1wO2Nvcm5lclJhZGl1cz00cHgmYW1wO2JnQ29sb3JIZWFkZXI9MzMzMzMzJmFtcDtiZ1RleHR1cmVIZWFkZXI9MDhfZGlhZ29uYWxzX3RoaWNrLnBuZyZhbXA7YmdJbWdPcGFjaXR5SGVhZGVyPTgmYW1wO2JvcmRlckNvbG9ySGVhZGVyPWEzYTNhMyZhbXA7ZmNIZWFkZXI9ZWVlZWVlJmFtcDtpY29uQ29sb3JIZWFkZXI9YmJiYmJiJmFtcDtiZ0NvbG9yQ29udGVudD1mOWY5ZjkmYW1wO2JnVGV4dHVyZUNvbnRlbnQ9MDRfaGlnaGxpZ2h0X2hhcmQucG5nJmFtcDtiZ0ltZ09wYWNpdHlDb250ZW50PTEwMCZhbXA7Ym9yZGVyQ29sb3JDb250ZW50PWNjY2NjYyZhbXA7ZmNDb250ZW50PTIyMjIyMiZhbXA7aWNvbkNvbG9yQ29udGVudD0yMjIyMjImYW1wO2JnQ29sb3JEZWZhdWx0PTExMTExMSZhbXA7YmdUZXh0dXJlRGVmYXVsdD0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9NDAmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD03Nzc3NzcmYW1wO2ZjRGVmYXVsdD1lM2UzZTMmYW1wO2ljb25Db2xvckRlZmF1bHQ9ZWRlZGVkJmFtcDtiZ0NvbG9ySG92ZXI9MWMxYzFjJmFtcDtiZ1RleHR1cmVIb3Zlcj0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTU1JmFtcDtib3JkZXJDb2xvckhvdmVyPTAwMDAwMCZhbXA7ZmNIb3Zlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhvdmVyPWZmZmZmZiZhbXA7YmdDb2xvckFjdGl2ZT1mZmZmZmYmYW1wO2JnVGV4dHVyZUFjdGl2ZT0wMV9mbGF0LnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTY1JmFtcDtib3JkZXJDb2xvckFjdGl2ZT1jY2NjY2MmYW1wO2ZjQWN0aXZlPTIyMjIyMiZhbXA7aWNvbkNvbG9yQWN0aXZlPTIyMjIyMiZhbXA7YmdDb2xvckhpZ2hsaWdodD1mZmViODAmYW1wO2JnVGV4dHVyZUhpZ2hsaWdodD0wNl9pbnNldF9oYXJkLnBuZyZhbXA7YmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTU1JmFtcDtib3JkZXJDb2xvckhpZ2hsaWdodD1mZmRlMmUmYW1wO2ZjSGlnaGxpZ2h0PTM2MzYzNiZhbXA7aWNvbkNvbG9ySGlnaGxpZ2h0PTRjYTMwMCZhbXA7YmdDb2xvckVycm9yPWNkMGEwYSZhbXA7YmdUZXh0dXJlRXJyb3I9MDZfaW5zZXRfaGFyZC5wbmcmYW1wO2JnSW1nT3BhY2l0eUVycm9yPTQ1JmFtcDtib3JkZXJDb2xvckVycm9yPTllMDUwNSZhbXA7ZmNFcnJvcj1mZmZmZmYmYW1wO2ljb25Db2xvckVycm9yPWZmY2YyOSZhbXA7YmdDb2xvck92ZXJsYXk9YWFhYWFhJmFtcDtiZ1RleHR1cmVPdmVybGF5PTA0X2hpZ2hsaWdodF9oYXJkLnBuZyZhbXA7YmdJbWdPcGFjaXR5T3ZlcmxheT00MCZhbXA7b3BhY2l0eU92ZXJsYXk9MzAmYW1wO2JnQ29sb3JTaGFkb3c9YWFhYWFhJmFtcDtiZ1RleHR1cmVTaGFkb3c9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmFtcDtiZ0ltZ09wYWNpdHlTaGFkb3c9NTAmYW1wO29wYWNpdHlTaGFkb3c9MjAmYW1wO3RoaWNrbmVzc1NoYWRvdz04cHgmYW1wO29mZnNldFRvcFNoYWRvdz0tOHB4JmFtcDtvZmZzZXRMZWZ0U2hhZG93PS04cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz04cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9ibGFja190aWUucG5nIiBhbHQ9IkJsYWNrIFRpZSIgdGl0bGU9IkJsYWNrIFRpZSIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5CbGFjayBUaWU8L3NwYW4+CQk8L2E+PC9saT4JCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PVNlZ29lK1VJLCtIZWx2ZXRpY2EsK0FyaWFsLCtzYW5zLXNlcmlmJmFtcDtmd0RlZmF1bHQ9Ym9sZCZhbXA7ZnNEZWZhdWx0PTEuMWVtJmFtcDtjb3JuZXJSYWRpdXM9NnB4JmFtcDtiZ0NvbG9ySGVhZGVyPTlmZGE1OCZhbXA7YmdUZXh0dXJlSGVhZGVyPTEyX2dsb3NzX3dhdmUucG5nJmFtcDtiZ0ltZ09wYWNpdHlIZWFkZXI9ODUmYW1wO2JvcmRlckNvbG9ySGVhZGVyPTAwMDAwMCZhbXA7ZmNIZWFkZXI9MjIyMjIyJmFtcDtpY29uQ29sb3JIZWFkZXI9MWYxZjFmJmFtcDtiZ0NvbG9yQ29udGVudD0wMDAwMDAmYW1wO2JnVGV4dHVyZUNvbnRlbnQ9MTJfZ2xvc3Nfd2F2ZS5wbmcmYW1wO2JnSW1nT3BhY2l0eUNvbnRlbnQ9NTUmYW1wO2JvcmRlckNvbG9yQ29udGVudD00YTRhNGEmYW1wO2ZjQ29udGVudD1mZmZmZmYmYW1wO2ljb25Db2xvckNvbnRlbnQ9OWZkYTU4JmFtcDtiZ0NvbG9yRGVmYXVsdD0wYTBhMGEmYW1wO2JnVGV4dHVyZURlZmF1bHQ9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlEZWZhdWx0PTQwJmFtcDtib3JkZXJDb2xvckRlZmF1bHQ9MWIxNjEzJmFtcDtmY0RlZmF1bHQ9YjhlYzc5JmFtcDtpY29uQ29sb3JEZWZhdWx0PWI4ZWM3OSZhbXA7YmdDb2xvckhvdmVyPTAwMDAwMCZhbXA7YmdUZXh0dXJlSG92ZXI9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlIb3Zlcj02MCZhbXA7Ym9yZGVyQ29sb3JIb3Zlcj0wMDAwMDAmYW1wO2ZjSG92ZXI9OTZmMjI2JmFtcDtpY29uQ29sb3JIb3Zlcj1iOGVjNzkmYW1wO2JnQ29sb3JBY3RpdmU9NGM0YzRjJmFtcDtiZ1RleHR1cmVBY3RpdmU9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUFjdGl2ZT0wJmFtcDtib3JkZXJDb2xvckFjdGl2ZT02OTY5NjkmYW1wO2ZjQWN0aXZlPWZmZmZmZiZhbXA7aWNvbkNvbG9yQWN0aXZlPWZmZmZmZiZhbXA7YmdDb2xvckhpZ2hsaWdodD1mMWZiZTUmYW1wO2JnVGV4dHVyZUhpZ2hsaWdodD0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9OGNjZTNiJmFtcDtmY0hpZ2hsaWdodD0wMzAzMDMmYW1wO2ljb25Db2xvckhpZ2hsaWdodD0wMDAwMDAmYW1wO2JnQ29sb3JFcnJvcj1mNmVjZDUmYW1wO2JnVGV4dHVyZUVycm9yPTEyX2dsb3NzX3dhdmUucG5nJmFtcDtiZ0ltZ09wYWNpdHlFcnJvcj05NSZhbXA7Ym9yZGVyQ29sb3JFcnJvcj1mMWFjODgmYW1wO2ZjRXJyb3I9NzQ3MzZkJmFtcDtpY29uQ29sb3JFcnJvcj1jZDBhMGEmYW1wO2JnQ29sb3JPdmVybGF5PTI2MjYyNiZhbXA7YmdUZXh0dXJlT3ZlcmxheT0wN19kaWFnb25hbHNfc21hbGwucG5nJmFtcDtiZ0ltZ09wYWNpdHlPdmVybGF5PTUwJmFtcDtvcGFjaXR5T3ZlcmxheT0zMCZhbXA7YmdDb2xvclNoYWRvdz0zMDMwMzAmYW1wO2JnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZhbXA7YmdJbWdPcGFjaXR5U2hhZG93PTAmYW1wO29wYWNpdHlTaGFkb3c9NTAmYW1wO3RoaWNrbmVzc1NoYWRvdz02cHgmYW1wO29mZnNldFRvcFNoYWRvdz0tNnB4JmFtcDtvZmZzZXRMZWZ0U2hhZG93PS02cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz0xMnB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfdHJvbnRhc3RpYy5wbmciIGFsdD0iVHJvbnRhc3RpYyIgdGl0bGU9IlRyb250YXN0aWMiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+VHJvbnRhc3RpYzwvc3Bhbj4JCQk8L2E+PC9saT4JCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1HZW9yZ2lhJTJDK1ZlcmRhbmElMkNBcmlhbCUyQ3NhbnMtc2VyaWYmYW1wO2Z3RGVmYXVsdD1ib2xkJmFtcDtmc0RlZmF1bHQ9MS4yZW0mYW1wO2Nvcm5lclJhZGl1cz01cHgmYW1wO2JnQ29sb3JIZWFkZXI9MjYxODAzJmFtcDtiZ1RleHR1cmVIZWFkZXI9MTNfZGlhbW9uZC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhlYWRlcj04JmFtcDtib3JkZXJDb2xvckhlYWRlcj1iYWFhNWEmYW1wO2ZjSGVhZGVyPWVhY2Q4NiZhbXA7aWNvbkNvbG9ySGVhZGVyPWU5Y2Q4NiZhbXA7YmdDb2xvckNvbnRlbnQ9NDQzMTEzJmFtcDtiZ1RleHR1cmVDb250ZW50PTEzX2RpYW1vbmQucG5nJmFtcDtiZ0ltZ09wYWNpdHlDb250ZW50PTgmYW1wO2JvcmRlckNvbG9yQ29udGVudD1lZmVjOWYmYW1wO2ZjQ29udGVudD1lZmVjOWYmYW1wO2ljb25Db2xvckNvbnRlbnQ9ZWZlYzlmJmFtcDtiZ0NvbG9yRGVmYXVsdD00ZjQyMjEmYW1wO2JnVGV4dHVyZURlZmF1bHQ9MTNfZGlhbW9uZC5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9MTAmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD0zNjI5MTcmYW1wO2ZjRGVmYXVsdD1mOGVlYzkmYW1wO2ljb25Db2xvckRlZmF1bHQ9ZThlMmI1JmFtcDtiZ0NvbG9ySG92ZXI9Njc1NDIzJmFtcDtiZ1RleHR1cmVIb3Zlcj0xM19kaWFtb25kLnBuZyZhbXA7YmdJbWdPcGFjaXR5SG92ZXI9MjUmYW1wO2JvcmRlckNvbG9ySG92ZXI9MzYyOTE3JmFtcDtmY0hvdmVyPWY4ZWVjOSZhbXA7aWNvbkNvbG9ySG92ZXI9ZjJlYzY0JmFtcDtiZ0NvbG9yQWN0aXZlPTQ0MzExMyZhbXA7YmdUZXh0dXJlQWN0aXZlPTEzX2RpYW1vbmQucG5nJmFtcDtiZ0ltZ09wYWNpdHlBY3RpdmU9OCZhbXA7Ym9yZGVyQ29sb3JBY3RpdmU9ZWZlYzlmJmFtcDtmY0FjdGl2ZT1mOWYyYmQmYW1wO2ljb25Db2xvckFjdGl2ZT1mOWYyYmQmYW1wO2JnQ29sb3JIaWdobGlnaHQ9ZDVhYzVkJmFtcDtiZ1RleHR1cmVIaWdobGlnaHQ9MTNfZGlhbW9uZC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD0yNSZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9MzYyOTE3JmFtcDtmY0hpZ2hsaWdodD0wNjAyMDAmYW1wO2ljb25Db2xvckhpZ2hsaWdodD0wNzA2MDMmYW1wO2JnQ29sb3JFcnJvcj1mZWU0YmQmYW1wO2JnVGV4dHVyZUVycm9yPTA0X2hpZ2hsaWdodF9oYXJkLnBuZyZhbXA7YmdJbWdPcGFjaXR5RXJyb3I9NjUmYW1wO2JvcmRlckNvbG9yRXJyb3I9YzI2NjI5JmFtcDtmY0Vycm9yPTgwM2YxZSZhbXA7aWNvbkNvbG9yRXJyb3I9ZmY3NTE5JmFtcDtiZ0NvbG9yT3ZlcmxheT0zNzI4MDYmYW1wO2JnVGV4dHVyZU92ZXJsYXk9MTNfZGlhbW9uZC5wbmcmYW1wO2JnSW1nT3BhY2l0eU92ZXJsYXk9MjAmYW1wO29wYWNpdHlPdmVybGF5PTgwJmFtcDtiZ0NvbG9yU2hhZG93PWRkZDRiMCZhbXA7YmdUZXh0dXJlU2hhZG93PTAxX2ZsYXQucG5nJmFtcDtiZ0ltZ09wYWNpdHlTaGFkb3c9NzUmYW1wO29wYWNpdHlTaGFkb3c9MzAmYW1wO3RoaWNrbmVzc1NoYWRvdz04cHgmYW1wO29mZnNldFRvcFNoYWRvdz0tOHB4JmFtcDtvZmZzZXRMZWZ0U2hhZG93PS04cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz0xMnB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfc3dhbmt5X3B1cnNlLnBuZyIgYWx0PSJTd2Fua3kgUHVyc2UiIHRpdGxlPSJTd2Fua3kgUHVyc2UiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+U3dhbmt5IFB1cnNlPC9zcGFuPgkJCTwvYT48L2xpPgk8L3VsPjwvZGl2PjwvZGl2PicpLmZpbmQoJ2RpdicpLnJlbW92ZUF0dHIoJ2lkJyk7CgkKCS8vYnV0dG9uIGV2ZW50cwoJYnV0dG9uLmNsaWNrKAoJCWZ1bmN0aW9uKCl7CgkJCWlmKHN3aXRjaGVycGFuZS5pcygnOnZpc2libGUnKSl7IHN3aXRjaGVycGFuZS5zcEhpZGUoKTsgfQoJCQllbHNleyBzd2l0Y2hlcnBhbmUuc3BTaG93KCk7IH0KCQkJCQlyZXR1cm4gZmFsc2U7CgkJfQoJKTsKCQoJLy9tZW51IGV2ZW50cyAobW91c2VvdXQgZGlkbid0IHdvcmsuLi4pCglzd2l0Y2hlcnBhbmUuaG92ZXIoCgkJZnVuY3Rpb24oKXt9LAoJCWZ1bmN0aW9uKCl7aWYoc3dpdGNoZXJwYW5lLmlzKCc6dmlzaWJsZScpKXskKHRoaXMpLnNwSGlkZSgpO319CgkpOwoKCS8vc2hvdy9oaWRlIHBhbmVsIGZ1bmN0aW9ucwoJJC5mbi5zcFNob3cgPSBmdW5jdGlvbigpeyAkKHRoaXMpLmNzcyh7dG9wOiBidXR0b24ub2Zmc2V0KCkudG9wICsgb3B0aW9ucy5idXR0b25IZWlnaHQgKyA2LCBsZWZ0OiBidXR0b24ub2Zmc2V0KCkubGVmdH0pLnNsaWRlRG93big1MCk7IGJ1dHRvbi5jc3MoYnV0dG9uX2FjdGl2ZSk7IG9wdGlvbnMub25PcGVuKCk7IH0KCSQuZm4uc3BIaWRlID0gZnVuY3Rpb24oKXsgJCh0aGlzKS5zbGlkZVVwKDUwLCBmdW5jdGlvbigpe29wdGlvbnMub25DbG9zZSgpO30pOyBidXR0b24uY3NzKGJ1dHRvbl9kZWZhdWx0KTsgfQoJCgkJCgkvKiBUaGVtZSBMb2FkaW5nCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJc3dpdGNoZXJwYW5lLmZpbmQoJ2EnKS5jbGljayhmdW5jdGlvbigpewoJCXVwZGF0ZUNTUyggJCh0aGlzKS5hdHRyKCdocmVmJykgKTsKCQl2YXIgdGhlbWVOYW1lID0gJCh0aGlzKS5maW5kKCdzcGFuJykudGV4dCgpOwoJCWJ1dHRvbi5maW5kKCcuanF1ZXJ5LXVpLXRoZW1lc3dpdGNoZXItdGl0bGUnKS50ZXh0KCBvcHRpb25zLmJ1dHRvblByZVRleHQgKyB0aGVtZU5hbWUgKTsKCQkkLmNvb2tpZShvcHRpb25zLmNvb2tpZU5hbWUsIHRoZW1lTmFtZSk7CgkJb3B0aW9ucy5vblNlbGVjdCgpOwoJCWlmKG9wdGlvbnMuY2xvc2VPblNlbGVjdCAmJiBzd2l0Y2hlcnBhbmUuaXMoJzp2aXNpYmxlJykpeyBzd2l0Y2hlcnBhbmUuc3BIaWRlKCk7IH0KCQlyZXR1cm4gZmFsc2U7Cgl9KTsKCQoJLy9mdW5jdGlvbiB0byBhcHBlbmQgYSBuZXcgdGhlbWUgc3R5bGVzaGVldCB3aXRoIHRoZSBuZXcgc3R5bGUgY2hhbmdlcwoJZnVuY3Rpb24gdXBkYXRlQ1NTKGxvY1N0cil7CgkJdmFyIGNzc0xpbmsgPSAkKCc8bGluayBocmVmPSInK2xvY1N0cisnIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJTdHlsZXNoZWV0IiBjbGFzcz0idWktdGhlbWUiIC8+Jyk7CgkJJCgiaGVhZCIpLmFwcGVuZChjc3NMaW5rKTsKCQkKCQkKCQlpZiggJCgibGluay51aS10aGVtZSIpLnNpemUoKSA+IDMpewoJCQkkKCJsaW5rLnVpLXRoZW1lOmZpcnN0IikucmVtb3ZlKCk7CgkJfQkKCX0JCgkKCS8qIElubGluZSBDU1MgCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJdmFyIGJ1dHRvbl9kZWZhdWx0ID0gewoJCWZvbnRGYW1pbHk6ICdUcmVidWNoZXQgTVMsIFZlcmRhbmEsIHNhbnMtc2VyaWYnLAoJCWZvbnRTaXplOiAnMTFweCcsCgkJY29sb3I6ICcjNjY2JywKCQliYWNrZ3JvdW5kOiAnI2VlZSB1cmwoaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvYnV0dG9uYmcucG5nKSA1MCUgNTAlIHJlcGVhdC14JywKCQlib3JkZXI6ICcxcHggc29saWQgI2NjYycsCgkJJy1tb3otYm9yZGVyLXJhZGl1cyc6ICc2cHgnLAoJCSctd2Via2l0LWJvcmRlci1yYWRpdXMnOiAnNnB4JywKCQl0ZXh0RGVjb3JhdGlvbjogJ25vbmUnLAoJCXBhZGRpbmc6ICczcHggM3B4IDNweCA4cHgnLAoJCXdpZHRoOiBvcHRpb25zLndpZHRoIC0gMTEsLy9taW51cyBtdXN0IG1hdGNoIGxlZnQgYW5kIHJpZ2h0IHBhZGRpbmcgCgkJZGlzcGxheTogJ2Jsb2NrJywKCQloZWlnaHQ6IG9wdGlvbnMuYnV0dG9uSGVpZ2h0LAoJCW91dGxpbmU6ICcwJwoJfTsKCXZhciBidXR0b25faG92ZXIgPSB7CgkJJ2JvcmRlckNvbG9yJzonI2JiYicsCgkJJ2JhY2tncm91bmQnOiAnI2YwZjBmMCcsCgkJY3Vyc29yOiAncG9pbnRlcicsCgkJY29sb3I6ICcjNDQ0JwoJfTsKCXZhciBidXR0b25fYWN0aXZlID0gewoJCWNvbG9yOiAnI2FhYScsCgkJYmFja2dyb3VuZDogJyMwMDAnLAoJCWJvcmRlcjogJzFweCBzb2xpZCAjY2NjJywKCQlib3JkZXJCb3R0b206IDAsCgkJJy1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0JzogMCwKCQknLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzJzogMCwKCQknLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0JzogMCwKCQknLXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cyc6IDAsCgkJb3V0bGluZTogJzAnCgl9OwoJCgkKCQoJLy9idXR0b24gY3NzCglidXR0b24uY3NzKGJ1dHRvbl9kZWZhdWx0KQoJLmhvdmVyKAoJCWZ1bmN0aW9uKCl7IAoJCQkkKHRoaXMpLmNzcyhidXR0b25faG92ZXIpOyAKCQl9LAoJCWZ1bmN0aW9uKCl7IAoJCSBpZiggIXN3aXRjaGVycGFuZS5pcygnOmFuaW1hdGVkJykgJiYgc3dpdGNoZXJwYW5lLmlzKCc6aGlkZGVuJykgKXsJJCh0aGlzKS5jc3MoYnV0dG9uX2RlZmF1bHQpOyAgfQoJCX0JCgkpCgkuZmluZCgnLmpxdWVyeS11aS10aGVtZXN3aXRjaGVyLWljb24nKS5jc3MoewoJCSdmbG9hdCc6ICdyaWdodCcsCgkJd2lkdGg6ICcxNnB4JywKCQloZWlnaHQ6ICcxNnB4JywKCQliYWNrZ3JvdW5kOiAndXJsKGh0dHA6Ly9sZWFybmluZ2pxdWVyeS5rc3dlZGJlcmcubmV0ZG5hLWNkbi5jb20vd3AtY29udGVudC91cGxvYWRzL3RoZW1lcm9sbGVyL2ljb25fY29sb3JfYXJyb3cuZ2lmKSA1MCUgNTAlIG5vLXJlcGVhdCcKCX0pOwkKCS8vcGFuZSBjc3MKCXN3aXRjaGVycGFuZS5jc3MoewoJCXBvc2l0aW9uOiAnYWJzb2x1dGUnLAoJCSdmbG9hdCc6ICdsZWZ0JywKCQlmb250RmFtaWx5OiAnVHJlYnVjaGV0IE1TLCBWZXJkYW5hLCBzYW5zLXNlcmlmJywKCQlmb250U2l6ZTogJzEycHgnLAoJCWJhY2tncm91bmQ6ICcjMDAwJywKCQljb2xvcjogJyNmZmYnLAoJCXBhZGRpbmc6ICc4cHggM3B4IDNweCcsCgkJYm9yZGVyOiAnMXB4IHNvbGlkICNjY2MnLAoJCSctbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdCc6ICc2cHgnLAoJCSctd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMnOiAnNnB4JywKCQknLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0JzogJzZweCcsCgkJJy13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMnOiAnNnB4JywKCQlib3JkZXJUb3A6IDAsCgkJekluZGV4OiA5OTk5OTksCgkJd2lkdGg6IG9wdGlvbnMud2lkdGgtNi8vbWludXMgbXVzdCBtYXRjaCBsZWZ0IGFuZCByaWdodCBwYWRkaW5nCgl9KQoJLmZpbmQoJ3VsJykuY3NzKHsKCQlsaXN0U3R5bGU6ICdub25lJywKCQltYXJnaW46ICcwJywKCQlwYWRkaW5nOiAnMCcsCgkJb3ZlcmZsb3c6ICdhdXRvJywKCQloZWlnaHQ6IG9wdGlvbnMuaGVpZ2h0Cgl9KS5lbmQoKQoJLmZpbmQoJ2xpJykuaG92ZXIoCgkJZnVuY3Rpb24oKXsgCgkJCSQodGhpcykuY3NzKHsKCQkJCSdib3JkZXJDb2xvcic6JyM1NTUnLAoJCQkJJ2JhY2tncm91bmQnOiAndXJsKGh0dHA6Ly9sZWFybmluZ2pxdWVyeS5rc3dlZGJlcmcubmV0ZG5hLWNkbi5jb20vd3AtY29udGVudC91cGxvYWRzL3RoZW1lcm9sbGVyL21lbnVob3ZlcmJnLnBuZykgNTAlIDUwJSByZXBlYXQteCcsCgkJCQljdXJzb3I6ICdwb2ludGVyJwoJCQl9KTsgCgkJfSwKCQlmdW5jdGlvbigpeyAKCQkJJCh0aGlzKS5jc3MoewoJCQkJJ2JvcmRlckNvbG9yJzonIzExMScsCgkJCQknYmFja2dyb3VuZCc6ICcjMDAwJywKCQkJCWN1cnNvcjogJ2F1dG8nCgkJCX0pOyAKCQl9CgkpLmNzcyh7CgkJd2lkdGg6IG9wdGlvbnMud2lkdGgtMzAsCgkJaGVpZ2h0OiAnJywKCQlwYWRkaW5nOiAnMnB4JywKCQltYXJnaW46ICcxcHgnLAoJCWJvcmRlcjogJzFweCBzb2xpZCAjMTExJywKCQknLW1vei1ib3JkZXItcmFkaXVzJzogJzRweCcsCgkJY2xlYXI6ICdsZWZ0JywKCQknZmxvYXQnOiAnbGVmdCcKCX0pLmVuZCgpCgkuZmluZCgnYScpLmNzcyh7CgkJY29sb3I6ICcjYWFhJywKCQl0ZXh0RGVjb3JhdGlvbjogJ25vbmUnLAoJCSdmbG9hdCc6ICdsZWZ0JywKCQl3aWR0aDogJzEwMCUnLAoJCW91dGxpbmU6ICcwJwoJfSkuZW5kKCkKCS5maW5kKCdpbWcnKS5jc3MoewoJCSdmbG9hdCc6ICdsZWZ0JywKCQlib3JkZXI6ICcxcHggc29saWQgIzMzMycsCgkJbWFyZ2luOiAnMCAycHgnCgl9KS5lbmQoKQoJLmZpbmQoJy50aGVtZU5hbWUnKS5jc3MoewoJCSdmbG9hdCc6ICdsZWZ0JywKCQltYXJnaW46ICczcHggMCcKCX0pLmVuZCgpOwoJCgoKCSQodGhpcykuYXBwZW5kKGJ1dHRvbik7CgkkKCdib2R5JykuYXBwZW5kKHN3aXRjaGVycGFuZSk7Cglzd2l0Y2hlcnBhbmUuaGlkZSgpOwoJaWYoICQuY29va2llKG9wdGlvbnMuY29va2llTmFtZSkgfHwgb3B0aW9ucy5sb2FkVGhlbWUgKXsKCQl2YXIgdGhlbWVOYW1lID0gJC5jb29raWUob3B0aW9ucy5jb29raWVOYW1lKSB8fCBvcHRpb25zLmxvYWRUaGVtZTsKCQlzd2l0Y2hlcnBhbmUuZmluZCgnYTpjb250YWlucygnKyB0aGVtZU5hbWUgKycpJykudHJpZ2dlcignY2xpY2snKTsKCX0KCglyZXR1cm4gdGhpczsKfTsKCgoKCi8qKgogKiBDb29raWUgcGx1Z2luCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiBLbGF1cyBIYXJ0bCAoc3RpbGJ1ZXJvLmRlKQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlczoKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCiAqCiAqLwpqUXVlcnkuY29va2llID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIG9wdGlvbnMpIHsKICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3VuZGVmaW5lZCcpIHsgLy8gbmFtZSBhbmQgdmFsdWUgZ2l2ZW4sIHNldCBjb29raWUKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgdmFsdWUgPSAnJzsKICAgICAgICAgICAgb3B0aW9ucy5leHBpcmVzID0gLTE7CiAgICAgICAgfQogICAgICAgIHZhciBleHBpcmVzID0gJyc7CiAgICAgICAgaWYgKG9wdGlvbnMuZXhwaXJlcyAmJiAodHlwZW9mIG9wdGlvbnMuZXhwaXJlcyA9PSAnbnVtYmVyJyB8fCBvcHRpb25zLmV4cGlyZXMudG9VVENTdHJpbmcpKSB7CiAgICAgICAgICAgIHZhciBkYXRlOwogICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZXhwaXJlcyA9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyAob3B0aW9ucy5leHBpcmVzICogMjQgKiA2MCAqIDYwICogMTAwMCkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0ZSA9IG9wdGlvbnMuZXhwaXJlczsKICAgICAgICAgICAgfQogICAgICAgICAgICBleHBpcmVzID0gJzsgZXhwaXJlcz0nICsgZGF0ZS50b1VUQ1N0cmluZygpOyAvLyB1c2UgZXhwaXJlcyBhdHRyaWJ1dGUsIG1heC1hZ2UgaXMgbm90IHN1cHBvcnRlZCBieSBJRQogICAgICAgIH0KICAgICAgICAvLyBDQVVUSU9OOiBOZWVkZWQgdG8gcGFyZW50aGVzaXplIG9wdGlvbnMucGF0aCBhbmQgb3B0aW9ucy5kb21haW4KICAgICAgICAvLyBpbiB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb25zLCBvdGhlcndpc2UgdGhleSBldmFsdWF0ZSB0byB1bmRlZmluZWQKICAgICAgICAvLyBpbiB0aGUgcGFja2VkIHZlcnNpb24gZm9yIHNvbWUgcmVhc29uLi4uCiAgICAgICAgdmFyIHBhdGggPSBvcHRpb25zLnBhdGggPyAnOyBwYXRoPScgKyAob3B0aW9ucy5wYXRoKSA6ICcnOwogICAgICAgIHZhciBkb21haW4gPSBvcHRpb25zLmRvbWFpbiA/ICc7IGRvbWFpbj0nICsgKG9wdGlvbnMuZG9tYWluKSA6ICcnOwogICAgICAgIHZhciBzZWN1cmUgPSBvcHRpb25zLnNlY3VyZSA/ICc7IHNlY3VyZScgOiAnJzsKICAgICAgICBkb2N1bWVudC5jb29raWUgPSBbbmFtZSwgJz0nLCBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZV0uam9pbignJyk7CiAgICB9IGVsc2UgeyAvLyBvbmx5IG5hbWUgZ2l2ZW4sIGdldCBjb29raWUKICAgICAgICB2YXIgY29va2llVmFsdWUgPSBudWxsOwogICAgICAgIGlmIChkb2N1bWVudC5jb29raWUgJiYgZG9jdW1lbnQuY29va2llICE9ICcnKSB7CiAgICAgICAgICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29va2llcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGNvb2tpZSA9IGpRdWVyeS50cmltKGNvb2tpZXNbaV0pOwogICAgICAgICAgICAgICAgLy8gRG9lcyB0aGlzIGNvb2tpZSBzdHJpbmcgYmVnaW4gd2l0aCB0aGUgbmFtZSB3ZSB3YW50PwogICAgICAgICAgICAgICAgaWYgKGNvb2tpZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGggKyAxKSA9PSAobmFtZSArICc9JykpIHsKICAgICAgICAgICAgICAgICAgICBjb29raWVWYWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChjb29raWUuc3Vic3RyaW5nKG5hbWUubGVuZ3RoICsgMSkpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb29raWVWYWx1ZTsKICAgIH0KfTsK]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/readme.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyBqUXVlcnkgY2x1ZVRpcCBQbHVnaW4KCiMjIExpY2Vuc2UKCkR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgoKKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAoqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbAoKQ29weXJpZ2h0IEthcmwgU3dlZGJlcmcKCiMjIFJlcXVpcmVtZW50cwoKKiBqUXVlcnkgdjEuMysKCiMjIERlc2NyaXB0aW9uCgpEaXNwbGF5cyBhIGhpZ2hseSBjdXN0b21pemFibGUgdG9vbHRpcCB3aGVuIHRoZSB1c2VyIGludGVyYWN0cyB3aXRoIHRoZSBtYXRjaGVkIGVsZW1lbnQuIEFzIG9mIGNsdWVUaXAgdmVyc2lvbiAxLjEsIHRoaXMgcGx1Z2luIGlzIFtUaGVtZVJvbGxlciBSZWFkeV1bMV0uCgoqICoqRnVsbCBkb2N1bWVudGF0aW9uKio6IFtodHRwOi8vcGx1Z2lucy5sZWFybmluZ2pxdWVyeS5jb20vY2x1ZXRpcC9dCiogKipEZW1vcyoqOiBbaHR0cDovL3BsdWdpbnMubGVhcm5pbmdqcXVlcnkuY29tL2NsdWV0aXAvZGVtby9dCgojIyBLbm93biBJc3N1ZXMKCiogV2hlbiBgLmNsdWV0aXAoKWAgaXMgaW52b2tlZCBmcm9tIGFuIGltYWdlIG1hcCBgPGFyZWE+YCBlbGVtZW50LCB0aGUgcGx1Z2luIGlnbm9yZXMgdGhlIGBwb3N0aW9uQnlgIG9wdGlvbi4gUG9zaXRpb25pbmcgdGhlIHRvb2x0aXAgYnkgdGhlIGBjb29yZHNgIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhlIHBsdWdpbiwgc28gaXQgaW5zdGVhZCBmYWxscyBiYWNrIHRvIHBvc2l0aW9uaW5nIGFjY29yZGluZyB0byB0aGUgbW91c2UncyBwb3NpdGlvbiAoYGV2ZW50LnBhZ2VYYCBhbmQgYGV2ZW50LnBhZ2VZYCkgd2hlbiBpdCBlbnRlcnMgdGhlIGA8YXJlYT5gLgoKIyMgSW1wb3J0YW50IGNsdWVUaXAgMS4yIENoYW5nZQoKVmVyc2lvbiAxLjIgb2YgdGhlIGNsdWVUaXAgcGx1Z2luIGNoYW5nZXMgdGhlIEhUTUwgc3RydWN0dXJlIG9mIHRoZSB0b29sdGlwLiBJdCB1c2VzIGNsYXNzZXMgaW5zdGVhZCBvZiBJRHMgZm9yIHRoZSBlbGVtZW50cyB3aXRoaW4gdGhlIGNsdWVUaXAuIFRoaXMgYWxsb3dzIG11bHRpcGxlIHRvb2x0aXBzIHRvIGJlIHZpc2libGUgYXQgdGhlIHNhbWUgdGltZSAob25lIHBlciBjYWxsIHRvIHRoZSAuY2x1ZXRpcCgpIG1ldGhvZCkgaWYgdGhlIGBtdWx0aXBsZWAgb3B0aW9uIGlzIHNldCB0byBgdHJ1ZWAuCgpUaGUgcGx1Z2luIG1heSBub3Qgd29yayBhcyBleHBlY3RlZCBpZiB5b3UgdXBkYXRlIGpxdWVyeS5jbHVldGlwLmpzIHRvIHZlcnNpb24gMS4yKyBhbmQgeW91IGRvbid0IGFsc28gdXBkYXRlIHRoZSBqcXVlcnkuY2x1ZXRpcC5jc3Mgc3R5bGVzaGVldC4KCklmIHlvdSBoYXZlIGEgbG90IGludmVzdGVkIGluIHRoZSBvbGQgY2x1ZVRpcCdzIHN0cnVjdHVyZSB3aXRoIHRoZSBJRHMsIHlvdSBjYW4gZ2V0IGl0IGJhY2sgYnk6CgoxLiBhZGRpbmcgdGhlIGpxdWVyeS5jb21wYXQuY2x1ZXRpcC5qcyBmaWxlIGltbWVkaWF0ZWx5IGFmdGVyIGpxdWVyeS5jbHVldGlwLmpzLCBBTkQKMi4gcmVwbGFjaW5nIGpxdWVyeS5jbHVldGlwLmNzcyB3aXRoIGpxdWVyeS5jb21wYXQuY2x1ZXRpcC5jc3MuCgojIyBGZWF0dXJlcwoKIyMjIE9wdGlvbnMKClRoZSBjbHVlVGlwIHBsdWdpbiBhbGxvd3MgZm9yICh0b28/KSBtYW55IG9wdGlvbnMuIEZvciBhIGNvbXBsZXRlIGxpc3QsIGNoZWNrIG91dCB0aGUgW3BsdWdpbidzIGhvbWVwYWdlXVsyXQoKIyMjIENvbnRlbnQgdmlhIGFqYXgKCkJ5IGRlZmF1bHQsIHRoZSBjbHVlVGlwIHBsdWdpbiBsb2FkcyBhIHBhZ2UgaW5kaWNhdGVkIGJ5IHRoZSAicmVsIiBhdHRyaWJ1dGUgdmlhIGFqYXggYW5kIGRpc3BsYXlzIGl0cyBjb250ZW50cy4gSG93ZXZlciwgKnRoZSBhdHRyaWJ1dGUgdG8gYmUgdXNlZCBmb3IgYm90aCB0aGUgYm9keSBhbmQgdGhlIGhlYWRpbmcgb2YgdGhlIGNsdWVUaXAgaXMgdXNlci1jb25maWd1cmFibGUqLgpJZiBhICJ0aXRsZSIgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgaXRzIHZhbHVlIGlzIHVzZWQgYXMgdGhlIGNsdWVUaXAncyBoZWFkaW5nLgoKIyMjIENvbnRlbnQgZnJvbSBIVE1MIGVsZW1lbnQKCk9wdGlvbmFsbHksIHRoZSBjbHVlVGlwJ3MgYm9keSBjYW4gZGlzcGxheSBjb250ZW50IGZyb20gYW4gZWxlbWVudCBvbiB0aGUgc2FtZSBwYWdlLgoKSnVzdCBpbmRpY2F0ZSB0aGUgZWxlbWVudCdzIGlkIChlLmcuICIjc29tZS1pZCIpIGluIHRoZSByZWwgYXR0cmlidXRlLgoKIyMjIENvbnRlbnQgZnJvbSB0aXRsZSBhdHRyaWJ1dGUKCk9wdGlvbmFsbHksIHRoZSBjbHVlVGlwJ3MgYm9keSBjYW4gZGlzcGxheSBjb250ZW50IGZyb20gdGhlIHRpdGxlIGF0dHJpYnV0ZSwgd2hlbiBhIGRlbGltaXRlciBpcyBpbmRpY2F0ZWQuCgoqIFRoZSBzdHJpbmcgYmVmb3JlIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgZGVsaW1pdGVyIGlzIHNldCBhcyB0aGUgY2x1ZVRpcCdzIGhlYWRpbmcuCiogQWxsIHN1YnNlcXVlbnQgc3RyaW5ncyBhcmUgd3JhcHBlZCBpbiBzZXBhcmF0ZSBESVZzIGFuZCBwbGFjZWQgaW4gdGhlIGNsdWVUaXAncyBib2R5LgoKIyMgRXhhbXBsZXMKCiMjIyBCYXNpYwoKVGhpcyBpcyB0aGUgbW9zdCBiYXNpYyBjbHVlVGlwLiBJdCBkaXNwbGF5cyBhIDI3NXB4LXdpZGUgY2x1ZVRpcCBvbiBtb3VzZW92ZXIgb2YgdGhlIGVsZW1lbnQgd2l0aCBhbiBJRCBvZiAidGlwLiIgT24gbW91c2VvdXQgb2YgdGhlIGVsZW1lbnQsIHRoZSBjbHVlVGlwIGlzIGhpZGRlbi4KCmBgYGphdmFzY3JpcHQKJCgnI3RpcCkuY2x1ZXRpcCgpOwpgYGAKCiMjIyBTZXR0aW5nIE11bHRpcGxlIE9wdGlvbnMKVGhlIGZvbGxvd2luZyBkaXNwbGF5cyBhIGNsdWVUaXAgb24gbW91c2VvdmVyIG9mIGFsbCBgPGE+YCBlbGVtZW50cyB3aXRoIGNsYXNzPSJjbHVlIi4gVGhlIGhvdmVyZWQgZWxlbWVudCBnZXRzIGEgY2xhc3Mgb2YgImhpZ2hsaWdodCIgYWRkZWQgdG8gaXQgKHNvIHRoYXQgaXQgY2FuIGJlIHN0eWxlZCBhcHByb3ByaWF0ZWx5LiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIG5vbi1hbmNob3IgZWxlbWVudHMgaW4gb2xkZXIgYnJvd3NlcnMgc3VjaCBhcyBJRTYuKS4gVGhlIGNsdWVUaXAgaXMgInN0aWNreSwiIHdoaWNoIG1lYW5zIHRoYXQgaXQgd2lsbCBub3QgYmUgaGlkZGVuIHVudGlsIHRoZSB1c2VyIGVpdGhlciBjbGlja3Mgb24gaXRzICJjbG9zZSIgdGV4dC9ncmFwaGljIG9yIGRpc3BsYXlzIGFub3RoZXIgY2x1ZVRpcC4gVGhlICJjbG9zZSIgdGV4dC9ncmFwaGljIGlzIHNldCB0byBkaXNwbGF5IGF0IHRoZSBib3R0b20gb2YgdGhlIGNsdWVUaXAgKGRlZmF1bHQgaXMgdG9wKSBhbmQgZGlzcGxheSBhbiBpbWFnZSByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCAiQ2xvc2UiIHRleHQuIE1vcmVvdmVyLCB0aGUgYm9keSBvZiB0aGUgY2x1ZVRpcCBpcyB0cnVuY2F0ZWQgdG8gdGhlIGZpcnN0IDYwIGNoYXJhY3RlcnMsIHdoaWNoIGFyZSBmb2xsb3dlZCBieSBhbiBlbGxpcHNpcyAoLi4uKS4gRmluYWxseSwgdGhlIGNsdWVUaXAgcmV0cmlldmVzIHRoZSBjb250ZW50IHdpdGggYSBgUE9TVGAgcmVxdWVzdCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBgR0VUYC4KCmBgYGphdmFzY3JpcHQKJCgnYS5jbHVlJykuY2x1ZXRpcCh7CiAgaG92ZXJDbGFzczogJ2hpZ2hsaWdodCcsCiAgc3RpY2t5OiB0cnVlLAogIGNsb3NlUG9zaXRpb246ICdib3R0b20nLAogIGNsb3NlVGV4dDogJzxpbWcgc3JjPSJjcm9zcy5wbmciIGFsdD0iY2xvc2UiIC8+JywKICB0cnVuY2F0ZTogNjAsCiAgYWpheFNldHRpbmdzOiB7CiAgICB0eXBlOiAnUE9TVCcKICB9Cn0pOwpgYGAKCiMjIyBUcmlnZ2VyaW5nIHRoZSBgaGlkZUNsdWV0aXBgIGV2ZW50ICh1c2VmdWwgZm9yIHRvdWNoIGRldmljZXMpCgpZb3UgY2FuIHByb2dyYW1tYXRpY2FsbHkgaGlkZSAoY2xvc2UpIGEgY2x1ZVRpcCBieSB0cmlnZ2VyaW5nIHRoZSAiaGlkZUNsdWV0aXAiIGN1c3RvbSBldmVudC4gT24gYSB0b3VjaC1lbmFibGVkIGRldmljZSwgZm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBoaWRlIGFueSB2aXNpYmxlIGNsdWVUaXBzIHdoZW4gdGhlIHVzZXIgdG91Y2hlcyBhbnl3aGVyZSBpbiB0aGUgYm9keSBleGNlcHQgb24gYSBsaW5rIG9yIG9uIHRoZSBjbHVlVGlwIGl0c2VsZjoKCmBgYGphdmFzY3JpcHQKJCgnYm9keScpLmJpbmQoJ3RvdWNoc3RhcnQnLCBmdW5jdGlvbihldmVudCkgewogZXZlbnQgPSBldmVudC5vcmlnaW5hbEV2ZW50OwogdmFyIHRndCA9IGV2ZW50LnRvdWNoZXNbMF0gJiYgZXZlbnQudG91Y2hlc1swXS50YXJnZXQsCiAgICAgJHRndCA9ICQodGd0KTsKCiBpZiAodGd0Lm5vZGVOYW1lICE9PSAnQScgJiYgISR0Z3QuY2xvc2VzdCgnZGl2LmNsdWV0aXAnKS5sZW5ndGggKSB7CiAgICQoZG9jdW1lbnQpLnRyaWdnZXIoJ2hpZGVDbHVldGlwJyk7CiB9Cn0pOwpgYGAKCk1vcmUgZXhhbXBsZXMgY2FuIGJlIGZvdW5kIGF0IFtodHRwOi8vcGx1Z2lucy5sZWFybmluZ2pxdWVyeS5jb20vY2x1ZXRpcC9kZW1vL10oaHR0cDovL3BsdWdpbnMubGVhcm5pbmdqcXVlcnkuY29tL2NsdWV0aXAvZGVtby8pCgoKIyMgQ3JlZGl0cwoKKiBPcmlnaW5hbGx5IGluc3BpcmVkIGJ5IENvZHkgTGluZGxleSdzIGpUaXAgKGh0dHA6Ly93d3cuY29keWxpbmRsZXkuY29tKQoqIEh1Z2UgdGhhbmtzIHRvIEpvbmF0aGFuIENoYWZmZXIsIEdsZW4gTGlwa2EsIFNoZWxhbmUgRW5vcywgSGVjdG9yIFNhbnRvcywgVG9yYmVuIFNjaHJlaXRlciwgRGFuIEcuIFN3aXR6ZXIsIErDtnJuIFphZWZmZXJlciwgYW5kIHRoZSBtYW55IG90aGVycyB3aG8gaGVscGVkIHJlcG9ydCBhbmQgZml4IGJ1Z3MgYW5kIHN1Z2dlc3QgZmVhdHVyZXMuCgpbMV06IGh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvClsyXTogaHR0cDovL3BsdWdpbnMubGVhcm5pbmdqcXVlcnkuY29tL2NsdWV0aXAvCg==]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/blank.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/fancybox_loading.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhGAAYAPcIADo6OkVFRTQ0NMnJydPT04yMjC8vL7y8vB0dHXl5eX5+fu7u7lJSUqGhoQ0NDSsrK62treXl5ZSUlMLCwhgYGKenp7S0tLu7u/X19fr6+kNDQ5ycnBISEgQEBFtbW7GxsRcXFzAwMCMjI2ZmZoaGhktLS83NzQoKClxcXE1NTc7OzhQUFGVlZQUFBVRUVG9vbxkZGZWVlebm5tzc3NTU1OLi4jExMVlZWUBAQJ6eniYmJqKiopqamoeHh6+vr8PDwwkJCT8/P5OTkw8PDykpKRAQECEhIYmJiYiIiCQkJF1dXS0tLSAgILCwsAgICBERETMzM4WFhb29vSoqKgsLC6Ojo7+/v5mZmfT09Pn5+Tg4OLa2trq6utDQ0CIiIp2dnaurqwwMDD09PUdHR66urkRERExMTNXV1eHh4ZaWlhMTE9vb28/Pzzw8PKCgoBYWFqysrL6+vlpaWm5ubp+fn0ZGRsDAwJubmz4+Pg4ODjk5OZCQkAYGBicnJywsLDIyMnh4eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/i1NYWRlIGJ5IEtyYXNpbWlyYSBOZWpjaGV2YSAod3d3LmxvYWRpbmZvLm5ldCkAIfkEBQoACAAsAAAAABgAGAAAB/+ACIKDhAg2NoWJiUAtgkMHB0OKkys8L44qKpIIMEaNkwgrBzQGCEOZkkA2RJ+gLjJCLaeanAJFlCuCQDs1AUCoRQI6gy2tLQU+KUAIADMxQDc3LUY2ki1FREbELD8EMQJAKcODQLdAOgI2MIVEPSoDAZNDh0bLiS04R9qKQEa3hUACMrIHSlAxQUaE8FiYI0jBIgaISCTSL8aOHBhxPCQSkYiOVEOAhGw1qdHBREM8Ter3bxE1Gy0LFaFHUBAMG8IkhSR0zRQ6dYSMECnSSJW2IreobVqRjWcrdLc4yrKxD8HJRDO1tZCI0FZBq0RsLNvKytQqkveMrBMUcVAntF8IdRD5+lXk10AAIfkEBQoABgAsAAAAABgAGAAAB/+ABoKDhC1LD4SJioItToJOTRAOjC2LiQUsgg5SUpMGCRUUloMQE4ibnQZQESqiowYpBFEtqA4tDRlKlk9PjxIqGk6cTikYTY6LChvBBgIDSE4MDE4NCxqCTw9MhEpNUlFLTgFJhA8MtElQUBSVg0kKFxYAu+pMyIoACgiWTkyehQbatXs1qJKTJA8SLuk16smhhEmcOEjy8AHDXQ8PTWpRaSBBj4mebLPUgsnFRE4QqDtJ6AkUAfYSUVCXZJItQhINTBQAZQUhJgs1QdnGywATKBtXaCOZRECvB0toCSBH0MATmIISCmIiwCdBqMi06lyypCoTVy0StqMwsuogsW4GFzm5ZykQACH5BAUKAAIALAAAAAAYABgAAAf/gAKCg4QCU0mFiYkdHYJUDQ1Ujo2KgxwKHoJhZGRhgi9XIJWCHF9kiJtgngY0XKKjAmNWCQJUZGCSMTIulYyOSFxatrgBNZGCMDCEXlMcgjZbCVRjY1QxMwACYR5dVZLINjZJYR1iCIRT1WIfWTIJlI4IWjaeigwLWA02lWFe34lTqqSAN4gSQUUGB1GZwpChs1EcDEyROIXKQoYSH1bi0FDiP1iLICL4SIgKgnqJwsijtzGcv0IwDIgjF+YjFU9hkmgx8EqQFwMPw9jwIoCDMwQG6nEkWpCgFk8Mi2oh5EsRBy1EO0QV4EWLxl4TvzFsREXiwUIdvCgToHXKIBheC87CSuIWJCyLIAMBACH5BAUKAAAALAIAAAAWABcAAAfegACCg4MiIoSIiYgSBYqKHSIwgg45V1SCIwUcjh1TIZdUlZdTExBqjgBqAoeUVx0dJARmqII6IQ6hljhsEoSnAIeDDiEiHTg4HUgDAgBULhOugiEhOg4dHB2EImVUAlURZy+XgiICt45ma2hpD4kOwYo6aWWJ2bSCVFQOHA4OAA8A29G6waYgGysPpkwRONAgmwkhBNmjpa9fP0IOJKGC4Q8RlXICOiqaBi9VCAHVrrkD4ECHOY06HvxyIEAjuXOpppQcZGsTIWr3AKxKJCLiPYaIkMajtZOWDkQTBwUCACH5BAUKAAEALAIAAAAWABcAAAfRgAGCg4NUVISIiYhTSYMdiogUg1NTjwFKCpCJHZSDPjwcmqGTlR0KF2WaAR1JIRwdD1NUbRc9gysrmggdHK8KFg+CZhZIghQhAo0BDoeDCABUITEEPyyWgiGqZQMqSFOqiiI9beCqDufMAZSdqgw/Fxc/FutTwe3w8MDlkM2DIteIHuwwA3BQCFeQGCzAsiOEJUkBlK0i1MFBhzIWsshI8EjEg1EBQiAQlEvQISpKVFToJ4gVIksiBlGASKikIHu3wIVwsC+RCJqRegpKkqQgokAAIfkEBQoAAAAsAAAAABgAGAAAB8uAAIKDhABAQIWJiokdi46FS4MUIo2Pgg6CS1ONQJqVlooiAhyghVOCHCFJg2+kjyKEIkuYQHV0Cpafhg4dIUhxEHKFiJZBW1wJq47EiQgJWo66ix2HDoeGU9lTkY8pEN9wblNA2pqWJd/f4oLSy4dA1omui1MxdYvMjikzaDHcpYKmuACipUqEM3MgFYIFgEMHNwsCGHJhIkY7QpgGpcAAgdibN4tADjplyE0GYaUQddgmKEQEExQAZtokKEGVmAA7JCFpKF9Kn4kCAQAh+QQFCgABACwAAAAAGAAYAAAH0YABgoOEAVRUhYmKhA+LjoIwgw+NkI+SIYgBk4JUBpSPK4yfloubgx2CHaiMlgaDHAYihJGEHIWZDkkCIaGEmY8cISEiv4rFhB0iDqSWVA7OiFSTk66PZXfYbkLE06aOAHc8PHfbzL6HVB3HAQ7EiyJIAIuZBsuKZQMEPaMBtIPPhJKkoBIiBgE7LAqNitXhxg0qMWbIo5LCRwFSDlSooFKmxg57K3olEplRhYMOQmS4IPUgxLKSywzQOCDSES0HBEwKesHDH0Y7duypMzdImKVAACH5BAUKACkALAAAAAAYABgAAAatwJRwSEydTsWkcslUUpbPJtGRREqFnKs26RBsmaEmxdDsZIUhA6hoTZ3LSw6irXwPO18l/coxPPwPR3kcfw+Ge1d4TRwiiEIICUyORQAWFwpJIAZhQgwPRCIBHQYkBxAoRWRCGgsNJwwMJyQDXicBG5h6HxglJwcHJxoEElYcdkQeGQ0dDr8nHSQEJVIUJhGcEwdCDxMQa0wUFZFCv0MjBcdJHVYnHx9til9/UkEAIfkEBQoAAAAsAAAAABgAGAAAB9mAAIKDhABUVIWJiouMiV6NSY2EiIVUD5KEj4WamACcgxwhjZ9DIZ9eIUODD58AogBDHUOUg7FDSQIhFJWtiUMPAl60hUPCi1S9nYUdgsyGD9DQmNHQVM7KgtFJqsuYHdeEHSk7l4odXtzLITtYCwyLoabDHQkyWR94VCWRgwh4HVRw6RpEpUIXD4i0zIihLwW9La84sCJEYZehHTUCUAEDh4qWA0gofVvEQEYMgBytJbASQNKbAzQuDQEDBlESOF84NHpz5YWgmWC4eVDQiRKVHTuGYRvEj1EgACH5BAUKAAAALAAAAAAYABgAAAfjgACCg4QAQECFiYqDLUkPi4stIoktgyKVkII2eQCYgkA2D56Zk4wAIgJqkZ5JNhyeeTaELaOlgrGTqqcGnJaFBrcAeaMtnHmtsoVAIjbJirE2IoiKHDDTlLaEedvbmYWYNnYq4yo33gYP6Q9ABlbk5d6D6MbcedeQo7MBaUmRIr2JDKRBs8YMpGbSZr04E6GKHiABsgHhIEzTLB52XCASMABJCxw4WsDYRCibLkNpVITkkQNIrH6CaC0yc8YjEJacUFHMpAaCnU8sEbETxbPACKA5eqm55A0IJiB70tyLVyjbokAAIfkEBQoAAQAsAAAAABgAGAAAB/eAAYKDhAFUVIWJioRERIuLfIWNkYOUkEQhiHyNglR+RJaPhH5+lCEcixQUgyIhYZtEVGEhfZR8lnwVXR5hAbOCqIKug46VCTJZH2J8YYiVqGF9AiErhSE7WAsMi7MCIs6FfGY7xYmhhGHpzeCPfFSUfh8XcfTbop9En54f9PWiAY0C9lK37l+AW+cOikEiYhEVBL0UEemhYkCZRyFCfCPEh8WPLjEEUAGAgJAsX9JCcCzgwwwiPxYS8OGACsGwACvKCVpRzVCPOAAAOuJAq1JCQWXiyOTz6egiDjx8FJtkqKkoDgo8CII1aIUIp0YH9dFpMNGhf4EAACH5BAUKAAAALAAAAAAYABgAAAj/AAEIHEgQwIkTBRMm5INQYJ8+CiMCoFAhwcApUwgykSiQgokIfwRi5GNwSUaOAFBkqIJwyhKBTP4UifjmjcAwTTCk4INRYEiJV+K4QBhkQRU+RWbGHFhkysaBc85EqKLlBAOIA0/MPNHnzx8KBZekQTOjRMQiXpmEiRggDdaEJ9QqPEgXpUA+eAFMqQIBDhwIZiUWMYmxD9cqfiEA5jgYI0aEdOvalagFEIKIcWcq7JOAy5YgEcP8EcCk4UA5EOIg+YPUNACkA70WVEAnAOQ/TJAq/QngjVOCRWw6/LPWJZ8wAiYDQNsHr0uYAjRL5Lmk4fOSJ6czAStyCsmJT5XrCH0rnuBBlAEBADs=]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/fancybox_overlay.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpCMEM4NDgzQjlDRTNFMTExODE4NUVDOTdFQ0I0RDgxRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGREU5OEVCQzAzMjYxMUUyOTg5OURDMDlDRTJDMTc0RSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGREU5OEVCQjAzMjYxMUUyOTg5OURDMDlDRTJDMTc0RSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkIxQzg0ODNCOUNFM0UxMTE4MTg1RUM5N0VDQjREODFFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkIwQzg0ODNCOUNFM0UxMTE4MTg1RUM5N0VDQjREODFFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+s3YRAQAAABtJREFUeNpiFODh2cBABGBiIBKMKqSOQoAAAwBokQDs5F/8FAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/fancybox_sprite.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACwAAACYCAMAAACoAftQAAAAvVBMVEUAAAAAAAAAAAAODg4AAAAAAAAAAADNzc0BAQHZ2dkDAwMHBwcAAADf398CAgI/Pz8BAQEAAACCgoIcHBzl5eUAAAC/v7/x8fEGBgZnZ2cAAADs7OwGBgb4+Pg/Pz/Jycmenp5nZ2f39/eDg4MAAADQ0ND4+Piurq7a2tr8/Pzs7OwAAAD5+fn9/f3e3t4AAAD///9OTk7BwcE1NTWsrKyNjY2cnJx6enpdXV1oaGgsLCy6uroiIiLOzs5BQUFt3PCNAAAAL3RSTlMAAQMIDRIZHSMnLTpESFNVXWlpbG15en+HiZCWoaGssrO2vsDFydPU3uL4+fr9/Ywv6xsAAAQVSURBVHhe7JZbc6JMGIQXAUOQEMi3uMYkrmopZgqs5ujZ//+zvpdNzMsMlli1N3uRvtCbpzo9I+nmhyqN9OO6GNQ6Ha1SG0mcrhskXe90rvKE6kbX7r9MF4vp2887nfBrqPW0xJemD4w32e7jHIj2602SbNZ7Qfgd0zJLtgKi2B0+tSsE3h8u0RX7HGGfHWrK9oiIbrK69SiQHxTliO5VWtP0rrNEemhoj6muaYqx2XuGyJrwbgUKohhb3hIFM6wCC7Zm4+M5Zs5fpKNiTYndEOUHDFRYCeADLvGiy7DtL7E5/12gJPacalPlqEc2eoFAdmCa2UOGyOhoUuQgwo7PxCwJMGXYGcQMlyCVX3DchCkGs3V6h0iFgyUSZsuS6QQLGaYDhueUHxhf3RpzOqB8dRMcz84lf5FS9A1Ngi2PQm8PF7RBZOnEyqFnSC/BKX6bHQmucpB13mRzCJtTsPUowlpl14if2JifUXcwgeqdA2OLn1C+PdsbzCKkW0a3KeKxbbAxF4FJ9EgAaXGqyFORAuLZNrkMZNoNKnNS9PE5dpltFofjB4PJXIAk5rP/HMu4Ukmm7XjEkwLfc2yT66tJk7lp2T2H1LMtk2wVVsWpcE0SlW4DbeLE/xG3eRvfQv7Fptw4KvpDNRKLt1/3rZty/xbjrPef1+5D018ITYttkiTrfAUsrmzK3RTIT/woHxH3DaZl9h2rRH2aX0ydaYb1BVK1zNdA32RvNn7DkVmmoyeVJvYBMcdl5Vg2/lW0zpSbUNIKT12KLV8wVjsmNvGW63feU3qj86veGQmAA1e5qzbStNZdmVTlRzzbSjG+4+t4u1iqjxxjR6pczaiNBCCVXoGx25X7mUNGgJBHM/QsXWp+dk4U5xJjX4EXSM7ACcCxnnnm2zI8rxVoFgMr/lUwUpyNPvYVx/eRfaUSQzkzLWxEOVhiwynCAd2GvCm/2bquBPEo+LxnDv0YXdyfFOHQP+8EV/kY0enSorxyitoLxxwiabDRqDImWF2JJVBIeVNEk2HgsDGn7vkhcPy67lMOiBGF4AGS3tX8yYqAfb5eF/kRiMPX4cDjEDLd8wezJT4lwtHrMHBtbg6V9oLhYDYLw3A2eSVbn0elSdMCecFg+Ee0Kq7dlftLXSCrRxNE8lzH7hp0Nu3qpHQty7Ztq2sabHvtpb/SLauisVTye1O+N2Ubbxhu2xSAq6x1UwoAWfum8P3Gu5ZNYaUA2jaFJYCofVPYOWnZFD4TcLpxU1ZAnN24KRnfxQ2bshEE/Vub8r0p35vi/t9eHRoBDMNQDJUvMLkOkDMM+8D7b9cR+kOKLPy4juojnQeAkWWVAyLLLINVdovj44N8LOqi/3Djxo0bN5ZvdbWJuwHhrw2ILYdqBwDT2fEEXtrZFmVcCWLiAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/fancybox_buttons.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAMAAAAPdrEwAAAAvVBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoqKgAAABhYWEAAACKiooAAAAAAADj4+MAAADExMQAAABlZWWAgIAAAAAzMzMAAADg4OArKysAAADk5OR0dHRXV1dgYGCtra3u7u7Hx8eoqKjDw8P4+Pjv7++wsLD4+PjZ2dm/v7/Gxsb39/f5+fn5+fno6Oj6+vrb29vh4eHq6ur7+/vw8PD4+Pj29vb7+/v8/Pz////5+fn09PTy8vLw8PARO2GBAAAANnRSTlMAAQMFBwsOERUXHB8gJiguNzg9Pz8/Q0hLT1VWYGVoeH2IkaKkpKmxsrjExc3T1djc4uPw8vVWxhKTAAAC9ElEQVR4Xu2WXXeaQBCGgQUWiGCsibExiWk+bA0xNlZnP8D8/5/VQUp7FMYc95iLtjw3czHs45zx5bDWv05LS/gc7hewb5/txoOzR7bpP86aDeFMx/ZeNX+WTe7wResJutlE65ew2azPnb3qYK5V3e2iuXAXZnS7TWalb09LbEqttLrabfIpAKAbzQAw5Q3mLNcV38PtFeuKTNTdfi8VQiitFZa059fWheb1ep3nuRCg1NbSudKAp7CHT9TdLOqn2NqcTvsR21nXs1bYRHJEgNxaeiSh8P56gHAXvZoZ8e/w8G/zO2pYnTNrxz1VRU9Na2bL694LkVdyAXC2pc4Bqn1g98dNZ1c90aVaT2pqJ+ihW+TpU8l9ZFt/CB5ef7HKBZoTz941a5FvdkW5AW4G/Q1df2td3WHJ6BUIM4j86SkXQLkhOwv4Bs/Z6vlBSTLP6mbLn2cSRDocpgJkNvetRve7b2PNjPCLBQBmA3MCsLjgVpP7NrL3qx9qZsTtXC7QzBi6F5cdt0Hg8Mjfr/Y7ncJcd/d7RepY1OujuQmbOdZeHJc1/rbLfVZU5nM0/y20tLS0sNmpTXfDGAmrciBc6y8O2Y01ElflQCKp9Qs5eCyVknFZDNSg6MFjmWXoLIqBGoTIycHjDCCLy2KixlsKlIMfXb1GysGPr357Q3e58Q9RA8Cd9yELEfli3D26Ot9cgb8OE370hQgUL8a9yD323ygBRDny0V8ZKUU58vFfdBDUyEiMyxJxWQ5Xz8mRkZMYOanKgfAuOTLiBlEUuFU5EObjyP8jLS0tLexRF7hUl9mnyyvHSO0m00wqGVA35cmnpV56ZlNH11pKGTV3I6W1Wl1zI7X9aSkBSLWUMhsnZlN7y2w1ToFUK6mn3DZS89vVuDeYUuriiw4TZjZ1t5/wKCG2GQxGo9EgcY3Ujsc9m7mM/LAjnOga5JXIOgGRV4OsE9B5pbNOY5JXOus0dF7prNOY5JXOOg2dVzrrNCZ5pbNuTkvLT1EJqK9sfkCLAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/jquery.fancybox-buttons.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[I2ZhbmN5Ym94LWJ1dHRvbnMgewoJcG9zaXRpb246IGZpeGVkOwoJbGVmdDogMDsKCXdpZHRoOiAxMDAlOwoJei1pbmRleDogODA1MDsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMudG9wIHsKCXRvcDogMTBweDsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMuYm90dG9tIHsKCWJvdHRvbTogMTBweDsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgdWwgewoJZGlzcGxheTogYmxvY2s7Cgl3aWR0aDogMTY2cHg7CgloZWlnaHQ6IDMwcHg7CgltYXJnaW46IDAgYXV0bzsKCXBhZGRpbmc6IDA7CglsaXN0LXN0eWxlOiBub25lOwoJYm9yZGVyOiAxcHggc29saWQgIzExMTsKCWJvcmRlci1yYWRpdXM6IDNweDsKCS13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjA1KTsKCSAgIC1tb3otYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjA1KTsKCSAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjA1KTsKCWJhY2tncm91bmQ6IHJnYig1MCw1MCw1MCk7CgliYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYig2OCw2OCw2OCkgMCUsIHJnYig1Miw1Miw1MikgNTAlLCByZ2IoNDEsNDEsNDEpIDUwJSwgcmdiKDUxLDUxLDUxKSAxMDAlKTsKCWJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGNvbG9yLXN0b3AoMCUscmdiKDY4LDY4LDY4KSksIGNvbG9yLXN0b3AoNTAlLHJnYig1Miw1Miw1MikpLCBjb2xvci1zdG9wKDUwJSxyZ2IoNDEsNDEsNDEpKSwgY29sb3Itc3RvcCgxMDAlLHJnYig1MSw1MSw1MSkpKTsKCWJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiKDY4LDY4LDY4KSAwJSxyZ2IoNTIsNTIsNTIpIDUwJSxyZ2IoNDEsNDEsNDEpIDUwJSxyZ2IoNTEsNTEsNTEpIDEwMCUpOwoJYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiKDY4LDY4LDY4KSAwJSxyZ2IoNTIsNTIsNTIpIDUwJSxyZ2IoNDEsNDEsNDEpIDUwJSxyZ2IoNTEsNTEsNTEpIDEwMCUpOwoJYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYig2OCw2OCw2OCkgMCUscmdiKDUyLDUyLDUyKSA1MCUscmdiKDQxLDQxLDQxKSA1MCUscmdiKDUxLDUxLDUxKSAxMDAlKTsKCWJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0b3AsIHJnYig2OCw2OCw2OCkgMCUscmdiKDUyLDUyLDUyKSA1MCUscmdiKDQxLDQxLDQxKSA1MCUscmdiKDUxLDUxLDUxKSAxMDAlKTsKCWZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KCBzdGFydENvbG9yc3RyPScjNDQ0NDQ0JywgZW5kQ29sb3JzdHI9JyMyMjIyMjInLEdyYWRpZW50VHlwZT0wICk7Cn0KCiNmYW5jeWJveC1idXR0b25zIHVsIGxpIHsKCWZsb2F0OiBsZWZ0OwoJbWFyZ2luOiAwOwoJcGFkZGluZzogMDsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgYSB7CglkaXNwbGF5OiBibG9jazsKCXdpZHRoOiAzMHB4OwoJaGVpZ2h0OiAzMHB4OwoJdGV4dC1pbmRlbnQ6IC05OTk5cHg7CgliYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2ZhbmN5Ym94X2J1dHRvbnMucG5nJyk7CgliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwoJb3V0bGluZTogbm9uZTsKCW9wYWNpdHk6IDAuODsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgYTpob3ZlciB7CglvcGFjaXR5OiAxOwp9CgojZmFuY3lib3gtYnV0dG9ucyBhLmJ0blByZXYgewoJYmFja2dyb3VuZC1wb3NpdGlvbjogNXB4IDA7Cn0KCiNmYW5jeWJveC1idXR0b25zIGEuYnRuTmV4dCB7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzNweCAwOwoJYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzNlM2UzZTsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgYS5idG5QbGF5IHsKCWJhY2tncm91bmQtcG9zaXRpb246IDAgLTMwcHg7Cn0KCiNmYW5jeWJveC1idXR0b25zIGEuYnRuUGxheU9uIHsKCWJhY2tncm91bmQtcG9zaXRpb246IC0zMHB4IC0zMHB4Owp9CgojZmFuY3lib3gtYnV0dG9ucyBhLmJ0blRvZ2dsZSB7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAzcHggLTYwcHg7Cglib3JkZXItbGVmdDogMXB4IHNvbGlkICMxMTE7Cglib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjM2UzZTNlOwoJd2lkdGg6IDM1cHgKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgYS5idG5Ub2dnbGVPbiB7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjdweCAtNjBweDsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgYS5idG5DbG9zZSB7Cglib3JkZXItbGVmdDogMXB4IHNvbGlkICMxMTE7Cgl3aWR0aDogMzVweDsKCWJhY2tncm91bmQtcG9zaXRpb246IC01NnB4IDBweDsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgYS5idG5EaXNhYmxlZCB7CglvcGFjaXR5IDogMC40OwoJY3Vyc29yOiBkZWZhdWx0Owp9]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/jquery.fancybox-buttons.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IC8qIQogKiBCdXR0b25zIGhlbHBlciBmb3IgZmFuY3lCb3gKICogdmVyc2lvbjogMS4wLjUgKE1vbiwgMTUgT2N0IDIwMTIpCiAqIEByZXF1aXJlcyBmYW5jeUJveCB2Mi4wIG9yIGxhdGVyCiAqCiAqIFVzYWdlOgogKiAgICAgJCgiLmZhbmN5Ym94IikuZmFuY3lib3goewogKiAgICAgICAgIGhlbHBlcnMgOiB7CiAqICAgICAgICAgICAgIGJ1dHRvbnM6IHsKICogICAgICAgICAgICAgICAgIHBvc2l0aW9uIDogJ3RvcCcKICogICAgICAgICAgICAgfQogKiAgICAgICAgIH0KICogICAgIH0pOwogKgogKi8KKGZ1bmN0aW9uICgkKSB7CgkvL1Nob3J0Y3V0IGZvciBmYW5jeUJveCBvYmplY3QKCXZhciBGID0gJC5mYW5jeWJveDsKCgkvL0FkZCBoZWxwZXIgb2JqZWN0CglGLmhlbHBlcnMuYnV0dG9ucyA9IHsKCQlkZWZhdWx0cyA6IHsKCQkJc2tpcFNpbmdsZSA6IGZhbHNlLCAvLyBkaXNhYmxlcyBpZiBnYWxsZXJ5IGNvbnRhaW5zIHNpbmdsZSBpbWFnZQoJCQlwb3NpdGlvbiAgIDogJ3RvcCcsIC8vICd0b3AnIG9yICdib3R0b20nCgkJCXRwbCAgICAgICAgOiAnPGRpdiBpZD0iZmFuY3lib3gtYnV0dG9ucyI+PHVsPjxsaT48YSBjbGFzcz0iYnRuUHJldiIgdGl0bGU9IlByZXZpb3VzIiBocmVmPSJqYXZhc2NyaXB0OjsiPjwvYT48L2xpPjxsaT48YSBjbGFzcz0iYnRuUGxheSIgdGl0bGU9IlN0YXJ0IHNsaWRlc2hvdyIgaHJlZj0iamF2YXNjcmlwdDo7Ij48L2E+PC9saT48bGk+PGEgY2xhc3M9ImJ0bk5leHQiIHRpdGxlPSJOZXh0IiBocmVmPSJqYXZhc2NyaXB0OjsiPjwvYT48L2xpPjxsaT48YSBjbGFzcz0iYnRuVG9nZ2xlIiB0aXRsZT0iVG9nZ2xlIHNpemUiIGhyZWY9ImphdmFzY3JpcHQ6OyI+PC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJidG5DbG9zZSIgdGl0bGU9IkNsb3NlIiBocmVmPSJqYXZhc2NyaXB0OmpRdWVyeS5mYW5jeWJveC5jbG9zZSgpOyI+PC9hPjwvbGk+PC91bD48L2Rpdj4nCgkJfSwKCgkJbGlzdCA6IG51bGwsCgkJYnV0dG9uczogbnVsbCwKCgkJYmVmb3JlTG9hZDogZnVuY3Rpb24gKG9wdHMsIG9iaikgewoJCQkvL1JlbW92ZSBzZWxmIGlmIGdhbGxlcnkgZG8gbm90IGhhdmUgYXQgbGVhc3QgdHdvIGl0ZW1zCgoJCQlpZiAob3B0cy5za2lwU2luZ2xlICYmIG9iai5ncm91cC5sZW5ndGggPCAyKSB7CgkJCQlvYmouaGVscGVycy5idXR0b25zID0gZmFsc2U7CgkJCQlvYmouY2xvc2VCdG4gPSB0cnVlOwoKCQkJCXJldHVybjsKCQkJfQoKCQkJLy9JbmNyZWFzZSB0b3AgbWFyZ2luIHRvIGdpdmUgc3BhY2UgZm9yIGJ1dHRvbnMKCQkJb2JqLm1hcmdpblsgb3B0cy5wb3NpdGlvbiA9PT0gJ2JvdHRvbScgPyAyIDogMCBdICs9IDMwOwoJCX0sCgoJCW9uUGxheVN0YXJ0OiBmdW5jdGlvbiAoKSB7CgkJCWlmICh0aGlzLmJ1dHRvbnMpIHsKCQkJCXRoaXMuYnV0dG9ucy5wbGF5LmF0dHIoJ3RpdGxlJywgJ1BhdXNlIHNsaWRlc2hvdycpLmFkZENsYXNzKCdidG5QbGF5T24nKTsKCQkJfQoJCX0sCgoJCW9uUGxheUVuZDogZnVuY3Rpb24gKCkgewoJCQlpZiAodGhpcy5idXR0b25zKSB7CgkJCQl0aGlzLmJ1dHRvbnMucGxheS5hdHRyKCd0aXRsZScsICdTdGFydCBzbGlkZXNob3cnKS5yZW1vdmVDbGFzcygnYnRuUGxheU9uJyk7CgkJCX0KCQl9LAoKCQlhZnRlclNob3c6IGZ1bmN0aW9uIChvcHRzLCBvYmopIHsKCQkJdmFyIGJ1dHRvbnMgPSB0aGlzLmJ1dHRvbnM7CgoJCQlpZiAoIWJ1dHRvbnMpIHsKCQkJCXRoaXMubGlzdCA9ICQob3B0cy50cGwpLmFkZENsYXNzKG9wdHMucG9zaXRpb24pLmFwcGVuZFRvKCdib2R5Jyk7CgoJCQkJYnV0dG9ucyA9IHsKCQkJCQlwcmV2ICAgOiB0aGlzLmxpc3QuZmluZCgnLmJ0blByZXYnKS5jbGljayggRi5wcmV2ICksCgkJCQkJbmV4dCAgIDogdGhpcy5saXN0LmZpbmQoJy5idG5OZXh0JykuY2xpY2soIEYubmV4dCApLAoJCQkJCXBsYXkgICA6IHRoaXMubGlzdC5maW5kKCcuYnRuUGxheScpLmNsaWNrKCBGLnBsYXkgKSwKCQkJCQl0b2dnbGUgOiB0aGlzLmxpc3QuZmluZCgnLmJ0blRvZ2dsZScpLmNsaWNrKCBGLnRvZ2dsZSApCgkJCQl9CgkJCX0KCgkJCS8vUHJldgoJCQlpZiAob2JqLmluZGV4ID4gMCB8fCBvYmoubG9vcCkgewoJCQkJYnV0dG9ucy5wcmV2LnJlbW92ZUNsYXNzKCdidG5EaXNhYmxlZCcpOwoJCQl9IGVsc2UgewoJCQkJYnV0dG9ucy5wcmV2LmFkZENsYXNzKCdidG5EaXNhYmxlZCcpOwoJCQl9CgoJCQkvL05leHQgLyBQbGF5CgkJCWlmIChvYmoubG9vcCB8fCBvYmouaW5kZXggPCBvYmouZ3JvdXAubGVuZ3RoIC0gMSkgewoJCQkJYnV0dG9ucy5uZXh0LnJlbW92ZUNsYXNzKCdidG5EaXNhYmxlZCcpOwoJCQkJYnV0dG9ucy5wbGF5LnJlbW92ZUNsYXNzKCdidG5EaXNhYmxlZCcpOwoKCQkJfSBlbHNlIHsKCQkJCWJ1dHRvbnMubmV4dC5hZGRDbGFzcygnYnRuRGlzYWJsZWQnKTsKCQkJCWJ1dHRvbnMucGxheS5hZGRDbGFzcygnYnRuRGlzYWJsZWQnKTsKCQkJfQoKCQkJdGhpcy5idXR0b25zID0gYnV0dG9uczsKCgkJCXRoaXMub25VcGRhdGUob3B0cywgb2JqKTsKCQl9LAoKCQlvblVwZGF0ZTogZnVuY3Rpb24gKG9wdHMsIG9iaikgewoJCQl2YXIgdG9nZ2xlOwoKCQkJaWYgKCF0aGlzLmJ1dHRvbnMpIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJdG9nZ2xlID0gdGhpcy5idXR0b25zLnRvZ2dsZS5yZW1vdmVDbGFzcygnYnRuRGlzYWJsZWQgYnRuVG9nZ2xlT24nKTsKCgkJCS8vU2l6ZSB0b2dnbGUgYnV0dG9uCgkJCWlmIChvYmouY2FuU2hyaW5rKSB7CgkJCQl0b2dnbGUuYWRkQ2xhc3MoJ2J0blRvZ2dsZU9uJyk7CgoJCQl9IGVsc2UgaWYgKCFvYmouY2FuRXhwYW5kKSB7CgkJCQl0b2dnbGUuYWRkQ2xhc3MoJ2J0bkRpc2FibGVkJyk7CgkJCX0KCQl9LAoKCQliZWZvcmVDbG9zZTogZnVuY3Rpb24gKCkgewoJCQlpZiAodGhpcy5saXN0KSB7CgkJCQl0aGlzLmxpc3QucmVtb3ZlKCk7CgkJCX0KCgkJCXRoaXMubGlzdCAgICA9IG51bGw7CgkJCXRoaXMuYnV0dG9ucyA9IG51bGw7CgkJfQoJfTsKCn0oalF1ZXJ5KSk7]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/jquery.fancybox-media.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIE1lZGlhIGhlbHBlciBmb3IgZmFuY3lCb3gKICogdmVyc2lvbjogMS4wLjUgKFR1ZSwgMjMgT2N0IDIwMTIpCiAqIEByZXF1aXJlcyBmYW5jeUJveCB2Mi4wIG9yIGxhdGVyCiAqCiAqIFVzYWdlOgogKiAgICAgJCgiLmZhbmN5Ym94IikuZmFuY3lib3goewogKiAgICAgICAgIGhlbHBlcnMgOiB7CiAqICAgICAgICAgICAgIG1lZGlhOiB0cnVlCiAqICAgICAgICAgfQogKiAgICAgfSk7CiAqCiAqIFNldCBjdXN0b20gVVJMIHBhcmFtZXRlcnM6CiAqICAgICAkKCIuZmFuY3lib3giKS5mYW5jeWJveCh7CiAqICAgICAgICAgaGVscGVycyA6IHsKICogICAgICAgICAgICAgbWVkaWE6IHsKICogICAgICAgICAgICAgICAgIHlvdXR1YmUgOiB7CiAqICAgICAgICAgICAgICAgICAgICAgcGFyYW1zIDogewogKiAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvcGxheSA6IDAKICogICAgICAgICAgICAgICAgICAgICB9CiAqICAgICAgICAgICAgICAgICB9CiAqICAgICAgICAgICAgIH0KICogICAgICAgICB9CiAqICAgICB9KTsKICoKICogT3I6CiAqICAgICAkKCIuZmFuY3lib3giKS5mYW5jeWJveCh7LAogKgkgICAgICAgaGVscGVycyA6IHsKICogICAgICAgICAgICAgbWVkaWE6IHRydWUKICogICAgICAgICB9LAogKiAgICAgICAgIHlvdXR1YmUgOiB7CiAqICAgICAgICAgICAgIGF1dG9wbGF5OiAwCiAqICAgICAgICAgfQogKiAgICAgfSk7CiAqCiAqICBTdXBwb3J0czoKICoKICogICAgICBZb3V0dWJlCiAqICAgICAgICAgIGh0dHA6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1vcGoyNEtuenJXbwogKiAgICAgICAgICBodHRwOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL29wajI0S256cldvCiAqICAgICAgICAgIGh0dHA6Ly95b3V0dS5iZS9vcGoyNEtuenJXbwogKiAgICAgIFZpbWVvCiAqICAgICAgICAgIGh0dHA6Ly92aW1lby5jb20vNDA2NDgxNjkKICogICAgICAgICAgaHR0cDovL3ZpbWVvLmNvbS9jaGFubmVscy9zdGFmZnBpY2tzLzM4ODQzNjI4CiAqICAgICAgICAgIGh0dHA6Ly92aW1lby5jb20vZ3JvdXBzL3N1cnJlYWxpc20vdmlkZW9zLzM2NTE2Mzg0CiAqICAgICAgICAgIGh0dHA6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLzQ1MDc0MzAzCiAqICAgICAgTWV0YWNhZmUKICogICAgICAgICAgaHR0cDovL3d3dy5tZXRhY2FmZS5jb20vd2F0Y2gvNzYzNTk2NC9kcl9zZXVzc190aGVfbG9yYXhfbW92aWVfdHJhaWxlci8KICogICAgICAgICAgaHR0cDovL3d3dy5tZXRhY2FmZS5jb20vd2F0Y2gvNzYzNTk2NC8KICogICAgICBEYWlseW1vdGlvbgogKiAgICAgICAgICBodHRwOi8vd3d3LmRhaWx5bW90aW9uLmNvbS92aWRlby94b3l0cWhfZHItc2V1c3MtdGhlLWxvcmF4LXByZW1pZXJlX3Blb3BsZQogKiAgICAgIFR3aXR2aWQKICogICAgICAgICAgaHR0cDovL3R3aXR2aWQuY29tL1FZN01ECiAqICAgICAgVHdpdHBpYwogKiAgICAgICAgICBodHRwOi8vdHdpdHBpYy5jb20vN3A5M3N0CiAqICAgICAgSW5zdGFncmFtCiAqICAgICAgICAgIGh0dHA6Ly9pbnN0YWdyLmFtL3AvSWVqa3VVR3hRbi8KICogICAgICAgICAgaHR0cDovL2luc3RhZ3JhbS5jb20vcC9JZWprdVVHeFFuLwogKiAgICAgIEdvb2dsZSBtYXBzCiAqICAgICAgICAgIGh0dHA6Ly9tYXBzLmdvb2dsZS5jb20vbWFwcz9xPUVpZmZlbCtUb3dlciwrQXZlbnVlK0d1c3RhdmUrRWlmZmVsLCtQYXJpcywrRnJhbmNlJnQ9aCZ6PTE3CiAqICAgICAgICAgIGh0dHA6Ly9tYXBzLmdvb2dsZS5jb20vP2xsPTQ4Ljg1Nzk5NSwyLjI5NDI5NyZzcG49MC4wMDc2NjYsMC4wMjExMzYmdD1tJno9MTYKICogICAgICAgICAgaHR0cDovL21hcHMuZ29vZ2xlLmNvbS8/bGw9NDguODU5NDYzLDIuMjkyNjI2JnNwbj0wLjAwMDk2NSwwLjAwMjY0MiZ0PW0mej0xOSZsYXllcj1jJmNibGw9NDguODU5NTI0LDIuMjkyNTMyJnBhbm9pZD1ZSjBscTI4T095M1ZUMklxSXVWWTBnJmNicD0xMiwxNTEuNTgsLDAsLTE1LjU2CiAqLwooZnVuY3Rpb24gKCQpIHsKCSJ1c2Ugc3RyaWN0IjsKCgkvL1Nob3J0Y3V0IGZvciBmYW5jeUJveCBvYmplY3QKCXZhciBGID0gJC5mYW5jeWJveCwKCQlmb3JtYXQgPSBmdW5jdGlvbiggdXJsLCByZXosIHBhcmFtcyApIHsKCQkJcGFyYW1zID0gcGFyYW1zIHx8ICcnOwoKCQkJaWYgKCAkLnR5cGUoIHBhcmFtcyApID09PSAib2JqZWN0IiApIHsKCQkJCXBhcmFtcyA9ICQucGFyYW0ocGFyYW1zLCB0cnVlKTsKCQkJfQoKCQkJJC5lYWNoKHJleiwgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewoJCQkJdXJsID0gdXJsLnJlcGxhY2UoICckJyArIGtleSwgdmFsdWUgfHwgJycgKTsKCQkJfSk7CgoJCQlpZiAocGFyYW1zLmxlbmd0aCkgewoJCQkJdXJsICs9ICggdXJsLmluZGV4T2YoJz8nKSA+IDAgPyAnJicgOiAnPycgKSArIHBhcmFtczsKCQkJfQoKCQkJcmV0dXJuIHVybDsKCQl9OwoKCS8vQWRkIGhlbHBlciBvYmplY3QKCUYuaGVscGVycy5tZWRpYSA9IHsKCQlkZWZhdWx0cyA6IHsKCQkJeW91dHViZSA6IHsKCQkJCW1hdGNoZXIgOiAvKHlvdXR1YmVcLmNvbXx5b3V0dVwuYmUpXC8od2F0Y2hcP3Y9fHZcL3x1XC98ZW1iZWRcLz8pPyh2aWRlb3Nlcmllc1w/bGlzdD0oLiopfFtcdy1dezExfXxcP2xpc3RUeXBlPSguKikmbGlzdD0oLiopKS4qL2ksCgkJCQlwYXJhbXMgIDogewoJCQkJCWF1dG9wbGF5ICAgIDogMSwKCQkJCQlhdXRvaGlkZSAgICA6IDEsCgkJCQkJZnMgICAgICAgICAgOiAxLAoJCQkJCXJlbCAgICAgICAgIDogMCwKCQkJCQloZCAgICAgICAgICA6IDEsCgkJCQkJd21vZGUgICAgICAgOiAnb3BhcXVlJywKCQkJCQllbmFibGVqc2FwaSA6IDEKCQkJCX0sCgkJCQl0eXBlIDogJ2lmcmFtZScsCgkJCQl1cmwgIDogJy8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLyQzJwoJCQl9LAoJCQl2aW1lbyA6IHsKCQkJCW1hdGNoZXIgOiAvKD86dmltZW8oPzpwcm8pPy5jb20pXC8oPzpbXlxkXSspPyhcZCspKD86LiopLywKCQkJCXBhcmFtcyAgOiB7CgkJCQkJYXV0b3BsYXkgICAgICA6IDEsCgkJCQkJaGQgICAgICAgICAgICA6IDEsCgkJCQkJc2hvd190aXRsZSAgICA6IDEsCgkJCQkJc2hvd19ieWxpbmUgICA6IDEsCgkJCQkJc2hvd19wb3J0cmFpdCA6IDAsCgkJCQkJZnVsbHNjcmVlbiAgICA6IDEKCQkJCX0sCgkJCQl0eXBlIDogJ2lmcmFtZScsCgkJCQl1cmwgIDogJy8vcGxheWVyLnZpbWVvLmNvbS92aWRlby8kMScKCQkJfSwKCQkJbWV0YWNhZmUgOiB7CgkJCQltYXRjaGVyIDogL21ldGFjYWZlLmNvbVwvKD86d2F0Y2h8ZnBsYXllcilcLyhbXHdcLV17MSwxMH0pLywKCQkJCXBhcmFtcyAgOiB7CgkJCQkJYXV0b1BsYXkgOiAneWVzJwoJCQkJfSwKCQkJCXR5cGUgOiAnc3dmJywKCQkJCXVybCAgOiBmdW5jdGlvbiggcmV6LCBwYXJhbXMsIG9iaiApIHsKCQkJCQlvYmouc3dmLmZsYXNoVmFycyA9ICdwbGF5ZXJWYXJzPScgKyAkLnBhcmFtKCBwYXJhbXMsIHRydWUgKTsKCgkJCQkJcmV0dXJuICcvL3d3dy5tZXRhY2FmZS5jb20vZnBsYXllci8nICsgcmV6WzFdICsgJy8uc3dmJzsKCQkJCX0KCQkJfSwKCQkJZGFpbHltb3Rpb24gOiB7CgkJCQltYXRjaGVyIDogL2RhaWx5bW90aW9uLmNvbVwvdmlkZW9cLyguKilcLz8oLiopLywKCQkJCXBhcmFtcyAgOiB7CgkJCQkJYWRkaXRpb25hbEluZm9zIDogMCwKCQkJCQlhdXRvU3RhcnQgOiAxCgkJCQl9LAoJCQkJdHlwZSA6ICdzd2YnLAoJCQkJdXJsICA6ICcvL3d3dy5kYWlseW1vdGlvbi5jb20vc3dmL3ZpZGVvLyQxJwoJCQl9LAoJCQl0d2l0dmlkIDogewoJCQkJbWF0Y2hlciA6IC90d2l0dmlkXC5jb21cLyhbYS16QS1aMC05X1wtXD9cPV0rKS9pLAoJCQkJcGFyYW1zICA6IHsKCQkJCQlhdXRvcGxheSA6IDAKCQkJCX0sCgkJCQl0eXBlIDogJ2lmcmFtZScsCgkJCQl1cmwgIDogJy8vd3d3LnR3aXR2aWQuY29tL2VtYmVkLnBocD9ndWlkPSQxJwoJCQl9LAoJCQl0d2l0cGljIDogewoJCQkJbWF0Y2hlciA6IC90d2l0cGljXC5jb21cLyg/ISg/OnBsYWNlfHBob3Rvc3xldmVudHMpXC8pKFthLXpBLVowLTlcP1w9XC1dKykvaSwKCQkJCXR5cGUgOiAnaW1hZ2UnLAoJCQkJdXJsICA6ICcvL3R3aXRwaWMuY29tL3Nob3cvZnVsbC8kMS8nCgkJCX0sCgkJCWluc3RhZ3JhbSA6IHsKCQkJCW1hdGNoZXIgOiAvKGluc3RhZ3JcLmFtfGluc3RhZ3JhbVwuY29tKVwvcFwvKFthLXpBLVowLTlfXC1dKylcLz8vaSwKCQkJCXR5cGUgOiAnaW1hZ2UnLAoJCQkJdXJsICA6ICcvLyQxL3AvJDIvbWVkaWEvJwoJCQl9LAoJCQlnb29nbGVfbWFwcyA6IHsKCQkJCW1hdGNoZXIgOiAvbWFwc1wuZ29vZ2xlXC4oW2Etel17MiwzfShcLlthLXpdezJ9KT8pXC8oXD9sbD18bWFwc1w/KSguKikvaSwKCQkJCXR5cGUgOiAnaWZyYW1lJywKCQkJCXVybCAgOiBmdW5jdGlvbiggcmV6ICkgewoJCQkJCXJldHVybiAnLy9tYXBzLmdvb2dsZS4nICsgcmV6WzFdICsgJy8nICsgcmV6WzNdICsgJycgKyByZXpbNF0gKyAnJm91dHB1dD0nICsgKHJlels0XS5pbmRleE9mKCdsYXllcj1jJykgPiAwID8gJ3N2ZW1iZWQnIDogJ2VtYmVkJyk7CgkJCQl9CgkJCX0KCQl9LAoKCQliZWZvcmVMb2FkIDogZnVuY3Rpb24ob3B0cywgb2JqKSB7CgkJCXZhciB1cmwgICA9IG9iai5ocmVmIHx8ICcnLAoJCQkJdHlwZSAgPSBmYWxzZSwKCQkJCXdoYXQsCgkJCQlpdGVtLAoJCQkJcmV6LAoJCQkJcGFyYW1zOwoKCQkJZm9yICh3aGF0IGluIG9wdHMpIHsKCQkJCWl0ZW0gPSBvcHRzWyB3aGF0IF07CgkJCQlyZXogID0gdXJsLm1hdGNoKCBpdGVtLm1hdGNoZXIgKTsKCgkJCQlpZiAocmV6KSB7CgkJCQkJdHlwZSAgID0gaXRlbS50eXBlOwoJCQkJCXBhcmFtcyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBpdGVtLnBhcmFtcywgb2JqWyB3aGF0IF0gfHwgKCQuaXNQbGFpbk9iamVjdChvcHRzWyB3aGF0IF0pID8gb3B0c1sgd2hhdCBdLnBhcmFtcyA6IG51bGwpKTsKCgkJCQkJdXJsID0gJC50eXBlKCBpdGVtLnVybCApID09PSAiZnVuY3Rpb24iID8gaXRlbS51cmwuY2FsbCggdGhpcywgcmV6LCBwYXJhbXMsIG9iaiApIDogZm9ybWF0KCBpdGVtLnVybCwgcmV6LCBwYXJhbXMgKTsKCgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCgkJCWlmICh0eXBlKSB7CgkJCQlvYmouaHJlZiA9IHVybDsKCQkJCW9iai50eXBlID0gdHlwZTsKCgkJCQlvYmouYXV0b0hlaWdodCA9IGZhbHNlOwoJCQl9CgkJfQoJfTsKCn0oalF1ZXJ5KSk7]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/jquery.fancybox-thumbs.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[I2ZhbmN5Ym94LXRodW1icyB7Cglwb3NpdGlvbjogZml4ZWQ7CglsZWZ0OiAwOwoJd2lkdGg6IDEwMCU7CglvdmVyZmxvdzogaGlkZGVuOwoJei1pbmRleDogODA1MDsKfQoKI2ZhbmN5Ym94LXRodW1icy5ib3R0b20gewoJYm90dG9tOiAycHg7Cn0KCiNmYW5jeWJveC10aHVtYnMudG9wIHsKCXRvcDogMnB4Owp9CgojZmFuY3lib3gtdGh1bWJzIHVsIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKCWxpc3Qtc3R5bGU6IG5vbmU7CgltYXJnaW46IDA7CglwYWRkaW5nOiAwOwp9CgojZmFuY3lib3gtdGh1bWJzIHVsIGxpIHsKCWZsb2F0OiBsZWZ0OwoJcGFkZGluZzogMXB4OwoJb3BhY2l0eTogMC41Owp9CgojZmFuY3lib3gtdGh1bWJzIHVsIGxpLmFjdGl2ZSB7CglvcGFjaXR5OiAwLjc1OwoJcGFkZGluZzogMDsKCWJvcmRlcjogMXB4IHNvbGlkICNmZmY7Cn0KCiNmYW5jeWJveC10aHVtYnMgdWwgbGk6aG92ZXIgewoJb3BhY2l0eTogMTsKfQoKI2ZhbmN5Ym94LXRodW1icyB1bCBsaSBhIHsKCWRpc3BsYXk6IGJsb2NrOwoJcG9zaXRpb246IHJlbGF0aXZlOwoJb3ZlcmZsb3c6IGhpZGRlbjsKCWJvcmRlcjogMXB4IHNvbGlkICMyMjI7CgliYWNrZ3JvdW5kOiAjMTExOwoJb3V0bGluZTogbm9uZTsKfQoKI2ZhbmN5Ym94LXRodW1icyB1bCBsaSBpbWcgewoJZGlzcGxheTogYmxvY2s7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cglib3JkZXI6IDA7CglwYWRkaW5nOiAwOwp9]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/jquery.fancybox-thumbs.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IC8qIQogKiBUaHVtYm5haWwgaGVscGVyIGZvciBmYW5jeUJveAogKiB2ZXJzaW9uOiAxLjAuNyAoTW9uLCAwMSBPY3QgMjAxMikKICogQHJlcXVpcmVzIGZhbmN5Qm94IHYyLjAgb3IgbGF0ZXIKICoKICogVXNhZ2U6CiAqICAgICAkKCIuZmFuY3lib3giKS5mYW5jeWJveCh7CiAqICAgICAgICAgaGVscGVycyA6IHsKICogICAgICAgICAgICAgdGh1bWJzOiB7CiAqICAgICAgICAgICAgICAgICB3aWR0aCAgOiA1MCwKICogICAgICAgICAgICAgICAgIGhlaWdodCA6IDUwCiAqICAgICAgICAgICAgIH0KICogICAgICAgICB9CiAqICAgICB9KTsKICoKICovCihmdW5jdGlvbiAoJCkgewoJLy9TaG9ydGN1dCBmb3IgZmFuY3lCb3ggb2JqZWN0Cgl2YXIgRiA9ICQuZmFuY3lib3g7CgoJLy9BZGQgaGVscGVyIG9iamVjdAoJRi5oZWxwZXJzLnRodW1icyA9IHsKCQlkZWZhdWx0cyA6IHsKCQkJd2lkdGggICAgOiA1MCwgICAgICAgLy8gdGh1bWJuYWlsIHdpZHRoCgkJCWhlaWdodCAgIDogNTAsICAgICAgIC8vIHRodW1ibmFpbCBoZWlnaHQKCQkJcG9zaXRpb24gOiAnYm90dG9tJywgLy8gJ3RvcCcgb3IgJ2JvdHRvbScKCQkJc291cmNlICAgOiBmdW5jdGlvbiAoIGl0ZW0gKSB7ICAvLyBmdW5jdGlvbiB0byBvYnRhaW4gdGhlIFVSTCBvZiB0aGUgdGh1bWJuYWlsIGltYWdlCgkJCQl2YXIgaHJlZjsKCgkJCQlpZiAoaXRlbS5lbGVtZW50KSB7CgkJCQkJaHJlZiA9ICQoaXRlbS5lbGVtZW50KS5maW5kKCdpbWcnKS5hdHRyKCdzcmMnKTsKCQkJCX0KCgkJCQlpZiAoIWhyZWYgJiYgaXRlbS50eXBlID09PSAnaW1hZ2UnICYmIGl0ZW0uaHJlZikgewoJCQkJCWhyZWYgPSBpdGVtLmhyZWY7CgkJCQl9CgoJCQkJcmV0dXJuIGhyZWY7CgkJCX0KCQl9LAoKCQl3cmFwICA6IG51bGwsCgkJbGlzdCAgOiBudWxsLAoJCXdpZHRoIDogMCwKCgkJaW5pdDogZnVuY3Rpb24gKG9wdHMsIG9iaikgewoJCQl2YXIgdGhhdCA9IHRoaXMsCgkJCQlsaXN0LAoJCQkJdGh1bWJXaWR0aCAgPSBvcHRzLndpZHRoLAoJCQkJdGh1bWJIZWlnaHQgPSBvcHRzLmhlaWdodCwKCQkJCXRodW1iU291cmNlID0gb3B0cy5zb3VyY2U7CgoJCQkvL0J1aWxkIGxpc3Qgc3RydWN0dXJlCgkJCWxpc3QgPSAnJzsKCgkJCWZvciAodmFyIG4gPSAwOyBuIDwgb2JqLmdyb3VwLmxlbmd0aDsgbisrKSB7CgkJCQlsaXN0ICs9ICc8bGk+PGEgc3R5bGU9IndpZHRoOicgKyB0aHVtYldpZHRoICsgJ3B4O2hlaWdodDonICsgdGh1bWJIZWlnaHQgKyAncHg7IiBocmVmPSJqYXZhc2NyaXB0OmpRdWVyeS5mYW5jeWJveC5qdW1wdG8oJyArIG4gKyAnKTsiPjwvYT48L2xpPic7CgkJCX0KCgkJCXRoaXMud3JhcCA9ICQoJzxkaXYgaWQ9ImZhbmN5Ym94LXRodW1icyI+PC9kaXY+JykuYWRkQ2xhc3Mob3B0cy5wb3NpdGlvbikuYXBwZW5kVG8oJ2JvZHknKTsKCQkJdGhpcy5saXN0ID0gJCgnPHVsPicgKyBsaXN0ICsgJzwvdWw+JykuYXBwZW5kVG8odGhpcy53cmFwKTsKCgkJCS8vTG9hZCBlYWNoIHRodW1ibmFpbAoJCQkkLmVhY2gob2JqLmdyb3VwLCBmdW5jdGlvbiAoaSkgewoJCQkJdmFyIGhyZWYgPSB0aHVtYlNvdXJjZSggb2JqLmdyb3VwWyBpIF0gKTsKCgkJCQlpZiAoIWhyZWYpIHsKCQkJCQlyZXR1cm47CgkJCQl9CgoJCQkJJCgiPGltZyAvPiIpLmxvYWQoZnVuY3Rpb24gKCkgewoJCQkJCXZhciB3aWR0aCAgPSB0aGlzLndpZHRoLAoJCQkJCQloZWlnaHQgPSB0aGlzLmhlaWdodCwKCQkJCQkJd2lkdGhSYXRpbywgaGVpZ2h0UmF0aW8sIHBhcmVudDsKCgkJCQkJaWYgKCF0aGF0Lmxpc3QgfHwgIXdpZHRoIHx8ICFoZWlnaHQpIHsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCgkJCQkJLy9DYWxjdWxhdGUgdGh1bWJuYWlsIHdpZHRoL2hlaWdodCBhbmQgY2VudGVyIGl0CgkJCQkJd2lkdGhSYXRpbyAgPSB3aWR0aCAvIHRodW1iV2lkdGg7CgkJCQkJaGVpZ2h0UmF0aW8gPSBoZWlnaHQgLyB0aHVtYkhlaWdodDsKCgkJCQkJcGFyZW50ID0gdGhhdC5saXN0LmNoaWxkcmVuKCkuZXEoaSkuZmluZCgnYScpOwoKCQkJCQlpZiAod2lkdGhSYXRpbyA+PSAxICYmIGhlaWdodFJhdGlvID49IDEpIHsKCQkJCQkJaWYgKHdpZHRoUmF0aW8gPiBoZWlnaHRSYXRpbykgewoJCQkJCQkJd2lkdGggID0gTWF0aC5mbG9vcih3aWR0aCAvIGhlaWdodFJhdGlvKTsKCQkJCQkJCWhlaWdodCA9IHRodW1iSGVpZ2h0OwoKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXdpZHRoICA9IHRodW1iV2lkdGg7CgkJCQkJCQloZWlnaHQgPSBNYXRoLmZsb29yKGhlaWdodCAvIHdpZHRoUmF0aW8pOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkkKHRoaXMpLmNzcyh7CgkJCQkJCXdpZHRoICA6IHdpZHRoLAoJCQkJCQloZWlnaHQgOiBoZWlnaHQsCgkJCQkJCXRvcCAgICA6IE1hdGguZmxvb3IodGh1bWJIZWlnaHQgLyAyIC0gaGVpZ2h0IC8gMiksCgkJCQkJCWxlZnQgICA6IE1hdGguZmxvb3IodGh1bWJXaWR0aCAvIDIgLSB3aWR0aCAvIDIpCgkJCQkJfSk7CgoJCQkJCXBhcmVudC53aWR0aCh0aHVtYldpZHRoKS5oZWlnaHQodGh1bWJIZWlnaHQpOwoKCQkJCQkkKHRoaXMpLmhpZGUoKS5hcHBlbmRUbyhwYXJlbnQpLmZhZGVJbigzMDApOwoKCQkJCX0pLmF0dHIoJ3NyYycsIGhyZWYpOwoJCQl9KTsKCgkJCS8vU2V0IGluaXRpYWwgd2lkdGgKCQkJdGhpcy53aWR0aCA9IHRoaXMubGlzdC5jaGlsZHJlbigpLmVxKDApLm91dGVyV2lkdGgodHJ1ZSk7CgoJCQl0aGlzLmxpc3Qud2lkdGgodGhpcy53aWR0aCAqIChvYmouZ3JvdXAubGVuZ3RoICsgMSkpLmNzcygnbGVmdCcsIE1hdGguZmxvb3IoJCh3aW5kb3cpLndpZHRoKCkgKiAwLjUgLSAob2JqLmluZGV4ICogdGhpcy53aWR0aCArIHRoaXMud2lkdGggKiAwLjUpKSk7CgkJfSwKCgkJYmVmb3JlTG9hZDogZnVuY3Rpb24gKG9wdHMsIG9iaikgewoJCQkvL1JlbW92ZSBzZWxmIGlmIGdhbGxlcnkgZG8gbm90IGhhdmUgYXQgbGVhc3QgdHdvIGl0ZW1zCgkJCWlmIChvYmouZ3JvdXAubGVuZ3RoIDwgMikgewoJCQkJb2JqLmhlbHBlcnMudGh1bWJzID0gZmFsc2U7CgoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvL0luY3JlYXNlIGJvdHRvbSBtYXJnaW4gdG8gZ2l2ZSBzcGFjZSBmb3IgdGh1bWJzCgkJCW9iai5tYXJnaW5bIG9wdHMucG9zaXRpb24gPT09ICd0b3AnID8gMCA6IDIgXSArPSAoKG9wdHMuaGVpZ2h0KSArIDE1KTsKCQl9LAoKCQlhZnRlclNob3c6IGZ1bmN0aW9uIChvcHRzLCBvYmopIHsKCQkJLy9DaGVjayBpZiBleGlzdHMgYW5kIGNyZWF0ZSBvciB1cGRhdGUgbGlzdAoJCQlpZiAodGhpcy5saXN0KSB7CgkJCQl0aGlzLm9uVXBkYXRlKG9wdHMsIG9iaik7CgoJCQl9IGVsc2UgewoJCQkJdGhpcy5pbml0KG9wdHMsIG9iaik7CgkJCX0KCgkJCS8vU2V0IGFjdGl2ZSBlbGVtZW50CgkJCXRoaXMubGlzdC5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKS5lcShvYmouaW5kZXgpLmFkZENsYXNzKCdhY3RpdmUnKTsKCQl9LAoKCQkvL0NlbnRlciBsaXN0CgkJb25VcGRhdGU6IGZ1bmN0aW9uIChvcHRzLCBvYmopIHsKCQkJaWYgKHRoaXMubGlzdCkgewoJCQkJdGhpcy5saXN0LnN0b3AodHJ1ZSkuYW5pbWF0ZSh7CgkJCQkJJ2xlZnQnOiBNYXRoLmZsb29yKCQod2luZG93KS53aWR0aCgpICogMC41IC0gKG9iai5pbmRleCAqIHRoaXMud2lkdGggKyB0aGlzLndpZHRoICogMC41KSkKCQkJCX0sIDE1MCk7CgkJCX0KCQl9LAoKCQliZWZvcmVDbG9zZTogZnVuY3Rpb24gKCkgewoJCQlpZiAodGhpcy53cmFwKSB7CgkJCQl0aGlzLndyYXAucmVtb3ZlKCk7CgkJCX0KCgkJCXRoaXMud3JhcCAgPSBudWxsOwoJCQl0aGlzLmxpc3QgID0gbnVsbDsKCQkJdGhpcy53aWR0aCA9IDA7CgkJfQoJfQoKfShqUXVlcnkpKTs=]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSBhcnJheSgnanF1ZXJ5LmZhbmN5Ym94LnBhY2suanMnLCdqcXVlcnkubW91c2V3aGVlbC0zLjAuNi5wYWNrLmpzJyk7CiRpbmZvWydkZXBlbmRzJ10gPSAnanF1ZXJ5JzsKJGluZm9bJ2NzcyddID0gJ2pxdWVyeS5mYW5jeWJveC5jc3MnOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/jquery.fancybox.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGZhbmN5Qm94IHYyLjEuMyBmYW5jeWFwcHMuY29tIHwgZmFuY3lhcHBzLmNvbS9mYW5jeWJveC8jbGljZW5zZSAqLwouZmFuY3lib3gtd3JhcCwKLmZhbmN5Ym94LXNraW4sCi5mYW5jeWJveC1vdXRlciwKLmZhbmN5Ym94LWlubmVyLAouZmFuY3lib3gtaW1hZ2UsCi5mYW5jeWJveC13cmFwIGlmcmFtZSwKLmZhbmN5Ym94LXdyYXAgb2JqZWN0LAouZmFuY3lib3gtbmF2LAouZmFuY3lib3gtbmF2IHNwYW4sCi5mYW5jeWJveC10bXAKewoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKCWJvcmRlcjogMDsKCW91dGxpbmU6IG5vbmU7Cgl2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9CgouZmFuY3lib3gtd3JhcCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJei1pbmRleDogODAyMDsKfQoKLmZhbmN5Ym94LXNraW4gewoJcG9zaXRpb246IHJlbGF0aXZlOwoJYmFja2dyb3VuZDogI2Y5ZjlmOTsKCWNvbG9yOiAjNDQ0OwoJdGV4dC1zaGFkb3c6IG5vbmU7Cgktd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsKCSAgIC1tb3otYm9yZGVyLXJhZGl1czogNHB4OwoJICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7Cn0KCi5mYW5jeWJveC1vcGVuZWQgewoJei1pbmRleDogODAzMDsKfQoKLmZhbmN5Ym94LW9wZW5lZCAuZmFuY3lib3gtc2tpbiB7Cgktd2Via2l0LWJveC1zaGFkb3c6IDAgMTBweCAyNXB4IHJnYmEoMCwgMCwgMCwgMC41KTsKCSAgIC1tb3otYm94LXNoYWRvdzogMCAxMHB4IDI1cHggcmdiYSgwLCAwLCAwLCAwLjUpOwoJICAgICAgICBib3gtc2hhZG93OiAwIDEwcHggMjVweCByZ2JhKDAsIDAsIDAsIDAuNSk7Cn0KCi5mYW5jeWJveC1vdXRlciwgLmZhbmN5Ym94LWlubmVyIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLmZhbmN5Ym94LWlubmVyIHsKCW92ZXJmbG93OiBoaWRkZW47Cn0KCi5mYW5jeWJveC10eXBlLWlmcmFtZSAuZmFuY3lib3gtaW5uZXIgewoJLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwp9CgouZmFuY3lib3gtZXJyb3IgewoJY29sb3I6ICM0NDQ7Cglmb250OiAxNHB4LzIwcHggIkhlbHZldGljYSBOZXVlIixIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjsKCW1hcmdpbjogMDsKCXBhZGRpbmc6IDE1cHg7Cgl3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgouZmFuY3lib3gtaW1hZ2UsIC5mYW5jeWJveC1pZnJhbWUgewoJZGlzcGxheTogYmxvY2s7Cgl3aWR0aDogMTAwJTsKCWhlaWdodDogMTAwJTsKfQoKLmZhbmN5Ym94LWltYWdlIHsKCW1heC13aWR0aDogMTAwJTsKCW1heC1oZWlnaHQ6IDEwMCU7Cn0KCiNmYW5jeWJveC1sb2FkaW5nLCAuZmFuY3lib3gtY2xvc2UsIC5mYW5jeWJveC1wcmV2IHNwYW4sIC5mYW5jeWJveC1uZXh0IHNwYW4gewoJYmFja2dyb3VuZC1pbWFnZTogdXJsKCdmYW5jeWJveF9zcHJpdGUucG5nJyk7Cn0KCiNmYW5jeWJveC1sb2FkaW5nIHsKCXBvc2l0aW9uOiBmaXhlZDsKCXRvcDogNTAlOwoJbGVmdDogNTAlOwoJbWFyZ2luLXRvcDogLTIycHg7CgltYXJnaW4tbGVmdDogLTIycHg7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xMDhweDsKCW9wYWNpdHk6IDAuODsKCWN1cnNvcjogcG9pbnRlcjsKCXotaW5kZXg6IDgwNjA7Cn0KCiNmYW5jeWJveC1sb2FkaW5nIGRpdiB7Cgl3aWR0aDogNDRweDsKCWhlaWdodDogNDRweDsKCWJhY2tncm91bmQ6IHVybCgnZmFuY3lib3hfbG9hZGluZy5naWYnKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDsKfQoKLmZhbmN5Ym94LWNsb3NlIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogLTE4cHg7CglyaWdodDogLTE4cHg7Cgl3aWR0aDogMzZweDsKCWhlaWdodDogMzZweDsKCWN1cnNvcjogcG9pbnRlcjsKCXotaW5kZXg6IDgwNDA7Cn0KCi5mYW5jeWJveC1uYXYgewoJcG9zaXRpb246IGFic29sdXRlOwoJdG9wOiAwOwoJd2lkdGg6IDQwJTsKCWhlaWdodDogMTAwJTsKCWN1cnNvcjogcG9pbnRlcjsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCgnYmxhbmsuZ2lmJyk7IC8qIGhlbHBzIElFICovCgktd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7Cgl6LWluZGV4OiA4MDQwOwp9CgouZmFuY3lib3gtcHJldiB7CglsZWZ0OiAwOwp9CgouZmFuY3lib3gtbmV4dCB7CglyaWdodDogMDsKfQoKLmZhbmN5Ym94LW5hdiBzcGFuIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogNTAlOwoJd2lkdGg6IDM2cHg7CgloZWlnaHQ6IDM0cHg7CgltYXJnaW4tdG9wOiAtMThweDsKCWN1cnNvcjogcG9pbnRlcjsKCXotaW5kZXg6IDgwNDA7Cgl2aXNpYmlsaXR5OiBoaWRkZW47Cn0KCi5mYW5jeWJveC1wcmV2IHNwYW4gewoJbGVmdDogMTBweDsKCWJhY2tncm91bmQtcG9zaXRpb246IDAgLTM2cHg7Cn0KCi5mYW5jeWJveC1uZXh0IHNwYW4gewoJcmlnaHQ6IDEwcHg7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC03MnB4Owp9CgouZmFuY3lib3gtbmF2OmhvdmVyIHNwYW4gewoJdmlzaWJpbGl0eTogdmlzaWJsZTsKfQoKLmZhbmN5Ym94LXRtcCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IC05OTk5OXB4OwoJbGVmdDogLTk5OTk5cHg7Cgl2aXNpYmlsaXR5OiBoaWRkZW47CgltYXgtd2lkdGg6IDk5OTk5cHg7CgltYXgtaGVpZ2h0OiA5OTk5OXB4OwoJb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsKfQoKLyogT3ZlcmxheSBoZWxwZXIgKi8KCi5mYW5jeWJveC1sb2NrIHsKCW92ZXJmbG93OiBoaWRkZW47Cn0KCi5mYW5jeWJveC1vdmVybGF5IHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogMDsKCWxlZnQ6IDA7CglvdmVyZmxvdzogaGlkZGVuOwoJZGlzcGxheTogbm9uZTsKCXotaW5kZXg6IDgwMTA7CgliYWNrZ3JvdW5kOiB1cmwoJ2ZhbmN5Ym94X292ZXJsYXkucG5nJyk7Cn0KCi5mYW5jeWJveC1vdmVybGF5LWZpeGVkIHsKCXBvc2l0aW9uOiBmaXhlZDsKCWJvdHRvbTogMDsKCXJpZ2h0OiAwOwp9CgouZmFuY3lib3gtbG9jayAuZmFuY3lib3gtb3ZlcmxheSB7CglvdmVyZmxvdzogYXV0bzsKCW92ZXJmbG93LXk6IHNjcm9sbDsKfQoKLyogVGl0bGUgaGVscGVyICovCgouZmFuY3lib3gtdGl0bGUgewoJdmlzaWJpbGl0eTogaGlkZGVuOwoJZm9udDogbm9ybWFsIDEzcHgvMjBweCAiSGVsdmV0aWNhIE5ldWUiLEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmOwoJcG9zaXRpb246IHJlbGF0aXZlOwoJdGV4dC1zaGFkb3c6IG5vbmU7Cgl6LWluZGV4OiA4MDUwOwp9CgouZmFuY3lib3gtb3BlbmVkIC5mYW5jeWJveC10aXRsZSB7Cgl2aXNpYmlsaXR5OiB2aXNpYmxlOwp9CgouZmFuY3lib3gtdGl0bGUtZmxvYXQtd3JhcCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cglib3R0b206IDA7CglyaWdodDogNTAlOwoJbWFyZ2luLWJvdHRvbTogLTM1cHg7Cgl6LWluZGV4OiA4MDUwOwoJdGV4dC1hbGlnbjogY2VudGVyOwp9CgouZmFuY3lib3gtdGl0bGUtZmxvYXQtd3JhcCAuY2hpbGQgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJbWFyZ2luLXJpZ2h0OiAtMTAwJTsKCXBhZGRpbmc6IDJweCAyMHB4OwoJYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IC8qIEZhbGxiYWNrIGZvciB3ZWIgYnJvd3NlcnMgdGhhdCBkb2Vzbid0IHN1cHBvcnQgUkdCYSAqLwoJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjgpOwoJLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxNXB4OwoJICAgLW1vei1ib3JkZXItcmFkaXVzOiAxNXB4OwoJICAgICAgICBib3JkZXItcmFkaXVzOiAxNXB4OwoJdGV4dC1zaGFkb3c6IDAgMXB4IDJweCAjMjIyOwoJY29sb3I6ICNGRkY7Cglmb250LXdlaWdodDogYm9sZDsKCWxpbmUtaGVpZ2h0OiAyNHB4OwoJd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLmZhbmN5Ym94LXRpdGxlLW91dHNpZGUtd3JhcCB7Cglwb3NpdGlvbjogcmVsYXRpdmU7CgltYXJnaW4tdG9wOiAxMHB4OwoJY29sb3I6ICNmZmY7Cn0KCi5mYW5jeWJveC10aXRsZS1pbnNpZGUtd3JhcCB7CglwYWRkaW5nLXRvcDogMTBweDsKfQoKLmZhbmN5Ym94LXRpdGxlLW92ZXItd3JhcCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cglib3R0b206IDA7CglsZWZ0OiAwOwoJY29sb3I6ICNmZmY7CglwYWRkaW5nOiAxMHB4OwoJYmFja2dyb3VuZDogIzAwMDsKCWJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgLjgpOwp9]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/jquery.fancybox.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGZhbmN5Qm94IC0galF1ZXJ5IFBsdWdpbgogKiB2ZXJzaW9uOiAyLjEuMyAoVHVlLCAyMyBPY3QgMjAxMikKICogQHJlcXVpcmVzIGpRdWVyeSB2MS42IG9yIGxhdGVyCiAqCiAqIEV4YW1wbGVzIGF0IGh0dHA6Ly9mYW5jeWFwcHMuY29tL2ZhbmN5Ym94LwogKiBMaWNlbnNlOiB3d3cuZmFuY3lhcHBzLmNvbS9mYW5jeWJveC8jbGljZW5zZQogKgogKiBDb3B5cmlnaHQgMjAxMiBKYW5pcyBTa2FybmVsaXMgLSBqYW5pc0BmYW5jeWFwcHMuY29tCiAqCiAqLwoKKGZ1bmN0aW9uICh3aW5kb3csIGRvY3VtZW50LCAkLCB1bmRlZmluZWQpIHsKCSJ1c2Ugc3RyaWN0IjsKCgl2YXIgVyA9ICQod2luZG93KSwKCQlEID0gJChkb2N1bWVudCksCgkJRiA9ICQuZmFuY3lib3ggPSBmdW5jdGlvbiAoKSB7CgkJCUYub3Blbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfSwKCQlkaWRVcGRhdGUgPSBudWxsLAoJCWlzVG91Y2gJICA9IGRvY3VtZW50LmNyZWF0ZVRvdWNoICE9PSB1bmRlZmluZWQsCgoJCWlzUXVlcnkJPSBmdW5jdGlvbihvYmopIHsKCQkJcmV0dXJuIG9iaiAmJiBvYmouaGFzT3duUHJvcGVydHkgJiYgb2JqIGluc3RhbmNlb2YgJDsKCQl9LAoJCWlzU3RyaW5nID0gZnVuY3Rpb24oc3RyKSB7CgkJCXJldHVybiBzdHIgJiYgJC50eXBlKHN0cikgPT09ICJzdHJpbmciOwoJCX0sCgkJaXNQZXJjZW50YWdlID0gZnVuY3Rpb24oc3RyKSB7CgkJCXJldHVybiBpc1N0cmluZyhzdHIpICYmIHN0ci5pbmRleE9mKCclJykgPiAwOwoJCX0sCgkJaXNTY3JvbGxhYmxlID0gZnVuY3Rpb24oZWwpIHsKCQkJcmV0dXJuIChlbCAmJiAhKGVsLnN0eWxlLm92ZXJmbG93ICYmIGVsLnN0eWxlLm92ZXJmbG93ID09PSAnaGlkZGVuJykgJiYgKChlbC5jbGllbnRXaWR0aCAmJiBlbC5zY3JvbGxXaWR0aCA+IGVsLmNsaWVudFdpZHRoKSB8fCAoZWwuY2xpZW50SGVpZ2h0ICYmIGVsLnNjcm9sbEhlaWdodCA+IGVsLmNsaWVudEhlaWdodCkpKTsKCQl9LAoJCWdldFNjYWxhciA9IGZ1bmN0aW9uKG9yaWcsIGRpbSkgewoJCQl2YXIgdmFsdWUgPSBwYXJzZUludChvcmlnLCAxMCkgfHwgMDsKCgkJCWlmIChkaW0gJiYgaXNQZXJjZW50YWdlKG9yaWcpKSB7CgkJCQl2YWx1ZSA9IEYuZ2V0Vmlld3BvcnQoKVsgZGltIF0gLyAxMDAgKiB2YWx1ZTsKCQkJfQoKCQkJcmV0dXJuIE1hdGguY2VpbCh2YWx1ZSk7CgkJfSwKCQlnZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlLCBkaW0pIHsKCQkJcmV0dXJuIGdldFNjYWxhcih2YWx1ZSwgZGltKSArICdweCc7CgkJfTsKCgkkLmV4dGVuZChGLCB7CgkJLy8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBmYW5jeUJveAoJCXZlcnNpb246ICcyLjEuMycsCgoJCWRlZmF1bHRzOiB7CgkJCXBhZGRpbmcgOiAxNSwKCQkJbWFyZ2luICA6IDIwLAoKCQkJd2lkdGggICAgIDogODAwLAoJCQloZWlnaHQgICAgOiA2MDAsCgkJCW1pbldpZHRoICA6IDEwMCwKCQkJbWluSGVpZ2h0IDogMTAwLAoJCQltYXhXaWR0aCAgOiA5OTk5LAoJCQltYXhIZWlnaHQgOiA5OTk5LAoKCQkJYXV0b1NpemUgICA6IHRydWUsCgkJCWF1dG9IZWlnaHQgOiBmYWxzZSwKCQkJYXV0b1dpZHRoICA6IGZhbHNlLAoKCQkJYXV0b1Jlc2l6ZSAgOiB0cnVlLAoJCQlhdXRvQ2VudGVyICA6ICFpc1RvdWNoLAoJCQlmaXRUb1ZpZXcgICA6IHRydWUsCgkJCWFzcGVjdFJhdGlvIDogZmFsc2UsCgkJCXRvcFJhdGlvICAgIDogMC41LAoJCQlsZWZ0UmF0aW8gICA6IDAuNSwKCgkJCXNjcm9sbGluZyA6ICdhdXRvJywgLy8gJ2F1dG8nLCAneWVzJyBvciAnbm8nCgkJCXdyYXBDU1MgICA6ICcnLAoKCQkJYXJyb3dzICAgICA6IHRydWUsCgkJCWNsb3NlQnRuICAgOiB0cnVlLAoJCQljbG9zZUNsaWNrIDogZmFsc2UsCgkJCW5leHRDbGljayAgOiBmYWxzZSwKCQkJbW91c2VXaGVlbCA6IHRydWUsCgkJCWF1dG9QbGF5ICAgOiBmYWxzZSwKCQkJcGxheVNwZWVkICA6IDMwMDAsCgkJCXByZWxvYWQgICAgOiAzLAoJCQltb2RhbCAgICAgIDogZmFsc2UsCgkJCWxvb3AgICAgICAgOiB0cnVlLAoKCQkJYWpheCAgOiB7CgkJCQlkYXRhVHlwZSA6ICdodG1sJywKCQkJCWhlYWRlcnMgIDogeyAnWC1mYW5jeUJveCc6IHRydWUgfQoJCQl9LAoJCQlpZnJhbWUgOiB7CgkJCQlzY3JvbGxpbmcgOiAnYXV0bycsCgkJCQlwcmVsb2FkICAgOiB0cnVlCgkJCX0sCgkJCXN3ZiA6IHsKCQkJCXdtb2RlOiAndHJhbnNwYXJlbnQnLAoJCQkJYWxsb3dmdWxsc2NyZWVuICAgOiAndHJ1ZScsCgkJCQlhbGxvd3NjcmlwdGFjY2VzcyA6ICdhbHdheXMnCgkJCX0sCgoJCQlrZXlzICA6IHsKCQkJCW5leHQgOiB7CgkJCQkJMTMgOiAnbGVmdCcsIC8vIGVudGVyCgkJCQkJMzQgOiAndXAnLCAgIC8vIHBhZ2UgZG93bgoJCQkJCTM5IDogJ2xlZnQnLCAvLyByaWdodCBhcnJvdwoJCQkJCTQwIDogJ3VwJyAgICAvLyBkb3duIGFycm93CgkJCQl9LAoJCQkJcHJldiA6IHsKCQkJCQk4ICA6ICdyaWdodCcsICAvLyBiYWNrc3BhY2UKCQkJCQkzMyA6ICdkb3duJywgICAvLyBwYWdlIHVwCgkJCQkJMzcgOiAncmlnaHQnLCAgLy8gbGVmdCBhcnJvdwoJCQkJCTM4IDogJ2Rvd24nICAgIC8vIHVwIGFycm93CgkJCQl9LAoJCQkJY2xvc2UgIDogWzI3XSwgLy8gZXNjYXBlIGtleQoJCQkJcGxheSAgIDogWzMyXSwgLy8gc3BhY2UgLSBzdGFydC9zdG9wIHNsaWRlc2hvdwoJCQkJdG9nZ2xlIDogWzcwXSAgLy8gbGV0dGVyICJmIiAtIHRvZ2dsZSBmdWxsc2NyZWVuCgkJCX0sCgoJCQlkaXJlY3Rpb24gOiB7CgkJCQluZXh0IDogJ2xlZnQnLAoJCQkJcHJldiA6ICdyaWdodCcKCQkJfSwKCgkJCXNjcm9sbE91dHNpZGUgIDogdHJ1ZSwKCgkJCS8vIE92ZXJyaWRlIHNvbWUgcHJvcGVydGllcwoJCQlpbmRleCAgIDogMCwKCQkJdHlwZSAgICA6IG51bGwsCgkJCWhyZWYgICAgOiBudWxsLAoJCQljb250ZW50IDogbnVsbCwKCQkJdGl0bGUgICA6IG51bGwsCgoJCQkvLyBIVE1MIHRlbXBsYXRlcwoJCQl0cGw6IHsKCQkJCXdyYXAgICAgIDogJzxkaXYgY2xhc3M9ImZhbmN5Ym94LXdyYXAiIHRhYkluZGV4PSItMSI+PGRpdiBjbGFzcz0iZmFuY3lib3gtc2tpbiI+PGRpdiBjbGFzcz0iZmFuY3lib3gtb3V0ZXIiPjxkaXYgY2xhc3M9ImZhbmN5Ym94LWlubmVyIj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4nLAoJCQkJaW1hZ2UgICAgOiAnPGltZyBjbGFzcz0iZmFuY3lib3gtaW1hZ2UiIHNyYz0ie2hyZWZ9IiBhbHQ9IiIgLz4nLAoJCQkJaWZyYW1lICAgOiAnPGlmcmFtZSBpZD0iZmFuY3lib3gtZnJhbWV7cm5kfSIgbmFtZT0iZmFuY3lib3gtZnJhbWV7cm5kfSIgY2xhc3M9ImZhbmN5Ym94LWlmcmFtZSIgZnJhbWVib3JkZXI9IjAiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiB3ZWJraXRBbGxvd0Z1bGxTY3JlZW4gbW96YWxsb3dmdWxsc2NyZWVuIGFsbG93RnVsbFNjcmVlbicgKyAoJC5icm93c2VyLm1zaWUgPyAnIGFsbG93dHJhbnNwYXJlbmN5PSJ0cnVlIicgOiAnJykgKyAnPjwvaWZyYW1lPicsCgkJCQllcnJvciAgICA6ICc8cCBjbGFzcz0iZmFuY3lib3gtZXJyb3IiPlRoZSByZXF1ZXN0ZWQgY29udGVudCBjYW5ub3QgYmUgbG9hZGVkLjxici8+UGxlYXNlIHRyeSBhZ2FpbiBsYXRlci48L3A+JywKCQkJCWNsb3NlQnRuIDogJzxhIHRpdGxlPSJDbG9zZSIgY2xhc3M9ImZhbmN5Ym94LWl0ZW0gZmFuY3lib3gtY2xvc2UiIGhyZWY9ImphdmFzY3JpcHQ6OyI+PC9hPicsCgkJCQluZXh0ICAgICA6ICc8YSB0aXRsZT0iTmV4dCIgY2xhc3M9ImZhbmN5Ym94LW5hdiBmYW5jeWJveC1uZXh0IiBocmVmPSJqYXZhc2NyaXB0OjsiPjxzcGFuPjwvc3Bhbj48L2E+JywKCQkJCXByZXYgICAgIDogJzxhIHRpdGxlPSJQcmV2aW91cyIgY2xhc3M9ImZhbmN5Ym94LW5hdiBmYW5jeWJveC1wcmV2IiBocmVmPSJqYXZhc2NyaXB0OjsiPjxzcGFuPjwvc3Bhbj48L2E+JwoJCQl9LAoKCQkJLy8gUHJvcGVydGllcyBmb3IgZWFjaCBhbmltYXRpb24gdHlwZQoJCQkvLyBPcGVuaW5nIGZhbmN5Qm94CgkJCW9wZW5FZmZlY3QgIDogJ2ZhZGUnLCAvLyAnZWxhc3RpYycsICdmYWRlJyBvciAnbm9uZScKCQkJb3BlblNwZWVkICAgOiAyNTAsCgkJCW9wZW5FYXNpbmcgIDogJ3N3aW5nJywKCQkJb3Blbk9wYWNpdHkgOiB0cnVlLAoJCQlvcGVuTWV0aG9kICA6ICd6b29tSW4nLAoKCQkJLy8gQ2xvc2luZyBmYW5jeUJveAoJCQljbG9zZUVmZmVjdCAgOiAnZmFkZScsIC8vICdlbGFzdGljJywgJ2ZhZGUnIG9yICdub25lJwoJCQljbG9zZVNwZWVkICAgOiAyNTAsCgkJCWNsb3NlRWFzaW5nICA6ICdzd2luZycsCgkJCWNsb3NlT3BhY2l0eSA6IHRydWUsCgkJCWNsb3NlTWV0aG9kICA6ICd6b29tT3V0JywKCgkJCS8vIENoYW5naW5nIG5leHQgZ2FsbGVyeSBpdGVtCgkJCW5leHRFZmZlY3QgOiAnZWxhc3RpYycsIC8vICdlbGFzdGljJywgJ2ZhZGUnIG9yICdub25lJwoJCQluZXh0U3BlZWQgIDogMjUwLAoJCQluZXh0RWFzaW5nIDogJ3N3aW5nJywKCQkJbmV4dE1ldGhvZCA6ICdjaGFuZ2VJbicsCgoJCQkvLyBDaGFuZ2luZyBwcmV2aW91cyBnYWxsZXJ5IGl0ZW0KCQkJcHJldkVmZmVjdCA6ICdlbGFzdGljJywgLy8gJ2VsYXN0aWMnLCAnZmFkZScgb3IgJ25vbmUnCgkJCXByZXZTcGVlZCAgOiAyNTAsCgkJCXByZXZFYXNpbmcgOiAnc3dpbmcnLAoJCQlwcmV2TWV0aG9kIDogJ2NoYW5nZU91dCcsCgoJCQkvLyBFbmFibGUgZGVmYXVsdCBoZWxwZXJzCgkJCWhlbHBlcnMgOiB7CgkJCQlvdmVybGF5IDogdHJ1ZSwKCQkJCXRpdGxlICAgOiB0cnVlCgkJCX0sCgoJCQkvLyBDYWxsYmFja3MKCQkJb25DYW5jZWwgICAgIDogJC5ub29wLCAvLyBJZiBjYW5jZWxpbmcKCQkJYmVmb3JlTG9hZCAgIDogJC5ub29wLCAvLyBCZWZvcmUgbG9hZGluZwoJCQlhZnRlckxvYWQgICAgOiAkLm5vb3AsIC8vIEFmdGVyIGxvYWRpbmcKCQkJYmVmb3JlU2hvdyAgIDogJC5ub29wLCAvLyBCZWZvcmUgY2hhbmdpbmcgaW4gY3VycmVudCBpdGVtCgkJCWFmdGVyU2hvdyAgICA6ICQubm9vcCwgLy8gQWZ0ZXIgb3BlbmluZwoJCQliZWZvcmVDaGFuZ2UgOiAkLm5vb3AsIC8vIEJlZm9yZSBjaGFuZ2luZyBnYWxsZXJ5IGl0ZW0KCQkJYmVmb3JlQ2xvc2UgIDogJC5ub29wLCAvLyBCZWZvcmUgY2xvc2luZwoJCQlhZnRlckNsb3NlICAgOiAkLm5vb3AgIC8vIEFmdGVyIGNsb3NpbmcKCQl9LAoKCQkvL0N1cnJlbnQgc3RhdGUKCQlncm91cCAgICA6IHt9LCAvLyBTZWxlY3RlZCBncm91cAoJCW9wdHMgICAgIDoge30sIC8vIEdyb3VwIG9wdGlvbnMKCQlwcmV2aW91cyA6IG51bGwsICAvLyBQcmV2aW91cyBlbGVtZW50CgkJY29taW5nICAgOiBudWxsLCAgLy8gRWxlbWVudCBiZWluZyBsb2FkZWQKCQljdXJyZW50ICA6IG51bGwsICAvLyBDdXJyZW50bHkgbG9hZGVkIGVsZW1lbnQKCQlpc0FjdGl2ZSA6IGZhbHNlLCAvLyBJcyBhY3RpdmF0ZWQKCQlpc09wZW4gICA6IGZhbHNlLCAvLyBJcyBjdXJyZW50bHkgb3BlbgoJCWlzT3BlbmVkIDogZmFsc2UsIC8vIEhhdmUgYmVlbiBmdWxseSBvcGVuZWQgYXQgbGVhc3Qgb25jZQoKCQl3cmFwICA6IG51bGwsCgkJc2tpbiAgOiBudWxsLAoJCW91dGVyIDogbnVsbCwKCQlpbm5lciA6IG51bGwsCgoJCXBsYXllciA6IHsKCQkJdGltZXIgICAgOiBudWxsLAoJCQlpc0FjdGl2ZSA6IGZhbHNlCgkJfSwKCgkJLy8gTG9hZGVycwoJCWFqYXhMb2FkICAgOiBudWxsLAoJCWltZ1ByZWxvYWQgOiBudWxsLAoKCQkvLyBTb21lIGNvbGxlY3Rpb25zCgkJdHJhbnNpdGlvbnMgOiB7fSwKCQloZWxwZXJzICAgICA6IHt9LAoKCQkvKgoJCSAqCVN0YXRpYyBtZXRob2RzCgkJICovCgoJCW9wZW46IGZ1bmN0aW9uIChncm91cCwgb3B0cykgewoJCQlpZiAoIWdyb3VwKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCWlmICghJC5pc1BsYWluT2JqZWN0KG9wdHMpKSB7CgkJCQlvcHRzID0ge307CgkJCX0KCgkJCS8vIENsb3NlIGlmIGFscmVhZHkgYWN0aXZlCgkJCWlmIChmYWxzZSA9PT0gRi5jbG9zZSh0cnVlKSkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBOb3JtYWxpemUgZ3JvdXAKCQkJaWYgKCEkLmlzQXJyYXkoZ3JvdXApKSB7CgkJCQlncm91cCA9IGlzUXVlcnkoZ3JvdXApID8gJChncm91cCkuZ2V0KCkgOiBbZ3JvdXBdOwoJCQl9CgoJCQkvLyBSZWNoZWNrIGlmIHRoZSB0eXBlIG9mIGVhY2ggZWxlbWVudCBpcyBgb2JqZWN0YCBhbmQgc2V0IGNvbnRlbnQgdHlwZSAoaW1hZ2UsIGFqYXgsIGV0YykKCQkJJC5lYWNoKGdyb3VwLCBmdW5jdGlvbihpLCBlbGVtZW50KSB7CgkJCQl2YXIgb2JqID0ge30sCgkJCQkJaHJlZiwKCQkJCQl0aXRsZSwKCQkJCQljb250ZW50LAoJCQkJCXR5cGUsCgkJCQkJcmV6LAoJCQkJCWhyZWZQYXJ0cywKCQkJCQlzZWxlY3RvcjsKCgkJCQlpZiAoJC50eXBlKGVsZW1lbnQpID09PSAib2JqZWN0IikgewoJCQkJCS8vIENoZWNrIGlmIGlzIERPTSBlbGVtZW50CgkJCQkJaWYgKGVsZW1lbnQubm9kZVR5cGUpIHsKCQkJCQkJZWxlbWVudCA9ICQoZWxlbWVudCk7CgkJCQkJfQoKCQkJCQlpZiAoaXNRdWVyeShlbGVtZW50KSkgewoJCQkJCQlvYmogPSB7CgkJCQkJCQlocmVmICAgIDogZWxlbWVudC5kYXRhKCdmYW5jeWJveC1ocmVmJykgfHwgZWxlbWVudC5hdHRyKCdocmVmJyksCgkJCQkJCQl0aXRsZSAgIDogZWxlbWVudC5kYXRhKCdmYW5jeWJveC10aXRsZScpIHx8IGVsZW1lbnQuYXR0cigndGl0bGUnKSwKCQkJCQkJCWlzRG9tICAgOiB0cnVlLAoJCQkJCQkJZWxlbWVudCA6IGVsZW1lbnQKCQkJCQkJfTsKCgkJCQkJCWlmICgkLm1ldGFkYXRhKSB7CgkJCQkJCQkkLmV4dGVuZCh0cnVlLCBvYmosIGVsZW1lbnQubWV0YWRhdGEoKSk7CgkJCQkJCX0KCgkJCQkJfSBlbHNlIHsKCQkJCQkJb2JqID0gZWxlbWVudDsKCQkJCQl9CgkJCQl9CgoJCQkJaHJlZiAgPSBvcHRzLmhyZWYgIHx8IG9iai5ocmVmIHx8IChpc1N0cmluZyhlbGVtZW50KSA/IGVsZW1lbnQgOiBudWxsKTsKCQkJCXRpdGxlID0gb3B0cy50aXRsZSAhPT0gdW5kZWZpbmVkID8gb3B0cy50aXRsZSA6IG9iai50aXRsZSB8fCAnJzsKCgkJCQljb250ZW50ID0gb3B0cy5jb250ZW50IHx8IG9iai5jb250ZW50OwoJCQkJdHlwZSAgICA9IGNvbnRlbnQgPyAnaHRtbCcgOiAob3B0cy50eXBlICB8fCBvYmoudHlwZSk7CgoJCQkJaWYgKCF0eXBlICYmIG9iai5pc0RvbSkgewoJCQkJCXR5cGUgPSBlbGVtZW50LmRhdGEoJ2ZhbmN5Ym94LXR5cGUnKTsKCgkJCQkJaWYgKCF0eXBlKSB7CgkJCQkJCXJleiAgPSBlbGVtZW50LnByb3AoJ2NsYXNzJykubWF0Y2goL2ZhbmN5Ym94XC4oXHcrKS8pOwoJCQkJCQl0eXBlID0gcmV6ID8gcmV6WzFdIDogbnVsbDsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKGlzU3RyaW5nKGhyZWYpKSB7CgkJCQkJLy8gVHJ5IHRvIGd1ZXNzIHRoZSBjb250ZW50IHR5cGUKCQkJCQlpZiAoIXR5cGUpIHsKCQkJCQkJaWYgKEYuaXNJbWFnZShocmVmKSkgewoJCQkJCQkJdHlwZSA9ICdpbWFnZSc7CgoJCQkJCQl9IGVsc2UgaWYgKEYuaXNTV0YoaHJlZikpIHsKCQkJCQkJCXR5cGUgPSAnc3dmJzsKCgkJCQkJCX0gZWxzZSBpZiAoaHJlZi5jaGFyQXQoMCkgPT09ICcjJykgewoJCQkJCQkJdHlwZSA9ICdpbmxpbmUnOwoKCQkJCQkJfSBlbHNlIGlmIChpc1N0cmluZyhlbGVtZW50KSkgewoJCQkJCQkJdHlwZSAgICA9ICdodG1sJzsKCQkJCQkJCWNvbnRlbnQgPSBlbGVtZW50OwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBTcGxpdCB1cmwgaW50byB0d28gcGllY2VzIHdpdGggc291cmNlIHVybCBhbmQgY29udGVudCBzZWxlY3RvciwgZS5nLAoJCQkJCS8vICIvbXlwYWdlLmh0bWwgI215X2lkIiB3aWxsIGxvYWQgIi9teXBhZ2UuaHRtbCIgYW5kIGRpc3BsYXkgZWxlbWVudCBoYXZpbmcgaWQgIm15X2lkIgoJCQkJCWlmICh0eXBlID09PSAnYWpheCcpIHsKCQkJCQkJaHJlZlBhcnRzID0gaHJlZi5zcGxpdCgvXHMrLywgMik7CgkJCQkJCWhyZWYgICAgICA9IGhyZWZQYXJ0cy5zaGlmdCgpOwoJCQkJCQlzZWxlY3RvciAgPSBocmVmUGFydHMuc2hpZnQoKTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCFjb250ZW50KSB7CgkJCQkJaWYgKHR5cGUgPT09ICdpbmxpbmUnKSB7CgkJCQkJCWlmIChocmVmKSB7CgkJCQkJCQljb250ZW50ID0gJCggaXNTdHJpbmcoaHJlZikgPyBocmVmLnJlcGxhY2UoLy4qKD89I1teXHNdKyQpLywgJycpIDogaHJlZiApOyAvL3N0cmlwIGZvciBpZTcKCgkJCQkJCX0gZWxzZSBpZiAob2JqLmlzRG9tKSB7CgkJCQkJCQljb250ZW50ID0gZWxlbWVudDsKCQkJCQkJfQoKCQkJCQl9IGVsc2UgaWYgKHR5cGUgPT09ICdodG1sJykgewoJCQkJCQljb250ZW50ID0gaHJlZjsKCgkJCQkJfSBlbHNlIGlmICghdHlwZSAmJiAhaHJlZiAmJiBvYmouaXNEb20pIHsKCQkJCQkJdHlwZSAgICA9ICdpbmxpbmUnOwoJCQkJCQljb250ZW50ID0gZWxlbWVudDsKCQkJCQl9CgkJCQl9CgoJCQkJJC5leHRlbmQob2JqLCB7CgkJCQkJaHJlZiAgICAgOiBocmVmLAoJCQkJCXR5cGUgICAgIDogdHlwZSwKCQkJCQljb250ZW50ICA6IGNvbnRlbnQsCgkJCQkJdGl0bGUgICAgOiB0aXRsZSwKCQkJCQlzZWxlY3RvciA6IHNlbGVjdG9yCgkJCQl9KTsKCgkJCQlncm91cFsgaSBdID0gb2JqOwoJCQl9KTsKCgkJCS8vIEV4dGVuZCB0aGUgZGVmYXVsdHMKCQkJRi5vcHRzID0gJC5leHRlbmQodHJ1ZSwge30sIEYuZGVmYXVsdHMsIG9wdHMpOwoKCQkJLy8gQWxsIG9wdGlvbnMgYXJlIG1lcmdlZCByZWN1cnNpdmUgZXhjZXB0IGtleXMKCQkJaWYgKG9wdHMua2V5cyAhPT0gdW5kZWZpbmVkKSB7CgkJCQlGLm9wdHMua2V5cyA9IG9wdHMua2V5cyA/ICQuZXh0ZW5kKHt9LCBGLmRlZmF1bHRzLmtleXMsIG9wdHMua2V5cykgOiBmYWxzZTsKCQkJfQoKCQkJRi5ncm91cCA9IGdyb3VwOwoKCQkJcmV0dXJuIEYuX3N0YXJ0KEYub3B0cy5pbmRleCk7CgkJfSwKCgkJLy8gQ2FuY2VsIGltYWdlIGxvYWRpbmcgb3IgYWJvcnQgYWpheCByZXF1ZXN0CgkJY2FuY2VsOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjb21pbmcgPSBGLmNvbWluZzsKCgkJCWlmICghY29taW5nIHx8IGZhbHNlID09PSBGLnRyaWdnZXIoJ29uQ2FuY2VsJykpIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJRi5oaWRlTG9hZGluZygpOwoKCQkJaWYgKEYuYWpheExvYWQpIHsKCQkJCUYuYWpheExvYWQuYWJvcnQoKTsKCQkJfQoKCQkJRi5hamF4TG9hZCA9IG51bGw7CgoJCQlpZiAoRi5pbWdQcmVsb2FkKSB7CgkJCQlGLmltZ1ByZWxvYWQub25sb2FkID0gRi5pbWdQcmVsb2FkLm9uZXJyb3IgPSBudWxsOwoJCQl9CgoJCQlpZiAoY29taW5nLndyYXApIHsKCQkJCWNvbWluZy53cmFwLnN0b3AodHJ1ZSwgdHJ1ZSkudHJpZ2dlcignb25SZXNldCcpLnJlbW92ZSgpOwoJCQl9CgoJCQlGLmNvbWluZyA9IG51bGw7CgoJCQkvLyBJZiB0aGUgZmlyc3QgaXRlbSBoYXMgYmVlbiBjYW5jZWxlZCwgdGhlbiBjbGVhciBldmVyeXRoaW5nCgkJCWlmICghRi5jdXJyZW50KSB7CgkJCQlGLl9hZnRlclpvb21PdXQoIGNvbWluZyApOwoJCQl9CgkJfSwKCgkJLy8gU3RhcnQgY2xvc2luZyBhbmltYXRpb24gaWYgaXMgb3BlbjsgcmVtb3ZlIGltbWVkaWF0ZWx5IGlmIG9wZW5pbmcvY2xvc2luZwoJCWNsb3NlOiBmdW5jdGlvbiAoZXZlbnQpIHsKCQkJRi5jYW5jZWwoKTsKCgkJCWlmIChmYWxzZSA9PT0gRi50cmlnZ2VyKCdiZWZvcmVDbG9zZScpKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCUYudW5iaW5kRXZlbnRzKCk7CgoJCQlpZiAoIUYuaXNBY3RpdmUpIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCFGLmlzT3BlbiB8fCBldmVudCA9PT0gdHJ1ZSkgewoJCQkJJCgnLmZhbmN5Ym94LXdyYXAnKS5zdG9wKHRydWUpLnRyaWdnZXIoJ29uUmVzZXQnKS5yZW1vdmUoKTsKCgkJCQlGLl9hZnRlclpvb21PdXQoKTsKCgkJCX0gZWxzZSB7CgkJCQlGLmlzT3BlbiA9IEYuaXNPcGVuZWQgPSBmYWxzZTsKCQkJCUYuaXNDbG9zaW5nID0gdHJ1ZTsKCgkJCQkkKCcuZmFuY3lib3gtaXRlbSwgLmZhbmN5Ym94LW5hdicpLnJlbW92ZSgpOwoKCQkJCUYud3JhcC5zdG9wKHRydWUsIHRydWUpLnJlbW92ZUNsYXNzKCdmYW5jeWJveC1vcGVuZWQnKTsKCgkJCQlGLnRyYW5zaXRpb25zWyBGLmN1cnJlbnQuY2xvc2VNZXRob2QgXSgpOwoJCQl9CgkJfSwKCgkJLy8gTWFuYWdlIHNsaWRlc2hvdzoKCQkvLyAgICQuZmFuY3lib3gucGxheSgpOyAtIHRvZ2dsZSBzbGlkZXNob3cKCQkvLyAgICQuZmFuY3lib3gucGxheSggdHJ1ZSApOyAtIHN0YXJ0CgkJLy8gICAkLmZhbmN5Ym94LnBsYXkoIGZhbHNlICk7IC0gc3RvcAoJCXBsYXk6IGZ1bmN0aW9uICggYWN0aW9uICkgewoJCQl2YXIgY2xlYXIgPSBmdW5jdGlvbiAoKSB7CgkJCQkJY2xlYXJUaW1lb3V0KEYucGxheWVyLnRpbWVyKTsKCQkJCX0sCgkJCQlzZXQgPSBmdW5jdGlvbiAoKSB7CgkJCQkJY2xlYXIoKTsKCgkJCQkJaWYgKEYuY3VycmVudCAmJiBGLnBsYXllci5pc0FjdGl2ZSkgewoJCQkJCQlGLnBsYXllci50aW1lciA9IHNldFRpbWVvdXQoRi5uZXh0LCBGLmN1cnJlbnQucGxheVNwZWVkKTsKCQkJCQl9CgkJCQl9LAoJCQkJc3RvcCA9IGZ1bmN0aW9uICgpIHsKCQkJCQljbGVhcigpOwoKCQkJCQkkKCdib2R5JykudW5iaW5kKCcucGxheWVyJyk7CgoJCQkJCUYucGxheWVyLmlzQWN0aXZlID0gZmFsc2U7CgoJCQkJCUYudHJpZ2dlcignb25QbGF5RW5kJyk7CgkJCQl9LAoJCQkJc3RhcnQgPSBmdW5jdGlvbiAoKSB7CgkJCQkJaWYgKEYuY3VycmVudCAmJiAoRi5jdXJyZW50Lmxvb3AgfHwgRi5jdXJyZW50LmluZGV4IDwgRi5ncm91cC5sZW5ndGggLSAxKSkgewoJCQkJCQlGLnBsYXllci5pc0FjdGl2ZSA9IHRydWU7CgoJCQkJCQkkKCdib2R5JykuYmluZCh7CgkJCQkJCQknYWZ0ZXJTaG93LnBsYXllciBvblVwZGF0ZS5wbGF5ZXInICAgOiBzZXQsCgkJCQkJCQknb25DYW5jZWwucGxheWVyIGJlZm9yZUNsb3NlLnBsYXllcicgOiBzdG9wLAoJCQkJCQkJJ2JlZm9yZUxvYWQucGxheWVyJyA6IGNsZWFyCgkJCQkJCX0pOwoKCQkJCQkJc2V0KCk7CgoJCQkJCQlGLnRyaWdnZXIoJ29uUGxheVN0YXJ0Jyk7CgkJCQkJfQoJCQkJfTsKCgkJCWlmIChhY3Rpb24gPT09IHRydWUgfHwgKCFGLnBsYXllci5pc0FjdGl2ZSAmJiBhY3Rpb24gIT09IGZhbHNlKSkgewoJCQkJc3RhcnQoKTsKCQkJfSBlbHNlIHsKCQkJCXN0b3AoKTsKCQkJfQoJCX0sCgoJCS8vIE5hdmlnYXRlIHRvIG5leHQgZ2FsbGVyeSBpdGVtCgkJbmV4dDogZnVuY3Rpb24gKCBkaXJlY3Rpb24gKSB7CgkJCXZhciBjdXJyZW50ID0gRi5jdXJyZW50OwoKCQkJaWYgKGN1cnJlbnQpIHsKCQkJCWlmICghaXNTdHJpbmcoZGlyZWN0aW9uKSkgewoJCQkJCWRpcmVjdGlvbiA9IGN1cnJlbnQuZGlyZWN0aW9uLm5leHQ7CgkJCQl9CgoJCQkJRi5qdW1wdG8oY3VycmVudC5pbmRleCArIDEsIGRpcmVjdGlvbiwgJ25leHQnKTsKCQkJfQoJCX0sCgoJCS8vIE5hdmlnYXRlIHRvIHByZXZpb3VzIGdhbGxlcnkgaXRlbQoJCXByZXY6IGZ1bmN0aW9uICggZGlyZWN0aW9uICkgewoJCQl2YXIgY3VycmVudCA9IEYuY3VycmVudDsKCgkJCWlmIChjdXJyZW50KSB7CgkJCQlpZiAoIWlzU3RyaW5nKGRpcmVjdGlvbikpIHsKCQkJCQlkaXJlY3Rpb24gPSBjdXJyZW50LmRpcmVjdGlvbi5wcmV2OwoJCQkJfQoKCQkJCUYuanVtcHRvKGN1cnJlbnQuaW5kZXggLSAxLCBkaXJlY3Rpb24sICdwcmV2Jyk7CgkJCX0KCQl9LAoKCQkvLyBOYXZpZ2F0ZSB0byBnYWxsZXJ5IGl0ZW0gYnkgaW5kZXgKCQlqdW1wdG86IGZ1bmN0aW9uICggaW5kZXgsIGRpcmVjdGlvbiwgcm91dGVyICkgewoJCQl2YXIgY3VycmVudCA9IEYuY3VycmVudDsKCgkJCWlmICghY3VycmVudCkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpbmRleCA9IGdldFNjYWxhcihpbmRleCk7CgoJCQlGLmRpcmVjdGlvbiA9IGRpcmVjdGlvbiB8fCBjdXJyZW50LmRpcmVjdGlvblsgKGluZGV4ID49IGN1cnJlbnQuaW5kZXggPyAnbmV4dCcgOiAncHJldicpIF07CgkJCUYucm91dGVyICAgID0gcm91dGVyIHx8ICdqdW1wdG8nOwoKCQkJaWYgKGN1cnJlbnQubG9vcCkgewoJCQkJaWYgKGluZGV4IDwgMCkgewoJCQkJCWluZGV4ID0gY3VycmVudC5ncm91cC5sZW5ndGggKyAoaW5kZXggJSBjdXJyZW50Lmdyb3VwLmxlbmd0aCk7CgkJCQl9CgoJCQkJaW5kZXggPSBpbmRleCAlIGN1cnJlbnQuZ3JvdXAubGVuZ3RoOwoJCQl9CgoJCQlpZiAoY3VycmVudC5ncm91cFsgaW5kZXggXSAhPT0gdW5kZWZpbmVkKSB7CgkJCQlGLmNhbmNlbCgpOwoKCQkJCUYuX3N0YXJ0KGluZGV4KTsKCQkJfQoJCX0sCgoJCS8vIENlbnRlciBpbnNpZGUgdmlld3BvcnQgYW5kIHRvZ2dsZSBwb3NpdGlvbiB0eXBlIHRvIGZpeGVkIG9yIGFic29sdXRlIGlmIG5lZWRlZAoJCXJlcG9zaXRpb246IGZ1bmN0aW9uIChlLCBvbmx5QWJzb2x1dGUpIHsKCQkJdmFyIGN1cnJlbnQgPSBGLmN1cnJlbnQsCgkJCQl3cmFwICAgID0gY3VycmVudCA/IGN1cnJlbnQud3JhcCA6IG51bGwsCgkJCQlwb3M7CgoJCQlpZiAod3JhcCkgewoJCQkJcG9zID0gRi5fZ2V0UG9zaXRpb24ob25seUFic29sdXRlKTsKCgkJCQlpZiAoZSAmJiBlLnR5cGUgPT09ICdzY3JvbGwnKSB7CgkJCQkJZGVsZXRlIHBvcy5wb3NpdGlvbjsKCgkJCQkJd3JhcC5zdG9wKHRydWUsIHRydWUpLmFuaW1hdGUocG9zLCAyMDApOwoKCQkJCX0gZWxzZSB7CgkJCQkJd3JhcC5jc3MocG9zKTsKCgkJCQkJY3VycmVudC5wb3MgPSAkLmV4dGVuZCh7fSwgY3VycmVudC5kaW0sIHBvcyk7CgkJCQl9CgkJCX0KCQl9LAoKCQl1cGRhdGU6IGZ1bmN0aW9uIChlKSB7CgkJCXZhciB0eXBlID0gKGUgJiYgZS50eXBlKSwKCQkJCWFueXdheSA9ICF0eXBlIHx8IHR5cGUgPT09ICdvcmllbnRhdGlvbmNoYW5nZSc7CgoJCQlpZiAoYW55d2F5KSB7CgkJCQljbGVhclRpbWVvdXQoZGlkVXBkYXRlKTsKCgkJCQlkaWRVcGRhdGUgPSBudWxsOwoJCQl9CgoJCQlpZiAoIUYuaXNPcGVuIHx8IGRpZFVwZGF0ZSkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQlkaWRVcGRhdGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJdmFyIGN1cnJlbnQgPSBGLmN1cnJlbnQ7CgoJCQkJaWYgKCFjdXJyZW50IHx8IEYuaXNDbG9zaW5nKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoKCQkJCUYud3JhcC5yZW1vdmVDbGFzcygnZmFuY3lib3gtdG1wJyk7CgoJCQkJaWYgKGFueXdheSB8fCB0eXBlID09PSAnbG9hZCcgfHwgKHR5cGUgPT09ICdyZXNpemUnICYmIGN1cnJlbnQuYXV0b1Jlc2l6ZSkpIHsKCQkJCQlGLl9zZXREaW1lbnNpb24oKTsKCQkJCX0KCgkJCQlpZiAoISh0eXBlID09PSAnc2Nyb2xsJyAmJiBjdXJyZW50LmNhblNocmluaykpIHsKCQkJCQlGLnJlcG9zaXRpb24oZSk7CgkJCQl9CgoJCQkJRi50cmlnZ2VyKCdvblVwZGF0ZScpOwoKCQkJCWRpZFVwZGF0ZSA9IG51bGw7CgoJCQl9LCAoYW55d2F5ICYmICFpc1RvdWNoID8gMCA6IDMwMCkpOwoJCX0sCgoJCS8vIFNocmluayBjb250ZW50IHRvIGZpdCBpbnNpZGUgdmlld3BvcnQgb3IgcmVzdG9yZSBpZiByZXNpemVkCgkJdG9nZ2xlOiBmdW5jdGlvbiAoIGFjdGlvbiApIHsKCQkJaWYgKEYuaXNPcGVuKSB7CgkJCQlGLmN1cnJlbnQuZml0VG9WaWV3ID0gJC50eXBlKGFjdGlvbikgPT09ICJib29sZWFuIiA/IGFjdGlvbiA6ICFGLmN1cnJlbnQuZml0VG9WaWV3OwoKCQkJCS8vIEhlbHAgYnJvd3NlciB0byByZXN0b3JlIGRvY3VtZW50IGRpbWVuc2lvbnMKCQkJCWlmIChpc1RvdWNoKSB7CgkJCQkJRi53cmFwLnJlbW92ZUF0dHIoJ3N0eWxlJykuYWRkQ2xhc3MoJ2ZhbmN5Ym94LXRtcCcpOwoKCQkJCQlGLnRyaWdnZXIoJ29uVXBkYXRlJyk7CgkJCQl9CgoJCQkJRi51cGRhdGUoKTsKCQkJfQoJCX0sCgoJCWhpZGVMb2FkaW5nOiBmdW5jdGlvbiAoKSB7CgkJCUQudW5iaW5kKCcubG9hZGluZycpOwoKCQkJJCgnI2ZhbmN5Ym94LWxvYWRpbmcnKS5yZW1vdmUoKTsKCQl9LAoKCQlzaG93TG9hZGluZzogZnVuY3Rpb24gKCkgewoJCQl2YXIgZWwsIHZpZXdwb3J0OwoKCQkJRi5oaWRlTG9hZGluZygpOwoKCQkJZWwgPSAkKCc8ZGl2IGlkPSJmYW5jeWJveC1sb2FkaW5nIj48ZGl2PjwvZGl2PjwvZGl2PicpLmNsaWNrKEYuY2FuY2VsKS5hcHBlbmRUbygnYm9keScpOwoKCQkJLy8gSWYgdXNlciB3aWxsIHByZXNzIHRoZSBlc2NhcGUtYnV0dG9uLCB0aGUgcmVxdWVzdCB3aWxsIGJlIGNhbmNlbGVkCgkJCUQuYmluZCgna2V5ZG93bi5sb2FkaW5nJywgZnVuY3Rpb24oZSkgewoJCQkJaWYgKChlLndoaWNoIHx8IGUua2V5Q29kZSkgPT09IDI3KSB7CgkJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoKCQkJCQlGLmNhbmNlbCgpOwoJCQkJfQoJCQl9KTsKCgkJCWlmICghRi5kZWZhdWx0cy5maXhlZCkgewoJCQkJdmlld3BvcnQgPSBGLmdldFZpZXdwb3J0KCk7CgoJCQkJZWwuY3NzKHsKCQkJCQlwb3NpdGlvbiA6ICdhYnNvbHV0ZScsCgkJCQkJdG9wICA6ICh2aWV3cG9ydC5oICogMC41KSArIHZpZXdwb3J0LnksCgkJCQkJbGVmdCA6ICh2aWV3cG9ydC53ICogMC41KSArIHZpZXdwb3J0LngKCQkJCX0pOwoJCQl9CgkJfSwKCgkJZ2V0Vmlld3BvcnQ6IGZ1bmN0aW9uICgpIHsKCQkJdmFyIGxvY2tlZCA9IChGLmN1cnJlbnQgJiYgRi5jdXJyZW50LmxvY2tlZCkgfHwgZmFsc2UsCgkJCQlyZXogICAgPSB7CgkJCQkJeDogVy5zY3JvbGxMZWZ0KCksCgkJCQkJeTogVy5zY3JvbGxUb3AoKQoJCQkJfTsKCgkJCWlmIChsb2NrZWQpIHsKCQkJCXJlei53ID0gbG9ja2VkWzBdLmNsaWVudFdpZHRoOwoJCQkJcmV6LmggPSBsb2NrZWRbMF0uY2xpZW50SGVpZ2h0OwoKCQkJfSBlbHNlIHsKCQkJCS8vIFNlZSBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC82NzI0CgkJCQlyZXoudyA9IGlzVG91Y2ggJiYgd2luZG93LmlubmVyV2lkdGggID8gd2luZG93LmlubmVyV2lkdGggIDogVy53aWR0aCgpOwoJCQkJcmV6LmggPSBpc1RvdWNoICYmIHdpbmRvdy5pbm5lckhlaWdodCA/IHdpbmRvdy5pbm5lckhlaWdodCA6IFcuaGVpZ2h0KCk7CgkJCX0KCgkJCXJldHVybiByZXo7CgkJfSwKCgkJLy8gVW5iaW5kIHRoZSBrZXlib2FyZCAvIGNsaWNraW5nIGFjdGlvbnMKCQl1bmJpbmRFdmVudHM6IGZ1bmN0aW9uICgpIHsKCQkJaWYgKEYud3JhcCAmJiBpc1F1ZXJ5KEYud3JhcCkpIHsKCQkJCUYud3JhcC51bmJpbmQoJy5mYicpOwoJCQl9CgoJCQlELnVuYmluZCgnLmZiJyk7CgkJCVcudW5iaW5kKCcuZmInKTsKCQl9LAoKCQliaW5kRXZlbnRzOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjdXJyZW50ID0gRi5jdXJyZW50LAoJCQkJa2V5czsKCgkJCWlmICghY3VycmVudCkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBDaGFuZ2luZyBkb2N1bWVudCBoZWlnaHQgb24gaU9TIGRldmljZXMgdHJpZ2dlcnMgYSAncmVzaXplJyBldmVudCwKCQkJLy8gdGhhdCBjYW4gY2hhbmdlIGRvY3VtZW50IGhlaWdodC4uLiByZXBlYXRpbmcgaW5maW5pdGVseQoJCQlXLmJpbmQoJ29yaWVudGF0aW9uY2hhbmdlLmZiJyArIChpc1RvdWNoID8gJycgOiAnIHJlc2l6ZS5mYicpICsgKGN1cnJlbnQuYXV0b0NlbnRlciAmJiAhY3VycmVudC5sb2NrZWQgPyAnIHNjcm9sbC5mYicgOiAnJyksIEYudXBkYXRlKTsKCgkJCWtleXMgPSBjdXJyZW50LmtleXM7CgoJCQlpZiAoa2V5cykgewoJCQkJRC5iaW5kKCdrZXlkb3duLmZiJywgZnVuY3Rpb24gKGUpIHsKCQkJCQl2YXIgY29kZSAgID0gZS53aGljaCB8fCBlLmtleUNvZGUsCgkJCQkJCXRhcmdldCA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDsKCgkJCQkJLy8gU2tpcCBlc2Mga2V5IGlmIGxvYWRpbmcsIGJlY2F1c2Ugc2hvd0xvYWRpbmcgd2lsbCBjYW5jZWwgcHJlbG9hZGluZwoJCQkJCWlmIChjb2RlID09PSAyNyAmJiBGLmNvbWluZykgewoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoKCQkJCQkvLyBJZ25vcmUga2V5IGNvbWJpbmF0aW9ucyBhbmQga2V5IGV2ZW50cyB3aXRoaW4gZm9ybSBlbGVtZW50cwoJCQkJCWlmICghZS5jdHJsS2V5ICYmICFlLmFsdEtleSAmJiAhZS5zaGlmdEtleSAmJiAhZS5tZXRhS2V5ICYmICEodGFyZ2V0ICYmICh0YXJnZXQudHlwZSB8fCAkKHRhcmdldCkuaXMoJ1tjb250ZW50ZWRpdGFibGVdJykpKSkgewoJCQkJCQkkLmVhY2goa2V5cywgZnVuY3Rpb24oaSwgdmFsKSB7CgkJCQkJCQlpZiAoY3VycmVudC5ncm91cC5sZW5ndGggPiAxICYmIHZhbFsgY29kZSBdICE9PSB1bmRlZmluZWQpIHsKCQkJCQkJCQlGWyBpIF0oIHZhbFsgY29kZSBdICk7CgoJCQkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCQl9CgoJCQkJCQkJaWYgKCQuaW5BcnJheShjb2RlLCB2YWwpID4gLTEpIHsKCQkJCQkJCQlGWyBpIF0gKCk7CgoJCQkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCQl9CgkJCQkJCX0pOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgoJCQlpZiAoJC5mbi5tb3VzZXdoZWVsICYmIGN1cnJlbnQubW91c2VXaGVlbCkgewoJCQkJRi53cmFwLmJpbmQoJ21vdXNld2hlZWwuZmInLCBmdW5jdGlvbiAoZSwgZGVsdGEsIGRlbHRhWCwgZGVsdGFZKSB7CgkJCQkJdmFyIHRhcmdldCA9IGUudGFyZ2V0IHx8IG51bGwsCgkJCQkJCXBhcmVudCA9ICQodGFyZ2V0KSwKCQkJCQkJY2FuU2Nyb2xsID0gZmFsc2U7CgoJCQkJCXdoaWxlIChwYXJlbnQubGVuZ3RoKSB7CgkJCQkJCWlmIChjYW5TY3JvbGwgfHwgcGFyZW50LmlzKCcuZmFuY3lib3gtc2tpbicpIHx8IHBhcmVudC5pcygnLmZhbmN5Ym94LXdyYXAnKSkgewoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCgkJCQkJCWNhblNjcm9sbCA9IGlzU2Nyb2xsYWJsZSggcGFyZW50WzBdICk7CgkJCQkJCXBhcmVudCAgICA9ICQocGFyZW50KS5wYXJlbnQoKTsKCQkJCQl9CgoJCQkJCWlmIChkZWx0YSAhPT0gMCAmJiAhY2FuU2Nyb2xsKSB7CgkJCQkJCWlmIChGLmdyb3VwLmxlbmd0aCA+IDEgJiYgIWN1cnJlbnQuY2FuU2hyaW5rKSB7CgkJCQkJCQlpZiAoZGVsdGFZID4gMCB8fCBkZWx0YVggPiAwKSB7CgkJCQkJCQkJRi5wcmV2KCBkZWx0YVkgPiAwID8gJ2Rvd24nIDogJ2xlZnQnICk7CgoJCQkJCQkJfSBlbHNlIGlmIChkZWx0YVkgPCAwIHx8IGRlbHRhWCA8IDApIHsKCQkJCQkJCQlGLm5leHQoIGRlbHRhWSA8IDAgPyAndXAnIDogJ3JpZ2h0JyApOwoJCQkJCQkJfQoKCQkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pOwoJCQl9CgkJfSwKCgkJdHJpZ2dlcjogZnVuY3Rpb24gKGV2ZW50LCBvKSB7CgkJCXZhciByZXQsIG9iaiA9IG8gfHwgRi5jb21pbmcgfHwgRi5jdXJyZW50OwoKCQkJaWYgKCFvYmopIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCQuaXNGdW5jdGlvbiggb2JqW2V2ZW50XSApKSB7CgkJCQlyZXQgPSBvYmpbZXZlbnRdLmFwcGx5KG9iaiwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CgkJCX0KCgkJCWlmIChyZXQgPT09IGZhbHNlKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCgkJCWlmIChvYmouaGVscGVycykgewoJCQkJJC5lYWNoKG9iai5oZWxwZXJzLCBmdW5jdGlvbiAoaGVscGVyLCBvcHRzKSB7CgkJCQkJaWYgKG9wdHMgJiYgRi5oZWxwZXJzW2hlbHBlcl0gJiYgJC5pc0Z1bmN0aW9uKEYuaGVscGVyc1toZWxwZXJdW2V2ZW50XSkpIHsKCQkJCQkJb3B0cyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBGLmhlbHBlcnNbaGVscGVyXS5kZWZhdWx0cywgb3B0cyk7CgoJCQkJCQlGLmhlbHBlcnNbaGVscGVyXVtldmVudF0ob3B0cywgb2JqKTsKCQkJCQl9CgkJCQl9KTsKCQkJfQoKCQkJJC5ldmVudC50cmlnZ2VyKGV2ZW50ICsgJy5mYicpOwoJCX0sCgoJCWlzSW1hZ2U6IGZ1bmN0aW9uIChzdHIpIHsKCQkJcmV0dXJuIGlzU3RyaW5nKHN0cikgJiYgc3RyLm1hdGNoKC8oXmRhdGE6aW1hZ2VcLy4qLCl8KFwuKGpwKGV8Z3xlZyl8Z2lmfHBuZ3xibXB8d2VicCkoKFw/fCMpLiopPyQpL2kpOwoJCX0sCgoJCWlzU1dGOiBmdW5jdGlvbiAoc3RyKSB7CgkJCXJldHVybiBpc1N0cmluZyhzdHIpICYmIHN0ci5tYXRjaCgvXC4oc3dmKSgoXD98IykuKik/JC9pKTsKCQl9LAoKCQlfc3RhcnQ6IGZ1bmN0aW9uIChpbmRleCkgewoJCQl2YXIgY29taW5nID0ge30sCgkJCQlvYmosCgkJCQlocmVmLAoJCQkJdHlwZSwKCQkJCW1hcmdpbiwKCQkJCXBhZGRpbmc7CgoJCQlpbmRleCA9IGdldFNjYWxhciggaW5kZXggKTsKCQkJb2JqICAgPSBGLmdyb3VwWyBpbmRleCBdIHx8IG51bGw7CgoJCQlpZiAoIW9iaikgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQljb21pbmcgPSAkLmV4dGVuZCh0cnVlLCB7fSwgRi5vcHRzLCBvYmopOwoKCQkJLy8gQ29udmVydCBtYXJnaW4gYW5kIHBhZGRpbmcgcHJvcGVydGllcyB0byBhcnJheSAtIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdAoJCQltYXJnaW4gID0gY29taW5nLm1hcmdpbjsKCQkJcGFkZGluZyA9IGNvbWluZy5wYWRkaW5nOwoKCQkJaWYgKCQudHlwZShtYXJnaW4pID09PSAnbnVtYmVyJykgewoJCQkJY29taW5nLm1hcmdpbiA9IFttYXJnaW4sIG1hcmdpbiwgbWFyZ2luLCBtYXJnaW5dOwoJCQl9CgoJCQlpZiAoJC50eXBlKHBhZGRpbmcpID09PSAnbnVtYmVyJykgewoJCQkJY29taW5nLnBhZGRpbmcgPSBbcGFkZGluZywgcGFkZGluZywgcGFkZGluZywgcGFkZGluZ107CgkJCX0KCgkJCS8vICdtb2RhbCcgcHJvcGVyeSBpcyBqdXN0IGEgc2hvcnRjdXQKCQkJaWYgKGNvbWluZy5tb2RhbCkgewoJCQkJJC5leHRlbmQodHJ1ZSwgY29taW5nLCB7CgkJCQkJY2xvc2VCdG4gICA6IGZhbHNlLAoJCQkJCWNsb3NlQ2xpY2sgOiBmYWxzZSwKCQkJCQluZXh0Q2xpY2sgIDogZmFsc2UsCgkJCQkJYXJyb3dzICAgICA6IGZhbHNlLAoJCQkJCW1vdXNlV2hlZWwgOiBmYWxzZSwKCQkJCQlrZXlzICAgICAgIDogbnVsbCwKCQkJCQloZWxwZXJzOiB7CgkJCQkJCW92ZXJsYXkgOiB7CgkJCQkJCQljbG9zZUNsaWNrIDogZmFsc2UKCQkJCQkJfQoJCQkJCX0KCQkJCX0pOwoJCQl9CgoJCQkvLyAnYXV0b1NpemUnIHByb3BlcnR5IGlzIGEgc2hvcnRjdXQsIHRvbwoJCQlpZiAoY29taW5nLmF1dG9TaXplKSB7CgkJCQljb21pbmcuYXV0b1dpZHRoID0gY29taW5nLmF1dG9IZWlnaHQgPSB0cnVlOwoJCQl9CgoJCQlpZiAoY29taW5nLndpZHRoID09PSAnYXV0bycpIHsKCQkJCWNvbWluZy5hdXRvV2lkdGggPSB0cnVlOwoJCQl9CgoJCQlpZiAoY29taW5nLmhlaWdodCA9PT0gJ2F1dG8nKSB7CgkJCQljb21pbmcuYXV0b0hlaWdodCA9IHRydWU7CgkJCX0KCgkJCS8qCgkJCSAqIEFkZCByZWZlcmVuY2UgdG8gdGhlIGdyb3VwLCBzbyBpdGBzIHBvc3NpYmxlIHRvIGFjY2VzcyBmcm9tIGNhbGxiYWNrcywgZXhhbXBsZToKCQkJICogYWZ0ZXJMb2FkIDogZnVuY3Rpb24oKSB7CgkJCSAqICAgICB0aGlzLnRpdGxlID0gJ0ltYWdlICcgKyAodGhpcy5pbmRleCArIDEpICsgJyBvZiAnICsgdGhpcy5ncm91cC5sZW5ndGggKyAodGhpcy50aXRsZSA/ICcgLSAnICsgdGhpcy50aXRsZSA6ICcnKTsKCQkJICogfQoJCQkgKi8KCgkJCWNvbWluZy5ncm91cCAgPSBGLmdyb3VwOwoJCQljb21pbmcuaW5kZXggID0gaW5kZXg7CgoJCQkvLyBHaXZlIGEgY2hhbmNlIGZvciBjYWxsYmFjayBvciBoZWxwZXJzIHRvIHVwZGF0ZSBjb21pbmcgaXRlbSAodHlwZSwgdGl0bGUsIGV0YykKCQkJRi5jb21pbmcgPSBjb21pbmc7CgoJCQlpZiAoZmFsc2UgPT09IEYudHJpZ2dlcignYmVmb3JlTG9hZCcpKSB7CgkJCQlGLmNvbWluZyA9IG51bGw7CgoJCQkJcmV0dXJuOwoJCQl9CgoJCQl0eXBlID0gY29taW5nLnR5cGU7CgkJCWhyZWYgPSBjb21pbmcuaHJlZjsKCgkJCWlmICghdHlwZSkgewoJCQkJRi5jb21pbmcgPSBudWxsOwoKCQkJCS8vSWYgd2UgY2FuIG5vdCBkZXRlcm1pbmUgY29udGVudCB0eXBlIHRoZW4gZHJvcCBzaWxlbnRseSBvciBkaXNwbGF5IG5leHQvcHJldiBpdGVtIGlmIGxvb3BpbmcgdGhyb3VnaCBnYWxsZXJ5CgkJCQlpZiAoRi5jdXJyZW50ICYmIEYucm91dGVyICYmIEYucm91dGVyICE9PSAnanVtcHRvJykgewoJCQkJCUYuY3VycmVudC5pbmRleCA9IGluZGV4OwoKCQkJCQlyZXR1cm4gRlsgRi5yb3V0ZXIgXSggRi5kaXJlY3Rpb24gKTsKCQkJCX0KCgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCgkJCUYuaXNBY3RpdmUgPSB0cnVlOwoKCQkJaWYgKHR5cGUgPT09ICdpbWFnZScgfHwgdHlwZSA9PT0gJ3N3ZicpIHsKCQkJCWNvbWluZy5hdXRvSGVpZ2h0ID0gY29taW5nLmF1dG9XaWR0aCA9IGZhbHNlOwoJCQkJY29taW5nLnNjcm9sbGluZyAgPSAndmlzaWJsZSc7CgkJCX0KCgkJCWlmICh0eXBlID09PSAnaW1hZ2UnKSB7CgkJCQljb21pbmcuYXNwZWN0UmF0aW8gPSB0cnVlOwoJCQl9CgoJCQlpZiAodHlwZSA9PT0gJ2lmcmFtZScgJiYgaXNUb3VjaCkgewoJCQkJY29taW5nLnNjcm9sbGluZyA9ICdzY3JvbGwnOwoJCQl9CgoJCQkvLyBCdWlsZCB0aGUgbmVjY2Vzc2FyeSBtYXJrdXAKCQkJY29taW5nLndyYXAgPSAkKGNvbWluZy50cGwud3JhcCkuYWRkQ2xhc3MoJ2ZhbmN5Ym94LScgKyAoaXNUb3VjaCA/ICdtb2JpbGUnIDogJ2Rlc2t0b3AnKSArICcgZmFuY3lib3gtdHlwZS0nICsgdHlwZSArICcgZmFuY3lib3gtdG1wICcgKyBjb21pbmcud3JhcENTUykuYXBwZW5kVG8oIGNvbWluZy5wYXJlbnQgfHwgJ2JvZHknICk7CgoJCQkkLmV4dGVuZChjb21pbmcsIHsKCQkJCXNraW4gIDogJCgnLmZhbmN5Ym94LXNraW4nLCAgY29taW5nLndyYXApLAoJCQkJb3V0ZXIgOiAkKCcuZmFuY3lib3gtb3V0ZXInLCBjb21pbmcud3JhcCksCgkJCQlpbm5lciA6ICQoJy5mYW5jeWJveC1pbm5lcicsIGNvbWluZy53cmFwKQoJCQl9KTsKCgkJCSQuZWFjaChbIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCJdLCBmdW5jdGlvbihpLCB2KSB7CgkJCQljb21pbmcuc2tpbi5jc3MoJ3BhZGRpbmcnICsgdiwgZ2V0VmFsdWUoY29taW5nLnBhZGRpbmdbIGkgXSkpOwoJCQl9KTsKCgkJCUYudHJpZ2dlcignb25SZWFkeScpOwoKCQkJLy8gQ2hlY2sgYmVmb3JlIHRyeSB0byBsb2FkOyAnaW5saW5lJyBhbmQgJ2h0bWwnIHR5cGVzIG5lZWQgY29udGVudCwgb3RoZXJzIC0gaHJlZgoJCQlpZiAodHlwZSA9PT0gJ2lubGluZScgfHwgdHlwZSA9PT0gJ2h0bWwnKSB7CgkJCQlpZiAoIWNvbWluZy5jb250ZW50IHx8ICFjb21pbmcuY29udGVudC5sZW5ndGgpIHsKCQkJCQlyZXR1cm4gRi5fZXJyb3IoICdjb250ZW50JyApOwoJCQkJfQoKCQkJfSBlbHNlIGlmICghaHJlZikgewoJCQkJcmV0dXJuIEYuX2Vycm9yKCAnaHJlZicgKTsKCQkJfQoKCQkJaWYgKHR5cGUgPT09ICdpbWFnZScpIHsKCQkJCUYuX2xvYWRJbWFnZSgpOwoKCQkJfSBlbHNlIGlmICh0eXBlID09PSAnYWpheCcpIHsKCQkJCUYuX2xvYWRBamF4KCk7CgoJCQl9IGVsc2UgaWYgKHR5cGUgPT09ICdpZnJhbWUnKSB7CgkJCQlGLl9sb2FkSWZyYW1lKCk7CgoJCQl9IGVsc2UgewoJCQkJRi5fYWZ0ZXJMb2FkKCk7CgkJCX0KCQl9LAoKCQlfZXJyb3I6IGZ1bmN0aW9uICggdHlwZSApIHsKCQkJJC5leHRlbmQoRi5jb21pbmcsIHsKCQkJCXR5cGUgICAgICAgOiAnaHRtbCcsCgkJCQlhdXRvV2lkdGggIDogdHJ1ZSwKCQkJCWF1dG9IZWlnaHQgOiB0cnVlLAoJCQkJbWluV2lkdGggICA6IDAsCgkJCQltaW5IZWlnaHQgIDogMCwKCQkJCXNjcm9sbGluZyAgOiAnbm8nLAoJCQkJaGFzRXJyb3IgICA6IHR5cGUsCgkJCQljb250ZW50ICAgIDogRi5jb21pbmcudHBsLmVycm9yCgkJCX0pOwoKCQkJRi5fYWZ0ZXJMb2FkKCk7CgkJfSwKCgkJX2xvYWRJbWFnZTogZnVuY3Rpb24gKCkgewoJCQkvLyBSZXNldCBwcmVsb2FkIGltYWdlIHNvIGl0IGlzIGxhdGVyIHBvc3NpYmxlIHRvIGNoZWNrICJjb21wbGV0ZSIgcHJvcGVydHkKCQkJdmFyIGltZyA9IEYuaW1nUHJlbG9hZCA9IG5ldyBJbWFnZSgpOwoKCQkJaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKCQkJCXRoaXMub25sb2FkID0gdGhpcy5vbmVycm9yID0gbnVsbDsKCgkJCQlGLmNvbWluZy53aWR0aCAgPSB0aGlzLndpZHRoOwoJCQkJRi5jb21pbmcuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CgoJCQkJRi5fYWZ0ZXJMb2FkKCk7CgkJCX07CgoJCQlpbWcub25lcnJvciA9IGZ1bmN0aW9uICgpIHsKCQkJCXRoaXMub25sb2FkID0gdGhpcy5vbmVycm9yID0gbnVsbDsKCgkJCQlGLl9lcnJvciggJ2ltYWdlJyApOwoJCQl9OwoKCQkJaW1nLnNyYyA9IEYuY29taW5nLmhyZWY7CgoJCQlpZiAoaW1nLmNvbXBsZXRlICE9PSB0cnVlKSB7CgkJCQlGLnNob3dMb2FkaW5nKCk7CgkJCX0KCQl9LAoKCQlfbG9hZEFqYXg6IGZ1bmN0aW9uICgpIHsKCQkJdmFyIGNvbWluZyA9IEYuY29taW5nOwoKCQkJRi5zaG93TG9hZGluZygpOwoKCQkJRi5hamF4TG9hZCA9ICQuYWpheCgkLmV4dGVuZCh7fSwgY29taW5nLmFqYXgsIHsKCQkJCXVybDogY29taW5nLmhyZWYsCgkJCQllcnJvcjogZnVuY3Rpb24gKGpxWEhSLCB0ZXh0U3RhdHVzKSB7CgkJCQkJaWYgKEYuY29taW5nICYmIHRleHRTdGF0dXMgIT09ICdhYm9ydCcpIHsKCQkJCQkJRi5fZXJyb3IoICdhamF4JywganFYSFIgKTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkJRi5oaWRlTG9hZGluZygpOwoJCQkJCX0KCQkJCX0sCgkJCQlzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSwgdGV4dFN0YXR1cykgewoJCQkJCWlmICh0ZXh0U3RhdHVzID09PSAnc3VjY2VzcycpIHsKCQkJCQkJY29taW5nLmNvbnRlbnQgPSBkYXRhOwoKCQkJCQkJRi5fYWZ0ZXJMb2FkKCk7CgkJCQkJfQoJCQkJfQoJCQl9KSk7CgkJfSwKCgkJX2xvYWRJZnJhbWU6IGZ1bmN0aW9uKCkgewoJCQl2YXIgY29taW5nID0gRi5jb21pbmcsCgkJCQlpZnJhbWUgPSAkKGNvbWluZy50cGwuaWZyYW1lLnJlcGxhY2UoL1x7cm5kXH0vZywgbmV3IERhdGUoKS5nZXRUaW1lKCkpKQoJCQkJCS5hdHRyKCdzY3JvbGxpbmcnLCBpc1RvdWNoID8gJ2F1dG8nIDogY29taW5nLmlmcmFtZS5zY3JvbGxpbmcpCgkJCQkJLmF0dHIoJ3NyYycsIGNvbWluZy5ocmVmKTsKCgkJCS8vIFRoaXMgaGVscHMgSUUKCQkJJChjb21pbmcud3JhcCkuYmluZCgnb25SZXNldCcsIGZ1bmN0aW9uICgpIHsKCQkJCXRyeSB7CgkJCQkJJCh0aGlzKS5maW5kKCdpZnJhbWUnKS5oaWRlKCkuYXR0cignc3JjJywgJy8vYWJvdXQ6YmxhbmsnKS5lbmQoKS5lbXB0eSgpOwoJCQkJfSBjYXRjaCAoZSkge30KCQkJfSk7CgoJCQlpZiAoY29taW5nLmlmcmFtZS5wcmVsb2FkKSB7CgkJCQlGLnNob3dMb2FkaW5nKCk7CgoJCQkJaWZyYW1lLm9uZSgnbG9hZCcsIGZ1bmN0aW9uKCkgewoJCQkJCSQodGhpcykuZGF0YSgncmVhZHknLCAxKTsKCgkJCQkJLy8gaU9TIHdpbGwgbG9zZSBzY3JvbGxpbmcgaWYgd2UgcmVzaXplCgkJCQkJaWYgKCFpc1RvdWNoKSB7CgkJCQkJCSQodGhpcykuYmluZCgnbG9hZC5mYicsIEYudXBkYXRlKTsKCQkJCQl9CgoJCQkJCS8vIFdpdGhvdXQgdGhpcyB0cmljazoKCQkJCQkvLyAgIC0gaWZyYW1lIHdvbid0IHNjcm9sbCBvbiBpT1MgZGV2aWNlcwoJCQkJCS8vICAgLSBJRTcgc29tZXRpbWVzIGRpc3BsYXlzIGVtcHR5IGlmcmFtZQoJCQkJCSQodGhpcykucGFyZW50cygnLmZhbmN5Ym94LXdyYXAnKS53aWR0aCgnMTAwJScpLnJlbW92ZUNsYXNzKCdmYW5jeWJveC10bXAnKS5zaG93KCk7CgoJCQkJCUYuX2FmdGVyTG9hZCgpOwoJCQkJfSk7CgkJCX0KCgkJCWNvbWluZy5jb250ZW50ID0gaWZyYW1lLmFwcGVuZFRvKCBjb21pbmcuaW5uZXIgKTsKCgkJCWlmICghY29taW5nLmlmcmFtZS5wcmVsb2FkKSB7CgkJCQlGLl9hZnRlckxvYWQoKTsKCQkJfQoJCX0sCgoJCV9wcmVsb2FkSW1hZ2VzOiBmdW5jdGlvbigpIHsKCQkJdmFyIGdyb3VwICAgPSBGLmdyb3VwLAoJCQkJY3VycmVudCA9IEYuY3VycmVudCwKCQkJCWxlbiAgICAgPSBncm91cC5sZW5ndGgsCgkJCQljbnQgICAgID0gY3VycmVudC5wcmVsb2FkID8gTWF0aC5taW4oY3VycmVudC5wcmVsb2FkLCBsZW4gLSAxKSA6IDAsCgkJCQlpdGVtLAoJCQkJaTsKCgkJCWZvciAoaSA9IDE7IGkgPD0gY250OyBpICs9IDEpIHsKCQkJCWl0ZW0gPSBncm91cFsgKGN1cnJlbnQuaW5kZXggKyBpICkgJSBsZW4gXTsKCgkJCQlpZiAoaXRlbS50eXBlID09PSAnaW1hZ2UnICYmIGl0ZW0uaHJlZikgewoJCQkJCW5ldyBJbWFnZSgpLnNyYyA9IGl0ZW0uaHJlZjsKCQkJCX0KCQkJfQoJCX0sCgoJCV9hZnRlckxvYWQ6IGZ1bmN0aW9uICgpIHsKCQkJdmFyIGNvbWluZyAgID0gRi5jb21pbmcsCgkJCQlwcmV2aW91cyA9IEYuY3VycmVudCwKCQkJCXBsYWNlaG9sZGVyID0gJ2ZhbmN5Ym94LXBsYWNlaG9sZGVyJywKCQkJCWN1cnJlbnQsCgkJCQljb250ZW50LAoJCQkJdHlwZSwKCQkJCXNjcm9sbGluZywKCQkJCWhyZWYsCgkJCQllbWJlZDsKCgkJCUYuaGlkZUxvYWRpbmcoKTsKCgkJCWlmICghY29taW5nIHx8IEYuaXNBY3RpdmUgPT09IGZhbHNlKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCWlmIChmYWxzZSA9PT0gRi50cmlnZ2VyKCdhZnRlckxvYWQnLCBjb21pbmcsIHByZXZpb3VzKSkgewoJCQkJY29taW5nLndyYXAuc3RvcCh0cnVlKS50cmlnZ2VyKCdvblJlc2V0JykucmVtb3ZlKCk7CgoJCQkJRi5jb21pbmcgPSBudWxsOwoKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKHByZXZpb3VzKSB7CgkJCQlGLnRyaWdnZXIoJ2JlZm9yZUNoYW5nZScsIHByZXZpb3VzKTsKCgkJCQlwcmV2aW91cy53cmFwLnN0b3AodHJ1ZSkucmVtb3ZlQ2xhc3MoJ2ZhbmN5Ym94LW9wZW5lZCcpCgkJCQkJLmZpbmQoJy5mYW5jeWJveC1pdGVtLCAuZmFuY3lib3gtbmF2JykKCQkJCQkucmVtb3ZlKCk7CgkJCX0KCgkJCUYudW5iaW5kRXZlbnRzKCk7CgoJCQljdXJyZW50ICAgPSBjb21pbmc7CgkJCWNvbnRlbnQgICA9IGNvbWluZy5jb250ZW50OwoJCQl0eXBlICAgICAgPSBjb21pbmcudHlwZTsKCQkJc2Nyb2xsaW5nID0gY29taW5nLnNjcm9sbGluZzsKCgkJCSQuZXh0ZW5kKEYsIHsKCQkJCXdyYXAgIDogY3VycmVudC53cmFwLAoJCQkJc2tpbiAgOiBjdXJyZW50LnNraW4sCgkJCQlvdXRlciA6IGN1cnJlbnQub3V0ZXIsCgkJCQlpbm5lciA6IGN1cnJlbnQuaW5uZXIsCgkJCQljdXJyZW50ICA6IGN1cnJlbnQsCgkJCQlwcmV2aW91cyA6IHByZXZpb3VzCgkJCX0pOwoKCQkJaHJlZiA9IGN1cnJlbnQuaHJlZjsKCgkJCXN3aXRjaCAodHlwZSkgewoJCQkJY2FzZSAnaW5saW5lJzoKCQkJCWNhc2UgJ2FqYXgnOgoJCQkJY2FzZSAnaHRtbCc6CgkJCQkJaWYgKGN1cnJlbnQuc2VsZWN0b3IpIHsKCQkJCQkJY29udGVudCA9ICQoJzxkaXY+JykuaHRtbChjb250ZW50KS5maW5kKGN1cnJlbnQuc2VsZWN0b3IpOwoKCQkJCQl9IGVsc2UgaWYgKGlzUXVlcnkoY29udGVudCkpIHsKCQkJCQkJaWYgKCFjb250ZW50LmRhdGEocGxhY2Vob2xkZXIpKSB7CgkJCQkJCQljb250ZW50LmRhdGEocGxhY2Vob2xkZXIsICQoJzxkaXYgY2xhc3M9IicgKyBwbGFjZWhvbGRlciArICciPjwvZGl2PicpLmluc2VydEFmdGVyKCBjb250ZW50ICkuaGlkZSgpICk7CgkJCQkJCX0KCgkJCQkJCWNvbnRlbnQgPSBjb250ZW50LnNob3coKS5kZXRhY2goKTsKCgkJCQkJCWN1cnJlbnQud3JhcC5iaW5kKCdvblJlc2V0JywgZnVuY3Rpb24gKCkgewoJCQkJCQkJaWYgKCQodGhpcykuZmluZChjb250ZW50KS5sZW5ndGgpIHsKCQkJCQkJCQljb250ZW50LmhpZGUoKS5yZXBsYWNlQWxsKCBjb250ZW50LmRhdGEocGxhY2Vob2xkZXIpICkuZGF0YShwbGFjZWhvbGRlciwgZmFsc2UpOwoJCQkJCQkJfQoJCQkJCQl9KTsKCQkJCQl9CgkJCQlicmVhazsKCgkJCQljYXNlICdpbWFnZSc6CgkJCQkJY29udGVudCA9IGN1cnJlbnQudHBsLmltYWdlLnJlcGxhY2UoJ3tocmVmfScsIGhyZWYpOwoJCQkJYnJlYWs7CgoJCQkJY2FzZSAnc3dmJzoKCQkJCQljb250ZW50ID0gJzxvYmplY3QgaWQ9ImZhbmN5Ym94LXN3ZiIgY2xhc3NpZD0iY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj48cGFyYW0gbmFtZT0ibW92aWUiIHZhbHVlPSInICsgaHJlZiArICciPjwvcGFyYW0+JzsKCQkJCQllbWJlZCAgID0gJyc7CgoJCQkJCSQuZWFjaChjdXJyZW50LnN3ZiwgZnVuY3Rpb24obmFtZSwgdmFsKSB7CgkJCQkJCWNvbnRlbnQgKz0gJzxwYXJhbSBuYW1lPSInICsgbmFtZSArICciIHZhbHVlPSInICsgdmFsICsgJyI+PC9wYXJhbT4nOwoJCQkJCQllbWJlZCAgICs9ICcgJyArIG5hbWUgKyAnPSInICsgdmFsICsgJyInOwoJCQkJCX0pOwoKCQkJCQljb250ZW50ICs9ICc8ZW1iZWQgc3JjPSInICsgaHJlZiArICciIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIicgKyBlbWJlZCArICc+PC9lbWJlZD48L29iamVjdD4nOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWlmICghKGlzUXVlcnkoY29udGVudCkgJiYgY29udGVudC5wYXJlbnQoKS5pcyhjdXJyZW50LmlubmVyKSkpIHsKCQkJCWN1cnJlbnQuaW5uZXIuYXBwZW5kKCBjb250ZW50ICk7CgkJCX0KCgkJCS8vIEdpdmUgYSBjaGFuY2UgZm9yIGhlbHBlcnMgb3IgY2FsbGJhY2tzIHRvIHVwZGF0ZSBlbGVtZW50cwoJCQlGLnRyaWdnZXIoJ2JlZm9yZVNob3cnKTsKCgkJCS8vIFNldCBzY3JvbGxpbmcgYmVmb3JlIGNhbGN1bGF0aW5nIGRpbWVuc2lvbnMKCQkJY3VycmVudC5pbm5lci5jc3MoJ292ZXJmbG93Jywgc2Nyb2xsaW5nID09PSAneWVzJyA/ICdzY3JvbGwnIDogKHNjcm9sbGluZyA9PT0gJ25vJyA/ICdoaWRkZW4nIDogc2Nyb2xsaW5nKSk7CgoJCQkvLyBTZXQgaW5pdGlhbCBkaW1lbnNpb25zIGFuZCBzdGFydCBwb3NpdGlvbgoJCQlGLl9zZXREaW1lbnNpb24oKTsKCgkJCUYucmVwb3NpdGlvbigpOwoKCQkJRi5pc09wZW4gPSBmYWxzZTsKCQkJRi5jb21pbmcgPSBudWxsOwoKCQkJRi5iaW5kRXZlbnRzKCk7CgoJCQlpZiAoIUYuaXNPcGVuZWQpIHsKCQkJCSQoJy5mYW5jeWJveC13cmFwJykubm90KCBjdXJyZW50LndyYXAgKS5zdG9wKHRydWUpLnRyaWdnZXIoJ29uUmVzZXQnKS5yZW1vdmUoKTsKCgkJCX0gZWxzZSBpZiAocHJldmlvdXMucHJldk1ldGhvZCkgewoJCQkJRi50cmFuc2l0aW9uc1sgcHJldmlvdXMucHJldk1ldGhvZCBdKCk7CgkJCX0KCgkJCUYudHJhbnNpdGlvbnNbIEYuaXNPcGVuZWQgPyBjdXJyZW50Lm5leHRNZXRob2QgOiBjdXJyZW50Lm9wZW5NZXRob2QgXSgpOwoKCQkJRi5fcHJlbG9hZEltYWdlcygpOwoJCX0sCgoJCV9zZXREaW1lbnNpb246IGZ1bmN0aW9uICgpIHsKCQkJdmFyIHZpZXdwb3J0ICAgPSBGLmdldFZpZXdwb3J0KCksCgkJCQlzdGVwcyAgICAgID0gMCwKCQkJCWNhblNocmluayAgPSBmYWxzZSwKCQkJCWNhbkV4cGFuZCAgPSBmYWxzZSwKCQkJCXdyYXAgICAgICAgPSBGLndyYXAsCgkJCQlza2luICAgICAgID0gRi5za2luLAoJCQkJaW5uZXIgICAgICA9IEYuaW5uZXIsCgkJCQljdXJyZW50ICAgID0gRi5jdXJyZW50LAoJCQkJd2lkdGggICAgICA9IGN1cnJlbnQud2lkdGgsCgkJCQloZWlnaHQgICAgID0gY3VycmVudC5oZWlnaHQsCgkJCQltaW5XaWR0aCAgID0gY3VycmVudC5taW5XaWR0aCwKCQkJCW1pbkhlaWdodCAgPSBjdXJyZW50Lm1pbkhlaWdodCwKCQkJCW1heFdpZHRoICAgPSBjdXJyZW50Lm1heFdpZHRoLAoJCQkJbWF4SGVpZ2h0ICA9IGN1cnJlbnQubWF4SGVpZ2h0LAoJCQkJc2Nyb2xsaW5nICA9IGN1cnJlbnQuc2Nyb2xsaW5nLAoJCQkJc2Nyb2xsT3V0ICA9IGN1cnJlbnQuc2Nyb2xsT3V0c2lkZSA/IGN1cnJlbnQuc2Nyb2xsYmFyV2lkdGggOiAwLAoJCQkJbWFyZ2luICAgICA9IGN1cnJlbnQubWFyZ2luLAoJCQkJd01hcmdpbiAgICA9IGdldFNjYWxhcihtYXJnaW5bMV0gKyBtYXJnaW5bM10pLAoJCQkJaE1hcmdpbiAgICA9IGdldFNjYWxhcihtYXJnaW5bMF0gKyBtYXJnaW5bMl0pLAoJCQkJd1BhZGRpbmcsCgkJCQloUGFkZGluZywKCQkJCXdTcGFjZSwKCQkJCWhTcGFjZSwKCQkJCW9yaWdXaWR0aCwKCQkJCW9yaWdIZWlnaHQsCgkJCQlvcmlnTWF4V2lkdGgsCgkJCQlvcmlnTWF4SGVpZ2h0LAoJCQkJcmF0aW8sCgkJCQl3aWR0aF8sCgkJCQloZWlnaHRfLAoJCQkJbWF4V2lkdGhfLAoJCQkJbWF4SGVpZ2h0XywKCQkJCWlmcmFtZSwKCQkJCWJvZHk7CgoJCQkvLyBSZXNldCBkaW1lbnNpb25zIHNvIHdlIGNvdWxkIHJlLWNoZWNrIGFjdHVhbCBzaXplCgkJCXdyYXAuYWRkKHNraW4pLmFkZChpbm5lcikud2lkdGgoJ2F1dG8nKS5oZWlnaHQoJ2F1dG8nKS5yZW1vdmVDbGFzcygnZmFuY3lib3gtdG1wJyk7CgoJCQl3UGFkZGluZyA9IGdldFNjYWxhcihza2luLm91dGVyV2lkdGgodHJ1ZSkgIC0gc2tpbi53aWR0aCgpKTsKCQkJaFBhZGRpbmcgPSBnZXRTY2FsYXIoc2tpbi5vdXRlckhlaWdodCh0cnVlKSAtIHNraW4uaGVpZ2h0KCkpOwoKCQkJLy8gQW55IHNwYWNlIGJldHdlZW4gY29udGVudCBhbmQgdmlld3BvcnQgKG1hcmdpbiwgcGFkZGluZywgYm9yZGVyLCB0aXRsZSkKCQkJd1NwYWNlID0gd01hcmdpbiArIHdQYWRkaW5nOwoJCQloU3BhY2UgPSBoTWFyZ2luICsgaFBhZGRpbmc7CgoJCQlvcmlnV2lkdGggID0gaXNQZXJjZW50YWdlKHdpZHRoKSAgPyAodmlld3BvcnQudyAtIHdTcGFjZSkgKiBnZXRTY2FsYXIod2lkdGgpICAvIDEwMCA6IHdpZHRoOwoJCQlvcmlnSGVpZ2h0ID0gaXNQZXJjZW50YWdlKGhlaWdodCkgPyAodmlld3BvcnQuaCAtIGhTcGFjZSkgKiBnZXRTY2FsYXIoaGVpZ2h0KSAvIDEwMCA6IGhlaWdodDsKCgkJCWlmIChjdXJyZW50LnR5cGUgPT09ICdpZnJhbWUnKSB7CgkJCQlpZnJhbWUgPSBjdXJyZW50LmNvbnRlbnQ7CgoJCQkJaWYgKGN1cnJlbnQuYXV0b0hlaWdodCAmJiBpZnJhbWUuZGF0YSgncmVhZHknKSA9PT0gMSkgewoJCQkJCXRyeSB7CgkJCQkJCWlmIChpZnJhbWVbMF0uY29udGVudFdpbmRvdy5kb2N1bWVudC5sb2NhdGlvbikgewoJCQkJCQkJaW5uZXIud2lkdGgoIG9yaWdXaWR0aCApLmhlaWdodCg5OTk5KTsKCgkJCQkJCQlib2R5ID0gaWZyYW1lLmNvbnRlbnRzKCkuZmluZCgnYm9keScpOwoKCQkJCQkJCWlmIChzY3JvbGxPdXQpIHsKCQkJCQkJCQlib2R5LmNzcygnb3ZlcmZsb3cteCcsICdoaWRkZW4nKTsKCQkJCQkJCX0KCgkJCQkJCQlvcmlnSGVpZ2h0ID0gYm9keS5oZWlnaHQoKTsKCQkJCQkJfQoKCQkJCQl9IGNhdGNoIChlKSB7fQoJCQkJfQoKCQkJfSBlbHNlIGlmIChjdXJyZW50LmF1dG9XaWR0aCB8fCBjdXJyZW50LmF1dG9IZWlnaHQpIHsKCQkJCWlubmVyLmFkZENsYXNzKCAnZmFuY3lib3gtdG1wJyApOwoKCQkJCS8vIFNldCB3aWR0aCBvciBoZWlnaHQgaW4gY2FzZSB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSBvbmx5IG9uZSBkaW1lbnNpb24KCQkJCWlmICghY3VycmVudC5hdXRvV2lkdGgpIHsKCQkJCQlpbm5lci53aWR0aCggb3JpZ1dpZHRoICk7CgkJCQl9CgoJCQkJaWYgKCFjdXJyZW50LmF1dG9IZWlnaHQpIHsKCQkJCQlpbm5lci5oZWlnaHQoIG9yaWdIZWlnaHQgKTsKCQkJCX0KCgkJCQlpZiAoY3VycmVudC5hdXRvV2lkdGgpIHsKCQkJCQlvcmlnV2lkdGggPSBpbm5lci53aWR0aCgpOwoJCQkJfQoKCQkJCWlmIChjdXJyZW50LmF1dG9IZWlnaHQpIHsKCQkJCQlvcmlnSGVpZ2h0ID0gaW5uZXIuaGVpZ2h0KCk7CgkJCQl9CgoJCQkJaW5uZXIucmVtb3ZlQ2xhc3MoICdmYW5jeWJveC10bXAnICk7CgkJCX0KCgkJCXdpZHRoICA9IGdldFNjYWxhciggb3JpZ1dpZHRoICk7CgkJCWhlaWdodCA9IGdldFNjYWxhciggb3JpZ0hlaWdodCApOwoKCQkJcmF0aW8gID0gb3JpZ1dpZHRoIC8gb3JpZ0hlaWdodDsKCgkJCS8vIENhbGN1bGF0aW9ucyBmb3IgdGhlIGNvbnRlbnQKCQkJbWluV2lkdGggID0gZ2V0U2NhbGFyKGlzUGVyY2VudGFnZShtaW5XaWR0aCkgPyBnZXRTY2FsYXIobWluV2lkdGgsICd3JykgLSB3U3BhY2UgOiBtaW5XaWR0aCk7CgkJCW1heFdpZHRoICA9IGdldFNjYWxhcihpc1BlcmNlbnRhZ2UobWF4V2lkdGgpID8gZ2V0U2NhbGFyKG1heFdpZHRoLCAndycpIC0gd1NwYWNlIDogbWF4V2lkdGgpOwoKCQkJbWluSGVpZ2h0ID0gZ2V0U2NhbGFyKGlzUGVyY2VudGFnZShtaW5IZWlnaHQpID8gZ2V0U2NhbGFyKG1pbkhlaWdodCwgJ2gnKSAtIGhTcGFjZSA6IG1pbkhlaWdodCk7CgkJCW1heEhlaWdodCA9IGdldFNjYWxhcihpc1BlcmNlbnRhZ2UobWF4SGVpZ2h0KSA/IGdldFNjYWxhcihtYXhIZWlnaHQsICdoJykgLSBoU3BhY2UgOiBtYXhIZWlnaHQpOwoKCQkJLy8gVGhlc2Ugd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSBpZiB3cmFwIGNhbiBmaXQgaW4gdGhlIHZpZXdwb3J0CgkJCW9yaWdNYXhXaWR0aCAgPSBtYXhXaWR0aDsKCQkJb3JpZ01heEhlaWdodCA9IG1heEhlaWdodDsKCgkJCWlmIChjdXJyZW50LmZpdFRvVmlldykgewoJCQkJbWF4V2lkdGggID0gTWF0aC5taW4odmlld3BvcnQudyAtIHdTcGFjZSwgbWF4V2lkdGgpOwoJCQkJbWF4SGVpZ2h0ID0gTWF0aC5taW4odmlld3BvcnQuaCAtIGhTcGFjZSwgbWF4SGVpZ2h0KTsKCQkJfQoKCQkJbWF4V2lkdGhfICA9IHZpZXdwb3J0LncgLSB3TWFyZ2luOwoJCQltYXhIZWlnaHRfID0gdmlld3BvcnQuaCAtIGhNYXJnaW47CgoJCQlpZiAoY3VycmVudC5hc3BlY3RSYXRpbykgewoJCQkJaWYgKHdpZHRoID4gbWF4V2lkdGgpIHsKCQkJCQl3aWR0aCAgPSBtYXhXaWR0aDsKCQkJCQloZWlnaHQgPSBnZXRTY2FsYXIod2lkdGggLyByYXRpbyk7CgkJCQl9CgoJCQkJaWYgKGhlaWdodCA+IG1heEhlaWdodCkgewoJCQkJCWhlaWdodCA9IG1heEhlaWdodDsKCQkJCQl3aWR0aCAgPSBnZXRTY2FsYXIoaGVpZ2h0ICogcmF0aW8pOwoJCQkJfQoKCQkJCWlmICh3aWR0aCA8IG1pbldpZHRoKSB7CgkJCQkJd2lkdGggID0gbWluV2lkdGg7CgkJCQkJaGVpZ2h0ID0gZ2V0U2NhbGFyKHdpZHRoIC8gcmF0aW8pOwoJCQkJfQoKCQkJCWlmIChoZWlnaHQgPCBtaW5IZWlnaHQpIHsKCQkJCQloZWlnaHQgPSBtaW5IZWlnaHQ7CgkJCQkJd2lkdGggID0gZ2V0U2NhbGFyKGhlaWdodCAqIHJhdGlvKTsKCQkJCX0KCgkJCX0gZWxzZSB7CgkJCQl3aWR0aCA9IE1hdGgubWF4KG1pbldpZHRoLCBNYXRoLm1pbih3aWR0aCwgbWF4V2lkdGgpKTsKCgkJCQlpZiAoY3VycmVudC5hdXRvSGVpZ2h0ICYmIGN1cnJlbnQudHlwZSAhPT0gJ2lmcmFtZScpIHsKCQkJCQlpbm5lci53aWR0aCggd2lkdGggKTsKCgkJCQkJaGVpZ2h0ID0gaW5uZXIuaGVpZ2h0KCk7CgkJCQl9CgoJCQkJaGVpZ2h0ID0gTWF0aC5tYXgobWluSGVpZ2h0LCBNYXRoLm1pbihoZWlnaHQsIG1heEhlaWdodCkpOwoJCQl9CgoJCQkvLyBUcnkgdG8gZml0IGluc2lkZSB2aWV3cG9ydCAoaW5jbHVkaW5nIHRoZSB0aXRsZSkKCQkJaWYgKGN1cnJlbnQuZml0VG9WaWV3KSB7CgkJCQlpbm5lci53aWR0aCggd2lkdGggKS5oZWlnaHQoIGhlaWdodCApOwoKCQkJCXdyYXAud2lkdGgoIHdpZHRoICsgd1BhZGRpbmcgKTsKCgkJCQkvLyBSZWFsIHdyYXAgZGltZW5zaW9ucwoJCQkJd2lkdGhfICA9IHdyYXAud2lkdGgoKTsKCQkJCWhlaWdodF8gPSB3cmFwLmhlaWdodCgpOwoKCQkJCWlmIChjdXJyZW50LmFzcGVjdFJhdGlvKSB7CgkJCQkJd2hpbGUgKCh3aWR0aF8gPiBtYXhXaWR0aF8gfHwgaGVpZ2h0XyA+IG1heEhlaWdodF8pICYmIHdpZHRoID4gbWluV2lkdGggJiYgaGVpZ2h0ID4gbWluSGVpZ2h0KSB7CgkJCQkJCWlmIChzdGVwcysrID4gMTkpIHsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgoJCQkJCQloZWlnaHQgPSBNYXRoLm1heChtaW5IZWlnaHQsIE1hdGgubWluKG1heEhlaWdodCwgaGVpZ2h0IC0gMTApKTsKCQkJCQkJd2lkdGggID0gZ2V0U2NhbGFyKGhlaWdodCAqIHJhdGlvKTsKCgkJCQkJCWlmICh3aWR0aCA8IG1pbldpZHRoKSB7CgkJCQkJCQl3aWR0aCAgPSBtaW5XaWR0aDsKCQkJCQkJCWhlaWdodCA9IGdldFNjYWxhcih3aWR0aCAvIHJhdGlvKTsKCQkJCQkJfQoKCQkJCQkJaWYgKHdpZHRoID4gbWF4V2lkdGgpIHsKCQkJCQkJCXdpZHRoICA9IG1heFdpZHRoOwoJCQkJCQkJaGVpZ2h0ID0gZ2V0U2NhbGFyKHdpZHRoIC8gcmF0aW8pOwoJCQkJCQl9CgoJCQkJCQlpbm5lci53aWR0aCggd2lkdGggKS5oZWlnaHQoIGhlaWdodCApOwoKCQkJCQkJd3JhcC53aWR0aCggd2lkdGggKyB3UGFkZGluZyApOwoKCQkJCQkJd2lkdGhfICA9IHdyYXAud2lkdGgoKTsKCQkJCQkJaGVpZ2h0XyA9IHdyYXAuaGVpZ2h0KCk7CgkJCQkJfQoKCQkJCX0gZWxzZSB7CgkJCQkJd2lkdGggID0gTWF0aC5tYXgobWluV2lkdGgsICBNYXRoLm1pbih3aWR0aCwgIHdpZHRoICAtICh3aWR0aF8gIC0gbWF4V2lkdGhfKSkpOwoJCQkJCWhlaWdodCA9IE1hdGgubWF4KG1pbkhlaWdodCwgTWF0aC5taW4oaGVpZ2h0LCBoZWlnaHQgLSAoaGVpZ2h0XyAtIG1heEhlaWdodF8pKSk7CgkJCQl9CgkJCX0KCgkJCWlmIChzY3JvbGxPdXQgJiYgc2Nyb2xsaW5nID09PSAnYXV0bycgJiYgaGVpZ2h0IDwgb3JpZ0hlaWdodCAmJiAod2lkdGggKyB3UGFkZGluZyArIHNjcm9sbE91dCkgPCBtYXhXaWR0aF8pIHsKCQkJCXdpZHRoICs9IHNjcm9sbE91dDsKCQkJfQoKCQkJaW5uZXIud2lkdGgoIHdpZHRoICkuaGVpZ2h0KCBoZWlnaHQgKTsKCgkJCXdyYXAud2lkdGgoIHdpZHRoICsgd1BhZGRpbmcgKTsKCgkJCXdpZHRoXyAgPSB3cmFwLndpZHRoKCk7CgkJCWhlaWdodF8gPSB3cmFwLmhlaWdodCgpOwoKCQkJY2FuU2hyaW5rID0gKHdpZHRoXyA+IG1heFdpZHRoXyB8fCBoZWlnaHRfID4gbWF4SGVpZ2h0XykgJiYgd2lkdGggPiBtaW5XaWR0aCAmJiBoZWlnaHQgPiBtaW5IZWlnaHQ7CgkJCWNhbkV4cGFuZCA9IGN1cnJlbnQuYXNwZWN0UmF0aW8gPyAod2lkdGggPCBvcmlnTWF4V2lkdGggJiYgaGVpZ2h0IDwgb3JpZ01heEhlaWdodCAmJiB3aWR0aCA8IG9yaWdXaWR0aCAmJiBoZWlnaHQgPCBvcmlnSGVpZ2h0KSA6ICgod2lkdGggPCBvcmlnTWF4V2lkdGggfHwgaGVpZ2h0IDwgb3JpZ01heEhlaWdodCkgJiYgKHdpZHRoIDwgb3JpZ1dpZHRoIHx8IGhlaWdodCA8IG9yaWdIZWlnaHQpKTsKCgkJCSQuZXh0ZW5kKGN1cnJlbnQsIHsKCQkJCWRpbSA6IHsKCQkJCQl3aWR0aAk6IGdldFZhbHVlKCB3aWR0aF8gKSwKCQkJCQloZWlnaHQJOiBnZXRWYWx1ZSggaGVpZ2h0XyApCgkJCQl9LAoJCQkJb3JpZ1dpZHRoICA6IG9yaWdXaWR0aCwKCQkJCW9yaWdIZWlnaHQgOiBvcmlnSGVpZ2h0LAoJCQkJY2FuU2hyaW5rICA6IGNhblNocmluaywKCQkJCWNhbkV4cGFuZCAgOiBjYW5FeHBhbmQsCgkJCQl3UGFkZGluZyAgIDogd1BhZGRpbmcsCgkJCQloUGFkZGluZyAgIDogaFBhZGRpbmcsCgkJCQl3cmFwU3BhY2UgIDogaGVpZ2h0XyAtIHNraW4ub3V0ZXJIZWlnaHQodHJ1ZSksCgkJCQlza2luU3BhY2UgIDogc2tpbi5oZWlnaHQoKSAtIGhlaWdodAoJCQl9KTsKCgkJCWlmICghaWZyYW1lICYmIGN1cnJlbnQuYXV0b0hlaWdodCAmJiBoZWlnaHQgPiBtaW5IZWlnaHQgJiYgaGVpZ2h0IDwgbWF4SGVpZ2h0ICYmICFjYW5FeHBhbmQpIHsKCQkJCWlubmVyLmhlaWdodCgnYXV0bycpOwoJCQl9CgkJfSwKCgkJX2dldFBvc2l0aW9uOiBmdW5jdGlvbiAob25seUFic29sdXRlKSB7CgkJCXZhciBjdXJyZW50ICA9IEYuY3VycmVudCwKCQkJCXZpZXdwb3J0ID0gRi5nZXRWaWV3cG9ydCgpLAoJCQkJbWFyZ2luICAgPSBjdXJyZW50Lm1hcmdpbiwKCQkJCXdpZHRoICAgID0gRi53cmFwLndpZHRoKCkgICsgbWFyZ2luWzFdICsgbWFyZ2luWzNdLAoJCQkJaGVpZ2h0ICAgPSBGLndyYXAuaGVpZ2h0KCkgKyBtYXJnaW5bMF0gKyBtYXJnaW5bMl0sCgkJCQlyZXogICAgICA9IHsKCQkJCQlwb3NpdGlvbjogJ2Fic29sdXRlJywKCQkJCQl0b3AgIDogbWFyZ2luWzBdLAoJCQkJCWxlZnQgOiBtYXJnaW5bM10KCQkJCX07CgoJCQlpZiAoY3VycmVudC5hdXRvQ2VudGVyICYmIGN1cnJlbnQuZml4ZWQgJiYgIW9ubHlBYnNvbHV0ZSAmJiBoZWlnaHQgPD0gdmlld3BvcnQuaCAmJiB3aWR0aCA8PSB2aWV3cG9ydC53KSB7CgkJCQlyZXoucG9zaXRpb24gPSAnZml4ZWQnOwoKCQkJfSBlbHNlIGlmICghY3VycmVudC5sb2NrZWQpIHsKCQkJCXJlei50b3AgICs9IHZpZXdwb3J0Lnk7CgkJCQlyZXoubGVmdCArPSB2aWV3cG9ydC54OwoJCQl9CgoJCQlyZXoudG9wICA9IGdldFZhbHVlKE1hdGgubWF4KHJlei50b3AsICByZXoudG9wICArICgodmlld3BvcnQuaCAtIGhlaWdodCkgKiBjdXJyZW50LnRvcFJhdGlvKSkpOwoJCQlyZXoubGVmdCA9IGdldFZhbHVlKE1hdGgubWF4KHJlei5sZWZ0LCByZXoubGVmdCArICgodmlld3BvcnQudyAtIHdpZHRoKSAgKiBjdXJyZW50LmxlZnRSYXRpbykpKTsKCgkJCXJldHVybiByZXo7CgkJfSwKCgkJX2FmdGVyWm9vbUluOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjdXJyZW50ID0gRi5jdXJyZW50OwoKCQkJaWYgKCFjdXJyZW50KSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCUYuaXNPcGVuID0gRi5pc09wZW5lZCA9IHRydWU7CgoJCQlGLndyYXAuY3NzKCdvdmVyZmxvdycsICd2aXNpYmxlJykuYWRkQ2xhc3MoJ2ZhbmN5Ym94LW9wZW5lZCcpOwoKCQkJRi51cGRhdGUoKTsKCgkJCS8vIEFzc2lnbiBhIGNsaWNrIGV2ZW50CgkJCWlmICggY3VycmVudC5jbG9zZUNsaWNrIHx8IChjdXJyZW50Lm5leHRDbGljayAmJiBGLmdyb3VwLmxlbmd0aCA+IDEpICkgewoJCQkJRi5pbm5lci5jc3MoJ2N1cnNvcicsICdwb2ludGVyJykuYmluZCgnY2xpY2suZmInLCBmdW5jdGlvbihlKSB7CgkJCQkJaWYgKCEkKGUudGFyZ2V0KS5pcygnYScpICYmICEkKGUudGFyZ2V0KS5wYXJlbnQoKS5pcygnYScpKSB7CgkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCgkJCQkJCUZbIGN1cnJlbnQuY2xvc2VDbGljayA/ICdjbG9zZScgOiAnbmV4dCcgXSgpOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgoJCQkvLyBDcmVhdGUgYSBjbG9zZSBidXR0b24KCQkJaWYgKGN1cnJlbnQuY2xvc2VCdG4pIHsKCQkJCSQoY3VycmVudC50cGwuY2xvc2VCdG4pLmFwcGVuZFRvKEYuc2tpbikuYmluZCggaXNUb3VjaCA/ICd0b3VjaHN0YXJ0LmZiJyA6ICdjbGljay5mYicsIGZ1bmN0aW9uKGUpIHsKCQkJCQllLnByZXZlbnREZWZhdWx0KCk7CgoJCQkJCUYuY2xvc2UoKTsKCQkJCX0pOwoJCQl9CgoJCQkvLyBDcmVhdGUgbmF2aWdhdGlvbiBhcnJvd3MKCQkJaWYgKGN1cnJlbnQuYXJyb3dzICYmIEYuZ3JvdXAubGVuZ3RoID4gMSkgewoJCQkJaWYgKGN1cnJlbnQubG9vcCB8fCBjdXJyZW50LmluZGV4ID4gMCkgewoJCQkJCSQoY3VycmVudC50cGwucHJldikuYXBwZW5kVG8oRi5vdXRlcikuYmluZCgnY2xpY2suZmInLCBGLnByZXYpOwoJCQkJfQoKCQkJCWlmIChjdXJyZW50Lmxvb3AgfHwgY3VycmVudC5pbmRleCA8IEYuZ3JvdXAubGVuZ3RoIC0gMSkgewoJCQkJCSQoY3VycmVudC50cGwubmV4dCkuYXBwZW5kVG8oRi5vdXRlcikuYmluZCgnY2xpY2suZmInLCBGLm5leHQpOwoJCQkJfQoJCQl9CgoJCQlGLnRyaWdnZXIoJ2FmdGVyU2hvdycpOwoKCQkJLy8gU3RvcCB0aGUgc2xpZGVzaG93IGlmIHRoaXMgaXMgdGhlIGxhc3QgaXRlbQoJCQlpZiAoIWN1cnJlbnQubG9vcCAmJiBjdXJyZW50LmluZGV4ID09PSBjdXJyZW50Lmdyb3VwLmxlbmd0aCAtIDEpIHsKCQkJCUYucGxheSggZmFsc2UgKTsKCgkJCX0gZWxzZSBpZiAoRi5vcHRzLmF1dG9QbGF5ICYmICFGLnBsYXllci5pc0FjdGl2ZSkgewoJCQkJRi5vcHRzLmF1dG9QbGF5ID0gZmFsc2U7CgoJCQkJRi5wbGF5KCk7CgkJCX0KCQl9LAoKCQlfYWZ0ZXJab29tT3V0OiBmdW5jdGlvbiAoIG9iaiApIHsKCQkJb2JqID0gb2JqIHx8IEYuY3VycmVudDsKCgkJCSQoJy5mYW5jeWJveC13cmFwJykudHJpZ2dlcignb25SZXNldCcpLnJlbW92ZSgpOwoKCQkJJC5leHRlbmQoRiwgewoJCQkJZ3JvdXAgIDoge30sCgkJCQlvcHRzICAgOiB7fSwKCQkJCXJvdXRlciA6IGZhbHNlLAoJCQkJY3VycmVudCAgIDogbnVsbCwKCQkJCWlzQWN0aXZlICA6IGZhbHNlLAoJCQkJaXNPcGVuZWQgIDogZmFsc2UsCgkJCQlpc09wZW4gICAgOiBmYWxzZSwKCQkJCWlzQ2xvc2luZyA6IGZhbHNlLAoJCQkJd3JhcCAgIDogbnVsbCwKCQkJCXNraW4gICA6IG51bGwsCgkJCQlvdXRlciAgOiBudWxsLAoJCQkJaW5uZXIgIDogbnVsbAoJCQl9KTsKCgkJCUYudHJpZ2dlcignYWZ0ZXJDbG9zZScsIG9iaik7CgkJfQoJfSk7CgoJLyoKCSAqCURlZmF1bHQgdHJhbnNpdGlvbnMKCSAqLwoKCUYudHJhbnNpdGlvbnMgPSB7CgkJZ2V0T3JpZ1Bvc2l0aW9uOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjdXJyZW50ICA9IEYuY3VycmVudCwKCQkJCWVsZW1lbnQgID0gY3VycmVudC5lbGVtZW50LAoJCQkJb3JpZyAgICAgPSBjdXJyZW50Lm9yaWcsCgkJCQlwb3MgICAgICA9IHt9LAoJCQkJd2lkdGggICAgPSA1MCwKCQkJCWhlaWdodCAgID0gNTAsCgkJCQloUGFkZGluZyA9IGN1cnJlbnQuaFBhZGRpbmcsCgkJCQl3UGFkZGluZyA9IGN1cnJlbnQud1BhZGRpbmcsCgkJCQl2aWV3cG9ydCA9IEYuZ2V0Vmlld3BvcnQoKTsKCgkJCWlmICghb3JpZyAmJiBjdXJyZW50LmlzRG9tICYmIGVsZW1lbnQuaXMoJzp2aXNpYmxlJykpIHsKCQkJCW9yaWcgPSBlbGVtZW50LmZpbmQoJ2ltZzpmaXJzdCcpOwoKCQkJCWlmICghb3JpZy5sZW5ndGgpIHsKCQkJCQlvcmlnID0gZWxlbWVudDsKCQkJCX0KCQkJfQoKCQkJaWYgKGlzUXVlcnkob3JpZykpIHsKCQkJCXBvcyA9IG9yaWcub2Zmc2V0KCk7CgoJCQkJaWYgKG9yaWcuaXMoJ2ltZycpKSB7CgkJCQkJd2lkdGggID0gb3JpZy5vdXRlcldpZHRoKCk7CgkJCQkJaGVpZ2h0ID0gb3JpZy5vdXRlckhlaWdodCgpOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCXBvcy50b3AgID0gdmlld3BvcnQueSArICh2aWV3cG9ydC5oIC0gaGVpZ2h0KSAqIGN1cnJlbnQudG9wUmF0aW87CgkJCQlwb3MubGVmdCA9IHZpZXdwb3J0LnggKyAodmlld3BvcnQudyAtIHdpZHRoKSAgKiBjdXJyZW50LmxlZnRSYXRpbzsKCQkJfQoKCQkJaWYgKEYud3JhcC5jc3MoJ3Bvc2l0aW9uJykgPT09ICdmaXhlZCcgfHwgY3VycmVudC5sb2NrZWQpIHsKCQkJCXBvcy50b3AgIC09IHZpZXdwb3J0Lnk7CgkJCQlwb3MubGVmdCAtPSB2aWV3cG9ydC54OwoJCQl9CgoJCQlwb3MgPSB7CgkJCQl0b3AgICAgIDogZ2V0VmFsdWUocG9zLnRvcCAgLSBoUGFkZGluZyAqIGN1cnJlbnQudG9wUmF0aW8pLAoJCQkJbGVmdCAgICA6IGdldFZhbHVlKHBvcy5sZWZ0IC0gd1BhZGRpbmcgKiBjdXJyZW50LmxlZnRSYXRpbyksCgkJCQl3aWR0aCAgIDogZ2V0VmFsdWUod2lkdGggICsgd1BhZGRpbmcpLAoJCQkJaGVpZ2h0ICA6IGdldFZhbHVlKGhlaWdodCArIGhQYWRkaW5nKQoJCQl9OwoKCQkJcmV0dXJuIHBvczsKCQl9LAoKCQlzdGVwOiBmdW5jdGlvbiAobm93LCBmeCkgewoJCQl2YXIgcmF0aW8sCgkJCQlwYWRkaW5nLAoJCQkJdmFsdWUsCgkJCQlwcm9wICAgICAgID0gZngucHJvcCwKCQkJCWN1cnJlbnQgICAgPSBGLmN1cnJlbnQsCgkJCQl3cmFwU3BhY2UgID0gY3VycmVudC53cmFwU3BhY2UsCgkJCQlza2luU3BhY2UgID0gY3VycmVudC5za2luU3BhY2U7CgoJCQlpZiAocHJvcCA9PT0gJ3dpZHRoJyB8fCBwcm9wID09PSAnaGVpZ2h0JykgewoJCQkJcmF0aW8gPSBmeC5lbmQgPT09IGZ4LnN0YXJ0ID8gMSA6IChub3cgLSBmeC5zdGFydCkgLyAoZnguZW5kIC0gZnguc3RhcnQpOwoKCQkJCWlmIChGLmlzQ2xvc2luZykgewoJCQkJCXJhdGlvID0gMSAtIHJhdGlvOwoJCQkJfQoKCQkJCXBhZGRpbmcgPSBwcm9wID09PSAnd2lkdGgnID8gY3VycmVudC53UGFkZGluZyA6IGN1cnJlbnQuaFBhZGRpbmc7CgkJCQl2YWx1ZSAgID0gbm93IC0gcGFkZGluZzsKCgkJCQlGLnNraW5bIHByb3AgXSggIGdldFNjYWxhciggcHJvcCA9PT0gJ3dpZHRoJyA/ICB2YWx1ZSA6IHZhbHVlIC0gKHdyYXBTcGFjZSAqIHJhdGlvKSApICk7CgkJCQlGLmlubmVyWyBwcm9wIF0oIGdldFNjYWxhciggcHJvcCA9PT0gJ3dpZHRoJyA/ICB2YWx1ZSA6IHZhbHVlIC0gKHdyYXBTcGFjZSAqIHJhdGlvKSAtIChza2luU3BhY2UgKiByYXRpbykgKSApOwoJCQl9CgkJfSwKCgkJem9vbUluOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjdXJyZW50ICA9IEYuY3VycmVudCwKCQkJCXN0YXJ0UG9zID0gY3VycmVudC5wb3MsCgkJCQllZmZlY3QgICA9IGN1cnJlbnQub3BlbkVmZmVjdCwKCQkJCWVsYXN0aWMgID0gZWZmZWN0ID09PSAnZWxhc3RpYycsCgkJCQllbmRQb3MgICA9ICQuZXh0ZW5kKHtvcGFjaXR5IDogMX0sIHN0YXJ0UG9zKTsKCgkJCS8vIFJlbW92ZSAicG9zaXRpb24iIHByb3BlcnR5IHRoYXQgYnJlYWtzIG9sZGVyIElFCgkJCWRlbGV0ZSBlbmRQb3MucG9zaXRpb247CgoJCQlpZiAoZWxhc3RpYykgewoJCQkJc3RhcnRQb3MgPSB0aGlzLmdldE9yaWdQb3NpdGlvbigpOwoKCQkJCWlmIChjdXJyZW50Lm9wZW5PcGFjaXR5KSB7CgkJCQkJc3RhcnRQb3Mub3BhY2l0eSA9IDAuMTsKCQkJCX0KCgkJCX0gZWxzZSBpZiAoZWZmZWN0ID09PSAnZmFkZScpIHsKCQkJCXN0YXJ0UG9zLm9wYWNpdHkgPSAwLjE7CgkJCX0KCgkJCUYud3JhcC5jc3Moc3RhcnRQb3MpLmFuaW1hdGUoZW5kUG9zLCB7CgkJCQlkdXJhdGlvbiA6IGVmZmVjdCA9PT0gJ25vbmUnID8gMCA6IGN1cnJlbnQub3BlblNwZWVkLAoJCQkJZWFzaW5nICAgOiBjdXJyZW50Lm9wZW5FYXNpbmcsCgkJCQlzdGVwICAgICA6IGVsYXN0aWMgPyB0aGlzLnN0ZXAgOiBudWxsLAoJCQkJY29tcGxldGUgOiBGLl9hZnRlclpvb21JbgoJCQl9KTsKCQl9LAoKCQl6b29tT3V0OiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjdXJyZW50ICA9IEYuY3VycmVudCwKCQkJCWVmZmVjdCAgID0gY3VycmVudC5jbG9zZUVmZmVjdCwKCQkJCWVsYXN0aWMgID0gZWZmZWN0ID09PSAnZWxhc3RpYycsCgkJCQllbmRQb3MgICA9IHtvcGFjaXR5IDogMC4xfTsKCgkJCWlmIChlbGFzdGljKSB7CgkJCQllbmRQb3MgPSB0aGlzLmdldE9yaWdQb3NpdGlvbigpOwoKCQkJCWlmIChjdXJyZW50LmNsb3NlT3BhY2l0eSkgewoJCQkJCWVuZFBvcy5vcGFjaXR5ID0gMC4xOwoJCQkJfQoJCQl9CgoJCQlGLndyYXAuYW5pbWF0ZShlbmRQb3MsIHsKCQkJCWR1cmF0aW9uIDogZWZmZWN0ID09PSAnbm9uZScgPyAwIDogY3VycmVudC5jbG9zZVNwZWVkLAoJCQkJZWFzaW5nICAgOiBjdXJyZW50LmNsb3NlRWFzaW5nLAoJCQkJc3RlcCAgICAgOiBlbGFzdGljID8gdGhpcy5zdGVwIDogbnVsbCwKCQkJCWNvbXBsZXRlIDogRi5fYWZ0ZXJab29tT3V0CgkJCX0pOwoJCX0sCgoJCWNoYW5nZUluOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjdXJyZW50ICAgPSBGLmN1cnJlbnQsCgkJCQllZmZlY3QgICAgPSBjdXJyZW50Lm5leHRFZmZlY3QsCgkJCQlzdGFydFBvcyAgPSBjdXJyZW50LnBvcywKCQkJCWVuZFBvcyAgICA9IHsgb3BhY2l0eSA6IDEgfSwKCQkJCWRpcmVjdGlvbiA9IEYuZGlyZWN0aW9uLAoJCQkJZGlzdGFuY2UgID0gMjAwLAoJCQkJZmllbGQ7CgoJCQlzdGFydFBvcy5vcGFjaXR5ID0gMC4xOwoKCQkJaWYgKGVmZmVjdCA9PT0gJ2VsYXN0aWMnKSB7CgkJCQlmaWVsZCA9IGRpcmVjdGlvbiA9PT0gJ2Rvd24nIHx8IGRpcmVjdGlvbiA9PT0gJ3VwJyA/ICd0b3AnIDogJ2xlZnQnOwoKCQkJCWlmIChkaXJlY3Rpb24gPT09ICdkb3duJyB8fCBkaXJlY3Rpb24gPT09ICdyaWdodCcpIHsKCQkJCQlzdGFydFBvc1sgZmllbGQgXSA9IGdldFZhbHVlKGdldFNjYWxhcihzdGFydFBvc1sgZmllbGQgXSkgLSBkaXN0YW5jZSk7CgkJCQkJZW5kUG9zWyBmaWVsZCBdICAgPSAnKz0nICsgZGlzdGFuY2UgKyAncHgnOwoKCQkJCX0gZWxzZSB7CgkJCQkJc3RhcnRQb3NbIGZpZWxkIF0gPSBnZXRWYWx1ZShnZXRTY2FsYXIoc3RhcnRQb3NbIGZpZWxkIF0pICsgZGlzdGFuY2UpOwoJCQkJCWVuZFBvc1sgZmllbGQgXSAgID0gJy09JyArIGRpc3RhbmNlICsgJ3B4JzsKCQkJCX0KCQkJfQoKCQkJLy8gV29ya2Fyb3VuZCBmb3IgaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIyNzMKCQkJaWYgKGVmZmVjdCA9PT0gJ25vbmUnKSB7CgkJCQlGLl9hZnRlclpvb21JbigpOwoKCQkJfSBlbHNlIHsKCQkJCUYud3JhcC5jc3Moc3RhcnRQb3MpLmFuaW1hdGUoZW5kUG9zLCB7CgkJCQkJZHVyYXRpb24gOiBjdXJyZW50Lm5leHRTcGVlZCwKCQkJCQllYXNpbmcgICA6IGN1cnJlbnQubmV4dEVhc2luZywKCQkJCQljb21wbGV0ZSA6IGZ1bmN0aW9uKCkgewoJCQkJCQkvLyBUaGlzIGhlbHBzIEZpcmVGb3ggdG8gcHJvcGVybHkgcmVuZGVyIHRoZSBib3gKCQkJCQkJc2V0VGltZW91dChGLl9hZnRlclpvb21JbiwgMjApOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgkJfSwKCgkJY2hhbmdlT3V0OiBmdW5jdGlvbiAoKSB7CgkJCXZhciBwcmV2aW91cyAgPSBGLnByZXZpb3VzLAoJCQkJZWZmZWN0ICAgID0gcHJldmlvdXMucHJldkVmZmVjdCwKCQkJCWVuZFBvcyAgICA9IHsgb3BhY2l0eSA6IDAuMSB9LAoJCQkJZGlyZWN0aW9uID0gRi5kaXJlY3Rpb24sCgkJCQlkaXN0YW5jZSAgPSAyMDA7CgoJCQlpZiAoZWZmZWN0ID09PSAnZWxhc3RpYycpIHsKCQkJCWVuZFBvc1sgZGlyZWN0aW9uID09PSAnZG93bicgfHwgZGlyZWN0aW9uID09PSAndXAnID8gJ3RvcCcgOiAnbGVmdCcgXSA9ICggZGlyZWN0aW9uID09PSAndXAnIHx8IGRpcmVjdGlvbiA9PT0gJ2xlZnQnID8gJy0nIDogJysnICkgKyAnPScgKyBkaXN0YW5jZSArICdweCc7CgkJCX0KCgkJCXByZXZpb3VzLndyYXAuYW5pbWF0ZShlbmRQb3MsIHsKCQkJCWR1cmF0aW9uIDogZWZmZWN0ID09PSAnbm9uZScgPyAwIDogcHJldmlvdXMucHJldlNwZWVkLAoJCQkJZWFzaW5nICAgOiBwcmV2aW91cy5wcmV2RWFzaW5nLAoJCQkJY29tcGxldGUgOiBmdW5jdGlvbiAoKSB7CgkJCQkJJCh0aGlzKS50cmlnZ2VyKCdvblJlc2V0JykucmVtb3ZlKCk7CgkJCQl9CgkJCX0pOwoJCX0KCX07CgoJLyoKCSAqCU92ZXJsYXkgaGVscGVyCgkgKi8KCglGLmhlbHBlcnMub3ZlcmxheSA9IHsKCQlkZWZhdWx0cyA6IHsKCQkJY2xvc2VDbGljayA6IHRydWUsICAvLyBpZiB0cnVlLCBmYW5jeUJveCB3aWxsIGJlIGNsb3NlZCB3aGVuIHVzZXIgY2xpY2tzIG9uIHRoZSBvdmVybGF5CgkJCXNwZWVkT3V0ICAgOiAyMDAsICAgLy8gZHVyYXRpb24gb2YgZmFkZU91dCBhbmltYXRpb24KCQkJc2hvd0Vhcmx5ICA6IHRydWUsICAvLyBpbmRpY2F0ZXMgaWYgc2hvdWxkIGJlIG9wZW5lZCBpbW1lZGlhdGVseSBvciB3YWl0IHVudGlsIHRoZSBjb250ZW50IGlzIHJlYWR5CgkJCWNzcyAgICAgICAgOiB7fSwgICAgLy8gY3VzdG9tIENTUyBwcm9wZXJ0aWVzCgkJCWxvY2tlZCAgICAgOiAhaXNUb3VjaCwgIC8vIGlmIHRydWUsIHRoZSBjb250ZW50IHdpbGwgYmUgbG9ja2VkIGludG8gb3ZlcmxheQoJCQlmaXhlZCAgICAgIDogdHJ1ZSAgIC8vIGlmIGZhbHNlLCB0aGUgb3ZlcmxheSBDU1MgcG9zaXRpb24gcHJvcGVydHkgd2lsbCBub3QgYmUgc2V0IHRvICJmaXhlZCIKCQl9LAoKCQlvdmVybGF5IDogbnVsbCwgICAvLyBjdXJyZW50IGhhbmRsZQoJCWZpeGVkICAgOiBmYWxzZSwgIC8vIGluZGljYXRlcyBpZiB0aGUgb3ZlcmxheSBoYXMgcG9zaXRpb24gImZpeGVkIgoKCQkvLyBQdWJsaWMgbWV0aG9kcwoJCWNyZWF0ZSA6IGZ1bmN0aW9uKG9wdHMpIHsKCQkJb3B0cyA9ICQuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRzKTsKCgkJCWlmICh0aGlzLm92ZXJsYXkpIHsKCQkJCXRoaXMuY2xvc2UoKTsKCQkJfQoKCQkJdGhpcy5vdmVybGF5ID0gJCgnPGRpdiBjbGFzcz0iZmFuY3lib3gtb3ZlcmxheSI+PC9kaXY+JykuYXBwZW5kVG8oICdib2R5JyApOwoJCQl0aGlzLmZpeGVkICAgPSBmYWxzZTsKCgkJCWlmIChvcHRzLmZpeGVkICYmIEYuZGVmYXVsdHMuZml4ZWQpIHsKCQkJCXRoaXMub3ZlcmxheS5hZGRDbGFzcygnZmFuY3lib3gtb3ZlcmxheS1maXhlZCcpOwoKCQkJCXRoaXMuZml4ZWQgPSB0cnVlOwoJCQl9CgkJfSwKCgkJb3BlbiA6IGZ1bmN0aW9uKG9wdHMpIHsKCQkJdmFyIHRoYXQgPSB0aGlzOwoKCQkJb3B0cyA9ICQuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRzKTsKCgkJCWlmICh0aGlzLm92ZXJsYXkpIHsKCQkJCXRoaXMub3ZlcmxheS51bmJpbmQoJy5vdmVybGF5Jykud2lkdGgoJ2F1dG8nKS5oZWlnaHQoJ2F1dG8nKTsKCgkJCX0gZWxzZSB7CgkJCQl0aGlzLmNyZWF0ZShvcHRzKTsKCQkJfQoKCQkJaWYgKCF0aGlzLmZpeGVkKSB7CgkJCQlXLmJpbmQoJ3Jlc2l6ZS5vdmVybGF5JywgJC5wcm94eSggdGhpcy51cGRhdGUsIHRoaXMpICk7CgoJCQkJdGhpcy51cGRhdGUoKTsKCQkJfQoKCQkJaWYgKG9wdHMuY2xvc2VDbGljaykgewoJCQkJdGhpcy5vdmVybGF5LmJpbmQoJ2NsaWNrLm92ZXJsYXknLCBmdW5jdGlvbihlKSB7CgkJCQkJaWYgKCQoZS50YXJnZXQpLmhhc0NsYXNzKCdmYW5jeWJveC1vdmVybGF5JykpIHsKCQkJCQkJaWYgKEYuaXNBY3RpdmUpIHsKCQkJCQkJCUYuY2xvc2UoKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXRoYXQuY2xvc2UoKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pOwoJCQl9CgoJCQl0aGlzLm92ZXJsYXkuY3NzKCBvcHRzLmNzcyApLnNob3coKTsKCQl9LAoKCQljbG9zZSA6IGZ1bmN0aW9uKCkgewoJCQkkKCcuZmFuY3lib3gtb3ZlcmxheScpLnJlbW92ZSgpOwoKCQkJVy51bmJpbmQoJ3Jlc2l6ZS5vdmVybGF5Jyk7CgoJCQl0aGlzLm92ZXJsYXkgPSBudWxsOwoKCQkJaWYgKHRoaXMubWFyZ2luICE9PSBmYWxzZSkgewoJCQkJJCgnYm9keScpLmNzcygnbWFyZ2luLXJpZ2h0JywgdGhpcy5tYXJnaW4pOwoKCQkJCXRoaXMubWFyZ2luID0gZmFsc2U7CgkJCX0KCgkJCWlmICh0aGlzLmVsKSB7CgkJCQl0aGlzLmVsLnJlbW92ZUNsYXNzKCdmYW5jeWJveC1sb2NrJyk7CgkJCX0KCQl9LAoKCQkvLyBQcml2YXRlLCBjYWxsYmFja3MKCgkJdXBkYXRlIDogZnVuY3Rpb24gKCkgewoJCQl2YXIgd2lkdGggPSAnMTAwJScsIG9mZnNldFdpZHRoOwoKCQkJLy8gUmVzZXQgd2lkdGgvaGVpZ2h0IHNvIGl0IHdpbGwgbm90IG1lc3MKCQkJdGhpcy5vdmVybGF5LndpZHRoKHdpZHRoKS5oZWlnaHQoJzEwMCUnKTsKCgkJCS8vIGpRdWVyeSBkb2VzIG5vdCByZXR1cm4gcmVsaWFibGUgcmVzdWx0IGZvciBJRQoJCQlpZiAoJC5icm93c2VyLm1zaWUpIHsKCQkJCW9mZnNldFdpZHRoID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldFdpZHRoLCBkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoKTsKCgkJCQlpZiAoRC53aWR0aCgpID4gb2Zmc2V0V2lkdGgpIHsKCQkJCQl3aWR0aCA9IEQud2lkdGgoKTsKCQkJCX0KCgkJCX0gZWxzZSBpZiAoRC53aWR0aCgpID4gVy53aWR0aCgpKSB7CgkJCQl3aWR0aCA9IEQud2lkdGgoKTsKCQkJfQoKCQkJdGhpcy5vdmVybGF5LndpZHRoKHdpZHRoKS5oZWlnaHQoRC5oZWlnaHQoKSk7CgkJfSwKCgkJLy8gVGhpcyBpcyB3aGVyZSB3ZSBjYW4gbWFuaXB1bGF0ZSBET00sIGJlY2F1c2UgbGF0ZXIgaXQgd291bGQgY2F1c2UgaWZyYW1lcyB0byByZWxvYWQKCQlvblJlYWR5IDogZnVuY3Rpb24gKG9wdHMsIG9iaikgewoJCQkkKCcuZmFuY3lib3gtb3ZlcmxheScpLnN0b3AodHJ1ZSwgdHJ1ZSk7CgoJCQlpZiAoIXRoaXMub3ZlcmxheSkgewoJCQkJdGhpcy5tYXJnaW4gPSBELmhlaWdodCgpID4gVy5oZWlnaHQoKSB8fCAkKCdib2R5JykuY3NzKCdvdmVyZmxvdy15JykgPT09ICdzY3JvbGwnID8gJCgnYm9keScpLmNzcygnbWFyZ2luLXJpZ2h0JykgOiBmYWxzZTsKCQkJCXRoaXMuZWwgICAgID0gZG9jdW1lbnQuYWxsICYmICFkb2N1bWVudC5xdWVyeVNlbGVjdG9yID8gJCgnaHRtbCcpIDogJCgnYm9keScpOwoKCQkJCXRoaXMuY3JlYXRlKG9wdHMpOwoJCQl9CgoJCQlpZiAob3B0cy5sb2NrZWQgJiYgdGhpcy5maXhlZCkgewoJCQkJb2JqLmxvY2tlZCA9IHRoaXMub3ZlcmxheS5hcHBlbmQoIG9iai53cmFwICk7CgkJCQlvYmouZml4ZWQgID0gZmFsc2U7CgkJCX0KCgkJCWlmIChvcHRzLnNob3dFYXJseSA9PT0gdHJ1ZSkgewoJCQkJdGhpcy5iZWZvcmVTaG93LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgkJCX0KCQl9LAoKCQliZWZvcmVTaG93IDogZnVuY3Rpb24ob3B0cywgb2JqKSB7CgkJCWlmIChvYmoubG9ja2VkKSB7CgkJCQl0aGlzLmVsLmFkZENsYXNzKCdmYW5jeWJveC1sb2NrJyk7CgoJCQkJaWYgKHRoaXMubWFyZ2luICE9PSBmYWxzZSkgewoJCQkJCSQoJ2JvZHknKS5jc3MoJ21hcmdpbi1yaWdodCcsIGdldFNjYWxhciggdGhpcy5tYXJnaW4gKSArIG9iai5zY3JvbGxiYXJXaWR0aCk7CgkJCQl9CgkJCX0KCgkJCXRoaXMub3BlbihvcHRzKTsKCQl9LAoKCQlvblVwZGF0ZSA6IGZ1bmN0aW9uKCkgewoJCQlpZiAoIXRoaXMuZml4ZWQpIHsKCQkJCXRoaXMudXBkYXRlKCk7CgkJCX0KCQl9LAoKCQlhZnRlckNsb3NlOiBmdW5jdGlvbiAob3B0cykgewoJCQkvLyBSZW1vdmUgb3ZlcmxheSBpZiBleGlzdHMgYW5kIGZhbmN5Qm94IGlzIG5vdCBvcGVuaW5nCgkJCS8vIChlLmcuLCBpdCBpcyBub3QgYmVpbmcgb3BlbiB1c2luZyBhZnRlckNsb3NlIGNhbGxiYWNrKQoJCQlpZiAodGhpcy5vdmVybGF5ICYmICFGLmlzQWN0aXZlKSB7CgkJCQl0aGlzLm92ZXJsYXkuZmFkZU91dChvcHRzLnNwZWVkT3V0LCAkLnByb3h5KCB0aGlzLmNsb3NlLCB0aGlzICkpOwoJCQl9CgkJfQoJfTsKCgkvKgoJICoJVGl0bGUgaGVscGVyCgkgKi8KCglGLmhlbHBlcnMudGl0bGUgPSB7CgkJZGVmYXVsdHMgOiB7CgkJCXR5cGUgICAgIDogJ2Zsb2F0JywgLy8gJ2Zsb2F0JywgJ2luc2lkZScsICdvdXRzaWRlJyBvciAnb3ZlcicsCgkJCXBvc2l0aW9uIDogJ2JvdHRvbScgLy8gJ3RvcCcgb3IgJ2JvdHRvbScKCQl9LAoKCQliZWZvcmVTaG93OiBmdW5jdGlvbiAob3B0cykgewoJCQl2YXIgY3VycmVudCA9IEYuY3VycmVudCwKCQkJCXRleHQgICAgPSBjdXJyZW50LnRpdGxlLAoJCQkJdHlwZSAgICA9IG9wdHMudHlwZSwKCQkJCXRpdGxlLAoJCQkJdGFyZ2V0OwoKCQkJaWYgKCQuaXNGdW5jdGlvbih0ZXh0KSkgewoJCQkJdGV4dCA9IHRleHQuY2FsbChjdXJyZW50LmVsZW1lbnQsIGN1cnJlbnQpOwoJCQl9CgoJCQlpZiAoIWlzU3RyaW5nKHRleHQpIHx8ICQudHJpbSh0ZXh0KSA9PT0gJycpIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJdGl0bGUgPSAkKCc8ZGl2IGNsYXNzPSJmYW5jeWJveC10aXRsZSBmYW5jeWJveC10aXRsZS0nICsgdHlwZSArICctd3JhcCI+JyArIHRleHQgKyAnPC9kaXY+Jyk7CgoJCQlzd2l0Y2ggKHR5cGUpIHsKCQkJCWNhc2UgJ2luc2lkZSc6CgkJCQkJdGFyZ2V0ID0gRi5za2luOwoJCQkJYnJlYWs7CgoJCQkJY2FzZSAnb3V0c2lkZSc6CgkJCQkJdGFyZ2V0ID0gRi53cmFwOwoJCQkJYnJlYWs7CgoJCQkJY2FzZSAnb3Zlcic6CgkJCQkJdGFyZ2V0ID0gRi5pbm5lcjsKCQkJCWJyZWFrOwoKCQkJCWRlZmF1bHQ6IC8vICdmbG9hdCcKCQkJCQl0YXJnZXQgPSBGLnNraW47CgoJCQkJCXRpdGxlLmFwcGVuZFRvKCdib2R5Jyk7CgoJCQkJCWlmICgkLmJyb3dzZXIubXNpZSkgewoJCQkJCQl0aXRsZS53aWR0aCggdGl0bGUud2lkdGgoKSApOwoJCQkJCX0KCgkJCQkJdGl0bGUud3JhcElubmVyKCc8c3BhbiBjbGFzcz0iY2hpbGQiPjwvc3Bhbj4nKTsKCgkJCQkJLy9JbmNyZWFzZSBib3R0b20gbWFyZ2luIHNvIHRoaXMgdGl0bGUgd2lsbCBhbHNvIGZpdCBpbnRvIHZpZXdwb3J0CgkJCQkJRi5jdXJyZW50Lm1hcmdpblsyXSArPSBNYXRoLmFicyggZ2V0U2NhbGFyKHRpdGxlLmNzcygnbWFyZ2luLWJvdHRvbScpKSApOwoJCQkJYnJlYWs7CgkJCX0KCgkJCXRpdGxlWyAob3B0cy5wb3NpdGlvbiA9PT0gJ3RvcCcgPyAncHJlcGVuZFRvJyAgOiAnYXBwZW5kVG8nKSBdKHRhcmdldCk7CgkJfQoJfTsKCgkvLyBqUXVlcnkgcGx1Z2luIGluaXRpYWxpemF0aW9uCgkkLmZuLmZhbmN5Ym94ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHsKCQl2YXIgaW5kZXgsCgkJCXRoYXQgICAgID0gJCh0aGlzKSwKCQkJc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yIHx8ICcnLAoJCQlydW4gICAgICA9IGZ1bmN0aW9uKGUpIHsKCQkJCXZhciB3aGF0ID0gJCh0aGlzKS5ibHVyKCksIGlkeCA9IGluZGV4LCByZWxUeXBlLCByZWxWYWw7CgoJCQkJaWYgKCEoZS5jdHJsS2V5IHx8IGUuYWx0S2V5IHx8IGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5KSAmJiAhd2hhdC5pcygnLmZhbmN5Ym94LXdyYXAnKSkgewoJCQkJCXJlbFR5cGUgPSBvcHRpb25zLmdyb3VwQXR0ciB8fCAnZGF0YS1mYW5jeWJveC1ncm91cCc7CgkJCQkJcmVsVmFsICA9IHdoYXQuYXR0cihyZWxUeXBlKTsKCgkJCQkJaWYgKCFyZWxWYWwpIHsKCQkJCQkJcmVsVHlwZSA9ICdyZWwnOwoJCQkJCQlyZWxWYWwgID0gd2hhdC5nZXQoMClbIHJlbFR5cGUgXTsKCQkJCQl9CgoJCQkJCWlmIChyZWxWYWwgJiYgcmVsVmFsICE9PSAnJyAmJiByZWxWYWwgIT09ICdub2ZvbGxvdycpIHsKCQkJCQkJd2hhdCA9IHNlbGVjdG9yLmxlbmd0aCA/ICQoc2VsZWN0b3IpIDogdGhhdDsKCQkJCQkJd2hhdCA9IHdoYXQuZmlsdGVyKCdbJyArIHJlbFR5cGUgKyAnPSInICsgcmVsVmFsICsgJyJdJyk7CgkJCQkJCWlkeCAgPSB3aGF0LmluZGV4KHRoaXMpOwoJCQkJCX0KCgkJCQkJb3B0aW9ucy5pbmRleCA9IGlkeDsKCgkJCQkJLy8gU3RvcCBhbiBldmVudCBmcm9tIGJ1YmJsaW5nIGlmIGV2ZXJ5dGhpbmcgaXMgZmluZQoJCQkJCWlmIChGLm9wZW4od2hhdCwgb3B0aW9ucykgIT09IGZhbHNlKSB7CgkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQl9CgkJCQl9CgkJCX07CgoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCWluZGV4ICAgPSBvcHRpb25zLmluZGV4IHx8IDA7CgoJCWlmICghc2VsZWN0b3IgfHwgb3B0aW9ucy5saXZlID09PSBmYWxzZSkgewoJCQl0aGF0LnVuYmluZCgnY2xpY2suZmItc3RhcnQnKS5iaW5kKCdjbGljay5mYi1zdGFydCcsIHJ1bik7CgoJCX0gZWxzZSB7CgkJCUQudW5kZWxlZ2F0ZShzZWxlY3RvciwgJ2NsaWNrLmZiLXN0YXJ0JykuZGVsZWdhdGUoc2VsZWN0b3IgKyAiOm5vdCgnLmZhbmN5Ym94LWl0ZW0sIC5mYW5jeWJveC1uYXYnKSIsICdjbGljay5mYi1zdGFydCcsIHJ1bik7CgkJfQoKCQl0aGlzLmZpbHRlcignW2RhdGEtZmFuY3lib3gtc3RhcnQ9MV0nKS50cmlnZ2VyKCdjbGljaycpOwoKCQlyZXR1cm4gdGhpczsKCX07CgoJLy8gVGVzdHMgdGhhdCBuZWVkIGEgYm9keSBhdCBkb2MgcmVhZHkKCUQucmVhZHkoZnVuY3Rpb24oKSB7CgkJaWYgKCAkLnNjcm9sbGJhcldpZHRoID09PSB1bmRlZmluZWQgKSB7CgkJCS8vIGh0dHA6Ly9iZW5hbG1hbi5jb20vcHJvamVjdHMvanF1ZXJ5LW1pc2MtcGx1Z2lucy8jc2Nyb2xsYmFyd2lkdGgKCQkJJC5zY3JvbGxiYXJXaWR0aCA9IGZ1bmN0aW9uKCkgewoJCQkJdmFyIHBhcmVudCA9ICQoJzxkaXYgc3R5bGU9IndpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6YXV0byI+PGRpdi8+PC9kaXY+JykuYXBwZW5kVG8oJ2JvZHknKSwKCQkJCQljaGlsZCAgPSBwYXJlbnQuY2hpbGRyZW4oKSwKCQkJCQl3aWR0aCAgPSBjaGlsZC5pbm5lcldpZHRoKCkgLSBjaGlsZC5oZWlnaHQoIDk5ICkuaW5uZXJXaWR0aCgpOwoKCQkJCXBhcmVudC5yZW1vdmUoKTsKCgkJCQlyZXR1cm4gd2lkdGg7CgkJCX07CgkJfQoKCQlpZiAoICQuc3VwcG9ydC5maXhlZFBvc2l0aW9uID09PSB1bmRlZmluZWQgKSB7CgkJCSQuc3VwcG9ydC5maXhlZFBvc2l0aW9uID0gKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGVsZW0gID0gJCgnPGRpdiBzdHlsZT0icG9zaXRpb246Zml4ZWQ7dG9wOjIwcHg7Ij48L2Rpdj4nKS5hcHBlbmRUbygnYm9keScpLAoJCQkJCWZpeGVkID0gKCBlbGVtWzBdLm9mZnNldFRvcCA9PT0gMjAgfHwgZWxlbVswXS5vZmZzZXRUb3AgPT09IDE1ICk7CgoJCQkJZWxlbS5yZW1vdmUoKTsKCgkJCQlyZXR1cm4gZml4ZWQ7CgkJCX0oKSk7CgkJfQoKCQkkLmV4dGVuZChGLmRlZmF1bHRzLCB7CgkJCXNjcm9sbGJhcldpZHRoIDogJC5zY3JvbGxiYXJXaWR0aCgpLAoJCQlmaXhlZCAgOiAkLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiwKCQkJcGFyZW50IDogJCgnYm9keScpCgkJfSk7Cgl9KTsKCn0od2luZG93LCBkb2N1bWVudCwgalF1ZXJ5KSk7]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/jquery.fancybox.pack.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGZhbmN5Qm94IHYyLjEuMyBmYW5jeWFwcHMuY29tIHwgZmFuY3lhcHBzLmNvbS9mYW5jeWJveC8jbGljZW5zZSAqLwooZnVuY3Rpb24oQix4LGYscSl7dmFyIHI9ZihCKSxtPWYoeCksYj1mLmZhbmN5Ym94PWZ1bmN0aW9uKCl7Yi5vcGVuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdT1udWxsLG49eC5jcmVhdGVUb3VjaCE9PXEscz1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5oYXNPd25Qcm9wZXJ0eSYmYSBpbnN0YW5jZW9mIGZ9LHA9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJiJzdHJpbmciPT09Zi50eXBlKGEpfSxFPWZ1bmN0aW9uKGEpe3JldHVybiBwKGEpJiYwPGEuaW5kZXhPZigiJSIpfSxrPWZ1bmN0aW9uKGEsZCl7dmFyIGU9cGFyc2VJbnQoYSwxMCl8fDA7ZCYmRShhKSYmKGUqPWIuZ2V0Vmlld3BvcnQoKVtkXS8xMDApO3JldHVybiBNYXRoLmNlaWwoZSl9LHY9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gayhhLGIpKyJweCJ9O2YuZXh0ZW5kKGIse3ZlcnNpb246IjIuMS4zIixkZWZhdWx0czp7cGFkZGluZzoxNSxtYXJnaW46MjAsd2lkdGg6ODAwLGhlaWdodDo2MDAsbWluV2lkdGg6MTAwLG1pbkhlaWdodDoxMDAsCm1heFdpZHRoOjk5OTksbWF4SGVpZ2h0Ojk5OTksYXV0b1NpemU6ITAsYXV0b0hlaWdodDohMSxhdXRvV2lkdGg6ITEsYXV0b1Jlc2l6ZTohMCxhdXRvQ2VudGVyOiFuLGZpdFRvVmlldzohMCxhc3BlY3RSYXRpbzohMSx0b3BSYXRpbzowLjUsbGVmdFJhdGlvOjAuNSxzY3JvbGxpbmc6ImF1dG8iLHdyYXBDU1M6IiIsYXJyb3dzOiEwLGNsb3NlQnRuOiEwLGNsb3NlQ2xpY2s6ITEsbmV4dENsaWNrOiExLG1vdXNlV2hlZWw6ITAsYXV0b1BsYXk6ITEscGxheVNwZWVkOjNFMyxwcmVsb2FkOjMsbW9kYWw6ITEsbG9vcDohMCxhamF4OntkYXRhVHlwZToiaHRtbCIsaGVhZGVyczp7IlgtZmFuY3lCb3giOiEwfX0saWZyYW1lOntzY3JvbGxpbmc6ImF1dG8iLHByZWxvYWQ6ITB9LHN3Zjp7d21vZGU6InRyYW5zcGFyZW50IixhbGxvd2Z1bGxzY3JlZW46InRydWUiLGFsbG93c2NyaXB0YWNjZXNzOiJhbHdheXMifSxrZXlzOntuZXh0OnsxMzoibGVmdCIsMzQ6InVwIiwzOToibGVmdCIsNDA6InVwIn0sCnByZXY6ezg6InJpZ2h0IiwzMzoiZG93biIsMzc6InJpZ2h0IiwzODoiZG93biJ9LGNsb3NlOlsyN10scGxheTpbMzJdLHRvZ2dsZTpbNzBdfSxkaXJlY3Rpb246e25leHQ6ImxlZnQiLHByZXY6InJpZ2h0In0sc2Nyb2xsT3V0c2lkZTohMCxpbmRleDowLHR5cGU6bnVsbCxocmVmOm51bGwsY29udGVudDpudWxsLHRpdGxlOm51bGwsdHBsOnt3cmFwOic8ZGl2IGNsYXNzPSJmYW5jeWJveC13cmFwIiB0YWJJbmRleD0iLTEiPjxkaXYgY2xhc3M9ImZhbmN5Ym94LXNraW4iPjxkaXYgY2xhc3M9ImZhbmN5Ym94LW91dGVyIj48ZGl2IGNsYXNzPSJmYW5jeWJveC1pbm5lciI+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+JyxpbWFnZTonPGltZyBjbGFzcz0iZmFuY3lib3gtaW1hZ2UiIHNyYz0ie2hyZWZ9IiBhbHQ9IiIgLz4nLGlmcmFtZTonPGlmcmFtZSBpZD0iZmFuY3lib3gtZnJhbWV7cm5kfSIgbmFtZT0iZmFuY3lib3gtZnJhbWV7cm5kfSIgY2xhc3M9ImZhbmN5Ym94LWlmcmFtZSIgZnJhbWVib3JkZXI9IjAiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiB3ZWJraXRBbGxvd0Z1bGxTY3JlZW4gbW96YWxsb3dmdWxsc2NyZWVuIGFsbG93RnVsbFNjcmVlbicrCihmLmJyb3dzZXIubXNpZT8nIGFsbG93dHJhbnNwYXJlbmN5PSJ0cnVlIic6IiIpKyI+PC9pZnJhbWU+IixlcnJvcjonPHAgY2xhc3M9ImZhbmN5Ym94LWVycm9yIj5UaGUgcmVxdWVzdGVkIGNvbnRlbnQgY2Fubm90IGJlIGxvYWRlZC48YnIvPlBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuPC9wPicsY2xvc2VCdG46JzxhIHRpdGxlPSJDbG9zZSIgY2xhc3M9ImZhbmN5Ym94LWl0ZW0gZmFuY3lib3gtY2xvc2UiIGhyZWY9ImphdmFzY3JpcHQ6OyI+PC9hPicsbmV4dDonPGEgdGl0bGU9Ik5leHQiIGNsYXNzPSJmYW5jeWJveC1uYXYgZmFuY3lib3gtbmV4dCIgaHJlZj0iamF2YXNjcmlwdDo7Ij48c3Bhbj48L3NwYW4+PC9hPicscHJldjonPGEgdGl0bGU9IlByZXZpb3VzIiBjbGFzcz0iZmFuY3lib3gtbmF2IGZhbmN5Ym94LXByZXYiIGhyZWY9ImphdmFzY3JpcHQ6OyI+PHNwYW4+PC9zcGFuPjwvYT4nfSxvcGVuRWZmZWN0OiJmYWRlIixvcGVuU3BlZWQ6MjUwLG9wZW5FYXNpbmc6InN3aW5nIiwKb3Blbk9wYWNpdHk6ITAsb3Blbk1ldGhvZDoiem9vbUluIixjbG9zZUVmZmVjdDoiZmFkZSIsY2xvc2VTcGVlZDoyNTAsY2xvc2VFYXNpbmc6InN3aW5nIixjbG9zZU9wYWNpdHk6ITAsY2xvc2VNZXRob2Q6Inpvb21PdXQiLG5leHRFZmZlY3Q6ImVsYXN0aWMiLG5leHRTcGVlZDoyNTAsbmV4dEVhc2luZzoic3dpbmciLG5leHRNZXRob2Q6ImNoYW5nZUluIixwcmV2RWZmZWN0OiJlbGFzdGljIixwcmV2U3BlZWQ6MjUwLHByZXZFYXNpbmc6InN3aW5nIixwcmV2TWV0aG9kOiJjaGFuZ2VPdXQiLGhlbHBlcnM6e292ZXJsYXk6ITAsdGl0bGU6ITB9LG9uQ2FuY2VsOmYubm9vcCxiZWZvcmVMb2FkOmYubm9vcCxhZnRlckxvYWQ6Zi5ub29wLGJlZm9yZVNob3c6Zi5ub29wLGFmdGVyU2hvdzpmLm5vb3AsYmVmb3JlQ2hhbmdlOmYubm9vcCxiZWZvcmVDbG9zZTpmLm5vb3AsYWZ0ZXJDbG9zZTpmLm5vb3B9LGdyb3VwOnt9LG9wdHM6e30scHJldmlvdXM6bnVsbCxjb21pbmc6bnVsbCxjdXJyZW50Om51bGwsCmlzQWN0aXZlOiExLGlzT3BlbjohMSxpc09wZW5lZDohMSx3cmFwOm51bGwsc2tpbjpudWxsLG91dGVyOm51bGwsaW5uZXI6bnVsbCxwbGF5ZXI6e3RpbWVyOm51bGwsaXNBY3RpdmU6ITF9LGFqYXhMb2FkOm51bGwsaW1nUHJlbG9hZDpudWxsLHRyYW5zaXRpb25zOnt9LGhlbHBlcnM6e30sb3BlbjpmdW5jdGlvbihhLGQpe2lmKGEmJihmLmlzUGxhaW5PYmplY3QoZCl8fChkPXt9KSwhMSE9PWIuY2xvc2UoITApKSlyZXR1cm4gZi5pc0FycmF5KGEpfHwoYT1zKGEpP2YoYSkuZ2V0KCk6W2FdKSxmLmVhY2goYSxmdW5jdGlvbihlLGMpe3ZhciBqPXt9LGcsaCxpLGwsazsib2JqZWN0Ij09PWYudHlwZShjKSYmKGMubm9kZVR5cGUmJihjPWYoYykpLHMoYyk/KGo9e2hyZWY6Yy5kYXRhKCJmYW5jeWJveC1ocmVmIil8fGMuYXR0cigiaHJlZiIpLHRpdGxlOmMuZGF0YSgiZmFuY3lib3gtdGl0bGUiKXx8Yy5hdHRyKCJ0aXRsZSIpLGlzRG9tOiEwLGVsZW1lbnQ6Y30sZi5tZXRhZGF0YSYmZi5leHRlbmQoITAsCmosYy5tZXRhZGF0YSgpKSk6aj1jKTtnPWQuaHJlZnx8ai5ocmVmfHwocChjKT9jOm51bGwpO2g9ZC50aXRsZSE9PXE/ZC50aXRsZTpqLnRpdGxlfHwiIjtsPShpPWQuY29udGVudHx8ai5jb250ZW50KT8iaHRtbCI6ZC50eXBlfHxqLnR5cGU7IWwmJmouaXNEb20mJihsPWMuZGF0YSgiZmFuY3lib3gtdHlwZSIpLGx8fChsPShsPWMucHJvcCgiY2xhc3MiKS5tYXRjaCgvZmFuY3lib3hcLihcdyspLykpP2xbMV06bnVsbCkpO3AoZykmJihsfHwoYi5pc0ltYWdlKGcpP2w9ImltYWdlIjpiLmlzU1dGKGcpP2w9InN3ZiI6IiMiPT09Zy5jaGFyQXQoMCk/bD0iaW5saW5lIjpwKGMpJiYobD0iaHRtbCIsaT1jKSksImFqYXgiPT09bCYmKGs9Zy5zcGxpdCgvXHMrLywyKSxnPWsuc2hpZnQoKSxrPWsuc2hpZnQoKSkpO2l8fCgiaW5saW5lIj09PWw/Zz9pPWYocChnKT9nLnJlcGxhY2UoLy4qKD89I1teXHNdKyQpLywiIik6Zyk6ai5pc0RvbSYmKGk9Yyk6Imh0bWwiPT09bD9pPWc6IWwmJighZyYmCmouaXNEb20pJiYobD0iaW5saW5lIixpPWMpKTtmLmV4dGVuZChqLHtocmVmOmcsdHlwZTpsLGNvbnRlbnQ6aSx0aXRsZTpoLHNlbGVjdG9yOmt9KTthW2VdPWp9KSxiLm9wdHM9Zi5leHRlbmQoITAse30sYi5kZWZhdWx0cyxkKSxkLmtleXMhPT1xJiYoYi5vcHRzLmtleXM9ZC5rZXlzP2YuZXh0ZW5kKHt9LGIuZGVmYXVsdHMua2V5cyxkLmtleXMpOiExKSxiLmdyb3VwPWEsYi5fc3RhcnQoYi5vcHRzLmluZGV4KX0sY2FuY2VsOmZ1bmN0aW9uKCl7dmFyIGE9Yi5jb21pbmc7YSYmITEhPT1iLnRyaWdnZXIoIm9uQ2FuY2VsIikmJihiLmhpZGVMb2FkaW5nKCksYi5hamF4TG9hZCYmYi5hamF4TG9hZC5hYm9ydCgpLGIuYWpheExvYWQ9bnVsbCxiLmltZ1ByZWxvYWQmJihiLmltZ1ByZWxvYWQub25sb2FkPWIuaW1nUHJlbG9hZC5vbmVycm9yPW51bGwpLGEud3JhcCYmYS53cmFwLnN0b3AoITAsITApLnRyaWdnZXIoIm9uUmVzZXQiKS5yZW1vdmUoKSxiLmNvbWluZz1udWxsLGIuY3VycmVudHx8CmIuX2FmdGVyWm9vbU91dChhKSl9LGNsb3NlOmZ1bmN0aW9uKGEpe2IuY2FuY2VsKCk7ITEhPT1iLnRyaWdnZXIoImJlZm9yZUNsb3NlIikmJihiLnVuYmluZEV2ZW50cygpLGIuaXNBY3RpdmUmJighYi5pc09wZW58fCEwPT09YT8oZigiLmZhbmN5Ym94LXdyYXAiKS5zdG9wKCEwKS50cmlnZ2VyKCJvblJlc2V0IikucmVtb3ZlKCksYi5fYWZ0ZXJab29tT3V0KCkpOihiLmlzT3Blbj1iLmlzT3BlbmVkPSExLGIuaXNDbG9zaW5nPSEwLGYoIi5mYW5jeWJveC1pdGVtLCAuZmFuY3lib3gtbmF2IikucmVtb3ZlKCksYi53cmFwLnN0b3AoITAsITApLnJlbW92ZUNsYXNzKCJmYW5jeWJveC1vcGVuZWQiKSxiLnRyYW5zaXRpb25zW2IuY3VycmVudC5jbG9zZU1ldGhvZF0oKSkpKX0scGxheTpmdW5jdGlvbihhKXt2YXIgZD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChiLnBsYXllci50aW1lcil9LGU9ZnVuY3Rpb24oKXtkKCk7Yi5jdXJyZW50JiZiLnBsYXllci5pc0FjdGl2ZSYmKGIucGxheWVyLnRpbWVyPQpzZXRUaW1lb3V0KGIubmV4dCxiLmN1cnJlbnQucGxheVNwZWVkKSl9LGM9ZnVuY3Rpb24oKXtkKCk7ZigiYm9keSIpLnVuYmluZCgiLnBsYXllciIpO2IucGxheWVyLmlzQWN0aXZlPSExO2IudHJpZ2dlcigib25QbGF5RW5kIil9O2lmKCEwPT09YXx8IWIucGxheWVyLmlzQWN0aXZlJiYhMSE9PWEpe2lmKGIuY3VycmVudCYmKGIuY3VycmVudC5sb29wfHxiLmN1cnJlbnQuaW5kZXg8Yi5ncm91cC5sZW5ndGgtMSkpYi5wbGF5ZXIuaXNBY3RpdmU9ITAsZigiYm9keSIpLmJpbmQoeyJhZnRlclNob3cucGxheWVyIG9uVXBkYXRlLnBsYXllciI6ZSwib25DYW5jZWwucGxheWVyIGJlZm9yZUNsb3NlLnBsYXllciI6YywiYmVmb3JlTG9hZC5wbGF5ZXIiOmR9KSxlKCksYi50cmlnZ2VyKCJvblBsYXlTdGFydCIpfWVsc2UgYygpfSxuZXh0OmZ1bmN0aW9uKGEpe3ZhciBkPWIuY3VycmVudDtkJiYocChhKXx8KGE9ZC5kaXJlY3Rpb24ubmV4dCksYi5qdW1wdG8oZC5pbmRleCsxLGEsIm5leHQiKSl9LApwcmV2OmZ1bmN0aW9uKGEpe3ZhciBkPWIuY3VycmVudDtkJiYocChhKXx8KGE9ZC5kaXJlY3Rpb24ucHJldiksYi5qdW1wdG8oZC5pbmRleC0xLGEsInByZXYiKSl9LGp1bXB0bzpmdW5jdGlvbihhLGQsZSl7dmFyIGM9Yi5jdXJyZW50O2MmJihhPWsoYSksYi5kaXJlY3Rpb249ZHx8Yy5kaXJlY3Rpb25bYT49Yy5pbmRleD8ibmV4dCI6InByZXYiXSxiLnJvdXRlcj1lfHwianVtcHRvIixjLmxvb3AmJigwPmEmJihhPWMuZ3JvdXAubGVuZ3RoK2ElYy5ncm91cC5sZW5ndGgpLGElPWMuZ3JvdXAubGVuZ3RoKSxjLmdyb3VwW2FdIT09cSYmKGIuY2FuY2VsKCksYi5fc3RhcnQoYSkpKX0scmVwb3NpdGlvbjpmdW5jdGlvbihhLGQpe3ZhciBlPWIuY3VycmVudCxjPWU/ZS53cmFwOm51bGwsajtjJiYoaj1iLl9nZXRQb3NpdGlvbihkKSxhJiYic2Nyb2xsIj09PWEudHlwZT8oZGVsZXRlIGoucG9zaXRpb24sYy5zdG9wKCEwLCEwKS5hbmltYXRlKGosMjAwKSk6KGMuY3NzKGopLGUucG9zPWYuZXh0ZW5kKHt9LAplLmRpbSxqKSkpfSx1cGRhdGU6ZnVuY3Rpb24oYSl7dmFyIGQ9YSYmYS50eXBlLGU9IWR8fCJvcmllbnRhdGlvbmNoYW5nZSI9PT1kO2UmJihjbGVhclRpbWVvdXQodSksdT1udWxsKTtiLmlzT3BlbiYmIXUmJih1PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYz1iLmN1cnJlbnQ7YyYmIWIuaXNDbG9zaW5nJiYoYi53cmFwLnJlbW92ZUNsYXNzKCJmYW5jeWJveC10bXAiKSwoZXx8ImxvYWQiPT09ZHx8InJlc2l6ZSI9PT1kJiZjLmF1dG9SZXNpemUpJiZiLl9zZXREaW1lbnNpb24oKSwic2Nyb2xsIj09PWQmJmMuY2FuU2hyaW5rfHxiLnJlcG9zaXRpb24oYSksYi50cmlnZ2VyKCJvblVwZGF0ZSIpLHU9bnVsbCl9LGUmJiFuPzA6MzAwKSl9LHRvZ2dsZTpmdW5jdGlvbihhKXtiLmlzT3BlbiYmKGIuY3VycmVudC5maXRUb1ZpZXc9ImJvb2xlYW4iPT09Zi50eXBlKGEpP2E6IWIuY3VycmVudC5maXRUb1ZpZXcsbiYmKGIud3JhcC5yZW1vdmVBdHRyKCJzdHlsZSIpLmFkZENsYXNzKCJmYW5jeWJveC10bXAiKSwKYi50cmlnZ2VyKCJvblVwZGF0ZSIpKSxiLnVwZGF0ZSgpKX0saGlkZUxvYWRpbmc6ZnVuY3Rpb24oKXttLnVuYmluZCgiLmxvYWRpbmciKTtmKCIjZmFuY3lib3gtbG9hZGluZyIpLnJlbW92ZSgpfSxzaG93TG9hZGluZzpmdW5jdGlvbigpe3ZhciBhLGQ7Yi5oaWRlTG9hZGluZygpO2E9ZignPGRpdiBpZD0iZmFuY3lib3gtbG9hZGluZyI+PGRpdj48L2Rpdj48L2Rpdj4nKS5jbGljayhiLmNhbmNlbCkuYXBwZW5kVG8oImJvZHkiKTttLmJpbmQoImtleWRvd24ubG9hZGluZyIsZnVuY3Rpb24oYSl7aWYoMjc9PT0oYS53aGljaHx8YS5rZXlDb2RlKSlhLnByZXZlbnREZWZhdWx0KCksYi5jYW5jZWwoKX0pO2IuZGVmYXVsdHMuZml4ZWR8fChkPWIuZ2V0Vmlld3BvcnQoKSxhLmNzcyh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MC41KmQuaCtkLnksbGVmdDowLjUqZC53K2QueH0pKX0sZ2V0Vmlld3BvcnQ6ZnVuY3Rpb24oKXt2YXIgYT1iLmN1cnJlbnQmJmIuY3VycmVudC5sb2NrZWR8fAohMSxkPXt4OnIuc2Nyb2xsTGVmdCgpLHk6ci5zY3JvbGxUb3AoKX07YT8oZC53PWFbMF0uY2xpZW50V2lkdGgsZC5oPWFbMF0uY2xpZW50SGVpZ2h0KTooZC53PW4mJkIuaW5uZXJXaWR0aD9CLmlubmVyV2lkdGg6ci53aWR0aCgpLGQuaD1uJiZCLmlubmVySGVpZ2h0P0IuaW5uZXJIZWlnaHQ6ci5oZWlnaHQoKSk7cmV0dXJuIGR9LHVuYmluZEV2ZW50czpmdW5jdGlvbigpe2Iud3JhcCYmcyhiLndyYXApJiZiLndyYXAudW5iaW5kKCIuZmIiKTttLnVuYmluZCgiLmZiIik7ci51bmJpbmQoIi5mYiIpfSxiaW5kRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGE9Yi5jdXJyZW50LGQ7YSYmKHIuYmluZCgib3JpZW50YXRpb25jaGFuZ2UuZmIiKyhuPyIiOiIgcmVzaXplLmZiIikrKGEuYXV0b0NlbnRlciYmIWEubG9ja2VkPyIgc2Nyb2xsLmZiIjoiIiksYi51cGRhdGUpLChkPWEua2V5cykmJm0uYmluZCgia2V5ZG93bi5mYiIsZnVuY3Rpb24oZSl7dmFyIGM9ZS53aGljaHx8ZS5rZXlDb2RlLGo9CmUudGFyZ2V0fHxlLnNyY0VsZW1lbnQ7aWYoMjc9PT1jJiZiLmNvbWluZylyZXR1cm4hMTshZS5jdHJsS2V5JiYoIWUuYWx0S2V5JiYhZS5zaGlmdEtleSYmIWUubWV0YUtleSYmKCFqfHwhai50eXBlJiYhZihqKS5pcygiW2NvbnRlbnRlZGl0YWJsZV0iKSkpJiZmLmVhY2goZCxmdW5jdGlvbihkLGope2lmKDE8YS5ncm91cC5sZW5ndGgmJmpbY10hPT1xKXJldHVybiBiW2RdKGpbY10pLGUucHJldmVudERlZmF1bHQoKSwhMTtpZigtMTxmLmluQXJyYXkoYyxqKSlyZXR1cm4gYltkXSgpLGUucHJldmVudERlZmF1bHQoKSwhMX0pfSksZi5mbi5tb3VzZXdoZWVsJiZhLm1vdXNlV2hlZWwmJmIud3JhcC5iaW5kKCJtb3VzZXdoZWVsLmZiIixmdW5jdGlvbihkLGMsaixnKXtmb3IodmFyIGg9ZihkLnRhcmdldHx8bnVsbCksaT0hMTtoLmxlbmd0aCYmIWkmJiFoLmlzKCIuZmFuY3lib3gtc2tpbiIpJiYhaC5pcygiLmZhbmN5Ym94LXdyYXAiKTspaT1oWzBdJiYhKGhbMF0uc3R5bGUub3ZlcmZsb3cmJgoiaGlkZGVuIj09PWhbMF0uc3R5bGUub3ZlcmZsb3cpJiYoaFswXS5jbGllbnRXaWR0aCYmaFswXS5zY3JvbGxXaWR0aD5oWzBdLmNsaWVudFdpZHRofHxoWzBdLmNsaWVudEhlaWdodCYmaFswXS5zY3JvbGxIZWlnaHQ+aFswXS5jbGllbnRIZWlnaHQpLGg9ZihoKS5wYXJlbnQoKTtpZigwIT09YyYmIWkmJjE8Yi5ncm91cC5sZW5ndGgmJiFhLmNhblNocmluayl7aWYoMDxnfHwwPGopYi5wcmV2KDA8Zz8iZG93biI6ImxlZnQiKTtlbHNlIGlmKDA+Z3x8MD5qKWIubmV4dCgwPmc/InVwIjoicmlnaHQiKTtkLnByZXZlbnREZWZhdWx0KCl9fSkpfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsZCl7dmFyIGUsYz1kfHxiLmNvbWluZ3x8Yi5jdXJyZW50O2lmKGMpe2YuaXNGdW5jdGlvbihjW2FdKSYmKGU9Y1thXS5hcHBseShjLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSkpO2lmKCExPT09ZSlyZXR1cm4hMTtjLmhlbHBlcnMmJmYuZWFjaChjLmhlbHBlcnMsZnVuY3Rpb24oZCwKZSl7ZSYmKGIuaGVscGVyc1tkXSYmZi5pc0Z1bmN0aW9uKGIuaGVscGVyc1tkXVthXSkpJiYoZT1mLmV4dGVuZCghMCx7fSxiLmhlbHBlcnNbZF0uZGVmYXVsdHMsZSksYi5oZWxwZXJzW2RdW2FdKGUsYykpfSk7Zi5ldmVudC50cmlnZ2VyKGErIi5mYiIpfX0saXNJbWFnZTpmdW5jdGlvbihhKXtyZXR1cm4gcChhKSYmYS5tYXRjaCgvKF5kYXRhOmltYWdlXC8uKiwpfChcLihqcChlfGd8ZWcpfGdpZnxwbmd8Ym1wfHdlYnApKChcP3wjKS4qKT8kKS9pKX0saXNTV0Y6ZnVuY3Rpb24oYSl7cmV0dXJuIHAoYSkmJmEubWF0Y2goL1wuKHN3ZikoKFw/fCMpLiopPyQvaSl9LF9zdGFydDpmdW5jdGlvbihhKXt2YXIgZD17fSxlLGMsYT1rKGEpO2U9Yi5ncm91cFthXXx8bnVsbDtpZighZSlyZXR1cm4hMTtkPWYuZXh0ZW5kKCEwLHt9LGIub3B0cyxlKTtlPWQubWFyZ2luO2M9ZC5wYWRkaW5nOyJudW1iZXIiPT09Zi50eXBlKGUpJiYoZC5tYXJnaW49W2UsZSxlLGVdKTsibnVtYmVyIj09PWYudHlwZShjKSYmCihkLnBhZGRpbmc9W2MsYyxjLGNdKTtkLm1vZGFsJiZmLmV4dGVuZCghMCxkLHtjbG9zZUJ0bjohMSxjbG9zZUNsaWNrOiExLG5leHRDbGljazohMSxhcnJvd3M6ITEsbW91c2VXaGVlbDohMSxrZXlzOm51bGwsaGVscGVyczp7b3ZlcmxheTp7Y2xvc2VDbGljazohMX19fSk7ZC5hdXRvU2l6ZSYmKGQuYXV0b1dpZHRoPWQuYXV0b0hlaWdodD0hMCk7ImF1dG8iPT09ZC53aWR0aCYmKGQuYXV0b1dpZHRoPSEwKTsiYXV0byI9PT1kLmhlaWdodCYmKGQuYXV0b0hlaWdodD0hMCk7ZC5ncm91cD1iLmdyb3VwO2QuaW5kZXg9YTtiLmNvbWluZz1kO2lmKCExPT09Yi50cmlnZ2VyKCJiZWZvcmVMb2FkIikpYi5jb21pbmc9bnVsbDtlbHNle2M9ZC50eXBlO2U9ZC5ocmVmO2lmKCFjKXJldHVybiBiLmNvbWluZz1udWxsLGIuY3VycmVudCYmYi5yb3V0ZXImJiJqdW1wdG8iIT09Yi5yb3V0ZXI/KGIuY3VycmVudC5pbmRleD1hLGJbYi5yb3V0ZXJdKGIuZGlyZWN0aW9uKSk6ITE7Yi5pc0FjdGl2ZT0KITA7aWYoImltYWdlIj09PWN8fCJzd2YiPT09YylkLmF1dG9IZWlnaHQ9ZC5hdXRvV2lkdGg9ITEsZC5zY3JvbGxpbmc9InZpc2libGUiOyJpbWFnZSI9PT1jJiYoZC5hc3BlY3RSYXRpbz0hMCk7ImlmcmFtZSI9PT1jJiZuJiYoZC5zY3JvbGxpbmc9InNjcm9sbCIpO2Qud3JhcD1mKGQudHBsLndyYXApLmFkZENsYXNzKCJmYW5jeWJveC0iKyhuPyJtb2JpbGUiOiJkZXNrdG9wIikrIiBmYW5jeWJveC10eXBlLSIrYysiIGZhbmN5Ym94LXRtcCAiK2Qud3JhcENTUykuYXBwZW5kVG8oZC5wYXJlbnR8fCJib2R5Iik7Zi5leHRlbmQoZCx7c2tpbjpmKCIuZmFuY3lib3gtc2tpbiIsZC53cmFwKSxvdXRlcjpmKCIuZmFuY3lib3gtb3V0ZXIiLGQud3JhcCksaW5uZXI6ZigiLmZhbmN5Ym94LWlubmVyIixkLndyYXApfSk7Zi5lYWNoKFsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sZnVuY3Rpb24oYSxiKXtkLnNraW4uY3NzKCJwYWRkaW5nIitiLHYoZC5wYWRkaW5nW2FdKSl9KTtiLnRyaWdnZXIoIm9uUmVhZHkiKTsKaWYoImlubGluZSI9PT1jfHwiaHRtbCI9PT1jKXtpZighZC5jb250ZW50fHwhZC5jb250ZW50Lmxlbmd0aClyZXR1cm4gYi5fZXJyb3IoImNvbnRlbnQiKX1lbHNlIGlmKCFlKXJldHVybiBiLl9lcnJvcigiaHJlZiIpOyJpbWFnZSI9PT1jP2IuX2xvYWRJbWFnZSgpOiJhamF4Ij09PWM/Yi5fbG9hZEFqYXgoKToiaWZyYW1lIj09PWM/Yi5fbG9hZElmcmFtZSgpOmIuX2FmdGVyTG9hZCgpfX0sX2Vycm9yOmZ1bmN0aW9uKGEpe2YuZXh0ZW5kKGIuY29taW5nLHt0eXBlOiJodG1sIixhdXRvV2lkdGg6ITAsYXV0b0hlaWdodDohMCxtaW5XaWR0aDowLG1pbkhlaWdodDowLHNjcm9sbGluZzoibm8iLGhhc0Vycm9yOmEsY29udGVudDpiLmNvbWluZy50cGwuZXJyb3J9KTtiLl9hZnRlckxvYWQoKX0sX2xvYWRJbWFnZTpmdW5jdGlvbigpe3ZhciBhPWIuaW1nUHJlbG9hZD1uZXcgSW1hZ2U7YS5vbmxvYWQ9ZnVuY3Rpb24oKXt0aGlzLm9ubG9hZD10aGlzLm9uZXJyb3I9bnVsbDtiLmNvbWluZy53aWR0aD0KdGhpcy53aWR0aDtiLmNvbWluZy5oZWlnaHQ9dGhpcy5oZWlnaHQ7Yi5fYWZ0ZXJMb2FkKCl9O2Eub25lcnJvcj1mdW5jdGlvbigpe3RoaXMub25sb2FkPXRoaXMub25lcnJvcj1udWxsO2IuX2Vycm9yKCJpbWFnZSIpfTthLnNyYz1iLmNvbWluZy5ocmVmOyEwIT09YS5jb21wbGV0ZSYmYi5zaG93TG9hZGluZygpfSxfbG9hZEFqYXg6ZnVuY3Rpb24oKXt2YXIgYT1iLmNvbWluZztiLnNob3dMb2FkaW5nKCk7Yi5hamF4TG9hZD1mLmFqYXgoZi5leHRlbmQoe30sYS5hamF4LHt1cmw6YS5ocmVmLGVycm9yOmZ1bmN0aW9uKGEsZSl7Yi5jb21pbmcmJiJhYm9ydCIhPT1lP2IuX2Vycm9yKCJhamF4IixhKTpiLmhpZGVMb2FkaW5nKCl9LHN1Y2Nlc3M6ZnVuY3Rpb24oZCxlKXsic3VjY2VzcyI9PT1lJiYoYS5jb250ZW50PWQsYi5fYWZ0ZXJMb2FkKCkpfX0pKX0sX2xvYWRJZnJhbWU6ZnVuY3Rpb24oKXt2YXIgYT1iLmNvbWluZyxkPWYoYS50cGwuaWZyYW1lLnJlcGxhY2UoL1x7cm5kXH0vZywKKG5ldyBEYXRlKS5nZXRUaW1lKCkpKS5hdHRyKCJzY3JvbGxpbmciLG4/ImF1dG8iOmEuaWZyYW1lLnNjcm9sbGluZykuYXR0cigic3JjIixhLmhyZWYpO2YoYS53cmFwKS5iaW5kKCJvblJlc2V0IixmdW5jdGlvbigpe3RyeXtmKHRoaXMpLmZpbmQoImlmcmFtZSIpLmhpZGUoKS5hdHRyKCJzcmMiLCIvL2Fib3V0OmJsYW5rIikuZW5kKCkuZW1wdHkoKX1jYXRjaChhKXt9fSk7YS5pZnJhbWUucHJlbG9hZCYmKGIuc2hvd0xvYWRpbmcoKSxkLm9uZSgibG9hZCIsZnVuY3Rpb24oKXtmKHRoaXMpLmRhdGEoInJlYWR5IiwxKTtufHxmKHRoaXMpLmJpbmQoImxvYWQuZmIiLGIudXBkYXRlKTtmKHRoaXMpLnBhcmVudHMoIi5mYW5jeWJveC13cmFwIikud2lkdGgoIjEwMCUiKS5yZW1vdmVDbGFzcygiZmFuY3lib3gtdG1wIikuc2hvdygpO2IuX2FmdGVyTG9hZCgpfSkpO2EuY29udGVudD1kLmFwcGVuZFRvKGEuaW5uZXIpO2EuaWZyYW1lLnByZWxvYWR8fGIuX2FmdGVyTG9hZCgpfSxfcHJlbG9hZEltYWdlczpmdW5jdGlvbigpe3ZhciBhPQpiLmdyb3VwLGQ9Yi5jdXJyZW50LGU9YS5sZW5ndGgsYz1kLnByZWxvYWQ/TWF0aC5taW4oZC5wcmVsb2FkLGUtMSk6MCxmLGc7Zm9yKGc9MTtnPD1jO2crPTEpZj1hWyhkLmluZGV4K2cpJWVdLCJpbWFnZSI9PT1mLnR5cGUmJmYuaHJlZiYmKChuZXcgSW1hZ2UpLnNyYz1mLmhyZWYpfSxfYWZ0ZXJMb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Yi5jb21pbmcsZD1iLmN1cnJlbnQsZSxjLGosZyxoO2IuaGlkZUxvYWRpbmcoKTtpZihhJiYhMSE9PWIuaXNBY3RpdmUpaWYoITE9PT1iLnRyaWdnZXIoImFmdGVyTG9hZCIsYSxkKSlhLndyYXAuc3RvcCghMCkudHJpZ2dlcigib25SZXNldCIpLnJlbW92ZSgpLGIuY29taW5nPW51bGw7ZWxzZXtkJiYoYi50cmlnZ2VyKCJiZWZvcmVDaGFuZ2UiLGQpLGQud3JhcC5zdG9wKCEwKS5yZW1vdmVDbGFzcygiZmFuY3lib3gtb3BlbmVkIikuZmluZCgiLmZhbmN5Ym94LWl0ZW0sIC5mYW5jeWJveC1uYXYiKS5yZW1vdmUoKSk7Yi51bmJpbmRFdmVudHMoKTsKZT1hLmNvbnRlbnQ7Yz1hLnR5cGU7aj1hLnNjcm9sbGluZztmLmV4dGVuZChiLHt3cmFwOmEud3JhcCxza2luOmEuc2tpbixvdXRlcjphLm91dGVyLGlubmVyOmEuaW5uZXIsY3VycmVudDphLHByZXZpb3VzOmR9KTtnPWEuaHJlZjtzd2l0Y2goYyl7Y2FzZSAiaW5saW5lIjpjYXNlICJhamF4IjpjYXNlICJodG1sIjphLnNlbGVjdG9yP2U9ZigiPGRpdj4iKS5odG1sKGUpLmZpbmQoYS5zZWxlY3Rvcik6cyhlKSYmKGUuZGF0YSgiZmFuY3lib3gtcGxhY2Vob2xkZXIiKXx8ZS5kYXRhKCJmYW5jeWJveC1wbGFjZWhvbGRlciIsZignPGRpdiBjbGFzcz0iZmFuY3lib3gtcGxhY2Vob2xkZXIiPjwvZGl2PicpLmluc2VydEFmdGVyKGUpLmhpZGUoKSksZT1lLnNob3coKS5kZXRhY2goKSxhLndyYXAuYmluZCgib25SZXNldCIsZnVuY3Rpb24oKXtmKHRoaXMpLmZpbmQoZSkubGVuZ3RoJiZlLmhpZGUoKS5yZXBsYWNlQWxsKGUuZGF0YSgiZmFuY3lib3gtcGxhY2Vob2xkZXIiKSkuZGF0YSgiZmFuY3lib3gtcGxhY2Vob2xkZXIiLAohMSl9KSk7YnJlYWs7Y2FzZSAiaW1hZ2UiOmU9YS50cGwuaW1hZ2UucmVwbGFjZSgie2hyZWZ9IixnKTticmVhaztjYXNlICJzd2YiOmU9JzxvYmplY3QgaWQ9ImZhbmN5Ym94LXN3ZiIgY2xhc3NpZD0iY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj48cGFyYW0gbmFtZT0ibW92aWUiIHZhbHVlPSInK2crJyI+PC9wYXJhbT4nLGg9IiIsZi5lYWNoKGEuc3dmLGZ1bmN0aW9uKGEsYil7ZSs9JzxwYXJhbSBuYW1lPSInK2ErJyIgdmFsdWU9IicrYisnIj48L3BhcmFtPic7aCs9IiAiK2ErJz0iJytiKyciJ30pLGUrPSc8ZW1iZWQgc3JjPSInK2crJyIgdHlwZT0iYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiJytoKyI+PC9lbWJlZD48L29iamVjdD4ifSghcyhlKXx8IWUucGFyZW50KCkuaXMoYS5pbm5lcikpJiZhLmlubmVyLmFwcGVuZChlKTtiLnRyaWdnZXIoImJlZm9yZVNob3ciKTsKYS5pbm5lci5jc3MoIm92ZXJmbG93IiwieWVzIj09PWo/InNjcm9sbCI6Im5vIj09PWo/ImhpZGRlbiI6aik7Yi5fc2V0RGltZW5zaW9uKCk7Yi5yZXBvc2l0aW9uKCk7Yi5pc09wZW49ITE7Yi5jb21pbmc9bnVsbDtiLmJpbmRFdmVudHMoKTtpZihiLmlzT3BlbmVkKXtpZihkLnByZXZNZXRob2QpYi50cmFuc2l0aW9uc1tkLnByZXZNZXRob2RdKCl9ZWxzZSBmKCIuZmFuY3lib3gtd3JhcCIpLm5vdChhLndyYXApLnN0b3AoITApLnRyaWdnZXIoIm9uUmVzZXQiKS5yZW1vdmUoKTtiLnRyYW5zaXRpb25zW2IuaXNPcGVuZWQ/YS5uZXh0TWV0aG9kOmEub3Blbk1ldGhvZF0oKTtiLl9wcmVsb2FkSW1hZ2VzKCl9fSxfc2V0RGltZW5zaW9uOmZ1bmN0aW9uKCl7dmFyIGE9Yi5nZXRWaWV3cG9ydCgpLGQ9MCxlPSExLGM9ITEsZT1iLndyYXAsaj1iLnNraW4sZz1iLmlubmVyLGg9Yi5jdXJyZW50LGM9aC53aWR0aCxpPWguaGVpZ2h0LGw9aC5taW5XaWR0aCx0PWgubWluSGVpZ2h0LG09aC5tYXhXaWR0aCwKbj1oLm1heEhlaWdodCxyPWguc2Nyb2xsaW5nLHA9aC5zY3JvbGxPdXRzaWRlP2guc2Nyb2xsYmFyV2lkdGg6MCx3PWgubWFyZ2luLHk9ayh3WzFdK3dbM10pLHE9ayh3WzBdK3dbMl0pLHgseixzLEMsQSxGLEIsRCx1O2UuYWRkKGopLmFkZChnKS53aWR0aCgiYXV0byIpLmhlaWdodCgiYXV0byIpLnJlbW92ZUNsYXNzKCJmYW5jeWJveC10bXAiKTt3PWsoai5vdXRlcldpZHRoKCEwKS1qLndpZHRoKCkpO3g9ayhqLm91dGVySGVpZ2h0KCEwKS1qLmhlaWdodCgpKTt6PXkrdztzPXEreDtDPUUoYyk/KGEudy16KSprKGMpLzEwMDpjO0E9RShpKT8oYS5oLXMpKmsoaSkvMTAwOmk7aWYoImlmcmFtZSI9PT1oLnR5cGUpe2lmKHU9aC5jb250ZW50LGguYXV0b0hlaWdodCYmMT09PXUuZGF0YSgicmVhZHkiKSl0cnl7dVswXS5jb250ZW50V2luZG93LmRvY3VtZW50LmxvY2F0aW9uJiYoZy53aWR0aChDKS5oZWlnaHQoOTk5OSksRj11LmNvbnRlbnRzKCkuZmluZCgiYm9keSIpLHAmJkYuY3NzKCJvdmVyZmxvdy14IiwKImhpZGRlbiIpLEE9Ri5oZWlnaHQoKSl9Y2F0Y2goRyl7fX1lbHNlIGlmKGguYXV0b1dpZHRofHxoLmF1dG9IZWlnaHQpZy5hZGRDbGFzcygiZmFuY3lib3gtdG1wIiksaC5hdXRvV2lkdGh8fGcud2lkdGgoQyksaC5hdXRvSGVpZ2h0fHxnLmhlaWdodChBKSxoLmF1dG9XaWR0aCYmKEM9Zy53aWR0aCgpKSxoLmF1dG9IZWlnaHQmJihBPWcuaGVpZ2h0KCkpLGcucmVtb3ZlQ2xhc3MoImZhbmN5Ym94LXRtcCIpO2M9ayhDKTtpPWsoQSk7RD1DL0E7bD1rKEUobCk/ayhsLCJ3IiktejpsKTttPWsoRShtKT9rKG0sInciKS16Om0pO3Q9ayhFKHQpP2sodCwiaCIpLXM6dCk7bj1rKEUobik/ayhuLCJoIiktczpuKTtGPW07Qj1uO2guZml0VG9WaWV3JiYobT1NYXRoLm1pbihhLncteixtKSxuPU1hdGgubWluKGEuaC1zLG4pKTt6PWEudy15O3E9YS5oLXE7aC5hc3BlY3RSYXRpbz8oYz5tJiYoYz1tLGk9ayhjL0QpKSxpPm4mJihpPW4sYz1rKGkqRCkpLGM8bCYmKGM9bCxpPWsoYy9EKSksaTx0JiYKKGk9dCxjPWsoaSpEKSkpOihjPU1hdGgubWF4KGwsTWF0aC5taW4oYyxtKSksaC5hdXRvSGVpZ2h0JiYiaWZyYW1lIiE9PWgudHlwZSYmKGcud2lkdGgoYyksaT1nLmhlaWdodCgpKSxpPU1hdGgubWF4KHQsTWF0aC5taW4oaSxuKSkpO2lmKGguZml0VG9WaWV3KWlmKGcud2lkdGgoYykuaGVpZ2h0KGkpLGUud2lkdGgoYyt3KSxhPWUud2lkdGgoKSx5PWUuaGVpZ2h0KCksaC5hc3BlY3RSYXRpbylmb3IoOyhhPnp8fHk+cSkmJihjPmwmJmk+dCkmJiEoMTk8ZCsrKTspaT1NYXRoLm1heCh0LE1hdGgubWluKG4saS0xMCkpLGM9ayhpKkQpLGM8bCYmKGM9bCxpPWsoYy9EKSksYz5tJiYoYz1tLGk9ayhjL0QpKSxnLndpZHRoKGMpLmhlaWdodChpKSxlLndpZHRoKGMrdyksYT1lLndpZHRoKCkseT1lLmhlaWdodCgpO2Vsc2UgYz1NYXRoLm1heChsLE1hdGgubWluKGMsYy0oYS16KSkpLGk9TWF0aC5tYXgodCxNYXRoLm1pbihpLGktKHktcSkpKTtwJiYoImF1dG8iPT09ciYmaTxBJiZjK3crCnA8eikmJihjKz1wKTtnLndpZHRoKGMpLmhlaWdodChpKTtlLndpZHRoKGMrdyk7YT1lLndpZHRoKCk7eT1lLmhlaWdodCgpO2U9KGE+enx8eT5xKSYmYz5sJiZpPnQ7Yz1oLmFzcGVjdFJhdGlvP2M8RiYmaTxCJiZjPEMmJmk8QTooYzxGfHxpPEIpJiYoYzxDfHxpPEEpO2YuZXh0ZW5kKGgse2RpbTp7d2lkdGg6dihhKSxoZWlnaHQ6dih5KX0sb3JpZ1dpZHRoOkMsb3JpZ0hlaWdodDpBLGNhblNocmluazplLGNhbkV4cGFuZDpjLHdQYWRkaW5nOncsaFBhZGRpbmc6eCx3cmFwU3BhY2U6eS1qLm91dGVySGVpZ2h0KCEwKSxza2luU3BhY2U6ai5oZWlnaHQoKS1pfSk7IXUmJihoLmF1dG9IZWlnaHQmJmk+dCYmaTxuJiYhYykmJmcuaGVpZ2h0KCJhdXRvIil9LF9nZXRQb3NpdGlvbjpmdW5jdGlvbihhKXt2YXIgZD1iLmN1cnJlbnQsZT1iLmdldFZpZXdwb3J0KCksYz1kLm1hcmdpbixmPWIud3JhcC53aWR0aCgpK2NbMV0rY1szXSxnPWIud3JhcC5oZWlnaHQoKStjWzBdK2NbMl0sYz17cG9zaXRpb246ImFic29sdXRlIiwKdG9wOmNbMF0sbGVmdDpjWzNdfTtkLmF1dG9DZW50ZXImJmQuZml4ZWQmJiFhJiZnPD1lLmgmJmY8PWUudz9jLnBvc2l0aW9uPSJmaXhlZCI6ZC5sb2NrZWR8fChjLnRvcCs9ZS55LGMubGVmdCs9ZS54KTtjLnRvcD12KE1hdGgubWF4KGMudG9wLGMudG9wKyhlLmgtZykqZC50b3BSYXRpbykpO2MubGVmdD12KE1hdGgubWF4KGMubGVmdCxjLmxlZnQrKGUudy1mKSpkLmxlZnRSYXRpbykpO3JldHVybiBjfSxfYWZ0ZXJab29tSW46ZnVuY3Rpb24oKXt2YXIgYT1iLmN1cnJlbnQ7YSYmKGIuaXNPcGVuPWIuaXNPcGVuZWQ9ITAsYi53cmFwLmNzcygib3ZlcmZsb3ciLCJ2aXNpYmxlIikuYWRkQ2xhc3MoImZhbmN5Ym94LW9wZW5lZCIpLGIudXBkYXRlKCksKGEuY2xvc2VDbGlja3x8YS5uZXh0Q2xpY2smJjE8Yi5ncm91cC5sZW5ndGgpJiZiLmlubmVyLmNzcygiY3Vyc29yIiwicG9pbnRlciIpLmJpbmQoImNsaWNrLmZiIixmdW5jdGlvbihkKXshZihkLnRhcmdldCkuaXMoImEiKSYmIWYoZC50YXJnZXQpLnBhcmVudCgpLmlzKCJhIikmJgooZC5wcmV2ZW50RGVmYXVsdCgpLGJbYS5jbG9zZUNsaWNrPyJjbG9zZSI6Im5leHQiXSgpKX0pLGEuY2xvc2VCdG4mJmYoYS50cGwuY2xvc2VCdG4pLmFwcGVuZFRvKGIuc2tpbikuYmluZChuPyJ0b3VjaHN0YXJ0LmZiIjoiY2xpY2suZmIiLGZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKTtiLmNsb3NlKCl9KSxhLmFycm93cyYmMTxiLmdyb3VwLmxlbmd0aCYmKChhLmxvb3B8fDA8YS5pbmRleCkmJmYoYS50cGwucHJldikuYXBwZW5kVG8oYi5vdXRlcikuYmluZCgiY2xpY2suZmIiLGIucHJldiksKGEubG9vcHx8YS5pbmRleDxiLmdyb3VwLmxlbmd0aC0xKSYmZihhLnRwbC5uZXh0KS5hcHBlbmRUbyhiLm91dGVyKS5iaW5kKCJjbGljay5mYiIsYi5uZXh0KSksYi50cmlnZ2VyKCJhZnRlclNob3ciKSwhYS5sb29wJiZhLmluZGV4PT09YS5ncm91cC5sZW5ndGgtMT9iLnBsYXkoITEpOmIub3B0cy5hdXRvUGxheSYmIWIucGxheWVyLmlzQWN0aXZlJiYoYi5vcHRzLmF1dG9QbGF5PQohMSxiLnBsYXkoKSkpfSxfYWZ0ZXJab29tT3V0OmZ1bmN0aW9uKGEpe2E9YXx8Yi5jdXJyZW50O2YoIi5mYW5jeWJveC13cmFwIikudHJpZ2dlcigib25SZXNldCIpLnJlbW92ZSgpO2YuZXh0ZW5kKGIse2dyb3VwOnt9LG9wdHM6e30scm91dGVyOiExLGN1cnJlbnQ6bnVsbCxpc0FjdGl2ZTohMSxpc09wZW5lZDohMSxpc09wZW46ITEsaXNDbG9zaW5nOiExLHdyYXA6bnVsbCxza2luOm51bGwsb3V0ZXI6bnVsbCxpbm5lcjpudWxsfSk7Yi50cmlnZ2VyKCJhZnRlckNsb3NlIixhKX19KTtiLnRyYW5zaXRpb25zPXtnZXRPcmlnUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT1iLmN1cnJlbnQsZD1hLmVsZW1lbnQsZT1hLm9yaWcsYz17fSxmPTUwLGc9NTAsaD1hLmhQYWRkaW5nLGk9YS53UGFkZGluZyxsPWIuZ2V0Vmlld3BvcnQoKTshZSYmKGEuaXNEb20mJmQuaXMoIjp2aXNpYmxlIikpJiYoZT1kLmZpbmQoImltZzpmaXJzdCIpLGUubGVuZ3RofHwoZT1kKSk7cyhlKT8oYz1lLm9mZnNldCgpLAplLmlzKCJpbWciKSYmKGY9ZS5vdXRlcldpZHRoKCksZz1lLm91dGVySGVpZ2h0KCkpKTooYy50b3A9bC55KyhsLmgtZykqYS50b3BSYXRpbyxjLmxlZnQ9bC54KyhsLnctZikqYS5sZWZ0UmF0aW8pO2lmKCJmaXhlZCI9PT1iLndyYXAuY3NzKCJwb3NpdGlvbiIpfHxhLmxvY2tlZCljLnRvcC09bC55LGMubGVmdC09bC54O3JldHVybiBjPXt0b3A6dihjLnRvcC1oKmEudG9wUmF0aW8pLGxlZnQ6dihjLmxlZnQtaSphLmxlZnRSYXRpbyksd2lkdGg6dihmK2kpLGhlaWdodDp2KGcraCl9fSxzdGVwOmZ1bmN0aW9uKGEsZCl7dmFyIGUsYyxmPWQucHJvcDtjPWIuY3VycmVudDt2YXIgZz1jLndyYXBTcGFjZSxoPWMuc2tpblNwYWNlO2lmKCJ3aWR0aCI9PT1mfHwiaGVpZ2h0Ij09PWYpZT1kLmVuZD09PWQuc3RhcnQ/MTooYS1kLnN0YXJ0KS8oZC5lbmQtZC5zdGFydCksYi5pc0Nsb3NpbmcmJihlPTEtZSksYz0id2lkdGgiPT09Zj9jLndQYWRkaW5nOmMuaFBhZGRpbmcsYz1hLWMsYi5za2luW2ZdKGsoIndpZHRoIj09PQpmP2M6Yy1nKmUpKSxiLmlubmVyW2ZdKGsoIndpZHRoIj09PWY/YzpjLWcqZS1oKmUpKX0sem9vbUluOmZ1bmN0aW9uKCl7dmFyIGE9Yi5jdXJyZW50LGQ9YS5wb3MsZT1hLm9wZW5FZmZlY3QsYz0iZWxhc3RpYyI9PT1lLGo9Zi5leHRlbmQoe29wYWNpdHk6MX0sZCk7ZGVsZXRlIGoucG9zaXRpb247Yz8oZD10aGlzLmdldE9yaWdQb3NpdGlvbigpLGEub3Blbk9wYWNpdHkmJihkLm9wYWNpdHk9MC4xKSk6ImZhZGUiPT09ZSYmKGQub3BhY2l0eT0wLjEpO2Iud3JhcC5jc3MoZCkuYW5pbWF0ZShqLHtkdXJhdGlvbjoibm9uZSI9PT1lPzA6YS5vcGVuU3BlZWQsZWFzaW5nOmEub3BlbkVhc2luZyxzdGVwOmM/dGhpcy5zdGVwOm51bGwsY29tcGxldGU6Yi5fYWZ0ZXJab29tSW59KX0sem9vbU91dDpmdW5jdGlvbigpe3ZhciBhPWIuY3VycmVudCxkPWEuY2xvc2VFZmZlY3QsZT0iZWxhc3RpYyI9PT1kLGM9e29wYWNpdHk6MC4xfTtlJiYoYz10aGlzLmdldE9yaWdQb3NpdGlvbigpLGEuY2xvc2VPcGFjaXR5JiYKKGMub3BhY2l0eT0wLjEpKTtiLndyYXAuYW5pbWF0ZShjLHtkdXJhdGlvbjoibm9uZSI9PT1kPzA6YS5jbG9zZVNwZWVkLGVhc2luZzphLmNsb3NlRWFzaW5nLHN0ZXA6ZT90aGlzLnN0ZXA6bnVsbCxjb21wbGV0ZTpiLl9hZnRlclpvb21PdXR9KX0sY2hhbmdlSW46ZnVuY3Rpb24oKXt2YXIgYT1iLmN1cnJlbnQsZD1hLm5leHRFZmZlY3QsZT1hLnBvcyxjPXtvcGFjaXR5OjF9LGY9Yi5kaXJlY3Rpb24sZztlLm9wYWNpdHk9MC4xOyJlbGFzdGljIj09PWQmJihnPSJkb3duIj09PWZ8fCJ1cCI9PT1mPyJ0b3AiOiJsZWZ0IiwiZG93biI9PT1mfHwicmlnaHQiPT09Zj8oZVtnXT12KGsoZVtnXSktMjAwKSxjW2ddPSIrPTIwMHB4Iik6KGVbZ109dihrKGVbZ10pKzIwMCksY1tnXT0iLT0yMDBweCIpKTsibm9uZSI9PT1kP2IuX2FmdGVyWm9vbUluKCk6Yi53cmFwLmNzcyhlKS5hbmltYXRlKGMse2R1cmF0aW9uOmEubmV4dFNwZWVkLGVhc2luZzphLm5leHRFYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGIuX2FmdGVyWm9vbUluLAoyMCl9fSl9LGNoYW5nZU91dDpmdW5jdGlvbigpe3ZhciBhPWIucHJldmlvdXMsZD1hLnByZXZFZmZlY3QsZT17b3BhY2l0eTowLjF9LGM9Yi5kaXJlY3Rpb247ImVsYXN0aWMiPT09ZCYmKGVbImRvd24iPT09Y3x8InVwIj09PWM/InRvcCI6ImxlZnQiXT0oInVwIj09PWN8fCJsZWZ0Ij09PWM/Ii0iOiIrIikrIj0yMDBweCIpO2Eud3JhcC5hbmltYXRlKGUse2R1cmF0aW9uOiJub25lIj09PWQ/MDphLnByZXZTcGVlZCxlYXNpbmc6YS5wcmV2RWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7Zih0aGlzKS50cmlnZ2VyKCJvblJlc2V0IikucmVtb3ZlKCl9fSl9fTtiLmhlbHBlcnMub3ZlcmxheT17ZGVmYXVsdHM6e2Nsb3NlQ2xpY2s6ITAsc3BlZWRPdXQ6MjAwLHNob3dFYXJseTohMCxjc3M6e30sbG9ja2VkOiFuLGZpeGVkOiEwfSxvdmVybGF5Om51bGwsZml4ZWQ6ITEsY3JlYXRlOmZ1bmN0aW9uKGEpe2E9Zi5leHRlbmQoe30sdGhpcy5kZWZhdWx0cyxhKTt0aGlzLm92ZXJsYXkmJnRoaXMuY2xvc2UoKTsKdGhpcy5vdmVybGF5PWYoJzxkaXYgY2xhc3M9ImZhbmN5Ym94LW92ZXJsYXkiPjwvZGl2PicpLmFwcGVuZFRvKCJib2R5Iik7dGhpcy5maXhlZD0hMTthLmZpeGVkJiZiLmRlZmF1bHRzLmZpeGVkJiYodGhpcy5vdmVybGF5LmFkZENsYXNzKCJmYW5jeWJveC1vdmVybGF5LWZpeGVkIiksdGhpcy5maXhlZD0hMCl9LG9wZW46ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcyxhPWYuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdHMsYSk7dGhpcy5vdmVybGF5P3RoaXMub3ZlcmxheS51bmJpbmQoIi5vdmVybGF5Iikud2lkdGgoImF1dG8iKS5oZWlnaHQoImF1dG8iKTp0aGlzLmNyZWF0ZShhKTt0aGlzLmZpeGVkfHwoci5iaW5kKCJyZXNpemUub3ZlcmxheSIsZi5wcm94eSh0aGlzLnVwZGF0ZSx0aGlzKSksdGhpcy51cGRhdGUoKSk7YS5jbG9zZUNsaWNrJiZ0aGlzLm92ZXJsYXkuYmluZCgiY2xpY2sub3ZlcmxheSIsZnVuY3Rpb24oYSl7ZihhLnRhcmdldCkuaGFzQ2xhc3MoImZhbmN5Ym94LW92ZXJsYXkiKSYmCihiLmlzQWN0aXZlP2IuY2xvc2UoKTpkLmNsb3NlKCkpfSk7dGhpcy5vdmVybGF5LmNzcyhhLmNzcykuc2hvdygpfSxjbG9zZTpmdW5jdGlvbigpe2YoIi5mYW5jeWJveC1vdmVybGF5IikucmVtb3ZlKCk7ci51bmJpbmQoInJlc2l6ZS5vdmVybGF5Iik7dGhpcy5vdmVybGF5PW51bGw7ITEhPT10aGlzLm1hcmdpbiYmKGYoImJvZHkiKS5jc3MoIm1hcmdpbi1yaWdodCIsdGhpcy5tYXJnaW4pLHRoaXMubWFyZ2luPSExKTt0aGlzLmVsJiZ0aGlzLmVsLnJlbW92ZUNsYXNzKCJmYW5jeWJveC1sb2NrIil9LHVwZGF0ZTpmdW5jdGlvbigpe3ZhciBhPSIxMDAlIixiO3RoaXMub3ZlcmxheS53aWR0aChhKS5oZWlnaHQoIjEwMCUiKTtmLmJyb3dzZXIubXNpZT8oYj1NYXRoLm1heCh4LmRvY3VtZW50RWxlbWVudC5vZmZzZXRXaWR0aCx4LmJvZHkub2Zmc2V0V2lkdGgpLG0ud2lkdGgoKT5iJiYoYT1tLndpZHRoKCkpKTptLndpZHRoKCk+ci53aWR0aCgpJiYoYT1tLndpZHRoKCkpO3RoaXMub3ZlcmxheS53aWR0aChhKS5oZWlnaHQobS5oZWlnaHQoKSl9LApvblJlYWR5OmZ1bmN0aW9uKGEsYil7ZigiLmZhbmN5Ym94LW92ZXJsYXkiKS5zdG9wKCEwLCEwKTt0aGlzLm92ZXJsYXl8fCh0aGlzLm1hcmdpbj1tLmhlaWdodCgpPnIuaGVpZ2h0KCl8fCJzY3JvbGwiPT09ZigiYm9keSIpLmNzcygib3ZlcmZsb3cteSIpP2YoImJvZHkiKS5jc3MoIm1hcmdpbi1yaWdodCIpOiExLHRoaXMuZWw9eC5hbGwmJiF4LnF1ZXJ5U2VsZWN0b3I/ZigiaHRtbCIpOmYoImJvZHkiKSx0aGlzLmNyZWF0ZShhKSk7YS5sb2NrZWQmJnRoaXMuZml4ZWQmJihiLmxvY2tlZD10aGlzLm92ZXJsYXkuYXBwZW5kKGIud3JhcCksYi5maXhlZD0hMSk7ITA9PT1hLnNob3dFYXJseSYmdGhpcy5iZWZvcmVTaG93LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYmVmb3JlU2hvdzpmdW5jdGlvbihhLGIpe2IubG9ja2VkJiYodGhpcy5lbC5hZGRDbGFzcygiZmFuY3lib3gtbG9jayIpLCExIT09dGhpcy5tYXJnaW4mJmYoImJvZHkiKS5jc3MoIm1hcmdpbi1yaWdodCIsayh0aGlzLm1hcmdpbikrCmIuc2Nyb2xsYmFyV2lkdGgpKTt0aGlzLm9wZW4oYSl9LG9uVXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5maXhlZHx8dGhpcy51cGRhdGUoKX0sYWZ0ZXJDbG9zZTpmdW5jdGlvbihhKXt0aGlzLm92ZXJsYXkmJiFiLmlzQWN0aXZlJiZ0aGlzLm92ZXJsYXkuZmFkZU91dChhLnNwZWVkT3V0LGYucHJveHkodGhpcy5jbG9zZSx0aGlzKSl9fTtiLmhlbHBlcnMudGl0bGU9e2RlZmF1bHRzOnt0eXBlOiJmbG9hdCIscG9zaXRpb246ImJvdHRvbSJ9LGJlZm9yZVNob3c6ZnVuY3Rpb24oYSl7dmFyIGQ9Yi5jdXJyZW50LGU9ZC50aXRsZSxjPWEudHlwZTtmLmlzRnVuY3Rpb24oZSkmJihlPWUuY2FsbChkLmVsZW1lbnQsZCkpO2lmKHAoZSkmJiIiIT09Zi50cmltKGUpKXtkPWYoJzxkaXYgY2xhc3M9ImZhbmN5Ym94LXRpdGxlIGZhbmN5Ym94LXRpdGxlLScrYysnLXdyYXAiPicrZSsiPC9kaXY+Iik7c3dpdGNoKGMpe2Nhc2UgImluc2lkZSI6Yz1iLnNraW47YnJlYWs7Y2FzZSAib3V0c2lkZSI6Yz0KYi53cmFwO2JyZWFrO2Nhc2UgIm92ZXIiOmM9Yi5pbm5lcjticmVhaztkZWZhdWx0OmM9Yi5za2luLGQuYXBwZW5kVG8oImJvZHkiKSxmLmJyb3dzZXIubXNpZSYmZC53aWR0aChkLndpZHRoKCkpLGQud3JhcElubmVyKCc8c3BhbiBjbGFzcz0iY2hpbGQiPjwvc3Bhbj4nKSxiLmN1cnJlbnQubWFyZ2luWzJdKz1NYXRoLmFicyhrKGQuY3NzKCJtYXJnaW4tYm90dG9tIikpKX1kWyJ0b3AiPT09YS5wb3NpdGlvbj8icHJlcGVuZFRvIjoiYXBwZW5kVG8iXShjKX19fTtmLmZuLmZhbmN5Ym94PWZ1bmN0aW9uKGEpe3ZhciBkLGU9Zih0aGlzKSxjPXRoaXMuc2VsZWN0b3J8fCIiLGo9ZnVuY3Rpb24oZyl7dmFyIGg9Zih0aGlzKS5ibHVyKCksaT1kLGosazshZy5jdHJsS2V5JiYoIWcuYWx0S2V5JiYhZy5zaGlmdEtleSYmIWcubWV0YUtleSkmJiFoLmlzKCIuZmFuY3lib3gtd3JhcCIpJiYoaj1hLmdyb3VwQXR0cnx8ImRhdGEtZmFuY3lib3gtZ3JvdXAiLGs9aC5hdHRyKGopLGt8fChqPSJyZWwiLAprPWguZ2V0KDApW2pdKSxrJiYoIiIhPT1rJiYibm9mb2xsb3ciIT09aykmJihoPWMubGVuZ3RoP2YoYyk6ZSxoPWguZmlsdGVyKCJbIitqKyc9IicraysnIl0nKSxpPWguaW5kZXgodGhpcykpLGEuaW5kZXg9aSwhMSE9PWIub3BlbihoLGEpJiZnLnByZXZlbnREZWZhdWx0KCkpfSxhPWF8fHt9O2Q9YS5pbmRleHx8MDshY3x8ITE9PT1hLmxpdmU/ZS51bmJpbmQoImNsaWNrLmZiLXN0YXJ0IikuYmluZCgiY2xpY2suZmItc3RhcnQiLGopOm0udW5kZWxlZ2F0ZShjLCJjbGljay5mYi1zdGFydCIpLmRlbGVnYXRlKGMrIjpub3QoJy5mYW5jeWJveC1pdGVtLCAuZmFuY3lib3gtbmF2JykiLCJjbGljay5mYi1zdGFydCIsaik7dGhpcy5maWx0ZXIoIltkYXRhLWZhbmN5Ym94LXN0YXJ0PTFdIikudHJpZ2dlcigiY2xpY2siKTtyZXR1cm4gdGhpc307bS5yZWFkeShmdW5jdGlvbigpe2Yuc2Nyb2xsYmFyV2lkdGg9PT1xJiYoZi5zY3JvbGxiYXJXaWR0aD1mdW5jdGlvbigpe3ZhciBhPWYoJzxkaXYgc3R5bGU9IndpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6YXV0byI+PGRpdi8+PC9kaXY+JykuYXBwZW5kVG8oImJvZHkiKSwKYj1hLmNoaWxkcmVuKCksYj1iLmlubmVyV2lkdGgoKS1iLmhlaWdodCg5OSkuaW5uZXJXaWR0aCgpO2EucmVtb3ZlKCk7cmV0dXJuIGJ9KTtpZihmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbj09PXEpe3ZhciBhPWYuc3VwcG9ydCxkPWYoJzxkaXYgc3R5bGU9InBvc2l0aW9uOmZpeGVkO3RvcDoyMHB4OyI+PC9kaXY+JykuYXBwZW5kVG8oImJvZHkiKSxlPTIwPT09ZFswXS5vZmZzZXRUb3B8fDE1PT09ZFswXS5vZmZzZXRUb3A7ZC5yZW1vdmUoKTthLmZpeGVkUG9zaXRpb249ZX1mLmV4dGVuZChiLmRlZmF1bHRzLHtzY3JvbGxiYXJXaWR0aDpmLnNjcm9sbGJhcldpZHRoKCksZml4ZWQ6Zi5zdXBwb3J0LmZpeGVkUG9zaXRpb24scGFyZW50OmYoImJvZHkiKX0pfSl9KSh3aW5kb3csZG9jdW1lbnQsalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/jquery.mousewheel-3.0.6.pack.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIENvcHlyaWdodCAoYykgMjAxMSBCcmFuZG9uIEFhcm9uIChodHRwOi8vYnJhbmRvbmFhcm9uLm5ldCkKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChMSUNFTlNFLnR4dCkuCiAqCiAqIFRoYW5rcyB0bzogaHR0cDovL2Fkb21hcy5vcmcvamF2YXNjcmlwdC1tb3VzZS13aGVlbC8gZm9yIHNvbWUgcG9pbnRlcnMuCiAqIFRoYW5rcyB0bzogTWF0aGlhcyBCYW5rKGh0dHA6Ly93d3cubWF0aGlhcy1iYW5rLmRlKSBmb3IgYSBzY29wZSBidWcgZml4LgogKiBUaGFua3MgdG86IFNlYW11cyBMZWFoeSBmb3IgYWRkaW5nIGRlbHRhWCBhbmQgZGVsdGFZCiAqCiAqIFZlcnNpb246IDMuMC42CiAqIAogKiBSZXF1aXJlczogMS4yLjIrCiAqLwooZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZShhKXt2YXIgYj1hfHx3aW5kb3cuZXZlbnQsYz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxmPTAsZT0wLGc9MCxhPWQuZXZlbnQuZml4KGIpO2EudHlwZT0ibW91c2V3aGVlbCI7Yi53aGVlbERlbHRhJiYoZj1iLndoZWVsRGVsdGEvMTIwKTtiLmRldGFpbCYmKGY9LWIuZGV0YWlsLzMpO2c9ZjtiLmF4aXMhPT12b2lkIDAmJmIuYXhpcz09PWIuSE9SSVpPTlRBTF9BWElTJiYoZz0wLGU9LTEqZik7Yi53aGVlbERlbHRhWSE9PXZvaWQgMCYmKGc9Yi53aGVlbERlbHRhWS8xMjApO2Iud2hlZWxEZWx0YVghPT12b2lkIDAmJihlPS0xKmIud2hlZWxEZWx0YVgvMTIwKTtjLnVuc2hpZnQoYSxmLGUsZyk7cmV0dXJuKGQuZXZlbnQuZGlzcGF0Y2h8fGQuZXZlbnQuaGFuZGxlKS5hcHBseSh0aGlzLGMpfXZhciBjPVsiRE9NTW91c2VTY3JvbGwiLCJtb3VzZXdoZWVsIl07aWYoZC5ldmVudC5maXhIb29rcylmb3IodmFyIGg9Yy5sZW5ndGg7aDspZC5ldmVudC5maXhIb29rc1tjWy0taF1dPQpkLmV2ZW50Lm1vdXNlSG9va3M7ZC5ldmVudC5zcGVjaWFsLm1vdXNld2hlZWw9e3NldHVwOmZ1bmN0aW9uKCl7aWYodGhpcy5hZGRFdmVudExpc3RlbmVyKWZvcih2YXIgYT1jLmxlbmd0aDthOyl0aGlzLmFkZEV2ZW50TGlzdGVuZXIoY1stLWFdLGUsZmFsc2UpO2Vsc2UgdGhpcy5vbm1vdXNld2hlZWw9ZX0sdGVhcmRvd246ZnVuY3Rpb24oKXtpZih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIpZm9yKHZhciBhPWMubGVuZ3RoO2E7KXRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjWy0tYV0sZSxmYWxzZSk7ZWxzZSB0aGlzLm9ubW91c2V3aGVlbD1udWxsfX07ZC5mbi5leHRlbmQoe21vdXNld2hlZWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5iaW5kKCJtb3VzZXdoZWVsIixhKTp0aGlzLnRyaWdnZXIoIm1vdXNld2hlZWwiKX0sdW5tb3VzZXdoZWVsOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVuYmluZCgibW91c2V3aGVlbCIsYSl9fSl9KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSBhcnJheSgnanMvanF1ZXJ5LmlmcmFtZS10cmFuc3BvcnQuanMnLCdqcy9qcXVlcnkuZmlsZXVwbG9hZC5qcycpOwokaW5mb1snZGVwZW5kcyddID0gYXJyYXkoJ2pxdWVyeScsJ3VpJyk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/cors/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/cors/jquery.postmessage-transport.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IHBvc3RNZXNzYWdlIFRyYW5zcG9ydCBQbHVnaW4gMS4xCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKmpzbGludCB1bnBhcmFtOiB0cnVlLCBub21lbjogdHJ1ZSAqLwovKmdsb2JhbCBkZWZpbmUsIHdpbmRvdywgZG9jdW1lbnQgKi8KCihmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgY291bnRlciA9IDAsCiAgICAgICAgbmFtZXMgPSBbCiAgICAgICAgICAgICdhY2NlcHRzJywKICAgICAgICAgICAgJ2NhY2hlJywKICAgICAgICAgICAgJ2NvbnRlbnRzJywKICAgICAgICAgICAgJ2NvbnRlbnRUeXBlJywKICAgICAgICAgICAgJ2Nyb3NzRG9tYWluJywKICAgICAgICAgICAgJ2RhdGEnLAogICAgICAgICAgICAnZGF0YVR5cGUnLAogICAgICAgICAgICAnaGVhZGVycycsCiAgICAgICAgICAgICdpZk1vZGlmaWVkJywKICAgICAgICAgICAgJ21pbWVUeXBlJywKICAgICAgICAgICAgJ3Bhc3N3b3JkJywKICAgICAgICAgICAgJ3Byb2Nlc3NEYXRhJywKICAgICAgICAgICAgJ3RpbWVvdXQnLAogICAgICAgICAgICAndHJhZGl0aW9uYWwnLAogICAgICAgICAgICAndHlwZScsCiAgICAgICAgICAgICd1cmwnLAogICAgICAgICAgICAndXNlcm5hbWUnCiAgICAgICAgXSwKICAgICAgICBjb252ZXJ0ID0gZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgcmV0dXJuIHA7CiAgICAgICAgfTsKCiAgICAkLmFqYXhTZXR1cCh7CiAgICAgICAgY29udmVydGVyczogewogICAgICAgICAgICAncG9zdG1lc3NhZ2UgdGV4dCc6IGNvbnZlcnQsCiAgICAgICAgICAgICdwb3N0bWVzc2FnZSBqc29uJzogY29udmVydCwKICAgICAgICAgICAgJ3Bvc3RtZXNzYWdlIGh0bWwnOiBjb252ZXJ0CiAgICAgICAgfQogICAgfSk7CgogICAgJC5hamF4VHJhbnNwb3J0KCdwb3N0bWVzc2FnZScsIGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgaWYgKG9wdGlvbnMucG9zdE1lc3NhZ2UgJiYgd2luZG93LnBvc3RNZXNzYWdlKSB7CiAgICAgICAgICAgIHZhciBpZnJhbWUsCiAgICAgICAgICAgICAgICBsb2MgPSAkKCc8YT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy5wb3N0TWVzc2FnZSlbMF0sCiAgICAgICAgICAgICAgICB0YXJnZXQgPSBsb2MucHJvdG9jb2wgKyAnLy8nICsgbG9jLmhvc3QsCiAgICAgICAgICAgICAgICB4aHJVcGxvYWQgPSBvcHRpb25zLnhocigpLnVwbG9hZDsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChfLCBjb21wbGV0ZUNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ3Bvc3RtZXNzYWdlLXRyYW5zcG9ydC0nICsgKGNvdW50ZXIgKz0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lID0gJ21lc3NhZ2UuJyArIG1lc3NhZ2UuaWQ7CiAgICAgICAgICAgICAgICAgICAgaWZyYW1lID0gJCgKICAgICAgICAgICAgICAgICAgICAgICAgJzxpZnJhbWUgc3R5bGU9ImRpc3BsYXk6bm9uZTsiIHNyYz0iJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBvc3RNZXNzYWdlICsgJyIgbmFtZT0iJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlkICsgJyI+PC9pZnJhbWU+JwogICAgICAgICAgICAgICAgICAgICkuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG5hbWVzLCBmdW5jdGlvbiAoaSwgbmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVtuYW1lXSA9IG9wdGlvbnNbbmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGFUeXBlID0gbWVzc2FnZS5kYXRhVHlwZS5yZXBsYWNlKCdwb3N0bWVzc2FnZSAnLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQod2luZG93KS5iaW5kKGV2ZW50TmFtZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlLm9yaWdpbmFsRXZlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGUuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLm9yaWdpbiA9PT0gdGFyZ2V0ICYmIGRhdGEuaWQgPT09IG1lc3NhZ2UuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAncHJvZ3Jlc3MnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmluaXRFdmVudChkYXRhLnR5cGUsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5leHRlbmQoZXYsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHJVcGxvYWQuZGlzcGF0Y2hFdmVudChldik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVDYWxsYmFjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3Bvc3RtZXNzYWdlOiBkYXRhLnJlc3VsdH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmhlYWRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpbmRvdykudW5iaW5kKGV2ZW50TmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lWzBdLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSkuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfSk7Cgp9KSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/cors/jquery.xdr-transport.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IFhEb21haW5SZXF1ZXN0IFRyYW5zcG9ydCBQbHVnaW4gMS4xLjIKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDExLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKgogKiBCYXNlZCBvbiBKdWxpYW4gQXVib3VyZydzIGFqYXhIb29rcyB4ZHIuanM6CiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXVib3VyZy9hamF4SG9va3MvCiAqLwoKLypqc2xpbnQgdW5wYXJhbTogdHJ1ZSAqLwovKmdsb2JhbCBkZWZpbmUsIHdpbmRvdywgWERvbWFpblJlcXVlc3QgKi8KCihmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKICAgIGlmICh3aW5kb3cuWERvbWFpblJlcXVlc3QgJiYgISQuc3VwcG9ydC5jb3JzKSB7CiAgICAgICAgJC5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uIChzKSB7CiAgICAgICAgICAgIGlmIChzLmNyb3NzRG9tYWluICYmIHMuYXN5bmMpIHsKICAgICAgICAgICAgICAgIGlmIChzLnRpbWVvdXQpIHsKICAgICAgICAgICAgICAgICAgICBzLnhkclRpbWVvdXQgPSBzLnRpbWVvdXQ7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHMudGltZW91dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB4ZHI7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChoZWFkZXJzLCBjb21wbGV0ZUNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrKHN0YXR1cywgc3RhdHVzVGV4dCwgcmVzcG9uc2VzLCByZXNwb25zZUhlYWRlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkci5vbmxvYWQgPSB4ZHIub25lcnJvciA9IHhkci5vbnRpbWVvdXQgPSAkLm5vb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZHIgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVDYWxsYmFjayhzdGF0dXMsIHN0YXR1c1RleHQsIHJlc3BvbnNlcywgcmVzcG9uc2VIZWFkZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB4ZHIgPSBuZXcgWERvbWFpblJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gWERvbWFpblJlcXVlc3Qgb25seSBzdXBwb3J0cyBHRVQgYW5kIFBPU1Q6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLnR5cGUgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnVybCA9IHMudXJsICsgKC9cPy8udGVzdChzLnVybCkgPyAnJicgOiAnPycpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX21ldGhvZD1ERUxFVEUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMudHlwZSA9PT0gJ1BVVCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudXJsID0gcy51cmwgKyAoL1w/Ly50ZXN0KHMudXJsKSA/ICcmJyA6ICc/JykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfbWV0aG9kPVBVVCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgeGRyLm9wZW4ocy50eXBlLCBzLnVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhkci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09LJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dGV4dDogeGRyLnJlc3BvbnNlVGV4dH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJyArIHhkci5jb250ZW50VHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgeGRyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayg0MDQsICdOb3QgRm91bmQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMueGRyVGltZW91dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGRyLm9udGltZW91dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygwLCAndGltZW91dCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkci50aW1lb3V0ID0gcy54ZHJUaW1lb3V0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHhkci5zZW5kKChzLmhhc0NvbnRlbnQgJiYgcy5kYXRhKSB8fCBudWxsKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4ZHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkci5vbmVycm9yID0gJC5ub29wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZHIuYWJvcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KfSkpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/jquery.fileupload-fp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIEZpbGUgUHJvY2Vzc2luZyBQbHVnaW4gMS4yLjEKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEyLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi8qanNsaW50IG5vbWVuOiB0cnVlLCB1bnBhcmFtOiB0cnVlLCByZWdleHA6IHRydWUgKi8KLypnbG9iYWwgZGVmaW5lLCB3aW5kb3csIGRvY3VtZW50ICovCgooZnVuY3Rpb24gKGZhY3RvcnkpIHsKICAgICd1c2Ugc3RyaWN0JzsKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgQU1EIG1vZHVsZToKICAgICAgICBkZWZpbmUoWwogICAgICAgICAgICAnanF1ZXJ5JywKICAgICAgICAgICAgJ2xvYWQtaW1hZ2UnLAogICAgICAgICAgICAnY2FudmFzLXRvLWJsb2InLAogICAgICAgICAgICAnLi9qcXVlcnkuZmlsZXVwbG9hZCcKICAgICAgICBdLCBmYWN0b3J5KTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3RvcnkoCiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnksCiAgICAgICAgICAgIHdpbmRvdy5sb2FkSW1hZ2UKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCBsb2FkSW1hZ2UpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBUaGUgRmlsZSBVcGxvYWQgRlAgdmVyc2lvbiBleHRlbmRzIHRoZSBmaWxldXBsb2FkIHdpZGdldAogICAgLy8gd2l0aCBmaWxlIHByb2Nlc3NpbmcgZnVuY3Rpb25hbGl0eToKICAgICQud2lkZ2V0KCdibHVlaW1wLmZpbGV1cGxvYWQnLCAkLmJsdWVpbXAuZmlsZXVwbG9hZCwgewoKICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIC8vIFRoZSBsaXN0IG9mIGZpbGUgcHJvY2Vzc2luZyBhY3Rpb25zOgogICAgICAgICAgICBwcm9jZXNzOiBbCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbG9hZCcsCiAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGVzOiAvXmltYWdlXC8oZ2lmfGpwZWd8cG5nKSQvLAogICAgICAgICAgICAgICAgICAgIG1heEZpbGVTaXplOiAyMDAwMDAwMCAvLyAyME1CCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3Jlc2l6ZScsCiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IDE5MjAsCiAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiAxMjAwLAogICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiA4MDAsCiAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiA2MDAKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnc2F2ZScKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KICAgICAgICAgICAgXSwKCiAgICAgICAgICAgIC8vIFRoZSBhZGQgY2FsbGJhY2sgaXMgaW52b2tlZCBhcyBzb29uIGFzIGZpbGVzIGFyZSBhZGRlZCB0byB0aGUKICAgICAgICAgICAgLy8gZmlsZXVwbG9hZCB3aWRnZXQgKHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgZHJhZyAmIGRyb3Agb3IgYWRkCiAgICAgICAgICAgIC8vIEFQSSBjYWxsKS4gU2VlIHRoZSBiYXNpYyBmaWxlIHVwbG9hZCB3aWRnZXQgZm9yIG1vcmUgaW5mb3JtYXRpb246CiAgICAgICAgICAgIGFkZDogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgICQodGhpcykuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuc3VibWl0KCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByb2Nlc3NBY3Rpb25zOiB7CiAgICAgICAgICAgIC8vIExvYWRzIHRoZSBpbWFnZSBnaXZlbiB2aWEgZGF0YS5maWxlcyBhbmQgZGF0YS5pbmRleAogICAgICAgICAgICAvLyBhcyBpbWcgZWxlbWVudCBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBjYW52YXMuCiAgICAgICAgICAgIC8vIEFjY2VwdHMgdGhlIG9wdGlvbnMgZmlsZVR5cGVzIChyZWd1bGFyIGV4cHJlc3Npb24pCiAgICAgICAgICAgIC8vIGFuZCBtYXhGaWxlU2l6ZSAoaW50ZWdlcikgdG8gbGltaXQgdGhlIGZpbGVzIHRvIGxvYWQ6CiAgICAgICAgICAgIGxvYWQ6IGZ1bmN0aW9uIChkYXRhLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGRhdGEuZmlsZXNbZGF0YS5pbmRleF0sCiAgICAgICAgICAgICAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpOwogICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5IVE1MQ2FudmFzRWxlbWVudCAmJgogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuSFRNTENhbnZhc0VsZW1lbnQucHJvdG90eXBlLnRvQmxvYiAmJgogICAgICAgICAgICAgICAgICAgICAgICAoJC50eXBlKG9wdGlvbnMubWF4RmlsZVNpemUpICE9PSAnbnVtYmVyJyB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5zaXplIDwgb3B0aW9ucy5tYXhGaWxlU2l6ZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKCFvcHRpb25zLmZpbGVUeXBlcyB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlVHlwZXMudGVzdChmaWxlLnR5cGUpKSkgewogICAgICAgICAgICAgICAgICAgIGxvYWRJbWFnZSgKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGltZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbWcuc3JjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRmZC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmltZyA9IGltZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCh0aGF0LCBbZGF0YV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgodGhhdCwgW2RhdGFdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBSZXNpemVzIHRoZSBpbWFnZSBnaXZlbiBhcyBkYXRhLmltZyBhbmQgdXBkYXRlcwogICAgICAgICAgICAvLyBkYXRhLmNhbnZhcyB3aXRoIHRoZSByZXNpemVkIGltYWdlIGFzIGNhbnZhcyBlbGVtZW50LgogICAgICAgICAgICAvLyBBY2NlcHRzIHRoZSBvcHRpb25zIG1heFdpZHRoLCBtYXhIZWlnaHQsIG1pbldpZHRoIGFuZAogICAgICAgICAgICAvLyBtaW5IZWlnaHQgdG8gc2NhbGUgdGhlIGdpdmVuIGltYWdlOgogICAgICAgICAgICByZXNpemU6IGZ1bmN0aW9uIChkYXRhLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICB2YXIgaW1nID0gZGF0YS5pbWcsCiAgICAgICAgICAgICAgICAgICAgY2FudmFzOwogICAgICAgICAgICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHtjYW52YXM6IHRydWV9LCBvcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmIChpbWcpIHsKICAgICAgICAgICAgICAgICAgICBjYW52YXMgPSBsb2FkSW1hZ2Uuc2NhbGUoaW1nLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FudmFzLndpZHRoICE9PSBpbWcud2lkdGggfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgIT09IGltZy5oZWlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5jYW52YXMgPSBjYW52YXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIFNhdmVzIHRoZSBwcm9jZXNzZWQgaW1hZ2UgZ2l2ZW4gYXMgZGF0YS5jYW52YXMKICAgICAgICAgICAgLy8gaW5wbGFjZSBhdCBkYXRhLmluZGV4IG9mIGRhdGEuZmlsZXM6CiAgICAgICAgICAgIHNhdmU6IGZ1bmN0aW9uIChkYXRhLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nIGlmIG5vIHByb2Nlc3NpbmcgaGFzIGhhcHBlbmVkOgogICAgICAgICAgICAgICAgaWYgKCFkYXRhLmNhbnZhcykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgICAgIGZpbGUgPSBkYXRhLmZpbGVzW2RhdGEuaW5kZXhdLAogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBmaWxlLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKGJsb2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFibG9iLm5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLnR5cGUgPT09IGJsb2IudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2IubmFtZSA9IGZpbGUubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZS5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvYi5uYW1lID0gZmlsZS5uYW1lLnJlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9cLi4rJC8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJyArIGJsb2IudHlwZS5zdWJzdHIoNikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjcmVhdGVkIGJsb2IgYXQgdGhlIHBvc2l0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBvcmlnaW5hbCBmaWxlIGluIHRoZSBmaWxlcyBsaXN0OgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbGVzW2RhdGEuaW5kZXhdID0gYmxvYjsKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKHRoYXQsIFtkYXRhXSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8vIFVzZSBjYW52YXMubW96R2V0QXNGaWxlIGRpcmVjdGx5LCB0byByZXRhaW4gdGhlIGZpbGVuYW1lLCBhcwogICAgICAgICAgICAgICAgLy8gR2Vja28gZG9lc24ndCBzdXBwb3J0IHRoZSBmaWxlbmFtZSBvcHRpb24gZm9yIEZvcm1EYXRhLmFwcGVuZDoKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNhbnZhcy5tb3pHZXRBc0ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhkYXRhLmNhbnZhcy5tb3pHZXRBc0ZpbGUoCiAgICAgICAgICAgICAgICAgICAgICAgICgvXmltYWdlXC8oanBlZ3xwbmcpJC8udGVzdChmaWxlLnR5cGUpICYmIG5hbWUpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG5hbWUgJiYgbmFtZS5yZXBsYWNlKC9cLi4rJC8sICcnKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmxvYicpICsgJy5wbmcnLAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnR5cGUKICAgICAgICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jYW52YXMudG9CbG9iKGNhbGxiYWNrLCBmaWxlLnR5cGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvLyBSZXNpemVzIHRoZSBmaWxlIGF0IHRoZSBnaXZlbiBpbmRleCBhbmQgc3RvcmVzIHRoZSBjcmVhdGVkIGJsb2IgYXQKICAgICAgICAvLyB0aGUgb3JpZ2luYWwgcG9zaXRpb24gb2YgdGhlIGZpbGVzIGxpc3QsIHJldHVybnMgYSBQcm9taXNlIG9iamVjdDoKICAgICAgICBfcHJvY2Vzc0ZpbGU6IGZ1bmN0aW9uIChmaWxlcywgaW5kZXgsIG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpLnJlc29sdmVXaXRoKHRoYXQsIFt7CiAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleAogICAgICAgICAgICAgICAgfV0pLAogICAgICAgICAgICAgICAgY2hhaW4gPSBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nICs9IDE7CiAgICAgICAgICAgICQuZWFjaChvcHRpb25zLnByb2Nlc3MsIGZ1bmN0aW9uIChpLCBzZXR0aW5ncykgewogICAgICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi5waXBlKGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQucHJvY2Vzc0FjdGlvbnNbc2V0dGluZ3MuYWN0aW9uXQogICAgICAgICAgICAgICAgICAgICAgICAuY2FsbCh0aGlzLCBkYXRhLCBzZXR0aW5ncyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNoYWluLmFsd2F5cyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nIC09IDE7CiAgICAgICAgICAgICAgICBpZiAodGhhdC5fcHJvY2Vzc2luZyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2ZpbGV1cGxvYWQtcHJvY2Vzc2luZycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKHRoYXQuX3Byb2Nlc3NpbmcgPT09IDEpIHsKICAgICAgICAgICAgICAgIHRoYXQuZWxlbWVudC5hZGRDbGFzcygnZmlsZXVwbG9hZC1wcm9jZXNzaW5nJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNoYWluOwogICAgICAgIH0sCgogICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZXMgZ2l2ZW4gYXMgZmlsZXMgcHJvcGVydHkgb2YgdGhlIGRhdGEgcGFyYW1ldGVyLAogICAgICAgIC8vIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCB0aGF0IGFsbG93cyB0byBiaW5kIGEgZG9uZSBoYW5kbGVyLCB3aGljaAogICAgICAgIC8vIHdpbGwgYmUgaW52b2tlZCBhZnRlciBwcm9jZXNzaW5nIGFsbCBmaWxlcyAoaW5wbGFjZSkgaXMgZG9uZToKICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnByb2Nlc3MgJiYgb3B0aW9ucy5wcm9jZXNzLmxlbmd0aCAmJgogICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnBpcGUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzRmlsZShkYXRhLmZpbGVzLCBpbmRleCwgb3B0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWx3YXlzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKHRoYXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSAwOwogICAgICAgICAgICB0aGlzLl9wcm9jZXNzaW5nUXVldWUgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhpcykKICAgICAgICAgICAgICAgIC5wcm9taXNlKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/jquery.fileupload-ui.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVzZXIgSW50ZXJmYWNlIFBsdWdpbiA3LjEKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi8qanNsaW50IG5vbWVuOiB0cnVlLCB1bnBhcmFtOiB0cnVlLCByZWdleHA6IHRydWUgKi8KLypnbG9iYWwgZGVmaW5lLCB3aW5kb3csIFVSTCwgd2Via2l0VVJMLCBGaWxlUmVhZGVyICovCgooZnVuY3Rpb24gKGZhY3RvcnkpIHsKICAgICd1c2Ugc3RyaWN0JzsKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgQU1EIG1vZHVsZToKICAgICAgICBkZWZpbmUoWwogICAgICAgICAgICAnanF1ZXJ5JywKICAgICAgICAgICAgJ3RtcGwnLAogICAgICAgICAgICAnbG9hZC1pbWFnZScsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLWZwJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeSwKICAgICAgICAgICAgd2luZG93LnRtcGwsCiAgICAgICAgICAgIHdpbmRvdy5sb2FkSW1hZ2UKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCB0bXBsLCBsb2FkSW1hZ2UpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBUaGUgVUkgdmVyc2lvbiBleHRlbmRzIHRoZSBmaWxlIHVwbG9hZCB3aWRnZXQKICAgIC8vIGFuZCBhZGRzIGNvbXBsZXRlIHVzZXIgaW50ZXJmYWNlIGludGVyYWN0aW9uOgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsICQuYmx1ZWltcC5maWxldXBsb2FkLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYWRkZWQgdG8gdGhlIHdpZGdldCBhcmUgdXBsb2FkZWQgYXMgc29vbgogICAgICAgICAgICAvLyBhcyB0aGUgdXNlciBjbGlja3Mgb24gdGhlIHN0YXJ0IGJ1dHRvbnMuIFRvIGVuYWJsZSBhdXRvbWF0aWMKICAgICAgICAgICAgLy8gdXBsb2Fkcywgc2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRydWU6CiAgICAgICAgICAgIGF1dG9VcGxvYWQ6IGZhbHNlLAogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIG9wdGlvbiBsaW1pdHMgdGhlIG51bWJlciBvZiBmaWxlcyB0aGF0IGFyZQogICAgICAgICAgICAvLyBhbGxvd2VkIHRvIGJlIHVwbG9hZGVkIHVzaW5nIHRoaXMgd2lkZ2V0OgogICAgICAgICAgICBtYXhOdW1iZXJPZkZpbGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBtYXhpbXVtIGFsbG93ZWQgZmlsZSBzaXplOgogICAgICAgICAgICBtYXhGaWxlU2l6ZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBUaGUgbWluaW11bSBhbGxvd2VkIGZpbGUgc2l6ZToKICAgICAgICAgICAgbWluRmlsZVNpemU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgYWxsb3dlZCBmaWxlIHR5cGVzLCBtYXRjaGVzCiAgICAgICAgICAgIC8vIGFnYWluc3QgZWl0aGVyIGZpbGUgdHlwZSBvciBmaWxlIG5hbWU6CiAgICAgICAgICAgIGFjY2VwdEZpbGVUeXBlczogIC8uKyQvaSwKICAgICAgICAgICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBkZWZpbmUgZm9yIHdoaWNoIGZpbGVzIGEgcHJldmlldwogICAgICAgICAgICAvLyBpbWFnZSBpcyBzaG93biwgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaWxlIHR5cGU6CiAgICAgICAgICAgIHByZXZpZXdTb3VyY2VGaWxlVHlwZXM6IC9eaW1hZ2VcLyhnaWZ8anBlZ3xwbmcpJC8sCiAgICAgICAgICAgIC8vIFRoZSBtYXhpbXVtIGZpbGUgc2l6ZSBvZiBpbWFnZXMgdGhhdCBhcmUgdG8gYmUgZGlzcGxheWVkIGFzIHByZXZpZXc6CiAgICAgICAgICAgIHByZXZpZXdTb3VyY2VNYXhGaWxlU2l6ZTogNTAwMDAwMCwgLy8gNU1CCiAgICAgICAgICAgIC8vIFRoZSBtYXhpbXVtIHdpZHRoIG9mIHRoZSBwcmV2aWV3IGltYWdlczoKICAgICAgICAgICAgcHJldmlld01heFdpZHRoOiA4MCwKICAgICAgICAgICAgLy8gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBwcmV2aWV3IGltYWdlczoKICAgICAgICAgICAgcHJldmlld01heEhlaWdodDogODAsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHByZXZpZXcgaW1hZ2VzIGFyZSBkaXNwbGF5ZWQgYXMgY2FudmFzIGVsZW1lbnRzCiAgICAgICAgICAgIC8vIGlmIHN1cHBvcnRlZCBieSB0aGUgYnJvd3Nlci4gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGZhbHNlCiAgICAgICAgICAgIC8vIHRvIGFsd2F5cyBkaXNwbGF5IHByZXZpZXcgaW1hZ2VzIGFzIGltZyBlbGVtZW50czoKICAgICAgICAgICAgcHJldmlld0FzQ2FudmFzOiB0cnVlLAogICAgICAgICAgICAvLyBUaGUgSUQgb2YgdGhlIHVwbG9hZCB0ZW1wbGF0ZToKICAgICAgICAgICAgdXBsb2FkVGVtcGxhdGVJZDogJ3RlbXBsYXRlLXVwbG9hZCcsCiAgICAgICAgICAgIC8vIFRoZSBJRCBvZiB0aGUgZG93bmxvYWQgdGVtcGxhdGU6CiAgICAgICAgICAgIGRvd25sb2FkVGVtcGxhdGVJZDogJ3RlbXBsYXRlLWRvd25sb2FkJywKICAgICAgICAgICAgLy8gVGhlIGNvbnRhaW5lciBmb3IgdGhlIGxpc3Qgb2YgZmlsZXMuIElmIHVuZGVmaW5lZCwgaXQgaXMgc2V0IHRvCiAgICAgICAgICAgIC8vIGFuIGVsZW1lbnQgd2l0aCBjbGFzcyAiZmlsZXMiIGluc2lkZSBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQ6CiAgICAgICAgICAgIGZpbGVzQ29udGFpbmVyOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFyZSBhcHBlbmRlZCB0byB0aGUgZmlsZXMgY29udGFpbmVyLgogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSwgdG8gcHJlcGVuZCBmaWxlcyBpbnN0ZWFkOgogICAgICAgICAgICBwcmVwZW5kRmlsZXM6IGZhbHNlLAogICAgICAgICAgICAvLyBUaGUgZXhwZWN0ZWQgZGF0YSB0eXBlIG9mIHRoZSB1cGxvYWQgcmVzcG9uc2UsIHNldHMgdGhlIGRhdGFUeXBlCiAgICAgICAgICAgIC8vIG9wdGlvbiBvZiB0aGUgJC5hamF4IHVwbG9hZCByZXF1ZXN0czoKICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJywKCiAgICAgICAgICAgIC8vIFRoZSBhZGQgY2FsbGJhY2sgaXMgaW52b2tlZCBhcyBzb29uIGFzIGZpbGVzIGFyZSBhZGRlZCB0byB0aGUgZmlsZXVwbG9hZAogICAgICAgICAgICAvLyB3aWRnZXQgKHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgZHJhZyAmIGRyb3Agb3IgYWRkIEFQSSBjYWxsKS4KICAgICAgICAgICAgLy8gU2VlIHRoZSBiYXNpYyBmaWxlIHVwbG9hZCB3aWRnZXQgZm9yIG1vcmUgaW5mb3JtYXRpb246CiAgICAgICAgICAgIGFkZDogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHRoYXQub3B0aW9ucywKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGRhdGEuZmlsZXM7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbGV1cGxvYWQoJ3Byb2Nlc3MnLCBkYXRhKS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9hZGp1c3RNYXhOdW1iZXJPZkZpbGVzKC1maWxlcy5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGRhdGEubWF4TnVtYmVyT2ZGaWxlc0FkanVzdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbGVzLnZhbGlkID0gZGF0YS5pc1ZhbGlkYXRlZCA9IHRoYXQuX3ZhbGlkYXRlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSB0aGF0Ll9yZW5kZXJVcGxvYWQoZmlsZXMpLmRhdGEoJ2RhdGEnLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyWwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByZXBlbmRGaWxlcyA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnCiAgICAgICAgICAgICAgICAgICAgXShkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX3JlbmRlclByZXZpZXdzKGZpbGVzLCBkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2ZvcmNlUmVmbG93KGRhdGEuY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhhdC5fdHJpZ2dlcignYWRkZWQnLCBlLCBkYXRhKSAhPT0gZmFsc2UpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmF1dG9VcGxvYWQgfHwgZGF0YS5hdXRvVXBsb2FkKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmF1dG9VcGxvYWQgIT09IGZhbHNlICYmIGRhdGEuaXNWYWxpZGF0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdGhlIHN0YXJ0IG9mIGVhY2ggZmlsZSB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgc2VuZDogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyk7CiAgICAgICAgICAgICAgICBpZiAoIWRhdGEuaXNWYWxpZGF0ZWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEubWF4TnVtYmVyT2ZGaWxlc0FkanVzdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkanVzdE1heE51bWJlck9mRmlsZXMoLWRhdGEuZmlsZXMubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tYXhOdW1iZXJPZkZpbGVzQWRqdXN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoYXQuX3ZhbGlkYXRlKGRhdGEuZmlsZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5jb250ZXh0ICYmIGRhdGEuZGF0YVR5cGUgJiYKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5kYXRhVHlwZS5zdWJzdHIoMCwgNikgPT09ICdpZnJhbWUnKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWZyYW1lIFRyYW5zcG9ydCBkb2VzIG5vdCBzdXBwb3J0IHByb2dyZXNzIGV2ZW50cy4KICAgICAgICAgICAgICAgICAgICAvLyBJbiBsYWNrIG9mIGFuIGluZGV0ZXJtaW5hdGUgcHJvZ3Jlc3MgYmFyLCB3ZSBzZXQKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvZ3Jlc3MgdG8gMTAwJSwgc2hvd2luZyB0aGUgZnVsbCBhbmltYXRlZCBiYXI6CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcucHJvZ3Jlc3MnKS5hZGRDbGFzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICEkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiAncHJvZ3Jlc3MtYW5pbWF0ZWQnCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCAxMDApCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuYmFyJykuY3NzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxMDAlJwogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX3RyaWdnZXIoJ3NlbnQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHN1Y2Nlc3NmdWwgdXBsb2FkczoKICAgICAgICAgICAgZG9uZTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSB0aGF0Ll9nZXRGaWxlc0Zyb21SZXNwb25zZShkYXRhKSwKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZDsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBmaWxlc1tpbmRleF0gfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZXJyb3I6ICdFbXB0eSBmaWxlIHVwbG9hZCByZXN1bHQnfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkanVzdE1heE51bWJlck9mRmlsZXMoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbigkKHRoaXMpKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoYXQuX3JlbmRlckRvd25sb2FkKFtmaWxlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24odGVtcGxhdGUpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjb21wbGV0ZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5tYXhOdW1iZXJPZkZpbGVzQWRqdXN0ZWQgJiYgZmlsZS5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkanVzdE1heE51bWJlck9mRmlsZXMoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFkYXRhLm1heE51bWJlck9mRmlsZXNBZGp1c3RlZCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZmlsZS5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkanVzdE1heE51bWJlck9mRmlsZXMoLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tYXhOdW1iZXJPZkZpbGVzQWRqdXN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoYXQuX3JlbmRlckRvd25sb2FkKGZpbGVzKQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8odGhhdC5vcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyh0ZW1wbGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQgPSB0aGF0Ll9hZGRGaW5pc2hlZERlZmVycmVkcygpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24odGVtcGxhdGUpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjb21wbGV0ZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmFpbGVkIChhYm9ydCBvciBlcnJvcikgdXBsb2FkczoKICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUsCiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQ7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5tYXhOdW1iZXJPZkZpbGVzQWRqdXN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9hZGp1c3RNYXhOdW1iZXJPZkZpbGVzKGRhdGEuZmlsZXMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24gIT09ICdhYm9ydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZGF0YS5maWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gZmlsZS5lcnJvciB8fCBkYXRhLmVycm9yVGhyb3duIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmluaXNoZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yVGhyb3duICE9PSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyh0aGF0Lm9wdGlvbnMuZmlsZXNDb250YWluZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdkYXRhJywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3coZGF0YS5jb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCkucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5jb250ZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2dyZXNzID0gcGFyc2VJbnQoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0LmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuYmFyJykuY3NzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gcGFyc2VJbnQoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwLCAxMCksCiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUHJvZ3Jlc3NOb2RlID0gJHRoaXMuZmluZCgnLmZpbGV1cGxvYWQtcHJvZ3Jlc3MnKSwKICAgICAgICAgICAgICAgICAgICBleHRlbmRlZFByb2dyZXNzTm9kZSA9IGdsb2JhbFByb2dyZXNzTm9kZQogICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnLnByb2dyZXNzLWV4dGVuZGVkJyk7CiAgICAgICAgICAgICAgICBpZiAoZXh0ZW5kZWRQcm9ncmVzc05vZGUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9ncmVzc05vZGUuaHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuZGF0YSgnZmlsZXVwbG9hZCcpLl9yZW5kZXJFeHRlbmRlZFByb2dyZXNzKGRhdGEpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdsb2JhbFByb2dyZXNzTm9kZQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcucHJvZ3Jlc3MnKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5iYXInKS5jc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICd3aWR0aCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6CiAgICAgICAgICAgIHN0YXJ0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIHRoYXQuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKS5maW5kKCcuZmlsZXVwbG9hZC1wcm9ncmVzcycpKS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RhcnRlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQgPSB0aGF0Ll9hZGRGaW5pc2hlZERlZmVycmVkcygpOwogICAgICAgICAgICAgICAgJC53aGVuLmFwcGx5KCQsIHRoYXQuX2dldEZpbmlzaGVkRGVmZXJyZWRzKCkpCiAgICAgICAgICAgICAgICAgICAgLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdzdG9wcGVkJywgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKCQodGhpcykuZmluZCgnLmZpbGV1cGxvYWQtcHJvZ3Jlc3MnKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgJzAnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5iYXInKS5jc3MoJ3dpZHRoJywgJzAlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzLWV4dGVuZGVkJykuaHRtbCgnJm5ic3A7Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmlsZSBkZWxldGlvbjoKICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyk7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS51cmwpIHsKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fYWRqdXN0TWF4TnVtYmVyT2ZGaWxlcygxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oZGF0YS5jb250ZXh0KS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9yZXNldEZpbmlzaGVkRGVmZXJyZWRzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkVXBsb2FkcyA9IFtdOwogICAgICAgIH0sCgogICAgICAgIF9hZGRGaW5pc2hlZERlZmVycmVkczogZnVuY3Rpb24gKGRlZmVycmVkKSB7CiAgICAgICAgICAgIGlmICghZGVmZXJyZWQpIHsKICAgICAgICAgICAgICAgIGRlZmVycmVkID0gJC5EZWZlcnJlZCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkVXBsb2Fkcy5wdXNoKGRlZmVycmVkKTsKICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkOwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgX2dldEZpbmlzaGVkRGVmZXJyZWRzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9maW5pc2hlZFVwbG9hZHM7CiAgICAgICAgfSwKCiAgICAgICAgX2dldEZpbGVzRnJvbVJlc3BvbnNlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBpZiAoZGF0YS5yZXN1bHQgJiYgJC5pc0FycmF5KGRhdGEucmVzdWx0LmZpbGVzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEucmVzdWx0LmZpbGVzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9LAoKICAgICAgICAvLyBMaW5rIGhhbmRsZXIsIHRoYXQgYWxsb3dzIHRvIGRvd25sb2FkIGZpbGVzCiAgICAgICAgLy8gYnkgZHJhZyAmIGRyb3Agb2YgdGhlIGxpbmtzIHRvIHRoZSBkZXNrdG9wOgogICAgICAgIF9lbmFibGVEcmFnVG9EZXNrdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIHVybCA9IGxpbmsucHJvcCgnaHJlZicpLAogICAgICAgICAgICAgICAgbmFtZSA9IGxpbmsucHJvcCgnZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICAgICAgbGluay5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdEb3dubG9hZFVSTCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlLCBuYW1lLCB1cmxdLmpvaW4oJzonKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9hZGp1c3RNYXhOdW1iZXJPZkZpbGVzOiBmdW5jdGlvbiAob3BlcmFuZCkgewogICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgKz0gb3BlcmFuZDsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA8IDEpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlRmlsZUlucHV0QnV0dG9uKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuYWJsZUZpbGVJbnB1dEJ1dHRvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2Zvcm1hdEZpbGVTaXplOiBmdW5jdGlvbiAoYnl0ZXMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBieXRlcyAhPT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYnl0ZXMgPj0gMTAwMDAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDAwMDAwMDApLnRvRml4ZWQoMikgKyAnIEdCJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYnl0ZXMgPj0gMTAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDAwMDApLnRvRml4ZWQoMikgKyAnIE1CJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKGJ5dGVzIC8gMTAwMCkudG9GaXhlZCgyKSArICcgS0InOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRCaXRyYXRlOiBmdW5jdGlvbiAoYml0cykgewogICAgICAgICAgICBpZiAodHlwZW9mIGJpdHMgIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJpdHMgPj0gMTAwMDAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChiaXRzIC8gMTAwMDAwMDAwMCkudG9GaXhlZCgyKSArICcgR2JpdC9zJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYml0cyA+PSAxMDAwMDAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGJpdHMgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNYml0L3MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiaXRzID49IDEwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYml0cyAvIDEwMDApLnRvRml4ZWQoMikgKyAnIGtiaXQvcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGJpdHMudG9GaXhlZCgyKSArICcgYml0L3MnOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRUaW1lOiBmdW5jdGlvbiAoc2Vjb25kcykgewogICAgICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHNlY29uZHMgKiAxMDAwKSwKICAgICAgICAgICAgICAgIGRheXMgPSBwYXJzZUludChzZWNvbmRzIC8gODY0MDAsIDEwKTsKICAgICAgICAgICAgZGF5cyA9IGRheXMgPyBkYXlzICsgJ2QgJyA6ICcnOwogICAgICAgICAgICByZXR1cm4gZGF5cyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENIb3VycygpKS5zbGljZSgtMikgKyAnOicgKwogICAgICAgICAgICAgICAgKCcwJyArIGRhdGUuZ2V0VVRDTWludXRlcygpKS5zbGljZSgtMikgKyAnOicgKwogICAgICAgICAgICAgICAgKCcwJyArIGRhdGUuZ2V0VVRDU2Vjb25kcygpKS5zbGljZSgtMik7CiAgICAgICAgfSwKCiAgICAgICAgX2Zvcm1hdFBlcmNlbnRhZ2U6IGZ1bmN0aW9uIChmbG9hdFZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAoZmxvYXRWYWx1ZSAqIDEwMCkudG9GaXhlZCgyKSArICcgJSc7CiAgICAgICAgfSwKCiAgICAgICAgX3JlbmRlckV4dGVuZGVkUHJvZ3Jlc3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mb3JtYXRCaXRyYXRlKGRhdGEuYml0cmF0ZSkgKyAnIHwgJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRUaW1lKAogICAgICAgICAgICAgICAgICAgIChkYXRhLnRvdGFsIC0gZGF0YS5sb2FkZWQpICogOCAvIGRhdGEuYml0cmF0ZQogICAgICAgICAgICAgICAgKSArICcgfCAnICsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdFBlcmNlbnRhZ2UoCiAgICAgICAgICAgICAgICAgICAgZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsCiAgICAgICAgICAgICAgICApICsgJyB8ICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0RmlsZVNpemUoZGF0YS5sb2FkZWQpICsgJyAvICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0RmlsZVNpemUoZGF0YS50b3RhbCk7CiAgICAgICAgfSwKCiAgICAgICAgX2hhc0Vycm9yOiBmdW5jdGlvbiAoZmlsZSkgewogICAgICAgICAgICBpZiAoZmlsZS5lcnJvcikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuZXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIG51bWJlciBvZiBhZGRlZCBmaWxlcyBpcyBzdWJ0cmFjdGVkIGZyb20KICAgICAgICAgICAgLy8gbWF4TnVtYmVyT2ZGaWxlcyBiZWZvcmUgdmFsaWRhdGlvbiwgc28gd2UgY2hlY2sgaWYKICAgICAgICAgICAgLy8gbWF4TnVtYmVyT2ZGaWxlcyBpcyBiZWxvdyAwIChpbnN0ZWFkIG9mIGJlbG93IDEpOgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPCAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ01heGltdW0gbnVtYmVyIG9mIGZpbGVzIGV4Y2VlZGVkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGaWxlcyBhcmUgYWNjZXB0ZWQgaWYgZWl0aGVyIHRoZSBmaWxlIHR5cGUgb3IgdGhlIGZpbGUgbmFtZQogICAgICAgICAgICAvLyBtYXRjaGVzIGFnYWluc3QgdGhlIGFjY2VwdEZpbGVUeXBlcyByZWd1bGFyIGV4cHJlc3Npb24sIGFzCiAgICAgICAgICAgIC8vIG9ubHkgYnJvd3NlcnMgd2l0aCBzdXBwb3J0IGZvciB0aGUgRmlsZSBBUEkgcmVwb3J0IHRoZSB0eXBlOgogICAgICAgICAgICBpZiAoISh0aGlzLm9wdGlvbnMuYWNjZXB0RmlsZVR5cGVzLnRlc3QoZmlsZS50eXBlKSB8fAogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hY2NlcHRGaWxlVHlwZXMudGVzdChmaWxlLm5hbWUpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdGaWxldHlwZSBub3QgYWxsb3dlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYXhGaWxlU2l6ZSAmJgogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA+IHRoaXMub3B0aW9ucy5tYXhGaWxlU2l6ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdGaWxlIGlzIHRvbyBiaWcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsZS5zaXplID09PSAnbnVtYmVyJyAmJgogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA8IHRoaXMub3B0aW9ucy5taW5GaWxlU2l6ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdGaWxlIGlzIHRvbyBzbWFsbCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgX3ZhbGlkYXRlOiBmdW5jdGlvbiAoZmlsZXMpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgdmFsaWQgPSAhIWZpbGVzLmxlbmd0aDsKICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSB0aGF0Ll9oYXNFcnJvcihmaWxlKTsKICAgICAgICAgICAgICAgIGlmIChmaWxlLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uIChmdW5jLCBmaWxlcykgewogICAgICAgICAgICBpZiAoIWZ1bmMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMoewogICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgZm9ybWF0RmlsZVNpemU6IHRoaXMuX2Zvcm1hdEZpbGVTaXplLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGVzQ29udGFpbmVyKS5odG1sKHJlc3VsdCkuY2hpbGRyZW4oKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyUHJldmlldzogZnVuY3Rpb24gKGZpbGUsIG5vZGUpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKTsKICAgICAgICAgICAgcmV0dXJuICgobG9hZEltYWdlICYmIGxvYWRJbWFnZSgKICAgICAgICAgICAgICAgIGZpbGUsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaW1nKSB7CiAgICAgICAgICAgICAgICAgICAgbm9kZS5hcHBlbmQoaW1nKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyhub2RlKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKG5vZGUpLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkLmNvbnRhaW5zKHRoYXQuZG9jdW1lbnRbMF0uYm9keSwgbm9kZVswXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgbm90IHBhcnQgb2YgdGhlIERPTSwKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNpdGlvbiBldmVudHMgYXJlIG5vdCB0cmlnZ2VyZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gcmVzb2x2ZSBtYW51YWxseToKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IG9wdGlvbnMucHJldmlld01heFdpZHRoLAogICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogb3B0aW9ucy5wcmV2aWV3TWF4SGVpZ2h0LAogICAgICAgICAgICAgICAgICAgIGNhbnZhczogb3B0aW9ucy5wcmV2aWV3QXNDYW52YXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKSkgfHwgZGZkLnJlc29sdmVXaXRoKG5vZGUpKSAmJiBkZmQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlbmRlclByZXZpZXdzOiBmdW5jdGlvbiAoZmlsZXMsIG5vZGVzKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICAgIG5vZGVzLmZpbmQoJy5wcmV2aWV3IHNwYW4nKS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBmaWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wcmV2aWV3U291cmNlRmlsZVR5cGVzLnRlc3QoZmlsZS50eXBlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAoJC50eXBlKG9wdGlvbnMucHJldmlld1NvdXJjZU1heEZpbGVTaXplKSAhPT0gJ251bWJlcicgfHwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5zaXplIDwgb3B0aW9ucy5wcmV2aWV3U291cmNlTWF4RmlsZVNpemUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnBpcGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9yZW5kZXJQcmV2aWV3KGZpbGUsICQoZWxlbWVudCkpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKHRoYXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGZkLnByb21pc2UoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nUXVldWU7CiAgICAgICAgfSwKCiAgICAgICAgX3JlbmRlclVwbG9hZDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUZW1wbGF0ZSgKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy51cGxvYWRUZW1wbGF0ZSwKICAgICAgICAgICAgICAgIGZpbGVzCiAgICAgICAgICAgICk7CiAgICAgICAgfSwKCiAgICAgICAgX3JlbmRlckRvd25sb2FkOiBmdW5jdGlvbiAoZmlsZXMpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlclRlbXBsYXRlKAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRvd25sb2FkVGVtcGxhdGUsCiAgICAgICAgICAgICAgICBmaWxlcwogICAgICAgICAgICApLmZpbmQoJ2FbZG93bmxvYWRdJykuZWFjaCh0aGlzLl9lbmFibGVEcmFnVG9EZXNrdG9wKS5lbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfc3RhcnRIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciBidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCksCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IGJ1dHRvbi5jbG9zZXN0KCcudGVtcGxhdGUtdXBsb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpOwogICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnN1Ym1pdCAmJiAhZGF0YS5qcVhIUiAmJiBkYXRhLnN1Ym1pdCgpKSB7CiAgICAgICAgICAgICAgICBidXR0b24ucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9jYW5jZWxIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9ICQoZS5jdXJyZW50VGFyZ2V0KS5jbG9zZXN0KCcudGVtcGxhdGUtdXBsb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpIHx8IHt9OwogICAgICAgICAgICBpZiAoIWRhdGEuanFYSFIpIHsKICAgICAgICAgICAgICAgIGRhdGEuZXJyb3JUaHJvd24gPSAnYWJvcnQnOwogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZmFpbCcsIGUsIGRhdGEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0YS5qcVhIUi5hYm9ydCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2RlbGV0ZUhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyIGJ1dHRvbiA9ICQoZS5jdXJyZW50VGFyZ2V0KTsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZGVzdHJveScsIGUsICQuZXh0ZW5kKHsKICAgICAgICAgICAgICAgIGNvbnRleHQ6IGJ1dHRvbi5jbG9zZXN0KCcudGVtcGxhdGUtZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGU6ICdERUxFVEUnLAogICAgICAgICAgICAgICAgZGF0YVR5cGU6IHRoaXMub3B0aW9ucy5kYXRhVHlwZQogICAgICAgICAgICB9LCBidXR0b24uZGF0YSgpKSk7CiAgICAgICAgfSwKCiAgICAgICAgX2ZvcmNlUmVmbG93OiBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgbm9kZS5sZW5ndGggJiYKICAgICAgICAgICAgICAgIG5vZGVbMF0ub2Zmc2V0V2lkdGg7CiAgICAgICAgfSwKCiAgICAgICAgX3RyYW5zaXRpb246IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBub2RlLmhhc0NsYXNzKCdmYWRlJykpIHsKICAgICAgICAgICAgICAgIG5vZGUuYmluZCgKICAgICAgICAgICAgICAgICAgICAkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHJlc3BvbmQgdG8gb3RoZXIgdHJhbnNpdGlvbnMgZXZlbnRzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBjb250YWluZXIgZWxlbWVudCwgZS5nLiBmcm9tIGJ1dHRvbiBlbGVtZW50czoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0ID09PSBub2RlWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnVuYmluZCgkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKS50b2dnbGVDbGFzcygnaW4nKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5vZGUudG9nZ2xlQ2xhc3MoJ2luJyk7CiAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGRmZDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEJ1dHRvbkJhckV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGZpbGVVcGxvYWRCdXR0b25CYXIgPSB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGV1cGxvYWQtYnV0dG9uYmFyJyksCiAgICAgICAgICAgICAgICBmaWxlc0xpc3QgPSB0aGlzLm9wdGlvbnMuZmlsZXNDb250YWluZXI7CiAgICAgICAgICAgIHRoaXMuX29uKGZpbGVVcGxvYWRCdXR0b25CYXIuZmluZCgnLnN0YXJ0JyksIHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLnN0YXJ0IGJ1dHRvbicpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5jYW5jZWwnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuY2FuY2VsIGJ1dHRvbicpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5kZWxldGUnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuZGVsZXRlIGlucHV0OmNoZWNrZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAuc2libGluZ3MoJ2J1dHRvbicpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcudG9nZ2xlJykKICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy50b2dnbGUnKSwgewogICAgICAgICAgICAgICAgY2hhbmdlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuZGVsZXRlIGlucHV0JykucHJvcCgKICAgICAgICAgICAgICAgICAgICAgICAgJ2NoZWNrZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAkKGUuY3VycmVudFRhcmdldCkuaXMoJzpjaGVja2VkJykKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfZGVzdHJveUJ1dHRvbkJhckV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciBidXR0b24nKSwKICAgICAgICAgICAgICAgICdjbGljaycKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciAudG9nZ2xlJyksCiAgICAgICAgICAgICAgICAnY2hhbmdlLicKICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAnY2xpY2sgLnN0YXJ0IGJ1dHRvbic6IHRoaXMuX3N0YXJ0SGFuZGxlciwKICAgICAgICAgICAgICAgICdjbGljayAuY2FuY2VsIGJ1dHRvbic6IHRoaXMuX2NhbmNlbEhhbmRsZXIsCiAgICAgICAgICAgICAgICAnY2xpY2sgLmRlbGV0ZSBidXR0b24nOiB0aGlzLl9kZWxldGVIYW5kbGVyCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCAnY2xpY2snKTsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICB9LAoKICAgICAgICBfZW5hYmxlRmlsZUlucHV0QnV0dG9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGVpbnB1dC1idXR0b24gaW5wdXQnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFRlbXBsYXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZXNDb250YWluZXIgPSB0aGlzLmRvY3VtZW50WzBdLmNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyLnByb3AoJ25vZGVOYW1lJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHRtcGwpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZG93bmxvYWRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLmRvd25sb2FkVGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEZpbGVzQ29udGFpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc0NvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gdGhpcy5lbGVtZW50LmZpbmQoJy5maWxlcycpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlc0NvbnRhaW5lciBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gJChvcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9zdHJpbmdUb1JlZ0V4cDogZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJy8nKSwKICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBwYXJ0cy5zaGlmdCgpOwogICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXJ0cy5qb2luKCcvJyksIG1vZGlmaWVycyk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRSZWdFeHBPcHRpb25zOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMuYWNjZXB0RmlsZVR5cGVzKSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuYWNjZXB0RmlsZVR5cGVzID0gdGhpcy5fc3RyaW5nVG9SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5hY2NlcHRGaWxlVHlwZXMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQudHlwZShvcHRpb25zLnByZXZpZXdTb3VyY2VGaWxlVHlwZXMpID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgb3B0aW9ucy5wcmV2aWV3U291cmNlRmlsZVR5cGVzID0gdGhpcy5fc3RyaW5nVG9SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wcmV2aWV3U291cmNlRmlsZVR5cGVzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRTcGVjaWFsT3B0aW9uczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgICAgICB0aGlzLl9pbml0RmlsZXNDb250YWluZXIoKTsKICAgICAgICAgICAgdGhpcy5faW5pdFRlbXBsYXRlcygpOwogICAgICAgICAgICB0aGlzLl9pbml0UmVnRXhwT3B0aW9ucygpOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fcmVmcmVzaE9wdGlvbnNMaXN0LnB1c2goCiAgICAgICAgICAgICAgICAnZmlsZXNDb250YWluZXInLAogICAgICAgICAgICAgICAgJ3VwbG9hZFRlbXBsYXRlSWQnLAogICAgICAgICAgICAgICAgJ2Rvd25sb2FkVGVtcGxhdGVJZCcKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCF0aGlzLl9wcm9jZXNzaW5nUXVldWUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZSA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGlzKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcmVzZXRGaW5pc2hlZERlZmVycmVkcygpOwogICAgICAgIH0sCgogICAgICAgIGVuYWJsZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgd2FzRGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkgewogICAgICAgICAgICAgICAgd2FzRGlzYWJsZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIGlmICh3YXNEaXNhYmxlZCkgewogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJ2lucHV0LCBidXR0b24nKS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2VuYWJsZUZpbGVJbnB1dEJ1dHRvbigpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5kaXNhYmxlZCkgewogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJ2lucHV0LCBidXR0b24nKS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICAgICAgdGhpcy5fZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/jquery.fileupload.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbiA1LjE5LjcKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi8qanNsaW50IG5vbWVuOiB0cnVlLCB1bnBhcmFtOiB0cnVlLCByZWdleHA6IHRydWUgKi8KLypnbG9iYWwgZGVmaW5lLCB3aW5kb3csIGRvY3VtZW50LCBGaWxlLCBCbG9iLCBGb3JtRGF0YSwgbG9jYXRpb24gKi8KCihmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAnanF1ZXJ5LnVpLndpZGdldCcKICAgICAgICBdLCBmYWN0b3J5KTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBUaGUgRmlsZVJlYWRlciBBUEkgaXMgbm90IGFjdHVhbGx5IHVzZWQsIGJ1dCB3b3JrcyBhcyBmZWF0dXJlIGRldGVjdGlvbiwKICAgIC8vIGFzIGUuZy4gU2FmYXJpIHN1cHBvcnRzIFhIUiBmaWxlIHVwbG9hZHMgdmlhIHRoZSBGb3JtRGF0YSBBUEksCiAgICAvLyBidXQgbm90IG5vbi1tdWx0aXBhcnQgWEhSIGZpbGUgdXBsb2FkczoKICAgICQuc3VwcG9ydC54aHJGaWxlVXBsb2FkID0gISEod2luZG93LlhNTEh0dHBSZXF1ZXN0VXBsb2FkICYmIHdpbmRvdy5GaWxlUmVhZGVyKTsKICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQgPSAhIXdpbmRvdy5Gb3JtRGF0YTsKCiAgICAvLyBUaGUgZmlsZXVwbG9hZCB3aWRnZXQgbGlzdGVucyBmb3IgY2hhbmdlIGV2ZW50cyBvbiBmaWxlIGlucHV0IGZpZWxkcyBkZWZpbmVkCiAgICAvLyB2aWEgZmlsZUlucHV0IHNldHRpbmcgYW5kIHBhc3RlIG9yIGRyb3AgZXZlbnRzIG9mIHRoZSBnaXZlbiBkcm9wWm9uZS4KICAgIC8vIEluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0IGpRdWVyeSBXaWRnZXQgbWV0aG9kcywgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0CiAgICAvLyBleHBvc2VzIHRoZSAiYWRkIiBhbmQgInNlbmQiIG1ldGhvZHMsIHRvIGFkZCBvciBkaXJlY3RseSBzZW5kIGZpbGVzIHVzaW5nCiAgICAvLyB0aGUgZmlsZXVwbG9hZCBBUEkuCiAgICAvLyBCeSBkZWZhdWx0LCBmaWxlcyBhZGRlZCB2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIHBhc3RlLCBkcmFnICYgZHJvcCBvcgogICAgLy8gImFkZCIgbWV0aG9kIGFyZSB1cGxvYWRlZCBpbW1lZGlhdGVseSwgYnV0IGl0IGlzIHBvc3NpYmxlIHRvIG92ZXJyaWRlCiAgICAvLyB0aGUgImFkZCIgY2FsbGJhY2sgb3B0aW9uIHRvIHF1ZXVlIGZpbGUgdXBsb2Fkcy4KICAgICQud2lkZ2V0KCdibHVlaW1wLmZpbGV1cGxvYWQnLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gVGhlIGRyb3AgdGFyZ2V0IGVsZW1lbnQocyksIGJ5IHRoZSBkZWZhdWx0IHRoZSBjb21wbGV0ZSBkb2N1bWVudC4KICAgICAgICAgICAgLy8gU2V0IHRvIG51bGwgdG8gZGlzYWJsZSBkcmFnICYgZHJvcCBzdXBwb3J0OgogICAgICAgICAgICBkcm9wWm9uZTogJChkb2N1bWVudCksCiAgICAgICAgICAgIC8vIFRoZSBwYXN0ZSB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHBhc3RlIHN1cHBvcnQ6CiAgICAgICAgICAgIHBhc3RlWm9uZTogJChkb2N1bWVudCksCiAgICAgICAgICAgIC8vIFRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLCB0aGF0IGFyZSBsaXN0ZW5lZCB0byBmb3IgY2hhbmdlIGV2ZW50cy4KICAgICAgICAgICAgLy8gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8gdGhlIGZpbGUgaW5wdXQgZmllbGRzIGluc2lkZQogICAgICAgICAgICAvLyBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQgb24gcGx1Z2luIGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBjaGFuZ2UgbGlzdGVuZXIuCiAgICAgICAgICAgIGZpbGVJbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpbnB1dCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIGEgY2xvbmUgYWZ0ZXIKICAgICAgICAgICAgLy8gZWFjaCBpbnB1dCBmaWVsZCBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGlmcmFtZSB0cmFuc3BvcnQKICAgICAgICAgICAgLy8gcXVldWVzIGFuZCBhbGxvd3MgY2hhbmdlIGV2ZW50cyB0byBiZSBmaXJlZCBmb3IgdGhlIHNhbWUgZmlsZQogICAgICAgICAgICAvLyBzZWxlY3Rpb24sIGJ1dCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZToKICAgICAgICAgICAgcmVwbGFjZUZpbGVJbnB1dDogdHJ1ZSwKICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEgKHRoZSByZXF1ZXN0IGFyZ3VtZW50IG5hbWUpLgogICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQgb3IgZW1wdHksIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzCiAgICAgICAgICAgIC8vIHVzZWQsIG9yICJmaWxlc1tdIiBpZiB0aGUgZmlsZSBpbnB1dCBuYW1lIHByb3BlcnR5IGlzIGFsc28gZW1wdHksCiAgICAgICAgICAgIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzOgogICAgICAgICAgICBwYXJhbU5hbWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBmaWxlIG9mIGEgc2VsZWN0aW9uIGlzIHVwbG9hZGVkIHVzaW5nIGFuIGluZGl2aWR1YWwKICAgICAgICAgICAgLy8gcmVxdWVzdCBmb3IgWEhSIHR5cGUgdXBsb2Fkcy4gU2V0IHRvIGZhbHNlIHRvIHVwbG9hZCBmaWxlCiAgICAgICAgICAgIC8vIHNlbGVjdGlvbnMgaW4gb25lIHJlcXVlc3QgZWFjaDoKICAgICAgICAgICAgc2luZ2xlRmlsZVVwbG9hZHM6IHRydWUsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUgWEhSIHJlcXVlc3QsCiAgICAgICAgICAgIC8vIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRydWUgdG8gaXNzdWUgYWxsIGZpbGUgdXBsb2FkIHJlcXVlc3RzCiAgICAgICAgICAgIC8vIGluIGEgc2VxdWVudGlhbCBvcmRlcjoKICAgICAgICAgICAgc2VxdWVudGlhbFVwbG9hZHM6IGZhbHNlLAogICAgICAgICAgICAvLyBUbyBsaW1pdCB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgdXBsb2FkcywKICAgICAgICAgICAgLy8gc2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIDA6CiAgICAgICAgICAgIGxpbWl0Q29uY3VycmVudFVwbG9hZHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRydWUgdG8gZm9yY2UgaWZyYW1lIHRyYW5zcG9ydCB1cGxvYWRzOgogICAgICAgICAgICBmb3JjZUlmcmFtZVRyYW5zcG9ydDogZmFsc2UsCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0aGUgbG9jYXRpb24gb2YgYSByZWRpcmVjdCB1cmwgb24gdGhlCiAgICAgICAgICAgIC8vIG9yaWdpbiBzZXJ2ZXIsIGZvciBjcm9zcy1kb21haW4gaWZyYW1lIHRyYW5zcG9ydCB1cGxvYWRzOgogICAgICAgICAgICByZWRpcmVjdDogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBUaGUgcGFyYW1ldGVyIG5hbWUgZm9yIHRoZSByZWRpcmVjdCB1cmwsIHNlbnQgYXMgcGFydCBvZiB0aGUgZm9ybQogICAgICAgICAgICAvLyBkYXRhIGFuZCBzZXQgdG8gJ3JlZGlyZWN0JyBpZiB0aGlzIG9wdGlvbiBpcyBlbXB0eToKICAgICAgICAgICAgcmVkaXJlY3RQYXJhbU5hbWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHBvc3RNZXNzYWdlIHdpbmRvdywKICAgICAgICAgICAgLy8gdG8gZW5hYmxlIHBvc3RNZXNzYWdlIHRyYW5zcG9ydCB1cGxvYWRzOgogICAgICAgICAgICBwb3N0TWVzc2FnZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBYSFIgZmlsZSB1cGxvYWRzIGFyZSBzZW50IGFzIG11bHRpcGFydC9mb3JtLWRhdGEuCiAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGlzIGFsd2F5cyB1c2luZyBtdWx0aXBhcnQvZm9ybS1kYXRhLgogICAgICAgICAgICAvLyBTZXQgdG8gZmFsc2UgdG8gZW5hYmxlIG5vbi1tdWx0aXBhcnQgWEhSIHVwbG9hZHM6CiAgICAgICAgICAgIG11bHRpcGFydDogdHJ1ZSwKICAgICAgICAgICAgLy8gVG8gdXBsb2FkIGxhcmdlIGZpbGVzIGluIHNtYWxsZXIgY2h1bmtzLCBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24KICAgICAgICAgICAgLy8gdG8gYSBwcmVmZXJyZWQgbWF4aW11bSBjaHVuayBzaXplLiBJZiBzZXQgdG8gMCwgbnVsbCBvciB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIG9yIHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVpcmVkIEJsb2IgQVBJLCBmaWxlcyB3aWxsCiAgICAgICAgICAgIC8vIGJlIHVwbG9hZGVkIGFzIGEgd2hvbGUuCiAgICAgICAgICAgIG1heENodW5rU2l6ZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBXaGVuIGEgbm9uLW11bHRpcGFydCB1cGxvYWQgb3IgYSBjaHVua2VkIG11bHRpcGFydCB1cGxvYWQgaGFzIGJlZW4KICAgICAgICAgICAgLy8gYWJvcnRlZCwgdGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIHRoZSB1cGxvYWQgYnkgc2V0dGluZwogICAgICAgICAgICAvLyBpdCB0byB0aGUgc2l6ZSBvZiB0aGUgYWxyZWFkeSB1cGxvYWRlZCBieXRlcy4gVGhpcyBvcHRpb24gaXMgbW9zdAogICAgICAgICAgICAvLyB1c2VmdWwgd2hlbiBtb2RpZnlpbmcgdGhlIG9wdGlvbnMgb2JqZWN0IGluc2lkZSBvZiB0aGUgImFkZCIgb3IKICAgICAgICAgICAgLy8gInNlbmQiIGNhbGxiYWNrcywgYXMgdGhlIG9wdGlvbnMgYXJlIGNsb25lZCBmb3IgZWFjaCBmaWxlIHVwbG9hZC4KICAgICAgICAgICAgdXBsb2FkZWRCeXRlczogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSBmaWxlIHVwbG9hZHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUKICAgICAgICAgICAgLy8gZ2xvYmFsIHByb2dyZXNzIGNhbGN1bGF0aW9uLiBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gZmFsc2UgdG8KICAgICAgICAgICAgLy8gcHJldmVudCByZWNhbGN1bGF0aW5nIHRoZSBnbG9iYWwgcHJvZ3Jlc3MgZGF0YToKICAgICAgICAgICAgcmVjYWxjdWxhdGVQcm9ncmVzczogdHJ1ZSwKICAgICAgICAgICAgLy8gSW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIHRvIGNhbGN1bGF0ZSBhbmQgdHJpZ2dlciBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIHByb2dyZXNzSW50ZXJ2YWw6IDEwMCwKICAgICAgICAgICAgLy8gSW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIHRvIGNhbGN1bGF0ZSBwcm9ncmVzcyBiaXRyYXRlOgogICAgICAgICAgICBiaXRyYXRlSW50ZXJ2YWw6IDUwMCwKCiAgICAgICAgICAgIC8vIEFkZGl0aW9uYWwgZm9ybSBkYXRhIHRvIGJlIHNlbnQgYWxvbmcgd2l0aCB0aGUgZmlsZSB1cGxvYWRzIGNhbiBiZSBzZXQKICAgICAgICAgICAgLy8gdXNpbmcgdGhpcyBvcHRpb24sIHdoaWNoIGFjY2VwdHMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kCiAgICAgICAgICAgIC8vIHZhbHVlIHByb3BlcnRpZXMsIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHN1Y2ggYW4gYXJyYXksIGEgRm9ybURhdGEKICAgICAgICAgICAgLy8gb2JqZWN0IChmb3IgWEhSIGZpbGUgdXBsb2FkcyksIG9yIGEgc2ltcGxlIG9iamVjdC4KICAgICAgICAgICAgLy8gVGhlIGZvcm0gb2YgdGhlIGZpcnN0IGZpbGVJbnB1dCBpcyBnaXZlbiBhcyBwYXJhbWV0ZXIgdG8gdGhlIGZ1bmN0aW9uOgogICAgICAgICAgICBmb3JtRGF0YTogZnVuY3Rpb24gKGZvcm0pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmb3JtLnNlcmlhbGl6ZUFycmF5KCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWQKICAgICAgICAgICAgLy8gd2lkZ2V0ICh2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIGRyYWcgJiBkcm9wLCBwYXN0ZSBvciBhZGQgQVBJIGNhbGwpLgogICAgICAgICAgICAvLyBJZiB0aGUgc2luZ2xlRmlsZVVwbG9hZHMgb3B0aW9uIGlzIGVuYWJsZWQsIHRoaXMgY2FsbGJhY2sgd2lsbCBiZQogICAgICAgICAgICAvLyBjYWxsZWQgb25jZSBmb3IgZWFjaCBmaWxlIGluIHRoZSBzZWxlY3Rpb24gZm9yIFhIUiBmaWxlIHVwbGFvZHMsIGVsc2UKICAgICAgICAgICAgLy8gb25jZSBmb3IgZWFjaCBmaWxlIHNlbGVjdGlvbi4KICAgICAgICAgICAgLy8gVGhlIHVwbG9hZCBzdGFydHMgd2hlbiB0aGUgc3VibWl0IG1ldGhvZCBpcyBpbnZva2VkIG9uIHRoZSBkYXRhIHBhcmFtZXRlci4KICAgICAgICAgICAgLy8gVGhlIGRhdGEgb2JqZWN0IGNvbnRhaW5zIGEgZmlsZXMgcHJvcGVydHkgaG9sZGluZyB0aGUgYWRkZWQgZmlsZXMKICAgICAgICAgICAgLy8gYW5kIGFsbG93cyB0byBvdmVycmlkZSBwbHVnaW4gb3B0aW9ucyBhcyB3ZWxsIGFzIGRlZmluZSBhamF4IHNldHRpbmdzLgogICAgICAgICAgICAvLyBMaXN0ZW5lcnMgZm9yIHRoaXMgY2FsbGJhY2sgY2FuIGFsc28gYmUgYm91bmQgdGhlIGZvbGxvd2luZyB3YXk6CiAgICAgICAgICAgIC8vIC5iaW5kKCdmaWxldXBsb2FkYWRkJywgZnVuYyk7CiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGFuZCBhbGxvd3MgdG8gYXR0YWNoIGFkZGl0aW9uYWwKICAgICAgICAgICAgLy8gaGFuZGxlcnMgdXNpbmcgalF1ZXJ5J3MgRGVmZXJyZWQgY2FsbGJhY2tzOgogICAgICAgICAgICAvLyBkYXRhLnN1Ym1pdCgpLmRvbmUoZnVuYykuZmFpbChmdW5jKS5hbHdheXMoZnVuYyk7CiAgICAgICAgICAgIGFkZDogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIGRhdGEuc3VibWl0KCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBPdGhlciBjYWxsYmFja3M6CiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3VibWl0IGV2ZW50IG9mIGVhY2ggZmlsZSB1cGxvYWQ6CiAgICAgICAgICAgIC8vIHN1Ym1pdDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN1Ym1pdCcsIGZ1bmMpOwogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdGhlIHN0YXJ0IG9mIGVhY2ggZmlsZSB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgLy8gc2VuZDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHNlbmQnLCBmdW5jKTsKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHN1Y2Nlc3NmdWwgdXBsb2FkczoKICAgICAgICAgICAgLy8gZG9uZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGRvbmUnLCBmdW5jKTsKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRmYWlsJywgZnVuYyk7CiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSByZXF1ZXN0czoKICAgICAgICAgICAgLy8gYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkYWx3YXlzJywgZnVuYyk7CiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWQgcHJvZ3Jlc3MgZXZlbnRzOgogICAgICAgICAgICAvLyBwcm9ncmVzczogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHByb2dyZXNzJywgZnVuYyk7CiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgLy8gcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzc2FsbCcsIGZ1bmMpOwogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgLy8gc3RhcnQ6IGZ1bmN0aW9uIChlKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzdGFydCcsIGZ1bmMpOwogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdG9wLCBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0b3AgZXZlbnQ6CiAgICAgICAgICAgIC8vIHN0b3A6IGZ1bmN0aW9uIChlKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzdG9wJywgZnVuYyk7CiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjaGFuZ2UgZXZlbnRzIG9mIHRoZSBmaWxlSW5wdXQocyk6CiAgICAgICAgICAgIC8vIGNoYW5nZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNoYW5nZScsIGZ1bmMpOwogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgcGFzdGUgZXZlbnRzIHRvIHRoZSBwYXN0ZVpvbmUocyk6CiAgICAgICAgICAgIC8vIHBhc3RlOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcGFzdGUnLCBmdW5jKTsKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyb3AgZXZlbnRzIG9mIHRoZSBkcm9wWm9uZShzKToKICAgICAgICAgICAgLy8gZHJvcDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGRyb3AnLCBmdW5jKTsKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyYWdvdmVyIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6CiAgICAgICAgICAgIC8vIGRyYWdvdmVyOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJhZ292ZXInLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLgogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBqUXVlcnkgYWpheCBzZXR0aW5ncyByZXF1aXJlZCBmb3IgdGhlIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLAogICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZQogICAgICAgIH0sCgogICAgICAgIC8vIEEgbGlzdCBvZiBvcHRpb25zIHRoYXQgcmVxdWlyZSBhIHJlZnJlc2ggYWZ0ZXIgYXNzaWduaW5nIGEgbmV3IHZhbHVlOgogICAgICAgIF9yZWZyZXNoT3B0aW9uc0xpc3Q6IFsKICAgICAgICAgICAgJ2ZpbGVJbnB1dCcsCiAgICAgICAgICAgICdkcm9wWm9uZScsCiAgICAgICAgICAgICdwYXN0ZVpvbmUnLAogICAgICAgICAgICAnbXVsdGlwYXJ0JywKICAgICAgICAgICAgJ2ZvcmNlSWZyYW1lVHJhbnNwb3J0JwogICAgICAgIF0sCgogICAgICAgIF9CaXRyYXRlVGltZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSArKG5ldyBEYXRlKCkpOwogICAgICAgICAgICB0aGlzLmxvYWRlZCA9IDA7CiAgICAgICAgICAgIHRoaXMuYml0cmF0ZSA9IDA7CiAgICAgICAgICAgIHRoaXMuZ2V0Qml0cmF0ZSA9IGZ1bmN0aW9uIChub3csIGxvYWRlZCwgaW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgIHZhciB0aW1lRGlmZiA9IG5vdyAtIHRoaXMudGltZXN0YW1wOwogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmJpdHJhdGUgfHwgIWludGVydmFsIHx8IHRpbWVEaWZmID4gaW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJpdHJhdGUgPSAobG9hZGVkIC0gdGhpcy5sb2FkZWQpICogKDEwMDAgLyB0aW1lRGlmZikgKiA4OwogICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkID0gbG9hZGVkOwogICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gbm93OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYml0cmF0ZTsKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICBfaXNYSFJVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHJldHVybiAhb3B0aW9ucy5mb3JjZUlmcmFtZVRyYW5zcG9ydCAmJgogICAgICAgICAgICAgICAgKCghb3B0aW9ucy5tdWx0aXBhcnQgJiYgJC5zdXBwb3J0LnhockZpbGVVcGxvYWQpIHx8CiAgICAgICAgICAgICAgICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0Rm9ybURhdGE6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBmb3JtRGF0YTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmZvcm1EYXRhID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mb3JtRGF0YShvcHRpb25zLmZvcm0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLmlzQXJyYXkob3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIF9nZXRUb3RhbDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7CiAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICB0b3RhbCArPSBmaWxlLnNpemUgfHwgMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0b3RhbDsKICAgICAgICB9LAoKICAgICAgICBfb25Qcm9ncmVzczogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgaWYgKGUubGVuZ3RoQ29tcHV0YWJsZSkgewogICAgICAgICAgICAgICAgdmFyIG5vdyA9ICsobmV3IERhdGUoKSksCiAgICAgICAgICAgICAgICAgICAgdG90YWwsCiAgICAgICAgICAgICAgICAgICAgbG9hZGVkOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuX3RpbWUgJiYgZGF0YS5wcm9ncmVzc0ludGVydmFsICYmCiAgICAgICAgICAgICAgICAgICAgICAgIChub3cgLSBkYXRhLl90aW1lIDwgZGF0YS5wcm9ncmVzc0ludGVydmFsKSAmJgogICAgICAgICAgICAgICAgICAgICAgICBlLmxvYWRlZCAhPT0gZS50b3RhbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuX3RpbWUgPSBub3c7CiAgICAgICAgICAgICAgICB0b3RhbCA9IGRhdGEudG90YWwgfHwgdGhpcy5fZ2V0VG90YWwoZGF0YS5maWxlcyk7CiAgICAgICAgICAgICAgICBsb2FkZWQgPSBwYXJzZUludCgKICAgICAgICAgICAgICAgICAgICBlLmxvYWRlZCAvIGUudG90YWwgKiAoZGF0YS5jaHVua1NpemUgfHwgdG90YWwpLAogICAgICAgICAgICAgICAgICAgIDEwCiAgICAgICAgICAgICAgICApICsgKGRhdGEudXBsb2FkZWRCeXRlcyB8fCAwKTsKICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRlZCArPSBsb2FkZWQgLSAoZGF0YS5sb2FkZWQgfHwgZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDApOwogICAgICAgICAgICAgICAgZGF0YS5sZW5ndGhDb21wdXRhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGRhdGEubG9hZGVkID0gbG9hZGVkOwogICAgICAgICAgICAgICAgZGF0YS50b3RhbCA9IHRvdGFsOwogICAgICAgICAgICAgICAgZGF0YS5iaXRyYXRlID0gZGF0YS5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgbm93LAogICAgICAgICAgICAgICAgICAgIGxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgYSBjdXN0b20gcHJvZ3Jlc3MgZXZlbnQgd2l0aCBhIHRvdGFsIGRhdGEgcHJvcGVydHkgc2V0CiAgICAgICAgICAgICAgICAvLyB0byB0aGUgZmlsZSBzaXplKHMpIG9mIHRoZSBjdXJyZW50IHVwbG9hZCBhbmQgYSBsb2FkZWQgZGF0YQogICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgY2FsY3VsYXRlZCBhY2NvcmRpbmdseToKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ3Byb2dyZXNzJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgZ2xvYmFsIHByb2dyZXNzIGV2ZW50IGZvciBhbGwgY3VycmVudCBmaWxlIHVwbG9hZHMsCiAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgYWpheCBjYWxscyBxdWV1ZWQgZm9yIHNlcXVlbnRpYWwgZmlsZSB1cGxvYWRzOgogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcigncHJvZ3Jlc3NhbGwnLCBlLCB7CiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZCwKICAgICAgICAgICAgICAgICAgICB0b3RhbDogdGhpcy5fdG90YWwsCiAgICAgICAgICAgICAgICAgICAgYml0cmF0ZTogdGhpcy5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIG5vdywKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9hZGVkLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRQcm9ncmVzc0xpc3RlbmVyOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICB4aHIgPSBvcHRpb25zLnhociA/IG9wdGlvbnMueGhyKCkgOiAkLmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgLy8gQWNjZXNzcyB0byB0aGUgbmF0aXZlIFhIUiBvYmplY3QgaXMgcmVxdWlyZWQgdG8gYWRkIGV2ZW50IGxpc3RlbmVycwogICAgICAgICAgICAvLyBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBldmVudDoKICAgICAgICAgICAgaWYgKHhoci51cGxvYWQpIHsKICAgICAgICAgICAgICAgICQoeGhyLnVwbG9hZCkuYmluZCgncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBvZSA9IGUub3JpZ2luYWxFdmVudDsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGV2ZW50IHByb3BlcnRpZXMgZ2V0IGNvcGllZCBvdmVyOgogICAgICAgICAgICAgICAgICAgIGUubGVuZ3RoQ29tcHV0YWJsZSA9IG9lLmxlbmd0aENvbXB1dGFibGU7CiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgPSBvZS5sb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgZS50b3RhbCA9IG9lLnRvdGFsOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG9wdGlvbnMueGhyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRYSFJEYXRhOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgZm9ybURhdGEsCiAgICAgICAgICAgICAgICBmaWxlID0gb3B0aW9ucy5maWxlc1swXSwKICAgICAgICAgICAgICAgIC8vIElnbm9yZSBub24tbXVsdGlwYXJ0IHNldHRpbmcgaWYgbm90IHN1cHBvcnRlZDoKICAgICAgICAgICAgICAgIG11bHRpcGFydCA9IG9wdGlvbnMubXVsdGlwYXJ0IHx8ICEkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IG9wdGlvbnMucGFyYW1OYW1lWzBdOwogICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwge307CiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRSYW5nZSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVJhbmdlJ10gPSBvcHRpb25zLmNvbnRlbnRSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW11bHRpcGFydCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LURpc3Bvc2l0aW9uJ10gPSAnYXR0YWNobWVudDsgZmlsZW5hbWU9IicgKwogICAgICAgICAgICAgICAgICAgIGVuY29kZVVSSShmaWxlLm5hbWUpICsgJyInOwogICAgICAgICAgICAgICAgb3B0aW9ucy5jb250ZW50VHlwZSA9IGZpbGUudHlwZTsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YSA9IG9wdGlvbnMuYmxvYiB8fCBmaWxlOwogICAgICAgICAgICB9IGVsc2UgaWYgKCQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBvc3RNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2luZG93LnBvc3RNZXNzYWdlIGRvZXMgbm90IGFsbG93IHNlbmRpbmcgRm9ybURhdGEKICAgICAgICAgICAgICAgICAgICAvLyBvYmplY3RzLCBzbyB3ZSBqdXN0IGFkZCB0aGUgRmlsZS9CbG9iIG9iamVjdHMgdG8KICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZm9ybURhdGEgYXJyYXkgYW5kIGxldCB0aGUgcG9zdE1lc3NhZ2Ugd2luZG93CiAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBGb3JtRGF0YSBvYmplY3Qgb3V0IG9mIHRoaXMgYXJyYXk6CiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSB0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ibG9iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMuYmxvYgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5maWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zLnBhcmFtTmFtZVtpbmRleF0gfHwgcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb3JtRGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gb3B0aW9ucy5mb3JtRGF0YTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyksIGZ1bmN0aW9uIChpbmRleCwgZmllbGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChmaWVsZC5uYW1lLCBmaWVsZC52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ibG9iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1EaXNwb3NpdGlvbiddID0gJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPSInICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZVVSSShmaWxlLm5hbWUpICsgJyInOwogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQocGFyYW1OYW1lLCBvcHRpb25zLmJsb2IsIGZpbGUubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZXMgYXJlIGFsc28gQmxvYiBpbnN0YW5jZXMsIGJ1dCBzb21lIGJyb3dzZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoRmlyZWZveCAzLjYpIHN1cHBvcnQgdGhlIEZpbGUgQVBJIGJ1dCBub3QgQmxvYnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNoZWNrIGFsbG93cyB0aGUgdGVzdHMgdG8gcnVuIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1bW15IG9iamVjdHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdpbmRvdy5CbG9iICYmIGZpbGUgaW5zdGFuY2VvZiBCbG9iKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2luZG93LkZpbGUgJiYgZmlsZSBpbnN0YW5jZW9mIEZpbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZVtpbmRleF0gfHwgcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLm5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBmb3JtRGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBCbG9iIHJlZmVyZW5jZSBpcyBub3QgbmVlZGVkIGFueW1vcmUsIGZyZWUgbWVtb3J5OgogICAgICAgICAgICBvcHRpb25zLmJsb2IgPSBudWxsOwogICAgICAgIH0sCgogICAgICAgIF9pbml0SWZyYW1lU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIGlmcmFtZSBlbmFibGVzIHRoZSBpZnJhbWUgdHJhbnNwb3J0OgogICAgICAgICAgICBvcHRpb25zLmRhdGFUeXBlID0gJ2lmcmFtZSAnICsgKG9wdGlvbnMuZGF0YVR5cGUgfHwgJycpOwogICAgICAgICAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCBhY2NlcHRzIGEgc2VyaWFsaXplZCBhcnJheSBhcyBmb3JtIGRhdGE6CiAgICAgICAgICAgIG9wdGlvbnMuZm9ybURhdGEgPSB0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgLy8gQWRkIHJlZGlyZWN0IHVybCB0byBmb3JtIGRhdGEgb24gY3Jvc3MtZG9tYWluIHVwbG9hZHM6CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlZGlyZWN0ICYmICQoJzxhPjwvYT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy51cmwpCiAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2hvc3QnKSAhPT0gbG9jYXRpb24uaG9zdCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zLnJlZGlyZWN0UGFyYW1OYW1lIHx8ICdyZWRpcmVjdCcsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMucmVkaXJlY3QKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXREYXRhU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9jaHVua2VkVXBsb2FkKG9wdGlvbnMsIHRydWUpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFhIUkRhdGEob3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2luaXRQcm9ncmVzc0xpc3RlbmVyKG9wdGlvbnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucG9zdE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAvLyBTZXR0aW5nIHRoZSBkYXRhVHlwZSB0byBwb3N0bWVzc2FnZSBlbmFibGVzIHRoZQogICAgICAgICAgICAgICAgICAgIC8vIHBvc3RNZXNzYWdlIHRyYW5zcG9ydDoKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGFUeXBlID0gJ3Bvc3RtZXNzYWdlICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9pbml0SWZyYW1lU2V0dGluZ3Mob3B0aW9ucywgJ2lmcmFtZScpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldFBhcmFtTmFtZTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGZpbGVJbnB1dCA9ICQob3B0aW9ucy5maWxlSW5wdXQpLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gb3B0aW9ucy5wYXJhbU5hbWU7CiAgICAgICAgICAgIGlmICghcGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSBbXTsKICAgICAgICAgICAgICAgIGZpbGVJbnB1dC5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gaW5wdXQucHJvcCgnbmFtZScpIHx8ICdmaWxlc1tdJywKICAgICAgICAgICAgICAgICAgICAgICAgaSA9IChpbnB1dC5wcm9wKCdmaWxlcycpIHx8IFsxXSkubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZS5wdXNoKG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpIC09IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSBbZmlsZUlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXSddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCEkLmlzQXJyYXkocGFyYW1OYW1lKSkgewogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW3BhcmFtTmFtZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHBhcmFtTmFtZTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEZvcm1TZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgLy8gUmV0cmlldmUgbWlzc2luZyBvcHRpb25zIGZyb20gdGhlIGlucHV0IGZpZWxkIGFuZCB0aGUKICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCBmb3JtLCBpZiBhdmFpbGFibGU6CiAgICAgICAgICAgIGlmICghb3B0aW9ucy5mb3JtIHx8ICFvcHRpb25zLmZvcm0ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0gPSAkKG9wdGlvbnMuZmlsZUlucHV0LnByb3AoJ2Zvcm0nKSk7CiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZ2l2ZW4gZmlsZSBpbnB1dCBkb2Vzbid0IGhhdmUgYW4gYXNzb2NpYXRlZCBmb3JtLAogICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBkZWZhdWx0IHdpZGdldCBmaWxlIGlucHV0J3MgZm9ybToKICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5mb3JtLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybSA9ICQodGhpcy5vcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lID0gdGhpcy5fZ2V0UGFyYW1OYW1lKG9wdGlvbnMpOwogICAgICAgICAgICBpZiAoIW9wdGlvbnMudXJsKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMuZm9ybS5wcm9wKCdhY3Rpb24nKSB8fCBsb2NhdGlvbi5ocmVmOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRoZSBIVFRQIHJlcXVlc3QgbWV0aG9kIG11c3QgYmUgIlBPU1QiIG9yICJQVVQiOgogICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAob3B0aW9ucy50eXBlIHx8IG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSB8fCAnJykKICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICBpZiAob3B0aW9ucy50eXBlICE9PSAnUE9TVCcgJiYgb3B0aW9ucy50eXBlICE9PSAnUFVUJykgewogICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghb3B0aW9ucy5mb3JtQWNjZXB0Q2hhcnNldCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtQWNjZXB0Q2hhcnNldCA9IG9wdGlvbnMuZm9ybS5hdHRyKCdhY2NlcHQtY2hhcnNldCcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldEFKQVhTZXR0aW5nczogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLCBkYXRhKTsKICAgICAgICAgICAgdGhpcy5faW5pdEZvcm1TZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgdGhpcy5faW5pdERhdGFTZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgICAgfSwKCiAgICAgICAgLy8gTWFwcyBqcVhIUiBjYWxsYmFja3MgdG8gdGhlIGVxdWl2YWxlbnQKICAgICAgICAvLyBtZXRob2RzIG9mIHRoZSBnaXZlbiBQcm9taXNlIG9iamVjdDoKICAgICAgICBfZW5oYW5jZVByb21pc2U6IGZ1bmN0aW9uIChwcm9taXNlKSB7CiAgICAgICAgICAgIHByb21pc2Uuc3VjY2VzcyA9IHByb21pc2UuZG9uZTsKICAgICAgICAgICAgcHJvbWlzZS5lcnJvciA9IHByb21pc2UuZmFpbDsKICAgICAgICAgICAgcHJvbWlzZS5jb21wbGV0ZSA9IHByb21pc2UuYWx3YXlzOwogICAgICAgICAgICByZXR1cm4gcHJvbWlzZTsKICAgICAgICB9LAoKICAgICAgICAvLyBDcmVhdGVzIGFuZCByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgZW5oYW5jZWQgd2l0aAogICAgICAgIC8vIHRoZSBqcVhIUiBtZXRob2RzIGFib3J0LCBzdWNjZXNzLCBlcnJvciBhbmQgY29tcGxldGU6CiAgICAgICAgX2dldFhIUlByb21pc2U6IGZ1bmN0aW9uIChyZXNvbHZlT3JSZWplY3QsIGNvbnRleHQsIGFyZ3MpIHsKICAgICAgICAgICAgdmFyIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dCB8fCB0aGlzLm9wdGlvbnMuY29udGV4dCB8fCBwcm9taXNlOwogICAgICAgICAgICBpZiAocmVzb2x2ZU9yUmVqZWN0ID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgoY29udGV4dCwgYXJncyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZU9yUmVqZWN0ID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgoY29udGV4dCwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGRmZC5wcm9taXNlOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocHJvbWlzZSk7CiAgICAgICAgfSwKCiAgICAgICAgLy8gUGFyc2VzIHRoZSBSYW5nZSBoZWFkZXIgZnJvbSB0aGUgc2VydmVyIHJlc3BvbnNlCiAgICAgICAgLy8gYW5kIHJldHVybnMgdGhlIHVwbG9hZGVkIGJ5dGVzOgogICAgICAgIF9nZXRVcGxvYWRlZEJ5dGVzOiBmdW5jdGlvbiAoanFYSFIpIHsKICAgICAgICAgICAgdmFyIHJhbmdlID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoJ1JhbmdlJyksCiAgICAgICAgICAgICAgICBwYXJ0cyA9IHJhbmdlICYmIHJhbmdlLnNwbGl0KCctJyksCiAgICAgICAgICAgICAgICB1cHBlckJ5dGVzUG9zID0gcGFydHMgJiYgcGFydHMubGVuZ3RoID4gMSAmJgogICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHBhcnRzWzFdLCAxMCk7CiAgICAgICAgICAgIHJldHVybiB1cHBlckJ5dGVzUG9zICYmIHVwcGVyQnl0ZXNQb3MgKyAxOwogICAgICAgIH0sCgogICAgICAgIC8vIFVwbG9hZHMgYSBmaWxlIGluIG11bHRpcGxlLCBzZXF1ZW50aWFsIHJlcXVlc3RzCiAgICAgICAgLy8gYnkgc3BsaXR0aW5nIHRoZSBmaWxlIHVwIGluIG11bHRpcGxlIGJsb2IgY2h1bmtzLgogICAgICAgIC8vIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRydWUsIG9ubHkgdGVzdHMgaWYgdGhlIGZpbGUKICAgICAgICAvLyBzaG91bGQgYmUgdXBsb2FkZWQgaW4gY2h1bmtzLCBidXQgZG9lcyBub3QgaW52b2tlIGFueQogICAgICAgIC8vIHVwbG9hZCByZXF1ZXN0czoKICAgICAgICBfY2h1bmtlZFVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMsIHRlc3RPbmx5KSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLAogICAgICAgICAgICAgICAgZnMgPSBmaWxlLnNpemUsCiAgICAgICAgICAgICAgICB1YiA9IG9wdGlvbnMudXBsb2FkZWRCeXRlcyA9IG9wdGlvbnMudXBsb2FkZWRCeXRlcyB8fCAwLAogICAgICAgICAgICAgICAgbWNzID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgZnMsCiAgICAgICAgICAgICAgICBzbGljZSA9IGZpbGUuc2xpY2UgfHwgZmlsZS53ZWJraXRTbGljZSB8fCBmaWxlLm1velNsaWNlLAogICAgICAgICAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksCiAgICAgICAgICAgICAgICBqcVhIUiwKICAgICAgICAgICAgICAgIHVwbG9hZDsKICAgICAgICAgICAgaWYgKCEodGhpcy5faXNYSFJVcGxvYWQob3B0aW9ucykgJiYgc2xpY2UgJiYgKHViIHx8IG1jcyA8IGZzKSkgfHwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGVzdE9ubHkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh1YiA+PSBmcykgewogICAgICAgICAgICAgICAgZmlsZS5lcnJvciA9ICdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJzsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dCwKICAgICAgICAgICAgICAgICAgICBbbnVsbCwgJ2Vycm9yJywgZmlsZS5lcnJvcl0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIGNodW5rIHVwbG9hZCBtZXRob2Q6CiAgICAgICAgICAgIHVwbG9hZCA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAvLyBDbG9uZSB0aGUgb3B0aW9ucyBvYmplY3QgZm9yIGVhY2ggY2h1bmsgdXBsb2FkOgogICAgICAgICAgICAgICAgdmFyIG8gPSAkLmV4dGVuZCh7fSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICBvLmJsb2IgPSBzbGljZS5jYWxsKAogICAgICAgICAgICAgICAgICAgIGZpbGUsCiAgICAgICAgICAgICAgICAgICAgdWIsCiAgICAgICAgICAgICAgICAgICAgdWIgKyBtY3MsCiAgICAgICAgICAgICAgICAgICAgZmlsZS50eXBlCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGN1cnJlbnQgY2h1bmsgc2l6ZSwgYXMgdGhlIGJsb2IgaXRzZWxmCiAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIGRlcmVmZXJlbmNlZCBhZnRlciBkYXRhIHByb2Nlc3Npbmc6CiAgICAgICAgICAgICAgICBvLmNodW5rU2l6ZSA9IG8uYmxvYi5zaXplOwogICAgICAgICAgICAgICAgLy8gRXhwb3NlIHRoZSBjaHVuayBieXRlcyBwb3NpdGlvbiByYW5nZToKICAgICAgICAgICAgICAgIG8uY29udGVudFJhbmdlID0gJ2J5dGVzICcgKyB1YiArICctJyArCiAgICAgICAgICAgICAgICAgICAgKHViICsgby5jaHVua1NpemUgLSAxKSArICcvJyArIGZzOwogICAgICAgICAgICAgICAgLy8gUHJvY2VzcyB0aGUgdXBsb2FkIGRhdGEgKHRoZSBibG9iIGFuZCBwb3RlbnRpYWwgZm9ybSBkYXRhKToKICAgICAgICAgICAgICAgIHRoYXQuX2luaXRYSFJEYXRhKG8pOwogICAgICAgICAgICAgICAgLy8gQWRkIHByb2dyZXNzIGxpc3RlbmVycyBmb3IgdGhpcyBjaHVuayB1cGxvYWQ6CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0UHJvZ3Jlc3NMaXN0ZW5lcihvKTsKICAgICAgICAgICAgICAgIGpxWEhSID0gKCQuYWpheChvKSB8fCB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvLmNvbnRleHQpKQogICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHViID0gdGhhdC5fZ2V0VXBsb2FkZWRCeXRlcyhqcVhIUikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1YiArIG8uY2h1bmtTaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcHJvZ3Jlc3MgZXZlbnQgaWYgdXBsb2FkIGlzIGRvbmUgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHByb2dyZXNzIGV2ZW50IGhhcyBiZWVuIGludm9rZWQgZm9yIHRoaXMgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghby5sb2FkZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoJC5FdmVudCgncHJvZ3Jlc3MnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IHViIC0gby51cGxvYWRlZEJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsOiB1YiAtIG8udXBsb2FkZWRCeXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXBsb2FkZWRCeXRlcyA9IG8udXBsb2FkZWRCeXRlcyA9IHViOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWIgPCBmcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB1cGxvYWQgbm90IHlldCBjb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdCwgdGV4dFN0YXR1cywganFYSFJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3RXaXRoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW2pxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bl0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5fZW5oYW5jZVByb21pc2UocHJvbWlzZSk7CiAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdXBsb2FkKCk7CiAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgIH0sCgogICAgICAgIF9iZWZvcmVTZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAvLyB0aGUgc3RhcnQgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYW4gdXBsb2FkIHN0YXJ0cwogICAgICAgICAgICAgICAgLy8gYW5kIG5vIG90aGVyIHVwbG9hZHMgYXJlIGN1cnJlbnRseSBydW5uaW5nLAogICAgICAgICAgICAgICAgLy8gZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ3N0YXJ0Jyk7CiAgICAgICAgICAgICAgICAvLyBTZXQgdGltZXIgZm9yIGdsb2JhbCBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOgogICAgICAgICAgICAgICAgdGhpcy5fYml0cmF0ZVRpbWVyID0gbmV3IHRoaXMuX0JpdHJhdGVUaW1lcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSArPSAxOwogICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBnbG9iYWwgcHJvZ3Jlc3MgdmFsdWVzOgogICAgICAgICAgICB0aGlzLl9sb2FkZWQgKz0gZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDA7CiAgICAgICAgICAgIHRoaXMuX3RvdGFsICs9IHRoaXMuX2dldFRvdGFsKGRhdGEuZmlsZXMpOwogICAgICAgIH0sCgogICAgICAgIF9vbkRvbmU6IGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5faXNYSFJVcGxvYWQob3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGZvciBlYWNoIGlmcmFtZSBsb2FkOgogICAgICAgICAgICAgICAgdGhpcy5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZDogMSwKICAgICAgICAgICAgICAgICAgICB0b3RhbDogMQogICAgICAgICAgICAgICAgfSksIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9wdGlvbnMucmVzdWx0ID0gcmVzdWx0OwogICAgICAgICAgICBvcHRpb25zLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICBvcHRpb25zLmpxWEhSID0ganFYSFI7CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2RvbmUnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICB9LAoKICAgICAgICBfb25GYWlsOiBmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duLCBvcHRpb25zKSB7CiAgICAgICAgICAgIG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgb3B0aW9ucy50ZXh0U3RhdHVzID0gdGV4dFN0YXR1czsKICAgICAgICAgICAgb3B0aW9ucy5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdmYWlsJywgbnVsbCwgb3B0aW9ucyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlY2FsY3VsYXRlUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmFpbGVkIChlcnJvciBvciBhYm9ydCkgZmlsZSB1cGxvYWQgZnJvbQogICAgICAgICAgICAgICAgLy8gdGhlIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRlZCAtPSBvcHRpb25zLmxvYWRlZCB8fCBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgfHwgMDsKICAgICAgICAgICAgICAgIHRoaXMuX3RvdGFsIC09IG9wdGlvbnMudG90YWwgfHwgdGhpcy5fZ2V0VG90YWwob3B0aW9ucy5maWxlcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfb25BbHdheXM6IGZ1bmN0aW9uIChqcVhIUm9yUmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUm9yRXJyb3IsIG9wdGlvbnMpIHsKICAgICAgICAgICAgdGhpcy5fYWN0aXZlIC09IDE7CiAgICAgICAgICAgIG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7CiAgICAgICAgICAgIGlmIChqcVhIUm9yRXJyb3IgJiYganFYSFJvckVycm9yLmFsd2F5cykgewogICAgICAgICAgICAgICAgb3B0aW9ucy5qcVhIUiA9IGpxWEhSb3JFcnJvcjsKICAgICAgICAgICAgICAgIG9wdGlvbnMucmVzdWx0ID0ganFYSFJvclJlc3VsdDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuanFYSFIgPSBqcVhIUm9yUmVzdWx0OwogICAgICAgICAgICAgICAgb3B0aW9ucy5lcnJvclRocm93biA9IGpxWEhSb3JFcnJvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdhbHdheXMnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgLy8gVGhlIHN0b3AgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYWxsIHVwbG9hZHMgaGF2ZQogICAgICAgICAgICAgICAgLy8gYmVlbiBjb21wbGV0ZWQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ3N0b3AnKTsKICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBnbG9iYWwgcHJvZ3Jlc3MgdmFsdWVzOgogICAgICAgICAgICAgICAgdGhpcy5fbG9hZGVkID0gdGhpcy5fdG90YWwgPSAwOwogICAgICAgICAgICAgICAgdGhpcy5fYml0cmF0ZVRpbWVyID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vblNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGpxWEhSLAogICAgICAgICAgICAgICAgYWJvcnRlZCwKICAgICAgICAgICAgICAgIHNsb3QsCiAgICAgICAgICAgICAgICBwaXBlLAogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHRoYXQuX2dldEFKQVhTZXR0aW5ncyhkYXRhKSwKICAgICAgICAgICAgICAgIHNlbmQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fc2VuZGluZyArPSAxOwogICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aW1lciBmb3IgYml0cmF0ZSBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLl9iaXRyYXRlVGltZXIgPSBuZXcgdGhhdC5fQml0cmF0ZVRpbWVyKCk7CiAgICAgICAgICAgICAgICAgICAganFYSFIgPSBqcVhIUiB8fCAoCiAgICAgICAgICAgICAgICAgICAgICAgICgoYWJvcnRlZCB8fCB0aGF0Ll90cmlnZ2VyKCdzZW5kJywgZSwgb3B0aW9ucykgPT09IGZhbHNlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9jaHVua2VkVXBsb2FkKG9wdGlvbnMpIHx8ICQuYWpheChvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkRvbmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUiwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRmFpbChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25BbHdheXMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yUmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSb3JFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA+IHRoYXQuX3NlbmRpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBuZXh0IHF1ZXVlZCB1cGxvYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGhhcyBub3QgYmVlbiBhYm9ydGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRTbG90ID0gdGhhdC5fc2xvdHMuc2hpZnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BlbmRpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dFNsb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqUXVlcnkgMS42IGRvZXNuJ3QgcHJvdmlkZSAuc3RhdGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGlsZSBqUXVlcnkgMS44KyByZW1vdmVkIC5pc1JlamVjdGVkKCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQZW5kaW5nID0gbmV4dFNsb3Quc3RhdGUgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFNsb3Quc3RhdGUoKSA9PT0gJ3BlbmRpbmcnIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFuZXh0U2xvdC5pc1JlamVjdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGVuZGluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9iZWZvcmVTZW5kKGUsIG9wdGlvbnMpOwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlcXVlbnRpYWxVcGxvYWRzIHx8CiAgICAgICAgICAgICAgICAgICAgKHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzICYmCiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPD0gdGhpcy5fc2VuZGluZykpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA+IDEpIHsKICAgICAgICAgICAgICAgICAgICBzbG90ID0gJC5EZWZlcnJlZCgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Nsb3RzLnB1c2goc2xvdCk7CiAgICAgICAgICAgICAgICAgICAgcGlwZSA9IHNsb3QucGlwZShzZW5kKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcGlwZSA9ICh0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX3NlcXVlbmNlLnBpcGUoc2VuZCwgc2VuZCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBwaXBlZCBQcm9taXNlIG9iamVjdCwgZW5oYW5jZWQgd2l0aCBhbiBhYm9ydCBtZXRob2QsCiAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGpxWEhSIG9iamVjdCBvZiB0aGUgY3VycmVudCB1cGxvYWQsCiAgICAgICAgICAgICAgICAvLyBhbmQganFYSFIgY2FsbGJhY2tzIG1hcHBlZCB0byB0aGUgZXF1aXZhbGVudCBQcm9taXNlIG1ldGhvZHM6CiAgICAgICAgICAgICAgICBwaXBlLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSBbdW5kZWZpbmVkLCAnYWJvcnQnLCAnYWJvcnQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG90KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LnJlamVjdFdpdGgob3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocGlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfb25BZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSksCiAgICAgICAgICAgICAgICBsaW1pdCA9IG9wdGlvbnMubGltaXRNdWx0aUZpbGVVcGxvYWRzLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gdGhpcy5fZ2V0UGFyYW1OYW1lKG9wdGlvbnMpLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0LAogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UsCiAgICAgICAgICAgICAgICBmaWxlU2V0LAogICAgICAgICAgICAgICAgaTsKICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5zaW5nbGVGaWxlVXBsb2FkcyB8fCBsaW1pdCkgfHwKICAgICAgICAgICAgICAgICAgICAhdGhpcy5faXNYSFJVcGxvYWQob3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIGZpbGVTZXQgPSBbZGF0YS5maWxlc107CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbcGFyYW1OYW1lXTsKICAgICAgICAgICAgfSBlbHNlIGlmICghb3B0aW9ucy5zaW5nbGVGaWxlVXBsb2FkcyAmJiBsaW1pdCkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YS5maWxlcy5sZW5ndGg7IGkgKz0gbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlU2V0LnB1c2goZGF0YS5maWxlcy5zbGljZShpLCBpICsgbGltaXQpKTsKICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShpLCBpICsgbGltaXQpOwogICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNsaWNlID0gcGFyYW1OYW1lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBwYXJhbU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YS5vcmlnaW5hbEZpbGVzID0gZGF0YS5maWxlczsKICAgICAgICAgICAgJC5lYWNoKGZpbGVTZXQgfHwgZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RGF0YSA9ICQuZXh0ZW5kKHt9LCBkYXRhKTsKICAgICAgICAgICAgICAgIG5ld0RhdGEuZmlsZXMgPSBmaWxlU2V0ID8gZWxlbWVudCA6IFtlbGVtZW50XTsKICAgICAgICAgICAgICAgIG5ld0RhdGEucGFyYW1OYW1lID0gcGFyYW1OYW1lU2V0W2luZGV4XTsKICAgICAgICAgICAgICAgIG5ld0RhdGEuc3VibWl0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG5ld0RhdGEuanFYSFIgPSB0aGlzLmpxWEhSID0KICAgICAgICAgICAgICAgICAgICAgICAgKHRoYXQuX3RyaWdnZXIoJ3N1Ym1pdCcsIGUsIHRoaXMpICE9PSBmYWxzZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25TZW5kKGUsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoYXQuX3RyaWdnZXIoJ2FkZCcsIGUsIG5ld0RhdGEpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlcGxhY2VGaWxlSW5wdXQ6IGZ1bmN0aW9uIChpbnB1dCkgewogICAgICAgICAgICB2YXIgaW5wdXRDbG9uZSA9IGlucHV0LmNsb25lKHRydWUpOwogICAgICAgICAgICAkKCc8Zm9ybT48L2Zvcm0+JykuYXBwZW5kKGlucHV0Q2xvbmUpWzBdLnJlc2V0KCk7CiAgICAgICAgICAgIC8vIERldGFjaGluZyBhbGxvd3MgdG8gaW5zZXJ0IHRoZSBmaWxlSW5wdXQgb24gYW5vdGhlciBmb3JtCiAgICAgICAgICAgIC8vIHdpdGhvdXQgbG9vc2luZyB0aGUgZmlsZSBpbnB1dCB2YWx1ZToKICAgICAgICAgICAgaW5wdXQuYWZ0ZXIoaW5wdXRDbG9uZSkuZGV0YWNoKCk7CiAgICAgICAgICAgIC8vIEF2b2lkIG1lbW9yeSBsZWFrcyB3aXRoIHRoZSBkZXRhY2hlZCBmaWxlIGlucHV0OgogICAgICAgICAgICAkLmNsZWFuRGF0YShpbnB1dC51bmJpbmQoJ3JlbW92ZScpKTsKICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZSBpbnB1dCBlbGVtZW50IGluIHRoZSBmaWxlSW5wdXQKICAgICAgICAgICAgLy8gZWxlbWVudHMgc2V0IHdpdGggdGhlIGNsb25lLCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgaW5jbHVkaW5nCiAgICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXJzOgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5vcHRpb25zLmZpbGVJbnB1dC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwgPT09IGlucHV0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q2xvbmVbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBJZiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGluaXRpYWxpemVkIG9uIHRoZSBmaWxlIGlucHV0IGl0c2VsZiwKICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhpcy5lbGVtZW50IHdpdGggdGhlIGZpbGUgaW5wdXQgY2xvbmU6CiAgICAgICAgICAgIGlmIChpbnB1dFswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBpbnB1dENsb25lOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cnk6IGZ1bmN0aW9uIChlbnRyeSwgcGF0aCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksCiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICFlLmVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgJC53aGVuIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgb25lCiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXJyZWQgaXMgcmVqZWN0ZWQsIHdlIHVzZSByZXNvbHZlIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdmFsaWQgZmlsZXMgYW5kIGludmFsaWQgaXRlbXMKICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZXR1cm5lZCB0b2dldGhlciBpbiBvbmUgc2V0OgogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKFtlXSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGlyUmVhZGVyOwogICAgICAgICAgICBwYXRoID0gcGF0aCB8fCAnJzsKICAgICAgICAgICAgaWYgKGVudHJ5LmlzRmlsZSkgewogICAgICAgICAgICAgICAgaWYgKGVudHJ5Ll9maWxlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgQ2hyb21lIGJ1ZyAjMTQ5NzM1CiAgICAgICAgICAgICAgICAgICAgZW50cnkuX2ZpbGUucmVsYXRpdmVQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShlbnRyeS5fZmlsZSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGVudHJ5LmZpbGUoZnVuY3Rpb24gKGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5yZWxhdGl2ZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9LCBlcnJvckhhbmRsZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KSB7CiAgICAgICAgICAgICAgICBkaXJSZWFkZXIgPSBlbnRyeS5jcmVhdGVSZWFkZXIoKTsKICAgICAgICAgICAgICAgIGRpclJlYWRlci5yZWFkRW50cmllcyhmdW5jdGlvbiAoZW50cmllcykgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArIGVudHJ5Lm5hbWUgKyAnLycKICAgICAgICAgICAgICAgICAgICApLmRvbmUoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LCBlcnJvckhhbmRsZXIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gUmV0dXJuIGFuIGVtcHkgbGlzdCBmb3IgZmlsZSBzeXN0ZW0gaXRlbXMKICAgICAgICAgICAgICAgIC8vIG90aGVyIHRoYW4gZmlsZXMgb3IgZGlyZWN0b3JpZXM6CiAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShbXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGRmZC5wcm9taXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cmllczogZnVuY3Rpb24gKGVudHJpZXMsIHBhdGgpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gJC53aGVuLmFwcGx5KAogICAgICAgICAgICAgICAgJCwKICAgICAgICAgICAgICAgICQubWFwKGVudHJpZXMsIGZ1bmN0aW9uIChlbnRyeSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0Ll9oYW5kbGVGaWxlVHJlZUVudHJ5KGVudHJ5LCBwYXRoKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICkucGlwZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseSgKICAgICAgICAgICAgICAgICAgICBbXSwKICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9nZXREcm9wcGVkRmlsZXM6IGZ1bmN0aW9uIChkYXRhVHJhbnNmZXIpIHsKICAgICAgICAgICAgZGF0YVRyYW5zZmVyID0gZGF0YVRyYW5zZmVyIHx8IHt9OwogICAgICAgICAgICB2YXIgaXRlbXMgPSBkYXRhVHJhbnNmZXIuaXRlbXM7CiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGggJiYgKGl0ZW1zWzBdLndlYmtpdEdldEFzRW50cnkgfHwKICAgICAgICAgICAgICAgICAgICBpdGVtc1swXS5nZXRBc0VudHJ5KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAkLm1hcChpdGVtcywgZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVudHJ5OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS53ZWJraXRHZXRBc0VudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IGl0ZW0ud2Via2l0R2V0QXNFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgQ2hyb21lIGJ1ZyAjMTQ5NzM1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Ll9maWxlID0gaXRlbS5nZXRBc0ZpbGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5nZXRBc0VudHJ5KCk7CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKAogICAgICAgICAgICAgICAgJC5tYWtlQXJyYXkoZGF0YVRyYW5zZmVyLmZpbGVzKQogICAgICAgICAgICApLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0U2luZ2xlRmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICAgICAgZmlsZUlucHV0ID0gJChmaWxlSW5wdXQpOwogICAgICAgICAgICB2YXIgZW50cmllcyA9IGZpbGVJbnB1dC5wcm9wKCd3ZWJraXRFbnRyaWVzJykgfHwKICAgICAgICAgICAgICAgICAgICBmaWxlSW5wdXQucHJvcCgnZW50cmllcycpLAogICAgICAgICAgICAgICAgZmlsZXMsCiAgICAgICAgICAgICAgICB2YWx1ZTsKICAgICAgICAgICAgaWYgKGVudHJpZXMgJiYgZW50cmllcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoZW50cmllcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmlsZXMgPSAkLm1ha2VBcnJheShmaWxlSW5wdXQucHJvcCgnZmlsZXMnKSk7CiAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGZpbGVJbnB1dC5wcm9wKCd2YWx1ZScpOwogICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZShbXSkucHJvbWlzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGVzIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUsIHRoZSBicm93c2VyIGRvZXMgbm90CiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IHRoZSBGaWxlIEFQSSBhbmQgd2UgYWRkIGEgcHNldWRvIEZpbGUgb2JqZWN0IHdpdGgKICAgICAgICAgICAgICAgIC8vIHRoZSBpbnB1dCB2YWx1ZSBhcyBuYW1lIHdpdGggcGF0aCBpbmZvcm1hdGlvbiByZW1vdmVkOgogICAgICAgICAgICAgICAgZmlsZXMgPSBbe25hbWU6IHZhbHVlLnJlcGxhY2UoL14uKlxcLywgJycpfV07CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZXNbMF0ubmFtZSA9PT0gdW5kZWZpbmVkICYmIGZpbGVzWzBdLmZpbGVOYW1lKSB7CiAgICAgICAgICAgICAgICAvLyBGaWxlIG5vcm1hbGl6YXRpb24gZm9yIFNhZmFyaSA0IGFuZCBGaXJlZm94IDM6CiAgICAgICAgICAgICAgICAkLmVhY2goZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgIGZpbGUubmFtZSA9IGZpbGUuZmlsZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgZmlsZS5zaXplID0gZmlsZS5maWxlU2l6ZTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZShmaWxlcykucHJvbWlzZSgpOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGaWxlSW5wdXRGaWxlczogZnVuY3Rpb24gKGZpbGVJbnB1dCkgewogICAgICAgICAgICBpZiAoIShmaWxlSW5wdXQgaW5zdGFuY2VvZiAkKSB8fCBmaWxlSW5wdXQubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U2luZ2xlRmlsZUlucHV0RmlsZXMoZmlsZUlucHV0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJC53aGVuLmFwcGx5KAogICAgICAgICAgICAgICAgJCwKICAgICAgICAgICAgICAgICQubWFwKGZpbGVJbnB1dCwgdGhpcy5fZ2V0U2luZ2xlRmlsZUlucHV0RmlsZXMpCiAgICAgICAgICAgICkucGlwZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseSgKICAgICAgICAgICAgICAgICAgICBbXSwKICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9vbkNoYW5nZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBmaWxlSW5wdXQ6ICQoZS50YXJnZXQpLAogICAgICAgICAgICAgICAgICAgIGZvcm06ICQoZS50YXJnZXQuZm9ybSkKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2dldEZpbGVJbnB1dEZpbGVzKGRhdGEuZmlsZUlucHV0KS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICBkYXRhLmZpbGVzID0gZmlsZXM7CiAgICAgICAgICAgICAgICBpZiAodGhhdC5vcHRpb25zLnJlcGxhY2VGaWxlSW5wdXQpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9yZXBsYWNlRmlsZUlucHV0KGRhdGEuZmlsZUlucHV0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKCdjaGFuZ2UnLCBlLCBkYXRhKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX29uUGFzdGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciBjYmQgPSBlLm9yaWdpbmFsRXZlbnQuY2xpcGJvYXJkRGF0YSwKICAgICAgICAgICAgICAgIGl0ZW1zID0gKGNiZCAmJiBjYmQuaXRlbXMpIHx8IFtdLAogICAgICAgICAgICAgICAgZGF0YSA9IHtmaWxlczogW119OwogICAgICAgICAgICAkLmVhY2goaXRlbXMsIGZ1bmN0aW9uIChpbmRleCwgaXRlbSkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSAmJiBpdGVtLmdldEFzRmlsZSgpOwogICAgICAgICAgICAgICAgaWYgKGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbGVzLnB1c2goZmlsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAodGhpcy5fdHJpZ2dlcigncGFzdGUnLCBlLCBkYXRhKSA9PT0gZmFsc2UgfHwKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyb3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50LmRhdGFUcmFuc2ZlciwKICAgICAgICAgICAgICAgIGRhdGEgPSB7fTsKICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiBkYXRhVHJhbnNmZXIuZmlsZXMgJiYgZGF0YVRyYW5zZmVyLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2dldERyb3BwZWRGaWxlcyhkYXRhVHJhbnNmZXIpLmFsd2F5cyhmdW5jdGlvbiAoZmlsZXMpIHsKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKCdkcm9wJywgZSwgZGF0YSkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25BZGQoZSwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9vbkRyYWdPdmVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICB2YXIgZGF0YVRyYW5zZmVyID0gZS5kYXRhVHJhbnNmZXIgPSBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyOwogICAgICAgICAgICBpZiAodGhpcy5fdHJpZ2dlcignZHJhZ292ZXInLCBlKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmICQuaW5BcnJheSgnRmlsZXMnLCBkYXRhVHJhbnNmZXIudHlwZXMpICE9PSAtMSkgewogICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKHRoaXMub3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwgewogICAgICAgICAgICAgICAgICAgIGRyYWdvdmVyOiB0aGlzLl9vbkRyYWdPdmVyLAogICAgICAgICAgICAgICAgICAgIGRyb3A6IHRoaXMuX29uRHJvcAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0aGlzLl9vbih0aGlzLm9wdGlvbnMucGFzdGVab25lLCB7CiAgICAgICAgICAgICAgICAgICAgcGFzdGU6IHRoaXMuX29uUGFzdGUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsIHsKICAgICAgICAgICAgICAgIGNoYW5nZTogdGhpcy5fb25DaGFuZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2Rlc3Ryb3lFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMuZHJvcFpvbmUsICdkcmFnb3ZlciBkcm9wJyk7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMucGFzdGVab25lLCAncGFzdGUnKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsICdjaGFuZ2UnKTsKICAgICAgICB9LAoKICAgICAgICBfc2V0T3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgcmVmcmVzaCA9ICQuaW5BcnJheShrZXksIHRoaXMuX3JlZnJlc2hPcHRpb25zTGlzdCkgIT09IC0xOwogICAgICAgICAgICBpZiAocmVmcmVzaCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveUV2ZW50SGFuZGxlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcihrZXksIHZhbHVlKTsKICAgICAgICAgICAgaWYgKHJlZnJlc2gpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpOwogICAgICAgICAgICAgICAgdGhpcy5faW5pdEV2ZW50SGFuZGxlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9pbml0U3BlY2lhbE9wdGlvbnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dCA9IHRoaXMuZWxlbWVudC5pcygnaW5wdXRbdHlwZT0iZmlsZSJdJykgPwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgOiB0aGlzLmVsZW1lbnQuZmluZCgnaW5wdXRbdHlwZT0iZmlsZSJdJyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIShvcHRpb25zLmZpbGVJbnB1dCBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dCA9ICQob3B0aW9ucy5maWxlSW5wdXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG9wdGlvbnMuZHJvcFpvbmUgaW5zdGFuY2VvZiAkKSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5kcm9wWm9uZSA9ICQob3B0aW9ucy5kcm9wWm9uZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5wYXN0ZVpvbmUgaW5zdGFuY2VvZiAkKSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5wYXN0ZVpvbmUgPSAkKG9wdGlvbnMucGFzdGVab25lKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczoKICAgICAgICAgICAgJC5leHRlbmQob3B0aW9ucywgJCh0aGlzLmVsZW1lbnRbMF0uY2xvbmVOb2RlKGZhbHNlKSkuZGF0YSgpKTsKICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7CiAgICAgICAgICAgIHRoaXMuX3Nsb3RzID0gW107CiAgICAgICAgICAgIHRoaXMuX3NlcXVlbmNlID0gdGhpcy5fZ2V0WEhSUHJvbWlzZSh0cnVlKTsKICAgICAgICAgICAgdGhpcy5fc2VuZGluZyA9IHRoaXMuX2FjdGl2ZSA9IHRoaXMuX2xvYWRlZCA9IHRoaXMuX3RvdGFsID0gMDsKICAgICAgICAgICAgdGhpcy5faW5pdEV2ZW50SGFuZGxlcnMoKTsKICAgICAgICB9LAoKICAgICAgICBfZGVzdHJveTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95RXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIGV4cG9zZWQgdG8gdGhlIHdpZGdldCBBUEkgYW5kIGFsbG93cyBhZGRpbmcgZmlsZXMKICAgICAgICAvLyB1c2luZyB0aGUgZmlsZXVwbG9hZCBBUEkuIFRoZSBkYXRhIHBhcmFtZXRlciBhY2NlcHRzIGFuIG9iamVjdCB3aGljaAogICAgICAgIC8vIG11c3QgaGF2ZSBhIGZpbGVzIHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6CiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ2FkZCcsIHtmaWxlczogZmlsZXNMaXN0fSk7CiAgICAgICAgYWRkOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgICAgICAgIGlmICghZGF0YSB8fCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2dldEZpbGVJbnB1dEZpbGVzKGRhdGEuZmlsZUlucHV0KS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhLmZpbGVzID0gJC5tYWtlQXJyYXkoZGF0YS5maWxlcyk7CiAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChudWxsLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIGV4cG9zZWQgdG8gdGhlIHdpZGdldCBBUEkgYW5kIGFsbG93cyBzZW5kaW5nIGZpbGVzCiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2gKICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBvciBmaWxlSW5wdXQgcHJvcGVydHkgYW5kIGNhbiBjb250YWluIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgICAgICAvLyAuZmlsZXVwbG9hZCgnc2VuZCcsIHtmaWxlczogZmlsZXNMaXN0fSk7CiAgICAgICAgLy8gVGhlIG1ldGhvZCByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgZm9yIHRoZSBmaWxlIHVwbG9hZCBjYWxsLgogICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGlmIChkYXRhICYmICF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVJbnB1dCAmJiAhZGF0YS5maWxlcykgewogICAgICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gZGZkLnByb21pc2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQ7CiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpxWEhSLmFib3J0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChudWxsLCAnYWJvcnQnLCAnYWJvcnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYm9ydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFIgPSB0aGF0Ll9vblNlbmQobnVsbCwgZGF0YSkudGhlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSAkLm1ha2VBcnJheShkYXRhLmZpbGVzKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vblNlbmQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoZmFsc2UsIGRhdGEgJiYgZGF0YS5jb250ZXh0KTsKICAgICAgICB9CgogICAgfSk7Cgp9KSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/jquery.iframe-transport.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IElmcmFtZSBUcmFuc3BvcnQgUGx1Z2luIDEuNQogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTEsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLypqc2xpbnQgdW5wYXJhbTogdHJ1ZSwgbm9tZW46IHRydWUgKi8KLypnbG9iYWwgZGVmaW5lLCB3aW5kb3csIGRvY3VtZW50ICovCgooZnVuY3Rpb24gKGZhY3RvcnkpIHsKICAgICd1c2Ugc3RyaWN0JzsKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgQU1EIG1vZHVsZToKICAgICAgICBkZWZpbmUoWydqcXVlcnknXSwgZmFjdG9yeSk7CiAgICB9IGVsc2UgewogICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFsczoKICAgICAgICBmYWN0b3J5KHdpbmRvdy5qUXVlcnkpOwogICAgfQp9KGZ1bmN0aW9uICgkKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gSGVscGVyIHZhcmlhYmxlIHRvIGNyZWF0ZSB1bmlxdWUgbmFtZXMgZm9yIHRoZSB0cmFuc3BvcnQgaWZyYW1lczoKICAgIHZhciBjb3VudGVyID0gMDsKCiAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCBhY2NlcHRzIHRocmVlIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzCiAgICAvLyBvcHRpb25zLnBhcmFtTmFtZTogdGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEsCiAgICAvLyAgb3ZlcnJpZGVzIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLAogICAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLgogICAgLy8gb3B0aW9ucy5mb3JtRGF0YTogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kIHZhbHVlIHByb3BlcnRpZXMsCiAgICAvLyAgZXF1aXZhbGVudCB0byB0aGUgcmV0dXJuIGRhdGEgb2YgLnNlcmlhbGl6ZUFycmF5KCksIGUuZy46CiAgICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XQogICAgJC5hamF4VHJhbnNwb3J0KCdpZnJhbWUnLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zLmFzeW5jICYmIChvcHRpb25zLnR5cGUgPT09ICdQT1NUJyB8fCBvcHRpb25zLnR5cGUgPT09ICdHRVQnKSkgewogICAgICAgICAgICB2YXIgZm9ybSwKICAgICAgICAgICAgICAgIGlmcmFtZTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChfLCBjb21wbGV0ZUNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgZm9ybSA9ICQoJzxmb3JtIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48L2Zvcm0+Jyk7CiAgICAgICAgICAgICAgICAgICAgZm9ybS5hdHRyKCdhY2NlcHQtY2hhcnNldCcsIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpOwogICAgICAgICAgICAgICAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaW5pdGlhbCBpZnJhbWUgc3JjCiAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudHMgd2FybmluZyBwb3B1cHMgb24gSFRUUFMgaW4gSUU2LgogICAgICAgICAgICAgICAgICAgIC8vIElFIHZlcnNpb25zIGJlbG93IElFOCBjYW5ub3Qgc2V0IHRoZSBuYW1lIHByb3BlcnR5IG9mCiAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgRE9NLAogICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIHNldCB0aGUgbmFtZSBhbG9uZyB3aXRoIHRoZSBpZnJhbWUgSFRNTCBtYXJrdXA6CiAgICAgICAgICAgICAgICAgICAgaWZyYW1lID0gJCgKICAgICAgICAgICAgICAgICAgICAgICAgJzxpZnJhbWUgc3JjPSJqYXZhc2NyaXB0OmZhbHNlOyIgbmFtZT0iaWZyYW1lLXRyYW5zcG9ydC0nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb3VudGVyICs9IDEpICsgJyI+PC9pZnJhbWU+JwogICAgICAgICAgICAgICAgICAgICkuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJbnB1dENsb25lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZXMgPSAkLmlzQXJyYXkob3B0aW9ucy5wYXJhbU5hbWUpID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWUgOiBbb3B0aW9ucy5wYXJhbU5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJpbmQoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdyYXAgaW4gYSB0cnkvY2F0Y2ggYmxvY2sgdG8gY2F0Y2ggZXhjZXB0aW9ucyB0aHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRyeWluZyB0byBhY2Nlc3MgY3Jvc3MtZG9tYWluIGlmcmFtZSBjb250ZW50czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGlmcmFtZS5jb250ZW50cygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHb29nbGUgQ2hyb21lIGFuZCBGaXJlZm94IGRvIG5vdCB0aHJvdyBhbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24gd2hlbiBjYWxsaW5nIGlmcmFtZS5jb250ZW50cygpIG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyb3NzLWRvbWFpbiByZXF1ZXN0cywgc28gd2UgdW5pZnkgdGhlIHJlc3BvbnNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLmxlbmd0aCB8fCAhcmVzcG9uc2VbMF0uZmlyc3RDaGlsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY29tcGxldGUgY2FsbGJhY2sgcmV0dXJucyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZSBvYmplY3Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVDYWxsYmFjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3VjY2VzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnaWZyYW1lJzogcmVzcG9uc2V9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXggZm9yIElFIGVuZGxlc3MgcHJvZ3Jlc3MgYmFyIGFjdGl2aXR5IGJ1ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChoYXBwZW5zIG9uIGZvcm0gc3VibWl0cyB0byBpZnJhbWUgdGFyZ2V0cyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnPGlmcmFtZSBzcmM9ImphdmFzY3JpcHQ6ZmFsc2U7Ij48L2lmcmFtZT4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgndGFyZ2V0JywgaWZyYW1lLnByb3AoJ25hbWUnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdhY3Rpb24nLCBvcHRpb25zLnVybCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdtZXRob2QnLCBvcHRpb25zLnR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb3JtRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChpbmRleCwgZmllbGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aW5wdXQgdHlwZT0iaGlkZGVuIi8+JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ25hbWUnLCBmaWVsZC5uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsKGZpZWxkLnZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlSW5wdXQgJiYgb3B0aW9ucy5maWxlSW5wdXQubGVuZ3RoICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID09PSAnUE9TVCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVJbnB1dENsb25lcyA9IG9wdGlvbnMuZmlsZUlucHV0LmNsb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnNlcnQgYSBjbG9uZSBmb3IgZWFjaCBmaWxlIGlucHV0IGZpZWxkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuYWZ0ZXIoZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVJbnB1dENsb25lc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBhcmFtTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZXNbaW5kZXhdIHx8IG9wdGlvbnMucGFyYW1OYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmRpbmcgdGhlIGZpbGUgaW5wdXQgZmllbGRzIHRvIHRoZSBoaWRkZW4gZm9ybQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlcyB0aGVtIGZyb20gdGhlaXIgb3JpZ2luYWwgbG9jYXRpb246CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChvcHRpb25zLmZpbGVJbnB1dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnZW5jdHlwZScsICdtdWx0aXBhcnQvZm9ybS1kYXRhJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmN0eXBlIG11c3QgYmUgc2V0IGFzIGVuY29kaW5nIGZvciBJRToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnZW5jb2RpbmcnLCAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGFjaW5nIHRoZSBjbG9uZXMgd2l0aCB0aGUgb3JpZ2luYWxzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUlucHV0Q2xvbmVzICYmIGZpbGVJbnB1dENsb25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4LCBpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZSA9ICQoZmlsZUlucHV0Q2xvbmVzW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChpbnB1dCkucHJvcCgnbmFtZScsIGNsb25lLnByb3AoJ25hbWUnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChpZnJhbWUpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGlmcmFtZSBzcmMgYWJvcnRzIHRoZSByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNhdCBpcyB1c2VkIHRvIGF2b2lkIHRoZSAiU2NyaXB0IFVSTCIgSlNMaW50IGVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NyYycsICdqYXZhc2NyaXB0Jy5jb25jYXQoJzpmYWxzZTsnKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChmb3JtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0ucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0pOwoKICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IHJldHVybnMgdGhlIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlLgogICAgLy8gVGhlIGZvbGxvd2luZyBhZGRzIGNvbnZlcnRlcnMgZnJvbSBpZnJhbWUgdG8gdGV4dCwganNvbiwgaHRtbCwgYW5kIHNjcmlwdDoKICAgICQuYWpheFNldHVwKHsKICAgICAgICBjb252ZXJ0ZXJzOiB7CiAgICAgICAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKGlmcmFtZVswXS5ib2R5KS50ZXh0KCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUganNvbic6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkLnBhcnNlSlNPTigkKGlmcmFtZVswXS5ib2R5KS50ZXh0KCkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIGh0bWwnOiBmdW5jdGlvbiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJChpZnJhbWVbMF0uYm9keSkuaHRtbCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIHNjcmlwdCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkLmdsb2JhbEV2YWwoJChpZnJhbWVbMF0uYm9keSkudGV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/vendor/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/vendor/jquery.ui.widget.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IFVJIFdpZGdldCAxLjkuMSthbWQKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEyIGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2pRdWVyeS53aWRnZXQvCiAqLwoKKGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsianF1ZXJ5Il0sIGZhY3RvcnkpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeShqUXVlcnkpOwogICAgfQp9KGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7Cgp2YXIgdXVpZCA9IDAsCglzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZSwKCV9jbGVhbkRhdGEgPSAkLmNsZWFuRGF0YTsKJC5jbGVhbkRhdGEgPSBmdW5jdGlvbiggZWxlbXMgKSB7Cglmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsKCQl0cnkgewoJCQkkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoICJyZW1vdmUiICk7CgkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvODIzNQoJCX0gY2F0Y2goIGUgKSB7fQoJfQoJX2NsZWFuRGF0YSggZWxlbXMgKTsKfTsKCiQud2lkZ2V0ID0gZnVuY3Rpb24oIG5hbWUsIGJhc2UsIHByb3RvdHlwZSApIHsKCXZhciBmdWxsTmFtZSwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgY29uc3RydWN0b3IsIGJhc2VQcm90b3R5cGUsCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAkLmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CgkJCXByb3RvdHlwZVsgcHJvcCBdID0gKGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9zdXBlciA9IGZ1bmN0aW9uKCkgewoJCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQkJfSwKCQkJCQlfc3VwZXJBcHBseSA9IGZ1bmN0aW9uKCBhcmdzICkgewoJCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJCX07CgkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQkJX19zdXBlckFwcGx5ID0gdGhpcy5fc3VwZXJBcHBseSwKCQkJCQkJcmV0dXJuVmFsdWU7CgoJCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfc3VwZXJBcHBseTsKCgkJCQkJcmV0dXJuVmFsdWUgPSB2YWx1ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgoJCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCQl0aGlzLl9zdXBlckFwcGx5ID0gX19zdXBlckFwcGx5OwoKCQkJCQlyZXR1cm4gcmV0dXJuVmFsdWU7CgkJCQl9OwoJCQl9KSgpOwoJCX0KCX0pOwoJY29uc3RydWN0b3IucHJvdG90eXBlID0gJC53aWRnZXQuZXh0ZW5kKCBiYXNlUHJvdG90eXBlLCB7CgkJLy8gVE9ETzogcmVtb3ZlIHN1cHBvcnQgZm9yIHdpZGdldEV2ZW50UHJlZml4CgkJLy8gYWx3YXlzIHVzZSB0aGUgbmFtZSArIGEgY29sb24gYXMgdGhlIHByZWZpeCwgZS5nLiwgZHJhZ2dhYmxlOnN0YXJ0CgkJLy8gZG9uJ3QgcHJlZml4IGZvciB3aWRnZXRzIHRoYXQgYXJlbid0IERPTS1iYXNlZAoJCXdpZGdldEV2ZW50UHJlZml4OiBiYXNlUHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4IHx8IG5hbWUKCX0sIHByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCS8vIFRPRE8gcmVtb3ZlIHdpZGdldEJhc2VDbGFzcywgc2VlICM4MTU1CgkJd2lkZ2V0QmFzZUNsYXNzOiBmdWxsTmFtZSwKCQl3aWRnZXRGdWxsTmFtZTogZnVsbE5hbWUKCX0pOwoKCS8vIElmIHRoaXMgd2lkZ2V0IGlzIGJlaW5nIHJlZGVmaW5lZCB0aGVuIHdlIG5lZWQgdG8gZmluZCBhbGwgd2lkZ2V0cyB0aGF0CgkvLyBhcmUgaW5oZXJpdGluZyBmcm9tIGl0IGFuZCByZWRlZmluZSBhbGwgb2YgdGhlbSBzbyB0aGF0IHRoZXkgaW5oZXJpdCBmcm9tCgkvLyB0aGUgbmV3IHZlcnNpb24gb2YgdGhpcyB3aWRnZXQuIFdlJ3JlIGVzc2VudGlhbGx5IHRyeWluZyB0byByZXBsYWNlIG9uZQoJLy8gbGV2ZWwgaW4gdGhlIHByb3RvdHlwZSBjaGFpbi4KCWlmICggZXhpc3RpbmdDb25zdHJ1Y3RvciApIHsKCQkkLmVhY2goIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzLCBmdW5jdGlvbiggaSwgY2hpbGQgKSB7CgkJCXZhciBjaGlsZFByb3RvdHlwZSA9IGNoaWxkLnByb3RvdHlwZTsKCgkJCS8vIHJlZGVmaW5lIHRoZSBjaGlsZCB3aWRnZXQgdXNpbmcgdGhlIHNhbWUgcHJvdG90eXBlIHRoYXQgd2FzCgkJCS8vIG9yaWdpbmFsbHkgdXNlZCwgYnV0IGluaGVyaXQgZnJvbSB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGJhc2UKCQkJJC53aWRnZXQoIGNoaWxkUHJvdG90eXBlLm5hbWVzcGFjZSArICIuIiArIGNoaWxkUHJvdG90eXBlLndpZGdldE5hbWUsIGNvbnN0cnVjdG9yLCBjaGlsZC5fcHJvdG8gKTsKCQl9KTsKCQkvLyByZW1vdmUgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgY2hpbGQgY29uc3RydWN0b3JzIGZyb20gdGhlIG9sZCBjb25zdHJ1Y3RvcgoJCS8vIHNvIHRoZSBvbGQgY2hpbGQgY29uc3RydWN0b3JzIGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZAoJCWRlbGV0ZSBleGlzdGluZ0NvbnN0cnVjdG9yLl9jaGlsZENvbnN0cnVjdG9yczsKCX0gZWxzZSB7CgkJYmFzZS5fY2hpbGRDb25zdHJ1Y3RvcnMucHVzaCggY29uc3RydWN0b3IgKTsKCX0KCgkkLndpZGdldC5icmlkZ2UoIG5hbWUsIGNvbnN0cnVjdG9yICk7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAxICksCgkJaW5wdXRJbmRleCA9IDAsCgkJaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGgsCgkJa2V5LAoJCXZhbHVlOwoJZm9yICggOyBpbnB1dEluZGV4IDwgaW5wdXRMZW5ndGg7IGlucHV0SW5kZXgrKyApIHsKCQlmb3IgKCBrZXkgaW4gaW5wdXRbIGlucHV0SW5kZXggXSApIHsKCQkJdmFsdWUgPSBpbnB1dFsgaW5wdXRJbmRleCBdWyBrZXkgXTsKCQkJaWYgKCBpbnB1dFsgaW5wdXRJbmRleCBdLmhhc093blByb3BlcnR5KCBrZXkgKSAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJLy8gQ2xvbmUgb2JqZWN0cwoJCQkJaWYgKCAkLmlzUGxhaW5PYmplY3QoIHZhbHVlICkgKSB7CgkJCQkJdGFyZ2V0WyBrZXkgXSA9ICQuaXNQbGFpbk9iamVjdCggdGFyZ2V0WyBrZXkgXSApID8KCQkJCQkJJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGFyZ2V0WyBrZXkgXSwgdmFsdWUgKSA6CgkJCQkJCS8vIERvbid0IGV4dGVuZCBzdHJpbmdzLCBhcnJheXMsIGV0Yy4gd2l0aCBvYmplY3RzCgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHZhbHVlICk7CgkJCQkvLyBDb3B5IGV2ZXJ5dGhpbmcgZWxzZSBieSByZWZlcmVuY2UKCQkJCX0gZWxzZSB7CgkJCQkJdGFyZ2V0WyBrZXkgXSA9IHZhbHVlOwoJCQkJfQoJCQl9CgkJfQoJfQoJcmV0dXJuIHRhcmdldDsKfTsKCiQud2lkZ2V0LmJyaWRnZSA9IGZ1bmN0aW9uKCBuYW1lLCBvYmplY3QgKSB7Cgl2YXIgZnVsbE5hbWUgPSBvYmplY3QucHJvdG90eXBlLndpZGdldEZ1bGxOYW1lOwoJJC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiwKCQkJYXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLAoJCQlyZXR1cm5WYWx1ZSA9IHRoaXM7CgoJCS8vIGFsbG93IG11bHRpcGxlIGhhc2hlcyB0byBiZSBwYXNzZWQgb24gaW5pdAoJCW9wdGlvbnMgPSAhaXNNZXRob2RDYWxsICYmIGFyZ3MubGVuZ3RoID8KCQkJJC53aWRnZXQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIG9wdGlvbnMgXS5jb25jYXQoYXJncykgKSA6CgkJCW9wdGlvbnM7CgoJCWlmICggaXNNZXRob2RDYWxsICkgewoJCQl0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQl2YXIgbWV0aG9kVmFsdWUsCgkJCQkJaW5zdGFuY2UgPSAkLmRhdGEoIHRoaXMsIGZ1bGxOYW1lICk7CgkJCQlpZiAoICFpbnN0YW5jZSApIHsKCQkJCQlyZXR1cm4gJC5lcnJvciggImNhbm5vdCBjYWxsIG1ldGhvZHMgb24gIiArIG5hbWUgKyAiIHByaW9yIHRvIGluaXRpYWxpemF0aW9uOyAiICsKCQkJCQkJImF0dGVtcHRlZCB0byBjYWxsIG1ldGhvZCAnIiArIG9wdGlvbnMgKyAiJyIgKTsKCQkJCX0KCQkJCWlmICggISQuaXNGdW5jdGlvbiggaW5zdGFuY2Vbb3B0aW9uc10gKSB8fCBvcHRpb25zLmNoYXJBdCggMCApID09PSAiXyIgKSB7CgkJCQkJcmV0dXJuICQuZXJyb3IoICJubyBzdWNoIG1ldGhvZCAnIiArIG9wdGlvbnMgKyAiJyBmb3IgIiArIG5hbWUgKyAiIHdpZGdldCBpbnN0YW5jZSIgKTsKCQkJCX0KCQkJCW1ldGhvZFZhbHVlID0gaW5zdGFuY2VbIG9wdGlvbnMgXS5hcHBseSggaW5zdGFuY2UsIGFyZ3MgKTsKCQkJCWlmICggbWV0aG9kVmFsdWUgIT09IGluc3RhbmNlICYmIG1ldGhvZFZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuVmFsdWUgPSBtZXRob2RWYWx1ZSAmJiBtZXRob2RWYWx1ZS5qcXVlcnkgPwoJCQkJCQlyZXR1cm5WYWx1ZS5wdXNoU3RhY2soIG1ldGhvZFZhbHVlLmdldCgpICkgOgoJCQkJCQltZXRob2RWYWx1ZTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0pOwoJCX0gZWxzZSB7CgkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCXZhciBpbnN0YW5jZSA9ICQuZGF0YSggdGhpcywgZnVsbE5hbWUgKTsKCQkJCWlmICggaW5zdGFuY2UgKSB7CgkJCQkJaW5zdGFuY2Uub3B0aW9uKCBvcHRpb25zIHx8IHt9ICkuX2luaXQoKTsKCQkJCX0gZWxzZSB7CgkJCQkJbmV3IG9iamVjdCggb3B0aW9ucywgdGhpcyApOwoJCQkJfQoJCQl9KTsKCQl9CgoJCXJldHVybiByZXR1cm5WYWx1ZTsKCX07Cn07CgokLldpZGdldCA9IGZ1bmN0aW9uKCAvKiBvcHRpb25zLCBlbGVtZW50ICovICkge307CiQuV2lkZ2V0Ll9jaGlsZENvbnN0cnVjdG9ycyA9IFtdOwoKJC5XaWRnZXQucHJvdG90eXBlID0gewoJd2lkZ2V0TmFtZTogIndpZGdldCIsCgl3aWRnZXRFdmVudFByZWZpeDogIiIsCglkZWZhdWx0RWxlbWVudDogIjxkaXY+IiwKCW9wdGlvbnM6IHsKCQlkaXNhYmxlZDogZmFsc2UsCgoJCS8vIGNhbGxiYWNrcwoJCWNyZWF0ZTogbnVsbAoJfSwKCV9jcmVhdGVXaWRnZXQ6IGZ1bmN0aW9uKCBvcHRpb25zLCBlbGVtZW50ICkgewoJCWVsZW1lbnQgPSAkKCBlbGVtZW50IHx8IHRoaXMuZGVmYXVsdEVsZW1lbnQgfHwgdGhpcyApWyAwIF07CgkJdGhpcy5lbGVtZW50ID0gJCggZWxlbWVudCApOwoJCXRoaXMudXVpZCA9IHV1aWQrKzsKCQl0aGlzLmV2ZW50TmFtZXNwYWNlID0gIi4iICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkOwoJCXRoaXMub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sCgkJCXRoaXMub3B0aW9ucywKCQkJdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLAoJCQlvcHRpb25zICk7CgoJCXRoaXMuYmluZGluZ3MgPSAkKCk7CgkJdGhpcy5ob3ZlcmFibGUgPSAkKCk7CgkJdGhpcy5mb2N1c2FibGUgPSAkKCk7CgoJCWlmICggZWxlbWVudCAhPT0gdGhpcyApIHsKCQkJLy8gMS45IEJDIGZvciAjNzgxMAoJCQkvLyBUT0RPIHJlbW92ZSBkdWFsIHN0b3JhZ2UKCQkJJC5kYXRhKCBlbGVtZW50LCB0aGlzLndpZGdldE5hbWUsIHRoaXMgKTsKCQkJJC5kYXRhKCBlbGVtZW50LCB0aGlzLndpZGdldEZ1bGxOYW1lLCB0aGlzICk7CgkJCXRoaXMuX29uKCB0aGlzLmVsZW1lbnQsIHsKCQkJCXJlbW92ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJCWlmICggZXZlbnQudGFyZ2V0ID09PSBlbGVtZW50ICkgewoJCQkJCQl0aGlzLmRlc3Ryb3koKTsKCQkJCQl9CgkJCQl9CgkJCX0pOwoJCQl0aGlzLmRvY3VtZW50ID0gJCggZWxlbWVudC5zdHlsZSA/CgkJCQkvLyBlbGVtZW50IHdpdGhpbiB0aGUgZG9jdW1lbnQKCQkJCWVsZW1lbnQub3duZXJEb2N1bWVudCA6CgkJCQkvLyBlbGVtZW50IGlzIHdpbmRvdyBvciBkb2N1bWVudAoJCQkJZWxlbWVudC5kb2N1bWVudCB8fCBlbGVtZW50ICk7CgkJCXRoaXMud2luZG93ID0gJCggdGhpcy5kb2N1bWVudFswXS5kZWZhdWx0VmlldyB8fCB0aGlzLmRvY3VtZW50WzBdLnBhcmVudFdpbmRvdyApOwoJCX0KCgkJdGhpcy5fY3JlYXRlKCk7CgkJdGhpcy5fdHJpZ2dlciggImNyZWF0ZSIsIG51bGwsIHRoaXMuX2dldENyZWF0ZUV2ZW50RGF0YSgpICk7CgkJdGhpcy5faW5pdCgpOwoJfSwKCV9nZXRDcmVhdGVPcHRpb25zOiAkLm5vb3AsCglfZ2V0Q3JlYXRlRXZlbnREYXRhOiAkLm5vb3AsCglfY3JlYXRlOiAkLm5vb3AsCglfaW5pdDogJC5ub29wLAoKCWRlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCXRoaXMuX2Rlc3Ryb3koKTsKCQkvLyB3ZSBjYW4gcHJvYmFibHkgcmVtb3ZlIHRoZSB1bmJpbmQgY2FsbHMgaW4gMi4wCgkJLy8gYWxsIGV2ZW50IGJpbmRpbmdzIHNob3VsZCBnbyB0aHJvdWdoIHRoaXMuX29uKCkKCQl0aGlzLmVsZW1lbnQKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS8vIDEuOSBCQyBmb3IgIzc4MTAKCQkJLy8gVE9ETyByZW1vdmUgZHVhbCBzdG9yYWdlCgkJCS5yZW1vdmVEYXRhKCB0aGlzLndpZGdldE5hbWUgKQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXRGdWxsTmFtZSApCgkJCS8vIHN1cHBvcnQ6IGpxdWVyeSA8MS42LjMKCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvOTQxMwoJCQkucmVtb3ZlRGF0YSggJC5jYW1lbENhc2UoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKSApOwoJCXRoaXMud2lkZ2V0KCkKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkucmVtb3ZlQ2xhc3MoCgkJCQl0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCAiICsKCQkJCSJ1aS1zdGF0ZS1kaXNhYmxlZCIgKTsKCgkJLy8gY2xlYW4gdXAgZXZlbnRzIGFuZCBzdGF0ZXMKCQl0aGlzLmJpbmRpbmdzLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApOwoJCXRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCX0sCglfZGVzdHJveTogJC5ub29wLAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudDsKCX0sCgoJb3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgb3B0aW9ucyA9IGtleSwKCQkJcGFydHMsCgkJCWN1ck9wdGlvbiwKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQkvLyBkb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2gKCQkJcmV0dXJuICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9ucyApOwoJCX0KCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAic3RyaW5nIiApIHsKCQkJLy8gaGFuZGxlIG5lc3RlZCBrZXlzLCBlLmcuLCAiZm9vLmJhciIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9CgkJCW9wdGlvbnMgPSB7fTsKCQkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiApOwoJCQlrZXkgPSBwYXJ0cy5zaGlmdCgpOwoJCQlpZiAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCWN1ck9wdGlvbiA9IG9wdGlvbnNbIGtleSBdID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zWyBrZXkgXSApOwoJCQkJZm9yICggaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKysgKSB7CgkJCQkJY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXSB8fCB7fTsKCQkJCQljdXJPcHRpb24gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXTsKCQkJCX0KCQkJCWtleSA9IHBhcnRzLnBvcCgpOwoJCQkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVybiBjdXJPcHRpb25bIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VyT3B0aW9uWyBrZXkgXTsKCQkJCX0KCQkJCWN1ck9wdGlvblsga2V5IF0gPSB2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJCQlyZXR1cm4gdGhpcy5vcHRpb25zWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMub3B0aW9uc1sga2V5IF07CgkJCQl9CgkJCQlvcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQl0aGlzLl9zZXRPcHRpb25zKCBvcHRpb25zICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIga2V5OwoKCQlmb3IgKCBrZXkgaW4gb3B0aW9ucyApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCBrZXksIG9wdGlvbnNbIGtleSBdICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLndpZGdldCgpCgkJCQkudG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyAiLWRpc2FibGVkIHVpLXN0YXRlLWRpc2FibGVkIiwgISF2YWx1ZSApCgkJCQkuYXR0ciggImFyaWEtZGlzYWJsZWQiLCB2YWx1ZSApOwoJCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQl0aGlzLmZvY3VzYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWVuYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbiggImRpc2FibGVkIiwgZmFsc2UgKTsKCX0sCglkaXNhYmxlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5fc2V0T3B0aW9uKCAiZGlzYWJsZWQiLCB0cnVlICk7Cgl9LAoKCV9vbjogZnVuY3Rpb24oIGVsZW1lbnQsIGhhbmRsZXJzICkgewoJCXZhciBkZWxlZ2F0ZUVsZW1lbnQsCgkJCWluc3RhbmNlID0gdGhpczsKCQkvLyBubyBlbGVtZW50IGFyZ3VtZW50LCBzaHVmZmxlIGFuZCB1c2UgdGhpcy5lbGVtZW50CgkJaWYgKCAhaGFuZGxlcnMgKSB7CgkJCWhhbmRsZXJzID0gZWxlbWVudDsKCQkJZWxlbWVudCA9IHRoaXMuZWxlbWVudDsKCQkJZGVsZWdhdGVFbGVtZW50ID0gdGhpcy53aWRnZXQoKTsKCQl9IGVsc2UgewoJCQkvLyBhY2NlcHQgc2VsZWN0b3JzLCBET00gZWxlbWVudHMKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCBpbnN0YW5jZS5vcHRpb25zLmRpc2FibGVkID09PSB0cnVlIHx8CgkJCQkJCSQoIHRoaXMgKS5oYXNDbGFzcyggInVpLXN0YXRlLWRpc2FibGVkIiApICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCXJldHVybiAoIHR5cGVvZiBoYW5kbGVyID09PSAic3RyaW5nIiA/IGluc3RhbmNlWyBoYW5kbGVyIF0gOiBoYW5kbGVyICkKCQkJCQkuYXBwbHkoIGluc3RhbmNlLCBhcmd1bWVudHMgKTsKCQkJfQoKCQkJLy8gY29weSB0aGUgZ3VpZCBzbyBkaXJlY3QgdW5iaW5kaW5nIHdvcmtzCgkJCWlmICggdHlwZW9mIGhhbmRsZXIgIT09ICJzdHJpbmciICkgewoJCQkJaGFuZGxlclByb3h5Lmd1aWQgPSBoYW5kbGVyLmd1aWQgPQoJCQkJCWhhbmRsZXIuZ3VpZCB8fCBoYW5kbGVyUHJveHkuZ3VpZCB8fCAkLmd1aWQrKzsKCQkJfQoKCQkJdmFyIG1hdGNoID0gZXZlbnQubWF0Y2goIC9eKFx3KylccyooLiopJC8gKSwKCQkJCWV2ZW50TmFtZSA9IG1hdGNoWzFdICsgaW5zdGFuY2UuZXZlbnROYW1lc3BhY2UsCgkJCQlzZWxlY3RvciA9IG1hdGNoWzJdOwoJCQlpZiAoIHNlbGVjdG9yICkgewoJCQkJZGVsZWdhdGVFbGVtZW50LmRlbGVnYXRlKCBzZWxlY3RvciwgZXZlbnROYW1lLCBoYW5kbGVyUHJveHkgKTsKCQkJfSBlbHNlIHsKCQkJCWVsZW1lbnQuYmluZCggZXZlbnROYW1lLCBoYW5kbGVyUHJveHkgKTsKCQkJfQoJCX0pOwoJfSwKCglfb2ZmOiBmdW5jdGlvbiggZWxlbWVudCwgZXZlbnROYW1lICkgewoJCWV2ZW50TmFtZSA9IChldmVudE5hbWUgfHwgIiIpLnNwbGl0KCAiICIgKS5qb2luKCB0aGlzLmV2ZW50TmFtZXNwYWNlICsgIiAiICkgKyB0aGlzLmV2ZW50TmFtZXNwYWNlOwoJCWVsZW1lbnQudW5iaW5kKCBldmVudE5hbWUgKS51bmRlbGVnYXRlKCBldmVudE5hbWUgKTsKCX0sCgoJX2RlbGF5OiBmdW5jdGlvbiggaGFuZGxlciwgZGVsYXkgKSB7CgkJZnVuY3Rpb24gaGFuZGxlclByb3h5KCkgewoJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkuYXBwbHkoIGluc3RhbmNlLCBhcmd1bWVudHMgKTsKCQl9CgkJdmFyIGluc3RhbmNlID0gdGhpczsKCQlyZXR1cm4gc2V0VGltZW91dCggaGFuZGxlclByb3h5LCBkZWxheSB8fCAwICk7Cgl9LAoKCV9ob3ZlcmFibGU6IGZ1bmN0aW9uKCBlbGVtZW50ICkgewoJCXRoaXMuaG92ZXJhYmxlID0gdGhpcy5ob3ZlcmFibGUuYWRkKCBlbGVtZW50ICk7CgkJdGhpcy5fb24oIGVsZW1lbnQsIHsKCQkJbW91c2VlbnRlcjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLmFkZENsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCX0sCgkJCW1vdXNlbGVhdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV9mb2N1c2FibGU6IGZ1bmN0aW9uKCBlbGVtZW50ICkgewoJCXRoaXMuZm9jdXNhYmxlID0gdGhpcy5mb2N1c2FibGUuYWRkKCBlbGVtZW50ICk7CgkJdGhpcy5fb24oIGVsZW1lbnQsIHsKCQkJZm9jdXNpbjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLmFkZENsYXNzKCAidWktc3RhdGUtZm9jdXMiICk7CgkJCX0sCgkJCWZvY3Vzb3V0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0pOwoJfSwKCglfdHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGV2ZW50LCBkYXRhICkgewoJCXZhciBwcm9wLCBvcmlnLAoJCQljYWxsYmFjayA9IHRoaXMub3B0aW9uc1sgdHlwZSBdOwoKCQlkYXRhID0gZGF0YSB8fCB7fTsKCQlldmVudCA9ICQuRXZlbnQoIGV2ZW50ICk7CgkJZXZlbnQudHlwZSA9ICggdHlwZSA9PT0gdGhpcy53aWRnZXRFdmVudFByZWZpeCA/CgkJCXR5cGUgOgoJCQl0aGlzLndpZGdldEV2ZW50UHJlZml4ICsgdHlwZSApLnRvTG93ZXJDYXNlKCk7CgkJLy8gdGhlIG9yaWdpbmFsIGV2ZW50IG1heSBjb21lIGZyb20gYW55IGVsZW1lbnQKCQkvLyBzbyB3ZSBuZWVkIHRvIHJlc2V0IHRoZSB0YXJnZXQgb24gdGhlIG5ldyBldmVudAoJCWV2ZW50LnRhcmdldCA9IHRoaXMuZWxlbWVudFsgMCBdOwoKCQkvLyBjb3B5IG9yaWdpbmFsIGV2ZW50IHByb3BlcnRpZXMgb3ZlciB0byB0aGUgbmV3IGV2ZW50CgkJb3JpZyA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQ7CgkJaWYgKCBvcmlnICkgewoJCQlmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgkJCQlpZiAoICEoIHByb3AgaW4gZXZlbnQgKSApIHsKCQkJCQlldmVudFsgcHJvcCBdID0gb3JpZ1sgcHJvcCBdOwoJCQkJfQoJCQl9CgkJfQoKCQl0aGlzLmVsZW1lbnQudHJpZ2dlciggZXZlbnQsIGRhdGEgKTsKCQlyZXR1cm4gISggJC5pc0Z1bmN0aW9uKCBjYWxsYmFjayApICYmCgkJCWNhbGxiYWNrLmFwcGx5KCB0aGlzLmVsZW1lbnRbMF0sIFsgZXZlbnQgXS5jb25jYXQoIGRhdGEgKSApID09PSBmYWxzZSB8fAoJCQlldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApOwoJfQp9OwoKJC5lYWNoKCB7IHNob3c6ICJmYWRlSW4iLCBoaWRlOiAiZmFkZU91dCIgfSwgZnVuY3Rpb24oIG1ldGhvZCwgZGVmYXVsdEVmZmVjdCApIHsKCSQuV2lkZ2V0LnByb3RvdHlwZVsgIl8iICsgbWV0aG9kIF0gPSBmdW5jdGlvbiggZWxlbWVudCwgb3B0aW9ucywgY2FsbGJhY2sgKSB7CgkJaWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgKSB7CgkJCW9wdGlvbnMgPSB7IGVmZmVjdDogb3B0aW9ucyB9OwoJCX0KCQl2YXIgaGFzT3B0aW9ucywKCQkJZWZmZWN0TmFtZSA9ICFvcHRpb25zID8KCQkJCW1ldGhvZCA6CgkJCQlvcHRpb25zID09PSB0cnVlIHx8IHR5cGVvZiBvcHRpb25zID09PSAibnVtYmVyIiA/CgkJCQkJZGVmYXVsdEVmZmVjdCA6CgkJCQkJb3B0aW9ucy5lZmZlY3QgfHwgZGVmYXVsdEVmZmVjdDsKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCQlpZiAoIHR5cGVvZiBvcHRpb25zID09PSAibnVtYmVyIiApIHsKCQkJb3B0aW9ucyA9IHsgZHVyYXRpb246IG9wdGlvbnMgfTsKCQl9CgkJaGFzT3B0aW9ucyA9ICEkLmlzRW1wdHlPYmplY3QoIG9wdGlvbnMgKTsKCQlvcHRpb25zLmNvbXBsZXRlID0gY2FsbGJhY2s7CgkJaWYgKCBvcHRpb25zLmRlbGF5ICkgewoJCQllbGVtZW50LmRlbGF5KCBvcHRpb25zLmRlbGF5ICk7CgkJfQoJCWlmICggaGFzT3B0aW9ucyAmJiAkLmVmZmVjdHMgJiYgKCAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gfHwgJC51aUJhY2tDb21wYXQgIT09IGZhbHNlICYmICQuZWZmZWN0c1sgZWZmZWN0TmFtZSBdICkgKSB7CgkJCWVsZW1lbnRbIG1ldGhvZCBdKCBvcHRpb25zICk7CgkJfSBlbHNlIGlmICggZWZmZWN0TmFtZSAhPT0gbWV0aG9kICYmIGVsZW1lbnRbIGVmZmVjdE5hbWUgXSApIHsKCQkJZWxlbWVudFsgZWZmZWN0TmFtZSBdKCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLmVhc2luZywgY2FsbGJhY2sgKTsKCQl9IGVsc2UgewoJCQllbGVtZW50LnF1ZXVlKGZ1bmN0aW9uKCBuZXh0ICkgewoJCQkJJCggdGhpcyApWyBtZXRob2QgXSgpOwoJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQljYWxsYmFjay5jYWxsKCBlbGVtZW50WyAwIF0gKTsKCQkJCX0KCQkJCW5leHQoKTsKCQkJfSk7CgkJfQoJfTsKfSk7CgovLyBERVBSRUNBVEVECmlmICggJC51aUJhY2tDb21wYXQgIT09IGZhbHNlICkgewoJJC5XaWRnZXQucHJvdG90eXBlLl9nZXRDcmVhdGVPcHRpb25zID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuICQubWV0YWRhdGEgJiYgJC5tZXRhZGF0YS5nZXQoIHRoaXMuZWxlbWVudFswXSApWyB0aGlzLndpZGdldE5hbWUgXTsKCX07Cn0KCn0pKTsK]]></data>
	</file>
	<file>
	  <filename>/lib/form.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/form.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSAnanF1ZXJ5LmZvcm0uanMnOwokaW5mb1snZGVwZW5kcyddID0gJ2pxdWVyeSc7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/form.lib/jquery.form.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBGb3JtIFBsdWdpbgogKiB2ZXJzaW9uOiAzLjIzICgxMS1ERUMtMjAxMikKICogQHJlcXVpcmVzIGpRdWVyeSB2MS41IG9yIGxhdGVyCiAqCiAqIEV4YW1wbGVzIGFuZCBkb2N1bWVudGF0aW9uIGF0OiBodHRwOi8vbWFsc3VwLmNvbS9qcXVlcnkvZm9ybS8KICogUHJvamVjdCByZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vbWFsc3VwL2Zvcm0KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXM6CiAqICAgIGh0dHA6Ly9tYWxzdXAuZ2l0aHViLmNvbS9taXQtbGljZW5zZS50eHQKICogICAgaHR0cDovL21hbHN1cC5naXRodWIuY29tL2dwbC1saWNlbnNlLXYyLnR4dAogKi8KLypnbG9iYWwgQWN0aXZlWE9iamVjdCBhbGVydCAqLwo7KGZ1bmN0aW9uKCQpIHsKInVzZSBzdHJpY3QiOwoKLyoKICAgIFVzYWdlIE5vdGU6CiAgICAtLS0tLS0tLS0tLQogICAgRG8gbm90IHVzZSBib3RoIGFqYXhTdWJtaXQgYW5kIGFqYXhGb3JtIG9uIHRoZSBzYW1lIGZvcm0uICBUaGVzZQogICAgZnVuY3Rpb25zIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICBVc2UgYWpheFN1Ym1pdCBpZiB5b3Ugd2FudAogICAgdG8gYmluZCB5b3VyIG93biBzdWJtaXQgaGFuZGxlciB0byB0aGUgZm9ybS4gIEZvciBleGFtcGxlLAoKICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewogICAgICAgICQoJyNteUZvcm0nKS5vbignc3VibWl0JywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIDwtLSBpbXBvcnRhbnQKICAgICAgICAgICAgJCh0aGlzKS5hamF4U3VibWl0KHsKICAgICAgICAgICAgICAgIHRhcmdldDogJyNvdXRwdXQnCiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfSk7CgogICAgVXNlIGFqYXhGb3JtIHdoZW4geW91IHdhbnQgdGhlIHBsdWdpbiB0byBtYW5hZ2UgYWxsIHRoZSBldmVudCBiaW5kaW5nCiAgICBmb3IgeW91LiAgRm9yIGV4YW1wbGUsCgogICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CiAgICAgICAgJCgnI215Rm9ybScpLmFqYXhGb3JtKHsKICAgICAgICAgICAgdGFyZ2V0OiAnI291dHB1dCcKICAgICAgICB9KTsKICAgIH0pOwogICAgCiAgICBZb3UgY2FuIGFsc28gdXNlIGFqYXhGb3JtIHdpdGggZGVsZWdhdGlvbiAocmVxdWlyZXMgalF1ZXJ5IHYxLjcrKSwgc28gdGhlCiAgICBmb3JtIGRvZXMgbm90IGhhdmUgdG8gZXhpc3Qgd2hlbiB5b3UgaW52b2tlIGFqYXhGb3JtOgoKICAgICQoJyNteUZvcm0nKS5hamF4Rm9ybSh7CiAgICAgICAgZGVsZWdhdGlvbjogdHJ1ZSwKICAgICAgICB0YXJnZXQ6ICcjb3V0cHV0JwogICAgfSk7CiAgICAKICAgIFdoZW4gdXNpbmcgYWpheEZvcm0sIHRoZSBhamF4U3VibWl0IGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBmb3IgeW91CiAgICBhdCB0aGUgYXBwcm9wcmlhdGUgdGltZS4KKi8KCi8qKgogKiBGZWF0dXJlIGRldGVjdGlvbgogKi8KdmFyIGZlYXR1cmUgPSB7fTsKZmVhdHVyZS5maWxlYXBpID0gJCgiPGlucHV0IHR5cGU9J2ZpbGUnLz4iKS5nZXQoMCkuZmlsZXMgIT09IHVuZGVmaW5lZDsKZmVhdHVyZS5mb3JtZGF0YSA9IHdpbmRvdy5Gb3JtRGF0YSAhPT0gdW5kZWZpbmVkOwoKLyoqCiAqIGFqYXhTdWJtaXQoKSBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgaW1tZWRpYXRlbHkgc3VibWl0dGluZwogKiBhbiBIVE1MIGZvcm0gdXNpbmcgQUpBWC4KICovCiQuZm4uYWpheFN1Ym1pdCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgIC8qanNoaW50IHNjcmlwdHVybDp0cnVlICovCgogICAgLy8gZmFzdCBmYWlsIGlmIG5vdGhpbmcgc2VsZWN0ZWQgKGh0dHA6Ly9kZXYuanF1ZXJ5LmNvbS90aWNrZXQvMjc1MikKICAgIGlmICghdGhpcy5sZW5ndGgpIHsKICAgICAgICBsb2coJ2FqYXhTdWJtaXQ6IHNraXBwaW5nIHN1Ym1pdCBwcm9jZXNzIC0gbm8gZWxlbWVudCBzZWxlY3RlZCcpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgCiAgICB2YXIgbWV0aG9kLCBhY3Rpb24sIHVybCwgJGZvcm0gPSB0aGlzOwoKICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgb3B0aW9ucyA9IHsgc3VjY2Vzczogb3B0aW9ucyB9OwogICAgfQoKICAgIG1ldGhvZCA9IHRoaXMuYXR0cignbWV0aG9kJyk7CiAgICBhY3Rpb24gPSB0aGlzLmF0dHIoJ2FjdGlvbicpOwogICAgdXJsID0gKHR5cGVvZiBhY3Rpb24gPT09ICdzdHJpbmcnKSA/ICQudHJpbShhY3Rpb24pIDogJyc7CiAgICB1cmwgPSB1cmwgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYgfHwgJyc7CiAgICBpZiAodXJsKSB7CiAgICAgICAgLy8gY2xlYW4gdXJsIChkb24ndCBpbmNsdWRlIGhhc2ggdmF1ZSkKICAgICAgICB1cmwgPSAodXJsLm1hdGNoKC9eKFteI10rKS8pfHxbXSlbMV07CiAgICB9CgogICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHsKICAgICAgICB1cmw6ICB1cmwsCiAgICAgICAgc3VjY2VzczogJC5hamF4U2V0dGluZ3Muc3VjY2VzcywKICAgICAgICB0eXBlOiBtZXRob2QgfHwgJ0dFVCcsCiAgICAgICAgaWZyYW1lU3JjOiAvXmh0dHBzL2kudGVzdCh3aW5kb3cubG9jYXRpb24uaHJlZiB8fCAnJykgPyAnamF2YXNjcmlwdDpmYWxzZScgOiAnYWJvdXQ6YmxhbmsnCiAgICB9LCBvcHRpb25zKTsKCiAgICAvLyBob29rIGZvciBtYW5pcHVsYXRpbmcgdGhlIGZvcm0gZGF0YSBiZWZvcmUgaXQgaXMgZXh0cmFjdGVkOwogICAgLy8gY29udmVuaWVudCBmb3IgdXNlIHdpdGggcmljaCBlZGl0b3JzIGxpa2UgdGlueU1DRSBvciBGQ0tFZGl0b3IKICAgIHZhciB2ZXRvID0ge307CiAgICB0aGlzLnRyaWdnZXIoJ2Zvcm0tcHJlLXNlcmlhbGl6ZScsIFt0aGlzLCBvcHRpb25zLCB2ZXRvXSk7CiAgICBpZiAodmV0by52ZXRvKSB7CiAgICAgICAgbG9nKCdhamF4U3VibWl0OiBzdWJtaXQgdmV0b2VkIHZpYSBmb3JtLXByZS1zZXJpYWxpemUgdHJpZ2dlcicpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIC8vIHByb3ZpZGUgb3Bwb3J0dW5pdHkgdG8gYWx0ZXIgZm9ybSBkYXRhIGJlZm9yZSBpdCBpcyBzZXJpYWxpemVkCiAgICBpZiAob3B0aW9ucy5iZWZvcmVTZXJpYWxpemUgJiYgb3B0aW9ucy5iZWZvcmVTZXJpYWxpemUodGhpcywgb3B0aW9ucykgPT09IGZhbHNlKSB7CiAgICAgICAgbG9nKCdhamF4U3VibWl0OiBzdWJtaXQgYWJvcnRlZCB2aWEgYmVmb3JlU2VyaWFsaXplIGNhbGxiYWNrJyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgdmFyIHRyYWRpdGlvbmFsID0gb3B0aW9ucy50cmFkaXRpb25hbDsKICAgIGlmICggdHJhZGl0aW9uYWwgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICB0cmFkaXRpb25hbCA9ICQuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsOwogICAgfQogICAgCiAgICB2YXIgZWxlbWVudHMgPSBbXTsKICAgIHZhciBxeCwgYSA9IHRoaXMuZm9ybVRvQXJyYXkob3B0aW9ucy5zZW1hbnRpYywgZWxlbWVudHMpOwogICAgaWYgKG9wdGlvbnMuZGF0YSkgewogICAgICAgIG9wdGlvbnMuZXh0cmFEYXRhID0gb3B0aW9ucy5kYXRhOwogICAgICAgIHF4ID0gJC5wYXJhbShvcHRpb25zLmRhdGEsIHRyYWRpdGlvbmFsKTsKICAgIH0KCiAgICAvLyBnaXZlIHByZS1zdWJtaXQgY2FsbGJhY2sgYW4gb3Bwb3J0dW5pdHkgdG8gYWJvcnQgdGhlIHN1Ym1pdAogICAgaWYgKG9wdGlvbnMuYmVmb3JlU3VibWl0ICYmIG9wdGlvbnMuYmVmb3JlU3VibWl0KGEsIHRoaXMsIG9wdGlvbnMpID09PSBmYWxzZSkgewogICAgICAgIGxvZygnYWpheFN1Ym1pdDogc3VibWl0IGFib3J0ZWQgdmlhIGJlZm9yZVN1Ym1pdCBjYWxsYmFjaycpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIC8vIGZpcmUgdmV0b2FibGUgJ3ZhbGlkYXRlJyBldmVudAogICAgdGhpcy50cmlnZ2VyKCdmb3JtLXN1Ym1pdC12YWxpZGF0ZScsIFthLCB0aGlzLCBvcHRpb25zLCB2ZXRvXSk7CiAgICBpZiAodmV0by52ZXRvKSB7CiAgICAgICAgbG9nKCdhamF4U3VibWl0OiBzdWJtaXQgdmV0b2VkIHZpYSBmb3JtLXN1Ym1pdC12YWxpZGF0ZSB0cmlnZ2VyJyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgdmFyIHEgPSAkLnBhcmFtKGEsIHRyYWRpdGlvbmFsKTsKICAgIGlmIChxeCkgewogICAgICAgIHEgPSAoIHEgPyAocSArICcmJyArIHF4KSA6IHF4ICk7CiAgICB9ICAgIAogICAgaWYgKG9wdGlvbnMudHlwZS50b1VwcGVyQ2FzZSgpID09ICdHRVQnKSB7CiAgICAgICAgb3B0aW9ucy51cmwgKz0gKG9wdGlvbnMudXJsLmluZGV4T2YoJz8nKSA+PSAwID8gJyYnIDogJz8nKSArIHE7CiAgICAgICAgb3B0aW9ucy5kYXRhID0gbnVsbDsgIC8vIGRhdGEgaXMgbnVsbCBmb3IgJ2dldCcKICAgIH0KICAgIGVsc2UgewogICAgICAgIG9wdGlvbnMuZGF0YSA9IHE7IC8vIGRhdGEgaXMgdGhlIHF1ZXJ5IHN0cmluZyBmb3IgJ3Bvc3QnCiAgICB9CgogICAgdmFyIGNhbGxiYWNrcyA9IFtdOwogICAgaWYgKG9wdGlvbnMucmVzZXRGb3JtKSB7CiAgICAgICAgY2FsbGJhY2tzLnB1c2goZnVuY3Rpb24oKSB7ICRmb3JtLnJlc2V0Rm9ybSgpOyB9KTsKICAgIH0KICAgIGlmIChvcHRpb25zLmNsZWFyRm9ybSkgewogICAgICAgIGNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uKCkgeyAkZm9ybS5jbGVhckZvcm0ob3B0aW9ucy5pbmNsdWRlSGlkZGVuKTsgfSk7CiAgICB9CgogICAgLy8gcGVyZm9ybSBhIGxvYWQgb24gdGhlIHRhcmdldCBvbmx5IGlmIGRhdGFUeXBlIGlzIG5vdCBwcm92aWRlZAogICAgaWYgKCFvcHRpb25zLmRhdGFUeXBlICYmIG9wdGlvbnMudGFyZ2V0KSB7CiAgICAgICAgdmFyIG9sZFN1Y2Nlc3MgPSBvcHRpb25zLnN1Y2Nlc3MgfHwgZnVuY3Rpb24oKXt9OwogICAgICAgIGNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgdmFyIGZuID0gb3B0aW9ucy5yZXBsYWNlVGFyZ2V0ID8gJ3JlcGxhY2VXaXRoJyA6ICdodG1sJzsKICAgICAgICAgICAgJChvcHRpb25zLnRhcmdldClbZm5dKGRhdGEpLmVhY2gob2xkU3VjY2VzcywgYXJndW1lbnRzKTsKICAgICAgICB9KTsKICAgIH0KICAgIGVsc2UgaWYgKG9wdGlvbnMuc3VjY2VzcykgewogICAgICAgIGNhbGxiYWNrcy5wdXNoKG9wdGlvbnMuc3VjY2Vzcyk7CiAgICB9CgogICAgb3B0aW9ucy5zdWNjZXNzID0gZnVuY3Rpb24oZGF0YSwgc3RhdHVzLCB4aHIpIHsgLy8galF1ZXJ5IDEuNCsgcGFzc2VzIHhociBhcyAzcmQgYXJnCiAgICAgICAgdmFyIGNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQgfHwgdGhpcyA7ICAgIC8vIGpRdWVyeSAxLjQrIHN1cHBvcnRzIHNjb3BlIGNvbnRleHQgCiAgICAgICAgZm9yICh2YXIgaT0wLCBtYXg9Y2FsbGJhY2tzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAgICAgICAgICAgIGNhbGxiYWNrc1tpXS5hcHBseShjb250ZXh0LCBbZGF0YSwgc3RhdHVzLCB4aHIgfHwgJGZvcm0sICRmb3JtXSk7CiAgICAgICAgfQogICAgfTsKCiAgICAvLyBhcmUgdGhlcmUgZmlsZXMgdG8gdXBsb2FkPwoKICAgIC8vIFt2YWx1ZV0gKGlzc3VlICMxMTMpLCBhbHNvIHNlZSBjb21tZW50OgogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hbHN1cC9mb3JtL2NvbW1pdC81ODgzMDZhZWRiYTFkZTAxMzg4MDMyZDVmNDJhNjAxNTllZWE5MjI4I2NvbW1pdGNvbW1lbnQtMjE4MDIxOQogICAgdmFyIGZpbGVJbnB1dHMgPSAkKCdpbnB1dFt0eXBlPWZpbGVdOmVuYWJsZWRbdmFsdWUhPSIiXScsIHRoaXMpOyAKCiAgICB2YXIgaGFzRmlsZUlucHV0cyA9IGZpbGVJbnB1dHMubGVuZ3RoID4gMDsKICAgIHZhciBtcCA9ICdtdWx0aXBhcnQvZm9ybS1kYXRhJzsKICAgIHZhciBtdWx0aXBhcnQgPSAoJGZvcm0uYXR0cignZW5jdHlwZScpID09IG1wIHx8ICRmb3JtLmF0dHIoJ2VuY29kaW5nJykgPT0gbXApOwoKICAgIHZhciBmaWxlQVBJID0gZmVhdHVyZS5maWxlYXBpICYmIGZlYXR1cmUuZm9ybWRhdGE7CiAgICBsb2coImZpbGVBUEkgOiIgKyBmaWxlQVBJKTsKICAgIHZhciBzaG91bGRVc2VGcmFtZSA9IChoYXNGaWxlSW5wdXRzIHx8IG11bHRpcGFydCkgJiYgIWZpbGVBUEk7CgogICAgdmFyIGpxeGhyOwoKICAgIC8vIG9wdGlvbnMuaWZyYW1lIGFsbG93cyB1c2VyIHRvIGZvcmNlIGlmcmFtZSBtb2RlCiAgICAvLyAwNi1OT1YtMDk6IG5vdyBkZWZhdWx0aW5nIHRvIGlmcmFtZSBtb2RlIGlmIGZpbGUgaW5wdXQgaXMgZGV0ZWN0ZWQKICAgIGlmIChvcHRpb25zLmlmcmFtZSAhPT0gZmFsc2UgJiYgKG9wdGlvbnMuaWZyYW1lIHx8IHNob3VsZFVzZUZyYW1lKSkgewogICAgICAgIC8vIGhhY2sgdG8gZml4IFNhZmFyaSBoYW5nICh0aGFua3MgdG8gVGltIE1vbGVuZGlqayBmb3IgdGhpcykKICAgICAgICAvLyBzZWU6ICBodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvanF1ZXJ5LWRldi9icm93c2VfdGhyZWFkL3RocmVhZC8zNjM5NWI3YWI1MTBkZDVkCiAgICAgICAgaWYgKG9wdGlvbnMuY2xvc2VLZWVwQWxpdmUpIHsKICAgICAgICAgICAgJC5nZXQob3B0aW9ucy5jbG9zZUtlZXBBbGl2ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBqcXhociA9IGZpbGVVcGxvYWRJZnJhbWUoYSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAganF4aHIgPSBmaWxlVXBsb2FkSWZyYW1lKGEpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKChoYXNGaWxlSW5wdXRzIHx8IG11bHRpcGFydCkgJiYgZmlsZUFQSSkgewogICAgICAgIGpxeGhyID0gZmlsZVVwbG9hZFhocihhKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGpxeGhyID0gJC5hamF4KG9wdGlvbnMpOwogICAgfQoKICAgICRmb3JtLnJlbW92ZURhdGEoJ2pxeGhyJykuZGF0YSgnanF4aHInLCBqcXhocik7CgogICAgLy8gY2xlYXIgZWxlbWVudCBhcnJheQogICAgZm9yICh2YXIgaz0wOyBrIDwgZWxlbWVudHMubGVuZ3RoOyBrKyspCiAgICAgICAgZWxlbWVudHNba10gPSBudWxsOwoKICAgIC8vIGZpcmUgJ25vdGlmeScgZXZlbnQKICAgIHRoaXMudHJpZ2dlcignZm9ybS1zdWJtaXQtbm90aWZ5JywgW3RoaXMsIG9wdGlvbnNdKTsKICAgIHJldHVybiB0aGlzOwoKICAgIC8vIHV0aWxpdHkgZm4gZm9yIGRlZXAgc2VyaWFsaXphdGlvbgogICAgZnVuY3Rpb24gZGVlcFNlcmlhbGl6ZShleHRyYURhdGEpewogICAgICAgIHZhciBzZXJpYWxpemVkID0gJC5wYXJhbShleHRyYURhdGEpLnNwbGl0KCcmJyk7CiAgICAgICAgdmFyIGxlbiA9IHNlcmlhbGl6ZWQubGVuZ3RoOwogICAgICAgIHZhciByZXN1bHQgPSB7fTsKICAgICAgICB2YXIgaSwgcGFydDsKICAgICAgICBmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIC8vICMyNTI7IHVuZG8gcGFyYW0gc3BhY2UgcmVwbGFjZW1lbnQKICAgICAgICAgICAgc2VyaWFsaXplZFtpXSA9IHNlcmlhbGl6ZWRbaV0ucmVwbGFjZSgvXCsvZywnICcpOwogICAgICAgICAgICBwYXJ0ID0gc2VyaWFsaXplZFtpXS5zcGxpdCgnPScpOwogICAgICAgICAgICByZXN1bHRbZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRbMF0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0WzFdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAgLy8gWE1MSHR0cFJlcXVlc3QgTGV2ZWwgMiBmaWxlIHVwbG9hZHMgKGJpZyBoYXQgdGlwIHRvIGZyYW5jb2lzMm1ldHopCiAgICBmdW5jdGlvbiBmaWxlVXBsb2FkWGhyKGEpIHsKICAgICAgICB2YXIgZm9ybWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKCiAgICAgICAgZm9yICh2YXIgaT0wOyBpIDwgYS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBmb3JtZGF0YS5hcHBlbmQoYVtpXS5uYW1lLCBhW2ldLnZhbHVlKTsKICAgICAgICB9CgogICAgICAgIGlmIChvcHRpb25zLmV4dHJhRGF0YSkgewogICAgICAgICAgICB2YXIgc2VyaWFsaXplZERhdGEgPSBkZWVwU2VyaWFsaXplKG9wdGlvbnMuZXh0cmFEYXRhKTsKICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzZXJpYWxpemVkRGF0YSkKICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVkRGF0YS5oYXNPd25Qcm9wZXJ0eShwKSkKICAgICAgICAgICAgICAgICAgICBmb3JtZGF0YS5hcHBlbmQocCwgc2VyaWFsaXplZERhdGFbcF0pOwogICAgICAgIH0KCiAgICAgICAgb3B0aW9ucy5kYXRhID0gbnVsbDsKCiAgICAgICAgdmFyIHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgJC5hamF4U2V0dGluZ3MsIG9wdGlvbnMsIHsKICAgICAgICAgICAgY29udGVudFR5cGU6IGZhbHNlLAogICAgICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgICAgdHlwZTogbWV0aG9kIHx8ICdQT1NUJwogICAgICAgIH0pOwogICAgICAgIAogICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFByb2dyZXNzKSB7CiAgICAgICAgICAgIC8vIHdvcmthcm91bmQgYmVjYXVzZSBqcVhIUiBkb2VzIG5vdCBleHBvc2UgdXBsb2FkIHByb3BlcnR5CiAgICAgICAgICAgIHMueGhyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgeGhyID0galF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgICAgIGlmICh4aHIudXBsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgeGhyLnVwbG9hZC5vbnByb2dyZXNzID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBlcmNlbnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBldmVudC5sb2FkZWQgfHwgZXZlbnQucG9zaXRpb247IC8qZXZlbnQucG9zaXRpb24gaXMgZGVwcmVjYXRlZCovCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b3RhbCA9IGV2ZW50LnRvdGFsOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudCA9IE1hdGguY2VpbChwb3NpdGlvbiAvIHRvdGFsICogMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFByb2dyZXNzKGV2ZW50LCBwb3NpdGlvbiwgdG90YWwsIHBlcmNlbnQpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4geGhyOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgcy5kYXRhID0gbnVsbDsKICAgICAgICAgICAgdmFyIGJlZm9yZVNlbmQgPSBzLmJlZm9yZVNlbmQ7CiAgICAgICAgICAgIHMuYmVmb3JlU2VuZCA9IGZ1bmN0aW9uKHhociwgbykgewogICAgICAgICAgICAgICAgby5kYXRhID0gZm9ybWRhdGE7CiAgICAgICAgICAgICAgICBpZihiZWZvcmVTZW5kKQogICAgICAgICAgICAgICAgICAgIGJlZm9yZVNlbmQuY2FsbCh0aGlzLCB4aHIsIG8pOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuICQuYWpheChzKTsKICAgIH0KCiAgICAvLyBwcml2YXRlIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBmaWxlIHVwbG9hZHMgKGhhdCB0aXAgdG8gWUFIT08hKQogICAgZnVuY3Rpb24gZmlsZVVwbG9hZElmcmFtZShhKSB7CiAgICAgICAgdmFyIGZvcm0gPSAkZm9ybVswXSwgZWwsIGksIHMsIGcsIGlkLCAkaW8sIGlvLCB4aHIsIHN1YiwgbiwgdGltZWRPdXQsIHRpbWVvdXRIYW5kbGU7CiAgICAgICAgdmFyIHVzZVByb3AgPSAhISQuZm4ucHJvcDsKICAgICAgICB2YXIgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7CgogICAgICAgIGlmICgkKCdbbmFtZT1zdWJtaXRdLFtpZD1zdWJtaXRdJywgZm9ybSkubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGlucHV0IHdpdGggYSBuYW1lIG9yIGlkIG9mICdzdWJtaXQnIHRoZW4gd2Ugd29uJ3QgYmUKICAgICAgICAgICAgLy8gYWJsZSB0byBpbnZva2UgdGhlIHN1Ym1pdCBmbiBvbiB0aGUgZm9ybSAoYXQgbGVhc3Qgbm90IHgtYnJvd3NlcikKICAgICAgICAgICAgYWxlcnQoJ0Vycm9yOiBGb3JtIGVsZW1lbnRzIG11c3Qgbm90IGhhdmUgbmFtZSBvciBpZCBvZiAic3VibWl0Ii4nKTsKICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKGEpIHsKICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgZXZlcnkgc2VyaWFsaXplZCBpbnB1dCBpcyBzdGlsbCBlbmFibGVkCiAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGVsID0gJChlbGVtZW50c1tpXSk7CiAgICAgICAgICAgICAgICBpZiAoIHVzZVByb3AgKQogICAgICAgICAgICAgICAgICAgIGVsLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGVsLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgJC5hamF4U2V0dGluZ3MsIG9wdGlvbnMpOwogICAgICAgIHMuY29udGV4dCA9IHMuY29udGV4dCB8fCBzOwogICAgICAgIGlkID0gJ2pxRm9ybUlPJyArIChuZXcgRGF0ZSgpLmdldFRpbWUoKSk7CiAgICAgICAgaWYgKHMuaWZyYW1lVGFyZ2V0KSB7CiAgICAgICAgICAgICRpbyA9ICQocy5pZnJhbWVUYXJnZXQpOwogICAgICAgICAgICBuID0gJGlvLmF0dHIoJ25hbWUnKTsKICAgICAgICAgICAgaWYgKCFuKQogICAgICAgICAgICAgICAgICRpby5hdHRyKCduYW1lJywgaWQpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBpZCA9IG47CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkaW8gPSAkKCc8aWZyYW1lIG5hbWU9IicgKyBpZCArICciIHNyYz0iJysgcy5pZnJhbWVTcmMgKyciIC8+Jyk7CiAgICAgICAgICAgICRpby5jc3MoeyBwb3NpdGlvbjogJ2Fic29sdXRlJywgdG9wOiAnLTEwMDBweCcsIGxlZnQ6ICctMTAwMHB4JyB9KTsKICAgICAgICB9CiAgICAgICAgaW8gPSAkaW9bMF07CgoKICAgICAgICB4aHIgPSB7IC8vIG1vY2sgb2JqZWN0CiAgICAgICAgICAgIGFib3J0ZWQ6IDAsCiAgICAgICAgICAgIHJlc3BvbnNlVGV4dDogbnVsbCwKICAgICAgICAgICAgcmVzcG9uc2VYTUw6IG51bGwsCiAgICAgICAgICAgIHN0YXR1czogMCwKICAgICAgICAgICAgc3RhdHVzVGV4dDogJ24vYScsCiAgICAgICAgICAgIGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7fSwKICAgICAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCkge30sCiAgICAgICAgICAgIHNldFJlcXVlc3RIZWFkZXI6IGZ1bmN0aW9uKCkge30sCiAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbihzdGF0dXMpIHsKICAgICAgICAgICAgICAgIHZhciBlID0gKHN0YXR1cyA9PT0gJ3RpbWVvdXQnID8gJ3RpbWVvdXQnIDogJ2Fib3J0ZWQnKTsKICAgICAgICAgICAgICAgIGxvZygnYWJvcnRpbmcgdXBsb2FkLi4uICcgKyBlKTsKICAgICAgICAgICAgICAgIHRoaXMuYWJvcnRlZCA9IDE7CgogICAgICAgICAgICAgICAgdHJ5IHsgLy8gIzIxNCwgIzI1NwogICAgICAgICAgICAgICAgICAgIGlmIChpby5jb250ZW50V2luZG93LmRvY3VtZW50LmV4ZWNDb21tYW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlvLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ1N0b3AnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgY2F0Y2goaWdub3JlKSB7fQoKICAgICAgICAgICAgICAgICRpby5hdHRyKCdzcmMnLCBzLmlmcmFtZVNyYyk7IC8vIGFib3J0IG9wIGluIHByb2dyZXNzCiAgICAgICAgICAgICAgICB4aHIuZXJyb3IgPSBlOwogICAgICAgICAgICAgICAgaWYgKHMuZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgcy5lcnJvci5jYWxsKHMuY29udGV4dCwgeGhyLCBlLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgaWYgKGcpCiAgICAgICAgICAgICAgICAgICAgJC5ldmVudC50cmlnZ2VyKCJhamF4RXJyb3IiLCBbeGhyLCBzLCBlXSk7CiAgICAgICAgICAgICAgICBpZiAocy5jb21wbGV0ZSkKICAgICAgICAgICAgICAgICAgICBzLmNvbXBsZXRlLmNhbGwocy5jb250ZXh0LCB4aHIsIGUpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgZyA9IHMuZ2xvYmFsOwogICAgICAgIC8vIHRyaWdnZXIgYWpheCBnbG9iYWwgZXZlbnRzIHNvIHRoYXQgYWN0aXZpdHkvYmxvY2sgaW5kaWNhdG9ycyB3b3JrIGxpa2Ugbm9ybWFsCiAgICAgICAgaWYgKGcgJiYgMCA9PT0gJC5hY3RpdmUrKykgewogICAgICAgICAgICAkLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpOwogICAgICAgIH0KICAgICAgICBpZiAoZykgewogICAgICAgICAgICAkLmV2ZW50LnRyaWdnZXIoImFqYXhTZW5kIiwgW3hociwgc10pOwogICAgICAgIH0KCiAgICAgICAgaWYgKHMuYmVmb3JlU2VuZCAmJiBzLmJlZm9yZVNlbmQuY2FsbChzLmNvbnRleHQsIHhociwgcykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIGlmIChzLmdsb2JhbCkgewogICAgICAgICAgICAgICAgJC5hY3RpdmUtLTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoKTsKICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkOwogICAgICAgIH0KICAgICAgICBpZiAoeGhyLmFib3J0ZWQpIHsKICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9CgogICAgICAgIC8vIGFkZCBzdWJtaXR0aW5nIGVsZW1lbnQgdG8gZGF0YSBpZiB3ZSBrbm93IGl0CiAgICAgICAgc3ViID0gZm9ybS5jbGs7CiAgICAgICAgaWYgKHN1YikgewogICAgICAgICAgICBuID0gc3ViLm5hbWU7CiAgICAgICAgICAgIGlmIChuICYmICFzdWIuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHMuZXh0cmFEYXRhID0gcy5leHRyYURhdGEgfHwge307CiAgICAgICAgICAgICAgICBzLmV4dHJhRGF0YVtuXSA9IHN1Yi52YWx1ZTsKICAgICAgICAgICAgICAgIGlmIChzdWIudHlwZSA9PSAiaW1hZ2UiKSB7CiAgICAgICAgICAgICAgICAgICAgcy5leHRyYURhdGFbbisnLngnXSA9IGZvcm0uY2xrX3g7CiAgICAgICAgICAgICAgICAgICAgcy5leHRyYURhdGFbbisnLnknXSA9IGZvcm0uY2xrX3k7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdmFyIENMSUVOVF9USU1FT1VUX0FCT1JUID0gMTsKICAgICAgICB2YXIgU0VSVkVSX0FCT1JUID0gMjsKCiAgICAgICAgZnVuY3Rpb24gZ2V0RG9jKGZyYW1lKSB7CiAgICAgICAgICAgIHZhciBkb2MgPSBmcmFtZS5jb250ZW50V2luZG93ID8gZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudCA6IGZyYW1lLmNvbnRlbnREb2N1bWVudCA/IGZyYW1lLmNvbnRlbnREb2N1bWVudCA6IGZyYW1lLmRvY3VtZW50OwogICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBSYWlscyBDU1JGIGhhY2sgKHRoYW5rcyB0byBZdmFuIEJhcnRoZWxlbXkpCiAgICAgICAgdmFyIGNzcmZfdG9rZW4gPSAkKCdtZXRhW25hbWU9Y3NyZi10b2tlbl0nKS5hdHRyKCdjb250ZW50Jyk7CiAgICAgICAgdmFyIGNzcmZfcGFyYW0gPSAkKCdtZXRhW25hbWU9Y3NyZi1wYXJhbV0nKS5hdHRyKCdjb250ZW50Jyk7CiAgICAgICAgaWYgKGNzcmZfcGFyYW0gJiYgY3NyZl90b2tlbikgewogICAgICAgICAgICBzLmV4dHJhRGF0YSA9IHMuZXh0cmFEYXRhIHx8IHt9OwogICAgICAgICAgICBzLmV4dHJhRGF0YVtjc3JmX3BhcmFtXSA9IGNzcmZfdG9rZW47CiAgICAgICAgfQoKICAgICAgICAvLyB0YWtlIGEgYnJlYXRoIHNvIHRoYXQgcGVuZGluZyByZXBhaW50cyBnZXQgc29tZSBjcHUgdGltZSBiZWZvcmUgdGhlIHVwbG9hZCBzdGFydHMKICAgICAgICBmdW5jdGlvbiBkb1N1Ym1pdCgpIHsKICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGZvcm0gYXR0cnMgYXJlIHNldAogICAgICAgICAgICB2YXIgdCA9ICRmb3JtLmF0dHIoJ3RhcmdldCcpLCBhID0gJGZvcm0uYXR0cignYWN0aW9uJyk7CgogICAgICAgICAgICAvLyB1cGRhdGUgZm9ybSBhdHRycyBpbiBJRSBmcmllbmRseSB3YXkKICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsaWQpOwogICAgICAgICAgICBpZiAoIW1ldGhvZCkgewogICAgICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ21ldGhvZCcsICdQT1NUJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGEgIT0gcy51cmwpIHsKICAgICAgICAgICAgICAgIGZvcm0uc2V0QXR0cmlidXRlKCdhY3Rpb24nLCBzLnVybCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGllIGJvcmtzIGluIHNvbWUgY2FzZXMgd2hlbiBzZXR0aW5nIGVuY29kaW5nCiAgICAgICAgICAgIGlmICghIHMuc2tpcEVuY29kaW5nT3ZlcnJpZGUgJiYgKCFtZXRob2QgfHwgL3Bvc3QvaS50ZXN0KG1ldGhvZCkpKSB7CiAgICAgICAgICAgICAgICAkZm9ybS5hdHRyKHsKICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzogJ211bHRpcGFydC9mb3JtLWRhdGEnLAogICAgICAgICAgICAgICAgICAgIGVuY3R5cGU6ICAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IHRpbW91dAogICAgICAgICAgICBpZiAocy50aW1lb3V0KSB7CiAgICAgICAgICAgICAgICB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdGltZWRPdXQgPSB0cnVlOyBjYihDTElFTlRfVElNRU9VVF9BQk9SVCk7IH0sIHMudGltZW91dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGxvb2sgZm9yIHNlcnZlciBhYm9ydHMKICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2tTdGF0ZSgpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXRlID0gZ2V0RG9jKGlvKS5yZWFkeVN0YXRlOwogICAgICAgICAgICAgICAgICAgIGxvZygnc3RhdGUgPSAnICsgc3RhdGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAmJiBzdGF0ZS50b0xvd2VyQ2FzZSgpID09ICd1bmluaXRpYWxpemVkJykKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChjaGVja1N0YXRlLDUwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoKGUpIHsKICAgICAgICAgICAgICAgICAgICBsb2coJ1NlcnZlciBhYm9ydDogJyAsIGUsICcgKCcsIGUubmFtZSwgJyknKTsKICAgICAgICAgICAgICAgICAgICBjYihTRVJWRVJfQUJPUlQpOwogICAgICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0SGFuZGxlKQogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgdGltZW91dEhhbmRsZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWRkICJleHRyYSIgZGF0YSB0byBmb3JtIGlmIHByb3ZpZGVkIGluIG9wdGlvbnMKICAgICAgICAgICAgdmFyIGV4dHJhSW5wdXRzID0gW107CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAocy5leHRyYURhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHMuZXh0cmFEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmV4dHJhRGF0YS5oYXNPd25Qcm9wZXJ0eShuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB1c2luZyB0aGUgJC5wYXJhbSBmb3JtYXQgdGhhdCBhbGxvd3MgZm9yIG11bHRpcGxlIHZhbHVlcyB3aXRoIHRoZSBzYW1lIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJC5pc1BsYWluT2JqZWN0KHMuZXh0cmFEYXRhW25dKSAmJiBzLmV4dHJhRGF0YVtuXS5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpICYmIHMuZXh0cmFEYXRhW25dLmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYUlucHV0cy5wdXNoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJytzLmV4dHJhRGF0YVtuXS5uYW1lKyciPicpLmF0dHIoJ3ZhbHVlJyxzLmV4dHJhRGF0YVtuXS52YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSlbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFJbnB1dHMucHVzaCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IicrbisnIj4nKS5hdHRyKCd2YWx1ZScscy5leHRyYURhdGFbbl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKGZvcm0pWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghcy5pZnJhbWVUYXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBhZGQgaWZyYW1lIHRvIGRvYyBhbmQgc3VibWl0IHRoZSBmb3JtCiAgICAgICAgICAgICAgICAgICAgJGlvLmFwcGVuZFRvKCdib2R5Jyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlvLmF0dGFjaEV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICBpby5hdHRhY2hFdmVudCgnb25sb2FkJywgY2IpOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgaW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGNiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGNoZWNrU3RhdGUsMTUpOwogICAgICAgICAgICAgICAgZm9ybS5zdWJtaXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIC8vIHJlc2V0IGF0dHJzIGFuZCByZW1vdmUgImV4dHJhIiBpbnB1dCBlbGVtZW50cwogICAgICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ2FjdGlvbicsYSk7CiAgICAgICAgICAgICAgICBpZih0KSB7CiAgICAgICAgICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsIHQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkZm9ybS5yZW1vdmVBdHRyKCd0YXJnZXQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQoZXh0cmFJbnB1dHMpLnJlbW92ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAocy5mb3JjZVN5bmMpIHsKICAgICAgICAgICAgZG9TdWJtaXQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZG9TdWJtaXQsIDEwKTsgLy8gdGhpcyBsZXRzIGRvbSB1cGRhdGVzIHJlbmRlcgogICAgICAgIH0KCiAgICAgICAgdmFyIGRhdGEsIGRvYywgZG9tQ2hlY2tDb3VudCA9IDUwLCBjYWxsYmFja1Byb2Nlc3NlZDsKCiAgICAgICAgZnVuY3Rpb24gY2IoZSkgewogICAgICAgICAgICBpZiAoeGhyLmFib3J0ZWQgfHwgY2FsbGJhY2tQcm9jZXNzZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZG9jID0gZ2V0RG9jKGlvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChleCkgewogICAgICAgICAgICAgICAgbG9nKCdjYW5ub3QgYWNjZXNzIHJlc3BvbnNlIGRvY3VtZW50OiAnLCBleCk7CiAgICAgICAgICAgICAgICBlID0gU0VSVkVSX0FCT1JUOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlID09PSBDTElFTlRfVElNRU9VVF9BQk9SVCAmJiB4aHIpIHsKICAgICAgICAgICAgICAgIHhoci5hYm9ydCgndGltZW91dCcpOwogICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KHhociwgJ3RpbWVvdXQnKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChlID09IFNFUlZFUl9BQk9SVCAmJiB4aHIpIHsKICAgICAgICAgICAgICAgIHhoci5hYm9ydCgnc2VydmVyIGFib3J0Jyk7CiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoeGhyLCAnZXJyb3InLCAnc2VydmVyIGFib3J0Jyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghZG9jIHx8IGRvYy5sb2NhdGlvbi5ocmVmID09IHMuaWZyYW1lU3JjKSB7CiAgICAgICAgICAgICAgICAvLyByZXNwb25zZSBub3QgcmVjZWl2ZWQgeWV0CiAgICAgICAgICAgICAgICBpZiAoIXRpbWVkT3V0KQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaW8uZGV0YWNoRXZlbnQpCiAgICAgICAgICAgICAgICBpby5kZXRhY2hFdmVudCgnb25sb2FkJywgY2IpOwogICAgICAgICAgICBlbHNlICAgIAogICAgICAgICAgICAgICAgaW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIGNiLCBmYWxzZSk7CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gJ3N1Y2Nlc3MnLCBlcnJNc2c7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAodGltZWRPdXQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAndGltZW91dCc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGlzWG1sID0gcy5kYXRhVHlwZSA9PSAneG1sJyB8fCBkb2MuWE1MRG9jdW1lbnQgfHwgJC5pc1hNTERvYyhkb2MpOwogICAgICAgICAgICAgICAgbG9nKCdpc1htbD0nK2lzWG1sKTsKICAgICAgICAgICAgICAgIGlmICghaXNYbWwgJiYgd2luZG93Lm9wZXJhICYmIChkb2MuYm9keSA9PT0gbnVsbCB8fCAhZG9jLmJvZHkuaW5uZXJIVE1MKSkgewogICAgICAgICAgICAgICAgICAgIGlmICgtLWRvbUNoZWNrQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gc29tZSBicm93c2VycyAoT3BlcmEpIHRoZSBpZnJhbWUgRE9NIGlzIG5vdCBhbHdheXMgdHJhdmVyc2FibGUgd2hlbgogICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb25sb2FkIGNhbGxiYWNrIGZpcmVzLCBzbyB3ZSBsb29wIGEgYml0IHRvIGFjY29tbW9kYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygncmVxdWVpbmcgb25Mb2FkIGNhbGxiYWNrLCBET00gbm90IGF2YWlsYWJsZScpOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGNiLCAyNTApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIGxldCB0aGlzIGZhbGwgdGhyb3VnaCBiZWNhdXNlIHNlcnZlciByZXNwb25zZSBjb3VsZCBiZSBhbiBlbXB0eSBkb2N1bWVudAogICAgICAgICAgICAgICAgICAgIC8vbG9nKCdDb3VsZCBub3QgYWNjZXNzIGlmcmFtZSBET00gYWZ0ZXIgbXV0aXBsZSB0cmllcy4nKTsKICAgICAgICAgICAgICAgICAgICAvL3Rocm93ICdET01FeGNlcHRpb246IG5vdCBhdmFpbGFibGUnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vbG9nKCdyZXNwb25zZSBkZXRlY3RlZCcpOwogICAgICAgICAgICAgICAgdmFyIGRvY1Jvb3QgPSBkb2MuYm9keSA/IGRvYy5ib2R5IDogZG9jLmRvY3VtZW50RWxlbWVudDsKICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVRleHQgPSBkb2NSb290ID8gZG9jUm9vdC5pbm5lckhUTUwgOiBudWxsOwogICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlWE1MID0gZG9jLlhNTERvY3VtZW50ID8gZG9jLlhNTERvY3VtZW50IDogZG9jOwogICAgICAgICAgICAgICAgaWYgKGlzWG1sKQogICAgICAgICAgICAgICAgICAgIHMuZGF0YVR5cGUgPSAneG1sJzsKICAgICAgICAgICAgICAgIHhoci5nZXRSZXNwb25zZUhlYWRlciA9IGZ1bmN0aW9uKGhlYWRlcil7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhlYWRlcnMgPSB7J2NvbnRlbnQtdHlwZSc6IHMuZGF0YVR5cGV9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBoZWFkZXJzW2hlYWRlcl07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgWEhSICdzdGF0dXMnICYgJ3N0YXR1c1RleHQnIGVtdWxhdGlvbiA6CiAgICAgICAgICAgICAgICBpZiAoZG9jUm9vdCkgewogICAgICAgICAgICAgICAgICAgIHhoci5zdGF0dXMgPSBOdW1iZXIoIGRvY1Jvb3QuZ2V0QXR0cmlidXRlKCdzdGF0dXMnKSApIHx8IHhoci5zdGF0dXM7CiAgICAgICAgICAgICAgICAgICAgeGhyLnN0YXR1c1RleHQgPSBkb2NSb290LmdldEF0dHJpYnV0ZSgnc3RhdHVzVGV4dCcpIHx8IHhoci5zdGF0dXNUZXh0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBkdCA9IChzLmRhdGFUeXBlIHx8ICcnKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgdmFyIHNjciA9IC8oanNvbnxzY3JpcHR8dGV4dCkvLnRlc3QoZHQpOwogICAgICAgICAgICAgICAgaWYgKHNjciB8fCBzLnRleHRhcmVhKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGlmIHVzZXIgZW1iZWRkZWQgcmVzcG9uc2UgaW4gdGV4dGFyZWEKICAgICAgICAgICAgICAgICAgICB2YXIgdGEgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RleHRhcmVhJylbMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVRleHQgPSB0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgWEhSICdzdGF0dXMnICYgJ3N0YXR1c1RleHQnIGVtdWxhdGlvbiA6CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zdGF0dXMgPSBOdW1iZXIoIHRhLmdldEF0dHJpYnV0ZSgnc3RhdHVzJykgKSB8fCB4aHIuc3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIuc3RhdHVzVGV4dCA9IHRhLmdldEF0dHJpYnV0ZSgnc3RhdHVzVGV4dCcpIHx8IHhoci5zdGF0dXNUZXh0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzY3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjb3VudCBmb3IgYnJvd3NlcnMgaW5qZWN0aW5nIHByZSBhcm91bmQganNvbiByZXNwb25zZQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJlID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwcmUnKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVGV4dCA9IHByZS50ZXh0Q29udGVudCA/IHByZS50ZXh0Q29udGVudCA6IHByZS5pbm5lclRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVGV4dCA9IGIudGV4dENvbnRlbnQgPyBiLnRleHRDb250ZW50IDogYi5pbm5lclRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChkdCA9PSAneG1sJyAmJiAheGhyLnJlc3BvbnNlWE1MICYmIHhoci5yZXNwb25zZVRleHQpIHsKICAgICAgICAgICAgICAgICAgICB4aHIucmVzcG9uc2VYTUwgPSB0b1htbCh4aHIucmVzcG9uc2VUZXh0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBodHRwRGF0YSh4aHIsIGR0LCBzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ3BhcnNlcmVycm9yJzsKICAgICAgICAgICAgICAgICAgICB4aHIuZXJyb3IgPSBlcnJNc2cgPSAoZSB8fCBzdGF0dXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBsb2coJ2Vycm9yIGNhdWdodDogJyxlKTsKICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdlcnJvcic7CiAgICAgICAgICAgICAgICB4aHIuZXJyb3IgPSBlcnJNc2cgPSAoZSB8fCBzdGF0dXMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoeGhyLmFib3J0ZWQpIHsKICAgICAgICAgICAgICAgIGxvZygndXBsb2FkIGFib3J0ZWQnKTsKICAgICAgICAgICAgICAgIHN0YXR1cyA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzKSB7IC8vIHdlJ3ZlIHNldCB4aHIuc3RhdHVzCiAgICAgICAgICAgICAgICBzdGF0dXMgPSAoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCB8fCB4aHIuc3RhdHVzID09PSAzMDQpID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb3JkZXJpbmcgb2YgdGhlc2UgY2FsbGJhY2tzL3RyaWdnZXJzIGlzIG9kZCwgYnV0IHRoYXQncyBob3cgJC5hamF4IGRvZXMgaXQKICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7CiAgICAgICAgICAgICAgICBpZiAocy5zdWNjZXNzKQogICAgICAgICAgICAgICAgICAgIHMuc3VjY2Vzcy5jYWxsKHMuY29udGV4dCwgZGF0YSwgJ3N1Y2Nlc3MnLCB4aHIpOwogICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh4aHIucmVzcG9uc2VUZXh0LCAnc3VjY2VzcycsIHhocik7CiAgICAgICAgICAgICAgICBpZiAoZykKICAgICAgICAgICAgICAgICAgICAkLmV2ZW50LnRyaWdnZXIoImFqYXhTdWNjZXNzIiwgW3hociwgc10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXR1cykgewogICAgICAgICAgICAgICAgaWYgKGVyck1zZyA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICAgICAgICAgIGVyck1zZyA9IHhoci5zdGF0dXNUZXh0OwogICAgICAgICAgICAgICAgaWYgKHMuZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgcy5lcnJvci5jYWxsKHMuY29udGV4dCwgeGhyLCBzdGF0dXMsIGVyck1zZyk7CiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoeGhyLCAnZXJyb3InLCBlcnJNc2cpOwogICAgICAgICAgICAgICAgaWYgKGcpCiAgICAgICAgICAgICAgICAgICAgJC5ldmVudC50cmlnZ2VyKCJhamF4RXJyb3IiLCBbeGhyLCBzLCBlcnJNc2ddKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGcpCiAgICAgICAgICAgICAgICAkLmV2ZW50LnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsIFt4aHIsIHNdKTsKCiAgICAgICAgICAgIGlmIChnICYmICEgLS0kLmFjdGl2ZSkgewogICAgICAgICAgICAgICAgJC5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocy5jb21wbGV0ZSkKICAgICAgICAgICAgICAgIHMuY29tcGxldGUuY2FsbChzLmNvbnRleHQsIHhociwgc3RhdHVzKTsKCiAgICAgICAgICAgIGNhbGxiYWNrUHJvY2Vzc2VkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKHMudGltZW91dCkKICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlKTsKCiAgICAgICAgICAgIC8vIGNsZWFuIHVwCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoIXMuaWZyYW1lVGFyZ2V0KQogICAgICAgICAgICAgICAgICAgICRpby5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVhNTCA9IG51bGw7CiAgICAgICAgICAgIH0sIDEwMCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgdG9YbWwgPSAkLnBhcnNlWE1MIHx8IGZ1bmN0aW9uKHMsIGRvYykgeyAvLyB1c2UgcGFyc2VYTUwgaWYgYXZhaWxhYmxlIChqUXVlcnkgMS41KykKICAgICAgICAgICAgaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7CiAgICAgICAgICAgICAgICBkb2MgPSBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTERPTScpOwogICAgICAgICAgICAgICAgZG9jLmFzeW5jID0gJ2ZhbHNlJzsKICAgICAgICAgICAgICAgIGRvYy5sb2FkWE1MKHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZG9jID0gKG5ldyBET01QYXJzZXIoKSkucGFyc2VGcm9tU3RyaW5nKHMsICd0ZXh0L3htbCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAoZG9jICYmIGRvYy5kb2N1bWVudEVsZW1lbnQgJiYgZG9jLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPSAncGFyc2VyZXJyb3InKSA/IGRvYyA6IG51bGw7CiAgICAgICAgfTsKICAgICAgICB2YXIgcGFyc2VKU09OID0gJC5wYXJzZUpTT04gfHwgZnVuY3Rpb24ocykgewogICAgICAgICAgICAvKmpzbGludCBldmlsOnRydWUgKi8KICAgICAgICAgICAgcmV0dXJuIHdpbmRvd1snZXZhbCddKCcoJyArIHMgKyAnKScpOwogICAgICAgIH07CgogICAgICAgIHZhciBodHRwRGF0YSA9IGZ1bmN0aW9uKCB4aHIsIHR5cGUsIHMgKSB7IC8vIG1vc3RseSBsaWZ0ZWQgZnJvbSBqcTEuNC40CgogICAgICAgICAgICB2YXIgY3QgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ2NvbnRlbnQtdHlwZScpIHx8ICcnLAogICAgICAgICAgICAgICAgeG1sID0gdHlwZSA9PT0gJ3htbCcgfHwgIXR5cGUgJiYgY3QuaW5kZXhPZigneG1sJykgPj0gMCwKICAgICAgICAgICAgICAgIGRhdGEgPSB4bWwgPyB4aHIucmVzcG9uc2VYTUwgOiB4aHIucmVzcG9uc2VUZXh0OwoKICAgICAgICAgICAgaWYgKHhtbCAmJiBkYXRhLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSA9PT0gJ3BhcnNlcmVycm9yJykgewogICAgICAgICAgICAgICAgaWYgKCQuZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgJC5lcnJvcigncGFyc2VyZXJyb3InKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocyAmJiBzLmRhdGFGaWx0ZXIpIHsKICAgICAgICAgICAgICAgIGRhdGEgPSBzLmRhdGFGaWx0ZXIoZGF0YSwgdHlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdqc29uJyB8fCAhdHlwZSAmJiBjdC5pbmRleE9mKCdqc29uJykgPj0gMCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBwYXJzZUpTT04oZGF0YSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJzY3JpcHQiIHx8ICF0eXBlICYmIGN0LmluZGV4T2YoImphdmFzY3JpcHQiKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgJC5nbG9iYWxFdmFsKGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH07CgogICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgIH0KfTsKCi8qKgogKiBhamF4Rm9ybSgpIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBmdWxseSBhdXRvbWF0aW5nIGZvcm0gc3VibWlzc2lvbi4KICoKICogVGhlIGFkdmFudGFnZXMgb2YgdXNpbmcgdGhpcyBtZXRob2QgaW5zdGVhZCBvZiBhamF4U3VibWl0KCkgYXJlOgogKgogKiAxOiBUaGlzIG1ldGhvZCB3aWxsIGluY2x1ZGUgY29vcmRpbmF0ZXMgZm9yIDxpbnB1dCB0eXBlPSJpbWFnZSIgLz4gZWxlbWVudHMgKGlmIHRoZSBlbGVtZW50CiAqICAgIGlzIHVzZWQgdG8gc3VibWl0IHRoZSBmb3JtKS4KICogMi4gVGhpcyBtZXRob2Qgd2lsbCBpbmNsdWRlIHRoZSBzdWJtaXQgZWxlbWVudCdzIG5hbWUvdmFsdWUgZGF0YSAoZm9yIHRoZSBlbGVtZW50IHRoYXQgd2FzCiAqICAgIHVzZWQgdG8gc3VibWl0IHRoZSBmb3JtKS4KICogMy4gVGhpcyBtZXRob2QgYmluZHMgdGhlIHN1Ym1pdCgpIG1ldGhvZCB0byB0aGUgZm9ybSBmb3IgeW91LgogKgogKiBUaGUgb3B0aW9ucyBhcmd1bWVudCBmb3IgYWpheEZvcm0gd29ya3MgZXhhY3RseSBhcyBpdCBkb2VzIGZvciBhamF4U3VibWl0LiAgYWpheEZvcm0gbWVyZWx5CiAqIHBhc3NlcyB0aGUgb3B0aW9ucyBhcmd1bWVudCBhbG9uZyBhZnRlciBwcm9wZXJseSBiaW5kaW5nIGV2ZW50cyBmb3Igc3VibWl0IGVsZW1lbnRzIGFuZAogKiB0aGUgZm9ybSBpdHNlbGYuCiAqLwokLmZuLmFqYXhGb3JtID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICBvcHRpb25zLmRlbGVnYXRpb24gPSBvcHRpb25zLmRlbGVnYXRpb24gJiYgJC5pc0Z1bmN0aW9uKCQuZm4ub24pOwogICAgCiAgICAvLyBpbiBqUXVlcnkgMS4zKyB3ZSBjYW4gZml4IG1pc3Rha2VzIHdpdGggdGhlIHJlYWR5IHN0YXRlCiAgICBpZiAoIW9wdGlvbnMuZGVsZWdhdGlvbiAmJiB0aGlzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHZhciBvID0geyBzOiB0aGlzLnNlbGVjdG9yLCBjOiB0aGlzLmNvbnRleHQgfTsKICAgICAgICBpZiAoISQuaXNSZWFkeSAmJiBvLnMpIHsKICAgICAgICAgICAgbG9nKCdET00gbm90IHJlYWR5LCBxdWV1aW5nIGFqYXhGb3JtJyk7CiAgICAgICAgICAgICQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKG8ucyxvLmMpLmFqYXhGb3JtKG9wdGlvbnMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIC8vIGlzIHlvdXIgRE9NIHJlYWR5PyAgaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9UdXRvcmlhbHM6SW50cm9kdWNpbmdfJChkb2N1bWVudCkucmVhZHkoKQogICAgICAgIGxvZygndGVybWluYXRpbmc7IHplcm8gZWxlbWVudHMgZm91bmQgYnkgc2VsZWN0b3InICsgKCQuaXNSZWFkeSA/ICcnIDogJyAoRE9NIG5vdCByZWFkeSknKSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgaWYgKCBvcHRpb25zLmRlbGVnYXRpb24gKSB7CiAgICAgICAgJChkb2N1bWVudCkKICAgICAgICAgICAgLm9mZignc3VibWl0LmZvcm0tcGx1Z2luJywgdGhpcy5zZWxlY3RvciwgZG9BamF4U3VibWl0KQogICAgICAgICAgICAub2ZmKCdjbGljay5mb3JtLXBsdWdpbicsIHRoaXMuc2VsZWN0b3IsIGNhcHR1cmVTdWJtaXR0aW5nRWxlbWVudCkKICAgICAgICAgICAgLm9uKCdzdWJtaXQuZm9ybS1wbHVnaW4nLCB0aGlzLnNlbGVjdG9yLCBvcHRpb25zLCBkb0FqYXhTdWJtaXQpCiAgICAgICAgICAgIC5vbignY2xpY2suZm9ybS1wbHVnaW4nLCB0aGlzLnNlbGVjdG9yLCBvcHRpb25zLCBjYXB0dXJlU3VibWl0dGluZ0VsZW1lbnQpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIHJldHVybiB0aGlzLmFqYXhGb3JtVW5iaW5kKCkKICAgICAgICAuYmluZCgnc3VibWl0LmZvcm0tcGx1Z2luJywgb3B0aW9ucywgZG9BamF4U3VibWl0KQogICAgICAgIC5iaW5kKCdjbGljay5mb3JtLXBsdWdpbicsIG9wdGlvbnMsIGNhcHR1cmVTdWJtaXR0aW5nRWxlbWVudCk7Cn07CgovLyBwcml2YXRlIGV2ZW50IGhhbmRsZXJzICAgIApmdW5jdGlvbiBkb0FqYXhTdWJtaXQoZSkgewogICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi8KICAgIHZhciBvcHRpb25zID0gZS5kYXRhOwogICAgaWYgKCFlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7IC8vIGlmIGV2ZW50IGhhcyBiZWVuIGNhbmNlbGVkLCBkb24ndCBwcm9jZWVkCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICQodGhpcykuYWpheFN1Ym1pdChvcHRpb25zKTsKICAgIH0KfQogICAgCmZ1bmN0aW9uIGNhcHR1cmVTdWJtaXR0aW5nRWxlbWVudChlKSB7CiAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqLwogICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0OwogICAgdmFyICRlbCA9ICQodGFyZ2V0KTsKICAgIGlmICghKCRlbC5pcygiW3R5cGU9c3VibWl0XSxbdHlwZT1pbWFnZV0iKSkpIHsKICAgICAgICAvLyBpcyB0aGlzIGEgY2hpbGQgZWxlbWVudCBvZiB0aGUgc3VibWl0IGVsPyAgKGV4OiBhIHNwYW4gd2l0aGluIGEgYnV0dG9uKQogICAgICAgIHZhciB0ID0gJGVsLmNsb3Nlc3QoJ1t0eXBlPXN1Ym1pdF0nKTsKICAgICAgICBpZiAodC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0YXJnZXQgPSB0WzBdOwogICAgfQogICAgdmFyIGZvcm0gPSB0aGlzOwogICAgZm9ybS5jbGsgPSB0YXJnZXQ7CiAgICBpZiAodGFyZ2V0LnR5cGUgPT0gJ2ltYWdlJykgewogICAgICAgIGlmIChlLm9mZnNldFggIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBmb3JtLmNsa194ID0gZS5vZmZzZXRYOwogICAgICAgICAgICBmb3JtLmNsa195ID0gZS5vZmZzZXRZOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mICQuZm4ub2Zmc2V0ID09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgdmFyIG9mZnNldCA9ICRlbC5vZmZzZXQoKTsKICAgICAgICAgICAgZm9ybS5jbGtfeCA9IGUucGFnZVggLSBvZmZzZXQubGVmdDsKICAgICAgICAgICAgZm9ybS5jbGtfeSA9IGUucGFnZVkgLSBvZmZzZXQudG9wOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvcm0uY2xrX3ggPSBlLnBhZ2VYIC0gdGFyZ2V0Lm9mZnNldExlZnQ7CiAgICAgICAgICAgIGZvcm0uY2xrX3kgPSBlLnBhZ2VZIC0gdGFyZ2V0Lm9mZnNldFRvcDsKICAgICAgICB9CiAgICB9CiAgICAvLyBjbGVhciBmb3JtIHZhcnMKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGZvcm0uY2xrID0gZm9ybS5jbGtfeCA9IGZvcm0uY2xrX3kgPSBudWxsOyB9LCAxMDApOwp9CgoKLy8gYWpheEZvcm1VbmJpbmQgdW5iaW5kcyB0aGUgZXZlbnQgaGFuZGxlcnMgdGhhdCB3ZXJlIGJvdW5kIGJ5IGFqYXhGb3JtCiQuZm4uYWpheEZvcm1VbmJpbmQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnVuYmluZCgnc3VibWl0LmZvcm0tcGx1Z2luIGNsaWNrLmZvcm0tcGx1Z2luJyk7Cn07CgovKioKICogZm9ybVRvQXJyYXkoKSBnYXRoZXJzIGZvcm0gZWxlbWVudCBkYXRhIGludG8gYW4gYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IGNhbgogKiBiZSBwYXNzZWQgdG8gYW55IG9mIHRoZSBmb2xsb3dpbmcgYWpheCBmdW5jdGlvbnM6ICQuZ2V0LCAkLnBvc3QsIG9yIGxvYWQuCiAqIEVhY2ggb2JqZWN0IGluIHRoZSBhcnJheSBoYXMgYm90aCBhICduYW1lJyBhbmQgJ3ZhbHVlJyBwcm9wZXJ0eS4gIEFuIGV4YW1wbGUgb2YKICogYW4gYXJyYXkgZm9yIGEgc2ltcGxlIGxvZ2luIGZvcm0gbWlnaHQgYmU6CiAqCiAqIFsgeyBuYW1lOiAndXNlcm5hbWUnLCB2YWx1ZTogJ2pyZXNpZycgfSwgeyBuYW1lOiAncGFzc3dvcmQnLCB2YWx1ZTogJ3NlY3JldCcgfSBdCiAqCiAqIEl0IGlzIHRoaXMgYXJyYXkgdGhhdCBpcyBwYXNzZWQgdG8gcHJlLXN1Ym1pdCBjYWxsYmFjayBmdW5jdGlvbnMgcHJvdmlkZWQgdG8gdGhlCiAqIGFqYXhTdWJtaXQoKSBhbmQgYWpheEZvcm0oKSBtZXRob2RzLgogKi8KJC5mbi5mb3JtVG9BcnJheSA9IGZ1bmN0aW9uKHNlbWFudGljLCBlbGVtZW50cykgewogICAgdmFyIGEgPSBbXTsKICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybiBhOwogICAgfQoKICAgIHZhciBmb3JtID0gdGhpc1swXTsKICAgIHZhciBlbHMgPSBzZW1hbnRpYyA/IGZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKSA6IGZvcm0uZWxlbWVudHM7CiAgICBpZiAoIWVscykgewogICAgICAgIHJldHVybiBhOwogICAgfQoKICAgIHZhciBpLGosbix2LGVsLG1heCxqbWF4OwogICAgZm9yKGk9MCwgbWF4PWVscy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogICAgICAgIGVsID0gZWxzW2ldOwogICAgICAgIG4gPSBlbC5uYW1lOwogICAgICAgIGlmICghbikgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGlmIChzZW1hbnRpYyAmJiBmb3JtLmNsayAmJiBlbC50eXBlID09ICJpbWFnZSIpIHsKICAgICAgICAgICAgLy8gaGFuZGxlIGltYWdlIGlucHV0cyBvbiB0aGUgZmx5IHdoZW4gc2VtYW50aWMgPT0gdHJ1ZQogICAgICAgICAgICBpZighZWwuZGlzYWJsZWQgJiYgZm9ybS5jbGsgPT0gZWwpIHsKICAgICAgICAgICAgICAgIGEucHVzaCh7bmFtZTogbiwgdmFsdWU6ICQoZWwpLnZhbCgpLCB0eXBlOiBlbC50eXBlIH0pOwogICAgICAgICAgICAgICAgYS5wdXNoKHtuYW1lOiBuKycueCcsIHZhbHVlOiBmb3JtLmNsa194fSwge25hbWU6IG4rJy55JywgdmFsdWU6IGZvcm0uY2xrX3l9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIHYgPSAkLmZpZWxkVmFsdWUoZWwsIHRydWUpOwogICAgICAgIGlmICh2ICYmIHYuY29uc3RydWN0b3IgPT0gQXJyYXkpIHsKICAgICAgICAgICAgaWYgKGVsZW1lbnRzKSAKICAgICAgICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWwpOwogICAgICAgICAgICBmb3Ioaj0wLCBqbWF4PXYubGVuZ3RoOyBqIDwgam1heDsgaisrKSB7CiAgICAgICAgICAgICAgICBhLnB1c2goe25hbWU6IG4sIHZhbHVlOiB2W2pdfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZmVhdHVyZS5maWxlYXBpICYmIGVsLnR5cGUgPT0gJ2ZpbGUnICYmICFlbC5kaXNhYmxlZCkgewogICAgICAgICAgICBpZiAoZWxlbWVudHMpIAogICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaChlbCk7CiAgICAgICAgICAgIHZhciBmaWxlcyA9IGVsLmZpbGVzOwogICAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IGZpbGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgYS5wdXNoKHtuYW1lOiBuLCB2YWx1ZTogZmlsZXNbal0sIHR5cGU6IGVsLnR5cGV9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vICMxODAKICAgICAgICAgICAgICAgIGEucHVzaCh7IG5hbWU6IG4sIHZhbHVlOiAnJywgdHlwZTogZWwudHlwZSB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh2ICE9PSBudWxsICYmIHR5cGVvZiB2ICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIGlmIChlbGVtZW50cykgCiAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKGVsKTsKICAgICAgICAgICAgYS5wdXNoKHtuYW1lOiBuLCB2YWx1ZTogdiwgdHlwZTogZWwudHlwZSwgcmVxdWlyZWQ6IGVsLnJlcXVpcmVkfSk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghc2VtYW50aWMgJiYgZm9ybS5jbGspIHsKICAgICAgICAvLyBpbnB1dCB0eXBlPT0naW1hZ2UnIGFyZSBub3QgZm91bmQgaW4gZWxlbWVudHMgYXJyYXkhIGhhbmRsZSBpdCBoZXJlCiAgICAgICAgdmFyICRpbnB1dCA9ICQoZm9ybS5jbGspLCBpbnB1dCA9ICRpbnB1dFswXTsKICAgICAgICBuID0gaW5wdXQubmFtZTsKICAgICAgICBpZiAobiAmJiAhaW5wdXQuZGlzYWJsZWQgJiYgaW5wdXQudHlwZSA9PSAnaW1hZ2UnKSB7CiAgICAgICAgICAgIGEucHVzaCh7bmFtZTogbiwgdmFsdWU6ICRpbnB1dC52YWwoKX0pOwogICAgICAgICAgICBhLnB1c2goe25hbWU6IG4rJy54JywgdmFsdWU6IGZvcm0uY2xrX3h9LCB7bmFtZTogbisnLnknLCB2YWx1ZTogZm9ybS5jbGtfeX0pOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBhOwp9OwoKLyoqCiAqIFNlcmlhbGl6ZXMgZm9ybSBkYXRhIGludG8gYSAnc3VibWl0dGFibGUnIHN0cmluZy4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBzdHJpbmcKICogaW4gdGhlIGZvcm1hdDogbmFtZTE9dmFsdWUxJmFtcDtuYW1lMj12YWx1ZTIKICovCiQuZm4uZm9ybVNlcmlhbGl6ZSA9IGZ1bmN0aW9uKHNlbWFudGljKSB7CiAgICAvL2hhbmQgb2ZmIHRvIGpRdWVyeS5wYXJhbSBmb3IgcHJvcGVyIGVuY29kaW5nCiAgICByZXR1cm4gJC5wYXJhbSh0aGlzLmZvcm1Ub0FycmF5KHNlbWFudGljKSk7Cn07CgovKioKICogU2VyaWFsaXplcyBhbGwgZmllbGQgZWxlbWVudHMgaW4gdGhlIGpRdWVyeSBvYmplY3QgaW50byBhIHF1ZXJ5IHN0cmluZy4KICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBzdHJpbmcgaW4gdGhlIGZvcm1hdDogbmFtZTE9dmFsdWUxJmFtcDtuYW1lMj12YWx1ZTIKICovCiQuZm4uZmllbGRTZXJpYWxpemUgPSBmdW5jdGlvbihzdWNjZXNzZnVsKSB7CiAgICB2YXIgYSA9IFtdOwogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBuID0gdGhpcy5uYW1lOwogICAgICAgIGlmICghbikgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciB2ID0gJC5maWVsZFZhbHVlKHRoaXMsIHN1Y2Nlc3NmdWwpOwogICAgICAgIGlmICh2ICYmIHYuY29uc3RydWN0b3IgPT0gQXJyYXkpIHsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLG1heD12Lmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAgICAgICAgICAgICAgICBhLnB1c2goe25hbWU6IG4sIHZhbHVlOiB2W2ldfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodiAhPT0gbnVsbCAmJiB0eXBlb2YgdiAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgICBhLnB1c2goe25hbWU6IHRoaXMubmFtZSwgdmFsdWU6IHZ9KTsKICAgICAgICB9CiAgICB9KTsKICAgIC8vaGFuZCBvZmYgdG8galF1ZXJ5LnBhcmFtIGZvciBwcm9wZXIgZW5jb2RpbmcKICAgIHJldHVybiAkLnBhcmFtKGEpOwp9OwoKLyoqCiAqIFJldHVybnMgdGhlIHZhbHVlKHMpIG9mIHRoZSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4gIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGZvcm06CiAqCiAqICA8Zm9ybT48ZmllbGRzZXQ+CiAqICAgICAgPGlucHV0IG5hbWU9IkEiIHR5cGU9InRleHQiIC8+CiAqICAgICAgPGlucHV0IG5hbWU9IkEiIHR5cGU9InRleHQiIC8+CiAqICAgICAgPGlucHV0IG5hbWU9IkIiIHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iQjEiIC8+CiAqICAgICAgPGlucHV0IG5hbWU9IkIiIHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iQjIiLz4KICogICAgICA8aW5wdXQgbmFtZT0iQyIgdHlwZT0icmFkaW8iIHZhbHVlPSJDMSIgLz4KICogICAgICA8aW5wdXQgbmFtZT0iQyIgdHlwZT0icmFkaW8iIHZhbHVlPSJDMiIgLz4KICogIDwvZmllbGRzZXQ+PC9mb3JtPgogKgogKiAgdmFyIHYgPSAkKCdpbnB1dFt0eXBlPXRleHRdJykuZmllbGRWYWx1ZSgpOwogKiAgLy8gaWYgbm8gdmFsdWVzIGFyZSBlbnRlcmVkIGludG8gdGhlIHRleHQgaW5wdXRzCiAqICB2ID09IFsnJywnJ10KICogIC8vIGlmIHZhbHVlcyBlbnRlcmVkIGludG8gdGhlIHRleHQgaW5wdXRzIGFyZSAnZm9vJyBhbmQgJ2JhcicKICogIHYgPT0gWydmb28nLCdiYXInXQogKgogKiAgdmFyIHYgPSAkKCdpbnB1dFt0eXBlPWNoZWNrYm94XScpLmZpZWxkVmFsdWUoKTsKICogIC8vIGlmIG5laXRoZXIgY2hlY2tib3ggaXMgY2hlY2tlZAogKiAgdiA9PT0gdW5kZWZpbmVkCiAqICAvLyBpZiBib3RoIGNoZWNrYm94ZXMgYXJlIGNoZWNrZWQKICogIHYgPT0gWydCMScsICdCMiddCiAqCiAqICB2YXIgdiA9ICQoJ2lucHV0W3R5cGU9cmFkaW9dJykuZmllbGRWYWx1ZSgpOwogKiAgLy8gaWYgbmVpdGhlciByYWRpbyBpcyBjaGVja2VkCiAqICB2ID09PSB1bmRlZmluZWQKICogIC8vIGlmIGZpcnN0IHJhZGlvIGlzIGNoZWNrZWQKICogIHYgPT0gWydDMSddCiAqCiAqIFRoZSBzdWNjZXNzZnVsIGFyZ3VtZW50IGNvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBmaWVsZCBlbGVtZW50IG11c3QgYmUgJ3N1Y2Nlc3NmdWwnCiAqIChwZXIgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvaW50ZXJhY3QvZm9ybXMuaHRtbCNzdWNjZXNzZnVsLWNvbnRyb2xzKS4KICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHN1Y2Nlc3NmdWwgYXJndW1lbnQgaXMgdHJ1ZS4gIElmIHRoaXMgdmFsdWUgaXMgZmFsc2UgdGhlIHZhbHVlKHMpCiAqIGZvciBlYWNoIGVsZW1lbnQgaXMgcmV0dXJuZWQuCiAqCiAqIE5vdGU6IFRoaXMgbWV0aG9kICphbHdheXMqIHJldHVybnMgYW4gYXJyYXkuICBJZiBubyB2YWxpZCB2YWx1ZSBjYW4gYmUgZGV0ZXJtaW5lZCB0aGUKICogICAgYXJyYXkgd2lsbCBiZSBlbXB0eSwgb3RoZXJ3aXNlIGl0IHdpbGwgY29udGFpbiBvbmUgb3IgbW9yZSB2YWx1ZXMuCiAqLwokLmZuLmZpZWxkVmFsdWUgPSBmdW5jdGlvbihzdWNjZXNzZnVsKSB7CiAgICBmb3IgKHZhciB2YWw9W10sIGk9MCwgbWF4PXRoaXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKICAgICAgICB2YXIgZWwgPSB0aGlzW2ldOwogICAgICAgIHZhciB2ID0gJC5maWVsZFZhbHVlKGVsLCBzdWNjZXNzZnVsKTsKICAgICAgICBpZiAodiA9PT0gbnVsbCB8fCB0eXBlb2YgdiA9PSAndW5kZWZpbmVkJyB8fCAodi5jb25zdHJ1Y3RvciA9PSBBcnJheSAmJiAhdi5sZW5ndGgpKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodi5jb25zdHJ1Y3RvciA9PSBBcnJheSkKICAgICAgICAgICAgJC5tZXJnZSh2YWwsIHYpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFsLnB1c2godik7CiAgICB9CiAgICByZXR1cm4gdmFsOwp9OwoKLyoqCiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBlbGVtZW50LgogKi8KJC5maWVsZFZhbHVlID0gZnVuY3Rpb24oZWwsIHN1Y2Nlc3NmdWwpIHsKICAgIHZhciBuID0gZWwubmFtZSwgdCA9IGVsLnR5cGUsIHRhZyA9IGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgIGlmIChzdWNjZXNzZnVsID09PSB1bmRlZmluZWQpIHsKICAgICAgICBzdWNjZXNzZnVsID0gdHJ1ZTsKICAgIH0KCiAgICBpZiAoc3VjY2Vzc2Z1bCAmJiAoIW4gfHwgZWwuZGlzYWJsZWQgfHwgdCA9PSAncmVzZXQnIHx8IHQgPT0gJ2J1dHRvbicgfHwKICAgICAgICAodCA9PSAnY2hlY2tib3gnIHx8IHQgPT0gJ3JhZGlvJykgJiYgIWVsLmNoZWNrZWQgfHwKICAgICAgICAodCA9PSAnc3VibWl0JyB8fCB0ID09ICdpbWFnZScpICYmIGVsLmZvcm0gJiYgZWwuZm9ybS5jbGsgIT0gZWwgfHwKICAgICAgICB0YWcgPT0gJ3NlbGVjdCcgJiYgZWwuc2VsZWN0ZWRJbmRleCA9PSAtMSkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgaWYgKHRhZyA9PSAnc2VsZWN0JykgewogICAgICAgIHZhciBpbmRleCA9IGVsLnNlbGVjdGVkSW5kZXg7CiAgICAgICAgaWYgKGluZGV4IDwgMCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgdmFyIGEgPSBbXSwgb3BzID0gZWwub3B0aW9uczsKICAgICAgICB2YXIgb25lID0gKHQgPT0gJ3NlbGVjdC1vbmUnKTsKICAgICAgICB2YXIgbWF4ID0gKG9uZSA/IGluZGV4KzEgOiBvcHMubGVuZ3RoKTsKICAgICAgICBmb3IodmFyIGk9KG9uZSA/IGluZGV4IDogMCk7IGkgPCBtYXg7IGkrKykgewogICAgICAgICAgICB2YXIgb3AgPSBvcHNbaV07CiAgICAgICAgICAgIGlmIChvcC5zZWxlY3RlZCkgewogICAgICAgICAgICAgICAgdmFyIHYgPSBvcC52YWx1ZTsKICAgICAgICAgICAgICAgIGlmICghdikgeyAvLyBleHRyYSBwYWluIGZvciBJRS4uLgogICAgICAgICAgICAgICAgICAgIHYgPSAob3AuYXR0cmlidXRlcyAmJiBvcC5hdHRyaWJ1dGVzWyd2YWx1ZSddICYmICEob3AuYXR0cmlidXRlc1sndmFsdWUnXS5zcGVjaWZpZWQpKSA/IG9wLnRleHQgOiBvcC52YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChvbmUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGEucHVzaCh2KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYTsKICAgIH0KICAgIHJldHVybiAkKGVsKS52YWwoKTsKfTsKCi8qKgogKiBDbGVhcnMgdGhlIGZvcm0gZGF0YS4gIFRha2VzIHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBvbiB0aGUgZm9ybSdzIGlucHV0IGZpZWxkczoKICogIC0gaW5wdXQgdGV4dCBmaWVsZHMgd2lsbCBoYXZlIHRoZWlyICd2YWx1ZScgcHJvcGVydHkgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcKICogIC0gc2VsZWN0IGVsZW1lbnRzIHdpbGwgaGF2ZSB0aGVpciAnc2VsZWN0ZWRJbmRleCcgcHJvcGVydHkgc2V0IHRvIC0xCiAqICAtIGNoZWNrYm94IGFuZCByYWRpbyBpbnB1dHMgd2lsbCBoYXZlIHRoZWlyICdjaGVja2VkJyBwcm9wZXJ0eSBzZXQgdG8gZmFsc2UKICogIC0gaW5wdXRzIG9mIHR5cGUgc3VibWl0LCBidXR0b24sIHJlc2V0LCBhbmQgaGlkZGVuIHdpbGwgKm5vdCogYmUgZWZmZWN0ZWQKICogIC0gYnV0dG9uIGVsZW1lbnRzIHdpbGwgKm5vdCogYmUgZWZmZWN0ZWQKICovCiQuZm4uY2xlYXJGb3JtID0gZnVuY3Rpb24oaW5jbHVkZUhpZGRlbikgewogICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAkKCdpbnB1dCxzZWxlY3QsdGV4dGFyZWEnLCB0aGlzKS5jbGVhckZpZWxkcyhpbmNsdWRlSGlkZGVuKTsKICAgIH0pOwp9OwoKLyoqCiAqIENsZWFycyB0aGUgc2VsZWN0ZWQgZm9ybSBlbGVtZW50cy4KICovCiQuZm4uY2xlYXJGaWVsZHMgPSAkLmZuLmNsZWFySW5wdXRzID0gZnVuY3Rpb24oaW5jbHVkZUhpZGRlbikgewogICAgdmFyIHJlID0gL14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGVtYWlsfG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2k7IC8vICdoaWRkZW4nIGlzIG5vdCBpbiB0aGlzIGxpc3QKICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHQgPSB0aGlzLnR5cGUsIHRhZyA9IHRoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGlmIChyZS50ZXN0KHQpIHx8IHRhZyA9PSAndGV4dGFyZWEnKSB7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSAnJzsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodCA9PSAnY2hlY2tib3gnIHx8IHQgPT0gJ3JhZGlvJykgewogICAgICAgICAgICB0aGlzLmNoZWNrZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGFnID09ICdzZWxlY3QnKSB7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IC0xOwogICAgICAgIH0KCQllbHNlIGlmICh0ID09ICJmaWxlIikgewoJCQlpZiAoJC5icm93c2VyLm1zaWUpIHsKCQkJCSQodGhpcykucmVwbGFjZVdpdGgoJCh0aGlzKS5jbG9uZSgpKTsKCQkJfSBlbHNlIHsKCQkJCSQodGhpcykudmFsKCcnKTsKCQkJfQoJCX0KICAgICAgICBlbHNlIGlmIChpbmNsdWRlSGlkZGVuKSB7CiAgICAgICAgICAgIC8vIGluY2x1ZGVIaWRkZW4gY2FuIGJlIHRoZSB2YWx1ZSB0cnVlLCBvciBpdCBjYW4gYmUgYSBzZWxlY3RvciBzdHJpbmcKICAgICAgICAgICAgLy8gaW5kaWNhdGluZyBhIHNwZWNpYWwgdGVzdDsgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgIC8vICAkKCcjbXlGb3JtJykuY2xlYXJGb3JtKCcuc3BlY2lhbDpoaWRkZW4nKQogICAgICAgICAgICAvLyB0aGUgYWJvdmUgd291bGQgY2xlYW4gaGlkZGVuIGlucHV0cyB0aGF0IGhhdmUgdGhlIGNsYXNzIG9mICdzcGVjaWFsJwogICAgICAgICAgICBpZiAoIChpbmNsdWRlSGlkZGVuID09PSB0cnVlICYmIC9oaWRkZW4vLnRlc3QodCkpIHx8CiAgICAgICAgICAgICAgICAgKHR5cGVvZiBpbmNsdWRlSGlkZGVuID09ICdzdHJpbmcnICYmICQodGhpcykuaXMoaW5jbHVkZUhpZGRlbikpICkKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSAnJzsKICAgICAgICB9CiAgICB9KTsKfTsKCi8qKgogKiBSZXNldHMgdGhlIGZvcm0gZGF0YS4gIENhdXNlcyBhbGwgZm9ybSBlbGVtZW50cyB0byBiZSByZXNldCB0byB0aGVpciBvcmlnaW5hbCB2YWx1ZS4KICovCiQuZm4ucmVzZXRGb3JtID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIC8vIGd1YXJkIGFnYWluc3QgYW4gaW5wdXQgd2l0aCB0aGUgbmFtZSBvZiAncmVzZXQnCiAgICAgICAgLy8gbm90ZSB0aGF0IElFIHJlcG9ydHMgdGhlIHJlc2V0IGZ1bmN0aW9uIGFzIGFuICdvYmplY3QnCiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnJlc2V0ID09ICdmdW5jdGlvbicgfHwgKHR5cGVvZiB0aGlzLnJlc2V0ID09ICdvYmplY3QnICYmICF0aGlzLnJlc2V0Lm5vZGVUeXBlKSkgewogICAgICAgICAgICB0aGlzLnJlc2V0KCk7CiAgICAgICAgfQogICAgfSk7Cn07CgovKioKICogRW5hYmxlcyBvciBkaXNhYmxlcyBhbnkgbWF0Y2hpbmcgZWxlbWVudHMuCiAqLwokLmZuLmVuYWJsZSA9IGZ1bmN0aW9uKGIpIHsKICAgIGlmIChiID09PSB1bmRlZmluZWQpIHsKICAgICAgICBiID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5kaXNhYmxlZCA9ICFiOwogICAgfSk7Cn07CgovKioKICogQ2hlY2tzL3VuY2hlY2tzIGFueSBtYXRjaGluZyBjaGVja2JveGVzIG9yIHJhZGlvIGJ1dHRvbnMgYW5kCiAqIHNlbGVjdHMvZGVzZWxlY3RzIGFuZCBtYXRjaGluZyBvcHRpb24gZWxlbWVudHMuCiAqLwokLmZuLnNlbGVjdGVkID0gZnVuY3Rpb24oc2VsZWN0KSB7CiAgICBpZiAoc2VsZWN0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICBzZWxlY3QgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdCA9IHRoaXMudHlwZTsKICAgICAgICBpZiAodCA9PSAnY2hlY2tib3gnIHx8IHQgPT0gJ3JhZGlvJykgewogICAgICAgICAgICB0aGlzLmNoZWNrZWQgPSBzZWxlY3Q7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICdvcHRpb24nKSB7CiAgICAgICAgICAgIHZhciAkc2VsID0gJCh0aGlzKS5wYXJlbnQoJ3NlbGVjdCcpOwogICAgICAgICAgICBpZiAoc2VsZWN0ICYmICRzZWxbMF0gJiYgJHNlbFswXS50eXBlID09ICdzZWxlY3Qtb25lJykgewogICAgICAgICAgICAgICAgLy8gZGVzZWxlY3QgYWxsIG90aGVyIG9wdGlvbnMKICAgICAgICAgICAgICAgICRzZWwuZmluZCgnb3B0aW9uJykuc2VsZWN0ZWQoZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBzZWxlY3Q7CiAgICAgICAgfQogICAgfSk7Cn07CgovLyBleHBvc2UgZGVidWcgdmFyCiQuZm4uYWpheFN1Ym1pdC5kZWJ1ZyA9IGZhbHNlOwoKLy8gaGVscGVyIGZuIGZvciBjb25zb2xlIGxvZ2dpbmcKZnVuY3Rpb24gbG9nKCkgewogICAgaWYgKCEkLmZuLmFqYXhTdWJtaXQuZGVidWcpIAogICAgICAgIHJldHVybjsKICAgIHZhciBtc2cgPSAnW2pxdWVyeS5mb3JtXSAnICsgQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChhcmd1bWVudHMsJycpOwogICAgaWYgKHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLmxvZykgewogICAgICAgIHdpbmRvdy5jb25zb2xlLmxvZyhtc2cpOwogICAgfQogICAgZWxzZSBpZiAod2luZG93Lm9wZXJhICYmIHdpbmRvdy5vcGVyYS5wb3N0RXJyb3IpIHsKICAgICAgICB3aW5kb3cub3BlcmEucG9zdEVycm9yKG1zZyk7CiAgICB9Cn0KCn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/jquery.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/jquery.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSBhcnJheSgnanF1ZXJ5LTEuOC4zLm1pbi5qcycpOwokaW5mb1snY2RuJ10gPSAnLy9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMS44LjMvanF1ZXJ5Lm1pbi5qcyc7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/jquery.lib/jquery-1.8.3.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSB2MS44LjMganF1ZXJ5LmNvbSB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLw0KKGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gXyhlKXt2YXIgdD1NW2VdPXt9O3JldHVybiB2LmVhY2goZS5zcGxpdCh5KSxmdW5jdGlvbihlLG4pe3Rbbl09ITB9KSx0fWZ1bmN0aW9uIEgoZSxuLHIpe2lmKHI9PT10JiZlLm5vZGVUeXBlPT09MSl7dmFyIGk9ImRhdGEtIituLnJlcGxhY2UoUCwiLSQxIikudG9Mb3dlckNhc2UoKTtyPWUuZ2V0QXR0cmlidXRlKGkpO2lmKHR5cGVvZiByPT0ic3RyaW5nIil7dHJ5e3I9cj09PSJ0cnVlIj8hMDpyPT09ImZhbHNlIj8hMTpyPT09Im51bGwiP251bGw6K3IrIiI9PT1yPytyOkQudGVzdChyKT92LnBhcnNlSlNPTihyKTpyfWNhdGNoKHMpe312LmRhdGEoZSxuLHIpfWVsc2Ugcj10fXJldHVybiByfWZ1bmN0aW9uIEIoZSl7dmFyIHQ7Zm9yKHQgaW4gZSl7aWYodD09PSJkYXRhIiYmdi5pc0VtcHR5T2JqZWN0KGVbdF0pKWNvbnRpbnVlO2lmKHQhPT0idG9KU09OIilyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBldCgpe3JldHVybiExfWZ1bmN0aW9uIHR0KCl7cmV0dXJuITB9ZnVuY3Rpb24gdXQoZSl7cmV0dXJuIWV8fCFlLnBhcmVudE5vZGV8fGUucGFyZW50Tm9kZS5ub2RlVHlwZT09PTExfWZ1bmN0aW9uIGF0KGUsdCl7ZG8gZT1lW3RdO3doaWxlKGUmJmUubm9kZVR5cGUhPT0xKTtyZXR1cm4gZX1mdW5jdGlvbiBmdChlLHQsbil7dD10fHwwO2lmKHYuaXNGdW5jdGlvbih0KSlyZXR1cm4gdi5ncmVwKGUsZnVuY3Rpb24oZSxyKXt2YXIgaT0hIXQuY2FsbChlLHIsZSk7cmV0dXJuIGk9PT1ufSk7aWYodC5ub2RlVHlwZSlyZXR1cm4gdi5ncmVwKGUsZnVuY3Rpb24oZSxyKXtyZXR1cm4gZT09PXQ9PT1ufSk7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXt2YXIgcj12LmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gZS5ub2RlVHlwZT09PTF9KTtpZihpdC50ZXN0KHQpKXJldHVybiB2LmZpbHRlcih0LHIsIW4pO3Q9di5maWx0ZXIodCxyKX1yZXR1cm4gdi5ncmVwKGUsZnVuY3Rpb24oZSxyKXtyZXR1cm4gdi5pbkFycmF5KGUsdCk+PTA9PT1ufSl9ZnVuY3Rpb24gbHQoZSl7dmFyIHQ9Y3Quc3BsaXQoInwiKSxuPWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2lmKG4uY3JlYXRlRWxlbWVudCl3aGlsZSh0Lmxlbmd0aCluLmNyZWF0ZUVsZW1lbnQodC5wb3AoKSk7cmV0dXJuIG59ZnVuY3Rpb24gTHQoZSx0KXtyZXR1cm4gZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KVswXXx8ZS5hcHBlbmRDaGlsZChlLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KSl9ZnVuY3Rpb24gQXQoZSx0KXtpZih0Lm5vZGVUeXBlIT09MXx8IXYuaGFzRGF0YShlKSlyZXR1cm47dmFyIG4scixpLHM9di5fZGF0YShlKSxvPXYuX2RhdGEodCxzKSx1PXMuZXZlbnRzO2lmKHUpe2RlbGV0ZSBvLmhhbmRsZSxvLmV2ZW50cz17fTtmb3IobiBpbiB1KWZvcihyPTAsaT11W25dLmxlbmd0aDtyPGk7cisrKXYuZXZlbnQuYWRkKHQsbix1W25dW3JdKX1vLmRhdGEmJihvLmRhdGE9di5leHRlbmQoe30sby5kYXRhKSl9ZnVuY3Rpb24gT3QoZSx0KXt2YXIgbjtpZih0Lm5vZGVUeXBlIT09MSlyZXR1cm47dC5jbGVhckF0dHJpYnV0ZXMmJnQuY2xlYXJBdHRyaWJ1dGVzKCksdC5tZXJnZUF0dHJpYnV0ZXMmJnQubWVyZ2VBdHRyaWJ1dGVzKGUpLG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLG49PT0ib2JqZWN0Ij8odC5wYXJlbnROb2RlJiYodC5vdXRlckhUTUw9ZS5vdXRlckhUTUwpLHYuc3VwcG9ydC5odG1sNUNsb25lJiZlLmlubmVySFRNTCYmIXYudHJpbSh0LmlubmVySFRNTCkmJih0LmlubmVySFRNTD1lLmlubmVySFRNTCkpOm49PT0iaW5wdXQiJiZFdC50ZXN0KGUudHlwZSk/KHQuZGVmYXVsdENoZWNrZWQ9dC5jaGVja2VkPWUuY2hlY2tlZCx0LnZhbHVlIT09ZS52YWx1ZSYmKHQudmFsdWU9ZS52YWx1ZSkpOm49PT0ib3B0aW9uIj90LnNlbGVjdGVkPWUuZGVmYXVsdFNlbGVjdGVkOm49PT0iaW5wdXQifHxuPT09InRleHRhcmVhIj90LmRlZmF1bHRWYWx1ZT1lLmRlZmF1bHRWYWx1ZTpuPT09InNjcmlwdCImJnQudGV4dCE9PWUudGV4dCYmKHQudGV4dD1lLnRleHQpLHQucmVtb3ZlQXR0cmlidXRlKHYuZXhwYW5kbyl9ZnVuY3Rpb24gTXQoZSl7cmV0dXJuIHR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIj9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik6dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbCE9InVuZGVmaW5lZCI/ZS5xdWVyeVNlbGVjdG9yQWxsKCIqIik6W119ZnVuY3Rpb24gX3QoZSl7RXQudGVzdChlLnR5cGUpJiYoZS5kZWZhdWx0Q2hlY2tlZD1lLmNoZWNrZWQpfWZ1bmN0aW9uIFF0KGUsdCl7aWYodCBpbiBlKXJldHVybiB0O3ZhciBuPXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKSxyPXQsaT1KdC5sZW5ndGg7d2hpbGUoaS0tKXt0PUp0W2ldK247aWYodCBpbiBlKXJldHVybiB0fXJldHVybiByfWZ1bmN0aW9uIEd0KGUsdCl7cmV0dXJuIGU9dHx8ZSx2LmNzcyhlLCJkaXNwbGF5Iik9PT0ibm9uZSJ8fCF2LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKX1mdW5jdGlvbiBZdChlLHQpe3ZhciBuLHIsaT1bXSxzPTAsbz1lLmxlbmd0aDtmb3IoO3M8bztzKyspe249ZVtzXTtpZighbi5zdHlsZSljb250aW51ZTtpW3NdPXYuX2RhdGEobiwib2xkZGlzcGxheSIpLHQ/KCFpW3NdJiZuLnN0eWxlLmRpc3BsYXk9PT0ibm9uZSImJihuLnN0eWxlLmRpc3BsYXk9IiIpLG4uc3R5bGUuZGlzcGxheT09PSIiJiZHdChuKSYmKGlbc109di5fZGF0YShuLCJvbGRkaXNwbGF5IixubihuLm5vZGVOYW1lKSkpKToocj1EdChuLCJkaXNwbGF5IiksIWlbc10mJnIhPT0ibm9uZSImJnYuX2RhdGEobiwib2xkZGlzcGxheSIscikpfWZvcihzPTA7czxvO3MrKyl7bj1lW3NdO2lmKCFuLnN0eWxlKWNvbnRpbnVlO2lmKCF0fHxuLnN0eWxlLmRpc3BsYXk9PT0ibm9uZSJ8fG4uc3R5bGUuZGlzcGxheT09PSIiKW4uc3R5bGUuZGlzcGxheT10P2lbc118fCIiOiJub25lIn1yZXR1cm4gZX1mdW5jdGlvbiBadChlLHQsbil7dmFyIHI9UnQuZXhlYyh0KTtyZXR1cm4gcj9NYXRoLm1heCgwLHJbMV0tKG58fDApKSsoclsyXXx8InB4Iik6dH1mdW5jdGlvbiBlbihlLHQsbixyKXt2YXIgaT1uPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKT80OnQ9PT0id2lkdGgiPzE6MCxzPTA7Zm9yKDtpPDQ7aSs9MiluPT09Im1hcmdpbiImJihzKz12LmNzcyhlLG4rJHRbaV0sITApKSxyPyhuPT09ImNvbnRlbnQiJiYocy09cGFyc2VGbG9hdChEdChlLCJwYWRkaW5nIiskdFtpXSkpfHwwKSxuIT09Im1hcmdpbiImJihzLT1wYXJzZUZsb2F0KER0KGUsImJvcmRlciIrJHRbaV0rIldpZHRoIikpfHwwKSk6KHMrPXBhcnNlRmxvYXQoRHQoZSwicGFkZGluZyIrJHRbaV0pKXx8MCxuIT09InBhZGRpbmciJiYocys9cGFyc2VGbG9hdChEdChlLCJib3JkZXIiKyR0W2ldKyJXaWR0aCIpKXx8MCkpO3JldHVybiBzfWZ1bmN0aW9uIHRuKGUsdCxuKXt2YXIgcj10PT09IndpZHRoIj9lLm9mZnNldFdpZHRoOmUub2Zmc2V0SGVpZ2h0LGk9ITAscz12LnN1cHBvcnQuYm94U2l6aW5nJiZ2LmNzcyhlLCJib3hTaXppbmciKT09PSJib3JkZXItYm94IjtpZihyPD0wfHxyPT1udWxsKXtyPUR0KGUsdCk7aWYocjwwfHxyPT1udWxsKXI9ZS5zdHlsZVt0XTtpZihVdC50ZXN0KHIpKXJldHVybiByO2k9cyYmKHYuc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZXx8cj09PWUuc3R5bGVbdF0pLHI9cGFyc2VGbG9hdChyKXx8MH1yZXR1cm4gcitlbihlLHQsbnx8KHM/ImJvcmRlciI6ImNvbnRlbnQiKSxpKSsicHgifWZ1bmN0aW9uIG5uKGUpe2lmKFd0W2VdKXJldHVybiBXdFtlXTt2YXIgdD12KCI8IitlKyI+IikuYXBwZW5kVG8oaS5ib2R5KSxuPXQuY3NzKCJkaXNwbGF5Iik7dC5yZW1vdmUoKTtpZihuPT09Im5vbmUifHxuPT09IiIpe1B0PWkuYm9keS5hcHBlbmRDaGlsZChQdHx8di5leHRlbmQoaS5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKSx7ZnJhbWVCb3JkZXI6MCx3aWR0aDowLGhlaWdodDowfSkpO2lmKCFIdHx8IVB0LmNyZWF0ZUVsZW1lbnQpSHQ9KFB0LmNvbnRlbnRXaW5kb3d8fFB0LmNvbnRlbnREb2N1bWVudCkuZG9jdW1lbnQsSHQud3JpdGUoIjwhZG9jdHlwZSBodG1sPjxodG1sPjxib2R5PiIpLEh0LmNsb3NlKCk7dD1IdC5ib2R5LmFwcGVuZENoaWxkKEh0LmNyZWF0ZUVsZW1lbnQoZSkpLG49RHQodCwiZGlzcGxheSIpLGkuYm9keS5yZW1vdmVDaGlsZChQdCl9cmV0dXJuIFd0W2VdPW4sbn1mdW5jdGlvbiBmbihlLHQsbixyKXt2YXIgaTtpZih2LmlzQXJyYXkodCkpdi5lYWNoKHQsZnVuY3Rpb24odCxpKXtufHxzbi50ZXN0KGUpP3IoZSxpKTpmbihlKyJbIisodHlwZW9mIGk9PSJvYmplY3QiP3Q6IiIpKyJdIixpLG4scil9KTtlbHNlIGlmKCFuJiZ2LnR5cGUodCk9PT0ib2JqZWN0Iilmb3IoaSBpbiB0KWZuKGUrIlsiK2krIl0iLHRbaV0sbixyKTtlbHNlIHIoZSx0KX1mdW5jdGlvbiBDbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXt0eXBlb2YgdCE9InN0cmluZyImJihuPXQsdD0iKiIpO3ZhciByLGkscyxvPXQudG9Mb3dlckNhc2UoKS5zcGxpdCh5KSx1PTAsYT1vLmxlbmd0aDtpZih2LmlzRnVuY3Rpb24obikpZm9yKDt1PGE7dSsrKXI9b1t1XSxzPS9eXCsvLnRlc3QocikscyYmKHI9ci5zdWJzdHIoMSl8fCIqIiksaT1lW3JdPWVbcl18fFtdLGlbcz8idW5zaGlmdCI6InB1c2giXShuKX19ZnVuY3Rpb24ga24oZSxuLHIsaSxzLG8pe3M9c3x8bi5kYXRhVHlwZXNbMF0sbz1vfHx7fSxvW3NdPSEwO3ZhciB1LGE9ZVtzXSxmPTAsbD1hP2EubGVuZ3RoOjAsYz1lPT09U247Zm9yKDtmPGwmJihjfHwhdSk7ZisrKXU9YVtmXShuLHIsaSksdHlwZW9mIHU9PSJzdHJpbmciJiYoIWN8fG9bdV0/dT10OihuLmRhdGFUeXBlcy51bnNoaWZ0KHUpLHU9a24oZSxuLHIsaSx1LG8pKSk7cmV0dXJuKGN8fCF1KSYmIW9bIioiXSYmKHU9a24oZSxuLHIsaSwiKiIsbykpLHV9ZnVuY3Rpb24gTG4oZSxuKXt2YXIgcixpLHM9di5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihyIGluIG4pbltyXSE9PXQmJigoc1tyXT9lOml8fChpPXt9KSlbcl09bltyXSk7aSYmdi5leHRlbmQoITAsZSxpKX1mdW5jdGlvbiBBbihlLG4scil7dmFyIGkscyxvLHUsYT1lLmNvbnRlbnRzLGY9ZS5kYXRhVHlwZXMsbD1lLnJlc3BvbnNlRmllbGRzO2ZvcihzIGluIGwpcyBpbiByJiYobltsW3NdXT1yW3NdKTt3aGlsZShmWzBdPT09IioiKWYuc2hpZnQoKSxpPT09dCYmKGk9ZS5taW1lVHlwZXx8bi5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBlIikpO2lmKGkpZm9yKHMgaW4gYSlpZihhW3NdJiZhW3NdLnRlc3QoaSkpe2YudW5zaGlmdChzKTticmVha31pZihmWzBdaW4gcilvPWZbMF07ZWxzZXtmb3IocyBpbiByKXtpZighZlswXXx8ZS5jb252ZXJ0ZXJzW3MrIiAiK2ZbMF1dKXtvPXM7YnJlYWt9dXx8KHU9cyl9bz1vfHx1fWlmKG8pcmV0dXJuIG8hPT1mWzBdJiZmLnVuc2hpZnQobykscltvXX1mdW5jdGlvbiBPbihlLHQpe3ZhciBuLHIsaSxzLG89ZS5kYXRhVHlwZXMuc2xpY2UoKSx1PW9bMF0sYT17fSxmPTA7ZS5kYXRhRmlsdGVyJiYodD1lLmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSk7aWYob1sxXSlmb3IobiBpbiBlLmNvbnZlcnRlcnMpYVtuLnRvTG93ZXJDYXNlKCldPWUuY29udmVydGVyc1tuXTtmb3IoO2k9b1srK2ZdOylpZihpIT09IioiKXtpZih1IT09IioiJiZ1IT09aSl7bj1hW3UrIiAiK2ldfHxhWyIqICIraV07aWYoIW4pZm9yKHIgaW4gYSl7cz1yLnNwbGl0KCIgIik7aWYoc1sxXT09PWkpe249YVt1KyIgIitzWzBdXXx8YVsiKiAiK3NbMF1dO2lmKG4pe249PT0hMD9uPWFbcl06YVtyXSE9PSEwJiYoaT1zWzBdLG8uc3BsaWNlKGYtLSwwLGkpKTticmVha319fWlmKG4hPT0hMClpZihuJiZlWyJ0aHJvd3MiXSl0PW4odCk7ZWxzZSB0cnl7dD1uKHQpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOm4/bDoiTm8gY29udmVyc2lvbiBmcm9tICIrdSsiIHRvICIraX19fXU9aX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6dH19ZnVuY3Rpb24gRm4oKXt0cnl7cmV0dXJuIG5ldyBlLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKHQpe319ZnVuY3Rpb24gSW4oKXt0cnl7cmV0dXJuIG5ldyBlLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2godCl7fX1mdW5jdGlvbiAkbigpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cW49dH0sMCkscW49di5ub3coKX1mdW5jdGlvbiBKbihlLHQpe3YuZWFjaCh0LGZ1bmN0aW9uKHQsbil7dmFyIHI9KFZuW3RdfHxbXSkuY29uY2F0KFZuWyIqIl0pLGk9MCxzPXIubGVuZ3RoO2Zvcig7aTxzO2krKylpZihyW2ldLmNhbGwoZSx0LG4pKXJldHVybn0pfWZ1bmN0aW9uIEtuKGUsdCxuKXt2YXIgcixpPTAscz0wLG89WG4ubGVuZ3RoLHU9di5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBhLmVsZW19KSxhPWZ1bmN0aW9uKCl7dmFyIHQ9cW58fCRuKCksbj1NYXRoLm1heCgwLGYuc3RhcnRUaW1lK2YuZHVyYXRpb24tdCkscj1uL2YuZHVyYXRpb258fDAsaT0xLXIscz0wLG89Zi50d2VlbnMubGVuZ3RoO2Zvcig7czxvO3MrKylmLnR3ZWVuc1tzXS5ydW4oaSk7cmV0dXJuIHUubm90aWZ5V2l0aChlLFtmLGksbl0pLGk8MSYmbz9uOih1LnJlc29sdmVXaXRoKGUsW2ZdKSwhMSl9LGY9dS5wcm9taXNlKHtlbGVtOmUscHJvcHM6di5leHRlbmQoe30sdCksb3B0czp2LmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fX0sbiksb3JpZ2luYWxQcm9wZXJ0aWVzOnQsb3JpZ2luYWxPcHRpb25zOm4sc3RhcnRUaW1lOnFufHwkbigpLGR1cmF0aW9uOm4uZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT12LlR3ZWVuKGUsZi5vcHRzLHQsbixmLm9wdHMuc3BlY2lhbEVhc2luZ1t0XXx8Zi5vcHRzLmVhc2luZyk7cmV0dXJuIGYudHdlZW5zLnB1c2goaSksaX0sc3RvcDpmdW5jdGlvbih0KXt2YXIgbj0wLHI9dD9mLnR3ZWVucy5sZW5ndGg6MDtmb3IoO248cjtuKyspZi50d2VlbnNbbl0ucnVuKDEpO3JldHVybiB0P3UucmVzb2x2ZVdpdGgoZSxbZix0XSk6dS5yZWplY3RXaXRoKGUsW2YsdF0pLHRoaXN9fSksbD1mLnByb3BzO1FuKGwsZi5vcHRzLnNwZWNpYWxFYXNpbmcpO2Zvcig7aTxvO2krKyl7cj1YbltpXS5jYWxsKGYsZSxsLGYub3B0cyk7aWYocilyZXR1cm4gcn1yZXR1cm4gSm4oZixsKSx2LmlzRnVuY3Rpb24oZi5vcHRzLnN0YXJ0KSYmZi5vcHRzLnN0YXJ0LmNhbGwoZSxmKSx2LmZ4LnRpbWVyKHYuZXh0ZW5kKGEse2FuaW06ZixxdWV1ZTpmLm9wdHMucXVldWUsZWxlbTplfSkpLGYucHJvZ3Jlc3MoZi5vcHRzLnByb2dyZXNzKS5kb25lKGYub3B0cy5kb25lLGYub3B0cy5jb21wbGV0ZSkuZmFpbChmLm9wdHMuZmFpbCkuYWx3YXlzKGYub3B0cy5hbHdheXMpfWZ1bmN0aW9uIFFuKGUsdCl7dmFyIG4scixpLHMsbztmb3IobiBpbiBlKXtyPXYuY2FtZWxDYXNlKG4pLGk9dFtyXSxzPWVbbl0sdi5pc0FycmF5KHMpJiYoaT1zWzFdLHM9ZVtuXT1zWzBdKSxuIT09ciYmKGVbcl09cyxkZWxldGUgZVtuXSksbz12LmNzc0hvb2tzW3JdO2lmKG8mJiJleHBhbmQiaW4gbyl7cz1vLmV4cGFuZChzKSxkZWxldGUgZVtyXTtmb3IobiBpbiBzKW4gaW4gZXx8KGVbbl09c1tuXSx0W25dPWkpfWVsc2UgdFtyXT1pfX1mdW5jdGlvbiBHbihlLHQsbil7dmFyIHIsaSxzLG8sdSxhLGYsbCxjLGg9dGhpcyxwPWUuc3R5bGUsZD17fSxtPVtdLGc9ZS5ub2RlVHlwZSYmR3QoZSk7bi5xdWV1ZXx8KGw9di5fcXVldWVIb29rcyhlLCJmeCIpLGwudW5xdWV1ZWQ9PW51bGwmJihsLnVucXVldWVkPTAsYz1sLmVtcHR5LmZpcmUsbC5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7bC51bnF1ZXVlZHx8YygpfSksbC51bnF1ZXVlZCsrLGguYWx3YXlzKGZ1bmN0aW9uKCl7aC5hbHdheXMoZnVuY3Rpb24oKXtsLnVucXVldWVkLS0sdi5xdWV1ZShlLCJmeCIpLmxlbmd0aHx8bC5lbXB0eS5maXJlKCl9KX0pKSxlLm5vZGVUeXBlPT09MSYmKCJoZWlnaHQiaW4gdHx8IndpZHRoImluIHQpJiYobi5vdmVyZmxvdz1bcC5vdmVyZmxvdyxwLm92ZXJmbG93WCxwLm92ZXJmbG93WV0sdi5jc3MoZSwiZGlzcGxheSIpPT09ImlubGluZSImJnYuY3NzKGUsImZsb2F0Iik9PT0ibm9uZSImJighdi5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXR8fG5uKGUubm9kZU5hbWUpPT09ImlubGluZSI/cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnAuem9vbT0xKSksbi5vdmVyZmxvdyYmKHAub3ZlcmZsb3c9ImhpZGRlbiIsdi5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3N8fGguZG9uZShmdW5jdGlvbigpe3Aub3ZlcmZsb3c9bi5vdmVyZmxvd1swXSxwLm92ZXJmbG93WD1uLm92ZXJmbG93WzFdLHAub3ZlcmZsb3dZPW4ub3ZlcmZsb3dbMl19KSk7Zm9yKHIgaW4gdCl7cz10W3JdO2lmKFVuLmV4ZWMocykpe2RlbGV0ZSB0W3JdLGE9YXx8cz09PSJ0b2dnbGUiO2lmKHM9PT0oZz8iaGlkZSI6InNob3ciKSljb250aW51ZTttLnB1c2gocil9fW89bS5sZW5ndGg7aWYobyl7dT12Ll9kYXRhKGUsImZ4c2hvdyIpfHx2Ll9kYXRhKGUsImZ4c2hvdyIse30pLCJoaWRkZW4iaW4gdSYmKGc9dS5oaWRkZW4pLGEmJih1LmhpZGRlbj0hZyksZz92KGUpLnNob3coKTpoLmRvbmUoZnVuY3Rpb24oKXt2KGUpLmhpZGUoKX0pLGguZG9uZShmdW5jdGlvbigpe3ZhciB0O3YucmVtb3ZlRGF0YShlLCJmeHNob3ciLCEwKTtmb3IodCBpbiBkKXYuc3R5bGUoZSx0LGRbdF0pfSk7Zm9yKHI9MDtyPG87cisrKWk9bVtyXSxmPWguY3JlYXRlVHdlZW4oaSxnP3VbaV06MCksZFtpXT11W2ldfHx2LnN0eWxlKGUsaSksaSBpbiB1fHwodVtpXT1mLnN0YXJ0LGcmJihmLmVuZD1mLnN0YXJ0LGYuc3RhcnQ9aT09PSJ3aWR0aCJ8fGk9PT0iaGVpZ2h0Ij8xOjApKX19ZnVuY3Rpb24gWW4oZSx0LG4scixpKXtyZXR1cm4gbmV3IFluLnByb3RvdHlwZS5pbml0KGUsdCxuLHIsaSl9ZnVuY3Rpb24gWm4oZSx0KXt2YXIgbixyPXtoZWlnaHQ6ZX0saT0wO3Q9dD8xOjA7Zm9yKDtpPDQ7aSs9Mi10KW49JHRbaV0sclsibWFyZ2luIituXT1yWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoci5vcGFjaXR5PXIud2lkdGg9ZSkscn1mdW5jdGlvbiB0cihlKXtyZXR1cm4gdi5pc1dpbmRvdyhlKT9lOmUubm9kZVR5cGU9PT05P2UuZGVmYXVsdFZpZXd8fGUucGFyZW50V2luZG93OiExfXZhciBuLHIsaT1lLmRvY3VtZW50LHM9ZS5sb2NhdGlvbixvPWUubmF2aWdhdG9yLHU9ZS5qUXVlcnksYT1lLiQsZj1BcnJheS5wcm90b3R5cGUucHVzaCxsPUFycmF5LnByb3RvdHlwZS5zbGljZSxjPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLGg9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxwPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksZD1TdHJpbmcucHJvdG90eXBlLnRyaW0sdj1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgdi5mbi5pbml0KGUsdCxuKX0sbT0vW1wtK10/KD86XGQqXC58KVxkKyg/OltlRV1bXC0rXT9cZCt8KS8uc291cmNlLGc9L1xTLyx5PS9ccysvLGI9L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLHc9L14oPzpbXiM8XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSopJCkvLEU9L148KFx3KylccypcLz8+KD86PFwvXDE+fCkkLyxTPS9eW1xdLDp7fVxzXSokLyx4PS8oPzpefDp8LCkoPzpccypcWykrL2csVD0vXFwoPzpbIlxcXC9iZm5ydF18dVtcZGEtZkEtRl17NH0pL2csTj0vIlteIlxcXHJcbl0qInx0cnVlfGZhbHNlfG51bGx8LT8oPzpcZFxkKlwufClcZCsoPzpbZUVdW1wtK10/XGQrfCkvZyxDPS9eLW1zLS8saz0vLShbXGRhLXpdKS9naSxMPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQrIiIpLnRvVXBwZXJDYXNlKCl9LEE9ZnVuY3Rpb24oKXtpLmFkZEV2ZW50TGlzdGVuZXI/KGkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQSwhMSksdi5yZWFkeSgpKTppLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiJiYoaS5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixBKSx2LnJlYWR5KCkpfSxPPXt9O3YuZm49di5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnYsaW5pdDpmdW5jdGlvbihlLG4scil7dmFyIHMsbyx1LGE7aWYoIWUpcmV0dXJuIHRoaXM7aWYoZS5ub2RlVHlwZSlyZXR1cm4gdGhpcy5jb250ZXh0PXRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXM7aWYodHlwZW9mIGU9PSJzdHJpbmciKXtlLmNoYXJBdCgwKT09PSI8IiYmZS5jaGFyQXQoZS5sZW5ndGgtMSk9PT0iPiImJmUubGVuZ3RoPj0zP3M9W251bGwsZSxudWxsXTpzPXcuZXhlYyhlKTtpZihzJiYoc1sxXXx8IW4pKXtpZihzWzFdKXJldHVybiBuPW4gaW5zdGFuY2VvZiB2P25bMF06bixhPW4mJm4ubm9kZVR5cGU/bi5vd25lckRvY3VtZW50fHxuOmksZT12LnBhcnNlSFRNTChzWzFdLGEsITApLEUudGVzdChzWzFdKSYmdi5pc1BsYWluT2JqZWN0KG4pJiZ0aGlzLmF0dHIuY2FsbChlLG4sITApLHYubWVyZ2UodGhpcyxlKTtvPWkuZ2V0RWxlbWVudEJ5SWQoc1syXSk7aWYobyYmby5wYXJlbnROb2RlKXtpZihvLmlkIT09c1syXSlyZXR1cm4gci5maW5kKGUpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1vfXJldHVybiB0aGlzLmNvbnRleHQ9aSx0aGlzLnNlbGVjdG9yPWUsdGhpc31yZXR1cm4hbnx8bi5qcXVlcnk/KG58fHIpLmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3RvcihuKS5maW5kKGUpfXJldHVybiB2LmlzRnVuY3Rpb24oZSk/ci5yZWFkeShlKTooZS5zZWxlY3RvciE9PXQmJih0aGlzLnNlbGVjdG9yPWUuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWUuY29udGV4dCksdi5tYWtlQXJyYXkoZSx0aGlzKSl9LHNlbGVjdG9yOiIiLGpxdWVyeToiMS44LjMiLGxlbmd0aDowLHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gbC5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PW51bGw/dGhpcy50b0FycmF5KCk6ZTwwP3RoaXNbdGhpcy5sZW5ndGgrZV06dGhpc1tlXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj12Lm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxlKTtyZXR1cm4gci5wcmV2T2JqZWN0PXRoaXMsci5jb250ZXh0PXRoaXMuY29udGV4dCx0PT09ImZpbmQiP3Iuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhpcy5zZWxlY3Rvcj8iICI6IiIpK246dCYmKHIuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrdCsiKCIrbisiKSIpLHJ9LGVhY2g6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdi5lYWNoKHRoaXMsZSx0KX0scmVhZHk6ZnVuY3Rpb24oZSl7cmV0dXJuIHYucmVhZHkucHJvbWlzZSgpLmRvbmUoZSksdGhpc30sZXE6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9K2UsZT09PS0xP3RoaXMuc2xpY2UoZSk6dGhpcy5zbGljZShlLGUrMSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGwuYXBwbHkodGhpcyxhcmd1bWVudHMpLCJzbGljZSIsbC5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX0sbWFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayh2Lm1hcCh0aGlzLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuY2FsbCh0LG4sdCl9KSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6Zixzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX0sdi5mbi5pbml0LnByb3RvdHlwZT12LmZuLHYuZXh0ZW5kPXYuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGUsbixyLGkscyxvLHU9YXJndW1lbnRzWzBdfHx7fSxhPTEsZj1hcmd1bWVudHMubGVuZ3RoLGw9ITE7dHlwZW9mIHU9PSJib29sZWFuIiYmKGw9dSx1PWFyZ3VtZW50c1sxXXx8e30sYT0yKSx0eXBlb2YgdSE9Im9iamVjdCImJiF2LmlzRnVuY3Rpb24odSkmJih1PXt9KSxmPT09YSYmKHU9dGhpcywtLWEpO2Zvcig7YTxmO2ErKylpZigoZT1hcmd1bWVudHNbYV0pIT1udWxsKWZvcihuIGluIGUpe3I9dVtuXSxpPWVbbl07aWYodT09PWkpY29udGludWU7bCYmaSYmKHYuaXNQbGFpbk9iamVjdChpKXx8KHM9di5pc0FycmF5KGkpKSk/KHM/KHM9ITEsbz1yJiZ2LmlzQXJyYXkocik/cjpbXSk6bz1yJiZ2LmlzUGxhaW5PYmplY3Qocik/cjp7fSx1W25dPXYuZXh0ZW5kKGwsbyxpKSk6aSE9PXQmJih1W25dPWkpfXJldHVybiB1fSx2LmV4dGVuZCh7bm9Db25mbGljdDpmdW5jdGlvbih0KXtyZXR1cm4gZS4kPT09diYmKGUuJD1hKSx0JiZlLmpRdWVyeT09PXYmJihlLmpRdWVyeT11KSx2fSxpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihlKXtlP3YucmVhZHlXYWl0Kys6di5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGUpe2lmKGU9PT0hMD8tLXYucmVhZHlXYWl0OnYuaXNSZWFkeSlyZXR1cm47aWYoIWkuYm9keSlyZXR1cm4gc2V0VGltZW91dCh2LnJlYWR5LDEpO3YuaXNSZWFkeT0hMDtpZihlIT09ITAmJi0tdi5yZWFkeVdhaXQ+MClyZXR1cm47ci5yZXNvbHZlV2l0aChpLFt2XSksdi5mbi50cmlnZ2VyJiZ2KGkpLnRyaWdnZXIoInJlYWR5Iikub2ZmKCJyZWFkeSIpfSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiB2LnR5cGUoZSk9PT0iZnVuY3Rpb24ifSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiB2LnR5cGUoZSk9PT0iYXJyYXkifSxpc1dpbmRvdzpmdW5jdGlvbihlKXtyZXR1cm4gZSE9bnVsbCYmZT09ZS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihlKXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdChlKSkmJmlzRmluaXRlKGUpfSx0eXBlOmZ1bmN0aW9uKGUpe3JldHVybiBlPT1udWxsP1N0cmluZyhlKTpPW2guY2FsbChlKV18fCJvYmplY3QifSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGUpe2lmKCFlfHx2LnR5cGUoZSkhPT0ib2JqZWN0Inx8ZS5ub2RlVHlwZXx8di5pc1dpbmRvdyhlKSlyZXR1cm4hMTt0cnl7aWYoZS5jb25zdHJ1Y3RvciYmIXAuY2FsbChlLCJjb25zdHJ1Y3RvciIpJiYhcC5jYWxsKGUuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2gobil7cmV0dXJuITF9dmFyIHI7Zm9yKHIgaW4gZSk7cmV0dXJuIHI9PT10fHxwLmNhbGwoZSxyKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXt2YXIgdDtmb3IodCBpbiBlKXJldHVybiExO3JldHVybiEwfSxlcnJvcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoZSl9LHBhcnNlSFRNTDpmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIWV8fHR5cGVvZiBlIT0ic3RyaW5nIj9udWxsOih0eXBlb2YgdD09ImJvb2xlYW4iJiYobj10LHQ9MCksdD10fHxpLChyPUUuZXhlYyhlKSk/W3QuY3JlYXRlRWxlbWVudChyWzFdKV06KHI9di5idWlsZEZyYWdtZW50KFtlXSx0LG4/bnVsbDpbXSksdi5tZXJnZShbXSwoci5jYWNoZWFibGU/di5jbG9uZShyLmZyYWdtZW50KTpyLmZyYWdtZW50KS5jaGlsZE5vZGVzKSkpfSxwYXJzZUpTT046ZnVuY3Rpb24odCl7aWYoIXR8fHR5cGVvZiB0IT0ic3RyaW5nIilyZXR1cm4gbnVsbDt0PXYudHJpbSh0KTtpZihlLkpTT04mJmUuSlNPTi5wYXJzZSlyZXR1cm4gZS5KU09OLnBhcnNlKHQpO2lmKFMudGVzdCh0LnJlcGxhY2UoVCwiQCIpLnJlcGxhY2UoTiwiXSIpLnJlcGxhY2UoeCwiIikpKXJldHVybihuZXcgRnVuY3Rpb24oInJldHVybiAiK3QpKSgpO3YuZXJyb3IoIkludmFsaWQgSlNPTjogIit0KX0scGFyc2VYTUw6ZnVuY3Rpb24obil7dmFyIHIsaTtpZighbnx8dHlwZW9mIG4hPSJzdHJpbmciKXJldHVybiBudWxsO3RyeXtlLkRPTVBhcnNlcj8oaT1uZXcgRE9NUGFyc2VyLHI9aS5wYXJzZUZyb21TdHJpbmcobiwidGV4dC94bWwiKSk6KHI9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxyLmFzeW5jPSJmYWxzZSIsci5sb2FkWE1MKG4pKX1jYXRjaChzKXtyPXR9cmV0dXJuKCFyfHwhci5kb2N1bWVudEVsZW1lbnR8fHIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RoKSYmdi5lcnJvcigiSW52YWxpZCBYTUw6ICIrbikscn0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbih0KXt0JiZnLnRlc3QodCkmJihlLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKHQpe2UuZXZhbC5jYWxsKGUsdCl9KSh0KX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoQywibXMtIikucmVwbGFjZShrLEwpfSxub2RlTmFtZTpmdW5jdGlvbihlLHQpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10LnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLHM9MCxvPWUubGVuZ3RoLHU9bz09PXR8fHYuaXNGdW5jdGlvbihlKTtpZihyKXtpZih1KXtmb3IoaSBpbiBlKWlmKG4uYXBwbHkoZVtpXSxyKT09PSExKWJyZWFrfWVsc2UgZm9yKDtzPG87KWlmKG4uYXBwbHkoZVtzKytdLHIpPT09ITEpYnJlYWt9ZWxzZSBpZih1KXtmb3IoaSBpbiBlKWlmKG4uY2FsbChlW2ldLGksZVtpXSk9PT0hMSlicmVha31lbHNlIGZvcig7czxvOylpZihuLmNhbGwoZVtzXSxzLGVbcysrXSk9PT0hMSlicmVhaztyZXR1cm4gZX0sdHJpbTpkJiYhZC5jYWxsKCJcdWZlZmZcdTAwYTAiKT9mdW5jdGlvbihlKXtyZXR1cm4gZT09bnVsbD8iIjpkLmNhbGwoZSl9OmZ1bmN0aW9uKGUpe3JldHVybiBlPT1udWxsPyIiOihlKyIiKS5yZXBsYWNlKGIsIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXR8fFtdO3JldHVybiBlIT1udWxsJiYobj12LnR5cGUoZSksZS5sZW5ndGg9PW51bGx8fG49PT0ic3RyaW5nInx8bj09PSJmdW5jdGlvbiJ8fG49PT0icmVnZXhwInx8di5pc1dpbmRvdyhlKT9mLmNhbGwocixlKTp2Lm1lcmdlKHIsZSkpLHJ9LGluQXJyYXk6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKHQpe2lmKGMpcmV0dXJuIGMuY2FsbCh0LGUsbik7cj10Lmxlbmd0aCxuPW4/bjwwP01hdGgubWF4KDAscituKTpuOjA7Zm9yKDtuPHI7bisrKWlmKG4gaW4gdCYmdFtuXT09PWUpcmV0dXJuIG59cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGUsbil7dmFyIHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxzPTA7aWYodHlwZW9mIHI9PSJudW1iZXIiKWZvcig7czxyO3MrKyllW2krK109bltzXTtlbHNlIHdoaWxlKG5bc10hPT10KWVbaSsrXT1uW3MrK107cmV0dXJuIGUubGVuZ3RoPWksZX0sZ3JlcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT1bXSxzPTAsbz1lLmxlbmd0aDtuPSEhbjtmb3IoO3M8bztzKyspcj0hIXQoZVtzXSxzKSxuIT09ciYmaS5wdXNoKGVbc10pO3JldHVybiBpfSxtYXA6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLHMsbz1bXSx1PTAsYT1lLmxlbmd0aCxmPWUgaW5zdGFuY2VvZiB2fHxhIT09dCYmdHlwZW9mIGE9PSJudW1iZXIiJiYoYT4wJiZlWzBdJiZlW2EtMV18fGE9PT0wfHx2LmlzQXJyYXkoZSkpO2lmKGYpZm9yKDt1PGE7dSsrKWk9bihlW3VdLHUsciksaSE9bnVsbCYmKG9bby5sZW5ndGhdPWkpO2Vsc2UgZm9yKHMgaW4gZSlpPW4oZVtzXSxzLHIpLGkhPW51bGwmJihvW28ubGVuZ3RoXT1pKTtyZXR1cm4gby5jb25jYXQuYXBwbHkoW10sbyl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihlLG4pe3ZhciByLGkscztyZXR1cm4gdHlwZW9mIG49PSJzdHJpbmciJiYocj1lW25dLG49ZSxlPXIpLHYuaXNGdW5jdGlvbihlKT8oaT1sLmNhbGwoYXJndW1lbnRzLDIpLHM9ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseShuLGkuY29uY2F0KGwuY2FsbChhcmd1bWVudHMpKSl9LHMuZ3VpZD1lLmd1aWQ9ZS5ndWlkfHx2Lmd1aWQrKyxzKTp0fSxhY2Nlc3M6ZnVuY3Rpb24oZSxuLHIsaSxzLG8sdSl7dmFyIGEsZj1yPT1udWxsLGw9MCxjPWUubGVuZ3RoO2lmKHImJnR5cGVvZiByPT0ib2JqZWN0Iil7Zm9yKGwgaW4gcil2LmFjY2VzcyhlLG4sbCxyW2xdLDEsbyxpKTtzPTF9ZWxzZSBpZihpIT09dCl7YT11PT09dCYmdi5pc0Z1bmN0aW9uKGkpLGYmJihhPyhhPW4sbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGEuY2FsbCh2KGUpLG4pfSk6KG4uY2FsbChlLGkpLG49bnVsbCkpO2lmKG4pZm9yKDtsPGM7bCsrKW4oZVtsXSxyLGE/aS5jYWxsKGVbbF0sbCxuKGVbbF0scikpOmksdSk7cz0xfXJldHVybiBzP2U6Zj9uLmNhbGwoZSk6Yz9uKGVbMF0scik6b30sbm93OmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9fSksdi5yZWFkeS5wcm9taXNlPWZ1bmN0aW9uKHQpe2lmKCFyKXtyPXYuRGVmZXJyZWQoKTtpZihpLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKXNldFRpbWVvdXQodi5yZWFkeSwxKTtlbHNlIGlmKGkuYWRkRXZlbnRMaXN0ZW5lcilpLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEEsITEpLGUuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsdi5yZWFkeSwhMSk7ZWxzZXtpLmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEEpLGUuYXR0YWNoRXZlbnQoIm9ubG9hZCIsdi5yZWFkeSk7dmFyIG49ITE7dHJ5e249ZS5mcmFtZUVsZW1lbnQ9PW51bGwmJmkuZG9jdW1lbnRFbGVtZW50fWNhdGNoKHMpe31uJiZuLmRvU2Nyb2xsJiZmdW5jdGlvbiBvKCl7aWYoIXYuaXNSZWFkeSl7dHJ5e24uZG9TY3JvbGwoImxlZnQiKX1jYXRjaChlKXtyZXR1cm4gc2V0VGltZW91dChvLDUwKX12LnJlYWR5KCl9fSgpfX1yZXR1cm4gci5wcm9taXNlKHQpfSx2LmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtPWyJbb2JqZWN0ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pLG49dihpKTt2YXIgTT17fTt2LkNhbGxiYWNrcz1mdW5jdGlvbihlKXtlPXR5cGVvZiBlPT0ic3RyaW5nIj9NW2VdfHxfKGUpOnYuZXh0ZW5kKHt9LGUpO3ZhciBuLHIsaSxzLG8sdSxhPVtdLGY9IWUub25jZSYmW10sbD1mdW5jdGlvbih0KXtuPWUubWVtb3J5JiZ0LHI9ITAsdT1zfHwwLHM9MCxvPWEubGVuZ3RoLGk9ITA7Zm9yKDthJiZ1PG87dSsrKWlmKGFbdV0uYXBwbHkodFswXSx0WzFdKT09PSExJiZlLnN0b3BPbkZhbHNlKXtuPSExO2JyZWFrfWk9ITEsYSYmKGY/Zi5sZW5ndGgmJmwoZi5zaGlmdCgpKTpuP2E9W106Yy5kaXNhYmxlKCkpfSxjPXthZGQ6ZnVuY3Rpb24oKXtpZihhKXt2YXIgdD1hLmxlbmd0aDsoZnVuY3Rpb24gcih0KXt2LmVhY2godCxmdW5jdGlvbih0LG4pe3ZhciBpPXYudHlwZShuKTtpPT09ImZ1bmN0aW9uIj8oIWUudW5pcXVlfHwhYy5oYXMobikpJiZhLnB1c2gobik6biYmbi5sZW5ndGgmJmkhPT0ic3RyaW5nIiYmcihuKX0pfSkoYXJndW1lbnRzKSxpP289YS5sZW5ndGg6biYmKHM9dCxsKG4pKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGEmJnYuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXt2YXIgbjt3aGlsZSgobj12LmluQXJyYXkodCxhLG4pKT4tMSlhLnNwbGljZShuLDEpLGkmJihuPD1vJiZvLS0sbjw9dSYmdS0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gdi5pbkFycmF5KGUsYSk+LTF9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIGE9W10sdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBhPWY9bj10LHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWF9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZj10LG58fGMuZGlzYWJsZSgpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiFmfSxmaXJlV2l0aDpmdW5jdGlvbihlLHQpe3JldHVybiB0PXR8fFtdLHQ9W2UsdC5zbGljZT90LnNsaWNlKCk6dF0sYSYmKCFyfHxmKSYmKGk/Zi5wdXNoKHQpOmwodCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gYy5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXJ9fTtyZXR1cm4gY30sdi5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGUpe3ZhciB0PVtbInJlc29sdmUiLCJkb25lIix2LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLHYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZWplY3RlZCJdLFsibm90aWZ5IiwicHJvZ3Jlc3MiLHYuQ2FsbGJhY2tzKCJtZW1vcnkiKV1dLG49InBlbmRpbmciLHI9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG59LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBpLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sdGhlbjpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztyZXR1cm4gdi5EZWZlcnJlZChmdW5jdGlvbihuKXt2LmVhY2godCxmdW5jdGlvbih0LHIpe3ZhciBzPXJbMF0sbz1lW3RdO2lbclsxXV0odi5pc0Z1bmN0aW9uKG8pP2Z1bmN0aW9uKCl7dmFyIGU9by5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZSYmdi5pc0Z1bmN0aW9uKGUucHJvbWlzZSk/ZS5wcm9taXNlKCkuZG9uZShuLnJlc29sdmUpLmZhaWwobi5yZWplY3QpLnByb2dyZXNzKG4ubm90aWZ5KTpuW3MrIldpdGgiXSh0aGlzPT09aT9uOnRoaXMsW2VdKX06bltzXSl9KSxlPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPW51bGw/di5leHRlbmQoZSxyKTpyfX0saT17fTtyZXR1cm4gci5waXBlPXIudGhlbix2LmVhY2godCxmdW5jdGlvbihlLHMpe3ZhciBvPXNbMl0sdT1zWzNdO3Jbc1sxXV09by5hZGQsdSYmby5hZGQoZnVuY3Rpb24oKXtuPXV9LHRbZV4xXVsyXS5kaXNhYmxlLHRbMl1bMl0ubG9jayksaVtzWzBdXT1vLmZpcmUsaVtzWzBdKyJXaXRoIl09by5maXJlV2l0aH0pLHIucHJvbWlzZShpKSxlJiZlLmNhbGwoaSxpKSxpfSx3aGVuOmZ1bmN0aW9uKGUpe3ZhciB0PTAsbj1sLmNhbGwoYXJndW1lbnRzKSxyPW4ubGVuZ3RoLGk9ciE9PTF8fGUmJnYuaXNGdW5jdGlvbihlLnByb21pc2UpP3I6MCxzPWk9PT0xP2U6di5EZWZlcnJlZCgpLG89ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlvbihyKXt0W2VdPXRoaXMsbltlXT1hcmd1bWVudHMubGVuZ3RoPjE/bC5jYWxsKGFyZ3VtZW50cyk6cixuPT09dT9zLm5vdGlmeVdpdGgodCxuKTotLWl8fHMucmVzb2x2ZVdpdGgodCxuKX19LHUsYSxmO2lmKHI+MSl7dT1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkociksZj1uZXcgQXJyYXkocik7Zm9yKDt0PHI7dCsrKW5bdF0mJnYuaXNGdW5jdGlvbihuW3RdLnByb21pc2UpP25bdF0ucHJvbWlzZSgpLmRvbmUobyh0LGYsbikpLmZhaWwocy5yZWplY3QpLnByb2dyZXNzKG8odCxhLHUpKTotLWl9cmV0dXJuIGl8fHMucmVzb2x2ZVdpdGgoZixuKSxzLnByb21pc2UoKX19KSx2LnN1cHBvcnQ9ZnVuY3Rpb24oKXt2YXIgdCxuLHIscyxvLHUsYSxmLGwsYyxoLHA9aS5jcmVhdGVFbGVtZW50KCJkaXYiKTtwLnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLHAuaW5uZXJIVE1MPSIgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYSc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iLG49cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLHI9cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdO2lmKCFufHwhcnx8IW4ubGVuZ3RoKXJldHVybnt9O3M9aS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSxvPXMuYXBwZW5kQ2hpbGQoaS5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSksdT1wLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdLHIuc3R5bGUuY3NzVGV4dD0idG9wOjFweDtmbG9hdDpsZWZ0O29wYWNpdHk6LjUiLHQ9e2xlYWRpbmdXaGl0ZXNwYWNlOnAuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTMsdGJvZHk6IXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLGh0bWxTZXJpYWxpemU6ISFwLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLHN0eWxlOi90b3AvLnRlc3Qoci5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLGhyZWZOb3JtYWxpemVkOnIuZ2V0QXR0cmlidXRlKCJocmVmIik9PT0iL2EiLG9wYWNpdHk6L14wLjUvLnRlc3Qoci5zdHlsZS5vcGFjaXR5KSxjc3NGbG9hdDohIXIuc3R5bGUuY3NzRmxvYXQsY2hlY2tPbjp1LnZhbHVlPT09Im9uIixvcHRTZWxlY3RlZDpvLnNlbGVjdGVkLGdldFNldEF0dHJpYnV0ZTpwLmNsYXNzTmFtZSE9PSJ0IixlbmN0eXBlOiEhaS5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSxodG1sNUNsb25lOmkuY3JlYXRlRWxlbWVudCgibmF2IikuY2xvbmVOb2RlKCEwKS5vdXRlckhUTUwhPT0iPDpuYXY+PC86bmF2PiIsYm94TW9kZWw6aS5jb21wYXRNb2RlPT09IkNTUzFDb21wYXQiLHN1Ym1pdEJ1YmJsZXM6ITAsY2hhbmdlQnViYmxlczohMCxmb2N1c2luQnViYmxlczohMSxkZWxldGVFeHBhbmRvOiEwLG5vQ2xvbmVFdmVudDohMCxpbmxpbmVCbG9ja05lZWRzTGF5b3V0OiExLHNocmlua1dyYXBCbG9ja3M6ITEscmVsaWFibGVNYXJnaW5SaWdodDohMCxib3hTaXppbmdSZWxpYWJsZTohMCxwaXhlbFBvc2l0aW9uOiExfSx1LmNoZWNrZWQ9ITAsdC5ub0Nsb25lQ2hlY2tlZD11LmNsb25lTm9kZSghMCkuY2hlY2tlZCxzLmRpc2FibGVkPSEwLHQub3B0RGlzYWJsZWQ9IW8uZGlzYWJsZWQ7dHJ5e2RlbGV0ZSBwLnRlc3R9Y2F0Y2goZCl7dC5kZWxldGVFeHBhbmRvPSExfSFwLmFkZEV2ZW50TGlzdGVuZXImJnAuYXR0YWNoRXZlbnQmJnAuZmlyZUV2ZW50JiYocC5hdHRhY2hFdmVudCgib25jbGljayIsaD1mdW5jdGlvbigpe3Qubm9DbG9uZUV2ZW50PSExfSkscC5jbG9uZU5vZGUoITApLmZpcmVFdmVudCgib25jbGljayIpLHAuZGV0YWNoRXZlbnQoIm9uY2xpY2siLGgpKSx1PWkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSx1LnZhbHVlPSJ0Iix1LnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksdC5yYWRpb1ZhbHVlPXUudmFsdWU9PT0idCIsdS5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksdS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IikscC5hcHBlbmRDaGlsZCh1KSxhPWkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGEuYXBwZW5kQ2hpbGQocC5sYXN0Q2hpbGQpLHQuY2hlY2tDbG9uZT1hLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCx0LmFwcGVuZENoZWNrZWQ9dS5jaGVja2VkLGEucmVtb3ZlQ2hpbGQodSksYS5hcHBlbmRDaGlsZChwKTtpZihwLmF0dGFjaEV2ZW50KWZvcihsIGlue3N1Ym1pdDohMCxjaGFuZ2U6ITAsZm9jdXNpbjohMH0pZj0ib24iK2wsYz1mIGluIHAsY3x8KHAuc2V0QXR0cmlidXRlKGYsInJldHVybjsiKSxjPXR5cGVvZiBwW2ZdPT0iZnVuY3Rpb24iKSx0W2wrIkJ1YmJsZXMiXT1jO3JldHVybiB2KGZ1bmN0aW9uKCl7dmFyIG4scixzLG8sdT0icGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6aGlkZGVuOyIsYT1pLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07aWYoIWEpcmV0dXJuO249aS5jcmVhdGVFbGVtZW50KCJkaXYiKSxuLnN0eWxlLmNzc1RleHQ9InZpc2liaWxpdHk6aGlkZGVuO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7cG9zaXRpb246c3RhdGljO3RvcDowO21hcmdpbi10b3A6MXB4IixhLmluc2VydEJlZm9yZShuLGEuZmlyc3RDaGlsZCkscj1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG4uYXBwZW5kQ2hpbGQociksci5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLHM9ci5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxzWzBdLnN0eWxlLmNzc1RleHQ9InBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MDtkaXNwbGF5Om5vbmUiLGM9c1swXS5vZmZzZXRIZWlnaHQ9PT0wLHNbMF0uc3R5bGUuZGlzcGxheT0iIixzWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHQucmVsaWFibGVIaWRkZW5PZmZzZXRzPWMmJnNbMF0ub2Zmc2V0SGVpZ2h0PT09MCxyLmlubmVySFRNTD0iIixyLnN0eWxlLmNzc1RleHQ9ImJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjFweDtib3JkZXI6MXB4O2Rpc3BsYXk6YmxvY2s7d2lkdGg6NHB4O21hcmdpbi10b3A6MSU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjElOyIsdC5ib3hTaXppbmc9ci5vZmZzZXRXaWR0aD09PTQsdC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldD1hLm9mZnNldFRvcCE9PTEsZS5nZXRDb21wdXRlZFN0eWxlJiYodC5waXhlbFBvc2l0aW9uPShlLmdldENvbXB1dGVkU3R5bGUocixudWxsKXx8e30pLnRvcCE9PSIxJSIsdC5ib3hTaXppbmdSZWxpYWJsZT0oZS5nZXRDb21wdXRlZFN0eWxlKHIsbnVsbCl8fHt3aWR0aDoiNHB4In0pLndpZHRoPT09IjRweCIsbz1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG8uc3R5bGUuY3NzVGV4dD1yLnN0eWxlLmNzc1RleHQ9dSxvLnN0eWxlLm1hcmdpblJpZ2h0PW8uc3R5bGUud2lkdGg9IjAiLHIuc3R5bGUud2lkdGg9IjFweCIsci5hcHBlbmRDaGlsZChvKSx0LnJlbGlhYmxlTWFyZ2luUmlnaHQ9IXBhcnNlRmxvYXQoKGUuZ2V0Q29tcHV0ZWRTdHlsZShvLG51bGwpfHx7fSkubWFyZ2luUmlnaHQpKSx0eXBlb2Ygci5zdHlsZS56b29tIT0idW5kZWZpbmVkIiYmKHIuaW5uZXJIVE1MPSIiLHIuc3R5bGUuY3NzVGV4dD11KyJ3aWR0aDoxcHg7cGFkZGluZzoxcHg7ZGlzcGxheTppbmxpbmU7em9vbToxIix0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9ci5vZmZzZXRXaWR0aD09PTMsci5zdHlsZS5kaXNwbGF5PSJibG9jayIsci5zdHlsZS5vdmVyZmxvdz0idmlzaWJsZSIsci5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IixyLmZpcnN0Q2hpbGQuc3R5bGUud2lkdGg9IjVweCIsdC5zaHJpbmtXcmFwQmxvY2tzPXIub2Zmc2V0V2lkdGghPT0zLG4uc3R5bGUuem9vbT0xKSxhLnJlbW92ZUNoaWxkKG4pLG49cj1zPW89bnVsbH0pLGEucmVtb3ZlQ2hpbGQocCksbj1yPXM9bz11PWE9cD1udWxsLHR9KCk7dmFyIEQ9Lyg/Olx7W1xzXFNdKlx9fFxbW1xzXFNdKlxdKSQvLFA9LyhbQS1aXSkvZzt2LmV4dGVuZCh7Y2FjaGU6e30sZGVsZXRlZElkczpbXSx1dWlkOjAsZXhwYW5kbzoialF1ZXJ5Iisodi5mbi5qcXVlcnkrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksbm9EYXRhOntlbWJlZDohMCxvYmplY3Q6ImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsYXBwbGV0OiEwfSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiBlPWUubm9kZVR5cGU/di5jYWNoZVtlW3YuZXhwYW5kb11dOmVbdi5leHBhbmRvXSwhIWUmJiFCKGUpfSxkYXRhOmZ1bmN0aW9uKGUsbixyLGkpe2lmKCF2LmFjY2VwdERhdGEoZSkpcmV0dXJuO3ZhciBzLG8sdT12LmV4cGFuZG8sYT10eXBlb2Ygbj09InN0cmluZyIsZj1lLm5vZGVUeXBlLGw9Zj92LmNhY2hlOmUsYz1mP2VbdV06ZVt1XSYmdTtpZigoIWN8fCFsW2NdfHwhaSYmIWxbY10uZGF0YSkmJmEmJnI9PT10KXJldHVybjtjfHwoZj9lW3VdPWM9di5kZWxldGVkSWRzLnBvcCgpfHx2Lmd1aWQrKzpjPXUpLGxbY118fChsW2NdPXt9LGZ8fChsW2NdLnRvSlNPTj12Lm5vb3ApKTtpZih0eXBlb2Ygbj09Im9iamVjdCJ8fHR5cGVvZiBuPT0iZnVuY3Rpb24iKWk/bFtjXT12LmV4dGVuZChsW2NdLG4pOmxbY10uZGF0YT12LmV4dGVuZChsW2NdLmRhdGEsbik7cmV0dXJuIHM9bFtjXSxpfHwocy5kYXRhfHwocy5kYXRhPXt9KSxzPXMuZGF0YSksciE9PXQmJihzW3YuY2FtZWxDYXNlKG4pXT1yKSxhPyhvPXNbbl0sbz09bnVsbCYmKG89c1t2LmNhbWVsQ2FzZShuKV0pKTpvPXMsb30scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQsbil7aWYoIXYuYWNjZXB0RGF0YShlKSlyZXR1cm47dmFyIHIsaSxzLG89ZS5ub2RlVHlwZSx1PW8/di5jYWNoZTplLGE9bz9lW3YuZXhwYW5kb106di5leHBhbmRvO2lmKCF1W2FdKXJldHVybjtpZih0KXtyPW4/dVthXTp1W2FdLmRhdGE7aWYocil7di5pc0FycmF5KHQpfHwodCBpbiByP3Q9W3RdOih0PXYuY2FtZWxDYXNlKHQpLHQgaW4gcj90PVt0XTp0PXQuc3BsaXQoIiAiKSkpO2ZvcihpPTAscz10Lmxlbmd0aDtpPHM7aSsrKWRlbGV0ZSByW3RbaV1dO2lmKCEobj9COnYuaXNFbXB0eU9iamVjdCkocikpcmV0dXJufX1pZighbil7ZGVsZXRlIHVbYV0uZGF0YTtpZighQih1W2FdKSlyZXR1cm59bz92LmNsZWFuRGF0YShbZV0sITApOnYuc3VwcG9ydC5kZWxldGVFeHBhbmRvfHx1IT11LndpbmRvdz9kZWxldGUgdVthXTp1W2FdPW51bGx9LF9kYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdi5kYXRhKGUsdCxuLCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lJiZ2Lm5vRGF0YVtlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO3JldHVybiF0fHx0IT09ITAmJmUuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIik9PT10fX0pLHYuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGUsbil7dmFyIHIsaSxzLG8sdSxhPXRoaXNbMF0sZj0wLGw9bnVsbDtpZihlPT09dCl7aWYodGhpcy5sZW5ndGgpe2w9di5kYXRhKGEpO2lmKGEubm9kZVR5cGU9PT0xJiYhdi5fZGF0YShhLCJwYXJzZWRBdHRycyIpKXtzPWEuYXR0cmlidXRlcztmb3IodT1zLmxlbmd0aDtmPHU7ZisrKW89c1tmXS5uYW1lLG8uaW5kZXhPZigiZGF0YS0iKXx8KG89di5jYW1lbENhc2Uoby5zdWJzdHJpbmcoNSkpLEgoYSxvLGxbb10pKTt2Ll9kYXRhKGEsInBhcnNlZEF0dHJzIiwhMCl9fXJldHVybiBsfXJldHVybiB0eXBlb2YgZT09Im9iamVjdCI/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7di5kYXRhKHRoaXMsZSl9KToocj1lLnNwbGl0KCIuIiwyKSxyWzFdPXJbMV0/Ii4iK3JbMV06IiIsaT1yWzFdKyIhIix2LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKG4pe2lmKG49PT10KXJldHVybiBsPXRoaXMudHJpZ2dlckhhbmRsZXIoImdldERhdGEiK2ksW3JbMF1dKSxsPT09dCYmYSYmKGw9di5kYXRhKGEsZSksbD1IKGEsZSxsKSksbD09PXQmJnJbMV0/dGhpcy5kYXRhKHJbMF0pOmw7clsxXT1uLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PXYodGhpcyk7dC50cmlnZ2VySGFuZGxlcigic2V0RGF0YSIraSxyKSx2LmRhdGEodGhpcyxlLG4pLHQudHJpZ2dlckhhbmRsZXIoImNoYW5nZURhdGEiK2kscil9KX0sbnVsbCxuLGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCExKSl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3YucmVtb3ZlRGF0YSh0aGlzLGUpfSl9fSksdi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZihlKXJldHVybiB0PSh0fHwiZngiKSsicXVldWUiLHI9di5fZGF0YShlLHQpLG4mJighcnx8di5pc0FycmF5KG4pP3I9di5fZGF0YShlLHQsdi5tYWtlQXJyYXkobikpOnIucHVzaChuKSkscnx8W119LGRlcXVldWU6ZnVuY3Rpb24oZSx0KXt0PXR8fCJmeCI7dmFyIG49di5xdWV1ZShlLHQpLHI9bi5sZW5ndGgsaT1uLnNoaWZ0KCkscz12Ll9xdWV1ZUhvb2tzKGUsdCksbz1mdW5jdGlvbigpe3YuZGVxdWV1ZShlLHQpfTtpPT09ImlucHJvZ3Jlc3MiJiYoaT1uLnNoaWZ0KCksci0tKSxpJiYodD09PSJmeCImJm4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBzLnN0b3AsaS5jYWxsKGUsbyxzKSksIXImJnMmJnMuZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbihlLHQpe3ZhciBuPXQrInF1ZXVlSG9va3MiO3JldHVybiB2Ll9kYXRhKGUsbil8fHYuX2RhdGEoZSxuLHtlbXB0eTp2LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXt2LnJlbW92ZURhdGEoZSx0KyJxdWV1ZSIsITApLHYucmVtb3ZlRGF0YShlLG4sITApfSl9KX19KSx2LmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSxuKXt2YXIgcj0yO3JldHVybiB0eXBlb2YgZSE9InN0cmluZyImJihuPWUsZT0iZngiLHItLSksYXJndW1lbnRzLmxlbmd0aDxyP3YucXVldWUodGhpc1swXSxlKTpuPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PXYucXVldWUodGhpcyxlLG4pO3YuX3F1ZXVlSG9va3ModGhpcyxlKSxlPT09ImZ4IiYmdFswXSE9PSJpbnByb2dyZXNzIiYmdi5kZXF1ZXVlKHRoaXMsZSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7di5kZXF1ZXVlKHRoaXMsZSl9KX0sZGVsYXk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT12LmZ4P3YuZnguc3BlZWRzW2VdfHxlOmUsdD10fHwiZngiLHRoaXMucXVldWUodCxmdW5jdGlvbih0LG4pe3ZhciByPXNldFRpbWVvdXQodCxlKTtuLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQocil9fSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSxuKXt2YXIgcixpPTEscz12LkRlZmVycmVkKCksbz10aGlzLHU9dGhpcy5sZW5ndGgsYT1mdW5jdGlvbigpey0taXx8cy5yZXNvbHZlV2l0aChvLFtvXSl9O3R5cGVvZiBlIT0ic3RyaW5nIiYmKG49ZSxlPXQpLGU9ZXx8ImZ4Ijt3aGlsZSh1LS0pcj12Ll9kYXRhKG9bdV0sZSsicXVldWVIb29rcyIpLHImJnIuZW1wdHkmJihpKyssci5lbXB0eS5hZGQoYSkpO3JldHVybiBhKCkscy5wcm9taXNlKG4pfX0pO3ZhciBqLEYsSSxxPS9bXHRcclxuXS9nLFI9L1xyL2csVT0vXig/OmJ1dHRvbnxpbnB1dCkkL2ksej0vXig/OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSxXPS9eYSg/OnJlYXwpJC9pLFg9L14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZHxzZWxlY3RlZCkkL2ksVj12LnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlO3YuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHYuYWNjZXNzKHRoaXMsdi5hdHRyLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2LnJlbW92ZUF0dHIodGhpcyxlKX0pfSxwcm9wOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHYuYWNjZXNzKHRoaXMsdi5wcm9wLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGUpe3JldHVybiBlPXYucHJvcEZpeFtlXXx8ZSx0aGlzLmVhY2goZnVuY3Rpb24oKXt0cnl7dGhpc1tlXT10LGRlbGV0ZSB0aGlzW2VdfWNhdGNoKG4pe319KX0sYWRkQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGkscyxvLHU7aWYodi5pc0Z1bmN0aW9uKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7dih0aGlzKS5hZGRDbGFzcyhlLmNhbGwodGhpcyx0LHRoaXMuY2xhc3NOYW1lKSl9KTtpZihlJiZ0eXBlb2YgZT09InN0cmluZyIpe3Q9ZS5zcGxpdCh5KTtmb3Iobj0wLHI9dGhpcy5sZW5ndGg7bjxyO24rKyl7aT10aGlzW25dO2lmKGkubm9kZVR5cGU9PT0xKWlmKCFpLmNsYXNzTmFtZSYmdC5sZW5ndGg9PT0xKWkuY2xhc3NOYW1lPWU7ZWxzZXtzPSIgIitpLmNsYXNzTmFtZSsiICI7Zm9yKG89MCx1PXQubGVuZ3RoO288dTtvKyspcy5pbmRleE9mKCIgIit0W29dKyIgIik8MCYmKHMrPXRbb10rIiAiKTtpLmNsYXNzTmFtZT12LnRyaW0ocyl9fX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIG4scixpLHMsbyx1LGE7aWYodi5pc0Z1bmN0aW9uKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7dih0aGlzKS5yZW1vdmVDbGFzcyhlLmNhbGwodGhpcyx0LHRoaXMuY2xhc3NOYW1lKSl9KTtpZihlJiZ0eXBlb2YgZT09InN0cmluZyJ8fGU9PT10KXtuPShlfHwiIikuc3BsaXQoeSk7Zm9yKHU9MCxhPXRoaXMubGVuZ3RoO3U8YTt1Kyspe2k9dGhpc1t1XTtpZihpLm5vZGVUeXBlPT09MSYmaS5jbGFzc05hbWUpe3I9KCIgIitpLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UocSwiICIpO2ZvcihzPTAsbz1uLmxlbmd0aDtzPG87cysrKXdoaWxlKHIuaW5kZXhPZigiICIrbltzXSsiICIpPj0wKXI9ci5yZXBsYWNlKCIgIituW3NdKyIgIiwiICIpO2kuY2xhc3NOYW1lPWU/di50cmltKHIpOiIifX19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dHlwZW9mIGUscj10eXBlb2YgdD09ImJvb2xlYW4iO3JldHVybiB2LmlzRnVuY3Rpb24oZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3YodGhpcykudG9nZ2xlQ2xhc3MoZS5jYWxsKHRoaXMsbix0aGlzLmNsYXNzTmFtZSx0KSx0KX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe2lmKG49PT0ic3RyaW5nIil7dmFyIGkscz0wLG89dih0aGlzKSx1PXQsYT1lLnNwbGl0KHkpO3doaWxlKGk9YVtzKytdKXU9cj91OiFvLmhhc0NsYXNzKGkpLG9bdT8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKGkpfWVsc2UgaWYobj09PSJ1bmRlZmluZWQifHxuPT09ImJvb2xlYW4iKXRoaXMuY2xhc3NOYW1lJiZ2Ll9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKSx0aGlzLmNsYXNzTmFtZT10aGlzLmNsYXNzTmFtZXx8ZT09PSExPyIiOnYuX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIn0pfSxoYXNDbGFzczpmdW5jdGlvbihlKXt2YXIgdD0iICIrZSsiICIsbj0wLHI9dGhpcy5sZW5ndGg7Zm9yKDtuPHI7bisrKWlmKHRoaXNbbl0ubm9kZVR5cGU9PT0xJiYoIiAiK3RoaXNbbl0uY2xhc3NOYW1lKyIgIikucmVwbGFjZShxLCIgIikuaW5kZXhPZih0KT49MClyZXR1cm4hMDtyZXR1cm4hMX0sdmFsOmZ1bmN0aW9uKGUpe3ZhciBuLHIsaSxzPXRoaXNbMF07aWYoIWFyZ3VtZW50cy5sZW5ndGgpe2lmKHMpcmV0dXJuIG49di52YWxIb29rc1tzLnR5cGVdfHx2LnZhbEhvb2tzW3Mubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sbiYmImdldCJpbiBuJiYocj1uLmdldChzLCJ2YWx1ZSIpKSE9PXQ/cjoocj1zLnZhbHVlLHR5cGVvZiByPT0ic3RyaW5nIj9yLnJlcGxhY2UoUiwiIik6cj09bnVsbD8iIjpyKTtyZXR1cm59cmV0dXJuIGk9di5pc0Z1bmN0aW9uKGUpLHRoaXMuZWFjaChmdW5jdGlvbihyKXt2YXIgcyxvPXYodGhpcyk7aWYodGhpcy5ub2RlVHlwZSE9PTEpcmV0dXJuO2k/cz1lLmNhbGwodGhpcyxyLG8udmFsKCkpOnM9ZSxzPT1udWxsP3M9IiI6dHlwZW9mIHM9PSJudW1iZXIiP3MrPSIiOnYuaXNBcnJheShzKSYmKHM9di5tYXAocyxmdW5jdGlvbihlKXtyZXR1cm4gZT09bnVsbD8iIjplKyIifSkpLG49di52YWxIb29rc1t0aGlzLnR5cGVdfHx2LnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoIW58fCEoInNldCJpbiBuKXx8bi5zZXQodGhpcyxzLCJ2YWx1ZSIpPT09dCl0aGlzLnZhbHVlPXN9KX19KSx2LmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuYXR0cmlidXRlcy52YWx1ZTtyZXR1cm4hdHx8dC5zcGVjaWZpZWQ/ZS52YWx1ZTplLnRleHR9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihlKXt2YXIgdCxuLHI9ZS5vcHRpb25zLGk9ZS5zZWxlY3RlZEluZGV4LHM9ZS50eXBlPT09InNlbGVjdC1vbmUifHxpPDAsbz1zP251bGw6W10sdT1zP2krMTpyLmxlbmd0aCxhPWk8MD91OnM/aTowO2Zvcig7YTx1O2ErKyl7bj1yW2FdO2lmKChuLnNlbGVjdGVkfHxhPT09aSkmJih2LnN1cHBvcnQub3B0RGlzYWJsZWQ/IW4uZGlzYWJsZWQ6bi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIik9PT1udWxsKSYmKCFuLnBhcmVudE5vZGUuZGlzYWJsZWR8fCF2Lm5vZGVOYW1lKG4ucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe3Q9dihuKS52YWwoKTtpZihzKXJldHVybiB0O28ucHVzaCh0KX19cmV0dXJuIG99LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuPXYubWFrZUFycmF5KHQpO3JldHVybiB2KGUpLmZpbmQoIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPXYuaW5BcnJheSh2KHRoaXMpLnZhbCgpLG4pPj0wfSksbi5sZW5ndGh8fChlLnNlbGVjdGVkSW5kZXg9LTEpLG59fX0sYXR0ckZuOnt9LGF0dHI6ZnVuY3Rpb24oZSxuLHIsaSl7dmFyIHMsbyx1LGE9ZS5ub2RlVHlwZTtpZighZXx8YT09PTN8fGE9PT04fHxhPT09MilyZXR1cm47aWYoaSYmdi5pc0Z1bmN0aW9uKHYuZm5bbl0pKXJldHVybiB2KGUpW25dKHIpO2lmKHR5cGVvZiBlLmdldEF0dHJpYnV0ZT09InVuZGVmaW5lZCIpcmV0dXJuIHYucHJvcChlLG4scik7dT1hIT09MXx8IXYuaXNYTUxEb2MoZSksdSYmKG49bi50b0xvd2VyQ2FzZSgpLG89di5hdHRySG9va3Nbbl18fChYLnRlc3Qobik/RjpqKSk7aWYociE9PXQpe2lmKHI9PT1udWxsKXt2LnJlbW92ZUF0dHIoZSxuKTtyZXR1cm59cmV0dXJuIG8mJiJzZXQiaW4gbyYmdSYmKHM9by5zZXQoZSxyLG4pKSE9PXQ/czooZS5zZXRBdHRyaWJ1dGUobixyKyIiKSxyKX1yZXR1cm4gbyYmImdldCJpbiBvJiZ1JiYocz1vLmdldChlLG4pKSE9PW51bGw/czoocz1lLmdldEF0dHJpYnV0ZShuKSxzPT09bnVsbD90OnMpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLHMsbz0wO2lmKHQmJmUubm9kZVR5cGU9PT0xKXtyPXQuc3BsaXQoeSk7Zm9yKDtvPHIubGVuZ3RoO28rKylpPXJbb10saSYmKG49di5wcm9wRml4W2ldfHxpLHM9WC50ZXN0KGkpLHN8fHYuYXR0cihlLGksIiIpLGUucmVtb3ZlQXR0cmlidXRlKFY/aTpuKSxzJiZuIGluIGUmJihlW25dPSExKSl9fSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihlLHQpe2lmKFUudGVzdChlLm5vZGVOYW1lKSYmZS5wYXJlbnROb2RlKXYuZXJyb3IoInR5cGUgcHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCIpO2Vsc2UgaWYoIXYuc3VwcG9ydC5yYWRpb1ZhbHVlJiZ0PT09InJhZGlvIiYmdi5ub2RlTmFtZShlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fSx2YWx1ZTp7Z2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGomJnYubm9kZU5hbWUoZSwiYnV0dG9uIik/ai5nZXQoZSx0KTp0IGluIGU/ZS52YWx1ZTpudWxsfSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe2lmKGomJnYubm9kZU5hbWUoZSwiYnV0dG9uIikpcmV0dXJuIGouc2V0KGUsdCxuKTtlLnZhbHVlPXR9fX0scHJvcEZpeDp7dGFiaW5kZXg6InRhYkluZGV4IixyZWFkb25seToicmVhZE9ubHkiLCJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIscm93c3Bhbjoicm93U3BhbiIsY29sc3BhbjoiY29sU3BhbiIsdXNlbWFwOiJ1c2VNYXAiLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsY29udGVudGVkaXRhYmxlOiJjb250ZW50RWRpdGFibGUifSxwcm9wOmZ1bmN0aW9uKGUsbixyKXt2YXIgaSxzLG8sdT1lLm5vZGVUeXBlO2lmKCFlfHx1PT09M3x8dT09PTh8fHU9PT0yKXJldHVybjtyZXR1cm4gbz11IT09MXx8IXYuaXNYTUxEb2MoZSksbyYmKG49di5wcm9wRml4W25dfHxuLHM9di5wcm9wSG9va3Nbbl0pLHIhPT10P3MmJiJzZXQiaW4gcyYmKGk9cy5zZXQoZSxyLG4pKSE9PXQ/aTplW25dPXI6cyYmImdldCJpbiBzJiYoaT1zLmdldChlLG4pKSE9PW51bGw/aTplW25dfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIG49ZS5nZXRBdHRyaWJ1dGVOb2RlKCJ0YWJpbmRleCIpO3JldHVybiBuJiZuLnNwZWNpZmllZD9wYXJzZUludChuLnZhbHVlLDEwKTp6LnRlc3QoZS5ub2RlTmFtZSl8fFcudGVzdChlLm5vZGVOYW1lKSYmZS5ocmVmPzA6dH19fX0pLEY9e2dldDpmdW5jdGlvbihlLG4pe3ZhciByLGk9di5wcm9wKGUsbik7cmV0dXJuIGk9PT0hMHx8dHlwZW9mIGkhPSJib29sZWFuIiYmKHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKG4pKSYmci5ub2RlVmFsdWUhPT0hMT9uLnRvTG93ZXJDYXNlKCk6dH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4gdD09PSExP3YucmVtb3ZlQXR0cihlLG4pOihyPXYucHJvcEZpeFtuXXx8bixyIGluIGUmJihlW3JdPSEwKSxlLnNldEF0dHJpYnV0ZShuLG4udG9Mb3dlckNhc2UoKSkpLG59fSxWfHwoST17bmFtZTohMCxpZDohMCxjb29yZHM6ITB9LGo9di52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihlLG4pe3ZhciByO3JldHVybiByPWUuZ2V0QXR0cmlidXRlTm9kZShuKSxyJiYoSVtuXT9yLnZhbHVlIT09IiI6ci5zcGVjaWZpZWQpP3IudmFsdWU6dH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmdldEF0dHJpYnV0ZU5vZGUobik7cmV0dXJuIHJ8fChyPWkuY3JlYXRlQXR0cmlidXRlKG4pLGUuc2V0QXR0cmlidXRlTm9kZShyKSksci52YWx1ZT10KyIifX0sdi5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihlLHQpe3YuYXR0ckhvb2tzW3RdPXYuZXh0ZW5kKHYuYXR0ckhvb2tzW3RdLHtzZXQ6ZnVuY3Rpb24oZSxuKXtpZihuPT09IiIpcmV0dXJuIGUuc2V0QXR0cmlidXRlKHQsImF1dG8iKSxufX0pfSksdi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtnZXQ6ai5nZXQsc2V0OmZ1bmN0aW9uKGUsdCxuKXt0PT09IiImJih0PSJmYWxzZSIpLGouc2V0KGUsdCxuKX19KSx2LnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWR8fHYuZWFjaChbImhyZWYiLCJzcmMiLCJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGUsbil7di5hdHRySG9va3Nbbl09di5leHRlbmQodi5hdHRySG9va3Nbbl0se2dldDpmdW5jdGlvbihlKXt2YXIgcj1lLmdldEF0dHJpYnV0ZShuLDIpO3JldHVybiByPT09bnVsbD90OnJ9fSl9KSx2LnN1cHBvcnQuc3R5bGV8fCh2LmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKXx8dH0sc2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuc3R5bGUuY3NzVGV4dD10KyIifX0pLHYuc3VwcG9ydC5vcHRTZWxlY3RlZHx8KHYucHJvcEhvb2tzLnNlbGVjdGVkPXYuZXh0ZW5kKHYucHJvcEhvb2tzLnNlbGVjdGVkLHtnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYodC5zZWxlY3RlZEluZGV4LHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpLG51bGx9fSkpLHYuc3VwcG9ydC5lbmN0eXBlfHwodi5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIiksdi5zdXBwb3J0LmNoZWNrT258fHYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe3YudmFsSG9va3NbdGhpc109e2dldDpmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT1udWxsPyJvbiI6ZS52YWx1ZX19fSksdi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7di52YWxIb29rc1t0aGlzXT12LmV4dGVuZCh2LnZhbEhvb2tzW3RoaXNdLHtzZXQ6ZnVuY3Rpb24oZSx0KXtpZih2LmlzQXJyYXkodCkpcmV0dXJuIGUuY2hlY2tlZD12LmluQXJyYXkodihlKS52YWwoKSx0KT49MH19KX0pO3ZhciAkPS9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSxKPS9eKFteXC5dKnwpKD86XC4oLispfCkkLyxLPS8oPzpefFxzKWhvdmVyKFwuXFMrfClcYi8sUT0vXmtleS8sRz0vXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sWT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sWj1mdW5jdGlvbihlKXtyZXR1cm4gdi5ldmVudC5zcGVjaWFsLmhvdmVyP2U6ZS5yZXBsYWNlKEssIm1vdXNlZW50ZXIkMSBtb3VzZWxlYXZlJDEiKX07di5ldmVudD17YWRkOmZ1bmN0aW9uKGUsbixyLGkscyl7dmFyIG8sdSxhLGYsbCxjLGgscCxkLG0sZztpZihlLm5vZGVUeXBlPT09M3x8ZS5ub2RlVHlwZT09PTh8fCFufHwhcnx8IShvPXYuX2RhdGEoZSkpKXJldHVybjtyLmhhbmRsZXImJihkPXIscj1kLmhhbmRsZXIscz1kLnNlbGVjdG9yKSxyLmd1aWR8fChyLmd1aWQ9di5ndWlkKyspLGE9by5ldmVudHMsYXx8KG8uZXZlbnRzPWE9e30pLHU9by5oYW5kbGUsdXx8KG8uaGFuZGxlPXU9ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiB2PT0idW5kZWZpbmVkInx8ISFlJiZ2LmV2ZW50LnRyaWdnZXJlZD09PWUudHlwZT90OnYuZXZlbnQuZGlzcGF0Y2guYXBwbHkodS5lbGVtLGFyZ3VtZW50cyl9LHUuZWxlbT1lKSxuPXYudHJpbShaKG4pKS5zcGxpdCgiICIpO2ZvcihmPTA7ZjxuLmxlbmd0aDtmKyspe2w9Si5leGVjKG5bZl0pfHxbXSxjPWxbMV0saD0obFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGc9di5ldmVudC5zcGVjaWFsW2NdfHx7fSxjPShzP2cuZGVsZWdhdGVUeXBlOmcuYmluZFR5cGUpfHxjLGc9di5ldmVudC5zcGVjaWFsW2NdfHx7fSxwPXYuZXh0ZW5kKHt0eXBlOmMsb3JpZ1R5cGU6bFsxXSxkYXRhOmksaGFuZGxlcjpyLGd1aWQ6ci5ndWlkLHNlbGVjdG9yOnMsbmVlZHNDb250ZXh0OnMmJnYuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChzKSxuYW1lc3BhY2U6aC5qb2luKCIuIil9LGQpLG09YVtjXTtpZighbSl7bT1hW2NdPVtdLG0uZGVsZWdhdGVDb3VudD0wO2lmKCFnLnNldHVwfHxnLnNldHVwLmNhbGwoZSxpLGgsdSk9PT0hMSllLmFkZEV2ZW50TGlzdGVuZXI/ZS5hZGRFdmVudExpc3RlbmVyKGMsdSwhMSk6ZS5hdHRhY2hFdmVudCYmZS5hdHRhY2hFdmVudCgib24iK2MsdSl9Zy5hZGQmJihnLmFkZC5jYWxsKGUscCkscC5oYW5kbGVyLmd1aWR8fChwLmhhbmRsZXIuZ3VpZD1yLmd1aWQpKSxzP20uc3BsaWNlKG0uZGVsZWdhdGVDb3VudCsrLDAscCk6bS5wdXNoKHApLHYuZXZlbnQuZ2xvYmFsW2NdPSEwfWU9bnVsbH0sZ2xvYmFsOnt9LHJlbW92ZTpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzLG8sdSxhLGYsbCxjLGgscCxkLG0sZz12Lmhhc0RhdGEoZSkmJnYuX2RhdGEoZSk7aWYoIWd8fCEoaD1nLmV2ZW50cykpcmV0dXJuO3Q9di50cmltKFoodHx8IiIpKS5zcGxpdCgiICIpO2ZvcihzPTA7czx0Lmxlbmd0aDtzKyspe289Si5leGVjKHRbc10pfHxbXSx1PWE9b1sxXSxmPW9bMl07aWYoIXUpe2Zvcih1IGluIGgpdi5ldmVudC5yZW1vdmUoZSx1K3Rbc10sbixyLCEwKTtjb250aW51ZX1wPXYuZXZlbnQuc3BlY2lhbFt1XXx8e30sdT0ocj9wLmRlbGVnYXRlVHlwZTpwLmJpbmRUeXBlKXx8dSxkPWhbdV18fFtdLGw9ZC5sZW5ndGgsZj1mP25ldyBSZWdFeHAoIihefFxcLikiK2Yuc3BsaXQoIi4iKS5zb3J0KCkuam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbDtmb3IoYz0wO2M8ZC5sZW5ndGg7YysrKW09ZFtjXSwoaXx8YT09PW0ub3JpZ1R5cGUpJiYoIW58fG4uZ3VpZD09PW0uZ3VpZCkmJighZnx8Zi50ZXN0KG0ubmFtZXNwYWNlKSkmJighcnx8cj09PW0uc2VsZWN0b3J8fHI9PT0iKioiJiZtLnNlbGVjdG9yKSYmKGQuc3BsaWNlKGMtLSwxKSxtLnNlbGVjdG9yJiZkLmRlbGVnYXRlQ291bnQtLSxwLnJlbW92ZSYmcC5yZW1vdmUuY2FsbChlLG0pKTtkLmxlbmd0aD09PTAmJmwhPT1kLmxlbmd0aCYmKCghcC50ZWFyZG93bnx8cC50ZWFyZG93bi5jYWxsKGUsZixnLmhhbmRsZSk9PT0hMSkmJnYucmVtb3ZlRXZlbnQoZSx1LGcuaGFuZGxlKSxkZWxldGUgaFt1XSl9di5pc0VtcHR5T2JqZWN0KGgpJiYoZGVsZXRlIGcuaGFuZGxlLHYucmVtb3ZlRGF0YShlLCJldmVudHMiLCEwKSl9LGN1c3RvbUV2ZW50OntnZXREYXRhOiEwLHNldERhdGE6ITAsY2hhbmdlRGF0YTohMH0sdHJpZ2dlcjpmdW5jdGlvbihuLHIscyxvKXtpZighc3x8cy5ub2RlVHlwZSE9PTMmJnMubm9kZVR5cGUhPT04KXt2YXIgdSxhLGYsbCxjLGgscCxkLG0sZyx5PW4udHlwZXx8bixiPVtdO2lmKFkudGVzdCh5K3YuZXZlbnQudHJpZ2dlcmVkKSlyZXR1cm47eS5pbmRleE9mKCIhIik+PTAmJih5PXkuc2xpY2UoMCwtMSksYT0hMCkseS5pbmRleE9mKCIuIik+PTAmJihiPXkuc3BsaXQoIi4iKSx5PWIuc2hpZnQoKSxiLnNvcnQoKSk7aWYoKCFzfHx2LmV2ZW50LmN1c3RvbUV2ZW50W3ldKSYmIXYuZXZlbnQuZ2xvYmFsW3ldKXJldHVybjtuPXR5cGVvZiBuPT0ib2JqZWN0Ij9uW3YuZXhwYW5kb10/bjpuZXcgdi5FdmVudCh5LG4pOm5ldyB2LkV2ZW50KHkpLG4udHlwZT15LG4uaXNUcmlnZ2VyPSEwLG4uZXhjbHVzaXZlPWEsbi5uYW1lc3BhY2U9Yi5qb2luKCIuIiksbi5uYW1lc3BhY2VfcmU9bi5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIrYi5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGg9eS5pbmRleE9mKCI6Iik8MD8ib24iK3k6IiI7aWYoIXMpe3U9di5jYWNoZTtmb3IoZiBpbiB1KXVbZl0uZXZlbnRzJiZ1W2ZdLmV2ZW50c1t5XSYmdi5ldmVudC50cmlnZ2VyKG4scix1W2ZdLmhhbmRsZS5lbGVtLCEwKTtyZXR1cm59bi5yZXN1bHQ9dCxuLnRhcmdldHx8KG4udGFyZ2V0PXMpLHI9ciE9bnVsbD92Lm1ha2VBcnJheShyKTpbXSxyLnVuc2hpZnQobikscD12LmV2ZW50LnNwZWNpYWxbeV18fHt9O2lmKHAudHJpZ2dlciYmcC50cmlnZ2VyLmFwcGx5KHMscik9PT0hMSlyZXR1cm47bT1bW3MscC5iaW5kVHlwZXx8eV1dO2lmKCFvJiYhcC5ub0J1YmJsZSYmIXYuaXNXaW5kb3cocykpe2c9cC5kZWxlZ2F0ZVR5cGV8fHksbD1ZLnRlc3QoZyt5KT9zOnMucGFyZW50Tm9kZTtmb3IoYz1zO2w7bD1sLnBhcmVudE5vZGUpbS5wdXNoKFtsLGddKSxjPWw7Yz09PShzLm93bmVyRG9jdW1lbnR8fGkpJiZtLnB1c2goW2MuZGVmYXVsdFZpZXd8fGMucGFyZW50V2luZG93fHxlLGddKX1mb3IoZj0wO2Y8bS5sZW5ndGgmJiFuLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7ZisrKWw9bVtmXVswXSxuLnR5cGU9bVtmXVsxXSxkPSh2Ll9kYXRhKGwsImV2ZW50cyIpfHx7fSlbbi50eXBlXSYmdi5fZGF0YShsLCJoYW5kbGUiKSxkJiZkLmFwcGx5KGwsciksZD1oJiZsW2hdLGQmJnYuYWNjZXB0RGF0YShsKSYmZC5hcHBseSYmZC5hcHBseShsLHIpPT09ITEmJm4ucHJldmVudERlZmF1bHQoKTtyZXR1cm4gbi50eXBlPXksIW8mJiFuLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYoIXAuX2RlZmF1bHR8fHAuX2RlZmF1bHQuYXBwbHkocy5vd25lckRvY3VtZW50LHIpPT09ITEpJiYoeSE9PSJjbGljayJ8fCF2Lm5vZGVOYW1lKHMsImEiKSkmJnYuYWNjZXB0RGF0YShzKSYmaCYmc1t5XSYmKHkhPT0iZm9jdXMiJiZ5IT09ImJsdXIifHxuLnRhcmdldC5vZmZzZXRXaWR0aCE9PTApJiYhdi5pc1dpbmRvdyhzKSYmKGM9c1toXSxjJiYoc1toXT1udWxsKSx2LmV2ZW50LnRyaWdnZXJlZD15LHNbeV0oKSx2LmV2ZW50LnRyaWdnZXJlZD10LGMmJihzW2hdPWMpKSxuLnJlc3VsdH1yZXR1cm59LGRpc3BhdGNoOmZ1bmN0aW9uKG4pe249di5ldmVudC5maXgobnx8ZS5ldmVudCk7dmFyIHIsaSxzLG8sdSxhLGYsYyxoLHAsZD0odi5fZGF0YSh0aGlzLCJldmVudHMiKXx8e30pW24udHlwZV18fFtdLG09ZC5kZWxlZ2F0ZUNvdW50LGc9bC5jYWxsKGFyZ3VtZW50cykseT0hbi5leGNsdXNpdmUmJiFuLm5hbWVzcGFjZSxiPXYuZXZlbnQuc3BlY2lhbFtuLnR5cGVdfHx7fSx3PVtdO2dbMF09bixuLmRlbGVnYXRlVGFyZ2V0PXRoaXM7aWYoYi5wcmVEaXNwYXRjaCYmYi5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsbik9PT0hMSlyZXR1cm47aWYobSYmKCFuLmJ1dHRvbnx8bi50eXBlIT09ImNsaWNrIikpZm9yKHM9bi50YXJnZXQ7cyE9dGhpcztzPXMucGFyZW50Tm9kZXx8dGhpcylpZihzLmRpc2FibGVkIT09ITB8fG4udHlwZSE9PSJjbGljayIpe3U9e30sZj1bXTtmb3Iocj0wO3I8bTtyKyspYz1kW3JdLGg9Yy5zZWxlY3Rvcix1W2hdPT09dCYmKHVbaF09Yy5uZWVkc0NvbnRleHQ/dihoLHRoaXMpLmluZGV4KHMpPj0wOnYuZmluZChoLHRoaXMsbnVsbCxbc10pLmxlbmd0aCksdVtoXSYmZi5wdXNoKGMpO2YubGVuZ3RoJiZ3LnB1c2goe2VsZW06cyxtYXRjaGVzOmZ9KX1kLmxlbmd0aD5tJiZ3LnB1c2goe2VsZW06dGhpcyxtYXRjaGVzOmQuc2xpY2UobSl9KTtmb3Iocj0wO3I8dy5sZW5ndGgmJiFuLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7cisrKXthPXdbcl0sbi5jdXJyZW50VGFyZ2V0PWEuZWxlbTtmb3IoaT0wO2k8YS5tYXRjaGVzLmxlbmd0aCYmIW4uaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTtpKyspe2M9YS5tYXRjaGVzW2ldO2lmKHl8fCFuLm5hbWVzcGFjZSYmIWMubmFtZXNwYWNlfHxuLm5hbWVzcGFjZV9yZSYmbi5uYW1lc3BhY2VfcmUudGVzdChjLm5hbWVzcGFjZSkpbi5kYXRhPWMuZGF0YSxuLmhhbmRsZU9iaj1jLG89KCh2LmV2ZW50LnNwZWNpYWxbYy5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fGMuaGFuZGxlcikuYXBwbHkoYS5lbGVtLGcpLG8hPT10JiYobi5yZXN1bHQ9byxvPT09ITEmJihuLnByZXZlbnREZWZhdWx0KCksbi5zdG9wUHJvcGFnYXRpb24oKSkpfX1yZXR1cm4gYi5wb3N0RGlzcGF0Y2gmJmIucG9zdERpc3BhdGNoLmNhbGwodGhpcyxuKSxuLnJlc3VsdH0scHJvcHM6ImF0dHJDaGFuZ2UgYXR0ck5hbWUgcmVsYXRlZE5vZGUgc3JjRWxlbWVudCBhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksZml4SG9va3M6e30sa2V5SG9va3M6e3Byb3BzOiJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBlLndoaWNoPT1udWxsJiYoZS53aGljaD10LmNoYXJDb2RlIT1udWxsP3QuY2hhckNvZGU6dC5rZXlDb2RlKSxlfX0sbW91c2VIb29rczp7cHJvcHM6ImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBmcm9tRWxlbWVudCBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oZSxuKXt2YXIgcixzLG8sdT1uLmJ1dHRvbixhPW4uZnJvbUVsZW1lbnQ7cmV0dXJuIGUucGFnZVg9PW51bGwmJm4uY2xpZW50WCE9bnVsbCYmKHI9ZS50YXJnZXQub3duZXJEb2N1bWVudHx8aSxzPXIuZG9jdW1lbnRFbGVtZW50LG89ci5ib2R5LGUucGFnZVg9bi5jbGllbnRYKyhzJiZzLnNjcm9sbExlZnR8fG8mJm8uc2Nyb2xsTGVmdHx8MCktKHMmJnMuY2xpZW50TGVmdHx8byYmby5jbGllbnRMZWZ0fHwwKSxlLnBhZ2VZPW4uY2xpZW50WSsocyYmcy5zY3JvbGxUb3B8fG8mJm8uc2Nyb2xsVG9wfHwwKS0ocyYmcy5jbGllbnRUb3B8fG8mJm8uY2xpZW50VG9wfHwwKSksIWUucmVsYXRlZFRhcmdldCYmYSYmKGUucmVsYXRlZFRhcmdldD1hPT09ZS50YXJnZXQ/bi50b0VsZW1lbnQ6YSksIWUud2hpY2gmJnUhPT10JiYoZS53aGljaD11JjE/MTp1JjI/Mzp1JjQ/MjowKSxlfX0sZml4OmZ1bmN0aW9uKGUpe2lmKGVbdi5leHBhbmRvXSlyZXR1cm4gZTt2YXIgdCxuLHI9ZSxzPXYuZXZlbnQuZml4SG9va3NbZS50eXBlXXx8e30sbz1zLnByb3BzP3RoaXMucHJvcHMuY29uY2F0KHMucHJvcHMpOnRoaXMucHJvcHM7ZT12LkV2ZW50KHIpO2Zvcih0PW8ubGVuZ3RoO3Q7KW49b1stLXRdLGVbbl09cltuXTtyZXR1cm4gZS50YXJnZXR8fChlLnRhcmdldD1yLnNyY0VsZW1lbnR8fGkpLGUudGFyZ2V0Lm5vZGVUeXBlPT09MyYmKGUudGFyZ2V0PWUudGFyZ2V0LnBhcmVudE5vZGUpLGUubWV0YUtleT0hIWUubWV0YUtleSxzLmZpbHRlcj9zLmZpbHRlcihlLHIpOmV9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7ZGVsZWdhdGVUeXBlOiJmb2N1c2luIn0sYmx1cjp7ZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGJlZm9yZXVubG9hZDp7c2V0dXA6ZnVuY3Rpb24oZSx0LG4pe3YuaXNXaW5kb3codGhpcykmJih0aGlzLm9uYmVmb3JldW5sb2FkPW4pfSx0ZWFyZG93bjpmdW5jdGlvbihlLHQpe3RoaXMub25iZWZvcmV1bmxvYWQ9PT10JiYodGhpcy5vbmJlZm9yZXVubG9hZD1udWxsKX19fSxzaW11bGF0ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT12LmV4dGVuZChuZXcgdi5FdmVudCxuLHt0eXBlOmUsaXNTaW11bGF0ZWQ6ITAsb3JpZ2luYWxFdmVudDp7fX0pO3I/di5ldmVudC50cmlnZ2VyKGksbnVsbCx0KTp2LmV2ZW50LmRpc3BhdGNoLmNhbGwodCxpKSxpLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZuLnByZXZlbnREZWZhdWx0KCl9fSx2LmV2ZW50LmhhbmRsZT12LmV2ZW50LmRpc3BhdGNoLHYucmVtb3ZlRXZlbnQ9aS5yZW1vdmVFdmVudExpc3RlbmVyP2Z1bmN0aW9uKGUsdCxuKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXImJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4sITEpfTpmdW5jdGlvbihlLHQsbil7dmFyIHI9Im9uIit0O2UuZGV0YWNoRXZlbnQmJih0eXBlb2YgZVtyXT09InVuZGVmaW5lZCImJihlW3JdPW51bGwpLGUuZGV0YWNoRXZlbnQocixuKSl9LHYuRXZlbnQ9ZnVuY3Rpb24oZSx0KXtpZighKHRoaXMgaW5zdGFuY2VvZiB2LkV2ZW50KSlyZXR1cm4gbmV3IHYuRXZlbnQoZSx0KTtlJiZlLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1lLHRoaXMudHlwZT1lLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9ZS5kZWZhdWx0UHJldmVudGVkfHxlLnJldHVyblZhbHVlPT09ITF8fGUuZ2V0UHJldmVudERlZmF1bHQmJmUuZ2V0UHJldmVudERlZmF1bHQoKT90dDpldCk6dGhpcy50eXBlPWUsdCYmdi5leHRlbmQodGhpcyx0KSx0aGlzLnRpbWVTdGFtcD1lJiZlLnRpbWVTdGFtcHx8di5ub3coKSx0aGlzW3YuZXhwYW5kb109ITB9LHYuRXZlbnQucHJvdG90eXBlPXtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPXR0O3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDtpZighZSlyZXR1cm47ZS5wcmV2ZW50RGVmYXVsdD9lLnByZXZlbnREZWZhdWx0KCk6ZS5yZXR1cm5WYWx1ZT0hMX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD10dDt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7aWYoIWUpcmV0dXJuO2Uuc3RvcFByb3BhZ2F0aW9uJiZlLnN0b3BQcm9wYWdhdGlvbigpLGUuY2FuY2VsQnViYmxlPSEwfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPXR0LHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9LGlzRGVmYXVsdFByZXZlbnRlZDpldCxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpldCxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpldH0sdi5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0sZnVuY3Rpb24oZSx0KXt2LmV2ZW50LnNwZWNpYWxbZV09e2RlbGVnYXRlVHlwZTp0LGJpbmRUeXBlOnQsaGFuZGxlOmZ1bmN0aW9uKGUpe3ZhciBuLHI9dGhpcyxpPWUucmVsYXRlZFRhcmdldCxzPWUuaGFuZGxlT2JqLG89cy5zZWxlY3RvcjtpZighaXx8aSE9PXImJiF2LmNvbnRhaW5zKHIsaSkpZS50eXBlPXMub3JpZ1R5cGUsbj1zLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT10O3JldHVybiBufX19KSx2LnN1cHBvcnQuc3VibWl0QnViYmxlc3x8KHYuZXZlbnQuc3BlY2lhbC5zdWJtaXQ9e3NldHVwOmZ1bmN0aW9uKCl7aWYodi5ub2RlTmFtZSh0aGlzLCJmb3JtIikpcmV0dXJuITE7di5ldmVudC5hZGQodGhpcywiY2xpY2suX3N1Ym1pdCBrZXlwcmVzcy5fc3VibWl0IixmdW5jdGlvbihlKXt2YXIgbj1lLnRhcmdldCxyPXYubm9kZU5hbWUobiwiaW5wdXQiKXx8di5ub2RlTmFtZShuLCJidXR0b24iKT9uLmZvcm06dDtyJiYhdi5fZGF0YShyLCJfc3VibWl0X2F0dGFjaGVkIikmJih2LmV2ZW50LmFkZChyLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oZSl7ZS5fc3VibWl0X2J1YmJsZT0hMH0pLHYuX2RhdGEociwiX3N1Ym1pdF9hdHRhY2hlZCIsITApKX0pfSxwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oZSl7ZS5fc3VibWl0X2J1YmJsZSYmKGRlbGV0ZSBlLl9zdWJtaXRfYnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWUuaXNUcmlnZ2VyJiZ2LmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxlLCEwKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7aWYodi5ub2RlTmFtZSh0aGlzLCJmb3JtIikpcmV0dXJuITE7di5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSx2LnN1cHBvcnQuY2hhbmdlQnViYmxlc3x8KHYuZXZlbnQuc3BlY2lhbC5jaGFuZ2U9e3NldHVwOmZ1bmN0aW9uKCl7aWYoJC50ZXN0KHRoaXMubm9kZU5hbWUpKXtpZih0aGlzLnR5cGU9PT0iY2hlY2tib3gifHx0aGlzLnR5cGU9PT0icmFkaW8iKXYuZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpe2Uub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWU9PT0iY2hlY2tlZCImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSksdi5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oZSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhZS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEpLHYuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxlLCEwKX0pO3JldHVybiExfXYuZXZlbnQuYWRkKHRoaXMsImJlZm9yZWFjdGl2YXRlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0OyQudGVzdCh0Lm5vZGVOYW1lKSYmIXYuX2RhdGEodCwiX2NoYW5nZV9hdHRhY2hlZCIpJiYodi5ldmVudC5hZGQodCwiY2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpe3RoaXMucGFyZW50Tm9kZSYmIWUuaXNTaW11bGF0ZWQmJiFlLmlzVHJpZ2dlciYmdi5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsZSwhMCl9KSx2Ll9kYXRhKHQsIl9jaGFuZ2VfYXR0YWNoZWQiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0O2lmKHRoaXMhPT10fHxlLmlzU2ltdWxhdGVkfHxlLmlzVHJpZ2dlcnx8dC50eXBlIT09InJhZGlvIiYmdC50eXBlIT09ImNoZWNrYm94IilyZXR1cm4gZS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIHYuZXZlbnQucmVtb3ZlKHRoaXMsIi5fY2hhbmdlIiksISQudGVzdCh0aGlzLm5vZGVOYW1lKX19KSx2LnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXN8fHYuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXt2YXIgbj0wLHI9ZnVuY3Rpb24oZSl7di5ldmVudC5zaW11bGF0ZSh0LGUudGFyZ2V0LHYuZXZlbnQuZml4KGUpLCEwKX07di5ldmVudC5zcGVjaWFsW3RdPXtzZXR1cDpmdW5jdGlvbigpe24rKz09PTAmJmkuYWRkRXZlbnRMaXN0ZW5lcihlLHIsITApfSx0ZWFyZG93bjpmdW5jdGlvbigpey0tbj09PTAmJmkucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHIsITApfX19KSx2LmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oZSxuLHIsaSxzKXt2YXIgbyx1O2lmKHR5cGVvZiBlPT0ib2JqZWN0Iil7dHlwZW9mIG4hPSJzdHJpbmciJiYocj1yfHxuLG49dCk7Zm9yKHUgaW4gZSl0aGlzLm9uKHUsbixyLGVbdV0scyk7cmV0dXJuIHRoaXN9cj09bnVsbCYmaT09bnVsbD8oaT1uLHI9bj10KTppPT1udWxsJiYodHlwZW9mIG49PSJzdHJpbmciPyhpPXIscj10KTooaT1yLHI9bixuPXQpKTtpZihpPT09ITEpaT1ldDtlbHNlIGlmKCFpKXJldHVybiB0aGlzO3JldHVybiBzPT09MSYmKG89aSxpPWZ1bmN0aW9uKGUpe3JldHVybiB2KCkub2ZmKGUpLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxpLmd1aWQ9by5ndWlkfHwoby5ndWlkPXYuZ3VpZCsrKSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7di5ldmVudC5hZGQodGhpcyxlLGkscixuKX0pfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24oZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsbixyKXt2YXIgaSxzO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiBpPWUuaGFuZGxlT2JqLHYoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKGkubmFtZXNwYWNlP2kub3JpZ1R5cGUrIi4iK2kubmFtZXNwYWNlOmkub3JpZ1R5cGUsaS5zZWxlY3RvcixpLmhhbmRsZXIpLHRoaXM7aWYodHlwZW9mIGU9PSJvYmplY3QiKXtmb3IocyBpbiBlKXRoaXMub2ZmKHMsbixlW3NdKTtyZXR1cm4gdGhpc31pZihuPT09ITF8fHR5cGVvZiBuPT0iZnVuY3Rpb24iKXI9bixuPXQ7cmV0dXJuIHI9PT0hMSYmKHI9ZXQpLHRoaXMuZWFjaChmdW5jdGlvbigpe3YuZXZlbnQucmVtb3ZlKHRoaXMsZSxyLG4pfSl9LGJpbmQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm9uKGUsbnVsbCx0LG4pfSx1bmJpbmQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vZmYoZSxudWxsLHQpfSxsaXZlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdih0aGlzLmNvbnRleHQpLm9uKGUsdGhpcy5zZWxlY3Rvcix0LG4pLHRoaXN9LGRpZTpmdW5jdGlvbihlLHQpe3JldHVybiB2KHRoaXMuY29udGV4dCkub2ZmKGUsdGhpcy5zZWxlY3Rvcnx8IioqIix0KSx0aGlzfSxkZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbih0LGUsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0xP3RoaXMub2ZmKGUsIioqIik6dGhpcy5vZmYodCxlfHwiKioiLG4pfSx0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3YuZXZlbnQudHJpZ2dlcihlLHQsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oZSx0KXtpZih0aGlzWzBdKXJldHVybiB2LmV2ZW50LnRyaWdnZXIoZSx0LHRoaXNbMF0sITApfSx0b2dnbGU6ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLG49ZS5ndWlkfHx2Lmd1aWQrKyxyPTAsaT1mdW5jdGlvbihuKXt2YXIgaT0odi5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIitlLmd1aWQpfHwwKSVyO3JldHVybiB2Ll9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2UuZ3VpZCxpKzEpLG4ucHJldmVudERlZmF1bHQoKSx0W2ldLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8ITF9O2kuZ3VpZD1uO3doaWxlKHI8dC5sZW5ndGgpdFtyKytdLmd1aWQ9bjtyZXR1cm4gdGhpcy5jbGljayhpKX0saG92ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGUpLm1vdXNlbGVhdmUodHx8ZSl9fSksdi5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7di5mblt0XT1mdW5jdGlvbihlLG4pe3JldHVybiBuPT1udWxsJiYobj1lLGU9bnVsbCksYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24odCxudWxsLGUsbik6dGhpcy50cmlnZ2VyKHQpfSxRLnRlc3QodCkmJih2LmV2ZW50LmZpeEhvb2tzW3RdPXYuZXZlbnQua2V5SG9va3MpLEcudGVzdCh0KSYmKHYuZXZlbnQuZml4SG9va3NbdF09di5ldmVudC5tb3VzZUhvb2tzKX0pLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbnQoZSx0LG4scil7bj1ufHxbXSx0PXR8fGc7dmFyIGkscyxhLGYsbD10Lm5vZGVUeXBlO2lmKCFlfHx0eXBlb2YgZSE9InN0cmluZyIpcmV0dXJuIG47aWYobCE9PTEmJmwhPT05KXJldHVybltdO2E9byh0KTtpZighYSYmIXIpaWYoaT1SLmV4ZWMoZSkpaWYoZj1pWzFdKXtpZihsPT09OSl7cz10LmdldEVsZW1lbnRCeUlkKGYpO2lmKCFzfHwhcy5wYXJlbnROb2RlKXJldHVybiBuO2lmKHMuaWQ9PT1mKXJldHVybiBuLnB1c2gocyksbn1lbHNlIGlmKHQub3duZXJEb2N1bWVudCYmKHM9dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGYpKSYmdSh0LHMpJiZzLmlkPT09ZilyZXR1cm4gbi5wdXNoKHMpLG59ZWxzZXtpZihpWzJdKXJldHVybiBTLmFwcGx5KG4seC5jYWxsKHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSksMCkpLG47aWYoKGY9aVszXSkmJlomJnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gUy5hcHBseShuLHguY2FsbCh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZiksMCkpLG59cmV0dXJuIHZ0KGUucmVwbGFjZShqLCIkMSIpLHQsbixyLGEpfWZ1bmN0aW9uIHJ0KGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIG49PT0iaW5wdXQiJiZ0LnR5cGU9PT1lfX1mdW5jdGlvbiBpdChlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihuPT09ImlucHV0Inx8bj09PSJidXR0b24iKSYmdC50eXBlPT09ZX19ZnVuY3Rpb24gc3QoZSl7cmV0dXJuIE4oZnVuY3Rpb24odCl7cmV0dXJuIHQ9K3QsTihmdW5jdGlvbihuLHIpe3ZhciBpLHM9ZShbXSxuLmxlbmd0aCx0KSxvPXMubGVuZ3RoO3doaWxlKG8tLSluW2k9c1tvXV0mJihuW2ldPSEocltpXT1uW2ldKSl9KX0pfWZ1bmN0aW9uIG90KGUsdCxuKXtpZihlPT09dClyZXR1cm4gbjt2YXIgcj1lLm5leHRTaWJsaW5nO3doaWxlKHIpe2lmKHI9PT10KXJldHVybi0xO3I9ci5uZXh0U2libGluZ31yZXR1cm4gMX1mdW5jdGlvbiB1dChlLHQpe3ZhciBuLHIscyxvLHUsYSxmLGw9TFtkXVtlKyIgIl07aWYobClyZXR1cm4gdD8wOmwuc2xpY2UoMCk7dT1lLGE9W10sZj1pLnByZUZpbHRlcjt3aGlsZSh1KXtpZighbnx8KHI9Ri5leGVjKHUpKSlyJiYodT11LnNsaWNlKHJbMF0ubGVuZ3RoKXx8dSksYS5wdXNoKHM9W10pO249ITE7aWYocj1JLmV4ZWModSkpcy5wdXNoKG49bmV3IG0oci5zaGlmdCgpKSksdT11LnNsaWNlKG4ubGVuZ3RoKSxuLnR5cGU9clswXS5yZXBsYWNlKGosIiAiKTtmb3IobyBpbiBpLmZpbHRlcikocj1KW29dLmV4ZWModSkpJiYoIWZbb118fChyPWZbb10ocikpKSYmKHMucHVzaChuPW5ldyBtKHIuc2hpZnQoKSkpLHU9dS5zbGljZShuLmxlbmd0aCksbi50eXBlPW8sbi5tYXRjaGVzPXIpO2lmKCFuKWJyZWFrfXJldHVybiB0P3UubGVuZ3RoOnU/bnQuZXJyb3IoZSk6TChlLGEpLnNsaWNlKDApfWZ1bmN0aW9uIGF0KGUsdCxyKXt2YXIgaT10LmRpcixzPXImJnQuZGlyPT09InBhcmVudE5vZGUiLG89dysrO3JldHVybiB0LmZpcnN0P2Z1bmN0aW9uKHQsbixyKXt3aGlsZSh0PXRbaV0paWYoc3x8dC5ub2RlVHlwZT09PTEpcmV0dXJuIGUodCxuLHIpfTpmdW5jdGlvbih0LHIsdSl7aWYoIXUpe3ZhciBhLGY9YisiICIrbysiICIsbD1mK247d2hpbGUodD10W2ldKWlmKHN8fHQubm9kZVR5cGU9PT0xKXtpZigoYT10W2RdKT09PWwpcmV0dXJuIHQuc2l6c2V0O2lmKHR5cGVvZiBhPT0ic3RyaW5nIiYmYS5pbmRleE9mKGYpPT09MCl7aWYodC5zaXpzZXQpcmV0dXJuIHR9ZWxzZXt0W2RdPWw7aWYoZSh0LHIsdSkpcmV0dXJuIHQuc2l6c2V0PSEwLHQ7dC5zaXpzZXQ9ITF9fX1lbHNlIHdoaWxlKHQ9dFtpXSlpZihzfHx0Lm5vZGVUeXBlPT09MSlpZihlKHQscix1KSlyZXR1cm4gdH19ZnVuY3Rpb24gZnQoZSl7cmV0dXJuIGUubGVuZ3RoPjE/ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUubGVuZ3RoO3doaWxlKGktLSlpZighZVtpXSh0LG4scikpcmV0dXJuITE7cmV0dXJuITB9OmVbMF19ZnVuY3Rpb24gbHQoZSx0LG4scixpKXt2YXIgcyxvPVtdLHU9MCxhPWUubGVuZ3RoLGY9dCE9bnVsbDtmb3IoO3U8YTt1KyspaWYocz1lW3VdKWlmKCFufHxuKHMscixpKSlvLnB1c2gocyksZiYmdC5wdXNoKHUpO3JldHVybiBvfWZ1bmN0aW9uIGN0KGUsdCxuLHIsaSxzKXtyZXR1cm4gciYmIXJbZF0mJihyPWN0KHIpKSxpJiYhaVtkXSYmKGk9Y3QoaSxzKSksTihmdW5jdGlvbihzLG8sdSxhKXt2YXIgZixsLGMsaD1bXSxwPVtdLGQ9by5sZW5ndGgsdj1zfHxkdCh0fHwiKiIsdS5ub2RlVHlwZT9bdV06dSxbXSksbT1lJiYoc3x8IXQpP2x0KHYsaCxlLHUsYSk6dixnPW4/aXx8KHM/ZTpkfHxyKT9bXTpvOm07biYmbihtLGcsdSxhKTtpZihyKXtmPWx0KGcscCkscihmLFtdLHUsYSksbD1mLmxlbmd0aDt3aGlsZShsLS0paWYoYz1mW2xdKWdbcFtsXV09IShtW3BbbF1dPWMpfWlmKHMpe2lmKGl8fGUpe2lmKGkpe2Y9W10sbD1nLmxlbmd0aDt3aGlsZShsLS0pKGM9Z1tsXSkmJmYucHVzaChtW2xdPWMpO2kobnVsbCxnPVtdLGYsYSl9bD1nLmxlbmd0aDt3aGlsZShsLS0pKGM9Z1tsXSkmJihmPWk/VC5jYWxsKHMsYyk6aFtsXSk+LTEmJihzW2ZdPSEob1tmXT1jKSl9fWVsc2UgZz1sdChnPT09bz9nLnNwbGljZShkLGcubGVuZ3RoKTpnKSxpP2kobnVsbCxvLGcsYSk6Uy5hcHBseShvLGcpfSl9ZnVuY3Rpb24gaHQoZSl7dmFyIHQsbixyLHM9ZS5sZW5ndGgsbz1pLnJlbGF0aXZlW2VbMF0udHlwZV0sdT1vfHxpLnJlbGF0aXZlWyIgIl0sYT1vPzE6MCxmPWF0KGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dH0sdSwhMCksbD1hdChmdW5jdGlvbihlKXtyZXR1cm4gVC5jYWxsKHQsZSk+LTF9LHUsITApLGg9W2Z1bmN0aW9uKGUsbixyKXtyZXR1cm4hbyYmKHJ8fG4hPT1jKXx8KCh0PW4pLm5vZGVUeXBlP2YoZSxuLHIpOmwoZSxuLHIpKX1dO2Zvcig7YTxzO2ErKylpZihuPWkucmVsYXRpdmVbZVthXS50eXBlXSloPVthdChmdChoKSxuKV07ZWxzZXtuPWkuZmlsdGVyW2VbYV0udHlwZV0uYXBwbHkobnVsbCxlW2FdLm1hdGNoZXMpO2lmKG5bZF0pe3I9KythO2Zvcig7cjxzO3IrKylpZihpLnJlbGF0aXZlW2Vbcl0udHlwZV0pYnJlYWs7cmV0dXJuIGN0KGE+MSYmZnQoaCksYT4xJiZlLnNsaWNlKDAsYS0xKS5qb2luKCIiKS5yZXBsYWNlKGosIiQxIiksbixhPHImJmh0KGUuc2xpY2UoYSxyKSkscjxzJiZodChlPWUuc2xpY2UocikpLHI8cyYmZS5qb2luKCIiKSl9aC5wdXNoKG4pfXJldHVybiBmdChoKX1mdW5jdGlvbiBwdChlLHQpe3ZhciByPXQubGVuZ3RoPjAscz1lLmxlbmd0aD4wLG89ZnVuY3Rpb24odSxhLGYsbCxoKXt2YXIgcCxkLHYsbT1bXSx5PTAsdz0iMCIseD11JiZbXSxUPWghPW51bGwsTj1jLEM9dXx8cyYmaS5maW5kLlRBRygiKiIsaCYmYS5wYXJlbnROb2RlfHxhKSxrPWIrPU49PW51bGw/MTpNYXRoLkU7VCYmKGM9YSE9PWcmJmEsbj1vLmVsKTtmb3IoOyhwPUNbd10pIT1udWxsO3crKyl7aWYocyYmcCl7Zm9yKGQ9MDt2PWVbZF07ZCsrKWlmKHYocCxhLGYpKXtsLnB1c2gocCk7YnJlYWt9VCYmKGI9ayxuPSsrby5lbCl9ciYmKChwPSF2JiZwKSYmeS0tLHUmJngucHVzaChwKSl9eSs9dztpZihyJiZ3IT09eSl7Zm9yKGQ9MDt2PXRbZF07ZCsrKXYoeCxtLGEsZik7aWYodSl7aWYoeT4wKXdoaWxlKHctLSkheFt3XSYmIW1bd10mJihtW3ddPUUuY2FsbChsKSk7bT1sdChtKX1TLmFwcGx5KGwsbSksVCYmIXUmJm0ubGVuZ3RoPjAmJnkrdC5sZW5ndGg+MSYmbnQudW5pcXVlU29ydChsKX1yZXR1cm4gVCYmKGI9ayxjPU4pLHh9O3JldHVybiBvLmVsPTAscj9OKG8pOm99ZnVuY3Rpb24gZHQoZSx0LG4pe3ZhciByPTAsaT10Lmxlbmd0aDtmb3IoO3I8aTtyKyspbnQoZSx0W3JdLG4pO3JldHVybiBufWZ1bmN0aW9uIHZ0KGUsdCxuLHIscyl7dmFyIG8sdSxmLGwsYyxoPXV0KGUpLHA9aC5sZW5ndGg7aWYoIXImJmgubGVuZ3RoPT09MSl7dT1oWzBdPWhbMF0uc2xpY2UoMCk7aWYodS5sZW5ndGg+MiYmKGY9dVswXSkudHlwZT09PSJJRCImJnQubm9kZVR5cGU9PT05JiYhcyYmaS5yZWxhdGl2ZVt1WzFdLnR5cGVdKXt0PWkuZmluZC5JRChmLm1hdGNoZXNbMF0ucmVwbGFjZSgkLCIiKSx0LHMpWzBdO2lmKCF0KXJldHVybiBuO2U9ZS5zbGljZSh1LnNoaWZ0KCkubGVuZ3RoKX1mb3Iobz1KLlBPUy50ZXN0KGUpPy0xOnUubGVuZ3RoLTE7bz49MDtvLS0pe2Y9dVtvXTtpZihpLnJlbGF0aXZlW2w9Zi50eXBlXSlicmVhaztpZihjPWkuZmluZFtsXSlpZihyPWMoZi5tYXRjaGVzWzBdLnJlcGxhY2UoJCwiIiksei50ZXN0KHVbMF0udHlwZSkmJnQucGFyZW50Tm9kZXx8dCxzKSl7dS5zcGxpY2UobywxKSxlPXIubGVuZ3RoJiZ1LmpvaW4oIiIpO2lmKCFlKXJldHVybiBTLmFwcGx5KG4seC5jYWxsKHIsMCkpLG47YnJlYWt9fX1yZXR1cm4gYShlLGgpKHIsdCxzLG4sei50ZXN0KGUpKSxufWZ1bmN0aW9uIG10KCl7fXZhciBuLHIsaSxzLG8sdSxhLGYsbCxjLGg9ITAscD0idW5kZWZpbmVkIixkPSgic2l6Y2FjaGUiK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoIi4iLCIiKSxtPVN0cmluZyxnPWUuZG9jdW1lbnQseT1nLmRvY3VtZW50RWxlbWVudCxiPTAsdz0wLEU9W10ucG9wLFM9W10ucHVzaCx4PVtdLnNsaWNlLFQ9W10uaW5kZXhPZnx8ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPXRoaXMubGVuZ3RoO2Zvcig7dDxuO3QrKylpZih0aGlzW3RdPT09ZSlyZXR1cm4gdDtyZXR1cm4tMX0sTj1mdW5jdGlvbihlLHQpe3JldHVybiBlW2RdPXQ9PW51bGx8fHQsZX0sQz1mdW5jdGlvbigpe3ZhciBlPXt9LHQ9W107cmV0dXJuIE4oZnVuY3Rpb24obixyKXtyZXR1cm4gdC5wdXNoKG4pPmkuY2FjaGVMZW5ndGgmJmRlbGV0ZSBlW3Quc2hpZnQoKV0sZVtuKyIgIl09cn0sZSl9LGs9QygpLEw9QygpLEE9QygpLE89IltcXHgyMFxcdFxcclxcblxcZl0iLE09Iig/OlxcXFwufFstXFx3XXxbXlxceDAwLVxceGEwXSkrIixfPU0ucmVwbGFjZSgidyIsIncjIiksRD0iKFsqXiR8IX5dPz0pIixQPSJcXFsiK08rIiooIitNKyIpIitPKyIqKD86IitEK08rIiooPzooWydcIl0pKCg/OlxcXFwufFteXFxcXF0pKj8pXFwzfCgiK18rIil8KXwpIitPKyIqXFxdIixIPSI6KCIrTSsiKSg/OlxcKCg/OihbJ1wiXSkoKD86XFxcXC58W15cXFxcXSkqPylcXDJ8KFteKClbXFxdXSp8KD86KD86IitQKyIpfFteOl18XFxcXC4pKnwuKikpXFwpfCkiLEI9IjooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitPKyIqKCg/Oi1cXGQpP1xcZCopIitPKyIqXFwpfCkoPz1bXi1dfCQpIixqPW5ldyBSZWdFeHAoIl4iK08rIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTysiKyQiLCJnIiksRj1uZXcgUmVnRXhwKCJeIitPKyIqLCIrTysiKiIpLEk9bmV3IFJlZ0V4cCgiXiIrTysiKihbXFx4MjBcXHRcXHJcXG5cXGY+K35dKSIrTysiKiIpLHE9bmV3IFJlZ0V4cChIKSxSPS9eKD86IyhbXHdcLV0rKXwoXHcrKXxcLihbXHdcLV0rKSkkLyxVPS9eOm5vdC8sej0vW1x4MjBcdFxyXG5cZl0qWyt+XS8sVz0vOm5vdFwoJC8sWD0vaFxkL2ksVj0vaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLCQ9L1xcKD8hXFwpL2csSj17SUQ6bmV3IFJlZ0V4cCgiXiMoIitNKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK00rIikiKSxOQU1FOm5ldyBSZWdFeHAoIl5cXFtuYW1lPVsnXCJdPygiK00rIilbJ1wiXT9cXF0iKSxUQUc6bmV3IFJlZ0V4cCgiXigiK00ucmVwbGFjZSgidyIsIncqIikrIikiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK1ApLFBTRVVETzpuZXcgUmVnRXhwKCJeIitIKSxQT1M6bmV3IFJlZ0V4cChCLCJpIiksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxudGh8Zmlyc3R8bGFzdCktY2hpbGQoPzpcXCgiK08rIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK08rIiooPzooWystXXwpIitPKyIqKFxcZCspfCkpIitPKyIqXFwpfCkiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK08rIipbPit+XXwiK0IsImkiKX0sSz1mdW5jdGlvbihlKXt2YXIgdD1nLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4gZSh0KX1jYXRjaChuKXtyZXR1cm4hMX1maW5hbGx5e3Q9bnVsbH19LFE9SyhmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBlbmRDaGlsZChnLmNyZWF0ZUNvbW1lbnQoIiIpKSwhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLEc9SyhmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLGUuZmlyc3RDaGlsZCYmdHlwZW9mIGUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUhPT1wJiZlLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIik9PT0iIyJ9KSxZPUsoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxzZWxlY3Q+PC9zZWxlY3Q+Ijt2YXIgdD10eXBlb2YgZS5sYXN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJtdWx0aXBsZSIpO3JldHVybiB0IT09ImJvb2xlYW4iJiZ0IT09InN0cmluZyJ9KSxaPUsoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSdoaWRkZW4gZSc+PC9kaXY+PGRpdiBjbGFzcz0naGlkZGVuJz48L2Rpdj4iLCFlLmdldEVsZW1lbnRzQnlDbGFzc05hbWV8fCFlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGg/ITE6KGUubGFzdENoaWxkLmNsYXNzTmFtZT0iZSIsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoPT09Mil9KSxldD1LKGZ1bmN0aW9uKGUpe2UuaWQ9ZCswLGUuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2QrIic+PC9hPjxkaXYgbmFtZT0nIitkKyInPjwvZGl2PiIseS5pbnNlcnRCZWZvcmUoZSx5LmZpcnN0Q2hpbGQpO3ZhciB0PWcuZ2V0RWxlbWVudHNCeU5hbWUmJmcuZ2V0RWxlbWVudHNCeU5hbWUoZCkubGVuZ3RoPT09MitnLmdldEVsZW1lbnRzQnlOYW1lKGQrMCkubGVuZ3RoO3JldHVybiByPSFnLmdldEVsZW1lbnRCeUlkKGQpLHkucmVtb3ZlQ2hpbGQoZSksdH0pO3RyeXt4LmNhbGwoeS5jaGlsZE5vZGVzLDApWzBdLm5vZGVUeXBlfWNhdGNoKHR0KXt4PWZ1bmN0aW9uKGUpe3ZhciB0LG49W107Zm9yKDt0PXRoaXNbZV07ZSsrKW4ucHVzaCh0KTtyZXR1cm4gbn19bnQubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVybiBudChlLG51bGwsbnVsbCx0KX0sbnQubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG50KHQsbnVsbCxudWxsLFtlXSkubGVuZ3RoPjB9LHM9bnQuZ2V0VGV4dD1mdW5jdGlvbihlKXt2YXIgdCxuPSIiLHI9MCxpPWUubm9kZVR5cGU7aWYoaSl7aWYoaT09PTF8fGk9PT05fHxpPT09MTEpe2lmKHR5cGVvZiBlLnRleHRDb250ZW50PT0ic3RyaW5nIilyZXR1cm4gZS50ZXh0Q29udGVudDtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpbis9cyhlKX1lbHNlIGlmKGk9PT0zfHxpPT09NClyZXR1cm4gZS5ub2RlVmFsdWV9ZWxzZSBmb3IoO3Q9ZVtyXTtyKyspbis9cyh0KTtyZXR1cm4gbn0sbz1udC5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIHQ/dC5ub2RlTmFtZSE9PSJIVE1MIjohMX0sdT1udC5jb250YWlucz15LmNvbnRhaW5zP2Z1bmN0aW9uKGUsdCl7dmFyIG49ZS5ub2RlVHlwZT09PTk/ZS5kb2N1bWVudEVsZW1lbnQ6ZSxyPXQmJnQucGFyZW50Tm9kZTtyZXR1cm4gZT09PXJ8fCEhKHImJnIubm9kZVR5cGU9PT0xJiZuLmNvbnRhaW5zJiZuLmNvbnRhaW5zKHIpKX06eS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9mdW5jdGlvbihlLHQpe3JldHVybiB0JiYhIShlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpJjE2KX06ZnVuY3Rpb24oZSx0KXt3aGlsZSh0PXQucGFyZW50Tm9kZSlpZih0PT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sbnQuYXR0cj1mdW5jdGlvbihlLHQpe3ZhciBuLHI9byhlKTtyZXR1cm4gcnx8KHQ9dC50b0xvd2VyQ2FzZSgpKSwobj1pLmF0dHJIYW5kbGVbdF0pP24oZSk6cnx8WT9lLmdldEF0dHJpYnV0ZSh0KToobj1lLmdldEF0dHJpYnV0ZU5vZGUodCksbj90eXBlb2YgZVt0XT09ImJvb2xlYW4iP2VbdF0/dDpudWxsOm4uc3BlY2lmaWVkP24udmFsdWU6bnVsbDpudWxsKX0saT1udC5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpOLG1hdGNoOkosYXR0ckhhbmRsZTpHP3t9OntocmVmOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9LHR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJ0eXBlIil9fSxmaW5kOntJRDpyP2Z1bmN0aW9uKGUsdCxuKXtpZih0eXBlb2YgdC5nZXRFbGVtZW50QnlJZCE9PXAmJiFuKXt2YXIgcj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiByJiZyLnBhcmVudE5vZGU/W3JdOltdfX06ZnVuY3Rpb24oZSxuLHIpe2lmKHR5cGVvZiBuLmdldEVsZW1lbnRCeUlkIT09cCYmIXIpe3ZhciBpPW4uZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIGk/aS5pZD09PWV8fHR5cGVvZiBpLmdldEF0dHJpYnV0ZU5vZGUhPT1wJiZpLmdldEF0dHJpYnV0ZU5vZGUoImlkIikudmFsdWU9PT1lP1tpXTp0OltdfX0sVEFHOlE/ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdC5nZXRFbGVtZW50c0J5VGFnTmFtZSE9PXApcmV0dXJuIHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSl9OmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTtpZihlPT09IioiKXt2YXIgcixpPVtdLHM9MDtmb3IoO3I9bltzXTtzKyspci5ub2RlVHlwZT09PTEmJmkucHVzaChyKTtyZXR1cm4gaX1yZXR1cm4gbn0sTkFNRTpldCYmZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdC5nZXRFbGVtZW50c0J5TmFtZSE9PXApcmV0dXJuIHQuZ2V0RWxlbWVudHNCeU5hbWUobmFtZSl9LENMQVNTOlomJmZ1bmN0aW9uKGUsdCxuKXtpZih0eXBlb2YgdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT09cCYmIW4pcmV0dXJuIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKX19LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0ucmVwbGFjZSgkLCIiKSxlWzNdPShlWzRdfHxlWzVdfHwiIikucmVwbGFjZSgkLCIiKSxlWzJdPT09In49IiYmKGVbM109IiAiK2VbM10rIiAiKSxlLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0udG9Mb3dlckNhc2UoKSxlWzFdPT09Im50aCI/KGVbMl18fG50LmVycm9yKGVbMF0pLGVbM109KyhlWzNdP2VbNF0rKGVbNV18fDEpOjIqKGVbMl09PT0iZXZlbiJ8fGVbMl09PT0ib2RkIikpLGVbNF09KyhlWzZdK2VbN118fGVbMl09PT0ib2RkIikpOmVbMl0mJm50LmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgdCxuO2lmKEouQ0hJTEQudGVzdChlWzBdKSlyZXR1cm4gbnVsbDtpZihlWzNdKWVbMl09ZVszXTtlbHNlIGlmKHQ9ZVs0XSlxLnRlc3QodCkmJihuPXV0KHQsITApKSYmKG49dC5pbmRleE9mKCIpIix0Lmxlbmd0aC1uKS10Lmxlbmd0aCkmJih0PXQuc2xpY2UoMCxuKSxlWzBdPWVbMF0uc2xpY2UoMCxuKSksZVsyXT10O3JldHVybiBlLnNsaWNlKDAsMyl9fSxmaWx0ZXI6e0lEOnI/ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5yZXBsYWNlKCQsIiIpLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEF0dHJpYnV0ZSgiaWQiKT09PWV9fTpmdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoJCwiIiksZnVuY3Rpb24odCl7dmFyIG49dHlwZW9mIHQuZ2V0QXR0cmlidXRlTm9kZSE9PXAmJnQuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbiYmbi52YWx1ZT09PWV9fSxUQUc6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT0iKiI/ZnVuY3Rpb24oKXtyZXR1cm4hMH06KGU9ZS5yZXBsYWNlKCQsIiIpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24odCl7cmV0dXJuIHQubm9kZU5hbWUmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWV9KX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9a1tkXVtlKyIgIl07cmV0dXJuIHR8fCh0PW5ldyBSZWdFeHAoIihefCIrTysiKSIrZSsiKCIrTysifCQpIikpJiZrKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdChlLmNsYXNzTmFtZXx8dHlwZW9mIGUuZ2V0QXR0cmlidXRlIT09cCYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocixpKXt2YXIgcz1udC5hdHRyKHIsZSk7cmV0dXJuIHM9PW51bGw/dD09PSIhPSI6dD8ocys9IiIsdD09PSI9Ij9zPT09bjp0PT09IiE9Ij9zIT09bjp0PT09Il49Ij9uJiZzLmluZGV4T2Yobik9PT0wOnQ9PT0iKj0iP24mJnMuaW5kZXhPZihuKT4tMTp0PT09IiQ9Ij9uJiZzLnN1YnN0cihzLmxlbmd0aC1uLmxlbmd0aCk9PT1uOnQ9PT0ifj0iPygiICIrcysiICIpLmluZGV4T2Yobik+LTE6dD09PSJ8PSI/cz09PW58fHMuc3Vic3RyKDAsbi5sZW5ndGgrMSk9PT1uKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gZT09PSJudGgiP2Z1bmN0aW9uKGUpe3ZhciB0LGkscz1lLnBhcmVudE5vZGU7aWYobj09PTEmJnI9PT0wKXJldHVybiEwO2lmKHMpe2k9MDtmb3IodD1zLmZpcnN0Q2hpbGQ7dDt0PXQubmV4dFNpYmxpbmcpaWYodC5ub2RlVHlwZT09PTEpe2krKztpZihlPT09dClicmVha319cmV0dXJuIGktPXIsaT09PW58fGklbj09PTAmJmkvbj49MH06ZnVuY3Rpb24odCl7dmFyIG49dDtzd2l0Y2goZSl7Y2FzZSJvbmx5IjpjYXNlImZpcnN0Ijp3aGlsZShuPW4ucHJldmlvdXNTaWJsaW5nKWlmKG4ubm9kZVR5cGU9PT0xKXJldHVybiExO2lmKGU9PT0iZmlyc3QiKXJldHVybiEwO249dDtjYXNlImxhc3QiOndoaWxlKG49bi5uZXh0U2libGluZylpZihuLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtyZXR1cm4hMH19fSxQU0VVRE86ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWkucHNldWRvc1tlXXx8aS5zZXRGaWx0ZXJzW2UudG9Mb3dlckNhc2UoKV18fG50LmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrZSk7cmV0dXJuIHJbZF0/cih0KTpyLmxlbmd0aD4xPyhuPVtlLGUsIiIsdF0saS5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/TihmdW5jdGlvbihlLG4pe3ZhciBpLHM9cihlLHQpLG89cy5sZW5ndGg7d2hpbGUoby0tKWk9VC5jYWxsKGUsc1tvXSksZVtpXT0hKG5baV09c1tvXSl9KTpmdW5jdGlvbihlKXtyZXR1cm4gcihlLDAsbil9KTpyfX0scHNldWRvczp7bm90Ok4oZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1bXSxyPWEoZS5yZXBsYWNlKGosIiQxIikpO3JldHVybiByW2RdP04oZnVuY3Rpb24oZSx0LG4saSl7dmFyIHMsbz1yKGUsbnVsbCxpLFtdKSx1PWUubGVuZ3RoO3doaWxlKHUtLSlpZihzPW9bdV0pZVt1XT0hKHRbdV09cyl9KTpmdW5jdGlvbihlLGkscyl7cmV0dXJuIHRbMF09ZSxyKHQsbnVsbCxzLG4pLCFuLnBvcCgpfX0pLGhhczpOKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbnQoZSx0KS5sZW5ndGg+MH19KSxjb250YWluczpOKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4odC50ZXh0Q29udGVudHx8dC5pbm5lclRleHR8fHModCkpLmluZGV4T2YoZSk+LTF9fSksZW5hYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZD09PSExfSxkaXNhYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gdD09PSJpbnB1dCImJiEhZS5jaGVja2VkfHx0PT09Im9wdGlvbiImJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsZS5zZWxlY3RlZD09PSEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIWkucHNldWRvcy5lbXB0eShlKX0sZW1wdHk6ZnVuY3Rpb24oZSl7dmFyIHQ7ZT1lLmZpcnN0Q2hpbGQ7d2hpbGUoZSl7aWYoZS5ub2RlTmFtZT4iQCJ8fCh0PWUubm9kZVR5cGUpPT09M3x8dD09PTQpcmV0dXJuITE7ZT1lLm5leHRTaWJsaW5nfXJldHVybiEwfSxoZWFkZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIFgudGVzdChlLm5vZGVOYW1lKX0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdCxuO3JldHVybiBlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYodD1lLnR5cGUpPT09InRleHQiJiYoKG49ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSk9PW51bGx8fG4udG9Mb3dlckNhc2UoKT09PXQpfSxyYWRpbzpydCgicmFkaW8iKSxjaGVja2JveDpydCgiY2hlY2tib3giKSxmaWxlOnJ0KCJmaWxlIikscGFzc3dvcmQ6cnQoInBhc3N3b3JkIiksaW1hZ2U6cnQoImltYWdlIiksc3VibWl0Oml0KCJzdWJtaXQiKSxyZXNldDppdCgicmVzZXQiKSxidXR0b246ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0PT09ImlucHV0IiYmZS50eXBlPT09ImJ1dHRvbiJ8fHQ9PT0iYnV0dG9uIn0saW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIFYudGVzdChlLm5vZGVOYW1lKX0sZm9jdXM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vd25lckRvY3VtZW50O3JldHVybiBlPT09dC5hY3RpdmVFbGVtZW50JiYoIXQuaGFzRm9jdXN8fHQuaGFzRm9jdXMoKSkmJiEhKGUudHlwZXx8ZS5ocmVmfHx+ZS50YWJJbmRleCl9LGFjdGl2ZTpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWUub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50fSxmaXJzdDpzdChmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6c3QoZnVuY3Rpb24oZSx0KXtyZXR1cm5bdC0xXX0pLGVxOnN0KGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bbjwwP24rdDpuXX0pLGV2ZW46c3QoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPHQ7bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxvZGQ6c3QoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MTtuPHQ7bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxsdDpzdChmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW48MD9uK3Q6bjstLXI+PTA7KWUucHVzaChyKTtyZXR1cm4gZX0pLGd0OnN0KGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDpuOysrcjx0OyllLnB1c2gocik7cmV0dXJuIGV9KX19LGY9eS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dD8obD0hMCwwKTooIWUuY29tcGFyZURvY3VtZW50UG9zaXRpb258fCF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2UuY29tcGFyZURvY3VtZW50UG9zaXRpb246ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KSY0KT8tMToxfTpmdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBsPSEwLDA7aWYoZS5zb3VyY2VJbmRleCYmdC5zb3VyY2VJbmRleClyZXR1cm4gZS5zb3VyY2VJbmRleC10LnNvdXJjZUluZGV4O3ZhciBuLHIsaT1bXSxzPVtdLG89ZS5wYXJlbnROb2RlLHU9dC5wYXJlbnROb2RlLGE9bztpZihvPT09dSlyZXR1cm4gb3QoZSx0KTtpZighbylyZXR1cm4tMTtpZighdSlyZXR1cm4gMTt3aGlsZShhKWkudW5zaGlmdChhKSxhPWEucGFyZW50Tm9kZTthPXU7d2hpbGUoYSlzLnVuc2hpZnQoYSksYT1hLnBhcmVudE5vZGU7bj1pLmxlbmd0aCxyPXMubGVuZ3RoO2Zvcih2YXIgZj0wO2Y8biYmZjxyO2YrKylpZihpW2ZdIT09c1tmXSlyZXR1cm4gb3QoaVtmXSxzW2ZdKTtyZXR1cm4gZj09PW4/b3QoZSxzW2ZdLC0xKTpvdChpW2ZdLHQsMSl9LFswLDBdLnNvcnQoZiksaD0hbCxudC51bmlxdWVTb3J0PWZ1bmN0aW9uKGUpe3ZhciB0LG49W10scj0xLGk9MDtsPWgsZS5zb3J0KGYpO2lmKGwpe2Zvcig7dD1lW3JdO3IrKyl0PT09ZVtyLTFdJiYoaT1uLnB1c2gocikpO3doaWxlKGktLSllLnNwbGljZShuW2ldLDEpfXJldHVybiBlfSxudC5lcnJvcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZSl9LGE9bnQuY29tcGlsZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1bXSxzPUFbZF1bZSsiICJdO2lmKCFzKXt0fHwodD11dChlKSksbj10Lmxlbmd0aDt3aGlsZShuLS0pcz1odCh0W25dKSxzW2RdP3IucHVzaChzKTppLnB1c2gocyk7cz1BKGUscHQoaSxyKSl9cmV0dXJuIHN9LGcucXVlcnlTZWxlY3RvckFsbCYmZnVuY3Rpb24oKXt2YXIgZSx0PXZ0LG49Lyd8XFwvZyxyPS9cPVtceDIwXHRcclxuXGZdKihbXiciXF1dKilbXHgyMFx0XHJcblxmXSpcXS9nLGk9WyI6Zm9jdXMiXSxzPVsiOmFjdGl2ZSJdLHU9eS5tYXRjaGVzU2VsZWN0b3J8fHkubW96TWF0Y2hlc1NlbGVjdG9yfHx5LndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8eS5vTWF0Y2hlc1NlbGVjdG9yfHx5Lm1zTWF0Y2hlc1NlbGVjdG9yO0soZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxzZWxlY3Q+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8aS5wdXNoKCJcXFsiK08rIiooPzpjaGVja2VkfGRpc2FibGVkfGlzbWFwfG11bHRpcGxlfHJlYWRvbmx5fHNlbGVjdGVkfHZhbHVlKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fGkucHVzaCgiOmNoZWNrZWQiKX0pLEsoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxwIHRlc3Q9Jyc+PC9wPiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbdGVzdF49JyddIikubGVuZ3RoJiZpLnB1c2goIlsqXiRdPSIrTysiKig/OlwiXCJ8JycpIiksZS5pbm5lckhUTUw9IjxpbnB1dCB0eXBlPSdoaWRkZW4nLz4iLGUucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fGkucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKX0pLGk9bmV3IFJlZ0V4cChpLmpvaW4oInwiKSksdnQ9ZnVuY3Rpb24oZSxyLHMsbyx1KXtpZighbyYmIXUmJiFpLnRlc3QoZSkpe3ZhciBhLGYsbD0hMCxjPWQsaD1yLHA9ci5ub2RlVHlwZT09PTkmJmU7aWYoci5ub2RlVHlwZT09PTEmJnIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJvYmplY3QiKXthPXV0KGUpLChsPXIuZ2V0QXR0cmlidXRlKCJpZCIpKT9jPWwucmVwbGFjZShuLCJcXCQmIik6ci5zZXRBdHRyaWJ1dGUoImlkIixjKSxjPSJbaWQ9JyIrYysiJ10gIixmPWEubGVuZ3RoO3doaWxlKGYtLSlhW2ZdPWMrYVtmXS5qb2luKCIiKTtoPXoudGVzdChlKSYmci5wYXJlbnROb2RlfHxyLHA9YS5qb2luKCIsIil9aWYocCl0cnl7cmV0dXJuIFMuYXBwbHkocyx4LmNhbGwoaC5xdWVyeVNlbGVjdG9yQWxsKHApLDApKSxzfWNhdGNoKHYpe31maW5hbGx5e2x8fHIucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX1yZXR1cm4gdChlLHIscyxvLHUpfSx1JiYoSyhmdW5jdGlvbih0KXtlPXUuY2FsbCh0LCJkaXYiKTt0cnl7dS5jYWxsKHQsIlt0ZXN0IT0nJ106c2l6emxlIikscy5wdXNoKCIhPSIsSCl9Y2F0Y2gobil7fX0pLHM9bmV3IFJlZ0V4cChzLmpvaW4oInwiKSksbnQubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKHQsbil7bj1uLnJlcGxhY2UociwiPSckMSddIik7aWYoIW8odCkmJiFzLnRlc3QobikmJiFpLnRlc3QobikpdHJ5e3ZhciBhPXUuY2FsbCh0LG4pO2lmKGF8fGV8fHQuZG9jdW1lbnQmJnQuZG9jdW1lbnQubm9kZVR5cGUhPT0xMSlyZXR1cm4gYX1jYXRjaChmKXt9cmV0dXJuIG50KG4sbnVsbCxudWxsLFt0XSkubGVuZ3RoPjB9KX0oKSxpLnBzZXVkb3MubnRoPWkucHNldWRvcy5lcSxpLmZpbHRlcnM9bXQucHJvdG90eXBlPWkucHNldWRvcyxpLnNldEZpbHRlcnM9bmV3IG10LG50LmF0dHI9di5hdHRyLHYuZmluZD1udCx2LmV4cHI9bnQuc2VsZWN0b3JzLHYuZXhwclsiOiJdPXYuZXhwci5wc2V1ZG9zLHYudW5pcXVlPW50LnVuaXF1ZVNvcnQsdi50ZXh0PW50LmdldFRleHQsdi5pc1hNTERvYz1udC5pc1hNTCx2LmNvbnRhaW5zPW50LmNvbnRhaW5zfShlKTt2YXIgbnQ9L1VudGlsJC8scnQ9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8saXQ9L14uW146I1xbXC4sXSokLyxzdD12LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LG90PXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O3YuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLHMsbyx1PXRoaXM7aWYodHlwZW9mIGUhPSJzdHJpbmciKXJldHVybiB2KGUpLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTAsbj11Lmxlbmd0aDt0PG47dCsrKWlmKHYuY29udGFpbnModVt0XSx0aGlzKSlyZXR1cm4hMH0pO289dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGUpO2Zvcih0PTAsbj10aGlzLmxlbmd0aDt0PG47dCsrKXtyPW8ubGVuZ3RoLHYuZmluZChlLHRoaXNbdF0sbyk7aWYodD4wKWZvcihpPXI7aTxvLmxlbmd0aDtpKyspZm9yKHM9MDtzPHI7cysrKWlmKG9bc109PT1vW2ldKXtvLnNwbGljZShpLS0sMSk7YnJlYWt9fXJldHVybiBvfSxoYXM6ZnVuY3Rpb24oZSl7dmFyIHQsbj12KGUsdGhpcykscj1uLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wO3Q8cjt0KyspaWYodi5jb250YWlucyh0aGlzLG5bdF0pKXJldHVybiEwfSl9LG5vdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZnQodGhpcyxlLCExKSwibm90IixlKX0sZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmdCh0aGlzLGUsITApLCJmaWx0ZXIiLGUpfSxpczpmdW5jdGlvbihlKXtyZXR1cm4hIWUmJih0eXBlb2YgZT09InN0cmluZyI/c3QudGVzdChlKT92KGUsdGhpcy5jb250ZXh0KS5pbmRleCh0aGlzWzBdKT49MDp2LmZpbHRlcihlLHRoaXMpLmxlbmd0aD4wOnRoaXMuZmlsdGVyKGUpLmxlbmd0aD4wKX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLHM9W10sbz1zdC50ZXN0KGUpfHx0eXBlb2YgZSE9InN0cmluZyI/dihlLHR8fHRoaXMuY29udGV4dCk6MDtmb3IoO3I8aTtyKyspe249dGhpc1tyXTt3aGlsZShuJiZuLm93bmVyRG9jdW1lbnQmJm4hPT10JiZuLm5vZGVUeXBlIT09MTEpe2lmKG8/by5pbmRleChuKT4tMTp2LmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpe3MucHVzaChuKTticmVha31uPW4ucGFyZW50Tm9kZX19cmV0dXJuIHM9cy5sZW5ndGg+MT92LnVuaXF1ZShzKTpzLHRoaXMucHVzaFN0YWNrKHMsImNsb3Nlc3QiLGUpfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT90eXBlb2YgZT09InN0cmluZyI/di5pbkFycmF5KHRoaXNbMF0sdihlKSk6di5pbkFycmF5KGUuanF1ZXJ5P2VbMF06ZSx0aGlzKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgZT09InN0cmluZyI/dihlLHQpOnYubWFrZUFycmF5KGUmJmUubm9kZVR5cGU/W2VdOmUpLHI9di5tZXJnZSh0aGlzLmdldCgpLG4pO3JldHVybiB0aGlzLnB1c2hTdGFjayh1dChuWzBdKXx8dXQoclswXSk/cjp2LnVuaXF1ZShyKSl9LGFkZEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKGU9PW51bGw/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfX0pLHYuZm4uYW5kU2VsZj12LmZuLmFkZEJhY2ssdi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiZ0Lm5vZGVUeXBlIT09MTE/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiB2LmRpcihlLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHYuZGlyKGUsInBhcmVudE5vZGUiLG4pfSxuZXh0OmZ1bmN0aW9uKGUpe3JldHVybiBhdChlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBhdChlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihlKXtyZXR1cm4gdi5kaXIoZSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihlKXtyZXR1cm4gdi5kaXIoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHYuZGlyKGUsIm5leHRTaWJsaW5nIixuKX0scHJldlVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdi5kaXIoZSwicHJldmlvdXNTaWJsaW5nIixuKX0sc2libGluZ3M6ZnVuY3Rpb24oZSl7cmV0dXJuIHYuc2libGluZygoZS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxlKX0sY2hpbGRyZW46ZnVuY3Rpb24oZSl7cmV0dXJuIHYuc2libGluZyhlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gdi5ub2RlTmFtZShlLCJpZnJhbWUiKT9lLmNvbnRlbnREb2N1bWVudHx8ZS5jb250ZW50V2luZG93LmRvY3VtZW50OnYubWVyZ2UoW10sZS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGUsdCl7di5mbltlXT1mdW5jdGlvbihuLHIpe3ZhciBpPXYubWFwKHRoaXMsdCxuKTtyZXR1cm4gbnQudGVzdChlKXx8KHI9biksciYmdHlwZW9mIHI9PSJzdHJpbmciJiYoaT12LmZpbHRlcihyLGkpKSxpPXRoaXMubGVuZ3RoPjEmJiFvdFtlXT92LnVuaXF1ZShpKTppLHRoaXMubGVuZ3RoPjEmJnJ0LnRlc3QoZSkmJihpPWkucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhpLGUsbC5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KSx2LmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbiYmKGU9Ijpub3QoIitlKyIpIiksdC5sZW5ndGg9PT0xP3YuZmluZC5tYXRjaGVzU2VsZWN0b3IodFswXSxlKT9bdFswXV06W106di5maW5kLm1hdGNoZXMoZSx0KX0sZGlyOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1bXSxzPWVbbl07d2hpbGUocyYmcy5ub2RlVHlwZSE9PTkmJihyPT09dHx8cy5ub2RlVHlwZSE9PTF8fCF2KHMpLmlzKHIpKSlzLm5vZGVUeXBlPT09MSYmaS5wdXNoKHMpLHM9c1tuXTtyZXR1cm4gaX0sc2libGluZzpmdW5jdGlvbihlLHQpe3ZhciBuPVtdO2Zvcig7ZTtlPWUubmV4dFNpYmxpbmcpZS5ub2RlVHlwZT09PTEmJmUhPT10JiZuLnB1c2goZSk7cmV0dXJuIG59fSk7dmFyIGN0PSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1lfHZpZGVvIixodD0vIGpRdWVyeVxkKz0iKD86bnVsbHxcZCspIi9nLHB0PS9eXHMrLyxkdD0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2dpLHZ0PS88KFtcdzpdKykvLG10PS88dGJvZHkvaSxndD0vPHwmIz9cdys7Lyx5dD0vPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLGJ0PS88KD86c2NyaXB0fG9iamVjdHxlbWJlZHxvcHRpb258c3R5bGUpL2ksd3Q9bmV3IFJlZ0V4cCgiPCg/OiIrY3QrIilbXFxzLz5dIiwiaSIpLEV0PS9eKD86Y2hlY2tib3h8cmFkaW8pJC8sU3Q9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2kseHQ9L1wvKGphdmF8ZWNtYSlzY3JpcHQvaSxUdD0vXlxzKjwhKD86XFtDREFUQVxbfFwtXC0pfFtcXVwtXXsyfT5ccyokL2csTnQ9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLF9kZWZhdWx0OlswLCIiLCIiXX0sQ3Q9bHQoaSksa3Q9Q3QuYXBwZW5kQ2hpbGQoaS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7TnQub3B0Z3JvdXA9TnQub3B0aW9uLE50LnRib2R5PU50LnRmb290PU50LmNvbGdyb3VwPU50LmNhcHRpb249TnQudGhlYWQsTnQudGg9TnQudGQsdi5zdXBwb3J0Lmh0bWxTZXJpYWxpemV8fChOdC5fZGVmYXVsdD1bMSwiWDxkaXY+IiwiPC9kaXY+Il0pLHYuZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiB2LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dD92LnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHxpKS5jcmVhdGVUZXh0Tm9kZShlKSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0sd3JhcEFsbDpmdW5jdGlvbihlKXtpZih2LmlzRnVuY3Rpb24oZSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXt2KHRoaXMpLndyYXBBbGwoZS5jYWxsKHRoaXMsdCkpfSk7aWYodGhpc1swXSl7dmFyIHQ9dihlLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApO3RoaXNbMF0ucGFyZW50Tm9kZSYmdC5pbnNlcnRCZWZvcmUodGhpc1swXSksdC5tYXAoZnVuY3Rpb24oKXt2YXIgZT10aGlzO3doaWxlKGUuZmlyc3RDaGlsZCYmZS5maXJzdENoaWxkLm5vZGVUeXBlPT09MSllPWUuZmlyc3RDaGlsZDtyZXR1cm4gZX0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGUpe3JldHVybiB2LmlzRnVuY3Rpb24oZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3YodGhpcykud3JhcElubmVyKGUuY2FsbCh0aGlzLHQpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PXYodGhpcyksbj10LmNvbnRlbnRzKCk7bi5sZW5ndGg/bi53cmFwQWxsKGUpOnQuYXBwZW5kKGUpfSl9LHdyYXA6ZnVuY3Rpb24oZSl7dmFyIHQ9di5pc0Z1bmN0aW9uKGUpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24obil7dih0aGlzKS53cmFwQWxsKHQ/ZS5jYWxsKHRoaXMsbik6ZSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe3Yubm9kZU5hbWUodGhpcywiYm9keSIpfHx2KHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGUpeyh0aGlzLm5vZGVUeXBlPT09MXx8dGhpcy5ub2RlVHlwZT09PTExKSYmdGhpcy5hcHBlbmRDaGlsZChlKX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGUpeyh0aGlzLm5vZGVUeXBlPT09MXx8dGhpcy5ub2RlVHlwZT09PTExKSYmdGhpcy5pbnNlcnRCZWZvcmUoZSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKCF1dCh0aGlzWzBdKSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9di5jbGVhbihhcmd1bWVudHMpO3JldHVybiB0aGlzLnB1c2hTdGFjayh2Lm1lcmdlKGUsdGhpcyksImJlZm9yZSIsdGhpcy5zZWxlY3Rvcil9fSxhZnRlcjpmdW5jdGlvbigpe2lmKCF1dCh0aGlzWzBdKSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHRoaXMubmV4dFNpYmxpbmcpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9di5jbGVhbihhcmd1bWVudHMpO3JldHVybiB0aGlzLnB1c2hTdGFjayh2Lm1lcmdlKHRoaXMsZSksImFmdGVyIix0aGlzLnNlbGVjdG9yKX19LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MDtmb3IoOyhuPXRoaXNbcl0pIT1udWxsO3IrKylpZighZXx8di5maWx0ZXIoZSxbbl0pLmxlbmd0aCkhdCYmbi5ub2RlVHlwZT09PTEmJih2LmNsZWFuRGF0YShuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLHYuY2xlYW5EYXRhKFtuXSkpLG4ucGFyZW50Tm9kZSYmbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe3ZhciBlLHQ9MDtmb3IoOyhlPXRoaXNbdF0pIT1udWxsO3QrKyl7ZS5ub2RlVHlwZT09PTEmJnYuY2xlYW5EYXRhKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7d2hpbGUoZS5maXJzdENoaWxkKWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKX1yZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPT1udWxsPyExOmUsdD10PT1udWxsP2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB2LmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiB2LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUpe3ZhciBuPXRoaXNbMF18fHt9LHI9MCxpPXRoaXMubGVuZ3RoO2lmKGU9PT10KXJldHVybiBuLm5vZGVUeXBlPT09MT9uLmlubmVySFRNTC5yZXBsYWNlKGh0LCIiKTp0O2lmKHR5cGVvZiBlPT0ic3RyaW5nIiYmIXl0LnRlc3QoZSkmJih2LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8IXd0LnRlc3QoZSkpJiYodi5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlfHwhcHQudGVzdChlKSkmJiFOdFsodnQuZXhlYyhlKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9ZS5yZXBsYWNlKGR0LCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtyPGk7cisrKW49dGhpc1tyXXx8e30sbi5ub2RlVHlwZT09PTEmJih2LmNsZWFuRGF0YShuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLG4uaW5uZXJIVE1MPWUpO249MH1jYXRjaChzKXt9fW4mJnRoaXMuZW1wdHkoKS5hcHBlbmQoZSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oZSl7cmV0dXJuIHV0KHRoaXNbMF0pP3RoaXMubGVuZ3RoP3RoaXMucHVzaFN0YWNrKHYodi5pc0Z1bmN0aW9uKGUpP2UoKTplKSwicmVwbGFjZVdpdGgiLGUpOnRoaXM6di5pc0Z1bmN0aW9uKGUpP3RoaXMuZWFjaChmdW5jdGlvbih0KXt2YXIgbj12KHRoaXMpLHI9bi5odG1sKCk7bi5yZXBsYWNlV2l0aChlLmNhbGwodGhpcyx0LHIpKX0pOih0eXBlb2YgZSE9InN0cmluZyImJihlPXYoZSkuZGV0YWNoKCkpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PXRoaXMubmV4dFNpYmxpbmcsbj10aGlzLnBhcmVudE5vZGU7dih0aGlzKS5yZW1vdmUoKSx0P3YodCkuYmVmb3JlKGUpOnYobikuYXBwZW5kKGUpfSkpfSxkZXRhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVtb3ZlKGUsITApfSxkb21NYW5pcDpmdW5jdGlvbihlLG4scil7ZT1bXS5jb25jYXQuYXBwbHkoW10sZSk7dmFyIGkscyxvLHUsYT0wLGY9ZVswXSxsPVtdLGM9dGhpcy5sZW5ndGg7aWYoIXYuc3VwcG9ydC5jaGVja0Nsb25lJiZjPjEmJnR5cGVvZiBmPT0ic3RyaW5nIiYmU3QudGVzdChmKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dih0aGlzKS5kb21NYW5pcChlLG4scil9KTtpZih2LmlzRnVuY3Rpb24oZikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKXt2YXIgcz12KHRoaXMpO2VbMF09Zi5jYWxsKHRoaXMsaSxuP3MuaHRtbCgpOnQpLHMuZG9tTWFuaXAoZSxuLHIpfSk7aWYodGhpc1swXSl7aT12LmJ1aWxkRnJhZ21lbnQoZSx0aGlzLGwpLG89aS5mcmFnbWVudCxzPW8uZmlyc3RDaGlsZCxvLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmKG89cyk7aWYocyl7bj1uJiZ2Lm5vZGVOYW1lKHMsInRyIik7Zm9yKHU9aS5jYWNoZWFibGV8fGMtMTthPGM7YSsrKXIuY2FsbChuJiZ2Lm5vZGVOYW1lKHRoaXNbYV0sInRhYmxlIik/THQodGhpc1thXSwidGJvZHkiKTp0aGlzW2FdLGE9PT11P286di5jbG9uZShvLCEwLCEwKSl9bz1zPW51bGwsbC5sZW5ndGgmJnYuZWFjaChsLGZ1bmN0aW9uKGUsdCl7dC5zcmM/di5hamF4P3YuYWpheCh7dXJsOnQuc3JjLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsYXN5bmM6ITEsZ2xvYmFsOiExLCJ0aHJvd3MiOiEwfSk6di5lcnJvcigibm8gYWpheCIpOnYuZ2xvYmFsRXZhbCgodC50ZXh0fHx0LnRleHRDb250ZW50fHx0LmlubmVySFRNTHx8IiIpLnJlcGxhY2UoVHQsIiIpKSx0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX0pfXJldHVybiB0aGlzfX0pLHYuYnVpbGRGcmFnbWVudD1mdW5jdGlvbihlLG4scil7dmFyIHMsbyx1LGE9ZVswXTtyZXR1cm4gbj1ufHxpLG49IW4ubm9kZVR5cGUmJm5bMF18fG4sbj1uLm93bmVyRG9jdW1lbnR8fG4sZS5sZW5ndGg9PT0xJiZ0eXBlb2YgYT09InN0cmluZyImJmEubGVuZ3RoPDUxMiYmbj09PWkmJmEuY2hhckF0KDApPT09IjwiJiYhYnQudGVzdChhKSYmKHYuc3VwcG9ydC5jaGVja0Nsb25lfHwhU3QudGVzdChhKSkmJih2LnN1cHBvcnQuaHRtbDVDbG9uZXx8IXd0LnRlc3QoYSkpJiYobz0hMCxzPXYuZnJhZ21lbnRzW2FdLHU9cyE9PXQpLHN8fChzPW4uY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHYuY2xlYW4oZSxuLHMsciksbyYmKHYuZnJhZ21lbnRzW2FdPXUmJnMpKSx7ZnJhZ21lbnQ6cyxjYWNoZWFibGU6b319LHYuZnJhZ21lbnRzPXt9LHYuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGUsdCl7di5mbltlXT1mdW5jdGlvbihuKXt2YXIgcixpPTAscz1bXSxvPXYobiksdT1vLmxlbmd0aCxhPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2lmKChhPT1udWxsfHxhJiZhLm5vZGVUeXBlPT09MTEmJmEuY2hpbGROb2Rlcy5sZW5ndGg9PT0xKSYmdT09PTEpcmV0dXJuIG9bdF0odGhpc1swXSksdGhpcztmb3IoO2k8dTtpKyspcj0oaT4wP3RoaXMuY2xvbmUoITApOnRoaXMpLmdldCgpLHYob1tpXSlbdF0ocikscz1zLmNvbmNhdChyKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2socyxlLG8uc2VsZWN0b3IpfX0pLHYuZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxzLG87di5zdXBwb3J0Lmh0bWw1Q2xvbmV8fHYuaXNYTUxEb2MoZSl8fCF3dC50ZXN0KCI8IitlLm5vZGVOYW1lKyI+Iik/bz1lLmNsb25lTm9kZSghMCk6KGt0LmlubmVySFRNTD1lLm91dGVySFRNTCxrdC5yZW1vdmVDaGlsZChvPWt0LmZpcnN0Q2hpbGQpKTtpZigoIXYuc3VwcG9ydC5ub0Nsb25lRXZlbnR8fCF2LnN1cHBvcnQubm9DbG9uZUNoZWNrZWQpJiYoZS5ub2RlVHlwZT09PTF8fGUubm9kZVR5cGU9PT0xMSkmJiF2LmlzWE1MRG9jKGUpKXtPdChlLG8pLHI9TXQoZSksaT1NdChvKTtmb3Iocz0wO3Jbc107KytzKWlbc10mJk90KHJbc10saVtzXSl9aWYodCl7QXQoZSxvKTtpZihuKXtyPU10KGUpLGk9TXQobyk7Zm9yKHM9MDtyW3NdOysrcylBdChyW3NdLGlbc10pfX1yZXR1cm4gcj1pPW51bGwsb30sY2xlYW46ZnVuY3Rpb24oZSx0LG4scil7dmFyIHMsbyx1LGEsZixsLGMsaCxwLGQsbSxnLHk9dD09PWkmJkN0LGI9W107aWYoIXR8fHR5cGVvZiB0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQ9PSJ1bmRlZmluZWQiKXQ9aTtmb3Iocz0wOyh1PWVbc10pIT1udWxsO3MrKyl7dHlwZW9mIHU9PSJudW1iZXIiJiYodSs9IiIpO2lmKCF1KWNvbnRpbnVlO2lmKHR5cGVvZiB1PT0ic3RyaW5nIilpZighZ3QudGVzdCh1KSl1PXQuY3JlYXRlVGV4dE5vZGUodSk7ZWxzZXt5PXl8fGx0KHQpLGM9dC5jcmVhdGVFbGVtZW50KCJkaXYiKSx5LmFwcGVuZENoaWxkKGMpLHU9dS5yZXBsYWNlKGR0LCI8JDE+PC8kMj4iKSxhPSh2dC5leGVjKHUpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLGY9TnRbYV18fE50Ll9kZWZhdWx0LGw9ZlswXSxjLmlubmVySFRNTD1mWzFdK3UrZlsyXTt3aGlsZShsLS0pYz1jLmxhc3RDaGlsZDtpZighdi5zdXBwb3J0LnRib2R5KXtoPW10LnRlc3QodSkscD1hPT09InRhYmxlIiYmIWg/Yy5maXJzdENoaWxkJiZjLmZpcnN0Q2hpbGQuY2hpbGROb2RlczpmWzFdPT09Ijx0YWJsZT4iJiYhaD9jLmNoaWxkTm9kZXM6W107Zm9yKG89cC5sZW5ndGgtMTtvPj0wOy0tbyl2Lm5vZGVOYW1lKHBbb10sInRib2R5IikmJiFwW29dLmNoaWxkTm9kZXMubGVuZ3RoJiZwW29dLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocFtvXSl9IXYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmcHQudGVzdCh1KSYmYy5pbnNlcnRCZWZvcmUodC5jcmVhdGVUZXh0Tm9kZShwdC5leGVjKHUpWzBdKSxjLmZpcnN0Q2hpbGQpLHU9Yy5jaGlsZE5vZGVzLGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKX11Lm5vZGVUeXBlP2IucHVzaCh1KTp2Lm1lcmdlKGIsdSl9YyYmKHU9Yz15PW51bGwpO2lmKCF2LnN1cHBvcnQuYXBwZW5kQ2hlY2tlZClmb3Iocz0wOyh1PWJbc10pIT1udWxsO3MrKyl2Lm5vZGVOYW1lKHUsImlucHV0Iik/X3QodSk6dHlwZW9mIHUuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiZ2LmdyZXAodS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxfdCk7aWYobil7bT1mdW5jdGlvbihlKXtpZighZS50eXBlfHx4dC50ZXN0KGUudHlwZSkpcmV0dXJuIHI/ci5wdXNoKGUucGFyZW50Tm9kZT9lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk6ZSk6bi5hcHBlbmRDaGlsZChlKX07Zm9yKHM9MDsodT1iW3NdKSE9bnVsbDtzKyspaWYoIXYubm9kZU5hbWUodSwic2NyaXB0Iil8fCFtKHUpKW4uYXBwZW5kQ2hpbGQodSksdHlwZW9mIHUuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiYoZz12LmdyZXAodi5tZXJnZShbXSx1LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSksbSksYi5zcGxpY2UuYXBwbHkoYixbcysxLDBdLmNvbmNhdChnKSkscys9Zy5sZW5ndGgpfXJldHVybiBifSxjbGVhbkRhdGE6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGkscyxvPTAsdT12LmV4cGFuZG8sYT12LmNhY2hlLGY9di5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8sbD12LmV2ZW50LnNwZWNpYWw7Zm9yKDsoaT1lW29dKSE9bnVsbDtvKyspaWYodHx8di5hY2NlcHREYXRhKGkpKXtyPWlbdV0sbj1yJiZhW3JdO2lmKG4pe2lmKG4uZXZlbnRzKWZvcihzIGluIG4uZXZlbnRzKWxbc10/di5ldmVudC5yZW1vdmUoaSxzKTp2LnJlbW92ZUV2ZW50KGkscyxuLmhhbmRsZSk7YVtyXSYmKGRlbGV0ZSBhW3JdLGY/ZGVsZXRlIGlbdV06aS5yZW1vdmVBdHRyaWJ1dGU/aS5yZW1vdmVBdHRyaWJ1dGUodSk6aVt1XT1udWxsLHYuZGVsZXRlZElkcy5wdXNoKHIpKX19fX0pLGZ1bmN0aW9uKCl7dmFyIGUsdDt2LnVhTWF0Y2g9ZnVuY3Rpb24oZSl7ZT1lLnRvTG93ZXJDYXNlKCk7dmFyIHQ9LyhjaHJvbWUpWyBcL10oW1x3Ll0rKS8uZXhlYyhlKXx8Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8uZXhlYyhlKXx8LyhvcGVyYSkoPzouKnZlcnNpb258KVsgXC9dKFtcdy5dKykvLmV4ZWMoZSl8fC8obXNpZSkgKFtcdy5dKykvLmV4ZWMoZSl8fGUuaW5kZXhPZigiY29tcGF0aWJsZSIpPDAmJi8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKyl8KS8uZXhlYyhlKXx8W107cmV0dXJue2Jyb3dzZXI6dFsxXXx8IiIsdmVyc2lvbjp0WzJdfHwiMCJ9fSxlPXYudWFNYXRjaChvLnVzZXJBZ2VudCksdD17fSxlLmJyb3dzZXImJih0W2UuYnJvd3Nlcl09ITAsdC52ZXJzaW9uPWUudmVyc2lvbiksdC5jaHJvbWU/dC53ZWJraXQ9ITA6dC53ZWJraXQmJih0LnNhZmFyaT0hMCksdi5icm93c2VyPXQsdi5zdWI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsbil7cmV0dXJuIG5ldyBlLmZuLmluaXQodCxuKX12LmV4dGVuZCghMCxlLHRoaXMpLGUuc3VwZXJjbGFzcz10aGlzLGUuZm49ZS5wcm90b3R5cGU9dGhpcygpLGUuZm4uY29uc3RydWN0b3I9ZSxlLnN1Yj10aGlzLnN1YixlLmZuLmluaXQ9ZnVuY3Rpb24ocixpKXtyZXR1cm4gaSYmaSBpbnN0YW5jZW9mIHYmJiEoaSBpbnN0YW5jZW9mIGUpJiYoaT1lKGkpKSx2LmZuLmluaXQuY2FsbCh0aGlzLHIsaSx0KX0sZS5mbi5pbml0LnByb3RvdHlwZT1lLmZuO3ZhciB0PWUoaSk7cmV0dXJuIGV9fSgpO3ZhciBEdCxQdCxIdCxCdD0vYWxwaGFcKFteKV0qXCkvaSxqdD0vb3BhY2l0eT0oW14pXSopLyxGdD0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC8sSXQ9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLHF0PS9ebWFyZ2luLyxSdD1uZXcgUmVnRXhwKCJeKCIrbSsiKSguKikkIiwiaSIpLFV0PW5ldyBSZWdFeHAoIl4oIittKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksenQ9bmV3IFJlZ0V4cCgiXihbLStdKT0oIittKyIpIiwiaSIpLFd0PXtCT0RZOiJibG9jayJ9LFh0PXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxWdD17bGV0dGVyU3BhY2luZzowLGZvbnRXZWlnaHQ6NDAwfSwkdD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLEp0PVsiV2Via2l0IiwiTyIsIk1veiIsIm1zIl0sS3Q9di5mbi50b2dnbGU7di5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLG4pe3JldHVybiB2LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gciE9PXQ/di5zdHlsZShlLG4scik6di5jc3MoZSxuKX0sZSxuLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHNob3c6ZnVuY3Rpb24oKXtyZXR1cm4gWXQodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gWXQodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiBlPT0iYm9vbGVhbiI7cmV0dXJuIHYuaXNGdW5jdGlvbihlKSYmdi5pc0Z1bmN0aW9uKHQpP0t0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmVhY2goZnVuY3Rpb24oKXsobj9lOkd0KHRoaXMpKT92KHRoaXMpLnNob3coKTp2KHRoaXMpLmhpZGUoKX0pfX0pLHYuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGUsdCl7aWYodCl7dmFyIG49RHQoZSwib3BhY2l0eSIpO3JldHVybiBuPT09IiI/IjEiOm59fX19LGNzc051bWJlcjp7ZmlsbE9wYWNpdHk6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOnYuc3VwcG9ydC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oZSxuLHIsaSl7aWYoIWV8fGUubm9kZVR5cGU9PT0zfHxlLm5vZGVUeXBlPT09OHx8IWUuc3R5bGUpcmV0dXJuO3ZhciBzLG8sdSxhPXYuY2FtZWxDYXNlKG4pLGY9ZS5zdHlsZTtuPXYuY3NzUHJvcHNbYV18fCh2LmNzc1Byb3BzW2FdPVF0KGYsYSkpLHU9di5jc3NIb29rc1tuXXx8di5jc3NIb29rc1thXTtpZihyPT09dClyZXR1cm4gdSYmImdldCJpbiB1JiYocz11LmdldChlLCExLGkpKSE9PXQ/czpmW25dO289dHlwZW9mIHIsbz09PSJzdHJpbmciJiYocz16dC5leGVjKHIpKSYmKHI9KHNbMV0rMSkqc1syXStwYXJzZUZsb2F0KHYuY3NzKGUsbikpLG89Im51bWJlciIpO2lmKHI9PW51bGx8fG89PT0ibnVtYmVyIiYmaXNOYU4ocikpcmV0dXJuO289PT0ibnVtYmVyIiYmIXYuY3NzTnVtYmVyW2FdJiYocis9InB4Iik7aWYoIXV8fCEoInNldCJpbiB1KXx8KHI9dS5zZXQoZSxyLGkpKSE9PXQpdHJ5e2Zbbl09cn1jYXRjaChsKXt9fSxjc3M6ZnVuY3Rpb24oZSxuLHIsaSl7dmFyIHMsbyx1LGE9di5jYW1lbENhc2Uobik7cmV0dXJuIG49di5jc3NQcm9wc1thXXx8KHYuY3NzUHJvcHNbYV09UXQoZS5zdHlsZSxhKSksdT12LmNzc0hvb2tzW25dfHx2LmNzc0hvb2tzW2FdLHUmJiJnZXQiaW4gdSYmKHM9dS5nZXQoZSwhMCxpKSkscz09PXQmJihzPUR0KGUsbikpLHM9PT0ibm9ybWFsIiYmbiBpbiBWdCYmKHM9VnRbbl0pLHJ8fGkhPT10PyhvPXBhcnNlRmxvYXQocykscnx8di5pc051bWVyaWMobyk/b3x8MDpzKTpzfSxzd2FwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLHM9e307Zm9yKGkgaW4gdClzW2ldPWUuc3R5bGVbaV0sZS5zdHlsZVtpXT10W2ldO3I9bi5jYWxsKGUpO2ZvcihpIGluIHQpZS5zdHlsZVtpXT1zW2ldO3JldHVybiByfX0pLGUuZ2V0Q29tcHV0ZWRTdHlsZT9EdD1mdW5jdGlvbih0LG4pe3ZhciByLGkscyxvLHU9ZS5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCksYT10LnN0eWxlO3JldHVybiB1JiYocj11LmdldFByb3BlcnR5VmFsdWUobil8fHVbbl0scj09PSIiJiYhdi5jb250YWlucyh0Lm93bmVyRG9jdW1lbnQsdCkmJihyPXYuc3R5bGUodCxuKSksVXQudGVzdChyKSYmcXQudGVzdChuKSYmKGk9YS53aWR0aCxzPWEubWluV2lkdGgsbz1hLm1heFdpZHRoLGEubWluV2lkdGg9YS5tYXhXaWR0aD1hLndpZHRoPXIscj11LndpZHRoLGEud2lkdGg9aSxhLm1pbldpZHRoPXMsYS5tYXhXaWR0aD1vKSkscn06aS5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoRHQ9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5jdXJyZW50U3R5bGUmJmUuY3VycmVudFN0eWxlW3RdLHM9ZS5zdHlsZTtyZXR1cm4gaT09bnVsbCYmcyYmc1t0XSYmKGk9c1t0XSksVXQudGVzdChpKSYmIUZ0LnRlc3QodCkmJihuPXMubGVmdCxyPWUucnVudGltZVN0eWxlJiZlLnJ1bnRpbWVTdHlsZS5sZWZ0LHImJihlLnJ1bnRpbWVTdHlsZS5sZWZ0PWUuY3VycmVudFN0eWxlLmxlZnQpLHMubGVmdD10PT09ImZvbnRTaXplIj8iMWVtIjppLGk9cy5waXhlbExlZnQrInB4IixzLmxlZnQ9bixyJiYoZS5ydW50aW1lU3R5bGUubGVmdD1yKSksaT09PSIiPyJhdXRvIjppfSksdi5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihlLHQpe3YuY3NzSG9va3NbdF09e2dldDpmdW5jdGlvbihlLG4scil7aWYobilyZXR1cm4gZS5vZmZzZXRXaWR0aD09PTAmJkl0LnRlc3QoRHQoZSwiZGlzcGxheSIpKT92LnN3YXAoZSxYdCxmdW5jdGlvbigpe3JldHVybiB0bihlLHQscil9KTp0bihlLHQscil9LHNldDpmdW5jdGlvbihlLG4scil7cmV0dXJuIFp0KGUsbixyP2VuKGUsdCxyLHYuc3VwcG9ydC5ib3hTaXppbmcmJnYuY3NzKGUsImJveFNpemluZyIpPT09ImJvcmRlci1ib3giKTowKX19fSksdi5zdXBwb3J0Lm9wYWNpdHl8fCh2LmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihlLHQpe3JldHVybiBqdC50ZXN0KCh0JiZlLmN1cnJlbnRTdHlsZT9lLmN1cnJlbnRTdHlsZS5maWx0ZXI6ZS5zdHlsZS5maWx0ZXIpfHwiIik/LjAxKnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsiIjp0PyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5zdHlsZSxyPWUuY3VycmVudFN0eWxlLGk9di5pc051bWVyaWModCk/ImFscGhhKG9wYWNpdHk9Iit0KjEwMCsiKSI6IiIscz1yJiZyLmZpbHRlcnx8bi5maWx0ZXJ8fCIiO24uem9vbT0xO2lmKHQ+PTEmJnYudHJpbShzLnJlcGxhY2UoQnQsIiIpKT09PSIiJiZuLnJlbW92ZUF0dHJpYnV0ZSl7bi5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpO2lmKHImJiFyLmZpbHRlcilyZXR1cm59bi5maWx0ZXI9QnQudGVzdChzKT9zLnJlcGxhY2UoQnQsaSk6cysiICIraX19KSx2KGZ1bmN0aW9uKCl7di5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHR8fCh2LmNzc0hvb2tzLm1hcmdpblJpZ2h0PXtnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdi5zd2FwKGUse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LGZ1bmN0aW9uKCl7aWYodClyZXR1cm4gRHQoZSwibWFyZ2luUmlnaHQiKX0pfX0pLCF2LnN1cHBvcnQucGl4ZWxQb3NpdGlvbiYmdi5mbi5wb3NpdGlvbiYmdi5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGUsdCl7di5jc3NIb29rc1t0XT17Z2V0OmZ1bmN0aW9uKGUsbil7aWYobil7dmFyIHI9RHQoZSx0KTtyZXR1cm4gVXQudGVzdChyKT92KGUpLnBvc2l0aW9uKClbdF0rInB4IjpyfX19fSl9KSx2LmV4cHImJnYuZXhwci5maWx0ZXJzJiYodi5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGUpe3JldHVybiBlLm9mZnNldFdpZHRoPT09MCYmZS5vZmZzZXRIZWlnaHQ9PT0wfHwhdi5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmKGUuc3R5bGUmJmUuc3R5bGUuZGlzcGxheXx8RHQoZSwiZGlzcGxheSIpKT09PSJub25lIn0sdi5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4hdi5leHByLmZpbHRlcnMuaGlkZGVuKGUpfSksdi5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oZSx0KXt2LmNzc0hvb2tzW2UrdF09e2V4cGFuZDpmdW5jdGlvbihuKXt2YXIgcixpPXR5cGVvZiBuPT0ic3RyaW5nIj9uLnNwbGl0KCIgIik6W25dLHM9e307Zm9yKHI9MDtyPDQ7cisrKXNbZSskdFtyXSt0XT1pW3JdfHxpW3ItMl18fGlbMF07cmV0dXJuIHN9fSxxdC50ZXN0KGUpfHwodi5jc3NIb29rc1tlK3RdLnNldD1adCl9KTt2YXIgcm49LyUyMC9nLHNuPS9cW1xdJC8sb249L1xyP1xuL2csdW49L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGRhdGV0aW1lLWxvY2FsfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLGFuPS9eKD86c2VsZWN0fHRleHRhcmVhKS9pO3YuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP3YubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8YW4udGVzdCh0aGlzLm5vZGVOYW1lKXx8dW4udGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihlLHQpe3ZhciBuPXYodGhpcykudmFsKCk7cmV0dXJuIG49PW51bGw/bnVsbDp2LmlzQXJyYXkobik/di5tYXAobixmdW5jdGlvbihlLG4pe3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2Uob24sIlxyXG4iKX19KTp7bmFtZTp0Lm5hbWUsdmFsdWU6bi5yZXBsYWNlKG9uLCJcclxuIil9fSkuZ2V0KCl9fSksdi5wYXJhbT1mdW5jdGlvbihlLG4pe3ZhciByLGk9W10scz1mdW5jdGlvbihlLHQpe3Q9di5pc0Z1bmN0aW9uKHQpP3QoKTp0PT1udWxsPyIiOnQsaVtpLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQodCl9O249PT10JiYobj12LmFqYXhTZXR0aW5ncyYmdi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpO2lmKHYuaXNBcnJheShlKXx8ZS5qcXVlcnkmJiF2LmlzUGxhaW5PYmplY3QoZSkpdi5lYWNoKGUsZnVuY3Rpb24oKXtzKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHIgaW4gZSlmbihyLGVbcl0sbixzKTtyZXR1cm4gaS5qb2luKCImIikucmVwbGFjZShybiwiKyIpfTt2YXIgbG4sY24saG49LyMuKiQvLHBuPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsZG49L14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyx2bj0vXig/OkdFVHxIRUFEKSQvLG1uPS9eXC9cLy8sZ249L1w/Lyx5bj0vPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSxibj0vKFs/Jl0pXz1bXiZdKi8sd249L14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLEVuPXYuZm4ubG9hZCxTbj17fSx4bj17fSxUbj1bIiovIl0rWyIqIl07dHJ5e2NuPXMuaHJlZn1jYXRjaChObil7Y249aS5jcmVhdGVFbGVtZW50KCJhIiksY24uaHJlZj0iIixjbj1jbi5ocmVmfWxuPXduLmV4ZWMoY24udG9Mb3dlckNhc2UoKSl8fFtdLHYuZm4ubG9hZD1mdW5jdGlvbihlLG4scil7aWYodHlwZW9mIGUhPSJzdHJpbmciJiZFbilyZXR1cm4gRW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgaSxzLG8sdT10aGlzLGE9ZS5pbmRleE9mKCIgIik7cmV0dXJuIGE+PTAmJihpPWUuc2xpY2UoYSxlLmxlbmd0aCksZT1lLnNsaWNlKDAsYSkpLHYuaXNGdW5jdGlvbihuKT8ocj1uLG49dCk6biYmdHlwZW9mIG49PSJvYmplY3QiJiYocz0iUE9TVCIpLHYuYWpheCh7dXJsOmUsdHlwZTpzLGRhdGFUeXBlOiJodG1sIixkYXRhOm4sY29tcGxldGU6ZnVuY3Rpb24oZSx0KXtyJiZ1LmVhY2gocixvfHxbZS5yZXNwb25zZVRleHQsdCxlXSl9fSkuZG9uZShmdW5jdGlvbihlKXtvPWFyZ3VtZW50cyx1Lmh0bWwoaT92KCI8ZGl2PiIpLmFwcGVuZChlLnJlcGxhY2UoeW4sIiIpKS5maW5kKGkpOmUpfSksdGhpc30sdi5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe3YuZm5bdF09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub24odCxlKX19KSx2LmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oZSxuKXt2W25dPWZ1bmN0aW9uKGUscixpLHMpe3JldHVybiB2LmlzRnVuY3Rpb24ocikmJihzPXN8fGksaT1yLHI9dCksdi5hamF4KHt0eXBlOm4sdXJsOmUsZGF0YTpyLHN1Y2Nlc3M6aSxkYXRhVHlwZTpzfSl9fSksdi5leHRlbmQoe2dldFNjcmlwdDpmdW5jdGlvbihlLG4pe3JldHVybiB2LmdldChlLHQsbiwic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2LmdldChlLHQsbiwianNvbiIpfSxhamF4U2V0dXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9MbihlLHYuYWpheFNldHRpbmdzKToodD1lLGU9di5hamF4U2V0dGluZ3MpLExuKGUsdCksZX0sYWpheFNldHRpbmdzOnt1cmw6Y24saXNMb2NhbDpkbi50ZXN0KGxuWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04Iixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6VG59LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjplLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjp2LnBhcnNlSlNPTiwidGV4dCB4bWwiOnYucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEwLHVybDohMH19LGFqYXhQcmVmaWx0ZXI6Q24oU24pLGFqYXhUcmFuc3BvcnQ6Q24oeG4pLGFqYXg6ZnVuY3Rpb24oZSxuKXtmdW5jdGlvbiBUKGUsbixzLGEpe3ZhciBsLHksYix3LFMsVD1uO2lmKEU9PT0yKXJldHVybjtFPTIsdSYmY2xlYXJUaW1lb3V0KHUpLG89dCxpPWF8fCIiLHgucmVhZHlTdGF0ZT1lPjA/NDowLHMmJih3PUFuKGMseCxzKSk7aWYoZT49MjAwJiZlPDMwMHx8ZT09PTMwNCljLmlmTW9kaWZpZWQmJihTPXguZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSxTJiYodi5sYXN0TW9kaWZpZWRbcl09UyksUz14LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIiksUyYmKHYuZXRhZ1tyXT1TKSksZT09PTMwND8oVD0ibm90bW9kaWZpZWQiLGw9ITApOihsPU9uKGMsdyksVD1sLnN0YXRlLHk9bC5kYXRhLGI9bC5lcnJvcixsPSFiKTtlbHNle2I9VDtpZighVHx8ZSlUPSJlcnJvciIsZTwwJiYoZT0wKX14LnN0YXR1cz1lLHguc3RhdHVzVGV4dD0obnx8VCkrIiIsbD9kLnJlc29sdmVXaXRoKGgsW3ksVCx4XSk6ZC5yZWplY3RXaXRoKGgsW3gsVCxiXSkseC5zdGF0dXNDb2RlKGcpLGc9dCxmJiZwLnRyaWdnZXIoImFqYXgiKyhsPyJTdWNjZXNzIjoiRXJyb3IiKSxbeCxjLGw/eTpiXSksbS5maXJlV2l0aChoLFt4LFRdKSxmJiYocC50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt4LGNdKSwtLXYuYWN0aXZlfHx2LmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfXR5cGVvZiBlPT0ib2JqZWN0IiYmKG49ZSxlPXQpLG49bnx8e307dmFyIHIsaSxzLG8sdSxhLGYsbCxjPXYuYWpheFNldHVwKHt9LG4pLGg9Yy5jb250ZXh0fHxjLHA9aCE9PWMmJihoLm5vZGVUeXBlfHxoIGluc3RhbmNlb2Ygdik/dihoKTp2LmV2ZW50LGQ9di5EZWZlcnJlZCgpLG09di5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksZz1jLnN0YXR1c0NvZGV8fHt9LGI9e30sdz17fSxFPTAsUz0iY2FuY2VsZWQiLHg9e3JlYWR5U3RhdGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGUsdCl7aWYoIUUpe3ZhciBuPWUudG9Mb3dlckNhc2UoKTtlPXdbbl09d1tuXXx8ZSxiW2VdPXR9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBFPT09Mj9pOm51bGx9LGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciBuO2lmKEU9PT0yKXtpZighcyl7cz17fTt3aGlsZShuPXBuLmV4ZWMoaSkpc1tuWzFdLnRvTG93ZXJDYXNlKCldPW5bMl19bj1zW2UudG9Mb3dlckNhc2UoKV19cmV0dXJuIG49PT10P251bGw6bn0sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gRXx8KGMubWltZVR5cGU9ZSksdGhpc30sYWJvcnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZXx8UyxvJiZvLmFib3J0KGUpLFQoMCxlKSx0aGlzfX07ZC5wcm9taXNlKHgpLHguc3VjY2Vzcz14LmRvbmUseC5lcnJvcj14LmZhaWwseC5jb21wbGV0ZT1tLmFkZCx4LnN0YXR1c0NvZGU9ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ7aWYoRTwyKWZvcih0IGluIGUpZ1t0XT1bZ1t0XSxlW3RdXTtlbHNlIHQ9ZVt4LnN0YXR1c10seC5hbHdheXModCl9cmV0dXJuIHRoaXN9LGMudXJsPSgoZXx8Yy51cmwpKyIiKS5yZXBsYWNlKGhuLCIiKS5yZXBsYWNlKG1uLGxuWzFdKyIvLyIpLGMuZGF0YVR5cGVzPXYudHJpbShjLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoeSksYy5jcm9zc0RvbWFpbj09bnVsbCYmKGE9d24uZXhlYyhjLnVybC50b0xvd2VyQ2FzZSgpKSxjLmNyb3NzRG9tYWluPSEoIWF8fGFbMV09PT1sblsxXSYmYVsyXT09PWxuWzJdJiYoYVszXXx8KGFbMV09PT0iaHR0cDoiPzgwOjQ0MykpPT0obG5bM118fChsblsxXT09PSJodHRwOiI/ODA6NDQzKSkpKSxjLmRhdGEmJmMucHJvY2Vzc0RhdGEmJnR5cGVvZiBjLmRhdGEhPSJzdHJpbmciJiYoYy5kYXRhPXYucGFyYW0oYy5kYXRhLGMudHJhZGl0aW9uYWwpKSxrbihTbixjLG4seCk7aWYoRT09PTIpcmV0dXJuIHg7Zj1jLmdsb2JhbCxjLnR5cGU9Yy50eXBlLnRvVXBwZXJDYXNlKCksYy5oYXNDb250ZW50PSF2bi50ZXN0KGMudHlwZSksZiYmdi5hY3RpdmUrKz09PTAmJnYuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iik7aWYoIWMuaGFzQ29udGVudCl7Yy5kYXRhJiYoYy51cmwrPShnbi50ZXN0KGMudXJsKT8iJiI6Ij8iKStjLmRhdGEsZGVsZXRlIGMuZGF0YSkscj1jLnVybDtpZihjLmNhY2hlPT09ITEpe3ZhciBOPXYubm93KCksQz1jLnVybC5yZXBsYWNlKGJuLCIkMV89IitOKTtjLnVybD1DKyhDPT09Yy51cmw/KGduLnRlc3QoYy51cmwpPyImIjoiPyIpKyJfPSIrTjoiIil9fShjLmRhdGEmJmMuaGFzQ29udGVudCYmYy5jb250ZW50VHlwZSE9PSExfHxuLmNvbnRlbnRUeXBlKSYmeC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGMuY29udGVudFR5cGUpLGMuaWZNb2RpZmllZCYmKHI9cnx8Yy51cmwsdi5sYXN0TW9kaWZpZWRbcl0mJnguc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLHYubGFzdE1vZGlmaWVkW3JdKSx2LmV0YWdbcl0mJnguc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsdi5ldGFnW3JdKSkseC5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGMuZGF0YVR5cGVzWzBdJiZjLmFjY2VwdHNbYy5kYXRhVHlwZXNbMF1dP2MuYWNjZXB0c1tjLmRhdGFUeXBlc1swXV0rKGMuZGF0YVR5cGVzWzBdIT09IioiPyIsICIrVG4rIjsgcT0wLjAxIjoiIik6Yy5hY2NlcHRzWyIqIl0pO2ZvcihsIGluIGMuaGVhZGVycyl4LnNldFJlcXVlc3RIZWFkZXIobCxjLmhlYWRlcnNbbF0pO2lmKCFjLmJlZm9yZVNlbmR8fGMuYmVmb3JlU2VuZC5jYWxsKGgseCxjKSE9PSExJiZFIT09Mil7Uz0iYWJvcnQiO2ZvcihsIGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXhbbF0oY1tsXSk7bz1rbih4bixjLG4seCk7aWYoIW8pVCgtMSwiTm8gVHJhbnNwb3J0Iik7ZWxzZXt4LnJlYWR5U3RhdGU9MSxmJiZwLnRyaWdnZXIoImFqYXhTZW5kIixbeCxjXSksYy5hc3luYyYmYy50aW1lb3V0PjAmJih1PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt4LmFib3J0KCJ0aW1lb3V0Iil9LGMudGltZW91dCkpO3RyeXtFPTEsby5zZW5kKGIsVCl9Y2F0Y2goayl7aWYoIShFPDIpKXRocm93IGs7VCgtMSxrKX19cmV0dXJuIHh9cmV0dXJuIHguYWJvcnQoKX0sYWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e319KTt2YXIgTW49W10sX249L1w/LyxEbj0vKD0pXD8oPz0mfCQpfFw/XD8vLFBuPXYubm93KCk7di5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPU1uLnBvcCgpfHx2LmV4cGFuZG8rIl8iK1BuKys7cmV0dXJuIHRoaXNbZV09ITAsZX19KSx2LmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKG4scixpKXt2YXIgcyxvLHUsYT1uLmRhdGEsZj1uLnVybCxsPW4uanNvbnAhPT0hMSxjPWwmJkRuLnRlc3QoZiksaD1sJiYhYyYmdHlwZW9mIGE9PSJzdHJpbmciJiYhKG4uY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmRG4udGVzdChhKTtpZihuLmRhdGFUeXBlc1swXT09PSJqc29ucCJ8fGN8fGgpcmV0dXJuIHM9bi5qc29ucENhbGxiYWNrPXYuaXNGdW5jdGlvbihuLmpzb25wQ2FsbGJhY2spP24uanNvbnBDYWxsYmFjaygpOm4uanNvbnBDYWxsYmFjayxvPWVbc10sYz9uLnVybD1mLnJlcGxhY2UoRG4sIiQxIitzKTpoP24uZGF0YT1hLnJlcGxhY2UoRG4sIiQxIitzKTpsJiYobi51cmwrPShfbi50ZXN0KGYpPyImIjoiPyIpK24uanNvbnArIj0iK3MpLG4uY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiB1fHx2LmVycm9yKHMrIiB3YXMgbm90IGNhbGxlZCIpLHVbMF19LG4uZGF0YVR5cGVzWzBdPSJqc29uIixlW3NdPWZ1bmN0aW9uKCl7dT1hcmd1bWVudHN9LGkuYWx3YXlzKGZ1bmN0aW9uKCl7ZVtzXT1vLG5bc10mJihuLmpzb25wQ2FsbGJhY2s9ci5qc29ucENhbGxiYWNrLE1uLnB1c2gocykpLHUmJnYuaXNGdW5jdGlvbihvKSYmbyh1WzBdKSx1PW89dH0pLCJzY3JpcHQifSksdi5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9qYXZhc2NyaXB0fGVjbWFzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGUpe3JldHVybiB2Lmdsb2JhbEV2YWwoZSksZX19fSksdi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2UuY2FjaGU9PT10JiYoZS5jYWNoZT0hMSksZS5jcm9zc0RvbWFpbiYmKGUudHlwZT0iR0VUIixlLmdsb2JhbD0hMSl9KSx2LmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oZSl7aWYoZS5jcm9zc0RvbWFpbil7dmFyIG4scj1pLmhlYWR8fGkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8aS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24ocyxvKXtuPWkuY3JlYXRlRWxlbWVudCgic2NyaXB0Iiksbi5hc3luYz0iYXN5bmMiLGUuc2NyaXB0Q2hhcnNldCYmKG4uY2hhcnNldD1lLnNjcmlwdENoYXJzZXQpLG4uc3JjPWUudXJsLG4ub25sb2FkPW4ub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGUsaSl7aWYoaXx8IW4ucmVhZHlTdGF0ZXx8L2xvYWRlZHxjb21wbGV0ZS8udGVzdChuLnJlYWR5U3RhdGUpKW4ub25sb2FkPW4ub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsciYmbi5wYXJlbnROb2RlJiZyLnJlbW92ZUNoaWxkKG4pLG49dCxpfHxvKDIwMCwic3VjY2VzcyIpfSxyLmluc2VydEJlZm9yZShuLHIuZmlyc3RDaGlsZCl9LGFib3J0OmZ1bmN0aW9uKCl7biYmbi5vbmxvYWQoMCwxKX19fX0pO3ZhciBIbixCbj1lLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gSG4pSG5bZV0oMCwxKX06ITEsam49MDt2LmFqYXhTZXR0aW5ncy54aHI9ZS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmRm4oKXx8SW4oKX06Rm4sZnVuY3Rpb24oZSl7di5leHRlbmQodi5zdXBwb3J0LHthamF4OiEhZSxjb3JzOiEhZSYmIndpdGhDcmVkZW50aWFscyJpbiBlfSl9KHYuYWpheFNldHRpbmdzLnhocigpKSx2LnN1cHBvcnQuYWpheCYmdi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKG4pe2lmKCFuLmNyb3NzRG9tYWlufHx2LnN1cHBvcnQuY29ycyl7dmFyIHI7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oaSxzKXt2YXIgbyx1LGE9bi54aHIoKTtuLnVzZXJuYW1lP2Eub3BlbihuLnR5cGUsbi51cmwsbi5hc3luYyxuLnVzZXJuYW1lLG4ucGFzc3dvcmQpOmEub3BlbihuLnR5cGUsbi51cmwsbi5hc3luYyk7aWYobi54aHJGaWVsZHMpZm9yKHUgaW4gbi54aHJGaWVsZHMpYVt1XT1uLnhockZpZWxkc1t1XTtuLm1pbWVUeXBlJiZhLm92ZXJyaWRlTWltZVR5cGUmJmEub3ZlcnJpZGVNaW1lVHlwZShuLm1pbWVUeXBlKSwhbi5jcm9zc0RvbWFpbiYmIWlbIlgtUmVxdWVzdGVkLVdpdGgiXSYmKGlbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7Zm9yKHUgaW4gaSlhLnNldFJlcXVlc3RIZWFkZXIodSxpW3VdKX1jYXRjaChmKXt9YS5zZW5kKG4uaGFzQ29udGVudCYmbi5kYXRhfHxudWxsKSxyPWZ1bmN0aW9uKGUsaSl7dmFyIHUsZixsLGMsaDt0cnl7aWYociYmKGl8fGEucmVhZHlTdGF0ZT09PTQpKXtyPXQsbyYmKGEub25yZWFkeXN0YXRlY2hhbmdlPXYubm9vcCxCbiYmZGVsZXRlIEhuW29dKTtpZihpKWEucmVhZHlTdGF0ZSE9PTQmJmEuYWJvcnQoKTtlbHNle3U9YS5zdGF0dXMsbD1hLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLGM9e30saD1hLnJlc3BvbnNlWE1MLGgmJmguZG9jdW1lbnRFbGVtZW50JiYoYy54bWw9aCk7dHJ5e2MudGV4dD1hLnJlc3BvbnNlVGV4dH1jYXRjaChwKXt9dHJ5e2Y9YS5zdGF0dXNUZXh0fWNhdGNoKHApe2Y9IiJ9IXUmJm4uaXNMb2NhbCYmIW4uY3Jvc3NEb21haW4/dT1jLnRleHQ/MjAwOjQwNDp1PT09MTIyMyYmKHU9MjA0KX19fWNhdGNoKGQpe2l8fHMoLTEsZCl9YyYmcyh1LGYsYyxsKX0sbi5hc3luYz9hLnJlYWR5U3RhdGU9PT00P3NldFRpbWVvdXQociwwKToobz0rK2puLEJuJiYoSG58fChIbj17fSx2KGUpLnVubG9hZChCbikpLEhuW29dPXIpLGEub25yZWFkeXN0YXRlY2hhbmdlPXIpOnIoKX0sYWJvcnQ6ZnVuY3Rpb24oKXtyJiZyKDAsMSl9fX19KTt2YXIgcW4sUm4sVW49L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLHpuPW5ldyBSZWdFeHAoIl4oPzooWy0rXSk9fCkoIittKyIpKFthLXolXSopJCIsImkiKSxXbj0vcXVldWVIb29rcyQvLFhuPVtHbl0sVm49eyIqIjpbZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9dGhpcy5jcmVhdGVUd2VlbihlLHQpLHM9em4uZXhlYyh0KSxvPWkuY3VyKCksdT0rb3x8MCxhPTEsZj0yMDtpZihzKXtuPStzWzJdLHI9c1szXXx8KHYuY3NzTnVtYmVyW2VdPyIiOiJweCIpO2lmKHIhPT0icHgiJiZ1KXt1PXYuY3NzKGkuZWxlbSxlLCEwKXx8bnx8MTtkbyBhPWF8fCIuNSIsdS89YSx2LnN0eWxlKGkuZWxlbSxlLHUrcik7d2hpbGUoYSE9PShhPWkuY3VyKCkvbykmJmEhPT0xJiYtLWYpfWkudW5pdD1yLGkuc3RhcnQ9dSxpLmVuZD1zWzFdP3UrKHNbMV0rMSkqbjpufXJldHVybiBpfV19O3YuQW5pbWF0aW9uPXYuZXh0ZW5kKEtuLHt0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7di5pc0Z1bmN0aW9uKGUpPyh0PWUsZT1bIioiXSk6ZT1lLnNwbGl0KCIgIik7dmFyIG4scj0wLGk9ZS5sZW5ndGg7Zm9yKDtyPGk7cisrKW49ZVtyXSxWbltuXT1WbltuXXx8W10sVm5bbl0udW5zaGlmdCh0KX0scHJlZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dD9Ybi51bnNoaWZ0KGUpOlhuLnB1c2goZSl9fSksdi5Ud2Vlbj1ZbixZbi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlluLGluaXQ6ZnVuY3Rpb24oZSx0LG4scixpLHMpe3RoaXMuZWxlbT1lLHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPWl8fCJzd2luZyIsdGhpcy5vcHRpb25zPXQsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhpcy51bml0PXN8fCh2LmNzc051bWJlcltuXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGU9WW4ucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGUmJmUuZ2V0P2UuZ2V0KHRoaXMpOlluLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihlKXt2YXIgdCxuPVluLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9dD12LmVhc2luZ1t0aGlzLmVhc2luZ10oZSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qZSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz10PWUsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKnQrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksbiYmbi5zZXQ/bi5zZXQodGhpcyk6WW4ucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0sWW4ucHJvdG90eXBlLmluaXQucHJvdG90eXBlPVluLnByb3RvdHlwZSxZbi5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGUuZWxlbVtlLnByb3BdPT1udWxsfHwhIWUuZWxlbS5zdHlsZSYmZS5lbGVtLnN0eWxlW2UucHJvcF0hPW51bGw/KHQ9di5jc3MoZS5lbGVtLGUucHJvcCwhMSwiIiksIXR8fHQ9PT0iYXV0byI/MDp0KTplLmVsZW1bZS5wcm9wXX0sc2V0OmZ1bmN0aW9uKGUpe3YuZnguc3RlcFtlLnByb3BdP3YuZnguc3RlcFtlLnByb3BdKGUpOmUuZWxlbS5zdHlsZSYmKGUuZWxlbS5zdHlsZVt2LmNzc1Byb3BzW2UucHJvcF1dIT1udWxsfHx2LmNzc0hvb2tzW2UucHJvcF0pP3Yuc3R5bGUoZS5lbGVtLGUucHJvcCxlLm5vdytlLnVuaXQpOmUuZWxlbVtlLnByb3BdPWUubm93fX19LFluLnByb3BIb29rcy5zY3JvbGxUb3A9WW4ucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihlKXtlLmVsZW0ubm9kZVR5cGUmJmUuZWxlbS5wYXJlbnROb2RlJiYoZS5lbGVtW2UucHJvcF09ZS5ub3cpfX0sdi5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihlLHQpe3ZhciBuPXYuZm5bdF07di5mblt0XT1mdW5jdGlvbihyLGkscyl7cmV0dXJuIHI9PW51bGx8fHR5cGVvZiByPT0iYm9vbGVhbiJ8fCFlJiZ2LmlzRnVuY3Rpb24ocikmJnYuaXNGdW5jdGlvbihpKT9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoWm4odCwhMCkscixpLHMpfX0pLHYuZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKEd0KS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT12LmlzRW1wdHlPYmplY3QoZSkscz12LnNwZWVkKHQsbixyKSxvPWZ1bmN0aW9uKCl7dmFyIHQ9S24odGhpcyx2LmV4dGVuZCh7fSxlKSxzKTtpJiZ0LnN0b3AoITApfTtyZXR1cm4gaXx8cy5xdWV1ZT09PSExP3RoaXMuZWFjaChvKTp0aGlzLnF1ZXVlKHMucXVldWUsbyl9LHN0b3A6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RvcDtkZWxldGUgZS5zdG9wLHQocil9O3JldHVybiB0eXBlb2YgZSE9InN0cmluZyImJihyPW4sbj1lLGU9dCksbiYmZSE9PSExJiZ0aGlzLnF1ZXVlKGV8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PSEwLG49ZSE9bnVsbCYmZSsicXVldWVIb29rcyIscz12LnRpbWVycyxvPXYuX2RhdGEodGhpcyk7aWYobilvW25dJiZvW25dLnN0b3AmJmkob1tuXSk7ZWxzZSBmb3IobiBpbiBvKW9bbl0mJm9bbl0uc3RvcCYmV24udGVzdChuKSYmaShvW25dKTtmb3Iobj1zLmxlbmd0aDtuLS07KXNbbl0uZWxlbT09PXRoaXMmJihlPT1udWxsfHxzW25dLnF1ZXVlPT09ZSkmJihzW25dLmFuaW0uc3RvcChyKSx0PSExLHMuc3BsaWNlKG4sMSkpOyh0fHwhcikmJnYuZGVxdWV1ZSh0aGlzLGUpfSl9fSksdi5lYWNoKHtzbGlkZURvd246Wm4oInNob3ciKSxzbGlkZVVwOlpuKCJoaWRlIiksc2xpZGVUb2dnbGU6Wm4oInRvZ2dsZSIpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oZSx0KXt2LmZuW2VdPWZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gdGhpcy5hbmltYXRlKHQsZSxuLHIpfX0pLHYuc3BlZWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUmJnR5cGVvZiBlPT0ib2JqZWN0Ij92LmV4dGVuZCh7fSxlKTp7Y29tcGxldGU6bnx8IW4mJnR8fHYuaXNGdW5jdGlvbihlKSYmZSxkdXJhdGlvbjplLGVhc2luZzpuJiZ0fHx0JiYhdi5pc0Z1bmN0aW9uKHQpJiZ0fTtyLmR1cmF0aW9uPXYuZngub2ZmPzA6dHlwZW9mIHIuZHVyYXRpb249PSJudW1iZXIiP3IuZHVyYXRpb246ci5kdXJhdGlvbiBpbiB2LmZ4LnNwZWVkcz92LmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTp2LmZ4LnNwZWVkcy5fZGVmYXVsdDtpZihyLnF1ZXVlPT1udWxsfHxyLnF1ZXVlPT09ITApci5xdWV1ZT0iZngiO3JldHVybiByLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXt2LmlzRnVuY3Rpb24oci5vbGQpJiZyLm9sZC5jYWxsKHRoaXMpLHIucXVldWUmJnYuZGVxdWV1ZSh0aGlzLHIucXVldWUpfSxyfSx2LmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxzd2luZzpmdW5jdGlvbihlKXtyZXR1cm4uNS1NYXRoLmNvcyhlKk1hdGguUEkpLzJ9fSx2LnRpbWVycz1bXSx2LmZ4PVluLnByb3RvdHlwZS5pbml0LHYuZngudGljaz1mdW5jdGlvbigpe3ZhciBlLG49di50aW1lcnMscj0wO3FuPXYubm93KCk7Zm9yKDtyPG4ubGVuZ3RoO3IrKyllPW5bcl0sIWUoKSYmbltyXT09PWUmJm4uc3BsaWNlKHItLSwxKTtuLmxlbmd0aHx8di5meC5zdG9wKCkscW49dH0sdi5meC50aW1lcj1mdW5jdGlvbihlKXtlKCkmJnYudGltZXJzLnB1c2goZSkmJiFSbiYmKFJuPXNldEludGVydmFsKHYuZngudGljayx2LmZ4LmludGVydmFsKSl9LHYuZnguaW50ZXJ2YWw9MTMsdi5meC5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChSbiksUm49bnVsbH0sdi5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sdi5meC5zdGVwPXt9LHYuZXhwciYmdi5leHByLmZpbHRlcnMmJih2LmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gdi5ncmVwKHYudGltZXJzLGZ1bmN0aW9uKHQpe3JldHVybiBlPT09dC5lbGVtfSkubGVuZ3RofSk7dmFyIGVyPS9eKD86Ym9keXxodG1sKSQvaTt2LmZuLm9mZnNldD1mdW5jdGlvbihlKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXt2Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7dmFyIG4scixpLHMsbyx1LGEsZj17dG9wOjAsbGVmdDowfSxsPXRoaXNbMF0sYz1sJiZsLm93bmVyRG9jdW1lbnQ7aWYoIWMpcmV0dXJuO3JldHVybihyPWMuYm9keSk9PT1sP3Yub2Zmc2V0LmJvZHlPZmZzZXQobCk6KG49Yy5kb2N1bWVudEVsZW1lbnQsdi5jb250YWlucyhuLGwpPyh0eXBlb2YgbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QhPSJ1bmRlZmluZWQiJiYoZj1sLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxpPXRyKGMpLHM9bi5jbGllbnRUb3B8fHIuY2xpZW50VG9wfHwwLG89bi5jbGllbnRMZWZ0fHxyLmNsaWVudExlZnR8fDAsdT1pLnBhZ2VZT2Zmc2V0fHxuLnNjcm9sbFRvcCxhPWkucGFnZVhPZmZzZXR8fG4uc2Nyb2xsTGVmdCx7dG9wOmYudG9wK3UtcyxsZWZ0OmYubGVmdCthLW99KTpmKX0sdi5vZmZzZXQ9e2JvZHlPZmZzZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vZmZzZXRUb3Asbj1lLm9mZnNldExlZnQ7cmV0dXJuIHYuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCYmKHQrPXBhcnNlRmxvYXQodi5jc3MoZSwibWFyZ2luVG9wIikpfHwwLG4rPXBhcnNlRmxvYXQodi5jc3MoZSwibWFyZ2luTGVmdCIpKXx8MCkse3RvcDp0LGxlZnQ6bn19LHNldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHI9di5jc3MoZSwicG9zaXRpb24iKTtyPT09InN0YXRpYyImJihlLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBpPXYoZSkscz1pLm9mZnNldCgpLG89di5jc3MoZSwidG9wIiksdT12LmNzcyhlLCJsZWZ0IiksYT0ocj09PSJhYnNvbHV0ZSJ8fHI9PT0iZml4ZWQiKSYmdi5pbkFycmF5KCJhdXRvIixbbyx1XSk+LTEsZj17fSxsPXt9LGMsaDthPyhsPWkucG9zaXRpb24oKSxjPWwudG9wLGg9bC5sZWZ0KTooYz1wYXJzZUZsb2F0KG8pfHwwLGg9cGFyc2VGbG9hdCh1KXx8MCksdi5pc0Z1bmN0aW9uKHQpJiYodD10LmNhbGwoZSxuLHMpKSx0LnRvcCE9bnVsbCYmKGYudG9wPXQudG9wLXMudG9wK2MpLHQubGVmdCE9bnVsbCYmKGYubGVmdD10LmxlZnQtcy5sZWZ0K2gpLCJ1c2luZyJpbiB0P3QudXNpbmcuY2FsbChlLGYpOmkuY3NzKGYpfX0sdi5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuO3ZhciBlPXRoaXNbMF0sdD10aGlzLm9mZnNldFBhcmVudCgpLG49dGhpcy5vZmZzZXQoKSxyPWVyLnRlc3QodFswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06dC5vZmZzZXQoKTtyZXR1cm4gbi50b3AtPXBhcnNlRmxvYXQodi5jc3MoZSwibWFyZ2luVG9wIikpfHwwLG4ubGVmdC09cGFyc2VGbG9hdCh2LmNzcyhlLCJtYXJnaW5MZWZ0IikpfHwwLHIudG9wKz1wYXJzZUZsb2F0KHYuY3NzKHRbMF0sImJvcmRlclRvcFdpZHRoIikpfHwwLHIubGVmdCs9cGFyc2VGbG9hdCh2LmNzcyh0WzBdLCJib3JkZXJMZWZ0V2lkdGgiKSl8fDAse3RvcDpuLnRvcC1yLnRvcCxsZWZ0Om4ubGVmdC1yLmxlZnR9fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9mZnNldFBhcmVudHx8aS5ib2R5O3doaWxlKGUmJiFlci50ZXN0KGUubm9kZU5hbWUpJiZ2LmNzcyhlLCJwb3NpdGlvbiIpPT09InN0YXRpYyIpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8aS5ib2R5fSl9fSksdi5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGUsbil7dmFyIHI9L1kvLnRlc3Qobik7di5mbltlXT1mdW5jdGlvbihpKXtyZXR1cm4gdi5hY2Nlc3ModGhpcyxmdW5jdGlvbihlLGkscyl7dmFyIG89dHIoZSk7aWYocz09PXQpcmV0dXJuIG8/biBpbiBvP29bbl06by5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbaV06ZVtpXTtvP28uc2Nyb2xsVG8ocj92KG8pLnNjcm9sbExlZnQoKTpzLHI/czp2KG8pLnNjcm9sbFRvcCgpKTplW2ldPXN9LGUsaSxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLHYuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGUsbil7di5lYWNoKHtwYWRkaW5nOiJpbm5lciIrZSxjb250ZW50Om4sIiI6Im91dGVyIitlfSxmdW5jdGlvbihyLGkpe3YuZm5baV09ZnVuY3Rpb24oaSxzKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoJiYocnx8dHlwZW9mIGkhPSJib29sZWFuIiksdT1yfHwoaT09PSEwfHxzPT09ITA/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiB2LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKG4scixpKXt2YXIgcztyZXR1cm4gdi5pc1dpbmRvdyhuKT9uLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitlXTpuLm5vZGVUeXBlPT09OT8ocz1uLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChuLmJvZHlbInNjcm9sbCIrZV0sc1sic2Nyb2xsIitlXSxuLmJvZHlbIm9mZnNldCIrZV0sc1sib2Zmc2V0IitlXSxzWyJjbGllbnQiK2VdKSk6aT09PXQ/di5jc3MobixyLGksdSk6di5zdHlsZShuLHIsaSx1KX0sbixvP2k6dCxvLG51bGwpfX0pfSksZS5qUXVlcnk9ZS4kPXYsdHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZCYmZGVmaW5lLmFtZC5qUXVlcnkmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiB2fSl9KSh3aW5kb3cpOw==]]></data>
	</file>
	<file>
	  <filename>/lib/jquerytools.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/jquerytools.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2NzcyddID0gJ0pRdWVyeVRvb2xzLmNzcyc7CiRpbmZvWydkZXBlbmRzJ10gPSAndGFibGVzb3J0ZXInOwokaW5mb1snc29ydGluZyddID0gOTk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/jquerytools.lib/JQueryTools.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHRhYmxlc29ydGVyICoqKioqKioqKioqKioqKiovCgp0YWJsZS50YWJsZXNvcnRlciB0aGVhZCB0ciAuaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1ncy9iZy5naWYpOwogICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGxlZnQ7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwp9Cgp0YWJsZS50YWJsZXNvcnRlciB0aGVhZCB0ciAuaGVhZGVyU29ydFVwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNzc3OwovKiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltZ3MvYXNjLmdpZik7ICovCn0KCnRhYmxlLnRhYmxlc29ydGVyIHRoZWFkIHRyIC5oZWFkZXJTb3J0RG93biB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzc3NzsKLyogIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWdzL2Rlc2MuZ2lmKTsgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIG5leHQgY3NzIHRvb2wgKioqKioqKioqKioqKioqKi8=]]></data>
	</file>
	<file>
	  <filename>/lib/json.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/json.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSAnanF1ZXJ5Lmpzb24tMi40Lm1pbi5qcyc7CiRpbmZvWydkZXBlbmRzJ10gPSAnanF1ZXJ5JzsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/json.lib/jquery.json-2.4.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSBKU09OIHBsdWdpbiAyLjQuMCB8IGNvZGUuZ29vZ2xlLmNvbS9wL2pxdWVyeS1qc29uICovCihmdW5jdGlvbigkKXsndXNlIHN0cmljdCc7dmFyIGVzY2FwZT0vWyJcXFx4MDAtXHgxZlx4N2YtXHg5Zl0vZyxtZXRhPXsnXGInOidcXGInLCdcdCc6J1xcdCcsJ1xuJzonXFxuJywnXGYnOidcXGYnLCdccic6J1xccicsJyInOidcXCInLCdcXCc6J1xcXFwnfSxoYXNPd249T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTskLnRvSlNPTj10eXBlb2YgSlNPTj09PSdvYmplY3QnJiZKU09OLnN0cmluZ2lmeT9KU09OLnN0cmluZ2lmeTpmdW5jdGlvbihvKXtpZihvPT09bnVsbCl7cmV0dXJuJ251bGwnO30KdmFyIHBhaXJzLGssbmFtZSx2YWwsdHlwZT0kLnR5cGUobyk7aWYodHlwZT09PSd1bmRlZmluZWQnKXtyZXR1cm4gdW5kZWZpbmVkO30KaWYodHlwZT09PSdudW1iZXInfHx0eXBlPT09J2Jvb2xlYW4nKXtyZXR1cm4gU3RyaW5nKG8pO30KaWYodHlwZT09PSdzdHJpbmcnKXtyZXR1cm4gJC5xdW90ZVN0cmluZyhvKTt9CmlmKHR5cGVvZiBvLnRvSlNPTj09PSdmdW5jdGlvbicpe3JldHVybiAkLnRvSlNPTihvLnRvSlNPTigpKTt9CmlmKHR5cGU9PT0nZGF0ZScpe3ZhciBtb250aD1vLmdldFVUQ01vbnRoKCkrMSxkYXk9by5nZXRVVENEYXRlKCkseWVhcj1vLmdldFVUQ0Z1bGxZZWFyKCksaG91cnM9by5nZXRVVENIb3VycygpLG1pbnV0ZXM9by5nZXRVVENNaW51dGVzKCksc2Vjb25kcz1vLmdldFVUQ1NlY29uZHMoKSxtaWxsaT1vLmdldFVUQ01pbGxpc2Vjb25kcygpO2lmKG1vbnRoPDEwKXttb250aD0nMCcrbW9udGg7fQppZihkYXk8MTApe2RheT0nMCcrZGF5O30KaWYoaG91cnM8MTApe2hvdXJzPScwJytob3Vyczt9CmlmKG1pbnV0ZXM8MTApe21pbnV0ZXM9JzAnK21pbnV0ZXM7fQppZihzZWNvbmRzPDEwKXtzZWNvbmRzPScwJytzZWNvbmRzO30KaWYobWlsbGk8MTAwKXttaWxsaT0nMCcrbWlsbGk7fQppZihtaWxsaTwxMCl7bWlsbGk9JzAnK21pbGxpO30KcmV0dXJuJyInK3llYXIrJy0nK21vbnRoKyctJytkYXkrJ1QnKwpob3VycysnOicrbWludXRlcysnOicrc2Vjb25kcysnLicrbWlsbGkrJ1oiJzt9CnBhaXJzPVtdO2lmKCQuaXNBcnJheShvKSl7Zm9yKGs9MDtrPG8ubGVuZ3RoO2srKyl7cGFpcnMucHVzaCgkLnRvSlNPTihvW2tdKXx8J251bGwnKTt9CnJldHVybidbJytwYWlycy5qb2luKCcsJykrJ10nO30KaWYodHlwZW9mIG89PT0nb2JqZWN0Jyl7Zm9yKGsgaW4gbyl7aWYoaGFzT3duLmNhbGwobyxrKSl7dHlwZT10eXBlb2YgaztpZih0eXBlPT09J251bWJlcicpe25hbWU9JyInK2srJyInO31lbHNlIGlmKHR5cGU9PT0nc3RyaW5nJyl7bmFtZT0kLnF1b3RlU3RyaW5nKGspO31lbHNle2NvbnRpbnVlO30KdHlwZT10eXBlb2Ygb1trXTtpZih0eXBlIT09J2Z1bmN0aW9uJyYmdHlwZSE9PSd1bmRlZmluZWQnKXt2YWw9JC50b0pTT04ob1trXSk7cGFpcnMucHVzaChuYW1lKyc6Jyt2YWwpO319fQpyZXR1cm4neycrcGFpcnMuam9pbignLCcpKyd9Jzt9fTskLmV2YWxKU09OPXR5cGVvZiBKU09OPT09J29iamVjdCcmJkpTT04ucGFyc2U/SlNPTi5wYXJzZTpmdW5jdGlvbihzdHIpe3JldHVybiBldmFsKCcoJytzdHIrJyknKTt9OyQuc2VjdXJlRXZhbEpTT049dHlwZW9mIEpTT049PT0nb2JqZWN0JyYmSlNPTi5wYXJzZT9KU09OLnBhcnNlOmZ1bmN0aW9uKHN0cil7dmFyIGZpbHRlcmVkPXN0ci5yZXBsYWNlKC9cXFsiXFxcL2JmbnJ0dV0vZywnQCcpLnJlcGxhY2UoLyJbXiJcXFxuXHJdKiJ8dHJ1ZXxmYWxzZXxudWxsfC0/XGQrKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPy9nLCddJykucmVwbGFjZSgvKD86Xnw6fCwpKD86XHMqXFspKy9nLCcnKTtpZigvXltcXSw6e31cc10qJC8udGVzdChmaWx0ZXJlZCkpe3JldHVybiBldmFsKCcoJytzdHIrJyknKTt9CnRocm93IG5ldyBTeW50YXhFcnJvcignRXJyb3IgcGFyc2luZyBKU09OLCBzb3VyY2UgaXMgbm90IHZhbGlkLicpO307JC5xdW90ZVN0cmluZz1mdW5jdGlvbihzdHIpe2lmKHN0ci5tYXRjaChlc2NhcGUpKXtyZXR1cm4nIicrc3RyLnJlcGxhY2UoZXNjYXBlLGZ1bmN0aW9uKGEpe3ZhciBjPW1ldGFbYV07aWYodHlwZW9mIGM9PT0nc3RyaW5nJyl7cmV0dXJuIGM7fQpjPWEuY2hhckNvZGVBdCgpO3JldHVybidcXHUwMCcrTWF0aC5mbG9vcihjLzE2KS50b1N0cmluZygxNikrKGMlMTYpLnRvU3RyaW5nKDE2KTt9KSsnIic7fQpyZXR1cm4nIicrc3RyKyciJzt9O30oalF1ZXJ5KSk7]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/css/jquery.lightbox-0.5.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBqUXVlcnkgbGlnaHRCb3ggcGx1Z2luDQogKiBUaGlzIGpRdWVyeSBwbHVnaW4gd2FzIGluc3BpcmVkIGFuZCBiYXNlZCBvbiBMaWdodGJveCAyIGJ5IExva2VzaCBEaGFrYXIgKGh0dHA6Ly93d3cuaHVkZGxldG9nZXRoZXIuY29tL3Byb2plY3RzL2xpZ2h0Ym94Mi8pDQogKiBhbmQgYWRhcHRlZCB0byBtZSBmb3IgdXNlIGxpa2UgYSBwbHVnaW4gZnJvbSBqUXVlcnkuDQogKiBAbmFtZSBqcXVlcnktbGlnaHRib3gtMC41LmNzcw0KICogQGF1dGhvciBMZWFuZHJvIFZpZWlyYSBQaW5obyAtIGh0dHA6Ly9sZWFuZHJvdmllaXJhLmNvbQ0KICogQHZlcnNpb24gMC41DQogKiBAZGF0ZSBBcHJpbCAxMSwgMjAwOA0KICogQGNhdGVnb3J5IGpRdWVyeSBwbHVnaW4NCiAqIEBjb3B5cmlnaHQgKGMpIDIwMDggTGVhbmRybyBWaWVpcmEgUGluaG8gKGxlYW5kcm92aWVpcmEuY29tKQ0KICogQGxpY2Vuc2UgQ0NBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDIuNSBCcmF6aWwgLSBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8yLjUvYnIvZGVlZC5lbl9VUw0KICogQGV4YW1wbGUgVmlzaXQgaHR0cDovL2xlYW5kcm92aWVpcmEuY29tL3Byb2plY3RzL2pxdWVyeS9saWdodGJveC8gZm9yIG1vcmUgaW5mb3JtYXRpb25zIGFib3V0IHRoaXMgalF1ZXJ5IHBsdWdpbg0KICovDQojanF1ZXJ5LW92ZXJsYXkgew0KCXBvc2l0aW9uOiBhYnNvbHV0ZTsNCgl0b3A6IDA7DQoJbGVmdDogMDsNCgl6LWluZGV4OiA5MDsNCgl3aWR0aDogMTAwJTsNCgloZWlnaHQ6IDUwMHB4Ow0KfQ0KI2pxdWVyeS1saWdodGJveCB7DQoJcG9zaXRpb246IGFic29sdXRlOw0KCXRvcDogMDsNCglsZWZ0OiAwOw0KCXdpZHRoOiAxMDAlOw0KCXotaW5kZXg6IDEwMDsNCgl0ZXh0LWFsaWduOiBjZW50ZXI7DQoJbGluZS1oZWlnaHQ6IDA7DQp9DQojanF1ZXJ5LWxpZ2h0Ym94IGEgaW1nIHsgYm9yZGVyOiBub25lOyB9DQojbGlnaHRib3gtY29udGFpbmVyLWltYWdlLWJveCB7DQoJcG9zaXRpb246IHJlbGF0aXZlOw0KCWJhY2tncm91bmQtY29sb3I6ICNmZmY7DQoJd2lkdGg6IDI1MHB4Ow0KCWhlaWdodDogMjUwcHg7DQoJbWFyZ2luOiAwIGF1dG87DQp9DQojbGlnaHRib3gtY29udGFpbmVyLWltYWdlIHsgcGFkZGluZzogMTBweDsgfQ0KI2xpZ2h0Ym94LWxvYWRpbmcgew0KCXBvc2l0aW9uOiBhYnNvbHV0ZTsNCgl0b3A6IDQwJTsNCglsZWZ0OiAwJTsNCgloZWlnaHQ6IDI1JTsNCgl3aWR0aDogMTAwJTsNCgl0ZXh0LWFsaWduOiBjZW50ZXI7DQoJbGluZS1oZWlnaHQ6IDA7DQp9DQojbGlnaHRib3gtbmF2IHsNCglwb3NpdGlvbjogYWJzb2x1dGU7DQoJdG9wOiAwOw0KCWxlZnQ6IDA7DQoJaGVpZ2h0OiAxMDAlOw0KCXdpZHRoOiAxMDAlOw0KCXotaW5kZXg6IDEwOw0KfQ0KI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3ggPiAjbGlnaHRib3gtbmF2IHsgbGVmdDogMDsgfQ0KI2xpZ2h0Ym94LW5hdiBhIHsgb3V0bGluZTogbm9uZTt9DQojbGlnaHRib3gtbmF2LWJ0blByZXYsICNsaWdodGJveC1uYXYtYnRuTmV4dCB7DQoJd2lkdGg6IDQ5JTsNCgloZWlnaHQ6IDEwMCU7DQoJem9vbTogMTsNCglkaXNwbGF5OiBibG9jazsNCn0NCiNsaWdodGJveC1uYXYtYnRuUHJldiB7IA0KCWxlZnQ6IDA7IA0KCWZsb2F0OiBsZWZ0Ow0KfQ0KI2xpZ2h0Ym94LW5hdi1idG5OZXh0IHsgDQoJcmlnaHQ6IDA7IA0KCWZsb2F0OiByaWdodDsNCn0NCiNsaWdodGJveC1jb250YWluZXItaW1hZ2UtZGF0YS1ib3ggew0KCWZvbnQ6IDEwcHggVmVyZGFuYSwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KCWJhY2tncm91bmQtY29sb3I6ICNmZmY7DQoJbWFyZ2luOiAwIGF1dG87DQoJbGluZS1oZWlnaHQ6IDEuNGVtOw0KCW92ZXJmbG93OiBhdXRvOw0KCXdpZHRoOiAxMDAlOw0KCXBhZGRpbmc6IDAgMTBweCAwOw0KfQ0KI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhIHsNCglwYWRkaW5nOiAwIDEwcHg7IA0KCWNvbG9yOiAjNjY2OyANCn0NCiNsaWdodGJveC1jb250YWluZXItaW1hZ2UtZGF0YSAjbGlnaHRib3gtaW1hZ2UtZGV0YWlscyB7IA0KCXdpZHRoOiA3MCU7IA0KCWZsb2F0OiBsZWZ0OyANCgl0ZXh0LWFsaWduOiBsZWZ0OyANCn0JDQojbGlnaHRib3gtaW1hZ2UtZGV0YWlscy1jYXB0aW9uIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiNsaWdodGJveC1pbWFnZS1kZXRhaWxzLWN1cnJlbnROdW1iZXIgew0KCWRpc3BsYXk6IGJsb2NrOyANCgljbGVhcjogbGVmdDsgDQoJcGFkZGluZy1ib3R0b206IDEuMGVtOwkNCn0JCQkNCiNsaWdodGJveC1zZWNOYXYtYnRuQ2xvc2Ugew0KCXdpZHRoOiA2NnB4OyANCglmbG9hdDogcmlnaHQ7DQoJcGFkZGluZy1ib3R0b206IDAuN2VtOwkNCn0=]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/images/lightbox-blank.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/images/lightbox-btn-close.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhQgAWANUAAP////39/fr6+vj4+PX19fDw8Ovr6+np6ebm5uTk5N/f39zc3Nra2tfX19XV1dLS0svLy8jIyL6+vre3t7S0tLKysq+vr6ioqKOjo56enpubm5aWlpGRkY+Pj4yMjIeHh4KCgoCAgH19fXZ2dnNzc3FxcW5ubmlpaWdnZ2RkZGJiYl9fX11dXVpaWlVVVVNTU1BQUE5OTktLS0lJSUZGRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAHAP8ALAAAAABCABYAAAb/QIBwSCwaj8ikcslsOp/QqLQZmFqvRAHngYxsBEaCw3EYHhwE5IFykZSLZ7RQPK4PBxzaimGEtGgcaXMZL4UvH0IXLw5HEoaFF0MEIo8RAA6PhUMWNC8xKw1EES0xLzQYQ5QfY2yJi0YRh2UKlBRCHC8XDhEZZZgcdYxCBiQzLzIqC0KjpTMhBUIULxlHisJEKCiCAAQoLEIvJEaYkUcGIzKeKAt+pTQgA0Pe20TWRQrTRYSMLyjjuUnOGYOBgtQxENsOHEJij4g0S6IA4gpEBJOICxjfEDmXDgaMYx/iDSHH8FU9kyMBTnrBguKlTNeIFCjx0ZMGMBUBVkPpKubL2XKXKLFQ8HNJgRM1Y3Qwgo9DSZ+ObBFxJKGIIxFFkywwUcrjMQ1ViLDwt9OnQkREcGkcQuJF1iMLUKSLkWLFRxlgTwK91NMIJaJC8GE14u1tkQUr0skgkSCCV7xhubUF5gCXJUUcMGJkpIAFCwkOKHgGnCHDmA/5LGoGyiCxCxkjDAiZ8DjvHEqFWFADoChTOQcoDKEADAC1od2YMglhwEIxCdlDKsjwSKMCnDFQFJAxEqdJgQ4yZjw3UiGGjBN8sKjP4mH8EQsnEKyfP0QAvSIB5NPfz7+/+iAAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/images/lightbox-btn-next.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhPwAgAOYAAP////39/fv7+/n5+ff39/X19fPz8/Hx8e/v7+3t7evr6+np6efn5+bm5uTk5OLi4uDg4N7e3tzc3NjY2NbW1tLS0tDQ0M7OzsrKysjIyMbGxsLCwsDAwLy8vLq6ura2trS0tLOzs7Gxsa+vr62traurq6mpqaenp6WlpaOjo52dnZubm5mZmZGRkY+Pj42NjYuLi4eHh4WFhYODg4GBgYCAgH5+fnp6enh4eHZ2dnR0dHBwcG5ubmxsbGpqamhoaGZmZmRkZGJiYmBgYF5eXlxcXFpaWlhYWFZWVlRUVFJSUlBQUE5OTk1NTUtLS0lJSUdHR0VFRUNDQ////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAFMALAAAAAA/ACAAAAf/gFNTAISFhoeIiYqLjIiDjZCRkpOUlZaXmJmam5ydnp+goaKjpKWmp6igARomF4UCHCIABiAlJrcnDxQoroQKJRsOKSYlIyUnIASeAS5PQxGEAzZFAAxCSUFCQkUXDD1GEADMTRgWSEJGSkNDOAfLLUlMMsoDNUQAC0UzCQz9yhhNYATIwGRFgAENFqh4UmHBggDLXPx4wQQEAAE07i0w8iIRCyUhdvBAYKgElAWhmPlogOOIAwAZ8Q3hUQJFChIFCBG4scRIhUMmoDRIKZHAhCTzYi4IYkSHyBruxM14UiScoaBDVUk8ECBFkxIxhuArIgNBAgUKIAIQoeSEkBtRiQlhJfqDZIEeRYIAwWekBaIIR2oA+PDkxFWhdEkCMLfkBz4iOTpI9vBgAA0kEgAMuJFkQqG5qlrsiJtCSQ98QJpAWS3lhAgnhglRODJabpSsoAgQUCtOt7gDCMwmSFDgQFpDBxYIIFRAwfJU0CkFEBCgunXr0TXxzs69u/fv4MOLdzRekqDykAIBADs=]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/images/lightbox-btn-prev.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhPwAgAOYAAP////39/fv7+/n5+fj4+Pb29vT09PLy8vDw8O7u7urq6unp6efn5+Xl5ePj4+Hh4d/f393d3dvb29ra2tjY2NbW1tTU1NDQ0M7OzszMzMvLy8nJycfHx8XFxcPDw8HBwb+/v729vby8vLq6uri4uLa2trKysq6urq2traurq6mpqaenp6Ojo6GhoZ+fn56enpycnJqampiYmJSUlJCQkI+Pj42NjYWFhYODg4GBgYCAgHx8fHp6enh4eHZ2dnR0dHJycnFxcW9vb21tbWtra2lpaWVlZWNjY2JiYmBgYF5eXlxcXFpaWlhYWFZWVlRUVFNTU1FRUU9PT01NTUtLS0lJSUdHR0JCQkBAQP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAFkALAAAAAA/ACAAAAf/gACCg4SFhoeIiYqGWVmLj5CRj46SlZaXmJmam5ydnp+goaKjpKWmp6ipmwMYICAfFQSCE64hGQuCBx4fvLwMGhwBgwMbG6IFOVFJyzsQAC1QSkpIRikAEUtOS0xMShc1URKDE0o2xzpCBQclVDYCLUsSAxFBTRQOUjQQFPwBH1MuBqmoguEcEAEAAjDxYYCFkgaCVkT5wGDKikIIiAwpAKCAjyDCQhXQEQRBgRJWbARgsUTEhBBHkkBw8ARHiBEkPCCM8UQDAAtVRIwqgCOKkiVJekwAwAKKkSVPgHQAIGGJkiJGjuAYAGDCFBkAZCRhMDSHEQ8dKMh6tkQDCiojnQRJiDLDAYQIDkLuEALhyAyE534YcpFEgQAfSA5QnWLNEIcpN5IUHKoDCFdCLpQ4ACCCyotrUWhUGG0hgaAEQ6rwCHmMB5HLg2A8cWagR5UND55YucIbiwlBAWBcOVEqwIIGrAUpkLBWQYUFAyRMmD4dwaADFDiq2n6JwIABAsIL+E4gOfdEAgKoX7/+vPv38OPLn0+//iVK9hU1CgQAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/images/lightbox-ico-loading.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhIAAgAOYAAP////39/fr6+vj4+PX19fPz8/Dw8O7u7uvr6+np6ebm5uTk5OHh4d/f39zc3Nra2tfX19XV1dLS0s3NzcvLy8jIyMbGxsPDw8HBwb6+vry8vLm5ube3t7S0tLKysq+vr62traqqqqioqKWlpZ6enpaWlpSUlJGRkY+Pj4yMjIqKioeHh4WFhYKCgoCAgH19fXt7e3h4eHZ2dnNzc3FxcWxsbGlpaWJiYl9fX1paWlhYWFVVVU5OTktLS0REREFBQT8/Pzw8PDc3NzIyMjAwMC0tLSsrKygoKCYmJiMjIyEhIR4eHhwcHBkZGRcXFxISEg8PDw0NDQoKCggICAUFBf4BAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgBVACwAAAAAIAAgAAAH/4AAgoOEhYaHiImKi4yNjQGGBAgCjoYIEhcRCIMCGywSlYQPKzxAPCsQkAQnPxuhgggwSlS0STAIAQEQHJuECA0EiZ1BtMVCG5AAub4uOR/BhwQkR8W1JNCGEkJQNQeIBCNF1VRHIZSHCM3PiAESPFHVPBTJ6A/YhwciPk1PTD4jBV4VClDgAYgVMlJo8CZwEAELKmSo2MDgwDlHyzht6NEEir8KryCQIMFgEIMa42bcW4TgxZIkKRhK8DHOR69GDHLQqtErAo9xPG4yKlACiA8RAQEcWLGkGJMTFxsdoECBoTIINYQkESKjZMOBDDaE2ADB4tdoFUic4EUvUUZ2FpV2IFkSxIRQQwEokLiQFJ0MJ8V+YHC7AQgTIdcQNdghpdgREckIFMB2QAYUWjYcIEJQ4zKtIBoACJiA4kWIXgVWOJkCxcbdQQE2NmlChAUDXTmcQCFCwlu7HEBydIhaiIAnGCQaBACHpFiOB4ICPMgQYaUhAQgQQAOXhBaU54TahpKQezeJvmdFX2Axg2T6QgIOaHcUCAAh+QQFCgBVACwAAAAAHwAgAAAH/4BVgoOEhAgODgiFi4yMBBYvOzsuFQSNl4sXOU1UVE05FpiiVQguS52dSy+Ko4USCAIQOVOonTkQrYQ7PDEZFDm1VFC3uQyETTsfL6eoTKuDCAG5VUsqVTtOnU86GIQvDACNI4syCBMtPDwsEpakNjYQ4YweQoRKJ5YECAjtgrEQAuQtYjCDUxUnPCwIZASg4SUCFV7w6FFjQ4GF06oUiICBAgQJrwhgnFbgQw4fO0jAGpkRQw8onYSEkDbtURUJAQmYYFYFigyR0xrkOFIDAQACJ3j6BJrrgQ0kMsBVydCzShQhIAKwvHSBBE55H3CgVLn1EgCtAjdikHDAYcZGAJEEBBBQoN9bRgc2oLhpt5G+voU++BBkYwLNRghIyBCBqcagJCUAE/JABAqQDFttDFqCogChgIMCiEhSZUgHlgVOFDnoYwPoCCNGRAANoMGMHi6kMkJw4t2HtoSTKLHhQB4ABK/KBijAYGWVAByICCLC4XBDt2bdAsAQRFAQDNbvCuI98YRR8YvMTTiPftH1VoEAACH5BAUKAFUALAAAAAAeAB8AAAf/gFWCg4SEAAABAIWLjIuICBMXEASKjZaEARAuPkA5IgiXoQAML0qCUD8gBIIEBauWBAxVsgIaP4RNMAwFFCQnIRCNBR81OjUcCCBDhTZVITpFSUI1FQOFtT5QUFU8Gxk9iyM9UFTlTDUOhQcrTYQnECtJgz0fKknl+D4bhggvToNNVFRBQCJHFRgXELhogq+cEBCFCIRYJijIhwBVMA4iUOIevig/NBQCgGCFDyI9TshidGHHE3xJYDQYSQBBBhAYEGhcNCwHkSNCZlB4VeVQq0QBEl0iEOHDCA4rBQEoIGHEiAgCQhEiQHSQgAw6jiDJYUHryAAErAFY165KkxZmmA09KPGhKAIZ2wTViDsIQMuNJIbkJcFXKoINQ+2eMDircKMACB445ntocqNDBQ4oFVX5sQQULjR0ZURSwoKdhhrYaOJEXygCJ4DMiGrIgpBBJUIhqOGkxwTSEHQ4gWKxbyxQXj/YKIF8EYG6OUisnCrCxgsJWxEU0ArhQF8I4JKc2G65bwQeUMSTL1/0wAjr2Nn3LSBr9KJAACH5BAUKAFUALAAAAQAgAB4AAAf/gFWCg4SFVR0ZDIaLjIUEIzpCPy4SjZaFARQ8UFVURioIggCjl1UABAYEowQgRoNQNhACCBMWEKqNAAwgKiOyBB9FhhIrPD42IAgAjAgrQk1ELw0BDzdOVVBCJBUxSYJQPR0EiwATPoNAG6cZNT48JA8cQIRNL6GGABXzgkIeowEIGjAgIAAEEUKwHpBDUCMJlCQ2KokiBSCDD06CkrC4ZyhAhRU5XGQYt4hBi4NVnOzYQBIfQAgIWhoSAOFEDh41fMXEt6yUqAIQLnw44ULFB0WiDAiUWSqAhRpEmCT5geIegxM6coA44FMQAhlMqIilImREFQEdgqTkIaFnKQlAsMaKdVKjCgESR/hpcHtJAhG5VKDgqBLgwo4lSWpA6FoFQo8ocusN4rDiBAWmlgicICJlLg8MgwggOBCAsaAHKXwQEWLjA1fTzIR2kFCAEUXYlgAgiKCg9CUAAnznauDCRw2JuSCgYGkpwIchVYyQ+L3Bx4rXjAJo6NFkEYLahHZREJAbAQgZIzgK+EiCo6ngpU7tHHRgRZIeF4TjdkQCSES++w2iywYVgBcgPsEByEggACH5BAUKAFUALAAAAAAgAB8AAAf/gFWCg4SFhoeIiYMUEASKj4YcNj01HAWQmBE5TlVONhMBmIehVQEaQoM/HAJVBA0TmBAjJBSOARU9UFVQPBcCBxs1PJANMURINhahCCY/Rj4kCAQYOk2dPooYg0QkjgAIGyQZCAAFJkiDSiyKuVVCId5VAAEA9QcnSYNMLwyJJDs9VjQgZYgABx+6oAQZcQkRAgoXGNBD9I0EDyE9UgxUFIAeAEUCEFTwwEECgwIERR2aB04QCQmOBs2bqJIAiB35itSQQIoABRIeyKlskEOXoCQqEAiCUMPIwpiYLBAhBCVHg1IWsDFZoVQUBVSDoNhwIOjBCyA8OkCFxMCGNUFGqFA0FNBAQ4UDH1VuwDHkSJAXEQgGEJAS0gEIFkCUMAECgoC8KgcRkHDCxo4aJCCghBx5aYwiVKg48TGiK6IGFRQRICFkSmjRNiRAQmG60IEWTV6HDuIhkQQdS2o04DwIgYvcuoF0SIRgxAxLnFG2IjFEd5McsCgSkEb85UcIL4g8gdKkR2lF9Tiv3vGBVITKOWqEqK2yQmbICCBEONl5kAACNPUnoCGBAAAh+QQFCgBVACwCAAEAHgAfAAAH/4BVgoOEggABBAMAhYyNjAAFFSMdDAKOl4wBFzlEPycMmI0Ai4MEJUlVUDoUhocBpKIBAqOCBCRIgjkSVYcMFRQIAaIHFx8QllUCEzRBPIYBEjM+PSwQwoUCGzpBLw+kBBAdFoYIKLhVQiMFjAUrS1U+GtePDDVQhAiMBCA9RDW7jgAgWIGqyhAS+Rp9IHGBACYCFmxUARIDYCMC60JVIWCRACyNmAKIJEBgFshLo8B9CFHhAK8ABRA4PMlLQMQhRHiQqBIAwQgWGWjyYvDi3SALBDDsQAID1EkAEnbcq0KFSAioNaqUSAgSAAQbU6cE4bAxQhWnT33+aOKkCIwGQrAJHSLwgIQNGykmzBQKQAADDSJAXKgigWvcABBU+CASZEbDgK9QIiAhZNCRF3AfIeAgYa+BCL8YDIhgwwmhHhgaCcDAQ0UCQQxM8BgSpMaGDFILBc0EAcWgyUKoCF+SY8QMJYQkOppXxYJU4cKRqACBI0mTuByAQBfuJEYVDClqvOhAM0OPKdubsJCJoIFhjRBmMIEuJQiIvXEJZMiRBIqTICtkFlcpFahgwwwjCHhJIAAh+QQFCgBVACwCAAEAHgAfAAAH/4BVgoOEhACHhYmKigIIDQgBi5KLESo1JAgAk5uDJEJNOxaRnJxFUD4Xo1UFDAwEkgAFCq+ELzklmYIIJDY1H5CKBx8tHAWEDBEIAoIBFzxOTDkUy4UAEjlJNRCTBCJHgkActIYMKz0oDJPNPExJNhOqhAIQG9uTAMIyL8WSAdSbAAi0IqCJlMEqiA7eE8jggCoAAQoqRDDChg0TDyIRgGAh10ECH344qSKkxAEADFLYyBCPEwIVTARBseGgCoIQKSS03HTAxLcqTGYgQFgAwTiDASrYIFJkBwhjCqsRsGDiBAePghhoEPFBwoF7AAQIIIDAaCEIK3wMEWLjw1dFAL8QTNjQMWIhBCiIQKFCpUmOC3ARiMgBhMeJBi0v7ODL+MgJSAYWGA24ocdIKEIwESLQAYgUxn1jQLiwIsclCAhK/KzSZEaDQhh4gKaixEUHbFCgDFlBgQQRQjBeE3rwIskUvqdIqEBCyAeIDUChOPmhiAAGG0OWHOlRAoOMJoSKkGDQwcaOHOMVFejN4kSHViyUEBIC4pWECxKGSipqlgAHH3tVoYQNEkgUVVwk6CAEEDVgcFRURFHwwQYNPKhIIAAh+QQFCgBVACwAAAIAIAAeAAAH/4BVgoOEhQEDAYWKi4yCBBIaDYmNlIoAEC87JQiVnYMAFDtHMAyFBwQAnYeTgggkLxwFhCArIAipjQINGgysVQgMsoVJPBuojQckOiDCjR9DVUIjx4wEGSkUBJURNT0yEr6LBQjalY8aEtSL5Z6DAgG4hQUQGh4Xpe2UBBgxPT87KR7kExSgQIF3gijYUEKFCpQiJzi1e0TihAZOrog03NiDQrtLMYok0WGMAQwmGxsO2dAuAAYfgoyYOIBgRZKUVIJkaCkhRxMoQaYR+NADykYnNQS2QyDCxg4VEBI1QAFkiRMkPDo06wQAAYULDdg1CLEixgoSGiIgEPAxALxCBMg4hYChw8YJCWwZCUDQYG0jAhVsJIHiZEiLBtUopKihIhsjBCduDvrRQRuAy6kCQIgxOEmNCOGqdH3RhFAREggQQJDgAJUADTAF+eDAjhACFZIFCREBYYRTGBkK7CtaBYoPDbUHEdjAo3QVzxlE+HDy3EYFAg1WCEkixMWD0KIRgLDRg4eMDRIKDSFxKgIJFyTSNQqAQMKGDBBUz3BehUiJA6kA41clAhSYSEZTFNcDbQOtE4ELP1TBAwkMxNNgIQ18MMIv4BUSCAA7]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSAnanF1ZXJ5LmxpZ2h0Ym94LTAuNS5taW4uanMnOwokaW5mb1snY3NzJ10gPSAnY3NzL2pxdWVyeS5saWdodGJveC0wLjUuY3NzJzsKJGluZm9bJ2RlcGVuZHMnXSA9ICdqcXVlcnknOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/jquery.lightbox-0.5.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBqUXVlcnkgbGlnaHRCb3ggcGx1Z2luDQogKiBUaGlzIGpRdWVyeSBwbHVnaW4gd2FzIGluc3BpcmVkIGFuZCBiYXNlZCBvbiBMaWdodGJveCAyIGJ5IExva2VzaCBEaGFrYXIgKGh0dHA6Ly93d3cuaHVkZGxldG9nZXRoZXIuY29tL3Byb2plY3RzL2xpZ2h0Ym94Mi8pDQogKiBhbmQgYWRhcHRlZCB0byBtZSBmb3IgdXNlIGxpa2UgYSBwbHVnaW4gZnJvbSBqUXVlcnkuDQogKiBAbmFtZSBqcXVlcnktbGlnaHRib3gtMC41LmpzDQogKiBAYXV0aG9yIExlYW5kcm8gVmllaXJhIFBpbmhvIC0gaHR0cDovL2xlYW5kcm92aWVpcmEuY29tDQogKiBAdmVyc2lvbiAwLjUNCiAqIEBkYXRlIEFwcmlsIDExLCAyMDA4DQogKiBAY2F0ZWdvcnkgalF1ZXJ5IHBsdWdpbg0KICogQGNvcHlyaWdodCAoYykgMjAwOCBMZWFuZHJvIFZpZWlyYSBQaW5obyAobGVhbmRyb3ZpZWlyYS5jb20pDQogKiBAbGljZW5zZSBDQ0F0dHJpYnV0aW9uLVNoYXJlQWxpa2UgMi41IEJyYXppbCAtIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzIuNS9ici9kZWVkLmVuX1VTDQogKiBAZXhhbXBsZSBWaXNpdCBodHRwOi8vbGVhbmRyb3ZpZWlyYS5jb20vcHJvamVjdHMvanF1ZXJ5L2xpZ2h0Ym94LyBmb3IgbW9yZSBpbmZvcm1hdGlvbnMgYWJvdXQgdGhpcyBqUXVlcnkgcGx1Z2luDQogKi8NCg0KLy8gT2ZmZXJpbmcgYSBDdXN0b20gQWxpYXMgc3Vwb3J0IC0gTW9yZSBpbmZvOiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1BsdWdpbnMvQXV0aG9yaW5nI0N1c3RvbV9BbGlhcw0KKGZ1bmN0aW9uKCQpIHsNCgkvKioNCgkgKiAkIGlzIGFuIGFsaWFzIHRvIGpRdWVyeSBvYmplY3QNCgkgKg0KCSAqLw0KCSQuZm4ubGlnaHRCb3ggPSBmdW5jdGlvbihzZXR0aW5ncykgew0KCQkvLyBTZXR0aW5ncyB0byBjb25maWd1cmUgdGhlIGpRdWVyeSBsaWdodEJveCBwbHVnaW4gaG93IHlvdSBsaWtlDQoJCXNldHRpbmdzID0galF1ZXJ5LmV4dGVuZCh7DQoJCQkvLyBDb25maWd1cmF0aW9uIHJlbGF0ZWQgdG8gb3ZlcmxheQ0KCQkJb3ZlcmxheUJnQ29sb3I6IAkJJyMwMDAnLAkJLy8gKHN0cmluZykgQmFja2dyb3VuZCBjb2xvciB0byBvdmVybGF5OyBpbmZvcm0gYSBoZXhhZGVjaW1hbCB2YWx1ZSBsaWtlOiAjUlJHR0JCLiBXaGVyZSBSUiwgR0csIGFuZCBCQiBhcmUgdGhlIGhleGFkZWNpbWFsIHZhbHVlcyBmb3IgdGhlIHJlZCwgZ3JlZW4sIGFuZCBibHVlIHZhbHVlcyBvZiB0aGUgY29sb3IuDQoJCQlvdmVybGF5T3BhY2l0eToJCQkwLjgsCQkvLyAoaW50ZWdlcikgT3BhY2l0eSB2YWx1ZSB0byBvdmVybGF5OyBpbmZvcm06IDAuWC4gV2hlcmUgWCBhcmUgbnVtYmVyIGZyb20gMCB0byA5DQoJCQkvLyBDb25maWd1cmF0aW9uIHJlbGF0ZWQgdG8gbmF2aWdhdGlvbg0KCQkJZml4ZWROYXZpZ2F0aW9uOgkJZmFsc2UsCQkvLyAoYm9vbGVhbikgQm9vbGVhbiB0aGF0IGluZm9ybXMgaWYgdGhlIG5hdmlnYXRpb24gKG5leHQgYW5kIHByZXYgYnV0dG9uKSB3aWxsIGJlIGZpeGVkIG9yIG5vdCBpbiB0aGUgaW50ZXJmYWNlLg0KCQkJLy8gQ29uZmlndXJhdGlvbiByZWxhdGVkIHRvIGltYWdlcw0KCQkJaW1hZ2VMb2FkaW5nOgkJCSdpbWFnZXMvbGlnaHRib3gtaWNvLWxvYWRpbmcuZ2lmJywJCS8vIChzdHJpbmcpIFBhdGggYW5kIHRoZSBuYW1lIG9mIHRoZSBsb2FkaW5nIGljb24NCgkJCWltYWdlQnRuUHJldjoJCQknaW1hZ2VzL2xpZ2h0Ym94LWJ0bi1wcmV2LmdpZicsCQkJLy8gKHN0cmluZykgUGF0aCBhbmQgdGhlIG5hbWUgb2YgdGhlIHByZXYgYnV0dG9uIGltYWdlDQoJCQlpbWFnZUJ0bk5leHQ6CQkJJ2ltYWdlcy9saWdodGJveC1idG4tbmV4dC5naWYnLAkJCS8vIChzdHJpbmcpIFBhdGggYW5kIHRoZSBuYW1lIG9mIHRoZSBuZXh0IGJ1dHRvbiBpbWFnZQ0KCQkJaW1hZ2VCdG5DbG9zZToJCQknaW1hZ2VzL2xpZ2h0Ym94LWJ0bi1jbG9zZS5naWYnLAkJLy8gKHN0cmluZykgUGF0aCBhbmQgdGhlIG5hbWUgb2YgdGhlIGNsb3NlIGJ0bg0KCQkJaW1hZ2VCbGFuazoJCQkJJ2ltYWdlcy9saWdodGJveC1ibGFuay5naWYnLAkJCS8vIChzdHJpbmcpIFBhdGggYW5kIHRoZSBuYW1lIG9mIGEgYmxhbmsgaW1hZ2UgKG9uZSBwaXhlbCkNCgkJCS8vIENvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byBjb250YWluZXIgaW1hZ2UgYm94DQoJCQljb250YWluZXJCb3JkZXJTaXplOgkxMCwJCQkvLyAoaW50ZWdlcikgSWYgeW91IGFkanVzdCB0aGUgcGFkZGluZyBpbiB0aGUgQ1NTIGZvciB0aGUgY29udGFpbmVyLCAjbGlnaHRib3gtY29udGFpbmVyLWltYWdlLWJveCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhpcyB2YWx1ZQ0KCQkJY29udGFpbmVyUmVzaXplU3BlZWQ6CTQwMCwJCS8vIChpbnRlZ2VyKSBTcGVjaWZ5IHRoZSByZXNpemUgZHVyYXRpb24gb2YgY29udGFpbmVyIGltYWdlLiBUaGVzZSBudW1iZXIgYXJlIG1pbGlzZWNvbmRzLiA0MDAgaXMgZGVmYXVsdC4NCgkJCS8vIENvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byB0ZXh0cyBpbiBjYXB0aW9uLiBGb3IgZXhhbXBsZTogSW1hZ2UgMiBvZiA4LiBZb3UgY2FuIGFsdGVyIGVpdGhlciAiSW1hZ2UiIGFuZCAib2YiIHRleHRzLg0KCQkJdHh0SW1hZ2U6CQkJCSdJbWFnZScsCS8vIChzdHJpbmcpIFNwZWNpZnkgdGV4dCAiSW1hZ2UiDQoJCQl0eHRPZjoJCQkJCSdvZicsCQkvLyAoc3RyaW5nKSBTcGVjaWZ5IHRleHQgIm9mIg0KCQkJLy8gQ29uZmlndXJhdGlvbiByZWxhdGVkIHRvIGtleWJvYXJkIG5hdmlnYXRpb24NCgkJCWtleVRvQ2xvc2U6CQkJCSdjJywJCS8vIChzdHJpbmcpIChjID0gY2xvc2UpIExldHRlciB0byBjbG9zZSB0aGUgalF1ZXJ5IGxpZ2h0Qm94IGludGVyZmFjZS4gQmV5b25kIHRoaXMgbGV0dGVyLCB0aGUgbGV0dGVyIFggYW5kIHRoZSBTQ0FQRSBrZXkgaXMgdXNlZCB0by4NCgkJCWtleVRvUHJldjoJCQkJJ3AnLAkJLy8gKHN0cmluZykgKHAgPSBwcmV2aW91cykgTGV0dGVyIHRvIHNob3cgdGhlIHByZXZpb3VzIGltYWdlDQoJCQlrZXlUb05leHQ6CQkJCSduJywJCS8vIChzdHJpbmcpIChuID0gbmV4dCkgTGV0dGVyIHRvIHNob3cgdGhlIG5leHQgaW1hZ2UuDQoJCQkvLyBEb260dCBhbHRlciB0aGVzZSB2YXJpYWJsZXMgaW4gYW55IHdheQ0KCQkJaW1hZ2VBcnJheToJCQkJW10sDQoJCQlhY3RpdmVJbWFnZToJCQkwDQoJCX0sc2V0dGluZ3MpOw0KCQkvLyBDYWNoaW5nIHRoZSBqUXVlcnkgb2JqZWN0IHdpdGggYWxsIGVsZW1lbnRzIG1hdGNoZWQNCgkJdmFyIGpRdWVyeU1hdGNoZWRPYmogPSB0aGlzOyAvLyBUaGlzLCBpbiB0aGlzIGNvbnRleHQsIHJlZmVyIHRvIGpRdWVyeSBvYmplY3QNCgkJLyoqDQoJCSAqIEluaXRpYWxpemluZyB0aGUgcGx1Z2luIGNhbGxpbmcgdGhlIHN0YXJ0IGZ1bmN0aW9uDQoJCSAqDQoJCSAqIEByZXR1cm4gYm9vbGVhbiBmYWxzZQ0KCQkgKi8NCgkJZnVuY3Rpb24gX2luaXRpYWxpemUoKSB7DQoJCQlfc3RhcnQodGhpcyxqUXVlcnlNYXRjaGVkT2JqKTsgLy8gVGhpcywgaW4gdGhpcyBjb250ZXh0LCByZWZlciB0byBvYmplY3QgKGxpbmspIHdoaWNoIHRoZSB1c2VyIGhhdmUgY2xpY2tlZA0KCQkJcmV0dXJuIGZhbHNlOyAvLyBBdm9pZCB0aGUgYnJvd3NlciBmb2xsb3dpbmcgdGhlIGxpbmsNCgkJfQ0KCQkvKioNCgkJICogU3RhcnQgdGhlIGpRdWVyeSBsaWdodEJveCBwbHVnaW4NCgkJICoNCgkJICogQHBhcmFtIG9iamVjdCBvYmpDbGlja2VkIFRoZSBvYmplY3QgKGxpbmspIHdoaWNrIHRoZSB1c2VyIGhhdmUgY2xpY2tlZA0KCQkgKiBAcGFyYW0gb2JqZWN0IGpRdWVyeU1hdGNoZWRPYmogVGhlIGpRdWVyeSBvYmplY3Qgd2l0aCBhbGwgZWxlbWVudHMgbWF0Y2hlZA0KCQkgKi8NCgkJZnVuY3Rpb24gX3N0YXJ0KG9iakNsaWNrZWQsalF1ZXJ5TWF0Y2hlZE9iaikgew0KCQkJLy8gSGltZSBzb21lIGVsZW1lbnRzIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggb3ZlcmxheSBpbiBJRS4gVGhlc2UgZWxlbWVudHMgYXBwZWFyIGFib3ZlIHRoZSBvdmVybGF5Lg0KCQkJJCgnZW1iZWQsIG9iamVjdCwgc2VsZWN0JykuY3NzKHsgJ3Zpc2liaWxpdHknIDogJ2hpZGRlbicgfSk7DQoJCQkvLyBDYWxsIHRoZSBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIG1hcmt1cCBzdHJ1Y3R1cmU7IHN0eWxlIHNvbWUgZWxlbWVudHM7IGFzc2lnbiBldmVudHMgaW4gc29tZSBlbGVtZW50cy4NCgkJCV9zZXRfaW50ZXJmYWNlKCk7DQoJCQkvLyBVbnNldCB0b3RhbCBpbWFnZXMgaW4gaW1hZ2VBcnJheQ0KCQkJc2V0dGluZ3MuaW1hZ2VBcnJheS5sZW5ndGggPSAwOw0KCQkJLy8gVW5zZXQgaW1hZ2UgYWN0aXZlIGluZm9ybWF0aW9uDQoJCQlzZXR0aW5ncy5hY3RpdmVJbWFnZSA9IDA7DQoJCQkvLyBXZSBoYXZlIGFuIGltYWdlIHNldD8gT3IganVzdCBhbiBpbWFnZT8gTGV0tHMgc2VlIGl0Lg0KCQkJaWYgKCBqUXVlcnlNYXRjaGVkT2JqLmxlbmd0aCA9PSAxICkgew0KCQkJCXNldHRpbmdzLmltYWdlQXJyYXkucHVzaChuZXcgQXJyYXkob2JqQ2xpY2tlZC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSxvYmpDbGlja2VkLmdldEF0dHJpYnV0ZSgndGl0bGUnKSkpOw0KCQkJfSBlbHNlIHsNCgkJCQkvLyBBZGQgYW4gQXJyYXkgKGFzIG1hbnkgYXMgd2UgaGF2ZSksIHdpdGggaHJlZiBhbmQgdGl0bGUgYXRyaWJ1dGVzLCBpbnNpZGUgdGhlIEFycmF5IHRoYXQgc3RvcmFnZSB0aGUgaW1hZ2VzIHJlZmVyZW5jZXMJCQ0KCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IGpRdWVyeU1hdGNoZWRPYmoubGVuZ3RoOyBpKysgKSB7DQoJCQkJCXNldHRpbmdzLmltYWdlQXJyYXkucHVzaChuZXcgQXJyYXkoalF1ZXJ5TWF0Y2hlZE9ialtpXS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSxqUXVlcnlNYXRjaGVkT2JqW2ldLmdldEF0dHJpYnV0ZSgndGl0bGUnKSkpOw0KCQkJCX0NCgkJCX0NCgkJCXdoaWxlICggc2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZV1bMF0gIT0gb2JqQ2xpY2tlZC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSApIHsNCgkJCQlzZXR0aW5ncy5hY3RpdmVJbWFnZSsrOw0KCQkJfQ0KCQkJLy8gQ2FsbCB0aGUgZnVuY3Rpb24gdGhhdCBwcmVwYXJlcyBpbWFnZSBleGliaXRpb24NCgkJCV9zZXRfaW1hZ2VfdG9fdmlldygpOw0KCQl9DQoJCS8qKg0KCQkgKiBDcmVhdGUgdGhlIGpRdWVyeSBsaWdodEJveCBwbHVnaW4gaW50ZXJmYWNlDQoJCSAqDQoJCSAqIFRoZSBIVE1MIG1hcmt1cCB3aWxsIGJlIGxpa2UgdGhhdDoNCgkJCTxkaXYgaWQ9ImpxdWVyeS1vdmVybGF5Ij48L2Rpdj4NCgkJCTxkaXYgaWQ9ImpxdWVyeS1saWdodGJveCI+DQoJCQkJPGRpdiBpZD0ibGlnaHRib3gtY29udGFpbmVyLWltYWdlLWJveCI+DQoJCQkJCTxkaXYgaWQ9ImxpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZSI+DQoJCQkJCQk8aW1nIHNyYz0iLi4vZm90b3MvWFguanBnIiBpZD0ibGlnaHRib3gtaW1hZ2UiPg0KCQkJCQkJPGRpdiBpZD0ibGlnaHRib3gtbmF2Ij4NCgkJCQkJCQk8YSBocmVmPSIjIiBpZD0ibGlnaHRib3gtbmF2LWJ0blByZXYiPjwvYT4NCgkJCQkJCQk8YSBocmVmPSIjIiBpZD0ibGlnaHRib3gtbmF2LWJ0bk5leHQiPjwvYT4NCgkJCQkJCTwvZGl2Pg0KCQkJCQkJPGRpdiBpZD0ibGlnaHRib3gtbG9hZGluZyI+DQoJCQkJCQkJPGEgaHJlZj0iIyIgaWQ9ImxpZ2h0Ym94LWxvYWRpbmctbGluayI+DQoJCQkJCQkJCTxpbWcgc3JjPSIuLi9pbWFnZXMvbGlnaHRib3gtaWNvLWxvYWRpbmcuZ2lmIj4NCgkJCQkJCQk8L2E+DQoJCQkJCQk8L2Rpdj4NCgkJCQkJPC9kaXY+DQoJCQkJPC9kaXY+DQoJCQkJPGRpdiBpZD0ibGlnaHRib3gtY29udGFpbmVyLWltYWdlLWRhdGEtYm94Ij4NCgkJCQkJPGRpdiBpZD0ibGlnaHRib3gtY29udGFpbmVyLWltYWdlLWRhdGEiPg0KCQkJCQkJPGRpdiBpZD0ibGlnaHRib3gtaW1hZ2UtZGV0YWlscyI+DQoJCQkJCQkJPHNwYW4gaWQ9ImxpZ2h0Ym94LWltYWdlLWRldGFpbHMtY2FwdGlvbiI+PC9zcGFuPg0KCQkJCQkJCTxzcGFuIGlkPSJsaWdodGJveC1pbWFnZS1kZXRhaWxzLWN1cnJlbnROdW1iZXIiPjwvc3Bhbj4NCgkJCQkJCTwvZGl2Pg0KCQkJCQkJPGRpdiBpZD0ibGlnaHRib3gtc2VjTmF2Ij4NCgkJCQkJCQk8YSBocmVmPSIjIiBpZD0ibGlnaHRib3gtc2VjTmF2LWJ0bkNsb3NlIj4NCgkJCQkJCQkJPGltZyBzcmM9Ii4uL2ltYWdlcy9saWdodGJveC1idG4tY2xvc2UuZ2lmIj4NCgkJCQkJCQk8L2E+DQoJCQkJCQk8L2Rpdj4NCgkJCQkJPC9kaXY+DQoJCQkJPC9kaXY+DQoJCQk8L2Rpdj4NCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9zZXRfaW50ZXJmYWNlKCkgew0KCQkJLy8gQXBwbHkgdGhlIEhUTUwgbWFya3VwIGludG8gYm9keSB0YWcNCgkJCSQoJ2JvZHknKS5hcHBlbmQoJzxkaXYgaWQ9ImpxdWVyeS1vdmVybGF5Ij48L2Rpdj48ZGl2IGlkPSJqcXVlcnktbGlnaHRib3giPjxkaXYgaWQ9ImxpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3giPjxkaXYgaWQ9ImxpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZSI+PGltZyBpZD0ibGlnaHRib3gtaW1hZ2UiPjxkaXYgc3R5bGU9IiIgaWQ9ImxpZ2h0Ym94LW5hdiI+PGEgaHJlZj0iIyIgaWQ9ImxpZ2h0Ym94LW5hdi1idG5QcmV2Ij48L2E+PGEgaHJlZj0iIyIgaWQ9ImxpZ2h0Ym94LW5hdi1idG5OZXh0Ij48L2E+PC9kaXY+PGRpdiBpZD0ibGlnaHRib3gtbG9hZGluZyI+PGEgaHJlZj0iIyIgaWQ9ImxpZ2h0Ym94LWxvYWRpbmctbGluayI+PGltZyBzcmM9IicgKyBzZXR0aW5ncy5pbWFnZUxvYWRpbmcgKyAnIj48L2E+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBpZD0ibGlnaHRib3gtY29udGFpbmVyLWltYWdlLWRhdGEtYm94Ij48ZGl2IGlkPSJsaWdodGJveC1jb250YWluZXItaW1hZ2UtZGF0YSI+PGRpdiBpZD0ibGlnaHRib3gtaW1hZ2UtZGV0YWlscyI+PHNwYW4gaWQ9ImxpZ2h0Ym94LWltYWdlLWRldGFpbHMtY2FwdGlvbiI+PC9zcGFuPjxzcGFuIGlkPSJsaWdodGJveC1pbWFnZS1kZXRhaWxzLWN1cnJlbnROdW1iZXIiPjwvc3Bhbj48L2Rpdj48ZGl2IGlkPSJsaWdodGJveC1zZWNOYXYiPjxhIGhyZWY9IiMiIGlkPSJsaWdodGJveC1zZWNOYXYtYnRuQ2xvc2UiPjxpbWcgc3JjPSInICsgc2V0dGluZ3MuaW1hZ2VCdG5DbG9zZSArICciPjwvYT48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4nKTsJDQoJCQkvLyBHZXQgcGFnZSBzaXplcw0KCQkJdmFyIGFyclBhZ2VTaXplcyA9IF9fX2dldFBhZ2VTaXplKCk7DQoJCQkvLyBTdHlsZSBvdmVybGF5IGFuZCBzaG93IGl0DQoJCQkkKCcjanF1ZXJ5LW92ZXJsYXknKS5jc3Moew0KCQkJCWJhY2tncm91bmRDb2xvcjoJc2V0dGluZ3Mub3ZlcmxheUJnQ29sb3IsDQoJCQkJb3BhY2l0eToJCQlzZXR0aW5ncy5vdmVybGF5T3BhY2l0eSwNCgkJCQl3aWR0aDoJCQkJYXJyUGFnZVNpemVzWzBdLA0KCQkJCWhlaWdodDoJCQkJYXJyUGFnZVNpemVzWzFdDQoJCQl9KS5mYWRlSW4oKTsNCgkJCS8vIEdldCBwYWdlIHNjcm9sbA0KCQkJdmFyIGFyclBhZ2VTY3JvbGwgPSBfX19nZXRQYWdlU2Nyb2xsKCk7DQoJCQkvLyBDYWxjdWxhdGUgdG9wIGFuZCBsZWZ0IG9mZnNldCBmb3IgdGhlIGpxdWVyeS1saWdodGJveCBkaXYgb2JqZWN0IGFuZCBzaG93IGl0DQoJCQkkKCcjanF1ZXJ5LWxpZ2h0Ym94JykuY3NzKHsNCgkJCQl0b3A6CWFyclBhZ2VTY3JvbGxbMV0gKyAoYXJyUGFnZVNpemVzWzNdIC8gMTApLA0KCQkJCWxlZnQ6CWFyclBhZ2VTY3JvbGxbMF0NCgkJCX0pLnNob3coKTsNCgkJCS8vIEFzc2lnbmluZyBjbGljayBldmVudHMgaW4gZWxlbWVudHMgdG8gY2xvc2Ugb3ZlcmxheQ0KCQkJJCgnI2pxdWVyeS1vdmVybGF5LCNqcXVlcnktbGlnaHRib3gnKS5jbGljayhmdW5jdGlvbigpIHsNCgkJCQlfZmluaXNoKCk7CQkJCQkJCQkJDQoJCQl9KTsNCgkJCS8vIEFzc2lnbiB0aGUgX2ZpbmlzaCBmdW5jdGlvbiB0byBsaWdodGJveC1sb2FkaW5nLWxpbmsgYW5kIGxpZ2h0Ym94LXNlY05hdi1idG5DbG9zZSBvYmplY3RzDQoJCQkkKCcjbGlnaHRib3gtbG9hZGluZy1saW5rLCNsaWdodGJveC1zZWNOYXYtYnRuQ2xvc2UnKS5jbGljayhmdW5jdGlvbigpIHsNCgkJCQlfZmluaXNoKCk7DQoJCQkJcmV0dXJuIGZhbHNlOw0KCQkJfSk7DQoJCQkvLyBJZiB3aW5kb3cgd2FzIHJlc2l6ZWQsIGNhbGN1bGF0ZSB0aGUgbmV3IG92ZXJsYXkgZGltZW5zaW9ucw0KCQkJJCh3aW5kb3cpLnJlc2l6ZShmdW5jdGlvbigpIHsNCgkJCQkvLyBHZXQgcGFnZSBzaXplcw0KCQkJCXZhciBhcnJQYWdlU2l6ZXMgPSBfX19nZXRQYWdlU2l6ZSgpOw0KCQkJCS8vIFN0eWxlIG92ZXJsYXkgYW5kIHNob3cgaXQNCgkJCQkkKCcjanF1ZXJ5LW92ZXJsYXknKS5jc3Moew0KCQkJCQl3aWR0aDoJCWFyclBhZ2VTaXplc1swXSwNCgkJCQkJaGVpZ2h0OgkJYXJyUGFnZVNpemVzWzFdDQoJCQkJfSk7DQoJCQkJLy8gR2V0IHBhZ2Ugc2Nyb2xsDQoJCQkJdmFyIGFyclBhZ2VTY3JvbGwgPSBfX19nZXRQYWdlU2Nyb2xsKCk7DQoJCQkJLy8gQ2FsY3VsYXRlIHRvcCBhbmQgbGVmdCBvZmZzZXQgZm9yIHRoZSBqcXVlcnktbGlnaHRib3ggZGl2IG9iamVjdCBhbmQgc2hvdyBpdA0KCQkJCSQoJyNqcXVlcnktbGlnaHRib3gnKS5jc3Moew0KCQkJCQl0b3A6CWFyclBhZ2VTY3JvbGxbMV0gKyAoYXJyUGFnZVNpemVzWzNdIC8gMTApLA0KCQkJCQlsZWZ0OglhcnJQYWdlU2Nyb2xsWzBdDQoJCQkJfSk7DQoJCQl9KTsNCgkJfQ0KCQkvKioNCgkJICogUHJlcGFyZXMgaW1hZ2UgZXhpYml0aW9uOyBkb2luZyBhIGltYWdltHMgcHJlbG9hZGVyIHRvIGNhbGN1bGF0ZSBpdLRzIHNpemUNCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9zZXRfaW1hZ2VfdG9fdmlldygpIHsgLy8gc2hvdyB0aGUgbG9hZGluZw0KCQkJLy8gU2hvdyB0aGUgbG9hZGluZw0KCQkJJCgnI2xpZ2h0Ym94LWxvYWRpbmcnKS5zaG93KCk7DQoJCQlpZiAoIHNldHRpbmdzLmZpeGVkTmF2aWdhdGlvbiApIHsNCgkJCQkkKCcjbGlnaHRib3gtaW1hZ2UsI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCwjbGlnaHRib3gtaW1hZ2UtZGV0YWlscy1jdXJyZW50TnVtYmVyJykuaGlkZSgpOw0KCQkJfSBlbHNlIHsNCgkJCQkvLyBIaWRlIHNvbWUgZWxlbWVudHMNCgkJCQkkKCcjbGlnaHRib3gtaW1hZ2UsI2xpZ2h0Ym94LW5hdiwjbGlnaHRib3gtbmF2LWJ0blByZXYsI2xpZ2h0Ym94LW5hdi1idG5OZXh0LCNsaWdodGJveC1jb250YWluZXItaW1hZ2UtZGF0YS1ib3gsI2xpZ2h0Ym94LWltYWdlLWRldGFpbHMtY3VycmVudE51bWJlcicpLmhpZGUoKTsNCgkJCX0NCgkJCS8vIEltYWdlIHByZWxvYWQgcHJvY2Vzcw0KCQkJdmFyIG9iakltYWdlUHJlbG9hZGVyID0gbmV3IEltYWdlKCk7DQoJCQlvYmpJbWFnZVByZWxvYWRlci5vbmxvYWQgPSBmdW5jdGlvbigpIHsNCgkJCQkkKCcjbGlnaHRib3gtaW1hZ2UnKS5hdHRyKCdzcmMnLHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2VdWzBdKTsNCgkJCQkvLyBQZXJmb21hbmNlIGFuIGVmZmVjdCBpbiB0aGUgaW1hZ2UgY29udGFpbmVyIHJlc2l6aW5nIGl0DQoJCQkJX3Jlc2l6ZV9jb250YWluZXJfaW1hZ2VfYm94KG9iakltYWdlUHJlbG9hZGVyLndpZHRoLG9iakltYWdlUHJlbG9hZGVyLmhlaWdodCk7DQoJCQkJLy8JY2xlYXIgb25Mb2FkLCBJRSBiZWhhdmVzIGlycmF0aWNhbGx5IHdpdGggYW5pbWF0ZWQgZ2lmcyBvdGhlcndpc2UNCgkJCQlvYmpJbWFnZVByZWxvYWRlci5vbmxvYWQ9ZnVuY3Rpb24oKXt9Ow0KCQkJfTsNCgkJCW9iakltYWdlUHJlbG9hZGVyLnNyYyA9IHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2VdWzBdOw0KCQl9Ow0KCQkvKioNCgkJICogUGVyZm9tYW5jZSBhbiBlZmZlY3QgaW4gdGhlIGltYWdlIGNvbnRhaW5lciByZXNpemluZyBpdA0KCQkgKg0KCQkgKiBAcGFyYW0gaW50ZWdlciBpbnRJbWFnZVdpZHRoIFRoZSBpbWFnZbRzIHdpZHRoIHRoYXQgd2lsbCBiZSBzaG93ZWQNCgkJICogQHBhcmFtIGludGVnZXIgaW50SW1hZ2VIZWlnaHQgVGhlIGltYWdltHMgaGVpZ2h0IHRoYXQgd2lsbCBiZSBzaG93ZWQNCgkJICovDQoJCWZ1bmN0aW9uIF9yZXNpemVfY29udGFpbmVyX2ltYWdlX2JveChpbnRJbWFnZVdpZHRoLGludEltYWdlSGVpZ2h0KSB7DQoJCQkvLyBHZXQgY3VycmVudCB3aWR0aCBhbmQgaGVpZ2h0DQoJCQl2YXIgaW50Q3VycmVudFdpZHRoID0gJCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3gnKS53aWR0aCgpOw0KCQkJdmFyIGludEN1cnJlbnRIZWlnaHQgPSAkKCcjbGlnaHRib3gtY29udGFpbmVyLWltYWdlLWJveCcpLmhlaWdodCgpOw0KCQkJLy8gR2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzZWxlY3RlZCBpbWFnZSBwbHVzIHRoZSBwYWRkaW5nDQoJCQl2YXIgaW50V2lkdGggPSAoaW50SW1hZ2VXaWR0aCArIChzZXR0aW5ncy5jb250YWluZXJCb3JkZXJTaXplICogMikpOyAvLyBQbHVzIHRoZSBpbWFnZbRzIHdpZHRoIGFuZCB0aGUgbGVmdCBhbmQgcmlnaHQgcGFkZGluZyB2YWx1ZQ0KCQkJdmFyIGludEhlaWdodCA9IChpbnRJbWFnZUhlaWdodCArIChzZXR0aW5ncy5jb250YWluZXJCb3JkZXJTaXplICogMikpOyAvLyBQbHVzIHRoZSBpbWFnZbRzIGhlaWdodCBhbmQgdGhlIGxlZnQgYW5kIHJpZ2h0IHBhZGRpbmcgdmFsdWUNCgkJCS8vIERpZmVyZW5jZXMNCgkJCXZhciBpbnREaWZmVyA9IGludEN1cnJlbnRXaWR0aCAtIGludFdpZHRoOw0KCQkJdmFyIGludERpZmZIID0gaW50Q3VycmVudEhlaWdodCAtIGludEhlaWdodDsNCgkJCS8vIFBlcmZvbWFuY2UgdGhlIGVmZmVjdA0KCQkJJCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3gnKS5hbmltYXRlKHsgd2lkdGg6IGludFdpZHRoLCBoZWlnaHQ6IGludEhlaWdodCB9LHNldHRpbmdzLmNvbnRhaW5lclJlc2l6ZVNwZWVkLGZ1bmN0aW9uKCkgeyBfc2hvd19pbWFnZSgpOyB9KTsNCgkJCWlmICggKCBpbnREaWZmVyA9PSAwICkgJiYgKCBpbnREaWZmSCA9PSAwICkgKSB7DQoJCQkJaWYgKCAkLmJyb3dzZXIubXNpZSApIHsNCgkJCQkJX19fcGF1c2UoMjUwKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlfX19wYXVzZSgxMDApOwkNCgkJCQl9DQoJCQl9IA0KCQkJJCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCcpLmNzcyh7IHdpZHRoOiBpbnRJbWFnZVdpZHRoIH0pOw0KCQkJJCgnI2xpZ2h0Ym94LW5hdi1idG5QcmV2LCNsaWdodGJveC1uYXYtYnRuTmV4dCcpLmNzcyh7IGhlaWdodDogaW50SW1hZ2VIZWlnaHQgKyAoc2V0dGluZ3MuY29udGFpbmVyQm9yZGVyU2l6ZSAqIDIpIH0pOw0KCQl9Ow0KCQkvKioNCgkJICogU2hvdyB0aGUgcHJlcGFyZWQgaW1hZ2UNCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9zaG93X2ltYWdlKCkgew0KCQkJJCgnI2xpZ2h0Ym94LWxvYWRpbmcnKS5oaWRlKCk7DQoJCQkkKCcjbGlnaHRib3gtaW1hZ2UnKS5mYWRlSW4oZnVuY3Rpb24oKSB7DQoJCQkJX3Nob3dfaW1hZ2VfZGF0YSgpOw0KCQkJCV9zZXRfbmF2aWdhdGlvbigpOw0KCQkJfSk7DQoJCQlfcHJlbG9hZF9uZWlnaGJvcl9pbWFnZXMoKTsNCgkJfTsNCgkJLyoqDQoJCSAqIFNob3cgdGhlIGltYWdlIGluZm9ybWF0aW9uDQoJCSAqDQoJCSAqLw0KCQlmdW5jdGlvbiBfc2hvd19pbWFnZV9kYXRhKCkgew0KCQkJJCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCcpLnNsaWRlRG93bignZmFzdCcpOw0KCQkJJCgnI2xpZ2h0Ym94LWltYWdlLWRldGFpbHMtY2FwdGlvbicpLmhpZGUoKTsNCgkJCWlmICggc2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZV1bMV0gKSB7DQoJCQkJJCgnI2xpZ2h0Ym94LWltYWdlLWRldGFpbHMtY2FwdGlvbicpLmh0bWwoc2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZV1bMV0pLnNob3coKTsNCgkJCX0NCgkJCS8vIElmIHdlIGhhdmUgYSBpbWFnZSBzZXQsIGRpc3BsYXkgJ0ltYWdlIFggb2YgWCcNCgkJCWlmICggc2V0dGluZ3MuaW1hZ2VBcnJheS5sZW5ndGggPiAxICkgew0KCQkJCSQoJyNsaWdodGJveC1pbWFnZS1kZXRhaWxzLWN1cnJlbnROdW1iZXInKS5odG1sKHNldHRpbmdzLnR4dEltYWdlICsgJyAnICsgKCBzZXR0aW5ncy5hY3RpdmVJbWFnZSArIDEgKSArICcgJyArIHNldHRpbmdzLnR4dE9mICsgJyAnICsgc2V0dGluZ3MuaW1hZ2VBcnJheS5sZW5ndGgpLnNob3coKTsNCgkJCX0JCQ0KCQl9DQoJCS8qKg0KCQkgKiBEaXNwbGF5IHRoZSBidXR0b24gbmF2aWdhdGlvbnMNCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9zZXRfbmF2aWdhdGlvbigpIHsNCgkJCSQoJyNsaWdodGJveC1uYXYnKS5zaG93KCk7DQoNCgkJCS8vIEluc3RlYWQgdG8gZGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBpbiBDU1MgZmlsZSwgd2UgZGVmaW5lIGhlcmUuIEFuZCBpdLRzIG5lZWQgdG8gSUUuIEp1c3QuDQoJCQkkKCcjbGlnaHRib3gtbmF2LWJ0blByZXYsI2xpZ2h0Ym94LW5hdi1idG5OZXh0JykuY3NzKHsgJ2JhY2tncm91bmQnIDogJ3RyYW5zcGFyZW50IHVybCgnICsgc2V0dGluZ3MuaW1hZ2VCbGFuayArICcpIG5vLXJlcGVhdCcgfSk7DQoJCQkNCgkJCS8vIFNob3cgdGhlIHByZXYgYnV0dG9uLCBpZiBub3QgdGhlIGZpcnN0IGltYWdlIGluIHNldA0KCQkJaWYgKCBzZXR0aW5ncy5hY3RpdmVJbWFnZSAhPSAwICkgew0KCQkJCWlmICggc2V0dGluZ3MuZml4ZWROYXZpZ2F0aW9uICkgew0KCQkJCQkkKCcjbGlnaHRib3gtbmF2LWJ0blByZXYnKS5jc3MoeyAnYmFja2dyb3VuZCcgOiAndXJsKCcgKyBzZXR0aW5ncy5pbWFnZUJ0blByZXYgKyAnKSBsZWZ0IDE1JSBuby1yZXBlYXQnIH0pDQoJCQkJCQkudW5iaW5kKCkNCgkJCQkJCS5iaW5kKCdjbGljaycsZnVuY3Rpb24oKSB7DQoJCQkJCQkJc2V0dGluZ3MuYWN0aXZlSW1hZ2UgPSBzZXR0aW5ncy5hY3RpdmVJbWFnZSAtIDE7DQoJCQkJCQkJX3NldF9pbWFnZV90b192aWV3KCk7DQoJCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQkJfSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJLy8gU2hvdyB0aGUgaW1hZ2VzIGJ1dHRvbiBmb3IgTmV4dCBidXR0b25zDQoJCQkJCSQoJyNsaWdodGJveC1uYXYtYnRuUHJldicpLnVuYmluZCgpLmhvdmVyKGZ1bmN0aW9uKCkgew0KCQkJCQkJJCh0aGlzKS5jc3MoeyAnYmFja2dyb3VuZCcgOiAndXJsKCcgKyBzZXR0aW5ncy5pbWFnZUJ0blByZXYgKyAnKSBsZWZ0IDE1JSBuby1yZXBlYXQnIH0pOw0KCQkJCQl9LGZ1bmN0aW9uKCkgew0KCQkJCQkJJCh0aGlzKS5jc3MoeyAnYmFja2dyb3VuZCcgOiAndHJhbnNwYXJlbnQgdXJsKCcgKyBzZXR0aW5ncy5pbWFnZUJsYW5rICsgJykgbm8tcmVwZWF0JyB9KTsNCgkJCQkJfSkuc2hvdygpLmJpbmQoJ2NsaWNrJyxmdW5jdGlvbigpIHsNCgkJCQkJCXNldHRpbmdzLmFjdGl2ZUltYWdlID0gc2V0dGluZ3MuYWN0aXZlSW1hZ2UgLSAxOw0KCQkJCQkJX3NldF9pbWFnZV90b192aWV3KCk7DQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX0pOw0KCQkJCX0NCgkJCX0NCgkJCQ0KCQkJLy8gU2hvdyB0aGUgbmV4dCBidXR0b24sIGlmIG5vdCB0aGUgbGFzdCBpbWFnZSBpbiBzZXQNCgkJCWlmICggc2V0dGluZ3MuYWN0aXZlSW1hZ2UgIT0gKCBzZXR0aW5ncy5pbWFnZUFycmF5Lmxlbmd0aCAtMSApICkgew0KCQkJCWlmICggc2V0dGluZ3MuZml4ZWROYXZpZ2F0aW9uICkgew0KCQkJCQkkKCcjbGlnaHRib3gtbmF2LWJ0bk5leHQnKS5jc3MoeyAnYmFja2dyb3VuZCcgOiAndXJsKCcgKyBzZXR0aW5ncy5pbWFnZUJ0bk5leHQgKyAnKSByaWdodCAxNSUgbm8tcmVwZWF0JyB9KQ0KCQkJCQkJLnVuYmluZCgpDQoJCQkJCQkuYmluZCgnY2xpY2snLGZ1bmN0aW9uKCkgew0KCQkJCQkJCXNldHRpbmdzLmFjdGl2ZUltYWdlID0gc2V0dGluZ3MuYWN0aXZlSW1hZ2UgKyAxOw0KCQkJCQkJCV9zZXRfaW1hZ2VfdG9fdmlldygpOw0KCQkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJCX0pOw0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIFNob3cgdGhlIGltYWdlcyBidXR0b24gZm9yIE5leHQgYnV0dG9ucw0KCQkJCQkkKCcjbGlnaHRib3gtbmF2LWJ0bk5leHQnKS51bmJpbmQoKS5ob3ZlcihmdW5jdGlvbigpIHsNCgkJCQkJCSQodGhpcykuY3NzKHsgJ2JhY2tncm91bmQnIDogJ3VybCgnICsgc2V0dGluZ3MuaW1hZ2VCdG5OZXh0ICsgJykgcmlnaHQgMTUlIG5vLXJlcGVhdCcgfSk7DQoJCQkJCX0sZnVuY3Rpb24oKSB7DQoJCQkJCQkkKHRoaXMpLmNzcyh7ICdiYWNrZ3JvdW5kJyA6ICd0cmFuc3BhcmVudCB1cmwoJyArIHNldHRpbmdzLmltYWdlQmxhbmsgKyAnKSBuby1yZXBlYXQnIH0pOw0KCQkJCQl9KS5zaG93KCkuYmluZCgnY2xpY2snLGZ1bmN0aW9uKCkgew0KCQkJCQkJc2V0dGluZ3MuYWN0aXZlSW1hZ2UgPSBzZXR0aW5ncy5hY3RpdmVJbWFnZSArIDE7DQoJCQkJCQlfc2V0X2ltYWdlX3RvX3ZpZXcoKTsNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfQ0KCQkJLy8gRW5hYmxlIGtleWJvYXJkIG5hdmlnYXRpb24NCgkJCV9lbmFibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbigpOw0KCQl9DQoJCS8qKg0KCQkgKiBFbmFibGUgYSBzdXBwb3J0IHRvIGtleWJvYXJkIG5hdmlnYXRpb24NCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9lbmFibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbigpIHsNCgkJCSQoZG9jdW1lbnQpLmtleWRvd24oZnVuY3Rpb24ob2JqRXZlbnQpIHsNCgkJCQlfa2V5Ym9hcmRfYWN0aW9uKG9iakV2ZW50KTsNCgkJCX0pOw0KCQl9DQoJCS8qKg0KCQkgKiBEaXNhYmxlIHRoZSBzdXBwb3J0IHRvIGtleWJvYXJkIG5hdmlnYXRpb24NCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9kaXNhYmxlX2tleWJvYXJkX25hdmlnYXRpb24oKSB7DQoJCQkkKGRvY3VtZW50KS51bmJpbmQoKTsNCgkJfQ0KCQkvKioNCgkJICogUGVyZm9ybSB0aGUga2V5Ym9hcmQgYWN0aW9ucw0KCQkgKg0KCQkgKi8NCgkJZnVuY3Rpb24gX2tleWJvYXJkX2FjdGlvbihvYmpFdmVudCkgew0KCQkJLy8gVG8gaWUNCgkJCWlmICggb2JqRXZlbnQgPT0gbnVsbCApIHsNCgkJCQlrZXljb2RlID0gZXZlbnQua2V5Q29kZTsNCgkJCQllc2NhcGVLZXkgPSAyNzsNCgkJCS8vIFRvIE1vemlsbGENCgkJCX0gZWxzZSB7DQoJCQkJa2V5Y29kZSA9IG9iakV2ZW50LmtleUNvZGU7DQoJCQkJZXNjYXBlS2V5ID0gb2JqRXZlbnQuRE9NX1ZLX0VTQ0FQRTsNCgkJCX0NCgkJCS8vIEdldCB0aGUga2V5IGluIGxvd2VyIGNhc2UgZm9ybQ0KCQkJa2V5ID0gU3RyaW5nLmZyb21DaGFyQ29kZShrZXljb2RlKS50b0xvd2VyQ2FzZSgpOw0KCQkJLy8gVmVyaWZ5IHRoZSBrZXlzIHRvIGNsb3NlIHRoZSBsaWd0aEJveA0KCQkJaWYgKCAoIGtleSA9PSBzZXR0aW5ncy5rZXlUb0Nsb3NlICkgfHwgKCBrZXkgPT0gJ3gnICkgfHwgKCBrZXljb2RlID09IGVzY2FwZUtleSApICkgew0KCQkJCV9maW5pc2goKTsNCgkJCX0NCgkJCS8vIFZlcmlmeSB0aGUga2V5IHRvIHNob3cgdGhlIHByZXZpb3VzIGltYWdlDQoJCQlpZiAoICgga2V5ID09IHNldHRpbmdzLmtleVRvUHJldiApIHx8ICgga2V5Y29kZSA9PSAzNyApICkgew0KCQkJCS8vIElmIHdltHJlIG5vdCBzaG93aW5nIHRoZSBmaXJzdCBpbWFnZSwgY2FsbCB0aGUgcHJldmlvdXMNCgkJCQlpZiAoIHNldHRpbmdzLmFjdGl2ZUltYWdlICE9IDAgKSB7DQoJCQkJCXNldHRpbmdzLmFjdGl2ZUltYWdlID0gc2V0dGluZ3MuYWN0aXZlSW1hZ2UgLSAxOw0KCQkJCQlfc2V0X2ltYWdlX3RvX3ZpZXcoKTsNCgkJCQkJX2Rpc2FibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbigpOw0KCQkJCX0NCgkJCX0NCgkJCS8vIFZlcmlmeSB0aGUga2V5IHRvIHNob3cgdGhlIG5leHQgaW1hZ2UNCgkJCWlmICggKCBrZXkgPT0gc2V0dGluZ3Mua2V5VG9OZXh0ICkgfHwgKCBrZXljb2RlID09IDM5ICkgKSB7DQoJCQkJLy8gSWYgd2W0cmUgbm90IHNob3dpbmcgdGhlIGxhc3QgaW1hZ2UsIGNhbGwgdGhlIG5leHQNCgkJCQlpZiAoIHNldHRpbmdzLmFjdGl2ZUltYWdlICE9ICggc2V0dGluZ3MuaW1hZ2VBcnJheS5sZW5ndGggLSAxICkgKSB7DQoJCQkJCXNldHRpbmdzLmFjdGl2ZUltYWdlID0gc2V0dGluZ3MuYWN0aXZlSW1hZ2UgKyAxOw0KCQkJCQlfc2V0X2ltYWdlX3RvX3ZpZXcoKTsNCgkJCQkJX2Rpc2FibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbigpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQkvKioNCgkJICogUHJlbG9hZCBwcmV2IGFuZCBuZXh0IGltYWdlcyBiZWluZyBzaG93ZWQNCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9wcmVsb2FkX25laWdoYm9yX2ltYWdlcygpIHsNCgkJCWlmICggKHNldHRpbmdzLmltYWdlQXJyYXkubGVuZ3RoIC0xKSA+IHNldHRpbmdzLmFjdGl2ZUltYWdlICkgew0KCQkJCW9iak5leHQgPSBuZXcgSW1hZ2UoKTsNCgkJCQlvYmpOZXh0LnNyYyA9IHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2UgKyAxXVswXTsNCgkJCX0NCgkJCWlmICggc2V0dGluZ3MuYWN0aXZlSW1hZ2UgPiAwICkgew0KCQkJCW9ialByZXYgPSBuZXcgSW1hZ2UoKTsNCgkJCQlvYmpQcmV2LnNyYyA9IHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2UgLTFdWzBdOw0KCQkJfQ0KCQl9DQoJCS8qKg0KCQkgKiBSZW1vdmUgalF1ZXJ5IGxpZ2h0Qm94IHBsdWdpbiBIVE1MIG1hcmt1cA0KCQkgKg0KCQkgKi8NCgkJZnVuY3Rpb24gX2ZpbmlzaCgpIHsNCgkJCSQoJyNqcXVlcnktbGlnaHRib3gnKS5yZW1vdmUoKTsNCgkJCSQoJyNqcXVlcnktb3ZlcmxheScpLmZhZGVPdXQoZnVuY3Rpb24oKSB7ICQoJyNqcXVlcnktb3ZlcmxheScpLnJlbW92ZSgpOyB9KTsNCgkJCS8vIFNob3cgc29tZSBlbGVtZW50cyB0byBhdm9pZCBjb25mbGljdCB3aXRoIG92ZXJsYXkgaW4gSUUuIFRoZXNlIGVsZW1lbnRzIGFwcGVhciBhYm92ZSB0aGUgb3ZlcmxheS4NCgkJCSQoJ2VtYmVkLCBvYmplY3QsIHNlbGVjdCcpLmNzcyh7ICd2aXNpYmlsaXR5JyA6ICd2aXNpYmxlJyB9KTsNCgkJfQ0KCQkvKioNCgkJIC8gVEhJUkQgRlVOQ1RJT04NCgkJICogZ2V0UGFnZVNpemUoKSBieSBxdWlya3Ntb2RlLmNvbQ0KCQkgKg0KCQkgKiBAcmV0dXJuIEFycmF5IFJldHVybiBhbiBhcnJheSB3aXRoIHBhZ2Ugd2lkdGgsIGhlaWdodCBhbmQgd2luZG93IHdpZHRoLCBoZWlnaHQNCgkJICovDQoJCWZ1bmN0aW9uIF9fX2dldFBhZ2VTaXplKCkgew0KCQkJdmFyIHhTY3JvbGwsIHlTY3JvbGw7DQoJCQlpZiAod2luZG93LmlubmVySGVpZ2h0ICYmIHdpbmRvdy5zY3JvbGxNYXhZKSB7CQ0KCQkJCXhTY3JvbGwgPSB3aW5kb3cuaW5uZXJXaWR0aCArIHdpbmRvdy5zY3JvbGxNYXhYOw0KCQkJCXlTY3JvbGwgPSB3aW5kb3cuaW5uZXJIZWlnaHQgKyB3aW5kb3cuc2Nyb2xsTWF4WTsNCgkJCX0gZWxzZSBpZiAoZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCl7IC8vIGFsbCBidXQgRXhwbG9yZXIgTWFjDQoJCQkJeFNjcm9sbCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsV2lkdGg7DQoJCQkJeVNjcm9sbCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0Ow0KCQkJfSBlbHNlIHsgLy8gRXhwbG9yZXIgTWFjLi4ud291bGQgYWxzbyB3b3JrIGluIEV4cGxvcmVyIDYgU3RyaWN0LCBNb3ppbGxhIGFuZCBTYWZhcmkNCgkJCQl4U2Nyb2xsID0gZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aDsNCgkJCQl5U2Nyb2xsID0gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQ7DQoJCQl9DQoJCQl2YXIgd2luZG93V2lkdGgsIHdpbmRvd0hlaWdodDsNCgkJCWlmIChzZWxmLmlubmVySGVpZ2h0KSB7CS8vIGFsbCBleGNlcHQgRXhwbG9yZXINCgkJCQlpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpew0KCQkJCQl3aW5kb3dXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDsgDQoJCQkJfSBlbHNlIHsNCgkJCQkJd2luZG93V2lkdGggPSBzZWxmLmlubmVyV2lkdGg7DQoJCQkJfQ0KCQkJCXdpbmRvd0hlaWdodCA9IHNlbGYuaW5uZXJIZWlnaHQ7DQoJCQl9IGVsc2UgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSB7IC8vIEV4cGxvcmVyIDYgU3RyaWN0IE1vZGUNCgkJCQl3aW5kb3dXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDsNCgkJCQl3aW5kb3dIZWlnaHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0Ow0KCQkJfSBlbHNlIGlmIChkb2N1bWVudC5ib2R5KSB7IC8vIG90aGVyIEV4cGxvcmVycw0KCQkJCXdpbmRvd1dpZHRoID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDsNCgkJCQl3aW5kb3dIZWlnaHQgPSBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodDsNCgkJCX0JDQoJCQkvLyBmb3Igc21hbGwgcGFnZXMgd2l0aCB0b3RhbCBoZWlnaHQgbGVzcyB0aGVuIGhlaWdodCBvZiB0aGUgdmlld3BvcnQNCgkJCWlmKHlTY3JvbGwgPCB3aW5kb3dIZWlnaHQpew0KCQkJCXBhZ2VIZWlnaHQgPSB3aW5kb3dIZWlnaHQ7DQoJCQl9IGVsc2UgeyANCgkJCQlwYWdlSGVpZ2h0ID0geVNjcm9sbDsNCgkJCX0NCgkJCS8vIGZvciBzbWFsbCBwYWdlcyB3aXRoIHRvdGFsIHdpZHRoIGxlc3MgdGhlbiB3aWR0aCBvZiB0aGUgdmlld3BvcnQNCgkJCWlmKHhTY3JvbGwgPCB3aW5kb3dXaWR0aCl7CQ0KCQkJCXBhZ2VXaWR0aCA9IHhTY3JvbGw7CQkNCgkJCX0gZWxzZSB7DQoJCQkJcGFnZVdpZHRoID0gd2luZG93V2lkdGg7DQoJCQl9DQoJCQlhcnJheVBhZ2VTaXplID0gbmV3IEFycmF5KHBhZ2VXaWR0aCxwYWdlSGVpZ2h0LHdpbmRvd1dpZHRoLHdpbmRvd0hlaWdodCk7DQoJCQlyZXR1cm4gYXJyYXlQYWdlU2l6ZTsNCgkJfTsNCgkJLyoqDQoJCSAvIFRISVJEIEZVTkNUSU9ODQoJCSAqIGdldFBhZ2VTY3JvbGwoKSBieSBxdWlya3Ntb2RlLmNvbQ0KCQkgKg0KCQkgKiBAcmV0dXJuIEFycmF5IFJldHVybiBhbiBhcnJheSB3aXRoIHgseSBwYWdlIHNjcm9sbCB2YWx1ZXMuDQoJCSAqLw0KCQlmdW5jdGlvbiBfX19nZXRQYWdlU2Nyb2xsKCkgew0KCQkJdmFyIHhTY3JvbGwsIHlTY3JvbGw7DQoJCQlpZiAoc2VsZi5wYWdlWU9mZnNldCkgew0KCQkJCXlTY3JvbGwgPSBzZWxmLnBhZ2VZT2Zmc2V0Ow0KCQkJCXhTY3JvbGwgPSBzZWxmLnBhZ2VYT2Zmc2V0Ow0KCQkJfSBlbHNlIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCkgewkgLy8gRXhwbG9yZXIgNiBTdHJpY3QNCgkJCQl5U2Nyb2xsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDsNCgkJCQl4U2Nyb2xsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7DQoJCQl9IGVsc2UgaWYgKGRvY3VtZW50LmJvZHkpIHsvLyBhbGwgb3RoZXIgRXhwbG9yZXJzDQoJCQkJeVNjcm9sbCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wOw0KCQkJCXhTY3JvbGwgPSBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7CQ0KCQkJfQ0KCQkJYXJyYXlQYWdlU2Nyb2xsID0gbmV3IEFycmF5KHhTY3JvbGwseVNjcm9sbCk7DQoJCQlyZXR1cm4gYXJyYXlQYWdlU2Nyb2xsOw0KCQl9Ow0KCQkgLyoqDQoJCSAgKiBTdG9wIHRoZSBjb2RlIGV4ZWN1dGlvbiBmcm9tIGEgZXNjaWZpZWQgdGltZSBpbiBtaWxpc2Vjb25kDQoJCSAgKg0KCQkgICovDQoJCSBmdW5jdGlvbiBfX19wYXVzZShtcykgew0KCQkJdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOyANCgkJCWN1ckRhdGUgPSBudWxsOw0KCQkJZG8geyB2YXIgY3VyRGF0ZSA9IG5ldyBEYXRlKCk7IH0NCgkJCXdoaWxlICggY3VyRGF0ZSAtIGRhdGUgPCBtcyk7DQoJCSB9Ow0KCQkvLyBSZXR1cm4gdGhlIGpRdWVyeSBvYmplY3QgZm9yIGNoYWluaW5nLiBUaGUgdW5iaW5kIG1ldGhvZCBpcyB1c2VkIHRvIGF2b2lkIGNsaWNrIGNvbmZsaWN0IHdoZW4gdGhlIHBsdWdpbiBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UNCgkJcmV0dXJuIHRoaXMudW5iaW5kKCdjbGljaycpLmNsaWNrKF9pbml0aWFsaXplKTsNCgl9Ow0KfSkoalF1ZXJ5KTsgLy8gQ2FsbCBhbmQgZXhlY3V0ZSB0aGUgZnVuY3Rpb24gaW1tZWRpYXRlbHkgcGFzc2luZyB0aGUgalF1ZXJ5IG9iamVjdA==]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/jquery.lightbox-0.5.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBqUXVlcnkgbGlnaHRCb3ggcGx1Z2luDQogKiBUaGlzIGpRdWVyeSBwbHVnaW4gd2FzIGluc3BpcmVkIGFuZCBiYXNlZCBvbiBMaWdodGJveCAyIGJ5IExva2VzaCBEaGFrYXIgKGh0dHA6Ly93d3cuaHVkZGxldG9nZXRoZXIuY29tL3Byb2plY3RzL2xpZ2h0Ym94Mi8pDQogKiBhbmQgYWRhcHRlZCB0byBtZSBmb3IgdXNlIGxpa2UgYSBwbHVnaW4gZnJvbSBqUXVlcnkuDQogKiBAbmFtZSBqcXVlcnktbGlnaHRib3gtMC41LmpzDQogKiBAYXV0aG9yIExlYW5kcm8gVmllaXJhIFBpbmhvIC0gaHR0cDovL2xlYW5kcm92aWVpcmEuY29tDQogKiBAdmVyc2lvbiAwLjUNCiAqIEBkYXRlIEFwcmlsIDExLCAyMDA4DQogKiBAY2F0ZWdvcnkgalF1ZXJ5IHBsdWdpbg0KICogQGNvcHlyaWdodCAoYykgMjAwOCBMZWFuZHJvIFZpZWlyYSBQaW5obyAobGVhbmRyb3ZpZWlyYS5jb20pDQogKiBAbGljZW5zZSBDQ0F0dHJpYnV0aW9uLVNoYXJlQWxpa2UgMi41IEJyYXppbCAtIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzIuNS9ici9kZWVkLmVuX1VTDQogKiBAZXhhbXBsZSBWaXNpdCBodHRwOi8vbGVhbmRyb3ZpZWlyYS5jb20vcHJvamVjdHMvanF1ZXJ5L2xpZ2h0Ym94LyBmb3IgbW9yZSBpbmZvcm1hdGlvbnMgYWJvdXQgdGhpcyBqUXVlcnkgcGx1Z2luDQogKi8NCihmdW5jdGlvbigkKXskLmZuLmxpZ2h0Qm94PWZ1bmN0aW9uKHNldHRpbmdzKXtzZXR0aW5ncz1qUXVlcnkuZXh0ZW5kKHtvdmVybGF5QmdDb2xvcjonIzAwMCcsb3ZlcmxheU9wYWNpdHk6MC44LGZpeGVkTmF2aWdhdGlvbjpmYWxzZSxpbWFnZUxvYWRpbmc6J2ltYWdlcy9saWdodGJveC1pY28tbG9hZGluZy5naWYnLGltYWdlQnRuUHJldjonaW1hZ2VzL2xpZ2h0Ym94LWJ0bi1wcmV2LmdpZicsaW1hZ2VCdG5OZXh0OidpbWFnZXMvbGlnaHRib3gtYnRuLW5leHQuZ2lmJyxpbWFnZUJ0bkNsb3NlOidpbWFnZXMvbGlnaHRib3gtYnRuLWNsb3NlLmdpZicsaW1hZ2VCbGFuazonaW1hZ2VzL2xpZ2h0Ym94LWJsYW5rLmdpZicsY29udGFpbmVyQm9yZGVyU2l6ZToxMCxjb250YWluZXJSZXNpemVTcGVlZDo0MDAsdHh0SW1hZ2U6J0ltYWdlJyx0eHRPZjonb2YnLGtleVRvQ2xvc2U6J2MnLGtleVRvUHJldjoncCcsa2V5VG9OZXh0OiduJyxpbWFnZUFycmF5OltdLGFjdGl2ZUltYWdlOjB9LHNldHRpbmdzKTt2YXIgalF1ZXJ5TWF0Y2hlZE9iaj10aGlzO2Z1bmN0aW9uIF9pbml0aWFsaXplKCl7X3N0YXJ0KHRoaXMsalF1ZXJ5TWF0Y2hlZE9iaik7cmV0dXJuIGZhbHNlO30NCmZ1bmN0aW9uIF9zdGFydChvYmpDbGlja2VkLGpRdWVyeU1hdGNoZWRPYmopeyQoJ2VtYmVkLCBvYmplY3QsIHNlbGVjdCcpLmNzcyh7J3Zpc2liaWxpdHknOidoaWRkZW4nfSk7X3NldF9pbnRlcmZhY2UoKTtzZXR0aW5ncy5pbWFnZUFycmF5Lmxlbmd0aD0wO3NldHRpbmdzLmFjdGl2ZUltYWdlPTA7aWYoalF1ZXJ5TWF0Y2hlZE9iai5sZW5ndGg9PTEpe3NldHRpbmdzLmltYWdlQXJyYXkucHVzaChuZXcgQXJyYXkob2JqQ2xpY2tlZC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSxvYmpDbGlja2VkLmdldEF0dHJpYnV0ZSgndGl0bGUnKSkpO31lbHNle2Zvcih2YXIgaT0wO2k8alF1ZXJ5TWF0Y2hlZE9iai5sZW5ndGg7aSsrKXtzZXR0aW5ncy5pbWFnZUFycmF5LnB1c2gobmV3IEFycmF5KGpRdWVyeU1hdGNoZWRPYmpbaV0uZ2V0QXR0cmlidXRlKCdocmVmJyksalF1ZXJ5TWF0Y2hlZE9ialtpXS5nZXRBdHRyaWJ1dGUoJ3RpdGxlJykpKTt9fQ0Kd2hpbGUoc2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZV1bMF0hPW9iakNsaWNrZWQuZ2V0QXR0cmlidXRlKCdocmVmJykpe3NldHRpbmdzLmFjdGl2ZUltYWdlKys7fQ0KX3NldF9pbWFnZV90b192aWV3KCk7fQ0KZnVuY3Rpb24gX3NldF9pbnRlcmZhY2UoKXskKCdib2R5JykuYXBwZW5kKCc8ZGl2IGlkPSJqcXVlcnktb3ZlcmxheSI+PC9kaXY+PGRpdiBpZD0ianF1ZXJ5LWxpZ2h0Ym94Ij48ZGl2IGlkPSJsaWdodGJveC1jb250YWluZXItaW1hZ2UtYm94Ij48ZGl2IGlkPSJsaWdodGJveC1jb250YWluZXItaW1hZ2UiPjxpbWcgaWQ9ImxpZ2h0Ym94LWltYWdlIj48ZGl2IHN0eWxlPSIiIGlkPSJsaWdodGJveC1uYXYiPjxhIGhyZWY9IiMiIGlkPSJsaWdodGJveC1uYXYtYnRuUHJldiI+PC9hPjxhIGhyZWY9IiMiIGlkPSJsaWdodGJveC1uYXYtYnRuTmV4dCI+PC9hPjwvZGl2PjxkaXYgaWQ9ImxpZ2h0Ym94LWxvYWRpbmciPjxhIGhyZWY9IiMiIGlkPSJsaWdodGJveC1sb2FkaW5nLWxpbmsiPjxpbWcgc3JjPSInK3NldHRpbmdzLmltYWdlTG9hZGluZysnIj48L2E+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBpZD0ibGlnaHRib3gtY29udGFpbmVyLWltYWdlLWRhdGEtYm94Ij48ZGl2IGlkPSJsaWdodGJveC1jb250YWluZXItaW1hZ2UtZGF0YSI+PGRpdiBpZD0ibGlnaHRib3gtaW1hZ2UtZGV0YWlscyI+PHNwYW4gaWQ9ImxpZ2h0Ym94LWltYWdlLWRldGFpbHMtY2FwdGlvbiI+PC9zcGFuPjxzcGFuIGlkPSJsaWdodGJveC1pbWFnZS1kZXRhaWxzLWN1cnJlbnROdW1iZXIiPjwvc3Bhbj48L2Rpdj48ZGl2IGlkPSJsaWdodGJveC1zZWNOYXYiPjxhIGhyZWY9IiMiIGlkPSJsaWdodGJveC1zZWNOYXYtYnRuQ2xvc2UiPjxpbWcgc3JjPSInK3NldHRpbmdzLmltYWdlQnRuQ2xvc2UrJyI+PC9hPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PicpO3ZhciBhcnJQYWdlU2l6ZXM9X19fZ2V0UGFnZVNpemUoKTskKCcjanF1ZXJ5LW92ZXJsYXknKS5jc3Moe2JhY2tncm91bmRDb2xvcjpzZXR0aW5ncy5vdmVybGF5QmdDb2xvcixvcGFjaXR5OnNldHRpbmdzLm92ZXJsYXlPcGFjaXR5LHdpZHRoOmFyclBhZ2VTaXplc1swXSxoZWlnaHQ6YXJyUGFnZVNpemVzWzFdfSkuZmFkZUluKCk7dmFyIGFyclBhZ2VTY3JvbGw9X19fZ2V0UGFnZVNjcm9sbCgpOyQoJyNqcXVlcnktbGlnaHRib3gnKS5jc3Moe3RvcDphcnJQYWdlU2Nyb2xsWzFdKyhhcnJQYWdlU2l6ZXNbM10vMTApLGxlZnQ6YXJyUGFnZVNjcm9sbFswXX0pLnNob3coKTskKCcjanF1ZXJ5LW92ZXJsYXksI2pxdWVyeS1saWdodGJveCcpLmNsaWNrKGZ1bmN0aW9uKCl7X2ZpbmlzaCgpO30pOyQoJyNsaWdodGJveC1sb2FkaW5nLWxpbmssI2xpZ2h0Ym94LXNlY05hdi1idG5DbG9zZScpLmNsaWNrKGZ1bmN0aW9uKCl7X2ZpbmlzaCgpO3JldHVybiBmYWxzZTt9KTskKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uKCl7dmFyIGFyclBhZ2VTaXplcz1fX19nZXRQYWdlU2l6ZSgpOyQoJyNqcXVlcnktb3ZlcmxheScpLmNzcyh7d2lkdGg6YXJyUGFnZVNpemVzWzBdLGhlaWdodDphcnJQYWdlU2l6ZXNbMV19KTt2YXIgYXJyUGFnZVNjcm9sbD1fX19nZXRQYWdlU2Nyb2xsKCk7JCgnI2pxdWVyeS1saWdodGJveCcpLmNzcyh7dG9wOmFyclBhZ2VTY3JvbGxbMV0rKGFyclBhZ2VTaXplc1szXS8xMCksbGVmdDphcnJQYWdlU2Nyb2xsWzBdfSk7fSk7fQ0KZnVuY3Rpb24gX3NldF9pbWFnZV90b192aWV3KCl7JCgnI2xpZ2h0Ym94LWxvYWRpbmcnKS5zaG93KCk7aWYoc2V0dGluZ3MuZml4ZWROYXZpZ2F0aW9uKXskKCcjbGlnaHRib3gtaW1hZ2UsI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCwjbGlnaHRib3gtaW1hZ2UtZGV0YWlscy1jdXJyZW50TnVtYmVyJykuaGlkZSgpO31lbHNleyQoJyNsaWdodGJveC1pbWFnZSwjbGlnaHRib3gtbmF2LCNsaWdodGJveC1uYXYtYnRuUHJldiwjbGlnaHRib3gtbmF2LWJ0bk5leHQsI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCwjbGlnaHRib3gtaW1hZ2UtZGV0YWlscy1jdXJyZW50TnVtYmVyJykuaGlkZSgpO30NCnZhciBvYmpJbWFnZVByZWxvYWRlcj1uZXcgSW1hZ2UoKTtvYmpJbWFnZVByZWxvYWRlci5vbmxvYWQ9ZnVuY3Rpb24oKXskKCcjbGlnaHRib3gtaW1hZ2UnKS5hdHRyKCdzcmMnLHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2VdWzBdKTtfcmVzaXplX2NvbnRhaW5lcl9pbWFnZV9ib3gob2JqSW1hZ2VQcmVsb2FkZXIud2lkdGgsb2JqSW1hZ2VQcmVsb2FkZXIuaGVpZ2h0KTtvYmpJbWFnZVByZWxvYWRlci5vbmxvYWQ9ZnVuY3Rpb24oKXt9O307b2JqSW1hZ2VQcmVsb2FkZXIuc3JjPXNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2VdWzBdO307ZnVuY3Rpb24gX3Jlc2l6ZV9jb250YWluZXJfaW1hZ2VfYm94KGludEltYWdlV2lkdGgsaW50SW1hZ2VIZWlnaHQpe3ZhciBpbnRDdXJyZW50V2lkdGg9JCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3gnKS53aWR0aCgpO3ZhciBpbnRDdXJyZW50SGVpZ2h0PSQoJyNsaWdodGJveC1jb250YWluZXItaW1hZ2UtYm94JykuaGVpZ2h0KCk7dmFyIGludFdpZHRoPShpbnRJbWFnZVdpZHRoKyhzZXR0aW5ncy5jb250YWluZXJCb3JkZXJTaXplKjIpKTt2YXIgaW50SGVpZ2h0PShpbnRJbWFnZUhlaWdodCsoc2V0dGluZ3MuY29udGFpbmVyQm9yZGVyU2l6ZSoyKSk7dmFyIGludERpZmZXPWludEN1cnJlbnRXaWR0aC1pbnRXaWR0aDt2YXIgaW50RGlmZkg9aW50Q3VycmVudEhlaWdodC1pbnRIZWlnaHQ7JCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3gnKS5hbmltYXRlKHt3aWR0aDppbnRXaWR0aCxoZWlnaHQ6aW50SGVpZ2h0fSxzZXR0aW5ncy5jb250YWluZXJSZXNpemVTcGVlZCxmdW5jdGlvbigpe19zaG93X2ltYWdlKCk7fSk7aWYoKGludERpZmZXPT0wKSYmKGludERpZmZIPT0wKSl7aWYoJC5icm93c2VyLm1zaWUpe19fX3BhdXNlKDI1MCk7fWVsc2V7X19fcGF1c2UoMTAwKTt9fQ0KJCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCcpLmNzcyh7d2lkdGg6aW50SW1hZ2VXaWR0aH0pOyQoJyNsaWdodGJveC1uYXYtYnRuUHJldiwjbGlnaHRib3gtbmF2LWJ0bk5leHQnKS5jc3Moe2hlaWdodDppbnRJbWFnZUhlaWdodCsoc2V0dGluZ3MuY29udGFpbmVyQm9yZGVyU2l6ZSoyKX0pO307ZnVuY3Rpb24gX3Nob3dfaW1hZ2UoKXskKCcjbGlnaHRib3gtbG9hZGluZycpLmhpZGUoKTskKCcjbGlnaHRib3gtaW1hZ2UnKS5mYWRlSW4oZnVuY3Rpb24oKXtfc2hvd19pbWFnZV9kYXRhKCk7X3NldF9uYXZpZ2F0aW9uKCk7fSk7X3ByZWxvYWRfbmVpZ2hib3JfaW1hZ2VzKCk7fTtmdW5jdGlvbiBfc2hvd19pbWFnZV9kYXRhKCl7JCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCcpLnNsaWRlRG93bignZmFzdCcpOyQoJyNsaWdodGJveC1pbWFnZS1kZXRhaWxzLWNhcHRpb24nKS5oaWRlKCk7aWYoc2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZV1bMV0peyQoJyNsaWdodGJveC1pbWFnZS1kZXRhaWxzLWNhcHRpb24nKS5odG1sKHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2VdWzFdKS5zaG93KCk7fQ0KaWYoc2V0dGluZ3MuaW1hZ2VBcnJheS5sZW5ndGg+MSl7JCgnI2xpZ2h0Ym94LWltYWdlLWRldGFpbHMtY3VycmVudE51bWJlcicpLmh0bWwoc2V0dGluZ3MudHh0SW1hZ2UrJyAnKyhzZXR0aW5ncy5hY3RpdmVJbWFnZSsxKSsnICcrc2V0dGluZ3MudHh0T2YrJyAnK3NldHRpbmdzLmltYWdlQXJyYXkubGVuZ3RoKS5zaG93KCk7fX0NCmZ1bmN0aW9uIF9zZXRfbmF2aWdhdGlvbigpeyQoJyNsaWdodGJveC1uYXYnKS5zaG93KCk7JCgnI2xpZ2h0Ym94LW5hdi1idG5QcmV2LCNsaWdodGJveC1uYXYtYnRuTmV4dCcpLmNzcyh7J2JhY2tncm91bmQnOid0cmFuc3BhcmVudCB1cmwoJytzZXR0aW5ncy5pbWFnZUJsYW5rKycpIG5vLXJlcGVhdCd9KTtpZihzZXR0aW5ncy5hY3RpdmVJbWFnZSE9MCl7aWYoc2V0dGluZ3MuZml4ZWROYXZpZ2F0aW9uKXskKCcjbGlnaHRib3gtbmF2LWJ0blByZXYnKS5jc3MoeydiYWNrZ3JvdW5kJzondXJsKCcrc2V0dGluZ3MuaW1hZ2VCdG5QcmV2KycpIGxlZnQgMTUlIG5vLXJlcGVhdCd9KS51bmJpbmQoKS5iaW5kKCdjbGljaycsZnVuY3Rpb24oKXtzZXR0aW5ncy5hY3RpdmVJbWFnZT1zZXR0aW5ncy5hY3RpdmVJbWFnZS0xO19zZXRfaW1hZ2VfdG9fdmlldygpO3JldHVybiBmYWxzZTt9KTt9ZWxzZXskKCcjbGlnaHRib3gtbmF2LWJ0blByZXYnKS51bmJpbmQoKS5ob3ZlcihmdW5jdGlvbigpeyQodGhpcykuY3NzKHsnYmFja2dyb3VuZCc6J3VybCgnK3NldHRpbmdzLmltYWdlQnRuUHJldisnKSBsZWZ0IDE1JSBuby1yZXBlYXQnfSk7fSxmdW5jdGlvbigpeyQodGhpcykuY3NzKHsnYmFja2dyb3VuZCc6J3RyYW5zcGFyZW50IHVybCgnK3NldHRpbmdzLmltYWdlQmxhbmsrJykgbm8tcmVwZWF0J30pO30pLnNob3coKS5iaW5kKCdjbGljaycsZnVuY3Rpb24oKXtzZXR0aW5ncy5hY3RpdmVJbWFnZT1zZXR0aW5ncy5hY3RpdmVJbWFnZS0xO19zZXRfaW1hZ2VfdG9fdmlldygpO3JldHVybiBmYWxzZTt9KTt9fQ0KaWYoc2V0dGluZ3MuYWN0aXZlSW1hZ2UhPShzZXR0aW5ncy5pbWFnZUFycmF5Lmxlbmd0aC0xKSl7aWYoc2V0dGluZ3MuZml4ZWROYXZpZ2F0aW9uKXskKCcjbGlnaHRib3gtbmF2LWJ0bk5leHQnKS5jc3MoeydiYWNrZ3JvdW5kJzondXJsKCcrc2V0dGluZ3MuaW1hZ2VCdG5OZXh0KycpIHJpZ2h0IDE1JSBuby1yZXBlYXQnfSkudW5iaW5kKCkuYmluZCgnY2xpY2snLGZ1bmN0aW9uKCl7c2V0dGluZ3MuYWN0aXZlSW1hZ2U9c2V0dGluZ3MuYWN0aXZlSW1hZ2UrMTtfc2V0X2ltYWdlX3RvX3ZpZXcoKTtyZXR1cm4gZmFsc2U7fSk7fWVsc2V7JCgnI2xpZ2h0Ym94LW5hdi1idG5OZXh0JykudW5iaW5kKCkuaG92ZXIoZnVuY3Rpb24oKXskKHRoaXMpLmNzcyh7J2JhY2tncm91bmQnOid1cmwoJytzZXR0aW5ncy5pbWFnZUJ0bk5leHQrJykgcmlnaHQgMTUlIG5vLXJlcGVhdCd9KTt9LGZ1bmN0aW9uKCl7JCh0aGlzKS5jc3MoeydiYWNrZ3JvdW5kJzondHJhbnNwYXJlbnQgdXJsKCcrc2V0dGluZ3MuaW1hZ2VCbGFuaysnKSBuby1yZXBlYXQnfSk7fSkuc2hvdygpLmJpbmQoJ2NsaWNrJyxmdW5jdGlvbigpe3NldHRpbmdzLmFjdGl2ZUltYWdlPXNldHRpbmdzLmFjdGl2ZUltYWdlKzE7X3NldF9pbWFnZV90b192aWV3KCk7cmV0dXJuIGZhbHNlO30pO319DQpfZW5hYmxlX2tleWJvYXJkX25hdmlnYXRpb24oKTt9DQpmdW5jdGlvbiBfZW5hYmxlX2tleWJvYXJkX25hdmlnYXRpb24oKXskKGRvY3VtZW50KS5rZXlkb3duKGZ1bmN0aW9uKG9iakV2ZW50KXtfa2V5Ym9hcmRfYWN0aW9uKG9iakV2ZW50KTt9KTt9DQpmdW5jdGlvbiBfZGlzYWJsZV9rZXlib2FyZF9uYXZpZ2F0aW9uKCl7JChkb2N1bWVudCkudW5iaW5kKCk7fQ0KZnVuY3Rpb24gX2tleWJvYXJkX2FjdGlvbihvYmpFdmVudCl7aWYob2JqRXZlbnQ9PW51bGwpe2tleWNvZGU9ZXZlbnQua2V5Q29kZTtlc2NhcGVLZXk9Mjc7fWVsc2V7a2V5Y29kZT1vYmpFdmVudC5rZXlDb2RlO2VzY2FwZUtleT1vYmpFdmVudC5ET01fVktfRVNDQVBFO30NCmtleT1TdHJpbmcuZnJvbUNoYXJDb2RlKGtleWNvZGUpLnRvTG93ZXJDYXNlKCk7aWYoKGtleT09c2V0dGluZ3Mua2V5VG9DbG9zZSl8fChrZXk9PSd4Jyl8fChrZXljb2RlPT1lc2NhcGVLZXkpKXtfZmluaXNoKCk7fQ0KaWYoKGtleT09c2V0dGluZ3Mua2V5VG9QcmV2KXx8KGtleWNvZGU9PTM3KSl7aWYoc2V0dGluZ3MuYWN0aXZlSW1hZ2UhPTApe3NldHRpbmdzLmFjdGl2ZUltYWdlPXNldHRpbmdzLmFjdGl2ZUltYWdlLTE7X3NldF9pbWFnZV90b192aWV3KCk7X2Rpc2FibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbigpO319DQppZigoa2V5PT1zZXR0aW5ncy5rZXlUb05leHQpfHwoa2V5Y29kZT09MzkpKXtpZihzZXR0aW5ncy5hY3RpdmVJbWFnZSE9KHNldHRpbmdzLmltYWdlQXJyYXkubGVuZ3RoLTEpKXtzZXR0aW5ncy5hY3RpdmVJbWFnZT1zZXR0aW5ncy5hY3RpdmVJbWFnZSsxO19zZXRfaW1hZ2VfdG9fdmlldygpO19kaXNhYmxlX2tleWJvYXJkX25hdmlnYXRpb24oKTt9fX0NCmZ1bmN0aW9uIF9wcmVsb2FkX25laWdoYm9yX2ltYWdlcygpe2lmKChzZXR0aW5ncy5pbWFnZUFycmF5Lmxlbmd0aC0xKT5zZXR0aW5ncy5hY3RpdmVJbWFnZSl7b2JqTmV4dD1uZXcgSW1hZ2UoKTtvYmpOZXh0LnNyYz1zZXR0aW5ncy5pbWFnZUFycmF5W3NldHRpbmdzLmFjdGl2ZUltYWdlKzFdWzBdO30NCmlmKHNldHRpbmdzLmFjdGl2ZUltYWdlPjApe29ialByZXY9bmV3IEltYWdlKCk7b2JqUHJldi5zcmM9c2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZS0xXVswXTt9fQ0KZnVuY3Rpb24gX2ZpbmlzaCgpeyQoJyNqcXVlcnktbGlnaHRib3gnKS5yZW1vdmUoKTskKCcjanF1ZXJ5LW92ZXJsYXknKS5mYWRlT3V0KGZ1bmN0aW9uKCl7JCgnI2pxdWVyeS1vdmVybGF5JykucmVtb3ZlKCk7fSk7JCgnZW1iZWQsIG9iamVjdCwgc2VsZWN0JykuY3NzKHsndmlzaWJpbGl0eSc6J3Zpc2libGUnfSk7fQ0KZnVuY3Rpb24gX19fZ2V0UGFnZVNpemUoKXt2YXIgeFNjcm9sbCx5U2Nyb2xsO2lmKHdpbmRvdy5pbm5lckhlaWdodCYmd2luZG93LnNjcm9sbE1heFkpe3hTY3JvbGw9d2luZG93LmlubmVyV2lkdGgrd2luZG93LnNjcm9sbE1heFg7eVNjcm9sbD13aW5kb3cuaW5uZXJIZWlnaHQrd2luZG93LnNjcm9sbE1heFk7fWVsc2UgaWYoZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQ+ZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpe3hTY3JvbGw9ZG9jdW1lbnQuYm9keS5zY3JvbGxXaWR0aDt5U2Nyb2xsPWRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0O31lbHNle3hTY3JvbGw9ZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aDt5U2Nyb2xsPWRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0O30NCnZhciB3aW5kb3dXaWR0aCx3aW5kb3dIZWlnaHQ7aWYoc2VsZi5pbm5lckhlaWdodCl7aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKXt3aW5kb3dXaWR0aD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7fWVsc2V7d2luZG93V2lkdGg9c2VsZi5pbm5lcldpZHRoO30NCndpbmRvd0hlaWdodD1zZWxmLmlubmVySGVpZ2h0O31lbHNlIGlmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCl7d2luZG93V2lkdGg9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO3dpbmRvd0hlaWdodD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O31lbHNlIGlmKGRvY3VtZW50LmJvZHkpe3dpbmRvd1dpZHRoPWRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7d2luZG93SGVpZ2h0PWRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0O30NCmlmKHlTY3JvbGw8d2luZG93SGVpZ2h0KXtwYWdlSGVpZ2h0PXdpbmRvd0hlaWdodDt9ZWxzZXtwYWdlSGVpZ2h0PXlTY3JvbGw7fQ0KaWYoeFNjcm9sbDx3aW5kb3dXaWR0aCl7cGFnZVdpZHRoPXhTY3JvbGw7fWVsc2V7cGFnZVdpZHRoPXdpbmRvd1dpZHRoO30NCmFycmF5UGFnZVNpemU9bmV3IEFycmF5KHBhZ2VXaWR0aCxwYWdlSGVpZ2h0LHdpbmRvd1dpZHRoLHdpbmRvd0hlaWdodCk7cmV0dXJuIGFycmF5UGFnZVNpemU7fTtmdW5jdGlvbiBfX19nZXRQYWdlU2Nyb2xsKCl7dmFyIHhTY3JvbGwseVNjcm9sbDtpZihzZWxmLnBhZ2VZT2Zmc2V0KXt5U2Nyb2xsPXNlbGYucGFnZVlPZmZzZXQ7eFNjcm9sbD1zZWxmLnBhZ2VYT2Zmc2V0O31lbHNlIGlmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCl7eVNjcm9sbD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO3hTY3JvbGw9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7fWVsc2UgaWYoZG9jdW1lbnQuYm9keSl7eVNjcm9sbD1kb2N1bWVudC5ib2R5LnNjcm9sbFRvcDt4U2Nyb2xsPWRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDt9DQphcnJheVBhZ2VTY3JvbGw9bmV3IEFycmF5KHhTY3JvbGwseVNjcm9sbCk7cmV0dXJuIGFycmF5UGFnZVNjcm9sbDt9O2Z1bmN0aW9uIF9fX3BhdXNlKG1zKXt2YXIgZGF0ZT1uZXcgRGF0ZSgpO2N1ckRhdGU9bnVsbDtkb3t2YXIgY3VyRGF0ZT1uZXcgRGF0ZSgpO30NCndoaWxlKGN1ckRhdGUtZGF0ZTxtcyk7fTtyZXR1cm4gdGhpcy51bmJpbmQoJ2NsaWNrJykuY2xpY2soX2luaXRpYWxpemUpO307fSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/jquery.lightbox-0.5.pack.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBqUXVlcnkgbGlnaHRCb3ggcGx1Z2luDQogKiBUaGlzIGpRdWVyeSBwbHVnaW4gd2FzIGluc3BpcmVkIGFuZCBiYXNlZCBvbiBMaWdodGJveCAyIGJ5IExva2VzaCBEaGFrYXIgKGh0dHA6Ly93d3cuaHVkZGxldG9nZXRoZXIuY29tL3Byb2plY3RzL2xpZ2h0Ym94Mi8pDQogKiBhbmQgYWRhcHRlZCB0byBtZSBmb3IgdXNlIGxpa2UgYSBwbHVnaW4gZnJvbSBqUXVlcnkuDQogKiBAbmFtZSBqcXVlcnktbGlnaHRib3gtMC41LmpzDQogKiBAYXV0aG9yIExlYW5kcm8gVmllaXJhIFBpbmhvIC0gaHR0cDovL2xlYW5kcm92aWVpcmEuY29tDQogKiBAdmVyc2lvbiAwLjUNCiAqIEBkYXRlIEFwcmlsIDExLCAyMDA4DQogKiBAY2F0ZWdvcnkgalF1ZXJ5IHBsdWdpbg0KICogQGNvcHlyaWdodCAoYykgMjAwOCBMZWFuZHJvIFZpZWlyYSBQaW5obyAobGVhbmRyb3ZpZWlyYS5jb20pDQogKiBAbGljZW5zZSBDQ0F0dHJpYnV0aW9uLVNoYXJlQWxpa2UgMi41IEJyYXppbCAtIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzIuNS9ici9kZWVkLmVuX1VTDQogKiBAZXhhbXBsZSBWaXNpdCBodHRwOi8vbGVhbmRyb3ZpZWlyYS5jb20vcHJvamVjdHMvanF1ZXJ5L2xpZ2h0Ym94LyBmb3IgbW9yZSBpbmZvcm1hdGlvbnMgYWJvdXQgdGhpcyBqUXVlcnkgcGx1Z2luDQogKi8NCmV2YWwoZnVuY3Rpb24ocCxhLGMsayxlLHIpe2U9ZnVuY3Rpb24oYyl7cmV0dXJuKGM8YT8nJzplKHBhcnNlSW50KGMvYSkpKSsoKGM9YyVhKT4zNT9TdHJpbmcuZnJvbUNoYXJDb2RlKGMrMjkpOmMudG9TdHJpbmcoMzYpKX07aWYoIScnLnJlcGxhY2UoL14vLFN0cmluZykpe3doaWxlKGMtLSlyW2UoYyldPWtbY118fGUoYyk7az1bZnVuY3Rpb24oZSl7cmV0dXJuIHJbZV19XTtlPWZ1bmN0aW9uKCl7cmV0dXJuJ1xcdysnfTtjPTF9O3doaWxlKGMtLSlpZihrW2NdKXA9cC5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcYicrZShjKSsnXFxiJywnZycpLGtbY10pO3JldHVybiBwfSgnKDYoJCl7JC4yTi4zZz02KDQpezQ9MjMuMkgoezJCOlwnIzM0XCcsMmc6MC44LDFkOkYsMU06XCcxOC81LTMzLVkuMTZcJywxdjpcJzE4LzUtMXUtMlEuMTZcJywxRTpcJzE4LzUtMXUtMkwuMTZcJywxVzpcJzE4LzUtMXUtMkkuMTZcJywxOTpcJzE4LzUtMkYuMTZcJywxZjoxMCwyQTozZCwyczpcJzFqXCcsMm86XCczMlwnLDJqOlwnY1wnLDJmOlwncFwnLDJkOlwnblwnLGg6W10sOTowfSw0KTtmIEk9Tjs2IDIwKCl7MVgoTixJKTt1IEZ9NiAxWCgxZSxJKXskKFwnMVUsIDFTLCAxUlwnKS5sKHtcJzFRXCc6XCcyRVwnfSk7MU8oKTs0LmguQj0wOzQuOT0wOzcoSS5CPT0xKXs0LmguMUoodiAxbSgxZS4xNyhcJ0pcJyksMWUuMTcoXCcydlwnKSkpfWp7MzYoZiBpPTA7aTxJLkI7aSsrKXs0LmguMUoodiAxbShJW2ldLjE3KFwnSlwnKSxJW2ldLjE3KFwnMnZcJykpKX19Mm4oNC5oWzQuOV1bMF0hPTFlLjE3KFwnSlwnKSl7NC45Kyt9RCgpfTYgMU8oKXskKFwnbVwnKS4zMShcJzxlIGc9InEtMTMiPjwvZT48ZSBnPSJxLTUiPjxlIGc9IjUtcy1iLXciPjxlIGc9IjUtcy1iIj48MXcgZz0iNS1iIj48ZSAyVj0iIiBnPSI1LWsiPjxhIEo9IiMiIGc9IjUtay1WIj48L2E+PGEgSj0iIyIgZz0iNS1rLVgiPjwvYT48L2U+PGUgZz0iNS1ZIj48YSBKPSIjIiBnPSI1LVktMjkiPjwxdyBXPSJcJys0LjFNK1wnIj48L2E+PC9lPjwvZT48L2U+PGUgZz0iNS1zLWItVC13Ij48ZSBnPSI1LXMtYi1UIj48ZSBnPSI1LWItQSI+PDFpIGc9IjUtYi1BLTF0Ij48LzFpPjwxaSBnPSI1LWItQS0xZyI+PC8xaT48L2U+PGUgZz0iNS0xcyI+PGEgSj0iIyIgZz0iNS0xcy0yMiI+PDF3IFc9IlwnKzQuMVcrXCciPjwvYT48L2U+PC9lPjwvZT48L2U+XCcpO2Ygej0xRCgpOyQoXCcjcS0xM1wnKS5sKHsySzo0LjJCLDJKOjQuMmcsUzp6WzBdLFA6elsxXX0pLjFWKCk7ZiBSPTFwKCk7JChcJyNxLTVcJykubCh7MVQ6UlsxXSsoelszXS8xMCksMWM6UlswXX0pLkUoKTskKFwnI3EtMTMsI3EtNVwnKS5DKDYoKXsxYSgpfSk7JChcJyM1LVktMjksIzUtMXMtMjJcJykuQyg2KCl7MWEoKTt1IEZ9KTskKEcpLjJHKDYoKXtmIHo9MUQoKTskKFwnI3EtMTNcJykubCh7Uzp6WzBdLFA6elsxXX0pO2YgUj0xcCgpOyQoXCcjcS01XCcpLmwoezFUOlJbMV0rKHpbM10vMTApLDFjOlJbMF19KX0pfTYgRCgpeyQoXCcjNS1ZXCcpLkUoKTs3KDQuMWQpeyQoXCcjNS1iLCM1LXMtYi1ULXcsIzUtYi1BLTFnXCcpLjFiKCl9anskKFwnIzUtYiwjNS1rLCM1LWstViwjNS1rLVgsIzUtcy1iLVQtdywjNS1iLUEtMWdcJykuMWIoKX1mIFE9diAxaigpO1EuMVA9NigpeyQoXCcjNS1iXCcpLjJEKFwnV1wnLDQuaFs0LjldWzBdKTsxTihRLlMsUS5QKTtRLjFQPTYoKXt9fTtRLlc9NC5oWzQuOV1bMF19OzYgMU4oMW8sMXIpe2YgMUw9JChcJyM1LXMtYi13XCcpLlMoKTtmIDFLPSQoXCcjNS1zLWItd1wnKS5QKCk7ZiAxbj0oMW8rKDQuMWYqMikpO2YgMXk9KDFyKyg0LjFmKjIpKTtmIDFJPTFMLTFuO2YgMno9MUstMXk7JChcJyM1LXMtYi13XCcpLjNmKHtTOjFuLFA6MXl9LDQuMkEsNigpezJ5KCl9KTs3KCgxST09MCkmJigyej09MCkpezcoJC4zZS4zYyl7MUgoM2IpfWp7MUgoM2EpfX0kKFwnIzUtcy1iLVQtd1wnKS5sKHtTOjFvfSk7JChcJyM1LWstViwjNS1rLVhcJykubCh7UDoxcisoNC4xZioyKX0pfTs2IDJ5KCl7JChcJyM1LVlcJykuMWIoKTskKFwnIzUtYlwnKS4xVig2KCl7MnUoKTsydCgpfSk7MnIoKX07NiAydSgpeyQoXCcjNS1zLWItVC13XCcpLjM4KFwnMzVcJyk7JChcJyM1LWItQS0xdFwnKS4xYigpOzcoNC5oWzQuOV1bMV0peyQoXCcjNS1iLUEtMXRcJykuMnAoNC5oWzQuOV1bMV0pLkUoKX03KDQuaC5CPjEpeyQoXCcjNS1iLUEtMWdcJykuMnAoNC4ycytcJyBcJysoNC45KzEpK1wnIFwnKzQuMm8rXCcgXCcrNC5oLkIpLkUoKX19NiAydCgpeyQoXCcjNS1rXCcpLkUoKTskKFwnIzUtay1WLCM1LWstWFwnKS5sKHtcJ0tcJzpcJzFDIE0oXCcrNC4xOStcJykgTC1PXCd9KTs3KDQuOSE9MCl7Nyg0LjFkKXskKFwnIzUtay1WXCcpLmwoe1wnS1wnOlwnTShcJys0LjF2K1wnKSAxYyAxNSUgTC1PXCd9KS4xMSgpLjFrKFwnQ1wnLDYoKXs0Ljk9NC45LTE7RCgpO3UgRn0pfWp7JChcJyM1LWstVlwnKS4xMSgpLjJtKDYoKXskKE4pLmwoe1wnS1wnOlwnTShcJys0LjF2K1wnKSAxYyAxNSUgTC1PXCd9KX0sNigpeyQoTikubCh7XCdLXCc6XCcxQyBNKFwnKzQuMTkrXCcpIEwtT1wnfSl9KS5FKCkuMWsoXCdDXCcsNigpezQuOT00LjktMTtEKCk7dSBGfSl9fTcoNC45IT0oNC5oLkItMSkpezcoNC4xZCl7JChcJyM1LWstWFwnKS5sKHtcJ0tcJzpcJ00oXCcrNC4xRStcJykgMmwgMTUlIEwtT1wnfSkuMTEoKS4xayhcJ0NcJyw2KCl7NC45PTQuOSsxO0QoKTt1IEZ9KX1qeyQoXCcjNS1rLVhcJykuMTEoKS4ybSg2KCl7JChOKS5sKHtcJ0tcJzpcJ00oXCcrNC4xRStcJykgMmwgMTUlIEwtT1wnfSl9LDYoKXskKE4pLmwoe1wnS1wnOlwnMUMgTShcJys0LjE5K1wnKSBMLU9cJ30pfSkuRSgpLjFrKFwnQ1wnLDYoKXs0Ljk9NC45KzE7RCgpO3UgRn0pfX0yaygpfTYgMmsoKXskKGQpLjMwKDYoMTIpezJpKDEyKX0pfTYgMUcoKXskKGQpLjExKCl9NiAyaSgxMil7NygxMj09Mmgpe1U9MlouMmU7MXg9Mjd9antVPTEyLjJlOzF4PTEyLjJZfTE0PTJYLjJXKFUpLjJVKCk7NygoMTQ9PTQuMmopfHwoMTQ9PVwneFwnKXx8KFU9PTF4KSl7MWEoKX03KCgxND09NC4yZil8fChVPT0zNykpezcoNC45IT0wKXs0Ljk9NC45LTE7RCgpOzFHKCl9fTcoKDE0PT00LjJkKXx8KFU9PTM5KSl7Nyg0LjkhPSg0LmguQi0xKSl7NC45PTQuOSsxO0QoKTsxRygpfX19NiAycigpezcoKDQuaC5CLTEpPjQuOSl7MmM9diAxaigpOzJjLlc9NC5oWzQuOSsxXVswXX03KDQuOT4wKXsyYj12IDFqKCk7MmIuVz00LmhbNC45LTFdWzBdfX02IDFhKCl7JChcJyNxLTVcJykuMmEoKTskKFwnI3EtMTNcJykuMlQoNigpeyQoXCcjcS0xM1wnKS4yYSgpfSk7JChcJzFVLCAxUywgMVJcJykubCh7XCcxUVwnOlwnMlNcJ30pfTYgMUQoKXtmIG8scjs3KEcuMWgmJkcuMjgpe289Ry4yNitHLjJSO3I9Ry4xaCtHLjI4fWogNyhkLm0uMjU+ZC5tLjI0KXtvPWQubS4yUDtyPWQubS4yNX1qe289ZC5tLjJPO3I9ZC5tLjI0fWYgeSxIOzcoWi4xaCl7NyhkLnQuMWwpe3k9ZC50LjFsfWp7eT1aLjI2fUg9Wi4xaH1qIDcoZC50JiZkLnQuMUEpe3k9ZC50LjFsO0g9ZC50LjFBfWogNyhkLm0pe3k9ZC5tLjFsO0g9ZC5tLjFBfTcocjxIKXsxej1IfWp7MXo9cn03KG88eSl7MUI9b31qezFCPXl9MjE9diAxbSgxQiwxeix5LEgpO3UgMjF9OzYgMXAoKXtmIG8scjs3KFouMVope3I9Wi4xWjtvPVouMk19aiA3KGQudCYmZC50LjFGKXtyPWQudC4xRjtvPWQudC4xWX1qIDcoZC5tKXtyPWQubS4xRjtvPWQubS4xWX0ycT12IDFtKG8scik7dSAycX07NiAxSCgyQyl7ZiAyeD12IDJ3KCk7MXE9Mmg7M2h7ZiAxcT12IDJ3KCl9Mm4oMXEtMng8MkMpfTt1IE4uMTEoXCdDXCcpLkMoMjApfX0pKDIzKTsnLDYyLDIwNCwnfHx8fHNldHRpbmdzfGxpZ2h0Ym94fGZ1bmN0aW9ufGlmfHxhY3RpdmVJbWFnZXx8aW1hZ2V8fGRvY3VtZW50fGRpdnx2YXJ8aWR8aW1hZ2VBcnJheXx8ZWxzZXxuYXZ8Y3NzfGJvZHl8fHhTY3JvbGx8fGpxdWVyeXx5U2Nyb2xsfGNvbnRhaW5lcnxkb2N1bWVudEVsZW1lbnR8cmV0dXJufG5ld3xib3h8fHdpbmRvd1dpZHRofGFyclBhZ2VTaXplc3xkZXRhaWxzfGxlbmd0aHxjbGlja3xfc2V0X2ltYWdlX3RvX3ZpZXd8c2hvd3xmYWxzZXx3aW5kb3d8d2luZG93SGVpZ2h0fGpRdWVyeU1hdGNoZWRPYmp8aHJlZnxiYWNrZ3JvdW5kfG5vfHVybHx0aGlzfHJlcGVhdHxoZWlnaHR8b2JqSW1hZ2VQcmVsb2FkZXJ8YXJyUGFnZVNjcm9sbHx3aWR0aHxkYXRhfGtleWNvZGV8YnRuUHJldnxzcmN8YnRuTmV4dHxsb2FkaW5nfHNlbGZ8fHVuYmluZHxvYmpFdmVudHxvdmVybGF5fGtleXx8Z2lmfGdldEF0dHJpYnV0ZXxpbWFnZXN8aW1hZ2VCbGFua3xfZmluaXNofGhpZGV8bGVmdHxmaXhlZE5hdmlnYXRpb258b2JqQ2xpY2tlZHxjb250YWluZXJCb3JkZXJTaXplfGN1cnJlbnROdW1iZXJ8aW5uZXJIZWlnaHR8c3BhbnxJbWFnZXxiaW5kfGNsaWVudFdpZHRofEFycmF5fGludFdpZHRofGludEltYWdlV2lkdGh8X19fZ2V0UGFnZVNjcm9sbHxjdXJEYXRlfGludEltYWdlSGVpZ2h0fHNlY05hdnxjYXB0aW9ufGJ0bnxpbWFnZUJ0blByZXZ8aW1nfGVzY2FwZUtleXxpbnRIZWlnaHR8cGFnZUhlaWdodHxjbGllbnRIZWlnaHR8cGFnZVdpZHRofHRyYW5zcGFyZW50fF9fX2dldFBhZ2VTaXplfGltYWdlQnRuTmV4dHxzY3JvbGxUb3B8X2Rpc2FibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbnxfX19wYXVzZXxpbnREaWZmV3xwdXNofGludEN1cnJlbnRIZWlnaHR8aW50Q3VycmVudFdpZHRofGltYWdlTG9hZGluZ3xfcmVzaXplX2NvbnRhaW5lcl9pbWFnZV9ib3h8X3NldF9pbnRlcmZhY2V8b25sb2FkfHZpc2liaWxpdHl8c2VsZWN0fG9iamVjdHx0b3B8ZW1iZWR8ZmFkZUlufGltYWdlQnRuQ2xvc2V8X3N0YXJ0fHNjcm9sbExlZnR8cGFnZVlPZmZzZXR8X2luaXRpYWxpemV8YXJyYXlQYWdlU2l6ZXxidG5DbG9zZXxqUXVlcnl8b2Zmc2V0SGVpZ2h0fHNjcm9sbEhlaWdodHxpbm5lcldpZHRofHxzY3JvbGxNYXhZfGxpbmt8cmVtb3ZlfG9ialByZXZ8b2JqTmV4dHxrZXlUb05leHR8a2V5Q29kZXxrZXlUb1ByZXZ8b3ZlcmxheU9wYWNpdHl8bnVsbHxfa2V5Ym9hcmRfYWN0aW9ufGtleVRvQ2xvc2V8X2VuYWJsZV9rZXlib2FyZF9uYXZpZ2F0aW9ufHJpZ2h0fGhvdmVyfHdoaWxlfHR4dE9mfGh0bWx8YXJyYXlQYWdlU2Nyb2xsfF9wcmVsb2FkX25laWdoYm9yX2ltYWdlc3x0eHRJbWFnZXxfc2V0X25hdmlnYXRpb258X3Nob3dfaW1hZ2VfZGF0YXx0aXRsZXxEYXRlfGRhdGV8X3Nob3dfaW1hZ2V8aW50RGlmZkh8Y29udGFpbmVyUmVzaXplU3BlZWR8b3ZlcmxheUJnQ29sb3J8bXN8YXR0cnxoaWRkZW58Ymxhbmt8cmVzaXplfGV4dGVuZHxjbG9zZXxvcGFjaXR5fGJhY2tncm91bmRDb2xvcnxuZXh0fHBhZ2VYT2Zmc2V0fGZufG9mZnNldFdpZHRofHNjcm9sbFdpZHRofHByZXZ8c2Nyb2xsTWF4WHx2aXNpYmxlfGZhZGVPdXR8dG9Mb3dlckNhc2V8c3R5bGV8ZnJvbUNoYXJDb2RlfFN0cmluZ3xET01fVktfRVNDQVBFfGV2ZW50fGtleWRvd258YXBwZW5kfG9mfGljb3wwMDB8ZmFzdHxmb3J8fHNsaWRlRG93bnx8MTAwfDI1MHxtc2llfDQwMHxicm93c2VyfGFuaW1hdGV8bGlnaHRCb3h8ZG8nLnNwbGl0KCd8JyksMCx7fSkp]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/addons/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/addons/pager/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/addons/pager/jquery.tablesorter.pager.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGl2LnRhYmxlc29ydGVyUGFnZXIgew0KCXBhZGRpbmc6IDEwcHggMCAxMHB4IDA7DQoJYmFja2dyb3VuZC1jb2xvcjogI0Q2RDJDMjsNCgl0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpkaXYudGFibGVzb3J0ZXJQYWdlciBzcGFuIHsNCglwYWRkaW5nOiAwIDVweCAwIDVweDsNCn0NCmRpdi50YWJsZXNvcnRlclBhZ2VyIGlucHV0LnByZXYgew0KCXdpZHRoOiBhdXRvOw0KCW1hcmdpbi1yaWdodDogMTBweDsNCn0NCmRpdi50YWJsZXNvcnRlclBhZ2VyIGlucHV0Lm5leHQgew0KCXdpZHRoOiBhdXRvOw0KCW1hcmdpbi1sZWZ0OiAxMHB4Ow0KfQ0KZGl2LnRhYmxlc29ydGVyUGFnZXIgaW5wdXQgew0KCWZvbnQtc2l6ZTogOHB4Ow0KCXdpZHRoOiA1MHB4Ow0KCWJvcmRlcjogMXB4IHNvbGlkICMzMzAwMDA7DQoJdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQoNCiAg]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/addons/pager/jquery.tablesorter.pager.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCQpIHsNCgkkLmV4dGVuZCh7DQoJCXRhYmxlc29ydGVyUGFnZXI6IG5ldyBmdW5jdGlvbigpIHsNCgkJCQ0KCQkJZnVuY3Rpb24gdXBkYXRlUGFnZURpc3BsYXkoYykgew0KCQkJCXZhciBzID0gJChjLmNzc1BhZ2VEaXNwbGF5LGMuY29udGFpbmVyKS52YWwoKGMucGFnZSsxKSArIGMuc2VwZXJhdG9yICsgYy50b3RhbFBhZ2VzKTsJDQoJCQl9DQoJCQkNCgkJCWZ1bmN0aW9uIHNldFBhZ2VTaXplKHRhYmxlLHNpemUpIHsNCgkJCQl2YXIgYyA9IHRhYmxlLmNvbmZpZzsNCgkJCQljLnNpemUgPSBzaXplOw0KCQkJCWMudG90YWxQYWdlcyA9IE1hdGguY2VpbChjLnRvdGFsUm93cyAvIGMuc2l6ZSk7DQoJCQkJYy5wYWdlclBvc2l0aW9uU2V0ID0gZmFsc2U7DQoJCQkJbW92ZVRvUGFnZSh0YWJsZSk7DQoJCQkJZml4UG9zaXRpb24odGFibGUpOw0KCQkJfQ0KCQkJDQoJCQlmdW5jdGlvbiBmaXhQb3NpdGlvbih0YWJsZSkgew0KCQkJCXZhciBjID0gdGFibGUuY29uZmlnOw0KCQkJCWlmKCFjLnBhZ2VyUG9zaXRpb25TZXQgJiYgYy5wb3NpdGlvbkZpeGVkKSB7DQoJCQkJCXZhciBjID0gdGFibGUuY29uZmlnLCBvID0gJCh0YWJsZSk7DQoJCQkJCWlmKG8ub2Zmc2V0KSB7DQoJCQkJCQljLmNvbnRhaW5lci5jc3Moew0KCQkJCQkJCXRvcDogby5vZmZzZXQoKS50b3AgKyBvLmhlaWdodCgpICsgJ3B4JywNCgkJCQkJCQlwb3NpdGlvbjogJ2Fic29sdXRlJw0KCQkJCQkJfSk7DQoJCQkJCX0NCgkJCQkJYy5wYWdlclBvc2l0aW9uU2V0ID0gdHJ1ZTsNCgkJCQl9DQoJCQl9DQoJCQkNCgkJCWZ1bmN0aW9uIG1vdmVUb0ZpcnN0UGFnZSh0YWJsZSkgew0KCQkJCXZhciBjID0gdGFibGUuY29uZmlnOw0KCQkJCWMucGFnZSA9IDA7DQoJCQkJbW92ZVRvUGFnZSh0YWJsZSk7DQoJCQl9DQoJCQkNCgkJCWZ1bmN0aW9uIG1vdmVUb0xhc3RQYWdlKHRhYmxlKSB7DQoJCQkJdmFyIGMgPSB0YWJsZS5jb25maWc7DQoJCQkJYy5wYWdlID0gKGMudG90YWxQYWdlcy0xKTsNCgkJCQltb3ZlVG9QYWdlKHRhYmxlKTsNCgkJCX0NCgkJCQ0KCQkJZnVuY3Rpb24gbW92ZVRvTmV4dFBhZ2UodGFibGUpIHsNCgkJCQl2YXIgYyA9IHRhYmxlLmNvbmZpZzsNCgkJCQljLnBhZ2UrKzsNCgkJCQlpZihjLnBhZ2UgPj0gKGMudG90YWxQYWdlcy0xKSkgew0KCQkJCQljLnBhZ2UgPSAoYy50b3RhbFBhZ2VzLTEpOw0KCQkJCX0NCgkJCQltb3ZlVG9QYWdlKHRhYmxlKTsNCgkJCX0NCgkJCQ0KCQkJZnVuY3Rpb24gbW92ZVRvUHJldlBhZ2UodGFibGUpIHsNCgkJCQl2YXIgYyA9IHRhYmxlLmNvbmZpZzsNCgkJCQljLnBhZ2UtLTsNCgkJCQlpZihjLnBhZ2UgPD0gMCkgew0KCQkJCQljLnBhZ2UgPSAwOw0KCQkJCX0NCgkJCQltb3ZlVG9QYWdlKHRhYmxlKTsNCgkJCX0NCgkJCQkJCQ0KCQkJDQoJCQlmdW5jdGlvbiBtb3ZlVG9QYWdlKHRhYmxlKSB7DQoJCQkJdmFyIGMgPSB0YWJsZS5jb25maWc7DQoJCQkJaWYoYy5wYWdlIDwgMCB8fCBjLnBhZ2UgPiAoYy50b3RhbFBhZ2VzLTEpKSB7DQoJCQkJCWMucGFnZSA9IDA7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJlbmRlclRhYmxlKHRhYmxlLGMucm93c0NvcHkpOw0KCQkJfQ0KCQkJDQoJCQlmdW5jdGlvbiByZW5kZXJUYWJsZSh0YWJsZSxyb3dzKSB7DQoJCQkJDQoJCQkJdmFyIGMgPSB0YWJsZS5jb25maWc7DQoJCQkJdmFyIGwgPSByb3dzLmxlbmd0aDsNCgkJCQl2YXIgcyA9IChjLnBhZ2UgKiBjLnNpemUpOw0KCQkJCXZhciBlID0gKHMgKyBjLnNpemUpOw0KCQkJCWlmKGUgPiByb3dzLmxlbmd0aCApIHsNCgkJCQkJZSA9IHJvd3MubGVuZ3RoOw0KCQkJCX0NCgkJCQkNCgkJCQkNCgkJCQl2YXIgdGFibGVCb2R5ID0gJCh0YWJsZS50Qm9kaWVzWzBdKTsNCgkJCQkNCgkJCQkvLyBjbGVhciB0aGUgdGFibGUgYm9keQ0KCQkJCQ0KCQkJCSQudGFibGVzb3J0ZXIuY2xlYXJUYWJsZUJvZHkodGFibGUpOw0KCQkJCQ0KCQkJCWZvcih2YXIgaSA9IHM7IGkgPCBlOyBpKyspIHsNCgkJCQkJDQoJCQkJCS8vdGFibGVCb2R5LmFwcGVuZChyb3dzW2ldKTsNCgkJCQkJDQoJCQkJCXZhciBvID0gcm93c1tpXTsNCgkJCQkJdmFyIGwgPSBvLmxlbmd0aDsNCgkJCQkJZm9yKHZhciBqPTA7IGogPCBsOyBqKyspIHsNCgkJCQkJCQ0KCQkJCQkJdGFibGVCb2R5WzBdLmFwcGVuZENoaWxkKG9bal0pOw0KDQoJCQkJCX0NCgkJCQl9DQoJCQkJDQoJCQkJZml4UG9zaXRpb24odGFibGUsdGFibGVCb2R5KTsNCgkJCQkNCgkJCQkkKHRhYmxlKS50cmlnZ2VyKCJhcHBseVdpZGdldHMiKTsNCgkJCQkNCgkJCQlpZiggYy5wYWdlID49IGMudG90YWxQYWdlcyApIHsNCiAgICAgICAgCQkJbW92ZVRvTGFzdFBhZ2UodGFibGUpOw0KCQkJCX0NCgkJCQkNCgkJCQl1cGRhdGVQYWdlRGlzcGxheShjKTsNCgkJCX0NCgkJCQ0KCQkJdGhpcy5hcHBlbmRlciA9IGZ1bmN0aW9uKHRhYmxlLHJvd3MpIHsNCgkJCQkNCgkJCQl2YXIgYyA9IHRhYmxlLmNvbmZpZzsNCgkJCQkNCgkJCQljLnJvd3NDb3B5ID0gcm93czsNCgkJCQljLnRvdGFsUm93cyA9IHJvd3MubGVuZ3RoOw0KCQkJCWMudG90YWxQYWdlcyA9IE1hdGguY2VpbChjLnRvdGFsUm93cyAvIGMuc2l6ZSk7DQoJCQkJDQoJCQkJcmVuZGVyVGFibGUodGFibGUscm93cyk7DQoJCQl9Ow0KCQkJDQoJCQl0aGlzLmRlZmF1bHRzID0gew0KCQkJCXNpemU6IDEwLA0KCQkJCW9mZnNldDogMCwNCgkJCQlwYWdlOiAwLA0KCQkJCXRvdGFsUm93czogMCwNCgkJCQl0b3RhbFBhZ2VzOiAwLA0KCQkJCWNvbnRhaW5lcjogbnVsbCwNCgkJCQljc3NOZXh0OiAnLm5leHQnLA0KCQkJCWNzc1ByZXY6ICcucHJldicsDQoJCQkJY3NzRmlyc3Q6ICcuZmlyc3QnLA0KCQkJCWNzc0xhc3Q6ICcubGFzdCcsDQoJCQkJY3NzUGFnZURpc3BsYXk6ICcucGFnZWRpc3BsYXknLA0KCQkJCWNzc1BhZ2VTaXplOiAnLnBhZ2VzaXplJywNCgkJCQlzZXBlcmF0b3I6ICIvIiwNCgkJCQlwb3NpdGlvbkZpeGVkOiB0cnVlLA0KCQkJCWFwcGVuZGVyOiB0aGlzLmFwcGVuZGVyDQoJCQl9Ow0KCQkJDQoJCQl0aGlzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHNldHRpbmdzKSB7DQoJCQkJDQoJCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsJDQoJCQkJCQ0KCQkJCQljb25maWcgPSAkLmV4dGVuZCh0aGlzLmNvbmZpZywgJC50YWJsZXNvcnRlclBhZ2VyLmRlZmF1bHRzLCBzZXR0aW5ncyk7DQoJCQkJCQ0KCQkJCQl2YXIgdGFibGUgPSB0aGlzLCBwYWdlciA9IGNvbmZpZy5jb250YWluZXI7DQoJCQkJDQoJCQkJCSQodGhpcykudHJpZ2dlcigiYXBwZW5kQ2FjaGUiKTsNCgkJCQkJDQoJCQkJCWNvbmZpZy5zaXplID0gcGFyc2VJbnQoJCgiLnBhZ2VzaXplIixwYWdlcikudmFsKCkpOw0KCQkJCQkNCgkJCQkJJChjb25maWcuY3NzRmlyc3QscGFnZXIpLmNsaWNrKGZ1bmN0aW9uKCkgew0KCQkJCQkJbW92ZVRvRmlyc3RQYWdlKHRhYmxlKTsNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJfSk7DQoJCQkJCSQoY29uZmlnLmNzc05leHQscGFnZXIpLmNsaWNrKGZ1bmN0aW9uKCkgew0KCQkJCQkJbW92ZVRvTmV4dFBhZ2UodGFibGUpOw0KCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQl9KTsNCgkJCQkJJChjb25maWcuY3NzUHJldixwYWdlcikuY2xpY2soZnVuY3Rpb24oKSB7DQoJCQkJCQltb3ZlVG9QcmV2UGFnZSh0YWJsZSk7DQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX0pOw0KCQkJCQkkKGNvbmZpZy5jc3NMYXN0LHBhZ2VyKS5jbGljayhmdW5jdGlvbigpIHsNCgkJCQkJCW1vdmVUb0xhc3RQYWdlKHRhYmxlKTsNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJfSk7DQoJCQkJCSQoY29uZmlnLmNzc1BhZ2VTaXplLHBhZ2VyKS5jaGFuZ2UoZnVuY3Rpb24oKSB7DQoJCQkJCQlzZXRQYWdlU2l6ZSh0YWJsZSxwYXJzZUludCgkKHRoaXMpLnZhbCgpKSk7DQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX0pOw0KCQkJCX0pOw0KCQkJfTsNCgkJCQ0KCQl9DQoJfSk7DQoJLy8gZXh0ZW5kIHBsdWdpbiBzY29wZQ0KCSQuZm4uZXh0ZW5kKHsNCiAgICAgICAgdGFibGVzb3J0ZXJQYWdlcjogJC50YWJsZXNvcnRlclBhZ2VyLmNvbnN0cnVjdA0KCX0pOw0KCQ0KfSkoalF1ZXJ5KTsJCQkJ]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSBhcnJheSgnanF1ZXJ5LnRhYmxlc29ydGVyLm1pbi5qcycsJ2pxdWVyeS5tZXRhZGF0YS5qcycpOwojJGluZm9bJ2NzcyddID0gJ3RoZW1lcy9ibHVlL3N0eWxlLmNzcyc7CiRpbmZvWydkZXBlbmRzJ10gPSAnanF1ZXJ5JzsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/jquery.metadata.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogTWV0YWRhdGEgLSBqUXVlcnkgcGx1Z2luIGZvciBwYXJzaW5nIG1ldGFkYXRhIGZyb20gZWxlbWVudHMKICoKICogQ29weXJpZ2h0IChjKSAyMDA2IEpvaG4gUmVzaWcsIFllaHVkYSBLYXR6LCBK77+9w7ZybiBaYWVmZmVyZXIsIFBhdWwgTWNMYW5haGFuCiAqCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCiAqICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCiAqCiAqIFJldmlzaW9uOiAkSWQkCiAqCiAqLwoKLyoqCiAqIFNldHMgdGhlIHR5cGUgb2YgbWV0YWRhdGEgdG8gdXNlLiBNZXRhZGF0YSBpcyBlbmNvZGVkIGluIEpTT04sIGFuZCBlYWNoIHByb3BlcnR5CiAqIGluIHRoZSBKU09OIHdpbGwgYmVjb21lIGEgcHJvcGVydHkgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLgogKgogKiBUaGVyZSBhcmUgdGhyZWUgc3VwcG9ydGVkIHR5cGVzIG9mIG1ldGFkYXRhIHN0b3JhZ2U6CiAqCiAqICAgYXR0cjogIEluc2lkZSBhbiBhdHRyaWJ1dGUuIFRoZSBuYW1lIHBhcmFtZXRlciBpbmRpY2F0ZXMgKndoaWNoKiBhdHRyaWJ1dGUuCiAqICAgICAgICAgIAogKiAgIGNsYXNzOiBJbnNpZGUgdGhlIGNsYXNzIGF0dHJpYnV0ZSwgd3JhcHBlZCBpbiBjdXJseSBicmFjZXM6IHsgfQogKiAgIAogKiAgIGVsZW06ICBJbnNpZGUgYSBjaGlsZCBlbGVtZW50IChlLmcuIGEgc2NyaXB0IHRhZykuIFRoZQogKiAgICAgICAgICBuYW1lIHBhcmFtZXRlciBpbmRpY2F0ZXMgKndoaWNoKiBlbGVtZW50LgogKiAgICAgICAgICAKICogVGhlIG1ldGFkYXRhIGZvciBhbiBlbGVtZW50IGlzIGxvYWRlZCB0aGUgZmlyc3QgdGltZSB0aGUgZWxlbWVudCBpcyBhY2Nlc3NlZCB2aWEgalF1ZXJ5LgogKgogKiBBcyBhIHJlc3VsdCwgeW91IGNhbiBkZWZpbmUgdGhlIG1ldGFkYXRhIHR5cGUsIHVzZSAkKGV4cHIpIHRvIGxvYWQgdGhlIG1ldGFkYXRhIGludG8gdGhlIGVsZW1lbnRzCiAqIG1hdGNoZWQgYnkgZXhwciwgdGhlbiByZWRlZmluZSB0aGUgbWV0YWRhdGEgdHlwZSBhbmQgcnVuIGFub3RoZXIgJChleHByKSBmb3Igb3RoZXIgZWxlbWVudHMuCiAqIAogKiBAbmFtZSAkLm1ldGFkYXRhLnNldFR5cGUKICoKICogQGV4YW1wbGUgPHAgaWQ9Im9uZSIgY2xhc3M9InNvbWVfY2xhc3Mge2l0ZW1faWQ6IDEsIGl0ZW1fbGFiZWw6ICdMYWJlbCd9Ij5UaGlzIGlzIGEgcDwvcD4KICogQGJlZm9yZSAkLm1ldGFkYXRhLnNldFR5cGUoImNsYXNzIikKICogQGFmdGVyICQoIiNvbmUiKS5tZXRhZGF0YSgpLml0ZW1faWQgPT0gMTsgJCgiI29uZSIpLm1ldGFkYXRhKCkuaXRlbV9sYWJlbCA9PSAiTGFiZWwiCiAqIEBkZXNjIFJlYWRzIG1ldGFkYXRhIGZyb20gdGhlIGNsYXNzIGF0dHJpYnV0ZQogKiAKICogQGV4YW1wbGUgPHAgaWQ9Im9uZSIgY2xhc3M9InNvbWVfY2xhc3MiIGRhdGE9IntpdGVtX2lkOiAxLCBpdGVtX2xhYmVsOiAnTGFiZWwnfSI+VGhpcyBpcyBhIHA8L3A+CiAqIEBiZWZvcmUgJC5tZXRhZGF0YS5zZXRUeXBlKCJhdHRyIiwgImRhdGEiKQogKiBAYWZ0ZXIgJCgiI29uZSIpLm1ldGFkYXRhKCkuaXRlbV9pZCA9PSAxOyAkKCIjb25lIikubWV0YWRhdGEoKS5pdGVtX2xhYmVsID09ICJMYWJlbCIKICogQGRlc2MgUmVhZHMgbWV0YWRhdGEgZnJvbSBhICJkYXRhIiBhdHRyaWJ1dGUKICogCiAqIEBleGFtcGxlIDxwIGlkPSJvbmUiIGNsYXNzPSJzb21lX2NsYXNzIj48c2NyaXB0PntpdGVtX2lkOiAxLCBpdGVtX2xhYmVsOiAnTGFiZWwnfTwvc2NyaXB0PlRoaXMgaXMgYSBwPC9wPgogKiBAYmVmb3JlICQubWV0YWRhdGEuc2V0VHlwZSgiZWxlbSIsICJzY3JpcHQiKQogKiBAYWZ0ZXIgJCgiI29uZSIpLm1ldGFkYXRhKCkuaXRlbV9pZCA9PSAxOyAkKCIjb25lIikubWV0YWRhdGEoKS5pdGVtX2xhYmVsID09ICJMYWJlbCIKICogQGRlc2MgUmVhZHMgbWV0YWRhdGEgZnJvbSBhIG5lc3RlZCBzY3JpcHQgZWxlbWVudAogKiAKICogQHBhcmFtIFN0cmluZyB0eXBlIFRoZSBlbmNvZGluZyB0eXBlCiAqIEBwYXJhbSBTdHJpbmcgbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGJlIHVzZWQgdG8gZ2V0IG1ldGFkYXRhIChvcHRpb25hbCkKICogQGNhdCBQbHVnaW5zL01ldGFkYXRhCiAqIEBkZXNjciBTZXRzIHRoZSB0eXBlIG9mIGVuY29kaW5nIHRvIGJlIHVzZWQgd2hlbiBsb2FkaW5nIG1ldGFkYXRhIGZvciB0aGUgZmlyc3QgdGltZQogKiBAdHlwZSB1bmRlZmluZWQKICogQHNlZSBtZXRhZGF0YSgpCiAqLwoKKGZ1bmN0aW9uKCQpIHsKCiQuZXh0ZW5kKHsKCW1ldGFkYXRhIDogewoJCWRlZmF1bHRzIDogewoJCQl0eXBlOiAnY2xhc3MnLAoJCQluYW1lOiAnbWV0YWRhdGEnLAoJCQljcmU6IC8oey4qfSkvLAoJCQlzaW5nbGU6ICdtZXRhZGF0YScKCQl9LAoJCXNldFR5cGU6IGZ1bmN0aW9uKCB0eXBlLCBuYW1lICl7CgkJCXRoaXMuZGVmYXVsdHMudHlwZSA9IHR5cGU7CgkJCXRoaXMuZGVmYXVsdHMubmFtZSA9IG5hbWU7CgkJfSwKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRzICl7CgkJCXZhciBzZXR0aW5ncyA9ICQuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdHMsb3B0cyk7CgkJCS8vIGNoZWNrIGZvciBlbXB0eSBzdHJpbmcgaW4gc2luZ2xlIHByb3BlcnR5CgkJCWlmICggIXNldHRpbmdzLnNpbmdsZS5sZW5ndGggKSBzZXR0aW5ncy5zaW5nbGUgPSAnbWV0YWRhdGEnOwoJCQkKCQkJdmFyIGRhdGEgPSAkLmRhdGEoZWxlbSwgc2V0dGluZ3Muc2luZ2xlKTsKCQkJLy8gcmV0dXJuZWQgY2FjaGVkIGRhdGEgaWYgaXQgYWxyZWFkeSBleGlzdHMKCQkJaWYgKCBkYXRhICkgcmV0dXJuIGRhdGE7CgkJCQoJCQlkYXRhID0gInt9IjsKCQkJCgkJCWlmICggc2V0dGluZ3MudHlwZSA9PSAiY2xhc3MiICkgewoJCQkJdmFyIG0gPSBzZXR0aW5ncy5jcmUuZXhlYyggZWxlbS5jbGFzc05hbWUgKTsKCQkJCWlmICggbSApCgkJCQkJZGF0YSA9IG1bMV07CgkJCX0gZWxzZSBpZiAoIHNldHRpbmdzLnR5cGUgPT0gImVsZW0iICkgewoJCQkJaWYoICFlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lICkKCQkJCQlyZXR1cm4gdW5kZWZpbmVkOwoJCQkJdmFyIGUgPSBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKHNldHRpbmdzLm5hbWUpOwoJCQkJaWYgKCBlLmxlbmd0aCApCgkJCQkJZGF0YSA9ICQudHJpbShlWzBdLmlubmVySFRNTCk7CgkJCX0gZWxzZSBpZiAoIGVsZW0uZ2V0QXR0cmlidXRlICE9IHVuZGVmaW5lZCApIHsKCQkJCXZhciBhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoIHNldHRpbmdzLm5hbWUgKTsKCQkJCWlmICggYXR0ciApCgkJCQkJZGF0YSA9IGF0dHI7CgkJCX0KCQkJCgkJCWlmICggZGF0YS5pbmRleE9mKCAneycgKSA8MCApCgkJCWRhdGEgPSAieyIgKyBkYXRhICsgIn0iOwoJCQkKCQkJZGF0YSA9IGV2YWwoIigiICsgZGF0YSArICIpIik7CgkJCQoJCQkkLmRhdGEoIGVsZW0sIHNldHRpbmdzLnNpbmdsZSwgZGF0YSApOwoJCQlyZXR1cm4gZGF0YTsKCQl9Cgl9Cn0pOwoKLyoqCiAqIFJldHVybnMgdGhlIG1ldGFkYXRhIG9iamVjdCBmb3IgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgalF1ZXJ5IG9iamVjdC4KICoKICogQG5hbWUgbWV0YWRhdGEKICogQGRlc2NyIFJldHVybnMgZWxlbWVudCdzIG1ldGFkYXRhIG9iamVjdAogKiBAcGFyYW0gT2JqZWN0IG9wdHMgQW4gb2JqZWN0IGNvbnRpYW5pbmcgc2V0dGluZ3MgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzCiAqIEB0eXBlIGpRdWVyeQogKiBAY2F0IFBsdWdpbnMvTWV0YWRhdGEKICovCiQuZm4ubWV0YWRhdGEgPSBmdW5jdGlvbiggb3B0cyApewoJcmV0dXJuICQubWV0YWRhdGEuZ2V0KCB0aGlzWzBdLCBvcHRzICk7Cn07Cgp9KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/jquery.tablesorter.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoNCiAqIA0KICogVGFibGVTb3J0ZXIgMi4wIC0gQ2xpZW50LXNpZGUgdGFibGUgc29ydGluZyB3aXRoIGVhc2UhDQogKiBWZXJzaW9uIDIuMC41Yg0KICogQHJlcXVpcmVzIGpRdWVyeSB2MS4yLjMNCiAqIA0KICogQ29weXJpZ2h0IChjKSAyMDA3IENocmlzdGlhbiBCYWNoDQogKiBFeGFtcGxlcyBhbmQgZG9jcyBhdDogaHR0cDovL3RhYmxlc29ydGVyLmNvbQ0KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXM6DQogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocA0KICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sDQogKiANCiAqLw0KLyoqDQogKiANCiAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYSBzb3J0YWJsZSB0YWJsZSB3aXRoIG11bHRpLWNvbHVtbiBzb3J0aW5nIGNhcGFiaWxpdHlzDQogKiANCiAqIEBleGFtcGxlICQoJ3RhYmxlJykudGFibGVzb3J0ZXIoKTsNCiAqIEBkZXNjIENyZWF0ZSBhIHNpbXBsZSB0YWJsZXNvcnRlciBpbnRlcmZhY2UuDQogKiANCiAqIEBleGFtcGxlICQoJ3RhYmxlJykudGFibGVzb3J0ZXIoeyBzb3J0TGlzdDpbWzAsMF0sWzEsMF1dIH0pOw0KICogQGRlc2MgQ3JlYXRlIGEgdGFibGVzb3J0ZXIgaW50ZXJmYWNlIGFuZCBzb3J0IG9uIHRoZSBmaXJzdCBhbmQgc2Vjb3VuZCBjb2x1bW4gY29sdW1uIGhlYWRlcnMuDQogKiANCiAqIEBleGFtcGxlICQoJ3RhYmxlJykudGFibGVzb3J0ZXIoeyBoZWFkZXJzOiB7IDA6IHsgc29ydGVyOiBmYWxzZX0sIDE6IHtzb3J0ZXI6IGZhbHNlfSB9IH0pOw0KICogICAgICAgICAgDQogKiBAZGVzYyBDcmVhdGUgYSB0YWJsZXNvcnRlciBpbnRlcmZhY2UgYW5kIGRpc2FibGVpbmcgdGhlIGZpcnN0IGFuZCBzZWNvbmQgIGNvbHVtbiBoZWFkZXJzLg0KICogICAgICANCiAqIA0KICogQGV4YW1wbGUgJCgndGFibGUnKS50YWJsZXNvcnRlcih7IGhlYWRlcnM6IHsgMDoge3NvcnRlcjoiaW50ZWdlciJ9LCAxOiB7c29ydGVyOiJjdXJyZW5jeSJ9IH0gfSk7DQogKiANCiAqIEBkZXNjIENyZWF0ZSBhIHRhYmxlc29ydGVyIGludGVyZmFjZSBhbmQgc2V0IGEgY29sdW1uIHBhcnNlciBmb3IgdGhlIGZpcnN0DQogKiAgICAgICBhbmQgc2Vjb25kIGNvbHVtbi4NCiAqIA0KICogDQogKiBAcGFyYW0gT2JqZWN0DQogKiAgICAgICAgICAgIHNldHRpbmdzIEFuIG9iamVjdCBsaXRlcmFsIGNvbnRhaW5pbmcga2V5L3ZhbHVlIHBhaXJzIHRvIHByb3ZpZGUNCiAqICAgICAgICAgICAgb3B0aW9uYWwgc2V0dGluZ3MuDQogKiANCiAqIA0KICogQG9wdGlvbiBTdHJpbmcgY3NzSGVhZGVyIChvcHRpb25hbCkgQSBzdHJpbmcgb2YgdGhlIGNsYXNzIG5hbWUgdG8gYmUgYXBwZW5kZWQNCiAqICAgICAgICAgdG8gc29ydGFibGUgdHIgZWxlbWVudHMgaW4gdGhlIHRoZWFkIG9mIHRoZSB0YWJsZS4gRGVmYXVsdCB2YWx1ZToNCiAqICAgICAgICAgImhlYWRlciINCiAqIA0KICogQG9wdGlvbiBTdHJpbmcgY3NzQXNjIChvcHRpb25hbCkgQSBzdHJpbmcgb2YgdGhlIGNsYXNzIG5hbWUgdG8gYmUgYXBwZW5kZWQgdG8NCiAqICAgICAgICAgc29ydGFibGUgdHIgZWxlbWVudHMgaW4gdGhlIHRoZWFkIG9uIGEgYXNjZW5kaW5nIHNvcnQuIERlZmF1bHQgdmFsdWU6DQogKiAgICAgICAgICJoZWFkZXJTb3J0VXAiDQogKiANCiAqIEBvcHRpb24gU3RyaW5nIGNzc0Rlc2MgKG9wdGlvbmFsKSBBIHN0cmluZyBvZiB0aGUgY2xhc3MgbmFtZSB0byBiZSBhcHBlbmRlZA0KICogICAgICAgICB0byBzb3J0YWJsZSB0ciBlbGVtZW50cyBpbiB0aGUgdGhlYWQgb24gYSBkZXNjZW5kaW5nIHNvcnQuIERlZmF1bHQNCiAqICAgICAgICAgdmFsdWU6ICJoZWFkZXJTb3J0RG93biINCiAqIA0KICogQG9wdGlvbiBTdHJpbmcgc29ydEluaXRpYWxPcmRlciAob3B0aW9uYWwpIEEgc3RyaW5nIG9mIHRoZSBpbml0YWwgc29ydGluZw0KICogICAgICAgICBvcmRlciBjYW4gYmUgYXNjIG9yIGRlc2MuIERlZmF1bHQgdmFsdWU6ICJhc2MiDQogKiANCiAqIEBvcHRpb24gU3RyaW5nIHNvcnRNdWx0aXNvcnRLZXkgKG9wdGlvbmFsKSBBIHN0cmluZyBvZiB0aGUgbXVsdGktY29sdW1uIHNvcnQNCiAqICAgICAgICAga2V5LiBEZWZhdWx0IHZhbHVlOiAic2hpZnRLZXkiDQogKiANCiAqIEBvcHRpb24gU3RyaW5nIHRleHRFeHRyYWN0aW9uIChvcHRpb25hbCkgQSBzdHJpbmcgb2YgdGhlIHRleHQtZXh0cmFjdGlvbg0KICogICAgICAgICBtZXRob2QgdG8gdXNlLiBGb3IgY29tcGxleCBodG1sIHN0cnVjdHVyZXMgaW5zaWRlIHRkIGNlbGwgc2V0IHRoaXMNCiAqICAgICAgICAgb3B0aW9uIHRvICJjb21wbGV4Iiwgb24gbGFyZ2UgdGFibGVzIHRoZSBjb21wbGV4IG9wdGlvbiBjYW4gYmUgc2xvdy4NCiAqICAgICAgICAgRGVmYXVsdCB2YWx1ZTogInNpbXBsZSINCiAqIA0KICogQG9wdGlvbiBPYmplY3QgaGVhZGVycyAob3B0aW9uYWwpIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvcmNlcyBzb3J0aW5nDQogKiAgICAgICAgIHJ1bGVzLiBUaGlzIG9wdGlvbiBsZXQncyB5b3Ugc3BlY2lmeSBhIGRlZmF1bHQgc29ydGluZyBydWxlLiBEZWZhdWx0DQogKiAgICAgICAgIHZhbHVlOiBudWxsDQogKiANCiAqIEBvcHRpb24gQXJyYXkgc29ydExpc3QgKG9wdGlvbmFsKSBBbiBhcnJheSBjb250YWluaW5nIHRoZSBmb3JjZXMgc29ydGluZw0KICogICAgICAgICBydWxlcy4gVGhpcyBvcHRpb24gbGV0J3MgeW91IHNwZWNpZnkgYSBkZWZhdWx0IHNvcnRpbmcgcnVsZS4gRGVmYXVsdA0KICogICAgICAgICB2YWx1ZTogbnVsbA0KICogDQogKiBAb3B0aW9uIEFycmF5IHNvcnRGb3JjZSAob3B0aW9uYWwpIEFuIGFycmF5IGNvbnRhaW5pbmcgZm9yY2VkIHNvcnRpbmcgcnVsZXMuDQogKiAgICAgICAgIFRoaXMgb3B0aW9uIGxldCdzIHlvdSBzcGVjaWZ5IGEgZGVmYXVsdCBzb3J0aW5nIHJ1bGUsIHdoaWNoIGlzDQogKiAgICAgICAgIHByZXBlbmRlZCB0byB1c2VyLXNlbGVjdGVkIHJ1bGVzLiBEZWZhdWx0IHZhbHVlOiBudWxsDQogKiANCiAqIEBvcHRpb24gQm9vbGVhbiBzb3J0TG9jYWxlQ29tcGFyZSAob3B0aW9uYWwpIEJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIHdoYXRldmVyDQogKiAgICAgICAgIHRvIHVzZSBTdHJpbmcubG9jYWxlQ2FtcGFyZSBtZXRob2Qgb3Igbm90LiBEZWZhdWx0IHNldCB0byB0cnVlLg0KICogDQogKiANCiAqIEBvcHRpb24gQXJyYXkgc29ydEFwcGVuZCAob3B0aW9uYWwpIEFuIGFycmF5IGNvbnRhaW5pbmcgZm9yY2VkIHNvcnRpbmcgcnVsZXMuDQogKiAgICAgICAgIFRoaXMgb3B0aW9uIGxldCdzIHlvdSBzcGVjaWZ5IGEgZGVmYXVsdCBzb3J0aW5nIHJ1bGUsIHdoaWNoIGlzDQogKiAgICAgICAgIGFwcGVuZGVkIHRvIHVzZXItc2VsZWN0ZWQgcnVsZXMuIERlZmF1bHQgdmFsdWU6IG51bGwNCiAqIA0KICogQG9wdGlvbiBCb29sZWFuIHdpZHRoRml4ZWQgKG9wdGlvbmFsKSBCb29sZWFuIGZsYWcgaW5kaWNhdGluZyBpZiB0YWJsZXNvcnRlcg0KICogICAgICAgICBzaG91bGQgYXBwbHkgZml4ZWQgd2lkdGhzIHRvIHRoZSB0YWJsZSBjb2x1bW5zLiBUaGlzIGlzIHVzZWZ1bGwgd2hlbg0KICogICAgICAgICB1c2luZyB0aGUgcGFnZXIgY29tcGFuaW9uIHBsdWdpbi4gVGhpcyBvcHRpb25zIHJlcXVpcmVzIHRoZSBkaW1lbnNpb24NCiAqICAgICAgICAganF1ZXJ5IHBsdWdpbi4gRGVmYXVsdCB2YWx1ZTogZmFsc2UNCiAqIA0KICogQG9wdGlvbiBCb29sZWFuIGNhbmNlbFNlbGVjdGlvbiAob3B0aW9uYWwpIEJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIGlmDQogKiAgICAgICAgIHRhYmxlc29ydGVyIHNob3VsZCBjYW5jZWwgc2VsZWN0aW9uIG9mIHRoZSB0YWJsZSBoZWFkZXJzIHRleHQuDQogKiAgICAgICAgIERlZmF1bHQgdmFsdWU6IHRydWUNCiAqIA0KICogQG9wdGlvbiBCb29sZWFuIGRlYnVnIChvcHRpb25hbCkgQm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaWYgdGFibGVzb3J0ZXINCiAqICAgICAgICAgc2hvdWxkIGRpc3BsYXkgZGVidWdpbmcgaW5mb3JtYXRpb24gdXNlZnVsbCBmb3IgZGV2ZWxvcG1lbnQuDQogKiANCiAqIEB0eXBlIGpRdWVyeQ0KICogDQogKiBAbmFtZSB0YWJsZXNvcnRlcg0KICogDQogKiBAY2F0IFBsdWdpbnMvVGFibGVzb3J0ZXINCiAqIA0KICogQGF1dGhvciBDaHJpc3RpYW4gQmFjaC9jaHJpc3RpYW4uYmFjaEBwb2x5ZXN0ZXIuc2UNCiAqLw0KDQooZnVuY3Rpb24gKCQpIHsNCiAgICAkLmV4dGVuZCh7DQogICAgICAgIHRhYmxlc29ydGVyOiBuZXcNCiAgICAgICAgZnVuY3Rpb24gKCkgew0KDQogICAgICAgICAgICB2YXIgcGFyc2VycyA9IFtdLA0KICAgICAgICAgICAgICAgIHdpZGdldHMgPSBbXTsNCg0KICAgICAgICAgICAgdGhpcy5kZWZhdWx0cyA9IHsNCiAgICAgICAgICAgICAgICBjc3NIZWFkZXI6ICJoZWFkZXIiLA0KICAgICAgICAgICAgICAgIGNzc0FzYzogImhlYWRlclNvcnRVcCIsDQogICAgICAgICAgICAgICAgY3NzRGVzYzogImhlYWRlclNvcnREb3duIiwNCiAgICAgICAgICAgICAgICBjc3NDaGlsZFJvdzogImV4cGFuZC1jaGlsZCIsDQogICAgICAgICAgICAgICAgc29ydEluaXRpYWxPcmRlcjogImFzYyIsDQogICAgICAgICAgICAgICAgc29ydE11bHRpU29ydEtleTogInNoaWZ0S2V5IiwNCiAgICAgICAgICAgICAgICBzb3J0Rm9yY2U6IG51bGwsDQogICAgICAgICAgICAgICAgc29ydEFwcGVuZDogbnVsbCwNCiAgICAgICAgICAgICAgICBzb3J0TG9jYWxlQ29tcGFyZTogdHJ1ZSwNCiAgICAgICAgICAgICAgICB0ZXh0RXh0cmFjdGlvbjogInNpbXBsZSIsDQogICAgICAgICAgICAgICAgcGFyc2Vyczoge30sIHdpZGdldHM6IFtdLA0KICAgICAgICAgICAgICAgIHdpZGdldFplYnJhOiB7DQogICAgICAgICAgICAgICAgICAgIGNzczogWyJldmVuIiwgIm9kZCJdDQogICAgICAgICAgICAgICAgfSwgaGVhZGVyczoge30sIHdpZHRoRml4ZWQ6IGZhbHNlLA0KICAgICAgICAgICAgICAgIGNhbmNlbFNlbGVjdGlvbjogdHJ1ZSwNCiAgICAgICAgICAgICAgICBzb3J0TGlzdDogW10sDQogICAgICAgICAgICAgICAgaGVhZGVyTGlzdDogW10sDQogICAgICAgICAgICAgICAgZGF0ZUZvcm1hdDogInVzIiwNCiAgICAgICAgICAgICAgICBkZWNpbWFsOiAnL1wufFwsL2cnLA0KICAgICAgICAgICAgICAgIG9uUmVuZGVySGVhZGVyOiBudWxsLA0KICAgICAgICAgICAgICAgIHNlbGVjdG9ySGVhZGVyczogJ3RoZWFkIHRoJywNCiAgICAgICAgICAgICAgICBkZWJ1ZzogZmFsc2UNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIC8qIGRlYnVnaW5nIHV0aWxzICovDQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGJlbmNobWFyayhzLCBkKSB7DQogICAgICAgICAgICAgICAgbG9nKHMgKyAiLCIgKyAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBkLmdldFRpbWUoKSkgKyAibXMiKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy5iZW5jaG1hcmsgPSBiZW5jaG1hcms7DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGxvZyhzKSB7DQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBjb25zb2xlLmRlYnVnICE9ICJ1bmRlZmluZWQiKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHMpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGFsZXJ0KHMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLyogcGFyc2VycyB1dGlscyAqLw0KDQogICAgICAgICAgICBmdW5jdGlvbiBidWlsZFBhcnNlckNhY2hlKHRhYmxlLCAkaGVhZGVycykgew0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgcGFyc2Vyc0RlYnVnID0gIiI7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLnRCb2RpZXMubGVuZ3RoID09IDApIHJldHVybjsgLy8gSW4gdGhlIGNhc2Ugb2YgZW1wdHkgdGFibGVzDQogICAgICAgICAgICAgICAgdmFyIHJvd3MgPSB0YWJsZS50Qm9kaWVzWzBdLnJvd3M7DQoNCiAgICAgICAgICAgICAgICBpZiAocm93c1swXSkgew0KDQogICAgICAgICAgICAgICAgICAgIHZhciBsaXN0ID0gW10sDQogICAgICAgICAgICAgICAgICAgICAgICBjZWxscyA9IHJvd3NbMF0uY2VsbHMsDQogICAgICAgICAgICAgICAgICAgICAgICBsID0gY2VsbHMubGVuZ3RoOw0KDQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gZmFsc2U7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkLm1ldGFkYXRhICYmICgkKCRoZWFkZXJzW2ldKS5tZXRhZGF0YSgpICYmICQoJGhlYWRlcnNbaV0pLm1ldGFkYXRhKCkuc29ydGVyKSkgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IGdldFBhcnNlckJ5SWQoJCgkaGVhZGVyc1tpXSkubWV0YWRhdGEoKS5zb3J0ZXIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0YWJsZS5jb25maWcuaGVhZGVyc1tpXSAmJiB0YWJsZS5jb25maWcuaGVhZGVyc1tpXS5zb3J0ZXIpKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gZ2V0UGFyc2VyQnlJZCh0YWJsZS5jb25maWcuaGVhZGVyc1tpXS5zb3J0ZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gZGV0ZWN0UGFyc2VyRm9yQ29sdW1uKHRhYmxlLCByb3dzLCAtMSwgaSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZS5jb25maWcuZGVidWcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJzRGVidWcgKz0gImNvbHVtbjoiICsgaSArICIgcGFyc2VyOiIgKyBwLmlkICsgIlxuIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5wdXNoKHApOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICBsb2cocGFyc2Vyc0RlYnVnKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gbGlzdDsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGRldGVjdFBhcnNlckZvckNvbHVtbih0YWJsZSwgcm93cywgcm93SW5kZXgsIGNlbGxJbmRleCkgew0KICAgICAgICAgICAgICAgIHZhciBsID0gcGFyc2Vycy5sZW5ndGgsDQogICAgICAgICAgICAgICAgICAgIG5vZGUgPSBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgbm9kZVZhbHVlID0gZmFsc2UsDQogICAgICAgICAgICAgICAgICAgIGtlZXBMb29raW5nID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB3aGlsZSAobm9kZVZhbHVlID09ICcnICYmIGtlZXBMb29raW5nKSB7DQogICAgICAgICAgICAgICAgICAgIHJvd0luZGV4Kys7DQogICAgICAgICAgICAgICAgICAgIGlmIChyb3dzW3Jvd0luZGV4XSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IGdldE5vZGVGcm9tUm93QW5kQ2VsbEluZGV4KHJvd3MsIHJvd0luZGV4LCBjZWxsSW5kZXgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVZhbHVlID0gdHJpbUFuZEdldE5vZGVUZXh0KHRhYmxlLmNvbmZpZywgbm9kZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGUuY29uZmlnLmRlYnVnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDaGVja2luZyBpZiB2YWx1ZSB3YXMgZW1wdHkgb24gcm93OicgKyByb3dJbmRleCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBrZWVwTG9va2luZyA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXJzW2ldLmlzKG5vZGVWYWx1ZSwgdGFibGUsIG5vZGUpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2Vyc1tpXTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvLyAwIGlzIGFsd2F5cyB0aGUgZ2VuZXJpYyBwYXJzZXIgKHRleHQpDQogICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlcnNbMF07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGdldE5vZGVGcm9tUm93QW5kQ2VsbEluZGV4KHJvd3MsIHJvd0luZGV4LCBjZWxsSW5kZXgpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gcm93c1tyb3dJbmRleF0uY2VsbHNbY2VsbEluZGV4XTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZnVuY3Rpb24gdHJpbUFuZEdldE5vZGVUZXh0KGNvbmZpZywgbm9kZSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAkLnRyaW0oZ2V0RWxlbWVudFRleHQoY29uZmlnLCBub2RlKSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFBhcnNlckJ5SWQobmFtZSkgew0KICAgICAgICAgICAgICAgIHZhciBsID0gcGFyc2Vycy5sZW5ndGg7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlcnNbaV0uaWQudG9Mb3dlckNhc2UoKSA9PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZXJzW2ldOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLyogdXRpbHMgKi8NCg0KICAgICAgICAgICAgZnVuY3Rpb24gYnVpbGRDYWNoZSh0YWJsZSkgew0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVUaW1lID0gbmV3IERhdGUoKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB2YXIgdG90YWxSb3dzID0gKHRhYmxlLnRCb2RpZXNbMF0gJiYgdGFibGUudEJvZGllc1swXS5yb3dzLmxlbmd0aCkgfHwgMCwNCiAgICAgICAgICAgICAgICAgICAgdG90YWxDZWxscyA9ICh0YWJsZS50Qm9kaWVzWzBdLnJvd3NbMF0gJiYgdGFibGUudEJvZGllc1swXS5yb3dzWzBdLmNlbGxzLmxlbmd0aCkgfHwgMCwNCiAgICAgICAgICAgICAgICAgICAgcGFyc2VycyA9IHRhYmxlLmNvbmZpZy5wYXJzZXJzLA0KICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogW10sDQogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkOiBbXQ0KICAgICAgICAgICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbFJvd3M7ICsraSkgew0KDQogICAgICAgICAgICAgICAgICAgIC8qKiBBZGQgdGhlIHRhYmxlIGRhdGEgdG8gbWFpbiBkYXRhIGFycmF5ICovDQogICAgICAgICAgICAgICAgICAgIHZhciBjID0gJCh0YWJsZS50Qm9kaWVzWzBdLnJvd3NbaV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29scyA9IFtdOw0KDQogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBjaGlsZCByb3csIGFkZCBpdCB0byB0aGUgbGFzdCByb3cncyBjaGlsZHJlbiBhbmQNCiAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWUgdG8gdGhlIG5leHQgcm93DQogICAgICAgICAgICAgICAgICAgIGlmIChjLmhhc0NsYXNzKHRhYmxlLmNvbmZpZy5jc3NDaGlsZFJvdykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnJvd1tjYWNoZS5yb3cubGVuZ3RoIC0gMV0gPSBjYWNoZS5yb3dbY2FjaGUucm93Lmxlbmd0aCAtIDFdLmFkZChjKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIHRvIHRoZSBuZXh0IGZvciBsb29wDQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGNhY2hlLnJvdy5wdXNoKGMpOw0KDQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdG90YWxDZWxsczsgKytqKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb2xzLnB1c2gocGFyc2Vyc1tqXS5mb3JtYXQoZ2V0RWxlbWVudFRleHQodGFibGUuY29uZmlnLCBjWzBdLmNlbGxzW2pdKSwgdGFibGUsIGNbMF0uY2VsbHNbal0pKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGNvbHMucHVzaChjYWNoZS5ub3JtYWxpemVkLmxlbmd0aCk7IC8vIGFkZCBwb3NpdGlvbiBmb3Igcm93Q2FjaGUNCiAgICAgICAgICAgICAgICAgICAgY2FjaGUubm9ybWFsaXplZC5wdXNoKGNvbHMpOw0KICAgICAgICAgICAgICAgICAgICBjb2xzID0gbnVsbDsNCiAgICAgICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICBiZW5jaG1hcmsoIkJ1aWxkaW5nIGNhY2hlIGZvciAiICsgdG90YWxSb3dzICsgIiByb3dzOiIsIGNhY2hlVGltZSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlOw0KICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RWxlbWVudFRleHQoY29uZmlnLCBub2RlKSB7DQoNCiAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICIiOw0KDQogICAgICAgICAgICAgICAgaWYgKCFub2RlKSByZXR1cm4gIiI7DQoNCiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy5zdXBwb3J0c1RleHRDb250ZW50KSBjb25maWcuc3VwcG9ydHNUZXh0Q29udGVudCA9IG5vZGUudGV4dENvbnRlbnQgfHwgZmFsc2U7DQoNCiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnRleHRFeHRyYWN0aW9uID09ICJzaW1wbGUiKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuc3VwcG9ydHNUZXh0Q29udGVudCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG5vZGUudGV4dENvbnRlbnQ7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5jaGlsZE5vZGVzWzBdICYmIG5vZGUuY2hpbGROb2Rlc1swXS5oYXNDaGlsZE5vZGVzKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gbm9kZS5jaGlsZE5vZGVzWzBdLmlubmVySFRNTDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG5vZGUuaW5uZXJIVE1MOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihjb25maWcudGV4dEV4dHJhY3Rpb24pID09ICJmdW5jdGlvbiIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBjb25maWcudGV4dEV4dHJhY3Rpb24obm9kZSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gJChub2RlKS50ZXh0KCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGFwcGVuZFRvVGFibGUodGFibGUsIGNhY2hlKSB7DQoNCiAgICAgICAgICAgICAgICBpZiAodGFibGUuY29uZmlnLmRlYnVnKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBhcHBlbmRUaW1lID0gbmV3IERhdGUoKQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHZhciBjID0gY2FjaGUsDQogICAgICAgICAgICAgICAgICAgIHIgPSBjLnJvdywNCiAgICAgICAgICAgICAgICAgICAgbiA9IGMubm9ybWFsaXplZCwNCiAgICAgICAgICAgICAgICAgICAgdG90YWxSb3dzID0gbi5sZW5ndGgsDQogICAgICAgICAgICAgICAgICAgIGNoZWNrQ2VsbCA9IChuWzBdLmxlbmd0aCAtIDEpLA0KICAgICAgICAgICAgICAgICAgICB0YWJsZUJvZHkgPSAkKHRhYmxlLnRCb2RpZXNbMF0pLA0KICAgICAgICAgICAgICAgICAgICByb3dzID0gW107DQoNCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG90YWxSb3dzOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHBvcyA9IG5baV1bY2hlY2tDZWxsXTsNCg0KICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2gocltwb3NdKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYmxlLmNvbmZpZy5hcHBlbmRlcikgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAvL3ZhciBvID0gOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSByW3Bvc10ubGVuZ3RoOw0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsOyBqKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUJvZHlbMF0uYXBwZW5kQ2hpbGQocltwb3NdW2pdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCg0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5hcHBlbmRlcikgew0KDQogICAgICAgICAgICAgICAgICAgIHRhYmxlLmNvbmZpZy5hcHBlbmRlcih0YWJsZSwgcm93cyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcm93cyA9IG51bGw7DQoNCiAgICAgICAgICAgICAgICBpZiAodGFibGUuY29uZmlnLmRlYnVnKSB7DQogICAgICAgICAgICAgICAgICAgIGJlbmNobWFyaygiUmVidWlsdCB0YWJsZToiLCBhcHBlbmRUaW1lKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBhcHBseSB0YWJsZSB3aWRnZXRzDQogICAgICAgICAgICAgICAgYXBwbHlXaWRnZXQodGFibGUpOw0KDQogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBzb3J0ZW5kDQogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICQodGFibGUpLnRyaWdnZXIoInNvcnRFbmQiKTsNCiAgICAgICAgICAgICAgICB9LCAwKTsNCg0KICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgZnVuY3Rpb24gYnVpbGRIZWFkZXJzKHRhYmxlKSB7DQoNCiAgICAgICAgICAgICAgICBpZiAodGFibGUuY29uZmlnLmRlYnVnKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciB0aW1lID0gbmV3IERhdGUoKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB2YXIgbWV0YSA9ICgkLm1ldGFkYXRhKSA/IHRydWUgOiBmYWxzZTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgaGVhZGVyX2luZGV4ID0gY29tcHV0ZVRhYmxlSGVhZGVyQ2VsbEluZGV4ZXModGFibGUpOw0KDQogICAgICAgICAgICAgICAgJHRhYmxlSGVhZGVycyA9ICQodGFibGUuY29uZmlnLnNlbGVjdG9ySGVhZGVycywgdGFibGUpLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7DQoNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW4gPSBoZWFkZXJfaW5kZXhbdGhpcy5wYXJlbnROb2RlLnJvd0luZGV4ICsgIi0iICsgdGhpcy5jZWxsSW5kZXhdOw0KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmNvbHVtbiA9IGluZGV4Ow0KICAgICAgICAgICAgICAgICAgICB0aGlzLm9yZGVyID0gZm9ybWF0U29ydGluZ09yZGVyKHRhYmxlLmNvbmZpZy5zb3J0SW5pdGlhbE9yZGVyKTsNCiAgICAgICAgICAgICAgICAgICAgDQoJCQkJCQ0KCQkJCQl0aGlzLmNvdW50ID0gdGhpcy5vcmRlcjsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tIZWFkZXJNZXRhZGF0YSh0aGlzKSB8fCBjaGVja0hlYWRlck9wdGlvbnModGFibGUsIGluZGV4KSkgdGhpcy5zb3J0RGlzYWJsZWQgPSB0cnVlOw0KCQkJCQlpZiAoY2hlY2tIZWFkZXJPcHRpb25zU29ydGluZ0xvY2tlZCh0YWJsZSwgaW5kZXgpKSB0aGlzLm9yZGVyID0gdGhpcy5sb2NrZWRPcmRlciA9IGNoZWNrSGVhZGVyT3B0aW9uc1NvcnRpbmdMb2NrZWQodGFibGUsIGluZGV4KTsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc29ydERpc2FibGVkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgJHRoID0gJCh0aGlzKS5hZGRDbGFzcyh0YWJsZS5jb25maWcuY3NzSGVhZGVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZS5jb25maWcub25SZW5kZXJIZWFkZXIpIHRhYmxlLmNvbmZpZy5vblJlbmRlckhlYWRlci5hcHBseSgkdGgpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGNlbGwgdG8gaGVhZGVyTGlzdA0KICAgICAgICAgICAgICAgICAgICB0YWJsZS5jb25maWcuaGVhZGVyTGlzdFtpbmRleF0gPSB0aGlzOw0KICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICBiZW5jaG1hcmsoIkJ1aWx0IGhlYWRlcnM6IiwgdGltZSk7DQogICAgICAgICAgICAgICAgICAgIGxvZygkdGFibGVIZWFkZXJzKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gJHRhYmxlSGVhZGVyczsNCg0KICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgLy8gZnJvbToNCiAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cuamF2YXNjcmlwdHRvb2xib3guY29tL2xpYi90YWJsZS9leGFtcGxlcy5waHANCiAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cuamF2YXNjcmlwdHRvb2xib3guY29tL3RlbXAvdGFibGVfY2VsbGluZGV4Lmh0bWwNCg0KDQogICAgICAgICAgICBmdW5jdGlvbiBjb21wdXRlVGFibGVIZWFkZXJDZWxsSW5kZXhlcyh0KSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdHJpeCA9IFtdOw0KICAgICAgICAgICAgICAgIHZhciBsb29rdXAgPSB7fTsNCiAgICAgICAgICAgICAgICB2YXIgdGhlYWQgPSB0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdUSEVBRCcpWzBdOw0KICAgICAgICAgICAgICAgIHZhciB0cnMgPSB0aGVhZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnVFInKTsNCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjZWxscyA9IHRyc1tpXS5jZWxsczsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjZWxscy5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBjZWxsc1tqXTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvd0luZGV4ID0gYy5wYXJlbnROb2RlLnJvd0luZGV4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGxJZCA9IHJvd0luZGV4ICsgIi0iICsgYy5jZWxsSW5kZXg7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm93U3BhbiA9IGMucm93U3BhbiB8fCAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbFNwYW4gPSBjLmNvbFNwYW4gfHwgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0QXZhaWxDb2w7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKG1hdHJpeFtyb3dJbmRleF0pID09ICJ1bmRlZmluZWQiKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4W3Jvd0luZGV4XSA9IFtdOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmluZCBmaXJzdCBhdmFpbGFibGUgY29sdW1uIGluIHRoZSBmaXJzdCByb3cNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbWF0cml4W3Jvd0luZGV4XS5sZW5ndGggKyAxOyBrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKG1hdHJpeFtyb3dJbmRleF1ba10pID09ICJ1bmRlZmluZWQiKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QXZhaWxDb2wgPSBrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbY2VsbElkXSA9IGZpcnN0QXZhaWxDb2w7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gcm93SW5kZXg7IGsgPCByb3dJbmRleCArIHJvd1NwYW47IGsrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YobWF0cml4W2tdKSA9PSAidW5kZWZpbmVkIikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXhba10gPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdHJpeHJvdyA9IG1hdHJpeFtrXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gZmlyc3RBdmFpbENvbDsgbCA8IGZpcnN0QXZhaWxDb2wgKyBjb2xTcGFuOyBsKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4cm93W2xdID0gIngiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gbG9va3VwOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmdW5jdGlvbiBjaGVja0NlbGxDb2xTcGFuKHRhYmxlLCByb3dzLCByb3cpIHsNCiAgICAgICAgICAgICAgICB2YXIgYXJyID0gW10sDQogICAgICAgICAgICAgICAgICAgIHIgPSB0YWJsZS50SGVhZC5yb3dzLA0KICAgICAgICAgICAgICAgICAgICBjID0gcltyb3ddLmNlbGxzOw0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjZWxsID0gY1tpXTsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbC5jb2xTcGFuID4gMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgYXJyID0gYXJyLmNvbmNhdChjaGVja0NlbGxDb2xTcGFuKHRhYmxlLCBoZWFkZXJBcnIsIHJvdysrKSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGUudEhlYWQubGVuZ3RoID09IDEgfHwgKGNlbGwucm93U3BhbiA+IDEgfHwgIXJbcm93ICsgMV0pKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2goY2VsbCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFkZXJBcnJbcm93XSA9IChpK3Jvdyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIGFycjsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGNoZWNrSGVhZGVyTWV0YWRhdGEoY2VsbCkgew0KICAgICAgICAgICAgICAgIGlmICgoJC5tZXRhZGF0YSkgJiYgKCQoY2VsbCkubWV0YWRhdGEoKS5zb3J0ZXIgPT09IGZhbHNlKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2tIZWFkZXJPcHRpb25zKHRhYmxlLCBpKSB7DQogICAgICAgICAgICAgICAgaWYgKCh0YWJsZS5jb25maWcuaGVhZGVyc1tpXSkgJiYgKHRhYmxlLmNvbmZpZy5oZWFkZXJzW2ldLnNvcnRlciA9PT0gZmFsc2UpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KCQkJDQoJCQkgZnVuY3Rpb24gY2hlY2tIZWFkZXJPcHRpb25zU29ydGluZ0xvY2tlZCh0YWJsZSwgaSkgew0KICAgICAgICAgICAgICAgIGlmICgodGFibGUuY29uZmlnLmhlYWRlcnNbaV0pICYmICh0YWJsZS5jb25maWcuaGVhZGVyc1tpXS5sb2NrZWRPcmRlcikpIHJldHVybiB0YWJsZS5jb25maWcuaGVhZGVyc1tpXS5sb2NrZWRPcmRlcjsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQoJCQkNCiAgICAgICAgICAgIGZ1bmN0aW9uIGFwcGx5V2lkZ2V0KHRhYmxlKSB7DQogICAgICAgICAgICAgICAgdmFyIGMgPSB0YWJsZS5jb25maWcud2lkZ2V0czsNCiAgICAgICAgICAgICAgICB2YXIgbCA9IGMubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgZ2V0V2lkZ2V0QnlJZChjW2ldKS5mb3JtYXQodGFibGUpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmdW5jdGlvbiBnZXRXaWRnZXRCeUlkKG5hbWUpIHsNCiAgICAgICAgICAgICAgICB2YXIgbCA9IHdpZGdldHMubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh3aWRnZXRzW2ldLmlkLnRvTG93ZXJDYXNlKCkgPT0gbmFtZS50b0xvd2VyQ2FzZSgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2lkZ2V0c1tpXTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdFNvcnRpbmdPcmRlcih2KSB7DQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2KSAhPSAiTnVtYmVyIikgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHYudG9Mb3dlckNhc2UoKSA9PSAiZGVzYyIpID8gMSA6IDA7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2ID09IDEpID8gMSA6IDA7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmdW5jdGlvbiBpc1ZhbHVlSW5BcnJheSh2LCBhKSB7DQogICAgICAgICAgICAgICAgdmFyIGwgPSBhLmxlbmd0aDsNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoYVtpXVswXSA9PSB2KSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIHNldEhlYWRlcnNDc3ModGFibGUsICRoZWFkZXJzLCBsaXN0LCBjc3MpIHsNCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgYWxsIGhlYWRlciBpbmZvcm1hdGlvbg0KICAgICAgICAgICAgICAgICRoZWFkZXJzLnJlbW92ZUNsYXNzKGNzc1swXSkucmVtb3ZlQ2xhc3MoY3NzWzFdKTsNCg0KICAgICAgICAgICAgICAgIHZhciBoID0gW107DQogICAgICAgICAgICAgICAgJGhlYWRlcnMuZWFjaChmdW5jdGlvbiAob2Zmc2V0KSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zb3J0RGlzYWJsZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGhbdGhpcy5jb2x1bW5dID0gJCh0aGlzKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgdmFyIGwgPSBsaXN0Lmxlbmd0aDsNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBoW2xpc3RbaV1bMF1dLmFkZENsYXNzKGNzc1tsaXN0W2ldWzFdXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmdW5jdGlvbiBmaXhDb2x1bW5XaWR0aCh0YWJsZSwgJGhlYWRlcnMpIHsNCiAgICAgICAgICAgICAgICB2YXIgYyA9IHRhYmxlLmNvbmZpZzsNCiAgICAgICAgICAgICAgICBpZiAoYy53aWR0aEZpeGVkKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjb2xncm91cCA9ICQoJzxjb2xncm91cD4nKTsNCiAgICAgICAgICAgICAgICAgICAgJCgidHI6Zmlyc3QgdGQiLCB0YWJsZS50Qm9kaWVzWzBdKS5lYWNoKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGdyb3VwLmFwcGVuZCgkKCc8Y29sPicpLmNzcygnd2lkdGgnLCAkKHRoaXMpLndpZHRoKCkpKTsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgICQodGFibGUpLnByZXBlbmQoY29sZ3JvdXApOw0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUhlYWRlclNvcnRDb3VudCh0YWJsZSwgc29ydExpc3QpIHsNCiAgICAgICAgICAgICAgICB2YXIgYyA9IHRhYmxlLmNvbmZpZywNCiAgICAgICAgICAgICAgICAgICAgbCA9IHNvcnRMaXN0Lmxlbmd0aDsNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHNvcnRMaXN0W2ldLA0KICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGMuaGVhZGVyTGlzdFtzWzBdXTsNCiAgICAgICAgICAgICAgICAgICAgby5jb3VudCA9IHNbMV07DQogICAgICAgICAgICAgICAgICAgIG8uY291bnQrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8qIHNvcnRpbmcgbWV0aG9kcyAqLw0KDQogICAgICAgICAgICBmdW5jdGlvbiBtdWx0aXNvcnQodGFibGUsIHNvcnRMaXN0LCBjYWNoZSkgew0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgc29ydFRpbWUgPSBuZXcgRGF0ZSgpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHZhciBkeW5hbWljRXhwID0gInZhciBzb3J0V3JhcHBlciA9IGZ1bmN0aW9uKGEsYikgeyIsDQogICAgICAgICAgICAgICAgICAgIGwgPSBzb3J0TGlzdC5sZW5ndGg7DQoNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBpbmxpbmUgZnVuY3Rpb25zLg0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBzb3J0TGlzdFtpXVswXTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG9yZGVyID0gc29ydExpc3RbaV1bMV07DQogICAgICAgICAgICAgICAgICAgIC8vIHZhciBzID0gKGdldENhY2hlZFNvcnRUeXBlKHRhYmxlLmNvbmZpZy5wYXJzZXJzLGMpID09ICJ0ZXh0IikgPw0KICAgICAgICAgICAgICAgICAgICAvLyAoKG9yZGVyID09IDApID8gInNvcnRUZXh0IiA6ICJzb3J0VGV4dERlc2MiKSA6ICgob3JkZXIgPT0gMCkgPw0KICAgICAgICAgICAgICAgICAgICAvLyAic29ydE51bWVyaWMiIDogInNvcnROdW1lcmljRGVzYyIpOw0KICAgICAgICAgICAgICAgICAgICAvLyB2YXIgcyA9ICh0YWJsZS5jb25maWcucGFyc2Vyc1tjXS50eXBlID09ICJ0ZXh0IikgPyAoKG9yZGVyID09IDApDQogICAgICAgICAgICAgICAgICAgIC8vID8gbWFrZVNvcnRUZXh0KGMpIDogbWFrZVNvcnRUZXh0RGVzYyhjKSkgOiAoKG9yZGVyID09IDApID8NCiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZVNvcnROdW1lcmljKGMpIDogbWFrZVNvcnROdW1lcmljRGVzYyhjKSk7DQogICAgICAgICAgICAgICAgICAgIHZhciBzID0gKHRhYmxlLmNvbmZpZy5wYXJzZXJzW2NdLnR5cGUgPT0gInRleHQiKSA/ICgob3JkZXIgPT0gMCkgPyBtYWtlU29ydEZ1bmN0aW9uKCJ0ZXh0IiwgImFzYyIsIGMpIDogbWFrZVNvcnRGdW5jdGlvbigidGV4dCIsICJkZXNjIiwgYykpIDogKChvcmRlciA9PSAwKSA/IG1ha2VTb3J0RnVuY3Rpb24oIm51bWVyaWMiLCAiYXNjIiwgYykgOiBtYWtlU29ydEZ1bmN0aW9uKCJudW1lcmljIiwgImRlc2MiLCBjKSk7DQogICAgICAgICAgICAgICAgICAgIHZhciBlID0gImUiICsgaTsNCg0KICAgICAgICAgICAgICAgICAgICBkeW5hbWljRXhwICs9ICJ2YXIgIiArIGUgKyAiID0gIiArIHM7IC8vICsgIihhWyIgKyBjICsgIl0sYlsiICsgYw0KICAgICAgICAgICAgICAgICAgICAvLyArICJdKTsgIjsNCiAgICAgICAgICAgICAgICAgICAgZHluYW1pY0V4cCArPSAiaWYoIiArIGUgKyAiKSB7IHJldHVybiAiICsgZSArICI7IH0gIjsNCiAgICAgICAgICAgICAgICAgICAgZHluYW1pY0V4cCArPSAiZWxzZSB7ICI7DQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZSBpcyB0aGUgc2FtZSBrZWVwIG9yaWduYWwgb3JkZXINCiAgICAgICAgICAgICAgICB2YXIgb3JnT3JkZXJDb2wgPSBjYWNoZS5ub3JtYWxpemVkWzBdLmxlbmd0aCAtIDE7DQogICAgICAgICAgICAgICAgZHluYW1pY0V4cCArPSAicmV0dXJuIGFbIiArIG9yZ09yZGVyQ29sICsgIl0tYlsiICsgb3JnT3JkZXJDb2wgKyAiXTsiOw0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgZHluYW1pY0V4cCArPSAifTsgIjsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBkeW5hbWljRXhwICs9ICJyZXR1cm4gMDsgIjsNCiAgICAgICAgICAgICAgICBkeW5hbWljRXhwICs9ICJ9OyAiOw0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICBiZW5jaG1hcmsoIkV2YWxpbmcgZXhwcmVzc2lvbjoiICsgZHluYW1pY0V4cCwgbmV3IERhdGUoKSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZXZhbChkeW5hbWljRXhwKTsNCg0KICAgICAgICAgICAgICAgIGNhY2hlLm5vcm1hbGl6ZWQuc29ydChzb3J0V3JhcHBlcik7DQoNCiAgICAgICAgICAgICAgICBpZiAodGFibGUuY29uZmlnLmRlYnVnKSB7DQogICAgICAgICAgICAgICAgICAgIGJlbmNobWFyaygiU29ydGluZyBvbiAiICsgc29ydExpc3QudG9TdHJpbmcoKSArICIgYW5kIGRpciAiICsgb3JkZXIgKyAiIHRpbWU6Iiwgc29ydFRpbWUpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZTsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIG1ha2VTb3J0RnVuY3Rpb24odHlwZSwgZGlyZWN0aW9uLCBpbmRleCkgew0KICAgICAgICAgICAgICAgIHZhciBhID0gImFbIiArIGluZGV4ICsgIl0iLA0KICAgICAgICAgICAgICAgICAgICBiID0gImJbIiArIGluZGV4ICsgIl0iOw0KICAgICAgICAgICAgICAgIGlmICh0eXBlID09ICd0ZXh0JyAmJiBkaXJlY3Rpb24gPT0gJ2FzYycpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIoIiArIGEgKyAiID09ICIgKyBiICsgIiA/IDAgOiAoIiArIGEgKyAiID09PSBudWxsID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogKCIgKyBiICsgIiA9PT0gbnVsbCA/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA6ICgiICsgYSArICIgPCAiICsgYiArICIpID8gLTEgOiAxICkpKTsiOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAndGV4dCcgJiYgZGlyZWN0aW9uID09ICdkZXNjJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gIigiICsgYSArICIgPT0gIiArIGIgKyAiID8gMCA6ICgiICsgYSArICIgPT09IG51bGwgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiAoIiArIGIgKyAiID09PSBudWxsID8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIDogKCIgKyBiICsgIiA8ICIgKyBhICsgIikgPyAtMSA6IDEgKSkpOyI7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09ICdudW1lcmljJyAmJiBkaXJlY3Rpb24gPT0gJ2FzYycpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIoIiArIGEgKyAiID09PSBudWxsICYmICIgKyBiICsgIiA9PT0gbnVsbCkgPyAwIDooIiArIGEgKyAiID09PSBudWxsID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogKCIgKyBiICsgIiA9PT0gbnVsbCA/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA6ICIgKyBhICsgIiAtICIgKyBiICsgIikpOyI7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09ICdudW1lcmljJyAmJiBkaXJlY3Rpb24gPT0gJ2Rlc2MnKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiKCIgKyBhICsgIiA9PT0gbnVsbCAmJiAiICsgYiArICIgPT09IG51bGwpID8gMCA6KCIgKyBhICsgIiA9PT0gbnVsbCA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6ICgiICsgYiArICIgPT09IG51bGwgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgOiAiICsgYiArICIgLSAiICsgYSArICIpKTsiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIG1ha2VTb3J0VGV4dChpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICIoKGFbIiArIGkgKyAiXSA8IGJbIiArIGkgKyAiXSkgPyAtMSA6ICgoYVsiICsgaSArICJdID4gYlsiICsgaSArICJdKSA/IDEgOiAwKSk7IjsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIG1ha2VTb3J0VGV4dERlc2MoaSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAiKChiWyIgKyBpICsgIl0gPCBhWyIgKyBpICsgIl0pID8gLTEgOiAoKGJbIiArIGkgKyAiXSA+IGFbIiArIGkgKyAiXSkgPyAxIDogMCkpOyI7DQogICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICBmdW5jdGlvbiBtYWtlU29ydE51bWVyaWMoaSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAiYVsiICsgaSArICJdLWJbIiArIGkgKyAiXTsiOw0KICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgZnVuY3Rpb24gbWFrZVNvcnROdW1lcmljRGVzYyhpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJiWyIgKyBpICsgIl0tYVsiICsgaSArICJdOyI7DQogICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICBmdW5jdGlvbiBzb3J0VGV4dChhLCBiKSB7DQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5zb3J0TG9jYWxlQ29tcGFyZSkgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gKChhIDwgYikgPyAtMSA6ICgoYSA+IGIpID8gMSA6IDApKTsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIHNvcnRUZXh0RGVzYyhhLCBiKSB7DQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5zb3J0TG9jYWxlQ29tcGFyZSkgcmV0dXJuIGIubG9jYWxlQ29tcGFyZShhKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gKChiIDwgYSkgPyAtMSA6ICgoYiA+IGEpID8gMSA6IDApKTsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIHNvcnROdW1lcmljKGEsIGIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gYSAtIGI7DQogICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICBmdW5jdGlvbiBzb3J0TnVtZXJpY0Rlc2MoYSwgYikgew0KICAgICAgICAgICAgICAgIHJldHVybiBiIC0gYTsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGdldENhY2hlZFNvcnRUeXBlKHBhcnNlcnMsIGkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2Vyc1tpXS50eXBlOw0KICAgICAgICAgICAgfTsgLyogcHVibGljIG1ldGhvZHMgKi8NCiAgICAgICAgICAgIHRoaXMuY29uc3RydWN0ID0gZnVuY3Rpb24gKHNldHRpbmdzKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIHRoZWFkIG9yIHRib2R5IHF1aXQuDQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy50SGVhZCB8fCAhdGhpcy50Qm9kaWVzKSByZXR1cm47DQogICAgICAgICAgICAgICAgICAgIC8vIGRlY2xhcmUNCiAgICAgICAgICAgICAgICAgICAgdmFyICR0aGlzLCAkZG9jdW1lbnQsICRoZWFkZXJzLCBjYWNoZSwgY29uZmlnLCBzaGlmdERvd24gPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgc29ydE9yZGVyOw0KICAgICAgICAgICAgICAgICAgICAvLyBuZXcgYmxhbmsgY29uZmlnIG9iamVjdA0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhbmQgZXh0ZW5kLg0KICAgICAgICAgICAgICAgICAgICBjb25maWcgPSAkLmV4dGVuZCh0aGlzLmNvbmZpZywgJC50YWJsZXNvcnRlci5kZWZhdWx0cywgc2V0dGluZ3MpOw0KICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSBjb21tb24gZXhwcmVzc2lvbiBmb3Igc3BlZWQNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMgPSAkKHRoaXMpOw0KICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHRoZSBzZXR0aW5ncyB3aGVyZSB0aGV5IHJlYWQNCiAgICAgICAgICAgICAgICAgICAgJC5kYXRhKHRoaXMsICJ0YWJsZXNvcnRlciIsIGNvbmZpZyk7DQogICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkIGhlYWRlcnMNCiAgICAgICAgICAgICAgICAgICAgJGhlYWRlcnMgPSBidWlsZEhlYWRlcnModGhpcyk7DQogICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBhdXRvIGRldGVjdCBjb2x1bW4gdHlwZSwgYW5kIHN0b3JlIGluIHRhYmxlcyBjb25maWcNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcucGFyc2VycyA9IGJ1aWxkUGFyc2VyQ2FjaGUodGhpcywgJGhlYWRlcnMpOw0KICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCB0aGUgY2FjaGUgZm9yIHRoZSB0Ym9keSBjZWxscw0KICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IGJ1aWxkQ2FjaGUodGhpcyk7DQogICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgY3NzIGNsYXNzIG5hbWVzLCBjb3VsZCBiZSBkb25lIGVsc2Ugd2hlcmUuDQogICAgICAgICAgICAgICAgICAgIHZhciBzb3J0Q1NTID0gW2NvbmZpZy5jc3NEZXNjLCBjb25maWcuY3NzQXNjXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZml4YXRlIGNvbHVtbnMgaWYgdGhlIHVzZXJzIHN1cHBsaWVzIHRoZSBmaXhlZFdpZHRoIG9wdGlvbg0KICAgICAgICAgICAgICAgICAgICBmaXhDb2x1bW5XaWR0aCh0aGlzKTsNCiAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgZXZlbnQgaGFuZGxpbmcgdG8gaGVhZGVycw0KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIGJpZywgcGVyaGFwcyBicmVhayBpdCBvdXQ/DQogICAgICAgICAgICAgICAgICAgICRoZWFkZXJzLmNsaWNrKA0KDQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG90YWxSb3dzID0gKCR0aGlzWzBdLnRCb2RpZXNbMF0gJiYgJHRoaXNbMF0udEJvZGllc1swXS5yb3dzLmxlbmd0aCkgfHwgMDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zb3J0RGlzYWJsZWQgJiYgdG90YWxSb3dzID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgY2FsbCBzb3J0U3RhcnQgaWYgc29ydGluZyBpcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZWQuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMudHJpZ2dlcigic29ydFN0YXJ0Iik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgZXhwLCBmb3Igc3BlZWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgJGNlbGwgPSAkKHRoaXMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBjdXJyZW50IGNvbHVtbiBpbmRleA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5jb2x1bW47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGN1cnJlbnQgY29sdW1uIHNvcnQgb3JkZXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9yZGVyID0gdGhpcy5jb3VudCsrICUgMjsNCgkJCQkJCQkvLyBhbHdheXMgc29ydCBvbiB0aGUgbG9ja2VkIG9yZGVyLg0KCQkJCQkJCWlmKHRoaXMubG9ja2VkT3JkZXIpIHRoaXMub3JkZXIgPSB0aGlzLmxvY2tlZE9yZGVyOw0KCQkJCQkJCQ0KCQkJCQkJCS8vIHVzZXIgb25seSB3aGFudHMgdG8gc29ydCBvbiBvbmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2x1bW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVbY29uZmlnLnNvcnRNdWx0aVNvcnRLZXldKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsdXNoIHRoZSBzb3J0IGxpc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNvcnRMaXN0ID0gW107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuc29ydEZvcmNlICE9IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gY29uZmlnLnNvcnRGb3JjZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYS5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhW2pdWzBdICE9IGkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNvcnRMaXN0LnB1c2goYVtqXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBjb2x1bW4gdG8gc29ydCBsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zb3J0TGlzdC5wdXNoKFtpLCB0aGlzLm9yZGVyXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpIGNvbHVtbiBzb3J0aW5nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIgaGFzIGNsaWNrZWQgb24gYW4gYWxsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWR5IHNvcnRldCBjb2x1bW4uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1ZhbHVlSW5BcnJheShpLCBjb25maWcuc29ydExpc3QpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXZlcnMgdGhlIHNvcnRpbmcgZGlyZWN0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYWxsIHRhYmxlcy4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29uZmlnLnNvcnRMaXN0Lmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBjb25maWcuc29ydExpc3Rbal0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBjb25maWcuaGVhZGVyTGlzdFtzWzBdXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1swXSA9PSBpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY291bnQgPSBzWzFdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvdW50Kys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbMV0gPSBvLmNvdW50ICUgMjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgY29sdW1uIHRvIHNvcnQgbGlzdCBhcnJheQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNvcnRMaXN0LnB1c2goW2ksIHRoaXMub3JkZXJdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBjc3MgZm9yIGhlYWRlcnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SGVhZGVyc0NzcygkdGhpc1swXSwgJGhlYWRlcnMsIGNvbmZpZy5zb3J0TGlzdCwgc29ydENTUyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvVGFibGUoDQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpc1swXSwgbXVsdGlzb3J0KA0KCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXNbMF0sIGNvbmZpZy5zb3J0TGlzdCwgY2FjaGUpDQoJCQkJCQkJCSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBub3JtYWwgZXZlbnQgYnkgcmV0dXJuaW5nIGZhbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuY2VsIHNlbGVjdGlvbg0KICAgICAgICAgICAgICAgICAgICB9KS5tb3VzZWRvd24oZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5jYW5jZWxTZWxlY3Rpb24pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uc2VsZWN0c3RhcnQgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgZWFzeSBtZXRob2RzIHRoYXQgdHJpZ2dlciBiaW5kZWQgZXZlbnRzDQogICAgICAgICAgICAgICAgICAgICR0aGlzLmJpbmQoInVwZGF0ZSIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZSA9IHRoaXM7DQogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWJ1aWxkIHBhcnNlcnMuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUuY29uZmlnLnBhcnNlcnMgPSBidWlsZFBhcnNlckNhY2hlKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLCAkaGVhZGVycyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVidWlsZCB0aGUgY2FjaGUgbWFwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSBidWlsZENhY2hlKG1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEpOw0KICAgICAgICAgICAgICAgICAgICB9KS5iaW5kKCJ1cGRhdGVDZWxsIiwgZnVuY3Rpb24gKGUsIGNlbGwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSB0aGlzLmNvbmZpZzsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBwb3NpdGlvbiBmcm9tIHRoZSBkb20uDQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG9zID0gWyhjZWxsLnBhcmVudE5vZGUucm93SW5kZXggLSAxKSwgY2VsbC5jZWxsSW5kZXhdOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNhY2hlDQogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5ub3JtYWxpemVkW3Bvc1swXV1bcG9zWzFdXSA9IGNvbmZpZy5wYXJzZXJzW3Bvc1sxXV0uZm9ybWF0KA0KICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RWxlbWVudFRleHQoY29uZmlnLCBjZWxsKSwgY2VsbCk7DQogICAgICAgICAgICAgICAgICAgIH0pLmJpbmQoInNvcnRvbiIsIGZ1bmN0aW9uIChlLCBsaXN0KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnRyaWdnZXIoInNvcnRTdGFydCIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNvcnRMaXN0ID0gbGlzdDsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBhbmQgc3RvcmUgdGhlIHNvcnRsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc29ydExpc3QgPSBjb25maWcuc29ydExpc3Q7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgaGVhZGVyIGNvdW50IGluZGV4DQogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVIZWFkZXJTb3J0Q291bnQodGhpcywgc29ydExpc3QpOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGNzcyBmb3IgaGVhZGVycw0KICAgICAgICAgICAgICAgICAgICAgICAgc2V0SGVhZGVyc0Nzcyh0aGlzLCAkaGVhZGVycywgc29ydExpc3QsIHNvcnRDU1MpOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgdGFibGUgYW5kIGFwcGVuZCBpdCB0byB0aGUgZG9tDQogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb1RhYmxlKHRoaXMsIG11bHRpc29ydCh0aGlzLCBzb3J0TGlzdCwgY2FjaGUpKTsNCiAgICAgICAgICAgICAgICAgICAgfSkuYmluZCgiYXBwZW5kQ2FjaGUiLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb1RhYmxlKHRoaXMsIGNhY2hlKTsNCiAgICAgICAgICAgICAgICAgICAgfSkuYmluZCgiYXBwbHlXaWRnZXRJZCIsIGZ1bmN0aW9uIChlLCBpZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V2lkZ2V0QnlJZChpZCkuZm9ybWF0KHRoaXMpOw0KICAgICAgICAgICAgICAgICAgICB9KS5iaW5kKCJhcHBseVdpZGdldHMiLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSB3aWRnZXRzDQogICAgICAgICAgICAgICAgICAgICAgICBhcHBseVdpZGdldCh0aGlzKTsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIGlmICgkLm1ldGFkYXRhICYmICgkKHRoaXMpLm1ldGFkYXRhKCkgJiYgJCh0aGlzKS5tZXRhZGF0YSgpLnNvcnRsaXN0KSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNvcnRMaXN0ID0gJCh0aGlzKS5tZXRhZGF0YSgpLnNvcnRsaXN0Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIC8vIGlmIHVzZXIgaGFzIHN1cHBsaWVkIGEgc29ydCBsaXN0IHRvIGNvbnN0cnVjdG9yLg0KICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnNvcnRMaXN0Lmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLnRyaWdnZXIoInNvcnRvbiIsIFtjb25maWcuc29ydExpc3RdKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSB3aWRnZXRzDQogICAgICAgICAgICAgICAgICAgIGFwcGx5V2lkZ2V0KHRoaXMpOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHRoaXMuYWRkUGFyc2VyID0gZnVuY3Rpb24gKHBhcnNlcikgew0KICAgICAgICAgICAgICAgIHZhciBsID0gcGFyc2Vycy5sZW5ndGgsDQogICAgICAgICAgICAgICAgICAgIGEgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXJzW2ldLmlkLnRvTG93ZXJDYXNlKCkgPT0gcGFyc2VyLmlkLnRvTG93ZXJDYXNlKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoYSkgew0KICAgICAgICAgICAgICAgICAgICBwYXJzZXJzLnB1c2gocGFyc2VyKTsNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHRoaXMuYWRkV2lkZ2V0ID0gZnVuY3Rpb24gKHdpZGdldCkgew0KICAgICAgICAgICAgICAgIHdpZGdldHMucHVzaCh3aWRnZXQpOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHRoaXMuZm9ybWF0RmxvYXQgPSBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgICAgIHZhciBpID0gcGFyc2VGbG9hdChzKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gKGlzTmFOKGkpKSA/IDAgOiBpOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHRoaXMuZm9ybWF0SW50ID0gZnVuY3Rpb24gKHMpIHsNCiAgICAgICAgICAgICAgICB2YXIgaSA9IHBhcnNlSW50KHMpOw0KICAgICAgICAgICAgICAgIHJldHVybiAoaXNOYU4oaSkpID8gMCA6IGk7DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgdGhpcy5pc0RpZ2l0ID0gZnVuY3Rpb24gKHMsIGNvbmZpZykgew0KICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgYWxsIGFuIHdhbnRlZCBjaGFycyBhbmQgbWF0Y2guDQogICAgICAgICAgICAgICAgcmV0dXJuIC9eWy0rXT9cZCokLy50ZXN0KCQudHJpbShzLnJlcGxhY2UoL1ssLiddL2csICcnKSkpOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHRoaXMuY2xlYXJUYWJsZUJvZHkgPSBmdW5jdGlvbiAodGFibGUpIHsNCiAgICAgICAgICAgICAgICBpZiAoJC5icm93c2VyLm1zaWUpIHsNCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZW1wdHkoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5maXJzdENoaWxkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLmZpcnN0Q2hpbGQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVtcHR5LmFwcGx5KHRhYmxlLnRCb2RpZXNbMF0pOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHRhYmxlLnRCb2RpZXNbMF0uaW5uZXJIVE1MID0gIiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgLy8gZXh0ZW5kIHBsdWdpbiBzY29wZQ0KICAgICQuZm4uZXh0ZW5kKHsNCiAgICAgICAgdGFibGVzb3J0ZXI6ICQudGFibGVzb3J0ZXIuY29uc3RydWN0DQogICAgfSk7DQoNCiAgICAvLyBtYWtlIHNob3J0Y3V0DQogICAgdmFyIHRzID0gJC50YWJsZXNvcnRlcjsNCg0KICAgIC8vIGFkZCBkZWZhdWx0IHBhcnNlcnMNCiAgICB0cy5hZGRQYXJzZXIoew0KICAgICAgICBpZDogInRleHQiLA0KICAgICAgICBpczogZnVuY3Rpb24gKHMpIHsNCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9LCBmb3JtYXQ6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4gJC50cmltKHMudG9Mb2NhbGVMb3dlckNhc2UoKSk7DQogICAgICAgIH0sIHR5cGU6ICJ0ZXh0Ig0KICAgIH0pOw0KDQogICAgdHMuYWRkUGFyc2VyKHsNCiAgICAgICAgaWQ6ICJkaWdpdCIsDQogICAgICAgIGlzOiBmdW5jdGlvbiAocywgdGFibGUpIHsNCiAgICAgICAgICAgIHZhciBjID0gdGFibGUuY29uZmlnOw0KICAgICAgICAgICAgcmV0dXJuICQudGFibGVzb3J0ZXIuaXNEaWdpdChzLCBjKTsNCiAgICAgICAgfSwgZm9ybWF0OiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgcmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQocyk7DQogICAgICAgIH0sIHR5cGU6ICJudW1lcmljIg0KICAgIH0pOw0KDQogICAgdHMuYWRkUGFyc2VyKHsNCiAgICAgICAgaWQ6ICJjdXJyZW5jeSIsDQogICAgICAgIGlzOiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgcmV0dXJuIC9eW8KjJOKCrD8uXS8udGVzdChzKTsNCiAgICAgICAgfSwgZm9ybWF0OiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgcmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQocy5yZXBsYWNlKG5ldyBSZWdFeHAoL1vCoyTigqxdL2cpLCAiIikpOw0KICAgICAgICB9LCB0eXBlOiAibnVtZXJpYyINCiAgICB9KTsNCg0KICAgIHRzLmFkZFBhcnNlcih7DQogICAgICAgIGlkOiAiaXBBZGRyZXNzIiwNCiAgICAgICAgaXM6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4gL15cZHsyLDN9W1wuXVxkezIsM31bXC5dXGR7MiwzfVtcLl1cZHsyLDN9JC8udGVzdChzKTsNCiAgICAgICAgfSwgZm9ybWF0OiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgdmFyIGEgPSBzLnNwbGl0KCIuIiksDQogICAgICAgICAgICAgICAgciA9ICIiLA0KICAgICAgICAgICAgICAgIGwgPSBhLmxlbmd0aDsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBhW2ldOw0KICAgICAgICAgICAgICAgIGlmIChpdGVtLmxlbmd0aCA9PSAyKSB7DQogICAgICAgICAgICAgICAgICAgIHIgKz0gIjAiICsgaXRlbTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByICs9IGl0ZW07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQocik7DQogICAgICAgIH0sIHR5cGU6ICJudW1lcmljIg0KICAgIH0pOw0KDQogICAgdHMuYWRkUGFyc2VyKHsNCiAgICAgICAgaWQ6ICJ1cmwiLA0KICAgICAgICBpczogZnVuY3Rpb24gKHMpIHsNCiAgICAgICAgICAgIHJldHVybiAvXihodHRwcz98ZnRwfGZpbGUpOlwvXC8kLy50ZXN0KHMpOw0KICAgICAgICB9LCBmb3JtYXQ6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4galF1ZXJ5LnRyaW0ocy5yZXBsYWNlKG5ldyBSZWdFeHAoLyhodHRwcz98ZnRwfGZpbGUpOlwvXC8vKSwgJycpKTsNCiAgICAgICAgfSwgdHlwZTogInRleHQiDQogICAgfSk7DQoNCiAgICB0cy5hZGRQYXJzZXIoew0KICAgICAgICBpZDogImlzb0RhdGUiLA0KICAgICAgICBpczogZnVuY3Rpb24gKHMpIHsNCiAgICAgICAgICAgIHJldHVybiAvXlxkezR9W1wvLV1cZHsxLDJ9W1wvLV1cZHsxLDJ9JC8udGVzdChzKTsNCiAgICAgICAgfSwgZm9ybWF0OiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgcmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQoKHMgIT0gIiIpID8gbmV3IERhdGUocy5yZXBsYWNlKA0KICAgICAgICAgICAgbmV3IFJlZ0V4cCgvLS9nKSwgIi8iKSkuZ2V0VGltZSgpIDogIjAiKTsNCiAgICAgICAgfSwgdHlwZTogIm51bWVyaWMiDQogICAgfSk7DQoNCiAgICB0cy5hZGRQYXJzZXIoew0KICAgICAgICBpZDogInBlcmNlbnQiLA0KICAgICAgICBpczogZnVuY3Rpb24gKHMpIHsNCiAgICAgICAgICAgIHJldHVybiAvXCUkLy50ZXN0KCQudHJpbShzKSk7DQogICAgICAgIH0sIGZvcm1hdDogZnVuY3Rpb24gKHMpIHsNCiAgICAgICAgICAgIHJldHVybiAkLnRhYmxlc29ydGVyLmZvcm1hdEZsb2F0KHMucmVwbGFjZShuZXcgUmVnRXhwKC8lL2cpLCAiIikpOw0KICAgICAgICB9LCB0eXBlOiAibnVtZXJpYyINCiAgICB9KTsNCg0KICAgIHRzLmFkZFBhcnNlcih7DQogICAgICAgIGlkOiAidXNMb25nRGF0ZSIsDQogICAgICAgIGlzOiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgcmV0dXJuIHMubWF0Y2gobmV3IFJlZ0V4cCgvXltBLVphLXpdezMsMTB9XC4/IFswLTldezEsMn0sIChbMC05XXs0fXwnP1swLTldezJ9KSAoKFswLTJdP1swLTldOlswLTVdWzAtOV0pfChbMC0xXT9bMC05XTpbMC01XVswLTldXHMoQU18UE0pKSkkLykpOw0KICAgICAgICB9LCBmb3JtYXQ6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4gJC50YWJsZXNvcnRlci5mb3JtYXRGbG9hdChuZXcgRGF0ZShzKS5nZXRUaW1lKCkpOw0KICAgICAgICB9LCB0eXBlOiAibnVtZXJpYyINCiAgICB9KTsNCg0KICAgIHRzLmFkZFBhcnNlcih7DQogICAgICAgIGlkOiAic2hvcnREYXRlIiwNCiAgICAgICAgaXM6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4gL1xkezEsMn1bXC9cLV1cZHsxLDJ9W1wvXC1dXGR7Miw0fS8udGVzdChzKTsNCiAgICAgICAgfSwgZm9ybWF0OiBmdW5jdGlvbiAocywgdGFibGUpIHsNCiAgICAgICAgICAgIHZhciBjID0gdGFibGUuY29uZmlnOw0KICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgvXC0vZywgIi8iKTsNCiAgICAgICAgICAgIGlmIChjLmRhdGVGb3JtYXQgPT0gInVzIikgew0KICAgICAgICAgICAgICAgIC8vIHJlZm9ybWF0IHRoZSBzdHJpbmcgaW4gSVNPIGZvcm1hdA0KICAgICAgICAgICAgICAgIHMgPSBzLnJlcGxhY2UoLyhcZHsxLDJ9KVtcL1wtXShcZHsxLDJ9KVtcL1wtXShcZHs0fSkvLCAiJDMvJDEvJDIiKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoYy5kYXRlRm9ybWF0ID09ICJ1ayIpIHsNCiAgICAgICAgICAgICAgICAvLyByZWZvcm1hdCB0aGUgc3RyaW5nIGluIElTTyBmb3JtYXQNCiAgICAgICAgICAgICAgICBzID0gcy5yZXBsYWNlKC8oXGR7MSwyfSlbXC9cLV0oXGR7MSwyfSlbXC9cLV0oXGR7NH0pLywgIiQzLyQyLyQxIik7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGMuZGF0ZUZvcm1hdCA9PSAiZGQvbW0veXkiIHx8IGMuZGF0ZUZvcm1hdCA9PSAiZGQtbW0teXkiKSB7DQogICAgICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgvKFxkezEsMn0pW1wvXC1dKFxkezEsMn0pW1wvXC1dKFxkezJ9KS8sICIkMS8kMi8kMyIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQobmV3IERhdGUocykuZ2V0VGltZSgpKTsNCiAgICAgICAgfSwgdHlwZTogIm51bWVyaWMiDQogICAgfSk7DQogICAgdHMuYWRkUGFyc2VyKHsNCiAgICAgICAgaWQ6ICJ0aW1lIiwNCiAgICAgICAgaXM6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4gL14oKFswLTJdP1swLTldOlswLTVdWzAtOV0pfChbMC0xXT9bMC05XTpbMC01XVswLTldXHMoYW18cG0pKSkkLy50ZXN0KHMpOw0KICAgICAgICB9LCBmb3JtYXQ6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4gJC50YWJsZXNvcnRlci5mb3JtYXRGbG9hdChuZXcgRGF0ZSgiMjAwMC8wMS8wMSAiICsgcykuZ2V0VGltZSgpKTsNCiAgICAgICAgfSwgdHlwZTogIm51bWVyaWMiDQogICAgfSk7DQogICAgdHMuYWRkUGFyc2VyKHsNCiAgICAgICAgaWQ6ICJtZXRhZGF0YSIsDQogICAgICAgIGlzOiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9LCBmb3JtYXQ6IGZ1bmN0aW9uIChzLCB0YWJsZSwgY2VsbCkgew0KICAgICAgICAgICAgdmFyIGMgPSB0YWJsZS5jb25maWcsDQogICAgICAgICAgICAgICAgcCA9ICghYy5wYXJzZXJNZXRhZGF0YU5hbWUpID8gJ3NvcnRWYWx1ZScgOiBjLnBhcnNlck1ldGFkYXRhTmFtZTsNCiAgICAgICAgICAgIHJldHVybiAkKGNlbGwpLm1ldGFkYXRhKClbcF07DQogICAgICAgIH0sIHR5cGU6ICJudW1lcmljIg0KICAgIH0pOw0KICAgIC8vIGFkZCBkZWZhdWx0IHdpZGdldHMNCiAgICB0cy5hZGRXaWRnZXQoew0KICAgICAgICBpZDogInplYnJhIiwNCiAgICAgICAgZm9ybWF0OiBmdW5jdGlvbiAodGFibGUpIHsNCiAgICAgICAgICAgIGlmICh0YWJsZS5jb25maWcuZGVidWcpIHsNCiAgICAgICAgICAgICAgICB2YXIgdGltZSA9IG5ldyBEYXRlKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgJHRyLCByb3cgPSAtMSwNCiAgICAgICAgICAgICAgICBvZGQ7DQogICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhlIHZpc2libGUgcm93cw0KICAgICAgICAgICAgJCgidHI6dmlzaWJsZSIsIHRhYmxlLnRCb2RpZXNbMF0pLmVhY2goZnVuY3Rpb24gKGkpIHsNCiAgICAgICAgICAgICAgICAkdHIgPSAkKHRoaXMpOw0KICAgICAgICAgICAgICAgIC8vIHN0eWxlIGNoaWxkcmVuIHJvd3MgdGhlIHNhbWUgd2F5IHRoZSBwYXJlbnQNCiAgICAgICAgICAgICAgICAvLyByb3cgd2FzIHN0eWxlZA0KICAgICAgICAgICAgICAgIGlmICghJHRyLmhhc0NsYXNzKHRhYmxlLmNvbmZpZy5jc3NDaGlsZFJvdykpIHJvdysrOw0KICAgICAgICAgICAgICAgIG9kZCA9IChyb3cgJSAyID09IDApOw0KICAgICAgICAgICAgICAgICR0ci5yZW1vdmVDbGFzcygNCiAgICAgICAgICAgICAgICB0YWJsZS5jb25maWcud2lkZ2V0WmVicmEuY3NzW29kZCA/IDAgOiAxXSkuYWRkQ2xhc3MoDQogICAgICAgICAgICAgICAgdGFibGUuY29uZmlnLndpZGdldFplYnJhLmNzc1tvZGQgPyAxIDogMF0pDQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGlmICh0YWJsZS5jb25maWcuZGVidWcpIHsNCiAgICAgICAgICAgICAgICAkLnRhYmxlc29ydGVyLmJlbmNobWFyaygiQXBwbHlpbmcgWmVicmEgd2lkZ2V0IiwgdGltZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCn0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/jquery.tablesorter.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CihmdW5jdGlvbigkKXskLmV4dGVuZCh7dGFibGVzb3J0ZXI6bmV3CmZ1bmN0aW9uKCl7dmFyIHBhcnNlcnM9W10sd2lkZ2V0cz1bXTt0aGlzLmRlZmF1bHRzPXtjc3NIZWFkZXI6ImhlYWRlciIsY3NzQXNjOiJoZWFkZXJTb3J0VXAiLGNzc0Rlc2M6ImhlYWRlclNvcnREb3duIixjc3NDaGlsZFJvdzoiZXhwYW5kLWNoaWxkIixzb3J0SW5pdGlhbE9yZGVyOiJhc2MiLHNvcnRNdWx0aVNvcnRLZXk6InNoaWZ0S2V5Iixzb3J0Rm9yY2U6bnVsbCxzb3J0QXBwZW5kOm51bGwsc29ydExvY2FsZUNvbXBhcmU6dHJ1ZSx0ZXh0RXh0cmFjdGlvbjoic2ltcGxlIixwYXJzZXJzOnt9LHdpZGdldHM6W10sd2lkZ2V0WmVicmE6e2NzczpbImV2ZW4iLCJvZGQiXX0saGVhZGVyczp7fSx3aWR0aEZpeGVkOmZhbHNlLGNhbmNlbFNlbGVjdGlvbjp0cnVlLHNvcnRMaXN0OltdLGhlYWRlckxpc3Q6W10sZGF0ZUZvcm1hdDoidXMiLGRlY2ltYWw6Jy9cLnxcLC9nJyxvblJlbmRlckhlYWRlcjpudWxsLHNlbGVjdG9ySGVhZGVyczondGhlYWQgdGgnLGRlYnVnOmZhbHNlfTtmdW5jdGlvbiBiZW5jaG1hcmsocyxkKXtsb2cocysiLCIrKG5ldyBEYXRlKCkuZ2V0VGltZSgpLWQuZ2V0VGltZSgpKSsibXMiKTt9dGhpcy5iZW5jaG1hcms9YmVuY2htYXJrO2Z1bmN0aW9uIGxvZyhzKXtpZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCImJnR5cGVvZiBjb25zb2xlLmRlYnVnIT0idW5kZWZpbmVkIil7Y29uc29sZS5sb2cocyk7fWVsc2V7YWxlcnQocyk7fX1mdW5jdGlvbiBidWlsZFBhcnNlckNhY2hlKHRhYmxlLCRoZWFkZXJzKXtpZih0YWJsZS5jb25maWcuZGVidWcpe3ZhciBwYXJzZXJzRGVidWc9IiI7fWlmKHRhYmxlLnRCb2RpZXMubGVuZ3RoPT0wKXJldHVybjt2YXIgcm93cz10YWJsZS50Qm9kaWVzWzBdLnJvd3M7aWYocm93c1swXSl7dmFyIGxpc3Q9W10sY2VsbHM9cm93c1swXS5jZWxscyxsPWNlbGxzLmxlbmd0aDtmb3IodmFyIGk9MDtpPGw7aSsrKXt2YXIgcD1mYWxzZTtpZigkLm1ldGFkYXRhJiYoJCgkaGVhZGVyc1tpXSkubWV0YWRhdGEoKSYmJCgkaGVhZGVyc1tpXSkubWV0YWRhdGEoKS5zb3J0ZXIpKXtwPWdldFBhcnNlckJ5SWQoJCgkaGVhZGVyc1tpXSkubWV0YWRhdGEoKS5zb3J0ZXIpO31lbHNlIGlmKCh0YWJsZS5jb25maWcuaGVhZGVyc1tpXSYmdGFibGUuY29uZmlnLmhlYWRlcnNbaV0uc29ydGVyKSl7cD1nZXRQYXJzZXJCeUlkKHRhYmxlLmNvbmZpZy5oZWFkZXJzW2ldLnNvcnRlcik7fWlmKCFwKXtwPWRldGVjdFBhcnNlckZvckNvbHVtbih0YWJsZSxyb3dzLC0xLGkpO31pZih0YWJsZS5jb25maWcuZGVidWcpe3BhcnNlcnNEZWJ1Zys9ImNvbHVtbjoiK2krIiBwYXJzZXI6IitwLmlkKyJcbiI7fWxpc3QucHVzaChwKTt9fWlmKHRhYmxlLmNvbmZpZy5kZWJ1Zyl7bG9nKHBhcnNlcnNEZWJ1Zyk7fXJldHVybiBsaXN0O307ZnVuY3Rpb24gZGV0ZWN0UGFyc2VyRm9yQ29sdW1uKHRhYmxlLHJvd3Mscm93SW5kZXgsY2VsbEluZGV4KXt2YXIgbD1wYXJzZXJzLmxlbmd0aCxub2RlPWZhbHNlLG5vZGVWYWx1ZT1mYWxzZSxrZWVwTG9va2luZz10cnVlO3doaWxlKG5vZGVWYWx1ZT09JycmJmtlZXBMb29raW5nKXtyb3dJbmRleCsrO2lmKHJvd3Nbcm93SW5kZXhdKXtub2RlPWdldE5vZGVGcm9tUm93QW5kQ2VsbEluZGV4KHJvd3Mscm93SW5kZXgsY2VsbEluZGV4KTtub2RlVmFsdWU9dHJpbUFuZEdldE5vZGVUZXh0KHRhYmxlLmNvbmZpZyxub2RlKTtpZih0YWJsZS5jb25maWcuZGVidWcpe2xvZygnQ2hlY2tpbmcgaWYgdmFsdWUgd2FzIGVtcHR5IG9uIHJvdzonK3Jvd0luZGV4KTt9fWVsc2V7a2VlcExvb2tpbmc9ZmFsc2U7fX1mb3IodmFyIGk9MTtpPGw7aSsrKXtpZihwYXJzZXJzW2ldLmlzKG5vZGVWYWx1ZSx0YWJsZSxub2RlKSl7cmV0dXJuIHBhcnNlcnNbaV07fX1yZXR1cm4gcGFyc2Vyc1swXTt9ZnVuY3Rpb24gZ2V0Tm9kZUZyb21Sb3dBbmRDZWxsSW5kZXgocm93cyxyb3dJbmRleCxjZWxsSW5kZXgpe3JldHVybiByb3dzW3Jvd0luZGV4XS5jZWxsc1tjZWxsSW5kZXhdO31mdW5jdGlvbiB0cmltQW5kR2V0Tm9kZVRleHQoY29uZmlnLG5vZGUpe3JldHVybiAkLnRyaW0oZ2V0RWxlbWVudFRleHQoY29uZmlnLG5vZGUpKTt9ZnVuY3Rpb24gZ2V0UGFyc2VyQnlJZChuYW1lKXt2YXIgbD1wYXJzZXJzLmxlbmd0aDtmb3IodmFyIGk9MDtpPGw7aSsrKXtpZihwYXJzZXJzW2ldLmlkLnRvTG93ZXJDYXNlKCk9PW5hbWUudG9Mb3dlckNhc2UoKSl7cmV0dXJuIHBhcnNlcnNbaV07fX1yZXR1cm4gZmFsc2U7fWZ1bmN0aW9uIGJ1aWxkQ2FjaGUodGFibGUpe2lmKHRhYmxlLmNvbmZpZy5kZWJ1Zyl7dmFyIGNhY2hlVGltZT1uZXcgRGF0ZSgpO312YXIgdG90YWxSb3dzPSh0YWJsZS50Qm9kaWVzWzBdJiZ0YWJsZS50Qm9kaWVzWzBdLnJvd3MubGVuZ3RoKXx8MCx0b3RhbENlbGxzPSh0YWJsZS50Qm9kaWVzWzBdLnJvd3NbMF0mJnRhYmxlLnRCb2RpZXNbMF0ucm93c1swXS5jZWxscy5sZW5ndGgpfHwwLHBhcnNlcnM9dGFibGUuY29uZmlnLnBhcnNlcnMsY2FjaGU9e3JvdzpbXSxub3JtYWxpemVkOltdfTtmb3IodmFyIGk9MDtpPHRvdGFsUm93czsrK2kpe3ZhciBjPSQodGFibGUudEJvZGllc1swXS5yb3dzW2ldKSxjb2xzPVtdO2lmKGMuaGFzQ2xhc3ModGFibGUuY29uZmlnLmNzc0NoaWxkUm93KSl7Y2FjaGUucm93W2NhY2hlLnJvdy5sZW5ndGgtMV09Y2FjaGUucm93W2NhY2hlLnJvdy5sZW5ndGgtMV0uYWRkKGMpO2NvbnRpbnVlO31jYWNoZS5yb3cucHVzaChjKTtmb3IodmFyIGo9MDtqPHRvdGFsQ2VsbHM7KytqKXtjb2xzLnB1c2gocGFyc2Vyc1tqXS5mb3JtYXQoZ2V0RWxlbWVudFRleHQodGFibGUuY29uZmlnLGNbMF0uY2VsbHNbal0pLHRhYmxlLGNbMF0uY2VsbHNbal0pKTt9Y29scy5wdXNoKGNhY2hlLm5vcm1hbGl6ZWQubGVuZ3RoKTtjYWNoZS5ub3JtYWxpemVkLnB1c2goY29scyk7Y29scz1udWxsO307aWYodGFibGUuY29uZmlnLmRlYnVnKXtiZW5jaG1hcmsoIkJ1aWxkaW5nIGNhY2hlIGZvciAiK3RvdGFsUm93cysiIHJvd3M6IixjYWNoZVRpbWUpO31yZXR1cm4gY2FjaGU7fTtmdW5jdGlvbiBnZXRFbGVtZW50VGV4dChjb25maWcsbm9kZSl7dmFyIHRleHQ9IiI7aWYoIW5vZGUpcmV0dXJuIiI7aWYoIWNvbmZpZy5zdXBwb3J0c1RleHRDb250ZW50KWNvbmZpZy5zdXBwb3J0c1RleHRDb250ZW50PW5vZGUudGV4dENvbnRlbnR8fGZhbHNlO2lmKGNvbmZpZy50ZXh0RXh0cmFjdGlvbj09InNpbXBsZSIpe2lmKGNvbmZpZy5zdXBwb3J0c1RleHRDb250ZW50KXt0ZXh0PW5vZGUudGV4dENvbnRlbnQ7fWVsc2V7aWYobm9kZS5jaGlsZE5vZGVzWzBdJiZub2RlLmNoaWxkTm9kZXNbMF0uaGFzQ2hpbGROb2RlcygpKXt0ZXh0PW5vZGUuY2hpbGROb2Rlc1swXS5pbm5lckhUTUw7fWVsc2V7dGV4dD1ub2RlLmlubmVySFRNTDt9fX1lbHNle2lmKHR5cGVvZihjb25maWcudGV4dEV4dHJhY3Rpb24pPT0iZnVuY3Rpb24iKXt0ZXh0PWNvbmZpZy50ZXh0RXh0cmFjdGlvbihub2RlKTt9ZWxzZXt0ZXh0PSQobm9kZSkudGV4dCgpO319cmV0dXJuIHRleHQ7fWZ1bmN0aW9uIGFwcGVuZFRvVGFibGUodGFibGUsY2FjaGUpe2lmKHRhYmxlLmNvbmZpZy5kZWJ1Zyl7dmFyIGFwcGVuZFRpbWU9bmV3IERhdGUoKX12YXIgYz1jYWNoZSxyPWMucm93LG49Yy5ub3JtYWxpemVkLHRvdGFsUm93cz1uLmxlbmd0aCxjaGVja0NlbGw9KG5bMF0ubGVuZ3RoLTEpLHRhYmxlQm9keT0kKHRhYmxlLnRCb2RpZXNbMF0pLHJvd3M9W107Zm9yKHZhciBpPTA7aTx0b3RhbFJvd3M7aSsrKXt2YXIgcG9zPW5baV1bY2hlY2tDZWxsXTtyb3dzLnB1c2gocltwb3NdKTtpZighdGFibGUuY29uZmlnLmFwcGVuZGVyKXt2YXIgbD1yW3Bvc10ubGVuZ3RoO2Zvcih2YXIgaj0wO2o8bDtqKyspe3RhYmxlQm9keVswXS5hcHBlbmRDaGlsZChyW3Bvc11bal0pO319fWlmKHRhYmxlLmNvbmZpZy5hcHBlbmRlcil7dGFibGUuY29uZmlnLmFwcGVuZGVyKHRhYmxlLHJvd3MpO31yb3dzPW51bGw7aWYodGFibGUuY29uZmlnLmRlYnVnKXtiZW5jaG1hcmsoIlJlYnVpbHQgdGFibGU6IixhcHBlbmRUaW1lKTt9YXBwbHlXaWRnZXQodGFibGUpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXskKHRhYmxlKS50cmlnZ2VyKCJzb3J0RW5kIik7fSwwKTt9O2Z1bmN0aW9uIGJ1aWxkSGVhZGVycyh0YWJsZSl7aWYodGFibGUuY29uZmlnLmRlYnVnKXt2YXIgdGltZT1uZXcgRGF0ZSgpO312YXIgbWV0YT0oJC5tZXRhZGF0YSk/dHJ1ZTpmYWxzZTt2YXIgaGVhZGVyX2luZGV4PWNvbXB1dGVUYWJsZUhlYWRlckNlbGxJbmRleGVzKHRhYmxlKTskdGFibGVIZWFkZXJzPSQodGFibGUuY29uZmlnLnNlbGVjdG9ySGVhZGVycyx0YWJsZSkuZWFjaChmdW5jdGlvbihpbmRleCl7dGhpcy5jb2x1bW49aGVhZGVyX2luZGV4W3RoaXMucGFyZW50Tm9kZS5yb3dJbmRleCsiLSIrdGhpcy5jZWxsSW5kZXhdO3RoaXMub3JkZXI9Zm9ybWF0U29ydGluZ09yZGVyKHRhYmxlLmNvbmZpZy5zb3J0SW5pdGlhbE9yZGVyKTt0aGlzLmNvdW50PXRoaXMub3JkZXI7aWYoY2hlY2tIZWFkZXJNZXRhZGF0YSh0aGlzKXx8Y2hlY2tIZWFkZXJPcHRpb25zKHRhYmxlLGluZGV4KSl0aGlzLnNvcnREaXNhYmxlZD10cnVlO2lmKGNoZWNrSGVhZGVyT3B0aW9uc1NvcnRpbmdMb2NrZWQodGFibGUsaW5kZXgpKXRoaXMub3JkZXI9dGhpcy5sb2NrZWRPcmRlcj1jaGVja0hlYWRlck9wdGlvbnNTb3J0aW5nTG9ja2VkKHRhYmxlLGluZGV4KTtpZighdGhpcy5zb3J0RGlzYWJsZWQpe3ZhciAkdGg9JCh0aGlzKS5hZGRDbGFzcyh0YWJsZS5jb25maWcuY3NzSGVhZGVyKTtpZih0YWJsZS5jb25maWcub25SZW5kZXJIZWFkZXIpdGFibGUuY29uZmlnLm9uUmVuZGVySGVhZGVyLmFwcGx5KCR0aCk7fXRhYmxlLmNvbmZpZy5oZWFkZXJMaXN0W2luZGV4XT10aGlzO30pO2lmKHRhYmxlLmNvbmZpZy5kZWJ1Zyl7YmVuY2htYXJrKCJCdWlsdCBoZWFkZXJzOiIsdGltZSk7bG9nKCR0YWJsZUhlYWRlcnMpO31yZXR1cm4gJHRhYmxlSGVhZGVyczt9O2Z1bmN0aW9uIGNvbXB1dGVUYWJsZUhlYWRlckNlbGxJbmRleGVzKHQpe3ZhciBtYXRyaXg9W107dmFyIGxvb2t1cD17fTt2YXIgdGhlYWQ9dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnVEhFQUQnKVswXTt2YXIgdHJzPXRoZWFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdUUicpO2Zvcih2YXIgaT0wO2k8dHJzLmxlbmd0aDtpKyspe3ZhciBjZWxscz10cnNbaV0uY2VsbHM7Zm9yKHZhciBqPTA7ajxjZWxscy5sZW5ndGg7aisrKXt2YXIgYz1jZWxsc1tqXTt2YXIgcm93SW5kZXg9Yy5wYXJlbnROb2RlLnJvd0luZGV4O3ZhciBjZWxsSWQ9cm93SW5kZXgrIi0iK2MuY2VsbEluZGV4O3ZhciByb3dTcGFuPWMucm93U3Bhbnx8MTt2YXIgY29sU3Bhbj1jLmNvbFNwYW58fDEKdmFyIGZpcnN0QXZhaWxDb2w7aWYodHlwZW9mKG1hdHJpeFtyb3dJbmRleF0pPT0idW5kZWZpbmVkIil7bWF0cml4W3Jvd0luZGV4XT1bXTt9Zm9yKHZhciBrPTA7azxtYXRyaXhbcm93SW5kZXhdLmxlbmd0aCsxO2srKyl7aWYodHlwZW9mKG1hdHJpeFtyb3dJbmRleF1ba10pPT0idW5kZWZpbmVkIil7Zmlyc3RBdmFpbENvbD1rO2JyZWFrO319bG9va3VwW2NlbGxJZF09Zmlyc3RBdmFpbENvbDtmb3IodmFyIGs9cm93SW5kZXg7azxyb3dJbmRleCtyb3dTcGFuO2srKyl7aWYodHlwZW9mKG1hdHJpeFtrXSk9PSJ1bmRlZmluZWQiKXttYXRyaXhba109W107fXZhciBtYXRyaXhyb3c9bWF0cml4W2tdO2Zvcih2YXIgbD1maXJzdEF2YWlsQ29sO2w8Zmlyc3RBdmFpbENvbCtjb2xTcGFuO2wrKyl7bWF0cml4cm93W2xdPSJ4Ijt9fX19cmV0dXJuIGxvb2t1cDt9ZnVuY3Rpb24gY2hlY2tDZWxsQ29sU3Bhbih0YWJsZSxyb3dzLHJvdyl7dmFyIGFycj1bXSxyPXRhYmxlLnRIZWFkLnJvd3MsYz1yW3Jvd10uY2VsbHM7Zm9yKHZhciBpPTA7aTxjLmxlbmd0aDtpKyspe3ZhciBjZWxsPWNbaV07aWYoY2VsbC5jb2xTcGFuPjEpe2Fycj1hcnIuY29uY2F0KGNoZWNrQ2VsbENvbFNwYW4odGFibGUsaGVhZGVyQXJyLHJvdysrKSk7fWVsc2V7aWYodGFibGUudEhlYWQubGVuZ3RoPT0xfHwoY2VsbC5yb3dTcGFuPjF8fCFyW3JvdysxXSkpe2Fyci5wdXNoKGNlbGwpO319fXJldHVybiBhcnI7fTtmdW5jdGlvbiBjaGVja0hlYWRlck1ldGFkYXRhKGNlbGwpe2lmKCgkLm1ldGFkYXRhKSYmKCQoY2VsbCkubWV0YWRhdGEoKS5zb3J0ZXI9PT1mYWxzZSkpe3JldHVybiB0cnVlO307cmV0dXJuIGZhbHNlO31mdW5jdGlvbiBjaGVja0hlYWRlck9wdGlvbnModGFibGUsaSl7aWYoKHRhYmxlLmNvbmZpZy5oZWFkZXJzW2ldKSYmKHRhYmxlLmNvbmZpZy5oZWFkZXJzW2ldLnNvcnRlcj09PWZhbHNlKSl7cmV0dXJuIHRydWU7fTtyZXR1cm4gZmFsc2U7fWZ1bmN0aW9uIGNoZWNrSGVhZGVyT3B0aW9uc1NvcnRpbmdMb2NrZWQodGFibGUsaSl7aWYoKHRhYmxlLmNvbmZpZy5oZWFkZXJzW2ldKSYmKHRhYmxlLmNvbmZpZy5oZWFkZXJzW2ldLmxvY2tlZE9yZGVyKSlyZXR1cm4gdGFibGUuY29uZmlnLmhlYWRlcnNbaV0ubG9ja2VkT3JkZXI7cmV0dXJuIGZhbHNlO31mdW5jdGlvbiBhcHBseVdpZGdldCh0YWJsZSl7dmFyIGM9dGFibGUuY29uZmlnLndpZGdldHM7dmFyIGw9Yy5sZW5ndGg7Zm9yKHZhciBpPTA7aTxsO2krKyl7Z2V0V2lkZ2V0QnlJZChjW2ldKS5mb3JtYXQodGFibGUpO319ZnVuY3Rpb24gZ2V0V2lkZ2V0QnlJZChuYW1lKXt2YXIgbD13aWRnZXRzLmxlbmd0aDtmb3IodmFyIGk9MDtpPGw7aSsrKXtpZih3aWRnZXRzW2ldLmlkLnRvTG93ZXJDYXNlKCk9PW5hbWUudG9Mb3dlckNhc2UoKSl7cmV0dXJuIHdpZGdldHNbaV07fX19O2Z1bmN0aW9uIGZvcm1hdFNvcnRpbmdPcmRlcih2KXtpZih0eXBlb2YodikhPSJOdW1iZXIiKXtyZXR1cm4odi50b0xvd2VyQ2FzZSgpPT0iZGVzYyIpPzE6MDt9ZWxzZXtyZXR1cm4odj09MSk/MTowO319ZnVuY3Rpb24gaXNWYWx1ZUluQXJyYXkodixhKXt2YXIgbD1hLmxlbmd0aDtmb3IodmFyIGk9MDtpPGw7aSsrKXtpZihhW2ldWzBdPT12KXtyZXR1cm4gdHJ1ZTt9fXJldHVybiBmYWxzZTt9ZnVuY3Rpb24gc2V0SGVhZGVyc0Nzcyh0YWJsZSwkaGVhZGVycyxsaXN0LGNzcyl7JGhlYWRlcnMucmVtb3ZlQ2xhc3MoY3NzWzBdKS5yZW1vdmVDbGFzcyhjc3NbMV0pO3ZhciBoPVtdOyRoZWFkZXJzLmVhY2goZnVuY3Rpb24ob2Zmc2V0KXtpZighdGhpcy5zb3J0RGlzYWJsZWQpe2hbdGhpcy5jb2x1bW5dPSQodGhpcyk7fX0pO3ZhciBsPWxpc3QubGVuZ3RoO2Zvcih2YXIgaT0wO2k8bDtpKyspe2hbbGlzdFtpXVswXV0uYWRkQ2xhc3MoY3NzW2xpc3RbaV1bMV1dKTt9fWZ1bmN0aW9uIGZpeENvbHVtbldpZHRoKHRhYmxlLCRoZWFkZXJzKXt2YXIgYz10YWJsZS5jb25maWc7aWYoYy53aWR0aEZpeGVkKXt2YXIgY29sZ3JvdXA9JCgnPGNvbGdyb3VwPicpOyQoInRyOmZpcnN0IHRkIix0YWJsZS50Qm9kaWVzWzBdKS5lYWNoKGZ1bmN0aW9uKCl7Y29sZ3JvdXAuYXBwZW5kKCQoJzxjb2w+JykuY3NzKCd3aWR0aCcsJCh0aGlzKS53aWR0aCgpKSk7fSk7JCh0YWJsZSkucHJlcGVuZChjb2xncm91cCk7fTt9ZnVuY3Rpb24gdXBkYXRlSGVhZGVyU29ydENvdW50KHRhYmxlLHNvcnRMaXN0KXt2YXIgYz10YWJsZS5jb25maWcsbD1zb3J0TGlzdC5sZW5ndGg7Zm9yKHZhciBpPTA7aTxsO2krKyl7dmFyIHM9c29ydExpc3RbaV0sbz1jLmhlYWRlckxpc3Rbc1swXV07by5jb3VudD1zWzFdO28uY291bnQrKzt9fWZ1bmN0aW9uIG11bHRpc29ydCh0YWJsZSxzb3J0TGlzdCxjYWNoZSl7aWYodGFibGUuY29uZmlnLmRlYnVnKXt2YXIgc29ydFRpbWU9bmV3IERhdGUoKTt9dmFyIGR5bmFtaWNFeHA9InZhciBzb3J0V3JhcHBlciA9IGZ1bmN0aW9uKGEsYikgeyIsbD1zb3J0TGlzdC5sZW5ndGg7Zm9yKHZhciBpPTA7aTxsO2krKyl7dmFyIGM9c29ydExpc3RbaV1bMF07dmFyIG9yZGVyPXNvcnRMaXN0W2ldWzFdO3ZhciBzPSh0YWJsZS5jb25maWcucGFyc2Vyc1tjXS50eXBlPT0idGV4dCIpPygob3JkZXI9PTApP21ha2VTb3J0RnVuY3Rpb24oInRleHQiLCJhc2MiLGMpOm1ha2VTb3J0RnVuY3Rpb24oInRleHQiLCJkZXNjIixjKSk6KChvcmRlcj09MCk/bWFrZVNvcnRGdW5jdGlvbigibnVtZXJpYyIsImFzYyIsYyk6bWFrZVNvcnRGdW5jdGlvbigibnVtZXJpYyIsImRlc2MiLGMpKTt2YXIgZT0iZSIraTtkeW5hbWljRXhwKz0idmFyICIrZSsiID0gIitzO2R5bmFtaWNFeHArPSJpZigiK2UrIikgeyByZXR1cm4gIitlKyI7IH0gIjtkeW5hbWljRXhwKz0iZWxzZSB7ICI7fXZhciBvcmdPcmRlckNvbD1jYWNoZS5ub3JtYWxpemVkWzBdLmxlbmd0aC0xO2R5bmFtaWNFeHArPSJyZXR1cm4gYVsiK29yZ09yZGVyQ29sKyJdLWJbIitvcmdPcmRlckNvbCsiXTsiO2Zvcih2YXIgaT0wO2k8bDtpKyspe2R5bmFtaWNFeHArPSJ9OyAiO31keW5hbWljRXhwKz0icmV0dXJuIDA7ICI7ZHluYW1pY0V4cCs9In07ICI7aWYodGFibGUuY29uZmlnLmRlYnVnKXtiZW5jaG1hcmsoIkV2YWxpbmcgZXhwcmVzc2lvbjoiK2R5bmFtaWNFeHAsbmV3IERhdGUoKSk7fWV2YWwoZHluYW1pY0V4cCk7Y2FjaGUubm9ybWFsaXplZC5zb3J0KHNvcnRXcmFwcGVyKTtpZih0YWJsZS5jb25maWcuZGVidWcpe2JlbmNobWFyaygiU29ydGluZyBvbiAiK3NvcnRMaXN0LnRvU3RyaW5nKCkrIiBhbmQgZGlyICIrb3JkZXIrIiB0aW1lOiIsc29ydFRpbWUpO31yZXR1cm4gY2FjaGU7fTtmdW5jdGlvbiBtYWtlU29ydEZ1bmN0aW9uKHR5cGUsZGlyZWN0aW9uLGluZGV4KXt2YXIgYT0iYVsiK2luZGV4KyJdIixiPSJiWyIraW5kZXgrIl0iO2lmKHR5cGU9PSd0ZXh0JyYmZGlyZWN0aW9uPT0nYXNjJyl7cmV0dXJuIigiK2ErIiA9PSAiK2IrIiA/IDAgOiAoIithKyIgPT09IG51bGwgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiAoIitiKyIgPT09IG51bGwgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgOiAoIithKyIgPCAiK2IrIikgPyAtMSA6IDEgKSkpOyI7fWVsc2UgaWYodHlwZT09J3RleHQnJiZkaXJlY3Rpb249PSdkZXNjJyl7cmV0dXJuIigiK2ErIiA9PSAiK2IrIiA/IDAgOiAoIithKyIgPT09IG51bGwgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiAoIitiKyIgPT09IG51bGwgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgOiAoIitiKyIgPCAiK2ErIikgPyAtMSA6IDEgKSkpOyI7fWVsc2UgaWYodHlwZT09J251bWVyaWMnJiZkaXJlY3Rpb249PSdhc2MnKXtyZXR1cm4iKCIrYSsiID09PSBudWxsICYmICIrYisiID09PSBudWxsKSA/IDAgOigiK2ErIiA9PT0gbnVsbCA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6ICgiK2IrIiA9PT0gbnVsbCA/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA6ICIrYSsiIC0gIitiKyIpKTsiO31lbHNlIGlmKHR5cGU9PSdudW1lcmljJyYmZGlyZWN0aW9uPT0nZGVzYycpe3JldHVybiIoIithKyIgPT09IG51bGwgJiYgIitiKyIgPT09IG51bGwpID8gMCA6KCIrYSsiID09PSBudWxsID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogKCIrYisiID09PSBudWxsID8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIDogIitiKyIgLSAiK2ErIikpOyI7fX07ZnVuY3Rpb24gbWFrZVNvcnRUZXh0KGkpe3JldHVybiIoKGFbIitpKyJdIDwgYlsiK2krIl0pID8gLTEgOiAoKGFbIitpKyJdID4gYlsiK2krIl0pID8gMSA6IDApKTsiO307ZnVuY3Rpb24gbWFrZVNvcnRUZXh0RGVzYyhpKXtyZXR1cm4iKChiWyIraSsiXSA8IGFbIitpKyJdKSA/IC0xIDogKChiWyIraSsiXSA+IGFbIitpKyJdKSA/IDEgOiAwKSk7Ijt9O2Z1bmN0aW9uIG1ha2VTb3J0TnVtZXJpYyhpKXtyZXR1cm4iYVsiK2krIl0tYlsiK2krIl07Ijt9O2Z1bmN0aW9uIG1ha2VTb3J0TnVtZXJpY0Rlc2MoaSl7cmV0dXJuImJbIitpKyJdLWFbIitpKyJdOyI7fTtmdW5jdGlvbiBzb3J0VGV4dChhLGIpe2lmKHRhYmxlLmNvbmZpZy5zb3J0TG9jYWxlQ29tcGFyZSlyZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpO3JldHVybigoYTxiKT8tMTooKGE+Yik/MTowKSk7fTtmdW5jdGlvbiBzb3J0VGV4dERlc2MoYSxiKXtpZih0YWJsZS5jb25maWcuc29ydExvY2FsZUNvbXBhcmUpcmV0dXJuIGIubG9jYWxlQ29tcGFyZShhKTtyZXR1cm4oKGI8YSk/LTE6KChiPmEpPzE6MCkpO307ZnVuY3Rpb24gc29ydE51bWVyaWMoYSxiKXtyZXR1cm4gYS1iO307ZnVuY3Rpb24gc29ydE51bWVyaWNEZXNjKGEsYil7cmV0dXJuIGItYTt9O2Z1bmN0aW9uIGdldENhY2hlZFNvcnRUeXBlKHBhcnNlcnMsaSl7cmV0dXJuIHBhcnNlcnNbaV0udHlwZTt9O3RoaXMuY29uc3RydWN0PWZ1bmN0aW9uKHNldHRpbmdzKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoIXRoaXMudEhlYWR8fCF0aGlzLnRCb2RpZXMpcmV0dXJuO3ZhciAkdGhpcywkZG9jdW1lbnQsJGhlYWRlcnMsY2FjaGUsY29uZmlnLHNoaWZ0RG93bj0wLHNvcnRPcmRlcjt0aGlzLmNvbmZpZz17fTtjb25maWc9JC5leHRlbmQodGhpcy5jb25maWcsJC50YWJsZXNvcnRlci5kZWZhdWx0cyxzZXR0aW5ncyk7JHRoaXM9JCh0aGlzKTskLmRhdGEodGhpcywidGFibGVzb3J0ZXIiLGNvbmZpZyk7JGhlYWRlcnM9YnVpbGRIZWFkZXJzKHRoaXMpO3RoaXMuY29uZmlnLnBhcnNlcnM9YnVpbGRQYXJzZXJDYWNoZSh0aGlzLCRoZWFkZXJzKTtjYWNoZT1idWlsZENhY2hlKHRoaXMpO3ZhciBzb3J0Q1NTPVtjb25maWcuY3NzRGVzYyxjb25maWcuY3NzQXNjXTtmaXhDb2x1bW5XaWR0aCh0aGlzKTskaGVhZGVycy5jbGljayhmdW5jdGlvbihlKXt2YXIgdG90YWxSb3dzPSgkdGhpc1swXS50Qm9kaWVzWzBdJiYkdGhpc1swXS50Qm9kaWVzWzBdLnJvd3MubGVuZ3RoKXx8MDtpZighdGhpcy5zb3J0RGlzYWJsZWQmJnRvdGFsUm93cz4wKXskdGhpcy50cmlnZ2VyKCJzb3J0U3RhcnQiKTt2YXIgJGNlbGw9JCh0aGlzKTt2YXIgaT10aGlzLmNvbHVtbjt0aGlzLm9yZGVyPXRoaXMuY291bnQrKyUyO2lmKHRoaXMubG9ja2VkT3JkZXIpdGhpcy5vcmRlcj10aGlzLmxvY2tlZE9yZGVyO2lmKCFlW2NvbmZpZy5zb3J0TXVsdGlTb3J0S2V5XSl7Y29uZmlnLnNvcnRMaXN0PVtdO2lmKGNvbmZpZy5zb3J0Rm9yY2UhPW51bGwpe3ZhciBhPWNvbmZpZy5zb3J0Rm9yY2U7Zm9yKHZhciBqPTA7ajxhLmxlbmd0aDtqKyspe2lmKGFbal1bMF0hPWkpe2NvbmZpZy5zb3J0TGlzdC5wdXNoKGFbal0pO319fWNvbmZpZy5zb3J0TGlzdC5wdXNoKFtpLHRoaXMub3JkZXJdKTt9ZWxzZXtpZihpc1ZhbHVlSW5BcnJheShpLGNvbmZpZy5zb3J0TGlzdCkpe2Zvcih2YXIgaj0wO2o8Y29uZmlnLnNvcnRMaXN0Lmxlbmd0aDtqKyspe3ZhciBzPWNvbmZpZy5zb3J0TGlzdFtqXSxvPWNvbmZpZy5oZWFkZXJMaXN0W3NbMF1dO2lmKHNbMF09PWkpe28uY291bnQ9c1sxXTtvLmNvdW50Kys7c1sxXT1vLmNvdW50JTI7fX19ZWxzZXtjb25maWcuc29ydExpc3QucHVzaChbaSx0aGlzLm9yZGVyXSk7fX07c2V0VGltZW91dChmdW5jdGlvbigpe3NldEhlYWRlcnNDc3MoJHRoaXNbMF0sJGhlYWRlcnMsY29uZmlnLnNvcnRMaXN0LHNvcnRDU1MpO2FwcGVuZFRvVGFibGUoJHRoaXNbMF0sbXVsdGlzb3J0KCR0aGlzWzBdLGNvbmZpZy5zb3J0TGlzdCxjYWNoZSkpO30sMSk7cmV0dXJuIGZhbHNlO319KS5tb3VzZWRvd24oZnVuY3Rpb24oKXtpZihjb25maWcuY2FuY2VsU2VsZWN0aW9uKXt0aGlzLm9uc2VsZWN0c3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2V9O3JldHVybiBmYWxzZTt9fSk7JHRoaXMuYmluZCgidXBkYXRlIixmdW5jdGlvbigpe3ZhciBtZT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXttZS5jb25maWcucGFyc2Vycz1idWlsZFBhcnNlckNhY2hlKG1lLCRoZWFkZXJzKTtjYWNoZT1idWlsZENhY2hlKG1lKTt9LDEpO30pLmJpbmQoInVwZGF0ZUNlbGwiLGZ1bmN0aW9uKGUsY2VsbCl7dmFyIGNvbmZpZz10aGlzLmNvbmZpZzt2YXIgcG9zPVsoY2VsbC5wYXJlbnROb2RlLnJvd0luZGV4LTEpLGNlbGwuY2VsbEluZGV4XTtjYWNoZS5ub3JtYWxpemVkW3Bvc1swXV1bcG9zWzFdXT1jb25maWcucGFyc2Vyc1twb3NbMV1dLmZvcm1hdChnZXRFbGVtZW50VGV4dChjb25maWcsY2VsbCksY2VsbCk7fSkuYmluZCgic29ydG9uIixmdW5jdGlvbihlLGxpc3QpeyQodGhpcykudHJpZ2dlcigic29ydFN0YXJ0Iik7Y29uZmlnLnNvcnRMaXN0PWxpc3Q7dmFyIHNvcnRMaXN0PWNvbmZpZy5zb3J0TGlzdDt1cGRhdGVIZWFkZXJTb3J0Q291bnQodGhpcyxzb3J0TGlzdCk7c2V0SGVhZGVyc0Nzcyh0aGlzLCRoZWFkZXJzLHNvcnRMaXN0LHNvcnRDU1MpO2FwcGVuZFRvVGFibGUodGhpcyxtdWx0aXNvcnQodGhpcyxzb3J0TGlzdCxjYWNoZSkpO30pLmJpbmQoImFwcGVuZENhY2hlIixmdW5jdGlvbigpe2FwcGVuZFRvVGFibGUodGhpcyxjYWNoZSk7fSkuYmluZCgiYXBwbHlXaWRnZXRJZCIsZnVuY3Rpb24oZSxpZCl7Z2V0V2lkZ2V0QnlJZChpZCkuZm9ybWF0KHRoaXMpO30pLmJpbmQoImFwcGx5V2lkZ2V0cyIsZnVuY3Rpb24oKXthcHBseVdpZGdldCh0aGlzKTt9KTtpZigkLm1ldGFkYXRhJiYoJCh0aGlzKS5tZXRhZGF0YSgpJiYkKHRoaXMpLm1ldGFkYXRhKCkuc29ydGxpc3QpKXtjb25maWcuc29ydExpc3Q9JCh0aGlzKS5tZXRhZGF0YSgpLnNvcnRsaXN0O31pZihjb25maWcuc29ydExpc3QubGVuZ3RoPjApeyR0aGlzLnRyaWdnZXIoInNvcnRvbiIsW2NvbmZpZy5zb3J0TGlzdF0pO31hcHBseVdpZGdldCh0aGlzKTt9KTt9O3RoaXMuYWRkUGFyc2VyPWZ1bmN0aW9uKHBhcnNlcil7dmFyIGw9cGFyc2Vycy5sZW5ndGgsYT10cnVlO2Zvcih2YXIgaT0wO2k8bDtpKyspe2lmKHBhcnNlcnNbaV0uaWQudG9Mb3dlckNhc2UoKT09cGFyc2VyLmlkLnRvTG93ZXJDYXNlKCkpe2E9ZmFsc2U7fX1pZihhKXtwYXJzZXJzLnB1c2gocGFyc2VyKTt9O307dGhpcy5hZGRXaWRnZXQ9ZnVuY3Rpb24od2lkZ2V0KXt3aWRnZXRzLnB1c2god2lkZ2V0KTt9O3RoaXMuZm9ybWF0RmxvYXQ9ZnVuY3Rpb24ocyl7dmFyIGk9cGFyc2VGbG9hdChzKTtyZXR1cm4oaXNOYU4oaSkpPzA6aTt9O3RoaXMuZm9ybWF0SW50PWZ1bmN0aW9uKHMpe3ZhciBpPXBhcnNlSW50KHMpO3JldHVybihpc05hTihpKSk/MDppO307dGhpcy5pc0RpZ2l0PWZ1bmN0aW9uKHMsY29uZmlnKXtyZXR1cm4vXlstK10/XGQqJC8udGVzdCgkLnRyaW0ocy5yZXBsYWNlKC9bLC4nXS9nLCcnKSkpO307dGhpcy5jbGVhclRhYmxlQm9keT1mdW5jdGlvbih0YWJsZSl7aWYoJC5icm93c2VyLm1zaWUpe2Z1bmN0aW9uIGVtcHR5KCl7d2hpbGUodGhpcy5maXJzdENoaWxkKXRoaXMucmVtb3ZlQ2hpbGQodGhpcy5maXJzdENoaWxkKTt9ZW1wdHkuYXBwbHkodGFibGUudEJvZGllc1swXSk7fWVsc2V7dGFibGUudEJvZGllc1swXS5pbm5lckhUTUw9IiI7fX07fX0pOyQuZm4uZXh0ZW5kKHt0YWJsZXNvcnRlcjokLnRhYmxlc29ydGVyLmNvbnN0cnVjdH0pO3ZhciB0cz0kLnRhYmxlc29ydGVyO3RzLmFkZFBhcnNlcih7aWQ6InRleHQiLGlzOmZ1bmN0aW9uKHMpe3JldHVybiB0cnVlO30sZm9ybWF0OmZ1bmN0aW9uKHMpe3JldHVybiAkLnRyaW0ocy50b0xvY2FsZUxvd2VyQ2FzZSgpKTt9LHR5cGU6InRleHQifSk7dHMuYWRkUGFyc2VyKHtpZDoiZGlnaXQiLGlzOmZ1bmN0aW9uKHMsdGFibGUpe3ZhciBjPXRhYmxlLmNvbmZpZztyZXR1cm4gJC50YWJsZXNvcnRlci5pc0RpZ2l0KHMsYyk7fSxmb3JtYXQ6ZnVuY3Rpb24ocyl7cmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQocyk7fSx0eXBlOiJudW1lcmljIn0pO3RzLmFkZFBhcnNlcih7aWQ6ImN1cnJlbmN5IixpczpmdW5jdGlvbihzKXtyZXR1cm4vXlvCoyTigqw/Ll0vLnRlc3Qocyk7fSxmb3JtYXQ6ZnVuY3Rpb24ocyl7cmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQocy5yZXBsYWNlKG5ldyBSZWdFeHAoL1vCoyTigqxdL2cpLCIiKSk7fSx0eXBlOiJudW1lcmljIn0pO3RzLmFkZFBhcnNlcih7aWQ6ImlwQWRkcmVzcyIsaXM6ZnVuY3Rpb24ocyl7cmV0dXJuL15cZHsyLDN9W1wuXVxkezIsM31bXC5dXGR7MiwzfVtcLl1cZHsyLDN9JC8udGVzdChzKTt9LGZvcm1hdDpmdW5jdGlvbihzKXt2YXIgYT1zLnNwbGl0KCIuIikscj0iIixsPWEubGVuZ3RoO2Zvcih2YXIgaT0wO2k8bDtpKyspe3ZhciBpdGVtPWFbaV07aWYoaXRlbS5sZW5ndGg9PTIpe3IrPSIwIitpdGVtO31lbHNle3IrPWl0ZW07fX1yZXR1cm4gJC50YWJsZXNvcnRlci5mb3JtYXRGbG9hdChyKTt9LHR5cGU6Im51bWVyaWMifSk7dHMuYWRkUGFyc2VyKHtpZDoidXJsIixpczpmdW5jdGlvbihzKXtyZXR1cm4vXihodHRwcz98ZnRwfGZpbGUpOlwvXC8kLy50ZXN0KHMpO30sZm9ybWF0OmZ1bmN0aW9uKHMpe3JldHVybiBqUXVlcnkudHJpbShzLnJlcGxhY2UobmV3IFJlZ0V4cCgvKGh0dHBzP3xmdHB8ZmlsZSk6XC9cLy8pLCcnKSk7fSx0eXBlOiJ0ZXh0In0pO3RzLmFkZFBhcnNlcih7aWQ6Imlzb0RhdGUiLGlzOmZ1bmN0aW9uKHMpe3JldHVybi9eXGR7NH1bXC8tXVxkezEsMn1bXC8tXVxkezEsMn0kLy50ZXN0KHMpO30sZm9ybWF0OmZ1bmN0aW9uKHMpe3JldHVybiAkLnRhYmxlc29ydGVyLmZvcm1hdEZsb2F0KChzIT0iIik/bmV3IERhdGUocy5yZXBsYWNlKG5ldyBSZWdFeHAoLy0vZyksIi8iKSkuZ2V0VGltZSgpOiIwIik7fSx0eXBlOiJudW1lcmljIn0pO3RzLmFkZFBhcnNlcih7aWQ6InBlcmNlbnQiLGlzOmZ1bmN0aW9uKHMpe3JldHVybi9cJSQvLnRlc3QoJC50cmltKHMpKTt9LGZvcm1hdDpmdW5jdGlvbihzKXtyZXR1cm4gJC50YWJsZXNvcnRlci5mb3JtYXRGbG9hdChzLnJlcGxhY2UobmV3IFJlZ0V4cCgvJS9nKSwiIikpO30sdHlwZToibnVtZXJpYyJ9KTt0cy5hZGRQYXJzZXIoe2lkOiJ1c0xvbmdEYXRlIixpczpmdW5jdGlvbihzKXtyZXR1cm4gcy5tYXRjaChuZXcgUmVnRXhwKC9eW0EtWmEtel17MywxMH1cLj8gWzAtOV17MSwyfSwgKFswLTldezR9fCc/WzAtOV17Mn0pICgoWzAtMl0/WzAtOV06WzAtNV1bMC05XSl8KFswLTFdP1swLTldOlswLTVdWzAtOV1ccyhBTXxQTSkpKSQvKSk7fSxmb3JtYXQ6ZnVuY3Rpb24ocyl7cmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQobmV3IERhdGUocykuZ2V0VGltZSgpKTt9LHR5cGU6Im51bWVyaWMifSk7dHMuYWRkUGFyc2VyKHtpZDoic2hvcnREYXRlIixpczpmdW5jdGlvbihzKXtyZXR1cm4vXGR7MSwyfVtcL1wtXVxkezEsMn1bXC9cLV1cZHsyLDR9Ly50ZXN0KHMpO30sZm9ybWF0OmZ1bmN0aW9uKHMsdGFibGUpe3ZhciBjPXRhYmxlLmNvbmZpZztzPXMucmVwbGFjZSgvXC0vZywiLyIpO2lmKGMuZGF0ZUZvcm1hdD09InVzIil7cz1zLnJlcGxhY2UoLyhcZHsxLDJ9KVtcL1wtXShcZHsxLDJ9KVtcL1wtXShcZHs0fSkvLCIkMy8kMS8kMiIpO31lbHNlIGlmKGMuZGF0ZUZvcm1hdD09InVrIil7cz1zLnJlcGxhY2UoLyhcZHsxLDJ9KVtcL1wtXShcZHsxLDJ9KVtcL1wtXShcZHs0fSkvLCIkMy8kMi8kMSIpO31lbHNlIGlmKGMuZGF0ZUZvcm1hdD09ImRkL21tL3l5Inx8Yy5kYXRlRm9ybWF0PT0iZGQtbW0teXkiKXtzPXMucmVwbGFjZSgvKFxkezEsMn0pW1wvXC1dKFxkezEsMn0pW1wvXC1dKFxkezJ9KS8sIiQxLyQyLyQzIik7fXJldHVybiAkLnRhYmxlc29ydGVyLmZvcm1hdEZsb2F0KG5ldyBEYXRlKHMpLmdldFRpbWUoKSk7fSx0eXBlOiJudW1lcmljIn0pO3RzLmFkZFBhcnNlcih7aWQ6InRpbWUiLGlzOmZ1bmN0aW9uKHMpe3JldHVybi9eKChbMC0yXT9bMC05XTpbMC01XVswLTldKXwoWzAtMV0/WzAtOV06WzAtNV1bMC05XVxzKGFtfHBtKSkpJC8udGVzdChzKTt9LGZvcm1hdDpmdW5jdGlvbihzKXtyZXR1cm4gJC50YWJsZXNvcnRlci5mb3JtYXRGbG9hdChuZXcgRGF0ZSgiMjAwMC8wMS8wMSAiK3MpLmdldFRpbWUoKSk7fSx0eXBlOiJudW1lcmljIn0pO3RzLmFkZFBhcnNlcih7aWQ6Im1ldGFkYXRhIixpczpmdW5jdGlvbihzKXtyZXR1cm4gZmFsc2U7fSxmb3JtYXQ6ZnVuY3Rpb24ocyx0YWJsZSxjZWxsKXt2YXIgYz10YWJsZS5jb25maWcscD0oIWMucGFyc2VyTWV0YWRhdGFOYW1lKT8nc29ydFZhbHVlJzpjLnBhcnNlck1ldGFkYXRhTmFtZTtyZXR1cm4gJChjZWxsKS5tZXRhZGF0YSgpW3BdO30sdHlwZToibnVtZXJpYyJ9KTt0cy5hZGRXaWRnZXQoe2lkOiJ6ZWJyYSIsZm9ybWF0OmZ1bmN0aW9uKHRhYmxlKXtpZih0YWJsZS5jb25maWcuZGVidWcpe3ZhciB0aW1lPW5ldyBEYXRlKCk7fXZhciAkdHIscm93PS0xLG9kZDskKCJ0cjp2aXNpYmxlIix0YWJsZS50Qm9kaWVzWzBdKS5lYWNoKGZ1bmN0aW9uKGkpeyR0cj0kKHRoaXMpO2lmKCEkdHIuaGFzQ2xhc3ModGFibGUuY29uZmlnLmNzc0NoaWxkUm93KSlyb3crKztvZGQ9KHJvdyUyPT0wKTskdHIucmVtb3ZlQ2xhc3ModGFibGUuY29uZmlnLndpZGdldFplYnJhLmNzc1tvZGQ/MDoxXSkuYWRkQ2xhc3ModGFibGUuY29uZmlnLndpZGdldFplYnJhLmNzc1tvZGQ/MTowXSl9KTtpZih0YWJsZS5jb25maWcuZGVidWcpeyQudGFibGVzb3J0ZXIuYmVuY2htYXJrKCJBcHBseWluZyBaZWJyYSB3aWRnZXQiLHRpbWUpO319fSk7fSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/blue/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/blue/asc.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/blue/bg.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFQAJAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/blue/blue.zip</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[UEsDBBQAAAAIAKV7DjcyBouJNQAAADYAAAAHAAAAYXNjLmdpZnP3dLOwTBRlYGFoYGBQ1jX4//+/4k8WRgYGRgYdBiAAyTAw8fbIL+B+cf7W7PSL2Sq6DNYAUEsDBBQAAAAIAKV7DjfeZTDnPwAAAEAAAAAGAAAAYmcuZ2lmc/d0s7BMFGXgZGhgYFDWNfj//7/iTxZGBgZGBh0GIADJMDCJ9/Q3nOa8lVQRYtS19h5buF1qwveezlAGBmsAUEsDBBQAAAAIAKV7Dje24DEINQAAADYAAAAIAAAAZGVzYy5naWZz93SzsEwUZWBhaGBgUNY1+P//v+JPFkYGBkYGHQYgAMkwMPH29DOeXLthTnOIUVckI4M1AFBLAwQUAAAACAAQCRA3k/FDzkoBAACQAwAACQAAAHN0eWxlLmNzc51S707CMBD/DE/RhJgokbFFJaR8FPcCxgfo1q67WHpNdwhofHdbNxIJGyHuvlzvmt+/bj5lJAqjGjadj3+7pD2jJ+XZ13hUoaVZJTZgDlx4EGY1HhWifNcet1bOSjToOZs8r2OF3UZ4DZZnqduz1BHLntx+1cE08Kk4WzoKgx1IqjnL0vQmnEjtaSYMaMuZUVW48N0jh2olJKPY3LOedYVI7Toq71GpFi/hiw7QSxUmWVDZoAHJJnme9+l0QkqwmrPH6OOiqiQ2bWp/uGEjdEDbenNb6ERDdXeaoFdOCeLMYteerh02QIAhl1LZSOdB1/FOufVNNOUQ4nxAW4HywEhGTccQHtaxzqz15dVm8qE8QSnM8YEI3UU2n6CUHekZ6CRPQy2ui/I1jN/ccKCiKbtEr0Vb484O40n1L8Den3HISk/MS1lIuYycP1BLAQIUABQAAAAIAKV7DjcyBouJNQAAADYAAAAHAAAAAAAAAAAAIAAAAAAAAABhc2MuZ2lmUEsBAhQAFAAAAAgApXsON95lMOc/AAAAQAAAAAYAAAAAAAAAAAAgAAAAWgAAAGJnLmdpZlBLAQIUABQAAAAIAKV7Dje24DEINQAAADYAAAAIAAAAAAAAAAAAIAAAAL0AAABkZXNjLmdpZlBLAQIUABQAAAAIABAJEDeT8UPOSgEAAJADAAAJAAAAAAAAAAEAIAAAABgBAABzdHlsZS5jc3NQSwUGAAAAAAQABADWAAAAiQIAAAAA]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/blue/desc.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/blue/style.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogdGFibGVzICovCnRhYmxlLnRhYmxlc29ydGVyIHsKCWZvbnQtZmFtaWx5OmFyaWFsOwoJYmFja2dyb3VuZC1jb2xvcjogI0NEQ0RDRDsKCW1hcmdpbjoxMHB4IDBwdCAxNXB4OwoJZm9udC1zaXplOiA4cHQ7Cgl3aWR0aDogMTAwJTsKCXRleHQtYWxpZ246IGxlZnQ7Cn0KdGFibGUudGFibGVzb3J0ZXIgdGhlYWQgdHIgdGgsIHRhYmxlLnRhYmxlc29ydGVyIHRmb290IHRyIHRoIHsKCWJhY2tncm91bmQtY29sb3I6ICNlNkVFRUU7Cglib3JkZXI6IDFweCBzb2xpZCAjRkZGOwoJZm9udC1zaXplOiA4cHQ7CglwYWRkaW5nOiA0cHg7Cn0KdGFibGUudGFibGVzb3J0ZXIgdGhlYWQgdHIgLmhlYWRlciB7CgliYWNrZ3JvdW5kLWltYWdlOiB1cmwoYmcuZ2lmKTsKCWJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgcmlnaHQ7CgljdXJzb3I6IHBvaW50ZXI7Cn0KdGFibGUudGFibGVzb3J0ZXIgdGJvZHkgdGQgewoJY29sb3I6ICMzRDNEM0Q7CglwYWRkaW5nOiA0cHg7CgliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGOwoJdmVydGljYWwtYWxpZ246IHRvcDsKfQp0YWJsZS50YWJsZXNvcnRlciB0Ym9keSB0ci5vZGQgdGQgewoJYmFja2dyb3VuZC1jb2xvcjojRjBGMEY2Owp9CnRhYmxlLnRhYmxlc29ydGVyIHRoZWFkIHRyIC5oZWFkZXJTb3J0VXAgewoJYmFja2dyb3VuZC1pbWFnZTogdXJsKGFzYy5naWYpOwp9CnRhYmxlLnRhYmxlc29ydGVyIHRoZWFkIHRyIC5oZWFkZXJTb3J0RG93biB7CgliYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGVzYy5naWYpOwp9CnRhYmxlLnRhYmxlc29ydGVyIHRoZWFkIHRyIC5oZWFkZXJTb3J0RG93biwgdGFibGUudGFibGVzb3J0ZXIgdGhlYWQgdHIgLmhlYWRlclNvcnRVcCB7CmJhY2tncm91bmQtY29sb3I6ICM4ZGJkZDg7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/green/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/green/asc.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAASwAAAAhCAMAAABUSmYtAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMAUExURWTEbWO+ZcbGxlDMWma9cMHWslq+S1HHU32+VFq/TaG3k4bGXpGlhG+wRWOkOz3DQEmxEvb29vX19fT09PPz8+np6cHBwfj4+G5ubuvr6+3t7ebm5t/f39zc3M3NzeTk5Pb29/Hy8d/g39ra2s7OzuTk4+np6vb39vHx8eDf4M7OzdbW1uLj4tXW1vDv7+/v7+Dg3/Py8+Pi49nY2czNzdjZ2d/g4O3u7e7t7erp6c3OztHS0uPj4+/w7/Lz89bW1eDf3/Lx8dLS0dnZ2fX19urq6ePk5NHR0c3NzPf2987Nztrb2tLR0ebm5enq6eLi4vb19fPz8u/v8O3s7dvb2trb29bV1fHx8vDw7/b399jY2fHy8tnZ2N/f4M3Mzdzb3NHR0vT19OTj4+zt7dLR0unq6tva2tjZ2PDw8Nra29zc2+Xm5u/w8PLy8+3t7Pf29vX29ePj4tHS0fX09NLS0uLj49vc3O3s7NbV1u3t7uLi49nY2Pf39tXV1tXW1dva2+7t7tjY2NXV1fT09eTj5OPi4u3u7u7u7tvb3M3OzfLx8s7Nze7u7erp6s3MzNvb2/Lz8ubl5v///+Dg4PLy8uzs7erq6vLy8czMzC7ALEbITdzb2+Pk41nPaDzFP+zs7Ozt7M3NzuXl5VnPXzfDLS7AIDnEO8zhv+np6L+/v2+rSUiuCY3HaFTNWNvc22POa1SuGufn5yW9H03LV+vq6mynSFexHjzFNE6zJF63JdfX10+oF1TNYLm5ube3t7GxsUmvEkqwFqipqVHMXInFYz3FQGPOaeLh4t/e3/b19k3LTfDv8PX09dnZ2vX29szNzOPj5Ofn6MvLzGbOeGbTeE2xDmbScOfo6FDMU1nFX8/OztTU0+jo6Ojp6E23Td7e3t7e38zLzN7f3k60JDfDOeXk5GPGZmbTd2PIY0bDQkbIQlq2TcHBwkqrFkquFka/QtDR0dHR0Fq6SdPT06WmpjnEMGTSc2bRcFHDU2TSdWbRd1qySk6wJEerCMvKy8rLy45tlFkAAAbvSURBVHja7Jp3WFNXGMZvtVZtazXIte01JJcEAoEkBEJiSAJEQoAAJgwZskEEXCxBBWcVnK22Vlu1rtZqh7bVVju0tXV077333nvP7yS5qbkcjsf/892ce8/3e9+Xhy8P5Em4MBeHirqYsFBRFxMeKupixoaKuhhJqKgLPVkxvu0UCR/DS3geAC/Ibd4zHyPhXX5jm6QNLsjAU0bP4CSJWA1DKaGYnNZTDYN+DeuXj60P/nmbAwfUcnSqnyOIy32rfuxTsLwGqijRSRLxGpZSQjHx97TDMFcmJs5OTCsMT4QXsLTCQnRJDN8I58JCoIVp3n72bBATwxO9XVp4IXThs9PookQnScRrWEoJBxB/TzsM01KUkFqkS02dpdPNSigvSoCa1dJSXtSSmppQrkvQwQLaklqeoENOYDpdwpNF5ak6HV2U6CSJeA1LKaGYCD3tMEwxx3FTYbWi000X3PfyfRfcxBUXb5rHccVcK/DinVNbW4vhsWvXJq9vKkRaQeaCotw8XzsgSnSe4ctgNCylhSIi9LTDMCyrYt3TUtgrUpw37z9+3iO/PHLe8f03O1knq3KyKe6UadPcbhULBti6nSowup0sm6JiVdNOizqdKdewKjerUjnFUaKTJOI1LKWEYiL0tMMwM8ePnwQHPG44de+n20/edXL7Hx+eumG8r65Cp5kgzvQ1YPRJM33LH0U1ye8eL4oSnSQRr2EpJRQToacdhrFpkpI03R5br2bYmJfu3/rw3oe33v/imGGajt6k/g6NxpPU3eHp7++22Tyajm5Nv6ej19bba4OULen/qCdJ0+Hp7rf1oo0oSnSSRLyGpZRwABF6ymEYqcJ76KXvjhi5feuNW7ZsuXHr9pEjPpBKpSapVC2VVsNOaodVrfdZpQq7Qmq3K+yBKHJKkWL3X4OiJCdJHETDUUooJkJPOwwTATV31YyICMPddwzdsefOO/fs2DH0k7sdCCNtVcSMCF/NuH3ujLnXIXp7LWK1gWitz1MLaq3PGxwlOYkiRsNSajiA0HwXgWGYBYbmiiqH0eD4cd/vT/y8AdXeu5h9bxoMRmPzAkOFo6LK4Gh2GAwViFQ1OxwLjA4HYIMxEL3M2FxlrDJcVmE0GB0LqkRRkpMk4jUspYRiIvS0wzCy5OTkHFmNTDbkwB2v3bMHnqt7dgw/58AQmSw5pya5RrZZliODx7M1OTXoClUDm3XrcpJlgaiX5iTn+LfBUaKTJOI1LKWEYiL0tMMwcZbcXEtuVFzckFEjd8Nr1oYtH33++pejhlwfZYmKi4KS5a61REXlws7iPSEqsyApEI2Ls6yNWp0rWx1nsYAhOEp0ksRBNBylhGIi9LTDMHUZjVZrdnZ+/r/nP/TrbV+M3jv629vOfej8f+qyG611dXXWroxOa2N+ficcdZ3W/GxrZ35+dnZjV0Z2RiBq7cywdjXmdwICsTE4SnSSRLyGpZRQTISedhhGq122uDS+ND39+69uvfeV3b+9M3z3uX/dOu67xaXzS0tL58cvgpU+Pz4ePRYv1mrnpy+KXxafrtWi5Y8CiteCnq6NX6Rdpg2OEp0kcRANRymhmAg97TDMkunKyXklyvV5R2QPHP7mh8+Yc/78+vADsiNKZYlySVOeUqlsUi4BQ5OyBJzK6UCVeU1NTcq8yYGoUjm9qaQE9tMng0UZHCU6SSJew1JKOID4e9phGIVabao2SdXqx6peOHbhRUf/PnrRhcfeN75nN+kV1Xq1yaS3q00KeJMltSuulgKrhvceJvQGRB+IqvUgX63Q69V2EyBRlOQkiXgNSymhmAg97TBMtFwuj86SZ0U3PNr0xi0PnvjpxIO3RK33RMttoPTJQYCSZzWgXV90X9a2hj55tPw5bywQ7WtogF1WlnybDeGgKNFJEvEaltJCEQn0lMPAB2k2BT5DQr190PN01+Z/Nnc5PAffYt3s6SV0KWxw+aNu1ncNNtM7sSJRw1JK+D8JHuqMwzAcd/lSzsxNmGDmdu069OrHNvnzhzbtnLBiJceZV5h7lvb09KC/WXDmpbDM4DKbOdhOWIlgIAprhZnjesw9nDhKdJJEvIallHAA8fe0wzCVkZETy8piIyfGxkbGroEuEjbXllXGVlaWraks8+KyiSCjbeXG2Gs3liHHRIjRRYlOkojXsJQSionQ0w7DtBf4biAWhPk3YZmZ6NyeWRDW7t2EFRRkhj0Ou2e8oB0R5MqkjJKcJBGvDZaggmIi9JTDMBKXK2YKj259LJzi8t7HkUhc3hshroUL+ZiFkra2KbyrjedjeBcviYEuxsUjnW+ji5KdRBGvYSglFBOhpx0mdN/wbO4bhv6D4Sz+1+HSUFEXMy5U1MVcEirq+k+AAQAogBm+ic8zsgAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/green/bg.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAASwAAAAhCAMAAABUSmYtAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMAUExURWO+ZcbGxlDMWma9cMHWslq+S1HHU32+VFq/TaG3k4bGXpGlhG+wRWOkOz3DQEmxEvb29vX19fT09PPz8+np6cHBwfj4+G5ubuvr6+3t7ebm5t/f39zc3M3NzeTk5Pb29/Hy8d/g39ra2s7OzuTk4+np6vb39uDf4PHx8dbW1s7OzeLj4tXW1vDv7+/v7/Py8+Pi4+Dg39nY2czNzdjZ2d/g4O3u7e7t7erp6c3OztHS0uPj4+/w7/Lz89bW1eDf3/Lx8dLS0dnZ2fX19urq6ePk5NHR0ff2983NzM7Nztrb2tLR0enq6ebm5eLi4vb19fPz8u/v8O3s7dvb2trb29bV1fHx8vDw79jY2fHy8tnZ2Pb3983Mzd/f4Nzb3OTj49HR0vT19Ozt7dva2tLR0unq6tjZ2Nra2/Dw8Nzc2+/w8OXm5vLy8/f29vX29e3t7OPj4tHS0fX09NLS0uLj4+3s7Nvc3NbV1uLi4+3t7vf39tnY2P///9XV1tXW1dva29jY2NXV1e7t7u3u7vT09eTj5OPi4u7u7tvb3M3OzfLx8vLz8urp6s7Nzc3MzO7u7dvb2+bl5uDg4Orq6vLy8uzs7fLy8czMzOPk49zb20bITc3Nzuzs7Ozt7FnPaFnPX+Xl5TfDLTzFP163Jefn5+np6GynSEiuCWPOa1TNWEmvEo3HaG+rSU6zJNvc21exHszhv03LV+vq6r+/v9fX11SuGk+oF1TNYLm5ubGxsbe3t6ipqVHMXInFY0qwFiO8HCu/GznEMD3FQGPOad/e397f3k23TeLh4vb19vDv8PX09dnZ2szNzOfn6GbOeNTU0/X29k2xDlDMU1nFXzzFNGbScOjo6Ojp6E3LTd7e3svLzN7e38zLzFq2TeXk5GPGZk60JGPIYzfDOefo6EbDQkbIQtPT08HBwmbTeGbTd0qrFuPj5EquFs/Ozka/QtDR0dHR0Fq6ScvKy6WmpjnEO2TSc2bRcFHDU2TSdWbRd1qySk6wJEerCMrKysrLy2TEbRSCzSEAAAblSURBVHja7Jp3WFNXGMavs2rVBrm2vYbkkkAIkARISAxJgEAIhJGGIVuWgogDAUEFxS1Uu4ertqCtdldt3dpq99577733HvY7SW5qLsfj6f/5bs695/u978vDxxPyJFyYc0NFXUxYqKiLCQ8VdTGTQkVdjCRU1IV+WDG+7XQJH8NLeB4AL8it3jMfI+FdfmOrpBUuyMBTRs/gJIlYDUMpoZic0lMNg34NZ6ybNCP4+bYQDqh16DRjoSCu860Zk56A5TVQRYlOkojXsJQSiom/px2GuTgxcX5iWlF4IryApRUVoUti+EY4FxUBLUrz9vPng5gYnujt0sKLoAufn0YXJTpJIl7DUko4hPh72mGYluKE1GJdaupcnW5uQkVxAtTclpaK4pbU1IQKXYIOFtCW1IoEHXIC0+kSHi+uSNXp6KJEJ0nEa1hKCcVE6GmHYUo4jpsJqw2d7hy38/md4+7kSko2LeK4Eq4NeMl1M9vaSuAxMLDJ65sJkTaQuaAot8jXDokSnWf4MhgNS2mhiAg97TAMy6pY96wU9pIU5423nxj14M8Pjjpx+41O1smqnGyKO2XWLLdbxYIBtm6nCoxuJ8umqFjVrFOiTmfK1azKzapUTnGU6CSJeA1LKaGYCD3tMMy8KVMugAMeO47v/nzwnrvuGfz9veM7pvjqSnSaB+I8XwNGnzTPt/xRVBf43VNEUaKTJOI1LKWEYiL0tMMwNk1SkqbLY+vWjDzns8PbHuh9YNvhZ84ZqWnvTupv12g8SV3tnv7+LpvNo2nv0vR72rtt3d02SNmS/ot6kjTtnq5+WzfaiKJEJ0nEa1hKCYcQoacchpEqvIde+vpZYwa3Xd/b23v9tsExZz0slUpNUqlaKq2FndQOq1bvs0oVdoXUblfYA1HklCLF7r8GRUlOkngaDUcpoZgIPe0wTATU4vVzIiIMe28ZfkMvqhuGv7vXgTDS1kfMifDVnD2L5yy+BtE9dYjVBaJ1Pk8dqHU+b3CU5CSKGA1LqeEQQvNdBIZhlhmaK6sdRoPjk5t/e+3+++699777f7rr5M3PGgxGY/MyQ6WjstrgaHYYDJWIVDc7HMuMDgdggzEQXWVsrjZWG1ZVGg1Gx7JqUZTkJIl4DUspoZgIPe0wjCw5OTlXViOTDTt4ywsv+Z5Zo5mDw2Sy5Nya5BrZFlmuDB5P1eTWoCtUDWwuuyw3WRaIemlucq5/GxwlOkkiXsNSSigmQk87DBNvycuz5EXFxw8bP2a79zXrg49efHv8sGujLFHxUVCyvEstUVF5sLN4T4jKLEgKROPjLZdGbciTbYi3WMAQHCU6SeJpNBylhGIi9LTDMA2ZTVZrTk5BwT9jb/vl1o8n9k785tYRt439oSGnydrQ0GDtzOywNhUUdMDR0GEtyLF2FBTk5DR1ZuZkBqLWjkxrZ1NBByAQm4KjRCdJxGtYSgnFROhph2G02tUryuLK0tO/+/SO3S9v//WR0dtH/HnH5G9XlC0pKytbErccVvqSuDj0WLFCq12SvjxudVy6VouWPwooTgt6ujZuuXa1NjhKdJLE02g4SgnFROhph2FWzlZOyy9VXpF/QHbkpq++f/8k88cXNx2RHVAqS5UrG/OVSmWjciUYGpWl4FTOBqrMb2xsVOZPC0SVytmNpaWwnz0NLMrgKNFJEvEallLCIcTf0w7DKNRqU61JqlY/VP3GsbMnHPrr0ISzj71lfNNu0itq9WqTSW9XmxTwJktqV1wlBVYL7z1M6A2IPhBV60G+SqHXq+0mQKIoyUkS8RqWUkIxEXraYZhouVwenS3Pjq5/tPHr/Ufv/vHuo/ujrvBEy22g9MlBgJJn16NdX3Rf9tb6Pnm0/EtvLBDtq6+HXXa2fKsN4aAo0UkS8RqW0kIRCfSUw8AHaTYFPkNCvbrL82Tnlr+3dDo8u15h3eypJXQpbHD5o27Wdw020zuxIlHDUkr4Hwke6ozDMBx3+RrOzE2dauYGBvZ9+I5N/vS+TddNXXshx5nXmnvW9PT0oL9ZcOY1sMzgMps52E69EMFAFNZaM8f1mHs4cZToJIl4DUsp4RDi72mHYaoiIzPKy2MjM2JjI2Mvgi4SNpvLq2Krqsovqir34vIMkNG2amPs5o3lyJEBMboo0UkS8RqWUkIxEXraYZgFhb4biIVh/k1YVhY6L8gqDFvg3YQVFmaFPQa757xgASLIlUUZJTlJIl47XYIKionQUw7DSFyumOk8uvWxdLrLex9HInF5b4S4li7lY5ZKWlun865Wno/hXbwkBroYF490vpUuSnYSRbyGoZRQTISedpjQfcP/c98w9B8M/+N/Hc4PFXUxk0NFXcx5oaKufwUYADdq83MijKvrAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/green/desc.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAASwAAAAhCAMAAABUSmYtAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMAUExURWTEbWO+ZcbGxlDMWma9cMHWslq+S1HHU32+VFq/TaG3k4bGXpGlhG+wRWOkOz3DQEmxEvb29vX19fT09PPz8+np6cHBwfj4+G5ubuvr6+3t7ebm5t/f39zc3M3NzeTk5Pb29/Hy8d/g39ra2s7OzuTk4+np6vb39vHx8eDf4M7OzdbW1uLj4tXW1vDv7+/v7+Dg3/Py8+Pi49nY2czNzdjZ2d/g4O3u7e7t7erp6c3OztHS0uPj4+/w7/Lz89bW1eDf3/Lx8dLS0dnZ2fX19urq6ePk5NHR0c3NzPf2987Nztrb2tLR0ebm5enq6eLi4vb19fPz8u/v8O3s7dvb2trb29bV1fHx8vDw7/b399jY2fHy8tnZ2N/f4M3Mzdzb3NHR0vT19OTj4+zt7dLR0unq6tva2tjZ2PDw8Nra29zc2+Xm5u/w8PLy8+3t7Pf29vX29ePj4tHS0fX09NLS0uLj49vc3O3s7NbV1u3t7uLi49nY2Pf39tXV1tXW1dva2+7t7tjY2NXV1fT09eTj5OPi4u3u7u7u7tvb3M3OzfLx8s7Nze7u7erp6s3MzNvb2/Lz8ubl5v///+Dg4PLy8uzs7erq6vLy8czMzC7ALEbITdzb2+Pk41nPaDzFP+zs7Ozt7M3NzuXl5VnPXzfDLS7AIDnEO8zhv+np6L+/v2+rSUiuCY3HaFTNWNvc22POa1SuGufn5yW9H03LV+vq6mynSFexHjzFNE6zJF63JdfX10+oF1TNYLm5ube3t7GxsUmvEkqwFqipqVHMXInFYz3FQGPOaeLh4t/e3/b19k3LTfDv8PX09dnZ2vX29szNzOPj5Ofn6MvLzGbOeGbTeE2xDmbScOfo6FDMU1nFX8/OztTU0+jo6Ojp6E23Td7e3t7e38zLzN7f3k60JDfDOeXk5GPGZmbTd2PIY0bDQkbIQlq2TcHBwkqrFkquFka/QtDR0dHR0Fq6SdPT06WmpjnEMGTSc2bRcFHDU2TSdWbRd1qySk6wJEerCMvKy8rLy45tlFkAAAbsSURBVHja7Jp3WFNXGMavttatDXI7riG5JBAIJCEQEkMSIBICBGjCkCFbRMAFgqCCW8GqbW2LWkcLWlf30g7tdnbvvffee9t+J8lNzeV4PP6f7+bce77f+748fDyQJ+GGuTBU1MWEhYq6mPBQURczIVTUxUhCRV3ohxXj206V8DG8hOcB8ILc6j3zMRLe5Te2Slrhggw8ZfQMTpKI1TCUEorJKT3VMOjPcNrqCdOCf9/mwwG1Gp2mzRfE1b41bcLTsLwGqijRSRLxGpZSQjHx97TDMFclJs5NTCsMT4QnsLTCQnRJDN8E58JCoIVp3n7uXBATwxO9XVp4IXThc9PookQnScRrWEoJBxF/TzsM01yUkFqkS02do9PNSSgvSoCa09xcXtScmppQrkvQwQLanFqeoENOYDpdwlNF5ak6HV2U6CSJeA1LKaGYCD3tMEwxx3HTYbWg0w2jD71yaPQNXHHx5oUcV8y1AC/eMb2lpRgeO3du9vqmQ6QFZC4oyi30tYOiROcZvgxGw1JaKCJCTzsMw7Iq1j0jhb0ixXnjrYfPO/HrifMO33qjk3WyKieb4k6ZMcPtVrFggK3bqQKj28myKSpWNeOUqNOZcg2rcrMqlVMcJTpJIl7DUkooJkJPOwwze+LES+CAx65jBz/rP3rgaP+fHx3bNdFXV6PTbBBn+xow+qTZvuWPorrE754oihKdJBGvYSklFBOhpx2GsWmSkjSdHlu3Ztj5Lz+4/fi+49sffOn8YZq27qTeNo3Gk9TZ5unt7bTZPJq2Tk2vp63b1t1tg5Qt6f+oJ0nT5unstXWjjShKdJJEvIallHAQEXrKYRipwnvope+NGNm/fc+2vm17tvePHPGhVCo1SaVqqbQadlI7rGq9zypV2BVSu11hD0SRU4oUu/8aFCU5SeJpNBylhGIi9LTDMBFQC9bOiogw3HvHOQN7+/r6BgbO+fReB8JIWxsxK8JXs25fMGvBtYjeXotYbSBa6/PUglrr8wZHSU6iiNGwlBoOIjTfRWAYZrGhqaLKYTQ4frrljyd/6UO17wBzy1sGg9HYtNhQ4aioMjiaHAZDBSJVTQ7HYqPDAdhgDERXGpuqjFWGlRVGg9GxuEoUJTlJIl7DUkooJkJPOwwjS05OzpHVyGRD77zj9fv27t+/976B4UPuHCqTJefUJNfItspyZPB4rianBl2hamCzYUNOsiwQ9dKc5Bz/NjhKdJJEvIallFBMhJ52GCbOkptryY2Kixs6duRueM7atu3jL974auzQ66MsUXFRULLcyyxRUbmws3hPiMosSApE4+Isl0Wty5Wti7NYwBAcJTpJ4mk0HKWEYiL0tMMwdRkNVmt2dn7+v6Me/e22L8fvG//dbec+OupkXXaDta6uztqR0W5tyM9vh6Ou3ZqfbW3Pz8/ObujIyM4IRK3tGdaOhvx2QCA2BEeJTpKI17CUEoqJ0NMOw2i1q5aVxpemp//w9c0HX939+7vDd5/7980XfL+sdFFpaemi+KWw0hfFx6PHsmVa7aL0pfGr4tO1WrT8UUDxWtDTtfFLtau0wVGikySeRsNRSigmQk87DLN8pnJKXonyyrz7ZQ/d8+2PnzND/vrmnodk9yuVJcrljXlKpbJRuRwMjcoScCpnAlXmNTY2KvOmBKJK5czGkhLYz5wCFmVwlOgkiXgNSynhIOLvaYdhFGq1qdokVasfr3rx4THjHvjngXFjHv7A+L7dpFdU69Umk96uNingRZbUrtgoBVYNrz1M6AWIPhBV60HeqNDr1XYTIFGU5CSJeA1LKaGYCD3tMEy0XC6PzpJnRdc/1vjmTY8c+fnIIzdFXemJlttA6ZGDACXPqke7nuierOvqe+TR8ue9sUC0p74edllZ8utsCAdFiU6SiNewlBaKSKCnHAbeSLMp8B4S6p27PM90bD25tcPhuett1s2eWkKXwgaXP+pmfddgM70TKxI1LKWE/5Pgoc44DMNxl6/gzNykSWZu5867X/vEJn/h7s07Jq25lOPMa8xdK7q6utD/LDjzClhmcJnNHGwnXYpgIAprjZnjusxdnDhKdJJEvIallHAQ8fe0wzCVkZGTy8piIyfHxkbGrocuEjZbyipjKyvL1leWeXHZZJDRtnJT7JZNZcgxGWJ0UaKTJOI1LKWEYiL0tMMw8wp8NxALwvybsMxMdJ6XWRA2z7sJKyjIDHsCds96wTxEkCuTMkpykkS8droEFRQToacchpG4XDFTeXTrY8lUl/c+jkTi8t4IcS1ZwscskbS2TuVdrTwfw7t4SQx0MS4e6XwrXZTsJIp4DUMpoZgIPe0wofuGZ3PfMPQJhrP4rMPFoaIu5oJQURdzUaio6z8BBgBEVxm+ERVlyQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/green/green.zip</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[UEsDBBQAAAAIAJWIaDZDq0MDIAoAAGYKAAAIAAAAZGVzYy5wbmdVVgk81Gkfn9qSWlrptlYqIiS20oFVrszUTAYlE0WYTkKS0tauStFry5VNpdwk99EixLhi/v8xM2aaq5kxF3OZ04zS5v17393Pu+/3+Xye6/Mcv9/393yf50n3Rx00Xma2DAaDGcP9vANgsAUOUH2j4TdQHoTAboOKRWcOIA/AYHVDuxdniKH2+kSf44mBl7CJVyMSomEHoi6djraEx0SciQ6Ijoi6Fv8+2g0G+wbmfzjIJ6ovJrIremBgwB+PwXbG9VAbMV2H0IOBP3cFYbqRRW9y0gZOZpXduVTvE1nq6o7bD28w1el009PTWq1Wo9GIxeKenp6ZmZnY2FipVCqXy0UiEYfDYbFYAAAIBAKdTq9SqzhcDoPBAEFQIOCLxRKdXqdSqbgcLggCVCqVx+dRqFSlYh5cLkej1vB5fDqNjgcAGp3O4XLlU1CSS8RiAASJJBKfz1coFWqNhkqlcDkctUpFIhHpdPr0tE4iEfMFAiKRCAB4vU4PAiCDySARiSKRUCwR83g8yHSNRq1QKOUyOZPJYDCZVApFpVIrlQqdXk+j0VVqNZ1O43C4AB5gMVlEIkk7rRXw+TK5nEQkiSUSaBKNTlMqldBkFospFIkUSqVarZHLZXqIGd00n88jkogQQSQSicfnQ4PkMhmVQpXLp3jzftH0eh2FAnVQmAwm5BmNRqNQKFrttIAv4PN48ql5MJksAATUKjUIAFNTkO8SAI9nMplqjVokFM3NzXG5XLVaLZPJJRKJWq3C4/GO7xx8h5AsJhNaJoRw1q3fQwZBLgMAUCgUhhBO7cZtc3xnubfPFT/eLRZPdnd3X6qG+9UuzRw8GwQcZ7KYkeCFoFqziYkJ684NyJFgqURyscIvuMHCrX8nqsnq5BvrDx8+HKlcGwSEt7W1vXnzpqGhAV5niqhfU1lVhcaHpvdHuvfvjwTP8cZ5HDYH4gI5glQqlNPaaTqdMa3T4QE8ny+YmJgcGcFjwWQsORnZsBxLipuYnPTHB4b0nyKA4NgYeRKCeBL5BsmeBwc/gmdz2Khmq924vUKBIHIAiyVfjRyK9MV5+g55YlqRPT29iOo1iNo1vt2eo1DsiaOYdjiZTC4rL9/b5xRFuowlxqFxgVGkK1jiVUwjAlVvdbDacGQYSiO/xeSGwGAGMrj3gaBkhqzg6vHA4HUDda3UGuME19qNbVYmhlYbTUy9TC1NFy462/to4wnvd4tTX6ae6HkVE/MAc/BbTLCetFyelKTo1LNTmDdt3iMBYbLb1xcKESulizPb5XbD7ZHNeFqbU9BY/527Ge2/K/3Ra3dshFp+nj5hk/dW85moPKXz2zsTC5SpLIm7xtmULdzdisCMpxq5RWuNUNn3KU65phnvt7pTnCYJcQzJUnLqLY4It6DF7Hk5sLaP0rUrppdc/9bglS0Rbqoyexzg6azSN+Ocgq23gMjD9kZH7tjUN/d6JsKNOIsmej1f3j3HvjkVarISt7IzDJO8MXH8Mnmy2NsG3nfhOGLpkhW3jrgakUNzH2FKDyGfl5ABuO12xC8FZFboybFnBQX+tYdGexYynmEKX3qhwveF9Qb6CKv2/RCWO2mVnmx8aGvR74bucqfDzoPx5IiWl2Tjku86E85qjUPjVaK75sH4Fth2tnNnWdk6C9ersbrP5V6li6McbYe3aVtuF3tPrO8y8sUFYGw3eUI24BrtqO6b73Zu6r/Gr7lHcFVJ0zXLOddLcq402tk85aGeOOPkxxrCf6lhVi0sYb5v3Gp3bBc/t5L8JMG4OqHJLi/Q3HoffNNJXADCdsv8ejtSeH2HuL8M1kYu8ZB6XOeenXux4QfmLmJwcAn5osmZWTOnz6X0LuHD4vY+RaFthulzqxV1EVutV60sqvghreFcdvbO5xYn3mBpn7Z7/PHnTBefueGG+EtEQetUKdslcyBnjC4Sy+XNdLeCVhSyrqKGSf0Yczt3m3iu0gZOFollLVdKMm0Ridneb9PKcuNMVlwfjlhX1ZsyWabIXEfv/pnQ2hWT0qp/aK4qCrLbBS87X9VslhTg+vp8J8HuKG11QEdYxHfeWYEZqzrmzFZZ74Xzzu00L7tzepMWCvQK/2+pYMZ9J1bK4N5vUmY/fzYwAD9pTy7p9TvxvbN9b3BT7CmnCz0t99knHxyPscRINWOpUGZwEI4qvk+szzVbvmknxyd8HbahqKp4OGLnnpvtwoc2t8ReLQrY5ZETBreJtGaa/3hl5Y97CswNvBZvOopcPni6BLeAFm7kHWz29NW/jqblrfa9TWz4AzFv2j8433wIhQKzKENRXoq3/OlZ3RSnW9/167jXlLldjvXEmNWHodbhhChlcu2WCoOwovPhTRFeqEYHk2nSM4H5nMuev+nyP3ynMGndFjD76YX3mRkPvt+XJIhNBhmtcv529sx52ai0xAEdj/ZvZI04oNFt9U3JR+4PO/gt8+bzHPJ9akbyah40HX9nMn8e/knblfXGxy4kJd382l1i8ae8dfug4vu5jzETP+2TRIUl3W6prQUZWcTYmCHCpXsltR8LXsTEEAgEMHZyaAg09K6Rr6f+lvYlab+ly6KD6ZBIP9RDIk0fJS/HnW2pfpw3kF9eMaecBpac+vjnbAfu6otZPbD2RvfrRPS5c+LimbJ60tr+wZLBxmiMvFhbpqrmkVswzV/Q+1WYUXKL6lBLdXMPujjHqtAXh/6Ly6Yb5QmIk+nq4bez0d991Mgfvtjh9fWzqPBelN4+z3pYmHkNUdaIbjM3yhw2jbM7s/CoaJeLi52mfFExQogfyDalEZ4tXBMd97dQxy15inP3Iladb6liWB2t3lB3XTXuzLeYmfg1PtLi67uZro+lwUFSypYcdq3LVq7P47Famu3iY8Z17ocnF9//yeSo9AC7clRKSVppic4V/J/2m0MdH4LZZ3w+eFBnRMiH5p8+DW3e7RMmTn/M3C/Oug2zJrw62FE4WfhaKkkRENUTnQ37myu6LJJCQtTSi4ZLfP5ic02G38sKcwO2X9NWpYWp5HmHGyHxontbC268TRpDBQoxnvm9BvkeEuzPH8J3dK60N93lUHZnLodbBO4xwsXn13HxrFI4NnYC7Dg127fl1vgU4Lqlpi2Xj7+AD7Nvb28fnXPYo1l2HBv3BDC/aBOWEW657ELmE347PuzZnv/p9D83aV5WVs7I8OnNNoMDvgO19xxNXU4M20Xa249Qgx9fi6dHPSK2JgTKHiOjh5zXn06cjxtv3pj/HjPNshu7Tb7t/fK0Hn84sTA/xMSF0LHU3nbIKGVhEuF6j5v3I/ucHxEJ0IZJ7YtWz1835mlZf4Q6B15LlEa+D8rX//SbN0/NNozfFtI76JDV3IoShtW4bcB1JMONEp0dLcQ37MNyZVYZycZef0WgaDbtzGWOk3ZpWtPMa1x/UbGjKBV6dC6jKyulHgsMYN7B67tWrI5+D30UYXAflHetZ3jqvwFQSwMEFAAAAAgA8AgQN67s2hQTAQAAIQMAAAkAAABzdHlsZS5jc3ONUctugzAQPIevsJRLewCRR6uKXCk/UPUDDN4Yq67XMkuDWvXfi3lUSYE0Wsky3p0ZZpZ4riEif1boCBz7ClZHNBRW6hMSttna5hCscl68SYe1EWGBGl3C1vvUV9s7KUFlOxlv9/0sOgHtxMY2rEKtBFvHcXwIvgOaiFHp9QgaCrlW0iRMw5FaEsuFUEYm7GFJ//HZ1wKt8LTjZJZlE8Y5VAQfYDxwRm2X+lrAoRALsGs/GZXARR/4GVK9c9nmXjt9l8vIGnl/ad+BBU4JMzhcfxMPfXQXsffGh65TsqTpVsY2oZ3BDqEN1Lu4W8b42EGeuqcSenZeE151+9J+vdplz7wqbjP9j0aKp7+rPFMRcLPMD1BLAwQUAAAACACViGg2L0q8+zsKAABpCgAABwAAAGFzYy5wbmddVg04k+sbX/rQByVOUQnlI5WvTiGhskZtmvKRIvJN+SzHVzlEQkSdRlLhOOIgx2c+jgppjNimbW02m2222Ww2+7Sp0+H/dv7nXP/r/H/PdT3v+z7X89zXff/u5/7db8F5j9OaG3duBIFAmtAzEC8QaJUF8L5n/Wpg9oFFWgKPNVEucBcQqHXUfm0hH/jekeR6Kck7ITIpNSQxAuQSnhAaYQSNC4mK8IoICb9540OEEwi0GnT+rI9r+FBcWH8ECoU6j/aP7Ls+SOrw73f3HPHO6PfxH4D/0lOSh7ryqO5uQptrWK2jM/IktF1bqVQuLi4qFAq5XM7n8wcHB5eWluLj4+fn50UiEZfLZTAYNBoNg8FwOBylUiWVSRlMxtTUFBaL5XDYfL5AqVJKpVImg4nFYkgkEovNIpJIEvE3MJkMuUzOZrEpZAoagyFTKAwmU7QADJGAz8dgsTg8ns1miyVimVxOIhGZDIZMKsXjcRQKZXFRKRDw2RwODofDYNAqpQqLwU5Rp/A4HJc7yxfwWSwW4LpcLhOLJSKhiEqdmqJSSUSiVCqTSMRKlYpMpkhlMgqFzGAwMWgMjUrD4fCKRQWHzRaKRHgcni8QAIfIFLJEIgEO02jUWS5XLJHIZHKRSKgCmFEustksHB4HEITH41lsNrBJJBSSiCSRaIH1LS6ySqUkEoEFInWKCkRGJpOJRKJCschhc9gslmjhG6hUGgaLkUllWAxmYQGIXYBBo6lUqkwu485yV1ZWmEymTCYTCkUCgUAmk6LRaKt3Fm6jcBqVCpjxm7jqNHxCCEAkxGCws7OzfhNB9khLq3dGDkOO6JkBPn9uYGAgoQl6pmVD8chVH8wlKo0aho3xadnJ4/FM+wzh4xfnBYLY+jMX2w2cho94vDK50mM6OTl5rkHXBxPc29vb09PT3t4ObdWGtW1vaGz0RAcUDIc5D58Mw15jzbAYdAbABXwcLhFLFhWLFMrUolKJxqDZbA6PNzc+jo7EpkUS0uDtmyPx13lzc+fR3n7DQRNY7KdPhDkA/Dl4D5z+DQz0OJrOoHt0mtgjHWY5nDBUZCQhNWw0zA0JdhsF+3fDBwffw5q2w1q2uw2APwK5x330fw0lEAh1v/7qMGQTjv8hEnfdE+kdjk+OxKX6d8A82kxON60fHwPG+IO4Uj8QaJ0YCnHxSZsSPku95H1RD5XQ5RsXYzvaJbI1ebJGLdtkDTj0jBoEnAUy09jR4bImwMJlbdS2iuZu38tdLaTo/G6ir2NnV3KSuE9FT58Qm/Q29uo/GFmRT1ekT6jSGU/yrbdwoL/b6OYXvi5vO++pq2NwQBCKyit8rQdtaNjk7HeoX/TdBkOke5oByHo0jn7Y0HgmMDPsea2m1eg7b7cJpknBJc1T+38pryB5a+Zkas4/edi8Zfnm89XqnxKTXv5sfG88oylT6N32dt1LcxxUW7qzzAt8SKrqRNpcNDPDepw9qHHurm5b53twElSDsZ73Hlyde42eqYzV0kHq9AX6p+1JmnlFmKuB7IMOxVyCbVDXun3OUYPgVfqTf607vLKOgIGZW8OynhHxXlc+IZ49O9/i/nFQbQrhX1V9yiP4WOD7EtfZxmO7A0vnTArSNN0BP9c7i2zOHhq54R3SVUOA69JUsgxd2tA23YRnIzeGAw5KWJXely/fn2mPmTRrTTgA8Xfh3qmhOQU5GsGSqmbGg49Y1OXu3asA/LdoCp0meJEPelXYi09k0o0HnBLp0j/tHf32NSV27F8ovUagxW/btI78uvKAzetKi+c1oRcIHvePVe6fbDtg3+TlMOxZU2LCsrWouxv6l73DIw9/XqPuFH80WVxPPUdPTvzD0LDqdcjb1hZw/VMjrMI2WAE9nDFu6Gr7QWxgXahdabK1NWS/6Xc6v9Tvzmu/hkAcmTa43BpJLn+ywPgioef30FdY5SHPHtBrlzcXo0o+Tc/wxeJuitOzB/HwgfoXkyRqTE6pJX+lYR+UMMNf6FmsKTaHJSEgb/PqSq+Dtt4aC9FrfJ8+Vyd+oNebMV98uTu298a88pHx8Z9gdWaNPpaPfZEe0fkXmlV+dRvfgKN7DgqzzRNhj0JVQTk1Jvug+hCkJ8zcDAykS2eVbSqx6N565HSqxnQ7D+uoEpIPKUre7F5vHHdhqGh9EOb3jIWi3sk9t9ItQ7uyrzZPeG+Kbp7YpW/qULDXDekVfTTr44+62SHla/O4hQfyccylGwzxua9vVxHpb8ozEnZquIXJ1U7lvqgZY15N0dPYds/H1lF/U9Fm9eCcQ1p9aHJAxG/fB/iGHNHbveklxBPxL9Y7gD6g71d81o7zbnfr9Cv1qqb0FI0TvHdaTy0c6s163br9yoxzRl7ZOtjObbyw+nnyfCIiIrvhCdeEt9Qz+H8ZvFFGC3CP9wmg/eRpnIqMIeVZGmYsf3nyIi/AMKKg8P4dxGxLF8R19j2W5bznwCuj/VrF91/9VuxfefDy7qj2rD1HAfaHXI7o/2MueUexb0xKSubyAO+EYj4uqIju+IVKxWbMfb0t6NjVnJycTGop8ogJy8zcp59cSfoaGxOVmZmSEnbRLcXNKFqEbkux5aaqqbUfOvpPWs+fvVuVoufWFNj9+5H+I85//tEa36d6PD3Qd/hHVe/t6WMLb4br5O7u7rwR6zuPj584buC83ZoUzau3Lgza/nMLsWb2oVrh5J2qluKg2sBfNR8AV/CGlubpv4sKjeCPfbhpOrZ483T4Fv1lbv5E+Q/LX79IVncYwyIKEqHeVV6NsV5Wq06VdKypGOOffHwTDoePvf2Q3eDl0NdYu0ZJ2JfjukPf9Bh07xWkF+xo1lL6VIhern/cSzsoUTDy8srRlBnX0yvHb+FyR+j2/VH2/G3EW10fanua4BvTSky7DraUqTXlqQzMFOsghvdeLhoFNX+cJ6boGHmWcv5V/J0BVg+xiChXe6cpBcpyS9USfyinB9KsgozHVSs+uGQhomyrA4OSgkjdecdvdn51SLDQEsVczQr0LfvxueZM9d8yhgdv3aAoRb5Tv2a39vgpcF/GR3nSJPe2XaqDkzojdFrIN03aH3v984t4UqqmHcGxfa8nENTSiQ0GgiKkjX7qZy8sGl4ezE0RHVMIRuw+y/PtRBVtoaYjTy+Wp5cpFYrqAb/r3Lo2NPP75w5kj0sFwUYbY3Kfsm+hnSuO/q9M/1LSx48e6YyPhRrvQ6HcUC3ZVtp2k2UXUL6+Zc2NFnJWR4HRi7hZFDnGvmzPCOQezrXAA3Fvsq1Uu7DgI2EzslN3Kd5o+93P9iFPn87Rqvy0SAvTd7d9F57nvPlN1Nvq3Vs5Y7VFiApAbDTLqu8AN7MUaaP95GDkxofxGRYVLBl95NGZAPquPS25mz6X5yK6u/e/bSrmhaXpWhdkW6GGjSsTXtxHVEIArTL/r1aZJTEksQu78pZzZiyWJ2fwQM85bOXzaThA+4Dgy7msVSDzrB39BROHO4B/RRDU1QPSAg6+8x9QSwMEFAAAAAgAlYhoNsHYSPMgCgAAXwoAAAYAAABiZy5wbmdVlglU00cex2NVFCWUUkAExIpYD+6qHAIqCEiCiSApl0bFcAhK4gGIouIiIihiAWGtFOQoikQjiEvKLY2cOSCBBJIACUkIJJD7QlHYv7u1b/c37831Zr7vN5/5vflNbjD8MHidxToQCASGBPodA4FW2AP9LWtXAjUCGucANKvifWA+INDrPrfV90TAeGOyf0RyKCYu+Ur0pViQTwzmTOwPkKTo+NhjsdExVy/2x3qBQCtBwUcQ/qiO2J6enmBSVFz7hS7Gm6iOoJDe0BsdiKhOWCW+KLvnZEFNFqbeH/W7pzfhIKTBWKvVajQatVqtUqlEIlFXV9fCwgIajZ6bm5NIJEKhkMPhjI+Pk8lkgUCg1eoUSgWHy2GxWBQKRSDgi0RirU7L5XAVCgWDwaBQyDw+j85gyGVfTKVU8Xl8LpfDHGOSyOQxJpPD5UqkQJGIRSIyhUKl0fh8vkwuU6pUDAady+EoFQoajcpkMjUarVgs4gsEVCpVp9WRySQKmcJis2hUqkgsEgqneTwe4LpKpZTJ5JJ5CZvNYrHZDDpdoVDK5bKxMaZCqWQyx7Q6HZlE5nC44+xxAZ9PpdLUGvW8RAIsp1FpIrF4jDkG7JTL5ePjbJlcPi0UKpUqHYBFq5FI5vl8HpVGBQDRaDQeny+Zn2ePjzPoDB6PL5FIdTotc2xseXmZTgfm6GwWe2xsjE6nfzmiVKpWawR8AZ/Hk0qlbPY4mUJWAj6plGKRmAIAJZGkUsBttnBayOVyxWKxUqmcn5colQoSiQTsG2ezA/pgZDJlHjDJfOTg2cjBU9PT024EB6/uAyfx22ZmZkSi2fPPAwNx+ijKOQQ5AvLa+EHvWQwWAm+0ZY+zwxusSVOdMGL4nFjc2dk5OjqKwFkcrd2AIJ9ubm5uaGjA4/G1L16EkE7kdqOg9WZb26zsOi093jt7dx9EURI4k18KDA/jTQGotXKZXKPWMJksEpk0MzMbR0kbGRnWaLWwBsNgUmhk9ymv7j1xtAuzgIlmYUTY5OQkkUianOSQiKSoJti0QIDqiYO/tUX1odwIHjOzswEE34A+3+Hh4a6uP+OG0+KGr0CxZny+AIozG6RQAjp9h4C7pw5FtUCIA8SaZ8883nvG0C7HUS+EEEJjaClx1CtRb6DwetvD2LUDgBGJMe+TTDLJW0AgvWmInw8ijTX/5EpEaLh5z+vGRLpec1N7tqDw4NpfVgUGGkBuHVybVZC95XhJZs7KFT6rux0QrXexTRWvUsOTJliJusl0WbvOWusJQSc69vJFyx/QlPaZxXYZkdD7vdL2xOPLh/yRRyJqa+/rf2ua4lLk64/Ms0WM3LkZ4dIhSdbfTAhKswY59b2a3L156xTyJgr7u6lj37vQgEGubW4E+NDOyse/0ULBt2+C41+W7tm68KHJyLA2ZXYPqvIHnOrVxqLyW9N7g/1z4YU5o/WPjO/ldj7flN3s7nLx5pmokDSbtls1pqaVQWcWAtw3mK5wgKq0qpnbj83LZyW0P+9XrH/6NGDDtn0Qm5OEY1D3rIV0VvTjEl7WyBlkovhEGRrt63/xm5HxkpJ7vJKRkax1yExDs6GSkXurNl36ZlhkbO2EC6SLZqv8tkPen4uA6nf7zSbcjYa655fqY8FlUiu86kMZXyqAQl0deH8Y48Bp/Sm72Swo18W5vn+uVL/A9Zfmih34vlHDXOOy+IWfzMFBCZU5a70lzgbEugjdSxNtocnMA/xTcw138Nv8fRcXH8AZ/XW/nb/nGcuwxx/vzlzRhH6+Lg+9nfisNoL+MrQKHj9AfzlArkPALz6atc1NAwcB7L7okdp2hjreWmntmS9bui4vb5Vu/PS5ne/5bEEMTX6yhud1amXA0z2D+E8hiA0LE6F+IVVFtry99jVZZ2zUbwnOrrBjhc+IqDlGntdMI4FtPXvjNHsqnrLxRYIMLsaMnvWCICXlS0uOpeTqBBlNnc5qTZqYcA1kFi7dv1a4R1KOu3ncjZXzN6W7RpXPrbILdrXdPfnxYyRKD4/ksNnpn5u6XOK97YuhsGMvona9ulM2YogNkzVCTVPvjKDDx1aGCB7ZdEs79fwh8MI0C/Dhv052ZNUIT3PZxsYgHbPx5iGnOsvsztbRfzjTGIdJuXL6b973Z+w79KjeKTn01VUp+49uqk3Zj7nwSGB7D4D9YsrIV4VclR1dsvGJHXZTwG1+UWlGumRpUdqu61jMaJkTkActDAJQqp8O1VS/YXHPppobFOcg3DytiHmGa07fdjFCxp7HuYZZhv1sAQ7ofZMYAgj/D/U8ew8Pj/CwrUVgzzTieqcP5ZHVv94mxLwRjD8RWDDNInEG1kfpAkaFHQJ83rHV3i3SLOdaAvoSLsPS6mtI7vjR96inwfeYfmKjwL+791vLA3Gtur1ztx+evJ7+qf5ctX2IIiT4TVuQQ0jI1frGtKM5A/aB6/z4fId/BiT1FSXl4CPeGX0R4yXssfp6neBfYWHn4HCfrgMozOI04+F2LfyTkPEd/sHnyi3P+1lDQ6clpPl6V1OT5HfUoWiHvoZUExOBYE9KnDBGr4qRf+RcfKjPmh+MSjOr/z/u37LodgO8Adpw56I6f8IJs6wpoLIPf7raK8CEP3LYaWd33BhvFfax8A93dUSDLxZZ2OGFTjnREna/5MC6HfD111pc0c2p/3J1hyYXvh8+6/5VNowSBic6/XyyIONgquDZ646MZVtV7wa3TQWbgncFFdtZqoqhsdWXtplbFNdwERS9OhLm/HmE8Oh6v+IB5oOamvqn3mD7Ae4OKsRYYVFy7M8t7znDhoQdI4mhryB1YQcQn3saGrdbfZwbymp82B57fRhNs0vUJBZBMOGlJvIfgxLDT2xbHbZe5n1kFpyz3+jnOZ8OaOUoVvLjwaod/f+V9HX57hrwbJxtPmFd5jCYj8t4q5j7fFi2pJBWL1bj5H7EpAp1v8+twvjRauSp5FNaxsf9V99+CsLYG0mwr+8iU5uuY8FTFX85SPP9Tl/9iPBuTYLr6v2HfNtbiKqYmZJOfPI+r9aT0RPzL7Yl7zx/4UM1mnEF7Drs2WATAkTJwmZ9a3EewdnqygcLCglWlijU09PeWMiHLak7YKMwZPqW3l9Hn6QzgJ9LRWfkBeHeehL3p1KPMXi7UddBE0bU7l7N43T3v9+MKSOeDABfZ7N19wARtXX3GdRWlFOmo7FrKRF7Bls34FS3S8dTGvxCbUpEzQsfTPcVrHBp+Qr4Lxqr73RY5tyJXoJFhJntc+rbZXCcO5FlahZ3x1uvdabt9AqbvmL/jds8gCj3RGauu5c7FGpICDyBeyzyatE0JLcQ0zcftrl4FZP1R4njNKoEGnX8uQoXVv5wCtlmq9divuFhckexIzTV2L8tu/JR8JGs8tTHQzcIy5c5zurNBsv8jE2U/2QaIO+QrlZW4TJWm4PcElWXbfKwc8APEQTxh/vhfE9n/htQSwECFAAUAAAACACViGg2Q6tDAyAKAABmCgAACAAAAAAAAAAAACAAAAAAAAAAZGVzYy5wbmdQSwECFAAUAAAACADwCBA3ruzaFBMBAAAhAwAACQAAAAAAAAABACAAAABGCgAAc3R5bGUuY3NzUEsBAhQAFAAAAAgAlYhoNi9KvPs7CgAAaQoAAAcAAAAAAAAAAAAgAAAAgAsAAGFzYy5wbmdQSwECFAAUAAAACACViGg2wdhI8yAKAABfCgAABgAAAAAAAAAAACAAAADgFQAAYmcucG5nUEsFBgAAAAAEAAQA1gAAACQgAAAAAA==]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/green/style.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGFibGUudGFibGVzb3J0ZXIgewoJZm9udC1zaXplOiAxMnB4OwoJYmFja2dyb3VuZC1jb2xvcjogIzRENEQ0RDsKCXdpZHRoOiAxMDI0cHg7Cglib3JkZXI6IDFweCBzb2xpZCAjMDAwOwp9CnRhYmxlLnRhYmxlc29ydGVyIHRoIHsKCXRleHQtYWxpZ246IGxlZnQ7CglwYWRkaW5nOiA1cHg7CgliYWNrZ3JvdW5kLWNvbG9yOiAjNkU2RTZFOwp9CnRhYmxlLnRhYmxlc29ydGVyIHRkIHsKCWNvbG9yOiAjRkZGOwoJcGFkZGluZzogNXB4Owp9CnRhYmxlLnRhYmxlc29ydGVyIC5ldmVuIHsKCWJhY2tncm91bmQtY29sb3I6ICMzRDNEM0Q7Cn0KdGFibGUudGFibGVzb3J0ZXIgLm9kZCB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjNkU2RTZFOwp9CnRhYmxlLnRhYmxlc29ydGVyIC5oZWFkZXIgewoJYmFja2dyb3VuZC1pbWFnZTogdXJsKGJnLnBuZyk7CgliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwoJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjRkZGOwoJYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzAwMDsKCWJvcmRlci10b3A6IDFweCBzb2xpZCAjRkZGOwoJcGFkZGluZy1sZWZ0OiAzMHB4OwoJcGFkZGluZy10b3A6IDhweDsKCWhlaWdodDogYXV0bzsKfQp0YWJsZS50YWJsZXNvcnRlciAuaGVhZGVyU29ydFVwIHsKCWJhY2tncm91bmQtaW1hZ2U6IHVybChhc2MucG5nKTsKCWJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7Cn0KdGFibGUudGFibGVzb3J0ZXIgLmhlYWRlclNvcnREb3duIHsKCWJhY2tncm91bmQtaW1hZ2U6IHVybChkZXNjLnBuZyk7CgliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Owp9]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/ui.lib/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/ui.lib/css/smoothness/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/ui.lib/css/smoothness/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/ui.lib/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAABkCAYAAAD0ZHJ6AAAAe0lEQVRoge3OMQHAIBAAMcC/kjdZJHTI0A4XBdkz86wfO18H3hRUBVVBVVAVVAVVQVVQFVQFVUFVUBVUBVVBVVAVVAVVQVVQFVQFVUFVUBVUBVVBVVAVVAVVQVVQFVQFVUFVUBVUBVVBVVAVVAVVQVVQFVQFVUFVUBVUF8O8A8WdY6opAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAABkCAYAAAD0ZHJ6AAAAeUlEQVRoge3OMQHAIBAAsVL/nh8JDDfAkCjImpn5HvbfDpwIVoKVYCVYCVaClWAlWAlWgpVgJVgJVoKVYCVYCVaClWAlWAlWgpVgJVgJVoKVYCVYCVaClWAlWAlWgpVgJVgJVoKVYCVYCVaClWAlWAlWgpVgJVgJVhtqiwTEKTLXTgAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAAP0lEQVQ4je3PMQrAMABC0a/3v2zX0mCXNkOgc6C4PARd5DqPGKCU8luS8SbAQhiCQRgJE56kZTfbbP9RSvnkBsWcEAZRWcgqAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAAMElEQVQ4je3LIQ4AIBTD0O3f/8wrFgmKhMy8pKJKwkhSKeVbbGuAPU9f4PIopTxgAeS0DRtI4yK0AAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAANklEQVQ4jWN48uTJfyYGBgaGUWKUGCWGLfHt2zcoi5GREYNgYmJCZiG42IiB98woMUqMEtgIAMdjCdyg+eEBAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAANUlEQVQ4je3LMQoAIBADwb38/6t5wFXaWAiCtUiaYZvF9hBACOFbuntVVe11B0CSjjeE8BwThQIJ8dhEl0YAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/css/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>/lib/ui.lib/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAABkCAYAAABHLFpgAAAALElEQVQYlWN49OjRfyYGBgaGIUT8//8fSqBx0Yh///4RL8vAwAAVQ2MNOwIAl6g6KkOJwk8AAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/css/smoothness/images/ui-icons_2e83ff_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEUsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvzLrJBNAAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/css/smoothness/images/ui-icons_222222_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEUkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiTww4gUAAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/css/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/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/css/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/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/css/smoothness/images/ui-icons_cd0a0a_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEXMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzrDkZjAAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/css/smoothness/jquery-ui-1.9.2.custom.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSBVSSAtIHYxLjkuMiAtIDIwMTItMTEtMjMKKiBodHRwOi8vanF1ZXJ5dWkuY29tCiogSW5jbHVkZXM6IGpxdWVyeS51aS5jb3JlLmNzcywganF1ZXJ5LnVpLmFjY29yZGlvbi5jc3MsIGpxdWVyeS51aS5hdXRvY29tcGxldGUuY3NzLCBqcXVlcnkudWkuYnV0dG9uLmNzcywganF1ZXJ5LnVpLmRhdGVwaWNrZXIuY3NzLCBqcXVlcnkudWkuZGlhbG9nLmNzcywganF1ZXJ5LnVpLm1lbnUuY3NzLCBqcXVlcnkudWkucHJvZ3Jlc3NiYXIuY3NzLCBqcXVlcnkudWkucmVzaXphYmxlLmNzcywganF1ZXJ5LnVpLnNlbGVjdGFibGUuY3NzLCBqcXVlcnkudWkuc2xpZGVyLmNzcywganF1ZXJ5LnVpLnNwaW5uZXIuY3NzLCBqcXVlcnkudWkudGFicy5jc3MsIGpxdWVyeS51aS50b29sdGlwLmNzcwoqIFRvIHZpZXcgYW5kIG1vZGlmeSB0aGlzIHRoZW1lLCB2aXNpdCBodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyLwoqIENvcHlyaWdodCAoYykgMjAxMiBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIExpY2Vuc2VkIE1JVCAqLwoKLyogTGF5b3V0IGhlbHBlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi51aS1oZWxwZXItaGlkZGVuIHsgZGlzcGxheTogbm9uZTsgfQoudWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIHsgYm9yZGVyOiAwOyBjbGlwOiByZWN0KDAgMCAwIDApOyBoZWlnaHQ6IDFweDsgbWFyZ2luOiAtMXB4OyBvdmVyZmxvdzogaGlkZGVuOyBwYWRkaW5nOiAwOyBwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAxcHg7IH0KLnVpLWhlbHBlci1yZXNldCB7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgYm9yZGVyOiAwOyBvdXRsaW5lOiAwOyBsaW5lLWhlaWdodDogMS4zOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtc2l6ZTogMTAwJTsgbGlzdC1zdHlsZTogbm9uZTsgfQoudWktaGVscGVyLWNsZWFyZml4OmJlZm9yZSwgLnVpLWhlbHBlci1jbGVhcmZpeDphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiB0YWJsZTsgfQoudWktaGVscGVyLWNsZWFyZml4OmFmdGVyIHsgY2xlYXI6IGJvdGg7IH0KLnVpLWhlbHBlci1jbGVhcmZpeCB7IHpvb206IDE7IH0KLnVpLWhlbHBlci16Zml4IHsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgdG9wOiAwOyBsZWZ0OiAwOyBwb3NpdGlvbjogYWJzb2x1dGU7IG9wYWNpdHk6IDA7IGZpbHRlcjpBbHBoYShPcGFjaXR5PTApOyB9CgoKLyogSW50ZXJhY3Rpb24gQ3VlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLnVpLXN0YXRlLWRpc2FibGVkIHsgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7IH0KCgovKiBJY29ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIHN0YXRlcyBhbmQgaW1hZ2VzICovCi51aS1pY29uIHsgZGlzcGxheTogYmxvY2s7IHRleHQtaW5kZW50OiAtOTk5OTlweDsgb3ZlcmZsb3c6IGhpZGRlbjsgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgfQoKCi8qIE1pc2MgdmlzdWFscwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIE92ZXJsYXlzICovCi51aS13aWRnZXQtb3ZlcmxheSB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyB9Ci51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1oZWFkZXIgeyBkaXNwbGF5OiBibG9jazsgY3Vyc29yOiBwb2ludGVyOyBwb3NpdGlvbjogcmVsYXRpdmU7IG1hcmdpbi10b3A6IDJweDsgcGFkZGluZzogLjVlbSAuNWVtIC41ZW0gLjdlbTsgem9vbTogMTsgfQoudWktYWNjb3JkaW9uIC51aS1hY2NvcmRpb24taWNvbnMgeyBwYWRkaW5nLWxlZnQ6IDIuMmVtOyB9Ci51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1ub2ljb25zIHsgcGFkZGluZy1sZWZ0OiAuN2VtOyB9Ci51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1pY29ucyAudWktYWNjb3JkaW9uLWljb25zIHsgcGFkZGluZy1sZWZ0OiAyLjJlbTsgfQoudWktYWNjb3JkaW9uIC51aS1hY2NvcmRpb24taGVhZGVyIC51aS1hY2NvcmRpb24taGVhZGVyLWljb24geyBwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IC41ZW07IHRvcDogNTAlOyBtYXJnaW4tdG9wOiAtOHB4OyB9Ci51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1jb250ZW50IHsgcGFkZGluZzogMWVtIDIuMmVtOyBib3JkZXItdG9wOiAwOyBvdmVyZmxvdzogYXV0bzsgem9vbTogMTsgfQoudWktYXV0b2NvbXBsZXRlIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogMDsKCWxlZnQ6IDA7CgljdXJzb3I6IGRlZmF1bHQ7Cn0KCi8qIHdvcmthcm91bmRzICovCiogaHRtbCAudWktYXV0b2NvbXBsZXRlIHsgd2lkdGg6MXB4OyB9IC8qIHdpdGhvdXQgdGhpcywgdGhlIG1lbnUgZXhwYW5kcyB0byAxMDAlIGluIElFNiAqLwoudWktYnV0dG9uIHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwb3NpdGlvbjogcmVsYXRpdmU7IHBhZGRpbmc6IDA7IG1hcmdpbi1yaWdodDogLjFlbTsgY3Vyc29yOiBwb2ludGVyOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHpvb206IDE7IG92ZXJmbG93OiB2aXNpYmxlOyB9IC8qIHRoZSBvdmVyZmxvdyBwcm9wZXJ0eSByZW1vdmVzIGV4dHJhIHdpZHRoIGluIElFICovCi51aS1idXR0b24sIC51aS1idXR0b246bGluaywgLnVpLWJ1dHRvbjp2aXNpdGVkLCAudWktYnV0dG9uOmhvdmVyLCAudWktYnV0dG9uOmFjdGl2ZSB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQoudWktYnV0dG9uLWljb24tb25seSB7IHdpZHRoOiAyLjJlbTsgfSAvKiB0byBtYWtlIHJvb20gZm9yIHRoZSBpY29uLCBhIHdpZHRoIG5lZWRzIHRvIGJlIHNldCBoZXJlICovCmJ1dHRvbi51aS1idXR0b24taWNvbi1vbmx5IHsgd2lkdGg6IDIuNGVtOyB9IC8qIGJ1dHRvbiBlbGVtZW50cyBzZWVtIHRvIG5lZWQgYSBsaXR0bGUgbW9yZSB3aWR0aCAqLwoudWktYnV0dG9uLWljb25zLW9ubHkgeyB3aWR0aDogMy40ZW07IH0gCmJ1dHRvbi51aS1idXR0b24taWNvbnMtb25seSB7IHdpZHRoOiAzLjdlbTsgfSAKCi8qYnV0dG9uIHRleHQgZWxlbWVudCAqLwoudWktYnV0dG9uIC51aS1idXR0b24tdGV4dCB7IGRpc3BsYXk6IGJsb2NrOyBsaW5lLWhlaWdodDogMS40OyAgfQoudWktYnV0dG9uLXRleHQtb25seSAudWktYnV0dG9uLXRleHQgeyBwYWRkaW5nOiAuNGVtIDFlbTsgfQoudWktYnV0dG9uLWljb24tb25seSAudWktYnV0dG9uLXRleHQsIC51aS1idXR0b24taWNvbnMtb25seSAudWktYnV0dG9uLXRleHQgeyBwYWRkaW5nOiAuNGVtOyB0ZXh0LWluZGVudDogLTk5OTk5OTlweDsgfQoudWktYnV0dG9uLXRleHQtaWNvbi1wcmltYXJ5IC51aS1idXR0b24tdGV4dCwgLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1idXR0b24tdGV4dCB7IHBhZGRpbmc6IC40ZW0gMWVtIC40ZW0gMi4xZW07IH0KLnVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IC51aS1idXR0b24tdGV4dCwgLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1idXR0b24tdGV4dCB7IHBhZGRpbmc6IC40ZW0gMi4xZW0gLjRlbSAxZW07IH0KLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1idXR0b24tdGV4dCB7IHBhZGRpbmctbGVmdDogMi4xZW07IHBhZGRpbmctcmlnaHQ6IDIuMWVtOyB9Ci8qIG5vIGljb24gc3VwcG9ydCBmb3IgaW5wdXQgZWxlbWVudHMsIHByb3ZpZGUgcGFkZGluZyBieSBkZWZhdWx0ICovCmlucHV0LnVpLWJ1dHRvbiB7IHBhZGRpbmc6IC40ZW0gMWVtOyB9CgovKmJ1dHRvbiBpY29uIGVsZW1lbnQocykgKi8KLnVpLWJ1dHRvbi1pY29uLW9ubHkgLnVpLWljb24sIC51aS1idXR0b24tdGV4dC1pY29uLXByaW1hcnkgLnVpLWljb24sIC51aS1idXR0b24tdGV4dC1pY29uLXNlY29uZGFyeSAudWktaWNvbiwgLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1pY29uLCAudWktYnV0dG9uLWljb25zLW9ubHkgLnVpLWljb24geyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNTAlOyBtYXJnaW4tdG9wOiAtOHB4OyB9Ci51aS1idXR0b24taWNvbi1vbmx5IC51aS1pY29uIHsgbGVmdDogNTAlOyBtYXJnaW4tbGVmdDogLThweDsgfQoudWktYnV0dG9uLXRleHQtaWNvbi1wcmltYXJ5IC51aS1idXR0b24taWNvbi1wcmltYXJ5LCAudWktYnV0dG9uLXRleHQtaWNvbnMgLnVpLWJ1dHRvbi1pY29uLXByaW1hcnksIC51aS1idXR0b24taWNvbnMtb25seSAudWktYnV0dG9uLWljb24tcHJpbWFyeSB7IGxlZnQ6IC41ZW07IH0KLnVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IC51aS1idXR0b24taWNvbi1zZWNvbmRhcnksIC51aS1idXR0b24tdGV4dC1pY29ucyAudWktYnV0dG9uLWljb24tc2Vjb25kYXJ5LCAudWktYnV0dG9uLWljb25zLW9ubHkgLnVpLWJ1dHRvbi1pY29uLXNlY29uZGFyeSB7IHJpZ2h0OiAuNWVtOyB9Ci51aS1idXR0b24tdGV4dC1pY29ucyAudWktYnV0dG9uLWljb24tc2Vjb25kYXJ5LCAudWktYnV0dG9uLWljb25zLW9ubHkgLnVpLWJ1dHRvbi1pY29uLXNlY29uZGFyeSB7IHJpZ2h0OiAuNWVtOyB9CgovKmJ1dHRvbiBzZXRzKi8KLnVpLWJ1dHRvbnNldCB7IG1hcmdpbi1yaWdodDogN3B4OyB9Ci51aS1idXR0b25zZXQgLnVpLWJ1dHRvbiB7IG1hcmdpbi1sZWZ0OiAwOyBtYXJnaW4tcmlnaHQ6IC0uM2VtOyB9CgovKiB3b3JrYXJvdW5kcyAqLwpidXR0b24udWktYnV0dG9uOjotbW96LWZvY3VzLWlubmVyIHsgYm9yZGVyOiAwOyBwYWRkaW5nOiAwOyB9IC8qIHJlc2V0IGV4dHJhIHBhZGRpbmcgaW4gRmlyZWZveCAqLwoudWktZGF0ZXBpY2tlciB7IHdpZHRoOiAxN2VtOyBwYWRkaW5nOiAuMmVtIC4yZW0gMDsgZGlzcGxheTogbm9uZTsgfQoudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1oZWFkZXIgeyBwb3NpdGlvbjpyZWxhdGl2ZTsgcGFkZGluZzouMmVtIDA7IH0KLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldiwgLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dCB7IHBvc2l0aW9uOmFic29sdXRlOyB0b3A6IDJweDsgd2lkdGg6IDEuOGVtOyBoZWlnaHQ6IDEuOGVtOyB9Ci51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXYtaG92ZXIsIC51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLW5leHQtaG92ZXIgeyB0b3A6IDFweDsgfQoudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2IHsgbGVmdDoycHg7IH0KLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dCB7IHJpZ2h0OjJweDsgfQoudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyIHsgbGVmdDoxcHg7IH0KLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dC1ob3ZlciB7IHJpZ2h0OjFweDsgfQoudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2IHNwYW4sIC51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLW5leHQgc3BhbiB7IGRpc3BsYXk6IGJsb2NrOyBwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDUwJTsgbWFyZ2luLWxlZnQ6IC04cHg7IHRvcDogNTAlOyBtYXJnaW4tdG9wOiAtOHB4OyAgfQoudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci10aXRsZSB7IG1hcmdpbjogMCAyLjNlbTsgbGluZS1oZWlnaHQ6IDEuOGVtOyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItdGl0bGUgc2VsZWN0IHsgZm9udC1zaXplOjFlbTsgbWFyZ2luOjFweCAwOyB9Ci51aS1kYXRlcGlja2VyIHNlbGVjdC51aS1kYXRlcGlja2VyLW1vbnRoLXllYXIge3dpZHRoOiAxMDAlO30KLnVpLWRhdGVwaWNrZXIgc2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgsIAoudWktZGF0ZXBpY2tlciBzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFyIHsgd2lkdGg6IDQ5JTt9Ci51aS1kYXRlcGlja2VyIHRhYmxlIHt3aWR0aDogMTAwJTsgZm9udC1zaXplOiAuOWVtOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBtYXJnaW46MCAwIC40ZW07IH0KLnVpLWRhdGVwaWNrZXIgdGggeyBwYWRkaW5nOiAuN2VtIC4zZW07IHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC13ZWlnaHQ6IGJvbGQ7IGJvcmRlcjogMDsgIH0KLnVpLWRhdGVwaWNrZXIgdGQgeyBib3JkZXI6IDA7IHBhZGRpbmc6IDFweDsgfQoudWktZGF0ZXBpY2tlciB0ZCBzcGFuLCAudWktZGF0ZXBpY2tlciB0ZCBhIHsgZGlzcGxheTogYmxvY2s7IHBhZGRpbmc6IC4yZW07IHRleHQtYWxpZ246IHJpZ2h0OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH0KLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSB7IGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IG1hcmdpbjogLjdlbSAwIDAgMDsgcGFkZGluZzowIC4yZW07IGJvcmRlci1sZWZ0OiAwOyBib3JkZXItcmlnaHQ6IDA7IGJvcmRlci1ib3R0b206IDA7IH0KLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSBidXR0b24geyBmbG9hdDogcmlnaHQ7IG1hcmdpbjogLjVlbSAuMmVtIC40ZW07IGN1cnNvcjogcG9pbnRlcjsgcGFkZGluZzogLjJlbSAuNmVtIC4zZW0gLjZlbTsgd2lkdGg6YXV0bzsgb3ZlcmZsb3c6dmlzaWJsZTsgfQoudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIGJ1dHRvbi51aS1kYXRlcGlja2VyLWN1cnJlbnQgeyBmbG9hdDpsZWZ0OyB9CgovKiB3aXRoIG11bHRpcGxlIGNhbGVuZGFycyAqLwoudWktZGF0ZXBpY2tlci51aS1kYXRlcGlja2VyLW11bHRpIHsgd2lkdGg6YXV0bzsgfQoudWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1ncm91cCB7IGZsb2F0OmxlZnQ7IH0KLnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItZ3JvdXAgdGFibGUgeyB3aWR0aDo5NSU7IG1hcmdpbjowIGF1dG8gLjRlbTsgfQoudWktZGF0ZXBpY2tlci1tdWx0aS0yIC51aS1kYXRlcGlja2VyLWdyb3VwIHsgd2lkdGg6NTAlOyB9Ci51aS1kYXRlcGlja2VyLW11bHRpLTMgLnVpLWRhdGVwaWNrZXItZ3JvdXAgeyB3aWR0aDozMy4zJTsgfQoudWktZGF0ZXBpY2tlci1tdWx0aS00IC51aS1kYXRlcGlja2VyLWdyb3VwIHsgd2lkdGg6MjUlOyB9Ci51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWdyb3VwLWxhc3QgLnVpLWRhdGVwaWNrZXItaGVhZGVyIHsgYm9yZGVyLWxlZnQtd2lkdGg6MDsgfQoudWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1ncm91cC1taWRkbGUgLnVpLWRhdGVwaWNrZXItaGVhZGVyIHsgYm9yZGVyLWxlZnQtd2lkdGg6MDsgfQoudWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIHsgY2xlYXI6bGVmdDsgfQoudWktZGF0ZXBpY2tlci1yb3ctYnJlYWsgeyBjbGVhcjpib3RoOyB3aWR0aDoxMDAlOyBmb250LXNpemU6MGVtOyB9CgovKiBSVEwgc3VwcG9ydCAqLwoudWktZGF0ZXBpY2tlci1ydGwgeyBkaXJlY3Rpb246IHJ0bDsgfQoudWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItcHJldiB7IHJpZ2h0OiAycHg7IGxlZnQ6IGF1dG87IH0KLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLW5leHQgeyBsZWZ0OiAycHg7IHJpZ2h0OiBhdXRvOyB9Ci51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1wcmV2OmhvdmVyIHsgcmlnaHQ6IDFweDsgbGVmdDogYXV0bzsgfQoudWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItbmV4dDpob3ZlciB7IGxlZnQ6IDFweDsgcmlnaHQ6IGF1dG87IH0KLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgeyBjbGVhcjpyaWdodDsgfQoudWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSBidXR0b24geyBmbG9hdDogbGVmdDsgfQoudWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSBidXR0b24udWktZGF0ZXBpY2tlci1jdXJyZW50IHsgZmxvYXQ6cmlnaHQ7IH0KLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWdyb3VwIHsgZmxvYXQ6cmlnaHQ7IH0KLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWdyb3VwLWxhc3QgLnVpLWRhdGVwaWNrZXItaGVhZGVyIHsgYm9yZGVyLXJpZ2h0LXdpZHRoOjA7IGJvcmRlci1sZWZ0LXdpZHRoOjFweDsgfQoudWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItZ3JvdXAtbWlkZGxlIC51aS1kYXRlcGlja2VyLWhlYWRlciB7IGJvcmRlci1yaWdodC13aWR0aDowOyBib3JkZXItbGVmdC13aWR0aDoxcHg7IH0KCi8qIElFNiBJRlJBTUUgRklYICh0YWtlbiBmcm9tIGRhdGVwaWNrZXIgMS41LjMgKi8KLnVpLWRhdGVwaWNrZXItY292ZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOyAvKm11c3QgaGF2ZSovCiAgICB6LWluZGV4OiAtMTsgLyptdXN0IGhhdmUqLwogICAgZmlsdGVyOiBtYXNrKCk7IC8qbXVzdCBoYXZlKi8KICAgIHRvcDogLTRweDsgLyptdXN0IGhhdmUqLwogICAgbGVmdDogLTRweDsgLyptdXN0IGhhdmUqLwogICAgd2lkdGg6IDIwMHB4OyAvKm11c3QgaGF2ZSovCiAgICBoZWlnaHQ6IDIwMHB4OyAvKm11c3QgaGF2ZSovCn0udWktZGlhbG9nIHsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IGxlZnQ6IDA7IHBhZGRpbmc6IC4yZW07IHdpZHRoOiAzMDBweDsgb3ZlcmZsb3c6IGhpZGRlbjsgfQoudWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGViYXIgeyBwYWRkaW5nOiAuNGVtIDFlbTsgcG9zaXRpb246IHJlbGF0aXZlOyAgfQoudWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGUgeyBmbG9hdDogbGVmdDsgbWFyZ2luOiAuMWVtIDE2cHggLjFlbSAwOyB9Ci51aS1kaWFsb2cgLnVpLWRpYWxvZy10aXRsZWJhci1jbG9zZSB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IC4zZW07IHRvcDogNTAlOyB3aWR0aDogMTlweDsgbWFyZ2luOiAtMTBweCAwIDAgMDsgcGFkZGluZzogMXB4OyBoZWlnaHQ6IDE4cHg7IH0KLnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlIHNwYW4geyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiAxcHg7IH0KLnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlOmhvdmVyLCAudWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2U6Zm9jdXMgeyBwYWRkaW5nOiAwOyB9Ci51aS1kaWFsb2cgLnVpLWRpYWxvZy1jb250ZW50IHsgcG9zaXRpb246IHJlbGF0aXZlOyBib3JkZXI6IDA7IHBhZGRpbmc6IC41ZW0gMWVtOyBiYWNrZ3JvdW5kOiBub25lOyBvdmVyZmxvdzogYXV0bzsgem9vbTogMTsgfQoudWktZGlhbG9nIC51aS1kaWFsb2ctYnV0dG9ucGFuZSB7IHRleHQtYWxpZ246IGxlZnQ7IGJvcmRlci13aWR0aDogMXB4IDAgMCAwOyBiYWNrZ3JvdW5kLWltYWdlOiBub25lOyBtYXJnaW46IC41ZW0gMCAwIDA7IHBhZGRpbmc6IC4zZW0gMWVtIC41ZW0gLjRlbTsgfQoudWktZGlhbG9nIC51aS1kaWFsb2ctYnV0dG9ucGFuZSAudWktZGlhbG9nLWJ1dHRvbnNldCB7IGZsb2F0OiByaWdodDsgfQoudWktZGlhbG9nIC51aS1kaWFsb2ctYnV0dG9ucGFuZSBidXR0b24geyBtYXJnaW46IC41ZW0gLjRlbSAuNWVtIDA7IGN1cnNvcjogcG9pbnRlcjsgfQoudWktZGlhbG9nIC51aS1yZXNpemFibGUtc2UgeyB3aWR0aDogMTRweDsgaGVpZ2h0OiAxNHB4OyByaWdodDogM3B4OyBib3R0b206IDNweDsgfQoudWktZHJhZ2dhYmxlIC51aS1kaWFsb2ctdGl0bGViYXIgeyBjdXJzb3I6IG1vdmU7IH0KLnVpLW1lbnUgeyBsaXN0LXN0eWxlOm5vbmU7IHBhZGRpbmc6IDJweDsgbWFyZ2luOiAwOyBkaXNwbGF5OmJsb2NrOyBvdXRsaW5lOiBub25lOyB9Ci51aS1tZW51IC51aS1tZW51IHsgbWFyZ2luLXRvcDogLTNweDsgcG9zaXRpb246IGFic29sdXRlOyB9Ci51aS1tZW51IC51aS1tZW51LWl0ZW0geyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IHpvb206IDE7IHdpZHRoOiAxMDAlOyB9Ci51aS1tZW51IC51aS1tZW51LWRpdmlkZXIgeyBtYXJnaW46IDVweCAtMnB4IDVweCAtMnB4OyBoZWlnaHQ6IDA7IGZvbnQtc2l6ZTogMDsgbGluZS1oZWlnaHQ6IDA7IGJvcmRlci13aWR0aDogMXB4IDAgMCAwOyB9Ci51aS1tZW51IC51aS1tZW51LWl0ZW0gYSB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZGlzcGxheTogYmxvY2s7IHBhZGRpbmc6IDJweCAuNGVtOyBsaW5lLWhlaWdodDogMS41OyB6b29tOiAxOyBmb250LXdlaWdodDogbm9ybWFsOyB9Ci51aS1tZW51IC51aS1tZW51LWl0ZW0gYS51aS1zdGF0ZS1mb2N1cywKLnVpLW1lbnUgLnVpLW1lbnUtaXRlbSBhLnVpLXN0YXRlLWFjdGl2ZSB7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IG1hcmdpbjogLTFweDsgfQoKLnVpLW1lbnUgLnVpLXN0YXRlLWRpc2FibGVkIHsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbWFyZ2luOiAuNGVtIDAgLjJlbTsgbGluZS1oZWlnaHQ6IDEuNTsgfQoudWktbWVudSAudWktc3RhdGUtZGlzYWJsZWQgYSB7IGN1cnNvcjogZGVmYXVsdDsgfQoKLyogaWNvbiBzdXBwb3J0ICovCi51aS1tZW51LWljb25zIHsgcG9zaXRpb246IHJlbGF0aXZlOyB9Ci51aS1tZW51LWljb25zIC51aS1tZW51LWl0ZW0gYSB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZy1sZWZ0OiAyZW07IH0KCi8qIGxlZnQtYWxpZ25lZCAqLwoudWktbWVudSAudWktaWNvbiB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAuMmVtOyBsZWZ0OiAuMmVtOyB9CgovKiByaWdodC1hbGlnbmVkICovCi51aS1tZW51IC51aS1tZW51LWljb24geyBwb3NpdGlvbjogc3RhdGljOyBmbG9hdDogcmlnaHQ7IH0KLnVpLXByb2dyZXNzYmFyIHsgaGVpZ2h0OjJlbTsgdGV4dC1hbGlnbjogbGVmdDsgb3ZlcmZsb3c6IGhpZGRlbjsgfQoudWktcHJvZ3Jlc3NiYXIgLnVpLXByb2dyZXNzYmFyLXZhbHVlIHttYXJnaW46IC0xcHg7IGhlaWdodDoxMDAlOyB9LnVpLXJlc2l6YWJsZSB7IHBvc2l0aW9uOiByZWxhdGl2ZTt9Ci51aS1yZXNpemFibGUtaGFuZGxlIHsgcG9zaXRpb246IGFic29sdXRlO2ZvbnQtc2l6ZTogMC4xcHg7IGRpc3BsYXk6IGJsb2NrOyB9Ci51aS1yZXNpemFibGUtZGlzYWJsZWQgLnVpLXJlc2l6YWJsZS1oYW5kbGUsIC51aS1yZXNpemFibGUtYXV0b2hpZGUgLnVpLXJlc2l6YWJsZS1oYW5kbGUgeyBkaXNwbGF5OiBub25lOyB9Ci51aS1yZXNpemFibGUtbiB7IGN1cnNvcjogbi1yZXNpemU7IGhlaWdodDogN3B4OyB3aWR0aDogMTAwJTsgdG9wOiAtNXB4OyBsZWZ0OiAwOyB9Ci51aS1yZXNpemFibGUtcyB7IGN1cnNvcjogcy1yZXNpemU7IGhlaWdodDogN3B4OyB3aWR0aDogMTAwJTsgYm90dG9tOiAtNXB4OyBsZWZ0OiAwOyB9Ci51aS1yZXNpemFibGUtZSB7IGN1cnNvcjogZS1yZXNpemU7IHdpZHRoOiA3cHg7IHJpZ2h0OiAtNXB4OyB0b3A6IDA7IGhlaWdodDogMTAwJTsgfQoudWktcmVzaXphYmxlLXcgeyBjdXJzb3I6IHctcmVzaXplOyB3aWR0aDogN3B4OyBsZWZ0OiAtNXB4OyB0b3A6IDA7IGhlaWdodDogMTAwJTsgfQoudWktcmVzaXphYmxlLXNlIHsgY3Vyc29yOiBzZS1yZXNpemU7IHdpZHRoOiAxMnB4OyBoZWlnaHQ6IDEycHg7IHJpZ2h0OiAxcHg7IGJvdHRvbTogMXB4OyB9Ci51aS1yZXNpemFibGUtc3cgeyBjdXJzb3I6IHN3LXJlc2l6ZTsgd2lkdGg6IDlweDsgaGVpZ2h0OiA5cHg7IGxlZnQ6IC01cHg7IGJvdHRvbTogLTVweDsgfQoudWktcmVzaXphYmxlLW53IHsgY3Vyc29yOiBudy1yZXNpemU7IHdpZHRoOiA5cHg7IGhlaWdodDogOXB4OyBsZWZ0OiAtNXB4OyB0b3A6IC01cHg7IH0KLnVpLXJlc2l6YWJsZS1uZSB7IGN1cnNvcjogbmUtcmVzaXplOyB3aWR0aDogOXB4OyBoZWlnaHQ6IDlweDsgcmlnaHQ6IC01cHg7IHRvcDogLTVweDt9LnVpLXNlbGVjdGFibGUtaGVscGVyIHsgcG9zaXRpb246IGFic29sdXRlOyB6LWluZGV4OiAxMDA7IGJvcmRlcjoxcHggZG90dGVkIGJsYWNrOyB9Ci51aS1zbGlkZXIgeyBwb3NpdGlvbjogcmVsYXRpdmU7IHRleHQtYWxpZ246IGxlZnQ7IH0KLnVpLXNsaWRlciAudWktc2xpZGVyLWhhbmRsZSB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgei1pbmRleDogMjsgd2lkdGg6IDEuMmVtOyBoZWlnaHQ6IDEuMmVtOyBjdXJzb3I6IGRlZmF1bHQ7IH0KLnVpLXNsaWRlciAudWktc2xpZGVyLXJhbmdlIHsgcG9zaXRpb246IGFic29sdXRlOyB6LWluZGV4OiAxOyBmb250LXNpemU6IC43ZW07IGRpc3BsYXk6IGJsb2NrOyBib3JkZXI6IDA7IGJhY2tncm91bmQtcG9zaXRpb246IDAgMDsgfQoKLnVpLXNsaWRlci1ob3Jpem9udGFsIHsgaGVpZ2h0OiAuOGVtOyB9Ci51aS1zbGlkZXItaG9yaXpvbnRhbCAudWktc2xpZGVyLWhhbmRsZSB7IHRvcDogLS4zZW07IG1hcmdpbi1sZWZ0OiAtLjZlbTsgfQoudWktc2xpZGVyLWhvcml6b250YWwgLnVpLXNsaWRlci1yYW5nZSB7IHRvcDogMDsgaGVpZ2h0OiAxMDAlOyB9Ci51aS1zbGlkZXItaG9yaXpvbnRhbCAudWktc2xpZGVyLXJhbmdlLW1pbiB7IGxlZnQ6IDA7IH0KLnVpLXNsaWRlci1ob3Jpem9udGFsIC51aS1zbGlkZXItcmFuZ2UtbWF4IHsgcmlnaHQ6IDA7IH0KCi51aS1zbGlkZXItdmVydGljYWwgeyB3aWR0aDogLjhlbTsgaGVpZ2h0OiAxMDBweDsgfQoudWktc2xpZGVyLXZlcnRpY2FsIC51aS1zbGlkZXItaGFuZGxlIHsgbGVmdDogLS4zZW07IG1hcmdpbi1sZWZ0OiAwOyBtYXJnaW4tYm90dG9tOiAtLjZlbTsgfQoudWktc2xpZGVyLXZlcnRpY2FsIC51aS1zbGlkZXItcmFuZ2UgeyBsZWZ0OiAwOyB3aWR0aDogMTAwJTsgfQoudWktc2xpZGVyLXZlcnRpY2FsIC51aS1zbGlkZXItcmFuZ2UtbWluIHsgYm90dG9tOiAwOyB9Ci51aS1zbGlkZXItdmVydGljYWwgLnVpLXNsaWRlci1yYW5nZS1tYXggeyB0b3A6IDA7IH0udWktc3Bpbm5lciB7IHBvc2l0aW9uOnJlbGF0aXZlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG92ZXJmbG93OiBoaWRkZW47IHBhZGRpbmc6IDA7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IH0KLnVpLXNwaW5uZXItaW5wdXQgeyBib3JkZXI6IG5vbmU7IGJhY2tncm91bmQ6IG5vbmU7IHBhZGRpbmc6IDA7IG1hcmdpbjogLjJlbSAwOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBtYXJnaW4tbGVmdDogLjRlbTsgbWFyZ2luLXJpZ2h0OiAyMnB4OyB9Ci51aS1zcGlubmVyLWJ1dHRvbiB7IHdpZHRoOiAxNnB4OyBoZWlnaHQ6IDUwJTsgZm9udC1zaXplOiAuNWVtOyBwYWRkaW5nOiAwOyBtYXJnaW46IDA7IHRleHQtYWxpZ246IGNlbnRlcjsgcG9zaXRpb246IGFic29sdXRlOyBjdXJzb3I6IGRlZmF1bHQ7IGRpc3BsYXk6IGJsb2NrOyBvdmVyZmxvdzogaGlkZGVuOyByaWdodDogMDsgfQoudWktc3Bpbm5lciBhLnVpLXNwaW5uZXItYnV0dG9uIHsgYm9yZGVyLXRvcDogbm9uZTsgYm9yZGVyLWJvdHRvbTogbm9uZTsgYm9yZGVyLXJpZ2h0OiBub25lOyB9IC8qIG1vcmUgc3BlY2lmaWNpdHkgcmVxdWlyZWQgaGVyZSB0byBvdmVyaWRlIGRlZmF1bHQgYm9yZGVycyAqLwoudWktc3Bpbm5lciAudWktaWNvbiB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgbWFyZ2luLXRvcDogLThweDsgdG9wOiA1MCU7IGxlZnQ6IDA7IH0gLyogdmVydGljYWwgY2VudHJlIGljb24gKi8KLnVpLXNwaW5uZXItdXAgeyB0b3A6IDA7IH0KLnVpLXNwaW5uZXItZG93biB7IGJvdHRvbTogMDsgfQoKLyogVFIgb3ZlcnJpZGVzICovCi51aS1zcGlubmVyIC51aS1pY29uLXRyaWFuZ2xlLTEtcyB7CgkvKiBuZWVkIHRvIGZpeCBpY29ucyBzcHJpdGUgKi8KCWJhY2tncm91bmQtcG9zaXRpb246LTY1cHggLTE2cHg7Cn0KLnVpLXRhYnMgeyBwb3NpdGlvbjogcmVsYXRpdmU7IHBhZGRpbmc6IC4yZW07IHpvb206IDE7IH0gLyogcG9zaXRpb246IHJlbGF0aXZlIHByZXZlbnRzIElFIHNjcm9sbCBidWcgKGVsZW1lbnQgd2l0aCBwb3NpdGlvbjogcmVsYXRpdmUgaW5zaWRlIGNvbnRhaW5lciB3aXRoIG92ZXJmbG93OiBhdXRvIGFwcGVhciBhcyAiZml4ZWQiKSAqLwoudWktdGFicyAudWktdGFicy1uYXYgeyBtYXJnaW46IDA7IHBhZGRpbmc6IC4yZW0gLjJlbSAwOyB9Ci51aS10YWJzIC51aS10YWJzLW5hdiBsaSB7IGxpc3Qtc3R5bGU6IG5vbmU7IGZsb2F0OiBsZWZ0OyBwb3NpdGlvbjogcmVsYXRpdmU7IHRvcDogMDsgbWFyZ2luOiAxcHggLjJlbSAwIDA7IGJvcmRlci1ib3R0b206IDA7IHBhZGRpbmc6IDA7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIGEgeyBmbG9hdDogbGVmdDsgcGFkZGluZzogLjVlbSAxZW07IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQoudWktdGFicyAudWktdGFicy1uYXYgbGkudWktdGFicy1hY3RpdmUgeyBtYXJnaW4tYm90dG9tOiAtMXB4OyBwYWRkaW5nLWJvdHRvbTogMXB4OyB9Ci51aS10YWJzIC51aS10YWJzLW5hdiBsaS51aS10YWJzLWFjdGl2ZSBhLCAudWktdGFicyAudWktdGFicy1uYXYgbGkudWktc3RhdGUtZGlzYWJsZWQgYSwgLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtbG9hZGluZyBhIHsgY3Vyc29yOiB0ZXh0OyB9Ci51aS10YWJzIC51aS10YWJzLW5hdiBsaSBhLCAudWktdGFicy1jb2xsYXBzaWJsZSAudWktdGFicy1uYXYgbGkudWktdGFicy1hY3RpdmUgYSB7IGN1cnNvcjogcG9pbnRlcjsgfSAvKiBmaXJzdCBzZWxlY3RvciBpbiBncm91cCBzZWVtcyBvYnNvbGV0ZSwgYnV0IHJlcXVpcmVkIHRvIG92ZXJjb21lIGJ1ZyBpbiBPcGVyYSBhcHBseWluZyBjdXJzb3I6IHRleHQgb3ZlcmFsbCBpZiBkZWZpbmVkIGVsc2V3aGVyZS4uLiAqLwoudWktdGFicyAudWktdGFicy1wYW5lbCB7IGRpc3BsYXk6IGJsb2NrOyBib3JkZXItd2lkdGg6IDA7IHBhZGRpbmc6IDFlbSAxLjRlbTsgYmFja2dyb3VuZDogbm9uZTsgfQoudWktdG9vbHRpcCB7CglwYWRkaW5nOiA4cHg7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl6LWluZGV4OiA5OTk5OwoJbWF4LXdpZHRoOiAzMDBweDsKCS13ZWJraXQtYm94LXNoYWRvdzogMCAwIDVweCAjYWFhOwoJYm94LXNoYWRvdzogMCAwIDVweCAjYWFhOwp9Ci8qIEZhZGVzIGFuZCBiYWNrZ3JvdW5kLWltYWdlcyBkb24ndCB3b3JrIHdlbGwgdG9nZXRoZXIgaW4gSUU2LCBkcm9wIHRoZSBpbWFnZSAqLwoqIGh0bWwgLnVpLXRvb2x0aXAgewoJYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKfQpib2R5IC51aS10b29sdGlwIHsgYm9yZGVyLXdpZHRoOiAycHg7IH0KCi8qIENvbXBvbmVudCBjb250YWluZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoudWktd2lkZ2V0IHsgZm9udC1mYW1pbHk6IFZlcmRhbmEsQXJpYWwsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxLjFlbTsgfQoudWktd2lkZ2V0IC51aS13aWRnZXQgeyBmb250LXNpemU6IDFlbTsgfQoudWktd2lkZ2V0IGlucHV0LCAudWktd2lkZ2V0IHNlbGVjdCwgLnVpLXdpZGdldCB0ZXh0YXJlYSwgLnVpLXdpZGdldCBidXR0b24geyBmb250LWZhbWlseTogVmVyZGFuYSxBcmlhbCxzYW5zLXNlcmlmOyBmb250LXNpemU6IDFlbTsgfQoudWktd2lkZ2V0LWNvbnRlbnQgeyBib3JkZXI6IDFweCBzb2xpZCAjYWFhYWFhOyBiYWNrZ3JvdW5kOiAjZmZmZmZmIHVybChpbWFnZXMvdWktYmdfZmxhdF83NV9mZmZmZmZfNDB4MTAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsgY29sb3I6ICMyMjIyMjI7IH0KLnVpLXdpZGdldC1jb250ZW50IGEgeyBjb2xvcjogIzIyMjIyMjsgfQoudWktd2lkZ2V0LWhlYWRlciB7IGJvcmRlcjogMXB4IHNvbGlkICNhYWFhYWE7IGJhY2tncm91bmQ6ICNjY2NjY2MgdXJsKGltYWdlcy91aS1iZ19oaWdobGlnaHQtc29mdF83NV9jY2NjY2NfMXgxMDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBjb2xvcjogIzIyMjIyMjsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLnVpLXdpZGdldC1oZWFkZXIgYSB7IGNvbG9yOiAjMjIyMjIyOyB9CgovKiBJbnRlcmFjdGlvbiBzdGF0ZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi51aS1zdGF0ZS1kZWZhdWx0LCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWRlZmF1bHQsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1kZWZhdWx0IHsgYm9yZGVyOiAxcHggc29saWQgI2QzZDNkMzsgYmFja2dyb3VuZDogI2U2ZTZlNiB1cmwoaW1hZ2VzL3VpLWJnX2dsYXNzXzc1X2U2ZTZlNl8xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGNvbG9yOiAjNTU1NTU1OyB9Ci51aS1zdGF0ZS1kZWZhdWx0IGEsIC51aS1zdGF0ZS1kZWZhdWx0IGE6bGluaywgLnVpLXN0YXRlLWRlZmF1bHQgYTp2aXNpdGVkIHsgY29sb3I6ICM1NTU1NTU7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQoudWktc3RhdGUtaG92ZXIsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaG92ZXIsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1ob3ZlciwgLnVpLXN0YXRlLWZvY3VzLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWZvY3VzLCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZm9jdXMgeyBib3JkZXI6IDFweCBzb2xpZCAjOTk5OTk5OyBiYWNrZ3JvdW5kOiAjZGFkYWRhIHVybChpbWFnZXMvdWktYmdfZ2xhc3NfNzVfZGFkYWRhXzF4NDAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgY29sb3I6ICMyMTIxMjE7IH0KLnVpLXN0YXRlLWhvdmVyIGEsIC51aS1zdGF0ZS1ob3ZlciBhOmhvdmVyLCAudWktc3RhdGUtaG92ZXIgYTpsaW5rLCAudWktc3RhdGUtaG92ZXIgYTp2aXNpdGVkIHsgY29sb3I6ICMyMTIxMjE7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQoudWktc3RhdGUtYWN0aXZlLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWFjdGl2ZSwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWFjdGl2ZSB7IGJvcmRlcjogMXB4IHNvbGlkICNhYWFhYWE7IGJhY2tncm91bmQ6ICNmZmZmZmYgdXJsKGltYWdlcy91aS1iZ19nbGFzc182NV9mZmZmZmZfMXg0MDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBmb250LXdlaWdodDogbm9ybWFsOyBjb2xvcjogIzIxMjEyMTsgfQoudWktc3RhdGUtYWN0aXZlIGEsIC51aS1zdGF0ZS1hY3RpdmUgYTpsaW5rLCAudWktc3RhdGUtYWN0aXZlIGE6dmlzaXRlZCB7IGNvbG9yOiAjMjEyMTIxOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH0KCi8qIEludGVyYWN0aW9uIEN1ZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi51aS1zdGF0ZS1oaWdobGlnaHQsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaGlnaGxpZ2h0LCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtaGlnaGxpZ2h0ICB7Ym9yZGVyOiAxcHggc29saWQgI2ZjZWZhMTsgYmFja2dyb3VuZDogI2ZiZjllZSB1cmwoaW1hZ2VzL3VpLWJnX2dsYXNzXzU1X2ZiZjllZV8xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7IGNvbG9yOiAjMzYzNjM2OyB9Ci51aS1zdGF0ZS1oaWdobGlnaHQgYSwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1oaWdobGlnaHQgYSwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtaGlnaGxpZ2h0IGEgeyBjb2xvcjogIzM2MzYzNjsgfQoudWktc3RhdGUtZXJyb3IsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZXJyb3IsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1lcnJvciB7Ym9yZGVyOiAxcHggc29saWQgI2NkMGEwYTsgYmFja2dyb3VuZDogI2ZlZjFlYyB1cmwoaW1hZ2VzL3VpLWJnX2dsYXNzXzk1X2ZlZjFlY18xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7IGNvbG9yOiAjY2QwYTBhOyB9Ci51aS1zdGF0ZS1lcnJvciBhLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yIGEsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1lcnJvciBhIHsgY29sb3I6ICNjZDBhMGE7IH0KLnVpLXN0YXRlLWVycm9yLXRleHQsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZXJyb3ItdGV4dCwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9yLXRleHQgeyBjb2xvcjogI2NkMGEwYTsgfQoudWktcHJpb3JpdHktcHJpbWFyeSwgLnVpLXdpZGdldC1jb250ZW50IC51aS1wcmlvcml0eS1wcmltYXJ5LCAudWktd2lkZ2V0LWhlYWRlciAudWktcHJpb3JpdHktcHJpbWFyeSB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci51aS1wcmlvcml0eS1zZWNvbmRhcnksIC51aS13aWRnZXQtY29udGVudCAudWktcHJpb3JpdHktc2Vjb25kYXJ5LCAgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXByaW9yaXR5LXNlY29uZGFyeSB7IG9wYWNpdHk6IC43OyBmaWx0ZXI6QWxwaGEoT3BhY2l0eT03MCk7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0KLnVpLXN0YXRlLWRpc2FibGVkLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWRpc2FibGVkLCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZGlzYWJsZWQgeyBvcGFjaXR5OiAuMzU7IGZpbHRlcjpBbHBoYShPcGFjaXR5PTM1KTsgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsgfQoudWktc3RhdGUtZGlzYWJsZWQgLnVpLWljb24geyBmaWx0ZXI6QWxwaGEoT3BhY2l0eT0zNSk7IH0gLyogRm9yIElFOCAtIFNlZSAjNjA1OSAqLwoKLyogSWNvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBzdGF0ZXMgYW5kIGltYWdlcyAqLwoudWktaWNvbiB7IHdpZHRoOiAxNnB4OyBoZWlnaHQ6IDE2cHg7IGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvdWktaWNvbnNfMjIyMjIyXzI1NngyNDAucG5nKTsgfQoudWktd2lkZ2V0LWNvbnRlbnQgLnVpLWljb24ge2JhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvdWktaWNvbnNfMjIyMjIyXzI1NngyNDAucG5nKTsgfQoudWktd2lkZ2V0LWhlYWRlciAudWktaWNvbiB7YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy91aS1pY29uc18yMjIyMjJfMjU2eDI0MC5wbmcpOyB9Ci51aS1zdGF0ZS1kZWZhdWx0IC51aS1pY29uIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy91aS1pY29uc184ODg4ODhfMjU2eDI0MC5wbmcpOyB9Ci51aS1zdGF0ZS1ob3ZlciAudWktaWNvbiwgLnVpLXN0YXRlLWZvY3VzIC51aS1pY29uIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3VpLWljb25zXzQ1NDU0NV8yNTZ4MjQwLnBuZyk7IH0KLnVpLXN0YXRlLWFjdGl2ZSAudWktaWNvbiB7YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy91aS1pY29uc180NTQ1NDVfMjU2eDI0MC5wbmcpOyB9Ci51aS1zdGF0ZS1oaWdobGlnaHQgLnVpLWljb24ge2JhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvdWktaWNvbnNfMmU4M2ZmXzI1NngyNDAucG5nKTsgfQoudWktc3RhdGUtZXJyb3IgLnVpLWljb24sIC51aS1zdGF0ZS1lcnJvci10ZXh0IC51aS1pY29uIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3VpLWljb25zX2NkMGEwYV8yNTZ4MjQwLnBuZyk7IH0KCi8qIHBvc2l0aW9uaW5nICovCi51aS1pY29uLWNhcmF0LTEtbiB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgMDsgfQoudWktaWNvbi1jYXJhdC0xLW5lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggMDsgfQoudWktaWNvbi1jYXJhdC0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAwOyB9Ci51aS1pY29uLWNhcmF0LTEtc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAwOyB9Ci51aS1pY29uLWNhcmF0LTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IDA7IH0KLnVpLWljb24tY2FyYXQtMS1zdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IDA7IH0KLnVpLWljb24tY2FyYXQtMS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggMDsgfQoudWktaWNvbi1jYXJhdC0xLW53IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IDA7IH0KLnVpLWljb24tY2FyYXQtMi1uLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggMDsgfQoudWktaWNvbi1jYXJhdC0yLWUtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAwOyB9Ci51aS1pY29uLXRyaWFuZ2xlLTEtbiB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTE2cHg7IH0KLnVpLWljb24tdHJpYW5nbGUtMS1uZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xNnB4OyB9Ci51aS1pY29uLXRyaWFuZ2xlLTEtZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNnB4OyB9Ci51aS1pY29uLXRyaWFuZ2xlLTEtc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTZweDsgfQoudWktaWNvbi10cmlhbmdsZS0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTZweDsgfQoudWktaWNvbi10cmlhbmdsZS0xLXN3IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTE2cHg7IH0KLnVpLWljb24tdHJpYW5nbGUtMS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTE2cHg7IH0KLnVpLWljb24tdHJpYW5nbGUtMS1udyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTZweDsgfQoudWktaWNvbi10cmlhbmdsZS0yLW4tcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTZweDsgfQoudWktaWNvbi10cmlhbmdsZS0yLWUtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTZweDsgfQoudWktaWNvbi1hcnJvdy0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTEtbmUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMzJweDsgfQoudWktaWNvbi1hcnJvdy0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMzJweDsgfQoudWktaWNvbi1hcnJvdy0xLXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMS1zdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTEtbncgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMi1uLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMi1uZS1zdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMzJweDsgfQoudWktaWNvbi1hcnJvdy0yLWUtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtMzJweDsgfQoudWktaWNvbi1hcnJvdy0yLXNlLW53IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93c3RvcC0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkycHggLTMycHg7IH0KLnVpLWljb24tYXJyb3dzdG9wLTEtZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtMzJweDsgfQoudWktaWNvbi1hcnJvd3N0b3AtMS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93c3RvcC0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQwcHggLTMycHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2stMS1uZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2stMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0xLXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTEtc3cgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2stMS1udyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTItbi1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2stMi1uZS1zdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTItZS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2stMi1zZS1udyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkycHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQwcHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC02NHB4OyB9Ci51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTY0cHg7IH0KLnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC02NHB4OyB9Ci51aS1pY29uLWFycm93cmV0dXJuLTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC02NHB4OyB9Ci51aS1pY29uLWFycm93cmV0dXJuLTEtbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC02NHB4OyB9Ci51aS1pY29uLWFycm93cmV0dXJuLTEtZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC02NHB4OyB9Ci51aS1pY29uLWFycm93cmV0dXJuLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JlZnJlc2gtMS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC02NHB4OyB9Ci51aS1pY29uLWFycm93cmVmcmVzaC0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTY0cHg7IH0KLnVpLWljb24tYXJyb3dyZWZyZXNoLTEtZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JlZnJlc2gtMS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC02NHB4OyB9Ci51aS1pY29uLWFycm93LTQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC04MHB4OyB9Ci51aS1pY29uLWFycm93LTQtZGlhZyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC04MHB4OyB9Ci51aS1pY29uLWV4dGxpbmsgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtODBweDsgfQoudWktaWNvbi1uZXd3aW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtODBweDsgfQoudWktaWNvbi1yZWZyZXNoIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTgwcHg7IH0KLnVpLWljb24tc2h1ZmZsZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC04MHB4OyB9Ci51aS1pY29uLXRyYW5zZmVyLWUtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC04MHB4OyB9Ci51aS1pY29uLXRyYW5zZmVydGhpY2stZS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC04MHB4OyB9Ci51aS1pY29uLWZvbGRlci1jb2xsYXBzZWQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC05NnB4OyB9Ci51aS1pY29uLWZvbGRlci1vcGVuIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTk2cHg7IH0KLnVpLWljb24tZG9jdW1lbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtOTZweDsgfQoudWktaWNvbi1kb2N1bWVudC1iIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTk2cHg7IH0KLnVpLWljb24tbm90ZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC05NnB4OyB9Ci51aS1pY29uLW1haWwtY2xvc2VkIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTk2cHg7IH0KLnVpLWljb24tbWFpbC1vcGVuIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTk2cHg7IH0KLnVpLWljb24tc3VpdGNhc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTk2cHg7IH0KLnVpLWljb24tY29tbWVudCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtOTZweDsgfQoudWktaWNvbi1wZXJzb24geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTk2cHg7IH0KLnVpLWljb24tcHJpbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTk2cHg7IH0KLnVpLWljb24tdHJhc2ggeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTk2cHg7IH0KLnVpLWljb24tbG9ja2VkIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC05NnB4OyB9Ci51aS1pY29uLXVubG9ja2VkIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC05NnB4OyB9Ci51aS1pY29uLWJvb2ttYXJrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC05NnB4OyB9Ci51aS1pY29uLXRhZyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yNDBweCAtOTZweDsgfQoudWktaWNvbi1ob21lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTEycHg7IH0KLnVpLWljb24tZmxhZyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xMTJweDsgfQoudWktaWNvbi1jYWxlbmRhciB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xMTJweDsgfQoudWktaWNvbi1jYXJ0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTExMnB4OyB9Ci51aS1pY29uLXBlbmNpbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xMTJweDsgfQoudWktaWNvbi1jbG9jayB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xMTJweDsgfQoudWktaWNvbi1kaXNrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTExMnB4OyB9Ci51aS1pY29uLWNhbGN1bGF0b3IgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTExMnB4OyB9Ci51aS1pY29uLXpvb21pbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTEycHg7IH0KLnVpLWljb24tem9vbW91dCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTEycHg7IH0KLnVpLWljb24tc2VhcmNoIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0xMTJweDsgfQoudWktaWNvbi13cmVuY2ggeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTExMnB4OyB9Ci51aS1pY29uLWdlYXIgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkycHggLTExMnB4OyB9Ci51aS1pY29uLWhlYXJ0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC0xMTJweDsgfQoudWktaWNvbi1zdGFyIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC0xMTJweDsgfQoudWktaWNvbi1saW5rIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI0MHB4IC0xMTJweDsgfQoudWktaWNvbi1jYW5jZWwgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xMjhweDsgfQoudWktaWNvbi1wbHVzIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTEyOHB4OyB9Ci51aS1pY29uLXBsdXN0aGljayB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xMjhweDsgfQoudWktaWNvbi1taW51cyB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xMjhweDsgfQoudWktaWNvbi1taW51c3RoaWNrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTEyOHB4OyB9Ci51aS1pY29uLWNsb3NlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTEyOHB4OyB9Ci51aS1pY29uLWNsb3NldGhpY2sgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTI4cHg7IH0KLnVpLWljb24ta2V5IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xMjhweDsgfQoudWktaWNvbi1saWdodGJ1bGIgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTEyOHB4OyB9Ci51aS1pY29uLXNjaXNzb3JzIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xMjhweDsgfQoudWktaWNvbi1jbGlwYm9hcmQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTEyOHB4OyB9Ci51aS1pY29uLWNvcHkgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTEyOHB4OyB9Ci51aS1pY29uLWNvbnRhY3QgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkycHggLTEyOHB4OyB9Ci51aS1pY29uLWltYWdlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC0xMjhweDsgfQoudWktaWNvbi12aWRlbyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtMTI4cHg7IH0KLnVpLWljb24tc2NyaXB0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI0MHB4IC0xMjhweDsgfQoudWktaWNvbi1hbGVydCB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTE0NHB4OyB9Ci51aS1pY29uLWluZm8geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTQ0cHg7IH0KLnVpLWljb24tbm90aWNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTE0NHB4OyB9Ci51aS1pY29uLWhlbHAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTQ0cHg7IH0KLnVpLWljb24tY2hlY2sgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTQ0cHg7IH0KLnVpLWljb24tYnVsbGV0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTE0NHB4OyB9Ci51aS1pY29uLXJhZGlvLW9uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTE0NHB4OyB9Ci51aS1pY29uLXJhZGlvLW9mZiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTQ0cHg7IH0KLnVpLWljb24tcGluLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTE0NHB4OyB9Ci51aS1pY29uLXBpbi1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xNDRweDsgfQoudWktaWNvbi1wbGF5IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTYwcHg7IH0KLnVpLWljb24tcGF1c2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTYwcHg7IH0KLnVpLWljb24tc2Vlay1uZXh0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTE2MHB4OyB9Ci51aS1pY29uLXNlZWstcHJldiB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xNjBweDsgfQoudWktaWNvbi1zZWVrLWVuZCB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xNjBweDsgfQoudWktaWNvbi1zZWVrLXN0YXJ0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTE2MHB4OyB9Ci8qIHVpLWljb24tc2Vlay1maXJzdCBpcyBkZXByZWNhdGVkLCB1c2UgdWktaWNvbi1zZWVrLXN0YXJ0IGluc3RlYWQgKi8KLnVpLWljb24tc2Vlay1maXJzdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNjBweDsgfQoudWktaWNvbi1zdG9wIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTE2MHB4OyB9Ci51aS1pY29uLWVqZWN0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xNjBweDsgfQoudWktaWNvbi12b2x1bWUtb2ZmIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xNjBweDsgfQoudWktaWNvbi12b2x1bWUtb24geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTE2MHB4OyB9Ci51aS1pY29uLXBvd2VyIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTc2cHg7IH0KLnVpLWljb24tc2lnbmFsLWRpYWcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTc2cHg7IH0KLnVpLWljb24tc2lnbmFsIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTE3NnB4OyB9Ci51aS1pY29uLWJhdHRlcnktMCB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xNzZweDsgfQoudWktaWNvbi1iYXR0ZXJ5LTEgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTc2cHg7IH0KLnVpLWljb24tYmF0dGVyeS0yIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTE3NnB4OyB9Ci51aS1pY29uLWJhdHRlcnktMyB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xNzZweDsgfQoudWktaWNvbi1jaXJjbGUtcGx1cyB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS1taW51cyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtY2xvc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLWFycm93LWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS1hcnJvdy1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtYXJyb3ctdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLWFycm93LW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS16b29taW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS16b29tb3V0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtY2hlY2sgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZXNtYWxsLXBsdXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0yMDhweDsgfQoudWktaWNvbi1jaXJjbGVzbWFsbC1taW51cyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0yMDhweDsgfQoudWktaWNvbi1jaXJjbGVzbWFsbC1jbG9zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0yMDhweDsgfQoudWktaWNvbi1zcXVhcmVzbWFsbC1wbHVzIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTIwOHB4OyB9Ci51aS1pY29uLXNxdWFyZXNtYWxsLW1pbnVzIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTIwOHB4OyB9Ci51aS1pY29uLXNxdWFyZXNtYWxsLWNsb3NlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTIwOHB4OyB9Ci51aS1pY29uLWdyaXAtZG90dGVkLXZlcnRpY2FsIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMjI0cHg7IH0KLnVpLWljb24tZ3JpcC1kb3R0ZWQtaG9yaXpvbnRhbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0yMjRweDsgfQoudWktaWNvbi1ncmlwLXNvbGlkLXZlcnRpY2FsIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTIyNHB4OyB9Ci51aS1pY29uLWdyaXAtc29saWQtaG9yaXpvbnRhbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0yMjRweDsgfQoudWktaWNvbi1ncmlwc21hbGwtZGlhZ29uYWwtc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMjI0cHg7IH0KLnVpLWljb24tZ3JpcC1kaWFnb25hbC1zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0yMjRweDsgfQoKCi8qIE1pc2MgdmlzdWFscwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIENvcm5lciByYWRpdXMgKi8KLnVpLWNvcm5lci1hbGwsIC51aS1jb3JuZXItdG9wLCAudWktY29ybmVyLWxlZnQsIC51aS1jb3JuZXItdGwgeyAtbW96LWJvcmRlci1yYWRpdXMtdG9wbGVmdDogNHB4OyAtd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDsgLWtodG1sLWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDsgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OyB9Ci51aS1jb3JuZXItYWxsLCAudWktY29ybmVyLXRvcCwgLnVpLWNvcm5lci1yaWdodCwgLnVpLWNvcm5lci10ciB7IC1tb3otYm9yZGVyLXJhZGl1cy10b3ByaWdodDogNHB4OyAtd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7IC1raHRtbC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OyB9Ci51aS1jb3JuZXItYWxsLCAudWktY29ybmVyLWJvdHRvbSwgLnVpLWNvcm5lci1sZWZ0LCAudWktY29ybmVyLWJsIHsgLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbWxlZnQ6IDRweDsgLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7IC1raHRtbC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsgfQoudWktY29ybmVyLWFsbCwgLnVpLWNvcm5lci1ib3R0b20sIC51aS1jb3JuZXItcmlnaHQsIC51aS1jb3JuZXItYnIgeyAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6IDRweDsgLXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OyAta2h0bWwtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDRweDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDRweDsgfQoKLyogT3ZlcmxheXMgKi8KLnVpLXdpZGdldC1vdmVybGF5IHsgYmFja2dyb3VuZDogI2FhYWFhYSB1cmwoaW1hZ2VzL3VpLWJnX2ZsYXRfMF9hYWFhYWFfNDB4MTAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsgb3BhY2l0eTogLjM7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MzApOyB9Ci51aS13aWRnZXQtc2hhZG93IHsgbWFyZ2luOiAtOHB4IDAgMCAtOHB4OyBwYWRkaW5nOiA4cHg7IGJhY2tncm91bmQ6ICNhYWFhYWEgdXJsKGltYWdlcy91aS1iZ19mbGF0XzBfYWFhYWFhXzQweDEwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7IG9wYWNpdHk6IC4zO2ZpbHRlcjpBbHBoYShPcGFjaXR5PTMwKTsgLW1vei1ib3JkZXItcmFkaXVzOiA4cHg7IC1raHRtbC1ib3JkZXItcmFkaXVzOiA4cHg7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXItcmFkaXVzOiA4cHg7IH0=]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/css/smoothness/jquery-ui-1.9.2.custom.min.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSBVSSAtIHYxLjkuMiAtIDIwMTItMTEtMjMKKiBodHRwOi8vanF1ZXJ5dWkuY29tCiogSW5jbHVkZXM6IGpxdWVyeS51aS5jb3JlLmNzcywganF1ZXJ5LnVpLmFjY29yZGlvbi5jc3MsIGpxdWVyeS51aS5hdXRvY29tcGxldGUuY3NzLCBqcXVlcnkudWkuYnV0dG9uLmNzcywganF1ZXJ5LnVpLmRhdGVwaWNrZXIuY3NzLCBqcXVlcnkudWkuZGlhbG9nLmNzcywganF1ZXJ5LnVpLm1lbnUuY3NzLCBqcXVlcnkudWkucHJvZ3Jlc3NiYXIuY3NzLCBqcXVlcnkudWkucmVzaXphYmxlLmNzcywganF1ZXJ5LnVpLnNlbGVjdGFibGUuY3NzLCBqcXVlcnkudWkuc2xpZGVyLmNzcywganF1ZXJ5LnVpLnNwaW5uZXIuY3NzLCBqcXVlcnkudWkudGFicy5jc3MsIGpxdWVyeS51aS50b29sdGlwLmNzcwoqIFRvIHZpZXcgYW5kIG1vZGlmeSB0aGlzIHRoZW1lLCB2aXNpdCBodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyLwoqIENvcHlyaWdodCAoYykgMjAxMiBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIExpY2Vuc2VkIE1JVCAqLy51aS1oZWxwZXItaGlkZGVue2Rpc3BsYXk6bm9uZX0udWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxle2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4fS51aS1oZWxwZXItcmVzZXR7bWFyZ2luOjA7cGFkZGluZzowO2JvcmRlcjowO291dGxpbmU6MDtsaW5lLWhlaWdodDoxLjM7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Zm9udC1zaXplOjEwMCU7bGlzdC1zdHlsZTpub25lfS51aS1oZWxwZXItY2xlYXJmaXg6YmVmb3JlLC51aS1oZWxwZXItY2xlYXJmaXg6YWZ0ZXJ7Y29udGVudDoiIjtkaXNwbGF5OnRhYmxlfS51aS1oZWxwZXItY2xlYXJmaXg6YWZ0ZXJ7Y2xlYXI6Ym90aH0udWktaGVscGVyLWNsZWFyZml4e3pvb206MX0udWktaGVscGVyLXpmaXh7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt0b3A6MDtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7b3BhY2l0eTowO2ZpbHRlcjpBbHBoYShPcGFjaXR5PTApfS51aS1zdGF0ZS1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdCFpbXBvcnRhbnR9LnVpLWljb257ZGlzcGxheTpibG9jazt0ZXh0LWluZGVudDotOTk5OTlweDtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0fS51aS13aWRnZXQtb3ZlcmxheXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0udWktYWNjb3JkaW9uIC51aS1hY2NvcmRpb24taGVhZGVye2Rpc3BsYXk6YmxvY2s7Y3Vyc29yOnBvaW50ZXI7cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luLXRvcDoycHg7cGFkZGluZzouNWVtIC41ZW0gLjVlbSAuN2VtO3pvb206MX0udWktYWNjb3JkaW9uIC51aS1hY2NvcmRpb24taWNvbnN7cGFkZGluZy1sZWZ0OjIuMmVtfS51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1ub2ljb25ze3BhZGRpbmctbGVmdDouN2VtfS51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1pY29ucyAudWktYWNjb3JkaW9uLWljb25ze3BhZGRpbmctbGVmdDoyLjJlbX0udWktYWNjb3JkaW9uIC51aS1hY2NvcmRpb24taGVhZGVyIC51aS1hY2NvcmRpb24taGVhZGVyLWljb257cG9zaXRpb246YWJzb2x1dGU7bGVmdDouNWVtO3RvcDo1MCU7bWFyZ2luLXRvcDotOHB4fS51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1jb250ZW50e3BhZGRpbmc6MWVtIDIuMmVtO2JvcmRlci10b3A6MDtvdmVyZmxvdzphdXRvO3pvb206MX0udWktYXV0b2NvbXBsZXRle3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtjdXJzb3I6ZGVmYXVsdH0qIGh0bWwgLnVpLWF1dG9jb21wbGV0ZXt3aWR0aDoxcHh9LnVpLWJ1dHRvbntkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOjA7bWFyZ2luLXJpZ2h0Oi4xZW07Y3Vyc29yOnBvaW50ZXI7dGV4dC1hbGlnbjpjZW50ZXI7em9vbToxO292ZXJmbG93OnZpc2libGV9LnVpLWJ1dHRvbiwudWktYnV0dG9uOmxpbmssLnVpLWJ1dHRvbjp2aXNpdGVkLC51aS1idXR0b246aG92ZXIsLnVpLWJ1dHRvbjphY3RpdmV7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLWJ1dHRvbi1pY29uLW9ubHl7d2lkdGg6Mi4yZW19YnV0dG9uLnVpLWJ1dHRvbi1pY29uLW9ubHl7d2lkdGg6Mi40ZW19LnVpLWJ1dHRvbi1pY29ucy1vbmx5e3dpZHRoOjMuNGVtfWJ1dHRvbi51aS1idXR0b24taWNvbnMtb25seXt3aWR0aDozLjdlbX0udWktYnV0dG9uIC51aS1idXR0b24tdGV4dHtkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjEuNH0udWktYnV0dG9uLXRleHQtb25seSAudWktYnV0dG9uLXRleHR7cGFkZGluZzouNGVtIDFlbX0udWktYnV0dG9uLWljb24tb25seSAudWktYnV0dG9uLXRleHQsLnVpLWJ1dHRvbi1pY29ucy1vbmx5IC51aS1idXR0b24tdGV4dHtwYWRkaW5nOi40ZW07dGV4dC1pbmRlbnQ6LTk5OTk5OTlweH0udWktYnV0dG9uLXRleHQtaWNvbi1wcmltYXJ5IC51aS1idXR0b24tdGV4dCwudWktYnV0dG9uLXRleHQtaWNvbnMgLnVpLWJ1dHRvbi10ZXh0e3BhZGRpbmc6LjRlbSAxZW0gLjRlbSAyLjFlbX0udWktYnV0dG9uLXRleHQtaWNvbi1zZWNvbmRhcnkgLnVpLWJ1dHRvbi10ZXh0LC51aS1idXR0b24tdGV4dC1pY29ucyAudWktYnV0dG9uLXRleHR7cGFkZGluZzouNGVtIDIuMWVtIC40ZW0gMWVtfS51aS1idXR0b24tdGV4dC1pY29ucyAudWktYnV0dG9uLXRleHR7cGFkZGluZy1sZWZ0OjIuMWVtO3BhZGRpbmctcmlnaHQ6Mi4xZW19aW5wdXQudWktYnV0dG9ue3BhZGRpbmc6LjRlbSAxZW19LnVpLWJ1dHRvbi1pY29uLW9ubHkgLnVpLWljb24sLnVpLWJ1dHRvbi10ZXh0LWljb24tcHJpbWFyeSAudWktaWNvbiwudWktYnV0dG9uLXRleHQtaWNvbi1zZWNvbmRhcnkgLnVpLWljb24sLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1pY29uLC51aS1idXR0b24taWNvbnMtb25seSAudWktaWNvbntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO21hcmdpbi10b3A6LThweH0udWktYnV0dG9uLWljb24tb25seSAudWktaWNvbntsZWZ0OjUwJTttYXJnaW4tbGVmdDotOHB4fS51aS1idXR0b24tdGV4dC1pY29uLXByaW1hcnkgLnVpLWJ1dHRvbi1pY29uLXByaW1hcnksLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1idXR0b24taWNvbi1wcmltYXJ5LC51aS1idXR0b24taWNvbnMtb25seSAudWktYnV0dG9uLWljb24tcHJpbWFyeXtsZWZ0Oi41ZW19LnVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IC51aS1idXR0b24taWNvbi1zZWNvbmRhcnksLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1idXR0b24taWNvbi1zZWNvbmRhcnksLnVpLWJ1dHRvbi1pY29ucy1vbmx5IC51aS1idXR0b24taWNvbi1zZWNvbmRhcnl7cmlnaHQ6LjVlbX0udWktYnV0dG9uLXRleHQtaWNvbnMgLnVpLWJ1dHRvbi1pY29uLXNlY29uZGFyeSwudWktYnV0dG9uLWljb25zLW9ubHkgLnVpLWJ1dHRvbi1pY29uLXNlY29uZGFyeXtyaWdodDouNWVtfS51aS1idXR0b25zZXR7bWFyZ2luLXJpZ2h0OjdweH0udWktYnV0dG9uc2V0IC51aS1idXR0b257bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6LS4zZW19YnV0dG9uLnVpLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MDtwYWRkaW5nOjB9LnVpLWRhdGVwaWNrZXJ7d2lkdGg6MTdlbTtwYWRkaW5nOi4yZW0gLjJlbSAwO2Rpc3BsYXk6bm9uZX0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1oZWFkZXJ7cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZzouMmVtIDB9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldiwudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0e3Bvc2l0aW9uOmFic29sdXRlO3RvcDoycHg7d2lkdGg6MS44ZW07aGVpZ2h0OjEuOGVtfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXYtaG92ZXIsLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dC1ob3Zlcnt0b3A6MXB4fS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXZ7bGVmdDoycHh9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dHtyaWdodDoycHh9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldi1ob3ZlcntsZWZ0OjFweH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0LWhvdmVye3JpZ2h0OjFweH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2IHNwYW4sLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dCBzcGFue2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LThweDt0b3A6NTAlO21hcmdpbi10b3A6LThweH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci10aXRsZXttYXJnaW46MCAyLjNlbTtsaW5lLWhlaWdodDoxLjhlbTt0ZXh0LWFsaWduOmNlbnRlcn0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci10aXRsZSBzZWxlY3R7Zm9udC1zaXplOjFlbTttYXJnaW46MXB4IDB9LnVpLWRhdGVwaWNrZXIgc2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgteWVhcnt3aWR0aDoxMDAlfS51aS1kYXRlcGlja2VyIHNlbGVjdC51aS1kYXRlcGlja2VyLW1vbnRoLC51aS1kYXRlcGlja2VyIHNlbGVjdC51aS1kYXRlcGlja2VyLXllYXJ7d2lkdGg6NDklfS51aS1kYXRlcGlja2VyIHRhYmxle3dpZHRoOjEwMCU7Zm9udC1zaXplOi45ZW07Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO21hcmdpbjowIDAgLjRlbX0udWktZGF0ZXBpY2tlciB0aHtwYWRkaW5nOi43ZW0gLjNlbTt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXdlaWdodDpib2xkO2JvcmRlcjowfS51aS1kYXRlcGlja2VyIHRke2JvcmRlcjowO3BhZGRpbmc6MXB4fS51aS1kYXRlcGlja2VyIHRkIHNwYW4sLnVpLWRhdGVwaWNrZXIgdGQgYXtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6LjJlbTt0ZXh0LWFsaWduOnJpZ2h0O3RleHQtZGVjb3JhdGlvbjpub25lfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmV7YmFja2dyb3VuZC1pbWFnZTpub25lO21hcmdpbjouN2VtIDAgMCAwO3BhZGRpbmc6MCAuMmVtO2JvcmRlci1sZWZ0OjA7Ym9yZGVyLXJpZ2h0OjA7Ym9yZGVyLWJvdHRvbTowfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgYnV0dG9ue2Zsb2F0OnJpZ2h0O21hcmdpbjouNWVtIC4yZW0gLjRlbTtjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOi4yZW0gLjZlbSAuM2VtIC42ZW07d2lkdGg6YXV0bztvdmVyZmxvdzp2aXNpYmxlfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgYnV0dG9uLnVpLWRhdGVwaWNrZXItY3VycmVudHtmbG9hdDpsZWZ0fS51aS1kYXRlcGlja2VyLnVpLWRhdGVwaWNrZXItbXVsdGl7d2lkdGg6YXV0b30udWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1ncm91cHtmbG9hdDpsZWZ0fS51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWdyb3VwIHRhYmxle3dpZHRoOjk1JTttYXJnaW46MCBhdXRvIC40ZW19LnVpLWRhdGVwaWNrZXItbXVsdGktMiAudWktZGF0ZXBpY2tlci1ncm91cHt3aWR0aDo1MCV9LnVpLWRhdGVwaWNrZXItbXVsdGktMyAudWktZGF0ZXBpY2tlci1ncm91cHt3aWR0aDozMy4zJX0udWktZGF0ZXBpY2tlci1tdWx0aS00IC51aS1kYXRlcGlja2VyLWdyb3Vwe3dpZHRoOjI1JX0udWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1ncm91cC1sYXN0IC51aS1kYXRlcGlja2VyLWhlYWRlcntib3JkZXItbGVmdC13aWR0aDowfS51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWdyb3VwLW1pZGRsZSAudWktZGF0ZXBpY2tlci1oZWFkZXJ7Ym9yZGVyLWxlZnQtd2lkdGg6MH0udWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1idXR0b25wYW5le2NsZWFyOmxlZnR9LnVpLWRhdGVwaWNrZXItcm93LWJyZWFre2NsZWFyOmJvdGg7d2lkdGg6MTAwJTtmb250LXNpemU6MGVtfS51aS1kYXRlcGlja2VyLXJ0bHtkaXJlY3Rpb246cnRsfS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1wcmV2e3JpZ2h0OjJweDtsZWZ0OmF1dG99LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLW5leHR7bGVmdDoycHg7cmlnaHQ6YXV0b30udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItcHJldjpob3ZlcntyaWdodDoxcHg7bGVmdDphdXRvfS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1uZXh0OmhvdmVye2xlZnQ6MXB4O3JpZ2h0OmF1dG99LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmV7Y2xlYXI6cmlnaHR9LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgYnV0dG9ue2Zsb2F0OmxlZnR9LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgYnV0dG9uLnVpLWRhdGVwaWNrZXItY3VycmVudHtmbG9hdDpyaWdodH0udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItZ3JvdXB7ZmxvYXQ6cmlnaHR9LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWdyb3VwLWxhc3QgLnVpLWRhdGVwaWNrZXItaGVhZGVye2JvcmRlci1yaWdodC13aWR0aDowO2JvcmRlci1sZWZ0LXdpZHRoOjFweH0udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItZ3JvdXAtbWlkZGxlIC51aS1kYXRlcGlja2VyLWhlYWRlcntib3JkZXItcmlnaHQtd2lkdGg6MDtib3JkZXItbGVmdC13aWR0aDoxcHh9LnVpLWRhdGVwaWNrZXItY292ZXJ7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDotMTtmaWx0ZXI6bWFzaygpO3RvcDotNHB4O2xlZnQ6LTRweDt3aWR0aDoyMDBweDtoZWlnaHQ6MjAwcHh9LnVpLWRpYWxvZ3twb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7cGFkZGluZzouMmVtO3dpZHRoOjMwMHB4O292ZXJmbG93OmhpZGRlbn0udWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGViYXJ7cGFkZGluZzouNGVtIDFlbTtwb3NpdGlvbjpyZWxhdGl2ZX0udWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGV7ZmxvYXQ6bGVmdDttYXJnaW46LjFlbSAxNnB4IC4xZW0gMH0udWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2V7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6LjNlbTt0b3A6NTAlO3dpZHRoOjE5cHg7bWFyZ2luOi0xMHB4IDAgMCAwO3BhZGRpbmc6MXB4O2hlaWdodDoxOHB4fS51aS1kaWFsb2cgLnVpLWRpYWxvZy10aXRsZWJhci1jbG9zZSBzcGFue2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjFweH0udWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2U6aG92ZXIsLnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlOmZvY3Vze3BhZGRpbmc6MH0udWktZGlhbG9nIC51aS1kaWFsb2ctY29udGVudHtwb3NpdGlvbjpyZWxhdGl2ZTtib3JkZXI6MDtwYWRkaW5nOi41ZW0gMWVtO2JhY2tncm91bmQ6bm9uZTtvdmVyZmxvdzphdXRvO3pvb206MX0udWktZGlhbG9nIC51aS1kaWFsb2ctYnV0dG9ucGFuZXt0ZXh0LWFsaWduOmxlZnQ7Ym9yZGVyLXdpZHRoOjFweCAwIDAgMDtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7bWFyZ2luOi41ZW0gMCAwIDA7cGFkZGluZzouM2VtIDFlbSAuNWVtIC40ZW19LnVpLWRpYWxvZyAudWktZGlhbG9nLWJ1dHRvbnBhbmUgLnVpLWRpYWxvZy1idXR0b25zZXR7ZmxvYXQ6cmlnaHR9LnVpLWRpYWxvZyAudWktZGlhbG9nLWJ1dHRvbnBhbmUgYnV0dG9ue21hcmdpbjouNWVtIC40ZW0gLjVlbSAwO2N1cnNvcjpwb2ludGVyfS51aS1kaWFsb2cgLnVpLXJlc2l6YWJsZS1zZXt3aWR0aDoxNHB4O2hlaWdodDoxNHB4O3JpZ2h0OjNweDtib3R0b206M3B4fS51aS1kcmFnZ2FibGUgLnVpLWRpYWxvZy10aXRsZWJhcntjdXJzb3I6bW92ZX0udWktbWVudXtsaXN0LXN0eWxlOm5vbmU7cGFkZGluZzoycHg7bWFyZ2luOjA7ZGlzcGxheTpibG9jaztvdXRsaW5lOm5vbmV9LnVpLW1lbnUgLnVpLW1lbnV7bWFyZ2luLXRvcDotM3B4O3Bvc2l0aW9uOmFic29sdXRlfS51aS1tZW51IC51aS1tZW51LWl0ZW17bWFyZ2luOjA7cGFkZGluZzowO3pvb206MTt3aWR0aDoxMDAlfS51aS1tZW51IC51aS1tZW51LWRpdmlkZXJ7bWFyZ2luOjVweCAtMnB4IDVweCAtMnB4O2hlaWdodDowO2ZvbnQtc2l6ZTowO2xpbmUtaGVpZ2h0OjA7Ym9yZGVyLXdpZHRoOjFweCAwIDAgMH0udWktbWVudSAudWktbWVudS1pdGVtIGF7dGV4dC1kZWNvcmF0aW9uOm5vbmU7ZGlzcGxheTpibG9jaztwYWRkaW5nOjJweCAuNGVtO2xpbmUtaGVpZ2h0OjEuNTt6b29tOjE7Zm9udC13ZWlnaHQ6bm9ybWFsfS51aS1tZW51IC51aS1tZW51LWl0ZW0gYS51aS1zdGF0ZS1mb2N1cywudWktbWVudSAudWktbWVudS1pdGVtIGEudWktc3RhdGUtYWN0aXZle2ZvbnQtd2VpZ2h0Om5vcm1hbDttYXJnaW46LTFweH0udWktbWVudSAudWktc3RhdGUtZGlzYWJsZWR7Zm9udC13ZWlnaHQ6bm9ybWFsO21hcmdpbjouNGVtIDAgLjJlbTtsaW5lLWhlaWdodDoxLjV9LnVpLW1lbnUgLnVpLXN0YXRlLWRpc2FibGVkIGF7Y3Vyc29yOmRlZmF1bHR9LnVpLW1lbnUtaWNvbnN7cG9zaXRpb246cmVsYXRpdmV9LnVpLW1lbnUtaWNvbnMgLnVpLW1lbnUtaXRlbSBhe3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmctbGVmdDoyZW19LnVpLW1lbnUgLnVpLWljb257cG9zaXRpb246YWJzb2x1dGU7dG9wOi4yZW07bGVmdDouMmVtfS51aS1tZW51IC51aS1tZW51LWljb257cG9zaXRpb246c3RhdGljO2Zsb2F0OnJpZ2h0fS51aS1wcm9ncmVzc2JhcntoZWlnaHQ6MmVtO3RleHQtYWxpZ246bGVmdDtvdmVyZmxvdzpoaWRkZW59LnVpLXByb2dyZXNzYmFyIC51aS1wcm9ncmVzc2Jhci12YWx1ZXttYXJnaW46LTFweDtoZWlnaHQ6MTAwJX0udWktcmVzaXphYmxle3Bvc2l0aW9uOnJlbGF0aXZlfS51aS1yZXNpemFibGUtaGFuZGxle3Bvc2l0aW9uOmFic29sdXRlO2ZvbnQtc2l6ZTowLjFweDtkaXNwbGF5OmJsb2NrfS51aS1yZXNpemFibGUtZGlzYWJsZWQgLnVpLXJlc2l6YWJsZS1oYW5kbGUsLnVpLXJlc2l6YWJsZS1hdXRvaGlkZSAudWktcmVzaXphYmxlLWhhbmRsZXtkaXNwbGF5Om5vbmV9LnVpLXJlc2l6YWJsZS1ue2N1cnNvcjpuLXJlc2l6ZTtoZWlnaHQ6N3B4O3dpZHRoOjEwMCU7dG9wOi01cHg7bGVmdDowfS51aS1yZXNpemFibGUtc3tjdXJzb3I6cy1yZXNpemU7aGVpZ2h0OjdweDt3aWR0aDoxMDAlO2JvdHRvbTotNXB4O2xlZnQ6MH0udWktcmVzaXphYmxlLWV7Y3Vyc29yOmUtcmVzaXplO3dpZHRoOjdweDtyaWdodDotNXB4O3RvcDowO2hlaWdodDoxMDAlfS51aS1yZXNpemFibGUtd3tjdXJzb3I6dy1yZXNpemU7d2lkdGg6N3B4O2xlZnQ6LTVweDt0b3A6MDtoZWlnaHQ6MTAwJX0udWktcmVzaXphYmxlLXNle2N1cnNvcjpzZS1yZXNpemU7d2lkdGg6MTJweDtoZWlnaHQ6MTJweDtyaWdodDoxcHg7Ym90dG9tOjFweH0udWktcmVzaXphYmxlLXN3e2N1cnNvcjpzdy1yZXNpemU7d2lkdGg6OXB4O2hlaWdodDo5cHg7bGVmdDotNXB4O2JvdHRvbTotNXB4fS51aS1yZXNpemFibGUtbnd7Y3Vyc29yOm53LXJlc2l6ZTt3aWR0aDo5cHg7aGVpZ2h0OjlweDtsZWZ0Oi01cHg7dG9wOi01cHh9LnVpLXJlc2l6YWJsZS1uZXtjdXJzb3I6bmUtcmVzaXplO3dpZHRoOjlweDtoZWlnaHQ6OXB4O3JpZ2h0Oi01cHg7dG9wOi01cHh9LnVpLXNlbGVjdGFibGUtaGVscGVye3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwO2JvcmRlcjoxcHggZG90dGVkIGJsYWNrfS51aS1zbGlkZXJ7cG9zaXRpb246cmVsYXRpdmU7dGV4dC1hbGlnbjpsZWZ0fS51aS1zbGlkZXIgLnVpLXNsaWRlci1oYW5kbGV7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoyO3dpZHRoOjEuMmVtO2hlaWdodDoxLjJlbTtjdXJzb3I6ZGVmYXVsdH0udWktc2xpZGVyIC51aS1zbGlkZXItcmFuZ2V7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO2ZvbnQtc2l6ZTouN2VtO2Rpc3BsYXk6YmxvY2s7Ym9yZGVyOjA7YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9LnVpLXNsaWRlci1ob3Jpem9udGFse2hlaWdodDouOGVtfS51aS1zbGlkZXItaG9yaXpvbnRhbCAudWktc2xpZGVyLWhhbmRsZXt0b3A6LS4zZW07bWFyZ2luLWxlZnQ6LS42ZW19LnVpLXNsaWRlci1ob3Jpem9udGFsIC51aS1zbGlkZXItcmFuZ2V7dG9wOjA7aGVpZ2h0OjEwMCV9LnVpLXNsaWRlci1ob3Jpem9udGFsIC51aS1zbGlkZXItcmFuZ2UtbWlue2xlZnQ6MH0udWktc2xpZGVyLWhvcml6b250YWwgLnVpLXNsaWRlci1yYW5nZS1tYXh7cmlnaHQ6MH0udWktc2xpZGVyLXZlcnRpY2Fse3dpZHRoOi44ZW07aGVpZ2h0OjEwMHB4fS51aS1zbGlkZXItdmVydGljYWwgLnVpLXNsaWRlci1oYW5kbGV7bGVmdDotLjNlbTttYXJnaW4tbGVmdDowO21hcmdpbi1ib3R0b206LS42ZW19LnVpLXNsaWRlci12ZXJ0aWNhbCAudWktc2xpZGVyLXJhbmdle2xlZnQ6MDt3aWR0aDoxMDAlfS51aS1zbGlkZXItdmVydGljYWwgLnVpLXNsaWRlci1yYW5nZS1taW57Ym90dG9tOjB9LnVpLXNsaWRlci12ZXJ0aWNhbCAudWktc2xpZGVyLXJhbmdlLW1heHt0b3A6MH0udWktc3Bpbm5lcntwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0udWktc3Bpbm5lci1pbnB1dHtib3JkZXI6bm9uZTtiYWNrZ3JvdW5kOm5vbmU7cGFkZGluZzowO21hcmdpbjouMmVtIDA7dmVydGljYWwtYWxpZ246bWlkZGxlO21hcmdpbi1sZWZ0Oi40ZW07bWFyZ2luLXJpZ2h0OjIycHh9LnVpLXNwaW5uZXItYnV0dG9ue3dpZHRoOjE2cHg7aGVpZ2h0OjUwJTtmb250LXNpemU6LjVlbTtwYWRkaW5nOjA7bWFyZ2luOjA7dGV4dC1hbGlnbjpjZW50ZXI7cG9zaXRpb246YWJzb2x1dGU7Y3Vyc29yOmRlZmF1bHQ7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47cmlnaHQ6MH0udWktc3Bpbm5lciBhLnVpLXNwaW5uZXItYnV0dG9ue2JvcmRlci10b3A6bm9uZTtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXJpZ2h0Om5vbmV9LnVpLXNwaW5uZXIgLnVpLWljb257cG9zaXRpb246YWJzb2x1dGU7bWFyZ2luLXRvcDotOHB4O3RvcDo1MCU7bGVmdDowfS51aS1zcGlubmVyLXVwe3RvcDowfS51aS1zcGlubmVyLWRvd257Ym90dG9tOjB9LnVpLXNwaW5uZXIgLnVpLWljb24tdHJpYW5nbGUtMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTY1cHggLTE2cHh9LnVpLXRhYnN7cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZzouMmVtO3pvb206MX0udWktdGFicyAudWktdGFicy1uYXZ7bWFyZ2luOjA7cGFkZGluZzouMmVtIC4yZW0gMH0udWktdGFicyAudWktdGFicy1uYXYgbGl7bGlzdC1zdHlsZTpub25lO2Zsb2F0OmxlZnQ7cG9zaXRpb246cmVsYXRpdmU7dG9wOjA7bWFyZ2luOjFweCAuMmVtIDAgMDtib3JkZXItYm90dG9tOjA7cGFkZGluZzowO3doaXRlLXNwYWNlOm5vd3JhcH0udWktdGFicyAudWktdGFicy1uYXYgbGkgYXtmbG9hdDpsZWZ0O3BhZGRpbmc6LjVlbSAxZW07dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtYWN0aXZle21hcmdpbi1ib3R0b206LTFweDtwYWRkaW5nLWJvdHRvbToxcHh9LnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtYWN0aXZlIGEsLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXN0YXRlLWRpc2FibGVkIGEsLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtbG9hZGluZyBhe2N1cnNvcjp0ZXh0fS51aS10YWJzIC51aS10YWJzLW5hdiBsaSBhLC51aS10YWJzLWNvbGxhcHNpYmxlIC51aS10YWJzLW5hdiBsaS51aS10YWJzLWFjdGl2ZSBhe2N1cnNvcjpwb2ludGVyfS51aS10YWJzIC51aS10YWJzLXBhbmVse2Rpc3BsYXk6YmxvY2s7Ym9yZGVyLXdpZHRoOjA7cGFkZGluZzoxZW0gMS40ZW07YmFja2dyb3VuZDpub25lfS51aS10b29sdGlwe3BhZGRpbmc6OHB4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6OTk5OTttYXgtd2lkdGg6MzAwcHg7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCA1cHggI2FhYTtib3gtc2hhZG93OjAgMCA1cHggI2FhYX0qIGh0bWwgLnVpLXRvb2x0aXB7YmFja2dyb3VuZC1pbWFnZTpub25lfWJvZHkgLnVpLXRvb2x0aXB7Ym9yZGVyLXdpZHRoOjJweH0udWktd2lkZ2V0e2ZvbnQtZmFtaWx5OlZlcmRhbmEsQXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MS4xZW19LnVpLXdpZGdldCAudWktd2lkZ2V0e2ZvbnQtc2l6ZToxZW19LnVpLXdpZGdldCBpbnB1dCwudWktd2lkZ2V0IHNlbGVjdCwudWktd2lkZ2V0IHRleHRhcmVhLC51aS13aWRnZXQgYnV0dG9ue2ZvbnQtZmFtaWx5OlZlcmRhbmEsQXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MWVtfS51aS13aWRnZXQtY29udGVudHtib3JkZXI6MXB4IHNvbGlkICNhYWE7YmFja2dyb3VuZDojZmZmIHVybChpbWFnZXMvdWktYmdfZmxhdF83NV9mZmZmZmZfNDB4MTAwLnBuZykgNTAlIDUwJSByZXBlYXQteDtjb2xvcjojMjIyfS51aS13aWRnZXQtY29udGVudCBhe2NvbG9yOiMyMjJ9LnVpLXdpZGdldC1oZWFkZXJ7Ym9yZGVyOjFweCBzb2xpZCAjYWFhO2JhY2tncm91bmQ6I2NjYyB1cmwoaW1hZ2VzL3VpLWJnX2hpZ2hsaWdodC1zb2Z0Xzc1X2NjY2NjY18xeDEwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7Y29sb3I6IzIyMjtmb250LXdlaWdodDpib2xkfS51aS13aWRnZXQtaGVhZGVyIGF7Y29sb3I6IzIyMn0udWktc3RhdGUtZGVmYXVsdCwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWRlZmF1bHQsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWRlZmF1bHR7Ym9yZGVyOjFweCBzb2xpZCAjZDNkM2QzO2JhY2tncm91bmQ6I2U2ZTZlNiB1cmwoaW1hZ2VzL3VpLWJnX2dsYXNzXzc1X2U2ZTZlNl8xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7Zm9udC13ZWlnaHQ6bm9ybWFsO2NvbG9yOiM1NTV9LnVpLXN0YXRlLWRlZmF1bHQgYSwudWktc3RhdGUtZGVmYXVsdCBhOmxpbmssLnVpLXN0YXRlLWRlZmF1bHQgYTp2aXNpdGVke2NvbG9yOiM1NTU7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLXN0YXRlLWhvdmVyLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaG92ZXIsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhvdmVyLC51aS1zdGF0ZS1mb2N1cywudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWZvY3VzLC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1mb2N1c3tib3JkZXI6MXB4IHNvbGlkICM5OTk7YmFja2dyb3VuZDojZGFkYWRhIHVybChpbWFnZXMvdWktYmdfZ2xhc3NfNzVfZGFkYWRhXzF4NDAwLnBuZykgNTAlIDUwJSByZXBlYXQteDtmb250LXdlaWdodDpub3JtYWw7Y29sb3I6IzIxMjEyMX0udWktc3RhdGUtaG92ZXIgYSwudWktc3RhdGUtaG92ZXIgYTpob3ZlciwudWktc3RhdGUtaG92ZXIgYTpsaW5rLC51aS1zdGF0ZS1ob3ZlciBhOnZpc2l0ZWR7Y29sb3I6IzIxMjEyMTt0ZXh0LWRlY29yYXRpb246bm9uZX0udWktc3RhdGUtYWN0aXZlLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtYWN0aXZlLC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1hY3RpdmV7Ym9yZGVyOjFweCBzb2xpZCAjYWFhO2JhY2tncm91bmQ6I2ZmZiB1cmwoaW1hZ2VzL3VpLWJnX2dsYXNzXzY1X2ZmZmZmZl8xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7Zm9udC13ZWlnaHQ6bm9ybWFsO2NvbG9yOiMyMTIxMjF9LnVpLXN0YXRlLWFjdGl2ZSBhLC51aS1zdGF0ZS1hY3RpdmUgYTpsaW5rLC51aS1zdGF0ZS1hY3RpdmUgYTp2aXNpdGVke2NvbG9yOiMyMTIxMjE7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLXN0YXRlLWhpZ2hsaWdodCwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWhpZ2hsaWdodCwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtaGlnaGxpZ2h0e2JvcmRlcjoxcHggc29saWQgI2ZjZWZhMTtiYWNrZ3JvdW5kOiNmYmY5ZWUgdXJsKGltYWdlcy91aS1iZ19nbGFzc181NV9mYmY5ZWVfMXg0MDAucG5nKSA1MCUgNTAlIHJlcGVhdC14O2NvbG9yOiMzNjM2MzZ9LnVpLXN0YXRlLWhpZ2hsaWdodCBhLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaGlnaGxpZ2h0IGEsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhpZ2hsaWdodCBhe2NvbG9yOiMzNjM2MzZ9LnVpLXN0YXRlLWVycm9yLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZXJyb3IsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9ye2JvcmRlcjoxcHggc29saWQgI2NkMGEwYTtiYWNrZ3JvdW5kOiNmZWYxZWMgdXJsKGltYWdlcy91aS1iZ19nbGFzc185NV9mZWYxZWNfMXg0MDAucG5nKSA1MCUgNTAlIHJlcGVhdC14O2NvbG9yOiNjZDBhMGF9LnVpLXN0YXRlLWVycm9yIGEsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1lcnJvciBhLC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1lcnJvciBhe2NvbG9yOiNjZDBhMGF9LnVpLXN0YXRlLWVycm9yLXRleHQsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1lcnJvci10ZXh0LC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1lcnJvci10ZXh0e2NvbG9yOiNjZDBhMGF9LnVpLXByaW9yaXR5LXByaW1hcnksLnVpLXdpZGdldC1jb250ZW50IC51aS1wcmlvcml0eS1wcmltYXJ5LC51aS13aWRnZXQtaGVhZGVyIC51aS1wcmlvcml0eS1wcmltYXJ5e2ZvbnQtd2VpZ2h0OmJvbGR9LnVpLXByaW9yaXR5LXNlY29uZGFyeSwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXByaW9yaXR5LXNlY29uZGFyeSwudWktd2lkZ2V0LWhlYWRlciAudWktcHJpb3JpdHktc2Vjb25kYXJ5e29wYWNpdHk6Ljc7ZmlsdGVyOkFscGhhKE9wYWNpdHk9NzApO2ZvbnQtd2VpZ2h0Om5vcm1hbH0udWktc3RhdGUtZGlzYWJsZWQsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1kaXNhYmxlZCwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZGlzYWJsZWR7b3BhY2l0eTouMzU7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MzUpO2JhY2tncm91bmQtaW1hZ2U6bm9uZX0udWktc3RhdGUtZGlzYWJsZWQgLnVpLWljb257ZmlsdGVyOkFscGhhKE9wYWNpdHk9MzUpfS51aS1pY29ue3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoaW1hZ2VzL3VpLWljb25zXzIyMjIyMl8yNTZ4MjQwLnBuZyl9LnVpLXdpZGdldC1jb250ZW50IC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKGltYWdlcy91aS1pY29uc18yMjIyMjJfMjU2eDI0MC5wbmcpfS51aS13aWRnZXQtaGVhZGVyIC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKGltYWdlcy91aS1pY29uc18yMjIyMjJfMjU2eDI0MC5wbmcpfS51aS1zdGF0ZS1kZWZhdWx0IC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKGltYWdlcy91aS1pY29uc184ODg4ODhfMjU2eDI0MC5wbmcpfS51aS1zdGF0ZS1ob3ZlciAudWktaWNvbiwudWktc3RhdGUtZm9jdXMgLnVpLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoaW1hZ2VzL3VpLWljb25zXzQ1NDU0NV8yNTZ4MjQwLnBuZyl9LnVpLXN0YXRlLWFjdGl2ZSAudWktaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybChpbWFnZXMvdWktaWNvbnNfNDU0NTQ1XzI1NngyNDAucG5nKX0udWktc3RhdGUtaGlnaGxpZ2h0IC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKGltYWdlcy91aS1pY29uc18yZTgzZmZfMjU2eDI0MC5wbmcpfS51aS1zdGF0ZS1lcnJvciAudWktaWNvbiwudWktc3RhdGUtZXJyb3ItdGV4dCAudWktaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybChpbWFnZXMvdWktaWNvbnNfY2QwYTBhXzI1NngyNDAucG5nKX0udWktaWNvbi1jYXJhdC0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9LnVpLWljb24tY2FyYXQtMS1uZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IDB9LnVpLWljb24tY2FyYXQtMS1le2JhY2tncm91bmQtcG9zaXRpb246LTMycHggMH0udWktaWNvbi1jYXJhdC0xLXNle2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggMH0udWktaWNvbi1jYXJhdC0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAwfS51aS1pY29uLWNhcmF0LTEtc3d7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAwfS51aS1pY29uLWNhcmF0LTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IDB9LnVpLWljb24tY2FyYXQtMS1ud3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAwfS51aS1pY29uLWNhcmF0LTItbi1ze2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IDB9LnVpLWljb24tY2FyYXQtMi1lLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggMH0udWktaWNvbi10cmlhbmdsZS0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtbmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLXNle2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMS1zd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMi1uLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMi1lLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTE2cHh9LnVpLWljb24tYXJyb3ctMS1ue2JhY2tncm91bmQtcG9zaXRpb246MCAtMzJweH0udWktaWNvbi1hcnJvdy0xLW5le2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTMycHh9LnVpLWljb24tYXJyb3ctMS1le2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTMycHh9LnVpLWljb24tYXJyb3ctMS1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0zMnB4fS51aS1pY29uLWFycm93LTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0zMnB4fS51aS1pY29uLWFycm93LTEtc3d7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMzJweH0udWktaWNvbi1hcnJvdy0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMzJweH0udWktaWNvbi1hcnJvdy0xLW53e2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC0zMnB4fS51aS1pY29uLWFycm93LTItbi1ze2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0zMnB4fS51aS1pY29uLWFycm93LTItbmUtc3d7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTMycHh9LnVpLWljb24tYXJyb3ctMi1lLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggLTMycHh9LnVpLWljb24tYXJyb3ctMi1zZS1ud3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtMzJweH0udWktaWNvbi1hcnJvd3N0b3AtMS1ue2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC0zMnB4fS51aS1pY29uLWFycm93c3RvcC0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMjA4cHggLTMycHh9LnVpLWljb24tYXJyb3dzdG9wLTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMjRweCAtMzJweH0udWktaWNvbi1hcnJvd3N0b3AtMS13e2JhY2tncm91bmQtcG9zaXRpb246LTI0MHB4IC0zMnB4fS51aS1pY29uLWFycm93dGhpY2stMS1ue2JhY2tncm91bmQtcG9zaXRpb246MCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtbmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMS1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0xLXN3e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0yLW4tc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTItbmUtc3d7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0yLWUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTItc2Utbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTc2cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS1ue2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMjI0cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS13e2JhY2tncm91bmQtcG9zaXRpb246LTI0MHB4IC00OHB4fS51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS13e2JhY2tncm91bmQtcG9zaXRpb246MCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC02NHB4fS51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1le2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTY0cHh9LnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybi0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybi0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybi0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybi0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTY0cHh9LnVpLWljb24tYXJyb3dyZWZyZXNoLTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtNjRweH0udWktaWNvbi1hcnJvd3JlZnJlc2gtMS1ue2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC02NHB4fS51aS1pY29uLWFycm93cmVmcmVzaC0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggLTY0cHh9LnVpLWljb24tYXJyb3dyZWZyZXNoLTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtNjRweH0udWktaWNvbi1hcnJvdy00e2JhY2tncm91bmQtcG9zaXRpb246MCAtODBweH0udWktaWNvbi1hcnJvdy00LWRpYWd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtODBweH0udWktaWNvbi1leHRsaW5re2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTgwcHh9LnVpLWljb24tbmV3d2lue2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTgwcHh9LnVpLWljb24tcmVmcmVzaHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC04MHB4fS51aS1pY29uLXNodWZmbGV7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtODBweH0udWktaWNvbi10cmFuc2Zlci1lLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtODBweH0udWktaWNvbi10cmFuc2ZlcnRoaWNrLWUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtODBweH0udWktaWNvbi1mb2xkZXItY29sbGFwc2Vke2JhY2tncm91bmQtcG9zaXRpb246MCAtOTZweH0udWktaWNvbi1mb2xkZXItb3BlbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC05NnB4fS51aS1pY29uLWRvY3VtZW50e2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTk2cHh9LnVpLWljb24tZG9jdW1lbnQtYntiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC05NnB4fS51aS1pY29uLW5vdGV7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtOTZweH0udWktaWNvbi1tYWlsLWNsb3NlZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC05NnB4fS51aS1pY29uLW1haWwtb3BlbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC05NnB4fS51aS1pY29uLXN1aXRjYXNle2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC05NnB4fS51aS1pY29uLWNvbW1lbnR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTk2cHh9LnVpLWljb24tcGVyc29ue2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC05NnB4fS51aS1pY29uLXByaW50e2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC05NnB4fS51aS1pY29uLXRyYXNoe2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC05NnB4fS51aS1pY29uLWxvY2tlZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xOTJweCAtOTZweH0udWktaWNvbi11bmxvY2tlZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtOTZweH0udWktaWNvbi1ib29rbWFya3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMjRweCAtOTZweH0udWktaWNvbi10YWd7YmFja2dyb3VuZC1wb3NpdGlvbjotMjQwcHggLTk2cHh9LnVpLWljb24taG9tZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTExMnB4fS51aS1pY29uLWZsYWd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMTEycHh9LnVpLWljb24tY2FsZW5kYXJ7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTEycHh9LnVpLWljb24tY2FydHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xMTJweH0udWktaWNvbi1wZW5jaWx7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTEycHh9LnVpLWljb24tY2xvY2t7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTEycHh9LnVpLWljb24tZGlza3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xMTJweH0udWktaWNvbi1jYWxjdWxhdG9ye2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC0xMTJweH0udWktaWNvbi16b29taW57YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTExMnB4fS51aS1pY29uLXpvb21vdXR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTExMnB4fS51aS1pY29uLXNlYXJjaHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtMTEycHh9LnVpLWljb24td3JlbmNoe2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC0xMTJweH0udWktaWNvbi1nZWFye2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC0xMTJweH0udWktaWNvbi1oZWFydHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtMTEycHh9LnVpLWljb24tc3RhcntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMjRweCAtMTEycHh9LnVpLWljb24tbGlua3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAtMTEycHh9LnVpLWljb24tY2FuY2Vse2JhY2tncm91bmQtcG9zaXRpb246MCAtMTI4cHh9LnVpLWljb24tcGx1c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0xMjhweH0udWktaWNvbi1wbHVzdGhpY2t7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTI4cHh9LnVpLWljb24tbWludXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTI4cHh9LnVpLWljb24tbWludXN0aGlja3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xMjhweH0udWktaWNvbi1jbG9zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xMjhweH0udWktaWNvbi1jbG9zZXRoaWNre2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTEyOHB4fS51aS1pY29uLWtleXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMTI4cHh9LnVpLWljb24tbGlnaHRidWxie2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0xMjhweH0udWktaWNvbi1zY2lzc29yc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMTI4cHh9LnVpLWljb24tY2xpcGJvYXJke2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC0xMjhweH0udWktaWNvbi1jb3B5e2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC0xMjhweH0udWktaWNvbi1jb250YWN0e2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC0xMjhweH0udWktaWNvbi1pbWFnZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtMTI4cHh9LnVpLWljb24tdmlkZW97YmFja2dyb3VuZC1wb3NpdGlvbjotMjI0cHggLTEyOHB4fS51aS1pY29uLXNjcmlwdHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAtMTI4cHh9LnVpLWljb24tYWxlcnR7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNDRweH0udWktaWNvbi1pbmZve2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTE0NHB4fS51aS1pY29uLW5vdGljZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xNDRweH0udWktaWNvbi1oZWxwe2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTE0NHB4fS51aS1pY29uLWNoZWNre2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTE0NHB4fS51aS1pY29uLWJ1bGxldHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xNDRweH0udWktaWNvbi1yYWRpby1vbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xNDRweH0udWktaWNvbi1yYWRpby1vZmZ7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTE0NHB4fS51aS1pY29uLXBpbi13e2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0xNDRweH0udWktaWNvbi1waW4tc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMTQ0cHh9LnVpLWljb24tcGxheXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE2MHB4fS51aS1pY29uLXBhdXNle2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTE2MHB4fS51aS1pY29uLXNlZWstbmV4dHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xNjBweH0udWktaWNvbi1zZWVrLXByZXZ7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTYwcHh9LnVpLWljb24tc2Vlay1lbmR7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTYwcHh9LnVpLWljb24tc2Vlay1zdGFydHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xNjBweH0udWktaWNvbi1zZWVrLWZpcnN0e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTE2MHB4fS51aS1pY29uLXN0b3B7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMTYwcHh9LnVpLWljb24tZWplY3R7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTE2MHB4fS51aS1pY29uLXZvbHVtZS1vZmZ7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTE2MHB4fS51aS1pY29uLXZvbHVtZS1vbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMTYwcHh9LnVpLWljb24tcG93ZXJ7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNzZweH0udWktaWNvbi1zaWduYWwtZGlhZ3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0xNzZweH0udWktaWNvbi1zaWduYWx7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTc2cHh9LnVpLWljb24tYmF0dGVyeS0we2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTE3NnB4fS51aS1pY29uLWJhdHRlcnktMXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xNzZweH0udWktaWNvbi1iYXR0ZXJ5LTJ7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTc2cHh9LnVpLWljb24tYmF0dGVyeS0ze2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTE3NnB4fS51aS1pY29uLWNpcmNsZS1wbHVze2JhY2tncm91bmQtcG9zaXRpb246MCAtMTkycHh9LnVpLWljb24tY2lyY2xlLW1pbnVze2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS1jbG9zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtYXJyb3ctZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLWFycm93LXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS1hcnJvdy13e2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtYXJyb3ctbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLXpvb21pbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLXpvb21vdXR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTkycHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS1jaGVja3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtMTkycHh9LnVpLWljb24tY2lyY2xlc21hbGwtcGx1c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTIwOHB4fS51aS1pY29uLWNpcmNsZXNtYWxsLW1pbnVze2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTIwOHB4fS51aS1pY29uLWNpcmNsZXNtYWxsLWNsb3Nle2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTIwOHB4fS51aS1pY29uLXNxdWFyZXNtYWxsLXBsdXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMjA4cHh9LnVpLWljb24tc3F1YXJlc21hbGwtbWludXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMjA4cHh9LnVpLWljb24tc3F1YXJlc21hbGwtY2xvc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMjA4cHh9LnVpLWljb24tZ3JpcC1kb3R0ZWQtdmVydGljYWx7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0yMjRweH0udWktaWNvbi1ncmlwLWRvdHRlZC1ob3Jpem9udGFse2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTIyNHB4fS51aS1pY29uLWdyaXAtc29saWQtdmVydGljYWx7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMjI0cHh9LnVpLWljb24tZ3JpcC1zb2xpZC1ob3Jpem9udGFse2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTIyNHB4fS51aS1pY29uLWdyaXBzbWFsbC1kaWFnb25hbC1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0yMjRweH0udWktaWNvbi1ncmlwLWRpYWdvbmFsLXNle2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTIyNHB4fS51aS1jb3JuZXItYWxsLC51aS1jb3JuZXItdG9wLC51aS1jb3JuZXItbGVmdCwudWktY29ybmVyLXRsey1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OjRweDstd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6NHB4Oy1raHRtbC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweH0udWktY29ybmVyLWFsbCwudWktY29ybmVyLXRvcCwudWktY29ybmVyLXJpZ2h0LC51aS1jb3JuZXItdHJ7LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OjRweDstd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDsta2h0bWwtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6NHB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweH0udWktY29ybmVyLWFsbCwudWktY29ybmVyLWJvdHRvbSwudWktY29ybmVyLWxlZnQsLnVpLWNvcm5lci1ibHstbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDo0cHg7LXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjRweDsta2h0bWwtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHh9LnVpLWNvcm5lci1hbGwsLnVpLWNvcm5lci1ib3R0b20sLnVpLWNvcm5lci1yaWdodCwudWktY29ybmVyLWJyey1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDo0cHg7LXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo0cHg7LWtodG1sLWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjRweDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo0cHh9LnVpLXdpZGdldC1vdmVybGF5e2JhY2tncm91bmQ6I2FhYSB1cmwoaW1hZ2VzL3VpLWJnX2ZsYXRfMF9hYWFhYWFfNDB4MTAwLnBuZykgNTAlIDUwJSByZXBlYXQteDtvcGFjaXR5Oi4zO2ZpbHRlcjpBbHBoYShPcGFjaXR5PTMwKX0udWktd2lkZ2V0LXNoYWRvd3ttYXJnaW46LThweCAwIDAgLThweDtwYWRkaW5nOjhweDtiYWNrZ3JvdW5kOiNhYWEgdXJsKGltYWdlcy91aS1iZ19mbGF0XzBfYWFhYWFhXzQweDEwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7b3BhY2l0eTouMztmaWx0ZXI6QWxwaGEoT3BhY2l0eT0zMCk7LW1vei1ib3JkZXItcmFkaXVzOjhweDsta2h0bWwtYm9yZGVyLXJhZGl1czo4cHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjhweDtib3JkZXItcmFkaXVzOjhweH0=]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2NzcyddID0gJ2Nzcy9zbW9vdGhuZXNzL2pxdWVyeS11aS0xLjkuMi5jdXN0b20ubWluLmNzcyc7CiRpbmZvWydqcyddID0gJ2pzL2pxdWVyeS11aS0xLjkuMi5jdXN0b20ubWluLmpzJzsKJGluZm9bJ2RlcGVuZHMnXSA9ICdqcXVlcnknOwokaW5mb1snY2RuJ10gPSAnLy9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnl1aS8xLjkuMi9qcXVlcnktdWkubWluLmpzJzsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/ui.lib/js/jquery-ui-1.9.2.custom.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSBVSSAtIHYxLjkuMiAtIDIwMTItMTEtMjMKKiBodHRwOi8vanF1ZXJ5dWkuY29tCiogSW5jbHVkZXM6IGpxdWVyeS51aS5jb3JlLmpzLCBqcXVlcnkudWkud2lkZ2V0LmpzLCBqcXVlcnkudWkubW91c2UuanMsIGpxdWVyeS51aS5wb3NpdGlvbi5qcywganF1ZXJ5LnVpLmFjY29yZGlvbi5qcywganF1ZXJ5LnVpLmF1dG9jb21wbGV0ZS5qcywganF1ZXJ5LnVpLmJ1dHRvbi5qcywganF1ZXJ5LnVpLmRhdGVwaWNrZXIuanMsIGpxdWVyeS51aS5kaWFsb2cuanMsIGpxdWVyeS51aS5kcmFnZ2FibGUuanMsIGpxdWVyeS51aS5kcm9wcGFibGUuanMsIGpxdWVyeS51aS5lZmZlY3QuanMsIGpxdWVyeS51aS5lZmZlY3QtYmxpbmQuanMsIGpxdWVyeS51aS5lZmZlY3QtYm91bmNlLmpzLCBqcXVlcnkudWkuZWZmZWN0LWNsaXAuanMsIGpxdWVyeS51aS5lZmZlY3QtZHJvcC5qcywganF1ZXJ5LnVpLmVmZmVjdC1leHBsb2RlLmpzLCBqcXVlcnkudWkuZWZmZWN0LWZhZGUuanMsIGpxdWVyeS51aS5lZmZlY3QtZm9sZC5qcywganF1ZXJ5LnVpLmVmZmVjdC1oaWdobGlnaHQuanMsIGpxdWVyeS51aS5lZmZlY3QtcHVsc2F0ZS5qcywganF1ZXJ5LnVpLmVmZmVjdC1zY2FsZS5qcywganF1ZXJ5LnVpLmVmZmVjdC1zaGFrZS5qcywganF1ZXJ5LnVpLmVmZmVjdC1zbGlkZS5qcywganF1ZXJ5LnVpLmVmZmVjdC10cmFuc2Zlci5qcywganF1ZXJ5LnVpLm1lbnUuanMsIGpxdWVyeS51aS5wcm9ncmVzc2Jhci5qcywganF1ZXJ5LnVpLnJlc2l6YWJsZS5qcywganF1ZXJ5LnVpLnNlbGVjdGFibGUuanMsIGpxdWVyeS51aS5zbGlkZXIuanMsIGpxdWVyeS51aS5zb3J0YWJsZS5qcywganF1ZXJ5LnVpLnNwaW5uZXIuanMsIGpxdWVyeS51aS50YWJzLmpzLCBqcXVlcnkudWkudG9vbHRpcC5qcwoqIENvcHlyaWdodCAoYykgMjAxMiBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIExpY2Vuc2VkIE1JVCAqLwoKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7Cgp2YXIgdXVpZCA9IDAsCglydW5pcXVlSWQgPSAvXnVpLWlkLVxkKyQvOwoKLy8gcHJldmVudCBkdXBsaWNhdGUgbG9hZGluZwovLyB0aGlzIGlzIG9ubHkgYSBwcm9ibGVtIGJlY2F1c2Ugd2UgcHJveHkgZXhpc3RpbmcgZnVuY3Rpb25zCi8vIGFuZCB3ZSBkb24ndCB3YW50IHRvIGRvdWJsZSBwcm94eSB0aGVtCiQudWkgPSAkLnVpIHx8IHt9OwppZiAoICQudWkudmVyc2lvbiApIHsKCXJldHVybjsKfQoKJC5leHRlbmQoICQudWksIHsKCXZlcnNpb246ICIxLjkuMiIsCgoJa2V5Q29kZTogewoJCUJBQ0tTUEFDRTogOCwKCQlDT01NQTogMTg4LAoJCURFTEVURTogNDYsCgkJRE9XTjogNDAsCgkJRU5EOiAzNSwKCQlFTlRFUjogMTMsCgkJRVNDQVBFOiAyNywKCQlIT01FOiAzNiwKCQlMRUZUOiAzNywKCQlOVU1QQURfQUREOiAxMDcsCgkJTlVNUEFEX0RFQ0lNQUw6IDExMCwKCQlOVU1QQURfRElWSURFOiAxMTEsCgkJTlVNUEFEX0VOVEVSOiAxMDgsCgkJTlVNUEFEX01VTFRJUExZOiAxMDYsCgkJTlVNUEFEX1NVQlRSQUNUOiAxMDksCgkJUEFHRV9ET1dOOiAzNCwKCQlQQUdFX1VQOiAzMywKCQlQRVJJT0Q6IDE5MCwKCQlSSUdIVDogMzksCgkJU1BBQ0U6IDMyLAoJCVRBQjogOSwKCQlVUDogMzgKCX0KfSk7CgovLyBwbHVnaW5zCiQuZm4uZXh0ZW5kKHsKCV9mb2N1czogJC5mbi5mb2N1cywKCWZvY3VzOiBmdW5jdGlvbiggZGVsYXksIGZuICkgewoJCXJldHVybiB0eXBlb2YgZGVsYXkgPT09ICJudW1iZXIiID8KCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGVsZW0gPSB0aGlzOwoJCQkJc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQkJCQkkKCBlbGVtICkuZm9jdXMoKTsKCQkJCQlpZiAoIGZuICkgewoJCQkJCQlmbi5jYWxsKCBlbGVtICk7CgkJCQkJfQoJCQkJfSwgZGVsYXkgKTsKCQkJfSkgOgoJCQl0aGlzLl9mb2N1cy5hcHBseSggdGhpcywgYXJndW1lbnRzICk7Cgl9LAoKCXNjcm9sbFBhcmVudDogZnVuY3Rpb24oKSB7CgkJdmFyIHNjcm9sbFBhcmVudDsKCQlpZiAoKCQudWkuaWUgJiYgKC8oc3RhdGljfHJlbGF0aXZlKS8pLnRlc3QodGhpcy5jc3MoJ3Bvc2l0aW9uJykpKSB8fCAoL2Fic29sdXRlLykudGVzdCh0aGlzLmNzcygncG9zaXRpb24nKSkpIHsKCQkJc2Nyb2xsUGFyZW50ID0gdGhpcy5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuICgvKHJlbGF0aXZlfGFic29sdXRlfGZpeGVkKS8pLnRlc3QoJC5jc3ModGhpcywncG9zaXRpb24nKSkgJiYgKC8oYXV0b3xzY3JvbGwpLykudGVzdCgkLmNzcyh0aGlzLCdvdmVyZmxvdycpKyQuY3NzKHRoaXMsJ292ZXJmbG93LXknKSskLmNzcyh0aGlzLCdvdmVyZmxvdy14JykpOwoJCQl9KS5lcSgwKTsKCQl9IGVsc2UgewoJCQlzY3JvbGxQYXJlbnQgPSB0aGlzLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gKC8oYXV0b3xzY3JvbGwpLykudGVzdCgkLmNzcyh0aGlzLCdvdmVyZmxvdycpKyQuY3NzKHRoaXMsJ292ZXJmbG93LXknKSskLmNzcyh0aGlzLCdvdmVyZmxvdy14JykpOwoJCQl9KS5lcSgwKTsKCQl9CgoJCXJldHVybiAoL2ZpeGVkLykudGVzdCh0aGlzLmNzcygncG9zaXRpb24nKSkgfHwgIXNjcm9sbFBhcmVudC5sZW5ndGggPyAkKGRvY3VtZW50KSA6IHNjcm9sbFBhcmVudDsKCX0sCgoJekluZGV4OiBmdW5jdGlvbiggekluZGV4ICkgewoJCWlmICggekluZGV4ICE9PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiB0aGlzLmNzcyggInpJbmRleCIsIHpJbmRleCApOwoJCX0KCgkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJdmFyIGVsZW0gPSAkKCB0aGlzWyAwIF0gKSwgcG9zaXRpb24sIHZhbHVlOwoJCQl3aGlsZSAoIGVsZW0ubGVuZ3RoICYmIGVsZW1bIDAgXSAhPT0gZG9jdW1lbnQgKSB7CgkJCQkvLyBJZ25vcmUgei1pbmRleCBpZiBwb3NpdGlvbiBpcyBzZXQgdG8gYSB2YWx1ZSB3aGVyZSB6LWluZGV4IGlzIGlnbm9yZWQgYnkgdGhlIGJyb3dzZXIKCQkJCS8vIFRoaXMgbWFrZXMgYmVoYXZpb3Igb2YgdGhpcyBmdW5jdGlvbiBjb25zaXN0ZW50IGFjcm9zcyBicm93c2VycwoJCQkJLy8gV2ViS2l0IGFsd2F5cyByZXR1cm5zIGF1dG8gaWYgdGhlIGVsZW1lbnQgaXMgcG9zaXRpb25lZAoJCQkJcG9zaXRpb24gPSBlbGVtLmNzcyggInBvc2l0aW9uIiApOwoJCQkJaWYgKCBwb3NpdGlvbiA9PT0gImFic29sdXRlIiB8fCBwb3NpdGlvbiA9PT0gInJlbGF0aXZlIiB8fCBwb3NpdGlvbiA9PT0gImZpeGVkIiApIHsKCQkJCQkvLyBJRSByZXR1cm5zIDAgd2hlbiB6SW5kZXggaXMgbm90IHNwZWNpZmllZAoJCQkJCS8vIG90aGVyIGJyb3dzZXJzIHJldHVybiBhIHN0cmluZwoJCQkJCS8vIHdlIGlnbm9yZSB0aGUgY2FzZSBvZiBuZXN0ZWQgZWxlbWVudHMgd2l0aCBhbiBleHBsaWNpdCB2YWx1ZSBvZiAwCgkJCQkJLy8gPGRpdiBzdHlsZT0iei1pbmRleDogLTEwOyI+PGRpdiBzdHlsZT0iei1pbmRleDogMDsiPjwvZGl2PjwvZGl2PgoJCQkJCXZhbHVlID0gcGFyc2VJbnQoIGVsZW0uY3NzKCAiekluZGV4IiApLCAxMCApOwoJCQkJCWlmICggIWlzTmFOKCB2YWx1ZSApICYmIHZhbHVlICE9PSAwICkgewoJCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQkJfQoJCQkJfQoJCQkJZWxlbSA9IGVsZW0ucGFyZW50KCk7CgkJCX0KCQl9CgoJCXJldHVybiAwOwoJfSwKCgl1bmlxdWVJZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJaWYgKCAhdGhpcy5pZCApIHsKCQkJCXRoaXMuaWQgPSAidWktaWQtIiArICgrK3V1aWQpOwoJCQl9CgkJfSk7Cgl9LAoKCXJlbW92ZVVuaXF1ZUlkOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlpZiAoIHJ1bmlxdWVJZC50ZXN0KCB0aGlzLmlkICkgKSB7CgkJCQkkKCB0aGlzICkucmVtb3ZlQXR0ciggImlkIiApOwoJCQl9CgkJfSk7Cgl9Cn0pOwoKLy8gc2VsZWN0b3JzCmZ1bmN0aW9uIGZvY3VzYWJsZSggZWxlbWVudCwgaXNUYWJJbmRleE5vdE5hTiApIHsKCXZhciBtYXAsIG1hcE5hbWUsIGltZywKCQlub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCWlmICggImFyZWEiID09PSBub2RlTmFtZSApIHsKCQltYXAgPSBlbGVtZW50LnBhcmVudE5vZGU7CgkJbWFwTmFtZSA9IG1hcC5uYW1lOwoJCWlmICggIWVsZW1lbnQuaHJlZiB8fCAhbWFwTmFtZSB8fCBtYXAubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm1hcCIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJaW1nID0gJCggImltZ1t1c2VtYXA9IyIgKyBtYXBOYW1lICsgIl0iIClbMF07CgkJcmV0dXJuICEhaW1nICYmIHZpc2libGUoIGltZyApOwoJfQoJcmV0dXJuICggL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0Ly50ZXN0KCBub2RlTmFtZSApID8KCQkhZWxlbWVudC5kaXNhYmxlZCA6CgkJImEiID09PSBub2RlTmFtZSA/CgkJCWVsZW1lbnQuaHJlZiB8fCBpc1RhYkluZGV4Tm90TmFOIDoKCQkJaXNUYWJJbmRleE5vdE5hTikgJiYKCQkvLyB0aGUgZWxlbWVudCBhbmQgYWxsIG9mIGl0cyBhbmNlc3RvcnMgbXVzdCBiZSB2aXNpYmxlCgkJdmlzaWJsZSggZWxlbWVudCApOwp9CgpmdW5jdGlvbiB2aXNpYmxlKCBlbGVtZW50ICkgewoJcmV0dXJuICQuZXhwci5maWx0ZXJzLnZpc2libGUoIGVsZW1lbnQgKSAmJgoJCSEkKCBlbGVtZW50ICkucGFyZW50cygpLmFuZFNlbGYoKS5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCXJldHVybiAkLmNzcyggdGhpcywgInZpc2liaWxpdHkiICkgPT09ICJoaWRkZW4iOwoJCX0pLmxlbmd0aDsKfQoKJC5leHRlbmQoICQuZXhwclsgIjoiIF0sIHsKCWRhdGE6ICQuZXhwci5jcmVhdGVQc2V1ZG8gPwoJCSQuZXhwci5jcmVhdGVQc2V1ZG8oZnVuY3Rpb24oIGRhdGFOYW1lICkgewoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQlyZXR1cm4gISEkLmRhdGEoIGVsZW0sIGRhdGFOYW1lICk7CgkJCX07CgkJfSkgOgoJCS8vIHN1cHBvcnQ6IGpRdWVyeSA8MS44CgkJZnVuY3Rpb24oIGVsZW0sIGksIG1hdGNoICkgewoJCQlyZXR1cm4gISEkLmRhdGEoIGVsZW0sIG1hdGNoWyAzIF0gKTsKCQl9LAoKCWZvY3VzYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJcmV0dXJuIGZvY3VzYWJsZSggZWxlbWVudCwgIWlzTmFOKCAkLmF0dHIoIGVsZW1lbnQsICJ0YWJpbmRleCIgKSApICk7Cgl9LAoKCXRhYmJhYmxlOiBmdW5jdGlvbiggZWxlbWVudCApIHsKCQl2YXIgdGFiSW5kZXggPSAkLmF0dHIoIGVsZW1lbnQsICJ0YWJpbmRleCIgKSwKCQkJaXNUYWJJbmRleE5hTiA9IGlzTmFOKCB0YWJJbmRleCApOwoJCXJldHVybiAoIGlzVGFiSW5kZXhOYU4gfHwgdGFiSW5kZXggPj0gMCApICYmIGZvY3VzYWJsZSggZWxlbWVudCwgIWlzVGFiSW5kZXhOYU4gKTsKCX0KfSk7CgovLyBzdXBwb3J0CiQoZnVuY3Rpb24oKSB7Cgl2YXIgYm9keSA9IGRvY3VtZW50LmJvZHksCgkJZGl2ID0gYm9keS5hcHBlbmRDaGlsZCggZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSApOwoKCS8vIGFjY2VzcyBvZmZzZXRIZWlnaHQgYmVmb3JlIHNldHRpbmcgdGhlIHN0eWxlIHRvIHByZXZlbnQgYSBsYXlvdXQgYnVnCgkvLyBpbiBJRSA5IHdoaWNoIGNhdXNlcyB0aGUgZWxlbWVudCB0byBjb250aW51ZSB0byB0YWtlIHVwIHNwYWNlIGV2ZW4KCS8vIGFmdGVyIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NICgjODAyNikKCWRpdi5vZmZzZXRIZWlnaHQ7CgoJJC5leHRlbmQoIGRpdi5zdHlsZSwgewoJCW1pbkhlaWdodDogIjEwMHB4IiwKCQloZWlnaHQ6ICJhdXRvIiwKCQlwYWRkaW5nOiAwLAoJCWJvcmRlcldpZHRoOiAwCgl9KTsKCgkkLnN1cHBvcnQubWluSGVpZ2h0ID0gZGl2Lm9mZnNldEhlaWdodCA9PT0gMTAwOwoJJC5zdXBwb3J0LnNlbGVjdHN0YXJ0ID0gIm9uc2VsZWN0c3RhcnQiIGluIGRpdjsKCgkvLyBzZXQgZGlzcGxheSB0byBub25lIHRvIGF2b2lkIGEgbGF5b3V0IGJ1ZyBpbiBJRQoJLy8gaHR0cDovL2Rldi5qcXVlcnkuY29tL3RpY2tldC80MDE0Cglib2R5LnJlbW92ZUNoaWxkKCBkaXYgKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwp9KTsKCi8vIHN1cHBvcnQ6IGpRdWVyeSA8MS44CmlmICggISQoICI8YT4iICkub3V0ZXJXaWR0aCggMSApLmpxdWVyeSApIHsKCSQuZWFjaCggWyAiV2lkdGgiLCAiSGVpZ2h0IiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCQl2YXIgc2lkZSA9IG5hbWUgPT09ICJXaWR0aCIgPyBbICJMZWZ0IiwgIlJpZ2h0IiBdIDogWyAiVG9wIiwgIkJvdHRvbSIgXSwKCQkJdHlwZSA9IG5hbWUudG9Mb3dlckNhc2UoKSwKCQkJb3JpZyA9IHsKCQkJCWlubmVyV2lkdGg6ICQuZm4uaW5uZXJXaWR0aCwKCQkJCWlubmVySGVpZ2h0OiAkLmZuLmlubmVySGVpZ2h0LAoJCQkJb3V0ZXJXaWR0aDogJC5mbi5vdXRlcldpZHRoLAoJCQkJb3V0ZXJIZWlnaHQ6ICQuZm4ub3V0ZXJIZWlnaHQKCQkJfTsKCgkJZnVuY3Rpb24gcmVkdWNlKCBlbGVtLCBzaXplLCBib3JkZXIsIG1hcmdpbiApIHsKCQkJJC5lYWNoKCBzaWRlLCBmdW5jdGlvbigpIHsKCQkJCXNpemUgLT0gcGFyc2VGbG9hdCggJC5jc3MoIGVsZW0sICJwYWRkaW5nIiArIHRoaXMgKSApIHx8IDA7CgkJCQlpZiAoIGJvcmRlciApIHsKCQkJCQlzaXplIC09IHBhcnNlRmxvYXQoICQuY3NzKCBlbGVtLCAiYm9yZGVyIiArIHRoaXMgKyAiV2lkdGgiICkgKSB8fCAwOwoJCQkJfQoJCQkJaWYgKCBtYXJnaW4gKSB7CgkJCQkJc2l6ZSAtPSBwYXJzZUZsb2F0KCAkLmNzcyggZWxlbSwgIm1hcmdpbiIgKyB0aGlzICkgKSB8fCAwOwoJCQkJfQoJCQl9KTsKCQkJcmV0dXJuIHNpemU7CgkJfQoKCQkkLmZuWyAiaW5uZXIiICsgbmFtZSBdID0gZnVuY3Rpb24oIHNpemUgKSB7CgkJCWlmICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgewoJCQkJcmV0dXJuIG9yaWdbICJpbm5lciIgKyBuYW1lIF0uY2FsbCggdGhpcyApOwoJCQl9CgoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJJCggdGhpcyApLmNzcyggdHlwZSwgcmVkdWNlKCB0aGlzLCBzaXplICkgKyAicHgiICk7CgkJCX0pOwoJCX07CgoJCSQuZm5bICJvdXRlciIgKyBuYW1lXSA9IGZ1bmN0aW9uKCBzaXplLCBtYXJnaW4gKSB7CgkJCWlmICggdHlwZW9mIHNpemUgIT09ICJudW1iZXIiICkgewoJCQkJcmV0dXJuIG9yaWdbICJvdXRlciIgKyBuYW1lIF0uY2FsbCggdGhpcywgc2l6ZSApOwoJCQl9CgoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJJCggdGhpcykuY3NzKCB0eXBlLCByZWR1Y2UoIHRoaXMsIHNpemUsIHRydWUsIG1hcmdpbiApICsgInB4IiApOwoJCQl9KTsKCQl9OwoJfSk7Cn0KCi8vIHN1cHBvcnQ6IGpRdWVyeSAxLjYuMSwgMS42LjIgKGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0Lzk0MTMpCmlmICggJCggIjxhPiIgKS5kYXRhKCAiYS1iIiwgImEiICkucmVtb3ZlRGF0YSggImEtYiIgKS5kYXRhKCAiYS1iIiApICkgewoJJC5mbi5yZW1vdmVEYXRhID0gKGZ1bmN0aW9uKCByZW1vdmVEYXRhICkgewoJCXJldHVybiBmdW5jdGlvbigga2V5ICkgewoJCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCQlyZXR1cm4gcmVtb3ZlRGF0YS5jYWxsKCB0aGlzLCAkLmNhbWVsQ2FzZSgga2V5ICkgKTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiByZW1vdmVEYXRhLmNhbGwoIHRoaXMgKTsKCQkJfQoJCX07Cgl9KSggJC5mbi5yZW1vdmVEYXRhICk7Cn0KCgoKCgovLyBkZXByZWNhdGVkCgooZnVuY3Rpb24oKSB7Cgl2YXIgdWFNYXRjaCA9IC9tc2llIChbXHcuXSspLy5leGVjKCBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkgKSB8fCBbXTsKCSQudWkuaWUgPSB1YU1hdGNoLmxlbmd0aCA/IHRydWUgOiBmYWxzZTsKCSQudWkuaWU2ID0gcGFyc2VGbG9hdCggdWFNYXRjaFsgMSBdLCAxMCApID09PSA2Owp9KSgpOwoKJC5mbi5leHRlbmQoewoJZGlzYWJsZVNlbGVjdGlvbjogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuYmluZCggKCAkLnN1cHBvcnQuc2VsZWN0c3RhcnQgPyAic2VsZWN0c3RhcnQiIDogIm1vdXNlZG93biIgKSArCgkJCSIudWktZGlzYWJsZVNlbGVjdGlvbiIsIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCX0pOwoJfSwKCgllbmFibGVTZWxlY3Rpb246IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnVuYmluZCggIi51aS1kaXNhYmxlU2VsZWN0aW9uIiApOwoJfQp9KTsKCiQuZXh0ZW5kKCAkLnVpLCB7CgkvLyAkLnVpLnBsdWdpbiBpcyBkZXByZWNhdGVkLiAgVXNlIHRoZSBwcm94eSBwYXR0ZXJuIGluc3RlYWQuCglwbHVnaW46IHsKCQlhZGQ6IGZ1bmN0aW9uKCBtb2R1bGUsIG9wdGlvbiwgc2V0ICkgewoJCQl2YXIgaSwKCQkJCXByb3RvID0gJC51aVsgbW9kdWxlIF0ucHJvdG90eXBlOwoJCQlmb3IgKCBpIGluIHNldCApIHsKCQkJCXByb3RvLnBsdWdpbnNbIGkgXSA9IHByb3RvLnBsdWdpbnNbIGkgXSB8fCBbXTsKCQkJCXByb3RvLnBsdWdpbnNbIGkgXS5wdXNoKCBbIG9wdGlvbiwgc2V0WyBpIF0gXSApOwoJCQl9CgkJfSwKCQljYWxsOiBmdW5jdGlvbiggaW5zdGFuY2UsIG5hbWUsIGFyZ3MgKSB7CgkJCXZhciBpLAoJCQkJc2V0ID0gaW5zdGFuY2UucGx1Z2luc1sgbmFtZSBdOwoJCQlpZiAoICFzZXQgfHwgIWluc3RhbmNlLmVsZW1lbnRbIDAgXS5wYXJlbnROb2RlIHx8IGluc3RhbmNlLmVsZW1lbnRbIDAgXS5wYXJlbnROb2RlLm5vZGVUeXBlID09PSAxMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJZm9yICggaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIGluc3RhbmNlLm9wdGlvbnNbIHNldFsgaSBdWyAwIF0gXSApIHsKCQkJCQlzZXRbIGkgXVsgMSBdLmFwcGx5KCBpbnN0YW5jZS5lbGVtZW50LCBhcmdzICk7CgkJCQl9CgkJCX0KCQl9Cgl9LAoKCWNvbnRhaW5zOiAkLmNvbnRhaW5zLAoKCS8vIG9ubHkgdXNlZCBieSByZXNpemFibGUKCWhhc1Njcm9sbDogZnVuY3Rpb24oIGVsLCBhICkgewoKCQkvL0lmIG92ZXJmbG93IGlzIGhpZGRlbiwgdGhlIGVsZW1lbnQgbWlnaHQgaGF2ZSBleHRyYSBjb250ZW50LCBidXQgdGhlIHVzZXIgd2FudHMgdG8gaGlkZSBpdAoJCWlmICggJCggZWwgKS5jc3MoICJvdmVyZmxvdyIgKSA9PT0gImhpZGRlbiIpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJdmFyIHNjcm9sbCA9ICggYSAmJiBhID09PSAibGVmdCIgKSA/ICJzY3JvbGxMZWZ0IiA6ICJzY3JvbGxUb3AiLAoJCQloYXMgPSBmYWxzZTsKCgkJaWYgKCBlbFsgc2Nyb2xsIF0gPiAwICkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCS8vIFRPRE86IGRldGVybWluZSB3aGljaCBjYXNlcyBhY3R1YWxseSBjYXVzZSB0aGlzIHRvIGhhcHBlbgoJCS8vIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSB0aGUgc2Nyb2xsIHNldCwgc2VlIGlmIGl0J3MgcG9zc2libGUgdG8KCQkvLyBzZXQgdGhlIHNjcm9sbAoJCWVsWyBzY3JvbGwgXSA9IDE7CgkJaGFzID0gKCBlbFsgc2Nyb2xsIF0gPiAwICk7CgkJZWxbIHNjcm9sbCBdID0gMDsKCQlyZXR1cm4gaGFzOwoJfSwKCgkvLyB0aGVzZSBhcmUgb2RkIGZ1bmN0aW9ucywgZml4IHRoZSBBUEkgb3IgbW92ZSBpbnRvIGluZGl2aWR1YWwgcGx1Z2lucwoJaXNPdmVyQXhpczogZnVuY3Rpb24oIHgsIHJlZmVyZW5jZSwgc2l6ZSApIHsKCQkvL0RldGVybWluZXMgd2hlbiB4IGNvb3JkaW5hdGUgaXMgb3ZlciAiYiIgZWxlbWVudCBheGlzCgkJcmV0dXJuICggeCA+IHJlZmVyZW5jZSApICYmICggeCA8ICggcmVmZXJlbmNlICsgc2l6ZSApICk7Cgl9LAoJaXNPdmVyOiBmdW5jdGlvbiggeSwgeCwgdG9wLCBsZWZ0LCBoZWlnaHQsIHdpZHRoICkgewoJCS8vRGV0ZXJtaW5lcyB3aGVuIHgsIHkgY29vcmRpbmF0ZXMgaXMgb3ZlciAiYiIgZWxlbWVudAoJCXJldHVybiAkLnVpLmlzT3ZlckF4aXMoIHksIHRvcCwgaGVpZ2h0ICkgJiYgJC51aS5pc092ZXJBeGlzKCB4LCBsZWZ0LCB3aWR0aCApOwoJfQp9KTsKCn0pKCBqUXVlcnkgKTsKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7Cgp2YXIgdXVpZCA9IDAsCglzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZSwKCV9jbGVhbkRhdGEgPSAkLmNsZWFuRGF0YTsKJC5jbGVhbkRhdGEgPSBmdW5jdGlvbiggZWxlbXMgKSB7Cglmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsKCQl0cnkgewoJCQkkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoICJyZW1vdmUiICk7CgkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvODIzNQoJCX0gY2F0Y2goIGUgKSB7fQoJfQoJX2NsZWFuRGF0YSggZWxlbXMgKTsKfTsKCiQud2lkZ2V0ID0gZnVuY3Rpb24oIG5hbWUsIGJhc2UsIHByb3RvdHlwZSApIHsKCXZhciBmdWxsTmFtZSwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgY29uc3RydWN0b3IsIGJhc2VQcm90b3R5cGUsCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAkLmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CgkJCXByb3RvdHlwZVsgcHJvcCBdID0gKGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9zdXBlciA9IGZ1bmN0aW9uKCkgewoJCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQkJfSwKCQkJCQlfc3VwZXJBcHBseSA9IGZ1bmN0aW9uKCBhcmdzICkgewoJCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJCX07CgkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQkJX19zdXBlckFwcGx5ID0gdGhpcy5fc3VwZXJBcHBseSwKCQkJCQkJcmV0dXJuVmFsdWU7CgoJCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfc3VwZXJBcHBseTsKCgkJCQkJcmV0dXJuVmFsdWUgPSB2YWx1ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgoJCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCQl0aGlzLl9zdXBlckFwcGx5ID0gX19zdXBlckFwcGx5OwoKCQkJCQlyZXR1cm4gcmV0dXJuVmFsdWU7CgkJCQl9OwoJCQl9KSgpOwoJCX0KCX0pOwoJY29uc3RydWN0b3IucHJvdG90eXBlID0gJC53aWRnZXQuZXh0ZW5kKCBiYXNlUHJvdG90eXBlLCB7CgkJLy8gVE9ETzogcmVtb3ZlIHN1cHBvcnQgZm9yIHdpZGdldEV2ZW50UHJlZml4CgkJLy8gYWx3YXlzIHVzZSB0aGUgbmFtZSArIGEgY29sb24gYXMgdGhlIHByZWZpeCwgZS5nLiwgZHJhZ2dhYmxlOnN0YXJ0CgkJLy8gZG9uJ3QgcHJlZml4IGZvciB3aWRnZXRzIHRoYXQgYXJlbid0IERPTS1iYXNlZAoJCXdpZGdldEV2ZW50UHJlZml4OiBleGlzdGluZ0NvbnN0cnVjdG9yID8gYmFzZVByb3RvdHlwZS53aWRnZXRFdmVudFByZWZpeCA6IG5hbWUKCX0sIHByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCS8vIFRPRE8gcmVtb3ZlIHdpZGdldEJhc2VDbGFzcywgc2VlICM4MTU1CgkJd2lkZ2V0QmFzZUNsYXNzOiBmdWxsTmFtZSwKCQl3aWRnZXRGdWxsTmFtZTogZnVsbE5hbWUKCX0pOwoKCS8vIElmIHRoaXMgd2lkZ2V0IGlzIGJlaW5nIHJlZGVmaW5lZCB0aGVuIHdlIG5lZWQgdG8gZmluZCBhbGwgd2lkZ2V0cyB0aGF0CgkvLyBhcmUgaW5oZXJpdGluZyBmcm9tIGl0IGFuZCByZWRlZmluZSBhbGwgb2YgdGhlbSBzbyB0aGF0IHRoZXkgaW5oZXJpdCBmcm9tCgkvLyB0aGUgbmV3IHZlcnNpb24gb2YgdGhpcyB3aWRnZXQuIFdlJ3JlIGVzc2VudGlhbGx5IHRyeWluZyB0byByZXBsYWNlIG9uZQoJLy8gbGV2ZWwgaW4gdGhlIHByb3RvdHlwZSBjaGFpbi4KCWlmICggZXhpc3RpbmdDb25zdHJ1Y3RvciApIHsKCQkkLmVhY2goIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzLCBmdW5jdGlvbiggaSwgY2hpbGQgKSB7CgkJCXZhciBjaGlsZFByb3RvdHlwZSA9IGNoaWxkLnByb3RvdHlwZTsKCgkJCS8vIHJlZGVmaW5lIHRoZSBjaGlsZCB3aWRnZXQgdXNpbmcgdGhlIHNhbWUgcHJvdG90eXBlIHRoYXQgd2FzCgkJCS8vIG9yaWdpbmFsbHkgdXNlZCwgYnV0IGluaGVyaXQgZnJvbSB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGJhc2UKCQkJJC53aWRnZXQoIGNoaWxkUHJvdG90eXBlLm5hbWVzcGFjZSArICIuIiArIGNoaWxkUHJvdG90eXBlLndpZGdldE5hbWUsIGNvbnN0cnVjdG9yLCBjaGlsZC5fcHJvdG8gKTsKCQl9KTsKCQkvLyByZW1vdmUgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgY2hpbGQgY29uc3RydWN0b3JzIGZyb20gdGhlIG9sZCBjb25zdHJ1Y3RvcgoJCS8vIHNvIHRoZSBvbGQgY2hpbGQgY29uc3RydWN0b3JzIGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZAoJCWRlbGV0ZSBleGlzdGluZ0NvbnN0cnVjdG9yLl9jaGlsZENvbnN0cnVjdG9yczsKCX0gZWxzZSB7CgkJYmFzZS5fY2hpbGRDb25zdHJ1Y3RvcnMucHVzaCggY29uc3RydWN0b3IgKTsKCX0KCgkkLndpZGdldC5icmlkZ2UoIG5hbWUsIGNvbnN0cnVjdG9yICk7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAxICksCgkJaW5wdXRJbmRleCA9IDAsCgkJaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGgsCgkJa2V5LAoJCXZhbHVlOwoJZm9yICggOyBpbnB1dEluZGV4IDwgaW5wdXRMZW5ndGg7IGlucHV0SW5kZXgrKyApIHsKCQlmb3IgKCBrZXkgaW4gaW5wdXRbIGlucHV0SW5kZXggXSApIHsKCQkJdmFsdWUgPSBpbnB1dFsgaW5wdXRJbmRleCBdWyBrZXkgXTsKCQkJaWYgKCBpbnB1dFsgaW5wdXRJbmRleCBdLmhhc093blByb3BlcnR5KCBrZXkgKSAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJLy8gQ2xvbmUgb2JqZWN0cwoJCQkJaWYgKCAkLmlzUGxhaW5PYmplY3QoIHZhbHVlICkgKSB7CgkJCQkJdGFyZ2V0WyBrZXkgXSA9ICQuaXNQbGFpbk9iamVjdCggdGFyZ2V0WyBrZXkgXSApID8KCQkJCQkJJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGFyZ2V0WyBrZXkgXSwgdmFsdWUgKSA6CgkJCQkJCS8vIERvbid0IGV4dGVuZCBzdHJpbmdzLCBhcnJheXMsIGV0Yy4gd2l0aCBvYmplY3RzCgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHZhbHVlICk7CgkJCQkvLyBDb3B5IGV2ZXJ5dGhpbmcgZWxzZSBieSByZWZlcmVuY2UKCQkJCX0gZWxzZSB7CgkJCQkJdGFyZ2V0WyBrZXkgXSA9IHZhbHVlOwoJCQkJfQoJCQl9CgkJfQoJfQoJcmV0dXJuIHRhcmdldDsKfTsKCiQud2lkZ2V0LmJyaWRnZSA9IGZ1bmN0aW9uKCBuYW1lLCBvYmplY3QgKSB7Cgl2YXIgZnVsbE5hbWUgPSBvYmplY3QucHJvdG90eXBlLndpZGdldEZ1bGxOYW1lIHx8IG5hbWU7CgkkLmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIgaXNNZXRob2RDYWxsID0gdHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmciLAoJCQlhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAxICksCgkJCXJldHVyblZhbHVlID0gdGhpczsKCgkJLy8gYWxsb3cgbXVsdGlwbGUgaGFzaGVzIHRvIGJlIHBhc3NlZCBvbiBpbml0CgkJb3B0aW9ucyA9ICFpc01ldGhvZENhbGwgJiYgYXJncy5sZW5ndGggPwoJCQkkLndpZGdldC5leHRlbmQuYXBwbHkoIG51bGwsIFsgb3B0aW9ucyBdLmNvbmNhdChhcmdzKSApIDoKCQkJb3B0aW9uczsKCgkJaWYgKCBpc01ldGhvZENhbGwgKSB7CgkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCXZhciBtZXRob2RWYWx1ZSwKCQkJCQlpbnN0YW5jZSA9ICQuZGF0YSggdGhpcywgZnVsbE5hbWUgKTsKCQkJCWlmICggIWluc3RhbmNlICkgewoJCQkJCXJldHVybiAkLmVycm9yKCAiY2Fubm90IGNhbGwgbWV0aG9kcyBvbiAiICsgbmFtZSArICIgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb247ICIgKwoJCQkJCQkiYXR0ZW1wdGVkIHRvIGNhbGwgbWV0aG9kICciICsgb3B0aW9ucyArICInIiApOwoJCQkJfQoJCQkJaWYgKCAhJC5pc0Z1bmN0aW9uKCBpbnN0YW5jZVtvcHRpb25zXSApIHx8IG9wdGlvbnMuY2hhckF0KCAwICkgPT09ICJfIiApIHsKCQkJCQlyZXR1cm4gJC5lcnJvciggIm5vIHN1Y2ggbWV0aG9kICciICsgb3B0aW9ucyArICInIGZvciAiICsgbmFtZSArICIgd2lkZ2V0IGluc3RhbmNlIiApOwoJCQkJfQoJCQkJbWV0aG9kVmFsdWUgPSBpbnN0YW5jZVsgb3B0aW9ucyBdLmFwcGx5KCBpbnN0YW5jZSwgYXJncyApOwoJCQkJaWYgKCBtZXRob2RWYWx1ZSAhPT0gaW5zdGFuY2UgJiYgbWV0aG9kVmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCQlyZXR1cm5WYWx1ZSA9IG1ldGhvZFZhbHVlICYmIG1ldGhvZFZhbHVlLmpxdWVyeSA/CgkJCQkJCXJldHVyblZhbHVlLnB1c2hTdGFjayggbWV0aG9kVmFsdWUuZ2V0KCkgKSA6CgkJCQkJCW1ldGhvZFZhbHVlOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBpbnN0YW5jZSApIHsKCQkJCQlpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKS5faW5pdCgpOwoJCQkJfSBlbHNlIHsKCQkJCQkkLmRhdGEoIHRoaXMsIGZ1bGxOYW1lLCBuZXcgb2JqZWN0KCBvcHRpb25zLCB0aGlzICkgKTsKCQkJCX0KCQkJfSk7CgkJfQoKCQlyZXR1cm4gcmV0dXJuVmFsdWU7Cgl9Owp9OwoKJC5XaWRnZXQgPSBmdW5jdGlvbiggLyogb3B0aW9ucywgZWxlbWVudCAqLyApIHt9OwokLldpZGdldC5fY2hpbGRDb25zdHJ1Y3RvcnMgPSBbXTsKCiQuV2lkZ2V0LnByb3RvdHlwZSA9IHsKCXdpZGdldE5hbWU6ICJ3aWRnZXQiLAoJd2lkZ2V0RXZlbnRQcmVmaXg6ICIiLAoJZGVmYXVsdEVsZW1lbnQ6ICI8ZGl2PiIsCglvcHRpb25zOiB7CgkJZGlzYWJsZWQ6IGZhbHNlLAoKCQkvLyBjYWxsYmFja3MKCQljcmVhdGU6IG51bGwKCX0sCglfY3JlYXRlV2lkZ2V0OiBmdW5jdGlvbiggb3B0aW9ucywgZWxlbWVudCApIHsKCQllbGVtZW50ID0gJCggZWxlbWVudCB8fCB0aGlzLmRlZmF1bHRFbGVtZW50IHx8IHRoaXMgKVsgMCBdOwoJCXRoaXMuZWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQl0aGlzLnV1aWQgPSB1dWlkKys7CgkJdGhpcy5ldmVudE5hbWVzcGFjZSA9ICIuIiArIHRoaXMud2lkZ2V0TmFtZSArIHRoaXMudXVpZDsKCQl0aGlzLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LAoJCQl0aGlzLm9wdGlvbnMsCgkJCXRoaXMuX2dldENyZWF0ZU9wdGlvbnMoKSwKCQkJb3B0aW9ucyApOwoKCQl0aGlzLmJpbmRpbmdzID0gJCgpOwoJCXRoaXMuaG92ZXJhYmxlID0gJCgpOwoJCXRoaXMuZm9jdXNhYmxlID0gJCgpOwoKCQlpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7CgkJCS8vIDEuOSBCQyBmb3IgIzc4MTAKCQkJLy8gVE9ETyByZW1vdmUgZHVhbCBzdG9yYWdlCgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXROYW1lLCB0aGlzICk7CgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxsTmFtZSwgdGhpcyApOwoJCQl0aGlzLl9vbiggdHJ1ZSwgdGhpcy5lbGVtZW50LCB7CgkJCQlyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIGV2ZW50LnRhcmdldCA9PT0gZWxlbWVudCApIHsKCQkJCQkJdGhpcy5kZXN0cm95KCk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQkJdGhpcy5kb2N1bWVudCA9ICQoIGVsZW1lbnQuc3R5bGUgPwoJCQkJLy8gZWxlbWVudCB3aXRoaW4gdGhlIGRvY3VtZW50CgkJCQllbGVtZW50Lm93bmVyRG9jdW1lbnQgOgoJCQkJLy8gZWxlbWVudCBpcyB3aW5kb3cgb3IgZG9jdW1lbnQKCQkJCWVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCApOwoJCQl0aGlzLndpbmRvdyA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cgKTsKCQl9CgoJCXRoaXMuX2NyZWF0ZSgpOwoJCXRoaXMuX3RyaWdnZXIoICJjcmVhdGUiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApOwoJCXRoaXMuX2luaXQoKTsKCX0sCglfZ2V0Q3JlYXRlT3B0aW9uczogJC5ub29wLAoJX2dldENyZWF0ZUV2ZW50RGF0YTogJC5ub29wLAoJX2NyZWF0ZTogJC5ub29wLAoJX2luaXQ6ICQubm9vcCwKCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9kZXN0cm95KCk7CgkJLy8gd2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMAoJCS8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpCgkJdGhpcy5lbGVtZW50CgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkvLyAxLjkgQkMgZm9yICM3ODEwCgkJCS8vIFRPRE8gcmVtb3ZlIGR1YWwgc3RvcmFnZQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXROYW1lICkKCQkJLnJlbW92ZURhdGEoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKQoJCQkvLyBzdXBwb3J0OiBqcXVlcnkgPDEuNi4zCgkJCS8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0Lzk0MTMKCQkJLnJlbW92ZURhdGEoICQuY2FtZWxDYXNlKCB0aGlzLndpZGdldEZ1bGxOYW1lICkgKTsKCQl0aGlzLndpZGdldCgpCgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtZGlzYWJsZWQiICkKCQkJLnJlbW92ZUNsYXNzKAoJCQkJdGhpcy53aWRnZXRGdWxsTmFtZSArICItZGlzYWJsZWQgIiArCgkJCQkidWktc3RhdGUtZGlzYWJsZWQiICk7CgoJCS8vIGNsZWFuIHVwIGV2ZW50cyBhbmQgc3RhdGVzCgkJdGhpcy5iaW5kaW5ncy51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKTsKCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCXRoaXMuZm9jdXNhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtZm9jdXMiICk7Cgl9LAoJX2Rlc3Ryb3k6ICQubm9vcCwKCgl3aWRnZXQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmVsZW1lbnQ7Cgl9LAoKCW9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJdmFyIG9wdGlvbnMgPSBrZXksCgkJCXBhcnRzLAoJCQljdXJPcHRpb24sCgkJCWk7CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMCApIHsKCQkJLy8gZG9uJ3QgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbCBoYXNoCgkJCXJldHVybiAkLndpZGdldC5leHRlbmQoIHt9LCB0aGlzLm9wdGlvbnMgKTsKCQl9CgoJCWlmICggdHlwZW9mIGtleSA9PT0gInN0cmluZyIgKSB7CgkJCS8vIGhhbmRsZSBuZXN0ZWQga2V5cywgZS5nLiwgImZvby5iYXIiID0+IHsgZm9vOiB7IGJhcjogX19fIH0gfQoJCQlvcHRpb25zID0ge307CgkJCXBhcnRzID0ga2V5LnNwbGl0KCAiLiIgKTsKCQkJa2V5ID0gcGFydHMuc2hpZnQoKTsKCQkJaWYgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCQljdXJPcHRpb24gPSBvcHRpb25zWyBrZXkgXSA9ICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9uc1sga2V5IF0gKTsKCQkJCWZvciAoIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrICkgewoJCQkJCWN1ck9wdGlvblsgcGFydHNbIGkgXSBdID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gfHwge307CgkJCQkJY3VyT3B0aW9uID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF07CgkJCQl9CgkJCQlrZXkgPSBwYXJ0cy5wb3AoKTsKCQkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJCQlyZXR1cm4gY3VyT3B0aW9uWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGN1ck9wdGlvblsga2V5IF07CgkJCQl9CgkJCQljdXJPcHRpb25bIGtleSBdID0gdmFsdWU7CgkJCX0gZWxzZSB7CgkJCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIHRoaXMub3B0aW9uc1sga2V5IF0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiB0aGlzLm9wdGlvbnNbIGtleSBdOwoJCQkJfQoJCQkJb3B0aW9uc1sga2V5IF0gPSB2YWx1ZTsKCQkJfQoJCX0KCgkJdGhpcy5fc2V0T3B0aW9ucyggb3B0aW9ucyApOwoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uczogZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGtleTsKCgkJZm9yICgga2V5IGluIG9wdGlvbnMgKSB7CgkJCXRoaXMuX3NldE9wdGlvbigga2V5LCBvcHRpb25zWyBrZXkgXSApOwoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJdGhpcy5vcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoKCQlpZiAoIGtleSA9PT0gImRpc2FibGVkIiApIHsKCQkJdGhpcy53aWRnZXQoKQoJCQkJLnRvZ2dsZUNsYXNzKCB0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCB1aS1zdGF0ZS1kaXNhYmxlZCIsICEhdmFsdWUgKQoJCQkJLmF0dHIoICJhcmlhLWRpc2FibGVkIiwgdmFsdWUgKTsKCQkJdGhpcy5ob3ZlcmFibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgllbmFibGU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLl9zZXRPcHRpb24oICJkaXNhYmxlZCIsIGZhbHNlICk7Cgl9LAoJZGlzYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbiggImRpc2FibGVkIiwgdHJ1ZSApOwoJfSwKCglfb246IGZ1bmN0aW9uKCBzdXBwcmVzc0Rpc2FibGVkQ2hlY2ssIGVsZW1lbnQsIGhhbmRsZXJzICkgewoJCXZhciBkZWxlZ2F0ZUVsZW1lbnQsCgkJCWluc3RhbmNlID0gdGhpczsKCgkJLy8gbm8gc3VwcHJlc3NEaXNhYmxlZENoZWNrIGZsYWcsIHNodWZmbGUgYXJndW1lbnRzCgkJaWYgKCB0eXBlb2Ygc3VwcHJlc3NEaXNhYmxlZENoZWNrICE9PSAiYm9vbGVhbiIgKSB7CgkJCWhhbmRsZXJzID0gZWxlbWVudDsKCQkJZWxlbWVudCA9IHN1cHByZXNzRGlzYWJsZWRDaGVjazsKCQkJc3VwcHJlc3NEaXNhYmxlZENoZWNrID0gZmFsc2U7CgkJfQoKCQkvLyBubyBlbGVtZW50IGFyZ3VtZW50LCBzaHVmZmxlIGFuZCB1c2UgdGhpcy5lbGVtZW50CgkJaWYgKCAhaGFuZGxlcnMgKSB7CgkJCWhhbmRsZXJzID0gZWxlbWVudDsKCQkJZWxlbWVudCA9IHRoaXMuZWxlbWVudDsKCQkJZGVsZWdhdGVFbGVtZW50ID0gdGhpcy53aWRnZXQoKTsKCQl9IGVsc2UgewoJCQkvLyBhY2NlcHQgc2VsZWN0b3JzLCBET00gZWxlbWVudHMKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmCgkJCQkJCSggaW5zdGFuY2Uub3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCQkJJCggdGhpcyApLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJCX0KCgkJCS8vIGNvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3JrcwoJCQlpZiAoIHR5cGVvZiBoYW5kbGVyICE9PSAic3RyaW5nIiApIHsKCQkJCWhhbmRsZXJQcm94eS5ndWlkID0gaGFuZGxlci5ndWlkID0KCQkJCQloYW5kbGVyLmd1aWQgfHwgaGFuZGxlclByb3h5Lmd1aWQgfHwgJC5ndWlkKys7CgkJCX0KCgkJCXZhciBtYXRjaCA9IGV2ZW50Lm1hdGNoKCAvXihcdyspXHMqKC4qKSQvICksCgkJCQlldmVudE5hbWUgPSBtYXRjaFsxXSArIGluc3RhbmNlLmV2ZW50TmFtZXNwYWNlLAoJCQkJc2VsZWN0b3IgPSBtYXRjaFsyXTsKCQkJaWYgKCBzZWxlY3RvciApIHsKCQkJCWRlbGVnYXRlRWxlbWVudC5kZWxlZ2F0ZSggc2VsZWN0b3IsIGV2ZW50TmFtZSwgaGFuZGxlclByb3h5ICk7CgkJCX0gZWxzZSB7CgkJCQllbGVtZW50LmJpbmQoIGV2ZW50TmFtZSwgaGFuZGxlclByb3h5ICk7CgkJCX0KCQl9KTsKCX0sCgoJX29mZjogZnVuY3Rpb24oIGVsZW1lbnQsIGV2ZW50TmFtZSApIHsKCQlldmVudE5hbWUgPSAoZXZlbnROYW1lIHx8ICIiKS5zcGxpdCggIiAiICkuam9pbiggdGhpcy5ldmVudE5hbWVzcGFjZSArICIgIiApICsgdGhpcy5ldmVudE5hbWVzcGFjZTsKCQllbGVtZW50LnVuYmluZCggZXZlbnROYW1lICkudW5kZWxlZ2F0ZSggZXZlbnROYW1lICk7Cgl9LAoKCV9kZWxheTogZnVuY3Rpb24oIGhhbmRsZXIsIGRlbGF5ICkgewoJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJcmV0dXJuICggdHlwZW9mIGhhbmRsZXIgPT09ICJzdHJpbmciID8gaW5zdGFuY2VbIGhhbmRsZXIgXSA6IGhhbmRsZXIgKQoJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJfQoJCXZhciBpbnN0YW5jZSA9IHRoaXM7CgkJcmV0dXJuIHNldFRpbWVvdXQoIGhhbmRsZXJQcm94eSwgZGVsYXkgfHwgMCApOwoJfSwKCglfaG92ZXJhYmxlOiBmdW5jdGlvbiggZWxlbWVudCApIHsKCQl0aGlzLmhvdmVyYWJsZSA9IHRoaXMuaG92ZXJhYmxlLmFkZCggZWxlbWVudCApOwoJCXRoaXMuX29uKCBlbGVtZW50LCB7CgkJCW1vdXNlZW50ZXI6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5hZGRDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQl9LAoJCQltb3VzZWxlYXZlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfQoJCX0pOwoJfSwKCglfZm9jdXNhYmxlOiBmdW5jdGlvbiggZWxlbWVudCApIHsKCQl0aGlzLmZvY3VzYWJsZSA9IHRoaXMuZm9jdXNhYmxlLmFkZCggZWxlbWVudCApOwoJCXRoaXMuX29uKCBlbGVtZW50LCB7CgkJCWZvY3VzaW46IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5hZGRDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQl9LAoJCQlmb2N1c291dDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtZm9jdXMiICk7CgkJCX0KCQl9KTsKCX0sCgoJX3RyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBldmVudCwgZGF0YSApIHsKCQl2YXIgcHJvcCwgb3JpZywKCQkJY2FsbGJhY2sgPSB0aGlzLm9wdGlvbnNbIHR5cGUgXTsKCgkJZGF0YSA9IGRhdGEgfHwge307CgkJZXZlbnQgPSAkLkV2ZW50KCBldmVudCApOwoJCWV2ZW50LnR5cGUgPSAoIHR5cGUgPT09IHRoaXMud2lkZ2V0RXZlbnRQcmVmaXggPwoJCQl0eXBlIDoKCQkJdGhpcy53aWRnZXRFdmVudFByZWZpeCArIHR5cGUgKS50b0xvd2VyQ2FzZSgpOwoJCS8vIHRoZSBvcmlnaW5hbCBldmVudCBtYXkgY29tZSBmcm9tIGFueSBlbGVtZW50CgkJLy8gc28gd2UgbmVlZCB0byByZXNldCB0aGUgdGFyZ2V0IG9uIHRoZSBuZXcgZXZlbnQKCQlldmVudC50YXJnZXQgPSB0aGlzLmVsZW1lbnRbIDAgXTsKCgkJLy8gY29weSBvcmlnaW5hbCBldmVudCBwcm9wZXJ0aWVzIG92ZXIgdG8gdGhlIG5ldyBldmVudAoJCW9yaWcgPSBldmVudC5vcmlnaW5hbEV2ZW50OwoJCWlmICggb3JpZyApIHsKCQkJZm9yICggcHJvcCBpbiBvcmlnICkgewoJCQkJaWYgKCAhKCBwcm9wIGluIGV2ZW50ICkgKSB7CgkJCQkJZXZlbnRbIHByb3AgXSA9IG9yaWdbIHByb3AgXTsKCQkJCX0KCQkJfQoJCX0KCgkJdGhpcy5lbGVtZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhICk7CgkJcmV0dXJuICEoICQuaXNGdW5jdGlvbiggY2FsbGJhY2sgKSAmJgoJCQljYWxsYmFjay5hcHBseSggdGhpcy5lbGVtZW50WzBdLCBbIGV2ZW50IF0uY29uY2F0KCBkYXRhICkgKSA9PT0gZmFsc2UgfHwKCQkJZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKTsKCX0KfTsKCiQuZWFjaCggeyBzaG93OiAiZmFkZUluIiwgaGlkZTogImZhZGVPdXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIGRlZmF1bHRFZmZlY3QgKSB7CgkkLldpZGdldC5wcm90b3R5cGVbICJfIiArIG1ldGhvZCBdID0gZnVuY3Rpb24oIGVsZW1lbnQsIG9wdGlvbnMsIGNhbGxiYWNrICkgewoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmciICkgewoJCQlvcHRpb25zID0geyBlZmZlY3Q6IG9wdGlvbnMgfTsKCQl9CgkJdmFyIGhhc09wdGlvbnMsCgkJCWVmZmVjdE5hbWUgPSAhb3B0aW9ucyA/CgkJCQltZXRob2QgOgoJCQkJb3B0aW9ucyA9PT0gdHJ1ZSB8fCB0eXBlb2Ygb3B0aW9ucyA9PT0gIm51bWJlciIgPwoJCQkJCWRlZmF1bHRFZmZlY3QgOgoJCQkJCW9wdGlvbnMuZWZmZWN0IHx8IGRlZmF1bHRFZmZlY3Q7CgkJb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgkJaWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gIm51bWJlciIgKSB7CgkJCW9wdGlvbnMgPSB7IGR1cmF0aW9uOiBvcHRpb25zIH07CgkJfQoJCWhhc09wdGlvbnMgPSAhJC5pc0VtcHR5T2JqZWN0KCBvcHRpb25zICk7CgkJb3B0aW9ucy5jb21wbGV0ZSA9IGNhbGxiYWNrOwoJCWlmICggb3B0aW9ucy5kZWxheSApIHsKCQkJZWxlbWVudC5kZWxheSggb3B0aW9ucy5kZWxheSApOwoJCX0KCQlpZiAoIGhhc09wdGlvbnMgJiYgJC5lZmZlY3RzICYmICggJC5lZmZlY3RzLmVmZmVjdFsgZWZmZWN0TmFtZSBdIHx8ICQudWlCYWNrQ29tcGF0ICE9PSBmYWxzZSAmJiAkLmVmZmVjdHNbIGVmZmVjdE5hbWUgXSApICkgewoJCQllbGVtZW50WyBtZXRob2QgXSggb3B0aW9ucyApOwoJCX0gZWxzZSBpZiAoIGVmZmVjdE5hbWUgIT09IG1ldGhvZCAmJiBlbGVtZW50WyBlZmZlY3ROYW1lIF0gKSB7CgkJCWVsZW1lbnRbIGVmZmVjdE5hbWUgXSggb3B0aW9ucy5kdXJhdGlvbiwgb3B0aW9ucy5lYXNpbmcsIGNhbGxiYWNrICk7CgkJfSBlbHNlIHsKCQkJZWxlbWVudC5xdWV1ZShmdW5jdGlvbiggbmV4dCApIHsKCQkJCSQoIHRoaXMgKVsgbWV0aG9kIF0oKTsKCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJY2FsbGJhY2suY2FsbCggZWxlbWVudFsgMCBdICk7CgkJCQl9CgkJCQluZXh0KCk7CgkJCX0pOwoJCX0KCX07Cn0pOwoKLy8gREVQUkVDQVRFRAppZiAoICQudWlCYWNrQ29tcGF0ICE9PSBmYWxzZSApIHsKCSQuV2lkZ2V0LnByb3RvdHlwZS5fZ2V0Q3JlYXRlT3B0aW9ucyA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiAkLm1ldGFkYXRhICYmICQubWV0YWRhdGEuZ2V0KCB0aGlzLmVsZW1lbnRbMF0gKVsgdGhpcy53aWRnZXROYW1lIF07Cgl9Owp9Cgp9KSggalF1ZXJ5ICk7CihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKdmFyIG1vdXNlSGFuZGxlZCA9IGZhbHNlOwokKCBkb2N1bWVudCApLm1vdXNldXAoIGZ1bmN0aW9uKCBlICkgewoJbW91c2VIYW5kbGVkID0gZmFsc2U7Cn0pOwoKJC53aWRnZXQoInVpLm1vdXNlIiwgewoJdmVyc2lvbjogIjEuOS4yIiwKCW9wdGlvbnM6IHsKCQljYW5jZWw6ICdpbnB1dCx0ZXh0YXJlYSxidXR0b24sc2VsZWN0LG9wdGlvbicsCgkJZGlzdGFuY2U6IDEsCgkJZGVsYXk6IDAKCX0sCglfbW91c2VJbml0OiBmdW5jdGlvbigpIHsKCQl2YXIgdGhhdCA9IHRoaXM7CgoJCXRoaXMuZWxlbWVudAoJCQkuYmluZCgnbW91c2Vkb3duLicrdGhpcy53aWRnZXROYW1lLCBmdW5jdGlvbihldmVudCkgewoJCQkJcmV0dXJuIHRoYXQuX21vdXNlRG93bihldmVudCk7CgkJCX0pCgkJCS5iaW5kKCdjbGljay4nK3RoaXMud2lkZ2V0TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHsKCQkJCWlmICh0cnVlID09PSAkLmRhdGEoZXZlbnQudGFyZ2V0LCB0aGF0LndpZGdldE5hbWUgKyAnLnByZXZlbnRDbGlja0V2ZW50JykpIHsKCQkJCQkkLnJlbW92ZURhdGEoZXZlbnQudGFyZ2V0LCB0aGF0LndpZGdldE5hbWUgKyAnLnByZXZlbnRDbGlja0V2ZW50Jyk7CgkJCQkJZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCgkJdGhpcy5zdGFydGVkID0gZmFsc2U7Cgl9LAoKCS8vIFRPRE86IG1ha2Ugc3VyZSBkZXN0cm95aW5nIG9uZSBpbnN0YW5jZSBvZiBtb3VzZSBkb2Vzbid0IG1lc3Mgd2l0aAoJLy8gb3RoZXIgaW5zdGFuY2VzIG9mIG1vdXNlCglfbW91c2VEZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLmVsZW1lbnQudW5iaW5kKCcuJyt0aGlzLndpZGdldE5hbWUpOwoJCWlmICggdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGUgKSB7CgkJCSQoZG9jdW1lbnQpCgkJCQkudW5iaW5kKCdtb3VzZW1vdmUuJyt0aGlzLndpZGdldE5hbWUsIHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKQoJCQkJLnVuYmluZCgnbW91c2V1cC4nK3RoaXMud2lkZ2V0TmFtZSwgdGhpcy5fbW91c2VVcERlbGVnYXRlKTsKCQl9Cgl9LAoKCV9tb3VzZURvd246IGZ1bmN0aW9uKGV2ZW50KSB7CgkJLy8gZG9uJ3QgbGV0IG1vcmUgdGhhbiBvbmUgd2lkZ2V0IGhhbmRsZSBtb3VzZVN0YXJ0CgkJaWYoIG1vdXNlSGFuZGxlZCApIHsgcmV0dXJuOyB9CgoJCS8vIHdlIG1heSBoYXZlIG1pc3NlZCBtb3VzZXVwIChvdXQgb2Ygd2luZG93KQoJCSh0aGlzLl9tb3VzZVN0YXJ0ZWQgJiYgdGhpcy5fbW91c2VVcChldmVudCkpOwoKCQl0aGlzLl9tb3VzZURvd25FdmVudCA9IGV2ZW50OwoKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCWJ0bklzTGVmdCA9IChldmVudC53aGljaCA9PT0gMSksCgkJCS8vIGV2ZW50LnRhcmdldC5ub2RlTmFtZSB3b3JrcyBhcm91bmQgYSBidWcgaW4gSUUgOCB3aXRoCgkJCS8vIGRpc2FibGVkIGlucHV0cyAoIzc2MjApCgkJCWVsSXNDYW5jZWwgPSAodHlwZW9mIHRoaXMub3B0aW9ucy5jYW5jZWwgPT09ICJzdHJpbmciICYmIGV2ZW50LnRhcmdldC5ub2RlTmFtZSA/ICQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KHRoaXMub3B0aW9ucy5jYW5jZWwpLmxlbmd0aCA6IGZhbHNlKTsKCQlpZiAoIWJ0bklzTGVmdCB8fCBlbElzQ2FuY2VsIHx8ICF0aGlzLl9tb3VzZUNhcHR1cmUoZXZlbnQpKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCgkJdGhpcy5tb3VzZURlbGF5TWV0ID0gIXRoaXMub3B0aW9ucy5kZWxheTsKCQlpZiAoIXRoaXMubW91c2VEZWxheU1ldCkgewoJCQl0aGlzLl9tb3VzZURlbGF5VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJdGhhdC5tb3VzZURlbGF5TWV0ID0gdHJ1ZTsKCQkJfSwgdGhpcy5vcHRpb25zLmRlbGF5KTsKCQl9CgoJCWlmICh0aGlzLl9tb3VzZURpc3RhbmNlTWV0KGV2ZW50KSAmJiB0aGlzLl9tb3VzZURlbGF5TWV0KGV2ZW50KSkgewoJCQl0aGlzLl9tb3VzZVN0YXJ0ZWQgPSAodGhpcy5fbW91c2VTdGFydChldmVudCkgIT09IGZhbHNlKTsKCQkJaWYgKCF0aGlzLl9tb3VzZVN0YXJ0ZWQpIHsKCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCgkJLy8gQ2xpY2sgZXZlbnQgbWF5IG5ldmVyIGhhdmUgZmlyZWQgKEdlY2tvICYgT3BlcmEpCgkJaWYgKHRydWUgPT09ICQuZGF0YShldmVudC50YXJnZXQsIHRoaXMud2lkZ2V0TmFtZSArICcucHJldmVudENsaWNrRXZlbnQnKSkgewoJCQkkLnJlbW92ZURhdGEoZXZlbnQudGFyZ2V0LCB0aGlzLndpZGdldE5hbWUgKyAnLnByZXZlbnRDbGlja0V2ZW50Jyk7CgkJfQoKCQkvLyB0aGVzZSBkZWxlZ2F0ZXMgYXJlIHJlcXVpcmVkIHRvIGtlZXAgY29udGV4dAoJCXRoaXMuX21vdXNlTW92ZURlbGVnYXRlID0gZnVuY3Rpb24oZXZlbnQpIHsKCQkJcmV0dXJuIHRoYXQuX21vdXNlTW92ZShldmVudCk7CgkJfTsKCQl0aGlzLl9tb3VzZVVwRGVsZWdhdGUgPSBmdW5jdGlvbihldmVudCkgewoJCQlyZXR1cm4gdGhhdC5fbW91c2VVcChldmVudCk7CgkJfTsKCQkkKGRvY3VtZW50KQoJCQkuYmluZCgnbW91c2Vtb3ZlLicrdGhpcy53aWRnZXROYW1lLCB0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkKCQkJLmJpbmQoJ21vdXNldXAuJyt0aGlzLndpZGdldE5hbWUsIHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSk7CgoJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCW1vdXNlSGFuZGxlZCA9IHRydWU7CgkJcmV0dXJuIHRydWU7Cgl9LAoKCV9tb3VzZU1vdmU6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJLy8gSUUgbW91c2V1cCBjaGVjayAtIG1vdXNldXAgaGFwcGVuZWQgd2hlbiBtb3VzZSB3YXMgb3V0IG9mIHdpbmRvdwoJCWlmICgkLnVpLmllICYmICEoZG9jdW1lbnQuZG9jdW1lbnRNb2RlID49IDkpICYmICFldmVudC5idXR0b24pIHsKCQkJcmV0dXJuIHRoaXMuX21vdXNlVXAoZXZlbnQpOwoJCX0KCgkJaWYgKHRoaXMuX21vdXNlU3RhcnRlZCkgewoJCQl0aGlzLl9tb3VzZURyYWcoZXZlbnQpOwoJCQlyZXR1cm4gZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQl9CgoJCWlmICh0aGlzLl9tb3VzZURpc3RhbmNlTWV0KGV2ZW50KSAmJiB0aGlzLl9tb3VzZURlbGF5TWV0KGV2ZW50KSkgewoJCQl0aGlzLl9tb3VzZVN0YXJ0ZWQgPQoJCQkJKHRoaXMuX21vdXNlU3RhcnQodGhpcy5fbW91c2VEb3duRXZlbnQsIGV2ZW50KSAhPT0gZmFsc2UpOwoJCQkodGhpcy5fbW91c2VTdGFydGVkID8gdGhpcy5fbW91c2VEcmFnKGV2ZW50KSA6IHRoaXMuX21vdXNlVXAoZXZlbnQpKTsKCQl9CgoJCXJldHVybiAhdGhpcy5fbW91c2VTdGFydGVkOwoJfSwKCglfbW91c2VVcDogZnVuY3Rpb24oZXZlbnQpIHsKCQkkKGRvY3VtZW50KQoJCQkudW5iaW5kKCdtb3VzZW1vdmUuJyt0aGlzLndpZGdldE5hbWUsIHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKQoJCQkudW5iaW5kKCdtb3VzZXVwLicrdGhpcy53aWRnZXROYW1lLCB0aGlzLl9tb3VzZVVwRGVsZWdhdGUpOwoKCQlpZiAodGhpcy5fbW91c2VTdGFydGVkKSB7CgkJCXRoaXMuX21vdXNlU3RhcnRlZCA9IGZhbHNlOwoKCQkJaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fbW91c2VEb3duRXZlbnQudGFyZ2V0KSB7CgkJCQkkLmRhdGEoZXZlbnQudGFyZ2V0LCB0aGlzLndpZGdldE5hbWUgKyAnLnByZXZlbnRDbGlja0V2ZW50JywgdHJ1ZSk7CgkJCX0KCgkJCXRoaXMuX21vdXNlU3RvcChldmVudCk7CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCV9tb3VzZURpc3RhbmNlTWV0OiBmdW5jdGlvbihldmVudCkgewoJCXJldHVybiAoTWF0aC5tYXgoCgkJCQlNYXRoLmFicyh0aGlzLl9tb3VzZURvd25FdmVudC5wYWdlWCAtIGV2ZW50LnBhZ2VYKSwKCQkJCU1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VZIC0gZXZlbnQucGFnZVkpCgkJCSkgPj0gdGhpcy5vcHRpb25zLmRpc3RhbmNlCgkJKTsKCX0sCgoJX21vdXNlRGVsYXlNZXQ6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJcmV0dXJuIHRoaXMubW91c2VEZWxheU1ldDsKCX0sCgoJLy8gVGhlc2UgYXJlIHBsYWNlaG9sZGVyIG1ldGhvZHMsIHRvIGJlIG92ZXJyaWRlbiBieSBleHRlbmRpbmcgcGx1Z2luCglfbW91c2VTdGFydDogZnVuY3Rpb24oZXZlbnQpIHt9LAoJX21vdXNlRHJhZzogZnVuY3Rpb24oZXZlbnQpIHt9LAoJX21vdXNlU3RvcDogZnVuY3Rpb24oZXZlbnQpIHt9LAoJX21vdXNlQ2FwdHVyZTogZnVuY3Rpb24oZXZlbnQpIHsgcmV0dXJuIHRydWU7IH0KfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCiQudWkgPSAkLnVpIHx8IHt9OwoKdmFyIGNhY2hlZFNjcm9sbGJhcldpZHRoLAoJbWF4ID0gTWF0aC5tYXgsCglhYnMgPSBNYXRoLmFicywKCXJvdW5kID0gTWF0aC5yb3VuZCwKCXJob3Jpem9udGFsID0gL2xlZnR8Y2VudGVyfHJpZ2h0LywKCXJ2ZXJ0aWNhbCA9IC90b3B8Y2VudGVyfGJvdHRvbS8sCglyb2Zmc2V0ID0gL1tcK1wtXVxkKyU/LywKCXJwb3NpdGlvbiA9IC9eXHcrLywKCXJwZXJjZW50ID0gLyUkLywKCV9wb3NpdGlvbiA9ICQuZm4ucG9zaXRpb247CgpmdW5jdGlvbiBnZXRPZmZzZXRzKCBvZmZzZXRzLCB3aWR0aCwgaGVpZ2h0ICkgewoJcmV0dXJuIFsKCQlwYXJzZUludCggb2Zmc2V0c1sgMCBdLCAxMCApICogKCBycGVyY2VudC50ZXN0KCBvZmZzZXRzWyAwIF0gKSA/IHdpZHRoIC8gMTAwIDogMSApLAoJCXBhcnNlSW50KCBvZmZzZXRzWyAxIF0sIDEwICkgKiAoIHJwZXJjZW50LnRlc3QoIG9mZnNldHNbIDEgXSApID8gaGVpZ2h0IC8gMTAwIDogMSApCgldOwp9CmZ1bmN0aW9uIHBhcnNlQ3NzKCBlbGVtZW50LCBwcm9wZXJ0eSApIHsKCXJldHVybiBwYXJzZUludCggJC5jc3MoIGVsZW1lbnQsIHByb3BlcnR5ICksIDEwICkgfHwgMDsKfQoKJC5wb3NpdGlvbiA9IHsKCXNjcm9sbGJhcldpZHRoOiBmdW5jdGlvbigpIHsKCQlpZiAoIGNhY2hlZFNjcm9sbGJhcldpZHRoICE9PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiBjYWNoZWRTY3JvbGxiYXJXaWR0aDsKCQl9CgkJdmFyIHcxLCB3MiwKCQkJZGl2ID0gJCggIjxkaXYgc3R5bGU9J2Rpc3BsYXk6YmxvY2s7d2lkdGg6NTBweDtoZWlnaHQ6NTBweDtvdmVyZmxvdzpoaWRkZW47Jz48ZGl2IHN0eWxlPSdoZWlnaHQ6MTAwcHg7d2lkdGg6YXV0bzsnPjwvZGl2PjwvZGl2PiIgKSwKCQkJaW5uZXJEaXYgPSBkaXYuY2hpbGRyZW4oKVswXTsKCgkJJCggImJvZHkiICkuYXBwZW5kKCBkaXYgKTsKCQl3MSA9IGlubmVyRGl2Lm9mZnNldFdpZHRoOwoJCWRpdi5jc3MoICJvdmVyZmxvdyIsICJzY3JvbGwiICk7CgoJCXcyID0gaW5uZXJEaXYub2Zmc2V0V2lkdGg7CgoJCWlmICggdzEgPT09IHcyICkgewoJCQl3MiA9IGRpdlswXS5jbGllbnRXaWR0aDsKCQl9CgoJCWRpdi5yZW1vdmUoKTsKCgkJcmV0dXJuIChjYWNoZWRTY3JvbGxiYXJXaWR0aCA9IHcxIC0gdzIpOwoJfSwKCWdldFNjcm9sbEluZm86IGZ1bmN0aW9uKCB3aXRoaW4gKSB7CgkJdmFyIG92ZXJmbG93WCA9IHdpdGhpbi5pc1dpbmRvdyA/ICIiIDogd2l0aGluLmVsZW1lbnQuY3NzKCAib3ZlcmZsb3cteCIgKSwKCQkJb3ZlcmZsb3dZID0gd2l0aGluLmlzV2luZG93ID8gIiIgOiB3aXRoaW4uZWxlbWVudC5jc3MoICJvdmVyZmxvdy15IiApLAoJCQloYXNPdmVyZmxvd1ggPSBvdmVyZmxvd1ggPT09ICJzY3JvbGwiIHx8CgkJCQkoIG92ZXJmbG93WCA9PT0gImF1dG8iICYmIHdpdGhpbi53aWR0aCA8IHdpdGhpbi5lbGVtZW50WzBdLnNjcm9sbFdpZHRoICksCgkJCWhhc092ZXJmbG93WSA9IG92ZXJmbG93WSA9PT0gInNjcm9sbCIgfHwKCQkJCSggb3ZlcmZsb3dZID09PSAiYXV0byIgJiYgd2l0aGluLmhlaWdodCA8IHdpdGhpbi5lbGVtZW50WzBdLnNjcm9sbEhlaWdodCApOwoJCXJldHVybiB7CgkJCXdpZHRoOiBoYXNPdmVyZmxvd1ggPyAkLnBvc2l0aW9uLnNjcm9sbGJhcldpZHRoKCkgOiAwLAoJCQloZWlnaHQ6IGhhc092ZXJmbG93WSA/ICQucG9zaXRpb24uc2Nyb2xsYmFyV2lkdGgoKSA6IDAKCQl9OwoJfSwKCWdldFdpdGhpbkluZm86IGZ1bmN0aW9uKCBlbGVtZW50ICkgewoJCXZhciB3aXRoaW5FbGVtZW50ID0gJCggZWxlbWVudCB8fCB3aW5kb3cgKSwKCQkJaXNXaW5kb3cgPSAkLmlzV2luZG93KCB3aXRoaW5FbGVtZW50WzBdICk7CgkJcmV0dXJuIHsKCQkJZWxlbWVudDogd2l0aGluRWxlbWVudCwKCQkJaXNXaW5kb3c6IGlzV2luZG93LAoJCQlvZmZzZXQ6IHdpdGhpbkVsZW1lbnQub2Zmc2V0KCkgfHwgeyBsZWZ0OiAwLCB0b3A6IDAgfSwKCQkJc2Nyb2xsTGVmdDogd2l0aGluRWxlbWVudC5zY3JvbGxMZWZ0KCksCgkJCXNjcm9sbFRvcDogd2l0aGluRWxlbWVudC5zY3JvbGxUb3AoKSwKCQkJd2lkdGg6IGlzV2luZG93ID8gd2l0aGluRWxlbWVudC53aWR0aCgpIDogd2l0aGluRWxlbWVudC5vdXRlcldpZHRoKCksCgkJCWhlaWdodDogaXNXaW5kb3cgPyB3aXRoaW5FbGVtZW50LmhlaWdodCgpIDogd2l0aGluRWxlbWVudC5vdXRlckhlaWdodCgpCgkJfTsKCX0KfTsKCiQuZm4ucG9zaXRpb24gPSBmdW5jdGlvbiggb3B0aW9ucyApIHsKCWlmICggIW9wdGlvbnMgfHwgIW9wdGlvbnMub2YgKSB7CgkJcmV0dXJuIF9wb3NpdGlvbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7Cgl9CgoJLy8gbWFrZSBhIGNvcHksIHdlIGRvbid0IHdhbnQgdG8gbW9kaWZ5IGFyZ3VtZW50cwoJb3B0aW9ucyA9ICQuZXh0ZW5kKCB7fSwgb3B0aW9ucyApOwoKCXZhciBhdE9mZnNldCwgdGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodCwgdGFyZ2V0T2Zmc2V0LCBiYXNlUG9zaXRpb24sCgkJdGFyZ2V0ID0gJCggb3B0aW9ucy5vZiApLAoJCXdpdGhpbiA9ICQucG9zaXRpb24uZ2V0V2l0aGluSW5mbyggb3B0aW9ucy53aXRoaW4gKSwKCQlzY3JvbGxJbmZvID0gJC5wb3NpdGlvbi5nZXRTY3JvbGxJbmZvKCB3aXRoaW4gKSwKCQl0YXJnZXRFbGVtID0gdGFyZ2V0WzBdLAoJCWNvbGxpc2lvbiA9ICggb3B0aW9ucy5jb2xsaXNpb24gfHwgImZsaXAiICkuc3BsaXQoICIgIiApLAoJCW9mZnNldHMgPSB7fTsKCglpZiAoIHRhcmdldEVsZW0ubm9kZVR5cGUgPT09IDkgKSB7CgkJdGFyZ2V0V2lkdGggPSB0YXJnZXQud2lkdGgoKTsKCQl0YXJnZXRIZWlnaHQgPSB0YXJnZXQuaGVpZ2h0KCk7CgkJdGFyZ2V0T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTsKCX0gZWxzZSBpZiAoICQuaXNXaW5kb3coIHRhcmdldEVsZW0gKSApIHsKCQl0YXJnZXRXaWR0aCA9IHRhcmdldC53aWR0aCgpOwoJCXRhcmdldEhlaWdodCA9IHRhcmdldC5oZWlnaHQoKTsKCQl0YXJnZXRPZmZzZXQgPSB7IHRvcDogdGFyZ2V0LnNjcm9sbFRvcCgpLCBsZWZ0OiB0YXJnZXQuc2Nyb2xsTGVmdCgpIH07Cgl9IGVsc2UgaWYgKCB0YXJnZXRFbGVtLnByZXZlbnREZWZhdWx0ICkgewoJCS8vIGZvcmNlIGxlZnQgdG9wIHRvIGFsbG93IGZsaXBwaW5nCgkJb3B0aW9ucy5hdCA9ICJsZWZ0IHRvcCI7CgkJdGFyZ2V0V2lkdGggPSB0YXJnZXRIZWlnaHQgPSAwOwoJCXRhcmdldE9mZnNldCA9IHsgdG9wOiB0YXJnZXRFbGVtLnBhZ2VZLCBsZWZ0OiB0YXJnZXRFbGVtLnBhZ2VYIH07Cgl9IGVsc2UgewoJCXRhcmdldFdpZHRoID0gdGFyZ2V0Lm91dGVyV2lkdGgoKTsKCQl0YXJnZXRIZWlnaHQgPSB0YXJnZXQub3V0ZXJIZWlnaHQoKTsKCQl0YXJnZXRPZmZzZXQgPSB0YXJnZXQub2Zmc2V0KCk7Cgl9CgkvLyBjbG9uZSB0byByZXVzZSBvcmlnaW5hbCB0YXJnZXRPZmZzZXQgbGF0ZXIKCWJhc2VQb3NpdGlvbiA9ICQuZXh0ZW5kKCB7fSwgdGFyZ2V0T2Zmc2V0ICk7CgoJLy8gZm9yY2UgbXkgYW5kIGF0IHRvIGhhdmUgdmFsaWQgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgcG9zaXRpb25zCgkvLyBpZiBhIHZhbHVlIGlzIG1pc3Npbmcgb3IgaW52YWxpZCwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gY2VudGVyCgkkLmVhY2goIFsgIm15IiwgImF0IiBdLCBmdW5jdGlvbigpIHsKCQl2YXIgcG9zID0gKCBvcHRpb25zWyB0aGlzIF0gfHwgIiIgKS5zcGxpdCggIiAiICksCgkJCWhvcml6b250YWxPZmZzZXQsCgkJCXZlcnRpY2FsT2Zmc2V0OwoKCQlpZiAoIHBvcy5sZW5ndGggPT09IDEpIHsKCQkJcG9zID0gcmhvcml6b250YWwudGVzdCggcG9zWyAwIF0gKSA/CgkJCQlwb3MuY29uY2F0KCBbICJjZW50ZXIiIF0gKSA6CgkJCQlydmVydGljYWwudGVzdCggcG9zWyAwIF0gKSA/CgkJCQkJWyAiY2VudGVyIiBdLmNvbmNhdCggcG9zICkgOgoJCQkJCVsgImNlbnRlciIsICJjZW50ZXIiIF07CgkJfQoJCXBvc1sgMCBdID0gcmhvcml6b250YWwudGVzdCggcG9zWyAwIF0gKSA/IHBvc1sgMCBdIDogImNlbnRlciI7CgkJcG9zWyAxIF0gPSBydmVydGljYWwudGVzdCggcG9zWyAxIF0gKSA/IHBvc1sgMSBdIDogImNlbnRlciI7CgoJCS8vIGNhbGN1bGF0ZSBvZmZzZXRzCgkJaG9yaXpvbnRhbE9mZnNldCA9IHJvZmZzZXQuZXhlYyggcG9zWyAwIF0gKTsKCQl2ZXJ0aWNhbE9mZnNldCA9IHJvZmZzZXQuZXhlYyggcG9zWyAxIF0gKTsKCQlvZmZzZXRzWyB0aGlzIF0gPSBbCgkJCWhvcml6b250YWxPZmZzZXQgPyBob3Jpem9udGFsT2Zmc2V0WyAwIF0gOiAwLAoJCQl2ZXJ0aWNhbE9mZnNldCA/IHZlcnRpY2FsT2Zmc2V0WyAwIF0gOiAwCgkJXTsKCgkJLy8gcmVkdWNlIHRvIGp1c3QgdGhlIHBvc2l0aW9ucyB3aXRob3V0IHRoZSBvZmZzZXRzCgkJb3B0aW9uc1sgdGhpcyBdID0gWwoJCQlycG9zaXRpb24uZXhlYyggcG9zWyAwIF0gKVsgMCBdLAoJCQlycG9zaXRpb24uZXhlYyggcG9zWyAxIF0gKVsgMCBdCgkJXTsKCX0pOwoKCS8vIG5vcm1hbGl6ZSBjb2xsaXNpb24gb3B0aW9uCglpZiAoIGNvbGxpc2lvbi5sZW5ndGggPT09IDEgKSB7CgkJY29sbGlzaW9uWyAxIF0gPSBjb2xsaXNpb25bIDAgXTsKCX0KCglpZiAoIG9wdGlvbnMuYXRbIDAgXSA9PT0gInJpZ2h0IiApIHsKCQliYXNlUG9zaXRpb24ubGVmdCArPSB0YXJnZXRXaWR0aDsKCX0gZWxzZSBpZiAoIG9wdGlvbnMuYXRbIDAgXSA9PT0gImNlbnRlciIgKSB7CgkJYmFzZVBvc2l0aW9uLmxlZnQgKz0gdGFyZ2V0V2lkdGggLyAyOwoJfQoKCWlmICggb3B0aW9ucy5hdFsgMSBdID09PSAiYm90dG9tIiApIHsKCQliYXNlUG9zaXRpb24udG9wICs9IHRhcmdldEhlaWdodDsKCX0gZWxzZSBpZiAoIG9wdGlvbnMuYXRbIDEgXSA9PT0gImNlbnRlciIgKSB7CgkJYmFzZVBvc2l0aW9uLnRvcCArPSB0YXJnZXRIZWlnaHQgLyAyOwoJfQoKCWF0T2Zmc2V0ID0gZ2V0T2Zmc2V0cyggb2Zmc2V0cy5hdCwgdGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodCApOwoJYmFzZVBvc2l0aW9uLmxlZnQgKz0gYXRPZmZzZXRbIDAgXTsKCWJhc2VQb3NpdGlvbi50b3AgKz0gYXRPZmZzZXRbIDEgXTsKCglyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCXZhciBjb2xsaXNpb25Qb3NpdGlvbiwgdXNpbmcsCgkJCWVsZW0gPSAkKCB0aGlzICksCgkJCWVsZW1XaWR0aCA9IGVsZW0ub3V0ZXJXaWR0aCgpLAoJCQllbGVtSGVpZ2h0ID0gZWxlbS5vdXRlckhlaWdodCgpLAoJCQltYXJnaW5MZWZ0ID0gcGFyc2VDc3MoIHRoaXMsICJtYXJnaW5MZWZ0IiApLAoJCQltYXJnaW5Ub3AgPSBwYXJzZUNzcyggdGhpcywgIm1hcmdpblRvcCIgKSwKCQkJY29sbGlzaW9uV2lkdGggPSBlbGVtV2lkdGggKyBtYXJnaW5MZWZ0ICsgcGFyc2VDc3MoIHRoaXMsICJtYXJnaW5SaWdodCIgKSArIHNjcm9sbEluZm8ud2lkdGgsCgkJCWNvbGxpc2lvbkhlaWdodCA9IGVsZW1IZWlnaHQgKyBtYXJnaW5Ub3AgKyBwYXJzZUNzcyggdGhpcywgIm1hcmdpbkJvdHRvbSIgKSArIHNjcm9sbEluZm8uaGVpZ2h0LAoJCQlwb3NpdGlvbiA9ICQuZXh0ZW5kKCB7fSwgYmFzZVBvc2l0aW9uICksCgkJCW15T2Zmc2V0ID0gZ2V0T2Zmc2V0cyggb2Zmc2V0cy5teSwgZWxlbS5vdXRlcldpZHRoKCksIGVsZW0ub3V0ZXJIZWlnaHQoKSApOwoKCQlpZiAoIG9wdGlvbnMubXlbIDAgXSA9PT0gInJpZ2h0IiApIHsKCQkJcG9zaXRpb24ubGVmdCAtPSBlbGVtV2lkdGg7CgkJfSBlbHNlIGlmICggb3B0aW9ucy5teVsgMCBdID09PSAiY2VudGVyIiApIHsKCQkJcG9zaXRpb24ubGVmdCAtPSBlbGVtV2lkdGggLyAyOwoJCX0KCgkJaWYgKCBvcHRpb25zLm15WyAxIF0gPT09ICJib3R0b20iICkgewoJCQlwb3NpdGlvbi50b3AgLT0gZWxlbUhlaWdodDsKCQl9IGVsc2UgaWYgKCBvcHRpb25zLm15WyAxIF0gPT09ICJjZW50ZXIiICkgewoJCQlwb3NpdGlvbi50b3AgLT0gZWxlbUhlaWdodCAvIDI7CgkJfQoKCQlwb3NpdGlvbi5sZWZ0ICs9IG15T2Zmc2V0WyAwIF07CgkJcG9zaXRpb24udG9wICs9IG15T2Zmc2V0WyAxIF07CgoJCS8vIGlmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBmcmFjdGlvbnMsIHRoZW4gcm91bmQgZm9yIGNvbnNpc3RlbnQgcmVzdWx0cwoJCWlmICggISQuc3VwcG9ydC5vZmZzZXRGcmFjdGlvbnMgKSB7CgkJCXBvc2l0aW9uLmxlZnQgPSByb3VuZCggcG9zaXRpb24ubGVmdCApOwoJCQlwb3NpdGlvbi50b3AgPSByb3VuZCggcG9zaXRpb24udG9wICk7CgkJfQoKCQljb2xsaXNpb25Qb3NpdGlvbiA9IHsKCQkJbWFyZ2luTGVmdDogbWFyZ2luTGVmdCwKCQkJbWFyZ2luVG9wOiBtYXJnaW5Ub3AKCQl9OwoKCQkkLmVhY2goIFsgImxlZnQiLCAidG9wIiBdLCBmdW5jdGlvbiggaSwgZGlyICkgewoJCQlpZiAoICQudWkucG9zaXRpb25bIGNvbGxpc2lvblsgaSBdIF0gKSB7CgkJCQkkLnVpLnBvc2l0aW9uWyBjb2xsaXNpb25bIGkgXSBdWyBkaXIgXSggcG9zaXRpb24sIHsKCQkJCQl0YXJnZXRXaWR0aDogdGFyZ2V0V2lkdGgsCgkJCQkJdGFyZ2V0SGVpZ2h0OiB0YXJnZXRIZWlnaHQsCgkJCQkJZWxlbVdpZHRoOiBlbGVtV2lkdGgsCgkJCQkJZWxlbUhlaWdodDogZWxlbUhlaWdodCwKCQkJCQljb2xsaXNpb25Qb3NpdGlvbjogY29sbGlzaW9uUG9zaXRpb24sCgkJCQkJY29sbGlzaW9uV2lkdGg6IGNvbGxpc2lvbldpZHRoLAoJCQkJCWNvbGxpc2lvbkhlaWdodDogY29sbGlzaW9uSGVpZ2h0LAoJCQkJCW9mZnNldDogWyBhdE9mZnNldFsgMCBdICsgbXlPZmZzZXRbIDAgXSwgYXRPZmZzZXQgWyAxIF0gKyBteU9mZnNldFsgMSBdIF0sCgkJCQkJbXk6IG9wdGlvbnMubXksCgkJCQkJYXQ6IG9wdGlvbnMuYXQsCgkJCQkJd2l0aGluOiB3aXRoaW4sCgkJCQkJZWxlbSA6IGVsZW0KCQkJCX0pOwoJCQl9CgkJfSk7CgoJCWlmICggJC5mbi5iZ2lmcmFtZSApIHsKCQkJZWxlbS5iZ2lmcmFtZSgpOwoJCX0KCgkJaWYgKCBvcHRpb25zLnVzaW5nICkgewoJCQkvLyBhZGRzIGZlZWRiYWNrIGFzIHNlY29uZCBhcmd1bWVudCB0byB1c2luZyBjYWxsYmFjaywgaWYgcHJlc2VudAoJCQl1c2luZyA9IGZ1bmN0aW9uKCBwcm9wcyApIHsKCQkJCXZhciBsZWZ0ID0gdGFyZ2V0T2Zmc2V0LmxlZnQgLSBwb3NpdGlvbi5sZWZ0LAoJCQkJCXJpZ2h0ID0gbGVmdCArIHRhcmdldFdpZHRoIC0gZWxlbVdpZHRoLAoJCQkJCXRvcCA9IHRhcmdldE9mZnNldC50b3AgLSBwb3NpdGlvbi50b3AsCgkJCQkJYm90dG9tID0gdG9wICsgdGFyZ2V0SGVpZ2h0IC0gZWxlbUhlaWdodCwKCQkJCQlmZWVkYmFjayA9IHsKCQkJCQkJdGFyZ2V0OiB7CgkJCQkJCQllbGVtZW50OiB0YXJnZXQsCgkJCQkJCQlsZWZ0OiB0YXJnZXRPZmZzZXQubGVmdCwKCQkJCQkJCXRvcDogdGFyZ2V0T2Zmc2V0LnRvcCwKCQkJCQkJCXdpZHRoOiB0YXJnZXRXaWR0aCwKCQkJCQkJCWhlaWdodDogdGFyZ2V0SGVpZ2h0CgkJCQkJCX0sCgkJCQkJCWVsZW1lbnQ6IHsKCQkJCQkJCWVsZW1lbnQ6IGVsZW0sCgkJCQkJCQlsZWZ0OiBwb3NpdGlvbi5sZWZ0LAoJCQkJCQkJdG9wOiBwb3NpdGlvbi50b3AsCgkJCQkJCQl3aWR0aDogZWxlbVdpZHRoLAoJCQkJCQkJaGVpZ2h0OiBlbGVtSGVpZ2h0CgkJCQkJCX0sCgkJCQkJCWhvcml6b250YWw6IHJpZ2h0IDwgMCA/ICJsZWZ0IiA6IGxlZnQgPiAwID8gInJpZ2h0IiA6ICJjZW50ZXIiLAoJCQkJCQl2ZXJ0aWNhbDogYm90dG9tIDwgMCA/ICJ0b3AiIDogdG9wID4gMCA/ICJib3R0b20iIDogIm1pZGRsZSIKCQkJCQl9OwoJCQkJaWYgKCB0YXJnZXRXaWR0aCA8IGVsZW1XaWR0aCAmJiBhYnMoIGxlZnQgKyByaWdodCApIDwgdGFyZ2V0V2lkdGggKSB7CgkJCQkJZmVlZGJhY2suaG9yaXpvbnRhbCA9ICJjZW50ZXIiOwoJCQkJfQoJCQkJaWYgKCB0YXJnZXRIZWlnaHQgPCBlbGVtSGVpZ2h0ICYmIGFicyggdG9wICsgYm90dG9tICkgPCB0YXJnZXRIZWlnaHQgKSB7CgkJCQkJZmVlZGJhY2sudmVydGljYWwgPSAibWlkZGxlIjsKCQkJCX0KCQkJCWlmICggbWF4KCBhYnMoIGxlZnQgKSwgYWJzKCByaWdodCApICkgPiBtYXgoIGFicyggdG9wICksIGFicyggYm90dG9tICkgKSApIHsKCQkJCQlmZWVkYmFjay5pbXBvcnRhbnQgPSAiaG9yaXpvbnRhbCI7CgkJCQl9IGVsc2UgewoJCQkJCWZlZWRiYWNrLmltcG9ydGFudCA9ICJ2ZXJ0aWNhbCI7CgkJCQl9CgkJCQlvcHRpb25zLnVzaW5nLmNhbGwoIHRoaXMsIHByb3BzLCBmZWVkYmFjayApOwoJCQl9OwoJCX0KCgkJZWxlbS5vZmZzZXQoICQuZXh0ZW5kKCBwb3NpdGlvbiwgeyB1c2luZzogdXNpbmcgfSApICk7Cgl9KTsKfTsKCiQudWkucG9zaXRpb24gPSB7CglmaXQ6IHsKCQlsZWZ0OiBmdW5jdGlvbiggcG9zaXRpb24sIGRhdGEgKSB7CgkJCXZhciB3aXRoaW4gPSBkYXRhLndpdGhpbiwKCQkJCXdpdGhpbk9mZnNldCA9IHdpdGhpbi5pc1dpbmRvdyA/IHdpdGhpbi5zY3JvbGxMZWZ0IDogd2l0aGluLm9mZnNldC5sZWZ0LAoJCQkJb3V0ZXJXaWR0aCA9IHdpdGhpbi53aWR0aCwKCQkJCWNvbGxpc2lvblBvc0xlZnQgPSBwb3NpdGlvbi5sZWZ0IC0gZGF0YS5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5MZWZ0LAoJCQkJb3ZlckxlZnQgPSB3aXRoaW5PZmZzZXQgLSBjb2xsaXNpb25Qb3NMZWZ0LAoJCQkJb3ZlclJpZ2h0ID0gY29sbGlzaW9uUG9zTGVmdCArIGRhdGEuY29sbGlzaW9uV2lkdGggLSBvdXRlcldpZHRoIC0gd2l0aGluT2Zmc2V0LAoJCQkJbmV3T3ZlclJpZ2h0OwoKCQkJLy8gZWxlbWVudCBpcyB3aWRlciB0aGFuIHdpdGhpbgoJCQlpZiAoIGRhdGEuY29sbGlzaW9uV2lkdGggPiBvdXRlcldpZHRoICkgewoJCQkJLy8gZWxlbWVudCBpcyBpbml0aWFsbHkgb3ZlciB0aGUgbGVmdCBzaWRlIG9mIHdpdGhpbgoJCQkJaWYgKCBvdmVyTGVmdCA+IDAgJiYgb3ZlclJpZ2h0IDw9IDAgKSB7CgkJCQkJbmV3T3ZlclJpZ2h0ID0gcG9zaXRpb24ubGVmdCArIG92ZXJMZWZ0ICsgZGF0YS5jb2xsaXNpb25XaWR0aCAtIG91dGVyV2lkdGggLSB3aXRoaW5PZmZzZXQ7CgkJCQkJcG9zaXRpb24ubGVmdCArPSBvdmVyTGVmdCAtIG5ld092ZXJSaWdodDsKCQkJCS8vIGVsZW1lbnQgaXMgaW5pdGlhbGx5IG92ZXIgcmlnaHQgc2lkZSBvZiB3aXRoaW4KCQkJCX0gZWxzZSBpZiAoIG92ZXJSaWdodCA+IDAgJiYgb3ZlckxlZnQgPD0gMCApIHsKCQkJCQlwb3NpdGlvbi5sZWZ0ID0gd2l0aGluT2Zmc2V0OwoJCQkJLy8gZWxlbWVudCBpcyBpbml0aWFsbHkgb3ZlciBib3RoIGxlZnQgYW5kIHJpZ2h0IHNpZGVzIG9mIHdpdGhpbgoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoIG92ZXJMZWZ0ID4gb3ZlclJpZ2h0ICkgewoJCQkJCQlwb3NpdGlvbi5sZWZ0ID0gd2l0aGluT2Zmc2V0ICsgb3V0ZXJXaWR0aCAtIGRhdGEuY29sbGlzaW9uV2lkdGg7CgkJCQkJfSBlbHNlIHsKCQkJCQkJcG9zaXRpb24ubGVmdCA9IHdpdGhpbk9mZnNldDsKCQkJCQl9CgkJCQl9CgkJCS8vIHRvbyBmYXIgbGVmdCAtPiBhbGlnbiB3aXRoIGxlZnQgZWRnZQoJCQl9IGVsc2UgaWYgKCBvdmVyTGVmdCA+IDAgKSB7CgkJCQlwb3NpdGlvbi5sZWZ0ICs9IG92ZXJMZWZ0OwoJCQkvLyB0b28gZmFyIHJpZ2h0IC0+IGFsaWduIHdpdGggcmlnaHQgZWRnZQoJCQl9IGVsc2UgaWYgKCBvdmVyUmlnaHQgPiAwICkgewoJCQkJcG9zaXRpb24ubGVmdCAtPSBvdmVyUmlnaHQ7CgkJCS8vIGFkanVzdCBiYXNlZCBvbiBwb3NpdGlvbiBhbmQgbWFyZ2luCgkJCX0gZWxzZSB7CgkJCQlwb3NpdGlvbi5sZWZ0ID0gbWF4KCBwb3NpdGlvbi5sZWZ0IC0gY29sbGlzaW9uUG9zTGVmdCwgcG9zaXRpb24ubGVmdCApOwoJCQl9CgkJfSwKCQl0b3A6IGZ1bmN0aW9uKCBwb3NpdGlvbiwgZGF0YSApIHsKCQkJdmFyIHdpdGhpbiA9IGRhdGEud2l0aGluLAoJCQkJd2l0aGluT2Zmc2V0ID0gd2l0aGluLmlzV2luZG93ID8gd2l0aGluLnNjcm9sbFRvcCA6IHdpdGhpbi5vZmZzZXQudG9wLAoJCQkJb3V0ZXJIZWlnaHQgPSBkYXRhLndpdGhpbi5oZWlnaHQsCgkJCQljb2xsaXNpb25Qb3NUb3AgPSBwb3NpdGlvbi50b3AgLSBkYXRhLmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpblRvcCwKCQkJCW92ZXJUb3AgPSB3aXRoaW5PZmZzZXQgLSBjb2xsaXNpb25Qb3NUb3AsCgkJCQlvdmVyQm90dG9tID0gY29sbGlzaW9uUG9zVG9wICsgZGF0YS5jb2xsaXNpb25IZWlnaHQgLSBvdXRlckhlaWdodCAtIHdpdGhpbk9mZnNldCwKCQkJCW5ld092ZXJCb3R0b207CgoJCQkvLyBlbGVtZW50IGlzIHRhbGxlciB0aGFuIHdpdGhpbgoJCQlpZiAoIGRhdGEuY29sbGlzaW9uSGVpZ2h0ID4gb3V0ZXJIZWlnaHQgKSB7CgkJCQkvLyBlbGVtZW50IGlzIGluaXRpYWxseSBvdmVyIHRoZSB0b3Agb2Ygd2l0aGluCgkJCQlpZiAoIG92ZXJUb3AgPiAwICYmIG92ZXJCb3R0b20gPD0gMCApIHsKCQkJCQluZXdPdmVyQm90dG9tID0gcG9zaXRpb24udG9wICsgb3ZlclRvcCArIGRhdGEuY29sbGlzaW9uSGVpZ2h0IC0gb3V0ZXJIZWlnaHQgLSB3aXRoaW5PZmZzZXQ7CgkJCQkJcG9zaXRpb24udG9wICs9IG92ZXJUb3AgLSBuZXdPdmVyQm90dG9tOwoJCQkJLy8gZWxlbWVudCBpcyBpbml0aWFsbHkgb3ZlciBib3R0b20gb2Ygd2l0aGluCgkJCQl9IGVsc2UgaWYgKCBvdmVyQm90dG9tID4gMCAmJiBvdmVyVG9wIDw9IDAgKSB7CgkJCQkJcG9zaXRpb24udG9wID0gd2l0aGluT2Zmc2V0OwoJCQkJLy8gZWxlbWVudCBpcyBpbml0aWFsbHkgb3ZlciBib3RoIHRvcCBhbmQgYm90dG9tIG9mIHdpdGhpbgoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoIG92ZXJUb3AgPiBvdmVyQm90dG9tICkgewoJCQkJCQlwb3NpdGlvbi50b3AgPSB3aXRoaW5PZmZzZXQgKyBvdXRlckhlaWdodCAtIGRhdGEuY29sbGlzaW9uSGVpZ2h0OwoJCQkJCX0gZWxzZSB7CgkJCQkJCXBvc2l0aW9uLnRvcCA9IHdpdGhpbk9mZnNldDsKCQkJCQl9CgkJCQl9CgkJCS8vIHRvbyBmYXIgdXAgLT4gYWxpZ24gd2l0aCB0b3AKCQkJfSBlbHNlIGlmICggb3ZlclRvcCA+IDAgKSB7CgkJCQlwb3NpdGlvbi50b3AgKz0gb3ZlclRvcDsKCQkJLy8gdG9vIGZhciBkb3duIC0+IGFsaWduIHdpdGggYm90dG9tIGVkZ2UKCQkJfSBlbHNlIGlmICggb3ZlckJvdHRvbSA+IDAgKSB7CgkJCQlwb3NpdGlvbi50b3AgLT0gb3ZlckJvdHRvbTsKCQkJLy8gYWRqdXN0IGJhc2VkIG9uIHBvc2l0aW9uIGFuZCBtYXJnaW4KCQkJfSBlbHNlIHsKCQkJCXBvc2l0aW9uLnRvcCA9IG1heCggcG9zaXRpb24udG9wIC0gY29sbGlzaW9uUG9zVG9wLCBwb3NpdGlvbi50b3AgKTsKCQkJfQoJCX0KCX0sCglmbGlwOiB7CgkJbGVmdDogZnVuY3Rpb24oIHBvc2l0aW9uLCBkYXRhICkgewoJCQl2YXIgd2l0aGluID0gZGF0YS53aXRoaW4sCgkJCQl3aXRoaW5PZmZzZXQgPSB3aXRoaW4ub2Zmc2V0LmxlZnQgKyB3aXRoaW4uc2Nyb2xsTGVmdCwKCQkJCW91dGVyV2lkdGggPSB3aXRoaW4ud2lkdGgsCgkJCQlvZmZzZXRMZWZ0ID0gd2l0aGluLmlzV2luZG93ID8gd2l0aGluLnNjcm9sbExlZnQgOiB3aXRoaW4ub2Zmc2V0LmxlZnQsCgkJCQljb2xsaXNpb25Qb3NMZWZ0ID0gcG9zaXRpb24ubGVmdCAtIGRhdGEuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luTGVmdCwKCQkJCW92ZXJMZWZ0ID0gY29sbGlzaW9uUG9zTGVmdCAtIG9mZnNldExlZnQsCgkJCQlvdmVyUmlnaHQgPSBjb2xsaXNpb25Qb3NMZWZ0ICsgZGF0YS5jb2xsaXNpb25XaWR0aCAtIG91dGVyV2lkdGggLSBvZmZzZXRMZWZ0LAoJCQkJbXlPZmZzZXQgPSBkYXRhLm15WyAwIF0gPT09ICJsZWZ0IiA/CgkJCQkJLWRhdGEuZWxlbVdpZHRoIDoKCQkJCQlkYXRhLm15WyAwIF0gPT09ICJyaWdodCIgPwoJCQkJCQlkYXRhLmVsZW1XaWR0aCA6CgkJCQkJCTAsCgkJCQlhdE9mZnNldCA9IGRhdGEuYXRbIDAgXSA9PT0gImxlZnQiID8KCQkJCQlkYXRhLnRhcmdldFdpZHRoIDoKCQkJCQlkYXRhLmF0WyAwIF0gPT09ICJyaWdodCIgPwoJCQkJCQktZGF0YS50YXJnZXRXaWR0aCA6CgkJCQkJCTAsCgkJCQlvZmZzZXQgPSAtMiAqIGRhdGEub2Zmc2V0WyAwIF0sCgkJCQluZXdPdmVyUmlnaHQsCgkJCQluZXdPdmVyTGVmdDsKCgkJCWlmICggb3ZlckxlZnQgPCAwICkgewoJCQkJbmV3T3ZlclJpZ2h0ID0gcG9zaXRpb24ubGVmdCArIG15T2Zmc2V0ICsgYXRPZmZzZXQgKyBvZmZzZXQgKyBkYXRhLmNvbGxpc2lvbldpZHRoIC0gb3V0ZXJXaWR0aCAtIHdpdGhpbk9mZnNldDsKCQkJCWlmICggbmV3T3ZlclJpZ2h0IDwgMCB8fCBuZXdPdmVyUmlnaHQgPCBhYnMoIG92ZXJMZWZ0ICkgKSB7CgkJCQkJcG9zaXRpb24ubGVmdCArPSBteU9mZnNldCArIGF0T2Zmc2V0ICsgb2Zmc2V0OwoJCQkJfQoJCQl9CgkJCWVsc2UgaWYgKCBvdmVyUmlnaHQgPiAwICkgewoJCQkJbmV3T3ZlckxlZnQgPSBwb3NpdGlvbi5sZWZ0IC0gZGF0YS5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5MZWZ0ICsgbXlPZmZzZXQgKyBhdE9mZnNldCArIG9mZnNldCAtIG9mZnNldExlZnQ7CgkJCQlpZiAoIG5ld092ZXJMZWZ0ID4gMCB8fCBhYnMoIG5ld092ZXJMZWZ0ICkgPCBvdmVyUmlnaHQgKSB7CgkJCQkJcG9zaXRpb24ubGVmdCArPSBteU9mZnNldCArIGF0T2Zmc2V0ICsgb2Zmc2V0OwoJCQkJfQoJCQl9CgkJfSwKCQl0b3A6IGZ1bmN0aW9uKCBwb3NpdGlvbiwgZGF0YSApIHsKCQkJdmFyIHdpdGhpbiA9IGRhdGEud2l0aGluLAoJCQkJd2l0aGluT2Zmc2V0ID0gd2l0aGluLm9mZnNldC50b3AgKyB3aXRoaW4uc2Nyb2xsVG9wLAoJCQkJb3V0ZXJIZWlnaHQgPSB3aXRoaW4uaGVpZ2h0LAoJCQkJb2Zmc2V0VG9wID0gd2l0aGluLmlzV2luZG93ID8gd2l0aGluLnNjcm9sbFRvcCA6IHdpdGhpbi5vZmZzZXQudG9wLAoJCQkJY29sbGlzaW9uUG9zVG9wID0gcG9zaXRpb24udG9wIC0gZGF0YS5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5Ub3AsCgkJCQlvdmVyVG9wID0gY29sbGlzaW9uUG9zVG9wIC0gb2Zmc2V0VG9wLAoJCQkJb3ZlckJvdHRvbSA9IGNvbGxpc2lvblBvc1RvcCArIGRhdGEuY29sbGlzaW9uSGVpZ2h0IC0gb3V0ZXJIZWlnaHQgLSBvZmZzZXRUb3AsCgkJCQl0b3AgPSBkYXRhLm15WyAxIF0gPT09ICJ0b3AiLAoJCQkJbXlPZmZzZXQgPSB0b3AgPwoJCQkJCS1kYXRhLmVsZW1IZWlnaHQgOgoJCQkJCWRhdGEubXlbIDEgXSA9PT0gImJvdHRvbSIgPwoJCQkJCQlkYXRhLmVsZW1IZWlnaHQgOgoJCQkJCQkwLAoJCQkJYXRPZmZzZXQgPSBkYXRhLmF0WyAxIF0gPT09ICJ0b3AiID8KCQkJCQlkYXRhLnRhcmdldEhlaWdodCA6CgkJCQkJZGF0YS5hdFsgMSBdID09PSAiYm90dG9tIiA/CgkJCQkJCS1kYXRhLnRhcmdldEhlaWdodCA6CgkJCQkJCTAsCgkJCQlvZmZzZXQgPSAtMiAqIGRhdGEub2Zmc2V0WyAxIF0sCgkJCQluZXdPdmVyVG9wLAoJCQkJbmV3T3ZlckJvdHRvbTsKCQkJaWYgKCBvdmVyVG9wIDwgMCApIHsKCQkJCW5ld092ZXJCb3R0b20gPSBwb3NpdGlvbi50b3AgKyBteU9mZnNldCArIGF0T2Zmc2V0ICsgb2Zmc2V0ICsgZGF0YS5jb2xsaXNpb25IZWlnaHQgLSBvdXRlckhlaWdodCAtIHdpdGhpbk9mZnNldDsKCQkJCWlmICggKCBwb3NpdGlvbi50b3AgKyBteU9mZnNldCArIGF0T2Zmc2V0ICsgb2Zmc2V0KSA+IG92ZXJUb3AgJiYgKCBuZXdPdmVyQm90dG9tIDwgMCB8fCBuZXdPdmVyQm90dG9tIDwgYWJzKCBvdmVyVG9wICkgKSApIHsKCQkJCQlwb3NpdGlvbi50b3AgKz0gbXlPZmZzZXQgKyBhdE9mZnNldCArIG9mZnNldDsKCQkJCX0KCQkJfQoJCQllbHNlIGlmICggb3ZlckJvdHRvbSA+IDAgKSB7CgkJCQluZXdPdmVyVG9wID0gcG9zaXRpb24udG9wIC0gIGRhdGEuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luVG9wICsgbXlPZmZzZXQgKyBhdE9mZnNldCArIG9mZnNldCAtIG9mZnNldFRvcDsKCQkJCWlmICggKCBwb3NpdGlvbi50b3AgKyBteU9mZnNldCArIGF0T2Zmc2V0ICsgb2Zmc2V0KSA+IG92ZXJCb3R0b20gJiYgKCBuZXdPdmVyVG9wID4gMCB8fCBhYnMoIG5ld092ZXJUb3AgKSA8IG92ZXJCb3R0b20gKSApIHsKCQkJCQlwb3NpdGlvbi50b3AgKz0gbXlPZmZzZXQgKyBhdE9mZnNldCArIG9mZnNldDsKCQkJCX0KCQkJfQoJCX0KCX0sCglmbGlwZml0OiB7CgkJbGVmdDogZnVuY3Rpb24oKSB7CgkJCSQudWkucG9zaXRpb24uZmxpcC5sZWZ0LmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJJC51aS5wb3NpdGlvbi5maXQubGVmdC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfSwKCQl0b3A6IGZ1bmN0aW9uKCkgewoJCQkkLnVpLnBvc2l0aW9uLmZsaXAudG9wLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJJC51aS5wb3NpdGlvbi5maXQudG9wLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQl9Cgl9Cn07CgovLyBmcmFjdGlvbiBzdXBwb3J0IHRlc3QKKGZ1bmN0aW9uICgpIHsKCXZhciB0ZXN0RWxlbWVudCwgdGVzdEVsZW1lbnRQYXJlbnQsIHRlc3RFbGVtZW50U3R5bGUsIG9mZnNldExlZnQsIGksCgkJYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCAiYm9keSIgKVsgMCBdLAoJCWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICk7CgoJLy9DcmVhdGUgYSAiZmFrZSBib2R5IiBmb3IgdGVzdGluZyBiYXNlZCBvbiBtZXRob2QgdXNlZCBpbiBqUXVlcnkuc3VwcG9ydAoJdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBib2R5ID8gImRpdiIgOiAiYm9keSIgKTsKCXRlc3RFbGVtZW50U3R5bGUgPSB7CgkJdmlzaWJpbGl0eTogImhpZGRlbiIsCgkJd2lkdGg6IDAsCgkJaGVpZ2h0OiAwLAoJCWJvcmRlcjogMCwKCQltYXJnaW46IDAsCgkJYmFja2dyb3VuZDogIm5vbmUiCgl9OwoJaWYgKCBib2R5ICkgewoJCSQuZXh0ZW5kKCB0ZXN0RWxlbWVudFN0eWxlLCB7CgkJCXBvc2l0aW9uOiAiYWJzb2x1dGUiLAoJCQlsZWZ0OiAiLTEwMDBweCIsCgkJCXRvcDogIi0xMDAwcHgiCgkJfSk7Cgl9Cglmb3IgKCBpIGluIHRlc3RFbGVtZW50U3R5bGUgKSB7CgkJdGVzdEVsZW1lbnQuc3R5bGVbIGkgXSA9IHRlc3RFbGVtZW50U3R5bGVbIGkgXTsKCX0KCXRlc3RFbGVtZW50LmFwcGVuZENoaWxkKCBkaXYgKTsKCXRlc3RFbGVtZW50UGFyZW50ID0gYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7Cgl0ZXN0RWxlbWVudFBhcmVudC5pbnNlcnRCZWZvcmUoIHRlc3RFbGVtZW50LCB0ZXN0RWxlbWVudFBhcmVudC5maXJzdENoaWxkICk7CgoJZGl2LnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAxMC43NDMyMjIycHg7IjsKCglvZmZzZXRMZWZ0ID0gJCggZGl2ICkub2Zmc2V0KCkubGVmdDsKCSQuc3VwcG9ydC5vZmZzZXRGcmFjdGlvbnMgPSBvZmZzZXRMZWZ0ID4gMTAgJiYgb2Zmc2V0TGVmdCA8IDExOwoKCXRlc3RFbGVtZW50LmlubmVySFRNTCA9ICIiOwoJdGVzdEVsZW1lbnRQYXJlbnQucmVtb3ZlQ2hpbGQoIHRlc3RFbGVtZW50ICk7Cn0pKCk7CgovLyBERVBSRUNBVEVECmlmICggJC51aUJhY2tDb21wYXQgIT09IGZhbHNlICkgewoJLy8gb2Zmc2V0IG9wdGlvbgoJKGZ1bmN0aW9uKCAkICkgewoJCXZhciBfcG9zaXRpb24gPSAkLmZuLnBvc2l0aW9uOwoJCSQuZm4ucG9zaXRpb24gPSBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQkJaWYgKCAhb3B0aW9ucyB8fCAhb3B0aW9ucy5vZmZzZXQgKSB7CgkJCQlyZXR1cm4gX3Bvc2l0aW9uLmNhbGwoIHRoaXMsIG9wdGlvbnMgKTsKCQkJfQoJCQl2YXIgb2Zmc2V0ID0gb3B0aW9ucy5vZmZzZXQuc3BsaXQoICIgIiApLAoJCQkJYXQgPSBvcHRpb25zLmF0LnNwbGl0KCAiICIgKTsKCQkJaWYgKCBvZmZzZXQubGVuZ3RoID09PSAxICkgewoJCQkJb2Zmc2V0WyAxIF0gPSBvZmZzZXRbIDAgXTsKCQkJfQoJCQlpZiAoIC9eXGQvLnRlc3QoIG9mZnNldFsgMCBdICkgKSB7CgkJCQlvZmZzZXRbIDAgXSA9ICIrIiArIG9mZnNldFsgMCBdOwoJCQl9CgkJCWlmICggL15cZC8udGVzdCggb2Zmc2V0WyAxIF0gKSApIHsKCQkJCW9mZnNldFsgMSBdID0gIisiICsgb2Zmc2V0WyAxIF07CgkJCX0KCQkJaWYgKCBhdC5sZW5ndGggPT09IDEgKSB7CgkJCQlpZiAoIC9sZWZ0fGNlbnRlcnxyaWdodC8udGVzdCggYXRbIDAgXSApICkgewoJCQkJCWF0WyAxIF0gPSAiY2VudGVyIjsKCQkJCX0gZWxzZSB7CgkJCQkJYXRbIDEgXSA9IGF0WyAwIF07CgkJCQkJYXRbIDAgXSA9ICJjZW50ZXIiOwoJCQkJfQoJCQl9CgkJCXJldHVybiBfcG9zaXRpb24uY2FsbCggdGhpcywgJC5leHRlbmQoIG9wdGlvbnMsIHsKCQkJCWF0OiBhdFsgMCBdICsgb2Zmc2V0WyAwIF0gKyAiICIgKyBhdFsgMSBdICsgb2Zmc2V0WyAxIF0sCgkJCQlvZmZzZXQ6IHVuZGVmaW5lZAoJCQl9ICkgKTsKCQl9OwoJfSggalF1ZXJ5ICkgKTsKfQoKfSggalF1ZXJ5ICkgKTsKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7Cgp2YXIgdWlkID0gMCwKCWhpZGVQcm9wcyA9IHt9LAoJc2hvd1Byb3BzID0ge307CgpoaWRlUHJvcHMuaGVpZ2h0ID0gaGlkZVByb3BzLnBhZGRpbmdUb3AgPSBoaWRlUHJvcHMucGFkZGluZ0JvdHRvbSA9CgloaWRlUHJvcHMuYm9yZGVyVG9wV2lkdGggPSBoaWRlUHJvcHMuYm9yZGVyQm90dG9tV2lkdGggPSAiaGlkZSI7CnNob3dQcm9wcy5oZWlnaHQgPSBzaG93UHJvcHMucGFkZGluZ1RvcCA9IHNob3dQcm9wcy5wYWRkaW5nQm90dG9tID0KCXNob3dQcm9wcy5ib3JkZXJUb3BXaWR0aCA9IHNob3dQcm9wcy5ib3JkZXJCb3R0b21XaWR0aCA9ICJzaG93IjsKCiQud2lkZ2V0KCAidWkuYWNjb3JkaW9uIiwgewoJdmVyc2lvbjogIjEuOS4yIiwKCW9wdGlvbnM6IHsKCQlhY3RpdmU6IDAsCgkJYW5pbWF0ZToge30sCgkJY29sbGFwc2libGU6IGZhbHNlLAoJCWV2ZW50OiAiY2xpY2siLAoJCWhlYWRlcjogIj4gbGkgPiA6Zmlyc3QtY2hpbGQsPiA6bm90KGxpKTpldmVuIiwKCQloZWlnaHRTdHlsZTogImF1dG8iLAoJCWljb25zOiB7CgkJCWFjdGl2ZUhlYWRlcjogInVpLWljb24tdHJpYW5nbGUtMS1zIiwKCQkJaGVhZGVyOiAidWktaWNvbi10cmlhbmdsZS0xLWUiCgkJfSwKCgkJLy8gY2FsbGJhY2tzCgkJYWN0aXZhdGU6IG51bGwsCgkJYmVmb3JlQWN0aXZhdGU6IG51bGwKCX0sCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdmFyIGFjY29yZGlvbklkID0gdGhpcy5hY2NvcmRpb25JZCA9ICJ1aS1hY2NvcmRpb24tIiArCgkJCQkodGhpcy5lbGVtZW50LmF0dHIoICJpZCIgKSB8fCArK3VpZCksCgkJCW9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJCXRoaXMucHJldlNob3cgPSB0aGlzLnByZXZIaWRlID0gJCgpOwoJCXRoaXMuZWxlbWVudC5hZGRDbGFzcyggInVpLWFjY29yZGlvbiB1aS13aWRnZXQgdWktaGVscGVyLXJlc2V0IiApOwoKCQl0aGlzLmhlYWRlcnMgPSB0aGlzLmVsZW1lbnQuZmluZCggb3B0aW9ucy5oZWFkZXIgKQoJCQkuYWRkQ2xhc3MoICJ1aS1hY2NvcmRpb24taGVhZGVyIHVpLWhlbHBlci1yZXNldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiICk7CgkJdGhpcy5faG92ZXJhYmxlKCB0aGlzLmhlYWRlcnMgKTsKCQl0aGlzLl9mb2N1c2FibGUoIHRoaXMuaGVhZGVycyApOwoKCQl0aGlzLmhlYWRlcnMubmV4dCgpCgkJCS5hZGRDbGFzcyggInVpLWFjY29yZGlvbi1jb250ZW50IHVpLWhlbHBlci1yZXNldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIiApCgkJCS5oaWRlKCk7CgoJCS8vIGRvbid0IGFsbG93IGNvbGxhcHNpYmxlOiBmYWxzZSBhbmQgYWN0aXZlOiBmYWxzZSAvIG51bGwKCQlpZiAoICFvcHRpb25zLmNvbGxhcHNpYmxlICYmIChvcHRpb25zLmFjdGl2ZSA9PT0gZmFsc2UgfHwgb3B0aW9ucy5hY3RpdmUgPT0gbnVsbCkgKSB7CgkJCW9wdGlvbnMuYWN0aXZlID0gMDsKCQl9CgkJLy8gaGFuZGxlIG5lZ2F0aXZlIHZhbHVlcwoJCWlmICggb3B0aW9ucy5hY3RpdmUgPCAwICkgewoJCQlvcHRpb25zLmFjdGl2ZSArPSB0aGlzLmhlYWRlcnMubGVuZ3RoOwoJCX0KCQl0aGlzLmFjdGl2ZSA9IHRoaXMuX2ZpbmRBY3RpdmUoIG9wdGlvbnMuYWN0aXZlICkKCQkJLmFkZENsYXNzKCAidWktYWNjb3JkaW9uLWhlYWRlci1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIiApCgkJCS50b2dnbGVDbGFzcyggInVpLWNvcm5lci1hbGwgdWktY29ybmVyLXRvcCIgKTsKCQl0aGlzLmFjdGl2ZS5uZXh0KCkKCQkJLmFkZENsYXNzKCAidWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIiApCgkJCS5zaG93KCk7CgoJCXRoaXMuX2NyZWF0ZUljb25zKCk7CgkJdGhpcy5yZWZyZXNoKCk7CgoJCS8vIEFSSUEKCQl0aGlzLmVsZW1lbnQuYXR0ciggInJvbGUiLCAidGFibGlzdCIgKTsKCgkJdGhpcy5oZWFkZXJzCgkJCS5hdHRyKCAicm9sZSIsICJ0YWIiICkKCQkJLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCQl2YXIgaGVhZGVyID0gJCggdGhpcyApLAoJCQkJCWhlYWRlcklkID0gaGVhZGVyLmF0dHIoICJpZCIgKSwKCQkJCQlwYW5lbCA9IGhlYWRlci5uZXh0KCksCgkJCQkJcGFuZWxJZCA9IHBhbmVsLmF0dHIoICJpZCIgKTsKCQkJCWlmICggIWhlYWRlcklkICkgewoJCQkJCWhlYWRlcklkID0gYWNjb3JkaW9uSWQgKyAiLWhlYWRlci0iICsgaTsKCQkJCQloZWFkZXIuYXR0ciggImlkIiwgaGVhZGVySWQgKTsKCQkJCX0KCQkJCWlmICggIXBhbmVsSWQgKSB7CgkJCQkJcGFuZWxJZCA9IGFjY29yZGlvbklkICsgIi1wYW5lbC0iICsgaTsKCQkJCQlwYW5lbC5hdHRyKCAiaWQiLCBwYW5lbElkICk7CgkJCQl9CgkJCQloZWFkZXIuYXR0ciggImFyaWEtY29udHJvbHMiLCBwYW5lbElkICk7CgkJCQlwYW5lbC5hdHRyKCAiYXJpYS1sYWJlbGxlZGJ5IiwgaGVhZGVySWQgKTsKCQkJfSkKCQkJLm5leHQoKQoJCQkJLmF0dHIoICJyb2xlIiwgInRhYnBhbmVsIiApOwoKCQl0aGlzLmhlYWRlcnMKCQkJLm5vdCggdGhpcy5hY3RpdmUgKQoJCQkuYXR0cih7CgkJCQkiYXJpYS1zZWxlY3RlZCI6ICJmYWxzZSIsCgkJCQl0YWJJbmRleDogLTEKCQkJfSkKCQkJLm5leHQoKQoJCQkJLmF0dHIoewoJCQkJCSJhcmlhLWV4cGFuZGVkIjogImZhbHNlIiwKCQkJCQkiYXJpYS1oaWRkZW4iOiAidHJ1ZSIKCQkJCX0pCgkJCQkuaGlkZSgpOwoKCQkvLyBtYWtlIHN1cmUgYXQgbGVhc3Qgb25lIGhlYWRlciBpcyBpbiB0aGUgdGFiIG9yZGVyCgkJaWYgKCAhdGhpcy5hY3RpdmUubGVuZ3RoICkgewoJCQl0aGlzLmhlYWRlcnMuZXEoIDAgKS5hdHRyKCAidGFiSW5kZXgiLCAwICk7CgkJfSBlbHNlIHsKCQkJdGhpcy5hY3RpdmUuYXR0cih7CgkJCQkiYXJpYS1zZWxlY3RlZCI6ICJ0cnVlIiwKCQkJCXRhYkluZGV4OiAwCgkJCX0pCgkJCS5uZXh0KCkKCQkJCS5hdHRyKHsKCQkJCQkiYXJpYS1leHBhbmRlZCI6ICJ0cnVlIiwKCQkJCQkiYXJpYS1oaWRkZW4iOiAiZmFsc2UiCgkJCQl9KTsKCQl9CgoJCXRoaXMuX29uKCB0aGlzLmhlYWRlcnMsIHsga2V5ZG93bjogIl9rZXlkb3duIiB9KTsKCQl0aGlzLl9vbiggdGhpcy5oZWFkZXJzLm5leHQoKSwgeyBrZXlkb3duOiAiX3BhbmVsS2V5RG93biIgfSk7CgkJdGhpcy5fc2V0dXBFdmVudHMoIG9wdGlvbnMuZXZlbnQgKTsKCX0sCgoJX2dldENyZWF0ZUV2ZW50RGF0YTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHsKCQkJaGVhZGVyOiB0aGlzLmFjdGl2ZSwKCQkJY29udGVudDogIXRoaXMuYWN0aXZlLmxlbmd0aCA/ICQoKSA6IHRoaXMuYWN0aXZlLm5leHQoKQoJCX07Cgl9LAoKCV9jcmVhdGVJY29uczogZnVuY3Rpb24oKSB7CgkJdmFyIGljb25zID0gdGhpcy5vcHRpb25zLmljb25zOwoJCWlmICggaWNvbnMgKSB7CgkJCSQoICI8c3Bhbj4iICkKCQkJCS5hZGRDbGFzcyggInVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiB1aS1pY29uICIgKyBpY29ucy5oZWFkZXIgKQoJCQkJLnByZXBlbmRUbyggdGhpcy5oZWFkZXJzICk7CgkJCXRoaXMuYWN0aXZlLmNoaWxkcmVuKCAiLnVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiIgKQoJCQkJLnJlbW92ZUNsYXNzKCBpY29ucy5oZWFkZXIgKQoJCQkJLmFkZENsYXNzKCBpY29ucy5hY3RpdmVIZWFkZXIgKTsKCQkJdGhpcy5oZWFkZXJzLmFkZENsYXNzKCAidWktYWNjb3JkaW9uLWljb25zIiApOwoJCX0KCX0sCgoJX2Rlc3Ryb3lJY29uczogZnVuY3Rpb24oKSB7CgkJdGhpcy5oZWFkZXJzCgkJCS5yZW1vdmVDbGFzcyggInVpLWFjY29yZGlvbi1pY29ucyIgKQoJCQkuY2hpbGRyZW4oICIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uIiApCgkJCQkucmVtb3ZlKCk7Cgl9LAoKCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCQl2YXIgY29udGVudHM7CgoJCS8vIGNsZWFuIHVwIG1haW4gZWxlbWVudAoJCXRoaXMuZWxlbWVudAoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1hY2NvcmRpb24gdWktd2lkZ2V0IHVpLWhlbHBlci1yZXNldCIgKQoJCQkucmVtb3ZlQXR0ciggInJvbGUiICk7CgoJCS8vIGNsZWFuIHVwIGhlYWRlcnMKCQl0aGlzLmhlYWRlcnMKCQkJLnJlbW92ZUNsYXNzKCAidWktYWNjb3JkaW9uLWhlYWRlciB1aS1hY2NvcmRpb24taGVhZGVyLWFjdGl2ZSB1aS1oZWxwZXItcmVzZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWFjdGl2ZSB1aS1zdGF0ZS1kaXNhYmxlZCB1aS1jb3JuZXItdG9wIiApCgkJCS5yZW1vdmVBdHRyKCAicm9sZSIgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtc2VsZWN0ZWQiICkKCQkJLnJlbW92ZUF0dHIoICJhcmlhLWNvbnRyb2xzIiApCgkJCS5yZW1vdmVBdHRyKCAidGFiSW5kZXgiICkKCQkJLmVhY2goZnVuY3Rpb24oKSB7CgkJCQlpZiAoIC9edWktYWNjb3JkaW9uLy50ZXN0KCB0aGlzLmlkICkgKSB7CgkJCQkJdGhpcy5yZW1vdmVBdHRyaWJ1dGUoICJpZCIgKTsKCQkJCX0KCQkJfSk7CgkJdGhpcy5fZGVzdHJveUljb25zKCk7CgoJCS8vIGNsZWFuIHVwIGNvbnRlbnQgcGFuZWxzCgkJY29udGVudHMgPSB0aGlzLmhlYWRlcnMubmV4dCgpCgkJCS5jc3MoICJkaXNwbGF5IiwgIiIgKQoJCQkucmVtb3ZlQXR0ciggInJvbGUiICkKCQkJLnJlbW92ZUF0dHIoICJhcmlhLWV4cGFuZGVkIiApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1oaWRkZW4iICkKCQkJLnJlbW92ZUF0dHIoICJhcmlhLWxhYmVsbGVkYnkiICkKCQkJLnJlbW92ZUNsYXNzKCAidWktaGVscGVyLXJlc2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20gdWktYWNjb3JkaW9uLWNvbnRlbnQgdWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIHVpLXN0YXRlLWRpc2FibGVkIiApCgkJCS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJaWYgKCAvXnVpLWFjY29yZGlvbi8udGVzdCggdGhpcy5pZCApICkgewoJCQkJCXRoaXMucmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CgkJCQl9CgkJCX0pOwoJCWlmICggdGhpcy5vcHRpb25zLmhlaWdodFN0eWxlICE9PSAiY29udGVudCIgKSB7CgkJCWNvbnRlbnRzLmNzcyggImhlaWdodCIsICIiICk7CgkJfQoJfSwKCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQlpZiAoIGtleSA9PT0gImFjdGl2ZSIgKSB7CgkJCS8vIF9hY3RpdmF0ZSgpIHdpbGwgaGFuZGxlIGludmFsaWQgdmFsdWVzIGFuZCB1cGRhdGUgdGhpcy5vcHRpb25zCgkJCXRoaXMuX2FjdGl2YXRlKCB2YWx1ZSApOwoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIGtleSA9PT0gImV2ZW50IiApIHsKCQkJaWYgKCB0aGlzLm9wdGlvbnMuZXZlbnQgKSB7CgkJCQl0aGlzLl9vZmYoIHRoaXMuaGVhZGVycywgdGhpcy5vcHRpb25zLmV2ZW50ICk7CgkJCX0KCQkJdGhpcy5fc2V0dXBFdmVudHMoIHZhbHVlICk7CgkJfQoKCQl0aGlzLl9zdXBlcigga2V5LCB2YWx1ZSApOwoKCQkvLyBzZXR0aW5nIGNvbGxhcHNpYmxlOiBmYWxzZSB3aGlsZSBjb2xsYXBzZWQ7IG9wZW4gZmlyc3QgcGFuZWwKCQlpZiAoIGtleSA9PT0gImNvbGxhcHNpYmxlIiAmJiAhdmFsdWUgJiYgdGhpcy5vcHRpb25zLmFjdGl2ZSA9PT0gZmFsc2UgKSB7CgkJCXRoaXMuX2FjdGl2YXRlKCAwICk7CgkJfQoKCQlpZiAoIGtleSA9PT0gImljb25zIiApIHsKCQkJdGhpcy5fZGVzdHJveUljb25zKCk7CgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLl9jcmVhdGVJY29ucygpOwoJCQl9CgkJfQoKCQkvLyAjNTMzMiAtIG9wYWNpdHkgZG9lc24ndCBjYXNjYWRlIHRvIHBvc2l0aW9uZWQgZWxlbWVudHMgaW4gSUUKCQkvLyBzbyB3ZSBuZWVkIHRvIGFkZCB0aGUgZGlzYWJsZWQgY2xhc3MgdG8gdGhlIGhlYWRlcnMgYW5kIHBhbmVscwoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLmhlYWRlcnMuYWRkKCB0aGlzLmhlYWRlcnMubmV4dCgpICkKCQkJCS50b2dnbGVDbGFzcyggInVpLXN0YXRlLWRpc2FibGVkIiwgISF2YWx1ZSApOwoJCX0KCX0sCgoJX2tleWRvd246IGZ1bmN0aW9uKCBldmVudCApIHsKCQlpZiAoIGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5ICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIga2V5Q29kZSA9ICQudWkua2V5Q29kZSwKCQkJbGVuZ3RoID0gdGhpcy5oZWFkZXJzLmxlbmd0aCwKCQkJY3VycmVudEluZGV4ID0gdGhpcy5oZWFkZXJzLmluZGV4KCBldmVudC50YXJnZXQgKSwKCQkJdG9Gb2N1cyA9IGZhbHNlOwoKCQlzd2l0Y2ggKCBldmVudC5rZXlDb2RlICkgewoJCQljYXNlIGtleUNvZGUuUklHSFQ6CgkJCWNhc2Uga2V5Q29kZS5ET1dOOgoJCQkJdG9Gb2N1cyA9IHRoaXMuaGVhZGVyc1sgKCBjdXJyZW50SW5kZXggKyAxICkgJSBsZW5ndGggXTsKCQkJCWJyZWFrOwoJCQljYXNlIGtleUNvZGUuTEVGVDoKCQkJY2FzZSBrZXlDb2RlLlVQOgoJCQkJdG9Gb2N1cyA9IHRoaXMuaGVhZGVyc1sgKCBjdXJyZW50SW5kZXggLSAxICsgbGVuZ3RoICkgJSBsZW5ndGggXTsKCQkJCWJyZWFrOwoJCQljYXNlIGtleUNvZGUuU1BBQ0U6CgkJCWNhc2Uga2V5Q29kZS5FTlRFUjoKCQkJCXRoaXMuX2V2ZW50SGFuZGxlciggZXZlbnQgKTsKCQkJCWJyZWFrOwoJCQljYXNlIGtleUNvZGUuSE9NRToKCQkJCXRvRm9jdXMgPSB0aGlzLmhlYWRlcnNbIDAgXTsKCQkJCWJyZWFrOwoJCQljYXNlIGtleUNvZGUuRU5EOgoJCQkJdG9Gb2N1cyA9IHRoaXMuaGVhZGVyc1sgbGVuZ3RoIC0gMSBdOwoJCQkJYnJlYWs7CgkJfQoKCQlpZiAoIHRvRm9jdXMgKSB7CgkJCSQoIGV2ZW50LnRhcmdldCApLmF0dHIoICJ0YWJJbmRleCIsIC0xICk7CgkJCSQoIHRvRm9jdXMgKS5hdHRyKCAidGFiSW5kZXgiLCAwICk7CgkJCXRvRm9jdXMuZm9jdXMoKTsKCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQl9Cgl9LAoKCV9wYW5lbEtleURvd24gOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCBldmVudC5rZXlDb2RlID09PSAkLnVpLmtleUNvZGUuVVAgJiYgZXZlbnQuY3RybEtleSApIHsKCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnByZXYoKS5mb2N1cygpOwoJCX0KCX0sCgoJcmVmcmVzaDogZnVuY3Rpb24oKSB7CgkJdmFyIG1heEhlaWdodCwgb3ZlcmZsb3csCgkJCWhlaWdodFN0eWxlID0gdGhpcy5vcHRpb25zLmhlaWdodFN0eWxlLAoJCQlwYXJlbnQgPSB0aGlzLmVsZW1lbnQucGFyZW50KCk7CgoKCQlpZiAoIGhlaWdodFN0eWxlID09PSAiZmlsbCIgKSB7CgkJCS8vIElFIDYgdHJlYXRzIGhlaWdodCBsaWtlIG1pbkhlaWdodCwgc28gd2UgbmVlZCB0byB0dXJuIG9mZiBvdmVyZmxvdwoJCQkvLyBpbiBvcmRlciB0byBnZXQgYSByZWxpYWJsZSBoZWlnaHQKCQkJLy8gd2UgdXNlIHRoZSBtaW5IZWlnaHQgc3VwcG9ydCB0ZXN0IGJlY2F1c2Ugd2UgYXNzdW1lIHRoYXQgb25seQoJCQkvLyBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgbWluSGVpZ2h0IHdpbGwgdHJlYXQgaGVpZ2h0IGFzIG1pbkhlaWdodAoJCQlpZiAoICEkLnN1cHBvcnQubWluSGVpZ2h0ICkgewoJCQkJb3ZlcmZsb3cgPSBwYXJlbnQuY3NzKCAib3ZlcmZsb3ciICk7CgkJCQlwYXJlbnQuY3NzKCAib3ZlcmZsb3ciLCAiaGlkZGVuIik7CgkJCX0KCQkJbWF4SGVpZ2h0ID0gcGFyZW50LmhlaWdodCgpOwoJCQl0aGlzLmVsZW1lbnQuc2libGluZ3MoICI6dmlzaWJsZSIgKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGVsZW0gPSAkKCB0aGlzICksCgkJCQkJcG9zaXRpb24gPSBlbGVtLmNzcyggInBvc2l0aW9uIiApOwoKCQkJCWlmICggcG9zaXRpb24gPT09ICJhYnNvbHV0ZSIgfHwgcG9zaXRpb24gPT09ICJmaXhlZCIgKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQkJbWF4SGVpZ2h0IC09IGVsZW0ub3V0ZXJIZWlnaHQoIHRydWUgKTsKCQkJfSk7CgkJCWlmICggb3ZlcmZsb3cgKSB7CgkJCQlwYXJlbnQuY3NzKCAib3ZlcmZsb3ciLCBvdmVyZmxvdyApOwoJCQl9CgoJCQl0aGlzLmhlYWRlcnMuZWFjaChmdW5jdGlvbigpIHsKCQkJCW1heEhlaWdodCAtPSAkKCB0aGlzICkub3V0ZXJIZWlnaHQoIHRydWUgKTsKCQkJfSk7CgoJCQl0aGlzLmhlYWRlcnMubmV4dCgpCgkJCQkuZWFjaChmdW5jdGlvbigpIHsKCQkJCQkkKCB0aGlzICkuaGVpZ2h0KCBNYXRoLm1heCggMCwgbWF4SGVpZ2h0IC0KCQkJCQkJJCggdGhpcyApLmlubmVySGVpZ2h0KCkgKyAkKCB0aGlzICkuaGVpZ2h0KCkgKSApOwoJCQkJfSkKCQkJCS5jc3MoICJvdmVyZmxvdyIsICJhdXRvIiApOwoJCX0gZWxzZSBpZiAoIGhlaWdodFN0eWxlID09PSAiYXV0byIgKSB7CgkJCW1heEhlaWdodCA9IDA7CgkJCXRoaXMuaGVhZGVycy5uZXh0KCkKCQkJCS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJCW1heEhlaWdodCA9IE1hdGgubWF4KCBtYXhIZWlnaHQsICQoIHRoaXMgKS5jc3MoICJoZWlnaHQiLCAiIiApLmhlaWdodCgpICk7CgkJCQl9KQoJCQkJLmhlaWdodCggbWF4SGVpZ2h0ICk7CgkJfQoJfSwKCglfYWN0aXZhdGU6IGZ1bmN0aW9uKCBpbmRleCApIHsKCQl2YXIgYWN0aXZlID0gdGhpcy5fZmluZEFjdGl2ZSggaW5kZXggKVsgMCBdOwoKCQkvLyB0cnlpbmcgdG8gYWN0aXZhdGUgdGhlIGFscmVhZHkgYWN0aXZlIHBhbmVsCgkJaWYgKCBhY3RpdmUgPT09IHRoaXMuYWN0aXZlWyAwIF0gKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIHRyeWluZyB0byBjb2xsYXBzZSwgc2ltdWxhdGUgYSBjbGljayBvbiB0aGUgY3VycmVudGx5IGFjdGl2ZSBoZWFkZXIKCQlhY3RpdmUgPSBhY3RpdmUgfHwgdGhpcy5hY3RpdmVbIDAgXTsKCgkJdGhpcy5fZXZlbnRIYW5kbGVyKHsKCQkJdGFyZ2V0OiBhY3RpdmUsCgkJCWN1cnJlbnRUYXJnZXQ6IGFjdGl2ZSwKCQkJcHJldmVudERlZmF1bHQ6ICQubm9vcAoJCX0pOwoJfSwKCglfZmluZEFjdGl2ZTogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJudW1iZXIiID8gdGhpcy5oZWFkZXJzLmVxKCBzZWxlY3RvciApIDogJCgpOwoJfSwKCglfc2V0dXBFdmVudHM6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgZXZlbnRzID0ge307CgkJaWYgKCAhZXZlbnQgKSB7CgkJCXJldHVybjsKCQl9CgkJJC5lYWNoKCBldmVudC5zcGxpdCgiICIpLCBmdW5jdGlvbiggaW5kZXgsIGV2ZW50TmFtZSApIHsKCQkJZXZlbnRzWyBldmVudE5hbWUgXSA9ICJfZXZlbnRIYW5kbGVyIjsKCQl9KTsKCQl0aGlzLl9vbiggdGhpcy5oZWFkZXJzLCBldmVudHMgKTsKCX0sCgoJX2V2ZW50SGFuZGxlcjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLAoJCQlhY3RpdmUgPSB0aGlzLmFjdGl2ZSwKCQkJY2xpY2tlZCA9ICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwKCQkJY2xpY2tlZElzQWN0aXZlID0gY2xpY2tlZFsgMCBdID09PSBhY3RpdmVbIDAgXSwKCQkJY29sbGFwc2luZyA9IGNsaWNrZWRJc0FjdGl2ZSAmJiBvcHRpb25zLmNvbGxhcHNpYmxlLAoJCQl0b1Nob3cgPSBjb2xsYXBzaW5nID8gJCgpIDogY2xpY2tlZC5uZXh0KCksCgkJCXRvSGlkZSA9IGFjdGl2ZS5uZXh0KCksCgkJCWV2ZW50RGF0YSA9IHsKCQkJCW9sZEhlYWRlcjogYWN0aXZlLAoJCQkJb2xkUGFuZWw6IHRvSGlkZSwKCQkJCW5ld0hlYWRlcjogY29sbGFwc2luZyA/ICQoKSA6IGNsaWNrZWQsCgkJCQluZXdQYW5lbDogdG9TaG93CgkJCX07CgoJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCWlmICgKCQkJCS8vIGNsaWNrIG9uIGFjdGl2ZSBoZWFkZXIsIGJ1dCBub3QgY29sbGFwc2libGUKCQkJCSggY2xpY2tlZElzQWN0aXZlICYmICFvcHRpb25zLmNvbGxhcHNpYmxlICkgfHwKCQkJCS8vIGFsbG93IGNhbmNlbGluZyBhY3RpdmF0aW9uCgkJCQkoIHRoaXMuX3RyaWdnZXIoICJiZWZvcmVBY3RpdmF0ZSIsIGV2ZW50LCBldmVudERhdGEgKSA9PT0gZmFsc2UgKSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJb3B0aW9ucy5hY3RpdmUgPSBjb2xsYXBzaW5nID8gZmFsc2UgOiB0aGlzLmhlYWRlcnMuaW5kZXgoIGNsaWNrZWQgKTsKCgkJLy8gd2hlbiB0aGUgY2FsbCB0byAuX3RvZ2dsZSgpIGNvbWVzIGFmdGVyIHRoZSBjbGFzcyBjaGFuZ2VzCgkJLy8gaXQgY2F1c2VzIGEgdmVyeSBvZGQgYnVnIGluIElFIDggKHNlZSAjNjcyMCkKCQl0aGlzLmFjdGl2ZSA9IGNsaWNrZWRJc0FjdGl2ZSA/ICQoKSA6IGNsaWNrZWQ7CgkJdGhpcy5fdG9nZ2xlKCBldmVudERhdGEgKTsKCgkJLy8gc3dpdGNoIGNsYXNzZXMKCQkvLyBjb3JuZXIgY2xhc3NlcyBvbiB0aGUgcHJldmlvdXNseSBhY3RpdmUgaGVhZGVyIHN0YXkgYWZ0ZXIgdGhlIGFuaW1hdGlvbgoJCWFjdGl2ZS5yZW1vdmVDbGFzcyggInVpLWFjY29yZGlvbi1oZWFkZXItYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIgKTsKCQlpZiAoIG9wdGlvbnMuaWNvbnMgKSB7CgkJCWFjdGl2ZS5jaGlsZHJlbiggIi51aS1hY2NvcmRpb24taGVhZGVyLWljb24iICkKCQkJCS5yZW1vdmVDbGFzcyggb3B0aW9ucy5pY29ucy5hY3RpdmVIZWFkZXIgKQoJCQkJLmFkZENsYXNzKCBvcHRpb25zLmljb25zLmhlYWRlciApOwoJCX0KCgkJaWYgKCAhY2xpY2tlZElzQWN0aXZlICkgewoJCQljbGlja2VkCgkJCQkucmVtb3ZlQ2xhc3MoICJ1aS1jb3JuZXItYWxsIiApCgkJCQkuYWRkQ2xhc3MoICJ1aS1hY2NvcmRpb24taGVhZGVyLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUgdWktY29ybmVyLXRvcCIgKTsKCQkJaWYgKCBvcHRpb25zLmljb25zICkgewoJCQkJY2xpY2tlZC5jaGlsZHJlbiggIi51aS1hY2NvcmRpb24taGVhZGVyLWljb24iICkKCQkJCQkucmVtb3ZlQ2xhc3MoIG9wdGlvbnMuaWNvbnMuaGVhZGVyICkKCQkJCQkuYWRkQ2xhc3MoIG9wdGlvbnMuaWNvbnMuYWN0aXZlSGVhZGVyICk7CgkJCX0KCgkJCWNsaWNrZWQKCQkJCS5uZXh0KCkKCQkJCS5hZGRDbGFzcyggInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIgKTsKCQl9Cgl9LAoKCV90b2dnbGU6IGZ1bmN0aW9uKCBkYXRhICkgewoJCXZhciB0b1Nob3cgPSBkYXRhLm5ld1BhbmVsLAoJCQl0b0hpZGUgPSB0aGlzLnByZXZTaG93Lmxlbmd0aCA/IHRoaXMucHJldlNob3cgOiBkYXRhLm9sZFBhbmVsOwoKCQkvLyBoYW5kbGUgYWN0aXZhdGluZyBhIHBhbmVsIGR1cmluZyB0aGUgYW5pbWF0aW9uIGZvciBhbm90aGVyIGFjdGl2YXRpb24KCQl0aGlzLnByZXZTaG93LmFkZCggdGhpcy5wcmV2SGlkZSApLnN0b3AoIHRydWUsIHRydWUgKTsKCQl0aGlzLnByZXZTaG93ID0gdG9TaG93OwoJCXRoaXMucHJldkhpZGUgPSB0b0hpZGU7CgoJCWlmICggdGhpcy5vcHRpb25zLmFuaW1hdGUgKSB7CgkJCXRoaXMuX2FuaW1hdGUoIHRvU2hvdywgdG9IaWRlLCBkYXRhICk7CgkJfSBlbHNlIHsKCQkJdG9IaWRlLmhpZGUoKTsKCQkJdG9TaG93LnNob3coKTsKCQkJdGhpcy5fdG9nZ2xlQ29tcGxldGUoIGRhdGEgKTsKCQl9CgoJCXRvSGlkZS5hdHRyKHsKCQkJImFyaWEtZXhwYW5kZWQiOiAiZmFsc2UiLAoJCQkiYXJpYS1oaWRkZW4iOiAidHJ1ZSIKCQl9KTsKCQl0b0hpZGUucHJldigpLmF0dHIoICJhcmlhLXNlbGVjdGVkIiwgImZhbHNlIiApOwoJCS8vIGlmIHdlJ3JlIHN3aXRjaGluZyBwYW5lbHMsIHJlbW92ZSB0aGUgb2xkIGhlYWRlciBmcm9tIHRoZSB0YWIgb3JkZXIKCQkvLyBpZiB3ZSdyZSBvcGVuaW5nIGZyb20gY29sbGFwc2VkIHN0YXRlLCByZW1vdmUgdGhlIHByZXZpb3VzIGhlYWRlciBmcm9tIHRoZSB0YWIgb3JkZXIKCQkvLyBpZiB3ZSdyZSBjb2xsYXBzaW5nLCB0aGVuIGtlZXAgdGhlIGNvbGxhcHNpbmcgaGVhZGVyIGluIHRoZSB0YWIgb3JkZXIKCQlpZiAoIHRvU2hvdy5sZW5ndGggJiYgdG9IaWRlLmxlbmd0aCApIHsKCQkJdG9IaWRlLnByZXYoKS5hdHRyKCAidGFiSW5kZXgiLCAtMSApOwoJCX0gZWxzZSBpZiAoIHRvU2hvdy5sZW5ndGggKSB7CgkJCXRoaXMuaGVhZGVycy5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gJCggdGhpcyApLmF0dHIoICJ0YWJJbmRleCIgKSA9PT0gMDsKCQkJfSkKCQkJLmF0dHIoICJ0YWJJbmRleCIsIC0xICk7CgkJfQoKCQl0b1Nob3cKCQkJLmF0dHIoewoJCQkJImFyaWEtZXhwYW5kZWQiOiAidHJ1ZSIsCgkJCQkiYXJpYS1oaWRkZW4iOiAiZmFsc2UiCgkJCX0pCgkJCS5wcmV2KCkKCQkJCS5hdHRyKHsKCQkJCQkiYXJpYS1zZWxlY3RlZCI6ICJ0cnVlIiwKCQkJCQl0YWJJbmRleDogMAoJCQkJfSk7Cgl9LAoKCV9hbmltYXRlOiBmdW5jdGlvbiggdG9TaG93LCB0b0hpZGUsIGRhdGEgKSB7CgkJdmFyIHRvdGFsLCBlYXNpbmcsIGR1cmF0aW9uLAoJCQl0aGF0ID0gdGhpcywKCQkJYWRqdXN0ID0gMCwKCQkJZG93biA9IHRvU2hvdy5sZW5ndGggJiYKCQkJCSggIXRvSGlkZS5sZW5ndGggfHwgKCB0b1Nob3cuaW5kZXgoKSA8IHRvSGlkZS5pbmRleCgpICkgKSwKCQkJYW5pbWF0ZSA9IHRoaXMub3B0aW9ucy5hbmltYXRlIHx8IHt9LAoJCQlvcHRpb25zID0gZG93biAmJiBhbmltYXRlLmRvd24gfHwgYW5pbWF0ZSwKCQkJY29tcGxldGUgPSBmdW5jdGlvbigpIHsKCQkJCXRoYXQuX3RvZ2dsZUNvbXBsZXRlKCBkYXRhICk7CgkJCX07CgoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlkdXJhdGlvbiA9IG9wdGlvbnM7CgkJfQoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmciICkgewoJCQllYXNpbmcgPSBvcHRpb25zOwoJCX0KCQkvLyBmYWxsIGJhY2sgZnJvbSBvcHRpb25zIHRvIGFuaW1hdGlvbiBpbiBjYXNlIG9mIHBhcnRpYWwgZG93biBzZXR0aW5ncwoJCWVhc2luZyA9IGVhc2luZyB8fCBvcHRpb25zLmVhc2luZyB8fCBhbmltYXRlLmVhc2luZzsKCQlkdXJhdGlvbiA9IGR1cmF0aW9uIHx8IG9wdGlvbnMuZHVyYXRpb24gfHwgYW5pbWF0ZS5kdXJhdGlvbjsKCgkJaWYgKCAhdG9IaWRlLmxlbmd0aCApIHsKCQkJcmV0dXJuIHRvU2hvdy5hbmltYXRlKCBzaG93UHJvcHMsIGR1cmF0aW9uLCBlYXNpbmcsIGNvbXBsZXRlICk7CgkJfQoJCWlmICggIXRvU2hvdy5sZW5ndGggKSB7CgkJCXJldHVybiB0b0hpZGUuYW5pbWF0ZSggaGlkZVByb3BzLCBkdXJhdGlvbiwgZWFzaW5nLCBjb21wbGV0ZSApOwoJCX0KCgkJdG90YWwgPSB0b1Nob3cuc2hvdygpLm91dGVySGVpZ2h0KCk7CgkJdG9IaWRlLmFuaW1hdGUoIGhpZGVQcm9wcywgewoJCQlkdXJhdGlvbjogZHVyYXRpb24sCgkJCWVhc2luZzogZWFzaW5nLAoJCQlzdGVwOiBmdW5jdGlvbiggbm93LCBmeCApIHsKCQkJCWZ4Lm5vdyA9IE1hdGgucm91bmQoIG5vdyApOwoJCQl9CgkJfSk7CgkJdG9TaG93CgkJCS5oaWRlKCkKCQkJLmFuaW1hdGUoIHNob3dQcm9wcywgewoJCQkJZHVyYXRpb246IGR1cmF0aW9uLAoJCQkJZWFzaW5nOiBlYXNpbmcsCgkJCQljb21wbGV0ZTogY29tcGxldGUsCgkJCQlzdGVwOiBmdW5jdGlvbiggbm93LCBmeCApIHsKCQkJCQlmeC5ub3cgPSBNYXRoLnJvdW5kKCBub3cgKTsKCQkJCQlpZiAoIGZ4LnByb3AgIT09ICJoZWlnaHQiICkgewoJCQkJCQlhZGp1c3QgKz0gZngubm93OwoJCQkJCX0gZWxzZSBpZiAoIHRoYXQub3B0aW9ucy5oZWlnaHRTdHlsZSAhPT0gImNvbnRlbnQiICkgewoJCQkJCQlmeC5ub3cgPSBNYXRoLnJvdW5kKCB0b3RhbCAtIHRvSGlkZS5vdXRlckhlaWdodCgpIC0gYWRqdXN0ICk7CgkJCQkJCWFkanVzdCA9IDA7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCX0sCgoJX3RvZ2dsZUNvbXBsZXRlOiBmdW5jdGlvbiggZGF0YSApIHsKCQl2YXIgdG9IaWRlID0gZGF0YS5vbGRQYW5lbDsKCgkJdG9IaWRlCgkJCS5yZW1vdmVDbGFzcyggInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIgKQoJCQkucHJldigpCgkJCQkucmVtb3ZlQ2xhc3MoICJ1aS1jb3JuZXItdG9wIiApCgkJCQkuYWRkQ2xhc3MoICJ1aS1jb3JuZXItYWxsIiApOwoKCQkvLyBXb3JrIGFyb3VuZCBmb3IgcmVuZGVyaW5nIGJ1ZyBpbiBJRSAoIzU0MjEpCgkJaWYgKCB0b0hpZGUubGVuZ3RoICkgewoJCQl0b0hpZGUucGFyZW50KClbMF0uY2xhc3NOYW1lID0gdG9IaWRlLnBhcmVudCgpWzBdLmNsYXNzTmFtZTsKCQl9CgoJCXRoaXMuX3RyaWdnZXIoICJhY3RpdmF0ZSIsIG51bGwsIGRhdGEgKTsKCX0KfSk7CgoKCi8vIERFUFJFQ0FURUQKaWYgKCAkLnVpQmFja0NvbXBhdCAhPT0gZmFsc2UgKSB7CgkvLyBuYXZpZ2F0aW9uIG9wdGlvbnMKCShmdW5jdGlvbiggJCwgcHJvdG90eXBlICkgewoJCSQuZXh0ZW5kKCBwcm90b3R5cGUub3B0aW9ucywgewoJCQluYXZpZ2F0aW9uOiBmYWxzZSwKCQkJbmF2aWdhdGlvbkZpbHRlcjogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gdGhpcy5ocmVmLnRvTG93ZXJDYXNlKCkgPT09IGxvY2F0aW9uLmhyZWYudG9Mb3dlckNhc2UoKTsKCQkJfQoJCX0pOwoKCQl2YXIgX2NyZWF0ZSA9IHByb3RvdHlwZS5fY3JlYXRlOwoJCXByb3RvdHlwZS5fY3JlYXRlID0gZnVuY3Rpb24oKSB7CgkJCWlmICggdGhpcy5vcHRpb25zLm5hdmlnYXRpb24gKSB7CgkJCQl2YXIgdGhhdCA9IHRoaXMsCgkJCQkJaGVhZGVycyA9IHRoaXMuZWxlbWVudC5maW5kKCB0aGlzLm9wdGlvbnMuaGVhZGVyICksCgkJCQkJY29udGVudCA9IGhlYWRlcnMubmV4dCgpLAoJCQkJCWN1cnJlbnQgPSBoZWFkZXJzLmFkZCggY29udGVudCApCgkJCQkJCS5maW5kKCAiYSIgKQoJCQkJCQkuZmlsdGVyKCB0aGlzLm9wdGlvbnMubmF2aWdhdGlvbkZpbHRlciApCgkJCQkJCVsgMCBdOwoJCQkJaWYgKCBjdXJyZW50ICkgewoJCQkJCWhlYWRlcnMuYWRkKCBjb250ZW50ICkuZWFjaCggZnVuY3Rpb24oIGluZGV4ICkgewoJCQkJCQlpZiAoICQuY29udGFpbnMoIHRoaXMsIGN1cnJlbnQgKSApIHsKCQkJCQkJCXRoYXQub3B0aW9ucy5hY3RpdmUgPSBNYXRoLmZsb29yKCBpbmRleCAvIDIgKTsKCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJfQoJCQkJCX0pOwoJCQkJfQoJCQl9CgkJCV9jcmVhdGUuY2FsbCggdGhpcyApOwoJCX07Cgl9KCBqUXVlcnksIGpRdWVyeS51aS5hY2NvcmRpb24ucHJvdG90eXBlICkgKTsKCgkvLyBoZWlnaHQgb3B0aW9ucwoJKGZ1bmN0aW9uKCAkLCBwcm90b3R5cGUgKSB7CgkJJC5leHRlbmQoIHByb3RvdHlwZS5vcHRpb25zLCB7CgkJCWhlaWdodFN0eWxlOiBudWxsLCAvLyByZW1vdmUgZGVmYXVsdCBzbyB3ZSBmYWxsIGJhY2sgdG8gb2xkIHZhbHVlcwoJCQlhdXRvSGVpZ2h0OiB0cnVlLCAvLyB1c2UgaGVpZ2h0U3R5bGU6ICJhdXRvIgoJCQljbGVhclN0eWxlOiBmYWxzZSwgLy8gdXNlIGhlaWdodFN0eWxlOiAiY29udGVudCIKCQkJZmlsbFNwYWNlOiBmYWxzZSAvLyB1c2UgaGVpZ2h0U3R5bGU6ICJmaWxsIgoJCX0pOwoKCQl2YXIgX2NyZWF0ZSA9IHByb3RvdHlwZS5fY3JlYXRlLAoJCQlfc2V0T3B0aW9uID0gcHJvdG90eXBlLl9zZXRPcHRpb247CgoJCSQuZXh0ZW5kKCBwcm90b3R5cGUsIHsKCQkJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJCQl0aGlzLm9wdGlvbnMuaGVpZ2h0U3R5bGUgPSB0aGlzLm9wdGlvbnMuaGVpZ2h0U3R5bGUgfHwKCQkJCQl0aGlzLl9tZXJnZUhlaWdodFN0eWxlKCk7CgoJCQkJX2NyZWF0ZS5jYWxsKCB0aGlzICk7CgkJCX0sCgoJCQlfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5ICkgewoJCQkJaWYgKCBrZXkgPT09ICJhdXRvSGVpZ2h0IiB8fCBrZXkgPT09ICJjbGVhclN0eWxlIiB8fCBrZXkgPT09ICJmaWxsU3BhY2UiICkgewoJCQkJCXRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZSA9IHRoaXMuX21lcmdlSGVpZ2h0U3R5bGUoKTsKCQkJCX0KCQkJCV9zZXRPcHRpb24uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQl9LAoKCQkJX21lcmdlSGVpZ2h0U3R5bGU6IGZ1bmN0aW9uKCkgewoJCQkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJCQkJaWYgKCBvcHRpb25zLmZpbGxTcGFjZSApIHsKCQkJCQlyZXR1cm4gImZpbGwiOwoJCQkJfQoKCQkJCWlmICggb3B0aW9ucy5jbGVhclN0eWxlICkgewoJCQkJCXJldHVybiAiY29udGVudCI7CgkJCQl9CgoJCQkJaWYgKCBvcHRpb25zLmF1dG9IZWlnaHQgKSB7CgkJCQkJcmV0dXJuICJhdXRvIjsKCQkJCX0KCQkJfQoJCX0pOwoJfSggalF1ZXJ5LCBqUXVlcnkudWkuYWNjb3JkaW9uLnByb3RvdHlwZSApICk7CgoJLy8gaWNvbiBvcHRpb25zCgkoZnVuY3Rpb24oICQsIHByb3RvdHlwZSApIHsKCQkkLmV4dGVuZCggcHJvdG90eXBlLm9wdGlvbnMuaWNvbnMsIHsKCQkJYWN0aXZlSGVhZGVyOiBudWxsLCAvLyByZW1vdmUgZGVmYXVsdCBzbyB3ZSBmYWxsIGJhY2sgdG8gb2xkIHZhbHVlcwoJCQloZWFkZXJTZWxlY3RlZDogInVpLWljb24tdHJpYW5nbGUtMS1zIgoJCX0pOwoKCQl2YXIgX2NyZWF0ZUljb25zID0gcHJvdG90eXBlLl9jcmVhdGVJY29uczsKCQlwcm90b3R5cGUuX2NyZWF0ZUljb25zID0gZnVuY3Rpb24oKSB7CgkJCWlmICggdGhpcy5vcHRpb25zLmljb25zICkgewoJCQkJdGhpcy5vcHRpb25zLmljb25zLmFjdGl2ZUhlYWRlciA9IHRoaXMub3B0aW9ucy5pY29ucy5hY3RpdmVIZWFkZXIgfHwKCQkJCQl0aGlzLm9wdGlvbnMuaWNvbnMuaGVhZGVyU2VsZWN0ZWQ7CgkJCX0KCQkJX2NyZWF0ZUljb25zLmNhbGwoIHRoaXMgKTsKCQl9OwoJfSggalF1ZXJ5LCBqUXVlcnkudWkuYWNjb3JkaW9uLnByb3RvdHlwZSApICk7CgoJLy8gZXhwYW5kZWQgYWN0aXZlIG9wdGlvbiwgYWN0aXZhdGUgbWV0aG9kCgkoZnVuY3Rpb24oICQsIHByb3RvdHlwZSApIHsKCQlwcm90b3R5cGUuYWN0aXZhdGUgPSBwcm90b3R5cGUuX2FjdGl2YXRlOwoKCQl2YXIgX2ZpbmRBY3RpdmUgPSBwcm90b3R5cGUuX2ZpbmRBY3RpdmU7CgkJcHJvdG90eXBlLl9maW5kQWN0aXZlID0gZnVuY3Rpb24oIGluZGV4ICkgewoJCQlpZiAoIGluZGV4ID09PSAtMSApIHsKCQkJCWluZGV4ID0gZmFsc2U7CgkJCX0KCQkJaWYgKCBpbmRleCAmJiB0eXBlb2YgaW5kZXggIT09ICJudW1iZXIiICkgewoJCQkJaW5kZXggPSB0aGlzLmhlYWRlcnMuaW5kZXgoIHRoaXMuaGVhZGVycy5maWx0ZXIoIGluZGV4ICkgKTsKCQkJCWlmICggaW5kZXggPT09IC0xICkgewoJCQkJCWluZGV4ID0gZmFsc2U7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIF9maW5kQWN0aXZlLmNhbGwoIHRoaXMsIGluZGV4ICk7CgkJfTsKCX0oIGpRdWVyeSwgalF1ZXJ5LnVpLmFjY29yZGlvbi5wcm90b3R5cGUgKSApOwoKCS8vIHJlc2l6ZSBtZXRob2QKCWpRdWVyeS51aS5hY2NvcmRpb24ucHJvdG90eXBlLnJlc2l6ZSA9IGpRdWVyeS51aS5hY2NvcmRpb24ucHJvdG90eXBlLnJlZnJlc2g7CgoJLy8gY2hhbmdlIGV2ZW50cwoJKGZ1bmN0aW9uKCAkLCBwcm90b3R5cGUgKSB7CgkJJC5leHRlbmQoIHByb3RvdHlwZS5vcHRpb25zLCB7CgkJCWNoYW5nZTogbnVsbCwKCQkJY2hhbmdlc3RhcnQ6IG51bGwKCQl9KTsKCgkJdmFyIF90cmlnZ2VyID0gcHJvdG90eXBlLl90cmlnZ2VyOwoJCXByb3RvdHlwZS5fdHJpZ2dlciA9IGZ1bmN0aW9uKCB0eXBlLCBldmVudCwgZGF0YSApIHsKCQkJdmFyIHJldCA9IF90cmlnZ2VyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJaWYgKCAhcmV0ICkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQlpZiAoIHR5cGUgPT09ICJiZWZvcmVBY3RpdmF0ZSIgKSB7CgkJCQlyZXQgPSBfdHJpZ2dlci5jYWxsKCB0aGlzLCAiY2hhbmdlc3RhcnQiLCBldmVudCwgewoJCQkJCW9sZEhlYWRlcjogZGF0YS5vbGRIZWFkZXIsCgkJCQkJb2xkQ29udGVudDogZGF0YS5vbGRQYW5lbCwKCQkJCQluZXdIZWFkZXI6IGRhdGEubmV3SGVhZGVyLAoJCQkJCW5ld0NvbnRlbnQ6IGRhdGEubmV3UGFuZWwKCQkJCX0pOwoJCQl9IGVsc2UgaWYgKCB0eXBlID09PSAiYWN0aXZhdGUiICkgewoJCQkJcmV0ID0gX3RyaWdnZXIuY2FsbCggdGhpcywgImNoYW5nZSIsIGV2ZW50LCB7CgkJCQkJb2xkSGVhZGVyOiBkYXRhLm9sZEhlYWRlciwKCQkJCQlvbGRDb250ZW50OiBkYXRhLm9sZFBhbmVsLAoJCQkJCW5ld0hlYWRlcjogZGF0YS5uZXdIZWFkZXIsCgkJCQkJbmV3Q29udGVudDogZGF0YS5uZXdQYW5lbAoJCQkJfSk7CgkJCX0KCQkJcmV0dXJuIHJldDsKCQl9OwoJfSggalF1ZXJ5LCBqUXVlcnkudWkuYWNjb3JkaW9uLnByb3RvdHlwZSApICk7CgoJLy8gYW5pbWF0ZWQgb3B0aW9uCgkvLyBOT1RFOiB0aGlzIG9ubHkgcHJvdmlkZXMgc3VwcG9ydCBmb3IgInNsaWRlIiwgImJvdW5jZXNsaWRlIiwgYW5kIGVhc2luZ3MKCS8vIG5vdCB0aGUgZnVsbCAkLnVpLmFjY29yZGlvbi5hbmltYXRpb25zIEFQSQoJKGZ1bmN0aW9uKCAkLCBwcm90b3R5cGUgKSB7CgkJJC5leHRlbmQoIHByb3RvdHlwZS5vcHRpb25zLCB7CgkJCWFuaW1hdGU6IG51bGwsCgkJCWFuaW1hdGVkOiAic2xpZGUiCgkJfSk7CgoJCXZhciBfY3JlYXRlID0gcHJvdG90eXBlLl9jcmVhdGU7CgkJcHJvdG90eXBlLl9jcmVhdGUgPSBmdW5jdGlvbigpIHsKCQkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgkJCWlmICggb3B0aW9ucy5hbmltYXRlID09PSBudWxsICkgewoJCQkJaWYgKCAhb3B0aW9ucy5hbmltYXRlZCApIHsKCQkJCQlvcHRpb25zLmFuaW1hdGUgPSBmYWxzZTsKCQkJCX0gZWxzZSBpZiAoIG9wdGlvbnMuYW5pbWF0ZWQgPT09ICJzbGlkZSIgKSB7CgkJCQkJb3B0aW9ucy5hbmltYXRlID0gMzAwOwoJCQkJfSBlbHNlIGlmICggb3B0aW9ucy5hbmltYXRlZCA9PT0gImJvdW5jZXNsaWRlIiApIHsKCQkJCQlvcHRpb25zLmFuaW1hdGUgPSB7CgkJCQkJCWR1cmF0aW9uOiAyMDAsCgkJCQkJCWRvd246IHsKCQkJCQkJCWVhc2luZzogImVhc2VPdXRCb3VuY2UiLAoJCQkJCQkJZHVyYXRpb246IDEwMDAKCQkJCQkJfQoJCQkJCX07CgkJCQl9IGVsc2UgewoJCQkJCW9wdGlvbnMuYW5pbWF0ZSA9IG9wdGlvbnMuYW5pbWF0ZWQ7CgkJCQl9CgkJCX0KCgkJCV9jcmVhdGUuY2FsbCggdGhpcyApOwoJCX07Cgl9KCBqUXVlcnksIGpRdWVyeS51aS5hY2NvcmRpb24ucHJvdG90eXBlICkgKTsKfQoKfSkoIGpRdWVyeSApOwooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCi8vIHVzZWQgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgd2l0aCByZW1vdGUgZGF0YSBzb3VyY2VzCnZhciByZXF1ZXN0SW5kZXggPSAwOwoKJC53aWRnZXQoICJ1aS5hdXRvY29tcGxldGUiLCB7Cgl2ZXJzaW9uOiAiMS45LjIiLAoJZGVmYXVsdEVsZW1lbnQ6ICI8aW5wdXQ+IiwKCW9wdGlvbnM6IHsKCQlhcHBlbmRUbzogImJvZHkiLAoJCWF1dG9Gb2N1czogZmFsc2UsCgkJZGVsYXk6IDMwMCwKCQltaW5MZW5ndGg6IDEsCgkJcG9zaXRpb246IHsKCQkJbXk6ICJsZWZ0IHRvcCIsCgkJCWF0OiAibGVmdCBib3R0b20iLAoJCQljb2xsaXNpb246ICJub25lIgoJCX0sCgkJc291cmNlOiBudWxsLAoKCQkvLyBjYWxsYmFja3MKCQljaGFuZ2U6IG51bGwsCgkJY2xvc2U6IG51bGwsCgkJZm9jdXM6IG51bGwsCgkJb3BlbjogbnVsbCwKCQlyZXNwb25zZTogbnVsbCwKCQlzZWFyY2g6IG51bGwsCgkJc2VsZWN0OiBudWxsCgl9LAoKCXBlbmRpbmc6IDAsCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJLy8gU29tZSBicm93c2VycyBvbmx5IHJlcGVhdCBrZXlkb3duIGV2ZW50cywgbm90IGtleXByZXNzIGV2ZW50cywKCQkvLyBzbyB3ZSB1c2UgdGhlIHN1cHByZXNzS2V5UHJlc3MgZmxhZyB0byBkZXRlcm1pbmUgaWYgd2UndmUgYWxyZWFkeQoJCS8vIGhhbmRsZWQgdGhlIGtleWRvd24gZXZlbnQuICM3MjY5CgkJLy8gVW5mb3J0dW5hdGVseSB0aGUgY29kZSBmb3IgJiBpbiBrZXlwcmVzcyBpcyB0aGUgc2FtZSBhcyB0aGUgdXAgYXJyb3csCgkJLy8gc28gd2UgdXNlIHRoZSBzdXBwcmVzc0tleVByZXNzUmVwZWF0IGZsYWcgdG8gYXZvaWQgaGFuZGxpbmcga2V5cHJlc3MKCQkvLyBldmVudHMgd2hlbiB3ZSBrbm93IHRoZSBrZXlkb3duIGV2ZW50IHdhcyB1c2VkIHRvIG1vZGlmeSB0aGUKCQkvLyBzZWFyY2ggdGVybS4gIzc3OTkKCQl2YXIgc3VwcHJlc3NLZXlQcmVzcywgc3VwcHJlc3NLZXlQcmVzc1JlcGVhdCwgc3VwcHJlc3NJbnB1dDsKCgkJdGhpcy5pc011bHRpTGluZSA9IHRoaXMuX2lzTXVsdGlMaW5lKCk7CgkJdGhpcy52YWx1ZU1ldGhvZCA9IHRoaXMuZWxlbWVudFsgdGhpcy5lbGVtZW50LmlzKCAiaW5wdXQsdGV4dGFyZWEiICkgPyAidmFsIiA6ICJ0ZXh0IiBdOwoJCXRoaXMuaXNOZXdNZW51ID0gdHJ1ZTsKCgkJdGhpcy5lbGVtZW50CgkJCS5hZGRDbGFzcyggInVpLWF1dG9jb21wbGV0ZS1pbnB1dCIgKQoJCQkuYXR0ciggImF1dG9jb21wbGV0ZSIsICJvZmYiICk7CgoJCXRoaXMuX29uKCB0aGlzLmVsZW1lbnQsIHsKCQkJa2V5ZG93bjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJaWYgKCB0aGlzLmVsZW1lbnQucHJvcCggInJlYWRPbmx5IiApICkgewoJCQkJCXN1cHByZXNzS2V5UHJlc3MgPSB0cnVlOwoJCQkJCXN1cHByZXNzSW5wdXQgPSB0cnVlOwoJCQkJCXN1cHByZXNzS2V5UHJlc3NSZXBlYXQgPSB0cnVlOwoJCQkJCXJldHVybjsKCQkJCX0KCgkJCQlzdXBwcmVzc0tleVByZXNzID0gZmFsc2U7CgkJCQlzdXBwcmVzc0lucHV0ID0gZmFsc2U7CgkJCQlzdXBwcmVzc0tleVByZXNzUmVwZWF0ID0gZmFsc2U7CgkJCQl2YXIga2V5Q29kZSA9ICQudWkua2V5Q29kZTsKCQkJCXN3aXRjaCggZXZlbnQua2V5Q29kZSApIHsKCQkJCWNhc2Uga2V5Q29kZS5QQUdFX1VQOgoJCQkJCXN1cHByZXNzS2V5UHJlc3MgPSB0cnVlOwoJCQkJCXRoaXMuX21vdmUoICJwcmV2aW91c1BhZ2UiLCBldmVudCApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBrZXlDb2RlLlBBR0VfRE9XTjoKCQkJCQlzdXBwcmVzc0tleVByZXNzID0gdHJ1ZTsKCQkJCQl0aGlzLl9tb3ZlKCAibmV4dFBhZ2UiLCBldmVudCApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBrZXlDb2RlLlVQOgoJCQkJCXN1cHByZXNzS2V5UHJlc3MgPSB0cnVlOwoJCQkJCXRoaXMuX2tleUV2ZW50KCAicHJldmlvdXMiLCBldmVudCApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBrZXlDb2RlLkRPV046CgkJCQkJc3VwcHJlc3NLZXlQcmVzcyA9IHRydWU7CgkJCQkJdGhpcy5fa2V5RXZlbnQoICJuZXh0IiwgZXZlbnQgKTsKCQkJCQlicmVhazsKCQkJCWNhc2Uga2V5Q29kZS5FTlRFUjoKCQkJCWNhc2Uga2V5Q29kZS5OVU1QQURfRU5URVI6CgkJCQkJLy8gd2hlbiBtZW51IGlzIG9wZW4gYW5kIGhhcyBmb2N1cwoJCQkJCWlmICggdGhpcy5tZW51LmFjdGl2ZSApIHsKCQkJCQkJLy8gIzYwNTUgLSBPcGVyYSBzdGlsbCBhbGxvd3MgdGhlIGtleXByZXNzIHRvIG9jY3VyCgkJCQkJCS8vIHdoaWNoIGNhdXNlcyBmb3JtcyB0byBzdWJtaXQKCQkJCQkJc3VwcHJlc3NLZXlQcmVzcyA9IHRydWU7CgkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCXRoaXMubWVudS5zZWxlY3QoIGV2ZW50ICk7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJY2FzZSBrZXlDb2RlLlRBQjoKCQkJCQlpZiAoIHRoaXMubWVudS5hY3RpdmUgKSB7CgkJCQkJCXRoaXMubWVudS5zZWxlY3QoIGV2ZW50ICk7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJY2FzZSBrZXlDb2RlLkVTQ0FQRToKCQkJCQlpZiAoIHRoaXMubWVudS5lbGVtZW50LmlzKCAiOnZpc2libGUiICkgKSB7CgkJCQkJCXRoaXMuX3ZhbHVlKCB0aGlzLnRlcm0gKTsKCQkJCQkJdGhpcy5jbG9zZSggZXZlbnQgKTsKCQkJCQkJLy8gRGlmZmVyZW50IGJyb3dzZXJzIGhhdmUgZGlmZmVyZW50IGRlZmF1bHQgYmVoYXZpb3IgZm9yIGVzY2FwZQoJCQkJCQkvLyBTaW5nbGUgcHJlc3MgY2FuIG1lYW4gdW5kbyBvciBjbGVhcgoJCQkJCQkvLyBEb3VibGUgcHJlc3MgaW4gSUUgbWVhbnMgY2xlYXIgdGhlIHdob2xlIGZvcm0KCQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCXN1cHByZXNzS2V5UHJlc3NSZXBlYXQgPSB0cnVlOwoJCQkJCS8vIHNlYXJjaCB0aW1lb3V0IHNob3VsZCBiZSB0cmlnZ2VyZWQgYmVmb3JlIHRoZSBpbnB1dCB2YWx1ZSBpcyBjaGFuZ2VkCgkJCQkJdGhpcy5fc2VhcmNoVGltZW91dCggZXZlbnQgKTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfSwKCQkJa2V5cHJlc3M6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWlmICggc3VwcHJlc3NLZXlQcmVzcyApIHsKCQkJCQlzdXBwcmVzc0tleVByZXNzID0gZmFsc2U7CgkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlpZiAoIHN1cHByZXNzS2V5UHJlc3NSZXBlYXQgKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoKCQkJCS8vIHJlcGxpY2F0ZSBzb21lIGtleSBoYW5kbGVycyB0byBhbGxvdyB0aGVtIHRvIHJlcGVhdCBpbiBGaXJlZm94IGFuZCBPcGVyYQoJCQkJdmFyIGtleUNvZGUgPSAkLnVpLmtleUNvZGU7CgkJCQlzd2l0Y2goIGV2ZW50LmtleUNvZGUgKSB7CgkJCQljYXNlIGtleUNvZGUuUEFHRV9VUDoKCQkJCQl0aGlzLl9tb3ZlKCAicHJldmlvdXNQYWdlIiwgZXZlbnQgKTsKCQkJCQlicmVhazsKCQkJCWNhc2Uga2V5Q29kZS5QQUdFX0RPV046CgkJCQkJdGhpcy5fbW92ZSggIm5leHRQYWdlIiwgZXZlbnQgKTsKCQkJCQlicmVhazsKCQkJCWNhc2Uga2V5Q29kZS5VUDoKCQkJCQl0aGlzLl9rZXlFdmVudCggInByZXZpb3VzIiwgZXZlbnQgKTsKCQkJCQlicmVhazsKCQkJCWNhc2Uga2V5Q29kZS5ET1dOOgoJCQkJCXRoaXMuX2tleUV2ZW50KCAibmV4dCIsIGV2ZW50ICk7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0sCgkJCWlucHV0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlpZiAoIHN1cHByZXNzSW5wdXQgKSB7CgkJCQkJc3VwcHJlc3NJbnB1dCA9IGZhbHNlOwoJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQkJdGhpcy5fc2VhcmNoVGltZW91dCggZXZlbnQgKTsKCQkJfSwKCQkJZm9jdXM6IGZ1bmN0aW9uKCkgewoJCQkJdGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsOwoJCQkJdGhpcy5wcmV2aW91cyA9IHRoaXMuX3ZhbHVlKCk7CgkJCX0sCgkJCWJsdXI6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWlmICggdGhpcy5jYW5jZWxCbHVyICkgewoJCQkJCWRlbGV0ZSB0aGlzLmNhbmNlbEJsdXI7CgkJCQkJcmV0dXJuOwoJCQkJfQoKCQkJCWNsZWFyVGltZW91dCggdGhpcy5zZWFyY2hpbmcgKTsKCQkJCXRoaXMuY2xvc2UoIGV2ZW50ICk7CgkJCQl0aGlzLl9jaGFuZ2UoIGV2ZW50ICk7CgkJCX0KCQl9KTsKCgkJdGhpcy5faW5pdFNvdXJjZSgpOwoJCXRoaXMubWVudSA9ICQoICI8dWw+IiApCgkJCS5hZGRDbGFzcyggInVpLWF1dG9jb21wbGV0ZSIgKQoJCQkuYXBwZW5kVG8oIHRoaXMuZG9jdW1lbnQuZmluZCggdGhpcy5vcHRpb25zLmFwcGVuZFRvIHx8ICJib2R5IiApWyAwIF0gKQoJCQkubWVudSh7CgkJCQkvLyBjdXN0b20ga2V5IGhhbmRsaW5nIGZvciBub3cKCQkJCWlucHV0OiAkKCksCgkJCQkvLyBkaXNhYmxlIEFSSUEgc3VwcG9ydCwgdGhlIGxpdmUgcmVnaW9uIHRha2VzIGNhcmUgb2YgdGhhdAoJCQkJcm9sZTogbnVsbAoJCQl9KQoJCQkuekluZGV4KCB0aGlzLmVsZW1lbnQuekluZGV4KCkgKyAxICkKCQkJLmhpZGUoKQoJCQkuZGF0YSggIm1lbnUiICk7CgoJCXRoaXMuX29uKCB0aGlzLm1lbnUuZWxlbWVudCwgewoJCQltb3VzZWRvd246IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCS8vIHByZXZlbnQgbW92aW5nIGZvY3VzIG91dCBvZiB0aGUgdGV4dCBmaWVsZAoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCgkJCQkvLyBJRSBkb2Vzbid0IHByZXZlbnQgbW92aW5nIGZvY3VzIGV2ZW4gd2l0aCBldmVudC5wcmV2ZW50RGVmYXVsdCgpCgkJCQkvLyBzbyB3ZSBzZXQgYSBmbGFnIHRvIGtub3cgd2hlbiB3ZSBzaG91bGQgaWdub3JlIHRoZSBibHVyIGV2ZW50CgkJCQl0aGlzLmNhbmNlbEJsdXIgPSB0cnVlOwoJCQkJdGhpcy5fZGVsYXkoZnVuY3Rpb24oKSB7CgkJCQkJZGVsZXRlIHRoaXMuY2FuY2VsQmx1cjsKCQkJCX0pOwoKCQkJCS8vIGNsaWNraW5nIG9uIHRoZSBzY3JvbGxiYXIgY2F1c2VzIGZvY3VzIHRvIHNoaWZ0IHRvIHRoZSBib2R5CgkJCQkvLyBidXQgd2UgY2FuJ3QgZGV0ZWN0IGEgbW91c2V1cCBvciBhIGNsaWNrIGltbWVkaWF0ZWx5IGFmdGVyd2FyZAoJCQkJLy8gc28gd2UgaGF2ZSB0byB0cmFjayB0aGUgbmV4dCBtb3VzZWRvd24gYW5kIGNsb3NlIHRoZSBtZW51IGlmCgkJCQkvLyB0aGUgdXNlciBjbGlja3Mgc29tZXdoZXJlIG91dHNpZGUgb2YgdGhlIGF1dG9jb21wbGV0ZQoJCQkJdmFyIG1lbnVFbGVtZW50ID0gdGhpcy5tZW51LmVsZW1lbnRbIDAgXTsKCQkJCWlmICggISQoIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoICIudWktbWVudS1pdGVtIiApLmxlbmd0aCApIHsKCQkJCQl0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJCQkJdmFyIHRoYXQgPSB0aGlzOwoJCQkJCQl0aGlzLmRvY3VtZW50Lm9uZSggIm1vdXNlZG93biIsIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQkJCWlmICggZXZlbnQudGFyZ2V0ICE9PSB0aGF0LmVsZW1lbnRbIDAgXSAmJgoJCQkJCQkJCQlldmVudC50YXJnZXQgIT09IG1lbnVFbGVtZW50ICYmCgkJCQkJCQkJCSEkLmNvbnRhaW5zKCBtZW51RWxlbWVudCwgZXZlbnQudGFyZ2V0ICkgKSB7CgkJCQkJCQkJdGhhdC5jbG9zZSgpOwoJCQkJCQkJfQoJCQkJCQl9KTsKCQkJCQl9KTsKCQkJCX0KCQkJfSwKCQkJbWVudWZvY3VzOiBmdW5jdGlvbiggZXZlbnQsIHVpICkgewoJCQkJLy8gIzcwMjQgLSBQcmV2ZW50IGFjY2lkZW50YWwgYWN0aXZhdGlvbiBvZiBtZW51IGl0ZW1zIGluIEZpcmVmb3gKCQkJCWlmICggdGhpcy5pc05ld01lbnUgKSB7CgkJCQkJdGhpcy5pc05ld01lbnUgPSBmYWxzZTsKCQkJCQlpZiAoIGV2ZW50Lm9yaWdpbmFsRXZlbnQgJiYgL15tb3VzZS8udGVzdCggZXZlbnQub3JpZ2luYWxFdmVudC50eXBlICkgKSB7CgkJCQkJCXRoaXMubWVudS5ibHVyKCk7CgoJCQkJCQl0aGlzLmRvY3VtZW50Lm9uZSggIm1vdXNlbW92ZSIsIGZ1bmN0aW9uKCkgewoJCQkJCQkJJCggZXZlbnQudGFyZ2V0ICkudHJpZ2dlciggZXZlbnQub3JpZ2luYWxFdmVudCApOwoJCQkJCQl9KTsKCgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gYmFjayBjb21wYXQgZm9yIF9yZW5kZXJJdGVtIHVzaW5nIGl0ZW0uYXV0b2NvbXBsZXRlLCB2aWEgIzc4MTAKCQkJCS8vIFRPRE8gcmVtb3ZlIHRoZSBmYWxsYmFjaywgc2VlICM4MTU2CgkJCQl2YXIgaXRlbSA9IHVpLml0ZW0uZGF0YSggInVpLWF1dG9jb21wbGV0ZS1pdGVtIiApIHx8IHVpLml0ZW0uZGF0YSggIml0ZW0uYXV0b2NvbXBsZXRlIiApOwoJCQkJaWYgKCBmYWxzZSAhPT0gdGhpcy5fdHJpZ2dlciggImZvY3VzIiwgZXZlbnQsIHsgaXRlbTogaXRlbSB9ICkgKSB7CgkJCQkJLy8gdXNlIHZhbHVlIHRvIG1hdGNoIHdoYXQgd2lsbCBlbmQgdXAgaW4gdGhlIGlucHV0LCBpZiBpdCB3YXMgYSBrZXkgZXZlbnQKCQkJCQlpZiAoIGV2ZW50Lm9yaWdpbmFsRXZlbnQgJiYgL15rZXkvLnRlc3QoIGV2ZW50Lm9yaWdpbmFsRXZlbnQudHlwZSApICkgewoJCQkJCQl0aGlzLl92YWx1ZSggaXRlbS52YWx1ZSApOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJLy8gTm9ybWFsbHkgdGhlIGlucHV0IGlzIHBvcHVsYXRlZCB3aXRoIHRoZSBpdGVtJ3MgdmFsdWUgYXMgdGhlCgkJCQkJLy8gbWVudSBpcyBuYXZpZ2F0ZWQsIGNhdXNpbmcgc2NyZWVuIHJlYWRlcnMgdG8gbm90aWNlIGEgY2hhbmdlIGFuZAoJCQkJCS8vIGFubm91bmNlIHRoZSBpdGVtLiBTaW5jZSB0aGUgZm9jdXMgZXZlbnQgd2FzIGNhbmNlbGVkLCB0aGlzIGRvZXNuJ3QKCQkJCQkvLyBoYXBwZW4sIHNvIHdlIHVwZGF0ZSB0aGUgbGl2ZSByZWdpb24gc28gdGhhdCBzY3JlZW4gcmVhZGVycyBjYW4KCQkJCQkvLyBzdGlsbCBub3RpY2UgdGhlIGNoYW5nZSBhbmQgYW5ub3VuY2UgaXQuCgkJCQkJdGhpcy5saXZlUmVnaW9uLnRleHQoIGl0ZW0udmFsdWUgKTsKCQkJCX0KCQkJfSwKCQkJbWVudXNlbGVjdDogZnVuY3Rpb24oIGV2ZW50LCB1aSApIHsKCQkJCS8vIGJhY2sgY29tcGF0IGZvciBfcmVuZGVySXRlbSB1c2luZyBpdGVtLmF1dG9jb21wbGV0ZSwgdmlhICM3ODEwCgkJCQkvLyBUT0RPIHJlbW92ZSB0aGUgZmFsbGJhY2ssIHNlZSAjODE1NgoJCQkJdmFyIGl0ZW0gPSB1aS5pdGVtLmRhdGEoICJ1aS1hdXRvY29tcGxldGUtaXRlbSIgKSB8fCB1aS5pdGVtLmRhdGEoICJpdGVtLmF1dG9jb21wbGV0ZSIgKSwKCQkJCQlwcmV2aW91cyA9IHRoaXMucHJldmlvdXM7CgoJCQkJLy8gb25seSB0cmlnZ2VyIHdoZW4gZm9jdXMgd2FzIGxvc3QgKGNsaWNrIG9uIG1lbnUpCgkJCQlpZiAoIHRoaXMuZWxlbWVudFswXSAhPT0gdGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50ICkgewoJCQkJCXRoaXMuZWxlbWVudC5mb2N1cygpOwoJCQkJCXRoaXMucHJldmlvdXMgPSBwcmV2aW91czsKCQkJCQkvLyAjNjEwOSAtIElFIHRyaWdnZXJzIHR3byBmb2N1cyBldmVudHMgYW5kIHRoZSBzZWNvbmQKCQkJCQkvLyBpcyBhc3luY2hyb25vdXMsIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHByZXZpb3VzCgkJCQkJLy8gdGVybSBzeW5jaHJvbm91c2x5IGFuZCBhc3luY2hyb25vdXNseSA6LSgKCQkJCQl0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJCQkJdGhpcy5wcmV2aW91cyA9IHByZXZpb3VzOwoJCQkJCQl0aGlzLnNlbGVjdGVkSXRlbSA9IGl0ZW07CgkJCQkJfSk7CgkJCQl9CgoJCQkJaWYgKCBmYWxzZSAhPT0gdGhpcy5fdHJpZ2dlciggInNlbGVjdCIsIGV2ZW50LCB7IGl0ZW06IGl0ZW0gfSApICkgewoJCQkJCXRoaXMuX3ZhbHVlKCBpdGVtLnZhbHVlICk7CgkJCQl9CgkJCQkvLyByZXNldCB0aGUgdGVybSBhZnRlciB0aGUgc2VsZWN0IGV2ZW50CgkJCQkvLyB0aGlzIGFsbG93cyBjdXN0b20gc2VsZWN0IGhhbmRsaW5nIHRvIHdvcmsgcHJvcGVybHkKCQkJCXRoaXMudGVybSA9IHRoaXMuX3ZhbHVlKCk7CgoJCQkJdGhpcy5jbG9zZSggZXZlbnQgKTsKCQkJCXRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTsKCQkJfQoJCX0pOwoKCQl0aGlzLmxpdmVSZWdpb24gPSAkKCAiPHNwYW4+IiwgewoJCQkJcm9sZTogInN0YXR1cyIsCgkJCQkiYXJpYS1saXZlIjogInBvbGl0ZSIKCQkJfSkKCQkJLmFkZENsYXNzKCAidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIiApCgkJCS5pbnNlcnRBZnRlciggdGhpcy5lbGVtZW50ICk7CgoJCWlmICggJC5mbi5iZ2lmcmFtZSApIHsKCQkJdGhpcy5tZW51LmVsZW1lbnQuYmdpZnJhbWUoKTsKCQl9CgoJCS8vIHR1cm5pbmcgb2ZmIGF1dG9jb21wbGV0ZSBwcmV2ZW50cyB0aGUgYnJvd3NlciBmcm9tIHJlbWVtYmVyaW5nIHRoZQoJCS8vIHZhbHVlIHdoZW4gbmF2aWdhdGluZyB0aHJvdWdoIGhpc3RvcnksIHNvIHdlIHJlLWVuYWJsZSBhdXRvY29tcGxldGUKCQkvLyBpZiB0aGUgcGFnZSBpcyB1bmxvYWRlZCBiZWZvcmUgdGhlIHdpZGdldCBpcyBkZXN0cm95ZWQuICM3NzkwCgkJdGhpcy5fb24oIHRoaXMud2luZG93LCB7CgkJCWJlZm9yZXVubG9hZDogZnVuY3Rpb24oKSB7CgkJCQl0aGlzLmVsZW1lbnQucmVtb3ZlQXR0ciggImF1dG9jb21wbGV0ZSIgKTsKCQkJfQoJCX0pOwoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJY2xlYXJUaW1lb3V0KCB0aGlzLnNlYXJjaGluZyApOwoJCXRoaXMuZWxlbWVudAoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1hdXRvY29tcGxldGUtaW5wdXQiICkKCQkJLnJlbW92ZUF0dHIoICJhdXRvY29tcGxldGUiICk7CgkJdGhpcy5tZW51LmVsZW1lbnQucmVtb3ZlKCk7CgkJdGhpcy5saXZlUmVnaW9uLnJlbW92ZSgpOwoJfSwKCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLl9zdXBlcigga2V5LCB2YWx1ZSApOwoJCWlmICgga2V5ID09PSAic291cmNlIiApIHsKCQkJdGhpcy5faW5pdFNvdXJjZSgpOwoJCX0KCQlpZiAoIGtleSA9PT0gImFwcGVuZFRvIiApIHsKCQkJdGhpcy5tZW51LmVsZW1lbnQuYXBwZW5kVG8oIHRoaXMuZG9jdW1lbnQuZmluZCggdmFsdWUgfHwgImJvZHkiIClbMF0gKTsKCQl9CgkJaWYgKCBrZXkgPT09ICJkaXNhYmxlZCIgJiYgdmFsdWUgJiYgdGhpcy54aHIgKSB7CgkJCXRoaXMueGhyLmFib3J0KCk7CgkJfQoJfSwKCglfaXNNdWx0aUxpbmU6IGZ1bmN0aW9uKCkgewoJCS8vIFRleHRhcmVhcyBhcmUgYWx3YXlzIG11bHRpLWxpbmUKCQlpZiAoIHRoaXMuZWxlbWVudC5pcyggInRleHRhcmVhIiApICkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJLy8gSW5wdXRzIGFyZSBhbHdheXMgc2luZ2xlLWxpbmUsIGV2ZW4gaWYgaW5zaWRlIGEgY29udGVudEVkaXRhYmxlIGVsZW1lbnQKCQkvLyBJRSBhbHNvIHRyZWF0cyBpbnB1dHMgYXMgY29udGVudEVkaXRhYmxlCgkJaWYgKCB0aGlzLmVsZW1lbnQuaXMoICJpbnB1dCIgKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkvLyBBbGwgb3RoZXIgZWxlbWVudCB0eXBlcyBhcmUgZGV0ZXJtaW5lZCBieSB3aGV0aGVyIG9yIG5vdCB0aGV5J3JlIGNvbnRlbnRFZGl0YWJsZQoJCXJldHVybiB0aGlzLmVsZW1lbnQucHJvcCggImlzQ29udGVudEVkaXRhYmxlIiApOwoJfSwKCglfaW5pdFNvdXJjZTogZnVuY3Rpb24oKSB7CgkJdmFyIGFycmF5LCB1cmwsCgkJCXRoYXQgPSB0aGlzOwoJCWlmICggJC5pc0FycmF5KHRoaXMub3B0aW9ucy5zb3VyY2UpICkgewoJCQlhcnJheSA9IHRoaXMub3B0aW9ucy5zb3VyY2U7CgkJCXRoaXMuc291cmNlID0gZnVuY3Rpb24oIHJlcXVlc3QsIHJlc3BvbnNlICkgewoJCQkJcmVzcG9uc2UoICQudWkuYXV0b2NvbXBsZXRlLmZpbHRlciggYXJyYXksIHJlcXVlc3QudGVybSApICk7CgkJCX07CgkJfSBlbHNlIGlmICggdHlwZW9mIHRoaXMub3B0aW9ucy5zb3VyY2UgPT09ICJzdHJpbmciICkgewoJCQl1cmwgPSB0aGlzLm9wdGlvbnMuc291cmNlOwoJCQl0aGlzLnNvdXJjZSA9IGZ1bmN0aW9uKCByZXF1ZXN0LCByZXNwb25zZSApIHsKCQkJCWlmICggdGhhdC54aHIgKSB7CgkJCQkJdGhhdC54aHIuYWJvcnQoKTsKCQkJCX0KCQkJCXRoYXQueGhyID0gJC5hamF4KHsKCQkJCQl1cmw6IHVybCwKCQkJCQlkYXRhOiByZXF1ZXN0LAoJCQkJCWRhdGFUeXBlOiAianNvbiIsCgkJCQkJc3VjY2VzczogZnVuY3Rpb24oIGRhdGEgKSB7CgkJCQkJCXJlc3BvbnNlKCBkYXRhICk7CgkJCQkJfSwKCQkJCQllcnJvcjogZnVuY3Rpb24oKSB7CgkJCQkJCXJlc3BvbnNlKCBbXSApOwoJCQkJCX0KCQkJCX0pOwoJCQl9OwoJCX0gZWxzZSB7CgkJCXRoaXMuc291cmNlID0gdGhpcy5vcHRpb25zLnNvdXJjZTsKCQl9Cgl9LAoKCV9zZWFyY2hUaW1lb3V0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJY2xlYXJUaW1lb3V0KCB0aGlzLnNlYXJjaGluZyApOwoJCXRoaXMuc2VhcmNoaW5nID0gdGhpcy5fZGVsYXkoZnVuY3Rpb24oKSB7CgkJCS8vIG9ubHkgc2VhcmNoIGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZAoJCQlpZiAoIHRoaXMudGVybSAhPT0gdGhpcy5fdmFsdWUoKSApIHsKCQkJCXRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKCQkJCXRoaXMuc2VhcmNoKCBudWxsLCBldmVudCApOwoJCQl9CgkJfSwgdGhpcy5vcHRpb25zLmRlbGF5ICk7Cgl9LAoKCXNlYXJjaDogZnVuY3Rpb24oIHZhbHVlLCBldmVudCApIHsKCQl2YWx1ZSA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6IHRoaXMuX3ZhbHVlKCk7CgoJCS8vIGFsd2F5cyBzYXZlIHRoZSBhY3R1YWwgdmFsdWUsIG5vdCB0aGUgb25lIHBhc3NlZCBhcyBhbiBhcmd1bWVudAoJCXRoaXMudGVybSA9IHRoaXMuX3ZhbHVlKCk7CgoJCWlmICggdmFsdWUubGVuZ3RoIDwgdGhpcy5vcHRpb25zLm1pbkxlbmd0aCApIHsKCQkJcmV0dXJuIHRoaXMuY2xvc2UoIGV2ZW50ICk7CgkJfQoKCQlpZiAoIHRoaXMuX3RyaWdnZXIoICJzZWFyY2giLCBldmVudCApID09PSBmYWxzZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJcmV0dXJuIHRoaXMuX3NlYXJjaCggdmFsdWUgKTsKCX0sCgoJX3NlYXJjaDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXRoaXMucGVuZGluZysrOwoJCXRoaXMuZWxlbWVudC5hZGRDbGFzcyggInVpLWF1dG9jb21wbGV0ZS1sb2FkaW5nIiApOwoJCXRoaXMuY2FuY2VsU2VhcmNoID0gZmFsc2U7CgoJCXRoaXMuc291cmNlKCB7IHRlcm06IHZhbHVlIH0sIHRoaXMuX3Jlc3BvbnNlKCkgKTsKCX0sCgoJX3Jlc3BvbnNlOiBmdW5jdGlvbigpIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCWluZGV4ID0gKytyZXF1ZXN0SW5kZXg7CgoJCXJldHVybiBmdW5jdGlvbiggY29udGVudCApIHsKCQkJaWYgKCBpbmRleCA9PT0gcmVxdWVzdEluZGV4ICkgewoJCQkJdGhhdC5fX3Jlc3BvbnNlKCBjb250ZW50ICk7CgkJCX0KCgkJCXRoYXQucGVuZGluZy0tOwoJCQlpZiAoICF0aGF0LnBlbmRpbmcgKSB7CgkJCQl0aGF0LmVsZW1lbnQucmVtb3ZlQ2xhc3MoICJ1aS1hdXRvY29tcGxldGUtbG9hZGluZyIgKTsKCQkJfQoJCX07Cgl9LAoKCV9fcmVzcG9uc2U6IGZ1bmN0aW9uKCBjb250ZW50ICkgewoJCWlmICggY29udGVudCApIHsKCQkJY29udGVudCA9IHRoaXMuX25vcm1hbGl6ZSggY29udGVudCApOwoJCX0KCQl0aGlzLl90cmlnZ2VyKCAicmVzcG9uc2UiLCBudWxsLCB7IGNvbnRlbnQ6IGNvbnRlbnQgfSApOwoJCWlmICggIXRoaXMub3B0aW9ucy5kaXNhYmxlZCAmJiBjb250ZW50ICYmIGNvbnRlbnQubGVuZ3RoICYmICF0aGlzLmNhbmNlbFNlYXJjaCApIHsKCQkJdGhpcy5fc3VnZ2VzdCggY29udGVudCApOwoJCQl0aGlzLl90cmlnZ2VyKCAib3BlbiIgKTsKCQl9IGVsc2UgewoJCQkvLyB1c2UgLl9jbG9zZSgpIGluc3RlYWQgb2YgLmNsb3NlKCkgc28gd2UgZG9uJ3QgY2FuY2VsIGZ1dHVyZSBzZWFyY2hlcwoJCQl0aGlzLl9jbG9zZSgpOwoJCX0KCX0sCgoJY2xvc2U6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl0aGlzLmNhbmNlbFNlYXJjaCA9IHRydWU7CgkJdGhpcy5fY2xvc2UoIGV2ZW50ICk7Cgl9LAoKCV9jbG9zZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCWlmICggdGhpcy5tZW51LmVsZW1lbnQuaXMoICI6dmlzaWJsZSIgKSApIHsKCQkJdGhpcy5tZW51LmVsZW1lbnQuaGlkZSgpOwoJCQl0aGlzLm1lbnUuYmx1cigpOwoJCQl0aGlzLmlzTmV3TWVudSA9IHRydWU7CgkJCXRoaXMuX3RyaWdnZXIoICJjbG9zZSIsIGV2ZW50ICk7CgkJfQoJfSwKCglfY2hhbmdlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCB0aGlzLnByZXZpb3VzICE9PSB0aGlzLl92YWx1ZSgpICkgewoJCQl0aGlzLl90cmlnZ2VyKCAiY2hhbmdlIiwgZXZlbnQsIHsgaXRlbTogdGhpcy5zZWxlY3RlZEl0ZW0gfSApOwoJCX0KCX0sCgoJX25vcm1hbGl6ZTogZnVuY3Rpb24oIGl0ZW1zICkgewoJCS8vIGFzc3VtZSBhbGwgaXRlbXMgaGF2ZSB0aGUgcmlnaHQgZm9ybWF0IHdoZW4gdGhlIGZpcnN0IGl0ZW0gaXMgY29tcGxldGUKCQlpZiAoIGl0ZW1zLmxlbmd0aCAmJiBpdGVtc1swXS5sYWJlbCAmJiBpdGVtc1swXS52YWx1ZSApIHsKCQkJcmV0dXJuIGl0ZW1zOwoJCX0KCQlyZXR1cm4gJC5tYXAoIGl0ZW1zLCBmdW5jdGlvbiggaXRlbSApIHsKCQkJaWYgKCB0eXBlb2YgaXRlbSA9PT0gInN0cmluZyIgKSB7CgkJCQlyZXR1cm4gewoJCQkJCWxhYmVsOiBpdGVtLAoJCQkJCXZhbHVlOiBpdGVtCgkJCQl9OwoJCQl9CgkJCXJldHVybiAkLmV4dGVuZCh7CgkJCQlsYWJlbDogaXRlbS5sYWJlbCB8fCBpdGVtLnZhbHVlLAoJCQkJdmFsdWU6IGl0ZW0udmFsdWUgfHwgaXRlbS5sYWJlbAoJCQl9LCBpdGVtICk7CgkJfSk7Cgl9LAoKCV9zdWdnZXN0OiBmdW5jdGlvbiggaXRlbXMgKSB7CgkJdmFyIHVsID0gdGhpcy5tZW51LmVsZW1lbnQKCQkJLmVtcHR5KCkKCQkJLnpJbmRleCggdGhpcy5lbGVtZW50LnpJbmRleCgpICsgMSApOwoJCXRoaXMuX3JlbmRlck1lbnUoIHVsLCBpdGVtcyApOwoJCXRoaXMubWVudS5yZWZyZXNoKCk7CgoJCS8vIHNpemUgYW5kIHBvc2l0aW9uIG1lbnUKCQl1bC5zaG93KCk7CgkJdGhpcy5fcmVzaXplTWVudSgpOwoJCXVsLnBvc2l0aW9uKCAkLmV4dGVuZCh7CgkJCW9mOiB0aGlzLmVsZW1lbnQKCQl9LCB0aGlzLm9wdGlvbnMucG9zaXRpb24gKSk7CgoJCWlmICggdGhpcy5vcHRpb25zLmF1dG9Gb2N1cyApIHsKCQkJdGhpcy5tZW51Lm5leHQoKTsKCQl9Cgl9LAoKCV9yZXNpemVNZW51OiBmdW5jdGlvbigpIHsKCQl2YXIgdWwgPSB0aGlzLm1lbnUuZWxlbWVudDsKCQl1bC5vdXRlcldpZHRoKCBNYXRoLm1heCgKCQkJLy8gRmlyZWZveCB3cmFwcyBsb25nIHRleHQgKHBvc3NpYmx5IGEgcm91bmRpbmcgYnVnKQoJCQkvLyBzbyB3ZSBhZGQgMXB4IHRvIGF2b2lkIHRoZSB3cmFwcGluZyAoIzc1MTMpCgkJCXVsLndpZHRoKCAiIiApLm91dGVyV2lkdGgoKSArIDEsCgkJCXRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCkKCQkpICk7Cgl9LAoKCV9yZW5kZXJNZW51OiBmdW5jdGlvbiggdWwsIGl0ZW1zICkgewoJCXZhciB0aGF0ID0gdGhpczsKCQkkLmVhY2goIGl0ZW1zLCBmdW5jdGlvbiggaW5kZXgsIGl0ZW0gKSB7CgkJCXRoYXQuX3JlbmRlckl0ZW1EYXRhKCB1bCwgaXRlbSApOwoJCX0pOwoJfSwKCglfcmVuZGVySXRlbURhdGE6IGZ1bmN0aW9uKCB1bCwgaXRlbSApIHsKCQlyZXR1cm4gdGhpcy5fcmVuZGVySXRlbSggdWwsIGl0ZW0gKS5kYXRhKCAidWktYXV0b2NvbXBsZXRlLWl0ZW0iLCBpdGVtICk7Cgl9LAoKCV9yZW5kZXJJdGVtOiBmdW5jdGlvbiggdWwsIGl0ZW0gKSB7CgkJcmV0dXJuICQoICI8bGk+IiApCgkJCS5hcHBlbmQoICQoICI8YT4iICkudGV4dCggaXRlbS5sYWJlbCApICkKCQkJLmFwcGVuZFRvKCB1bCApOwoJfSwKCglfbW92ZTogZnVuY3Rpb24oIGRpcmVjdGlvbiwgZXZlbnQgKSB7CgkJaWYgKCAhdGhpcy5tZW51LmVsZW1lbnQuaXMoICI6dmlzaWJsZSIgKSApIHsKCQkJdGhpcy5zZWFyY2goIG51bGwsIGV2ZW50ICk7CgkJCXJldHVybjsKCQl9CgkJaWYgKCB0aGlzLm1lbnUuaXNGaXJzdEl0ZW0oKSAmJiAvXnByZXZpb3VzLy50ZXN0KCBkaXJlY3Rpb24gKSB8fAoJCQkJdGhpcy5tZW51LmlzTGFzdEl0ZW0oKSAmJiAvXm5leHQvLnRlc3QoIGRpcmVjdGlvbiApICkgewoJCQl0aGlzLl92YWx1ZSggdGhpcy50ZXJtICk7CgkJCXRoaXMubWVudS5ibHVyKCk7CgkJCXJldHVybjsKCQl9CgkJdGhpcy5tZW51WyBkaXJlY3Rpb24gXSggZXZlbnQgKTsKCX0sCgoJd2lkZ2V0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5tZW51LmVsZW1lbnQ7Cgl9LAoKCV92YWx1ZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMudmFsdWVNZXRob2QuYXBwbHkoIHRoaXMuZWxlbWVudCwgYXJndW1lbnRzICk7Cgl9LAoKCV9rZXlFdmVudDogZnVuY3Rpb24oIGtleUV2ZW50LCBldmVudCApIHsKCQlpZiAoICF0aGlzLmlzTXVsdGlMaW5lIHx8IHRoaXMubWVudS5lbGVtZW50LmlzKCAiOnZpc2libGUiICkgKSB7CgkJCXRoaXMuX21vdmUoIGtleUV2ZW50LCBldmVudCApOwoKCQkJLy8gcHJldmVudHMgbW92aW5nIGN1cnNvciB0byBiZWdpbm5pbmcvZW5kIG9mIHRoZSB0ZXh0IGZpZWxkIGluIHNvbWUgYnJvd3NlcnMKCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQl9Cgl9Cn0pOwoKJC5leHRlbmQoICQudWkuYXV0b2NvbXBsZXRlLCB7Cgllc2NhcGVSZWdleDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXJldHVybiB2YWx1ZS5yZXBsYWNlKC9bXC1cW1xde30oKSorPy4sXFxcXiR8I1xzXS9nLCAiXFwkJiIpOwoJfSwKCWZpbHRlcjogZnVuY3Rpb24oYXJyYXksIHRlcm0pIHsKCQl2YXIgbWF0Y2hlciA9IG5ldyBSZWdFeHAoICQudWkuYXV0b2NvbXBsZXRlLmVzY2FwZVJlZ2V4KHRlcm0pLCAiaSIgKTsKCQlyZXR1cm4gJC5ncmVwKCBhcnJheSwgZnVuY3Rpb24odmFsdWUpIHsKCQkJcmV0dXJuIG1hdGNoZXIudGVzdCggdmFsdWUubGFiZWwgfHwgdmFsdWUudmFsdWUgfHwgdmFsdWUgKTsKCQl9KTsKCX0KfSk7CgoKLy8gbGl2ZSByZWdpb24gZXh0ZW5zaW9uLCBhZGRpbmcgYSBgbWVzc2FnZXNgIG9wdGlvbgovLyBOT1RFOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBBUEkuIFdlIGFyZSBzdGlsbCBpbnZlc3RpZ2F0aW5nCi8vIGEgZnVsbCBzb2x1dGlvbiBmb3Igc3RyaW5nIG1hbmlwdWxhdGlvbiBhbmQgaW50ZXJuYXRpb25hbGl6YXRpb24uCiQud2lkZ2V0KCAidWkuYXV0b2NvbXBsZXRlIiwgJC51aS5hdXRvY29tcGxldGUsIHsKCW9wdGlvbnM6IHsKCQltZXNzYWdlczogewoJCQlub1Jlc3VsdHM6ICJObyBzZWFyY2ggcmVzdWx0cy4iLAoJCQlyZXN1bHRzOiBmdW5jdGlvbiggYW1vdW50ICkgewoJCQkJcmV0dXJuIGFtb3VudCArICggYW1vdW50ID4gMSA/ICIgcmVzdWx0cyBhcmUiIDogIiByZXN1bHQgaXMiICkgKwoJCQkJCSIgYXZhaWxhYmxlLCB1c2UgdXAgYW5kIGRvd24gYXJyb3cga2V5cyB0byBuYXZpZ2F0ZS4iOwoJCQl9CgkJfQoJfSwKCglfX3Jlc3BvbnNlOiBmdW5jdGlvbiggY29udGVudCApIHsKCQl2YXIgbWVzc2FnZTsKCQl0aGlzLl9zdXBlckFwcGx5KCBhcmd1bWVudHMgKTsKCQlpZiAoIHRoaXMub3B0aW9ucy5kaXNhYmxlZCB8fCB0aGlzLmNhbmNlbFNlYXJjaCApIHsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoIGNvbnRlbnQgJiYgY29udGVudC5sZW5ndGggKSB7CgkJCW1lc3NhZ2UgPSB0aGlzLm9wdGlvbnMubWVzc2FnZXMucmVzdWx0cyggY29udGVudC5sZW5ndGggKTsKCQl9IGVsc2UgewoJCQltZXNzYWdlID0gdGhpcy5vcHRpb25zLm1lc3NhZ2VzLm5vUmVzdWx0czsKCQl9CgkJdGhpcy5saXZlUmVnaW9uLnRleHQoIG1lc3NhZ2UgKTsKCX0KfSk7CgoKfSggalF1ZXJ5ICkpOwooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCnZhciBsYXN0QWN0aXZlLCBzdGFydFhQb3MsIHN0YXJ0WVBvcywgY2xpY2tEcmFnZ2VkLAoJYmFzZUNsYXNzZXMgPSAidWktYnV0dG9uIHVpLXdpZGdldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiLAoJc3RhdGVDbGFzc2VzID0gInVpLXN0YXRlLWhvdmVyIHVpLXN0YXRlLWFjdGl2ZSAiLAoJdHlwZUNsYXNzZXMgPSAidWktYnV0dG9uLWljb25zLW9ubHkgdWktYnV0dG9uLWljb24tb25seSB1aS1idXR0b24tdGV4dC1pY29ucyB1aS1idXR0b24tdGV4dC1pY29uLXByaW1hcnkgdWktYnV0dG9uLXRleHQtaWNvbi1zZWNvbmRhcnkgdWktYnV0dG9uLXRleHQtb25seSIsCglmb3JtUmVzZXRIYW5kbGVyID0gZnVuY3Rpb24oKSB7CgkJdmFyIGJ1dHRvbnMgPSAkKCB0aGlzICkuZmluZCggIjp1aS1idXR0b24iICk7CgkJc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQkJYnV0dG9ucy5idXR0b24oICJyZWZyZXNoIiApOwoJCX0sIDEgKTsKCX0sCglyYWRpb0dyb3VwID0gZnVuY3Rpb24oIHJhZGlvICkgewoJCXZhciBuYW1lID0gcmFkaW8ubmFtZSwKCQkJZm9ybSA9IHJhZGlvLmZvcm0sCgkJCXJhZGlvcyA9ICQoIFtdICk7CgkJaWYgKCBuYW1lICkgewoJCQlpZiAoIGZvcm0gKSB7CgkJCQlyYWRpb3MgPSAkKCBmb3JtICkuZmluZCggIltuYW1lPSciICsgbmFtZSArICInXSIgKTsKCQkJfSBlbHNlIHsKCQkJCXJhZGlvcyA9ICQoICJbbmFtZT0nIiArIG5hbWUgKyAiJ10iLCByYWRpby5vd25lckRvY3VtZW50ICkKCQkJCQkuZmlsdGVyKGZ1bmN0aW9uKCkgewoJCQkJCQlyZXR1cm4gIXRoaXMuZm9ybTsKCQkJCQl9KTsKCQkJfQoJCX0KCQlyZXR1cm4gcmFkaW9zOwoJfTsKCiQud2lkZ2V0KCAidWkuYnV0dG9uIiwgewoJdmVyc2lvbjogIjEuOS4yIiwKCWRlZmF1bHRFbGVtZW50OiAiPGJ1dHRvbj4iLAoJb3B0aW9uczogewoJCWRpc2FibGVkOiBudWxsLAoJCXRleHQ6IHRydWUsCgkJbGFiZWw6IG51bGwsCgkJaWNvbnM6IHsKCQkJcHJpbWFyeTogbnVsbCwKCQkJc2Vjb25kYXJ5OiBudWxsCgkJfQoJfSwKCV9jcmVhdGU6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWxlbWVudC5jbG9zZXN0KCAiZm9ybSIgKQoJCQkudW5iaW5kKCAicmVzZXQiICsgdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS5iaW5kKCAicmVzZXQiICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgZm9ybVJlc2V0SGFuZGxlciApOwoKCQlpZiAoIHR5cGVvZiB0aGlzLm9wdGlvbnMuZGlzYWJsZWQgIT09ICJib29sZWFuIiApIHsKCQkJdGhpcy5vcHRpb25zLmRpc2FibGVkID0gISF0aGlzLmVsZW1lbnQucHJvcCggImRpc2FibGVkIiApOwoJCX0gZWxzZSB7CgkJCXRoaXMuZWxlbWVudC5wcm9wKCAiZGlzYWJsZWQiLCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQgKTsKCQl9CgoJCXRoaXMuX2RldGVybWluZUJ1dHRvblR5cGUoKTsKCQl0aGlzLmhhc1RpdGxlID0gISF0aGlzLmJ1dHRvbkVsZW1lbnQuYXR0ciggInRpdGxlIiApOwoKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCW9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsCgkJCXRvZ2dsZUJ1dHRvbiA9IHRoaXMudHlwZSA9PT0gImNoZWNrYm94IiB8fCB0aGlzLnR5cGUgPT09ICJyYWRpbyIsCgkJCWFjdGl2ZUNsYXNzID0gIXRvZ2dsZUJ1dHRvbiA/ICJ1aS1zdGF0ZS1hY3RpdmUiIDogIiIsCgkJCWZvY3VzQ2xhc3MgPSAidWktc3RhdGUtZm9jdXMiOwoKCQlpZiAoIG9wdGlvbnMubGFiZWwgPT09IG51bGwgKSB7CgkJCW9wdGlvbnMubGFiZWwgPSAodGhpcy50eXBlID09PSAiaW5wdXQiID8gdGhpcy5idXR0b25FbGVtZW50LnZhbCgpIDogdGhpcy5idXR0b25FbGVtZW50Lmh0bWwoKSk7CgkJfQoKCQl0aGlzLl9ob3ZlcmFibGUoIHRoaXMuYnV0dG9uRWxlbWVudCApOwoKCQl0aGlzLmJ1dHRvbkVsZW1lbnQKCQkJLmFkZENsYXNzKCBiYXNlQ2xhc3NlcyApCgkJCS5hdHRyKCAicm9sZSIsICJidXR0b24iICkKCQkJLmJpbmQoICJtb3VzZWVudGVyIiArIHRoaXMuZXZlbnROYW1lc3BhY2UsIGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBvcHRpb25zLmRpc2FibGVkICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCWlmICggdGhpcyA9PT0gbGFzdEFjdGl2ZSApIHsKCQkJCQkkKCB0aGlzICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCQl9CgkJCX0pCgkJCS5iaW5kKCAibW91c2VsZWF2ZSIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbigpIHsKCQkJCWlmICggb3B0aW9ucy5kaXNhYmxlZCApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQkkKCB0aGlzICkucmVtb3ZlQ2xhc3MoIGFjdGl2ZUNsYXNzICk7CgkJCX0pCgkJCS5iaW5kKCAiY2xpY2siICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJaWYgKCBvcHRpb25zLmRpc2FibGVkICkgewoJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CgkJCQl9CgkJCX0pOwoKCQl0aGlzLmVsZW1lbnQKCQkJLmJpbmQoICJmb2N1cyIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbigpIHsKCQkJCS8vIG5vIG5lZWQgdG8gY2hlY2sgZGlzYWJsZWQsIGZvY3VzIHdvbid0IGJlIHRyaWdnZXJlZCBhbnl3YXkKCQkJCXRoYXQuYnV0dG9uRWxlbWVudC5hZGRDbGFzcyggZm9jdXNDbGFzcyApOwoJCQl9KQoJCQkuYmluZCggImJsdXIiICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgZnVuY3Rpb24oKSB7CgkJCQl0aGF0LmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoIGZvY3VzQ2xhc3MgKTsKCQkJfSk7CgoJCWlmICggdG9nZ2xlQnV0dG9uICkgewoJCQl0aGlzLmVsZW1lbnQuYmluZCggImNoYW5nZSIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbigpIHsKCQkJCWlmICggY2xpY2tEcmFnZ2VkICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCXRoYXQucmVmcmVzaCgpOwoJCQl9KTsKCQkJLy8gaWYgbW91c2UgbW92ZXMgYmV0d2VlbiBtb3VzZWRvd24gYW5kIG1vdXNldXAgKGRyYWcpIHNldCBjbGlja0RyYWdnZWQgZmxhZwoJCQkvLyBwcmV2ZW50cyBpc3N1ZSB3aGVyZSBidXR0b24gc3RhdGUgY2hhbmdlcyBidXQgY2hlY2tib3gvcmFkaW8gY2hlY2tlZCBzdGF0ZQoJCQkvLyBkb2VzIG5vdCBpbiBGaXJlZm94IChzZWUgdGlja2V0ICM2OTcwKQoJCQl0aGlzLmJ1dHRvbkVsZW1lbnQKCQkJCS5iaW5kKCAibW91c2Vkb3duIiArIHRoaXMuZXZlbnROYW1lc3BhY2UsIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIG9wdGlvbnMuZGlzYWJsZWQgKSB7CgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQkJY2xpY2tEcmFnZ2VkID0gZmFsc2U7CgkJCQkJc3RhcnRYUG9zID0gZXZlbnQucGFnZVg7CgkJCQkJc3RhcnRZUG9zID0gZXZlbnQucGFnZVk7CgkJCQl9KQoJCQkJLmJpbmQoICJtb3VzZXVwIiArIHRoaXMuZXZlbnROYW1lc3BhY2UsIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIG9wdGlvbnMuZGlzYWJsZWQgKSB7CgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQkJaWYgKCBzdGFydFhQb3MgIT09IGV2ZW50LnBhZ2VYIHx8IHN0YXJ0WVBvcyAhPT0gZXZlbnQucGFnZVkgKSB7CgkJCQkJCWNsaWNrRHJhZ2dlZCA9IHRydWU7CgkJCQkJfQoJCQl9KTsKCQl9CgoJCWlmICggdGhpcy50eXBlID09PSAiY2hlY2tib3giICkgewoJCQl0aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCggImNsaWNrIiArIHRoaXMuZXZlbnROYW1lc3BhY2UsIGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBvcHRpb25zLmRpc2FibGVkIHx8IGNsaWNrRHJhZ2dlZCApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQkkKCB0aGlzICkudG9nZ2xlQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCQl0aGF0LmJ1dHRvbkVsZW1lbnQuYXR0ciggImFyaWEtcHJlc3NlZCIsIHRoYXQuZWxlbWVudFswXS5jaGVja2VkICk7CgkJCX0pOwoJCX0gZWxzZSBpZiAoIHRoaXMudHlwZSA9PT0gInJhZGlvIiApIHsKCQkJdGhpcy5idXR0b25FbGVtZW50LmJpbmQoICJjbGljayIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbigpIHsKCQkJCWlmICggb3B0aW9ucy5kaXNhYmxlZCB8fCBjbGlja0RyYWdnZWQgKSB7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJJCggdGhpcyApLmFkZENsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApOwoJCQkJdGhhdC5idXR0b25FbGVtZW50LmF0dHIoICJhcmlhLXByZXNzZWQiLCAidHJ1ZSIgKTsKCgkJCQl2YXIgcmFkaW8gPSB0aGF0LmVsZW1lbnRbIDAgXTsKCQkJCXJhZGlvR3JvdXAoIHJhZGlvICkKCQkJCQkubm90KCByYWRpbyApCgkJCQkJLm1hcChmdW5jdGlvbigpIHsKCQkJCQkJcmV0dXJuICQoIHRoaXMgKS5idXR0b24oICJ3aWRnZXQiIClbIDAgXTsKCQkJCQl9KQoJCQkJCS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKQoJCQkJCS5hdHRyKCAiYXJpYS1wcmVzc2VkIiwgImZhbHNlIiApOwoJCQl9KTsKCQl9IGVsc2UgewoJCQl0aGlzLmJ1dHRvbkVsZW1lbnQKCQkJCS5iaW5kKCAibW91c2Vkb3duIiArIHRoaXMuZXZlbnROYW1lc3BhY2UsIGZ1bmN0aW9uKCkgewoJCQkJCWlmICggb3B0aW9ucy5kaXNhYmxlZCApIHsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCQkkKCB0aGlzICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCQkJbGFzdEFjdGl2ZSA9IHRoaXM7CgkJCQkJdGhhdC5kb2N1bWVudC5vbmUoICJtb3VzZXVwIiwgZnVuY3Rpb24oKSB7CgkJCQkJCWxhc3RBY3RpdmUgPSBudWxsOwoJCQkJCX0pOwoJCQkJfSkKCQkJCS5iaW5kKCAibW91c2V1cCIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIG9wdGlvbnMuZGlzYWJsZWQgKSB7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQkJJCggdGhpcyApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApOwoJCQkJfSkKCQkJCS5iaW5kKCAia2V5ZG93biIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbihldmVudCkgewoJCQkJCWlmICggb3B0aW9ucy5kaXNhYmxlZCApIHsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCQlpZiAoIGV2ZW50LmtleUNvZGUgPT09ICQudWkua2V5Q29kZS5TUEFDRSB8fCBldmVudC5rZXlDb2RlID09PSAkLnVpLmtleUNvZGUuRU5URVIgKSB7CgkJCQkJCSQoIHRoaXMgKS5hZGRDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKTsKCQkJCQl9CgkJCQl9KQoJCQkJLmJpbmQoICJrZXl1cCIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbigpIHsKCQkJCQkkKCB0aGlzICkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCQl9KTsKCgkJCWlmICggdGhpcy5idXR0b25FbGVtZW50LmlzKCJhIikgKSB7CgkJCQl0aGlzLmJ1dHRvbkVsZW1lbnQua2V5dXAoZnVuY3Rpb24oZXZlbnQpIHsKCQkJCQlpZiAoIGV2ZW50LmtleUNvZGUgPT09ICQudWkua2V5Q29kZS5TUEFDRSApIHsKCQkJCQkJLy8gVE9ETyBwYXNzIHRocm91Z2ggb3JpZ2luYWwgZXZlbnQgY29ycmVjdGx5IChqdXN0IGFzIDJuZCBhcmd1bWVudCBkb2Vzbid0IHdvcmspCgkJCQkJCSQoIHRoaXMgKS5jbGljaygpOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgkJfQoKCQkvLyBUT0RPOiBwdWxsIG91dCAkLldpZGdldCdzIGhhbmRsaW5nIGZvciB0aGUgZGlzYWJsZWQgb3B0aW9uIGludG8KCQkvLyAkLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbkRpc2FibGVkIHNvIGl0J3MgZWFzeSB0byBwcm94eSBhbmQgY2FuCgkJLy8gYmUgb3ZlcnJpZGRlbiBieSBpbmRpdmlkdWFsIHBsdWdpbnMKCQl0aGlzLl9zZXRPcHRpb24oICJkaXNhYmxlZCIsIG9wdGlvbnMuZGlzYWJsZWQgKTsKCQl0aGlzLl9yZXNldEJ1dHRvbigpOwoJfSwKCglfZGV0ZXJtaW5lQnV0dG9uVHlwZTogZnVuY3Rpb24oKSB7CgkJdmFyIGFuY2VzdG9yLCBsYWJlbFNlbGVjdG9yLCBjaGVja2VkOwoKCQlpZiAoIHRoaXMuZWxlbWVudC5pcygiW3R5cGU9Y2hlY2tib3hdIikgKSB7CgkJCXRoaXMudHlwZSA9ICJjaGVja2JveCI7CgkJfSBlbHNlIGlmICggdGhpcy5lbGVtZW50LmlzKCJbdHlwZT1yYWRpb10iKSApIHsKCQkJdGhpcy50eXBlID0gInJhZGlvIjsKCQl9IGVsc2UgaWYgKCB0aGlzLmVsZW1lbnQuaXMoImlucHV0IikgKSB7CgkJCXRoaXMudHlwZSA9ICJpbnB1dCI7CgkJfSBlbHNlIHsKCQkJdGhpcy50eXBlID0gImJ1dHRvbiI7CgkJfQoKCQlpZiAoIHRoaXMudHlwZSA9PT0gImNoZWNrYm94IiB8fCB0aGlzLnR5cGUgPT09ICJyYWRpbyIgKSB7CgkJCS8vIHdlIGRvbid0IHNlYXJjaCBhZ2FpbnN0IHRoZSBkb2N1bWVudCBpbiBjYXNlIHRoZSBlbGVtZW50CgkJCS8vIGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBET00KCQkJYW5jZXN0b3IgPSB0aGlzLmVsZW1lbnQucGFyZW50cygpLmxhc3QoKTsKCQkJbGFiZWxTZWxlY3RvciA9ICJsYWJlbFtmb3I9JyIgKyB0aGlzLmVsZW1lbnQuYXR0cigiaWQiKSArICInXSI7CgkJCXRoaXMuYnV0dG9uRWxlbWVudCA9IGFuY2VzdG9yLmZpbmQoIGxhYmVsU2VsZWN0b3IgKTsKCQkJaWYgKCAhdGhpcy5idXR0b25FbGVtZW50Lmxlbmd0aCApIHsKCQkJCWFuY2VzdG9yID0gYW5jZXN0b3IubGVuZ3RoID8gYW5jZXN0b3Iuc2libGluZ3MoKSA6IHRoaXMuZWxlbWVudC5zaWJsaW5ncygpOwoJCQkJdGhpcy5idXR0b25FbGVtZW50ID0gYW5jZXN0b3IuZmlsdGVyKCBsYWJlbFNlbGVjdG9yICk7CgkJCQlpZiAoICF0aGlzLmJ1dHRvbkVsZW1lbnQubGVuZ3RoICkgewoJCQkJCXRoaXMuYnV0dG9uRWxlbWVudCA9IGFuY2VzdG9yLmZpbmQoIGxhYmVsU2VsZWN0b3IgKTsKCQkJCX0KCQkJfQoJCQl0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoICJ1aS1oZWxwZXItaGlkZGVuLWFjY2Vzc2libGUiICk7CgoJCQljaGVja2VkID0gdGhpcy5lbGVtZW50LmlzKCAiOmNoZWNrZWQiICk7CgkJCWlmICggY2hlY2tlZCApIHsKCQkJCXRoaXMuYnV0dG9uRWxlbWVudC5hZGRDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKTsKCQkJfQoJCQl0aGlzLmJ1dHRvbkVsZW1lbnQucHJvcCggImFyaWEtcHJlc3NlZCIsIGNoZWNrZWQgKTsKCQl9IGVsc2UgewoJCQl0aGlzLmJ1dHRvbkVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgkJfQoJfSwKCgl3aWRnZXQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmJ1dHRvbkVsZW1lbnQ7Cgl9LAoKCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLmVsZW1lbnQKCQkJLnJlbW92ZUNsYXNzKCAidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIiApOwoJCXRoaXMuYnV0dG9uRWxlbWVudAoJCQkucmVtb3ZlQ2xhc3MoIGJhc2VDbGFzc2VzICsgIiAiICsgc3RhdGVDbGFzc2VzICsgIiAiICsgdHlwZUNsYXNzZXMgKQoJCQkucmVtb3ZlQXR0ciggInJvbGUiICkKCQkJLnJlbW92ZUF0dHIoICJhcmlhLXByZXNzZWQiICkKCQkJLmh0bWwoIHRoaXMuYnV0dG9uRWxlbWVudC5maW5kKCIudWktYnV0dG9uLXRleHQiKS5odG1sKCkgKTsKCgkJaWYgKCAhdGhpcy5oYXNUaXRsZSApIHsKCQkJdGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUF0dHIoICJ0aXRsZSIgKTsKCQl9Cgl9LAoKCV9zZXRPcHRpb246IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCXRoaXMuX3N1cGVyKCBrZXksIHZhbHVlICk7CgkJaWYgKCBrZXkgPT09ICJkaXNhYmxlZCIgKSB7CgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLmVsZW1lbnQucHJvcCggImRpc2FibGVkIiwgdHJ1ZSApOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5lbGVtZW50LnByb3AoICJkaXNhYmxlZCIsIGZhbHNlICk7CgkJCX0KCQkJcmV0dXJuOwoJCX0KCQl0aGlzLl9yZXNldEJ1dHRvbigpOwoJfSwKCglyZWZyZXNoOiBmdW5jdGlvbigpIHsKCQkvL1NlZSAjODIzNyAmICM4ODI4CgkJdmFyIGlzRGlzYWJsZWQgPSB0aGlzLmVsZW1lbnQuaXMoICJpbnB1dCwgYnV0dG9uIiApID8gdGhpcy5lbGVtZW50LmlzKCAiOmRpc2FibGVkIiApIDogdGhpcy5lbGVtZW50Lmhhc0NsYXNzKCAidWktYnV0dG9uLWRpc2FibGVkIiApOwoKCQlpZiAoIGlzRGlzYWJsZWQgIT09IHRoaXMub3B0aW9ucy5kaXNhYmxlZCApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCAiZGlzYWJsZWQiLCBpc0Rpc2FibGVkICk7CgkJfQoJCWlmICggdGhpcy50eXBlID09PSAicmFkaW8iICkgewoJCQlyYWRpb0dyb3VwKCB0aGlzLmVsZW1lbnRbMF0gKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJaWYgKCAkKCB0aGlzICkuaXMoICI6Y2hlY2tlZCIgKSApIHsKCQkJCQkkKCB0aGlzICkuYnV0dG9uKCAid2lkZ2V0IiApCgkJCQkJCS5hZGRDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKQoJCQkJCQkuYXR0ciggImFyaWEtcHJlc3NlZCIsICJ0cnVlIiApOwoJCQkJfSBlbHNlIHsKCQkJCQkkKCB0aGlzICkuYnV0dG9uKCAid2lkZ2V0IiApCgkJCQkJCS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKQoJCQkJCQkuYXR0ciggImFyaWEtcHJlc3NlZCIsICJmYWxzZSIgKTsKCQkJCX0KCQkJfSk7CgkJfSBlbHNlIGlmICggdGhpcy50eXBlID09PSAiY2hlY2tib3giICkgewoJCQlpZiAoIHRoaXMuZWxlbWVudC5pcyggIjpjaGVja2VkIiApICkgewoJCQkJdGhpcy5idXR0b25FbGVtZW50CgkJCQkJLmFkZENsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApCgkJCQkJLmF0dHIoICJhcmlhLXByZXNzZWQiLCAidHJ1ZSIgKTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuYnV0dG9uRWxlbWVudAoJCQkJCS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKQoJCQkJCS5hdHRyKCAiYXJpYS1wcmVzc2VkIiwgImZhbHNlIiApOwoJCQl9CgkJfQoJfSwKCglfcmVzZXRCdXR0b246IGZ1bmN0aW9uKCkgewoJCWlmICggdGhpcy50eXBlID09PSAiaW5wdXQiICkgewoJCQlpZiAoIHRoaXMub3B0aW9ucy5sYWJlbCApIHsKCQkJCXRoaXMuZWxlbWVudC52YWwoIHRoaXMub3B0aW9ucy5sYWJlbCApOwoJCQl9CgkJCXJldHVybjsKCQl9CgkJdmFyIGJ1dHRvbkVsZW1lbnQgPSB0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoIHR5cGVDbGFzc2VzICksCgkJCWJ1dHRvblRleHQgPSAkKCAiPHNwYW4+PC9zcGFuPiIsIHRoaXMuZG9jdW1lbnRbMF0gKQoJCQkJLmFkZENsYXNzKCAidWktYnV0dG9uLXRleHQiICkKCQkJCS5odG1sKCB0aGlzLm9wdGlvbnMubGFiZWwgKQoJCQkJLmFwcGVuZFRvKCBidXR0b25FbGVtZW50LmVtcHR5KCkgKQoJCQkJLnRleHQoKSwKCQkJaWNvbnMgPSB0aGlzLm9wdGlvbnMuaWNvbnMsCgkJCW11bHRpcGxlSWNvbnMgPSBpY29ucy5wcmltYXJ5ICYmIGljb25zLnNlY29uZGFyeSwKCQkJYnV0dG9uQ2xhc3NlcyA9IFtdOwoKCQlpZiAoIGljb25zLnByaW1hcnkgfHwgaWNvbnMuc2Vjb25kYXJ5ICkgewoJCQlpZiAoIHRoaXMub3B0aW9ucy50ZXh0ICkgewoJCQkJYnV0dG9uQ2xhc3Nlcy5wdXNoKCAidWktYnV0dG9uLXRleHQtaWNvbiIgKyAoIG11bHRpcGxlSWNvbnMgPyAicyIgOiAoIGljb25zLnByaW1hcnkgPyAiLXByaW1hcnkiIDogIi1zZWNvbmRhcnkiICkgKSApOwoJCQl9CgoJCQlpZiAoIGljb25zLnByaW1hcnkgKSB7CgkJCQlidXR0b25FbGVtZW50LnByZXBlbmQoICI8c3BhbiBjbGFzcz0ndWktYnV0dG9uLWljb24tcHJpbWFyeSB1aS1pY29uICIgKyBpY29ucy5wcmltYXJ5ICsgIic+PC9zcGFuPiIgKTsKCQkJfQoKCQkJaWYgKCBpY29ucy5zZWNvbmRhcnkgKSB7CgkJCQlidXR0b25FbGVtZW50LmFwcGVuZCggIjxzcGFuIGNsYXNzPSd1aS1idXR0b24taWNvbi1zZWNvbmRhcnkgdWktaWNvbiAiICsgaWNvbnMuc2Vjb25kYXJ5ICsgIic+PC9zcGFuPiIgKTsKCQkJfQoKCQkJaWYgKCAhdGhpcy5vcHRpb25zLnRleHQgKSB7CgkJCQlidXR0b25DbGFzc2VzLnB1c2goIG11bHRpcGxlSWNvbnMgPyAidWktYnV0dG9uLWljb25zLW9ubHkiIDogInVpLWJ1dHRvbi1pY29uLW9ubHkiICk7CgoJCQkJaWYgKCAhdGhpcy5oYXNUaXRsZSApIHsKCQkJCQlidXR0b25FbGVtZW50LmF0dHIoICJ0aXRsZSIsICQudHJpbSggYnV0dG9uVGV4dCApICk7CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQlidXR0b25DbGFzc2VzLnB1c2goICJ1aS1idXR0b24tdGV4dC1vbmx5IiApOwoJCX0KCQlidXR0b25FbGVtZW50LmFkZENsYXNzKCBidXR0b25DbGFzc2VzLmpvaW4oICIgIiApICk7Cgl9Cn0pOwoKJC53aWRnZXQoICJ1aS5idXR0b25zZXQiLCB7Cgl2ZXJzaW9uOiAiMS45LjIiLAoJb3B0aW9uczogewoJCWl0ZW1zOiAiYnV0dG9uLCBpbnB1dFt0eXBlPWJ1dHRvbl0sIGlucHV0W3R5cGU9c3VibWl0XSwgaW5wdXRbdHlwZT1yZXNldF0sIGlucHV0W3R5cGU9Y2hlY2tib3hdLCBpbnB1dFt0eXBlPXJhZGlvXSwgYSwgOmRhdGEoYnV0dG9uKSIKCX0sCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbGVtZW50LmFkZENsYXNzKCAidWktYnV0dG9uc2V0IiApOwoJfSwKCglfaW5pdDogZnVuY3Rpb24oKSB7CgkJdGhpcy5yZWZyZXNoKCk7Cgl9LAoKCV9zZXRPcHRpb246IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLmJ1dHRvbnMuYnV0dG9uKCAib3B0aW9uIiwga2V5LCB2YWx1ZSApOwoJCX0KCgkJdGhpcy5fc3VwZXIoIGtleSwgdmFsdWUgKTsKCX0sCgoJcmVmcmVzaDogZnVuY3Rpb24oKSB7CgkJdmFyIHJ0bCA9IHRoaXMuZWxlbWVudC5jc3MoICJkaXJlY3Rpb24iICkgPT09ICJydGwiOwoKCQl0aGlzLmJ1dHRvbnMgPSB0aGlzLmVsZW1lbnQuZmluZCggdGhpcy5vcHRpb25zLml0ZW1zICkKCQkJLmZpbHRlciggIjp1aS1idXR0b24iICkKCQkJCS5idXR0b24oICJyZWZyZXNoIiApCgkJCS5lbmQoKQoJCQkubm90KCAiOnVpLWJ1dHRvbiIgKQoJCQkJLmJ1dHRvbigpCgkJCS5lbmQoKQoJCQkubWFwKGZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuICQoIHRoaXMgKS5idXR0b24oICJ3aWRnZXQiIClbIDAgXTsKCQkJfSkKCQkJCS5yZW1vdmVDbGFzcyggInVpLWNvcm5lci1hbGwgdWktY29ybmVyLWxlZnQgdWktY29ybmVyLXJpZ2h0IiApCgkJCQkuZmlsdGVyKCAiOmZpcnN0IiApCgkJCQkJLmFkZENsYXNzKCBydGwgPyAidWktY29ybmVyLXJpZ2h0IiA6ICJ1aS1jb3JuZXItbGVmdCIgKQoJCQkJLmVuZCgpCgkJCQkuZmlsdGVyKCAiOmxhc3QiICkKCQkJCQkuYWRkQ2xhc3MoIHJ0bCA/ICJ1aS1jb3JuZXItbGVmdCIgOiAidWktY29ybmVyLXJpZ2h0IiApCgkJCQkuZW5kKCkKCQkJLmVuZCgpOwoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCAidWktYnV0dG9uc2V0IiApOwoJCXRoaXMuYnV0dG9ucwoJCQkubWFwKGZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuICQoIHRoaXMgKS5idXR0b24oICJ3aWRnZXQiIClbIDAgXTsKCQkJfSkKCQkJCS5yZW1vdmVDbGFzcyggInVpLWNvcm5lci1sZWZ0IHVpLWNvcm5lci1yaWdodCIgKQoJCQkuZW5kKCkKCQkJLmJ1dHRvbiggImRlc3Ryb3kiICk7Cgl9Cn0pOwoKfSggalF1ZXJ5ICkgKTsKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgokLmV4dGVuZCgkLnVpLCB7IGRhdGVwaWNrZXI6IHsgdmVyc2lvbjogIjEuOS4yIiB9IH0pOwoKdmFyIFBST1BfTkFNRSA9ICdkYXRlcGlja2VyJzsKdmFyIGRwdXVpZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwp2YXIgaW5zdEFjdGl2ZTsKCi8qIERhdGUgcGlja2VyIG1hbmFnZXIuCiAgIFVzZSB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsICQuZGF0ZXBpY2tlciwgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgZGF0ZSBwaWNrZXIuCiAgIFNldHRpbmdzIGZvciAoZ3JvdXBzIG9mKSBkYXRlIHBpY2tlcnMgYXJlIG1haW50YWluZWQgaW4gYW4gaW5zdGFuY2Ugb2JqZWN0LAogICBhbGxvd2luZyBtdWx0aXBsZSBkaWZmZXJlbnQgc2V0dGluZ3Mgb24gdGhlIHNhbWUgcGFnZS4gKi8KCmZ1bmN0aW9uIERhdGVwaWNrZXIoKSB7Cgl0aGlzLmRlYnVnID0gZmFsc2U7IC8vIENoYW5nZSB0aGlzIHRvIHRydWUgdG8gc3RhcnQgZGVidWdnaW5nCgl0aGlzLl9jdXJJbnN0ID0gbnVsbDsgLy8gVGhlIGN1cnJlbnQgaW5zdGFuY2UgaW4gdXNlCgl0aGlzLl9rZXlFdmVudCA9IGZhbHNlOyAvLyBJZiB0aGUgbGFzdCBldmVudCB3YXMgYSBrZXkgZXZlbnQKCXRoaXMuX2Rpc2FibGVkSW5wdXRzID0gW107IC8vIExpc3Qgb2YgZGF0ZSBwaWNrZXIgaW5wdXRzIHRoYXQgaGF2ZSBiZWVuIGRpc2FibGVkCgl0aGlzLl9kYXRlcGlja2VyU2hvd2luZyA9IGZhbHNlOyAvLyBUcnVlIGlmIHRoZSBwb3B1cCBwaWNrZXIgaXMgc2hvd2luZyAsIGZhbHNlIGlmIG5vdAoJdGhpcy5faW5EaWFsb2cgPSBmYWxzZTsgLy8gVHJ1ZSBpZiBzaG93aW5nIHdpdGhpbiBhICJkaWFsb2ciLCBmYWxzZSBpZiBub3QKCXRoaXMuX21haW5EaXZJZCA9ICd1aS1kYXRlcGlja2VyLWRpdic7IC8vIFRoZSBJRCBvZiB0aGUgbWFpbiBkYXRlcGlja2VyIGRpdmlzaW9uCgl0aGlzLl9pbmxpbmVDbGFzcyA9ICd1aS1kYXRlcGlja2VyLWlubGluZSc7IC8vIFRoZSBuYW1lIG9mIHRoZSBpbmxpbmUgbWFya2VyIGNsYXNzCgl0aGlzLl9hcHBlbmRDbGFzcyA9ICd1aS1kYXRlcGlja2VyLWFwcGVuZCc7IC8vIFRoZSBuYW1lIG9mIHRoZSBhcHBlbmQgbWFya2VyIGNsYXNzCgl0aGlzLl90cmlnZ2VyQ2xhc3MgPSAndWktZGF0ZXBpY2tlci10cmlnZ2VyJzsgLy8gVGhlIG5hbWUgb2YgdGhlIHRyaWdnZXIgbWFya2VyIGNsYXNzCgl0aGlzLl9kaWFsb2dDbGFzcyA9ICd1aS1kYXRlcGlja2VyLWRpYWxvZyc7IC8vIFRoZSBuYW1lIG9mIHRoZSBkaWFsb2cgbWFya2VyIGNsYXNzCgl0aGlzLl9kaXNhYmxlQ2xhc3MgPSAndWktZGF0ZXBpY2tlci1kaXNhYmxlZCc7IC8vIFRoZSBuYW1lIG9mIHRoZSBkaXNhYmxlZCBjb3ZlcmluZyBtYXJrZXIgY2xhc3MKCXRoaXMuX3Vuc2VsZWN0YWJsZUNsYXNzID0gJ3VpLWRhdGVwaWNrZXItdW5zZWxlY3RhYmxlJzsgLy8gVGhlIG5hbWUgb2YgdGhlIHVuc2VsZWN0YWJsZSBjZWxsIG1hcmtlciBjbGFzcwoJdGhpcy5fY3VycmVudENsYXNzID0gJ3VpLWRhdGVwaWNrZXItY3VycmVudC1kYXknOyAvLyBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBkYXkgbWFya2VyIGNsYXNzCgl0aGlzLl9kYXlPdmVyQ2xhc3MgPSAndWktZGF0ZXBpY2tlci1kYXlzLWNlbGwtb3Zlcic7IC8vIFRoZSBuYW1lIG9mIHRoZSBkYXkgaG92ZXIgbWFya2VyIGNsYXNzCgl0aGlzLnJlZ2lvbmFsID0gW107IC8vIEF2YWlsYWJsZSByZWdpb25hbCBzZXR0aW5ncywgaW5kZXhlZCBieSBsYW5ndWFnZSBjb2RlCgl0aGlzLnJlZ2lvbmFsWycnXSA9IHsgLy8gRGVmYXVsdCByZWdpb25hbCBzZXR0aW5ncwoJCWNsb3NlVGV4dDogJ0RvbmUnLCAvLyBEaXNwbGF5IHRleHQgZm9yIGNsb3NlIGxpbmsKCQlwcmV2VGV4dDogJ1ByZXYnLCAvLyBEaXNwbGF5IHRleHQgZm9yIHByZXZpb3VzIG1vbnRoIGxpbmsKCQluZXh0VGV4dDogJ05leHQnLCAvLyBEaXNwbGF5IHRleHQgZm9yIG5leHQgbW9udGggbGluawoJCWN1cnJlbnRUZXh0OiAnVG9kYXknLCAvLyBEaXNwbGF5IHRleHQgZm9yIGN1cnJlbnQgbW9udGggbGluawoJCW1vbnRoTmFtZXM6IFsnSmFudWFyeScsJ0ZlYnJ1YXJ5JywnTWFyY2gnLCdBcHJpbCcsJ01heScsJ0p1bmUnLAoJCQknSnVseScsJ0F1Z3VzdCcsJ1NlcHRlbWJlcicsJ09jdG9iZXInLCdOb3ZlbWJlcicsJ0RlY2VtYmVyJ10sIC8vIE5hbWVzIG9mIG1vbnRocyBmb3IgZHJvcC1kb3duIGFuZCBmb3JtYXR0aW5nCgkJbW9udGhOYW1lc1Nob3J0OiBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ10sIC8vIEZvciBmb3JtYXR0aW5nCgkJZGF5TmFtZXM6IFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXSwgLy8gRm9yIGZvcm1hdHRpbmcKCQlkYXlOYW1lc1Nob3J0OiBbJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCddLCAvLyBGb3IgZm9ybWF0dGluZwoJCWRheU5hbWVzTWluOiBbJ1N1JywnTW8nLCdUdScsJ1dlJywnVGgnLCdGcicsJ1NhJ10sIC8vIENvbHVtbiBoZWFkaW5ncyBmb3IgZGF5cyBzdGFydGluZyBhdCBTdW5kYXkKCQl3ZWVrSGVhZGVyOiAnV2snLCAvLyBDb2x1bW4gaGVhZGVyIGZvciB3ZWVrIG9mIHRoZSB5ZWFyCgkJZGF0ZUZvcm1hdDogJ21tL2RkL3l5JywgLy8gU2VlIGZvcm1hdCBvcHRpb25zIG9uIHBhcnNlRGF0ZQoJCWZpcnN0RGF5OiAwLCAvLyBUaGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLCBTdW4gPSAwLCBNb24gPSAxLCAuLi4KCQlpc1JUTDogZmFsc2UsIC8vIFRydWUgaWYgcmlnaHQtdG8tbGVmdCBsYW5ndWFnZSwgZmFsc2UgaWYgbGVmdC10by1yaWdodAoJCXNob3dNb250aEFmdGVyWWVhcjogZmFsc2UsIC8vIFRydWUgaWYgdGhlIHllYXIgc2VsZWN0IHByZWNlZGVzIG1vbnRoLCBmYWxzZSBmb3IgbW9udGggdGhlbiB5ZWFyCgkJeWVhclN1ZmZpeDogJycgLy8gQWRkaXRpb25hbCB0ZXh0IHRvIGFwcGVuZCB0byB0aGUgeWVhciBpbiB0aGUgbW9udGggaGVhZGVycwoJfTsKCXRoaXMuX2RlZmF1bHRzID0geyAvLyBHbG9iYWwgZGVmYXVsdHMgZm9yIGFsbCB0aGUgZGF0ZSBwaWNrZXIgaW5zdGFuY2VzCgkJc2hvd09uOiAnZm9jdXMnLCAvLyAnZm9jdXMnIGZvciBwb3B1cCBvbiBmb2N1cywKCQkJLy8gJ2J1dHRvbicgZm9yIHRyaWdnZXIgYnV0dG9uLCBvciAnYm90aCcgZm9yIGVpdGhlcgoJCXNob3dBbmltOiAnZmFkZUluJywgLy8gTmFtZSBvZiBqUXVlcnkgYW5pbWF0aW9uIGZvciBwb3B1cAoJCXNob3dPcHRpb25zOiB7fSwgLy8gT3B0aW9ucyBmb3IgZW5oYW5jZWQgYW5pbWF0aW9ucwoJCWRlZmF1bHREYXRlOiBudWxsLCAvLyBVc2VkIHdoZW4gZmllbGQgaXMgYmxhbms6IGFjdHVhbCBkYXRlLAoJCQkvLyArLy1udW1iZXIgZm9yIG9mZnNldCBmcm9tIHRvZGF5LCBudWxsIGZvciB0b2RheQoJCWFwcGVuZFRleHQ6ICcnLCAvLyBEaXNwbGF5IHRleHQgZm9sbG93aW5nIHRoZSBpbnB1dCBib3gsIGUuZy4gc2hvd2luZyB0aGUgZm9ybWF0CgkJYnV0dG9uVGV4dDogJy4uLicsIC8vIFRleHQgZm9yIHRyaWdnZXIgYnV0dG9uCgkJYnV0dG9uSW1hZ2U6ICcnLCAvLyBVUkwgZm9yIHRyaWdnZXIgYnV0dG9uIGltYWdlCgkJYnV0dG9uSW1hZ2VPbmx5OiBmYWxzZSwgLy8gVHJ1ZSBpZiB0aGUgaW1hZ2UgYXBwZWFycyBhbG9uZSwgZmFsc2UgaWYgaXQgYXBwZWFycyBvbiBhIGJ1dHRvbgoJCWhpZGVJZk5vUHJldk5leHQ6IGZhbHNlLCAvLyBUcnVlIHRvIGhpZGUgbmV4dC9wcmV2aW91cyBtb250aCBsaW5rcwoJCQkvLyBpZiBub3QgYXBwbGljYWJsZSwgZmFsc2UgdG8ganVzdCBkaXNhYmxlIHRoZW0KCQluYXZpZ2F0aW9uQXNEYXRlRm9ybWF0OiBmYWxzZSwgLy8gVHJ1ZSBpZiBkYXRlIGZvcm1hdHRpbmcgYXBwbGllZCB0byBwcmV2L3RvZGF5L25leHQgbGlua3MKCQlnb3RvQ3VycmVudDogZmFsc2UsIC8vIFRydWUgaWYgdG9kYXkgbGluayBnb2VzIGJhY2sgdG8gY3VycmVudCBzZWxlY3Rpb24gaW5zdGVhZAoJCWNoYW5nZU1vbnRoOiBmYWxzZSwgLy8gVHJ1ZSBpZiBtb250aCBjYW4gYmUgc2VsZWN0ZWQgZGlyZWN0bHksIGZhbHNlIGlmIG9ubHkgcHJldi9uZXh0CgkJY2hhbmdlWWVhcjogZmFsc2UsIC8vIFRydWUgaWYgeWVhciBjYW4gYmUgc2VsZWN0ZWQgZGlyZWN0bHksIGZhbHNlIGlmIG9ubHkgcHJldi9uZXh0CgkJeWVhclJhbmdlOiAnYy0xMDpjKzEwJywgLy8gUmFuZ2Ugb2YgeWVhcnMgdG8gZGlzcGxheSBpbiBkcm9wLWRvd24sCgkJCS8vIGVpdGhlciByZWxhdGl2ZSB0byB0b2RheSdzIHllYXIgKC1ubjorbm4pLCByZWxhdGl2ZSB0byBjdXJyZW50bHkgZGlzcGxheWVkIHllYXIKCQkJLy8gKGMtbm46YytubiksIGFic29sdXRlIChubm5uOm5ubm4pLCBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSBhYm92ZSAobm5ubjotbikKCQlzaG93T3RoZXJNb250aHM6IGZhbHNlLCAvLyBUcnVlIHRvIHNob3cgZGF0ZXMgaW4gb3RoZXIgbW9udGhzLCBmYWxzZSB0byBsZWF2ZSBibGFuawoJCXNlbGVjdE90aGVyTW9udGhzOiBmYWxzZSwgLy8gVHJ1ZSB0byBhbGxvdyBzZWxlY3Rpb24gb2YgZGF0ZXMgaW4gb3RoZXIgbW9udGhzLCBmYWxzZSBmb3IgdW5zZWxlY3RhYmxlCgkJc2hvd1dlZWs6IGZhbHNlLCAvLyBUcnVlIHRvIHNob3cgd2VlayBvZiB0aGUgeWVhciwgZmFsc2UgdG8gbm90IHNob3cgaXQKCQljYWxjdWxhdGVXZWVrOiB0aGlzLmlzbzg2MDFXZWVrLCAvLyBIb3cgdG8gY2FsY3VsYXRlIHRoZSB3ZWVrIG9mIHRoZSB5ZWFyLAoJCQkvLyB0YWtlcyBhIERhdGUgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgd2VlayBmb3IgaXQKCQlzaG9ydFllYXJDdXRvZmY6ICcrMTAnLCAvLyBTaG9ydCB5ZWFyIHZhbHVlcyA8IHRoaXMgYXJlIGluIHRoZSBjdXJyZW50IGNlbnR1cnksCgkJCS8vID4gdGhpcyBhcmUgaW4gdGhlIHByZXZpb3VzIGNlbnR1cnksCgkJCS8vIHN0cmluZyB2YWx1ZSBzdGFydGluZyB3aXRoICcrJyBmb3IgY3VycmVudCB5ZWFyICsgdmFsdWUKCQltaW5EYXRlOiBudWxsLCAvLyBUaGUgZWFybGllc3Qgc2VsZWN0YWJsZSBkYXRlLCBvciBudWxsIGZvciBubyBsaW1pdAoJCW1heERhdGU6IG51bGwsIC8vIFRoZSBsYXRlc3Qgc2VsZWN0YWJsZSBkYXRlLCBvciBudWxsIGZvciBubyBsaW1pdAoJCWR1cmF0aW9uOiAnZmFzdCcsIC8vIER1cmF0aW9uIG9mIGRpc3BsYXkvY2xvc3VyZQoJCWJlZm9yZVNob3dEYXk6IG51bGwsIC8vIEZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBkYXRlIGFuZCByZXR1cm5zIGFuIGFycmF5IHdpdGgKCQkJLy8gWzBdID0gdHJ1ZSBpZiBzZWxlY3RhYmxlLCBmYWxzZSBpZiBub3QsIFsxXSA9IGN1c3RvbSBDU1MgY2xhc3MgbmFtZShzKSBvciAnJywKCQkJLy8gWzJdID0gY2VsbCB0aXRsZSAob3B0aW9uYWwpLCBlLmcuICQuZGF0ZXBpY2tlci5ub1dlZWtlbmRzCgkJYmVmb3JlU2hvdzogbnVsbCwgLy8gRnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBpbnB1dCBmaWVsZCBhbmQKCQkJLy8gcmV0dXJucyBhIHNldCBvZiBjdXN0b20gc2V0dGluZ3MgZm9yIHRoZSBkYXRlIHBpY2tlcgoJCW9uU2VsZWN0OiBudWxsLCAvLyBEZWZpbmUgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIGEgZGF0ZSBpcyBzZWxlY3RlZAoJCW9uQ2hhbmdlTW9udGhZZWFyOiBudWxsLCAvLyBEZWZpbmUgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZSBtb250aCBvciB5ZWFyIGlzIGNoYW5nZWQKCQlvbkNsb3NlOiBudWxsLCAvLyBEZWZpbmUgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZSBkYXRlcGlja2VyIGlzIGNsb3NlZAoJCW51bWJlck9mTW9udGhzOiAxLCAvLyBOdW1iZXIgb2YgbW9udGhzIHRvIHNob3cgYXQgYSB0aW1lCgkJc2hvd0N1cnJlbnRBdFBvczogMCwgLy8gVGhlIHBvc2l0aW9uIGluIG11bHRpcGUgbW9udGhzIGF0IHdoaWNoIHRvIHNob3cgdGhlIGN1cnJlbnQgbW9udGggKHN0YXJ0aW5nIGF0IDApCgkJc3RlcE1vbnRoczogMSwgLy8gTnVtYmVyIG9mIG1vbnRocyB0byBzdGVwIGJhY2svZm9yd2FyZAoJCXN0ZXBCaWdNb250aHM6IDEyLCAvLyBOdW1iZXIgb2YgbW9udGhzIHRvIHN0ZXAgYmFjay9mb3J3YXJkIGZvciB0aGUgYmlnIGxpbmtzCgkJYWx0RmllbGQ6ICcnLCAvLyBTZWxlY3RvciBmb3IgYW4gYWx0ZXJuYXRlIGZpZWxkIHRvIHN0b3JlIHNlbGVjdGVkIGRhdGVzIGludG8KCQlhbHRGb3JtYXQ6ICcnLCAvLyBUaGUgZGF0ZSBmb3JtYXQgdG8gdXNlIGZvciB0aGUgYWx0ZXJuYXRlIGZpZWxkCgkJY29uc3RyYWluSW5wdXQ6IHRydWUsIC8vIFRoZSBpbnB1dCBpcyBjb25zdHJhaW5lZCBieSB0aGUgY3VycmVudCBkYXRlIGZvcm1hdAoJCXNob3dCdXR0b25QYW5lbDogZmFsc2UsIC8vIFRydWUgdG8gc2hvdyBidXR0b24gcGFuZWwsIGZhbHNlIHRvIG5vdCBzaG93IGl0CgkJYXV0b1NpemU6IGZhbHNlLCAvLyBUcnVlIHRvIHNpemUgdGhlIGlucHV0IGZvciB0aGUgZGF0ZSBmb3JtYXQsIGZhbHNlIHRvIGxlYXZlIGFzIGlzCgkJZGlzYWJsZWQ6IGZhbHNlIC8vIFRoZSBpbml0aWFsIGRpc2FibGVkIHN0YXRlCgl9OwoJJC5leHRlbmQodGhpcy5fZGVmYXVsdHMsIHRoaXMucmVnaW9uYWxbJyddKTsKCXRoaXMuZHBEaXYgPSBiaW5kSG92ZXIoJCgnPGRpdiBpZD0iJyArIHRoaXMuX21haW5EaXZJZCArICciIGNsYXNzPSJ1aS1kYXRlcGlja2VyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXggdWktY29ybmVyLWFsbCI+PC9kaXY+JykpOwp9CgokLmV4dGVuZChEYXRlcGlja2VyLnByb3RvdHlwZSwgewoJLyogQ2xhc3MgbmFtZSBhZGRlZCB0byBlbGVtZW50cyB0byBpbmRpY2F0ZSBhbHJlYWR5IGNvbmZpZ3VyZWQgd2l0aCBhIGRhdGUgcGlja2VyLiAqLwoJbWFya2VyQ2xhc3NOYW1lOiAnaGFzRGF0ZXBpY2tlcicsCgoJLy9LZWVwIHRyYWNrIG9mIHRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIGRpc3BsYXllZCAoc2VlICM3MDQzKQoJbWF4Um93czogNCwKCgkvKiBEZWJ1ZyBsb2dnaW5nIChpZiBlbmFibGVkKS4gKi8KCWxvZzogZnVuY3Rpb24gKCkgewoJCWlmICh0aGlzLmRlYnVnKQoJCQljb25zb2xlLmxvZy5hcHBseSgnJywgYXJndW1lbnRzKTsKCX0sCgoJLy8gVE9ETyByZW5hbWUgdG8gIndpZGdldCIgd2hlbiBzd2l0Y2hpbmcgdG8gd2lkZ2V0IGZhY3RvcnkKCV93aWRnZXREYXRlcGlja2VyOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5kcERpdjsKCX0sCgoJLyogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGRhdGUgcGlja2VyLgoJICAgQHBhcmFtICBzZXR0aW5ncyAgb2JqZWN0IC0gdGhlIG5ldyBzZXR0aW5ncyB0byB1c2UgYXMgZGVmYXVsdHMgKGFub255bW91cyBvYmplY3QpCgkgICBAcmV0dXJuIHRoZSBtYW5hZ2VyIG9iamVjdCAqLwoJc2V0RGVmYXVsdHM6IGZ1bmN0aW9uKHNldHRpbmdzKSB7CgkJZXh0ZW5kUmVtb3ZlKHRoaXMuX2RlZmF1bHRzLCBzZXR0aW5ncyB8fCB7fSk7CgkJcmV0dXJuIHRoaXM7Cgl9LAoKCS8qIEF0dGFjaCB0aGUgZGF0ZSBwaWNrZXIgdG8gYSBqUXVlcnkgc2VsZWN0aW9uLgoJICAgQHBhcmFtICB0YXJnZXQgICAgZWxlbWVudCAtIHRoZSB0YXJnZXQgaW5wdXQgZmllbGQgb3IgZGl2aXNpb24gb3Igc3BhbgoJICAgQHBhcmFtICBzZXR0aW5ncyAgb2JqZWN0IC0gdGhlIG5ldyBzZXR0aW5ncyB0byB1c2UgZm9yIHRoaXMgZGF0ZSBwaWNrZXIgaW5zdGFuY2UgKGFub255bW91cykgKi8KCV9hdHRhY2hEYXRlcGlja2VyOiBmdW5jdGlvbih0YXJnZXQsIHNldHRpbmdzKSB7CgkJLy8gY2hlY2sgZm9yIHNldHRpbmdzIG9uIHRoZSBjb250cm9sIGl0c2VsZiAtIGluIG5hbWVzcGFjZSAnZGF0ZTonCgkJdmFyIGlubGluZVNldHRpbmdzID0gbnVsbDsKCQlmb3IgKHZhciBhdHRyTmFtZSBpbiB0aGlzLl9kZWZhdWx0cykgewoJCQl2YXIgYXR0clZhbHVlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0ZTonICsgYXR0ck5hbWUpOwoJCQlpZiAoYXR0clZhbHVlKSB7CgkJCQlpbmxpbmVTZXR0aW5ncyA9IGlubGluZVNldHRpbmdzIHx8IHt9OwoJCQkJdHJ5IHsKCQkJCQlpbmxpbmVTZXR0aW5nc1thdHRyTmFtZV0gPSBldmFsKGF0dHJWYWx1ZSk7CgkJCQl9IGNhdGNoIChlcnIpIHsKCQkJCQlpbmxpbmVTZXR0aW5nc1thdHRyTmFtZV0gPSBhdHRyVmFsdWU7CgkJCQl9CgkJCX0KCQl9CgkJdmFyIG5vZGVOYW1lID0gdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJdmFyIGlubGluZSA9IChub2RlTmFtZSA9PSAnZGl2JyB8fCBub2RlTmFtZSA9PSAnc3BhbicpOwoJCWlmICghdGFyZ2V0LmlkKSB7CgkJCXRoaXMudXVpZCArPSAxOwoJCQl0YXJnZXQuaWQgPSAnZHAnICsgdGhpcy51dWlkOwoJCX0KCQl2YXIgaW5zdCA9IHRoaXMuX25ld0luc3QoJCh0YXJnZXQpLCBpbmxpbmUpOwoJCWluc3Quc2V0dGluZ3MgPSAkLmV4dGVuZCh7fSwgc2V0dGluZ3MgfHwge30sIGlubGluZVNldHRpbmdzIHx8IHt9KTsKCQlpZiAobm9kZU5hbWUgPT0gJ2lucHV0JykgewoJCQl0aGlzLl9jb25uZWN0RGF0ZXBpY2tlcih0YXJnZXQsIGluc3QpOwoJCX0gZWxzZSBpZiAoaW5saW5lKSB7CgkJCXRoaXMuX2lubGluZURhdGVwaWNrZXIodGFyZ2V0LCBpbnN0KTsKCQl9Cgl9LAoKCS8qIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvYmplY3QuICovCglfbmV3SW5zdDogZnVuY3Rpb24odGFyZ2V0LCBpbmxpbmUpIHsKCQl2YXIgaWQgPSB0YXJnZXRbMF0uaWQucmVwbGFjZSgvKFteQS1aYS16MC05Xy1dKS9nLCAnXFxcXCQxJyk7IC8vIGVzY2FwZSBqUXVlcnkgbWV0YSBjaGFycwoJCXJldHVybiB7aWQ6IGlkLCBpbnB1dDogdGFyZ2V0LCAvLyBhc3NvY2lhdGVkIHRhcmdldAoJCQlzZWxlY3RlZERheTogMCwgc2VsZWN0ZWRNb250aDogMCwgc2VsZWN0ZWRZZWFyOiAwLCAvLyBjdXJyZW50IHNlbGVjdGlvbgoJCQlkcmF3TW9udGg6IDAsIGRyYXdZZWFyOiAwLCAvLyBtb250aCBiZWluZyBkcmF3bgoJCQlpbmxpbmU6IGlubGluZSwgLy8gaXMgZGF0ZXBpY2tlciBpbmxpbmUgb3Igbm90CgkJCWRwRGl2OiAoIWlubGluZSA/IHRoaXMuZHBEaXYgOiAvLyBwcmVzZW50YXRpb24gZGl2CgkJCWJpbmRIb3ZlcigkKCc8ZGl2IGNsYXNzPSInICsgdGhpcy5faW5saW5lQ2xhc3MgKyAnIHVpLWRhdGVwaWNrZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCB1aS1jb3JuZXItYWxsIj48L2Rpdj4nKSkpfTsKCX0sCgoJLyogQXR0YWNoIHRoZSBkYXRlIHBpY2tlciB0byBhbiBpbnB1dCBmaWVsZC4gKi8KCV9jb25uZWN0RGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0LCBpbnN0KSB7CgkJdmFyIGlucHV0ID0gJCh0YXJnZXQpOwoJCWluc3QuYXBwZW5kID0gJChbXSk7CgkJaW5zdC50cmlnZ2VyID0gJChbXSk7CgkJaWYgKGlucHV0Lmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSkKCQkJcmV0dXJuOwoJCXRoaXMuX2F0dGFjaG1lbnRzKGlucHV0LCBpbnN0KTsKCQlpbnB1dC5hZGRDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkua2V5ZG93bih0aGlzLl9kb0tleURvd24pLgoJCQlrZXlwcmVzcyh0aGlzLl9kb0tleVByZXNzKS5rZXl1cCh0aGlzLl9kb0tleVVwKS4KCQkJYmluZCgic2V0RGF0YS5kYXRlcGlja2VyIiwgZnVuY3Rpb24oZXZlbnQsIGtleSwgdmFsdWUpIHsKCQkJCWluc3Quc2V0dGluZ3Nba2V5XSA9IHZhbHVlOwoJCQl9KS5iaW5kKCJnZXREYXRhLmRhdGVwaWNrZXIiLCBmdW5jdGlvbihldmVudCwga2V5KSB7CgkJCQlyZXR1cm4gdGhpcy5fZ2V0KGluc3QsIGtleSk7CgkJCX0pOwoJCXRoaXMuX2F1dG9TaXplKGluc3QpOwoJCSQuZGF0YSh0YXJnZXQsIFBST1BfTkFNRSwgaW5zdCk7CgkJLy9JZiBkaXNhYmxlZCBvcHRpb24gaXMgdHJ1ZSwgZGlzYWJsZSB0aGUgZGF0ZXBpY2tlciBvbmNlIGl0IGhhcyBiZWVuIGF0dGFjaGVkIHRvIHRoZSBpbnB1dCAoc2VlIHRpY2tldCAjNTY2NSkKCQlpZiggaW5zdC5zZXR0aW5ncy5kaXNhYmxlZCApIHsKCQkJdGhpcy5fZGlzYWJsZURhdGVwaWNrZXIoIHRhcmdldCApOwoJCX0KCX0sCgoJLyogTWFrZSBhdHRhY2htZW50cyBiYXNlZCBvbiBzZXR0aW5ncy4gKi8KCV9hdHRhY2htZW50czogZnVuY3Rpb24oaW5wdXQsIGluc3QpIHsKCQl2YXIgYXBwZW5kVGV4dCA9IHRoaXMuX2dldChpbnN0LCAnYXBwZW5kVGV4dCcpOwoJCXZhciBpc1JUTCA9IHRoaXMuX2dldChpbnN0LCAnaXNSVEwnKTsKCQlpZiAoaW5zdC5hcHBlbmQpCgkJCWluc3QuYXBwZW5kLnJlbW92ZSgpOwoJCWlmIChhcHBlbmRUZXh0KSB7CgkJCWluc3QuYXBwZW5kID0gJCgnPHNwYW4gY2xhc3M9IicgKyB0aGlzLl9hcHBlbmRDbGFzcyArICciPicgKyBhcHBlbmRUZXh0ICsgJzwvc3Bhbj4nKTsKCQkJaW5wdXRbaXNSVEwgPyAnYmVmb3JlJyA6ICdhZnRlciddKGluc3QuYXBwZW5kKTsKCQl9CgkJaW5wdXQudW5iaW5kKCdmb2N1cycsIHRoaXMuX3Nob3dEYXRlcGlja2VyKTsKCQlpZiAoaW5zdC50cmlnZ2VyKQoJCQlpbnN0LnRyaWdnZXIucmVtb3ZlKCk7CgkJdmFyIHNob3dPbiA9IHRoaXMuX2dldChpbnN0LCAnc2hvd09uJyk7CgkJaWYgKHNob3dPbiA9PSAnZm9jdXMnIHx8IHNob3dPbiA9PSAnYm90aCcpIC8vIHBvcC11cCBkYXRlIHBpY2tlciB3aGVuIGluIHRoZSBtYXJrZWQgZmllbGQKCQkJaW5wdXQuZm9jdXModGhpcy5fc2hvd0RhdGVwaWNrZXIpOwoJCWlmIChzaG93T24gPT0gJ2J1dHRvbicgfHwgc2hvd09uID09ICdib3RoJykgeyAvLyBwb3AtdXAgZGF0ZSBwaWNrZXIgd2hlbiBidXR0b24gY2xpY2tlZAoJCQl2YXIgYnV0dG9uVGV4dCA9IHRoaXMuX2dldChpbnN0LCAnYnV0dG9uVGV4dCcpOwoJCQl2YXIgYnV0dG9uSW1hZ2UgPSB0aGlzLl9nZXQoaW5zdCwgJ2J1dHRvbkltYWdlJyk7CgkJCWluc3QudHJpZ2dlciA9ICQodGhpcy5fZ2V0KGluc3QsICdidXR0b25JbWFnZU9ubHknKSA/CgkJCQkkKCc8aW1nLz4nKS5hZGRDbGFzcyh0aGlzLl90cmlnZ2VyQ2xhc3MpLgoJCQkJCWF0dHIoeyBzcmM6IGJ1dHRvbkltYWdlLCBhbHQ6IGJ1dHRvblRleHQsIHRpdGxlOiBidXR0b25UZXh0IH0pIDoKCQkJCSQoJzxidXR0b24gdHlwZT0iYnV0dG9uIj48L2J1dHRvbj4nKS5hZGRDbGFzcyh0aGlzLl90cmlnZ2VyQ2xhc3MpLgoJCQkJCWh0bWwoYnV0dG9uSW1hZ2UgPT0gJycgPyBidXR0b25UZXh0IDogJCgnPGltZy8+JykuYXR0cigKCQkJCQl7IHNyYzpidXR0b25JbWFnZSwgYWx0OmJ1dHRvblRleHQsIHRpdGxlOmJ1dHRvblRleHQgfSkpKTsKCQkJaW5wdXRbaXNSVEwgPyAnYmVmb3JlJyA6ICdhZnRlciddKGluc3QudHJpZ2dlcik7CgkJCWluc3QudHJpZ2dlci5jbGljayhmdW5jdGlvbigpIHsKCQkJCWlmICgkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nICYmICQuZGF0ZXBpY2tlci5fbGFzdElucHV0ID09IGlucHV0WzBdKQoJCQkJCSQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTsKCQkJCWVsc2UgaWYgKCQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcgJiYgJC5kYXRlcGlja2VyLl9sYXN0SW5wdXQgIT0gaW5wdXRbMF0pIHsKCQkJCQkkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk7CgkJCQkJJC5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcihpbnB1dFswXSk7CgkJCQl9IGVsc2UKCQkJCQkkLmRhdGVwaWNrZXIuX3Nob3dEYXRlcGlja2VyKGlucHV0WzBdKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfSk7CgkJfQoJfSwKCgkvKiBBcHBseSB0aGUgbWF4aW11bSBsZW5ndGggZm9yIHRoZSBkYXRlIGZvcm1hdC4gKi8KCV9hdXRvU2l6ZTogZnVuY3Rpb24oaW5zdCkgewoJCWlmICh0aGlzLl9nZXQoaW5zdCwgJ2F1dG9TaXplJykgJiYgIWluc3QuaW5saW5lKSB7CgkJCXZhciBkYXRlID0gbmV3IERhdGUoMjAwOSwgMTIgLSAxLCAyMCk7IC8vIEVuc3VyZSBkb3VibGUgZGlnaXRzCgkJCXZhciBkYXRlRm9ybWF0ID0gdGhpcy5fZ2V0KGluc3QsICdkYXRlRm9ybWF0Jyk7CgkJCWlmIChkYXRlRm9ybWF0Lm1hdGNoKC9bRE1dLykpIHsKCQkJCXZhciBmaW5kTWF4ID0gZnVuY3Rpb24obmFtZXMpIHsKCQkJCQl2YXIgbWF4ID0gMDsKCQkJCQl2YXIgbWF4SSA9IDA7CgkJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewoJCQkJCQlpZiAobmFtZXNbaV0ubGVuZ3RoID4gbWF4KSB7CgkJCQkJCQltYXggPSBuYW1lc1tpXS5sZW5ndGg7CgkJCQkJCQltYXhJID0gaTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlyZXR1cm4gbWF4STsKCQkJCX07CgkJCQlkYXRlLnNldE1vbnRoKGZpbmRNYXgodGhpcy5fZ2V0KGluc3QsIChkYXRlRm9ybWF0Lm1hdGNoKC9NTS8pID8KCQkJCQknbW9udGhOYW1lcycgOiAnbW9udGhOYW1lc1Nob3J0JykpKSk7CgkJCQlkYXRlLnNldERhdGUoZmluZE1heCh0aGlzLl9nZXQoaW5zdCwgKGRhdGVGb3JtYXQubWF0Y2goL0RELykgPwoJCQkJCSdkYXlOYW1lcycgOiAnZGF5TmFtZXNTaG9ydCcpKSkgKyAyMCAtIGRhdGUuZ2V0RGF5KCkpOwoJCQl9CgkJCWluc3QuaW5wdXQuYXR0cignc2l6ZScsIHRoaXMuX2Zvcm1hdERhdGUoaW5zdCwgZGF0ZSkubGVuZ3RoKTsKCQl9Cgl9LAoKCS8qIEF0dGFjaCBhbiBpbmxpbmUgZGF0ZSBwaWNrZXIgdG8gYSBkaXYuICovCglfaW5saW5lRGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0LCBpbnN0KSB7CgkJdmFyIGRpdlNwYW4gPSAkKHRhcmdldCk7CgkJaWYgKGRpdlNwYW4uaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKQoJCQlyZXR1cm47CgkJZGl2U3Bhbi5hZGRDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkuYXBwZW5kKGluc3QuZHBEaXYpLgoJCQliaW5kKCJzZXREYXRhLmRhdGVwaWNrZXIiLCBmdW5jdGlvbihldmVudCwga2V5LCB2YWx1ZSl7CgkJCQlpbnN0LnNldHRpbmdzW2tleV0gPSB2YWx1ZTsKCQkJfSkuYmluZCgiZ2V0RGF0YS5kYXRlcGlja2VyIiwgZnVuY3Rpb24oZXZlbnQsIGtleSl7CgkJCQlyZXR1cm4gdGhpcy5fZ2V0KGluc3QsIGtleSk7CgkJCX0pOwoJCSQuZGF0YSh0YXJnZXQsIFBST1BfTkFNRSwgaW5zdCk7CgkJdGhpcy5fc2V0RGF0ZShpbnN0LCB0aGlzLl9nZXREZWZhdWx0RGF0ZShpbnN0KSwgdHJ1ZSk7CgkJdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTsKCQl0aGlzLl91cGRhdGVBbHRlcm5hdGUoaW5zdCk7CgkJLy9JZiBkaXNhYmxlZCBvcHRpb24gaXMgdHJ1ZSwgZGlzYWJsZSB0aGUgZGF0ZXBpY2tlciBiZWZvcmUgc2hvd2luZyBpdCAoc2VlIHRpY2tldCAjNTY2NSkKCQlpZiggaW5zdC5zZXR0aW5ncy5kaXNhYmxlZCApIHsKCQkJdGhpcy5fZGlzYWJsZURhdGVwaWNrZXIoIHRhcmdldCApOwoJCX0KCQkvLyBTZXQgZGlzcGxheTpibG9jayBpbiBwbGFjZSBvZiBpbnN0LmRwRGl2LnNob3coKSB3aGljaCB3b24ndCB3b3JrIG9uIGRpc2Nvbm5lY3RlZCBlbGVtZW50cwoJCS8vIGh0dHA6Ly9idWdzLmpxdWVyeXVpLmNvbS90aWNrZXQvNzU1MiAtIEEgRGF0ZXBpY2tlciBjcmVhdGVkIG9uIGEgZGV0YWNoZWQgZGl2IGhhcyB6ZXJvIGhlaWdodAoJCWluc3QuZHBEaXYuY3NzKCAiZGlzcGxheSIsICJibG9jayIgKTsKCX0sCgoJLyogUG9wLXVwIHRoZSBkYXRlIHBpY2tlciBpbiBhICJkaWFsb2ciIGJveC4KCSAgIEBwYXJhbSAgaW5wdXQgICAgIGVsZW1lbnQgLSBpZ25vcmVkCgkgICBAcGFyYW0gIGRhdGUgICAgICBzdHJpbmcgb3IgRGF0ZSAtIHRoZSBpbml0aWFsIGRhdGUgdG8gZGlzcGxheQoJICAgQHBhcmFtICBvblNlbGVjdCAgZnVuY3Rpb24gLSB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgZGF0ZSBpcyBzZWxlY3RlZAoJICAgQHBhcmFtICBzZXR0aW5ncyAgb2JqZWN0IC0gdXBkYXRlIHRoZSBkaWFsb2cgZGF0ZSBwaWNrZXIgaW5zdGFuY2UncyBzZXR0aW5ncyAoYW5vbnltb3VzIG9iamVjdCkKCSAgIEBwYXJhbSAgcG9zICAgICAgIGludFsyXSAtIGNvb3JkaW5hdGVzIGZvciB0aGUgZGlhbG9nJ3MgcG9zaXRpb24gd2l0aGluIHRoZSBzY3JlZW4gb3IKCSAgICAgICAgICAgICAgICAgICAgIGV2ZW50IC0gd2l0aCB4L3kgY29vcmRpbmF0ZXMgb3IKCSAgICAgICAgICAgICAgICAgICAgIGxlYXZlIGVtcHR5IGZvciBkZWZhdWx0IChzY3JlZW4gY2VudHJlKQoJICAgQHJldHVybiB0aGUgbWFuYWdlciBvYmplY3QgKi8KCV9kaWFsb2dEYXRlcGlja2VyOiBmdW5jdGlvbihpbnB1dCwgZGF0ZSwgb25TZWxlY3QsIHNldHRpbmdzLCBwb3MpIHsKCQl2YXIgaW5zdCA9IHRoaXMuX2RpYWxvZ0luc3Q7IC8vIGludGVybmFsIGluc3RhbmNlCgkJaWYgKCFpbnN0KSB7CgkJCXRoaXMudXVpZCArPSAxOwoJCQl2YXIgaWQgPSAnZHAnICsgdGhpcy51dWlkOwoJCQl0aGlzLl9kaWFsb2dJbnB1dCA9ICQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iJyArIGlkICsKCQkJCSciIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLTEwMHB4OyB3aWR0aDogMHB4OyIvPicpOwoJCQl0aGlzLl9kaWFsb2dJbnB1dC5rZXlkb3duKHRoaXMuX2RvS2V5RG93bik7CgkJCSQoJ2JvZHknKS5hcHBlbmQodGhpcy5fZGlhbG9nSW5wdXQpOwoJCQlpbnN0ID0gdGhpcy5fZGlhbG9nSW5zdCA9IHRoaXMuX25ld0luc3QodGhpcy5fZGlhbG9nSW5wdXQsIGZhbHNlKTsKCQkJaW5zdC5zZXR0aW5ncyA9IHt9OwoJCQkkLmRhdGEodGhpcy5fZGlhbG9nSW5wdXRbMF0sIFBST1BfTkFNRSwgaW5zdCk7CgkJfQoJCWV4dGVuZFJlbW92ZShpbnN0LnNldHRpbmdzLCBzZXR0aW5ncyB8fCB7fSk7CgkJZGF0ZSA9IChkYXRlICYmIGRhdGUuY29uc3RydWN0b3IgPT0gRGF0ZSA/IHRoaXMuX2Zvcm1hdERhdGUoaW5zdCwgZGF0ZSkgOiBkYXRlKTsKCQl0aGlzLl9kaWFsb2dJbnB1dC52YWwoZGF0ZSk7CgoJCXRoaXMuX3BvcyA9IChwb3MgPyAocG9zLmxlbmd0aCA/IHBvcyA6IFtwb3MucGFnZVgsIHBvcy5wYWdlWV0pIDogbnVsbCk7CgkJaWYgKCF0aGlzLl9wb3MpIHsKCQkJdmFyIGJyb3dzZXJXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDsKCQkJdmFyIGJyb3dzZXJIZWlnaHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OwoJCQl2YXIgc2Nyb2xsWCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0IHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDsKCQkJdmFyIHNjcm9sbFkgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wOwoJCQl0aGlzLl9wb3MgPSAvLyBzaG91bGQgdXNlIGFjdHVhbCB3aWR0aC9oZWlnaHQgYmVsb3cKCQkJCVsoYnJvd3NlcldpZHRoIC8gMikgLSAxMDAgKyBzY3JvbGxYLCAoYnJvd3NlckhlaWdodCAvIDIpIC0gMTUwICsgc2Nyb2xsWV07CgkJfQoKCQkvLyBtb3ZlIGlucHV0IG9uIHNjcmVlbiBmb3IgZm9jdXMsIGJ1dCBoaWRkZW4gYmVoaW5kIGRpYWxvZwoJCXRoaXMuX2RpYWxvZ0lucHV0LmNzcygnbGVmdCcsICh0aGlzLl9wb3NbMF0gKyAyMCkgKyAncHgnKS5jc3MoJ3RvcCcsIHRoaXMuX3Bvc1sxXSArICdweCcpOwoJCWluc3Quc2V0dGluZ3Mub25TZWxlY3QgPSBvblNlbGVjdDsKCQl0aGlzLl9pbkRpYWxvZyA9IHRydWU7CgkJdGhpcy5kcERpdi5hZGRDbGFzcyh0aGlzLl9kaWFsb2dDbGFzcyk7CgkJdGhpcy5fc2hvd0RhdGVwaWNrZXIodGhpcy5fZGlhbG9nSW5wdXRbMF0pOwoJCWlmICgkLmJsb2NrVUkpCgkJCSQuYmxvY2tVSSh0aGlzLmRwRGl2KTsKCQkkLmRhdGEodGhpcy5fZGlhbG9nSW5wdXRbMF0sIFBST1BfTkFNRSwgaW5zdCk7CgkJcmV0dXJuIHRoaXM7Cgl9LAoKCS8qIERldGFjaCBhIGRhdGVwaWNrZXIgZnJvbSBpdHMgY29udHJvbC4KCSAgIEBwYXJhbSAgdGFyZ2V0ICAgIGVsZW1lbnQgLSB0aGUgdGFyZ2V0IGlucHV0IGZpZWxkIG9yIGRpdmlzaW9uIG9yIHNwYW4gKi8KCV9kZXN0cm95RGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0KSB7CgkJdmFyICR0YXJnZXQgPSAkKHRhcmdldCk7CgkJdmFyIGluc3QgPSAkLmRhdGEodGFyZ2V0LCBQUk9QX05BTUUpOwoJCWlmICghJHRhcmdldC5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpIHsKCQkJcmV0dXJuOwoJCX0KCQl2YXIgbm9kZU5hbWUgPSB0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkkLnJlbW92ZURhdGEodGFyZ2V0LCBQUk9QX05BTUUpOwoJCWlmIChub2RlTmFtZSA9PSAnaW5wdXQnKSB7CgkJCWluc3QuYXBwZW5kLnJlbW92ZSgpOwoJCQlpbnN0LnRyaWdnZXIucmVtb3ZlKCk7CgkJCSR0YXJnZXQucmVtb3ZlQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLgoJCQkJdW5iaW5kKCdmb2N1cycsIHRoaXMuX3Nob3dEYXRlcGlja2VyKS4KCQkJCXVuYmluZCgna2V5ZG93bicsIHRoaXMuX2RvS2V5RG93bikuCgkJCQl1bmJpbmQoJ2tleXByZXNzJywgdGhpcy5fZG9LZXlQcmVzcykuCgkJCQl1bmJpbmQoJ2tleXVwJywgdGhpcy5fZG9LZXlVcCk7CgkJfSBlbHNlIGlmIChub2RlTmFtZSA9PSAnZGl2JyB8fCBub2RlTmFtZSA9PSAnc3BhbicpCgkJCSR0YXJnZXQucmVtb3ZlQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmVtcHR5KCk7Cgl9LAoKCS8qIEVuYWJsZSB0aGUgZGF0ZSBwaWNrZXIgdG8gYSBqUXVlcnkgc2VsZWN0aW9uLgoJICAgQHBhcmFtICB0YXJnZXQgICAgZWxlbWVudCAtIHRoZSB0YXJnZXQgaW5wdXQgZmllbGQgb3IgZGl2aXNpb24gb3Igc3BhbiAqLwoJX2VuYWJsZURhdGVwaWNrZXI6IGZ1bmN0aW9uKHRhcmdldCkgewoJCXZhciAkdGFyZ2V0ID0gJCh0YXJnZXQpOwoJCXZhciBpbnN0ID0gJC5kYXRhKHRhcmdldCwgUFJPUF9OQU1FKTsKCQlpZiAoISR0YXJnZXQuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKSB7CgkJCXJldHVybjsKCQl9CgkJdmFyIG5vZGVOYW1lID0gdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJaWYgKG5vZGVOYW1lID09ICdpbnB1dCcpIHsKCQkJdGFyZ2V0LmRpc2FibGVkID0gZmFsc2U7CgkJCWluc3QudHJpZ2dlci5maWx0ZXIoJ2J1dHRvbicpLgoJCQkJZWFjaChmdW5jdGlvbigpIHsgdGhpcy5kaXNhYmxlZCA9IGZhbHNlOyB9KS5lbmQoKS4KCQkJCWZpbHRlcignaW1nJykuY3NzKHtvcGFjaXR5OiAnMS4wJywgY3Vyc29yOiAnJ30pOwoJCX0KCQllbHNlIGlmIChub2RlTmFtZSA9PSAnZGl2JyB8fCBub2RlTmFtZSA9PSAnc3BhbicpIHsKCQkJdmFyIGlubGluZSA9ICR0YXJnZXQuY2hpbGRyZW4oJy4nICsgdGhpcy5faW5saW5lQ2xhc3MpOwoJCQlpbmxpbmUuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcygndWktc3RhdGUtZGlzYWJsZWQnKTsKCQkJaW5saW5lLmZpbmQoInNlbGVjdC51aS1kYXRlcGlja2VyLW1vbnRoLCBzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFyIikuCgkJCQlwcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKCQl9CgkJdGhpcy5fZGlzYWJsZWRJbnB1dHMgPSAkLm1hcCh0aGlzLl9kaXNhYmxlZElucHV0cywKCQkJZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuICh2YWx1ZSA9PSB0YXJnZXQgPyBudWxsIDogdmFsdWUpOyB9KTsgLy8gZGVsZXRlIGVudHJ5Cgl9LAoKCS8qIERpc2FibGUgdGhlIGRhdGUgcGlja2VyIHRvIGEgalF1ZXJ5IHNlbGVjdGlvbi4KCSAgIEBwYXJhbSAgdGFyZ2V0ICAgIGVsZW1lbnQgLSB0aGUgdGFyZ2V0IGlucHV0IGZpZWxkIG9yIGRpdmlzaW9uIG9yIHNwYW4gKi8KCV9kaXNhYmxlRGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0KSB7CgkJdmFyICR0YXJnZXQgPSAkKHRhcmdldCk7CgkJdmFyIGluc3QgPSAkLmRhdGEodGFyZ2V0LCBQUk9QX05BTUUpOwoJCWlmICghJHRhcmdldC5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpIHsKCQkJcmV0dXJuOwoJCX0KCQl2YXIgbm9kZU5hbWUgPSB0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQlpZiAobm9kZU5hbWUgPT0gJ2lucHV0JykgewoJCQl0YXJnZXQuZGlzYWJsZWQgPSB0cnVlOwoJCQlpbnN0LnRyaWdnZXIuZmlsdGVyKCdidXR0b24nKS4KCQkJCWVhY2goZnVuY3Rpb24oKSB7IHRoaXMuZGlzYWJsZWQgPSB0cnVlOyB9KS5lbmQoKS4KCQkJCWZpbHRlcignaW1nJykuY3NzKHtvcGFjaXR5OiAnMC41JywgY3Vyc29yOiAnZGVmYXVsdCd9KTsKCQl9CgkJZWxzZSBpZiAobm9kZU5hbWUgPT0gJ2RpdicgfHwgbm9kZU5hbWUgPT0gJ3NwYW4nKSB7CgkJCXZhciBpbmxpbmUgPSAkdGFyZ2V0LmNoaWxkcmVuKCcuJyArIHRoaXMuX2lubGluZUNsYXNzKTsKCQkJaW5saW5lLmNoaWxkcmVuKCkuYWRkQ2xhc3MoJ3VpLXN0YXRlLWRpc2FibGVkJyk7CgkJCWlubGluZS5maW5kKCJzZWxlY3QudWktZGF0ZXBpY2tlci1tb250aCwgc2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhciIpLgoJCQkJcHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKCQl9CgkJdGhpcy5fZGlzYWJsZWRJbnB1dHMgPSAkLm1hcCh0aGlzLl9kaXNhYmxlZElucHV0cywKCQkJZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuICh2YWx1ZSA9PSB0YXJnZXQgPyBudWxsIDogdmFsdWUpOyB9KTsgLy8gZGVsZXRlIGVudHJ5CgkJdGhpcy5fZGlzYWJsZWRJbnB1dHNbdGhpcy5fZGlzYWJsZWRJbnB1dHMubGVuZ3RoXSA9IHRhcmdldDsKCX0sCgoJLyogSXMgdGhlIGZpcnN0IGZpZWxkIGluIGEgalF1ZXJ5IGNvbGxlY3Rpb24gZGlzYWJsZWQgYXMgYSBkYXRlcGlja2VyPwoJICAgQHBhcmFtICB0YXJnZXQgICAgZWxlbWVudCAtIHRoZSB0YXJnZXQgaW5wdXQgZmllbGQgb3IgZGl2aXNpb24gb3Igc3BhbgoJICAgQHJldHVybiBib29sZWFuIC0gdHJ1ZSBpZiBkaXNhYmxlZCwgZmFsc2UgaWYgZW5hYmxlZCAqLwoJX2lzRGlzYWJsZWREYXRlcGlja2VyOiBmdW5jdGlvbih0YXJnZXQpIHsKCQlpZiAoIXRhcmdldCkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fZGlzYWJsZWRJbnB1dHMubGVuZ3RoOyBpKyspIHsKCQkJaWYgKHRoaXMuX2Rpc2FibGVkSW5wdXRzW2ldID09IHRhcmdldCkKCQkJCXJldHVybiB0cnVlOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCS8qIFJldHJpZXZlIHRoZSBpbnN0YW5jZSBkYXRhIGZvciB0aGUgdGFyZ2V0IGNvbnRyb2wuCgkgICBAcGFyYW0gIHRhcmdldCAgZWxlbWVudCAtIHRoZSB0YXJnZXQgaW5wdXQgZmllbGQgb3IgZGl2aXNpb24gb3Igc3BhbgoJICAgQHJldHVybiAgb2JqZWN0IC0gdGhlIGFzc29jaWF0ZWQgaW5zdGFuY2UgZGF0YQoJICAgQHRocm93cyAgZXJyb3IgaWYgYSBqUXVlcnkgcHJvYmxlbSBnZXR0aW5nIGRhdGEgKi8KCV9nZXRJbnN0OiBmdW5jdGlvbih0YXJnZXQpIHsKCQl0cnkgewoJCQlyZXR1cm4gJC5kYXRhKHRhcmdldCwgUFJPUF9OQU1FKTsKCQl9CgkJY2F0Y2ggKGVycikgewoJCQl0aHJvdyAnTWlzc2luZyBpbnN0YW5jZSBkYXRhIGZvciB0aGlzIGRhdGVwaWNrZXInOwoJCX0KCX0sCgoJLyogVXBkYXRlIG9yIHJldHJpZXZlIHRoZSBzZXR0aW5ncyBmb3IgYSBkYXRlIHBpY2tlciBhdHRhY2hlZCB0byBhbiBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbi4KCSAgIEBwYXJhbSAgdGFyZ2V0ICBlbGVtZW50IC0gdGhlIHRhcmdldCBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbiBvciBzcGFuCgkgICBAcGFyYW0gIG5hbWUgICAgb2JqZWN0IC0gdGhlIG5ldyBzZXR0aW5ncyB0byB1cGRhdGUgb3IKCSAgICAgICAgICAgICAgICAgICBzdHJpbmcgLSB0aGUgbmFtZSBvZiB0aGUgc2V0dGluZyB0byBjaGFuZ2Ugb3IgcmV0cmlldmUsCgkgICAgICAgICAgICAgICAgICAgd2hlbiByZXRyaWV2aW5nIGFsc28gJ2FsbCcgZm9yIGFsbCBpbnN0YW5jZSBzZXR0aW5ncyBvcgoJICAgICAgICAgICAgICAgICAgICdkZWZhdWx0cycgZm9yIGFsbCBnbG9iYWwgZGVmYXVsdHMKCSAgIEBwYXJhbSAgdmFsdWUgICBhbnkgLSB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc2V0dGluZwoJICAgICAgICAgICAgICAgICAgIChvbWl0IGlmIGFib3ZlIGlzIGFuIG9iamVjdCBvciB0byByZXRyaWV2ZSBhIHZhbHVlKSAqLwoJX29wdGlvbkRhdGVwaWNrZXI6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgdmFsdWUpIHsKCQl2YXIgaW5zdCA9IHRoaXMuX2dldEluc3QodGFyZ2V0KTsKCQlpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyICYmIHR5cGVvZiBuYW1lID09ICdzdHJpbmcnKSB7CgkJCXJldHVybiAobmFtZSA9PSAnZGVmYXVsdHMnID8gJC5leHRlbmQoe30sICQuZGF0ZXBpY2tlci5fZGVmYXVsdHMpIDoKCQkJCShpbnN0ID8gKG5hbWUgPT0gJ2FsbCcgPyAkLmV4dGVuZCh7fSwgaW5zdC5zZXR0aW5ncykgOgoJCQkJdGhpcy5fZ2V0KGluc3QsIG5hbWUpKSA6IG51bGwpKTsKCQl9CgkJdmFyIHNldHRpbmdzID0gbmFtZSB8fCB7fTsKCQlpZiAodHlwZW9mIG5hbWUgPT0gJ3N0cmluZycpIHsKCQkJc2V0dGluZ3MgPSB7fTsKCQkJc2V0dGluZ3NbbmFtZV0gPSB2YWx1ZTsKCQl9CgkJaWYgKGluc3QpIHsKCQkJaWYgKHRoaXMuX2N1ckluc3QgPT0gaW5zdCkgewoJCQkJdGhpcy5faGlkZURhdGVwaWNrZXIoKTsKCQkJfQoJCQl2YXIgZGF0ZSA9IHRoaXMuX2dldERhdGVEYXRlcGlja2VyKHRhcmdldCwgdHJ1ZSk7CgkJCXZhciBtaW5EYXRlID0gdGhpcy5fZ2V0TWluTWF4RGF0ZShpbnN0LCAnbWluJyk7CgkJCXZhciBtYXhEYXRlID0gdGhpcy5fZ2V0TWluTWF4RGF0ZShpbnN0LCAnbWF4Jyk7CgkJCWV4dGVuZFJlbW92ZShpbnN0LnNldHRpbmdzLCBzZXR0aW5ncyk7CgkJCS8vIHJlZm9ybWF0IHRoZSBvbGQgbWluRGF0ZS9tYXhEYXRlIHZhbHVlcyBpZiBkYXRlRm9ybWF0IGNoYW5nZXMgYW5kIGEgbmV3IG1pbkRhdGUvbWF4RGF0ZSBpc24ndCBwcm92aWRlZAoJCQlpZiAobWluRGF0ZSAhPT0gbnVsbCAmJiBzZXR0aW5nc1snZGF0ZUZvcm1hdCddICE9PSB1bmRlZmluZWQgJiYgc2V0dGluZ3NbJ21pbkRhdGUnXSA9PT0gdW5kZWZpbmVkKQoJCQkJaW5zdC5zZXR0aW5ncy5taW5EYXRlID0gdGhpcy5fZm9ybWF0RGF0ZShpbnN0LCBtaW5EYXRlKTsKCQkJaWYgKG1heERhdGUgIT09IG51bGwgJiYgc2V0dGluZ3NbJ2RhdGVGb3JtYXQnXSAhPT0gdW5kZWZpbmVkICYmIHNldHRpbmdzWydtYXhEYXRlJ10gPT09IHVuZGVmaW5lZCkKCQkJCWluc3Quc2V0dGluZ3MubWF4RGF0ZSA9IHRoaXMuX2Zvcm1hdERhdGUoaW5zdCwgbWF4RGF0ZSk7CgkJCXRoaXMuX2F0dGFjaG1lbnRzKCQodGFyZ2V0KSwgaW5zdCk7CgkJCXRoaXMuX2F1dG9TaXplKGluc3QpOwoJCQl0aGlzLl9zZXREYXRlKGluc3QsIGRhdGUpOwoJCQl0aGlzLl91cGRhdGVBbHRlcm5hdGUoaW5zdCk7CgkJCXRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7CgkJfQoJfSwKCgkvLyBjaGFuZ2UgbWV0aG9kIGRlcHJlY2F0ZWQKCV9jaGFuZ2VEYXRlcGlja2VyOiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7CgkJdGhpcy5fb3B0aW9uRGF0ZXBpY2tlcih0YXJnZXQsIG5hbWUsIHZhbHVlKTsKCX0sCgoJLyogUmVkcmF3IHRoZSBkYXRlIHBpY2tlciBhdHRhY2hlZCB0byBhbiBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbi4KCSAgIEBwYXJhbSAgdGFyZ2V0ICBlbGVtZW50IC0gdGhlIHRhcmdldCBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbiBvciBzcGFuICovCglfcmVmcmVzaERhdGVwaWNrZXI6IGZ1bmN0aW9uKHRhcmdldCkgewoJCXZhciBpbnN0ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXQpOwoJCWlmIChpbnN0KSB7CgkJCXRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7CgkJfQoJfSwKCgkvKiBTZXQgdGhlIGRhdGVzIGZvciBhIGpRdWVyeSBzZWxlY3Rpb24uCgkgICBAcGFyYW0gIHRhcmdldCAgIGVsZW1lbnQgLSB0aGUgdGFyZ2V0IGlucHV0IGZpZWxkIG9yIGRpdmlzaW9uIG9yIHNwYW4KCSAgIEBwYXJhbSAgZGF0ZSAgICAgRGF0ZSAtIHRoZSBuZXcgZGF0ZSAqLwoJX3NldERhdGVEYXRlcGlja2VyOiBmdW5jdGlvbih0YXJnZXQsIGRhdGUpIHsKCQl2YXIgaW5zdCA9IHRoaXMuX2dldEluc3QodGFyZ2V0KTsKCQlpZiAoaW5zdCkgewoJCQl0aGlzLl9zZXREYXRlKGluc3QsIGRhdGUpOwoJCQl0aGlzLl91cGRhdGVEYXRlcGlja2VyKGluc3QpOwoJCQl0aGlzLl91cGRhdGVBbHRlcm5hdGUoaW5zdCk7CgkJfQoJfSwKCgkvKiBHZXQgdGhlIGRhdGUocykgZm9yIHRoZSBmaXJzdCBlbnRyeSBpbiBhIGpRdWVyeSBzZWxlY3Rpb24uCgkgICBAcGFyYW0gIHRhcmdldCAgICAgZWxlbWVudCAtIHRoZSB0YXJnZXQgaW5wdXQgZmllbGQgb3IgZGl2aXNpb24gb3Igc3BhbgoJICAgQHBhcmFtICBub0RlZmF1bHQgIGJvb2xlYW4gLSB0cnVlIGlmIG5vIGRlZmF1bHQgZGF0ZSBpcyB0byBiZSB1c2VkCgkgICBAcmV0dXJuIERhdGUgLSB0aGUgY3VycmVudCBkYXRlICovCglfZ2V0RGF0ZURhdGVwaWNrZXI6IGZ1bmN0aW9uKHRhcmdldCwgbm9EZWZhdWx0KSB7CgkJdmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldCk7CgkJaWYgKGluc3QgJiYgIWluc3QuaW5saW5lKQoJCQl0aGlzLl9zZXREYXRlRnJvbUZpZWxkKGluc3QsIG5vRGVmYXVsdCk7CgkJcmV0dXJuIChpbnN0ID8gdGhpcy5fZ2V0RGF0ZShpbnN0KSA6IG51bGwpOwoJfSwKCgkvKiBIYW5kbGUga2V5c3Ryb2tlcy4gKi8KCV9kb0tleURvd246IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIGluc3QgPSAkLmRhdGVwaWNrZXIuX2dldEluc3QoZXZlbnQudGFyZ2V0KTsKCQl2YXIgaGFuZGxlZCA9IHRydWU7CgkJdmFyIGlzUlRMID0gaW5zdC5kcERpdi5pcygnLnVpLWRhdGVwaWNrZXItcnRsJyk7CgkJaW5zdC5fa2V5RXZlbnQgPSB0cnVlOwoJCWlmICgkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nKQoJCQlzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHsKCQkJCWNhc2UgOTogJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpOwoJCQkJCQloYW5kbGVkID0gZmFsc2U7CgkJCQkJCWJyZWFrOyAvLyBoaWRlIG9uIHRhYiBvdXQKCQkJCWNhc2UgMTM6IHZhciBzZWwgPSAkKCd0ZC4nICsgJC5kYXRlcGlja2VyLl9kYXlPdmVyQ2xhc3MgKyAnOm5vdCguJyArCgkJCQkJCQkJCSQuZGF0ZXBpY2tlci5fY3VycmVudENsYXNzICsgJyknLCBpbnN0LmRwRGl2KTsKCQkJCQkJaWYgKHNlbFswXSkKCQkJCQkJCSQuZGF0ZXBpY2tlci5fc2VsZWN0RGF5KGV2ZW50LnRhcmdldCwgaW5zdC5zZWxlY3RlZE1vbnRoLCBpbnN0LnNlbGVjdGVkWWVhciwgc2VsWzBdKTsKCQkJCQkJCXZhciBvblNlbGVjdCA9ICQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICdvblNlbGVjdCcpOwoJCQkJCQkJaWYgKG9uU2VsZWN0KSB7CgkJCQkJCQkJdmFyIGRhdGVTdHIgPSAkLmRhdGVwaWNrZXIuX2Zvcm1hdERhdGUoaW5zdCk7CgoJCQkJCQkJCS8vIHRyaWdnZXIgY3VzdG9tIGNhbGxiYWNrCgkJCQkJCQkJb25TZWxlY3QuYXBwbHkoKGluc3QuaW5wdXQgPyBpbnN0LmlucHV0WzBdIDogbnVsbCksIFtkYXRlU3RyLCBpbnN0XSk7CgkJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJCSQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTsKCQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBkb24ndCBzdWJtaXQgdGhlIGZvcm0KCQkJCQkJYnJlYWs7IC8vIHNlbGVjdCB0aGUgdmFsdWUgb24gZW50ZXIKCQkJCWNhc2UgMjc6ICQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTsKCQkJCQkJYnJlYWs7IC8vIGhpZGUgb24gZXNjYXBlCgkJCQljYXNlIDMzOiAkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZXZlbnQudGFyZ2V0LCAoZXZlbnQuY3RybEtleSA/CgkJCQkJCQktJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgJ3N0ZXBCaWdNb250aHMnKSA6CgkJCQkJCQktJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgJ3N0ZXBNb250aHMnKSksICdNJyk7CgkJCQkJCWJyZWFrOyAvLyBwcmV2aW91cyBtb250aC95ZWFyIG9uIHBhZ2UgdXAvKyBjdHJsCgkJCQljYXNlIDM0OiAkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZXZlbnQudGFyZ2V0LCAoZXZlbnQuY3RybEtleSA/CgkJCQkJCQkrJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgJ3N0ZXBCaWdNb250aHMnKSA6CgkJCQkJCQkrJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgJ3N0ZXBNb250aHMnKSksICdNJyk7CgkJCQkJCWJyZWFrOyAvLyBuZXh0IG1vbnRoL3llYXIgb24gcGFnZSBkb3duLysgY3RybAoJCQkJY2FzZSAzNTogaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJC5kYXRlcGlja2VyLl9jbGVhckRhdGUoZXZlbnQudGFyZ2V0KTsKCQkJCQkJaGFuZGxlZCA9IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleTsKCQkJCQkJYnJlYWs7IC8vIGNsZWFyIG9uIGN0cmwgb3IgY29tbWFuZCArZW5kCgkJCQljYXNlIDM2OiBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAkLmRhdGVwaWNrZXIuX2dvdG9Ub2RheShldmVudC50YXJnZXQpOwoJCQkJCQloYW5kbGVkID0gZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5OwoJCQkJCQlicmVhazsgLy8gY3VycmVudCBvbiBjdHJsIG9yIGNvbW1hbmQgK2hvbWUKCQkJCWNhc2UgMzc6IGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsIChpc1JUTCA/ICsxIDogLTEpLCAnRCcpOwoJCQkJCQloYW5kbGVkID0gZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5OwoJCQkJCQkvLyAtMSBkYXkgb24gY3RybCBvciBjb21tYW5kICtsZWZ0CgkJCQkJCWlmIChldmVudC5vcmlnaW5hbEV2ZW50LmFsdEtleSkgJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGV2ZW50LnRhcmdldCwgKGV2ZW50LmN0cmxLZXkgPwoJCQkJCQkJCQktJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgJ3N0ZXBCaWdNb250aHMnKSA6CgkJCQkJCQkJCS0kLmRhdGVwaWNrZXIuX2dldChpbnN0LCAnc3RlcE1vbnRocycpKSwgJ00nKTsKCQkJCQkJLy8gbmV4dCBtb250aC95ZWFyIG9uIGFsdCArbGVmdCBvbiBNYWMKCQkJCQkJYnJlYWs7CgkJCQljYXNlIDM4OiBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZXZlbnQudGFyZ2V0LCAtNywgJ0QnKTsKCQkJCQkJaGFuZGxlZCA9IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleTsKCQkJCQkJYnJlYWs7IC8vIC0xIHdlZWsgb24gY3RybCBvciBjb21tYW5kICt1cAoJCQkJY2FzZSAzOTogaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGV2ZW50LnRhcmdldCwgKGlzUlRMID8gLTEgOiArMSksICdEJyk7CgkJCQkJCWhhbmRsZWQgPSBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXk7CgkJCQkJCS8vICsxIGRheSBvbiBjdHJsIG9yIGNvbW1hbmQgK3JpZ2h0CgkJCQkJCWlmIChldmVudC5vcmlnaW5hbEV2ZW50LmFsdEtleSkgJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGV2ZW50LnRhcmdldCwgKGV2ZW50LmN0cmxLZXkgPwoJCQkJCQkJCQkrJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgJ3N0ZXBCaWdNb250aHMnKSA6CgkJCQkJCQkJCSskLmRhdGVwaWNrZXIuX2dldChpbnN0LCAnc3RlcE1vbnRocycpKSwgJ00nKTsKCQkJCQkJLy8gbmV4dCBtb250aC95ZWFyIG9uIGFsdCArcmlnaHQKCQkJCQkJYnJlYWs7CgkJCQljYXNlIDQwOiBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZXZlbnQudGFyZ2V0LCArNywgJ0QnKTsKCQkJCQkJaGFuZGxlZCA9IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleTsKCQkJCQkJYnJlYWs7IC8vICsxIHdlZWsgb24gY3RybCBvciBjb21tYW5kICtkb3duCgkJCQlkZWZhdWx0OiBoYW5kbGVkID0gZmFsc2U7CgkJCX0KCQllbHNlIGlmIChldmVudC5rZXlDb2RlID09IDM2ICYmIGV2ZW50LmN0cmxLZXkpIC8vIGRpc3BsYXkgdGhlIGRhdGUgcGlja2VyIG9uIGN0cmwraG9tZQoJCQkkLmRhdGVwaWNrZXIuX3Nob3dEYXRlcGlja2VyKHRoaXMpOwoJCWVsc2UgewoJCQloYW5kbGVkID0gZmFsc2U7CgkJfQoJCWlmIChoYW5kbGVkKSB7CgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoJCX0KCX0sCgoJLyogRmlsdGVyIGVudGVyZWQgY2hhcmFjdGVycyAtIGJhc2VkIG9uIGRhdGUgZm9ybWF0LiAqLwoJX2RvS2V5UHJlc3M6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIGluc3QgPSAkLmRhdGVwaWNrZXIuX2dldEluc3QoZXZlbnQudGFyZ2V0KTsKCQlpZiAoJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgJ2NvbnN0cmFpbklucHV0JykpIHsKCQkJdmFyIGNoYXJzID0gJC5kYXRlcGlja2VyLl9wb3NzaWJsZUNoYXJzKCQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICdkYXRlRm9ybWF0JykpOwoJCQl2YXIgY2hyID0gU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5jaGFyQ29kZSA9PSB1bmRlZmluZWQgPyBldmVudC5rZXlDb2RlIDogZXZlbnQuY2hhckNvZGUpOwoJCQlyZXR1cm4gZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IChjaHIgPCAnICcgfHwgIWNoYXJzIHx8IGNoYXJzLmluZGV4T2YoY2hyKSA+IC0xKTsKCQl9Cgl9LAoKCS8qIFN5bmNocm9uaXNlIG1hbnVhbCBlbnRyeSBhbmQgZmllbGQvYWx0ZXJuYXRlIGZpZWxkLiAqLwoJX2RvS2V5VXA6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIGluc3QgPSAkLmRhdGVwaWNrZXIuX2dldEluc3QoZXZlbnQudGFyZ2V0KTsKCQlpZiAoaW5zdC5pbnB1dC52YWwoKSAhPSBpbnN0Lmxhc3RWYWwpIHsKCQkJdHJ5IHsKCQkJCXZhciBkYXRlID0gJC5kYXRlcGlja2VyLnBhcnNlRGF0ZSgkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAnZGF0ZUZvcm1hdCcpLAoJCQkJCShpbnN0LmlucHV0ID8gaW5zdC5pbnB1dC52YWwoKSA6IG51bGwpLAoJCQkJCSQuZGF0ZXBpY2tlci5fZ2V0Rm9ybWF0Q29uZmlnKGluc3QpKTsKCQkJCWlmIChkYXRlKSB7IC8vIG9ubHkgaWYgdmFsaWQKCQkJCQkkLmRhdGVwaWNrZXIuX3NldERhdGVGcm9tRmllbGQoaW5zdCk7CgkJCQkJJC5kYXRlcGlja2VyLl91cGRhdGVBbHRlcm5hdGUoaW5zdCk7CgkJCQkJJC5kYXRlcGlja2VyLl91cGRhdGVEYXRlcGlja2VyKGluc3QpOwoJCQkJfQoJCQl9CgkJCWNhdGNoIChlcnIpIHsKCQkJCSQuZGF0ZXBpY2tlci5sb2coZXJyKTsKCQkJfQoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0sCgoJLyogUG9wLXVwIHRoZSBkYXRlIHBpY2tlciBmb3IgYSBnaXZlbiBpbnB1dCBmaWVsZC4KCSAgIElmIGZhbHNlIHJldHVybmVkIGZyb20gYmVmb3JlU2hvdyBldmVudCBoYW5kbGVyIGRvIG5vdCBzaG93LgoJICAgQHBhcmFtICBpbnB1dCAgZWxlbWVudCAtIHRoZSBpbnB1dCBmaWVsZCBhdHRhY2hlZCB0byB0aGUgZGF0ZSBwaWNrZXIgb3IKCSAgICAgICAgICAgICAgICAgIGV2ZW50IC0gaWYgdHJpZ2dlcmVkIGJ5IGZvY3VzICovCglfc2hvd0RhdGVwaWNrZXI6IGZ1bmN0aW9uKGlucHV0KSB7CgkJaW5wdXQgPSBpbnB1dC50YXJnZXQgfHwgaW5wdXQ7CgkJaWYgKGlucHV0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2lucHV0JykgLy8gZmluZCBmcm9tIGJ1dHRvbi9pbWFnZSB0cmlnZ2VyCgkJCWlucHV0ID0gJCgnaW5wdXQnLCBpbnB1dC5wYXJlbnROb2RlKVswXTsKCQlpZiAoJC5kYXRlcGlja2VyLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcihpbnB1dCkgfHwgJC5kYXRlcGlja2VyLl9sYXN0SW5wdXQgPT0gaW5wdXQpIC8vIGFscmVhZHkgaGVyZQoJCQlyZXR1cm47CgkJdmFyIGluc3QgPSAkLmRhdGVwaWNrZXIuX2dldEluc3QoaW5wdXQpOwoJCWlmICgkLmRhdGVwaWNrZXIuX2N1ckluc3QgJiYgJC5kYXRlcGlja2VyLl9jdXJJbnN0ICE9IGluc3QpIHsKCQkJJC5kYXRlcGlja2VyLl9jdXJJbnN0LmRwRGl2LnN0b3AodHJ1ZSwgdHJ1ZSk7CgkJCWlmICggaW5zdCAmJiAkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nICkgewoJCQkJJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlciggJC5kYXRlcGlja2VyLl9jdXJJbnN0LmlucHV0WzBdICk7CgkJCX0KCQl9CgkJdmFyIGJlZm9yZVNob3cgPSAkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAnYmVmb3JlU2hvdycpOwoJCXZhciBiZWZvcmVTaG93U2V0dGluZ3MgPSBiZWZvcmVTaG93ID8gYmVmb3JlU2hvdy5hcHBseShpbnB1dCwgW2lucHV0LCBpbnN0XSkgOiB7fTsKCQlpZihiZWZvcmVTaG93U2V0dGluZ3MgPT09IGZhbHNlKXsKCQkJLy9mYWxzZQoJCQlyZXR1cm47CgkJfQoJCWV4dGVuZFJlbW92ZShpbnN0LnNldHRpbmdzLCBiZWZvcmVTaG93U2V0dGluZ3MpOwoJCWluc3QubGFzdFZhbCA9IG51bGw7CgkJJC5kYXRlcGlja2VyLl9sYXN0SW5wdXQgPSBpbnB1dDsKCQkkLmRhdGVwaWNrZXIuX3NldERhdGVGcm9tRmllbGQoaW5zdCk7CgkJaWYgKCQuZGF0ZXBpY2tlci5faW5EaWFsb2cpIC8vIGhpZGUgY3Vyc29yCgkJCWlucHV0LnZhbHVlID0gJyc7CgkJaWYgKCEkLmRhdGVwaWNrZXIuX3BvcykgeyAvLyBwb3NpdGlvbiBiZWxvdyBpbnB1dAoJCQkkLmRhdGVwaWNrZXIuX3BvcyA9ICQuZGF0ZXBpY2tlci5fZmluZFBvcyhpbnB1dCk7CgkJCSQuZGF0ZXBpY2tlci5fcG9zWzFdICs9IGlucHV0Lm9mZnNldEhlaWdodDsgLy8gYWRkIHRoZSBoZWlnaHQKCQl9CgkJdmFyIGlzRml4ZWQgPSBmYWxzZTsKCQkkKGlucHV0KS5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpIHsKCQkJaXNGaXhlZCB8PSAkKHRoaXMpLmNzcygncG9zaXRpb24nKSA9PSAnZml4ZWQnOwoJCQlyZXR1cm4gIWlzRml4ZWQ7CgkJfSk7CgkJdmFyIG9mZnNldCA9IHtsZWZ0OiAkLmRhdGVwaWNrZXIuX3Bvc1swXSwgdG9wOiAkLmRhdGVwaWNrZXIuX3Bvc1sxXX07CgkJJC5kYXRlcGlja2VyLl9wb3MgPSBudWxsOwoJCS8vdG8gYXZvaWQgZmxhc2hlcyBvbiBGaXJlZm94CgkJaW5zdC5kcERpdi5lbXB0eSgpOwoJCS8vIGRldGVybWluZSBzaXppbmcgb2Zmc2NyZWVuCgkJaW5zdC5kcERpdi5jc3Moe3Bvc2l0aW9uOiAnYWJzb2x1dGUnLCBkaXNwbGF5OiAnYmxvY2snLCB0b3A6ICctMTAwMHB4J30pOwoJCSQuZGF0ZXBpY2tlci5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTsKCQkvLyBmaXggd2lkdGggZm9yIGR5bmFtaWMgbnVtYmVyIG9mIGRhdGUgcGlja2VycwoJCS8vIGFuZCBhZGp1c3QgcG9zaXRpb24gYmVmb3JlIHNob3dpbmcKCQlvZmZzZXQgPSAkLmRhdGVwaWNrZXIuX2NoZWNrT2Zmc2V0KGluc3QsIG9mZnNldCwgaXNGaXhlZCk7CgkJaW5zdC5kcERpdi5jc3Moe3Bvc2l0aW9uOiAoJC5kYXRlcGlja2VyLl9pbkRpYWxvZyAmJiAkLmJsb2NrVUkgPwoJCQknc3RhdGljJyA6IChpc0ZpeGVkID8gJ2ZpeGVkJyA6ICdhYnNvbHV0ZScpKSwgZGlzcGxheTogJ25vbmUnLAoJCQlsZWZ0OiBvZmZzZXQubGVmdCArICdweCcsIHRvcDogb2Zmc2V0LnRvcCArICdweCd9KTsKCQlpZiAoIWluc3QuaW5saW5lKSB7CgkJCXZhciBzaG93QW5pbSA9ICQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICdzaG93QW5pbScpOwoJCQl2YXIgZHVyYXRpb24gPSAkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAnZHVyYXRpb24nKTsKCQkJdmFyIHBvc3RQcm9jZXNzID0gZnVuY3Rpb24oKSB7CgkJCQl2YXIgY292ZXIgPSBpbnN0LmRwRGl2LmZpbmQoJ2lmcmFtZS51aS1kYXRlcGlja2VyLWNvdmVyJyk7IC8vIElFNi0gb25seQoJCQkJaWYoICEhIGNvdmVyLmxlbmd0aCApewoJCQkJCXZhciBib3JkZXJzID0gJC5kYXRlcGlja2VyLl9nZXRCb3JkZXJzKGluc3QuZHBEaXYpOwoJCQkJCWNvdmVyLmNzcyh7bGVmdDogLWJvcmRlcnNbMF0sIHRvcDogLWJvcmRlcnNbMV0sCgkJCQkJCXdpZHRoOiBpbnN0LmRwRGl2Lm91dGVyV2lkdGgoKSwgaGVpZ2h0OiBpbnN0LmRwRGl2Lm91dGVySGVpZ2h0KCl9KTsKCQkJCX0KCQkJfTsKCQkJaW5zdC5kcERpdi56SW5kZXgoJChpbnB1dCkuekluZGV4KCkrMSk7CgkJCSQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcgPSB0cnVlOwoKCQkJLy8gREVQUkVDQVRFRDogYWZ0ZXIgQkMgZm9yIDEuOC54ICQuZWZmZWN0c1sgc2hvd0FuaW0gXSBpcyBub3QgbmVlZGVkCgkJCWlmICggJC5lZmZlY3RzICYmICggJC5lZmZlY3RzLmVmZmVjdFsgc2hvd0FuaW0gXSB8fCAkLmVmZmVjdHNbIHNob3dBbmltIF0gKSApCgkJCQlpbnN0LmRwRGl2LnNob3coc2hvd0FuaW0sICQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICdzaG93T3B0aW9ucycpLCBkdXJhdGlvbiwgcG9zdFByb2Nlc3MpOwoJCQllbHNlCgkJCQlpbnN0LmRwRGl2W3Nob3dBbmltIHx8ICdzaG93J10oKHNob3dBbmltID8gZHVyYXRpb24gOiBudWxsKSwgcG9zdFByb2Nlc3MpOwoJCQlpZiAoIXNob3dBbmltIHx8ICFkdXJhdGlvbikKCQkJCXBvc3RQcm9jZXNzKCk7CgkJCWlmIChpbnN0LmlucHV0LmlzKCc6dmlzaWJsZScpICYmICFpbnN0LmlucHV0LmlzKCc6ZGlzYWJsZWQnKSkKCQkJCWluc3QuaW5wdXQuZm9jdXMoKTsKCQkJJC5kYXRlcGlja2VyLl9jdXJJbnN0ID0gaW5zdDsKCQl9Cgl9LAoKCS8qIEdlbmVyYXRlIHRoZSBkYXRlIHBpY2tlciBjb250ZW50LiAqLwoJX3VwZGF0ZURhdGVwaWNrZXI6IGZ1bmN0aW9uKGluc3QpIHsKCQl0aGlzLm1heFJvd3MgPSA0OyAvL1Jlc2V0IHRoZSBtYXggbnVtYmVyIG9mIHJvd3MgYmVpbmcgZGlzcGxheWVkIChzZWUgIzcwNDMpCgkJdmFyIGJvcmRlcnMgPSAkLmRhdGVwaWNrZXIuX2dldEJvcmRlcnMoaW5zdC5kcERpdik7CgkJaW5zdEFjdGl2ZSA9IGluc3Q7IC8vIGZvciBkZWxlZ2F0ZSBob3ZlciBldmVudHMKCQlpbnN0LmRwRGl2LmVtcHR5KCkuYXBwZW5kKHRoaXMuX2dlbmVyYXRlSFRNTChpbnN0KSk7CgkJdGhpcy5fYXR0YWNoSGFuZGxlcnMoaW5zdCk7CgkJdmFyIGNvdmVyID0gaW5zdC5kcERpdi5maW5kKCdpZnJhbWUudWktZGF0ZXBpY2tlci1jb3ZlcicpOyAvLyBJRTYtIG9ubHkKCQlpZiggISFjb3Zlci5sZW5ndGggKXsgLy9hdm9pZCBjYWxsIHRvIG91dGVyWFhYWCgpIHdoZW4gbm90IGluIElFNgoJCQljb3Zlci5jc3Moe2xlZnQ6IC1ib3JkZXJzWzBdLCB0b3A6IC1ib3JkZXJzWzFdLCB3aWR0aDogaW5zdC5kcERpdi5vdXRlcldpZHRoKCksIGhlaWdodDogaW5zdC5kcERpdi5vdXRlckhlaWdodCgpfSkKCQl9CgkJaW5zdC5kcERpdi5maW5kKCcuJyArIHRoaXMuX2RheU92ZXJDbGFzcyArICcgYScpLm1vdXNlb3ZlcigpOwoJCXZhciBudW1Nb250aHMgPSB0aGlzLl9nZXROdW1iZXJPZk1vbnRocyhpbnN0KTsKCQl2YXIgY29scyA9IG51bU1vbnRoc1sxXTsKCQl2YXIgd2lkdGggPSAxNzsKCQlpbnN0LmRwRGl2LnJlbW92ZUNsYXNzKCd1aS1kYXRlcGlja2VyLW11bHRpLTIgdWktZGF0ZXBpY2tlci1tdWx0aS0zIHVpLWRhdGVwaWNrZXItbXVsdGktNCcpLndpZHRoKCcnKTsKCQlpZiAoY29scyA+IDEpCgkJCWluc3QuZHBEaXYuYWRkQ2xhc3MoJ3VpLWRhdGVwaWNrZXItbXVsdGktJyArIGNvbHMpLmNzcygnd2lkdGgnLCAod2lkdGggKiBjb2xzKSArICdlbScpOwoJCWluc3QuZHBEaXZbKG51bU1vbnRoc1swXSAhPSAxIHx8IG51bU1vbnRoc1sxXSAhPSAxID8gJ2FkZCcgOiAncmVtb3ZlJykgKwoJCQknQ2xhc3MnXSgndWktZGF0ZXBpY2tlci1tdWx0aScpOwoJCWluc3QuZHBEaXZbKHRoaXMuX2dldChpbnN0LCAnaXNSVEwnKSA/ICdhZGQnIDogJ3JlbW92ZScpICsKCQkJJ0NsYXNzJ10oJ3VpLWRhdGVwaWNrZXItcnRsJyk7CgkJaWYgKGluc3QgPT0gJC5kYXRlcGlja2VyLl9jdXJJbnN0ICYmICQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcgJiYgaW5zdC5pbnB1dCAmJgoJCQkJLy8gIzY2OTQgLSBkb24ndCBmb2N1cyB0aGUgaW5wdXQgaWYgaXQncyBhbHJlYWR5IGZvY3VzZWQKCQkJCS8vIHRoaXMgYnJlYWtzIHRoZSBjaGFuZ2UgZXZlbnQgaW4gSUUKCQkJCWluc3QuaW5wdXQuaXMoJzp2aXNpYmxlJykgJiYgIWluc3QuaW5wdXQuaXMoJzpkaXNhYmxlZCcpICYmIGluc3QuaW5wdXRbMF0gIT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkKCQkJaW5zdC5pbnB1dC5mb2N1cygpOwoJCS8vIGRlZmZlcmVkIHJlbmRlciBvZiB0aGUgeWVhcnMgc2VsZWN0ICh0byBhdm9pZCBmbGFzaGVzIG9uIEZpcmVmb3gpCgkJaWYoIGluc3QueWVhcnNodG1sICl7CgkJCXZhciBvcmlneWVhcnNodG1sID0gaW5zdC55ZWFyc2h0bWw7CgkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCQkJCS8vYXNzdXJlIHRoYXQgaW5zdC55ZWFyc2h0bWwgZGlkbid0IGNoYW5nZS4KCQkJCWlmKCBvcmlneWVhcnNodG1sID09PSBpbnN0LnllYXJzaHRtbCAmJiBpbnN0LnllYXJzaHRtbCApewoJCQkJCWluc3QuZHBEaXYuZmluZCgnc2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhcjpmaXJzdCcpLnJlcGxhY2VXaXRoKGluc3QueWVhcnNodG1sKTsKCQkJCX0KCQkJCW9yaWd5ZWFyc2h0bWwgPSBpbnN0LnllYXJzaHRtbCA9IG51bGw7CgkJCX0sIDApOwoJCX0KCX0sCgoJLyogUmV0cmlldmUgdGhlIHNpemUgb2YgbGVmdCBhbmQgdG9wIGJvcmRlcnMgZm9yIGFuIGVsZW1lbnQuCgkgICBAcGFyYW0gIGVsZW0gIChqUXVlcnkgb2JqZWN0KSB0aGUgZWxlbWVudCBvZiBpbnRlcmVzdAoJICAgQHJldHVybiAgKG51bWJlclsyXSkgdGhlIGxlZnQgYW5kIHRvcCBib3JkZXJzICovCglfZ2V0Qm9yZGVyczogZnVuY3Rpb24oZWxlbSkgewoJCXZhciBjb252ZXJ0ID0gZnVuY3Rpb24odmFsdWUpIHsKCQkJcmV0dXJuIHt0aGluOiAxLCBtZWRpdW06IDIsIHRoaWNrOiAzfVt2YWx1ZV0gfHwgdmFsdWU7CgkJfTsKCQlyZXR1cm4gW3BhcnNlRmxvYXQoY29udmVydChlbGVtLmNzcygnYm9yZGVyLWxlZnQtd2lkdGgnKSkpLAoJCQlwYXJzZUZsb2F0KGNvbnZlcnQoZWxlbS5jc3MoJ2JvcmRlci10b3Atd2lkdGgnKSkpXTsKCX0sCgoJLyogQ2hlY2sgcG9zaXRpb25pbmcgdG8gcmVtYWluIG9uIHNjcmVlbi4gKi8KCV9jaGVja09mZnNldDogZnVuY3Rpb24oaW5zdCwgb2Zmc2V0LCBpc0ZpeGVkKSB7CgkJdmFyIGRwV2lkdGggPSBpbnN0LmRwRGl2Lm91dGVyV2lkdGgoKTsKCQl2YXIgZHBIZWlnaHQgPSBpbnN0LmRwRGl2Lm91dGVySGVpZ2h0KCk7CgkJdmFyIGlucHV0V2lkdGggPSBpbnN0LmlucHV0ID8gaW5zdC5pbnB1dC5vdXRlcldpZHRoKCkgOiAwOwoJCXZhciBpbnB1dEhlaWdodCA9IGluc3QuaW5wdXQgPyBpbnN0LmlucHV0Lm91dGVySGVpZ2h0KCkgOiAwOwoJCXZhciB2aWV3V2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggKyAoaXNGaXhlZCA/IDAgOiAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkpOwoJCXZhciB2aWV3SGVpZ2h0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCArIChpc0ZpeGVkID8gMCA6ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpKTsKCgkJb2Zmc2V0LmxlZnQgLT0gKHRoaXMuX2dldChpbnN0LCAnaXNSVEwnKSA/IChkcFdpZHRoIC0gaW5wdXRXaWR0aCkgOiAwKTsKCQlvZmZzZXQubGVmdCAtPSAoaXNGaXhlZCAmJiBvZmZzZXQubGVmdCA9PSBpbnN0LmlucHV0Lm9mZnNldCgpLmxlZnQpID8gJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpIDogMDsKCQlvZmZzZXQudG9wIC09IChpc0ZpeGVkICYmIG9mZnNldC50b3AgPT0gKGluc3QuaW5wdXQub2Zmc2V0KCkudG9wICsgaW5wdXRIZWlnaHQpKSA/ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpIDogMDsKCgkJLy8gbm93IGNoZWNrIGlmIGRhdGVwaWNrZXIgaXMgc2hvd2luZyBvdXRzaWRlIHdpbmRvdyB2aWV3cG9ydCAtIG1vdmUgdG8gYSBiZXR0ZXIgcGxhY2UgaWYgc28uCgkJb2Zmc2V0LmxlZnQgLT0gTWF0aC5taW4ob2Zmc2V0LmxlZnQsIChvZmZzZXQubGVmdCArIGRwV2lkdGggPiB2aWV3V2lkdGggJiYgdmlld1dpZHRoID4gZHBXaWR0aCkgPwoJCQlNYXRoLmFicyhvZmZzZXQubGVmdCArIGRwV2lkdGggLSB2aWV3V2lkdGgpIDogMCk7CgkJb2Zmc2V0LnRvcCAtPSBNYXRoLm1pbihvZmZzZXQudG9wLCAob2Zmc2V0LnRvcCArIGRwSGVpZ2h0ID4gdmlld0hlaWdodCAmJiB2aWV3SGVpZ2h0ID4gZHBIZWlnaHQpID8KCQkJTWF0aC5hYnMoZHBIZWlnaHQgKyBpbnB1dEhlaWdodCkgOiAwKTsKCgkJcmV0dXJuIG9mZnNldDsKCX0sCgoJLyogRmluZCBhbiBvYmplY3QncyBwb3NpdGlvbiBvbiB0aGUgc2NyZWVuLiAqLwoJX2ZpbmRQb3M6IGZ1bmN0aW9uKG9iaikgewoJCXZhciBpbnN0ID0gdGhpcy5fZ2V0SW5zdChvYmopOwoJCXZhciBpc1JUTCA9IHRoaXMuX2dldChpbnN0LCAnaXNSVEwnKTsKCQl3aGlsZSAob2JqICYmIChvYmoudHlwZSA9PSAnaGlkZGVuJyB8fCBvYmoubm9kZVR5cGUgIT0gMSB8fCAkLmV4cHIuZmlsdGVycy5oaWRkZW4ob2JqKSkpIHsKCQkJb2JqID0gb2JqW2lzUlRMID8gJ3ByZXZpb3VzU2libGluZycgOiAnbmV4dFNpYmxpbmcnXTsKCQl9CgkJdmFyIHBvc2l0aW9uID0gJChvYmopLm9mZnNldCgpOwoJCXJldHVybiBbcG9zaXRpb24ubGVmdCwgcG9zaXRpb24udG9wXTsKCX0sCgoJLyogSGlkZSB0aGUgZGF0ZSBwaWNrZXIgZnJvbSB2aWV3LgoJICAgQHBhcmFtICBpbnB1dCAgZWxlbWVudCAtIHRoZSBpbnB1dCBmaWVsZCBhdHRhY2hlZCB0byB0aGUgZGF0ZSBwaWNrZXIgKi8KCV9oaWRlRGF0ZXBpY2tlcjogZnVuY3Rpb24oaW5wdXQpIHsKCQl2YXIgaW5zdCA9IHRoaXMuX2N1ckluc3Q7CgkJaWYgKCFpbnN0IHx8IChpbnB1dCAmJiBpbnN0ICE9ICQuZGF0YShpbnB1dCwgUFJPUF9OQU1FKSkpCgkJCXJldHVybjsKCQlpZiAodGhpcy5fZGF0ZXBpY2tlclNob3dpbmcpIHsKCQkJdmFyIHNob3dBbmltID0gdGhpcy5fZ2V0KGluc3QsICdzaG93QW5pbScpOwoJCQl2YXIgZHVyYXRpb24gPSB0aGlzLl9nZXQoaW5zdCwgJ2R1cmF0aW9uJyk7CgkJCXZhciBwb3N0UHJvY2VzcyA9IGZ1bmN0aW9uKCkgewoJCQkJJC5kYXRlcGlja2VyLl90aWR5RGlhbG9nKGluc3QpOwoJCQl9OwoKCQkJLy8gREVQUkVDQVRFRDogYWZ0ZXIgQkMgZm9yIDEuOC54ICQuZWZmZWN0c1sgc2hvd0FuaW0gXSBpcyBub3QgbmVlZGVkCgkJCWlmICggJC5lZmZlY3RzICYmICggJC5lZmZlY3RzLmVmZmVjdFsgc2hvd0FuaW0gXSB8fCAkLmVmZmVjdHNbIHNob3dBbmltIF0gKSApCgkJCQlpbnN0LmRwRGl2LmhpZGUoc2hvd0FuaW0sICQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICdzaG93T3B0aW9ucycpLCBkdXJhdGlvbiwgcG9zdFByb2Nlc3MpOwoJCQllbHNlCgkJCQlpbnN0LmRwRGl2WyhzaG93QW5pbSA9PSAnc2xpZGVEb3duJyA/ICdzbGlkZVVwJyA6CgkJCQkJKHNob3dBbmltID09ICdmYWRlSW4nID8gJ2ZhZGVPdXQnIDogJ2hpZGUnKSldKChzaG93QW5pbSA/IGR1cmF0aW9uIDogbnVsbCksIHBvc3RQcm9jZXNzKTsKCQkJaWYgKCFzaG93QW5pbSkKCQkJCXBvc3RQcm9jZXNzKCk7CgkJCXRoaXMuX2RhdGVwaWNrZXJTaG93aW5nID0gZmFsc2U7CgkJCXZhciBvbkNsb3NlID0gdGhpcy5fZ2V0KGluc3QsICdvbkNsb3NlJyk7CgkJCWlmIChvbkNsb3NlKQoJCQkJb25DbG9zZS5hcHBseSgoaW5zdC5pbnB1dCA/IGluc3QuaW5wdXRbMF0gOiBudWxsKSwKCQkJCQlbKGluc3QuaW5wdXQgPyBpbnN0LmlucHV0LnZhbCgpIDogJycpLCBpbnN0XSk7CgkJCXRoaXMuX2xhc3RJbnB1dCA9IG51bGw7CgkJCWlmICh0aGlzLl9pbkRpYWxvZykgewoJCQkJdGhpcy5fZGlhbG9nSW5wdXQuY3NzKHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIGxlZnQ6ICcwJywgdG9wOiAnLTEwMHB4JyB9KTsKCQkJCWlmICgkLmJsb2NrVUkpIHsKCQkJCQkkLnVuYmxvY2tVSSgpOwoJCQkJCSQoJ2JvZHknKS5hcHBlbmQodGhpcy5kcERpdik7CgkJCQl9CgkJCX0KCQkJdGhpcy5faW5EaWFsb2cgPSBmYWxzZTsKCQl9Cgl9LAoKCS8qIFRpZHkgdXAgYWZ0ZXIgYSBkaWFsb2cgZGlzcGxheS4gKi8KCV90aWR5RGlhbG9nOiBmdW5jdGlvbihpbnN0KSB7CgkJaW5zdC5kcERpdi5yZW1vdmVDbGFzcyh0aGlzLl9kaWFsb2dDbGFzcykudW5iaW5kKCcudWktZGF0ZXBpY2tlci1jYWxlbmRhcicpOwoJfSwKCgkvKiBDbG9zZSBkYXRlIHBpY2tlciBpZiBjbGlja2VkIGVsc2V3aGVyZS4gKi8KCV9jaGVja0V4dGVybmFsQ2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJaWYgKCEkLmRhdGVwaWNrZXIuX2N1ckluc3QpCgkJCXJldHVybjsKCgkJdmFyICR0YXJnZXQgPSAkKGV2ZW50LnRhcmdldCksCgkJCWluc3QgPSAkLmRhdGVwaWNrZXIuX2dldEluc3QoJHRhcmdldFswXSk7CgoJCWlmICggKCAoICR0YXJnZXRbMF0uaWQgIT0gJC5kYXRlcGlja2VyLl9tYWluRGl2SWQgJiYKCQkJCSR0YXJnZXQucGFyZW50cygnIycgKyAkLmRhdGVwaWNrZXIuX21haW5EaXZJZCkubGVuZ3RoID09IDAgJiYKCQkJCSEkdGFyZ2V0Lmhhc0NsYXNzKCQuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpICYmCgkJCQkhJHRhcmdldC5jbG9zZXN0KCIuIiArICQuZGF0ZXBpY2tlci5fdHJpZ2dlckNsYXNzKS5sZW5ndGggJiYKCQkJCSQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcgJiYgISgkLmRhdGVwaWNrZXIuX2luRGlhbG9nICYmICQuYmxvY2tVSSkgKSApIHx8CgkJCSggJHRhcmdldC5oYXNDbGFzcygkLmRhdGVwaWNrZXIubWFya2VyQ2xhc3NOYW1lKSAmJiAkLmRhdGVwaWNrZXIuX2N1ckluc3QgIT0gaW5zdCApICkKCQkJJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpOwoJfSwKCgkvKiBBZGp1c3Qgb25lIG9mIHRoZSBkYXRlIHN1Yi1maWVsZHMuICovCglfYWRqdXN0RGF0ZTogZnVuY3Rpb24oaWQsIG9mZnNldCwgcGVyaW9kKSB7CgkJdmFyIHRhcmdldCA9ICQoaWQpOwoJCXZhciBpbnN0ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXRbMF0pOwoJCWlmICh0aGlzLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcih0YXJnZXRbMF0pKSB7CgkJCXJldHVybjsKCQl9CgkJdGhpcy5fYWRqdXN0SW5zdERhdGUoaW5zdCwgb2Zmc2V0ICsKCQkJKHBlcmlvZCA9PSAnTScgPyB0aGlzLl9nZXQoaW5zdCwgJ3Nob3dDdXJyZW50QXRQb3MnKSA6IDApLCAvLyB1bmRvIHBvc2l0aW9uaW5nCgkJCXBlcmlvZCk7CgkJdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTsKCX0sCgoJLyogQWN0aW9uIGZvciBjdXJyZW50IGxpbmsuICovCglfZ290b1RvZGF5OiBmdW5jdGlvbihpZCkgewoJCXZhciB0YXJnZXQgPSAkKGlkKTsKCQl2YXIgaW5zdCA9IHRoaXMuX2dldEluc3QodGFyZ2V0WzBdKTsKCQlpZiAodGhpcy5fZ2V0KGluc3QsICdnb3RvQ3VycmVudCcpICYmIGluc3QuY3VycmVudERheSkgewoJCQlpbnN0LnNlbGVjdGVkRGF5ID0gaW5zdC5jdXJyZW50RGF5OwoJCQlpbnN0LmRyYXdNb250aCA9IGluc3Quc2VsZWN0ZWRNb250aCA9IGluc3QuY3VycmVudE1vbnRoOwoJCQlpbnN0LmRyYXdZZWFyID0gaW5zdC5zZWxlY3RlZFllYXIgPSBpbnN0LmN1cnJlbnRZZWFyOwoJCX0KCQllbHNlIHsKCQkJdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwoJCQlpbnN0LnNlbGVjdGVkRGF5ID0gZGF0ZS5nZXREYXRlKCk7CgkJCWluc3QuZHJhd01vbnRoID0gaW5zdC5zZWxlY3RlZE1vbnRoID0gZGF0ZS5nZXRNb250aCgpOwoJCQlpbnN0LmRyYXdZZWFyID0gaW5zdC5zZWxlY3RlZFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CgkJfQoJCXRoaXMuX25vdGlmeUNoYW5nZShpbnN0KTsKCQl0aGlzLl9hZGp1c3REYXRlKHRhcmdldCk7Cgl9LAoKCS8qIEFjdGlvbiBmb3Igc2VsZWN0aW5nIGEgbmV3IG1vbnRoL3llYXIuICovCglfc2VsZWN0TW9udGhZZWFyOiBmdW5jdGlvbihpZCwgc2VsZWN0LCBwZXJpb2QpIHsKCQl2YXIgdGFyZ2V0ID0gJChpZCk7CgkJdmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldFswXSk7CgkJaW5zdFsnc2VsZWN0ZWQnICsgKHBlcmlvZCA9PSAnTScgPyAnTW9udGgnIDogJ1llYXInKV0gPQoJCWluc3RbJ2RyYXcnICsgKHBlcmlvZCA9PSAnTScgPyAnTW9udGgnIDogJ1llYXInKV0gPQoJCQlwYXJzZUludChzZWxlY3Qub3B0aW9uc1tzZWxlY3Quc2VsZWN0ZWRJbmRleF0udmFsdWUsMTApOwoJCXRoaXMuX25vdGlmeUNoYW5nZShpbnN0KTsKCQl0aGlzLl9hZGp1c3REYXRlKHRhcmdldCk7Cgl9LAoKCS8qIEFjdGlvbiBmb3Igc2VsZWN0aW5nIGEgZGF5LiAqLwoJX3NlbGVjdERheTogZnVuY3Rpb24oaWQsIG1vbnRoLCB5ZWFyLCB0ZCkgewoJCXZhciB0YXJnZXQgPSAkKGlkKTsKCQlpZiAoJCh0ZCkuaGFzQ2xhc3ModGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3MpIHx8IHRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKHRhcmdldFswXSkpIHsKCQkJcmV0dXJuOwoJCX0KCQl2YXIgaW5zdCA9IHRoaXMuX2dldEluc3QodGFyZ2V0WzBdKTsKCQlpbnN0LnNlbGVjdGVkRGF5ID0gaW5zdC5jdXJyZW50RGF5ID0gJCgnYScsIHRkKS5odG1sKCk7CgkJaW5zdC5zZWxlY3RlZE1vbnRoID0gaW5zdC5jdXJyZW50TW9udGggPSBtb250aDsKCQlpbnN0LnNlbGVjdGVkWWVhciA9IGluc3QuY3VycmVudFllYXIgPSB5ZWFyOwoJCXRoaXMuX3NlbGVjdERhdGUoaWQsIHRoaXMuX2Zvcm1hdERhdGUoaW5zdCwKCQkJaW5zdC5jdXJyZW50RGF5LCBpbnN0LmN1cnJlbnRNb250aCwgaW5zdC5jdXJyZW50WWVhcikpOwoJfSwKCgkvKiBFcmFzZSB0aGUgaW5wdXQgZmllbGQgYW5kIGhpZGUgdGhlIGRhdGUgcGlja2VyLiAqLwoJX2NsZWFyRGF0ZTogZnVuY3Rpb24oaWQpIHsKCQl2YXIgdGFyZ2V0ID0gJChpZCk7CgkJdmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldFswXSk7CgkJdGhpcy5fc2VsZWN0RGF0ZSh0YXJnZXQsICcnKTsKCX0sCgoJLyogVXBkYXRlIHRoZSBpbnB1dCBmaWVsZCB3aXRoIHRoZSBzZWxlY3RlZCBkYXRlLiAqLwoJX3NlbGVjdERhdGU6IGZ1bmN0aW9uKGlkLCBkYXRlU3RyKSB7CgkJdmFyIHRhcmdldCA9ICQoaWQpOwoJCXZhciBpbnN0ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXRbMF0pOwoJCWRhdGVTdHIgPSAoZGF0ZVN0ciAhPSBudWxsID8gZGF0ZVN0ciA6IHRoaXMuX2Zvcm1hdERhdGUoaW5zdCkpOwoJCWlmIChpbnN0LmlucHV0KQoJCQlpbnN0LmlucHV0LnZhbChkYXRlU3RyKTsKCQl0aGlzLl91cGRhdGVBbHRlcm5hdGUoaW5zdCk7CgkJdmFyIG9uU2VsZWN0ID0gdGhpcy5fZ2V0KGluc3QsICdvblNlbGVjdCcpOwoJCWlmIChvblNlbGVjdCkKCQkJb25TZWxlY3QuYXBwbHkoKGluc3QuaW5wdXQgPyBpbnN0LmlucHV0WzBdIDogbnVsbCksIFtkYXRlU3RyLCBpbnN0XSk7ICAvLyB0cmlnZ2VyIGN1c3RvbSBjYWxsYmFjawoJCWVsc2UgaWYgKGluc3QuaW5wdXQpCgkJCWluc3QuaW5wdXQudHJpZ2dlcignY2hhbmdlJyk7IC8vIGZpcmUgdGhlIGNoYW5nZSBldmVudAoJCWlmIChpbnN0LmlubGluZSkKCQkJdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTsKCQllbHNlIHsKCQkJdGhpcy5faGlkZURhdGVwaWNrZXIoKTsKCQkJdGhpcy5fbGFzdElucHV0ID0gaW5zdC5pbnB1dFswXTsKCQkJaWYgKHR5cGVvZihpbnN0LmlucHV0WzBdKSAhPSAnb2JqZWN0JykKCQkJCWluc3QuaW5wdXQuZm9jdXMoKTsgLy8gcmVzdG9yZSBmb2N1cwoJCQl0aGlzLl9sYXN0SW5wdXQgPSBudWxsOwoJCX0KCX0sCgoJLyogVXBkYXRlIGFueSBhbHRlcm5hdGUgZmllbGQgdG8gc3luY2hyb25pc2Ugd2l0aCB0aGUgbWFpbiBmaWVsZC4gKi8KCV91cGRhdGVBbHRlcm5hdGU6IGZ1bmN0aW9uKGluc3QpIHsKCQl2YXIgYWx0RmllbGQgPSB0aGlzLl9nZXQoaW5zdCwgJ2FsdEZpZWxkJyk7CgkJaWYgKGFsdEZpZWxkKSB7IC8vIHVwZGF0ZSBhbHRlcm5hdGUgZmllbGQgdG9vCgkJCXZhciBhbHRGb3JtYXQgPSB0aGlzLl9nZXQoaW5zdCwgJ2FsdEZvcm1hdCcpIHx8IHRoaXMuX2dldChpbnN0LCAnZGF0ZUZvcm1hdCcpOwoJCQl2YXIgZGF0ZSA9IHRoaXMuX2dldERhdGUoaW5zdCk7CgkJCXZhciBkYXRlU3RyID0gdGhpcy5mb3JtYXREYXRlKGFsdEZvcm1hdCwgZGF0ZSwgdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGluc3QpKTsKCQkJJChhbHRGaWVsZCkuZWFjaChmdW5jdGlvbigpIHsgJCh0aGlzKS52YWwoZGF0ZVN0cik7IH0pOwoJCX0KCX0sCgoJLyogU2V0IGFzIGJlZm9yZVNob3dEYXkgZnVuY3Rpb24gdG8gcHJldmVudCBzZWxlY3Rpb24gb2Ygd2Vla2VuZHMuCgkgICBAcGFyYW0gIGRhdGUgIERhdGUgLSB0aGUgZGF0ZSB0byBjdXN0b21pc2UKCSAgIEByZXR1cm4gW2Jvb2xlYW4sIHN0cmluZ10gLSBpcyB0aGlzIGRhdGUgc2VsZWN0YWJsZT8sIHdoYXQgaXMgaXRzIENTUyBjbGFzcz8gKi8KCW5vV2Vla2VuZHM6IGZ1bmN0aW9uKGRhdGUpIHsKCQl2YXIgZGF5ID0gZGF0ZS5nZXREYXkoKTsKCQlyZXR1cm4gWyhkYXkgPiAwICYmIGRheSA8IDYpLCAnJ107Cgl9LAoKCS8qIFNldCBhcyBjYWxjdWxhdGVXZWVrIHRvIGRldGVybWluZSB0aGUgd2VlayBvZiB0aGUgeWVhciBiYXNlZCBvbiB0aGUgSVNPIDg2MDEgZGVmaW5pdGlvbi4KCSAgIEBwYXJhbSAgZGF0ZSAgRGF0ZSAtIHRoZSBkYXRlIHRvIGdldCB0aGUgd2VlayBmb3IKCSAgIEByZXR1cm4gIG51bWJlciAtIHRoZSBudW1iZXIgb2YgdGhlIHdlZWsgd2l0aGluIHRoZSB5ZWFyIHRoYXQgY29udGFpbnMgdGhpcyBkYXRlICovCglpc284NjAxV2VlazogZnVuY3Rpb24oZGF0ZSkgewoJCXZhciBjaGVja0RhdGUgPSBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSk7CgkJLy8gRmluZCBUaHVyc2RheSBvZiB0aGlzIHdlZWsgc3RhcnRpbmcgb24gTW9uZGF5CgkJY2hlY2tEYXRlLnNldERhdGUoY2hlY2tEYXRlLmdldERhdGUoKSArIDQgLSAoY2hlY2tEYXRlLmdldERheSgpIHx8IDcpKTsKCQl2YXIgdGltZSA9IGNoZWNrRGF0ZS5nZXRUaW1lKCk7CgkJY2hlY2tEYXRlLnNldE1vbnRoKDApOyAvLyBDb21wYXJlIHdpdGggSmFuIDEKCQljaGVja0RhdGUuc2V0RGF0ZSgxKTsKCQlyZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJvdW5kKCh0aW1lIC0gY2hlY2tEYXRlKSAvIDg2NDAwMDAwKSAvIDcpICsgMTsKCX0sCgoJLyogUGFyc2UgYSBzdHJpbmcgdmFsdWUgaW50byBhIGRhdGUgb2JqZWN0LgoJICAgU2VlIGZvcm1hdERhdGUgYmVsb3cgZm9yIHRoZSBwb3NzaWJsZSBmb3JtYXRzLgoKCSAgIEBwYXJhbSAgZm9ybWF0ICAgIHN0cmluZyAtIHRoZSBleHBlY3RlZCBmb3JtYXQgb2YgdGhlIGRhdGUKCSAgIEBwYXJhbSAgdmFsdWUgICAgIHN0cmluZyAtIHRoZSBkYXRlIGluIHRoZSBhYm92ZSBmb3JtYXQKCSAgIEBwYXJhbSAgc2V0dGluZ3MgIE9iamVjdCAtIGF0dHJpYnV0ZXMgaW5jbHVkZToKCSAgICAgICAgICAgICAgICAgICAgIHNob3J0WWVhckN1dG9mZiAgbnVtYmVyIC0gdGhlIGN1dG9mZiB5ZWFyIGZvciBkZXRlcm1pbmluZyB0aGUgY2VudHVyeSAob3B0aW9uYWwpCgkgICAgICAgICAgICAgICAgICAgICBkYXlOYW1lc1Nob3J0ICAgIHN0cmluZ1s3XSAtIGFiYnJldmlhdGVkIG5hbWVzIG9mIHRoZSBkYXlzIGZyb20gU3VuZGF5IChvcHRpb25hbCkKCSAgICAgICAgICAgICAgICAgICAgIGRheU5hbWVzICAgICAgICAgc3RyaW5nWzddIC0gbmFtZXMgb2YgdGhlIGRheXMgZnJvbSBTdW5kYXkgKG9wdGlvbmFsKQoJICAgICAgICAgICAgICAgICAgICAgbW9udGhOYW1lc1Nob3J0ICBzdHJpbmdbMTJdIC0gYWJicmV2aWF0ZWQgbmFtZXMgb2YgdGhlIG1vbnRocyAob3B0aW9uYWwpCgkgICAgICAgICAgICAgICAgICAgICBtb250aE5hbWVzICAgICAgIHN0cmluZ1sxMl0gLSBuYW1lcyBvZiB0aGUgbW9udGhzIChvcHRpb25hbCkKCSAgIEByZXR1cm4gIERhdGUgLSB0aGUgZXh0cmFjdGVkIGRhdGUgdmFsdWUgb3IgbnVsbCBpZiB2YWx1ZSBpcyBibGFuayAqLwoJcGFyc2VEYXRlOiBmdW5jdGlvbiAoZm9ybWF0LCB2YWx1ZSwgc2V0dGluZ3MpIHsKCQlpZiAoZm9ybWF0ID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkKCQkJdGhyb3cgJ0ludmFsaWQgYXJndW1lbnRzJzsKCQl2YWx1ZSA9ICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgPyB2YWx1ZS50b1N0cmluZygpIDogdmFsdWUgKyAnJyk7CgkJaWYgKHZhbHVlID09ICcnKQoJCQlyZXR1cm4gbnVsbDsKCQl2YXIgc2hvcnRZZWFyQ3V0b2ZmID0gKHNldHRpbmdzID8gc2V0dGluZ3Muc2hvcnRZZWFyQ3V0b2ZmIDogbnVsbCkgfHwgdGhpcy5fZGVmYXVsdHMuc2hvcnRZZWFyQ3V0b2ZmOwoJCXNob3J0WWVhckN1dG9mZiA9ICh0eXBlb2Ygc2hvcnRZZWFyQ3V0b2ZmICE9ICdzdHJpbmcnID8gc2hvcnRZZWFyQ3V0b2ZmIDoKCQkJCW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAlIDEwMCArIHBhcnNlSW50KHNob3J0WWVhckN1dG9mZiwgMTApKTsKCQl2YXIgZGF5TmFtZXNTaG9ydCA9IChzZXR0aW5ncyA/IHNldHRpbmdzLmRheU5hbWVzU2hvcnQgOiBudWxsKSB8fCB0aGlzLl9kZWZhdWx0cy5kYXlOYW1lc1Nob3J0OwoJCXZhciBkYXlOYW1lcyA9IChzZXR0aW5ncyA/IHNldHRpbmdzLmRheU5hbWVzIDogbnVsbCkgfHwgdGhpcy5fZGVmYXVsdHMuZGF5TmFtZXM7CgkJdmFyIG1vbnRoTmFtZXNTaG9ydCA9IChzZXR0aW5ncyA/IHNldHRpbmdzLm1vbnRoTmFtZXNTaG9ydCA6IG51bGwpIHx8IHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXNTaG9ydDsKCQl2YXIgbW9udGhOYW1lcyA9IChzZXR0aW5ncyA/IHNldHRpbmdzLm1vbnRoTmFtZXMgOiBudWxsKSB8fCB0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzOwoJCXZhciB5ZWFyID0gLTE7CgkJdmFyIG1vbnRoID0gLTE7CgkJdmFyIGRheSA9IC0xOwoJCXZhciBkb3kgPSAtMTsKCQl2YXIgbGl0ZXJhbCA9IGZhbHNlOwoJCS8vIENoZWNrIHdoZXRoZXIgYSBmb3JtYXQgY2hhcmFjdGVyIGlzIGRvdWJsZWQKCQl2YXIgbG9va0FoZWFkID0gZnVuY3Rpb24obWF0Y2gpIHsKCQkJdmFyIG1hdGNoZXMgPSAoaUZvcm1hdCArIDEgPCBmb3JtYXQubGVuZ3RoICYmIGZvcm1hdC5jaGFyQXQoaUZvcm1hdCArIDEpID09IG1hdGNoKTsKCQkJaWYgKG1hdGNoZXMpCgkJCQlpRm9ybWF0Kys7CgkJCXJldHVybiBtYXRjaGVzOwoJCX07CgkJLy8gRXh0cmFjdCBhIG51bWJlciBmcm9tIHRoZSBzdHJpbmcgdmFsdWUKCQl2YXIgZ2V0TnVtYmVyID0gZnVuY3Rpb24obWF0Y2gpIHsKCQkJdmFyIGlzRG91YmxlZCA9IGxvb2tBaGVhZChtYXRjaCk7CgkJCXZhciBzaXplID0gKG1hdGNoID09ICdAJyA/IDE0IDogKG1hdGNoID09ICchJyA/IDIwIDoKCQkJCShtYXRjaCA9PSAneScgJiYgaXNEb3VibGVkID8gNCA6IChtYXRjaCA9PSAnbycgPyAzIDogMikpKSk7CgkJCXZhciBkaWdpdHMgPSBuZXcgUmVnRXhwKCdeXFxkezEsJyArIHNpemUgKyAnfScpOwoJCQl2YXIgbnVtID0gdmFsdWUuc3Vic3RyaW5nKGlWYWx1ZSkubWF0Y2goZGlnaXRzKTsKCQkJaWYgKCFudW0pCgkJCQl0aHJvdyAnTWlzc2luZyBudW1iZXIgYXQgcG9zaXRpb24gJyArIGlWYWx1ZTsKCQkJaVZhbHVlICs9IG51bVswXS5sZW5ndGg7CgkJCXJldHVybiBwYXJzZUludChudW1bMF0sIDEwKTsKCQl9OwoJCS8vIEV4dHJhY3QgYSBuYW1lIGZyb20gdGhlIHN0cmluZyB2YWx1ZSBhbmQgY29udmVydCB0byBhbiBpbmRleAoJCXZhciBnZXROYW1lID0gZnVuY3Rpb24obWF0Y2gsIHNob3J0TmFtZXMsIGxvbmdOYW1lcykgewoJCQl2YXIgbmFtZXMgPSAkLm1hcChsb29rQWhlYWQobWF0Y2gpID8gbG9uZ05hbWVzIDogc2hvcnROYW1lcywgZnVuY3Rpb24gKHYsIGspIHsKCQkJCXJldHVybiBbIFtrLCB2XSBdOwoJCQl9KS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CgkJCQlyZXR1cm4gLShhWzFdLmxlbmd0aCAtIGJbMV0ubGVuZ3RoKTsKCQkJfSk7CgkJCXZhciBpbmRleCA9IC0xOwoJCQkkLmVhY2gobmFtZXMsIGZ1bmN0aW9uIChpLCBwYWlyKSB7CgkJCQl2YXIgbmFtZSA9IHBhaXJbMV07CgkJCQlpZiAodmFsdWUuc3Vic3RyKGlWYWx1ZSwgbmFtZS5sZW5ndGgpLnRvTG93ZXJDYXNlKCkgPT0gbmFtZS50b0xvd2VyQ2FzZSgpKSB7CgkJCQkJaW5kZXggPSBwYWlyWzBdOwoJCQkJCWlWYWx1ZSArPSBuYW1lLmxlbmd0aDsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0pOwoJCQlpZiAoaW5kZXggIT0gLTEpCgkJCQlyZXR1cm4gaW5kZXggKyAxOwoJCQllbHNlCgkJCQl0aHJvdyAnVW5rbm93biBuYW1lIGF0IHBvc2l0aW9uICcgKyBpVmFsdWU7CgkJfTsKCQkvLyBDb25maXJtIHRoYXQgYSBsaXRlcmFsIGNoYXJhY3RlciBtYXRjaGVzIHRoZSBzdHJpbmcgdmFsdWUKCQl2YXIgY2hlY2tMaXRlcmFsID0gZnVuY3Rpb24oKSB7CgkJCWlmICh2YWx1ZS5jaGFyQXQoaVZhbHVlKSAhPSBmb3JtYXQuY2hhckF0KGlGb3JtYXQpKQoJCQkJdGhyb3cgJ1VuZXhwZWN0ZWQgbGl0ZXJhbCBhdCBwb3NpdGlvbiAnICsgaVZhbHVlOwoJCQlpVmFsdWUrKzsKCQl9OwoJCXZhciBpVmFsdWUgPSAwOwoJCWZvciAodmFyIGlGb3JtYXQgPSAwOyBpRm9ybWF0IDwgZm9ybWF0Lmxlbmd0aDsgaUZvcm1hdCsrKSB7CgkJCWlmIChsaXRlcmFsKQoJCQkJaWYgKGZvcm1hdC5jaGFyQXQoaUZvcm1hdCkgPT0gIiciICYmICFsb29rQWhlYWQoIiciKSkKCQkJCQlsaXRlcmFsID0gZmFsc2U7CgkJCQllbHNlCgkJCQkJY2hlY2tMaXRlcmFsKCk7CgkJCWVsc2UKCQkJCXN3aXRjaCAoZm9ybWF0LmNoYXJBdChpRm9ybWF0KSkgewoJCQkJCWNhc2UgJ2QnOgoJCQkJCQlkYXkgPSBnZXROdW1iZXIoJ2QnKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnRCc6CgkJCQkJCWdldE5hbWUoJ0QnLCBkYXlOYW1lc1Nob3J0LCBkYXlOYW1lcyk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ28nOgoJCQkJCQlkb3kgPSBnZXROdW1iZXIoJ28nKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnbSc6CgkJCQkJCW1vbnRoID0gZ2V0TnVtYmVyKCdtJyk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ00nOgoJCQkJCQltb250aCA9IGdldE5hbWUoJ00nLCBtb250aE5hbWVzU2hvcnQsIG1vbnRoTmFtZXMpOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICd5JzoKCQkJCQkJeWVhciA9IGdldE51bWJlcigneScpOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdAJzoKCQkJCQkJdmFyIGRhdGUgPSBuZXcgRGF0ZShnZXROdW1iZXIoJ0AnKSk7CgkJCQkJCXllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CgkJCQkJCW1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMTsKCQkJCQkJZGF5ID0gZGF0ZS5nZXREYXRlKCk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJyEnOgoJCQkJCQl2YXIgZGF0ZSA9IG5ldyBEYXRlKChnZXROdW1iZXIoJyEnKSAtIHRoaXMuX3RpY2tzVG8xOTcwKSAvIDEwMDAwKTsKCQkJCQkJeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKCQkJCQkJbW9udGggPSBkYXRlLmdldE1vbnRoKCkgKyAxOwoJCQkJCQlkYXkgPSBkYXRlLmdldERhdGUoKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAiJyI6CgkJCQkJCWlmIChsb29rQWhlYWQoIiciKSkKCQkJCQkJCWNoZWNrTGl0ZXJhbCgpOwoJCQkJCQllbHNlCgkJCQkJCQlsaXRlcmFsID0gdHJ1ZTsKCQkJCQkJYnJlYWs7CgkJCQkJZGVmYXVsdDoKCQkJCQkJY2hlY2tMaXRlcmFsKCk7CgkJCQl9CgkJfQoJCWlmIChpVmFsdWUgPCB2YWx1ZS5sZW5ndGgpewoJCQl2YXIgZXh0cmEgPSB2YWx1ZS5zdWJzdHIoaVZhbHVlKTsKCQkJaWYgKCEvXlxzKy8udGVzdChleHRyYSkpIHsKCQkJCXRocm93ICJFeHRyYS91bnBhcnNlZCBjaGFyYWN0ZXJzIGZvdW5kIGluIGRhdGU6ICIgKyBleHRyYTsKCQkJfQoJCX0KCQlpZiAoeWVhciA9PSAtMSkKCQkJeWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTsKCQllbHNlIGlmICh5ZWFyIDwgMTAwKQoJCQl5ZWFyICs9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAtIG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAlIDEwMCArCgkJCQkoeWVhciA8PSBzaG9ydFllYXJDdXRvZmYgPyAwIDogLTEwMCk7CgkJaWYgKGRveSA+IC0xKSB7CgkJCW1vbnRoID0gMTsKCQkJZGF5ID0gZG95OwoJCQlkbyB7CgkJCQl2YXIgZGltID0gdGhpcy5fZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGggLSAxKTsKCQkJCWlmIChkYXkgPD0gZGltKQoJCQkJCWJyZWFrOwoJCQkJbW9udGgrKzsKCQkJCWRheSAtPSBkaW07CgkJCX0gd2hpbGUgKHRydWUpOwoJCX0KCQl2YXIgZGF0ZSA9IHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KSk7CgkJaWYgKGRhdGUuZ2V0RnVsbFllYXIoKSAhPSB5ZWFyIHx8IGRhdGUuZ2V0TW9udGgoKSArIDEgIT0gbW9udGggfHwgZGF0ZS5nZXREYXRlKCkgIT0gZGF5KQoJCQl0aHJvdyAnSW52YWxpZCBkYXRlJzsgLy8gRS5nLiAzMS8wMi8wMAoJCXJldHVybiBkYXRlOwoJfSwKCgkvKiBTdGFuZGFyZCBkYXRlIGZvcm1hdHMuICovCglBVE9NOiAneXktbW0tZGQnLCAvLyBSRkMgMzMzOSAoSVNPIDg2MDEpCglDT09LSUU6ICdELCBkZCBNIHl5JywKCUlTT184NjAxOiAneXktbW0tZGQnLAoJUkZDXzgyMjogJ0QsIGQgTSB5JywKCVJGQ184NTA6ICdERCwgZGQtTS15JywKCVJGQ18xMDM2OiAnRCwgZCBNIHknLAoJUkZDXzExMjM6ICdELCBkIE0geXknLAoJUkZDXzI4MjI6ICdELCBkIE0geXknLAoJUlNTOiAnRCwgZCBNIHknLCAvLyBSRkMgODIyCglUSUNLUzogJyEnLAoJVElNRVNUQU1QOiAnQCcsCglXM0M6ICd5eS1tbS1kZCcsIC8vIElTTyA4NjAxCgoJX3RpY2tzVG8xOTcwOiAoKCgxOTcwIC0gMSkgKiAzNjUgKyBNYXRoLmZsb29yKDE5NzAgLyA0KSAtIE1hdGguZmxvb3IoMTk3MCAvIDEwMCkgKwoJCU1hdGguZmxvb3IoMTk3MCAvIDQwMCkpICogMjQgKiA2MCAqIDYwICogMTAwMDAwMDApLAoKCS8qIEZvcm1hdCBhIGRhdGUgb2JqZWN0IGludG8gYSBzdHJpbmcgdmFsdWUuCgkgICBUaGUgZm9ybWF0IGNhbiBiZSBjb21iaW5hdGlvbnMgb2YgdGhlIGZvbGxvd2luZzoKCSAgIGQgIC0gZGF5IG9mIG1vbnRoIChubyBsZWFkaW5nIHplcm8pCgkgICBkZCAtIGRheSBvZiBtb250aCAodHdvIGRpZ2l0KQoJICAgbyAgLSBkYXkgb2YgeWVhciAobm8gbGVhZGluZyB6ZXJvcykKCSAgIG9vIC0gZGF5IG9mIHllYXIgKHRocmVlIGRpZ2l0KQoJICAgRCAgLSBkYXkgbmFtZSBzaG9ydAoJICAgREQgLSBkYXkgbmFtZSBsb25nCgkgICBtICAtIG1vbnRoIG9mIHllYXIgKG5vIGxlYWRpbmcgemVybykKCSAgIG1tIC0gbW9udGggb2YgeWVhciAodHdvIGRpZ2l0KQoJICAgTSAgLSBtb250aCBuYW1lIHNob3J0CgkgICBNTSAtIG1vbnRoIG5hbWUgbG9uZwoJICAgeSAgLSB5ZWFyICh0d28gZGlnaXQpCgkgICB5eSAtIHllYXIgKGZvdXIgZGlnaXQpCgkgICBAIC0gVW5peCB0aW1lc3RhbXAgKG1zIHNpbmNlIDAxLzAxLzE5NzApCgkgICAhIC0gV2luZG93cyB0aWNrcyAoMTAwbnMgc2luY2UgMDEvMDEvMDAwMSkKCSAgICcuLi4nIC0gbGl0ZXJhbCB0ZXh0CgkgICAnJyAtIHNpbmdsZSBxdW90ZQoKCSAgIEBwYXJhbSAgZm9ybWF0ICAgIHN0cmluZyAtIHRoZSBkZXNpcmVkIGZvcm1hdCBvZiB0aGUgZGF0ZQoJICAgQHBhcmFtICBkYXRlICAgICAgRGF0ZSAtIHRoZSBkYXRlIHZhbHVlIHRvIGZvcm1hdAoJICAgQHBhcmFtICBzZXR0aW5ncyAgT2JqZWN0IC0gYXR0cmlidXRlcyBpbmNsdWRlOgoJICAgICAgICAgICAgICAgICAgICAgZGF5TmFtZXNTaG9ydCAgICBzdHJpbmdbN10gLSBhYmJyZXZpYXRlZCBuYW1lcyBvZiB0aGUgZGF5cyBmcm9tIFN1bmRheSAob3B0aW9uYWwpCgkgICAgICAgICAgICAgICAgICAgICBkYXlOYW1lcyAgICAgICAgIHN0cmluZ1s3XSAtIG5hbWVzIG9mIHRoZSBkYXlzIGZyb20gU3VuZGF5IChvcHRpb25hbCkKCSAgICAgICAgICAgICAgICAgICAgIG1vbnRoTmFtZXNTaG9ydCAgc3RyaW5nWzEyXSAtIGFiYnJldmlhdGVkIG5hbWVzIG9mIHRoZSBtb250aHMgKG9wdGlvbmFsKQoJICAgICAgICAgICAgICAgICAgICAgbW9udGhOYW1lcyAgICAgICBzdHJpbmdbMTJdIC0gbmFtZXMgb2YgdGhlIG1vbnRocyAob3B0aW9uYWwpCgkgICBAcmV0dXJuICBzdHJpbmcgLSB0aGUgZGF0ZSBpbiB0aGUgYWJvdmUgZm9ybWF0ICovCglmb3JtYXREYXRlOiBmdW5jdGlvbiAoZm9ybWF0LCBkYXRlLCBzZXR0aW5ncykgewoJCWlmICghZGF0ZSkKCQkJcmV0dXJuICcnOwoJCXZhciBkYXlOYW1lc1Nob3J0ID0gKHNldHRpbmdzID8gc2V0dGluZ3MuZGF5TmFtZXNTaG9ydCA6IG51bGwpIHx8IHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzU2hvcnQ7CgkJdmFyIGRheU5hbWVzID0gKHNldHRpbmdzID8gc2V0dGluZ3MuZGF5TmFtZXMgOiBudWxsKSB8fCB0aGlzLl9kZWZhdWx0cy5kYXlOYW1lczsKCQl2YXIgbW9udGhOYW1lc1Nob3J0ID0gKHNldHRpbmdzID8gc2V0dGluZ3MubW9udGhOYW1lc1Nob3J0IDogbnVsbCkgfHwgdGhpcy5fZGVmYXVsdHMubW9udGhOYW1lc1Nob3J0OwoJCXZhciBtb250aE5hbWVzID0gKHNldHRpbmdzID8gc2V0dGluZ3MubW9udGhOYW1lcyA6IG51bGwpIHx8IHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXM7CgkJLy8gQ2hlY2sgd2hldGhlciBhIGZvcm1hdCBjaGFyYWN0ZXIgaXMgZG91YmxlZAoJCXZhciBsb29rQWhlYWQgPSBmdW5jdGlvbihtYXRjaCkgewoJCQl2YXIgbWF0Y2hlcyA9IChpRm9ybWF0ICsgMSA8IGZvcm1hdC5sZW5ndGggJiYgZm9ybWF0LmNoYXJBdChpRm9ybWF0ICsgMSkgPT0gbWF0Y2gpOwoJCQlpZiAobWF0Y2hlcykKCQkJCWlGb3JtYXQrKzsKCQkJcmV0dXJuIG1hdGNoZXM7CgkJfTsKCQkvLyBGb3JtYXQgYSBudW1iZXIsIHdpdGggbGVhZGluZyB6ZXJvIGlmIG5lY2Vzc2FyeQoJCXZhciBmb3JtYXROdW1iZXIgPSBmdW5jdGlvbihtYXRjaCwgdmFsdWUsIGxlbikgewoJCQl2YXIgbnVtID0gJycgKyB2YWx1ZTsKCQkJaWYgKGxvb2tBaGVhZChtYXRjaCkpCgkJCQl3aGlsZSAobnVtLmxlbmd0aCA8IGxlbikKCQkJCQludW0gPSAnMCcgKyBudW07CgkJCXJldHVybiBudW07CgkJfTsKCQkvLyBGb3JtYXQgYSBuYW1lLCBzaG9ydCBvciBsb25nIGFzIHJlcXVlc3RlZAoJCXZhciBmb3JtYXROYW1lID0gZnVuY3Rpb24obWF0Y2gsIHZhbHVlLCBzaG9ydE5hbWVzLCBsb25nTmFtZXMpIHsKCQkJcmV0dXJuIChsb29rQWhlYWQobWF0Y2gpID8gbG9uZ05hbWVzW3ZhbHVlXSA6IHNob3J0TmFtZXNbdmFsdWVdKTsKCQl9OwoJCXZhciBvdXRwdXQgPSAnJzsKCQl2YXIgbGl0ZXJhbCA9IGZhbHNlOwoJCWlmIChkYXRlKQoJCQlmb3IgKHZhciBpRm9ybWF0ID0gMDsgaUZvcm1hdCA8IGZvcm1hdC5sZW5ndGg7IGlGb3JtYXQrKykgewoJCQkJaWYgKGxpdGVyYWwpCgkJCQkJaWYgKGZvcm1hdC5jaGFyQXQoaUZvcm1hdCkgPT0gIiciICYmICFsb29rQWhlYWQoIiciKSkKCQkJCQkJbGl0ZXJhbCA9IGZhbHNlOwoJCQkJCWVsc2UKCQkJCQkJb3V0cHV0ICs9IGZvcm1hdC5jaGFyQXQoaUZvcm1hdCk7CgkJCQllbHNlCgkJCQkJc3dpdGNoIChmb3JtYXQuY2hhckF0KGlGb3JtYXQpKSB7CgkJCQkJCWNhc2UgJ2QnOgoJCQkJCQkJb3V0cHV0ICs9IGZvcm1hdE51bWJlcignZCcsIGRhdGUuZ2V0RGF0ZSgpLCAyKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdEJzoKCQkJCQkJCW91dHB1dCArPSBmb3JtYXROYW1lKCdEJywgZGF0ZS5nZXREYXkoKSwgZGF5TmFtZXNTaG9ydCwgZGF5TmFtZXMpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ28nOgoJCQkJCQkJb3V0cHV0ICs9IGZvcm1hdE51bWJlcignbycsCgkJCQkJCQkJTWF0aC5yb3VuZCgobmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIDAsIDApLmdldFRpbWUoKSkgLyA4NjQwMDAwMCksIDMpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ20nOgoJCQkJCQkJb3V0cHV0ICs9IGZvcm1hdE51bWJlcignbScsIGRhdGUuZ2V0TW9udGgoKSArIDEsIDIpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ00nOgoJCQkJCQkJb3V0cHV0ICs9IGZvcm1hdE5hbWUoJ00nLCBkYXRlLmdldE1vbnRoKCksIG1vbnRoTmFtZXNTaG9ydCwgbW9udGhOYW1lcyk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAneSc6CgkJCQkJCQlvdXRwdXQgKz0gKGxvb2tBaGVhZCgneScpID8gZGF0ZS5nZXRGdWxsWWVhcigpIDoKCQkJCQkJCQkoZGF0ZS5nZXRZZWFyKCkgJSAxMDAgPCAxMCA/ICcwJyA6ICcnKSArIGRhdGUuZ2V0WWVhcigpICUgMTAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdAJzoKCQkJCQkJCW91dHB1dCArPSBkYXRlLmdldFRpbWUoKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICchJzoKCQkJCQkJCW91dHB1dCArPSBkYXRlLmdldFRpbWUoKSAqIDEwMDAwICsgdGhpcy5fdGlja3NUbzE5NzA7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAiJyI6CgkJCQkJCQlpZiAobG9va0FoZWFkKCInIikpCgkJCQkJCQkJb3V0cHV0ICs9ICInIjsKCQkJCQkJCWVsc2UKCQkJCQkJCQlsaXRlcmFsID0gdHJ1ZTsKCQkJCQkJCWJyZWFrOwoJCQkJCQlkZWZhdWx0OgoJCQkJCQkJb3V0cHV0ICs9IGZvcm1hdC5jaGFyQXQoaUZvcm1hdCk7CgkJCQkJfQoJCQl9CgkJcmV0dXJuIG91dHB1dDsKCX0sCgoJLyogRXh0cmFjdCBhbGwgcG9zc2libGUgY2hhcmFjdGVycyBmcm9tIHRoZSBkYXRlIGZvcm1hdC4gKi8KCV9wb3NzaWJsZUNoYXJzOiBmdW5jdGlvbiAoZm9ybWF0KSB7CgkJdmFyIGNoYXJzID0gJyc7CgkJdmFyIGxpdGVyYWwgPSBmYWxzZTsKCQkvLyBDaGVjayB3aGV0aGVyIGEgZm9ybWF0IGNoYXJhY3RlciBpcyBkb3VibGVkCgkJdmFyIGxvb2tBaGVhZCA9IGZ1bmN0aW9uKG1hdGNoKSB7CgkJCXZhciBtYXRjaGVzID0gKGlGb3JtYXQgKyAxIDwgZm9ybWF0Lmxlbmd0aCAmJiBmb3JtYXQuY2hhckF0KGlGb3JtYXQgKyAxKSA9PSBtYXRjaCk7CgkJCWlmIChtYXRjaGVzKQoJCQkJaUZvcm1hdCsrOwoJCQlyZXR1cm4gbWF0Y2hlczsKCQl9OwoJCWZvciAodmFyIGlGb3JtYXQgPSAwOyBpRm9ybWF0IDwgZm9ybWF0Lmxlbmd0aDsgaUZvcm1hdCsrKQoJCQlpZiAobGl0ZXJhbCkKCQkJCWlmIChmb3JtYXQuY2hhckF0KGlGb3JtYXQpID09ICInIiAmJiAhbG9va0FoZWFkKCInIikpCgkJCQkJbGl0ZXJhbCA9IGZhbHNlOwoJCQkJZWxzZQoJCQkJCWNoYXJzICs9IGZvcm1hdC5jaGFyQXQoaUZvcm1hdCk7CgkJCWVsc2UKCQkJCXN3aXRjaCAoZm9ybWF0LmNoYXJBdChpRm9ybWF0KSkgewoJCQkJCWNhc2UgJ2QnOiBjYXNlICdtJzogY2FzZSAneSc6IGNhc2UgJ0AnOgoJCQkJCQljaGFycyArPSAnMDEyMzQ1Njc4OSc7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ0QnOiBjYXNlICdNJzoKCQkJCQkJcmV0dXJuIG51bGw7IC8vIEFjY2VwdCBhbnl0aGluZwoJCQkJCWNhc2UgIiciOgoJCQkJCQlpZiAobG9va0FoZWFkKCInIikpCgkJCQkJCQljaGFycyArPSAiJyI7CgkJCQkJCWVsc2UKCQkJCQkJCWxpdGVyYWwgPSB0cnVlOwoJCQkJCQlicmVhazsKCQkJCQlkZWZhdWx0OgoJCQkJCQljaGFycyArPSBmb3JtYXQuY2hhckF0KGlGb3JtYXQpOwoJCQkJfQoJCXJldHVybiBjaGFyczsKCX0sCgoJLyogR2V0IGEgc2V0dGluZyB2YWx1ZSwgZGVmYXVsdGluZyBpZiBuZWNlc3NhcnkuICovCglfZ2V0OiBmdW5jdGlvbihpbnN0LCBuYW1lKSB7CgkJcmV0dXJuIGluc3Quc2V0dGluZ3NbbmFtZV0gIT09IHVuZGVmaW5lZCA/CgkJCWluc3Quc2V0dGluZ3NbbmFtZV0gOiB0aGlzLl9kZWZhdWx0c1tuYW1lXTsKCX0sCgoJLyogUGFyc2UgZXhpc3RpbmcgZGF0ZSBhbmQgaW5pdGlhbGlzZSBkYXRlIHBpY2tlci4gKi8KCV9zZXREYXRlRnJvbUZpZWxkOiBmdW5jdGlvbihpbnN0LCBub0RlZmF1bHQpIHsKCQlpZiAoaW5zdC5pbnB1dC52YWwoKSA9PSBpbnN0Lmxhc3RWYWwpIHsKCQkJcmV0dXJuOwoJCX0KCQl2YXIgZGF0ZUZvcm1hdCA9IHRoaXMuX2dldChpbnN0LCAnZGF0ZUZvcm1hdCcpOwoJCXZhciBkYXRlcyA9IGluc3QubGFzdFZhbCA9IGluc3QuaW5wdXQgPyBpbnN0LmlucHV0LnZhbCgpIDogbnVsbDsKCQl2YXIgZGF0ZSwgZGVmYXVsdERhdGU7CgkJZGF0ZSA9IGRlZmF1bHREYXRlID0gdGhpcy5fZ2V0RGVmYXVsdERhdGUoaW5zdCk7CgkJdmFyIHNldHRpbmdzID0gdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGluc3QpOwoJCXRyeSB7CgkJCWRhdGUgPSB0aGlzLnBhcnNlRGF0ZShkYXRlRm9ybWF0LCBkYXRlcywgc2V0dGluZ3MpIHx8IGRlZmF1bHREYXRlOwoJCX0gY2F0Y2ggKGV2ZW50KSB7CgkJCXRoaXMubG9nKGV2ZW50KTsKCQkJZGF0ZXMgPSAobm9EZWZhdWx0ID8gJycgOiBkYXRlcyk7CgkJfQoJCWluc3Quc2VsZWN0ZWREYXkgPSBkYXRlLmdldERhdGUoKTsKCQlpbnN0LmRyYXdNb250aCA9IGluc3Quc2VsZWN0ZWRNb250aCA9IGRhdGUuZ2V0TW9udGgoKTsKCQlpbnN0LmRyYXdZZWFyID0gaW5zdC5zZWxlY3RlZFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CgkJaW5zdC5jdXJyZW50RGF5ID0gKGRhdGVzID8gZGF0ZS5nZXREYXRlKCkgOiAwKTsKCQlpbnN0LmN1cnJlbnRNb250aCA9IChkYXRlcyA/IGRhdGUuZ2V0TW9udGgoKSA6IDApOwoJCWluc3QuY3VycmVudFllYXIgPSAoZGF0ZXMgPyBkYXRlLmdldEZ1bGxZZWFyKCkgOiAwKTsKCQl0aGlzLl9hZGp1c3RJbnN0RGF0ZShpbnN0KTsKCX0sCgoJLyogUmV0cmlldmUgdGhlIGRlZmF1bHQgZGF0ZSBzaG93biBvbiBvcGVuaW5nLiAqLwoJX2dldERlZmF1bHREYXRlOiBmdW5jdGlvbihpbnN0KSB7CgkJcmV0dXJuIHRoaXMuX3Jlc3RyaWN0TWluTWF4KGluc3QsCgkJCXRoaXMuX2RldGVybWluZURhdGUoaW5zdCwgdGhpcy5fZ2V0KGluc3QsICdkZWZhdWx0RGF0ZScpLCBuZXcgRGF0ZSgpKSk7Cgl9LAoKCS8qIEEgZGF0ZSBtYXkgYmUgc3BlY2lmaWVkIGFzIGFuIGV4YWN0IHZhbHVlIG9yIGEgcmVsYXRpdmUgb25lLiAqLwoJX2RldGVybWluZURhdGU6IGZ1bmN0aW9uKGluc3QsIGRhdGUsIGRlZmF1bHREYXRlKSB7CgkJdmFyIG9mZnNldE51bWVyaWMgPSBmdW5jdGlvbihvZmZzZXQpIHsKCQkJdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwoJCQlkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBvZmZzZXQpOwoJCQlyZXR1cm4gZGF0ZTsKCQl9OwoJCXZhciBvZmZzZXRTdHJpbmcgPSBmdW5jdGlvbihvZmZzZXQpIHsKCQkJdHJ5IHsKCQkJCXJldHVybiAkLmRhdGVwaWNrZXIucGFyc2VEYXRlKCQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICdkYXRlRm9ybWF0JyksCgkJCQkJb2Zmc2V0LCAkLmRhdGVwaWNrZXIuX2dldEZvcm1hdENvbmZpZyhpbnN0KSk7CgkJCX0KCQkJY2F0Y2ggKGUpIHsKCQkJCS8vIElnbm9yZQoJCQl9CgkJCXZhciBkYXRlID0gKG9mZnNldC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9eYy8pID8KCQkJCSQuZGF0ZXBpY2tlci5fZ2V0RGF0ZShpbnN0KSA6IG51bGwpIHx8IG5ldyBEYXRlKCk7CgkJCXZhciB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpOwoJCQl2YXIgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7CgkJCXZhciBkYXkgPSBkYXRlLmdldERhdGUoKTsKCQkJdmFyIHBhdHRlcm4gPSAvKFsrLV0/WzAtOV0rKVxzKihkfER8d3xXfG18TXx5fFkpPy9nOwoJCQl2YXIgbWF0Y2hlcyA9IHBhdHRlcm4uZXhlYyhvZmZzZXQpOwoJCQl3aGlsZSAobWF0Y2hlcykgewoJCQkJc3dpdGNoIChtYXRjaGVzWzJdIHx8ICdkJykgewoJCQkJCWNhc2UgJ2QnIDogY2FzZSAnRCcgOgoJCQkJCQlkYXkgKz0gcGFyc2VJbnQobWF0Y2hlc1sxXSwxMCk7IGJyZWFrOwoJCQkJCWNhc2UgJ3cnIDogY2FzZSAnVycgOgoJCQkJCQlkYXkgKz0gcGFyc2VJbnQobWF0Y2hlc1sxXSwxMCkgKiA3OyBicmVhazsKCQkJCQljYXNlICdtJyA6IGNhc2UgJ00nIDoKCQkJCQkJbW9udGggKz0gcGFyc2VJbnQobWF0Y2hlc1sxXSwxMCk7CgkJCQkJCWRheSA9IE1hdGgubWluKGRheSwgJC5kYXRlcGlja2VyLl9nZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCkpOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICd5JzogY2FzZSAnWScgOgoJCQkJCQl5ZWFyICs9IHBhcnNlSW50KG1hdGNoZXNbMV0sMTApOwoJCQkJCQlkYXkgPSBNYXRoLm1pbihkYXksICQuZGF0ZXBpY2tlci5fZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpKTsKCQkJCQkJYnJlYWs7CgkJCQl9CgkJCQltYXRjaGVzID0gcGF0dGVybi5leGVjKG9mZnNldCk7CgkJCX0KCQkJcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXkpOwoJCX07CgkJdmFyIG5ld0RhdGUgPSAoZGF0ZSA9PSBudWxsIHx8IGRhdGUgPT09ICcnID8gZGVmYXVsdERhdGUgOiAodHlwZW9mIGRhdGUgPT0gJ3N0cmluZycgPyBvZmZzZXRTdHJpbmcoZGF0ZSkgOgoJCQkodHlwZW9mIGRhdGUgPT0gJ251bWJlcicgPyAoaXNOYU4oZGF0ZSkgPyBkZWZhdWx0RGF0ZSA6IG9mZnNldE51bWVyaWMoZGF0ZSkpIDogbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpKSkpOwoJCW5ld0RhdGUgPSAobmV3RGF0ZSAmJiBuZXdEYXRlLnRvU3RyaW5nKCkgPT0gJ0ludmFsaWQgRGF0ZScgPyBkZWZhdWx0RGF0ZSA6IG5ld0RhdGUpOwoJCWlmIChuZXdEYXRlKSB7CgkJCW5ld0RhdGUuc2V0SG91cnMoMCk7CgkJCW5ld0RhdGUuc2V0TWludXRlcygwKTsKCQkJbmV3RGF0ZS5zZXRTZWNvbmRzKDApOwoJCQluZXdEYXRlLnNldE1pbGxpc2Vjb25kcygwKTsKCQl9CgkJcmV0dXJuIHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ld0RhdGUpOwoJfSwKCgkvKiBIYW5kbGUgc3dpdGNoIHRvL2Zyb20gZGF5bGlnaHQgc2F2aW5nLgoJICAgSG91cnMgbWF5IGJlIG5vbi16ZXJvIG9uIGRheWxpZ2h0IHNhdmluZyBjdXQtb3ZlcjoKCSAgID4gMTIgd2hlbiBtaWRuaWdodCBjaGFuZ2VvdmVyLCBidXQgdGhlbiBjYW5ub3QgZ2VuZXJhdGUKCSAgIG1pZG5pZ2h0IGRhdGV0aW1lLCBzbyBqdW1wIHRvIDFBTSwgb3RoZXJ3aXNlIHJlc2V0LgoJICAgQHBhcmFtICBkYXRlICAoRGF0ZSkgdGhlIGRhdGUgdG8gY2hlY2sKCSAgIEByZXR1cm4gIChEYXRlKSB0aGUgY29ycmVjdGVkIGRhdGUgKi8KCV9kYXlsaWdodFNhdmluZ0FkanVzdDogZnVuY3Rpb24oZGF0ZSkgewoJCWlmICghZGF0ZSkgcmV0dXJuIG51bGw7CgkJZGF0ZS5zZXRIb3VycyhkYXRlLmdldEhvdXJzKCkgPiAxMiA/IGRhdGUuZ2V0SG91cnMoKSArIDIgOiAwKTsKCQlyZXR1cm4gZGF0ZTsKCX0sCgoJLyogU2V0IHRoZSBkYXRlKHMpIGRpcmVjdGx5LiAqLwoJX3NldERhdGU6IGZ1bmN0aW9uKGluc3QsIGRhdGUsIG5vQ2hhbmdlKSB7CgkJdmFyIGNsZWFyID0gIWRhdGU7CgkJdmFyIG9yaWdNb250aCA9IGluc3Quc2VsZWN0ZWRNb250aDsKCQl2YXIgb3JpZ1llYXIgPSBpbnN0LnNlbGVjdGVkWWVhcjsKCQl2YXIgbmV3RGF0ZSA9IHRoaXMuX3Jlc3RyaWN0TWluTWF4KGluc3QsIHRoaXMuX2RldGVybWluZURhdGUoaW5zdCwgZGF0ZSwgbmV3IERhdGUoKSkpOwoJCWluc3Quc2VsZWN0ZWREYXkgPSBpbnN0LmN1cnJlbnREYXkgPSBuZXdEYXRlLmdldERhdGUoKTsKCQlpbnN0LmRyYXdNb250aCA9IGluc3Quc2VsZWN0ZWRNb250aCA9IGluc3QuY3VycmVudE1vbnRoID0gbmV3RGF0ZS5nZXRNb250aCgpOwoJCWluc3QuZHJhd1llYXIgPSBpbnN0LnNlbGVjdGVkWWVhciA9IGluc3QuY3VycmVudFllYXIgPSBuZXdEYXRlLmdldEZ1bGxZZWFyKCk7CgkJaWYgKChvcmlnTW9udGggIT0gaW5zdC5zZWxlY3RlZE1vbnRoIHx8IG9yaWdZZWFyICE9IGluc3Quc2VsZWN0ZWRZZWFyKSAmJiAhbm9DaGFuZ2UpCgkJCXRoaXMuX25vdGlmeUNoYW5nZShpbnN0KTsKCQl0aGlzLl9hZGp1c3RJbnN0RGF0ZShpbnN0KTsKCQlpZiAoaW5zdC5pbnB1dCkgewoJCQlpbnN0LmlucHV0LnZhbChjbGVhciA/ICcnIDogdGhpcy5fZm9ybWF0RGF0ZShpbnN0KSk7CgkJfQoJfSwKCgkvKiBSZXRyaWV2ZSB0aGUgZGF0ZShzKSBkaXJlY3RseS4gKi8KCV9nZXREYXRlOiBmdW5jdGlvbihpbnN0KSB7CgkJdmFyIHN0YXJ0RGF0ZSA9ICghaW5zdC5jdXJyZW50WWVhciB8fCAoaW5zdC5pbnB1dCAmJiBpbnN0LmlucHV0LnZhbCgpID09ICcnKSA/IG51bGwgOgoJCQl0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSgKCQkJaW5zdC5jdXJyZW50WWVhciwgaW5zdC5jdXJyZW50TW9udGgsIGluc3QuY3VycmVudERheSkpKTsKCQkJcmV0dXJuIHN0YXJ0RGF0ZTsKCX0sCgoJLyogQXR0YWNoIHRoZSBvbnh4eCBoYW5kbGVycy4gIFRoZXNlIGFyZSBkZWNsYXJlZCBzdGF0aWNhbGx5IHNvCgkgKiB0aGV5IHdvcmsgd2l0aCBzdGF0aWMgY29kZSB0cmFuc2Zvcm1lcnMgbGlrZSBDYWphLgoJICovCglfYXR0YWNoSGFuZGxlcnM6IGZ1bmN0aW9uKGluc3QpIHsKCQl2YXIgc3RlcE1vbnRocyA9IHRoaXMuX2dldChpbnN0LCAnc3RlcE1vbnRocycpOwoJCXZhciBpZCA9ICcjJyArIGluc3QuaWQucmVwbGFjZSggL1xcXFwvZywgIlxcIiApOwoJCWluc3QuZHBEaXYuZmluZCgnW2RhdGEtaGFuZGxlcl0nKS5tYXAoZnVuY3Rpb24gKCkgewoJCQl2YXIgaGFuZGxlciA9IHsKCQkJCXByZXY6IGZ1bmN0aW9uICgpIHsKCQkJCQl3aW5kb3dbJ0RQX2pRdWVyeV8nICsgZHB1dWlkXS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGlkLCAtc3RlcE1vbnRocywgJ00nKTsKCQkJCX0sCgkJCQluZXh0OiBmdW5jdGlvbiAoKSB7CgkJCQkJd2luZG93WydEUF9qUXVlcnlfJyArIGRwdXVpZF0uZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShpZCwgK3N0ZXBNb250aHMsICdNJyk7CgkJCQl9LAoJCQkJaGlkZTogZnVuY3Rpb24gKCkgewoJCQkJCXdpbmRvd1snRFBfalF1ZXJ5XycgKyBkcHV1aWRdLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk7CgkJCQl9LAoJCQkJdG9kYXk6IGZ1bmN0aW9uICgpIHsKCQkJCQl3aW5kb3dbJ0RQX2pRdWVyeV8nICsgZHB1dWlkXS5kYXRlcGlja2VyLl9nb3RvVG9kYXkoaWQpOwoJCQkJfSwKCQkJCXNlbGVjdERheTogZnVuY3Rpb24gKCkgewoJCQkJCXdpbmRvd1snRFBfalF1ZXJ5XycgKyBkcHV1aWRdLmRhdGVwaWNrZXIuX3NlbGVjdERheShpZCwgK3RoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLW1vbnRoJyksICt0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS15ZWFyJyksIHRoaXMpOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0sCgkJCQlzZWxlY3RNb250aDogZnVuY3Rpb24gKCkgewoJCQkJCXdpbmRvd1snRFBfalF1ZXJ5XycgKyBkcHV1aWRdLmRhdGVwaWNrZXIuX3NlbGVjdE1vbnRoWWVhcihpZCwgdGhpcywgJ00nKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9LAoJCQkJc2VsZWN0WWVhcjogZnVuY3Rpb24gKCkgewoJCQkJCXdpbmRvd1snRFBfalF1ZXJ5XycgKyBkcHV1aWRdLmRhdGVwaWNrZXIuX3NlbGVjdE1vbnRoWWVhcihpZCwgdGhpcywgJ1knKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX07CgkJCSQodGhpcykuYmluZCh0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1ldmVudCcpLCBoYW5kbGVyW3RoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLWhhbmRsZXInKV0pOwoJCX0pOwoJfSwKCgkvKiBHZW5lcmF0ZSB0aGUgSFRNTCBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGRhdGUgcGlja2VyLiAqLwoJX2dlbmVyYXRlSFRNTDogZnVuY3Rpb24oaW5zdCkgewoJCXZhciB0b2RheSA9IG5ldyBEYXRlKCk7CgkJdG9kYXkgPSB0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdCgKCQkJbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSwgdG9kYXkuZ2V0RGF0ZSgpKSk7IC8vIGNsZWFyIHRpbWUKCQl2YXIgaXNSVEwgPSB0aGlzLl9nZXQoaW5zdCwgJ2lzUlRMJyk7CgkJdmFyIHNob3dCdXR0b25QYW5lbCA9IHRoaXMuX2dldChpbnN0LCAnc2hvd0J1dHRvblBhbmVsJyk7CgkJdmFyIGhpZGVJZk5vUHJldk5leHQgPSB0aGlzLl9nZXQoaW5zdCwgJ2hpZGVJZk5vUHJldk5leHQnKTsKCQl2YXIgbmF2aWdhdGlvbkFzRGF0ZUZvcm1hdCA9IHRoaXMuX2dldChpbnN0LCAnbmF2aWdhdGlvbkFzRGF0ZUZvcm1hdCcpOwoJCXZhciBudW1Nb250aHMgPSB0aGlzLl9nZXROdW1iZXJPZk1vbnRocyhpbnN0KTsKCQl2YXIgc2hvd0N1cnJlbnRBdFBvcyA9IHRoaXMuX2dldChpbnN0LCAnc2hvd0N1cnJlbnRBdFBvcycpOwoJCXZhciBzdGVwTW9udGhzID0gdGhpcy5fZ2V0KGluc3QsICdzdGVwTW9udGhzJyk7CgkJdmFyIGlzTXVsdGlNb250aCA9IChudW1Nb250aHNbMF0gIT0gMSB8fCBudW1Nb250aHNbMV0gIT0gMSk7CgkJdmFyIGN1cnJlbnREYXRlID0gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QoKCFpbnN0LmN1cnJlbnREYXkgPyBuZXcgRGF0ZSg5OTk5LCA5LCA5KSA6CgkJCW5ldyBEYXRlKGluc3QuY3VycmVudFllYXIsIGluc3QuY3VycmVudE1vbnRoLCBpbnN0LmN1cnJlbnREYXkpKSk7CgkJdmFyIG1pbkRhdGUgPSB0aGlzLl9nZXRNaW5NYXhEYXRlKGluc3QsICdtaW4nKTsKCQl2YXIgbWF4RGF0ZSA9IHRoaXMuX2dldE1pbk1heERhdGUoaW5zdCwgJ21heCcpOwoJCXZhciBkcmF3TW9udGggPSBpbnN0LmRyYXdNb250aCAtIHNob3dDdXJyZW50QXRQb3M7CgkJdmFyIGRyYXdZZWFyID0gaW5zdC5kcmF3WWVhcjsKCQlpZiAoZHJhd01vbnRoIDwgMCkgewoJCQlkcmF3TW9udGggKz0gMTI7CgkJCWRyYXdZZWFyLS07CgkJfQoJCWlmIChtYXhEYXRlKSB7CgkJCXZhciBtYXhEcmF3ID0gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUobWF4RGF0ZS5nZXRGdWxsWWVhcigpLAoJCQkJbWF4RGF0ZS5nZXRNb250aCgpIC0gKG51bU1vbnRoc1swXSAqIG51bU1vbnRoc1sxXSkgKyAxLCBtYXhEYXRlLmdldERhdGUoKSkpOwoJCQltYXhEcmF3ID0gKG1pbkRhdGUgJiYgbWF4RHJhdyA8IG1pbkRhdGUgPyBtaW5EYXRlIDogbWF4RHJhdyk7CgkJCXdoaWxlICh0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkcmF3WWVhciwgZHJhd01vbnRoLCAxKSkgPiBtYXhEcmF3KSB7CgkJCQlkcmF3TW9udGgtLTsKCQkJCWlmIChkcmF3TW9udGggPCAwKSB7CgkJCQkJZHJhd01vbnRoID0gMTE7CgkJCQkJZHJhd1llYXItLTsKCQkJCX0KCQkJfQoJCX0KCQlpbnN0LmRyYXdNb250aCA9IGRyYXdNb250aDsKCQlpbnN0LmRyYXdZZWFyID0gZHJhd1llYXI7CgkJdmFyIHByZXZUZXh0ID0gdGhpcy5fZ2V0KGluc3QsICdwcmV2VGV4dCcpOwoJCXByZXZUZXh0ID0gKCFuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0ID8gcHJldlRleHQgOiB0aGlzLmZvcm1hdERhdGUocHJldlRleHQsCgkJCXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGRyYXdZZWFyLCBkcmF3TW9udGggLSBzdGVwTW9udGhzLCAxKSksCgkJCXRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSkpOwoJCXZhciBwcmV2ID0gKHRoaXMuX2NhbkFkanVzdE1vbnRoKGluc3QsIC0xLCBkcmF3WWVhciwgZHJhd01vbnRoKSA/CgkJCSc8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1wcmV2IHVpLWNvcm5lci1hbGwiIGRhdGEtaGFuZGxlcj0icHJldiIgZGF0YS1ldmVudD0iY2xpY2siJyArCgkJCScgdGl0bGU9IicgKyBwcmV2VGV4dCArICciPjxzcGFuIGNsYXNzPSJ1aS1pY29uIHVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLScgKyAoIGlzUlRMID8gJ2UnIDogJ3cnKSArICciPicgKyBwcmV2VGV4dCArICc8L3NwYW4+PC9hPicgOgoJCQkoaGlkZUlmTm9QcmV2TmV4dCA/ICcnIDogJzxhIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXByZXYgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1kaXNhYmxlZCIgdGl0bGU9IicrIHByZXZUZXh0ICsnIj48c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0nICsgKCBpc1JUTCA/ICdlJyA6ICd3JykgKyAnIj4nICsgcHJldlRleHQgKyAnPC9zcGFuPjwvYT4nKSk7CgkJdmFyIG5leHRUZXh0ID0gdGhpcy5fZ2V0KGluc3QsICduZXh0VGV4dCcpOwoJCW5leHRUZXh0ID0gKCFuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0ID8gbmV4dFRleHQgOiB0aGlzLmZvcm1hdERhdGUobmV4dFRleHQsCgkJCXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGRyYXdZZWFyLCBkcmF3TW9udGggKyBzdGVwTW9udGhzLCAxKSksCgkJCXRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSkpOwoJCXZhciBuZXh0ID0gKHRoaXMuX2NhbkFkanVzdE1vbnRoKGluc3QsICsxLCBkcmF3WWVhciwgZHJhd01vbnRoKSA/CgkJCSc8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1hbGwiIGRhdGEtaGFuZGxlcj0ibmV4dCIgZGF0YS1ldmVudD0iY2xpY2siJyArCgkJCScgdGl0bGU9IicgKyBuZXh0VGV4dCArICciPjxzcGFuIGNsYXNzPSJ1aS1pY29uIHVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLScgKyAoIGlzUlRMID8gJ3cnIDogJ2UnKSArICciPicgKyBuZXh0VGV4dCArICc8L3NwYW4+PC9hPicgOgoJCQkoaGlkZUlmTm9QcmV2TmV4dCA/ICcnIDogJzxhIGNsYXNzPSJ1aS1kYXRlcGlja2VyLW5leHQgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1kaXNhYmxlZCIgdGl0bGU9IicrIG5leHRUZXh0ICsgJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJyArICggaXNSVEwgPyAndycgOiAnZScpICsgJyI+JyArIG5leHRUZXh0ICsgJzwvc3Bhbj48L2E+JykpOwoJCXZhciBjdXJyZW50VGV4dCA9IHRoaXMuX2dldChpbnN0LCAnY3VycmVudFRleHQnKTsKCQl2YXIgZ290b0RhdGUgPSAodGhpcy5fZ2V0KGluc3QsICdnb3RvQ3VycmVudCcpICYmIGluc3QuY3VycmVudERheSA/IGN1cnJlbnREYXRlIDogdG9kYXkpOwoJCWN1cnJlbnRUZXh0ID0gKCFuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0ID8gY3VycmVudFRleHQgOgoJCQl0aGlzLmZvcm1hdERhdGUoY3VycmVudFRleHQsIGdvdG9EYXRlLCB0aGlzLl9nZXRGb3JtYXRDb25maWcoaW5zdCkpKTsKCQl2YXIgY29udHJvbHMgPSAoIWluc3QuaW5saW5lID8gJzxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0idWktZGF0ZXBpY2tlci1jbG9zZSB1aS1zdGF0ZS1kZWZhdWx0IHVpLXByaW9yaXR5LXByaW1hcnkgdWktY29ybmVyLWFsbCIgZGF0YS1oYW5kbGVyPSJoaWRlIiBkYXRhLWV2ZW50PSJjbGljayI+JyArCgkJCXRoaXMuX2dldChpbnN0LCAnY2xvc2VUZXh0JykgKyAnPC9idXR0b24+JyA6ICcnKTsKCQl2YXIgYnV0dG9uUGFuZWwgPSAoc2hvd0J1dHRvblBhbmVsKSA/ICc8ZGl2IGNsYXNzPSJ1aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgdWktd2lkZ2V0LWNvbnRlbnQiPicgKyAoaXNSVEwgPyBjb250cm9scyA6ICcnKSArCgkJCSh0aGlzLl9pc0luUmFuZ2UoaW5zdCwgZ290b0RhdGUpID8gJzxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0idWktZGF0ZXBpY2tlci1jdXJyZW50IHVpLXN0YXRlLWRlZmF1bHQgdWktcHJpb3JpdHktc2Vjb25kYXJ5IHVpLWNvcm5lci1hbGwiIGRhdGEtaGFuZGxlcj0idG9kYXkiIGRhdGEtZXZlbnQ9ImNsaWNrIicgKwoJCQknPicgKyBjdXJyZW50VGV4dCArICc8L2J1dHRvbj4nIDogJycpICsgKGlzUlRMID8gJycgOiBjb250cm9scykgKyAnPC9kaXY+JyA6ICcnOwoJCXZhciBmaXJzdERheSA9IHBhcnNlSW50KHRoaXMuX2dldChpbnN0LCAnZmlyc3REYXknKSwxMCk7CgkJZmlyc3REYXkgPSAoaXNOYU4oZmlyc3REYXkpID8gMCA6IGZpcnN0RGF5KTsKCQl2YXIgc2hvd1dlZWsgPSB0aGlzLl9nZXQoaW5zdCwgJ3Nob3dXZWVrJyk7CgkJdmFyIGRheU5hbWVzID0gdGhpcy5fZ2V0KGluc3QsICdkYXlOYW1lcycpOwoJCXZhciBkYXlOYW1lc1Nob3J0ID0gdGhpcy5fZ2V0KGluc3QsICdkYXlOYW1lc1Nob3J0Jyk7CgkJdmFyIGRheU5hbWVzTWluID0gdGhpcy5fZ2V0KGluc3QsICdkYXlOYW1lc01pbicpOwoJCXZhciBtb250aE5hbWVzID0gdGhpcy5fZ2V0KGluc3QsICdtb250aE5hbWVzJyk7CgkJdmFyIG1vbnRoTmFtZXNTaG9ydCA9IHRoaXMuX2dldChpbnN0LCAnbW9udGhOYW1lc1Nob3J0Jyk7CgkJdmFyIGJlZm9yZVNob3dEYXkgPSB0aGlzLl9nZXQoaW5zdCwgJ2JlZm9yZVNob3dEYXknKTsKCQl2YXIgc2hvd090aGVyTW9udGhzID0gdGhpcy5fZ2V0KGluc3QsICdzaG93T3RoZXJNb250aHMnKTsKCQl2YXIgc2VsZWN0T3RoZXJNb250aHMgPSB0aGlzLl9nZXQoaW5zdCwgJ3NlbGVjdE90aGVyTW9udGhzJyk7CgkJdmFyIGNhbGN1bGF0ZVdlZWsgPSB0aGlzLl9nZXQoaW5zdCwgJ2NhbGN1bGF0ZVdlZWsnKSB8fCB0aGlzLmlzbzg2MDFXZWVrOwoJCXZhciBkZWZhdWx0RGF0ZSA9IHRoaXMuX2dldERlZmF1bHREYXRlKGluc3QpOwoJCXZhciBodG1sID0gJyc7CgkJZm9yICh2YXIgcm93ID0gMDsgcm93IDwgbnVtTW9udGhzWzBdOyByb3crKykgewoJCQl2YXIgZ3JvdXAgPSAnJzsKCQkJdGhpcy5tYXhSb3dzID0gNDsKCQkJZm9yICh2YXIgY29sID0gMDsgY29sIDwgbnVtTW9udGhzWzFdOyBjb2wrKykgewoJCQkJdmFyIHNlbGVjdGVkRGF0ZSA9IHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGRyYXdZZWFyLCBkcmF3TW9udGgsIGluc3Quc2VsZWN0ZWREYXkpKTsKCQkJCXZhciBjb3JuZXJDbGFzcyA9ICcgdWktY29ybmVyLWFsbCc7CgkJCQl2YXIgY2FsZW5kZXIgPSAnJzsKCQkJCWlmIChpc011bHRpTW9udGgpIHsKCQkJCQljYWxlbmRlciArPSAnPGRpdiBjbGFzcz0idWktZGF0ZXBpY2tlci1ncm91cCc7CgkJCQkJaWYgKG51bU1vbnRoc1sxXSA+IDEpCgkJCQkJCXN3aXRjaCAoY29sKSB7CgkJCQkJCQljYXNlIDA6IGNhbGVuZGVyICs9ICcgdWktZGF0ZXBpY2tlci1ncm91cC1maXJzdCc7CgkJCQkJCQkJY29ybmVyQ2xhc3MgPSAnIHVpLWNvcm5lci0nICsgKGlzUlRMID8gJ3JpZ2h0JyA6ICdsZWZ0Jyk7IGJyZWFrOwoJCQkJCQkJY2FzZSBudW1Nb250aHNbMV0tMTogY2FsZW5kZXIgKz0gJyB1aS1kYXRlcGlja2VyLWdyb3VwLWxhc3QnOwoJCQkJCQkJCWNvcm5lckNsYXNzID0gJyB1aS1jb3JuZXItJyArIChpc1JUTCA/ICdsZWZ0JyA6ICdyaWdodCcpOyBicmVhazsKCQkJCQkJCWRlZmF1bHQ6IGNhbGVuZGVyICs9ICcgdWktZGF0ZXBpY2tlci1ncm91cC1taWRkbGUnOyBjb3JuZXJDbGFzcyA9ICcnOyBicmVhazsKCQkJCQkJfQoJCQkJCWNhbGVuZGVyICs9ICciPic7CgkJCQl9CgkJCQljYWxlbmRlciArPSAnPGRpdiBjbGFzcz0idWktZGF0ZXBpY2tlci1oZWFkZXIgdWktd2lkZ2V0LWhlYWRlciB1aS1oZWxwZXItY2xlYXJmaXgnICsgY29ybmVyQ2xhc3MgKyAnIj4nICsKCQkJCQkoL2FsbHxsZWZ0Ly50ZXN0KGNvcm5lckNsYXNzKSAmJiByb3cgPT0gMCA/IChpc1JUTCA/IG5leHQgOiBwcmV2KSA6ICcnKSArCgkJCQkJKC9hbGx8cmlnaHQvLnRlc3QoY29ybmVyQ2xhc3MpICYmIHJvdyA9PSAwID8gKGlzUlRMID8gcHJldiA6IG5leHQpIDogJycpICsKCQkJCQl0aGlzLl9nZW5lcmF0ZU1vbnRoWWVhckhlYWRlcihpbnN0LCBkcmF3TW9udGgsIGRyYXdZZWFyLCBtaW5EYXRlLCBtYXhEYXRlLAoJCQkJCXJvdyA+IDAgfHwgY29sID4gMCwgbW9udGhOYW1lcywgbW9udGhOYW1lc1Nob3J0KSArIC8vIGRyYXcgbW9udGggaGVhZGVycwoJCQkJCSc8L2Rpdj48dGFibGUgY2xhc3M9InVpLWRhdGVwaWNrZXItY2FsZW5kYXIiPjx0aGVhZD4nICsKCQkJCQknPHRyPic7CgkJCQl2YXIgdGhlYWQgPSAoc2hvd1dlZWsgPyAnPHRoIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXdlZWstY29sIj4nICsgdGhpcy5fZ2V0KGluc3QsICd3ZWVrSGVhZGVyJykgKyAnPC90aD4nIDogJycpOwoJCQkJZm9yICh2YXIgZG93ID0gMDsgZG93IDwgNzsgZG93KyspIHsgLy8gZGF5cyBvZiB0aGUgd2VlawoJCQkJCXZhciBkYXkgPSAoZG93ICsgZmlyc3REYXkpICUgNzsKCQkJCQl0aGVhZCArPSAnPHRoJyArICgoZG93ICsgZmlyc3REYXkgKyA2KSAlIDcgPj0gNSA/ICcgY2xhc3M9InVpLWRhdGVwaWNrZXItd2Vlay1lbmQiJyA6ICcnKSArICc+JyArCgkJCQkJCSc8c3BhbiB0aXRsZT0iJyArIGRheU5hbWVzW2RheV0gKyAnIj4nICsgZGF5TmFtZXNNaW5bZGF5XSArICc8L3NwYW4+PC90aD4nOwoJCQkJfQoJCQkJY2FsZW5kZXIgKz0gdGhlYWQgKyAnPC90cj48L3RoZWFkPjx0Ym9keT4nOwoJCQkJdmFyIGRheXNJbk1vbnRoID0gdGhpcy5fZ2V0RGF5c0luTW9udGgoZHJhd1llYXIsIGRyYXdNb250aCk7CgkJCQlpZiAoZHJhd1llYXIgPT0gaW5zdC5zZWxlY3RlZFllYXIgJiYgZHJhd01vbnRoID09IGluc3Quc2VsZWN0ZWRNb250aCkKCQkJCQlpbnN0LnNlbGVjdGVkRGF5ID0gTWF0aC5taW4oaW5zdC5zZWxlY3RlZERheSwgZGF5c0luTW9udGgpOwoJCQkJdmFyIGxlYWREYXlzID0gKHRoaXMuX2dldEZpcnN0RGF5T2ZNb250aChkcmF3WWVhciwgZHJhd01vbnRoKSAtIGZpcnN0RGF5ICsgNykgJSA3OwoJCQkJdmFyIGN1clJvd3MgPSBNYXRoLmNlaWwoKGxlYWREYXlzICsgZGF5c0luTW9udGgpIC8gNyk7IC8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHJvd3MgdG8gZ2VuZXJhdGUKCQkJCXZhciBudW1Sb3dzID0gKGlzTXVsdGlNb250aCA/IHRoaXMubWF4Um93cyA+IGN1clJvd3MgPyB0aGlzLm1heFJvd3MgOiBjdXJSb3dzIDogY3VyUm93cyk7IC8vSWYgbXVsdGlwbGUgbW9udGhzLCB1c2UgdGhlIGhpZ2hlciBudW1iZXIgb2Ygcm93cyAoc2VlICM3MDQzKQoJCQkJdGhpcy5tYXhSb3dzID0gbnVtUm93czsKCQkJCXZhciBwcmludERhdGUgPSB0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkcmF3WWVhciwgZHJhd01vbnRoLCAxIC0gbGVhZERheXMpKTsKCQkJCWZvciAodmFyIGRSb3cgPSAwOyBkUm93IDwgbnVtUm93czsgZFJvdysrKSB7IC8vIGNyZWF0ZSBkYXRlIHBpY2tlciByb3dzCgkJCQkJY2FsZW5kZXIgKz0gJzx0cj4nOwoJCQkJCXZhciB0Ym9keSA9ICghc2hvd1dlZWsgPyAnJyA6ICc8dGQgY2xhc3M9InVpLWRhdGVwaWNrZXItd2Vlay1jb2wiPicgKwoJCQkJCQl0aGlzLl9nZXQoaW5zdCwgJ2NhbGN1bGF0ZVdlZWsnKShwcmludERhdGUpICsgJzwvdGQ+Jyk7CgkJCQkJZm9yICh2YXIgZG93ID0gMDsgZG93IDwgNzsgZG93KyspIHsgLy8gY3JlYXRlIGRhdGUgcGlja2VyIGRheXMKCQkJCQkJdmFyIGRheVNldHRpbmdzID0gKGJlZm9yZVNob3dEYXkgPwoJCQkJCQkJYmVmb3JlU2hvd0RheS5hcHBseSgoaW5zdC5pbnB1dCA/IGluc3QuaW5wdXRbMF0gOiBudWxsKSwgW3ByaW50RGF0ZV0pIDogW3RydWUsICcnXSk7CgkJCQkJCXZhciBvdGhlck1vbnRoID0gKHByaW50RGF0ZS5nZXRNb250aCgpICE9IGRyYXdNb250aCk7CgkJCQkJCXZhciB1bnNlbGVjdGFibGUgPSAob3RoZXJNb250aCAmJiAhc2VsZWN0T3RoZXJNb250aHMpIHx8ICFkYXlTZXR0aW5nc1swXSB8fAoJCQkJCQkJKG1pbkRhdGUgJiYgcHJpbnREYXRlIDwgbWluRGF0ZSkgfHwgKG1heERhdGUgJiYgcHJpbnREYXRlID4gbWF4RGF0ZSk7CgkJCQkJCXRib2R5ICs9ICc8dGQgY2xhc3M9IicgKwoJCQkJCQkJKChkb3cgKyBmaXJzdERheSArIDYpICUgNyA+PSA1ID8gJyB1aS1kYXRlcGlja2VyLXdlZWstZW5kJyA6ICcnKSArIC8vIGhpZ2hsaWdodCB3ZWVrZW5kcwoJCQkJCQkJKG90aGVyTW9udGggPyAnIHVpLWRhdGVwaWNrZXItb3RoZXItbW9udGgnIDogJycpICsgLy8gaGlnaGxpZ2h0IGRheXMgZnJvbSBvdGhlciBtb250aHMKCQkJCQkJCSgocHJpbnREYXRlLmdldFRpbWUoKSA9PSBzZWxlY3RlZERhdGUuZ2V0VGltZSgpICYmIGRyYXdNb250aCA9PSBpbnN0LnNlbGVjdGVkTW9udGggJiYgaW5zdC5fa2V5RXZlbnQpIHx8IC8vIHVzZXIgcHJlc3NlZCBrZXkKCQkJCQkJCShkZWZhdWx0RGF0ZS5nZXRUaW1lKCkgPT0gcHJpbnREYXRlLmdldFRpbWUoKSAmJiBkZWZhdWx0RGF0ZS5nZXRUaW1lKCkgPT0gc2VsZWN0ZWREYXRlLmdldFRpbWUoKSkgPwoJCQkJCQkJLy8gb3IgZGVmYXVsdERhdGUgaXMgY3VycmVudCBwcmludGVkRGF0ZSBhbmQgZGVmYXVsdERhdGUgaXMgc2VsZWN0ZWREYXRlCgkJCQkJCQknICcgKyB0aGlzLl9kYXlPdmVyQ2xhc3MgOiAnJykgKyAvLyBoaWdobGlnaHQgc2VsZWN0ZWQgZGF5CgkJCQkJCQkodW5zZWxlY3RhYmxlID8gJyAnICsgdGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3MgKyAnIHVpLXN0YXRlLWRpc2FibGVkJzogJycpICsgIC8vIGhpZ2hsaWdodCB1bnNlbGVjdGFibGUgZGF5cwoJCQkJCQkJKG90aGVyTW9udGggJiYgIXNob3dPdGhlck1vbnRocyA/ICcnIDogJyAnICsgZGF5U2V0dGluZ3NbMV0gKyAvLyBoaWdobGlnaHQgY3VzdG9tIGRhdGVzCgkJCQkJCQkocHJpbnREYXRlLmdldFRpbWUoKSA9PSBjdXJyZW50RGF0ZS5nZXRUaW1lKCkgPyAnICcgKyB0aGlzLl9jdXJyZW50Q2xhc3MgOiAnJykgKyAvLyBoaWdobGlnaHQgc2VsZWN0ZWQgZGF5CgkJCQkJCQkocHJpbnREYXRlLmdldFRpbWUoKSA9PSB0b2RheS5nZXRUaW1lKCkgPyAnIHVpLWRhdGVwaWNrZXItdG9kYXknIDogJycpKSArICciJyArIC8vIGhpZ2hsaWdodCB0b2RheSAoaWYgZGlmZmVyZW50KQoJCQkJCQkJKCghb3RoZXJNb250aCB8fCBzaG93T3RoZXJNb250aHMpICYmIGRheVNldHRpbmdzWzJdID8gJyB0aXRsZT0iJyArIGRheVNldHRpbmdzWzJdICsgJyInIDogJycpICsgLy8gY2VsbCB0aXRsZQoJCQkJCQkJKHVuc2VsZWN0YWJsZSA/ICcnIDogJyBkYXRhLWhhbmRsZXI9InNlbGVjdERheSIgZGF0YS1ldmVudD0iY2xpY2siIGRhdGEtbW9udGg9IicgKyBwcmludERhdGUuZ2V0TW9udGgoKSArICciIGRhdGEteWVhcj0iJyArIHByaW50RGF0ZS5nZXRGdWxsWWVhcigpICsgJyInKSArICc+JyArIC8vIGFjdGlvbnMKCQkJCQkJCShvdGhlck1vbnRoICYmICFzaG93T3RoZXJNb250aHMgPyAnJiN4YTA7JyA6IC8vIGRpc3BsYXkgZm9yIG90aGVyIG1vbnRocwoJCQkJCQkJKHVuc2VsZWN0YWJsZSA/ICc8c3BhbiBjbGFzcz0idWktc3RhdGUtZGVmYXVsdCI+JyArIHByaW50RGF0ZS5nZXREYXRlKCkgKyAnPC9zcGFuPicgOiAnPGEgY2xhc3M9InVpLXN0YXRlLWRlZmF1bHQnICsKCQkJCQkJCShwcmludERhdGUuZ2V0VGltZSgpID09IHRvZGF5LmdldFRpbWUoKSA/ICcgdWktc3RhdGUtaGlnaGxpZ2h0JyA6ICcnKSArCgkJCQkJCQkocHJpbnREYXRlLmdldFRpbWUoKSA9PSBjdXJyZW50RGF0ZS5nZXRUaW1lKCkgPyAnIHVpLXN0YXRlLWFjdGl2ZScgOiAnJykgKyAvLyBoaWdobGlnaHQgc2VsZWN0ZWQgZGF5CgkJCQkJCQkob3RoZXJNb250aCA/ICcgdWktcHJpb3JpdHktc2Vjb25kYXJ5JyA6ICcnKSArIC8vIGRpc3Rpbmd1aXNoIGRhdGVzIGZyb20gb3RoZXIgbW9udGhzCgkJCQkJCQknIiBocmVmPSIjIj4nICsgcHJpbnREYXRlLmdldERhdGUoKSArICc8L2E+JykpICsgJzwvdGQ+JzsgLy8gZGlzcGxheSBzZWxlY3RhYmxlIGRhdGUKCQkJCQkJcHJpbnREYXRlLnNldERhdGUocHJpbnREYXRlLmdldERhdGUoKSArIDEpOwoJCQkJCQlwcmludERhdGUgPSB0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChwcmludERhdGUpOwoJCQkJCX0KCQkJCQljYWxlbmRlciArPSB0Ym9keSArICc8L3RyPic7CgkJCQl9CgkJCQlkcmF3TW9udGgrKzsKCQkJCWlmIChkcmF3TW9udGggPiAxMSkgewoJCQkJCWRyYXdNb250aCA9IDA7CgkJCQkJZHJhd1llYXIrKzsKCQkJCX0KCQkJCWNhbGVuZGVyICs9ICc8L3Rib2R5PjwvdGFibGU+JyArIChpc011bHRpTW9udGggPyAnPC9kaXY+JyArCgkJCQkJCQkoKG51bU1vbnRoc1swXSA+IDAgJiYgY29sID09IG51bU1vbnRoc1sxXS0xKSA/ICc8ZGl2IGNsYXNzPSJ1aS1kYXRlcGlja2VyLXJvdy1icmVhayI+PC9kaXY+JyA6ICcnKSA6ICcnKTsKCQkJCWdyb3VwICs9IGNhbGVuZGVyOwoJCQl9CgkJCWh0bWwgKz0gZ3JvdXA7CgkJfQoJCWh0bWwgKz0gYnV0dG9uUGFuZWwgKyAoJC51aS5pZTYgJiYgIWluc3QuaW5saW5lID8KCQkJJzxpZnJhbWUgc3JjPSJqYXZhc2NyaXB0OmZhbHNlOyIgY2xhc3M9InVpLWRhdGVwaWNrZXItY292ZXIiIGZyYW1lYm9yZGVyPSIwIj48L2lmcmFtZT4nIDogJycpOwoJCWluc3QuX2tleUV2ZW50ID0gZmFsc2U7CgkJcmV0dXJuIGh0bWw7Cgl9LAoKCS8qIEdlbmVyYXRlIHRoZSBtb250aCBhbmQgeWVhciBoZWFkZXIuICovCglfZ2VuZXJhdGVNb250aFllYXJIZWFkZXI6IGZ1bmN0aW9uKGluc3QsIGRyYXdNb250aCwgZHJhd1llYXIsIG1pbkRhdGUsIG1heERhdGUsCgkJCXNlY29uZGFyeSwgbW9udGhOYW1lcywgbW9udGhOYW1lc1Nob3J0KSB7CgkJdmFyIGNoYW5nZU1vbnRoID0gdGhpcy5fZ2V0KGluc3QsICdjaGFuZ2VNb250aCcpOwoJCXZhciBjaGFuZ2VZZWFyID0gdGhpcy5fZ2V0KGluc3QsICdjaGFuZ2VZZWFyJyk7CgkJdmFyIHNob3dNb250aEFmdGVyWWVhciA9IHRoaXMuX2dldChpbnN0LCAnc2hvd01vbnRoQWZ0ZXJZZWFyJyk7CgkJdmFyIGh0bWwgPSAnPGRpdiBjbGFzcz0idWktZGF0ZXBpY2tlci10aXRsZSI+JzsKCQl2YXIgbW9udGhIdG1sID0gJyc7CgkJLy8gbW9udGggc2VsZWN0aW9uCgkJaWYgKHNlY29uZGFyeSB8fCAhY2hhbmdlTW9udGgpCgkJCW1vbnRoSHRtbCArPSAnPHNwYW4gY2xhc3M9InVpLWRhdGVwaWNrZXItbW9udGgiPicgKyBtb250aE5hbWVzW2RyYXdNb250aF0gKyAnPC9zcGFuPic7CgkJZWxzZSB7CgkJCXZhciBpbk1pblllYXIgPSAobWluRGF0ZSAmJiBtaW5EYXRlLmdldEZ1bGxZZWFyKCkgPT0gZHJhd1llYXIpOwoJCQl2YXIgaW5NYXhZZWFyID0gKG1heERhdGUgJiYgbWF4RGF0ZS5nZXRGdWxsWWVhcigpID09IGRyYXdZZWFyKTsKCQkJbW9udGhIdG1sICs9ICc8c2VsZWN0IGNsYXNzPSJ1aS1kYXRlcGlja2VyLW1vbnRoIiBkYXRhLWhhbmRsZXI9InNlbGVjdE1vbnRoIiBkYXRhLWV2ZW50PSJjaGFuZ2UiPic7CgkJCWZvciAodmFyIG1vbnRoID0gMDsgbW9udGggPCAxMjsgbW9udGgrKykgewoJCQkJaWYgKCghaW5NaW5ZZWFyIHx8IG1vbnRoID49IG1pbkRhdGUuZ2V0TW9udGgoKSkgJiYKCQkJCQkJKCFpbk1heFllYXIgfHwgbW9udGggPD0gbWF4RGF0ZS5nZXRNb250aCgpKSkKCQkJCQltb250aEh0bWwgKz0gJzxvcHRpb24gdmFsdWU9IicgKyBtb250aCArICciJyArCgkJCQkJCShtb250aCA9PSBkcmF3TW9udGggPyAnIHNlbGVjdGVkPSJzZWxlY3RlZCInIDogJycpICsKCQkJCQkJJz4nICsgbW9udGhOYW1lc1Nob3J0W21vbnRoXSArICc8L29wdGlvbj4nOwoJCQl9CgkJCW1vbnRoSHRtbCArPSAnPC9zZWxlY3Q+JzsKCQl9CgkJaWYgKCFzaG93TW9udGhBZnRlclllYXIpCgkJCWh0bWwgKz0gbW9udGhIdG1sICsgKHNlY29uZGFyeSB8fCAhKGNoYW5nZU1vbnRoICYmIGNoYW5nZVllYXIpID8gJyYjeGEwOycgOiAnJyk7CgkJLy8geWVhciBzZWxlY3Rpb24KCQlpZiAoICFpbnN0LnllYXJzaHRtbCApIHsKCQkJaW5zdC55ZWFyc2h0bWwgPSAnJzsKCQkJaWYgKHNlY29uZGFyeSB8fCAhY2hhbmdlWWVhcikKCQkJCWh0bWwgKz0gJzxzcGFuIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXllYXIiPicgKyBkcmF3WWVhciArICc8L3NwYW4+JzsKCQkJZWxzZSB7CgkJCQkvLyBkZXRlcm1pbmUgcmFuZ2Ugb2YgeWVhcnMgdG8gZGlzcGxheQoJCQkJdmFyIHllYXJzID0gdGhpcy5fZ2V0KGluc3QsICd5ZWFyUmFuZ2UnKS5zcGxpdCgnOicpOwoJCQkJdmFyIHRoaXNZZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpOwoJCQkJdmFyIGRldGVybWluZVllYXIgPSBmdW5jdGlvbih2YWx1ZSkgewoJCQkJCXZhciB5ZWFyID0gKHZhbHVlLm1hdGNoKC9jWystXS4qLykgPyBkcmF3WWVhciArIHBhcnNlSW50KHZhbHVlLnN1YnN0cmluZygxKSwgMTApIDoKCQkJCQkJKHZhbHVlLm1hdGNoKC9bKy1dLiovKSA/IHRoaXNZZWFyICsgcGFyc2VJbnQodmFsdWUsIDEwKSA6CgkJCQkJCXBhcnNlSW50KHZhbHVlLCAxMCkpKTsKCQkJCQlyZXR1cm4gKGlzTmFOKHllYXIpID8gdGhpc1llYXIgOiB5ZWFyKTsKCQkJCX07CgkJCQl2YXIgeWVhciA9IGRldGVybWluZVllYXIoeWVhcnNbMF0pOwoJCQkJdmFyIGVuZFllYXIgPSBNYXRoLm1heCh5ZWFyLCBkZXRlcm1pbmVZZWFyKHllYXJzWzFdIHx8ICcnKSk7CgkJCQl5ZWFyID0gKG1pbkRhdGUgPyBNYXRoLm1heCh5ZWFyLCBtaW5EYXRlLmdldEZ1bGxZZWFyKCkpIDogeWVhcik7CgkJCQllbmRZZWFyID0gKG1heERhdGUgPyBNYXRoLm1pbihlbmRZZWFyLCBtYXhEYXRlLmdldEZ1bGxZZWFyKCkpIDogZW5kWWVhcik7CgkJCQlpbnN0LnllYXJzaHRtbCArPSAnPHNlbGVjdCBjbGFzcz0idWktZGF0ZXBpY2tlci15ZWFyIiBkYXRhLWhhbmRsZXI9InNlbGVjdFllYXIiIGRhdGEtZXZlbnQ9ImNoYW5nZSI+JzsKCQkJCWZvciAoOyB5ZWFyIDw9IGVuZFllYXI7IHllYXIrKykgewoJCQkJCWluc3QueWVhcnNodG1sICs9ICc8b3B0aW9uIHZhbHVlPSInICsgeWVhciArICciJyArCgkJCQkJCSh5ZWFyID09IGRyYXdZZWFyID8gJyBzZWxlY3RlZD0ic2VsZWN0ZWQiJyA6ICcnKSArCgkJCQkJCSc+JyArIHllYXIgKyAnPC9vcHRpb24+JzsKCQkJCX0KCQkJCWluc3QueWVhcnNodG1sICs9ICc8L3NlbGVjdD4nOwoKCQkJCWh0bWwgKz0gaW5zdC55ZWFyc2h0bWw7CgkJCQlpbnN0LnllYXJzaHRtbCA9IG51bGw7CgkJCX0KCQl9CgkJaHRtbCArPSB0aGlzLl9nZXQoaW5zdCwgJ3llYXJTdWZmaXgnKTsKCQlpZiAoc2hvd01vbnRoQWZ0ZXJZZWFyKQoJCQlodG1sICs9IChzZWNvbmRhcnkgfHwgIShjaGFuZ2VNb250aCAmJiBjaGFuZ2VZZWFyKSA/ICcmI3hhMDsnIDogJycpICsgbW9udGhIdG1sOwoJCWh0bWwgKz0gJzwvZGl2Pic7IC8vIENsb3NlIGRhdGVwaWNrZXJfaGVhZGVyCgkJcmV0dXJuIGh0bWw7Cgl9LAoKCS8qIEFkanVzdCBvbmUgb2YgdGhlIGRhdGUgc3ViLWZpZWxkcy4gKi8KCV9hZGp1c3RJbnN0RGF0ZTogZnVuY3Rpb24oaW5zdCwgb2Zmc2V0LCBwZXJpb2QpIHsKCQl2YXIgeWVhciA9IGluc3QuZHJhd1llYXIgKyAocGVyaW9kID09ICdZJyA/IG9mZnNldCA6IDApOwoJCXZhciBtb250aCA9IGluc3QuZHJhd01vbnRoICsgKHBlcmlvZCA9PSAnTScgPyBvZmZzZXQgOiAwKTsKCQl2YXIgZGF5ID0gTWF0aC5taW4oaW5zdC5zZWxlY3RlZERheSwgdGhpcy5fZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpKSArCgkJCShwZXJpb2QgPT0gJ0QnID8gb2Zmc2V0IDogMCk7CgkJdmFyIGRhdGUgPSB0aGlzLl9yZXN0cmljdE1pbk1heChpbnN0LAoJCQl0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5KSkpOwoJCWluc3Quc2VsZWN0ZWREYXkgPSBkYXRlLmdldERhdGUoKTsKCQlpbnN0LmRyYXdNb250aCA9IGluc3Quc2VsZWN0ZWRNb250aCA9IGRhdGUuZ2V0TW9udGgoKTsKCQlpbnN0LmRyYXdZZWFyID0gaW5zdC5zZWxlY3RlZFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CgkJaWYgKHBlcmlvZCA9PSAnTScgfHwgcGVyaW9kID09ICdZJykKCQkJdGhpcy5fbm90aWZ5Q2hhbmdlKGluc3QpOwoJfSwKCgkvKiBFbnN1cmUgYSBkYXRlIGlzIHdpdGhpbiBhbnkgbWluL21heCBib3VuZHMuICovCglfcmVzdHJpY3RNaW5NYXg6IGZ1bmN0aW9uKGluc3QsIGRhdGUpIHsKCQl2YXIgbWluRGF0ZSA9IHRoaXMuX2dldE1pbk1heERhdGUoaW5zdCwgJ21pbicpOwoJCXZhciBtYXhEYXRlID0gdGhpcy5fZ2V0TWluTWF4RGF0ZShpbnN0LCAnbWF4Jyk7CgkJdmFyIG5ld0RhdGUgPSAobWluRGF0ZSAmJiBkYXRlIDwgbWluRGF0ZSA/IG1pbkRhdGUgOiBkYXRlKTsKCQluZXdEYXRlID0gKG1heERhdGUgJiYgbmV3RGF0ZSA+IG1heERhdGUgPyBtYXhEYXRlIDogbmV3RGF0ZSk7CgkJcmV0dXJuIG5ld0RhdGU7Cgl9LAoKCS8qIE5vdGlmeSBjaGFuZ2Ugb2YgbW9udGgveWVhci4gKi8KCV9ub3RpZnlDaGFuZ2U6IGZ1bmN0aW9uKGluc3QpIHsKCQl2YXIgb25DaGFuZ2UgPSB0aGlzLl9nZXQoaW5zdCwgJ29uQ2hhbmdlTW9udGhZZWFyJyk7CgkJaWYgKG9uQ2hhbmdlKQoJCQlvbkNoYW5nZS5hcHBseSgoaW5zdC5pbnB1dCA/IGluc3QuaW5wdXRbMF0gOiBudWxsKSwKCQkJCVtpbnN0LnNlbGVjdGVkWWVhciwgaW5zdC5zZWxlY3RlZE1vbnRoICsgMSwgaW5zdF0pOwoJfSwKCgkvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBtb250aHMgdG8gc2hvdy4gKi8KCV9nZXROdW1iZXJPZk1vbnRoczogZnVuY3Rpb24oaW5zdCkgewoJCXZhciBudW1Nb250aHMgPSB0aGlzLl9nZXQoaW5zdCwgJ251bWJlck9mTW9udGhzJyk7CgkJcmV0dXJuIChudW1Nb250aHMgPT0gbnVsbCA/IFsxLCAxXSA6ICh0eXBlb2YgbnVtTW9udGhzID09ICdudW1iZXInID8gWzEsIG51bU1vbnRoc10gOiBudW1Nb250aHMpKTsKCX0sCgoJLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IG1heGltdW0gZGF0ZSAtIGVuc3VyZSBubyB0aW1lIGNvbXBvbmVudHMgYXJlIHNldC4gKi8KCV9nZXRNaW5NYXhEYXRlOiBmdW5jdGlvbihpbnN0LCBtaW5NYXgpIHsKCQlyZXR1cm4gdGhpcy5fZGV0ZXJtaW5lRGF0ZShpbnN0LCB0aGlzLl9nZXQoaW5zdCwgbWluTWF4ICsgJ0RhdGUnKSwgbnVsbCk7Cgl9LAoKCS8qIEZpbmQgdGhlIG51bWJlciBvZiBkYXlzIGluIGEgZ2l2ZW4gbW9udGguICovCglfZ2V0RGF5c0luTW9udGg6IGZ1bmN0aW9uKHllYXIsIG1vbnRoKSB7CgkJcmV0dXJuIDMyIC0gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoeWVhciwgbW9udGgsIDMyKSkuZ2V0RGF0ZSgpOwoJfSwKCgkvKiBGaW5kIHRoZSBkYXkgb2YgdGhlIHdlZWsgb2YgdGhlIGZpcnN0IG9mIGEgbW9udGguICovCglfZ2V0Rmlyc3REYXlPZk1vbnRoOiBmdW5jdGlvbih5ZWFyLCBtb250aCkgewoJCXJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSkuZ2V0RGF5KCk7Cgl9LAoKCS8qIERldGVybWluZXMgaWYgd2Ugc2hvdWxkIGFsbG93IGEgIm5leHQvcHJldiIgbW9udGggZGlzcGxheSBjaGFuZ2UuICovCglfY2FuQWRqdXN0TW9udGg6IGZ1bmN0aW9uKGluc3QsIG9mZnNldCwgY3VyWWVhciwgY3VyTW9udGgpIHsKCQl2YXIgbnVtTW9udGhzID0gdGhpcy5fZ2V0TnVtYmVyT2ZNb250aHMoaW5zdCk7CgkJdmFyIGRhdGUgPSB0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShjdXJZZWFyLAoJCQljdXJNb250aCArIChvZmZzZXQgPCAwID8gb2Zmc2V0IDogbnVtTW9udGhzWzBdICogbnVtTW9udGhzWzFdKSwgMSkpOwoJCWlmIChvZmZzZXQgPCAwKQoJCQlkYXRlLnNldERhdGUodGhpcy5fZ2V0RGF5c0luTW9udGgoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkpKTsKCQlyZXR1cm4gdGhpcy5faXNJblJhbmdlKGluc3QsIGRhdGUpOwoJfSwKCgkvKiBJcyB0aGUgZ2l2ZW4gZGF0ZSBpbiB0aGUgYWNjZXB0ZWQgcmFuZ2U/ICovCglfaXNJblJhbmdlOiBmdW5jdGlvbihpbnN0LCBkYXRlKSB7CgkJdmFyIG1pbkRhdGUgPSB0aGlzLl9nZXRNaW5NYXhEYXRlKGluc3QsICdtaW4nKTsKCQl2YXIgbWF4RGF0ZSA9IHRoaXMuX2dldE1pbk1heERhdGUoaW5zdCwgJ21heCcpOwoJCXJldHVybiAoKCFtaW5EYXRlIHx8IGRhdGUuZ2V0VGltZSgpID49IG1pbkRhdGUuZ2V0VGltZSgpKSAmJgoJCQkoIW1heERhdGUgfHwgZGF0ZS5nZXRUaW1lKCkgPD0gbWF4RGF0ZS5nZXRUaW1lKCkpKTsKCX0sCgoJLyogUHJvdmlkZSB0aGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgZm9ybWF0dGluZy9wYXJzaW5nLiAqLwoJX2dldEZvcm1hdENvbmZpZzogZnVuY3Rpb24oaW5zdCkgewoJCXZhciBzaG9ydFllYXJDdXRvZmYgPSB0aGlzLl9nZXQoaW5zdCwgJ3Nob3J0WWVhckN1dG9mZicpOwoJCXNob3J0WWVhckN1dG9mZiA9ICh0eXBlb2Ygc2hvcnRZZWFyQ3V0b2ZmICE9ICdzdHJpbmcnID8gc2hvcnRZZWFyQ3V0b2ZmIDoKCQkJbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpICUgMTAwICsgcGFyc2VJbnQoc2hvcnRZZWFyQ3V0b2ZmLCAxMCkpOwoJCXJldHVybiB7c2hvcnRZZWFyQ3V0b2ZmOiBzaG9ydFllYXJDdXRvZmYsCgkJCWRheU5hbWVzU2hvcnQ6IHRoaXMuX2dldChpbnN0LCAnZGF5TmFtZXNTaG9ydCcpLCBkYXlOYW1lczogdGhpcy5fZ2V0KGluc3QsICdkYXlOYW1lcycpLAoJCQltb250aE5hbWVzU2hvcnQ6IHRoaXMuX2dldChpbnN0LCAnbW9udGhOYW1lc1Nob3J0JyksIG1vbnRoTmFtZXM6IHRoaXMuX2dldChpbnN0LCAnbW9udGhOYW1lcycpfTsKCX0sCgoJLyogRm9ybWF0IHRoZSBnaXZlbiBkYXRlIGZvciBkaXNwbGF5LiAqLwoJX2Zvcm1hdERhdGU6IGZ1bmN0aW9uKGluc3QsIGRheSwgbW9udGgsIHllYXIpIHsKCQlpZiAoIWRheSkgewoJCQlpbnN0LmN1cnJlbnREYXkgPSBpbnN0LnNlbGVjdGVkRGF5OwoJCQlpbnN0LmN1cnJlbnRNb250aCA9IGluc3Quc2VsZWN0ZWRNb250aDsKCQkJaW5zdC5jdXJyZW50WWVhciA9IGluc3Quc2VsZWN0ZWRZZWFyOwoJCX0KCQl2YXIgZGF0ZSA9IChkYXkgPyAodHlwZW9mIGRheSA9PSAnb2JqZWN0JyA/IGRheSA6CgkJCXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXkpKSkgOgoJCQl0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShpbnN0LmN1cnJlbnRZZWFyLCBpbnN0LmN1cnJlbnRNb250aCwgaW5zdC5jdXJyZW50RGF5KSkpOwoJCXJldHVybiB0aGlzLmZvcm1hdERhdGUodGhpcy5fZ2V0KGluc3QsICdkYXRlRm9ybWF0JyksIGRhdGUsIHRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSk7Cgl9Cn0pOwoKLyoKICogQmluZCBob3ZlciBldmVudHMgZm9yIGRhdGVwaWNrZXIgZWxlbWVudHMuCiAqIERvbmUgdmlhIGRlbGVnYXRlIHNvIHRoZSBiaW5kaW5nIG9ubHkgb2NjdXJzIG9uY2UgaW4gdGhlIGxpZmV0aW1lIG9mIHRoZSBwYXJlbnQgZGl2LgogKiBHbG9iYWwgaW5zdEFjdGl2ZSwgc2V0IGJ5IF91cGRhdGVEYXRlcGlja2VyIGFsbG93cyB0aGUgaGFuZGxlcnMgdG8gZmluZCB0aGVpciB3YXkgYmFjayB0byB0aGUgYWN0aXZlIHBpY2tlci4KICovCmZ1bmN0aW9uIGJpbmRIb3ZlcihkcERpdikgewoJdmFyIHNlbGVjdG9yID0gJ2J1dHRvbiwgLnVpLWRhdGVwaWNrZXItcHJldiwgLnVpLWRhdGVwaWNrZXItbmV4dCwgLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIgdGQgYSc7CglyZXR1cm4gZHBEaXYuZGVsZWdhdGUoc2VsZWN0b3IsICdtb3VzZW91dCcsIGZ1bmN0aW9uKCkgewoJCQkkKHRoaXMpLnJlbW92ZUNsYXNzKCd1aS1zdGF0ZS1ob3ZlcicpOwoJCQlpZiAodGhpcy5jbGFzc05hbWUuaW5kZXhPZigndWktZGF0ZXBpY2tlci1wcmV2JykgIT0gLTEpICQodGhpcykucmVtb3ZlQ2xhc3MoJ3VpLWRhdGVwaWNrZXItcHJldi1ob3ZlcicpOwoJCQlpZiAodGhpcy5jbGFzc05hbWUuaW5kZXhPZigndWktZGF0ZXBpY2tlci1uZXh0JykgIT0gLTEpICQodGhpcykucmVtb3ZlQ2xhc3MoJ3VpLWRhdGVwaWNrZXItbmV4dC1ob3ZlcicpOwoJCX0pCgkJLmRlbGVnYXRlKHNlbGVjdG9yLCAnbW91c2VvdmVyJywgZnVuY3Rpb24oKXsKCQkJaWYgKCEkLmRhdGVwaWNrZXIuX2lzRGlzYWJsZWREYXRlcGlja2VyKCBpbnN0QWN0aXZlLmlubGluZSA/IGRwRGl2LnBhcmVudCgpWzBdIDogaW5zdEFjdGl2ZS5pbnB1dFswXSkpIHsKCQkJCSQodGhpcykucGFyZW50cygnLnVpLWRhdGVwaWNrZXItY2FsZW5kYXInKS5maW5kKCdhJykucmVtb3ZlQ2xhc3MoJ3VpLXN0YXRlLWhvdmVyJyk7CgkJCQkkKHRoaXMpLmFkZENsYXNzKCd1aS1zdGF0ZS1ob3ZlcicpOwoJCQkJaWYgKHRoaXMuY2xhc3NOYW1lLmluZGV4T2YoJ3VpLWRhdGVwaWNrZXItcHJldicpICE9IC0xKSAkKHRoaXMpLmFkZENsYXNzKCd1aS1kYXRlcGlja2VyLXByZXYtaG92ZXInKTsKCQkJCWlmICh0aGlzLmNsYXNzTmFtZS5pbmRleE9mKCd1aS1kYXRlcGlja2VyLW5leHQnKSAhPSAtMSkgJCh0aGlzKS5hZGRDbGFzcygndWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyJyk7CgkJCX0KCQl9KTsKfQoKLyogalF1ZXJ5IGV4dGVuZCBub3cgaWdub3JlcyBudWxscyEgKi8KZnVuY3Rpb24gZXh0ZW5kUmVtb3ZlKHRhcmdldCwgcHJvcHMpIHsKCSQuZXh0ZW5kKHRhcmdldCwgcHJvcHMpOwoJZm9yICh2YXIgbmFtZSBpbiBwcm9wcykKCQlpZiAocHJvcHNbbmFtZV0gPT0gbnVsbCB8fCBwcm9wc1tuYW1lXSA9PSB1bmRlZmluZWQpCgkJCXRhcmdldFtuYW1lXSA9IHByb3BzW25hbWVdOwoJcmV0dXJuIHRhcmdldDsKfTsKCi8qIEludm9rZSB0aGUgZGF0ZXBpY2tlciBmdW5jdGlvbmFsaXR5LgogICBAcGFyYW0gIG9wdGlvbnMgIHN0cmluZyAtIGEgY29tbWFuZCwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgb3IKCSAgICAgICAgICAgICAgICBPYmplY3QgLSBzZXR0aW5ncyBmb3IgYXR0YWNoaW5nIG5ldyBkYXRlcGlja2VyIGZ1bmN0aW9uYWxpdHkKICAgQHJldHVybiAgalF1ZXJ5IG9iamVjdCAqLwokLmZuLmRhdGVwaWNrZXIgPSBmdW5jdGlvbihvcHRpb25zKXsKCgkvKiBWZXJpZnkgYW4gZW1wdHkgY29sbGVjdGlvbiB3YXNuJ3QgcGFzc2VkIC0gRml4ZXMgIzY5NzYgKi8KCWlmICggIXRoaXMubGVuZ3RoICkgewoJCXJldHVybiB0aGlzOwoJfQoKCS8qIEluaXRpYWxpc2UgdGhlIGRhdGUgcGlja2VyLiAqLwoJaWYgKCEkLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWQpIHsKCQkkKGRvY3VtZW50KS5tb3VzZWRvd24oJC5kYXRlcGlja2VyLl9jaGVja0V4dGVybmFsQ2xpY2spLgoJCQlmaW5kKGRvY3VtZW50LmJvZHkpLmFwcGVuZCgkLmRhdGVwaWNrZXIuZHBEaXYpOwoJCSQuZGF0ZXBpY2tlci5pbml0aWFsaXplZCA9IHRydWU7Cgl9CgoJdmFyIG90aGVyQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CglpZiAodHlwZW9mIG9wdGlvbnMgPT0gJ3N0cmluZycgJiYgKG9wdGlvbnMgPT0gJ2lzRGlzYWJsZWQnIHx8IG9wdGlvbnMgPT0gJ2dldERhdGUnIHx8IG9wdGlvbnMgPT0gJ3dpZGdldCcpKQoJCXJldHVybiAkLmRhdGVwaWNrZXJbJ18nICsgb3B0aW9ucyArICdEYXRlcGlja2VyJ10uCgkJCWFwcGx5KCQuZGF0ZXBpY2tlciwgW3RoaXNbMF1dLmNvbmNhdChvdGhlckFyZ3MpKTsKCWlmIChvcHRpb25zID09ICdvcHRpb24nICYmIGFyZ3VtZW50cy5sZW5ndGggPT0gMiAmJiB0eXBlb2YgYXJndW1lbnRzWzFdID09ICdzdHJpbmcnKQoJCXJldHVybiAkLmRhdGVwaWNrZXJbJ18nICsgb3B0aW9ucyArICdEYXRlcGlja2VyJ10uCgkJCWFwcGx5KCQuZGF0ZXBpY2tlciwgW3RoaXNbMF1dLmNvbmNhdChvdGhlckFyZ3MpKTsKCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJdHlwZW9mIG9wdGlvbnMgPT0gJ3N0cmluZycgPwoJCQkkLmRhdGVwaWNrZXJbJ18nICsgb3B0aW9ucyArICdEYXRlcGlja2VyJ10uCgkJCQlhcHBseSgkLmRhdGVwaWNrZXIsIFt0aGlzXS5jb25jYXQob3RoZXJBcmdzKSkgOgoJCQkkLmRhdGVwaWNrZXIuX2F0dGFjaERhdGVwaWNrZXIodGhpcywgb3B0aW9ucyk7Cgl9KTsKfTsKCiQuZGF0ZXBpY2tlciA9IG5ldyBEYXRlcGlja2VyKCk7IC8vIHNpbmdsZXRvbiBpbnN0YW5jZQokLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWQgPSBmYWxzZTsKJC5kYXRlcGlja2VyLnV1aWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKJC5kYXRlcGlja2VyLnZlcnNpb24gPSAiMS45LjIiOwoKLy8gV29ya2Fyb3VuZCBmb3IgIzQwNTUKLy8gQWRkIGFub3RoZXIgZ2xvYmFsIHRvIGF2b2lkIG5vQ29uZmxpY3QgaXNzdWVzIHdpdGggaW5saW5lIGV2ZW50IGhhbmRsZXJzCndpbmRvd1snRFBfalF1ZXJ5XycgKyBkcHV1aWRdID0gJDsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKdmFyIHVpRGlhbG9nQ2xhc3NlcyA9ICJ1aS1kaWFsb2cgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwgIiwKCXNpemVSZWxhdGVkT3B0aW9ucyA9IHsKCQlidXR0b25zOiB0cnVlLAoJCWhlaWdodDogdHJ1ZSwKCQltYXhIZWlnaHQ6IHRydWUsCgkJbWF4V2lkdGg6IHRydWUsCgkJbWluSGVpZ2h0OiB0cnVlLAoJCW1pbldpZHRoOiB0cnVlLAoJCXdpZHRoOiB0cnVlCgl9LAoJcmVzaXphYmxlUmVsYXRlZE9wdGlvbnMgPSB7CgkJbWF4SGVpZ2h0OiB0cnVlLAoJCW1heFdpZHRoOiB0cnVlLAoJCW1pbkhlaWdodDogdHJ1ZSwKCQltaW5XaWR0aDogdHJ1ZQoJfTsKCiQud2lkZ2V0KCJ1aS5kaWFsb2ciLCB7Cgl2ZXJzaW9uOiAiMS45LjIiLAoJb3B0aW9uczogewoJCWF1dG9PcGVuOiB0cnVlLAoJCWJ1dHRvbnM6IHt9LAoJCWNsb3NlT25Fc2NhcGU6IHRydWUsCgkJY2xvc2VUZXh0OiAiY2xvc2UiLAoJCWRpYWxvZ0NsYXNzOiAiIiwKCQlkcmFnZ2FibGU6IHRydWUsCgkJaGlkZTogbnVsbCwKCQloZWlnaHQ6ICJhdXRvIiwKCQltYXhIZWlnaHQ6IGZhbHNlLAoJCW1heFdpZHRoOiBmYWxzZSwKCQltaW5IZWlnaHQ6IDE1MCwKCQltaW5XaWR0aDogMTUwLAoJCW1vZGFsOiBmYWxzZSwKCQlwb3NpdGlvbjogewoJCQlteTogImNlbnRlciIsCgkJCWF0OiAiY2VudGVyIiwKCQkJb2Y6IHdpbmRvdywKCQkJY29sbGlzaW9uOiAiZml0IiwKCQkJLy8gZW5zdXJlIHRoYXQgdGhlIHRpdGxlYmFyIGlzIG5ldmVyIG91dHNpZGUgdGhlIGRvY3VtZW50CgkJCXVzaW5nOiBmdW5jdGlvbiggcG9zICkgewoJCQkJdmFyIHRvcE9mZnNldCA9ICQoIHRoaXMgKS5jc3MoIHBvcyApLm9mZnNldCgpLnRvcDsKCQkJCWlmICggdG9wT2Zmc2V0IDwgMCApIHsKCQkJCQkkKCB0aGlzICkuY3NzKCAidG9wIiwgcG9zLnRvcCAtIHRvcE9mZnNldCApOwoJCQkJfQoJCQl9CgkJfSwKCQlyZXNpemFibGU6IHRydWUsCgkJc2hvdzogbnVsbCwKCQlzdGFjazogdHJ1ZSwKCQl0aXRsZTogIiIsCgkJd2lkdGg6IDMwMCwKCQl6SW5kZXg6IDEwMDAKCX0sCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5vcmlnaW5hbFRpdGxlID0gdGhpcy5lbGVtZW50LmF0dHIoICJ0aXRsZSIgKTsKCQkvLyAjNTc0MiAtIC5hdHRyKCkgbWlnaHQgcmV0dXJuIGEgRE9NRWxlbWVudAoJCWlmICggdHlwZW9mIHRoaXMub3JpZ2luYWxUaXRsZSAhPT0gInN0cmluZyIgKSB7CgkJCXRoaXMub3JpZ2luYWxUaXRsZSA9ICIiOwoJCX0KCQl0aGlzLm9sZFBvc2l0aW9uID0gewoJCQlwYXJlbnQ6IHRoaXMuZWxlbWVudC5wYXJlbnQoKSwKCQkJaW5kZXg6IHRoaXMuZWxlbWVudC5wYXJlbnQoKS5jaGlsZHJlbigpLmluZGV4KCB0aGlzLmVsZW1lbnQgKQoJCX07CgkJdGhpcy5vcHRpb25zLnRpdGxlID0gdGhpcy5vcHRpb25zLnRpdGxlIHx8IHRoaXMub3JpZ2luYWxUaXRsZTsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCW9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsCgoJCQl0aXRsZSA9IG9wdGlvbnMudGl0bGUgfHwgIiYjMTYwOyIsCgkJCXVpRGlhbG9nLAoJCQl1aURpYWxvZ1RpdGxlYmFyLAoJCQl1aURpYWxvZ1RpdGxlYmFyQ2xvc2UsCgkJCXVpRGlhbG9nVGl0bGUsCgkJCXVpRGlhbG9nQnV0dG9uUGFuZTsKCgkJCXVpRGlhbG9nID0gKCB0aGlzLnVpRGlhbG9nID0gJCggIjxkaXY+IiApICkKCQkJCS5hZGRDbGFzcyggdWlEaWFsb2dDbGFzc2VzICsgb3B0aW9ucy5kaWFsb2dDbGFzcyApCgkJCQkuY3NzKHsKCQkJCQlkaXNwbGF5OiAibm9uZSIsCgkJCQkJb3V0bGluZTogMCwgLy8gVE9ETzogbW92ZSB0byBzdHlsZXNoZWV0CgkJCQkJekluZGV4OiBvcHRpb25zLnpJbmRleAoJCQkJfSkKCQkJCS8vIHNldHRpbmcgdGFiSW5kZXggbWFrZXMgdGhlIGRpdiBmb2N1c2FibGUKCQkJCS5hdHRyKCAidGFiSW5kZXgiLCAtMSkKCQkJCS5rZXlkb3duKGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIG9wdGlvbnMuY2xvc2VPbkVzY2FwZSAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgJiYgZXZlbnQua2V5Q29kZSAmJgoJCQkJCQkJZXZlbnQua2V5Q29kZSA9PT0gJC51aS5rZXlDb2RlLkVTQ0FQRSApIHsKCQkJCQkJdGhhdC5jbG9zZSggZXZlbnQgKTsKCQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCQl9CgkJCQl9KQoJCQkJLm1vdXNlZG93bihmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkJdGhhdC5tb3ZlVG9Ub3AoIGZhbHNlLCBldmVudCApOwoJCQkJfSkKCQkJCS5hcHBlbmRUbyggImJvZHkiICk7CgoJCQl0aGlzLmVsZW1lbnQKCQkJCS5zaG93KCkKCQkJCS5yZW1vdmVBdHRyKCAidGl0bGUiICkKCQkJCS5hZGRDbGFzcyggInVpLWRpYWxvZy1jb250ZW50IHVpLXdpZGdldC1jb250ZW50IiApCgkJCQkuYXBwZW5kVG8oIHVpRGlhbG9nICk7CgoJCQl1aURpYWxvZ1RpdGxlYmFyID0gKCB0aGlzLnVpRGlhbG9nVGl0bGViYXIgPSAkKCAiPGRpdj4iICkgKQoJCQkJLmFkZENsYXNzKCAidWktZGlhbG9nLXRpdGxlYmFyICB1aS13aWRnZXQtaGVhZGVyICAiICsKCQkJCQkidWktY29ybmVyLWFsbCAgdWktaGVscGVyLWNsZWFyZml4IiApCgkJCQkuYmluZCggIm1vdXNlZG93biIsIGZ1bmN0aW9uKCkgewoJCQkJCS8vIERpYWxvZyBpc24ndCBnZXR0aW5nIGZvY3VzIHdoZW4gZHJhZ2dpbmcgKCM4MDYzKQoJCQkJCXVpRGlhbG9nLmZvY3VzKCk7CgkJCQl9KQoJCQkJLnByZXBlbmRUbyggdWlEaWFsb2cgKTsKCgkJCXVpRGlhbG9nVGl0bGViYXJDbG9zZSA9ICQoICI8YSBocmVmPScjJz48L2E+IiApCgkJCQkuYWRkQ2xhc3MoICJ1aS1kaWFsb2ctdGl0bGViYXItY2xvc2UgIHVpLWNvcm5lci1hbGwiICkKCQkJCS5hdHRyKCAicm9sZSIsICJidXR0b24iICkKCQkJCS5jbGljayhmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCQl0aGF0LmNsb3NlKCBldmVudCApOwoJCQkJfSkKCQkJCS5hcHBlbmRUbyggdWlEaWFsb2dUaXRsZWJhciApOwoKCQkJKCB0aGlzLnVpRGlhbG9nVGl0bGViYXJDbG9zZVRleHQgPSAkKCAiPHNwYW4+IiApICkKCQkJCS5hZGRDbGFzcyggInVpLWljb24gdWktaWNvbi1jbG9zZXRoaWNrIiApCgkJCQkudGV4dCggb3B0aW9ucy5jbG9zZVRleHQgKQoJCQkJLmFwcGVuZFRvKCB1aURpYWxvZ1RpdGxlYmFyQ2xvc2UgKTsKCgkJCXVpRGlhbG9nVGl0bGUgPSAkKCAiPHNwYW4+IiApCgkJCQkudW5pcXVlSWQoKQoJCQkJLmFkZENsYXNzKCAidWktZGlhbG9nLXRpdGxlIiApCgkJCQkuaHRtbCggdGl0bGUgKQoJCQkJLnByZXBlbmRUbyggdWlEaWFsb2dUaXRsZWJhciApOwoKCQkJdWlEaWFsb2dCdXR0b25QYW5lID0gKCB0aGlzLnVpRGlhbG9nQnV0dG9uUGFuZSA9ICQoICI8ZGl2PiIgKSApCgkJCQkuYWRkQ2xhc3MoICJ1aS1kaWFsb2ctYnV0dG9ucGFuZSB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXgiICk7CgoJCQkoIHRoaXMudWlCdXR0b25TZXQgPSAkKCAiPGRpdj4iICkgKQoJCQkJLmFkZENsYXNzKCAidWktZGlhbG9nLWJ1dHRvbnNldCIgKQoJCQkJLmFwcGVuZFRvKCB1aURpYWxvZ0J1dHRvblBhbmUgKTsKCgkJdWlEaWFsb2cuYXR0cih7CgkJCXJvbGU6ICJkaWFsb2ciLAoJCQkiYXJpYS1sYWJlbGxlZGJ5IjogdWlEaWFsb2dUaXRsZS5hdHRyKCAiaWQiICkKCQl9KTsKCgkJdWlEaWFsb2dUaXRsZWJhci5maW5kKCAiKiIgKS5hZGQoIHVpRGlhbG9nVGl0bGViYXIgKS5kaXNhYmxlU2VsZWN0aW9uKCk7CgkJdGhpcy5faG92ZXJhYmxlKCB1aURpYWxvZ1RpdGxlYmFyQ2xvc2UgKTsKCQl0aGlzLl9mb2N1c2FibGUoIHVpRGlhbG9nVGl0bGViYXJDbG9zZSApOwoKCQlpZiAoIG9wdGlvbnMuZHJhZ2dhYmxlICYmICQuZm4uZHJhZ2dhYmxlICkgewoJCQl0aGlzLl9tYWtlRHJhZ2dhYmxlKCk7CgkJfQoJCWlmICggb3B0aW9ucy5yZXNpemFibGUgJiYgJC5mbi5yZXNpemFibGUgKSB7CgkJCXRoaXMuX21ha2VSZXNpemFibGUoKTsKCQl9CgoJCXRoaXMuX2NyZWF0ZUJ1dHRvbnMoIG9wdGlvbnMuYnV0dG9ucyApOwoJCXRoaXMuX2lzT3BlbiA9IGZhbHNlOwoKCQlpZiAoICQuZm4uYmdpZnJhbWUgKSB7CgkJCXVpRGlhbG9nLmJnaWZyYW1lKCk7CgkJfQoKCQkvLyBwcmV2ZW50IHRhYmJpbmcgb3V0IG9mIG1vZGFsIGRpYWxvZ3MKCQl0aGlzLl9vbiggdWlEaWFsb2csIHsga2V5ZG93bjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQlpZiAoICFvcHRpb25zLm1vZGFsIHx8IGV2ZW50LmtleUNvZGUgIT09ICQudWkua2V5Q29kZS5UQUIgKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCXZhciB0YWJiYWJsZXMgPSAkKCAiOnRhYmJhYmxlIiwgdWlEaWFsb2cgKSwKCQkJCWZpcnN0ID0gdGFiYmFibGVzLmZpbHRlciggIjpmaXJzdCIgKSwKCQkJCWxhc3QgID0gdGFiYmFibGVzLmZpbHRlciggIjpsYXN0IiApOwoKCQkJaWYgKCBldmVudC50YXJnZXQgPT09IGxhc3RbMF0gJiYgIWV2ZW50LnNoaWZ0S2V5ICkgewoJCQkJZmlyc3QuZm9jdXMoIDEgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfSBlbHNlIGlmICggZXZlbnQudGFyZ2V0ID09PSBmaXJzdFswXSAmJiBldmVudC5zaGlmdEtleSApIHsKCQkJCWxhc3QuZm9jdXMoIDEgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX19KTsKCX0sCgoJX2luaXQ6IGZ1bmN0aW9uKCkgewoJCWlmICggdGhpcy5vcHRpb25zLmF1dG9PcGVuICkgewoJCQl0aGlzLm9wZW4oKTsKCQl9Cgl9LAoKCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCQl2YXIgbmV4dCwKCQkJb2xkUG9zaXRpb24gPSB0aGlzLm9sZFBvc2l0aW9uOwoKCQlpZiAoIHRoaXMub3ZlcmxheSApIHsKCQkJdGhpcy5vdmVybGF5LmRlc3Ryb3koKTsKCQl9CgkJdGhpcy51aURpYWxvZy5oaWRlKCk7CgkJdGhpcy5lbGVtZW50CgkJCS5yZW1vdmVDbGFzcyggInVpLWRpYWxvZy1jb250ZW50IHVpLXdpZGdldC1jb250ZW50IiApCgkJCS5oaWRlKCkKCQkJLmFwcGVuZFRvKCAiYm9keSIgKTsKCQl0aGlzLnVpRGlhbG9nLnJlbW92ZSgpOwoKCQlpZiAoIHRoaXMub3JpZ2luYWxUaXRsZSApIHsKCQkJdGhpcy5lbGVtZW50LmF0dHIoICJ0aXRsZSIsIHRoaXMub3JpZ2luYWxUaXRsZSApOwoJCX0KCgkJbmV4dCA9IG9sZFBvc2l0aW9uLnBhcmVudC5jaGlsZHJlbigpLmVxKCBvbGRQb3NpdGlvbi5pbmRleCApOwoJCS8vIERvbid0IHRyeSB0byBwbGFjZSB0aGUgZGlhbG9nIG5leHQgdG8gaXRzZWxmICgjODYxMykKCQlpZiAoIG5leHQubGVuZ3RoICYmIG5leHRbIDAgXSAhPT0gdGhpcy5lbGVtZW50WyAwIF0gKSB7CgkJCW5leHQuYmVmb3JlKCB0aGlzLmVsZW1lbnQgKTsKCQl9IGVsc2UgewoJCQlvbGRQb3NpdGlvbi5wYXJlbnQuYXBwZW5kKCB0aGlzLmVsZW1lbnQgKTsKCQl9Cgl9LAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMudWlEaWFsb2c7Cgl9LAoKCWNsb3NlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdmFyIHRoYXQgPSB0aGlzLAoJCQltYXhaLCB0aGlzWjsKCgkJaWYgKCAhdGhpcy5faXNPcGVuICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIGZhbHNlID09PSB0aGlzLl90cmlnZ2VyKCAiYmVmb3JlQ2xvc2UiLCBldmVudCApICkgewoJCQlyZXR1cm47CgkJfQoKCQl0aGlzLl9pc09wZW4gPSBmYWxzZTsKCgkJaWYgKCB0aGlzLm92ZXJsYXkgKSB7CgkJCXRoaXMub3ZlcmxheS5kZXN0cm95KCk7CgkJfQoKCQlpZiAoIHRoaXMub3B0aW9ucy5oaWRlICkgewoJCQl0aGlzLl9oaWRlKCB0aGlzLnVpRGlhbG9nLCB0aGlzLm9wdGlvbnMuaGlkZSwgZnVuY3Rpb24oKSB7CgkJCQl0aGF0Ll90cmlnZ2VyKCAiY2xvc2UiLCBldmVudCApOwoJCQl9KTsKCQl9IGVsc2UgewoJCQl0aGlzLnVpRGlhbG9nLmhpZGUoKTsKCQkJdGhpcy5fdHJpZ2dlciggImNsb3NlIiwgZXZlbnQgKTsKCQl9CgoJCSQudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKCk7CgoJCS8vIGFkanVzdCB0aGUgbWF4WiB0byBhbGxvdyBvdGhlciBtb2RhbCBkaWFsb2dzIHRvIGNvbnRpbnVlIHRvIHdvcmsgKHNlZSAjNDMwOSkKCQlpZiAoIHRoaXMub3B0aW9ucy5tb2RhbCApIHsKCQkJbWF4WiA9IDA7CgkJCSQoICIudWktZGlhbG9nIiApLmVhY2goZnVuY3Rpb24oKSB7CgkJCQlpZiAoIHRoaXMgIT09IHRoYXQudWlEaWFsb2dbMF0gKSB7CgkJCQkJdGhpc1ogPSAkKCB0aGlzICkuY3NzKCAiei1pbmRleCIgKTsKCQkJCQlpZiAoICFpc05hTiggdGhpc1ogKSApIHsKCQkJCQkJbWF4WiA9IE1hdGgubWF4KCBtYXhaLCB0aGlzWiApOwoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJCSQudWkuZGlhbG9nLm1heFogPSBtYXhaOwoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWlzT3BlbjogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX2lzT3BlbjsKCX0sCgoJLy8gdGhlIGZvcmNlIHBhcmFtZXRlciBhbGxvd3MgdXMgdG8gbW92ZSBtb2RhbCBkaWFsb2dzIHRvIHRoZWlyIGNvcnJlY3QKCS8vIHBvc2l0aW9uIG9uIG9wZW4KCW1vdmVUb1RvcDogZnVuY3Rpb24oIGZvcmNlLCBldmVudCApIHsKCQl2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywKCQkJc2F2ZVNjcm9sbDsKCgkJaWYgKCAoIG9wdGlvbnMubW9kYWwgJiYgIWZvcmNlICkgfHwKCQkJCSggIW9wdGlvbnMuc3RhY2sgJiYgIW9wdGlvbnMubW9kYWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuX3RyaWdnZXIoICJmb2N1cyIsIGV2ZW50ICk7CgkJfQoKCQlpZiAoIG9wdGlvbnMuekluZGV4ID4gJC51aS5kaWFsb2cubWF4WiApIHsKCQkJJC51aS5kaWFsb2cubWF4WiA9IG9wdGlvbnMuekluZGV4OwoJCX0KCQlpZiAoIHRoaXMub3ZlcmxheSApIHsKCQkJJC51aS5kaWFsb2cubWF4WiArPSAxOwoJCQkkLnVpLmRpYWxvZy5vdmVybGF5Lm1heFogPSAkLnVpLmRpYWxvZy5tYXhaOwoJCQl0aGlzLm92ZXJsYXkuJGVsLmNzcyggInotaW5kZXgiLCAkLnVpLmRpYWxvZy5vdmVybGF5Lm1heFogKTsKCQl9CgoJCS8vIFNhdmUgYW5kIHRoZW4gcmVzdG9yZSBzY3JvbGwKCQkvLyBPcGVyYSA5LjUrIHJlc2V0cyB3aGVuIHBhcmVudCB6LWluZGV4IGlzIGNoYW5nZWQuCgkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5dWkuY29tL3RpY2tldC8zMTkzCgkJc2F2ZVNjcm9sbCA9IHsKCQkJc2Nyb2xsVG9wOiB0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wKCksCgkJCXNjcm9sbExlZnQ6IHRoaXMuZWxlbWVudC5zY3JvbGxMZWZ0KCkKCQl9OwoJCSQudWkuZGlhbG9nLm1heFogKz0gMTsKCQl0aGlzLnVpRGlhbG9nLmNzcyggInotaW5kZXgiLCAkLnVpLmRpYWxvZy5tYXhaICk7CgkJdGhpcy5lbGVtZW50LmF0dHIoIHNhdmVTY3JvbGwgKTsKCQl0aGlzLl90cmlnZ2VyKCAiZm9jdXMiLCBldmVudCApOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJb3BlbjogZnVuY3Rpb24oKSB7CgkJaWYgKCB0aGlzLl9pc09wZW4gKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciBoYXNGb2N1cywKCQkJb3B0aW9ucyA9IHRoaXMub3B0aW9ucywKCQkJdWlEaWFsb2cgPSB0aGlzLnVpRGlhbG9nOwoKCQl0aGlzLl9zaXplKCk7CgkJdGhpcy5fcG9zaXRpb24oIG9wdGlvbnMucG9zaXRpb24gKTsKCQl1aURpYWxvZy5zaG93KCBvcHRpb25zLnNob3cgKTsKCQl0aGlzLm92ZXJsYXkgPSBvcHRpb25zLm1vZGFsID8gbmV3ICQudWkuZGlhbG9nLm92ZXJsYXkoIHRoaXMgKSA6IG51bGw7CgkJdGhpcy5tb3ZlVG9Ub3AoIHRydWUgKTsKCgkJLy8gc2V0IGZvY3VzIHRvIHRoZSBmaXJzdCB0YWJiYWJsZSBlbGVtZW50IGluIHRoZSBjb250ZW50IGFyZWEgb3IgdGhlIGZpcnN0IGJ1dHRvbgoJCS8vIGlmIHRoZXJlIGFyZSBubyB0YWJiYWJsZSBlbGVtZW50cywgc2V0IGZvY3VzIG9uIHRoZSBkaWFsb2cgaXRzZWxmCgkJaGFzRm9jdXMgPSB0aGlzLmVsZW1lbnQuZmluZCggIjp0YWJiYWJsZSIgKTsKCQlpZiAoICFoYXNGb2N1cy5sZW5ndGggKSB7CgkJCWhhc0ZvY3VzID0gdGhpcy51aURpYWxvZ0J1dHRvblBhbmUuZmluZCggIjp0YWJiYWJsZSIgKTsKCQkJaWYgKCAhaGFzRm9jdXMubGVuZ3RoICkgewoJCQkJaGFzRm9jdXMgPSB1aURpYWxvZzsKCQkJfQoJCX0KCQloYXNGb2N1cy5lcSggMCApLmZvY3VzKCk7CgoJCXRoaXMuX2lzT3BlbiA9IHRydWU7CgkJdGhpcy5fdHJpZ2dlciggIm9wZW4iICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCglfY3JlYXRlQnV0dG9uczogZnVuY3Rpb24oIGJ1dHRvbnMgKSB7CgkJdmFyIHRoYXQgPSB0aGlzLAoJCQloYXNCdXR0b25zID0gZmFsc2U7CgoJCS8vIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGJ1dHRvbiBwYW5lLCByZW1vdmUgaXQKCQl0aGlzLnVpRGlhbG9nQnV0dG9uUGFuZS5yZW1vdmUoKTsKCQl0aGlzLnVpQnV0dG9uU2V0LmVtcHR5KCk7CgoJCWlmICggdHlwZW9mIGJ1dHRvbnMgPT09ICJvYmplY3QiICYmIGJ1dHRvbnMgIT09IG51bGwgKSB7CgkJCSQuZWFjaCggYnV0dG9ucywgZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gIShoYXNCdXR0b25zID0gdHJ1ZSk7CgkJCX0pOwoJCX0KCQlpZiAoIGhhc0J1dHRvbnMgKSB7CgkJCSQuZWFjaCggYnV0dG9ucywgZnVuY3Rpb24oIG5hbWUsIHByb3BzICkgewoJCQkJdmFyIGJ1dHRvbiwgY2xpY2s7CgkJCQlwcm9wcyA9ICQuaXNGdW5jdGlvbiggcHJvcHMgKSA/CgkJCQkJeyBjbGljazogcHJvcHMsIHRleHQ6IG5hbWUgfSA6CgkJCQkJcHJvcHM7CgkJCQkvLyBEZWZhdWx0IHRvIGEgbm9uLXN1Ym1pdHRpbmcgYnV0dG9uCgkJCQlwcm9wcyA9ICQuZXh0ZW5kKCB7IHR5cGU6ICJidXR0b24iIH0sIHByb3BzICk7CgkJCQkvLyBDaGFuZ2UgdGhlIGNvbnRleHQgZm9yIHRoZSBjbGljayBjYWxsYmFjayB0byBiZSB0aGUgbWFpbiBlbGVtZW50CgkJCQljbGljayA9IHByb3BzLmNsaWNrOwoJCQkJcHJvcHMuY2xpY2sgPSBmdW5jdGlvbigpIHsKCQkJCQljbGljay5hcHBseSggdGhhdC5lbGVtZW50WzBdLCBhcmd1bWVudHMgKTsKCQkJCX07CgkJCQlidXR0b24gPSAkKCAiPGJ1dHRvbj48L2J1dHRvbj4iLCBwcm9wcyApCgkJCQkJLmFwcGVuZFRvKCB0aGF0LnVpQnV0dG9uU2V0ICk7CgkJCQlpZiAoICQuZm4uYnV0dG9uICkgewoJCQkJCWJ1dHRvbi5idXR0b24oKTsKCQkJCX0KCQkJfSk7CgkJCXRoaXMudWlEaWFsb2cuYWRkQ2xhc3MoICJ1aS1kaWFsb2ctYnV0dG9ucyIgKTsKCQkJdGhpcy51aURpYWxvZ0J1dHRvblBhbmUuYXBwZW5kVG8oIHRoaXMudWlEaWFsb2cgKTsKCQl9IGVsc2UgewoJCQl0aGlzLnVpRGlhbG9nLnJlbW92ZUNsYXNzKCAidWktZGlhbG9nLWJ1dHRvbnMiICk7CgkJfQoJfSwKCglfbWFrZURyYWdnYWJsZTogZnVuY3Rpb24oKSB7CgkJdmFyIHRoYXQgPSB0aGlzLAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zOwoKCQlmdW5jdGlvbiBmaWx0ZXJlZFVpKCB1aSApIHsKCQkJcmV0dXJuIHsKCQkJCXBvc2l0aW9uOiB1aS5wb3NpdGlvbiwKCQkJCW9mZnNldDogdWkub2Zmc2V0CgkJCX07CgkJfQoKCQl0aGlzLnVpRGlhbG9nLmRyYWdnYWJsZSh7CgkJCWNhbmNlbDogIi51aS1kaWFsb2ctY29udGVudCwgLnVpLWRpYWxvZy10aXRsZWJhci1jbG9zZSIsCgkJCWhhbmRsZTogIi51aS1kaWFsb2ctdGl0bGViYXIiLAoJCQljb250YWlubWVudDogImRvY3VtZW50IiwKCQkJc3RhcnQ6IGZ1bmN0aW9uKCBldmVudCwgdWkgKSB7CgkJCQkkKCB0aGlzICkKCQkJCQkuYWRkQ2xhc3MoICJ1aS1kaWFsb2ctZHJhZ2dpbmciICk7CgkJCQl0aGF0Ll90cmlnZ2VyKCAiZHJhZ1N0YXJ0IiwgZXZlbnQsIGZpbHRlcmVkVWkoIHVpICkgKTsKCQkJfSwKCQkJZHJhZzogZnVuY3Rpb24oIGV2ZW50LCB1aSApIHsKCQkJCXRoYXQuX3RyaWdnZXIoICJkcmFnIiwgZXZlbnQsIGZpbHRlcmVkVWkoIHVpICkgKTsKCQkJfSwKCQkJc3RvcDogZnVuY3Rpb24oIGV2ZW50LCB1aSApIHsKCQkJCW9wdGlvbnMucG9zaXRpb24gPSBbCgkJCQkJdWkucG9zaXRpb24ubGVmdCAtIHRoYXQuZG9jdW1lbnQuc2Nyb2xsTGVmdCgpLAoJCQkJCXVpLnBvc2l0aW9uLnRvcCAtIHRoYXQuZG9jdW1lbnQuc2Nyb2xsVG9wKCkKCQkJCV07CgkJCQkkKCB0aGlzICkKCQkJCQkucmVtb3ZlQ2xhc3MoICJ1aS1kaWFsb2ctZHJhZ2dpbmciICk7CgkJCQl0aGF0Ll90cmlnZ2VyKCAiZHJhZ1N0b3AiLCBldmVudCwgZmlsdGVyZWRVaSggdWkgKSApOwoJCQkJJC51aS5kaWFsb2cub3ZlcmxheS5yZXNpemUoKTsKCQkJfQoJCX0pOwoJfSwKCglfbWFrZVJlc2l6YWJsZTogZnVuY3Rpb24oIGhhbmRsZXMgKSB7CgkJaGFuZGxlcyA9IChoYW5kbGVzID09PSB1bmRlZmluZWQgPyB0aGlzLm9wdGlvbnMucmVzaXphYmxlIDogaGFuZGxlcyk7CgkJdmFyIHRoYXQgPSB0aGlzLAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zLAoJCQkvLyAudWktcmVzaXphYmxlIGhhcyBwb3NpdGlvbjogcmVsYXRpdmUgZGVmaW5lZCBpbiB0aGUgc3R5bGVzaGVldAoJCQkvLyBidXQgZGlhbG9ncyBoYXZlIHRvIHVzZSBhYnNvbHV0ZSBvciBmaXhlZCBwb3NpdGlvbmluZwoJCQlwb3NpdGlvbiA9IHRoaXMudWlEaWFsb2cuY3NzKCAicG9zaXRpb24iICksCgkJCXJlc2l6ZUhhbmRsZXMgPSB0eXBlb2YgaGFuZGxlcyA9PT0gJ3N0cmluZycgPwoJCQkJaGFuZGxlcwk6CgkJCQkibixlLHMsdyxzZSxzdyxuZSxudyI7CgoJCWZ1bmN0aW9uIGZpbHRlcmVkVWkoIHVpICkgewoJCQlyZXR1cm4gewoJCQkJb3JpZ2luYWxQb3NpdGlvbjogdWkub3JpZ2luYWxQb3NpdGlvbiwKCQkJCW9yaWdpbmFsU2l6ZTogdWkub3JpZ2luYWxTaXplLAoJCQkJcG9zaXRpb246IHVpLnBvc2l0aW9uLAoJCQkJc2l6ZTogdWkuc2l6ZQoJCQl9OwoJCX0KCgkJdGhpcy51aURpYWxvZy5yZXNpemFibGUoewoJCQljYW5jZWw6ICIudWktZGlhbG9nLWNvbnRlbnQiLAoJCQljb250YWlubWVudDogImRvY3VtZW50IiwKCQkJYWxzb1Jlc2l6ZTogdGhpcy5lbGVtZW50LAoJCQltYXhXaWR0aDogb3B0aW9ucy5tYXhXaWR0aCwKCQkJbWF4SGVpZ2h0OiBvcHRpb25zLm1heEhlaWdodCwKCQkJbWluV2lkdGg6IG9wdGlvbnMubWluV2lkdGgsCgkJCW1pbkhlaWdodDogdGhpcy5fbWluSGVpZ2h0KCksCgkJCWhhbmRsZXM6IHJlc2l6ZUhhbmRsZXMsCgkJCXN0YXJ0OiBmdW5jdGlvbiggZXZlbnQsIHVpICkgewoJCQkJJCggdGhpcyApLmFkZENsYXNzKCAidWktZGlhbG9nLXJlc2l6aW5nIiApOwoJCQkJdGhhdC5fdHJpZ2dlciggInJlc2l6ZVN0YXJ0IiwgZXZlbnQsIGZpbHRlcmVkVWkoIHVpICkgKTsKCQkJfSwKCQkJcmVzaXplOiBmdW5jdGlvbiggZXZlbnQsIHVpICkgewoJCQkJdGhhdC5fdHJpZ2dlciggInJlc2l6ZSIsIGV2ZW50LCBmaWx0ZXJlZFVpKCB1aSApICk7CgkJCX0sCgkJCXN0b3A6IGZ1bmN0aW9uKCBldmVudCwgdWkgKSB7CgkJCQkkKCB0aGlzICkucmVtb3ZlQ2xhc3MoICJ1aS1kaWFsb2ctcmVzaXppbmciICk7CgkJCQlvcHRpb25zLmhlaWdodCA9ICQoIHRoaXMgKS5oZWlnaHQoKTsKCQkJCW9wdGlvbnMud2lkdGggPSAkKCB0aGlzICkud2lkdGgoKTsKCQkJCXRoYXQuX3RyaWdnZXIoICJyZXNpemVTdG9wIiwgZXZlbnQsIGZpbHRlcmVkVWkoIHVpICkgKTsKCQkJCSQudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKCk7CgkJCX0KCQl9KQoJCS5jc3MoICJwb3NpdGlvbiIsIHBvc2l0aW9uICkKCQkuZmluZCggIi51aS1yZXNpemFibGUtc2UiICkKCQkJLmFkZENsYXNzKCAidWktaWNvbiB1aS1pY29uLWdyaXAtZGlhZ29uYWwtc2UiICk7Cgl9LAoKCV9taW5IZWlnaHQ6IGZ1bmN0aW9uKCkgewoJCXZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwoKCQlpZiAoIG9wdGlvbnMuaGVpZ2h0ID09PSAiYXV0byIgKSB7CgkJCXJldHVybiBvcHRpb25zLm1pbkhlaWdodDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gTWF0aC5taW4oIG9wdGlvbnMubWluSGVpZ2h0LCBvcHRpb25zLmhlaWdodCApOwoJCX0KCX0sCgoJX3Bvc2l0aW9uOiBmdW5jdGlvbiggcG9zaXRpb24gKSB7CgkJdmFyIG15QXQgPSBbXSwKCQkJb2Zmc2V0ID0gWyAwLCAwIF0sCgkJCWlzVmlzaWJsZTsKCgkJaWYgKCBwb3NpdGlvbiApIHsKCQkJLy8gZGVlcCBleHRlbmRpbmcgY29udmVydHMgYXJyYXlzIHRvIG9iamVjdHMgaW4galF1ZXJ5IDw9IDEuMy4yIDotKAoJLy8JCWlmICh0eXBlb2YgcG9zaXRpb24gPT0gJ3N0cmluZycgfHwgJC5pc0FycmF5KHBvc2l0aW9uKSkgewoJLy8JCQlteUF0ID0gJC5pc0FycmF5KHBvc2l0aW9uKSA/IHBvc2l0aW9uIDogcG9zaXRpb24uc3BsaXQoJyAnKTsKCgkJCWlmICggdHlwZW9mIHBvc2l0aW9uID09PSAic3RyaW5nIiB8fCAodHlwZW9mIHBvc2l0aW9uID09PSAib2JqZWN0IiAmJiAiMCIgaW4gcG9zaXRpb24gKSApIHsKCQkJCW15QXQgPSBwb3NpdGlvbi5zcGxpdCA/IHBvc2l0aW9uLnNwbGl0KCAiICIgKSA6IFsgcG9zaXRpb25bIDAgXSwgcG9zaXRpb25bIDEgXSBdOwoJCQkJaWYgKCBteUF0Lmxlbmd0aCA9PT0gMSApIHsKCQkJCQlteUF0WyAxIF0gPSBteUF0WyAwIF07CgkJCQl9CgoJCQkJJC5lYWNoKCBbICJsZWZ0IiwgInRvcCIgXSwgZnVuY3Rpb24oIGksIG9mZnNldFBvc2l0aW9uICkgewoJCQkJCWlmICggK215QXRbIGkgXSA9PT0gbXlBdFsgaSBdICkgewoJCQkJCQlvZmZzZXRbIGkgXSA9IG15QXRbIGkgXTsKCQkJCQkJbXlBdFsgaSBdID0gb2Zmc2V0UG9zaXRpb247CgkJCQkJfQoJCQkJfSk7CgoJCQkJcG9zaXRpb24gPSB7CgkJCQkJbXk6IG15QXRbMF0gKyAob2Zmc2V0WzBdIDwgMCA/IG9mZnNldFswXSA6ICIrIiArIG9mZnNldFswXSkgKyAiICIgKwoJCQkJCQlteUF0WzFdICsgKG9mZnNldFsxXSA8IDAgPyBvZmZzZXRbMV0gOiAiKyIgKyBvZmZzZXRbMV0pLAoJCQkJCWF0OiBteUF0LmpvaW4oICIgIiApCgkJCQl9OwoJCQl9CgoJCQlwb3NpdGlvbiA9ICQuZXh0ZW5kKCB7fSwgJC51aS5kaWFsb2cucHJvdG90eXBlLm9wdGlvbnMucG9zaXRpb24sIHBvc2l0aW9uICk7CgkJfSBlbHNlIHsKCQkJcG9zaXRpb24gPSAkLnVpLmRpYWxvZy5wcm90b3R5cGUub3B0aW9ucy5wb3NpdGlvbjsKCQl9CgoJCS8vIG5lZWQgdG8gc2hvdyB0aGUgZGlhbG9nIHRvIGdldCB0aGUgYWN0dWFsIG9mZnNldCBpbiB0aGUgcG9zaXRpb24gcGx1Z2luCgkJaXNWaXNpYmxlID0gdGhpcy51aURpYWxvZy5pcyggIjp2aXNpYmxlIiApOwoJCWlmICggIWlzVmlzaWJsZSApIHsKCQkJdGhpcy51aURpYWxvZy5zaG93KCk7CgkJfQoJCXRoaXMudWlEaWFsb2cucG9zaXRpb24oIHBvc2l0aW9uICk7CgkJaWYgKCAhaXNWaXNpYmxlICkgewoJCQl0aGlzLnVpRGlhbG9nLmhpZGUoKTsKCQl9Cgl9LAoKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCXJlc2l6YWJsZU9wdGlvbnMgPSB7fSwKCQkJcmVzaXplID0gZmFsc2U7CgoJCSQuZWFjaCggb3B0aW9ucywgZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJCXRoYXQuX3NldE9wdGlvbigga2V5LCB2YWx1ZSApOwoKCQkJaWYgKCBrZXkgaW4gc2l6ZVJlbGF0ZWRPcHRpb25zICkgewoJCQkJcmVzaXplID0gdHJ1ZTsKCQkJfQoJCQlpZiAoIGtleSBpbiByZXNpemFibGVSZWxhdGVkT3B0aW9ucyApIHsKCQkJCXJlc2l6YWJsZU9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgkJCX0KCQl9KTsKCgkJaWYgKCByZXNpemUgKSB7CgkJCXRoaXMuX3NpemUoKTsKCQl9CgkJaWYgKCB0aGlzLnVpRGlhbG9nLmlzKCAiOmRhdGEocmVzaXphYmxlKSIgKSApIHsKCQkJdGhpcy51aURpYWxvZy5yZXNpemFibGUoICJvcHRpb24iLCByZXNpemFibGVPcHRpb25zICk7CgkJfQoJfSwKCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgaXNEcmFnZ2FibGUsIGlzUmVzaXphYmxlLAoJCQl1aURpYWxvZyA9IHRoaXMudWlEaWFsb2c7CgoJCXN3aXRjaCAoIGtleSApIHsKCQkJY2FzZSAiYnV0dG9ucyI6CgkJCQl0aGlzLl9jcmVhdGVCdXR0b25zKCB2YWx1ZSApOwoJCQkJYnJlYWs7CgkJCWNhc2UgImNsb3NlVGV4dCI6CgkJCQkvLyBlbnN1cmUgdGhhdCB3ZSBhbHdheXMgcGFzcyBhIHN0cmluZwoJCQkJdGhpcy51aURpYWxvZ1RpdGxlYmFyQ2xvc2VUZXh0LnRleHQoICIiICsgdmFsdWUgKTsKCQkJCWJyZWFrOwoJCQljYXNlICJkaWFsb2dDbGFzcyI6CgkJCQl1aURpYWxvZwoJCQkJCS5yZW1vdmVDbGFzcyggdGhpcy5vcHRpb25zLmRpYWxvZ0NsYXNzICkKCQkJCQkuYWRkQ2xhc3MoIHVpRGlhbG9nQ2xhc3NlcyArIHZhbHVlICk7CgkJCQlicmVhazsKCQkJY2FzZSAiZGlzYWJsZWQiOgoJCQkJaWYgKCB2YWx1ZSApIHsKCQkJCQl1aURpYWxvZy5hZGRDbGFzcyggInVpLWRpYWxvZy1kaXNhYmxlZCIgKTsKCQkJCX0gZWxzZSB7CgkJCQkJdWlEaWFsb2cucmVtb3ZlQ2xhc3MoICJ1aS1kaWFsb2ctZGlzYWJsZWQiICk7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSAiZHJhZ2dhYmxlIjoKCQkJCWlzRHJhZ2dhYmxlID0gdWlEaWFsb2cuaXMoICI6ZGF0YShkcmFnZ2FibGUpIiApOwoJCQkJaWYgKCBpc0RyYWdnYWJsZSAmJiAhdmFsdWUgKSB7CgkJCQkJdWlEaWFsb2cuZHJhZ2dhYmxlKCAiZGVzdHJveSIgKTsKCQkJCX0KCgkJCQlpZiAoICFpc0RyYWdnYWJsZSAmJiB2YWx1ZSApIHsKCQkJCQl0aGlzLl9tYWtlRHJhZ2dhYmxlKCk7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSAicG9zaXRpb24iOgoJCQkJdGhpcy5fcG9zaXRpb24oIHZhbHVlICk7CgkJCQlicmVhazsKCQkJY2FzZSAicmVzaXphYmxlIjoKCQkJCS8vIGN1cnJlbnRseSByZXNpemFibGUsIGJlY29taW5nIG5vbi1yZXNpemFibGUKCQkJCWlzUmVzaXphYmxlID0gdWlEaWFsb2cuaXMoICI6ZGF0YShyZXNpemFibGUpIiApOwoJCQkJaWYgKCBpc1Jlc2l6YWJsZSAmJiAhdmFsdWUgKSB7CgkJCQkJdWlEaWFsb2cucmVzaXphYmxlKCAiZGVzdHJveSIgKTsKCQkJCX0KCgkJCQkvLyBjdXJyZW50bHkgcmVzaXphYmxlLCBjaGFuZ2luZyBoYW5kbGVzCgkJCQlpZiAoIGlzUmVzaXphYmxlICYmIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgKSB7CgkJCQkJdWlEaWFsb2cucmVzaXphYmxlKCAib3B0aW9uIiwgImhhbmRsZXMiLCB2YWx1ZSApOwoJCQkJfQoKCQkJCS8vIGN1cnJlbnRseSBub24tcmVzaXphYmxlLCBiZWNvbWluZyByZXNpemFibGUKCQkJCWlmICggIWlzUmVzaXphYmxlICYmIHZhbHVlICE9PSBmYWxzZSApIHsKCQkJCQl0aGlzLl9tYWtlUmVzaXphYmxlKCB2YWx1ZSApOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgInRpdGxlIjoKCQkJCS8vIGNvbnZlcnQgd2hhdGV2ZXIgd2FzIHBhc3NlZCBpbiBvIGEgc3RyaW5nLCBmb3IgaHRtbCgpIHRvIG5vdCB0aHJvdyB1cAoJCQkJJCggIi51aS1kaWFsb2ctdGl0bGUiLCB0aGlzLnVpRGlhbG9nVGl0bGViYXIgKQoJCQkJCS5odG1sKCAiIiArICggdmFsdWUgfHwgIiYjMTYwOyIgKSApOwoJCQkJYnJlYWs7CgkJfQoKCQl0aGlzLl9zdXBlcigga2V5LCB2YWx1ZSApOwoJfSwKCglfc2l6ZTogZnVuY3Rpb24oKSB7CgkJLyogSWYgdGhlIHVzZXIgaGFzIHJlc2l6ZWQgdGhlIGRpYWxvZywgdGhlIC51aS1kaWFsb2cgYW5kIC51aS1kaWFsb2ctY29udGVudAoJCSAqIGRpdnMgd2lsbCBib3RoIGhhdmUgd2lkdGggYW5kIGhlaWdodCBzZXQsIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlbQoJCSAqLwoJCXZhciBub25Db250ZW50SGVpZ2h0LCBtaW5Db250ZW50SGVpZ2h0LCBhdXRvSGVpZ2h0LAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zLAoJCQlpc1Zpc2libGUgPSB0aGlzLnVpRGlhbG9nLmlzKCAiOnZpc2libGUiICk7CgoJCS8vIHJlc2V0IGNvbnRlbnQgc2l6aW5nCgkJdGhpcy5lbGVtZW50LnNob3coKS5jc3MoewoJCQl3aWR0aDogImF1dG8iLAoJCQltaW5IZWlnaHQ6IDAsCgkJCWhlaWdodDogMAoJCX0pOwoKCQlpZiAoIG9wdGlvbnMubWluV2lkdGggPiBvcHRpb25zLndpZHRoICkgewoJCQlvcHRpb25zLndpZHRoID0gb3B0aW9ucy5taW5XaWR0aDsKCQl9CgoJCS8vIHJlc2V0IHdyYXBwZXIgc2l6aW5nCgkJLy8gZGV0ZXJtaW5lIHRoZSBoZWlnaHQgb2YgYWxsIHRoZSBub24tY29udGVudCBlbGVtZW50cwoJCW5vbkNvbnRlbnRIZWlnaHQgPSB0aGlzLnVpRGlhbG9nLmNzcyh7CgkJCQloZWlnaHQ6ICJhdXRvIiwKCQkJCXdpZHRoOiBvcHRpb25zLndpZHRoCgkJCX0pCgkJCS5vdXRlckhlaWdodCgpOwoJCW1pbkNvbnRlbnRIZWlnaHQgPSBNYXRoLm1heCggMCwgb3B0aW9ucy5taW5IZWlnaHQgLSBub25Db250ZW50SGVpZ2h0ICk7CgoJCWlmICggb3B0aW9ucy5oZWlnaHQgPT09ICJhdXRvIiApIHsKCQkJLy8gb25seSBuZWVkZWQgZm9yIElFNiBzdXBwb3J0CgkJCWlmICggJC5zdXBwb3J0Lm1pbkhlaWdodCApIHsKCQkJCXRoaXMuZWxlbWVudC5jc3MoewoJCQkJCW1pbkhlaWdodDogbWluQ29udGVudEhlaWdodCwKCQkJCQloZWlnaHQ6ICJhdXRvIgoJCQkJfSk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLnVpRGlhbG9nLnNob3coKTsKCQkJCWF1dG9IZWlnaHQgPSB0aGlzLmVsZW1lbnQuY3NzKCAiaGVpZ2h0IiwgImF1dG8iICkuaGVpZ2h0KCk7CgkJCQlpZiAoICFpc1Zpc2libGUgKSB7CgkJCQkJdGhpcy51aURpYWxvZy5oaWRlKCk7CgkJCQl9CgkJCQl0aGlzLmVsZW1lbnQuaGVpZ2h0KCBNYXRoLm1heCggYXV0b0hlaWdodCwgbWluQ29udGVudEhlaWdodCApICk7CgkJCX0KCQl9IGVsc2UgewoJCQl0aGlzLmVsZW1lbnQuaGVpZ2h0KCBNYXRoLm1heCggb3B0aW9ucy5oZWlnaHQgLSBub25Db250ZW50SGVpZ2h0LCAwICkgKTsKCQl9CgoJCWlmICh0aGlzLnVpRGlhbG9nLmlzKCAiOmRhdGEocmVzaXphYmxlKSIgKSApIHsKCQkJdGhpcy51aURpYWxvZy5yZXNpemFibGUoICJvcHRpb24iLCAibWluSGVpZ2h0IiwgdGhpcy5fbWluSGVpZ2h0KCkgKTsKCQl9Cgl9Cn0pOwoKJC5leHRlbmQoJC51aS5kaWFsb2csIHsKCXV1aWQ6IDAsCgltYXhaOiAwLAoKCWdldFRpdGxlSWQ6IGZ1bmN0aW9uKCRlbCkgewoJCXZhciBpZCA9ICRlbC5hdHRyKCAiaWQiICk7CgkJaWYgKCAhaWQgKSB7CgkJCXRoaXMudXVpZCArPSAxOwoJCQlpZCA9IHRoaXMudXVpZDsKCQl9CgkJcmV0dXJuICJ1aS1kaWFsb2ctdGl0bGUtIiArIGlkOwoJfSwKCglvdmVybGF5OiBmdW5jdGlvbiggZGlhbG9nICkgewoJCXRoaXMuJGVsID0gJC51aS5kaWFsb2cub3ZlcmxheS5jcmVhdGUoIGRpYWxvZyApOwoJfQp9KTsKCiQuZXh0ZW5kKCAkLnVpLmRpYWxvZy5vdmVybGF5LCB7CglpbnN0YW5jZXM6IFtdLAoJLy8gcmV1c2Ugb2xkIGluc3RhbmNlcyBkdWUgdG8gSUUgbWVtb3J5IGxlYWsgd2l0aCBhbHBoYSB0cmFuc3BhcmVuY3kgKHNlZSAjNTE4NSkKCW9sZEluc3RhbmNlczogW10sCgltYXhaOiAwLAoJZXZlbnRzOiAkLm1hcCgKCQkiZm9jdXMsbW91c2Vkb3duLG1vdXNldXAsa2V5ZG93bixrZXlwcmVzcyxjbGljayIuc3BsaXQoICIsIiApLAoJCWZ1bmN0aW9uKCBldmVudCApIHsKCQkJcmV0dXJuIGV2ZW50ICsgIi5kaWFsb2ctb3ZlcmxheSI7CgkJfQoJKS5qb2luKCAiICIgKSwKCWNyZWF0ZTogZnVuY3Rpb24oIGRpYWxvZyApIHsKCQlpZiAoIHRoaXMuaW5zdGFuY2VzLmxlbmd0aCA9PT0gMCApIHsKCQkJLy8gcHJldmVudCB1c2Ugb2YgYW5jaG9ycyBhbmQgaW5wdXRzCgkJCS8vIHdlIHVzZSBhIHNldFRpbWVvdXQgaW4gY2FzZSB0aGUgb3ZlcmxheSBpcyBjcmVhdGVkIGZyb20gYW4KCQkJLy8gZXZlbnQgdGhhdCB3ZSdyZSBnb2luZyB0byBiZSBjYW5jZWxsaW5nIChzZWUgIzI4MDQpCgkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCQkvLyBoYW5kbGUgJChlbCkuZGlhbG9nKCkuZGlhbG9nKCdjbG9zZScpIChzZWUgIzQwNjUpCgkJCQlpZiAoICQudWkuZGlhbG9nLm92ZXJsYXkuaW5zdGFuY2VzLmxlbmd0aCApIHsKCQkJCQkkKCBkb2N1bWVudCApLmJpbmQoICQudWkuZGlhbG9nLm92ZXJsYXkuZXZlbnRzLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkJCS8vIHN0b3AgZXZlbnRzIGlmIHRoZSB6LWluZGV4IG9mIHRoZSB0YXJnZXQgaXMgPCB0aGUgei1pbmRleCBvZiB0aGUgb3ZlcmxheQoJCQkJCQkvLyB3ZSBjYW5ub3QgcmV0dXJuIHRydWUgd2hlbiB3ZSBkb24ndCB3YW50IHRvIGNhbmNlbCB0aGUgZXZlbnQgKCMzNTIzKQoJCQkJCQlpZiAoICQoIGV2ZW50LnRhcmdldCApLnpJbmRleCgpIDwgJC51aS5kaWFsb2cub3ZlcmxheS5tYXhaICkgewoJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQl9CgkJCQkJfSk7CgkJCQl9CgkJCX0sIDEgKTsKCgkJCS8vIGhhbmRsZSB3aW5kb3cgcmVzaXplCgkJCSQoIHdpbmRvdyApLmJpbmQoICJyZXNpemUuZGlhbG9nLW92ZXJsYXkiLCAkLnVpLmRpYWxvZy5vdmVybGF5LnJlc2l6ZSApOwoJCX0KCgkJdmFyICRlbCA9ICggdGhpcy5vbGRJbnN0YW5jZXMucG9wKCkgfHwgJCggIjxkaXY+IiApLmFkZENsYXNzKCAidWktd2lkZ2V0LW92ZXJsYXkiICkgKTsKCgkJLy8gYWxsb3cgY2xvc2luZyBieSBwcmVzc2luZyB0aGUgZXNjYXBlIGtleQoJCSQoIGRvY3VtZW50ICkuYmluZCggImtleWRvd24uZGlhbG9nLW92ZXJsYXkiLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCXZhciBpbnN0YW5jZXMgPSAkLnVpLmRpYWxvZy5vdmVybGF5Lmluc3RhbmNlczsKCQkJLy8gb25seSByZWFjdCB0byB0aGUgZXZlbnQgaWYgd2UncmUgdGhlIHRvcCBvdmVybGF5CgkJCWlmICggaW5zdGFuY2VzLmxlbmd0aCAhPT0gMCAmJiBpbnN0YW5jZXNbIGluc3RhbmNlcy5sZW5ndGggLSAxIF0gPT09ICRlbCAmJgoJCQkJZGlhbG9nLm9wdGlvbnMuY2xvc2VPbkVzY2FwZSAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgJiYgZXZlbnQua2V5Q29kZSAmJgoJCQkJZXZlbnQua2V5Q29kZSA9PT0gJC51aS5rZXlDb2RlLkVTQ0FQRSApIHsKCgkJCQlkaWFsb2cuY2xvc2UoIGV2ZW50ICk7CgkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQl9CgkJfSk7CgoJCSRlbC5hcHBlbmRUbyggZG9jdW1lbnQuYm9keSApLmNzcyh7CgkJCXdpZHRoOiB0aGlzLndpZHRoKCksCgkJCWhlaWdodDogdGhpcy5oZWlnaHQoKQoJCX0pOwoKCQlpZiAoICQuZm4uYmdpZnJhbWUgKSB7CgkJCSRlbC5iZ2lmcmFtZSgpOwoJCX0KCgkJdGhpcy5pbnN0YW5jZXMucHVzaCggJGVsICk7CgkJcmV0dXJuICRlbDsKCX0sCgoJZGVzdHJveTogZnVuY3Rpb24oICRlbCApIHsKCQl2YXIgaW5kZXhPZiA9ICQuaW5BcnJheSggJGVsLCB0aGlzLmluc3RhbmNlcyApLAoJCQltYXhaID0gMDsKCgkJaWYgKCBpbmRleE9mICE9PSAtMSApIHsKCQkJdGhpcy5vbGRJbnN0YW5jZXMucHVzaCggdGhpcy5pbnN0YW5jZXMuc3BsaWNlKCBpbmRleE9mLCAxIClbIDAgXSApOwoJCX0KCgkJaWYgKCB0aGlzLmluc3RhbmNlcy5sZW5ndGggPT09IDAgKSB7CgkJCSQoIFsgZG9jdW1lbnQsIHdpbmRvdyBdICkudW5iaW5kKCAiLmRpYWxvZy1vdmVybGF5IiApOwoJCX0KCgkJJGVsLmhlaWdodCggMCApLndpZHRoKCAwICkucmVtb3ZlKCk7CgoJCS8vIGFkanVzdCB0aGUgbWF4WiB0byBhbGxvdyBvdGhlciBtb2RhbCBkaWFsb2dzIHRvIGNvbnRpbnVlIHRvIHdvcmsgKHNlZSAjNDMwOSkKCQkkLmVhY2goIHRoaXMuaW5zdGFuY2VzLCBmdW5jdGlvbigpIHsKCQkJbWF4WiA9IE1hdGgubWF4KCBtYXhaLCB0aGlzLmNzcyggInotaW5kZXgiICkgKTsKCQl9KTsKCQl0aGlzLm1heFogPSBtYXhaOwoJfSwKCgloZWlnaHQ6IGZ1bmN0aW9uKCkgewoJCXZhciBzY3JvbGxIZWlnaHQsCgkJCW9mZnNldEhlaWdodDsKCQkvLyBoYW5kbGUgSUUKCQlpZiAoICQudWkuaWUgKSB7CgkJCXNjcm9sbEhlaWdodCA9IE1hdGgubWF4KAoJCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwKCQkJCWRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0CgkJCSk7CgkJCW9mZnNldEhlaWdodCA9IE1hdGgubWF4KAoJCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldEhlaWdodCwKCQkJCWRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0CgkJCSk7CgoJCQlpZiAoIHNjcm9sbEhlaWdodCA8IG9mZnNldEhlaWdodCApIHsKCQkJCXJldHVybiAkKCB3aW5kb3cgKS5oZWlnaHQoKSArICJweCI7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gc2Nyb2xsSGVpZ2h0ICsgInB4IjsKCQkJfQoJCS8vIGhhbmRsZSAiZ29vZCIgYnJvd3NlcnMKCQl9IGVsc2UgewoJCQlyZXR1cm4gJCggZG9jdW1lbnQgKS5oZWlnaHQoKSArICJweCI7CgkJfQoJfSwKCgl3aWR0aDogZnVuY3Rpb24oKSB7CgkJdmFyIHNjcm9sbFdpZHRoLAoJCQlvZmZzZXRXaWR0aDsKCQkvLyBoYW5kbGUgSUUKCQlpZiAoICQudWkuaWUgKSB7CgkJCXNjcm9sbFdpZHRoID0gTWF0aC5tYXgoCgkJCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsCgkJCQlkb2N1bWVudC5ib2R5LnNjcm9sbFdpZHRoCgkJCSk7CgkJCW9mZnNldFdpZHRoID0gTWF0aC5tYXgoCgkJCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0V2lkdGgsCgkJCQlkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoCgkJCSk7CgoJCQlpZiAoIHNjcm9sbFdpZHRoIDwgb2Zmc2V0V2lkdGggKSB7CgkJCQlyZXR1cm4gJCggd2luZG93ICkud2lkdGgoKSArICJweCI7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gc2Nyb2xsV2lkdGggKyAicHgiOwoJCQl9CgkJLy8gaGFuZGxlICJnb29kIiBicm93c2VycwoJCX0gZWxzZSB7CgkJCXJldHVybiAkKCBkb2N1bWVudCApLndpZHRoKCkgKyAicHgiOwoJCX0KCX0sCgoJcmVzaXplOiBmdW5jdGlvbigpIHsKCQkvKiBJZiB0aGUgZGlhbG9nIGlzIGRyYWdnYWJsZSBhbmQgdGhlIHVzZXIgZHJhZ3MgaXQgcGFzdCB0aGUKCQkgKiByaWdodCBlZGdlIG9mIHRoZSB3aW5kb3csIHRoZSBkb2N1bWVudCBiZWNvbWVzIHdpZGVyIHNvIHdlCgkJICogbmVlZCB0byBzdHJldGNoIHRoZSBvdmVybGF5LiBJZiB0aGUgdXNlciB0aGVuIGRyYWdzIHRoZQoJCSAqIGRpYWxvZyBiYWNrIHRvIHRoZSBsZWZ0LCB0aGUgZG9jdW1lbnQgd2lsbCBiZWNvbWUgbmFycm93ZXIsCgkJICogc28gd2UgbmVlZCB0byBzaHJpbmsgdGhlIG92ZXJsYXkgdG8gdGhlIGFwcHJvcHJpYXRlIHNpemUuCgkJICogVGhpcyBpcyBoYW5kbGVkIGJ5IHNocmlua2luZyB0aGUgb3ZlcmxheSBiZWZvcmUgc2V0dGluZyBpdAoJCSAqIHRvIHRoZSBmdWxsIGRvY3VtZW50IHNpemUuCgkJICovCgkJdmFyICRvdmVybGF5cyA9ICQoIFtdICk7CgkJJC5lYWNoKCAkLnVpLmRpYWxvZy5vdmVybGF5Lmluc3RhbmNlcywgZnVuY3Rpb24oKSB7CgkJCSRvdmVybGF5cyA9ICRvdmVybGF5cy5hZGQoIHRoaXMgKTsKCQl9KTsKCgkJJG92ZXJsYXlzLmNzcyh7CgkJCXdpZHRoOiAwLAoJCQloZWlnaHQ6IDAKCQl9KS5jc3MoewoJCQl3aWR0aDogJC51aS5kaWFsb2cub3ZlcmxheS53aWR0aCgpLAoJCQloZWlnaHQ6ICQudWkuZGlhbG9nLm92ZXJsYXkuaGVpZ2h0KCkKCQl9KTsKCX0KfSk7CgokLmV4dGVuZCggJC51aS5kaWFsb2cub3ZlcmxheS5wcm90b3R5cGUsIHsKCWRlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCSQudWkuZGlhbG9nLm92ZXJsYXkuZGVzdHJveSggdGhpcy4kZWwgKTsKCX0KfSk7Cgp9KCBqUXVlcnkgKSApOwooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCiQud2lkZ2V0KCJ1aS5kcmFnZ2FibGUiLCAkLnVpLm1vdXNlLCB7Cgl2ZXJzaW9uOiAiMS45LjIiLAoJd2lkZ2V0RXZlbnRQcmVmaXg6ICJkcmFnIiwKCW9wdGlvbnM6IHsKCQlhZGRDbGFzc2VzOiB0cnVlLAoJCWFwcGVuZFRvOiAicGFyZW50IiwKCQlheGlzOiBmYWxzZSwKCQljb25uZWN0VG9Tb3J0YWJsZTogZmFsc2UsCgkJY29udGFpbm1lbnQ6IGZhbHNlLAoJCWN1cnNvcjogImF1dG8iLAoJCWN1cnNvckF0OiBmYWxzZSwKCQlncmlkOiBmYWxzZSwKCQloYW5kbGU6IGZhbHNlLAoJCWhlbHBlcjogIm9yaWdpbmFsIiwKCQlpZnJhbWVGaXg6IGZhbHNlLAoJCW9wYWNpdHk6IGZhbHNlLAoJCXJlZnJlc2hQb3NpdGlvbnM6IGZhbHNlLAoJCXJldmVydDogZmFsc2UsCgkJcmV2ZXJ0RHVyYXRpb246IDUwMCwKCQlzY29wZTogImRlZmF1bHQiLAoJCXNjcm9sbDogdHJ1ZSwKCQlzY3JvbGxTZW5zaXRpdml0eTogMjAsCgkJc2Nyb2xsU3BlZWQ6IDIwLAoJCXNuYXA6IGZhbHNlLAoJCXNuYXBNb2RlOiAiYm90aCIsCgkJc25hcFRvbGVyYW5jZTogMjAsCgkJc3RhY2s6IGZhbHNlLAoJCXpJbmRleDogZmFsc2UKCX0sCglfY3JlYXRlOiBmdW5jdGlvbigpIHsKCgkJaWYgKHRoaXMub3B0aW9ucy5oZWxwZXIgPT0gJ29yaWdpbmFsJyAmJiAhKC9eKD86cnxhfGYpLykudGVzdCh0aGlzLmVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpKSkKCQkJdGhpcy5lbGVtZW50WzBdLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsKCgkJKHRoaXMub3B0aW9ucy5hZGRDbGFzc2VzICYmIHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZHJhZ2dhYmxlIikpOwoJCSh0aGlzLm9wdGlvbnMuZGlzYWJsZWQgJiYgdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUtZGlzYWJsZWQiKSk7CgoJCXRoaXMuX21vdXNlSW5pdCgpOwoKCX0sCgoJX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyggInVpLWRyYWdnYWJsZSB1aS1kcmFnZ2FibGUtZHJhZ2dpbmcgdWktZHJhZ2dhYmxlLWRpc2FibGVkIiApOwoJCXRoaXMuX21vdXNlRGVzdHJveSgpOwoJfSwKCglfbW91c2VDYXB0dXJlOiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgbyA9IHRoaXMub3B0aW9uczsKCgkJLy8gYW1vbmcgb3RoZXJzLCBwcmV2ZW50IGEgZHJhZyBvbiBhIHJlc2l6YWJsZS1oYW5kbGUKCQlpZiAodGhpcy5oZWxwZXIgfHwgby5kaXNhYmxlZCB8fCAkKGV2ZW50LnRhcmdldCkuaXMoJy51aS1yZXNpemFibGUtaGFuZGxlJykpCgkJCXJldHVybiBmYWxzZTsKCgkJLy9RdWl0IGlmIHdlJ3JlIG5vdCBvbiBhIHZhbGlkIGhhbmRsZQoJCXRoaXMuaGFuZGxlID0gdGhpcy5fZ2V0SGFuZGxlKGV2ZW50KTsKCQlpZiAoIXRoaXMuaGFuZGxlKQoJCQlyZXR1cm4gZmFsc2U7CgoJCSQoby5pZnJhbWVGaXggPT09IHRydWUgPyAiaWZyYW1lIiA6IG8uaWZyYW1lRml4KS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkkKCc8ZGl2IGNsYXNzPSJ1aS1kcmFnZ2FibGUtaWZyYW1lRml4IiBzdHlsZT0iYmFja2dyb3VuZDogI2ZmZjsiPjwvZGl2PicpCgkJCS5jc3MoewoJCQkJd2lkdGg6IHRoaXMub2Zmc2V0V2lkdGgrInB4IiwgaGVpZ2h0OiB0aGlzLm9mZnNldEhlaWdodCsicHgiLAoJCQkJcG9zaXRpb246ICJhYnNvbHV0ZSIsIG9wYWNpdHk6ICIwLjAwMSIsIHpJbmRleDogMTAwMAoJCQl9KQoJCQkuY3NzKCQodGhpcykub2Zmc2V0KCkpCgkJCS5hcHBlbmRUbygiYm9keSIpOwoJCX0pOwoKCQlyZXR1cm4gdHJ1ZTsKCgl9LAoKCV9tb3VzZVN0YXJ0OiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgbyA9IHRoaXMub3B0aW9uczsKCgkJLy9DcmVhdGUgYW5kIGFwcGVuZCB0aGUgdmlzaWJsZSBoZWxwZXIKCQl0aGlzLmhlbHBlciA9IHRoaXMuX2NyZWF0ZUhlbHBlcihldmVudCk7CgoJCXRoaXMuaGVscGVyLmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKTsKCgkJLy9DYWNoZSB0aGUgaGVscGVyIHNpemUKCQl0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCk7CgoJCS8vSWYgZGRtYW5hZ2VyIGlzIHVzZWQgZm9yIGRyb3BwYWJsZXMsIHNldCB0aGUgZ2xvYmFsIGRyYWdnYWJsZQoJCWlmKCQudWkuZGRtYW5hZ2VyKQoJCQkkLnVpLmRkbWFuYWdlci5jdXJyZW50ID0gdGhpczsKCgkJLyoKCQkgKiAtIFBvc2l0aW9uIGdlbmVyYXRpb24gLQoJCSAqIFRoaXMgYmxvY2sgZ2VuZXJhdGVzIGV2ZXJ5dGhpbmcgcG9zaXRpb24gcmVsYXRlZCAtIGl0J3MgdGhlIGNvcmUgb2YgZHJhZ2dhYmxlcy4KCQkgKi8KCgkJLy9DYWNoZSB0aGUgbWFyZ2lucyBvZiB0aGUgb3JpZ2luYWwgZWxlbWVudAoJCXRoaXMuX2NhY2hlTWFyZ2lucygpOwoKCQkvL1N0b3JlIHRoZSBoZWxwZXIncyBjc3MgcG9zaXRpb24KCQl0aGlzLmNzc1Bvc2l0aW9uID0gdGhpcy5oZWxwZXIuY3NzKCJwb3NpdGlvbiIpOwoJCXRoaXMuc2Nyb2xsUGFyZW50ID0gdGhpcy5oZWxwZXIuc2Nyb2xsUGFyZW50KCk7CgoJCS8vVGhlIGVsZW1lbnQncyBhYnNvbHV0ZSBwb3NpdGlvbiBvbiB0aGUgcGFnZSBtaW51cyBtYXJnaW5zCgkJdGhpcy5vZmZzZXQgPSB0aGlzLnBvc2l0aW9uQWJzID0gdGhpcy5lbGVtZW50Lm9mZnNldCgpOwoJCXRoaXMub2Zmc2V0ID0gewoJCQl0b3A6IHRoaXMub2Zmc2V0LnRvcCAtIHRoaXMubWFyZ2lucy50b3AsCgkJCWxlZnQ6IHRoaXMub2Zmc2V0LmxlZnQgLSB0aGlzLm1hcmdpbnMubGVmdAoJCX07CgoJCSQuZXh0ZW5kKHRoaXMub2Zmc2V0LCB7CgkJCWNsaWNrOiB7IC8vV2hlcmUgdGhlIGNsaWNrIGhhcHBlbmVkLCByZWxhdGl2ZSB0byB0aGUgZWxlbWVudAoJCQkJbGVmdDogZXZlbnQucGFnZVggLSB0aGlzLm9mZnNldC5sZWZ0LAoJCQkJdG9wOiBldmVudC5wYWdlWSAtIHRoaXMub2Zmc2V0LnRvcAoJCQl9LAoJCQlwYXJlbnQ6IHRoaXMuX2dldFBhcmVudE9mZnNldCgpLAoJCQlyZWxhdGl2ZTogdGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKSAvL1RoaXMgaXMgYSByZWxhdGl2ZSB0byBhYnNvbHV0ZSBwb3NpdGlvbiBtaW51cyB0aGUgYWN0dWFsIHBvc2l0aW9uIGNhbGN1bGF0aW9uIC0gb25seSB1c2VkIGZvciByZWxhdGl2ZSBwb3NpdGlvbmVkIGhlbHBlcgoJCX0pOwoKCQkvL0dlbmVyYXRlIHRoZSBvcmlnaW5hbCBwb3NpdGlvbgoJCXRoaXMub3JpZ2luYWxQb3NpdGlvbiA9IHRoaXMucG9zaXRpb24gPSB0aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKGV2ZW50KTsKCQl0aGlzLm9yaWdpbmFsUGFnZVggPSBldmVudC5wYWdlWDsKCQl0aGlzLm9yaWdpbmFsUGFnZVkgPSBldmVudC5wYWdlWTsKCgkJLy9BZGp1c3QgdGhlIG1vdXNlIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgaGVscGVyIGlmICdjdXJzb3JBdCcgaXMgc3VwcGxpZWQKCQkoby5jdXJzb3JBdCAmJiB0aGlzLl9hZGp1c3RPZmZzZXRGcm9tSGVscGVyKG8uY3Vyc29yQXQpKTsKCgkJLy9TZXQgYSBjb250YWlubWVudCBpZiBnaXZlbiBpbiB0aGUgb3B0aW9ucwoJCWlmKG8uY29udGFpbm1lbnQpCgkJCXRoaXMuX3NldENvbnRhaW5tZW50KCk7CgoJCS8vVHJpZ2dlciBldmVudCArIGNhbGxiYWNrcwoJCWlmKHRoaXMuX3RyaWdnZXIoInN0YXJ0IiwgZXZlbnQpID09PSBmYWxzZSkgewoJCQl0aGlzLl9jbGVhcigpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkvL1JlY2FjaGUgdGhlIGhlbHBlciBzaXplCgkJdGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpOwoKCQkvL1ByZXBhcmUgdGhlIGRyb3BwYWJsZSBvZmZzZXRzCgkJaWYgKCQudWkuZGRtYW5hZ2VyICYmICFvLmRyb3BCZWhhdmlvdXIpCgkJCSQudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsIGV2ZW50KTsKCgoJCXRoaXMuX21vdXNlRHJhZyhldmVudCwgdHJ1ZSk7IC8vRXhlY3V0ZSB0aGUgZHJhZyBvbmNlIC0gdGhpcyBjYXVzZXMgdGhlIGhlbHBlciBub3QgdG8gYmUgdmlzaWJsZSBiZWZvcmUgZ2V0dGluZyBpdHMgY29ycmVjdCBwb3NpdGlvbgoKCQkvL0lmIHRoZSBkZG1hbmFnZXIgaXMgdXNlZCBmb3IgZHJvcHBhYmxlcywgaW5mb3JtIHRoZSBtYW5hZ2VyIHRoYXQgZHJhZ2dpbmcgaGFzIHN0YXJ0ZWQgKHNlZSAjNTAwMykKCQlpZiAoICQudWkuZGRtYW5hZ2VyICkgJC51aS5kZG1hbmFnZXIuZHJhZ1N0YXJ0KHRoaXMsIGV2ZW50KTsKCgkJcmV0dXJuIHRydWU7Cgl9LAoKCV9tb3VzZURyYWc6IGZ1bmN0aW9uKGV2ZW50LCBub1Byb3BhZ2F0aW9uKSB7CgoJCS8vQ29tcHV0ZSB0aGUgaGVscGVycyBwb3NpdGlvbgoJCXRoaXMucG9zaXRpb24gPSB0aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKGV2ZW50KTsKCQl0aGlzLnBvc2l0aW9uQWJzID0gdGhpcy5fY29udmVydFBvc2l0aW9uVG8oImFic29sdXRlIik7CgoJCS8vQ2FsbCBwbHVnaW5zIGFuZCBjYWxsYmFja3MgYW5kIHVzZSB0aGUgcmVzdWx0aW5nIHBvc2l0aW9uIGlmIHNvbWV0aGluZyBpcyByZXR1cm5lZAoJCWlmICghbm9Qcm9wYWdhdGlvbikgewoJCQl2YXIgdWkgPSB0aGlzLl91aUhhc2goKTsKCQkJaWYodGhpcy5fdHJpZ2dlcignZHJhZycsIGV2ZW50LCB1aSkgPT09IGZhbHNlKSB7CgkJCQl0aGlzLl9tb3VzZVVwKHt9KTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQl0aGlzLnBvc2l0aW9uID0gdWkucG9zaXRpb247CgkJfQoKCQlpZighdGhpcy5vcHRpb25zLmF4aXMgfHwgdGhpcy5vcHRpb25zLmF4aXMgIT0gInkiKSB0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0ID0gdGhpcy5wb3NpdGlvbi5sZWZ0KydweCc7CgkJaWYoIXRoaXMub3B0aW9ucy5heGlzIHx8IHRoaXMub3B0aW9ucy5heGlzICE9ICJ4IikgdGhpcy5oZWxwZXJbMF0uc3R5bGUudG9wID0gdGhpcy5wb3NpdGlvbi50b3ArJ3B4JzsKCQlpZigkLnVpLmRkbWFuYWdlcikgJC51aS5kZG1hbmFnZXIuZHJhZyh0aGlzLCBldmVudCk7CgoJCXJldHVybiBmYWxzZTsKCX0sCgoJX21vdXNlU3RvcDogZnVuY3Rpb24oZXZlbnQpIHsKCgkJLy9JZiB3ZSBhcmUgdXNpbmcgZHJvcHBhYmxlcywgaW5mb3JtIHRoZSBtYW5hZ2VyIGFib3V0IHRoZSBkcm9wCgkJdmFyIGRyb3BwZWQgPSBmYWxzZTsKCQlpZiAoJC51aS5kZG1hbmFnZXIgJiYgIXRoaXMub3B0aW9ucy5kcm9wQmVoYXZpb3VyKQoJCQlkcm9wcGVkID0gJC51aS5kZG1hbmFnZXIuZHJvcCh0aGlzLCBldmVudCk7CgoJCS8vaWYgYSBkcm9wIGNvbWVzIGZyb20gb3V0c2lkZSAoYSBzb3J0YWJsZSkKCQlpZih0aGlzLmRyb3BwZWQpIHsKCQkJZHJvcHBlZCA9IHRoaXMuZHJvcHBlZDsKCQkJdGhpcy5kcm9wcGVkID0gZmFsc2U7CgkJfQoKCQkvL2lmIHRoZSBvcmlnaW5hbCBlbGVtZW50IGlzIG5vIGxvbmdlciBpbiB0aGUgRE9NIGRvbid0IGJvdGhlciB0byBjb250aW51ZSAoc2VlICM4MjY5KQoJCXZhciBlbGVtZW50ID0gdGhpcy5lbGVtZW50WzBdLCBlbGVtZW50SW5Eb20gPSBmYWxzZTsKCQl3aGlsZSAoIGVsZW1lbnQgJiYgKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUpICkgewoJCQlpZiAoZWxlbWVudCA9PSBkb2N1bWVudCApIHsKCQkJCWVsZW1lbnRJbkRvbSA9IHRydWU7CgkJCX0KCQl9CgkJaWYgKCAhZWxlbWVudEluRG9tICYmIHRoaXMub3B0aW9ucy5oZWxwZXIgPT09ICJvcmlnaW5hbCIgKQoJCQlyZXR1cm4gZmFsc2U7CgoJCWlmKCh0aGlzLm9wdGlvbnMucmV2ZXJ0ID09ICJpbnZhbGlkIiAmJiAhZHJvcHBlZCkgfHwgKHRoaXMub3B0aW9ucy5yZXZlcnQgPT0gInZhbGlkIiAmJiBkcm9wcGVkKSB8fCB0aGlzLm9wdGlvbnMucmV2ZXJ0ID09PSB0cnVlIHx8ICgkLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnJldmVydCkgJiYgdGhpcy5vcHRpb25zLnJldmVydC5jYWxsKHRoaXMuZWxlbWVudCwgZHJvcHBlZCkpKSB7CgkJCXZhciB0aGF0ID0gdGhpczsKCQkJJCh0aGlzLmhlbHBlcikuYW5pbWF0ZSh0aGlzLm9yaWdpbmFsUG9zaXRpb24sIHBhcnNlSW50KHRoaXMub3B0aW9ucy5yZXZlcnREdXJhdGlvbiwgMTApLCBmdW5jdGlvbigpIHsKCQkJCWlmKHRoYXQuX3RyaWdnZXIoInN0b3AiLCBldmVudCkgIT09IGZhbHNlKSB7CgkJCQkJdGhhdC5fY2xlYXIoKTsKCQkJCX0KCQkJfSk7CgkJfSBlbHNlIHsKCQkJaWYodGhpcy5fdHJpZ2dlcigic3RvcCIsIGV2ZW50KSAhPT0gZmFsc2UpIHsKCQkJCXRoaXMuX2NsZWFyKCk7CgkJCX0KCQl9CgoJCXJldHVybiBmYWxzZTsKCX0sCgoJX21vdXNlVXA6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJLy9SZW1vdmUgZnJhbWUgaGVscGVycwoJCSQoImRpdi51aS1kcmFnZ2FibGUtaWZyYW1lRml4IikuZWFjaChmdW5jdGlvbigpIHsKCQkJdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpOwoJCX0pOwoKCQkvL0lmIHRoZSBkZG1hbmFnZXIgaXMgdXNlZCBmb3IgZHJvcHBhYmxlcywgaW5mb3JtIHRoZSBtYW5hZ2VyIHRoYXQgZHJhZ2dpbmcgaGFzIHN0b3BwZWQgKHNlZSAjNTAwMykKCQlpZiggJC51aS5kZG1hbmFnZXIgKSAkLnVpLmRkbWFuYWdlci5kcmFnU3RvcCh0aGlzLCBldmVudCk7CgoJCXJldHVybiAkLnVpLm1vdXNlLnByb3RvdHlwZS5fbW91c2VVcC5jYWxsKHRoaXMsIGV2ZW50KTsKCX0sCgoJY2FuY2VsOiBmdW5jdGlvbigpIHsKCgkJaWYodGhpcy5oZWxwZXIuaXMoIi51aS1kcmFnZ2FibGUtZHJhZ2dpbmciKSkgewoJCQl0aGlzLl9tb3VzZVVwKHt9KTsKCQl9IGVsc2UgewoJCQl0aGlzLl9jbGVhcigpOwoJCX0KCgkJcmV0dXJuIHRoaXM7CgoJfSwKCglfZ2V0SGFuZGxlOiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgaGFuZGxlID0gIXRoaXMub3B0aW9ucy5oYW5kbGUgfHwgISQodGhpcy5vcHRpb25zLmhhbmRsZSwgdGhpcy5lbGVtZW50KS5sZW5ndGggPyB0cnVlIDogZmFsc2U7CgkJJCh0aGlzLm9wdGlvbnMuaGFuZGxlLCB0aGlzLmVsZW1lbnQpCgkJCS5maW5kKCIqIikKCQkJLmFuZFNlbGYoKQoJCQkuZWFjaChmdW5jdGlvbigpIHsKCQkJCWlmKHRoaXMgPT0gZXZlbnQudGFyZ2V0KSBoYW5kbGUgPSB0cnVlOwoJCQl9KTsKCgkJcmV0dXJuIGhhbmRsZTsKCgl9LAoKCV9jcmVhdGVIZWxwZXI6IGZ1bmN0aW9uKGV2ZW50KSB7CgoJCXZhciBvID0gdGhpcy5vcHRpb25zOwoJCXZhciBoZWxwZXIgPSAkLmlzRnVuY3Rpb24oby5oZWxwZXIpID8gJChvLmhlbHBlci5hcHBseSh0aGlzLmVsZW1lbnRbMF0sIFtldmVudF0pKSA6IChvLmhlbHBlciA9PSAnY2xvbmUnID8gdGhpcy5lbGVtZW50LmNsb25lKCkucmVtb3ZlQXR0cignaWQnKSA6IHRoaXMuZWxlbWVudCk7CgoJCWlmKCFoZWxwZXIucGFyZW50cygnYm9keScpLmxlbmd0aCkKCQkJaGVscGVyLmFwcGVuZFRvKChvLmFwcGVuZFRvID09ICdwYXJlbnQnID8gdGhpcy5lbGVtZW50WzBdLnBhcmVudE5vZGUgOiBvLmFwcGVuZFRvKSk7CgoJCWlmKGhlbHBlclswXSAhPSB0aGlzLmVsZW1lbnRbMF0gJiYgISgvKGZpeGVkfGFic29sdXRlKS8pLnRlc3QoaGVscGVyLmNzcygicG9zaXRpb24iKSkpCgkJCWhlbHBlci5jc3MoInBvc2l0aW9uIiwgImFic29sdXRlIik7CgoJCXJldHVybiBoZWxwZXI7CgoJfSwKCglfYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcjogZnVuY3Rpb24ob2JqKSB7CgkJaWYgKHR5cGVvZiBvYmogPT0gJ3N0cmluZycpIHsKCQkJb2JqID0gb2JqLnNwbGl0KCcgJyk7CgkJfQoJCWlmICgkLmlzQXJyYXkob2JqKSkgewoJCQlvYmogPSB7bGVmdDogK29ialswXSwgdG9wOiArb2JqWzFdIHx8IDB9OwoJCX0KCQlpZiAoJ2xlZnQnIGluIG9iaikgewoJCQl0aGlzLm9mZnNldC5jbGljay5sZWZ0ID0gb2JqLmxlZnQgKyB0aGlzLm1hcmdpbnMubGVmdDsKCQl9CgkJaWYgKCdyaWdodCcgaW4gb2JqKSB7CgkJCXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPSB0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoIC0gb2JqLnJpZ2h0ICsgdGhpcy5tYXJnaW5zLmxlZnQ7CgkJfQoJCWlmICgndG9wJyBpbiBvYmopIHsKCQkJdGhpcy5vZmZzZXQuY2xpY2sudG9wID0gb2JqLnRvcCArIHRoaXMubWFyZ2lucy50b3A7CgkJfQoJCWlmICgnYm90dG9tJyBpbiBvYmopIHsKCQkJdGhpcy5vZmZzZXQuY2xpY2sudG9wID0gdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQgLSBvYmouYm90dG9tICsgdGhpcy5tYXJnaW5zLnRvcDsKCQl9Cgl9LAoKCV9nZXRQYXJlbnRPZmZzZXQ6IGZ1bmN0aW9uKCkgewoKCQkvL0dldCB0aGUgb2Zmc2V0UGFyZW50IGFuZCBjYWNoZSBpdHMgcG9zaXRpb24KCQl0aGlzLm9mZnNldFBhcmVudCA9IHRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpOwoJCXZhciBwbyA9IHRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpOwoKCQkvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gbW9kaWZ5IGEgb2Zmc2V0IGNhbGN1bGF0ZWQgb24gc3RhcnQsIHNpbmNlIHRoZSBmb2xsb3dpbmcgaGFwcGVuZWQ6CgkJLy8gMS4gVGhlIHBvc2l0aW9uIG9mIHRoZSBoZWxwZXIgaXMgYWJzb2x1dGUsIHNvIGl0J3MgcG9zaXRpb24gaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgbmV4dCBwb3NpdGlvbmVkIHBhcmVudAoJCS8vIDIuIFRoZSBhY3R1YWwgb2Zmc2V0IHBhcmVudCBpcyBhIGNoaWxkIG9mIHRoZSBzY3JvbGwgcGFyZW50LCBhbmQgdGhlIHNjcm9sbCBwYXJlbnQgaXNuJ3QgdGhlIGRvY3VtZW50LCB3aGljaCBtZWFucyB0aGF0CgkJLy8gICAgdGhlIHNjcm9sbCBpcyBpbmNsdWRlZCBpbiB0aGUgaW5pdGlhbCBjYWxjdWxhdGlvbiBvZiB0aGUgb2Zmc2V0IG9mIHRoZSBwYXJlbnQsIGFuZCBuZXZlciByZWNhbGN1bGF0ZWQgdXBvbiBkcmFnCgkJaWYodGhpcy5jc3NQb3NpdGlvbiA9PSAnYWJzb2x1dGUnICYmIHRoaXMuc2Nyb2xsUGFyZW50WzBdICE9IGRvY3VtZW50ICYmICQuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sIHRoaXMub2Zmc2V0UGFyZW50WzBdKSkgewoJCQlwby5sZWZ0ICs9IHRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTsKCQkJcG8udG9wICs9IHRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOwoJCX0KCgkJaWYoKHRoaXMub2Zmc2V0UGFyZW50WzBdID09IGRvY3VtZW50LmJvZHkpIC8vVGhpcyBuZWVkcyB0byBiZSBhY3R1YWxseSBkb25lIGZvciBhbGwgYnJvd3NlcnMsIHNpbmNlIHBhZ2VYL3BhZ2VZIGluY2x1ZGVzIHRoaXMgaW5mb3JtYXRpb24KCQl8fCAodGhpcy5vZmZzZXRQYXJlbnRbMF0udGFnTmFtZSAmJiB0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2h0bWwnICYmICQudWkuaWUpKSAvL1VnbHkgSUUgZml4CgkJCXBvID0geyB0b3A6IDAsIGxlZnQ6IDAgfTsKCgkJcmV0dXJuIHsKCQkJdG9wOiBwby50b3AgKyAocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKSB8fCAwKSwKCQkJbGVmdDogcG8ubGVmdCArIChwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKSB8fCAwKQoJCX07CgoJfSwKCglfZ2V0UmVsYXRpdmVPZmZzZXQ6IGZ1bmN0aW9uKCkgewoKCQlpZih0aGlzLmNzc1Bvc2l0aW9uID09ICJyZWxhdGl2ZSIpIHsKCQkJdmFyIHAgPSB0aGlzLmVsZW1lbnQucG9zaXRpb24oKTsKCQkJcmV0dXJuIHsKCQkJCXRvcDogcC50b3AgLSAocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSwxMCkgfHwgMCkgKyB0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSwKCQkJCWxlZnQ6IHAubGVmdCAtIChwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSwxMCkgfHwgMCkgKyB0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCkKCQkJfTsKCQl9IGVsc2UgewoJCQlyZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTsKCQl9CgoJfSwKCglfY2FjaGVNYXJnaW5zOiBmdW5jdGlvbigpIHsKCQl0aGlzLm1hcmdpbnMgPSB7CgkJCWxlZnQ6IChwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5MZWZ0IiksMTApIHx8IDApLAoJCQl0b3A6IChwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5Ub3AiKSwxMCkgfHwgMCksCgkJCXJpZ2h0OiAocGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luUmlnaHQiKSwxMCkgfHwgMCksCgkJCWJvdHRvbTogKHBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpbkJvdHRvbSIpLDEwKSB8fCAwKQoJCX07Cgl9LAoKCV9jYWNoZUhlbHBlclByb3BvcnRpb25zOiBmdW5jdGlvbigpIHsKCQl0aGlzLmhlbHBlclByb3BvcnRpb25zID0gewoJCQl3aWR0aDogdGhpcy5oZWxwZXIub3V0ZXJXaWR0aCgpLAoJCQloZWlnaHQ6IHRoaXMuaGVscGVyLm91dGVySGVpZ2h0KCkKCQl9OwoJfSwKCglfc2V0Q29udGFpbm1lbnQ6IGZ1bmN0aW9uKCkgewoKCQl2YXIgbyA9IHRoaXMub3B0aW9uczsKCQlpZihvLmNvbnRhaW5tZW50ID09ICdwYXJlbnQnKSBvLmNvbnRhaW5tZW50ID0gdGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZTsKCQlpZihvLmNvbnRhaW5tZW50ID09ICdkb2N1bWVudCcgfHwgby5jb250YWlubWVudCA9PSAnd2luZG93JykgdGhpcy5jb250YWlubWVudCA9IFsKCQkJby5jb250YWlubWVudCA9PSAnZG9jdW1lbnQnID8gMCA6ICQod2luZG93KS5zY3JvbGxMZWZ0KCkgLSB0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0IC0gdGhpcy5vZmZzZXQucGFyZW50LmxlZnQsCgkJCW8uY29udGFpbm1lbnQgPT0gJ2RvY3VtZW50JyA/IDAgOiAkKHdpbmRvdykuc2Nyb2xsVG9wKCkgLSB0aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AgLSB0aGlzLm9mZnNldC5wYXJlbnQudG9wLAoJCQkoby5jb250YWlubWVudCA9PSAnZG9jdW1lbnQnID8gMCA6ICQod2luZG93KS5zY3JvbGxMZWZ0KCkpICsgJChvLmNvbnRhaW5tZW50ID09ICdkb2N1bWVudCcgPyBkb2N1bWVudCA6IHdpbmRvdykud2lkdGgoKSAtIHRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGggLSB0aGlzLm1hcmdpbnMubGVmdCwKCQkJKG8uY29udGFpbm1lbnQgPT0gJ2RvY3VtZW50JyA/IDAgOiAkKHdpbmRvdykuc2Nyb2xsVG9wKCkpICsgKCQoby5jb250YWlubWVudCA9PSAnZG9jdW1lbnQnID8gZG9jdW1lbnQgOiB3aW5kb3cpLmhlaWdodCgpIHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpIC0gdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQgLSB0aGlzLm1hcmdpbnMudG9wCgkJXTsKCgkJaWYoISgvXihkb2N1bWVudHx3aW5kb3d8cGFyZW50KSQvKS50ZXN0KG8uY29udGFpbm1lbnQpICYmIG8uY29udGFpbm1lbnQuY29uc3RydWN0b3IgIT0gQXJyYXkpIHsKCQkJdmFyIGMgPSAkKG8uY29udGFpbm1lbnQpOwoJCQl2YXIgY2UgPSBjWzBdOyBpZighY2UpIHJldHVybjsKCQkJdmFyIGNvID0gYy5vZmZzZXQoKTsKCQkJdmFyIG92ZXIgPSAoJChjZSkuY3NzKCJvdmVyZmxvdyIpICE9ICdoaWRkZW4nKTsKCgkJCXRoaXMuY29udGFpbm1lbnQgPSBbCgkJCQkocGFyc2VJbnQoJChjZSkuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCkgfHwgMCkgKyAocGFyc2VJbnQoJChjZSkuY3NzKCJwYWRkaW5nTGVmdCIpLDEwKSB8fCAwKSwKCQkJCShwYXJzZUludCgkKGNlKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApIHx8IDApICsgKHBhcnNlSW50KCQoY2UpLmNzcygicGFkZGluZ1RvcCIpLDEwKSB8fCAwKSwKCQkJCShvdmVyID8gTWF0aC5tYXgoY2Uuc2Nyb2xsV2lkdGgsY2Uub2Zmc2V0V2lkdGgpIDogY2Uub2Zmc2V0V2lkdGgpIC0gKHBhcnNlSW50KCQoY2UpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApIHx8IDApIC0gKHBhcnNlSW50KCQoY2UpLmNzcygicGFkZGluZ1JpZ2h0IiksMTApIHx8IDApIC0gdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCAtIHRoaXMubWFyZ2lucy5sZWZ0IC0gdGhpcy5tYXJnaW5zLnJpZ2h0LAoJCQkJKG92ZXIgPyBNYXRoLm1heChjZS5zY3JvbGxIZWlnaHQsY2Uub2Zmc2V0SGVpZ2h0KSA6IGNlLm9mZnNldEhlaWdodCkgLSAocGFyc2VJbnQoJChjZSkuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKSB8fCAwKSAtIChwYXJzZUludCgkKGNlKS5jc3MoInBhZGRpbmdCb3R0b20iKSwxMCkgfHwgMCkgLSB0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCAtIHRoaXMubWFyZ2lucy50b3AgIC0gdGhpcy5tYXJnaW5zLmJvdHRvbQoJCQldOwoJCQl0aGlzLnJlbGF0aXZlX2NvbnRhaW5lciA9IGM7CgoJCX0gZWxzZSBpZihvLmNvbnRhaW5tZW50LmNvbnN0cnVjdG9yID09IEFycmF5KSB7CgkJCXRoaXMuY29udGFpbm1lbnQgPSBvLmNvbnRhaW5tZW50OwoJCX0KCgl9LAoKCV9jb252ZXJ0UG9zaXRpb25UbzogZnVuY3Rpb24oZCwgcG9zKSB7CgoJCWlmKCFwb3MpIHBvcyA9IHRoaXMucG9zaXRpb247CgkJdmFyIG1vZCA9IGQgPT0gImFic29sdXRlIiA/IDEgOiAtMTsKCQl2YXIgbyA9IHRoaXMub3B0aW9ucywgc2Nyb2xsID0gdGhpcy5jc3NQb3NpdGlvbiA9PSAnYWJzb2x1dGUnICYmICEodGhpcy5zY3JvbGxQYXJlbnRbMF0gIT0gZG9jdW1lbnQgJiYgJC5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSwgdGhpcy5vZmZzZXRQYXJlbnRbMF0pKSA/IHRoaXMub2Zmc2V0UGFyZW50IDogdGhpcy5zY3JvbGxQYXJlbnQsIHNjcm9sbElzUm9vdE5vZGUgPSAoLyhodG1sfGJvZHkpL2kpLnRlc3Qoc2Nyb2xsWzBdLnRhZ05hbWUpOwoKCQlyZXR1cm4gewoJCQl0b3A6ICgKCQkJCXBvcy50b3AJCQkJCQkJCQkJCQkJCQkJCS8vIFRoZSBhYnNvbHV0ZSBtb3VzZSBwb3NpdGlvbgoJCQkJKyB0aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AgKiBtb2QJCQkJCQkJCQkJLy8gT25seSBmb3IgcmVsYXRpdmUgcG9zaXRpb25lZCBub2RlczogUmVsYXRpdmUgb2Zmc2V0IGZyb20gZWxlbWVudCB0byBvZmZzZXQgcGFyZW50CgkJCQkrIHRoaXMub2Zmc2V0LnBhcmVudC50b3AgKiBtb2QJCQkJCQkJCQkJCS8vIFRoZSBvZmZzZXRQYXJlbnQncyBvZmZzZXQgd2l0aG91dCBib3JkZXJzIChvZmZzZXQgKyBib3JkZXIpCgkJCQktICggKCB0aGlzLmNzc1Bvc2l0aW9uID09ICdmaXhlZCcgPyAtdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCkgOiAoIHNjcm9sbElzUm9vdE5vZGUgPyAwIDogc2Nyb2xsLnNjcm9sbFRvcCgpICkgKSAqIG1vZCkKCQkJKSwKCQkJbGVmdDogKAoJCQkJcG9zLmxlZnQJCQkJCQkJCQkJCQkJCQkJLy8gVGhlIGFic29sdXRlIG1vdXNlIHBvc2l0aW9uCgkJCQkrIHRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQgKiBtb2QJCQkJCQkJCQkJLy8gT25seSBmb3IgcmVsYXRpdmUgcG9zaXRpb25lZCBub2RlczogUmVsYXRpdmUgb2Zmc2V0IGZyb20gZWxlbWVudCB0byBvZmZzZXQgcGFyZW50CgkJCQkrIHRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0ICogbW9kCQkJCQkJCQkJCQkvLyBUaGUgb2Zmc2V0UGFyZW50J3Mgb2Zmc2V0IHdpdGhvdXQgYm9yZGVycyAob2Zmc2V0ICsgYm9yZGVyKQoJCQkJLSAoICggdGhpcy5jc3NQb3NpdGlvbiA9PSAnZml4ZWQnID8gLXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSA6IHNjcm9sbElzUm9vdE5vZGUgPyAwIDogc2Nyb2xsLnNjcm9sbExlZnQoKSApICogbW9kKQoJCQkpCgkJfTsKCgl9LAoKCV9nZW5lcmF0ZVBvc2l0aW9uOiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgbyA9IHRoaXMub3B0aW9ucywgc2Nyb2xsID0gdGhpcy5jc3NQb3NpdGlvbiA9PSAnYWJzb2x1dGUnICYmICEodGhpcy5zY3JvbGxQYXJlbnRbMF0gIT0gZG9jdW1lbnQgJiYgJC5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSwgdGhpcy5vZmZzZXRQYXJlbnRbMF0pKSA/IHRoaXMub2Zmc2V0UGFyZW50IDogdGhpcy5zY3JvbGxQYXJlbnQsIHNjcm9sbElzUm9vdE5vZGUgPSAoLyhodG1sfGJvZHkpL2kpLnRlc3Qoc2Nyb2xsWzBdLnRhZ05hbWUpOwoJCXZhciBwYWdlWCA9IGV2ZW50LnBhZ2VYOwoJCXZhciBwYWdlWSA9IGV2ZW50LnBhZ2VZOwoKCQkvKgoJCSAqIC0gUG9zaXRpb24gY29uc3RyYWluaW5nIC0KCQkgKiBDb25zdHJhaW4gdGhlIHBvc2l0aW9uIHRvIGEgbWl4IG9mIGdyaWQsIGNvbnRhaW5tZW50LgoJCSAqLwoKCQlpZih0aGlzLm9yaWdpbmFsUG9zaXRpb24pIHsgLy9JZiB3ZSBhcmUgbm90IGRyYWdnaW5nIHlldCwgd2Ugd29uJ3QgY2hlY2sgZm9yIG9wdGlvbnMKCQkJdmFyIGNvbnRhaW5tZW50OwoJCQlpZih0aGlzLmNvbnRhaW5tZW50KSB7CgkJCWlmICh0aGlzLnJlbGF0aXZlX2NvbnRhaW5lcil7CgkJCQl2YXIgY28gPSB0aGlzLnJlbGF0aXZlX2NvbnRhaW5lci5vZmZzZXQoKTsKCQkJCWNvbnRhaW5tZW50ID0gWyB0aGlzLmNvbnRhaW5tZW50WzBdICsgY28ubGVmdCwKCQkJCQl0aGlzLmNvbnRhaW5tZW50WzFdICsgY28udG9wLAoJCQkJCXRoaXMuY29udGFpbm1lbnRbMl0gKyBjby5sZWZ0LAoJCQkJCXRoaXMuY29udGFpbm1lbnRbM10gKyBjby50b3AgXTsKCQkJfQoJCQllbHNlIHsKCQkJCWNvbnRhaW5tZW50ID0gdGhpcy5jb250YWlubWVudDsKCQkJfQoKCQkJCWlmKGV2ZW50LnBhZ2VYIC0gdGhpcy5vZmZzZXQuY2xpY2subGVmdCA8IGNvbnRhaW5tZW50WzBdKSBwYWdlWCA9IGNvbnRhaW5tZW50WzBdICsgdGhpcy5vZmZzZXQuY2xpY2subGVmdDsKCQkJCWlmKGV2ZW50LnBhZ2VZIC0gdGhpcy5vZmZzZXQuY2xpY2sudG9wIDwgY29udGFpbm1lbnRbMV0pIHBhZ2VZID0gY29udGFpbm1lbnRbMV0gKyB0aGlzLm9mZnNldC5jbGljay50b3A7CgkJCQlpZihldmVudC5wYWdlWCAtIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPiBjb250YWlubWVudFsyXSkgcGFnZVggPSBjb250YWlubWVudFsyXSArIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ7CgkJCQlpZihldmVudC5wYWdlWSAtIHRoaXMub2Zmc2V0LmNsaWNrLnRvcCA+IGNvbnRhaW5tZW50WzNdKSBwYWdlWSA9IGNvbnRhaW5tZW50WzNdICsgdGhpcy5vZmZzZXQuY2xpY2sudG9wOwoJCQl9CgoJCQlpZihvLmdyaWQpIHsKCQkJCS8vQ2hlY2sgZm9yIGdyaWQgZWxlbWVudHMgc2V0IHRvIDAgdG8gcHJldmVudCBkaXZpZGUgYnkgMCBlcnJvciBjYXVzaW5nIGludmFsaWQgYXJndW1lbnQgZXJyb3JzIGluIElFIChzZWUgdGlja2V0ICM2OTUwKQoJCQkJdmFyIHRvcCA9IG8uZ3JpZFsxXSA/IHRoaXMub3JpZ2luYWxQYWdlWSArIE1hdGgucm91bmQoKHBhZ2VZIC0gdGhpcy5vcmlnaW5hbFBhZ2VZKSAvIG8uZ3JpZFsxXSkgKiBvLmdyaWRbMV0gOiB0aGlzLm9yaWdpbmFsUGFnZVk7CgkJCQlwYWdlWSA9IGNvbnRhaW5tZW50ID8gKCEodG9wIC0gdGhpcy5vZmZzZXQuY2xpY2sudG9wIDwgY29udGFpbm1lbnRbMV0gfHwgdG9wIC0gdGhpcy5vZmZzZXQuY2xpY2sudG9wID4gY29udGFpbm1lbnRbM10pID8gdG9wIDogKCEodG9wIC0gdGhpcy5vZmZzZXQuY2xpY2sudG9wIDwgY29udGFpbm1lbnRbMV0pID8gdG9wIC0gby5ncmlkWzFdIDogdG9wICsgby5ncmlkWzFdKSkgOiB0b3A7CgoJCQkJdmFyIGxlZnQgPSBvLmdyaWRbMF0gPyB0aGlzLm9yaWdpbmFsUGFnZVggKyBNYXRoLnJvdW5kKChwYWdlWCAtIHRoaXMub3JpZ2luYWxQYWdlWCkgLyBvLmdyaWRbMF0pICogby5ncmlkWzBdIDogdGhpcy5vcmlnaW5hbFBhZ2VYOwoJCQkJcGFnZVggPSBjb250YWlubWVudCA/ICghKGxlZnQgLSB0aGlzLm9mZnNldC5jbGljay5sZWZ0IDwgY29udGFpbm1lbnRbMF0gfHwgbGVmdCAtIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPiBjb250YWlubWVudFsyXSkgPyBsZWZ0IDogKCEobGVmdCAtIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPCBjb250YWlubWVudFswXSkgPyBsZWZ0IC0gby5ncmlkWzBdIDogbGVmdCArIG8uZ3JpZFswXSkpIDogbGVmdDsKCQkJfQoKCQl9CgoJCXJldHVybiB7CgkJCXRvcDogKAoJCQkJcGFnZVkJCQkJCQkJCQkJCQkJCQkJLy8gVGhlIGFic29sdXRlIG1vdXNlIHBvc2l0aW9uCgkJCQktIHRoaXMub2Zmc2V0LmNsaWNrLnRvcAkJCQkJCQkJCQkJCQkvLyBDbGljayBvZmZzZXQgKHJlbGF0aXZlIHRvIHRoZSBlbGVtZW50KQoJCQkJLSB0aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AJCQkJCQkJCQkJCQkvLyBPbmx5IGZvciByZWxhdGl2ZSBwb3NpdGlvbmVkIG5vZGVzOiBSZWxhdGl2ZSBvZmZzZXQgZnJvbSBlbGVtZW50IHRvIG9mZnNldCBwYXJlbnQKCQkJCS0gdGhpcy5vZmZzZXQucGFyZW50LnRvcAkJCQkJCQkJCQkJCS8vIFRoZSBvZmZzZXRQYXJlbnQncyBvZmZzZXQgd2l0aG91dCBib3JkZXJzIChvZmZzZXQgKyBib3JkZXIpCgkJCQkrICggKCB0aGlzLmNzc1Bvc2l0aW9uID09ICdmaXhlZCcgPyAtdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCkgOiAoIHNjcm9sbElzUm9vdE5vZGUgPyAwIDogc2Nyb2xsLnNjcm9sbFRvcCgpICkgKSkKCQkJKSwKCQkJbGVmdDogKAoJCQkJcGFnZVgJCQkJCQkJCQkJCQkJCQkJLy8gVGhlIGFic29sdXRlIG1vdXNlIHBvc2l0aW9uCgkJCQktIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQJCQkJCQkJCQkJCQkvLyBDbGljayBvZmZzZXQgKHJlbGF0aXZlIHRvIHRoZSBlbGVtZW50KQoJCQkJLSB0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0CQkJCQkJCQkJCQkJLy8gT25seSBmb3IgcmVsYXRpdmUgcG9zaXRpb25lZCBub2RlczogUmVsYXRpdmUgb2Zmc2V0IGZyb20gZWxlbWVudCB0byBvZmZzZXQgcGFyZW50CgkJCQktIHRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0CQkJCQkJCQkJCQkJLy8gVGhlIG9mZnNldFBhcmVudCdzIG9mZnNldCB3aXRob3V0IGJvcmRlcnMgKG9mZnNldCArIGJvcmRlcikKCQkJCSsgKCAoIHRoaXMuY3NzUG9zaXRpb24gPT0gJ2ZpeGVkJyA/IC10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCkgOiBzY3JvbGxJc1Jvb3ROb2RlID8gMCA6IHNjcm9sbC5zY3JvbGxMZWZ0KCkgKSkKCQkJKQoJCX07CgoJfSwKCglfY2xlYXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaGVscGVyLnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKTsKCQlpZih0aGlzLmhlbHBlclswXSAhPSB0aGlzLmVsZW1lbnRbMF0gJiYgIXRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbCkgdGhpcy5oZWxwZXIucmVtb3ZlKCk7CgkJLy9pZigkLnVpLmRkbWFuYWdlcikgJC51aS5kZG1hbmFnZXIuY3VycmVudCA9IG51bGw7CgkJdGhpcy5oZWxwZXIgPSBudWxsOwoJCXRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbCA9IGZhbHNlOwoJfSwKCgkvLyBGcm9tIG5vdyBvbiBidWxrIHN0dWZmIC0gbWFpbmx5IGhlbHBlcnMKCglfdHJpZ2dlcjogZnVuY3Rpb24odHlwZSwgZXZlbnQsIHVpKSB7CgkJdWkgPSB1aSB8fCB0aGlzLl91aUhhc2goKTsKCQkkLnVpLnBsdWdpbi5jYWxsKHRoaXMsIHR5cGUsIFtldmVudCwgdWldKTsKCQlpZih0eXBlID09ICJkcmFnIikgdGhpcy5wb3NpdGlvbkFicyA9IHRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpOyAvL1RoZSBhYnNvbHV0ZSBwb3NpdGlvbiBoYXMgdG8gYmUgcmVjYWxjdWxhdGVkIGFmdGVyIHBsdWdpbnMKCQlyZXR1cm4gJC5XaWRnZXQucHJvdG90eXBlLl90cmlnZ2VyLmNhbGwodGhpcywgdHlwZSwgZXZlbnQsIHVpKTsKCX0sCgoJcGx1Z2luczoge30sCgoJX3VpSGFzaDogZnVuY3Rpb24oZXZlbnQpIHsKCQlyZXR1cm4gewoJCQloZWxwZXI6IHRoaXMuaGVscGVyLAoJCQlwb3NpdGlvbjogdGhpcy5wb3NpdGlvbiwKCQkJb3JpZ2luYWxQb3NpdGlvbjogdGhpcy5vcmlnaW5hbFBvc2l0aW9uLAoJCQlvZmZzZXQ6IHRoaXMucG9zaXRpb25BYnMKCQl9OwoJfQoKfSk7CgokLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsICJjb25uZWN0VG9Tb3J0YWJsZSIsIHsKCXN0YXJ0OiBmdW5jdGlvbihldmVudCwgdWkpIHsKCgkJdmFyIGluc3QgPSAkKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLCBvID0gaW5zdC5vcHRpb25zLAoJCQl1aVNvcnRhYmxlID0gJC5leHRlbmQoe30sIHVpLCB7IGl0ZW06IGluc3QuZWxlbWVudCB9KTsKCQlpbnN0LnNvcnRhYmxlcyA9IFtdOwoJCSQoby5jb25uZWN0VG9Tb3J0YWJsZSkuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIHNvcnRhYmxlID0gJC5kYXRhKHRoaXMsICdzb3J0YWJsZScpOwoJCQlpZiAoc29ydGFibGUgJiYgIXNvcnRhYmxlLm9wdGlvbnMuZGlzYWJsZWQpIHsKCQkJCWluc3Quc29ydGFibGVzLnB1c2goewoJCQkJCWluc3RhbmNlOiBzb3J0YWJsZSwKCQkJCQlzaG91bGRSZXZlcnQ6IHNvcnRhYmxlLm9wdGlvbnMucmV2ZXJ0CgkJCQl9KTsKCQkJCXNvcnRhYmxlLnJlZnJlc2hQb3NpdGlvbnMoKTsJLy8gQ2FsbCB0aGUgc29ydGFibGUncyByZWZyZXNoUG9zaXRpb25zIGF0IGRyYWcgc3RhcnQgdG8gcmVmcmVzaCB0aGUgY29udGFpbmVyQ2FjaGUgc2luY2UgdGhlIHNvcnRhYmxlIGNvbnRhaW5lciBjYWNoZSBpcyB1c2VkIGluIGRyYWcgYW5kIG5lZWRzIHRvIGJlIHVwIHRvIGRhdGUgKHRoaXMgd2lsbCBlbnN1cmUgaXQncyBpbml0aWFsaXNlZCBhcyB3ZWxsIGFzIGJlaW5nIGtlcHQgaW4gc3RlcCB3aXRoIGFueSBjaGFuZ2VzIHRoYXQgbWlnaHQgaGF2ZSBoYXBwZW5lZCBvbiB0aGUgcGFnZSkuCgkJCQlzb3J0YWJsZS5fdHJpZ2dlcigiYWN0aXZhdGUiLCBldmVudCwgdWlTb3J0YWJsZSk7CgkJCX0KCQl9KTsKCgl9LAoJc3RvcDogZnVuY3Rpb24oZXZlbnQsIHVpKSB7CgoJCS8vSWYgd2UgYXJlIHN0aWxsIG92ZXIgdGhlIHNvcnRhYmxlLCB3ZSBmYWtlIHRoZSBzdG9wIGV2ZW50IG9mIHRoZSBzb3J0YWJsZSwgYnV0IGFsc28gcmVtb3ZlIGhlbHBlcgoJCXZhciBpbnN0ID0gJCh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSwKCQkJdWlTb3J0YWJsZSA9ICQuZXh0ZW5kKHt9LCB1aSwgeyBpdGVtOiBpbnN0LmVsZW1lbnQgfSk7CgoJCSQuZWFjaChpbnN0LnNvcnRhYmxlcywgZnVuY3Rpb24oKSB7CgkJCWlmKHRoaXMuaW5zdGFuY2UuaXNPdmVyKSB7CgoJCQkJdGhpcy5pbnN0YW5jZS5pc092ZXIgPSAwOwoKCQkJCWluc3QuY2FuY2VsSGVscGVyUmVtb3ZhbCA9IHRydWU7IC8vRG9uJ3QgcmVtb3ZlIHRoZSBoZWxwZXIgaW4gdGhlIGRyYWdnYWJsZSBpbnN0YW5jZQoJCQkJdGhpcy5pbnN0YW5jZS5jYW5jZWxIZWxwZXJSZW1vdmFsID0gZmFsc2U7IC8vUmVtb3ZlIGl0IGluIHRoZSBzb3J0YWJsZSBpbnN0YW5jZSAoc28gc29ydGFibGUgcGx1Z2lucyBsaWtlIHJldmVydCBzdGlsbCB3b3JrKQoKCQkJCS8vVGhlIHNvcnRhYmxlIHJldmVydCBpcyBzdXBwb3J0ZWQsIGFuZCB3ZSBoYXZlIHRvIHNldCBhIHRlbXBvcmFyeSBkcm9wcGVkIHZhcmlhYmxlIG9uIHRoZSBkcmFnZ2FibGUgdG8gc3VwcG9ydCByZXZlcnQ6ICd2YWxpZC9pbnZhbGlkJwoJCQkJaWYodGhpcy5zaG91bGRSZXZlcnQpIHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXZlcnQgPSB0cnVlOwoKCQkJCS8vVHJpZ2dlciB0aGUgc3RvcCBvZiB0aGUgc29ydGFibGUKCQkJCXRoaXMuaW5zdGFuY2UuX21vdXNlU3RvcChldmVudCk7CgoJCQkJdGhpcy5pbnN0YW5jZS5vcHRpb25zLmhlbHBlciA9IHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5faGVscGVyOwoKCQkJCS8vSWYgdGhlIGhlbHBlciBoYXMgYmVlbiB0aGUgb3JpZ2luYWwgaXRlbSwgcmVzdG9yZSBwcm9wZXJ0aWVzIGluIHRoZSBzb3J0YWJsZQoJCQkJaWYoaW5zdC5vcHRpb25zLmhlbHBlciA9PSAnb3JpZ2luYWwnKQoJCQkJCXRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW0uY3NzKHsgdG9wOiAnYXV0bycsIGxlZnQ6ICdhdXRvJyB9KTsKCgkJCX0gZWxzZSB7CgkJCQl0aGlzLmluc3RhbmNlLmNhbmNlbEhlbHBlclJlbW92YWwgPSBmYWxzZTsgLy9SZW1vdmUgdGhlIGhlbHBlciBpbiB0aGUgc29ydGFibGUgaW5zdGFuY2UKCQkJCXRoaXMuaW5zdGFuY2UuX3RyaWdnZXIoImRlYWN0aXZhdGUiLCBldmVudCwgdWlTb3J0YWJsZSk7CgkJCX0KCgkJfSk7CgoJfSwKCWRyYWc6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewoKCQl2YXIgaW5zdCA9ICQodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksIHRoYXQgPSB0aGlzOwoKCQl2YXIgY2hlY2tQb3MgPSBmdW5jdGlvbihvKSB7CgkJCXZhciBkeUNsaWNrID0gdGhpcy5vZmZzZXQuY2xpY2sudG9wLCBkeENsaWNrID0gdGhpcy5vZmZzZXQuY2xpY2subGVmdDsKCQkJdmFyIGhlbHBlclRvcCA9IHRoaXMucG9zaXRpb25BYnMudG9wLCBoZWxwZXJMZWZ0ID0gdGhpcy5wb3NpdGlvbkFicy5sZWZ0OwoJCQl2YXIgaXRlbUhlaWdodCA9IG8uaGVpZ2h0LCBpdGVtV2lkdGggPSBvLndpZHRoOwoJCQl2YXIgaXRlbVRvcCA9IG8udG9wLCBpdGVtTGVmdCA9IG8ubGVmdDsKCgkJCXJldHVybiAkLnVpLmlzT3ZlcihoZWxwZXJUb3AgKyBkeUNsaWNrLCBoZWxwZXJMZWZ0ICsgZHhDbGljaywgaXRlbVRvcCwgaXRlbUxlZnQsIGl0ZW1IZWlnaHQsIGl0ZW1XaWR0aCk7CgkJfTsKCgkJJC5lYWNoKGluc3Quc29ydGFibGVzLCBmdW5jdGlvbihpKSB7CgoJCQl2YXIgaW5uZXJtb3N0SW50ZXJzZWN0aW5nID0gZmFsc2U7CgkJCXZhciB0aGlzU29ydGFibGUgPSB0aGlzOwoJCQkvL0NvcHkgb3ZlciBzb21lIHZhcmlhYmxlcyB0byBhbGxvdyBjYWxsaW5nIHRoZSBzb3J0YWJsZSdzIG5hdGl2ZSBfaW50ZXJzZWN0c1dpdGgKCQkJdGhpcy5pbnN0YW5jZS5wb3NpdGlvbkFicyA9IGluc3QucG9zaXRpb25BYnM7CgkJCXRoaXMuaW5zdGFuY2UuaGVscGVyUHJvcG9ydGlvbnMgPSBpbnN0LmhlbHBlclByb3BvcnRpb25zOwoJCQl0aGlzLmluc3RhbmNlLm9mZnNldC5jbGljayA9IGluc3Qub2Zmc2V0LmNsaWNrOwoKCQkJaWYodGhpcy5pbnN0YW5jZS5faW50ZXJzZWN0c1dpdGgodGhpcy5pbnN0YW5jZS5jb250YWluZXJDYWNoZSkpIHsKCQkJCWlubmVybW9zdEludGVyc2VjdGluZyA9IHRydWU7CgkJCQkkLmVhY2goaW5zdC5zb3J0YWJsZXMsIGZ1bmN0aW9uICgpIHsKCQkJCQl0aGlzLmluc3RhbmNlLnBvc2l0aW9uQWJzID0gaW5zdC5wb3NpdGlvbkFiczsKCQkJCQl0aGlzLmluc3RhbmNlLmhlbHBlclByb3BvcnRpb25zID0gaW5zdC5oZWxwZXJQcm9wb3J0aW9uczsKCQkJCQl0aGlzLmluc3RhbmNlLm9mZnNldC5jbGljayA9IGluc3Qub2Zmc2V0LmNsaWNrOwoJCQkJCWlmICAodGhpcyAhPSB0aGlzU29ydGFibGUKCQkJCQkJJiYgdGhpcy5pbnN0YW5jZS5faW50ZXJzZWN0c1dpdGgodGhpcy5pbnN0YW5jZS5jb250YWluZXJDYWNoZSkKCQkJCQkJJiYgJC51aS5jb250YWlucyh0aGlzU29ydGFibGUuaW5zdGFuY2UuZWxlbWVudFswXSwgdGhpcy5pbnN0YW5jZS5lbGVtZW50WzBdKSkKCQkJCQkJaW5uZXJtb3N0SW50ZXJzZWN0aW5nID0gZmFsc2U7CgkJCQkJCXJldHVybiBpbm5lcm1vc3RJbnRlcnNlY3Rpbmc7CgkJCQl9KTsKCQkJfQoKCgkJCWlmKGlubmVybW9zdEludGVyc2VjdGluZykgewoJCQkJLy9JZiBpdCBpbnRlcnNlY3RzLCB3ZSB1c2UgYSBsaXR0bGUgaXNPdmVyIHZhcmlhYmxlIGFuZCBzZXQgaXQgb25jZSwgc28gb3VyIG1vdmUtaW4gc3R1ZmYgZ2V0cyBmaXJlZCBvbmx5IG9uY2UKCQkJCWlmKCF0aGlzLmluc3RhbmNlLmlzT3ZlcikgewoKCQkJCQl0aGlzLmluc3RhbmNlLmlzT3ZlciA9IDE7CgkJCQkJLy9Ob3cgd2UgZmFrZSB0aGUgc3RhcnQgb2YgZHJhZ2dpbmcgZm9yIHRoZSBzb3J0YWJsZSBpbnN0YW5jZSwKCQkJCQkvL2J5IGNsb25pbmcgdGhlIGxpc3QgZ3JvdXAgaXRlbSwgYXBwZW5kaW5nIGl0IHRvIHRoZSBzb3J0YWJsZSBhbmQgdXNpbmcgaXQgYXMgaW5zdC5jdXJyZW50SXRlbQoJCQkJCS8vV2UgY2FuIHRoZW4gZmlyZSB0aGUgc3RhcnQgZXZlbnQgb2YgdGhlIHNvcnRhYmxlIHdpdGggb3VyIHBhc3NlZCBicm93c2VyIGV2ZW50LCBhbmQgb3VyIG93biBoZWxwZXIgKHNvIGl0IGRvZXNuJ3QgY3JlYXRlIGEgbmV3IG9uZSkKCQkJCQl0aGlzLmluc3RhbmNlLmN1cnJlbnRJdGVtID0gJCh0aGF0KS5jbG9uZSgpLnJlbW92ZUF0dHIoJ2lkJykuYXBwZW5kVG8odGhpcy5pbnN0YW5jZS5lbGVtZW50KS5kYXRhKCJzb3J0YWJsZS1pdGVtIiwgdHJ1ZSk7CgkJCQkJdGhpcy5pbnN0YW5jZS5vcHRpb25zLl9oZWxwZXIgPSB0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyOyAvL1N0b3JlIGhlbHBlciBvcHRpb24gdG8gbGF0ZXIgcmVzdG9yZSBpdAoJCQkJCXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXIgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHVpLmhlbHBlclswXTsgfTsKCgkJCQkJZXZlbnQudGFyZ2V0ID0gdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbVswXTsKCQkJCQl0aGlzLmluc3RhbmNlLl9tb3VzZUNhcHR1cmUoZXZlbnQsIHRydWUpOwoJCQkJCXRoaXMuaW5zdGFuY2UuX21vdXNlU3RhcnQoZXZlbnQsIHRydWUsIHRydWUpOwoKCQkJCQkvL0JlY2F1c2UgdGhlIGJyb3dzZXIgZXZlbnQgaXMgd2F5IG9mZiB0aGUgbmV3IGFwcGVuZGVkIHBvcnRsZXQsIHdlIG1vZGlmeSBhIGNvdXBsZSBvZiB2YXJpYWJsZXMgdG8gcmVmbGVjdCB0aGUgY2hhbmdlcwoJCQkJCXRoaXMuaW5zdGFuY2Uub2Zmc2V0LmNsaWNrLnRvcCA9IGluc3Qub2Zmc2V0LmNsaWNrLnRvcDsKCQkJCQl0aGlzLmluc3RhbmNlLm9mZnNldC5jbGljay5sZWZ0ID0gaW5zdC5vZmZzZXQuY2xpY2subGVmdDsKCQkJCQl0aGlzLmluc3RhbmNlLm9mZnNldC5wYXJlbnQubGVmdCAtPSBpbnN0Lm9mZnNldC5wYXJlbnQubGVmdCAtIHRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC5sZWZ0OwoJCQkJCXRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC50b3AgLT0gaW5zdC5vZmZzZXQucGFyZW50LnRvcCAtIHRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC50b3A7CgoJCQkJCWluc3QuX3RyaWdnZXIoInRvU29ydGFibGUiLCBldmVudCk7CgkJCQkJaW5zdC5kcm9wcGVkID0gdGhpcy5pbnN0YW5jZS5lbGVtZW50OyAvL2RyYWdnYWJsZSByZXZlcnQgbmVlZHMgdGhhdAoJCQkJCS8vaGFjayBzbyByZWNlaXZlL3VwZGF0ZSBjYWxsYmFja3Mgd29yayAobW9zdGx5KQoJCQkJCWluc3QuY3VycmVudEl0ZW0gPSBpbnN0LmVsZW1lbnQ7CgkJCQkJdGhpcy5pbnN0YW5jZS5mcm9tT3V0c2lkZSA9IGluc3Q7CgoJCQkJfQoKCQkJCS8vUHJvdmlkZWQgd2UgZGlkIGFsbCB0aGUgcHJldmlvdXMgc3RlcHMsIHdlIGNhbiBmaXJlIHRoZSBkcmFnIGV2ZW50IG9mIHRoZSBzb3J0YWJsZSBvbiBldmVyeSBkcmFnZ2FibGUgZHJhZywgd2hlbiBpdCBpbnRlcnNlY3RzIHdpdGggdGhlIHNvcnRhYmxlCgkJCQlpZih0aGlzLmluc3RhbmNlLmN1cnJlbnRJdGVtKSB0aGlzLmluc3RhbmNlLl9tb3VzZURyYWcoZXZlbnQpOwoKCQkJfSBlbHNlIHsKCgkJCQkvL0lmIGl0IGRvZXNuJ3QgaW50ZXJzZWN0IHdpdGggdGhlIHNvcnRhYmxlLCBhbmQgaXQgaW50ZXJzZWN0ZWQgYmVmb3JlLAoJCQkJLy93ZSBmYWtlIHRoZSBkcmFnIHN0b3Agb2YgdGhlIHNvcnRhYmxlLCBidXQgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgcmVtb3ZlIHRoZSBoZWxwZXIgYnkgdXNpbmcgY2FuY2VsSGVscGVyUmVtb3ZhbAoJCQkJaWYodGhpcy5pbnN0YW5jZS5pc092ZXIpIHsKCgkJCQkJdGhpcy5pbnN0YW5jZS5pc092ZXIgPSAwOwoJCQkJCXRoaXMuaW5zdGFuY2UuY2FuY2VsSGVscGVyUmVtb3ZhbCA9IHRydWU7CgoJCQkJCS8vUHJldmVudCByZXZlcnRpbmcgb24gdGhpcyBmb3JjZWQgc3RvcAoJCQkJCXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXZlcnQgPSBmYWxzZTsKCgkJCQkJLy8gVGhlIG91dCBldmVudCBuZWVkcyB0byBiZSB0cmlnZ2VyZWQgaW5kZXBlbmRlbnRseQoJCQkJCXRoaXMuaW5zdGFuY2UuX3RyaWdnZXIoJ291dCcsIGV2ZW50LCB0aGlzLmluc3RhbmNlLl91aUhhc2godGhpcy5pbnN0YW5jZSkpOwoKCQkJCQl0aGlzLmluc3RhbmNlLl9tb3VzZVN0b3AoZXZlbnQsIHRydWUpOwoJCQkJCXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXIgPSB0aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlcjsKCgkJCQkJLy9Ob3cgd2UgcmVtb3ZlIG91ciBjdXJyZW50SXRlbSwgdGhlIGxpc3QgZ3JvdXAgY2xvbmUgYWdhaW4sIGFuZCB0aGUgcGxhY2Vob2xkZXIsIGFuZCBhbmltYXRlIHRoZSBoZWxwZXIgYmFjayB0byBpdCdzIG9yaWdpbmFsIHNpemUKCQkJCQl0aGlzLmluc3RhbmNlLmN1cnJlbnRJdGVtLnJlbW92ZSgpOwoJCQkJCWlmKHRoaXMuaW5zdGFuY2UucGxhY2Vob2xkZXIpIHRoaXMuaW5zdGFuY2UucGxhY2Vob2xkZXIucmVtb3ZlKCk7CgoJCQkJCWluc3QuX3RyaWdnZXIoImZyb21Tb3J0YWJsZSIsIGV2ZW50KTsKCQkJCQlpbnN0LmRyb3BwZWQgPSBmYWxzZTsgLy9kcmFnZ2FibGUgcmV2ZXJ0IG5lZWRzIHRoYXQKCQkJCX0KCgkJCX07CgoJCX0pOwoKCX0KfSk7CgokLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsICJjdXJzb3IiLCB7CglzdGFydDogZnVuY3Rpb24oZXZlbnQsIHVpKSB7CgkJdmFyIHQgPSAkKCdib2R5JyksIG8gPSAkKHRoaXMpLmRhdGEoJ2RyYWdnYWJsZScpLm9wdGlvbnM7CgkJaWYgKHQuY3NzKCJjdXJzb3IiKSkgby5fY3Vyc29yID0gdC5jc3MoImN1cnNvciIpOwoJCXQuY3NzKCJjdXJzb3IiLCBvLmN1cnNvcik7Cgl9LAoJc3RvcDogZnVuY3Rpb24oZXZlbnQsIHVpKSB7CgkJdmFyIG8gPSAkKHRoaXMpLmRhdGEoJ2RyYWdnYWJsZScpLm9wdGlvbnM7CgkJaWYgKG8uX2N1cnNvcikgJCgnYm9keScpLmNzcygiY3Vyc29yIiwgby5fY3Vyc29yKTsKCX0KfSk7CgokLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsICJvcGFjaXR5IiwgewoJc3RhcnQ6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewoJCXZhciB0ID0gJCh1aS5oZWxwZXIpLCBvID0gJCh0aGlzKS5kYXRhKCdkcmFnZ2FibGUnKS5vcHRpb25zOwoJCWlmKHQuY3NzKCJvcGFjaXR5IikpIG8uX29wYWNpdHkgPSB0LmNzcygib3BhY2l0eSIpOwoJCXQuY3NzKCdvcGFjaXR5Jywgby5vcGFjaXR5KTsKCX0sCglzdG9wOiBmdW5jdGlvbihldmVudCwgdWkpIHsKCQl2YXIgbyA9ICQodGhpcykuZGF0YSgnZHJhZ2dhYmxlJykub3B0aW9uczsKCQlpZihvLl9vcGFjaXR5KSAkKHVpLmhlbHBlcikuY3NzKCdvcGFjaXR5Jywgby5fb3BhY2l0eSk7Cgl9Cn0pOwoKJC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCAic2Nyb2xsIiwgewoJc3RhcnQ6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewoJCXZhciBpID0gJCh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKTsKCQlpZihpLnNjcm9sbFBhcmVudFswXSAhPSBkb2N1bWVudCAmJiBpLnNjcm9sbFBhcmVudFswXS50YWdOYW1lICE9ICdIVE1MJykgaS5vdmVyZmxvd09mZnNldCA9IGkuc2Nyb2xsUGFyZW50Lm9mZnNldCgpOwoJfSwKCWRyYWc6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewoKCQl2YXIgaSA9ICQodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksIG8gPSBpLm9wdGlvbnMsIHNjcm9sbGVkID0gZmFsc2U7CgoJCWlmKGkuc2Nyb2xsUGFyZW50WzBdICE9IGRvY3VtZW50ICYmIGkuc2Nyb2xsUGFyZW50WzBdLnRhZ05hbWUgIT0gJ0hUTUwnKSB7CgoJCQlpZighby5heGlzIHx8IG8uYXhpcyAhPSAneCcpIHsKCQkJCWlmKChpLm92ZXJmbG93T2Zmc2V0LnRvcCArIGkuc2Nyb2xsUGFyZW50WzBdLm9mZnNldEhlaWdodCkgLSBldmVudC5wYWdlWSA8IG8uc2Nyb2xsU2Vuc2l0aXZpdHkpCgkJCQkJaS5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wID0gc2Nyb2xsZWQgPSBpLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3AgKyBvLnNjcm9sbFNwZWVkOwoJCQkJZWxzZSBpZihldmVudC5wYWdlWSAtIGkub3ZlcmZsb3dPZmZzZXQudG9wIDwgby5zY3JvbGxTZW5zaXRpdml0eSkKCQkJCQlpLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3AgPSBzY3JvbGxlZCA9IGkuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCAtIG8uc2Nyb2xsU3BlZWQ7CgkJCX0KCgkJCWlmKCFvLmF4aXMgfHwgby5heGlzICE9ICd5JykgewoJCQkJaWYoKGkub3ZlcmZsb3dPZmZzZXQubGVmdCArIGkuc2Nyb2xsUGFyZW50WzBdLm9mZnNldFdpZHRoKSAtIGV2ZW50LnBhZ2VYIDwgby5zY3JvbGxTZW5zaXRpdml0eSkKCQkJCQlpLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0ID0gc2Nyb2xsZWQgPSBpLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0ICsgby5zY3JvbGxTcGVlZDsKCQkJCWVsc2UgaWYoZXZlbnQucGFnZVggLSBpLm92ZXJmbG93T2Zmc2V0LmxlZnQgPCBvLnNjcm9sbFNlbnNpdGl2aXR5KQoJCQkJCWkuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQgPSBzY3JvbGxlZCA9IGkuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQgLSBvLnNjcm9sbFNwZWVkOwoJCQl9CgoJCX0gZWxzZSB7CgoJCQlpZighby5heGlzIHx8IG8uYXhpcyAhPSAneCcpIHsKCQkJCWlmKGV2ZW50LnBhZ2VZIC0gJChkb2N1bWVudCkuc2Nyb2xsVG9wKCkgPCBvLnNjcm9sbFNlbnNpdGl2aXR5KQoJCQkJCXNjcm9sbGVkID0gJChkb2N1bWVudCkuc2Nyb2xsVG9wKCQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpIC0gby5zY3JvbGxTcGVlZCk7CgkJCQllbHNlIGlmKCQod2luZG93KS5oZWlnaHQoKSAtIChldmVudC5wYWdlWSAtICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpKSA8IG8uc2Nyb2xsU2Vuc2l0aXZpdHkpCgkJCQkJc2Nyb2xsZWQgPSAkKGRvY3VtZW50KS5zY3JvbGxUb3AoJChkb2N1bWVudCkuc2Nyb2xsVG9wKCkgKyBvLnNjcm9sbFNwZWVkKTsKCQkJfQoKCQkJaWYoIW8uYXhpcyB8fCBvLmF4aXMgIT0gJ3knKSB7CgkJCQlpZihldmVudC5wYWdlWCAtICQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSA8IG8uc2Nyb2xsU2Vuc2l0aXZpdHkpCgkJCQkJc2Nyb2xsZWQgPSAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSAtIG8uc2Nyb2xsU3BlZWQpOwoJCQkJZWxzZSBpZigkKHdpbmRvdykud2lkdGgoKSAtIChldmVudC5wYWdlWCAtICQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSkgPCBvLnNjcm9sbFNlbnNpdGl2aXR5KQoJCQkJCXNjcm9sbGVkID0gJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkgKyBvLnNjcm9sbFNwZWVkKTsKCQkJfQoKCQl9CgoJCWlmKHNjcm9sbGVkICE9PSBmYWxzZSAmJiAkLnVpLmRkbWFuYWdlciAmJiAhby5kcm9wQmVoYXZpb3VyKQoJCQkkLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyhpLCBldmVudCk7CgoJfQp9KTsKCiQudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwgInNuYXAiLCB7CglzdGFydDogZnVuY3Rpb24oZXZlbnQsIHVpKSB7CgoJCXZhciBpID0gJCh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSwgbyA9IGkub3B0aW9uczsKCQlpLnNuYXBFbGVtZW50cyA9IFtdOwoKCQkkKG8uc25hcC5jb25zdHJ1Y3RvciAhPSBTdHJpbmcgPyAoIG8uc25hcC5pdGVtcyB8fCAnOmRhdGEoZHJhZ2dhYmxlKScgKSA6IG8uc25hcCkuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyICR0ID0gJCh0aGlzKTsgdmFyICRvID0gJHQub2Zmc2V0KCk7CgkJCWlmKHRoaXMgIT0gaS5lbGVtZW50WzBdKSBpLnNuYXBFbGVtZW50cy5wdXNoKHsKCQkJCWl0ZW06IHRoaXMsCgkJCQl3aWR0aDogJHQub3V0ZXJXaWR0aCgpLCBoZWlnaHQ6ICR0Lm91dGVySGVpZ2h0KCksCgkJCQl0b3A6ICRvLnRvcCwgbGVmdDogJG8ubGVmdAoJCQl9KTsKCQl9KTsKCgl9LAoJZHJhZzogZnVuY3Rpb24oZXZlbnQsIHVpKSB7CgoJCXZhciBpbnN0ID0gJCh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSwgbyA9IGluc3Qub3B0aW9uczsKCQl2YXIgZCA9IG8uc25hcFRvbGVyYW5jZTsKCgkJdmFyIHgxID0gdWkub2Zmc2V0LmxlZnQsIHgyID0geDEgKyBpbnN0LmhlbHBlclByb3BvcnRpb25zLndpZHRoLAoJCQl5MSA9IHVpLm9mZnNldC50b3AsIHkyID0geTEgKyBpbnN0LmhlbHBlclByb3BvcnRpb25zLmhlaWdodDsKCgkJZm9yICh2YXIgaSA9IGluc3Quc25hcEVsZW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXsKCgkJCXZhciBsID0gaW5zdC5zbmFwRWxlbWVudHNbaV0ubGVmdCwgciA9IGwgKyBpbnN0LnNuYXBFbGVtZW50c1tpXS53aWR0aCwKCQkJCXQgPSBpbnN0LnNuYXBFbGVtZW50c1tpXS50b3AsIGIgPSB0ICsgaW5zdC5zbmFwRWxlbWVudHNbaV0uaGVpZ2h0OwoKCQkJLy9ZZXMsIEkga25vdywgdGhpcyBpcyBpbnNhbmUgOykKCQkJaWYoISgobC1kIDwgeDEgJiYgeDEgPCByK2QgJiYgdC1kIDwgeTEgJiYgeTEgPCBiK2QpIHx8IChsLWQgPCB4MSAmJiB4MSA8IHIrZCAmJiB0LWQgPCB5MiAmJiB5MiA8IGIrZCkgfHwgKGwtZCA8IHgyICYmIHgyIDwgcitkICYmIHQtZCA8IHkxICYmIHkxIDwgYitkKSB8fCAobC1kIDwgeDIgJiYgeDIgPCByK2QgJiYgdC1kIDwgeTIgJiYgeTIgPCBiK2QpKSkgewoJCQkJaWYoaW5zdC5zbmFwRWxlbWVudHNbaV0uc25hcHBpbmcpIChpbnN0Lm9wdGlvbnMuc25hcC5yZWxlYXNlICYmIGluc3Qub3B0aW9ucy5zbmFwLnJlbGVhc2UuY2FsbChpbnN0LmVsZW1lbnQsIGV2ZW50LCAkLmV4dGVuZChpbnN0Ll91aUhhc2goKSwgeyBzbmFwSXRlbTogaW5zdC5zbmFwRWxlbWVudHNbaV0uaXRlbSB9KSkpOwoJCQkJaW5zdC5zbmFwRWxlbWVudHNbaV0uc25hcHBpbmcgPSBmYWxzZTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlpZihvLnNuYXBNb2RlICE9ICdpbm5lcicpIHsKCQkJCXZhciB0cyA9IE1hdGguYWJzKHQgLSB5MikgPD0gZDsKCQkJCXZhciBicyA9IE1hdGguYWJzKGIgLSB5MSkgPD0gZDsKCQkJCXZhciBscyA9IE1hdGguYWJzKGwgLSB4MikgPD0gZDsKCQkJCXZhciBycyA9IE1hdGguYWJzKHIgLSB4MSkgPD0gZDsKCQkJCWlmKHRzKSB1aS5wb3NpdGlvbi50b3AgPSBpbnN0Ll9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLCB7IHRvcDogdCAtIGluc3QuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LCBsZWZ0OiAwIH0pLnRvcCAtIGluc3QubWFyZ2lucy50b3A7CgkJCQlpZihicykgdWkucG9zaXRpb24udG9wID0gaW5zdC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIiwgeyB0b3A6IGIsIGxlZnQ6IDAgfSkudG9wIC0gaW5zdC5tYXJnaW5zLnRvcDsKCQkJCWlmKGxzKSB1aS5wb3NpdGlvbi5sZWZ0ID0gaW5zdC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIiwgeyB0b3A6IDAsIGxlZnQ6IGwgLSBpbnN0LmhlbHBlclByb3BvcnRpb25zLndpZHRoIH0pLmxlZnQgLSBpbnN0Lm1hcmdpbnMubGVmdDsKCQkJCWlmKHJzKSB1aS5wb3NpdGlvbi5sZWZ0ID0gaW5zdC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIiwgeyB0b3A6IDAsIGxlZnQ6IHIgfSkubGVmdCAtIGluc3QubWFyZ2lucy5sZWZ0OwoJCQl9CgoJCQl2YXIgZmlyc3QgPSAodHMgfHwgYnMgfHwgbHMgfHwgcnMpOwoKCQkJaWYoby5zbmFwTW9kZSAhPSAnb3V0ZXInKSB7CgkJCQl2YXIgdHMgPSBNYXRoLmFicyh0IC0geTEpIDw9IGQ7CgkJCQl2YXIgYnMgPSBNYXRoLmFicyhiIC0geTIpIDw9IGQ7CgkJCQl2YXIgbHMgPSBNYXRoLmFicyhsIC0geDEpIDw9IGQ7CgkJCQl2YXIgcnMgPSBNYXRoLmFicyhyIC0geDIpIDw9IGQ7CgkJCQlpZih0cykgdWkucG9zaXRpb24udG9wID0gaW5zdC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIiwgeyB0b3A6IHQsIGxlZnQ6IDAgfSkudG9wIC0gaW5zdC5tYXJnaW5zLnRvcDsKCQkJCWlmKGJzKSB1aS5wb3NpdGlvbi50b3AgPSBpbnN0Ll9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLCB7IHRvcDogYiAtIGluc3QuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LCBsZWZ0OiAwIH0pLnRvcCAtIGluc3QubWFyZ2lucy50b3A7CgkJCQlpZihscykgdWkucG9zaXRpb24ubGVmdCA9IGluc3QuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIsIHsgdG9wOiAwLCBsZWZ0OiBsIH0pLmxlZnQgLSBpbnN0Lm1hcmdpbnMubGVmdDsKCQkJCWlmKHJzKSB1aS5wb3NpdGlvbi5sZWZ0ID0gaW5zdC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIiwgeyB0b3A6IDAsIGxlZnQ6IHIgLSBpbnN0LmhlbHBlclByb3BvcnRpb25zLndpZHRoIH0pLmxlZnQgLSBpbnN0Lm1hcmdpbnMubGVmdDsKCQkJfQoKCQkJaWYoIWluc3Quc25hcEVsZW1lbnRzW2ldLnNuYXBwaW5nICYmICh0cyB8fCBicyB8fCBscyB8fCBycyB8fCBmaXJzdCkpCgkJCQkoaW5zdC5vcHRpb25zLnNuYXAuc25hcCAmJiBpbnN0Lm9wdGlvbnMuc25hcC5zbmFwLmNhbGwoaW5zdC5lbGVtZW50LCBldmVudCwgJC5leHRlbmQoaW5zdC5fdWlIYXNoKCksIHsgc25hcEl0ZW06IGluc3Quc25hcEVsZW1lbnRzW2ldLml0ZW0gfSkpKTsKCQkJaW5zdC5zbmFwRWxlbWVudHNbaV0uc25hcHBpbmcgPSAodHMgfHwgYnMgfHwgbHMgfHwgcnMgfHwgZmlyc3QpOwoKCQl9OwoKCX0KfSk7CgokLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsICJzdGFjayIsIHsKCXN0YXJ0OiBmdW5jdGlvbihldmVudCwgdWkpIHsKCgkJdmFyIG8gPSAkKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7CgoJCXZhciBncm91cCA9ICQubWFrZUFycmF5KCQoby5zdGFjaykpLnNvcnQoZnVuY3Rpb24oYSxiKSB7CgkJCXJldHVybiAocGFyc2VJbnQoJChhKS5jc3MoInpJbmRleCIpLDEwKSB8fCAwKSAtIChwYXJzZUludCgkKGIpLmNzcygiekluZGV4IiksMTApIHx8IDApOwoJCX0pOwoJCWlmICghZ3JvdXAubGVuZ3RoKSB7IHJldHVybjsgfQoKCQl2YXIgbWluID0gcGFyc2VJbnQoZ3JvdXBbMF0uc3R5bGUuekluZGV4KSB8fCAwOwoJCSQoZ3JvdXApLmVhY2goZnVuY3Rpb24oaSkgewoJCQl0aGlzLnN0eWxlLnpJbmRleCA9IG1pbiArIGk7CgkJfSk7CgoJCXRoaXNbMF0uc3R5bGUuekluZGV4ID0gbWluICsgZ3JvdXAubGVuZ3RoOwoKCX0KfSk7CgokLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsICJ6SW5kZXgiLCB7CglzdGFydDogZnVuY3Rpb24oZXZlbnQsIHVpKSB7CgkJdmFyIHQgPSAkKHVpLmhlbHBlciksIG8gPSAkKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7CgkJaWYodC5jc3MoInpJbmRleCIpKSBvLl96SW5kZXggPSB0LmNzcygiekluZGV4Iik7CgkJdC5jc3MoJ3pJbmRleCcsIG8uekluZGV4KTsKCX0sCglzdG9wOiBmdW5jdGlvbihldmVudCwgdWkpIHsKCQl2YXIgbyA9ICQodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9uczsKCQlpZihvLl96SW5kZXgpICQodWkuaGVscGVyKS5jc3MoJ3pJbmRleCcsIG8uX3pJbmRleCk7Cgl9Cn0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgokLndpZGdldCgidWkuZHJvcHBhYmxlIiwgewoJdmVyc2lvbjogIjEuOS4yIiwKCXdpZGdldEV2ZW50UHJlZml4OiAiZHJvcCIsCglvcHRpb25zOiB7CgkJYWNjZXB0OiAnKicsCgkJYWN0aXZlQ2xhc3M6IGZhbHNlLAoJCWFkZENsYXNzZXM6IHRydWUsCgkJZ3JlZWR5OiBmYWxzZSwKCQlob3ZlckNsYXNzOiBmYWxzZSwKCQlzY29wZTogJ2RlZmF1bHQnLAoJCXRvbGVyYW5jZTogJ2ludGVyc2VjdCcKCX0sCglfY3JlYXRlOiBmdW5jdGlvbigpIHsKCgkJdmFyIG8gPSB0aGlzLm9wdGlvbnMsIGFjY2VwdCA9IG8uYWNjZXB0OwoJCXRoaXMuaXNvdmVyID0gMDsgdGhpcy5pc291dCA9IDE7CgoJCXRoaXMuYWNjZXB0ID0gJC5pc0Z1bmN0aW9uKGFjY2VwdCkgPyBhY2NlcHQgOiBmdW5jdGlvbihkKSB7CgkJCXJldHVybiBkLmlzKGFjY2VwdCk7CgkJfTsKCgkJLy9TdG9yZSB0aGUgZHJvcHBhYmxlJ3MgcHJvcG9ydGlvbnMKCQl0aGlzLnByb3BvcnRpb25zID0geyB3aWR0aDogdGhpcy5lbGVtZW50WzBdLm9mZnNldFdpZHRoLCBoZWlnaHQ6IHRoaXMuZWxlbWVudFswXS5vZmZzZXRIZWlnaHQgfTsKCgkJLy8gQWRkIHRoZSByZWZlcmVuY2UgYW5kIHBvc2l0aW9ucyB0byB0aGUgbWFuYWdlcgoJCSQudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbby5zY29wZV0gPSAkLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW28uc2NvcGVdIHx8IFtdOwoJCSQudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbby5zY29wZV0ucHVzaCh0aGlzKTsKCgkJKG8uYWRkQ2xhc3NlcyAmJiB0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyb3BwYWJsZSIpKTsKCgl9LAoKCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCQl2YXIgZHJvcCA9ICQudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdGhpcy5vcHRpb25zLnNjb3BlXTsKCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBkcm9wLmxlbmd0aDsgaSsrICkKCQkJaWYgKCBkcm9wW2ldID09IHRoaXMgKQoJCQkJZHJvcC5zcGxpY2UoaSwgMSk7CgoJCXRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktZHJvcHBhYmxlIHVpLWRyb3BwYWJsZS1kaXNhYmxlZCIpOwoJfSwKCglfc2V0T3B0aW9uOiBmdW5jdGlvbihrZXksIHZhbHVlKSB7CgoJCWlmKGtleSA9PSAnYWNjZXB0JykgewoJCQl0aGlzLmFjY2VwdCA9ICQuaXNGdW5jdGlvbih2YWx1ZSkgPyB2YWx1ZSA6IGZ1bmN0aW9uKGQpIHsKCQkJCXJldHVybiBkLmlzKHZhbHVlKTsKCQkJfTsKCQl9CgkJJC5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCX0sCgoJX2FjdGl2YXRlOiBmdW5jdGlvbihldmVudCkgewoJCXZhciBkcmFnZ2FibGUgPSAkLnVpLmRkbWFuYWdlci5jdXJyZW50OwoJCWlmKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcykgdGhpcy5lbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyk7CgkJKGRyYWdnYWJsZSAmJiB0aGlzLl90cmlnZ2VyKCdhY3RpdmF0ZScsIGV2ZW50LCB0aGlzLnVpKGRyYWdnYWJsZSkpKTsKCX0sCgoJX2RlYWN0aXZhdGU6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIGRyYWdnYWJsZSA9ICQudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7CgkJaWYodGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSB0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKTsKCQkoZHJhZ2dhYmxlICYmIHRoaXMuX3RyaWdnZXIoJ2RlYWN0aXZhdGUnLCBldmVudCwgdGhpcy51aShkcmFnZ2FibGUpKSk7Cgl9LAoKCV9vdmVyOiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgZHJhZ2dhYmxlID0gJC51aS5kZG1hbmFnZXIuY3VycmVudDsKCQlpZiAoIWRyYWdnYWJsZSB8fCAoZHJhZ2dhYmxlLmN1cnJlbnRJdGVtIHx8IGRyYWdnYWJsZS5lbGVtZW50KVswXSA9PSB0aGlzLmVsZW1lbnRbMF0pIHJldHVybjsgLy8gQmFpbCBpZiBkcmFnZ2FibGUgYW5kIGRyb3BwYWJsZSBhcmUgc2FtZSBlbGVtZW50CgoJCWlmICh0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSwoZHJhZ2dhYmxlLmN1cnJlbnRJdGVtIHx8IGRyYWdnYWJsZS5lbGVtZW50KSkpIHsKCQkJaWYodGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpIHRoaXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyk7CgkJCXRoaXMuX3RyaWdnZXIoJ292ZXInLCBldmVudCwgdGhpcy51aShkcmFnZ2FibGUpKTsKCQl9CgoJfSwKCglfb3V0OiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgZHJhZ2dhYmxlID0gJC51aS5kZG1hbmFnZXIuY3VycmVudDsKCQlpZiAoIWRyYWdnYWJsZSB8fCAoZHJhZ2dhYmxlLmN1cnJlbnRJdGVtIHx8IGRyYWdnYWJsZS5lbGVtZW50KVswXSA9PSB0aGlzLmVsZW1lbnRbMF0pIHJldHVybjsgLy8gQmFpbCBpZiBkcmFnZ2FibGUgYW5kIGRyb3BwYWJsZSBhcmUgc2FtZSBlbGVtZW50CgoJCWlmICh0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSwoZHJhZ2dhYmxlLmN1cnJlbnRJdGVtIHx8IGRyYWdnYWJsZS5lbGVtZW50KSkpIHsKCQkJaWYodGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpIHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyk7CgkJCXRoaXMuX3RyaWdnZXIoJ291dCcsIGV2ZW50LCB0aGlzLnVpKGRyYWdnYWJsZSkpOwoJCX0KCgl9LAoKCV9kcm9wOiBmdW5jdGlvbihldmVudCxjdXN0b20pIHsKCgkJdmFyIGRyYWdnYWJsZSA9IGN1c3RvbSB8fCAkLnVpLmRkbWFuYWdlci5jdXJyZW50OwoJCWlmICghZHJhZ2dhYmxlIHx8IChkcmFnZ2FibGUuY3VycmVudEl0ZW0gfHwgZHJhZ2dhYmxlLmVsZW1lbnQpWzBdID09IHRoaXMuZWxlbWVudFswXSkgcmV0dXJuIGZhbHNlOyAvLyBCYWlsIGlmIGRyYWdnYWJsZSBhbmQgZHJvcHBhYmxlIGFyZSBzYW1lIGVsZW1lbnQKCgkJdmFyIGNoaWxkcmVuSW50ZXJzZWN0aW9uID0gZmFsc2U7CgkJdGhpcy5lbGVtZW50LmZpbmQoIjpkYXRhKGRyb3BwYWJsZSkiKS5ub3QoIi51aS1kcmFnZ2FibGUtZHJhZ2dpbmciKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgaW5zdCA9ICQuZGF0YSh0aGlzLCAnZHJvcHBhYmxlJyk7CgkJCWlmKAoJCQkJaW5zdC5vcHRpb25zLmdyZWVkeQoJCQkJJiYgIWluc3Qub3B0aW9ucy5kaXNhYmxlZAoJCQkJJiYgaW5zdC5vcHRpb25zLnNjb3BlID09IGRyYWdnYWJsZS5vcHRpb25zLnNjb3BlCgkJCQkmJiBpbnN0LmFjY2VwdC5jYWxsKGluc3QuZWxlbWVudFswXSwgKGRyYWdnYWJsZS5jdXJyZW50SXRlbSB8fCBkcmFnZ2FibGUuZWxlbWVudCkpCgkJCQkmJiAkLnVpLmludGVyc2VjdChkcmFnZ2FibGUsICQuZXh0ZW5kKGluc3QsIHsgb2Zmc2V0OiBpbnN0LmVsZW1lbnQub2Zmc2V0KCkgfSksIGluc3Qub3B0aW9ucy50b2xlcmFuY2UpCgkJCSkgeyBjaGlsZHJlbkludGVyc2VjdGlvbiA9IHRydWU7IHJldHVybiBmYWxzZTsgfQoJCX0pOwoJCWlmKGNoaWxkcmVuSW50ZXJzZWN0aW9uKSByZXR1cm4gZmFsc2U7CgoJCWlmKHRoaXMuYWNjZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLChkcmFnZ2FibGUuY3VycmVudEl0ZW0gfHwgZHJhZ2dhYmxlLmVsZW1lbnQpKSkgewoJCQlpZih0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpIHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpOwoJCQlpZih0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcykgdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzKTsKCQkJdGhpcy5fdHJpZ2dlcignZHJvcCcsIGV2ZW50LCB0aGlzLnVpKGRyYWdnYWJsZSkpOwoJCQlyZXR1cm4gdGhpcy5lbGVtZW50OwoJCX0KCgkJcmV0dXJuIGZhbHNlOwoKCX0sCgoJdWk6IGZ1bmN0aW9uKGMpIHsKCQlyZXR1cm4gewoJCQlkcmFnZ2FibGU6IChjLmN1cnJlbnRJdGVtIHx8IGMuZWxlbWVudCksCgkJCWhlbHBlcjogYy5oZWxwZXIsCgkJCXBvc2l0aW9uOiBjLnBvc2l0aW9uLAoJCQlvZmZzZXQ6IGMucG9zaXRpb25BYnMKCQl9OwoJfQoKfSk7CgokLnVpLmludGVyc2VjdCA9IGZ1bmN0aW9uKGRyYWdnYWJsZSwgZHJvcHBhYmxlLCB0b2xlcmFuY2VNb2RlKSB7CgoJaWYgKCFkcm9wcGFibGUub2Zmc2V0KSByZXR1cm4gZmFsc2U7CgoJdmFyIHgxID0gKGRyYWdnYWJsZS5wb3NpdGlvbkFicyB8fCBkcmFnZ2FibGUucG9zaXRpb24uYWJzb2x1dGUpLmxlZnQsIHgyID0geDEgKyBkcmFnZ2FibGUuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgsCgkJeTEgPSAoZHJhZ2dhYmxlLnBvc2l0aW9uQWJzIHx8IGRyYWdnYWJsZS5wb3NpdGlvbi5hYnNvbHV0ZSkudG9wLCB5MiA9IHkxICsgZHJhZ2dhYmxlLmhlbHBlclByb3BvcnRpb25zLmhlaWdodDsKCXZhciBsID0gZHJvcHBhYmxlLm9mZnNldC5sZWZ0LCByID0gbCArIGRyb3BwYWJsZS5wcm9wb3J0aW9ucy53aWR0aCwKCQl0ID0gZHJvcHBhYmxlLm9mZnNldC50b3AsIGIgPSB0ICsgZHJvcHBhYmxlLnByb3BvcnRpb25zLmhlaWdodDsKCglzd2l0Y2ggKHRvbGVyYW5jZU1vZGUpIHsKCQljYXNlICdmaXQnOgoJCQlyZXR1cm4gKGwgPD0geDEgJiYgeDIgPD0gcgoJCQkJJiYgdCA8PSB5MSAmJiB5MiA8PSBiKTsKCQkJYnJlYWs7CgkJY2FzZSAnaW50ZXJzZWN0JzoKCQkJcmV0dXJuIChsIDwgeDEgKyAoZHJhZ2dhYmxlLmhlbHBlclByb3BvcnRpb25zLndpZHRoIC8gMikgLy8gUmlnaHQgSGFsZgoJCQkJJiYgeDIgLSAoZHJhZ2dhYmxlLmhlbHBlclByb3BvcnRpb25zLndpZHRoIC8gMikgPCByIC8vIExlZnQgSGFsZgoJCQkJJiYgdCA8IHkxICsgKGRyYWdnYWJsZS5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQgLyAyKSAvLyBCb3R0b20gSGFsZgoJCQkJJiYgeTIgLSAoZHJhZ2dhYmxlLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCAvIDIpIDwgYiApOyAvLyBUb3AgSGFsZgoJCQlicmVhazsKCQljYXNlICdwb2ludGVyJzoKCQkJdmFyIGRyYWdnYWJsZUxlZnQgPSAoKGRyYWdnYWJsZS5wb3NpdGlvbkFicyB8fCBkcmFnZ2FibGUucG9zaXRpb24uYWJzb2x1dGUpLmxlZnQgKyAoZHJhZ2dhYmxlLmNsaWNrT2Zmc2V0IHx8IGRyYWdnYWJsZS5vZmZzZXQuY2xpY2spLmxlZnQpLAoJCQkJZHJhZ2dhYmxlVG9wID0gKChkcmFnZ2FibGUucG9zaXRpb25BYnMgfHwgZHJhZ2dhYmxlLnBvc2l0aW9uLmFic29sdXRlKS50b3AgKyAoZHJhZ2dhYmxlLmNsaWNrT2Zmc2V0IHx8IGRyYWdnYWJsZS5vZmZzZXQuY2xpY2spLnRvcCksCgkJCQlpc092ZXIgPSAkLnVpLmlzT3ZlcihkcmFnZ2FibGVUb3AsIGRyYWdnYWJsZUxlZnQsIHQsIGwsIGRyb3BwYWJsZS5wcm9wb3J0aW9ucy5oZWlnaHQsIGRyb3BwYWJsZS5wcm9wb3J0aW9ucy53aWR0aCk7CgkJCXJldHVybiBpc092ZXI7CgkJCWJyZWFrOwoJCWNhc2UgJ3RvdWNoJzoKCQkJcmV0dXJuICgKCQkJCQkoeTEgPj0gdCAmJiB5MSA8PSBiKSB8fAkvLyBUb3AgZWRnZSB0b3VjaGluZwoJCQkJCSh5MiA+PSB0ICYmIHkyIDw9IGIpIHx8CS8vIEJvdHRvbSBlZGdlIHRvdWNoaW5nCgkJCQkJKHkxIDwgdCAmJiB5MiA+IGIpCQkvLyBTdXJyb3VuZGVkIHZlcnRpY2FsbHkKCQkJCSkgJiYgKAoJCQkJCSh4MSA+PSBsICYmIHgxIDw9IHIpIHx8CS8vIExlZnQgZWRnZSB0b3VjaGluZwoJCQkJCSh4MiA+PSBsICYmIHgyIDw9IHIpIHx8CS8vIFJpZ2h0IGVkZ2UgdG91Y2hpbmcKCQkJCQkoeDEgPCBsICYmIHgyID4gcikJCS8vIFN1cnJvdW5kZWQgaG9yaXpvbnRhbGx5CgkJCQkpOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlyZXR1cm4gZmFsc2U7CgkJCWJyZWFrOwoJCX0KCn07CgovKgoJVGhpcyBtYW5hZ2VyIHRyYWNrcyBvZmZzZXRzIG9mIGRyYWdnYWJsZXMgYW5kIGRyb3BwYWJsZXMKKi8KJC51aS5kZG1hbmFnZXIgPSB7CgljdXJyZW50OiBudWxsLAoJZHJvcHBhYmxlczogeyAnZGVmYXVsdCc6IFtdIH0sCglwcmVwYXJlT2Zmc2V0czogZnVuY3Rpb24odCwgZXZlbnQpIHsKCgkJdmFyIG0gPSAkLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3Qub3B0aW9ucy5zY29wZV0gfHwgW107CgkJdmFyIHR5cGUgPSBldmVudCA/IGV2ZW50LnR5cGUgOiBudWxsOyAvLyB3b3JrYXJvdW5kIGZvciAjMjMxNwoJCXZhciBsaXN0ID0gKHQuY3VycmVudEl0ZW0gfHwgdC5lbGVtZW50KS5maW5kKCI6ZGF0YShkcm9wcGFibGUpIikuYW5kU2VsZigpOwoKCQlkcm9wcGFibGVzTG9vcDogZm9yICh2YXIgaSA9IDA7IGkgPCBtLmxlbmd0aDsgaSsrKSB7CgoJCQlpZihtW2ldLm9wdGlvbnMuZGlzYWJsZWQgfHwgKHQgJiYgIW1baV0uYWNjZXB0LmNhbGwobVtpXS5lbGVtZW50WzBdLCh0LmN1cnJlbnRJdGVtIHx8IHQuZWxlbWVudCkpKSkgY29udGludWU7CS8vTm8gZGlzYWJsZWQgYW5kIG5vbi1hY2NlcHRlZAoJCQlmb3IgKHZhciBqPTA7IGogPCBsaXN0Lmxlbmd0aDsgaisrKSB7IGlmKGxpc3Rbal0gPT0gbVtpXS5lbGVtZW50WzBdKSB7IG1baV0ucHJvcG9ydGlvbnMuaGVpZ2h0ID0gMDsgY29udGludWUgZHJvcHBhYmxlc0xvb3A7IH0gfTsgLy9GaWx0ZXIgb3V0IGVsZW1lbnRzIGluIHRoZSBjdXJyZW50IGRyYWdnZWQgaXRlbQoJCQltW2ldLnZpc2libGUgPSBtW2ldLmVsZW1lbnQuY3NzKCJkaXNwbGF5IikgIT0gIm5vbmUiOyBpZighbVtpXS52aXNpYmxlKSBjb250aW51ZTsgCQkJCQkJCQkJLy9JZiB0aGUgZWxlbWVudCBpcyBub3QgdmlzaWJsZSwgY29udGludWUKCgkJCWlmKHR5cGUgPT0gIm1vdXNlZG93biIpIG1baV0uX2FjdGl2YXRlLmNhbGwobVtpXSwgZXZlbnQpOyAvL0FjdGl2YXRlIHRoZSBkcm9wcGFibGUgaWYgdXNlZCBkaXJlY3RseSBmcm9tIGRyYWdnYWJsZXMKCgkJCW1baV0ub2Zmc2V0ID0gbVtpXS5lbGVtZW50Lm9mZnNldCgpOwoJCQltW2ldLnByb3BvcnRpb25zID0geyB3aWR0aDogbVtpXS5lbGVtZW50WzBdLm9mZnNldFdpZHRoLCBoZWlnaHQ6IG1baV0uZWxlbWVudFswXS5vZmZzZXRIZWlnaHQgfTsKCgkJfQoKCX0sCglkcm9wOiBmdW5jdGlvbihkcmFnZ2FibGUsIGV2ZW50KSB7CgoJCXZhciBkcm9wcGVkID0gZmFsc2U7CgkJJC5lYWNoKCQudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbZHJhZ2dhYmxlLm9wdGlvbnMuc2NvcGVdIHx8IFtdLCBmdW5jdGlvbigpIHsKCgkJCWlmKCF0aGlzLm9wdGlvbnMpIHJldHVybjsKCQkJaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQgJiYgdGhpcy52aXNpYmxlICYmICQudWkuaW50ZXJzZWN0KGRyYWdnYWJsZSwgdGhpcywgdGhpcy5vcHRpb25zLnRvbGVyYW5jZSkpCgkJCQlkcm9wcGVkID0gdGhpcy5fZHJvcC5jYWxsKHRoaXMsIGV2ZW50KSB8fCBkcm9wcGVkOwoKCQkJaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQgJiYgdGhpcy52aXNpYmxlICYmIHRoaXMuYWNjZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLChkcmFnZ2FibGUuY3VycmVudEl0ZW0gfHwgZHJhZ2dhYmxlLmVsZW1lbnQpKSkgewoJCQkJdGhpcy5pc291dCA9IDE7IHRoaXMuaXNvdmVyID0gMDsKCQkJCXRoaXMuX2RlYWN0aXZhdGUuY2FsbCh0aGlzLCBldmVudCk7CgkJCX0KCgkJfSk7CgkJcmV0dXJuIGRyb3BwZWQ7CgoJfSwKCWRyYWdTdGFydDogZnVuY3Rpb24oIGRyYWdnYWJsZSwgZXZlbnQgKSB7CgkJLy9MaXN0ZW4gZm9yIHNjcm9sbGluZyBzbyB0aGF0IGlmIHRoZSBkcmFnZ2luZyBjYXVzZXMgc2Nyb2xsaW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgZHJvcHBhYmxlcyBjYW4gYmUgcmVjYWxjdWxhdGVkIChzZWUgIzUwMDMpCgkJZHJhZ2dhYmxlLmVsZW1lbnQucGFyZW50c1VudGlsKCAiYm9keSIgKS5iaW5kKCAic2Nyb2xsLmRyb3BwYWJsZSIsIGZ1bmN0aW9uKCkgewoJCQlpZiggIWRyYWdnYWJsZS5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnMgKSAkLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyggZHJhZ2dhYmxlLCBldmVudCApOwoJCX0pOwoJfSwKCWRyYWc6IGZ1bmN0aW9uKGRyYWdnYWJsZSwgZXZlbnQpIHsKCgkJLy9JZiB5b3UgaGF2ZSBhIGhpZ2hseSBkeW5hbWljIHBhZ2UsIHlvdSBtaWdodCB0cnkgdGhpcyBvcHRpb24uIEl0IHJlbmRlcnMgcG9zaXRpb25zIGV2ZXJ5IHRpbWUgeW91IG1vdmUgdGhlIG1vdXNlLgoJCWlmKGRyYWdnYWJsZS5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnMpICQudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKGRyYWdnYWJsZSwgZXZlbnQpOwoKCQkvL1J1biB0aHJvdWdoIGFsbCBkcm9wcGFibGVzIGFuZCBjaGVjayB0aGVpciBwb3NpdGlvbnMgYmFzZWQgb24gc3BlY2lmaWMgdG9sZXJhbmNlIG9wdGlvbnMKCQkkLmVhY2goJC51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tkcmFnZ2FibGUub3B0aW9ucy5zY29wZV0gfHwgW10sIGZ1bmN0aW9uKCkgewoKCQkJaWYodGhpcy5vcHRpb25zLmRpc2FibGVkIHx8IHRoaXMuZ3JlZWR5Q2hpbGQgfHwgIXRoaXMudmlzaWJsZSkgcmV0dXJuOwoJCQl2YXIgaW50ZXJzZWN0cyA9ICQudWkuaW50ZXJzZWN0KGRyYWdnYWJsZSwgdGhpcywgdGhpcy5vcHRpb25zLnRvbGVyYW5jZSk7CgoJCQl2YXIgYyA9ICFpbnRlcnNlY3RzICYmIHRoaXMuaXNvdmVyID09IDEgPyAnaXNvdXQnIDogKGludGVyc2VjdHMgJiYgdGhpcy5pc292ZXIgPT0gMCA/ICdpc292ZXInIDogbnVsbCk7CgkJCWlmKCFjKSByZXR1cm47CgoJCQl2YXIgcGFyZW50SW5zdGFuY2U7CgkJCWlmICh0aGlzLm9wdGlvbnMuZ3JlZWR5KSB7CgkJCQkvLyBmaW5kIGRyb3BwYWJsZSBwYXJlbnRzIHdpdGggc2FtZSBzY29wZQoJCQkJdmFyIHNjb3BlID0gdGhpcy5vcHRpb25zLnNjb3BlOwoJCQkJdmFyIHBhcmVudCA9IHRoaXMuZWxlbWVudC5wYXJlbnRzKCc6ZGF0YShkcm9wcGFibGUpJykuZmlsdGVyKGZ1bmN0aW9uICgpIHsKCQkJCQlyZXR1cm4gJC5kYXRhKHRoaXMsICdkcm9wcGFibGUnKS5vcHRpb25zLnNjb3BlID09PSBzY29wZTsKCQkJCX0pOwoKCQkJCWlmIChwYXJlbnQubGVuZ3RoKSB7CgkJCQkJcGFyZW50SW5zdGFuY2UgPSAkLmRhdGEocGFyZW50WzBdLCAnZHJvcHBhYmxlJyk7CgkJCQkJcGFyZW50SW5zdGFuY2UuZ3JlZWR5Q2hpbGQgPSAoYyA9PSAnaXNvdmVyJyA/IDEgOiAwKTsKCQkJCX0KCQkJfQoKCQkJLy8gd2UganVzdCBtb3ZlZCBpbnRvIGEgZ3JlZWR5IGNoaWxkCgkJCWlmIChwYXJlbnRJbnN0YW5jZSAmJiBjID09ICdpc292ZXInKSB7CgkJCQlwYXJlbnRJbnN0YW5jZVsnaXNvdmVyJ10gPSAwOwoJCQkJcGFyZW50SW5zdGFuY2VbJ2lzb3V0J10gPSAxOwoJCQkJcGFyZW50SW5zdGFuY2UuX291dC5jYWxsKHBhcmVudEluc3RhbmNlLCBldmVudCk7CgkJCX0KCgkJCXRoaXNbY10gPSAxOyB0aGlzW2MgPT0gJ2lzb3V0JyA/ICdpc292ZXInIDogJ2lzb3V0J10gPSAwOwoJCQl0aGlzW2MgPT0gImlzb3ZlciIgPyAiX292ZXIiIDogIl9vdXQiXS5jYWxsKHRoaXMsIGV2ZW50KTsKCgkJCS8vIHdlIGp1c3QgbW92ZWQgb3V0IG9mIGEgZ3JlZWR5IGNoaWxkCgkJCWlmIChwYXJlbnRJbnN0YW5jZSAmJiBjID09ICdpc291dCcpIHsKCQkJCXBhcmVudEluc3RhbmNlWydpc291dCddID0gMDsKCQkJCXBhcmVudEluc3RhbmNlWydpc292ZXInXSA9IDE7CgkJCQlwYXJlbnRJbnN0YW5jZS5fb3Zlci5jYWxsKHBhcmVudEluc3RhbmNlLCBldmVudCk7CgkJCX0KCQl9KTsKCgl9LAoJZHJhZ1N0b3A6IGZ1bmN0aW9uKCBkcmFnZ2FibGUsIGV2ZW50ICkgewoJCWRyYWdnYWJsZS5lbGVtZW50LnBhcmVudHNVbnRpbCggImJvZHkiICkudW5iaW5kKCAic2Nyb2xsLmRyb3BwYWJsZSIgKTsKCQkvL0NhbGwgcHJlcGFyZU9mZnNldHMgb25lIGZpbmFsIHRpbWUgc2luY2UgSUUgZG9lcyBub3QgZmlyZSByZXR1cm4gc2Nyb2xsIGV2ZW50cyB3aGVuIG92ZXJmbG93IHdhcyBjYXVzZWQgYnkgZHJhZyAoc2VlICM1MDAzKQoJCWlmKCAhZHJhZ2dhYmxlLm9wdGlvbnMucmVmcmVzaFBvc2l0aW9ucyApICQudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKCBkcmFnZ2FibGUsIGV2ZW50ICk7Cgl9Cn07Cgp9KShqUXVlcnkpOwo7KGpRdWVyeS5lZmZlY3RzIHx8IChmdW5jdGlvbigkLCB1bmRlZmluZWQpIHsKCnZhciBiYWNrQ29tcGF0ID0gJC51aUJhY2tDb21wYXQgIT09IGZhbHNlLAoJLy8gcHJlZml4IHVzZWQgZm9yIHN0b3JpbmcgZGF0YSBvbiAuZGF0YSgpCglkYXRhU3BhY2UgPSAidWktZWZmZWN0cy0iOwoKJC5lZmZlY3RzID0gewoJZWZmZWN0OiB7fQp9OwoKLyohCiAqIGpRdWVyeSBDb2xvciBBbmltYXRpb25zIHYyLjAuMAogKiBodHRwOi8vanF1ZXJ5LmNvbS8KICoKICogQ29weXJpZ2h0IDIwMTIgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogRGF0ZTogTW9uIEF1ZyAxMyAxMzo0MTowMiAyMDEyIC0wNTAwCiAqLwooZnVuY3Rpb24oIGpRdWVyeSwgdW5kZWZpbmVkICkgewoKCXZhciBzdGVwSG9va3MgPSAiYmFja2dyb3VuZENvbG9yIGJvcmRlckJvdHRvbUNvbG9yIGJvcmRlckxlZnRDb2xvciBib3JkZXJSaWdodENvbG9yIGJvcmRlclRvcENvbG9yIGNvbG9yIGNvbHVtblJ1bGVDb2xvciBvdXRsaW5lQ29sb3IgdGV4dERlY29yYXRpb25Db2xvciB0ZXh0RW1waGFzaXNDb2xvciIuc3BsaXQoIiAiKSwKCgkvLyBwbHVzZXF1YWxzIHRlc3QgZm9yICs9IDEwMCAtPSAxMDAKCXJwbHVzZXF1YWxzID0gL14oW1wtK10pPVxzKihcZCtcLj9cZCopLywKCS8vIGEgc2V0IG9mIFJFJ3MgdGhhdCBjYW4gbWF0Y2ggc3RyaW5ncyBhbmQgZ2VuZXJhdGUgY29sb3IgdHVwbGVzLgoJc3RyaW5nUGFyc2VycyA9IFt7CgkJCXJlOiAvcmdiYT9cKFxzKihcZHsxLDN9KVxzKixccyooXGR7MSwzfSlccyosXHMqKFxkezEsM30pXHMqKD86LFxzKihcZCsoPzpcLlxkKyk/KVxzKik/XCkvLAoJCQlwYXJzZTogZnVuY3Rpb24oIGV4ZWNSZXN1bHQgKSB7CgkJCQlyZXR1cm4gWwoJCQkJCWV4ZWNSZXN1bHRbIDEgXSwKCQkJCQlleGVjUmVzdWx0WyAyIF0sCgkJCQkJZXhlY1Jlc3VsdFsgMyBdLAoJCQkJCWV4ZWNSZXN1bHRbIDQgXQoJCQkJXTsKCQkJfQoJCX0sIHsKCQkJcmU6IC9yZ2JhP1woXHMqKFxkKyg/OlwuXGQrKT8pXCVccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyooPzosXHMqKFxkKyg/OlwuXGQrKT8pXHMqKT9cKS8sCgkJCXBhcnNlOiBmdW5jdGlvbiggZXhlY1Jlc3VsdCApIHsKCQkJCXJldHVybiBbCgkJCQkJZXhlY1Jlc3VsdFsgMSBdICogMi41NSwKCQkJCQlleGVjUmVzdWx0WyAyIF0gKiAyLjU1LAoJCQkJCWV4ZWNSZXN1bHRbIDMgXSAqIDIuNTUsCgkJCQkJZXhlY1Jlc3VsdFsgNCBdCgkJCQldOwoJCQl9CgkJfSwgewoJCQkvLyB0aGlzIHJlZ2V4IGlnbm9yZXMgQS1GIGJlY2F1c2UgaXQncyBjb21wYXJlZCBhZ2FpbnN0IGFuIGFscmVhZHkgbG93ZXJjYXNlZCBzdHJpbmcKCQkJcmU6IC8jKFthLWYwLTldezJ9KShbYS1mMC05XXsyfSkoW2EtZjAtOV17Mn0pLywKCQkJcGFyc2U6IGZ1bmN0aW9uKCBleGVjUmVzdWx0ICkgewoJCQkJcmV0dXJuIFsKCQkJCQlwYXJzZUludCggZXhlY1Jlc3VsdFsgMSBdLCAxNiApLAoJCQkJCXBhcnNlSW50KCBleGVjUmVzdWx0WyAyIF0sIDE2ICksCgkJCQkJcGFyc2VJbnQoIGV4ZWNSZXN1bHRbIDMgXSwgMTYgKQoJCQkJXTsKCQkJfQoJCX0sIHsKCQkJLy8gdGhpcyByZWdleCBpZ25vcmVzIEEtRiBiZWNhdXNlIGl0J3MgY29tcGFyZWQgYWdhaW5zdCBhbiBhbHJlYWR5IGxvd2VyY2FzZWQgc3RyaW5nCgkJCXJlOiAvIyhbYS1mMC05XSkoW2EtZjAtOV0pKFthLWYwLTldKS8sCgkJCXBhcnNlOiBmdW5jdGlvbiggZXhlY1Jlc3VsdCApIHsKCQkJCXJldHVybiBbCgkJCQkJcGFyc2VJbnQoIGV4ZWNSZXN1bHRbIDEgXSArIGV4ZWNSZXN1bHRbIDEgXSwgMTYgKSwKCQkJCQlwYXJzZUludCggZXhlY1Jlc3VsdFsgMiBdICsgZXhlY1Jlc3VsdFsgMiBdLCAxNiApLAoJCQkJCXBhcnNlSW50KCBleGVjUmVzdWx0WyAzIF0gKyBleGVjUmVzdWx0WyAzIF0sIDE2ICkKCQkJCV07CgkJCX0KCQl9LCB7CgkJCXJlOiAvaHNsYT9cKFxzKihcZCsoPzpcLlxkKyk/KVxzKixccyooXGQrKD86XC5cZCspPylcJVxzKixccyooXGQrKD86XC5cZCspPylcJVxzKig/OixccyooXGQrKD86XC5cZCspPylccyopP1wpLywKCQkJc3BhY2U6ICJoc2xhIiwKCQkJcGFyc2U6IGZ1bmN0aW9uKCBleGVjUmVzdWx0ICkgewoJCQkJcmV0dXJuIFsKCQkJCQlleGVjUmVzdWx0WyAxIF0sCgkJCQkJZXhlY1Jlc3VsdFsgMiBdIC8gMTAwLAoJCQkJCWV4ZWNSZXN1bHRbIDMgXSAvIDEwMCwKCQkJCQlleGVjUmVzdWx0WyA0IF0KCQkJCV07CgkJCX0KCQl9XSwKCgkvLyBqUXVlcnkuQ29sb3IoICkKCWNvbG9yID0galF1ZXJ5LkNvbG9yID0gZnVuY3Rpb24oIGNvbG9yLCBncmVlbiwgYmx1ZSwgYWxwaGEgKSB7CgkJcmV0dXJuIG5ldyBqUXVlcnkuQ29sb3IuZm4ucGFyc2UoIGNvbG9yLCBncmVlbiwgYmx1ZSwgYWxwaGEgKTsKCX0sCglzcGFjZXMgPSB7CgkJcmdiYTogewoJCQlwcm9wczogewoJCQkJcmVkOiB7CgkJCQkJaWR4OiAwLAoJCQkJCXR5cGU6ICJieXRlIgoJCQkJfSwKCQkJCWdyZWVuOiB7CgkJCQkJaWR4OiAxLAoJCQkJCXR5cGU6ICJieXRlIgoJCQkJfSwKCQkJCWJsdWU6IHsKCQkJCQlpZHg6IDIsCgkJCQkJdHlwZTogImJ5dGUiCgkJCQl9CgkJCX0KCQl9LAoKCQloc2xhOiB7CgkJCXByb3BzOiB7CgkJCQlodWU6IHsKCQkJCQlpZHg6IDAsCgkJCQkJdHlwZTogImRlZ3JlZXMiCgkJCQl9LAoJCQkJc2F0dXJhdGlvbjogewoJCQkJCWlkeDogMSwKCQkJCQl0eXBlOiAicGVyY2VudCIKCQkJCX0sCgkJCQlsaWdodG5lc3M6IHsKCQkJCQlpZHg6IDIsCgkJCQkJdHlwZTogInBlcmNlbnQiCgkJCQl9CgkJCX0KCQl9Cgl9LAoJcHJvcFR5cGVzID0gewoJCSJieXRlIjogewoJCQlmbG9vcjogdHJ1ZSwKCQkJbWF4OiAyNTUKCQl9LAoJCSJwZXJjZW50IjogewoJCQltYXg6IDEKCQl9LAoJCSJkZWdyZWVzIjogewoJCQltb2Q6IDM2MCwKCQkJZmxvb3I6IHRydWUKCQl9Cgl9LAoJc3VwcG9ydCA9IGNvbG9yLnN1cHBvcnQgPSB7fSwKCgkvLyBlbGVtZW50IGZvciBzdXBwb3J0IHRlc3RzCglzdXBwb3J0RWxlbSA9IGpRdWVyeSggIjxwPiIgKVsgMCBdLAoKCS8vIGNvbG9ycyA9IGpRdWVyeS5Db2xvci5uYW1lcwoJY29sb3JzLAoKCS8vIGxvY2FsIGFsaWFzZXMgb2YgZnVuY3Rpb25zIGNhbGxlZCBvZnRlbgoJZWFjaCA9IGpRdWVyeS5lYWNoOwoKLy8gZGV0ZXJtaW5lIHJnYmEgc3VwcG9ydCBpbW1lZGlhdGVseQpzdXBwb3J0RWxlbS5zdHlsZS5jc3NUZXh0ID0gImJhY2tncm91bmQtY29sb3I6cmdiYSgxLDEsMSwuNSkiOwpzdXBwb3J0LnJnYmEgPSBzdXBwb3J0RWxlbS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IuaW5kZXhPZiggInJnYmEiICkgPiAtMTsKCi8vIGRlZmluZSBjYWNoZSBuYW1lIGFuZCBhbHBoYSBwcm9wZXJ0aWVzCi8vIGZvciByZ2JhIGFuZCBoc2xhIHNwYWNlcwplYWNoKCBzcGFjZXMsIGZ1bmN0aW9uKCBzcGFjZU5hbWUsIHNwYWNlICkgewoJc3BhY2UuY2FjaGUgPSAiXyIgKyBzcGFjZU5hbWU7CglzcGFjZS5wcm9wcy5hbHBoYSA9IHsKCQlpZHg6IDMsCgkJdHlwZTogInBlcmNlbnQiLAoJCWRlZjogMQoJfTsKfSk7CgpmdW5jdGlvbiBjbGFtcCggdmFsdWUsIHByb3AsIGFsbG93RW1wdHkgKSB7Cgl2YXIgdHlwZSA9IHByb3BUeXBlc1sgcHJvcC50eXBlIF0gfHwge307CgoJaWYgKCB2YWx1ZSA9PSBudWxsICkgewoJCXJldHVybiAoYWxsb3dFbXB0eSB8fCAhcHJvcC5kZWYpID8gbnVsbCA6IHByb3AuZGVmOwoJfQoKCS8vIH5+IGlzIGFuIHNob3J0IHdheSBvZiBkb2luZyBmbG9vciBmb3IgcG9zaXRpdmUgbnVtYmVycwoJdmFsdWUgPSB0eXBlLmZsb29yID8gfn52YWx1ZSA6IHBhcnNlRmxvYXQoIHZhbHVlICk7CgoJLy8gSUUgd2lsbCBwYXNzIGluIGVtcHR5IHN0cmluZ3MgYXMgdmFsdWUgZm9yIGFscGhhLAoJLy8gd2hpY2ggd2lsbCBoaXQgdGhpcyBjYXNlCglpZiAoIGlzTmFOKCB2YWx1ZSApICkgewoJCXJldHVybiBwcm9wLmRlZjsKCX0KCglpZiAoIHR5cGUubW9kICkgewoJCS8vIHdlIGFkZCBtb2QgYmVmb3JlIG1vZGRpbmcgdG8gbWFrZSBzdXJlIHRoYXQgbmVnYXRpdmVzIHZhbHVlcwoJCS8vIGdldCBjb252ZXJ0ZWQgcHJvcGVybHk6IC0xMCAtPiAzNTAKCQlyZXR1cm4gKHZhbHVlICsgdHlwZS5tb2QpICUgdHlwZS5tb2Q7Cgl9CgoJLy8gZm9yIG5vdyBhbGwgcHJvcGVydHkgdHlwZXMgd2l0aG91dCBtb2QgaGF2ZSBtaW4gYW5kIG1heAoJcmV0dXJuIDAgPiB2YWx1ZSA/IDAgOiB0eXBlLm1heCA8IHZhbHVlID8gdHlwZS5tYXggOiB2YWx1ZTsKfQoKZnVuY3Rpb24gc3RyaW5nUGFyc2UoIHN0cmluZyApIHsKCXZhciBpbnN0ID0gY29sb3IoKSwKCQlyZ2JhID0gaW5zdC5fcmdiYSA9IFtdOwoKCXN0cmluZyA9IHN0cmluZy50b0xvd2VyQ2FzZSgpOwoKCWVhY2goIHN0cmluZ1BhcnNlcnMsIGZ1bmN0aW9uKCBpLCBwYXJzZXIgKSB7CgkJdmFyIHBhcnNlZCwKCQkJbWF0Y2ggPSBwYXJzZXIucmUuZXhlYyggc3RyaW5nICksCgkJCXZhbHVlcyA9IG1hdGNoICYmIHBhcnNlci5wYXJzZSggbWF0Y2ggKSwKCQkJc3BhY2VOYW1lID0gcGFyc2VyLnNwYWNlIHx8ICJyZ2JhIjsKCgkJaWYgKCB2YWx1ZXMgKSB7CgkJCXBhcnNlZCA9IGluc3RbIHNwYWNlTmFtZSBdKCB2YWx1ZXMgKTsKCgkJCS8vIGlmIHRoaXMgd2FzIGFuIHJnYmEgcGFyc2UgdGhlIGFzc2lnbm1lbnQgbWlnaHQgaGFwcGVuIHR3aWNlCgkJCS8vIG9oIHdlbGwuLi4uCgkJCWluc3RbIHNwYWNlc1sgc3BhY2VOYW1lIF0uY2FjaGUgXSA9IHBhcnNlZFsgc3BhY2VzWyBzcGFjZU5hbWUgXS5jYWNoZSBdOwoJCQlyZ2JhID0gaW5zdC5fcmdiYSA9IHBhcnNlZC5fcmdiYTsKCgkJCS8vIGV4aXQgZWFjaCggc3RyaW5nUGFyc2VycyApIGhlcmUgYmVjYXVzZSB3ZSBtYXRjaGVkCgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9KTsKCgkvLyBGb3VuZCBhIHN0cmluZ1BhcnNlciB0aGF0IGhhbmRsZWQgaXQKCWlmICggcmdiYS5sZW5ndGggKSB7CgoJCS8vIGlmIHRoaXMgY2FtZSBmcm9tIGEgcGFyc2VkIHN0cmluZywgZm9yY2UgInRyYW5zcGFyZW50IiB3aGVuIGFscGhhIGlzIDAKCQkvLyBjaHJvbWUsIChhbmQgbWF5YmUgb3RoZXJzKSByZXR1cm4gInRyYW5zcGFyZW50IiBhcyByZ2JhKDAsMCwwLDApCgkJaWYgKCByZ2JhLmpvaW4oKSA9PT0gIjAsMCwwLDAiICkgewoJCQlqUXVlcnkuZXh0ZW5kKCByZ2JhLCBjb2xvcnMudHJhbnNwYXJlbnQgKTsKCQl9CgkJcmV0dXJuIGluc3Q7Cgl9CgoJLy8gbmFtZWQgY29sb3JzCglyZXR1cm4gY29sb3JzWyBzdHJpbmcgXTsKfQoKY29sb3IuZm4gPSBqUXVlcnkuZXh0ZW5kKCBjb2xvci5wcm90b3R5cGUsIHsKCXBhcnNlOiBmdW5jdGlvbiggcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEgKSB7CgkJaWYgKCByZWQgPT09IHVuZGVmaW5lZCApIHsKCQkJdGhpcy5fcmdiYSA9IFsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCBdOwoJCQlyZXR1cm4gdGhpczsKCQl9CgkJaWYgKCByZWQuanF1ZXJ5IHx8IHJlZC5ub2RlVHlwZSApIHsKCQkJcmVkID0galF1ZXJ5KCByZWQgKS5jc3MoIGdyZWVuICk7CgkJCWdyZWVuID0gdW5kZWZpbmVkOwoJCX0KCgkJdmFyIGluc3QgPSB0aGlzLAoJCQl0eXBlID0galF1ZXJ5LnR5cGUoIHJlZCApLAoJCQlyZ2JhID0gdGhpcy5fcmdiYSA9IFtdOwoKCQkvLyBtb3JlIHRoYW4gMSBhcmd1bWVudCBzcGVjaWZpZWQgLSBhc3N1bWUgKCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSApCgkJaWYgKCBncmVlbiAhPT0gdW5kZWZpbmVkICkgewoJCQlyZWQgPSBbIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhIF07CgkJCXR5cGUgPSAiYXJyYXkiOwoJCX0KCgkJaWYgKCB0eXBlID09PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIHRoaXMucGFyc2UoIHN0cmluZ1BhcnNlKCByZWQgKSB8fCBjb2xvcnMuX2RlZmF1bHQgKTsKCQl9CgoJCWlmICggdHlwZSA9PT0gImFycmF5IiApIHsKCQkJZWFjaCggc3BhY2VzLnJnYmEucHJvcHMsIGZ1bmN0aW9uKCBrZXksIHByb3AgKSB7CgkJCQlyZ2JhWyBwcm9wLmlkeCBdID0gY2xhbXAoIHJlZFsgcHJvcC5pZHggXSwgcHJvcCApOwoJCQl9KTsKCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQlpZiAoIHR5cGUgPT09ICJvYmplY3QiICkgewoJCQlpZiAoIHJlZCBpbnN0YW5jZW9mIGNvbG9yICkgewoJCQkJZWFjaCggc3BhY2VzLCBmdW5jdGlvbiggc3BhY2VOYW1lLCBzcGFjZSApIHsKCQkJCQlpZiAoIHJlZFsgc3BhY2UuY2FjaGUgXSApIHsKCQkJCQkJaW5zdFsgc3BhY2UuY2FjaGUgXSA9IHJlZFsgc3BhY2UuY2FjaGUgXS5zbGljZSgpOwoJCQkJCX0KCQkJCX0pOwoJCQl9IGVsc2UgewoJCQkJZWFjaCggc3BhY2VzLCBmdW5jdGlvbiggc3BhY2VOYW1lLCBzcGFjZSApIHsKCQkJCQl2YXIgY2FjaGUgPSBzcGFjZS5jYWNoZTsKCQkJCQllYWNoKCBzcGFjZS5wcm9wcywgZnVuY3Rpb24oIGtleSwgcHJvcCApIHsKCgkJCQkJCS8vIGlmIHRoZSBjYWNoZSBkb2Vzbid0IGV4aXN0LCBhbmQgd2Uga25vdyBob3cgdG8gY29udmVydAoJCQkJCQlpZiAoICFpbnN0WyBjYWNoZSBdICYmIHNwYWNlLnRvICkgewoKCQkJCQkJCS8vIGlmIHRoZSB2YWx1ZSB3YXMgbnVsbCwgd2UgZG9uJ3QgbmVlZCB0byBjb3B5IGl0CgkJCQkJCQkvLyBpZiB0aGUga2V5IHdhcyBhbHBoYSwgd2UgZG9uJ3QgbmVlZCB0byBjb3B5IGl0IGVpdGhlcgoJCQkJCQkJaWYgKCBrZXkgPT09ICJhbHBoYSIgfHwgcmVkWyBrZXkgXSA9PSBudWxsICkgewoJCQkJCQkJCXJldHVybjsKCQkJCQkJCX0KCQkJCQkJCWluc3RbIGNhY2hlIF0gPSBzcGFjZS50byggaW5zdC5fcmdiYSApOwoJCQkJCQl9CgoJCQkJCQkvLyB0aGlzIGlzIHRoZSBvbmx5IGNhc2Ugd2hlcmUgd2UgYWxsb3cgbnVsbHMgZm9yIEFMTCBwcm9wZXJ0aWVzLgoJCQkJCQkvLyBjYWxsIGNsYW1wIHdpdGggYWx3YXlzQWxsb3dFbXB0eQoJCQkJCQlpbnN0WyBjYWNoZSBdWyBwcm9wLmlkeCBdID0gY2xhbXAoIHJlZFsga2V5IF0sIHByb3AsIHRydWUgKTsKCQkJCQl9KTsKCgkJCQkJLy8gZXZlcnl0aGluZyBkZWZpbmVkIGJ1dCBhbHBoYT8KCQkJCQlpZiAoIGluc3RbIGNhY2hlIF0gJiYgJC5pbkFycmF5KCBudWxsLCBpbnN0WyBjYWNoZSBdLnNsaWNlKCAwLCAzICkgKSA8IDAgKSB7CgkJCQkJCS8vIHVzZSB0aGUgZGVmYXVsdCBvZiAxCgkJCQkJCWluc3RbIGNhY2hlIF1bIDMgXSA9IDE7CgkJCQkJCWlmICggc3BhY2UuZnJvbSApIHsKCQkJCQkJCWluc3QuX3JnYmEgPSBzcGFjZS5mcm9tKCBpbnN0WyBjYWNoZSBdICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9KTsKCQkJfQoJCQlyZXR1cm4gdGhpczsKCQl9Cgl9LAoJaXM6IGZ1bmN0aW9uKCBjb21wYXJlICkgewoJCXZhciBpcyA9IGNvbG9yKCBjb21wYXJlICksCgkJCXNhbWUgPSB0cnVlLAoJCQlpbnN0ID0gdGhpczsKCgkJZWFjaCggc3BhY2VzLCBmdW5jdGlvbiggXywgc3BhY2UgKSB7CgkJCXZhciBsb2NhbENhY2hlLAoJCQkJaXNDYWNoZSA9IGlzWyBzcGFjZS5jYWNoZSBdOwoJCQlpZiAoaXNDYWNoZSkgewoJCQkJbG9jYWxDYWNoZSA9IGluc3RbIHNwYWNlLmNhY2hlIF0gfHwgc3BhY2UudG8gJiYgc3BhY2UudG8oIGluc3QuX3JnYmEgKSB8fCBbXTsKCQkJCWVhY2goIHNwYWNlLnByb3BzLCBmdW5jdGlvbiggXywgcHJvcCApIHsKCQkJCQlpZiAoIGlzQ2FjaGVbIHByb3AuaWR4IF0gIT0gbnVsbCApIHsKCQkJCQkJc2FtZSA9ICggaXNDYWNoZVsgcHJvcC5pZHggXSA9PT0gbG9jYWxDYWNoZVsgcHJvcC5pZHggXSApOwoJCQkJCQlyZXR1cm4gc2FtZTsKCQkJCQl9CgkJCQl9KTsKCQkJfQoJCQlyZXR1cm4gc2FtZTsKCQl9KTsKCQlyZXR1cm4gc2FtZTsKCX0sCglfc3BhY2U6IGZ1bmN0aW9uKCkgewoJCXZhciB1c2VkID0gW10sCgkJCWluc3QgPSB0aGlzOwoJCWVhY2goIHNwYWNlcywgZnVuY3Rpb24oIHNwYWNlTmFtZSwgc3BhY2UgKSB7CgkJCWlmICggaW5zdFsgc3BhY2UuY2FjaGUgXSApIHsKCQkJCXVzZWQucHVzaCggc3BhY2VOYW1lICk7CgkJCX0KCQl9KTsKCQlyZXR1cm4gdXNlZC5wb3AoKTsKCX0sCgl0cmFuc2l0aW9uOiBmdW5jdGlvbiggb3RoZXIsIGRpc3RhbmNlICkgewoJCXZhciBlbmQgPSBjb2xvciggb3RoZXIgKSwKCQkJc3BhY2VOYW1lID0gZW5kLl9zcGFjZSgpLAoJCQlzcGFjZSA9IHNwYWNlc1sgc3BhY2VOYW1lIF0sCgkJCXN0YXJ0Q29sb3IgPSB0aGlzLmFscGhhKCkgPT09IDAgPyBjb2xvciggInRyYW5zcGFyZW50IiApIDogdGhpcywKCQkJc3RhcnQgPSBzdGFydENvbG9yWyBzcGFjZS5jYWNoZSBdIHx8IHNwYWNlLnRvKCBzdGFydENvbG9yLl9yZ2JhICksCgkJCXJlc3VsdCA9IHN0YXJ0LnNsaWNlKCk7CgoJCWVuZCA9IGVuZFsgc3BhY2UuY2FjaGUgXTsKCQllYWNoKCBzcGFjZS5wcm9wcywgZnVuY3Rpb24oIGtleSwgcHJvcCApIHsKCQkJdmFyIGluZGV4ID0gcHJvcC5pZHgsCgkJCQlzdGFydFZhbHVlID0gc3RhcnRbIGluZGV4IF0sCgkJCQllbmRWYWx1ZSA9IGVuZFsgaW5kZXggXSwKCQkJCXR5cGUgPSBwcm9wVHlwZXNbIHByb3AudHlwZSBdIHx8IHt9OwoKCQkJLy8gaWYgbnVsbCwgZG9uJ3Qgb3ZlcnJpZGUgc3RhcnQgdmFsdWUKCQkJaWYgKCBlbmRWYWx1ZSA9PT0gbnVsbCApIHsKCQkJCXJldHVybjsKCQkJfQoJCQkvLyBpZiBudWxsIC0gdXNlIGVuZAoJCQlpZiAoIHN0YXJ0VmFsdWUgPT09IG51bGwgKSB7CgkJCQlyZXN1bHRbIGluZGV4IF0gPSBlbmRWYWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggdHlwZS5tb2QgKSB7CgkJCQkJaWYgKCBlbmRWYWx1ZSAtIHN0YXJ0VmFsdWUgPiB0eXBlLm1vZCAvIDIgKSB7CgkJCQkJCXN0YXJ0VmFsdWUgKz0gdHlwZS5tb2Q7CgkJCQkJfSBlbHNlIGlmICggc3RhcnRWYWx1ZSAtIGVuZFZhbHVlID4gdHlwZS5tb2QgLyAyICkgewoJCQkJCQlzdGFydFZhbHVlIC09IHR5cGUubW9kOwoJCQkJCX0KCQkJCX0KCQkJCXJlc3VsdFsgaW5kZXggXSA9IGNsYW1wKCAoIGVuZFZhbHVlIC0gc3RhcnRWYWx1ZSApICogZGlzdGFuY2UgKyBzdGFydFZhbHVlLCBwcm9wICk7CgkJCX0KCQl9KTsKCQlyZXR1cm4gdGhpc1sgc3BhY2VOYW1lIF0oIHJlc3VsdCApOwoJfSwKCWJsZW5kOiBmdW5jdGlvbiggb3BhcXVlICkgewoJCS8vIGlmIHdlIGFyZSBhbHJlYWR5IG9wYXF1ZSAtIHJldHVybiBvdXJzZWxmCgkJaWYgKCB0aGlzLl9yZ2JhWyAzIF0gPT09IDEgKSB7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJdmFyIHJnYiA9IHRoaXMuX3JnYmEuc2xpY2UoKSwKCQkJYSA9IHJnYi5wb3AoKSwKCQkJYmxlbmQgPSBjb2xvciggb3BhcXVlICkuX3JnYmE7CgoJCXJldHVybiBjb2xvciggalF1ZXJ5Lm1hcCggcmdiLCBmdW5jdGlvbiggdiwgaSApIHsKCQkJcmV0dXJuICggMSAtIGEgKSAqIGJsZW5kWyBpIF0gKyBhICogdjsKCQl9KSk7Cgl9LAoJdG9SZ2JhU3RyaW5nOiBmdW5jdGlvbigpIHsKCQl2YXIgcHJlZml4ID0gInJnYmEoIiwKCQkJcmdiYSA9IGpRdWVyeS5tYXAoIHRoaXMuX3JnYmEsIGZ1bmN0aW9uKCB2LCBpICkgewoJCQkJcmV0dXJuIHYgPT0gbnVsbCA/ICggaSA+IDIgPyAxIDogMCApIDogdjsKCQkJfSk7CgoJCWlmICggcmdiYVsgMyBdID09PSAxICkgewoJCQlyZ2JhLnBvcCgpOwoJCQlwcmVmaXggPSAicmdiKCI7CgkJfQoKCQlyZXR1cm4gcHJlZml4ICsgcmdiYS5qb2luKCkgKyAiKSI7Cgl9LAoJdG9Ic2xhU3RyaW5nOiBmdW5jdGlvbigpIHsKCQl2YXIgcHJlZml4ID0gImhzbGEoIiwKCQkJaHNsYSA9IGpRdWVyeS5tYXAoIHRoaXMuaHNsYSgpLCBmdW5jdGlvbiggdiwgaSApIHsKCQkJCWlmICggdiA9PSBudWxsICkgewoJCQkJCXYgPSBpID4gMiA/IDEgOiAwOwoJCQkJfQoKCQkJCS8vIGNhdGNoIDEgYW5kIDIKCQkJCWlmICggaSAmJiBpIDwgMyApIHsKCQkJCQl2ID0gTWF0aC5yb3VuZCggdiAqIDEwMCApICsgIiUiOwoJCQkJfQoJCQkJcmV0dXJuIHY7CgkJCX0pOwoKCQlpZiAoIGhzbGFbIDMgXSA9PT0gMSApIHsKCQkJaHNsYS5wb3AoKTsKCQkJcHJlZml4ID0gImhzbCgiOwoJCX0KCQlyZXR1cm4gcHJlZml4ICsgaHNsYS5qb2luKCkgKyAiKSI7Cgl9LAoJdG9IZXhTdHJpbmc6IGZ1bmN0aW9uKCBpbmNsdWRlQWxwaGEgKSB7CgkJdmFyIHJnYmEgPSB0aGlzLl9yZ2JhLnNsaWNlKCksCgkJCWFscGhhID0gcmdiYS5wb3AoKTsKCgkJaWYgKCBpbmNsdWRlQWxwaGEgKSB7CgkJCXJnYmEucHVzaCggfn4oIGFscGhhICogMjU1ICkgKTsKCQl9CgoJCXJldHVybiAiIyIgKyBqUXVlcnkubWFwKCByZ2JhLCBmdW5jdGlvbiggdiApIHsKCgkJCS8vIGRlZmF1bHQgdG8gMCB3aGVuIG51bGxzIGV4aXN0CgkJCXYgPSAoIHYgfHwgMCApLnRvU3RyaW5nKCAxNiApOwoJCQlyZXR1cm4gdi5sZW5ndGggPT09IDEgPyAiMCIgKyB2IDogdjsKCQl9KS5qb2luKCIiKTsKCX0sCgl0b1N0cmluZzogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3JnYmFbIDMgXSA9PT0gMCA/ICJ0cmFuc3BhcmVudCIgOiB0aGlzLnRvUmdiYVN0cmluZygpOwoJfQp9KTsKY29sb3IuZm4ucGFyc2UucHJvdG90eXBlID0gY29sb3IuZm47CgovLyBoc2xhIGNvbnZlcnNpb25zIGFkYXB0ZWQgZnJvbToKLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9tYWFzaGFhY2svc291cmNlL2Jyb3dzZS9wYWNrYWdlcy9ncmFwaGljcy90cnVuay9zcmMvZ3JhcGhpY3MvY29sb3JzL0hVRTJSR0IuYXM/cj01MDIxCgpmdW5jdGlvbiBodWUycmdiKCBwLCBxLCBoICkgewoJaCA9ICggaCArIDEgKSAlIDE7CglpZiAoIGggKiA2IDwgMSApIHsKCQlyZXR1cm4gcCArIChxIC0gcCkgKiBoICogNjsKCX0KCWlmICggaCAqIDIgPCAxKSB7CgkJcmV0dXJuIHE7Cgl9CglpZiAoIGggKiAzIDwgMiApIHsKCQlyZXR1cm4gcCArIChxIC0gcCkgKiAoKDIvMykgLSBoKSAqIDY7Cgl9CglyZXR1cm4gcDsKfQoKc3BhY2VzLmhzbGEudG8gPSBmdW5jdGlvbiAoIHJnYmEgKSB7CglpZiAoIHJnYmFbIDAgXSA9PSBudWxsIHx8IHJnYmFbIDEgXSA9PSBudWxsIHx8IHJnYmFbIDIgXSA9PSBudWxsICkgewoJCXJldHVybiBbIG51bGwsIG51bGwsIG51bGwsIHJnYmFbIDMgXSBdOwoJfQoJdmFyIHIgPSByZ2JhWyAwIF0gLyAyNTUsCgkJZyA9IHJnYmFbIDEgXSAvIDI1NSwKCQliID0gcmdiYVsgMiBdIC8gMjU1LAoJCWEgPSByZ2JhWyAzIF0sCgkJbWF4ID0gTWF0aC5tYXgoIHIsIGcsIGIgKSwKCQltaW4gPSBNYXRoLm1pbiggciwgZywgYiApLAoJCWRpZmYgPSBtYXggLSBtaW4sCgkJYWRkID0gbWF4ICsgbWluLAoJCWwgPSBhZGQgKiAwLjUsCgkJaCwgczsKCglpZiAoIG1pbiA9PT0gbWF4ICkgewoJCWggPSAwOwoJfSBlbHNlIGlmICggciA9PT0gbWF4ICkgewoJCWggPSAoIDYwICogKCBnIC0gYiApIC8gZGlmZiApICsgMzYwOwoJfSBlbHNlIGlmICggZyA9PT0gbWF4ICkgewoJCWggPSAoIDYwICogKCBiIC0gciApIC8gZGlmZiApICsgMTIwOwoJfSBlbHNlIHsKCQloID0gKCA2MCAqICggciAtIGcgKSAvIGRpZmYgKSArIDI0MDsKCX0KCglpZiAoIGwgPT09IDAgfHwgbCA9PT0gMSApIHsKCQlzID0gbDsKCX0gZWxzZSBpZiAoIGwgPD0gMC41ICkgewoJCXMgPSBkaWZmIC8gYWRkOwoJfSBlbHNlIHsKCQlzID0gZGlmZiAvICggMiAtIGFkZCApOwoJfQoJcmV0dXJuIFsgTWF0aC5yb3VuZChoKSAlIDM2MCwgcywgbCwgYSA9PSBudWxsID8gMSA6IGEgXTsKfTsKCnNwYWNlcy5oc2xhLmZyb20gPSBmdW5jdGlvbiAoIGhzbGEgKSB7CglpZiAoIGhzbGFbIDAgXSA9PSBudWxsIHx8IGhzbGFbIDEgXSA9PSBudWxsIHx8IGhzbGFbIDIgXSA9PSBudWxsICkgewoJCXJldHVybiBbIG51bGwsIG51bGwsIG51bGwsIGhzbGFbIDMgXSBdOwoJfQoJdmFyIGggPSBoc2xhWyAwIF0gLyAzNjAsCgkJcyA9IGhzbGFbIDEgXSwKCQlsID0gaHNsYVsgMiBdLAoJCWEgPSBoc2xhWyAzIF0sCgkJcSA9IGwgPD0gMC41ID8gbCAqICggMSArIHMgKSA6IGwgKyBzIC0gbCAqIHMsCgkJcCA9IDIgKiBsIC0gcTsKCglyZXR1cm4gWwoJCU1hdGgucm91bmQoIGh1ZTJyZ2IoIHAsIHEsIGggKyAoIDEgLyAzICkgKSAqIDI1NSApLAoJCU1hdGgucm91bmQoIGh1ZTJyZ2IoIHAsIHEsIGggKSAqIDI1NSApLAoJCU1hdGgucm91bmQoIGh1ZTJyZ2IoIHAsIHEsIGggLSAoIDEgLyAzICkgKSAqIDI1NSApLAoJCWEKCV07Cn07CgoKZWFjaCggc3BhY2VzLCBmdW5jdGlvbiggc3BhY2VOYW1lLCBzcGFjZSApIHsKCXZhciBwcm9wcyA9IHNwYWNlLnByb3BzLAoJCWNhY2hlID0gc3BhY2UuY2FjaGUsCgkJdG8gPSBzcGFjZS50bywKCQlmcm9tID0gc3BhY2UuZnJvbTsKCgkvLyBtYWtlcyByZ2JhKCkgYW5kIGhzbGEoKQoJY29sb3IuZm5bIHNwYWNlTmFtZSBdID0gZnVuY3Rpb24oIHZhbHVlICkgewoKCQkvLyBnZW5lcmF0ZSBhIGNhY2hlIGZvciB0aGlzIHNwYWNlIGlmIGl0IGRvZXNuJ3QgZXhpc3QKCQlpZiAoIHRvICYmICF0aGlzWyBjYWNoZSBdICkgewoJCQl0aGlzWyBjYWNoZSBdID0gdG8oIHRoaXMuX3JnYmEgKTsKCQl9CgkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgewoJCQlyZXR1cm4gdGhpc1sgY2FjaGUgXS5zbGljZSgpOwoJCX0KCgkJdmFyIHJldCwKCQkJdHlwZSA9IGpRdWVyeS50eXBlKCB2YWx1ZSApLAoJCQlhcnIgPSAoIHR5cGUgPT09ICJhcnJheSIgfHwgdHlwZSA9PT0gIm9iamVjdCIgKSA/IHZhbHVlIDogYXJndW1lbnRzLAoJCQlsb2NhbCA9IHRoaXNbIGNhY2hlIF0uc2xpY2UoKTsKCgkJZWFjaCggcHJvcHMsIGZ1bmN0aW9uKCBrZXksIHByb3AgKSB7CgkJCXZhciB2YWwgPSBhcnJbIHR5cGUgPT09ICJvYmplY3QiID8ga2V5IDogcHJvcC5pZHggXTsKCQkJaWYgKCB2YWwgPT0gbnVsbCApIHsKCQkJCXZhbCA9IGxvY2FsWyBwcm9wLmlkeCBdOwoJCQl9CgkJCWxvY2FsWyBwcm9wLmlkeCBdID0gY2xhbXAoIHZhbCwgcHJvcCApOwoJCX0pOwoKCQlpZiAoIGZyb20gKSB7CgkJCXJldCA9IGNvbG9yKCBmcm9tKCBsb2NhbCApICk7CgkJCXJldFsgY2FjaGUgXSA9IGxvY2FsOwoJCQlyZXR1cm4gcmV0OwoJCX0gZWxzZSB7CgkJCXJldHVybiBjb2xvciggbG9jYWwgKTsKCQl9Cgl9OwoKCS8vIG1ha2VzIHJlZCgpIGdyZWVuKCkgYmx1ZSgpIGFscGhhKCkgaHVlKCkgc2F0dXJhdGlvbigpIGxpZ2h0bmVzcygpCgllYWNoKCBwcm9wcywgZnVuY3Rpb24oIGtleSwgcHJvcCApIHsKCQkvLyBhbHBoYSBpcyBpbmNsdWRlZCBpbiBtb3JlIHRoYW4gb25lIHNwYWNlCgkJaWYgKCBjb2xvci5mblsga2V5IF0gKSB7CgkJCXJldHVybjsKCQl9CgkJY29sb3IuZm5bIGtleSBdID0gZnVuY3Rpb24oIHZhbHVlICkgewoJCQl2YXIgdnR5cGUgPSBqUXVlcnkudHlwZSggdmFsdWUgKSwKCQkJCWZuID0gKCBrZXkgPT09ICJhbHBoYSIgPyAoIHRoaXMuX2hzbGEgPyAiaHNsYSIgOiAicmdiYSIgKSA6IHNwYWNlTmFtZSApLAoJCQkJbG9jYWwgPSB0aGlzWyBmbiBdKCksCgkJCQljdXIgPSBsb2NhbFsgcHJvcC5pZHggXSwKCQkJCW1hdGNoOwoKCQkJaWYgKCB2dHlwZSA9PT0gInVuZGVmaW5lZCIgKSB7CgkJCQlyZXR1cm4gY3VyOwoJCQl9CgoJCQlpZiAoIHZ0eXBlID09PSAiZnVuY3Rpb24iICkgewoJCQkJdmFsdWUgPSB2YWx1ZS5jYWxsKCB0aGlzLCBjdXIgKTsKCQkJCXZ0eXBlID0galF1ZXJ5LnR5cGUoIHZhbHVlICk7CgkJCX0KCQkJaWYgKCB2YWx1ZSA9PSBudWxsICYmIHByb3AuZW1wdHkgKSB7CgkJCQlyZXR1cm4gdGhpczsKCQkJfQoJCQlpZiAoIHZ0eXBlID09PSAic3RyaW5nIiApIHsKCQkJCW1hdGNoID0gcnBsdXNlcXVhbHMuZXhlYyggdmFsdWUgKTsKCQkJCWlmICggbWF0Y2ggKSB7CgkJCQkJdmFsdWUgPSBjdXIgKyBwYXJzZUZsb2F0KCBtYXRjaFsgMiBdICkgKiAoIG1hdGNoWyAxIF0gPT09ICIrIiA/IDEgOiAtMSApOwoJCQkJfQoJCQl9CgkJCWxvY2FsWyBwcm9wLmlkeCBdID0gdmFsdWU7CgkJCXJldHVybiB0aGlzWyBmbiBdKCBsb2NhbCApOwoJCX07Cgl9KTsKfSk7CgovLyBhZGQgLmZ4LnN0ZXAgZnVuY3Rpb25zCmVhY2goIHN0ZXBIb29rcywgZnVuY3Rpb24oIGksIGhvb2sgKSB7CglqUXVlcnkuY3NzSG9va3NbIGhvb2sgXSA9IHsKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJdmFyIHBhcnNlZCwgY3VyRWxlbSwKCQkJCWJhY2tncm91bmRDb2xvciA9ICIiOwoKCQkJaWYgKCBqUXVlcnkudHlwZSggdmFsdWUgKSAhPT0gInN0cmluZyIgfHwgKCBwYXJzZWQgPSBzdHJpbmdQYXJzZSggdmFsdWUgKSApICkgewoJCQkJdmFsdWUgPSBjb2xvciggcGFyc2VkIHx8IHZhbHVlICk7CgkJCQlpZiAoICFzdXBwb3J0LnJnYmEgJiYgdmFsdWUuX3JnYmFbIDMgXSAhPT0gMSApIHsKCQkJCQljdXJFbGVtID0gaG9vayA9PT0gImJhY2tncm91bmRDb2xvciIgPyBlbGVtLnBhcmVudE5vZGUgOiBlbGVtOwoJCQkJCXdoaWxlICgKCQkJCQkJKGJhY2tncm91bmRDb2xvciA9PT0gIiIgfHwgYmFja2dyb3VuZENvbG9yID09PSAidHJhbnNwYXJlbnQiKSAmJgoJCQkJCQljdXJFbGVtICYmIGN1ckVsZW0uc3R5bGUKCQkJCQkpIHsKCQkJCQkJdHJ5IHsKCQkJCQkJCWJhY2tncm91bmRDb2xvciA9IGpRdWVyeS5jc3MoIGN1ckVsZW0sICJiYWNrZ3JvdW5kQ29sb3IiICk7CgkJCQkJCQljdXJFbGVtID0gY3VyRWxlbS5wYXJlbnROb2RlOwoJCQkJCQl9IGNhdGNoICggZSApIHsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJdmFsdWUgPSB2YWx1ZS5ibGVuZCggYmFja2dyb3VuZENvbG9yICYmIGJhY2tncm91bmRDb2xvciAhPT0gInRyYW5zcGFyZW50IiA/CgkJCQkJCWJhY2tncm91bmRDb2xvciA6CgkJCQkJCSJfZGVmYXVsdCIgKTsKCQkJCX0KCgkJCQl2YWx1ZSA9IHZhbHVlLnRvUmdiYVN0cmluZygpOwoJCQl9CgkJCXRyeSB7CgkJCQllbGVtLnN0eWxlWyBob29rIF0gPSB2YWx1ZTsKCQkJfSBjYXRjaCggZXJyb3IgKSB7CgkJCQkvLyB3cmFwcGVkIHRvIHByZXZlbnQgSUUgZnJvbSB0aHJvd2luZyBlcnJvcnMgb24gImludmFsaWQiIHZhbHVlcyBsaWtlICdhdXRvJyBvciAnaW5oZXJpdCcKCQkJfQoJCX0KCX07CglqUXVlcnkuZnguc3RlcFsgaG9vayBdID0gZnVuY3Rpb24oIGZ4ICkgewoJCWlmICggIWZ4LmNvbG9ySW5pdCApIHsKCQkJZnguc3RhcnQgPSBjb2xvciggZnguZWxlbSwgaG9vayApOwoJCQlmeC5lbmQgPSBjb2xvciggZnguZW5kICk7CgkJCWZ4LmNvbG9ySW5pdCA9IHRydWU7CgkJfQoJCWpRdWVyeS5jc3NIb29rc1sgaG9vayBdLnNldCggZnguZWxlbSwgZnguc3RhcnQudHJhbnNpdGlvbiggZnguZW5kLCBmeC5wb3MgKSApOwoJfTsKfSk7CgpqUXVlcnkuY3NzSG9va3MuYm9yZGVyQ29sb3IgPSB7CglleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQl2YXIgZXhwYW5kZWQgPSB7fTsKCgkJZWFjaCggWyAiVG9wIiwgIlJpZ2h0IiwgIkJvdHRvbSIsICJMZWZ0IiBdLCBmdW5jdGlvbiggaSwgcGFydCApIHsKCQkJZXhwYW5kZWRbICJib3JkZXIiICsgcGFydCArICJDb2xvciIgXSA9IHZhbHVlOwoJCX0pOwoJCXJldHVybiBleHBhbmRlZDsKCX0KfTsKCi8vIEJhc2ljIGNvbG9yIG5hbWVzIG9ubHkuCi8vIFVzYWdlIG9mIGFueSBvZiB0aGUgb3RoZXIgY29sb3IgbmFtZXMgcmVxdWlyZXMgYWRkaW5nIHlvdXJzZWxmIG9yIGluY2x1ZGluZwovLyBqcXVlcnkuY29sb3Iuc3ZnLW5hbWVzLmpzLgpjb2xvcnMgPSBqUXVlcnkuQ29sb3IubmFtZXMgPSB7CgkvLyA0LjEuIEJhc2ljIGNvbG9yIGtleXdvcmRzCglhcXVhOiAiIzAwZmZmZiIsCglibGFjazogIiMwMDAwMDAiLAoJYmx1ZTogIiMwMDAwZmYiLAoJZnVjaHNpYTogIiNmZjAwZmYiLAoJZ3JheTogIiM4MDgwODAiLAoJZ3JlZW46ICIjMDA4MDAwIiwKCWxpbWU6ICIjMDBmZjAwIiwKCW1hcm9vbjogIiM4MDAwMDAiLAoJbmF2eTogIiMwMDAwODAiLAoJb2xpdmU6ICIjODA4MDAwIiwKCXB1cnBsZTogIiM4MDAwODAiLAoJcmVkOiAiI2ZmMDAwMCIsCglzaWx2ZXI6ICIjYzBjMGMwIiwKCXRlYWw6ICIjMDA4MDgwIiwKCXdoaXRlOiAiI2ZmZmZmZiIsCgl5ZWxsb3c6ICIjZmZmZjAwIiwKCgkvLyA0LjIuMy4gInRyYW5zcGFyZW50IiBjb2xvciBrZXl3b3JkCgl0cmFuc3BhcmVudDogWyBudWxsLCBudWxsLCBudWxsLCAwIF0sCgoJX2RlZmF1bHQ6ICIjZmZmZmZmIgp9OwoKfSkoIGpRdWVyeSApOwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENMQVNTIEFOSU1BVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwooZnVuY3Rpb24oKSB7Cgp2YXIgY2xhc3NBbmltYXRpb25BY3Rpb25zID0gWyAiYWRkIiwgInJlbW92ZSIsICJ0b2dnbGUiIF0sCglzaG9ydGhhbmRTdHlsZXMgPSB7CgkJYm9yZGVyOiAxLAoJCWJvcmRlckJvdHRvbTogMSwKCQlib3JkZXJDb2xvcjogMSwKCQlib3JkZXJMZWZ0OiAxLAoJCWJvcmRlclJpZ2h0OiAxLAoJCWJvcmRlclRvcDogMSwKCQlib3JkZXJXaWR0aDogMSwKCQltYXJnaW46IDEsCgkJcGFkZGluZzogMQoJfTsKCiQuZWFjaChbICJib3JkZXJMZWZ0U3R5bGUiLCAiYm9yZGVyUmlnaHRTdHlsZSIsICJib3JkZXJCb3R0b21TdHlsZSIsICJib3JkZXJUb3BTdHlsZSIgXSwgZnVuY3Rpb24oIF8sIHByb3AgKSB7CgkkLmZ4LnN0ZXBbIHByb3AgXSA9IGZ1bmN0aW9uKCBmeCApIHsKCQlpZiAoIGZ4LmVuZCAhPT0gIm5vbmUiICYmICFmeC5zZXRBdHRyIHx8IGZ4LnBvcyA9PT0gMSAmJiAhZnguc2V0QXR0ciApIHsKCQkJalF1ZXJ5LnN0eWxlKCBmeC5lbGVtLCBwcm9wLCBmeC5lbmQgKTsKCQkJZnguc2V0QXR0ciA9IHRydWU7CgkJfQoJfTsKfSk7CgpmdW5jdGlvbiBnZXRFbGVtZW50U3R5bGVzKCkgewoJdmFyIHN0eWxlID0gdGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ID8KCQkJdGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoIHRoaXMsIG51bGwgKSA6CgkJCXRoaXMuY3VycmVudFN0eWxlLAoJCW5ld1N0eWxlID0ge30sCgkJa2V5LAoJCWxlbjsKCgkvLyB3ZWJraXQgZW51bWVyYXRlcyBzdHlsZSBwb3JwZXJ0aWVzCglpZiAoIHN0eWxlICYmIHN0eWxlLmxlbmd0aCAmJiBzdHlsZVsgMCBdICYmIHN0eWxlWyBzdHlsZVsgMCBdIF0gKSB7CgkJbGVuID0gc3R5bGUubGVuZ3RoOwoJCXdoaWxlICggbGVuLS0gKSB7CgkJCWtleSA9IHN0eWxlWyBsZW4gXTsKCQkJaWYgKCB0eXBlb2Ygc3R5bGVbIGtleSBdID09PSAic3RyaW5nIiApIHsKCQkJCW5ld1N0eWxlWyAkLmNhbWVsQ2FzZSgga2V5ICkgXSA9IHN0eWxlWyBrZXkgXTsKCQkJfQoJCX0KCX0gZWxzZSB7CgkJZm9yICgga2V5IGluIHN0eWxlICkgewoJCQlpZiAoIHR5cGVvZiBzdHlsZVsga2V5IF0gPT09ICJzdHJpbmciICkgewoJCQkJbmV3U3R5bGVbIGtleSBdID0gc3R5bGVbIGtleSBdOwoJCQl9CgkJfQoJfQoKCXJldHVybiBuZXdTdHlsZTsKfQoKCmZ1bmN0aW9uIHN0eWxlRGlmZmVyZW5jZSggb2xkU3R5bGUsIG5ld1N0eWxlICkgewoJdmFyIGRpZmYgPSB7fSwKCQluYW1lLCB2YWx1ZTsKCglmb3IgKCBuYW1lIGluIG5ld1N0eWxlICkgewoJCXZhbHVlID0gbmV3U3R5bGVbIG5hbWUgXTsKCQlpZiAoIG9sZFN0eWxlWyBuYW1lIF0gIT09IHZhbHVlICkgewoJCQlpZiAoICFzaG9ydGhhbmRTdHlsZXNbIG5hbWUgXSApIHsKCQkJCWlmICggJC5meC5zdGVwWyBuYW1lIF0gfHwgIWlzTmFOKCBwYXJzZUZsb2F0KCB2YWx1ZSApICkgKSB7CgkJCQkJZGlmZlsgbmFtZSBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIGRpZmY7Cn0KCiQuZWZmZWN0cy5hbmltYXRlQ2xhc3MgPSBmdW5jdGlvbiggdmFsdWUsIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJdmFyIG8gPSAkLnNwZWVkKCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjayApOwoKCXJldHVybiB0aGlzLnF1ZXVlKCBmdW5jdGlvbigpIHsKCQl2YXIgYW5pbWF0ZWQgPSAkKCB0aGlzICksCgkJCWJhc2VDbGFzcyA9IGFuaW1hdGVkLmF0dHIoICJjbGFzcyIgKSB8fCAiIiwKCQkJYXBwbHlDbGFzc0NoYW5nZSwKCQkJYWxsQW5pbWF0aW9ucyA9IG8uY2hpbGRyZW4gPyBhbmltYXRlZC5maW5kKCAiKiIgKS5hbmRTZWxmKCkgOiBhbmltYXRlZDsKCgkJLy8gbWFwIHRoZSBhbmltYXRlZCBvYmplY3RzIHRvIHN0b3JlIHRoZSBvcmlnaW5hbCBzdHlsZXMuCgkJYWxsQW5pbWF0aW9ucyA9IGFsbEFuaW1hdGlvbnMubWFwKGZ1bmN0aW9uKCkgewoJCQl2YXIgZWwgPSAkKCB0aGlzICk7CgkJCXJldHVybiB7CgkJCQllbDogZWwsCgkJCQlzdGFydDogZ2V0RWxlbWVudFN0eWxlcy5jYWxsKCB0aGlzICkKCQkJfTsKCQl9KTsKCgkJLy8gYXBwbHkgY2xhc3MgY2hhbmdlCgkJYXBwbHlDbGFzc0NoYW5nZSA9IGZ1bmN0aW9uKCkgewoJCQkkLmVhY2goIGNsYXNzQW5pbWF0aW9uQWN0aW9ucywgZnVuY3Rpb24oaSwgYWN0aW9uKSB7CgkJCQlpZiAoIHZhbHVlWyBhY3Rpb24gXSApIHsKCQkJCQlhbmltYXRlZFsgYWN0aW9uICsgIkNsYXNzIiBdKCB2YWx1ZVsgYWN0aW9uIF0gKTsKCQkJCX0KCQkJfSk7CgkJfTsKCQlhcHBseUNsYXNzQ2hhbmdlKCk7CgoJCS8vIG1hcCBhbGwgYW5pbWF0ZWQgb2JqZWN0cyBhZ2FpbiAtIGNhbGN1bGF0ZSBuZXcgc3R5bGVzIGFuZCBkaWZmCgkJYWxsQW5pbWF0aW9ucyA9IGFsbEFuaW1hdGlvbnMubWFwKGZ1bmN0aW9uKCkgewoJCQl0aGlzLmVuZCA9IGdldEVsZW1lbnRTdHlsZXMuY2FsbCggdGhpcy5lbFsgMCBdICk7CgkJCXRoaXMuZGlmZiA9IHN0eWxlRGlmZmVyZW5jZSggdGhpcy5zdGFydCwgdGhpcy5lbmQgKTsKCQkJcmV0dXJuIHRoaXM7CgkJfSk7CgoJCS8vIGFwcGx5IG9yaWdpbmFsIGNsYXNzCgkJYW5pbWF0ZWQuYXR0ciggImNsYXNzIiwgYmFzZUNsYXNzICk7CgoJCS8vIG1hcCBhbGwgYW5pbWF0ZWQgb2JqZWN0cyBhZ2FpbiAtIHRoaXMgdGltZSBjb2xsZWN0aW5nIGEgcHJvbWlzZQoJCWFsbEFuaW1hdGlvbnMgPSBhbGxBbmltYXRpb25zLm1hcChmdW5jdGlvbigpIHsKCQkJdmFyIHN0eWxlSW5mbyA9IHRoaXMsCgkJCQlkZmQgPSAkLkRlZmVycmVkKCksCgkJCQlvcHRzID0galF1ZXJ5LmV4dGVuZCh7fSwgbywgewoJCQkJCXF1ZXVlOiBmYWxzZSwKCQkJCQljb21wbGV0ZTogZnVuY3Rpb24oKSB7CgkJCQkJCWRmZC5yZXNvbHZlKCBzdHlsZUluZm8gKTsKCQkJCQl9CgkJCQl9KTsKCgkJCXRoaXMuZWwuYW5pbWF0ZSggdGhpcy5kaWZmLCBvcHRzICk7CgkJCXJldHVybiBkZmQucHJvbWlzZSgpOwoJCX0pOwoKCQkvLyBvbmNlIGFsbCBhbmltYXRpb25zIGhhdmUgY29tcGxldGVkOgoJCSQud2hlbi5hcHBseSggJCwgYWxsQW5pbWF0aW9ucy5nZXQoKSApLmRvbmUoZnVuY3Rpb24oKSB7CgoJCQkvLyBzZXQgdGhlIGZpbmFsIGNsYXNzCgkJCWFwcGx5Q2xhc3NDaGFuZ2UoKTsKCgkJCS8vIGZvciBlYWNoIGFuaW1hdGVkIGVsZW1lbnQsCgkJCS8vIGNsZWFyIGFsbCBjc3MgcHJvcGVydGllcyB0aGF0IHdlcmUgYW5pbWF0ZWQKCQkJJC5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCkgewoJCQkJdmFyIGVsID0gdGhpcy5lbDsKCQkJCSQuZWFjaCggdGhpcy5kaWZmLCBmdW5jdGlvbihrZXkpIHsKCQkJCQllbC5jc3MoIGtleSwgJycgKTsKCQkJCX0pOwoJCQl9KTsKCgkJCS8vIHRoaXMgaXMgZ3Vhcm50ZWVkIHRvIGJlIHRoZXJlIGlmIHlvdSB1c2UgalF1ZXJ5LnNwZWVkKCkKCQkJLy8gaXQgYWxzbyBoYW5kbGVzIGRlcXVldWluZyB0aGUgbmV4dCBhbmltLi4uCgkJCW8uY29tcGxldGUuY2FsbCggYW5pbWF0ZWRbIDAgXSApOwoJCX0pOwoJfSk7Cn07CgokLmZuLmV4dGVuZCh7CglfYWRkQ2xhc3M6ICQuZm4uYWRkQ2xhc3MsCglhZGRDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiBzcGVlZCA/CgkJCSQuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCggdGhpcywKCQkJCXsgYWRkOiBjbGFzc05hbWVzIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgOgoJCQl0aGlzLl9hZGRDbGFzcyggY2xhc3NOYW1lcyApOwoJfSwKCglfcmVtb3ZlQ2xhc3M6ICQuZm4ucmVtb3ZlQ2xhc3MsCglyZW1vdmVDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiBzcGVlZCA/CgkJCSQuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCggdGhpcywKCQkJCXsgcmVtb3ZlOiBjbGFzc05hbWVzIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgOgoJCQl0aGlzLl9yZW1vdmVDbGFzcyggY2xhc3NOYW1lcyApOwoJfSwKCglfdG9nZ2xlQ2xhc3M6ICQuZm4udG9nZ2xlQ2xhc3MsCgl0b2dnbGVDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMsIGZvcmNlLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVvZiBmb3JjZSA9PT0gImJvb2xlYW4iIHx8IGZvcmNlID09PSB1bmRlZmluZWQgKSB7CgkJCWlmICggIXNwZWVkICkgewoJCQkJLy8gd2l0aG91dCBzcGVlZCBwYXJhbWV0ZXIKCQkJCXJldHVybiB0aGlzLl90b2dnbGVDbGFzcyggY2xhc3NOYW1lcywgZm9yY2UgKTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiAkLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwoIHRoaXMsCgkJCQkJKGZvcmNlID8geyBhZGQ6IGNsYXNzTmFtZXMgfSA6IHsgcmVtb3ZlOiBjbGFzc05hbWVzIH0pLAoJCQkJCXNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7CgkJCX0KCQl9IGVsc2UgewoJCQkvLyB3aXRob3V0IGZvcmNlIHBhcmFtZXRlcgoJCQlyZXR1cm4gJC5lZmZlY3RzLmFuaW1hdGVDbGFzcy5jYWxsKCB0aGlzLAoJCQkJeyB0b2dnbGU6IGNsYXNzTmFtZXMgfSwgZm9yY2UsIHNwZWVkLCBlYXNpbmcgKTsKCQl9Cgl9LAoKCXN3aXRjaENsYXNzOiBmdW5jdGlvbiggcmVtb3ZlLCBhZGQsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrKSB7CgkJcmV0dXJuICQuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCggdGhpcywgewoJCQlhZGQ6IGFkZCwKCQkJcmVtb3ZlOiByZW1vdmUKCQl9LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfQp9KTsKCn0pKCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRUZGRUNUUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKKGZ1bmN0aW9uKCkgewoKJC5leHRlbmQoICQuZWZmZWN0cywgewoJdmVyc2lvbjogIjEuOS4yIiwKCgkvLyBTYXZlcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGluIGEgZGF0YSBzdG9yYWdlCglzYXZlOiBmdW5jdGlvbiggZWxlbWVudCwgc2V0ICkgewoJCWZvciggdmFyIGk9MDsgaSA8IHNldC5sZW5ndGg7IGkrKyApIHsKCQkJaWYgKCBzZXRbIGkgXSAhPT0gbnVsbCApIHsKCQkJCWVsZW1lbnQuZGF0YSggZGF0YVNwYWNlICsgc2V0WyBpIF0sIGVsZW1lbnRbIDAgXS5zdHlsZVsgc2V0WyBpIF0gXSApOwoJCQl9CgkJfQoJfSwKCgkvLyBSZXN0b3JlcyBhIHNldCBvZiBwcmV2aW91c2x5IHNhdmVkIHByb3BlcnRpZXMgZnJvbSBhIGRhdGEgc3RvcmFnZQoJcmVzdG9yZTogZnVuY3Rpb24oIGVsZW1lbnQsIHNldCApIHsKCQl2YXIgdmFsLCBpOwoJCWZvciggaT0wOyBpIDwgc2V0Lmxlbmd0aDsgaSsrICkgewoJCQlpZiAoIHNldFsgaSBdICE9PSBudWxsICkgewoJCQkJdmFsID0gZWxlbWVudC5kYXRhKCBkYXRhU3BhY2UgKyBzZXRbIGkgXSApOwoJCQkJLy8gc3VwcG9ydDogalF1ZXJ5IDEuNi4yCgkJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC85OTE3CgkJCQkvLyBqUXVlcnkgMS42LjIgaW5jb3JyZWN0bHkgcmV0dXJucyB1bmRlZmluZWQgZm9yIGFueSBmYWxzeSB2YWx1ZS4KCQkJCS8vIFdlIGNhbid0IGRpZmZlcmVudGlhdGUgYmV0d2VlbiAiIiBhbmQgMCBoZXJlLCBzbyB3ZSBqdXN0IGFzc3VtZQoJCQkJLy8gZW1wdHkgc3RyaW5nIHNpbmNlIGl0J3MgbGlrZWx5IHRvIGJlIGEgbW9yZSBjb21tb24gdmFsdWUuLi4KCQkJCWlmICggdmFsID09PSB1bmRlZmluZWQgKSB7CgkJCQkJdmFsID0gIiI7CgkJCQl9CgkJCQllbGVtZW50LmNzcyggc2V0WyBpIF0sIHZhbCApOwoJCQl9CgkJfQoJfSwKCglzZXRNb2RlOiBmdW5jdGlvbiggZWwsIG1vZGUgKSB7CgkJaWYgKG1vZGUgPT09ICJ0b2dnbGUiKSB7CgkJCW1vZGUgPSBlbC5pcyggIjpoaWRkZW4iICkgPyAic2hvdyIgOiAiaGlkZSI7CgkJfQoJCXJldHVybiBtb2RlOwoJfSwKCgkvLyBUcmFuc2xhdGVzIGEgW3RvcCxsZWZ0XSBhcnJheSBpbnRvIGEgYmFzZWxpbmUgdmFsdWUKCS8vIHRoaXMgc2hvdWxkIGJlIGEgbGl0dGxlIG1vcmUgZmxleGlibGUgaW4gdGhlIGZ1dHVyZSB0byBoYW5kbGUgYSBzdHJpbmcgJiBoYXNoCglnZXRCYXNlbGluZTogZnVuY3Rpb24oIG9yaWdpbiwgb3JpZ2luYWwgKSB7CgkJdmFyIHksIHg7CgkJc3dpdGNoICggb3JpZ2luWyAwIF0gKSB7CgkJCWNhc2UgInRvcCI6IHkgPSAwOyBicmVhazsKCQkJY2FzZSAibWlkZGxlIjogeSA9IDAuNTsgYnJlYWs7CgkJCWNhc2UgImJvdHRvbSI6IHkgPSAxOyBicmVhazsKCQkJZGVmYXVsdDogeSA9IG9yaWdpblsgMCBdIC8gb3JpZ2luYWwuaGVpZ2h0OwoJCX0KCQlzd2l0Y2ggKCBvcmlnaW5bIDEgXSApIHsKCQkJY2FzZSAibGVmdCI6IHggPSAwOyBicmVhazsKCQkJY2FzZSAiY2VudGVyIjogeCA9IDAuNTsgYnJlYWs7CgkJCWNhc2UgInJpZ2h0IjogeCA9IDE7IGJyZWFrOwoJCQlkZWZhdWx0OiB4ID0gb3JpZ2luWyAxIF0gLyBvcmlnaW5hbC53aWR0aDsKCQl9CgkJcmV0dXJuIHsKCQkJeDogeCwKCQkJeTogeQoJCX07Cgl9LAoKCS8vIFdyYXBzIHRoZSBlbGVtZW50IGFyb3VuZCBhIHdyYXBwZXIgdGhhdCBjb3BpZXMgcG9zaXRpb24gcHJvcGVydGllcwoJY3JlYXRlV3JhcHBlcjogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgoJCS8vIGlmIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgd3JhcHBlZCwgcmV0dXJuIGl0CgkJaWYgKCBlbGVtZW50LnBhcmVudCgpLmlzKCAiLnVpLWVmZmVjdHMtd3JhcHBlciIgKSkgewoJCQlyZXR1cm4gZWxlbWVudC5wYXJlbnQoKTsKCQl9CgoJCS8vIHdyYXAgdGhlIGVsZW1lbnQKCQl2YXIgcHJvcHMgPSB7CgkJCQl3aWR0aDogZWxlbWVudC5vdXRlcldpZHRoKHRydWUpLAoJCQkJaGVpZ2h0OiBlbGVtZW50Lm91dGVySGVpZ2h0KHRydWUpLAoJCQkJImZsb2F0IjogZWxlbWVudC5jc3MoICJmbG9hdCIgKQoJCQl9LAoJCQl3cmFwcGVyID0gJCggIjxkaXY+PC9kaXY+IiApCgkJCQkuYWRkQ2xhc3MoICJ1aS1lZmZlY3RzLXdyYXBwZXIiICkKCQkJCS5jc3MoewoJCQkJCWZvbnRTaXplOiAiMTAwJSIsCgkJCQkJYmFja2dyb3VuZDogInRyYW5zcGFyZW50IiwKCQkJCQlib3JkZXI6ICJub25lIiwKCQkJCQltYXJnaW46IDAsCgkJCQkJcGFkZGluZzogMAoJCQkJfSksCgkJCS8vIFN0b3JlIHRoZSBzaXplIGluIGNhc2Ugd2lkdGgvaGVpZ2h0IGFyZSBkZWZpbmVkIGluICUgLSBGaXhlcyAjNTI0NQoJCQlzaXplID0gewoJCQkJd2lkdGg6IGVsZW1lbnQud2lkdGgoKSwKCQkJCWhlaWdodDogZWxlbWVudC5oZWlnaHQoKQoJCQl9LAoJCQlhY3RpdmUgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwoKCQkvLyBzdXBwb3J0OiBGaXJlZm94CgkJLy8gRmlyZWZveCBpbmNvcnJlY3RseSBleHBvc2VzIGFub255bW91cyBjb250ZW50CgkJLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTYxNjY0CgkJdHJ5IHsKCQkJYWN0aXZlLmlkOwoJCX0gY2F0Y2goIGUgKSB7CgkJCWFjdGl2ZSA9IGRvY3VtZW50LmJvZHk7CgkJfQoKCQllbGVtZW50LndyYXAoIHdyYXBwZXIgKTsKCgkJLy8gRml4ZXMgIzc1OTUgLSBFbGVtZW50cyBsb3NlIGZvY3VzIHdoZW4gd3JhcHBlZC4KCQlpZiAoIGVsZW1lbnRbIDAgXSA9PT0gYWN0aXZlIHx8ICQuY29udGFpbnMoIGVsZW1lbnRbIDAgXSwgYWN0aXZlICkgKSB7CgkJCSQoIGFjdGl2ZSApLmZvY3VzKCk7CgkJfQoKCQl3cmFwcGVyID0gZWxlbWVudC5wYXJlbnQoKTsgLy9Ib3RmaXggZm9yIGpRdWVyeSAxLjQgc2luY2Ugc29tZSBjaGFuZ2UgaW4gd3JhcCgpIHNlZW1zIHRvIGFjdHVhbGx5IGxvc2UgdGhlIHJlZmVyZW5jZSB0byB0aGUgd3JhcHBlZCBlbGVtZW50CgoJCS8vIHRyYW5zZmVyIHBvc2l0aW9uaW5nIHByb3BlcnRpZXMgdG8gdGhlIHdyYXBwZXIKCQlpZiAoIGVsZW1lbnQuY3NzKCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoJCQl3cmFwcGVyLmNzcyh7IHBvc2l0aW9uOiAicmVsYXRpdmUiIH0pOwoJCQllbGVtZW50LmNzcyh7IHBvc2l0aW9uOiAicmVsYXRpdmUiIH0pOwoJCX0gZWxzZSB7CgkJCSQuZXh0ZW5kKCBwcm9wcywgewoJCQkJcG9zaXRpb246IGVsZW1lbnQuY3NzKCAicG9zaXRpb24iICksCgkJCQl6SW5kZXg6IGVsZW1lbnQuY3NzKCAiei1pbmRleCIgKQoJCQl9KTsKCQkJJC5lYWNoKFsgInRvcCIsICJsZWZ0IiwgImJvdHRvbSIsICJyaWdodCIgXSwgZnVuY3Rpb24oaSwgcG9zKSB7CgkJCQlwcm9wc1sgcG9zIF0gPSBlbGVtZW50LmNzcyggcG9zICk7CgkJCQlpZiAoIGlzTmFOKCBwYXJzZUludCggcHJvcHNbIHBvcyBdLCAxMCApICkgKSB7CgkJCQkJcHJvcHNbIHBvcyBdID0gImF1dG8iOwoJCQkJfQoJCQl9KTsKCQkJZWxlbWVudC5jc3MoewoJCQkJcG9zaXRpb246ICJyZWxhdGl2ZSIsCgkJCQl0b3A6IDAsCgkJCQlsZWZ0OiAwLAoJCQkJcmlnaHQ6ICJhdXRvIiwKCQkJCWJvdHRvbTogImF1dG8iCgkJCX0pOwoJCX0KCQllbGVtZW50LmNzcyhzaXplKTsKCgkJcmV0dXJuIHdyYXBwZXIuY3NzKCBwcm9wcyApLnNob3coKTsKCX0sCgoJcmVtb3ZlV3JhcHBlcjogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdmFyIGFjdGl2ZSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7CgoJCWlmICggZWxlbWVudC5wYXJlbnQoKS5pcyggIi51aS1lZmZlY3RzLXdyYXBwZXIiICkgKSB7CgkJCWVsZW1lbnQucGFyZW50KCkucmVwbGFjZVdpdGgoIGVsZW1lbnQgKTsKCgkJCS8vIEZpeGVzICM3NTk1IC0gRWxlbWVudHMgbG9zZSBmb2N1cyB3aGVuIHdyYXBwZWQuCgkJCWlmICggZWxlbWVudFsgMCBdID09PSBhY3RpdmUgfHwgJC5jb250YWlucyggZWxlbWVudFsgMCBdLCBhY3RpdmUgKSApIHsKCQkJCSQoIGFjdGl2ZSApLmZvY3VzKCk7CgkJCX0KCQl9CgoKCQlyZXR1cm4gZWxlbWVudDsKCX0sCgoJc2V0VHJhbnNpdGlvbjogZnVuY3Rpb24oIGVsZW1lbnQsIGxpc3QsIGZhY3RvciwgdmFsdWUgKSB7CgkJdmFsdWUgPSB2YWx1ZSB8fCB7fTsKCQkkLmVhY2goIGxpc3QsIGZ1bmN0aW9uKCBpLCB4ICkgewoJCQl2YXIgdW5pdCA9IGVsZW1lbnQuY3NzVW5pdCggeCApOwoJCQlpZiAoIHVuaXRbIDAgXSA+IDAgKSB7CgkJCQl2YWx1ZVsgeCBdID0gdW5pdFsgMCBdICogZmFjdG9yICsgdW5pdFsgMSBdOwoJCQl9CgkJfSk7CgkJcmV0dXJuIHZhbHVlOwoJfQp9KTsKCi8vIHJldHVybiBhbiBlZmZlY3Qgb3B0aW9ucyBvYmplY3QgZm9yIHRoZSBnaXZlbiBwYXJhbWV0ZXJzOgpmdW5jdGlvbiBfbm9ybWFsaXplQXJndW1lbnRzKCBlZmZlY3QsIG9wdGlvbnMsIHNwZWVkLCBjYWxsYmFjayApIHsKCgkvLyBhbGxvdyBwYXNzaW5nIGFsbCBvcHRpb25zIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIKCWlmICggJC5pc1BsYWluT2JqZWN0KCBlZmZlY3QgKSApIHsKCQlvcHRpb25zID0gZWZmZWN0OwoJCWVmZmVjdCA9IGVmZmVjdC5lZmZlY3Q7Cgl9CgoJLy8gY29udmVydCB0byBhbiBvYmplY3QKCWVmZmVjdCA9IHsgZWZmZWN0OiBlZmZlY3QgfTsKCgkvLyBjYXRjaCAoZWZmZWN0LCBudWxsLCAuLi4pCglpZiAoIG9wdGlvbnMgPT0gbnVsbCApIHsKCQlvcHRpb25zID0ge307Cgl9CgoJLy8gY2F0Y2ggKGVmZmVjdCwgY2FsbGJhY2spCglpZiAoICQuaXNGdW5jdGlvbiggb3B0aW9ucyApICkgewoJCWNhbGxiYWNrID0gb3B0aW9uczsKCQlzcGVlZCA9IG51bGw7CgkJb3B0aW9ucyA9IHt9OwoJfQoKCS8vIGNhdGNoIChlZmZlY3QsIHNwZWVkLCA/KQoJaWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gIm51bWJlciIgfHwgJC5meC5zcGVlZHNbIG9wdGlvbnMgXSApIHsKCQljYWxsYmFjayA9IHNwZWVkOwoJCXNwZWVkID0gb3B0aW9uczsKCQlvcHRpb25zID0ge307Cgl9CgoJLy8gY2F0Y2ggKGVmZmVjdCwgb3B0aW9ucywgY2FsbGJhY2spCglpZiAoICQuaXNGdW5jdGlvbiggc3BlZWQgKSApIHsKCQljYWxsYmFjayA9IHNwZWVkOwoJCXNwZWVkID0gbnVsbDsKCX0KCgkvLyBhZGQgb3B0aW9ucyB0byBlZmZlY3QKCWlmICggb3B0aW9ucyApIHsKCQkkLmV4dGVuZCggZWZmZWN0LCBvcHRpb25zICk7Cgl9CgoJc3BlZWQgPSBzcGVlZCB8fCBvcHRpb25zLmR1cmF0aW9uOwoJZWZmZWN0LmR1cmF0aW9uID0gJC5meC5vZmYgPyAwIDoKCQl0eXBlb2Ygc3BlZWQgPT09ICJudW1iZXIiID8gc3BlZWQgOgoJCXNwZWVkIGluICQuZnguc3BlZWRzID8gJC5meC5zcGVlZHNbIHNwZWVkIF0gOgoJCSQuZnguc3BlZWRzLl9kZWZhdWx0OwoKCWVmZmVjdC5jb21wbGV0ZSA9IGNhbGxiYWNrIHx8IG9wdGlvbnMuY29tcGxldGU7CgoJcmV0dXJuIGVmZmVjdDsKfQoKZnVuY3Rpb24gc3RhbmRhcmRTcGVlZCggc3BlZWQgKSB7CgkvLyB2YWxpZCBzdGFuZGFyZCBzcGVlZHMKCWlmICggIXNwZWVkIHx8IHR5cGVvZiBzcGVlZCA9PT0gIm51bWJlciIgfHwgJC5meC5zcGVlZHNbIHNwZWVkIF0gKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgoJLy8gaW52YWxpZCBzdHJpbmdzIC0gdHJlYXQgYXMgIm5vcm1hbCIgc3BlZWQKCWlmICggdHlwZW9mIHNwZWVkID09PSAic3RyaW5nIiAmJiAhJC5lZmZlY3RzLmVmZmVjdFsgc3BlZWQgXSApIHsKCQkvLyBUT0RPOiByZW1vdmUgaW4gMi4wICgjNzExNSkKCQlpZiAoIGJhY2tDb21wYXQgJiYgJC5lZmZlY3RzWyBzcGVlZCBdICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfQoKCXJldHVybiBmYWxzZTsKfQoKJC5mbi5leHRlbmQoewoJZWZmZWN0OiBmdW5jdGlvbiggLyogZWZmZWN0LCBvcHRpb25zLCBzcGVlZCwgY2FsbGJhY2sgKi8gKSB7CgkJdmFyIGFyZ3MgPSBfbm9ybWFsaXplQXJndW1lbnRzLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSwKCQkJbW9kZSA9IGFyZ3MubW9kZSwKCQkJcXVldWUgPSBhcmdzLnF1ZXVlLAoJCQllZmZlY3RNZXRob2QgPSAkLmVmZmVjdHMuZWZmZWN0WyBhcmdzLmVmZmVjdCBdLAoKCQkJLy8gREVQUkVDQVRFRDogcmVtb3ZlIGluIDIuMCAoIzcxMTUpCgkJCW9sZEVmZmVjdE1ldGhvZCA9ICFlZmZlY3RNZXRob2QgJiYgYmFja0NvbXBhdCAmJiAkLmVmZmVjdHNbIGFyZ3MuZWZmZWN0IF07CgoJCWlmICggJC5meC5vZmYgfHwgISggZWZmZWN0TWV0aG9kIHx8IG9sZEVmZmVjdE1ldGhvZCApICkgewoJCQkvLyBkZWxlZ2F0ZSB0byB0aGUgb3JpZ2luYWwgbWV0aG9kIChlLmcuLCAuc2hvdygpKSBpZiBwb3NzaWJsZQoJCQlpZiAoIG1vZGUgKSB7CgkJCQlyZXR1cm4gdGhpc1sgbW9kZSBdKCBhcmdzLmR1cmF0aW9uLCBhcmdzLmNvbXBsZXRlICk7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIGFyZ3MuY29tcGxldGUgKSB7CgkJCQkJCWFyZ3MuY29tcGxldGUuY2FsbCggdGhpcyApOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgkJfQoKCQlmdW5jdGlvbiBydW4oIG5leHQgKSB7CgkJCXZhciBlbGVtID0gJCggdGhpcyApLAoJCQkJY29tcGxldGUgPSBhcmdzLmNvbXBsZXRlLAoJCQkJbW9kZSA9IGFyZ3MubW9kZTsKCgkJCWZ1bmN0aW9uIGRvbmUoKSB7CgkJCQlpZiAoICQuaXNGdW5jdGlvbiggY29tcGxldGUgKSApIHsKCQkJCQljb21wbGV0ZS5jYWxsKCBlbGVtWzBdICk7CgkJCQl9CgkJCQlpZiAoICQuaXNGdW5jdGlvbiggbmV4dCApICkgewoJCQkJCW5leHQoKTsKCQkJCX0KCQkJfQoKCQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGRlbiBhbmQgbW9kZSBpcyBoaWRlLAoJCQkvLyBvciBlbGVtZW50IGlzIHZpc2libGUgYW5kIG1vZGUgaXMgc2hvdwoJCQlpZiAoIGVsZW0uaXMoICI6aGlkZGVuIiApID8gbW9kZSA9PT0gImhpZGUiIDogbW9kZSA9PT0gInNob3ciICkgewoJCQkJZG9uZSgpOwoJCQl9IGVsc2UgewoJCQkJZWZmZWN0TWV0aG9kLmNhbGwoIGVsZW1bMF0sIGFyZ3MsIGRvbmUgKTsKCQkJfQoJCX0KCgkJLy8gVE9ETzogcmVtb3ZlIHRoaXMgY2hlY2sgaW4gMi4wLCBlZmZlY3RNZXRob2Qgd2lsbCBhbHdheXMgYmUgdHJ1ZQoJCWlmICggZWZmZWN0TWV0aG9kICkgewoJCQlyZXR1cm4gcXVldWUgPT09IGZhbHNlID8gdGhpcy5lYWNoKCBydW4gKSA6IHRoaXMucXVldWUoIHF1ZXVlIHx8ICJmeCIsIHJ1biApOwoJCX0gZWxzZSB7CgkJCS8vIERFUFJFQ0FURUQ6IHJlbW92ZSBpbiAyLjAgKCM3MTE1KQoJCQlyZXR1cm4gb2xkRWZmZWN0TWV0aG9kLmNhbGwodGhpcywgewoJCQkJb3B0aW9uczogYXJncywKCQkJCWR1cmF0aW9uOiBhcmdzLmR1cmF0aW9uLAoJCQkJY2FsbGJhY2s6IGFyZ3MuY29tcGxldGUsCgkJCQltb2RlOiBhcmdzLm1vZGUKCQkJfSk7CgkJfQoJfSwKCglfc2hvdzogJC5mbi5zaG93LAoJc2hvdzogZnVuY3Rpb24oIHNwZWVkICkgewoJCWlmICggc3RhbmRhcmRTcGVlZCggc3BlZWQgKSApIHsKCQkJcmV0dXJuIHRoaXMuX3Nob3cuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCX0gZWxzZSB7CgkJCXZhciBhcmdzID0gX25vcm1hbGl6ZUFyZ3VtZW50cy5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCWFyZ3MubW9kZSA9ICJzaG93IjsKCQkJcmV0dXJuIHRoaXMuZWZmZWN0LmNhbGwoIHRoaXMsIGFyZ3MgKTsKCQl9Cgl9LAoKCV9oaWRlOiAkLmZuLmhpZGUsCgloaWRlOiBmdW5jdGlvbiggc3BlZWQgKSB7CgkJaWYgKCBzdGFuZGFyZFNwZWVkKCBzcGVlZCApICkgewoJCQlyZXR1cm4gdGhpcy5faGlkZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfSBlbHNlIHsKCQkJdmFyIGFyZ3MgPSBfbm9ybWFsaXplQXJndW1lbnRzLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJYXJncy5tb2RlID0gImhpZGUiOwoJCQlyZXR1cm4gdGhpcy5lZmZlY3QuY2FsbCggdGhpcywgYXJncyApOwoJCX0KCX0sCgoJLy8galF1ZXJ5IGNvcmUgb3ZlcmxvYWRzIHRvZ2dsZSBhbmQgY3JlYXRlcyBfdG9nZ2xlCglfX3RvZ2dsZTogJC5mbi50b2dnbGUsCgl0b2dnbGU6IGZ1bmN0aW9uKCBzcGVlZCApIHsKCQlpZiAoIHN0YW5kYXJkU3BlZWQoIHNwZWVkICkgfHwgdHlwZW9mIHNwZWVkID09PSAiYm9vbGVhbiIgfHwgJC5pc0Z1bmN0aW9uKCBzcGVlZCApICkgewoJCQlyZXR1cm4gdGhpcy5fX3RvZ2dsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfSBlbHNlIHsKCQkJdmFyIGFyZ3MgPSBfbm9ybWFsaXplQXJndW1lbnRzLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJYXJncy5tb2RlID0gInRvZ2dsZSI7CgkJCXJldHVybiB0aGlzLmVmZmVjdC5jYWxsKCB0aGlzLCBhcmdzICk7CgkJfQoJfSwKCgkvLyBoZWxwZXIgZnVuY3Rpb25zCgljc3NVbml0OiBmdW5jdGlvbihrZXkpIHsKCQl2YXIgc3R5bGUgPSB0aGlzLmNzcygga2V5ICksCgkJCXZhbCA9IFtdOwoKCQkkLmVhY2goIFsgImVtIiwgInB4IiwgIiUiLCAicHQiIF0sIGZ1bmN0aW9uKCBpLCB1bml0ICkgewoJCQlpZiAoIHN0eWxlLmluZGV4T2YoIHVuaXQgKSA+IDAgKSB7CgkJCQl2YWwgPSBbIHBhcnNlRmxvYXQoIHN0eWxlICksIHVuaXQgXTsKCQkJfQoJCX0pOwoJCXJldHVybiB2YWw7Cgl9Cn0pOwoKfSkoKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFQVNJTkcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgooZnVuY3Rpb24oKSB7CgovLyBiYXNlZCBvbiBlYXNpbmcgZXF1YXRpb25zIGZyb20gUm9iZXJ0IFBlbm5lciAoaHR0cDovL3d3dy5yb2JlcnRwZW5uZXIuY29tL2Vhc2luZykKCnZhciBiYXNlRWFzaW5ncyA9IHt9OwoKJC5lYWNoKCBbICJRdWFkIiwgIkN1YmljIiwgIlF1YXJ0IiwgIlF1aW50IiwgIkV4cG8iIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewoJYmFzZUVhc2luZ3NbIG5hbWUgXSA9IGZ1bmN0aW9uKCBwICkgewoJCXJldHVybiBNYXRoLnBvdyggcCwgaSArIDIgKTsKCX07Cn0pOwoKJC5leHRlbmQoIGJhc2VFYXNpbmdzLCB7CglTaW5lOiBmdW5jdGlvbiAoIHAgKSB7CgkJcmV0dXJuIDEgLSBNYXRoLmNvcyggcCAqIE1hdGguUEkgLyAyICk7Cgl9LAoJQ2lyYzogZnVuY3Rpb24gKCBwICkgewoJCXJldHVybiAxIC0gTWF0aC5zcXJ0KCAxIC0gcCAqIHAgKTsKCX0sCglFbGFzdGljOiBmdW5jdGlvbiggcCApIHsKCQlyZXR1cm4gcCA9PT0gMCB8fCBwID09PSAxID8gcCA6CgkJCS1NYXRoLnBvdyggMiwgOCAqIChwIC0gMSkgKSAqIE1hdGguc2luKCAoIChwIC0gMSkgKiA4MCAtIDcuNSApICogTWF0aC5QSSAvIDE1ICk7Cgl9LAoJQmFjazogZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIHAgKiBwICogKCAzICogcCAtIDIgKTsKCX0sCglCb3VuY2U6IGZ1bmN0aW9uICggcCApIHsKCQl2YXIgcG93MiwKCQkJYm91bmNlID0gNDsKCgkJd2hpbGUgKCBwIDwgKCAoIHBvdzIgPSBNYXRoLnBvdyggMiwgLS1ib3VuY2UgKSApIC0gMSApIC8gMTEgKSB7fQoJCXJldHVybiAxIC8gTWF0aC5wb3coIDQsIDMgLSBib3VuY2UgKSAtIDcuNTYyNSAqIE1hdGgucG93KCAoIHBvdzIgKiAzIC0gMiApIC8gMjIgLSBwLCAyICk7Cgl9Cn0pOwoKJC5lYWNoKCBiYXNlRWFzaW5ncywgZnVuY3Rpb24oIG5hbWUsIGVhc2VJbiApIHsKCSQuZWFzaW5nWyAiZWFzZUluIiArIG5hbWUgXSA9IGVhc2VJbjsKCSQuZWFzaW5nWyAiZWFzZU91dCIgKyBuYW1lIF0gPSBmdW5jdGlvbiggcCApIHsKCQlyZXR1cm4gMSAtIGVhc2VJbiggMSAtIHAgKTsKCX07CgkkLmVhc2luZ1sgImVhc2VJbk91dCIgKyBuYW1lIF0gPSBmdW5jdGlvbiggcCApIHsKCQlyZXR1cm4gcCA8IDAuNSA/CgkJCWVhc2VJbiggcCAqIDIgKSAvIDIgOgoJCQkxIC0gZWFzZUluKCBwICogLTIgKyAyICkgLyAyOwoJfTsKfSk7Cgp9KSgpOwoKfSkoalF1ZXJ5KSk7CihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKdmFyIHJ2ZXJ0aWNhbCA9IC91cHxkb3dufHZlcnRpY2FsLywKCXJwb3NpdGl2ZW1vdGlvbiA9IC91cHxsZWZ0fHZlcnRpY2FsfGhvcml6b250YWwvOwoKJC5lZmZlY3RzLmVmZmVjdC5ibGluZCA9IGZ1bmN0aW9uKCBvLCBkb25lICkgewoJLy8gQ3JlYXRlIGVsZW1lbnQKCXZhciBlbCA9ICQoIHRoaXMgKSwKCQlwcm9wcyA9IFsgInBvc2l0aW9uIiwgInRvcCIsICJib3R0b20iLCAibGVmdCIsICJyaWdodCIsICJoZWlnaHQiLCAid2lkdGgiIF0sCgkJbW9kZSA9ICQuZWZmZWN0cy5zZXRNb2RlKCBlbCwgby5tb2RlIHx8ICJoaWRlIiApLAoJCWRpcmVjdGlvbiA9IG8uZGlyZWN0aW9uIHx8ICJ1cCIsCgkJdmVydGljYWwgPSBydmVydGljYWwudGVzdCggZGlyZWN0aW9uICksCgkJcmVmID0gdmVydGljYWwgPyAiaGVpZ2h0IiA6ICJ3aWR0aCIsCgkJcmVmMiA9IHZlcnRpY2FsID8gInRvcCIgOiAibGVmdCIsCgkJbW90aW9uID0gcnBvc2l0aXZlbW90aW9uLnRlc3QoIGRpcmVjdGlvbiApLAoJCWFuaW1hdGlvbiA9IHt9LAoJCXNob3cgPSBtb2RlID09PSAic2hvdyIsCgkJd3JhcHBlciwgZGlzdGFuY2UsIG1hcmdpbjsKCgkvLyBpZiBhbHJlYWR5IHdyYXBwZWQsIHRoZSB3cmFwcGVyJ3MgcHJvcGVydGllcyBhcmUgbXkgcHJvcGVydHkuICM2MjQ1CglpZiAoIGVsLnBhcmVudCgpLmlzKCAiLnVpLWVmZmVjdHMtd3JhcHBlciIgKSApIHsKCQkkLmVmZmVjdHMuc2F2ZSggZWwucGFyZW50KCksIHByb3BzICk7Cgl9IGVsc2UgewoJCSQuZWZmZWN0cy5zYXZlKCBlbCwgcHJvcHMgKTsKCX0KCWVsLnNob3coKTsKCXdyYXBwZXIgPSAkLmVmZmVjdHMuY3JlYXRlV3JhcHBlciggZWwgKS5jc3MoewoJCW92ZXJmbG93OiAiaGlkZGVuIgoJfSk7CgoJZGlzdGFuY2UgPSB3cmFwcGVyWyByZWYgXSgpOwoJbWFyZ2luID0gcGFyc2VGbG9hdCggd3JhcHBlci5jc3MoIHJlZjIgKSApIHx8IDA7CgoJYW5pbWF0aW9uWyByZWYgXSA9IHNob3cgPyBkaXN0YW5jZSA6IDA7CglpZiAoICFtb3Rpb24gKSB7CgkJZWwKCQkJLmNzcyggdmVydGljYWwgPyAiYm90dG9tIiA6ICJyaWdodCIsIDAgKQoJCQkuY3NzKCB2ZXJ0aWNhbCA/ICJ0b3AiIDogImxlZnQiLCAiYXV0byIgKQoJCQkuY3NzKHsgcG9zaXRpb246ICJhYnNvbHV0ZSIgfSk7CgoJCWFuaW1hdGlvblsgcmVmMiBdID0gc2hvdyA/IG1hcmdpbiA6IGRpc3RhbmNlICsgbWFyZ2luOwoJfQoKCS8vIHN0YXJ0IGF0IDAgaWYgd2UgYXJlIHNob3dpbmcKCWlmICggc2hvdyApIHsKCQl3cmFwcGVyLmNzcyggcmVmLCAwICk7CgkJaWYgKCAhIG1vdGlvbiApIHsKCQkJd3JhcHBlci5jc3MoIHJlZjIsIG1hcmdpbiArIGRpc3RhbmNlICk7CgkJfQoJfQoKCS8vIEFuaW1hdGUKCXdyYXBwZXIuYW5pbWF0ZSggYW5pbWF0aW9uLCB7CgkJZHVyYXRpb246IG8uZHVyYXRpb24sCgkJZWFzaW5nOiBvLmVhc2luZywKCQlxdWV1ZTogZmFsc2UsCgkJY29tcGxldGU6IGZ1bmN0aW9uKCkgewoJCQlpZiAoIG1vZGUgPT09ICJoaWRlIiApIHsKCQkJCWVsLmhpZGUoKTsKCQkJfQoJCQkkLmVmZmVjdHMucmVzdG9yZSggZWwsIHByb3BzICk7CgkJCSQuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKCBlbCApOwoJCQlkb25lKCk7CgkJfQoJfSk7Cgp9OwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgokLmVmZmVjdHMuZWZmZWN0LmJvdW5jZSA9IGZ1bmN0aW9uKCBvLCBkb25lICkgewoJdmFyIGVsID0gJCggdGhpcyApLAoJCXByb3BzID0gWyAicG9zaXRpb24iLCAidG9wIiwgImJvdHRvbSIsICJsZWZ0IiwgInJpZ2h0IiwgImhlaWdodCIsICJ3aWR0aCIgXSwKCgkJLy8gZGVmYXVsdHM6CgkJbW9kZSA9ICQuZWZmZWN0cy5zZXRNb2RlKCBlbCwgby5tb2RlIHx8ICJlZmZlY3QiICksCgkJaGlkZSA9IG1vZGUgPT09ICJoaWRlIiwKCQlzaG93ID0gbW9kZSA9PT0gInNob3ciLAoJCWRpcmVjdGlvbiA9IG8uZGlyZWN0aW9uIHx8ICJ1cCIsCgkJZGlzdGFuY2UgPSBvLmRpc3RhbmNlLAoJCXRpbWVzID0gby50aW1lcyB8fCA1LAoKCQkvLyBudW1iZXIgb2YgaW50ZXJuYWwgYW5pbWF0aW9ucwoJCWFuaW1zID0gdGltZXMgKiAyICsgKCBzaG93IHx8IGhpZGUgPyAxIDogMCApLAoJCXNwZWVkID0gby5kdXJhdGlvbiAvIGFuaW1zLAoJCWVhc2luZyA9IG8uZWFzaW5nLAoKCQkvLyB1dGlsaXR5OgoJCXJlZiA9ICggZGlyZWN0aW9uID09PSAidXAiIHx8IGRpcmVjdGlvbiA9PT0gImRvd24iICkgPyAidG9wIiA6ICJsZWZ0IiwKCQltb3Rpb24gPSAoIGRpcmVjdGlvbiA9PT0gInVwIiB8fCBkaXJlY3Rpb24gPT09ICJsZWZ0IiApLAoJCWksCgkJdXBBbmltLAoJCWRvd25BbmltLAoKCQkvLyB3ZSB3aWxsIG5lZWQgdG8gcmUtYXNzZW1ibGUgdGhlIHF1ZXVlIHRvIHN0YWNrIG91ciBhbmltYXRpb25zIGluIHBsYWNlCgkJcXVldWUgPSBlbC5xdWV1ZSgpLAoJCXF1ZXVlbGVuID0gcXVldWUubGVuZ3RoOwoKCS8vIEF2b2lkIHRvdWNoaW5nIG9wYWNpdHkgdG8gcHJldmVudCBjbGVhclR5cGUgYW5kIFBORyBpc3N1ZXMgaW4gSUUKCWlmICggc2hvdyB8fCBoaWRlICkgewoJCXByb3BzLnB1c2goICJvcGFjaXR5IiApOwoJfQoKCSQuZWZmZWN0cy5zYXZlKCBlbCwgcHJvcHMgKTsKCWVsLnNob3coKTsKCSQuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKCBlbCApOyAvLyBDcmVhdGUgV3JhcHBlcgoKCS8vIGRlZmF1bHQgZGlzdGFuY2UgZm9yIHRoZSBCSUdHRVNUIGJvdW5jZSBpcyB0aGUgb3V0ZXIgRGlzdGFuY2UgLyAzCglpZiAoICFkaXN0YW5jZSApIHsKCQlkaXN0YW5jZSA9IGVsWyByZWYgPT09ICJ0b3AiID8gIm91dGVySGVpZ2h0IiA6ICJvdXRlcldpZHRoIiBdKCkgLyAzOwoJfQoKCWlmICggc2hvdyApIHsKCQlkb3duQW5pbSA9IHsgb3BhY2l0eTogMSB9OwoJCWRvd25BbmltWyByZWYgXSA9IDA7CgoJCS8vIGlmIHdlIGFyZSBzaG93aW5nLCBmb3JjZSBvcGFjaXR5IDAgYW5kIHNldCB0aGUgaW5pdGlhbCBwb3NpdGlvbgoJCS8vIHRoZW4gZG8gdGhlICJmaXJzdCIgYW5pbWF0aW9uCgkJZWwuY3NzKCAib3BhY2l0eSIsIDAgKQoJCQkuY3NzKCByZWYsIG1vdGlvbiA/IC1kaXN0YW5jZSAqIDIgOiBkaXN0YW5jZSAqIDIgKQoJCQkuYW5pbWF0ZSggZG93bkFuaW0sIHNwZWVkLCBlYXNpbmcgKTsKCX0KCgkvLyBzdGFydCBhdCB0aGUgc21hbGxlc3QgZGlzdGFuY2UgaWYgd2UgYXJlIGhpZGluZwoJaWYgKCBoaWRlICkgewoJCWRpc3RhbmNlID0gZGlzdGFuY2UgLyBNYXRoLnBvdyggMiwgdGltZXMgLSAxICk7Cgl9CgoJZG93bkFuaW0gPSB7fTsKCWRvd25BbmltWyByZWYgXSA9IDA7CgkvLyBCb3VuY2VzIHVwL2Rvd24vbGVmdC9yaWdodCB0aGVuIGJhY2sgdG8gMCAtLSB0aW1lcyAqIDIgYW5pbWF0aW9ucyBoYXBwZW4gaGVyZQoJZm9yICggaSA9IDA7IGkgPCB0aW1lczsgaSsrICkgewoJCXVwQW5pbSA9IHt9OwoJCXVwQW5pbVsgcmVmIF0gPSAoIG1vdGlvbiA/ICItPSIgOiAiKz0iICkgKyBkaXN0YW5jZTsKCgkJZWwuYW5pbWF0ZSggdXBBbmltLCBzcGVlZCwgZWFzaW5nICkKCQkJLmFuaW1hdGUoIGRvd25BbmltLCBzcGVlZCwgZWFzaW5nICk7CgoJCWRpc3RhbmNlID0gaGlkZSA/IGRpc3RhbmNlICogMiA6IGRpc3RhbmNlIC8gMjsKCX0KCgkvLyBMYXN0IEJvdW5jZSB3aGVuIEhpZGluZwoJaWYgKCBoaWRlICkgewoJCXVwQW5pbSA9IHsgb3BhY2l0eTogMCB9OwoJCXVwQW5pbVsgcmVmIF0gPSAoIG1vdGlvbiA/ICItPSIgOiAiKz0iICkgKyBkaXN0YW5jZTsKCgkJZWwuYW5pbWF0ZSggdXBBbmltLCBzcGVlZCwgZWFzaW5nICk7Cgl9CgoJZWwucXVldWUoZnVuY3Rpb24oKSB7CgkJaWYgKCBoaWRlICkgewoJCQllbC5oaWRlKCk7CgkJfQoJCSQuZWZmZWN0cy5yZXN0b3JlKCBlbCwgcHJvcHMgKTsKCQkkLmVmZmVjdHMucmVtb3ZlV3JhcHBlciggZWwgKTsKCQlkb25lKCk7Cgl9KTsKCgkvLyBpbmplY3QgYWxsIHRoZSBhbmltYXRpb25zIHdlIGp1c3QgcXVldWVkIHRvIGJlIGZpcnN0IGluIGxpbmUgKGFmdGVyICJpbnByb2dyZXNzIikKCWlmICggcXVldWVsZW4gPiAxKSB7CgkJcXVldWUuc3BsaWNlLmFwcGx5KCBxdWV1ZSwKCQkJWyAxLCAwIF0uY29uY2F0KCBxdWV1ZS5zcGxpY2UoIHF1ZXVlbGVuLCBhbmltcyArIDEgKSApICk7Cgl9CgllbC5kZXF1ZXVlKCk7Cgp9OwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgokLmVmZmVjdHMuZWZmZWN0LmNsaXAgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCS8vIENyZWF0ZSBlbGVtZW50Cgl2YXIgZWwgPSAkKCB0aGlzICksCgkJcHJvcHMgPSBbICJwb3NpdGlvbiIsICJ0b3AiLCAiYm90dG9tIiwgImxlZnQiLCAicmlnaHQiLCAiaGVpZ2h0IiwgIndpZHRoIiBdLAoJCW1vZGUgPSAkLmVmZmVjdHMuc2V0TW9kZSggZWwsIG8ubW9kZSB8fCAiaGlkZSIgKSwKCQlzaG93ID0gbW9kZSA9PT0gInNob3ciLAoJCWRpcmVjdGlvbiA9IG8uZGlyZWN0aW9uIHx8ICJ2ZXJ0aWNhbCIsCgkJdmVydCA9IGRpcmVjdGlvbiA9PT0gInZlcnRpY2FsIiwKCQlzaXplID0gdmVydCA/ICJoZWlnaHQiIDogIndpZHRoIiwKCQlwb3NpdGlvbiA9IHZlcnQgPyAidG9wIiA6ICJsZWZ0IiwKCQlhbmltYXRpb24gPSB7fSwKCQl3cmFwcGVyLCBhbmltYXRlLCBkaXN0YW5jZTsKCgkvLyBTYXZlICYgU2hvdwoJJC5lZmZlY3RzLnNhdmUoIGVsLCBwcm9wcyApOwoJZWwuc2hvdygpOwoKCS8vIENyZWF0ZSBXcmFwcGVyCgl3cmFwcGVyID0gJC5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoIGVsICkuY3NzKHsKCQlvdmVyZmxvdzogImhpZGRlbiIKCX0pOwoJYW5pbWF0ZSA9ICggZWxbMF0udGFnTmFtZSA9PT0gIklNRyIgKSA/IHdyYXBwZXIgOiBlbDsKCWRpc3RhbmNlID0gYW5pbWF0ZVsgc2l6ZSBdKCk7CgoJLy8gU2hpZnQKCWlmICggc2hvdyApIHsKCQlhbmltYXRlLmNzcyggc2l6ZSwgMCApOwoJCWFuaW1hdGUuY3NzKCBwb3NpdGlvbiwgZGlzdGFuY2UgLyAyICk7Cgl9CgoJLy8gQ3JlYXRlIEFuaW1hdGlvbiBPYmplY3Q6CglhbmltYXRpb25bIHNpemUgXSA9IHNob3cgPyBkaXN0YW5jZSA6IDA7CglhbmltYXRpb25bIHBvc2l0aW9uIF0gPSBzaG93ID8gMCA6IGRpc3RhbmNlIC8gMjsKCgkvLyBBbmltYXRlCglhbmltYXRlLmFuaW1hdGUoIGFuaW1hdGlvbiwgewoJCXF1ZXVlOiBmYWxzZSwKCQlkdXJhdGlvbjogby5kdXJhdGlvbiwKCQllYXNpbmc6IG8uZWFzaW5nLAoJCWNvbXBsZXRlOiBmdW5jdGlvbigpIHsKCQkJaWYgKCAhc2hvdyApIHsKCQkJCWVsLmhpZGUoKTsKCQkJfQoJCQkkLmVmZmVjdHMucmVzdG9yZSggZWwsIHByb3BzICk7CgkJCSQuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKCBlbCApOwoJCQlkb25lKCk7CgkJfQoJfSk7Cgp9OwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgokLmVmZmVjdHMuZWZmZWN0LmRyb3AgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCgl2YXIgZWwgPSAkKCB0aGlzICksCgkJcHJvcHMgPSBbICJwb3NpdGlvbiIsICJ0b3AiLCAiYm90dG9tIiwgImxlZnQiLCAicmlnaHQiLCAib3BhY2l0eSIsICJoZWlnaHQiLCAid2lkdGgiIF0sCgkJbW9kZSA9ICQuZWZmZWN0cy5zZXRNb2RlKCBlbCwgby5tb2RlIHx8ICJoaWRlIiApLAoJCXNob3cgPSBtb2RlID09PSAic2hvdyIsCgkJZGlyZWN0aW9uID0gby5kaXJlY3Rpb24gfHwgImxlZnQiLAoJCXJlZiA9ICggZGlyZWN0aW9uID09PSAidXAiIHx8IGRpcmVjdGlvbiA9PT0gImRvd24iICkgPyAidG9wIiA6ICJsZWZ0IiwKCQltb3Rpb24gPSAoIGRpcmVjdGlvbiA9PT0gInVwIiB8fCBkaXJlY3Rpb24gPT09ICJsZWZ0IiApID8gInBvcyIgOiAibmVnIiwKCQlhbmltYXRpb24gPSB7CgkJCW9wYWNpdHk6IHNob3cgPyAxIDogMAoJCX0sCgkJZGlzdGFuY2U7CgoJLy8gQWRqdXN0CgkkLmVmZmVjdHMuc2F2ZSggZWwsIHByb3BzICk7CgllbC5zaG93KCk7CgkkLmVmZmVjdHMuY3JlYXRlV3JhcHBlciggZWwgKTsKCglkaXN0YW5jZSA9IG8uZGlzdGFuY2UgfHwgZWxbIHJlZiA9PT0gInRvcCIgPyAib3V0ZXJIZWlnaHQiOiAib3V0ZXJXaWR0aCIgXSggdHJ1ZSApIC8gMjsKCglpZiAoIHNob3cgKSB7CgkJZWwKCQkJLmNzcyggIm9wYWNpdHkiLCAwICkKCQkJLmNzcyggcmVmLCBtb3Rpb24gPT09ICJwb3MiID8gLWRpc3RhbmNlIDogZGlzdGFuY2UgKTsKCX0KCgkvLyBBbmltYXRpb24KCWFuaW1hdGlvblsgcmVmIF0gPSAoIHNob3cgPwoJCSggbW90aW9uID09PSAicG9zIiA/ICIrPSIgOiAiLT0iICkgOgoJCSggbW90aW9uID09PSAicG9zIiA/ICItPSIgOiAiKz0iICkgKSArCgkJZGlzdGFuY2U7CgoJLy8gQW5pbWF0ZQoJZWwuYW5pbWF0ZSggYW5pbWF0aW9uLCB7CgkJcXVldWU6IGZhbHNlLAoJCWR1cmF0aW9uOiBvLmR1cmF0aW9uLAoJCWVhc2luZzogby5lYXNpbmcsCgkJY29tcGxldGU6IGZ1bmN0aW9uKCkgewoJCQlpZiAoIG1vZGUgPT09ICJoaWRlIiApIHsKCQkJCWVsLmhpZGUoKTsKCQkJfQoJCQkkLmVmZmVjdHMucmVzdG9yZSggZWwsIHByb3BzICk7CgkJCSQuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKCBlbCApOwoJCQlkb25lKCk7CgkJfQoJfSk7Cn07Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCiQuZWZmZWN0cy5lZmZlY3QuZXhwbG9kZSA9IGZ1bmN0aW9uKCBvLCBkb25lICkgewoKCXZhciByb3dzID0gby5waWVjZXMgPyBNYXRoLnJvdW5kKCBNYXRoLnNxcnQoIG8ucGllY2VzICkgKSA6IDMsCgkJY2VsbHMgPSByb3dzLAoJCWVsID0gJCggdGhpcyApLAoJCW1vZGUgPSAkLmVmZmVjdHMuc2V0TW9kZSggZWwsIG8ubW9kZSB8fCAiaGlkZSIgKSwKCQlzaG93ID0gbW9kZSA9PT0gInNob3ciLAoKCQkvLyBzaG93IGFuZCB0aGVuIHZpc2liaWxpdHk6aGlkZGVuIHRoZSBlbGVtZW50IGJlZm9yZSBjYWxjdWxhdGluZyBvZmZzZXQKCQlvZmZzZXQgPSBlbC5zaG93KCkuY3NzKCAidmlzaWJpbGl0eSIsICJoaWRkZW4iICkub2Zmc2V0KCksCgoJCS8vIHdpZHRoIGFuZCBoZWlnaHQgb2YgYSBwaWVjZQoJCXdpZHRoID0gTWF0aC5jZWlsKCBlbC5vdXRlcldpZHRoKCkgLyBjZWxscyApLAoJCWhlaWdodCA9IE1hdGguY2VpbCggZWwub3V0ZXJIZWlnaHQoKSAvIHJvd3MgKSwKCQlwaWVjZXMgPSBbXSwKCgkJLy8gbG9vcAoJCWksIGosIGxlZnQsIHRvcCwgbXgsIG15OwoKCS8vIGNoaWxkcmVuIGFuaW1hdGUgY29tcGxldGU6CglmdW5jdGlvbiBjaGlsZENvbXBsZXRlKCkgewoJCXBpZWNlcy5wdXNoKCB0aGlzICk7CgkJaWYgKCBwaWVjZXMubGVuZ3RoID09PSByb3dzICogY2VsbHMgKSB7CgkJCWFuaW1Db21wbGV0ZSgpOwoJCX0KCX0KCgkvLyBjbG9uZSB0aGUgZWxlbWVudCBmb3IgZWFjaCByb3cgYW5kIGNlbGwuCglmb3IoIGkgPSAwOyBpIDwgcm93cyA7IGkrKyApIHsgLy8gPT09PgoJCXRvcCA9IG9mZnNldC50b3AgKyBpICogaGVpZ2h0OwoJCW15ID0gaSAtICggcm93cyAtIDEgKSAvIDIgOwoKCQlmb3IoIGogPSAwOyBqIDwgY2VsbHMgOyBqKysgKSB7IC8vIHx8fAoJCQlsZWZ0ID0gb2Zmc2V0LmxlZnQgKyBqICogd2lkdGg7CgkJCW14ID0gaiAtICggY2VsbHMgLSAxICkgLyAyIDsKCgkJCS8vIENyZWF0ZSBhIGNsb25lIG9mIHRoZSBub3cgaGlkZGVuIG1haW4gZWxlbWVudCB0aGF0IHdpbGwgYmUgYWJzb2x1dGUgcG9zaXRpb25lZAoJCQkvLyB3aXRoaW4gYSB3cmFwcGVyIGRpdiBvZmYgdGhlIC1sZWZ0IGFuZCAtdG9wIGVxdWFsIHRvIHNpemUgb2Ygb3VyIHBpZWNlcwoJCQllbAoJCQkJLmNsb25lKCkKCQkJCS5hcHBlbmRUbyggImJvZHkiICkKCQkJCS53cmFwKCAiPGRpdj48L2Rpdj4iICkKCQkJCS5jc3MoewoJCQkJCXBvc2l0aW9uOiAiYWJzb2x1dGUiLAoJCQkJCXZpc2liaWxpdHk6ICJ2aXNpYmxlIiwKCQkJCQlsZWZ0OiAtaiAqIHdpZHRoLAoJCQkJCXRvcDogLWkgKiBoZWlnaHQKCQkJCX0pCgoJCQkvLyBzZWxlY3QgdGhlIHdyYXBwZXIgLSBtYWtlIGl0IG92ZXJmbG93OiBoaWRkZW4gYW5kIGFic29sdXRlIHBvc2l0aW9uZWQgYmFzZWQgb24KCQkJLy8gd2hlcmUgdGhlIG9yaWdpbmFsIHdhcyBsb2NhdGVkICtsZWZ0IGFuZCArdG9wIGVxdWFsIHRvIHRoZSBzaXplIG9mIHBpZWNlcwoJCQkJLnBhcmVudCgpCgkJCQkuYWRkQ2xhc3MoICJ1aS1lZmZlY3RzLWV4cGxvZGUiICkKCQkJCS5jc3MoewoJCQkJCXBvc2l0aW9uOiAiYWJzb2x1dGUiLAoJCQkJCW92ZXJmbG93OiAiaGlkZGVuIiwKCQkJCQl3aWR0aDogd2lkdGgsCgkJCQkJaGVpZ2h0OiBoZWlnaHQsCgkJCQkJbGVmdDogbGVmdCArICggc2hvdyA/IG14ICogd2lkdGggOiAwICksCgkJCQkJdG9wOiB0b3AgKyAoIHNob3cgPyBteSAqIGhlaWdodCA6IDAgKSwKCQkJCQlvcGFjaXR5OiBzaG93ID8gMCA6IDEKCQkJCX0pLmFuaW1hdGUoewoJCQkJCWxlZnQ6IGxlZnQgKyAoIHNob3cgPyAwIDogbXggKiB3aWR0aCApLAoJCQkJCXRvcDogdG9wICsgKCBzaG93ID8gMCA6IG15ICogaGVpZ2h0ICksCgkJCQkJb3BhY2l0eTogc2hvdyA/IDEgOiAwCgkJCQl9LCBvLmR1cmF0aW9uIHx8IDUwMCwgby5lYXNpbmcsIGNoaWxkQ29tcGxldGUgKTsKCQl9Cgl9CgoJZnVuY3Rpb24gYW5pbUNvbXBsZXRlKCkgewoJCWVsLmNzcyh7CgkJCXZpc2liaWxpdHk6ICJ2aXNpYmxlIgoJCX0pOwoJCSQoIHBpZWNlcyApLnJlbW92ZSgpOwoJCWlmICggIXNob3cgKSB7CgkJCWVsLmhpZGUoKTsKCQl9CgkJZG9uZSgpOwoJfQp9OwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgokLmVmZmVjdHMuZWZmZWN0LmZhZGUgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCXZhciBlbCA9ICQoIHRoaXMgKSwKCQltb2RlID0gJC5lZmZlY3RzLnNldE1vZGUoIGVsLCBvLm1vZGUgfHwgInRvZ2dsZSIgKTsKCgllbC5hbmltYXRlKHsKCQlvcGFjaXR5OiBtb2RlCgl9LCB7CgkJcXVldWU6IGZhbHNlLAoJCWR1cmF0aW9uOiBvLmR1cmF0aW9uLAoJCWVhc2luZzogby5lYXNpbmcsCgkJY29tcGxldGU6IGRvbmUKCX0pOwp9OwoKfSkoIGpRdWVyeSApOwooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCiQuZWZmZWN0cy5lZmZlY3QuZm9sZCA9IGZ1bmN0aW9uKCBvLCBkb25lICkgewoKCS8vIENyZWF0ZSBlbGVtZW50Cgl2YXIgZWwgPSAkKCB0aGlzICksCgkJcHJvcHMgPSBbICJwb3NpdGlvbiIsICJ0b3AiLCAiYm90dG9tIiwgImxlZnQiLCAicmlnaHQiLCAiaGVpZ2h0IiwgIndpZHRoIiBdLAoJCW1vZGUgPSAkLmVmZmVjdHMuc2V0TW9kZSggZWwsIG8ubW9kZSB8fCAiaGlkZSIgKSwKCQlzaG93ID0gbW9kZSA9PT0gInNob3ciLAoJCWhpZGUgPSBtb2RlID09PSAiaGlkZSIsCgkJc2l6ZSA9IG8uc2l6ZSB8fCAxNSwKCQlwZXJjZW50ID0gLyhbMC05XSspJS8uZXhlYyggc2l6ZSApLAoJCWhvcml6Rmlyc3QgPSAhIW8uaG9yaXpGaXJzdCwKCQl3aWR0aEZpcnN0ID0gc2hvdyAhPT0gaG9yaXpGaXJzdCwKCQlyZWYgPSB3aWR0aEZpcnN0ID8gWyAid2lkdGgiLCAiaGVpZ2h0IiBdIDogWyAiaGVpZ2h0IiwgIndpZHRoIiBdLAoJCWR1cmF0aW9uID0gby5kdXJhdGlvbiAvIDIsCgkJd3JhcHBlciwgZGlzdGFuY2UsCgkJYW5pbWF0aW9uMSA9IHt9LAoJCWFuaW1hdGlvbjIgPSB7fTsKCgkkLmVmZmVjdHMuc2F2ZSggZWwsIHByb3BzICk7CgllbC5zaG93KCk7CgoJLy8gQ3JlYXRlIFdyYXBwZXIKCXdyYXBwZXIgPSAkLmVmZmVjdHMuY3JlYXRlV3JhcHBlciggZWwgKS5jc3MoewoJCW92ZXJmbG93OiAiaGlkZGVuIgoJfSk7CglkaXN0YW5jZSA9IHdpZHRoRmlyc3QgPwoJCVsgd3JhcHBlci53aWR0aCgpLCB3cmFwcGVyLmhlaWdodCgpIF0gOgoJCVsgd3JhcHBlci5oZWlnaHQoKSwgd3JhcHBlci53aWR0aCgpIF07CgoJaWYgKCBwZXJjZW50ICkgewoJCXNpemUgPSBwYXJzZUludCggcGVyY2VudFsgMSBdLCAxMCApIC8gMTAwICogZGlzdGFuY2VbIGhpZGUgPyAwIDogMSBdOwoJfQoJaWYgKCBzaG93ICkgewoJCXdyYXBwZXIuY3NzKCBob3JpekZpcnN0ID8gewoJCQloZWlnaHQ6IDAsCgkJCXdpZHRoOiBzaXplCgkJfSA6IHsKCQkJaGVpZ2h0OiBzaXplLAoJCQl3aWR0aDogMAoJCX0pOwoJfQoKCS8vIEFuaW1hdGlvbgoJYW5pbWF0aW9uMVsgcmVmWyAwIF0gXSA9IHNob3cgPyBkaXN0YW5jZVsgMCBdIDogc2l6ZTsKCWFuaW1hdGlvbjJbIHJlZlsgMSBdIF0gPSBzaG93ID8gZGlzdGFuY2VbIDEgXSA6IDA7CgoJLy8gQW5pbWF0ZQoJd3JhcHBlcgoJCS5hbmltYXRlKCBhbmltYXRpb24xLCBkdXJhdGlvbiwgby5lYXNpbmcgKQoJCS5hbmltYXRlKCBhbmltYXRpb24yLCBkdXJhdGlvbiwgby5lYXNpbmcsIGZ1bmN0aW9uKCkgewoJCQlpZiAoIGhpZGUgKSB7CgkJCQllbC5oaWRlKCk7CgkJCX0KCQkJJC5lZmZlY3RzLnJlc3RvcmUoIGVsLCBwcm9wcyApOwoJCQkkLmVmZmVjdHMucmVtb3ZlV3JhcHBlciggZWwgKTsKCQkJZG9uZSgpOwoJCX0pOwoKfTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKJC5lZmZlY3RzLmVmZmVjdC5oaWdobGlnaHQgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCXZhciBlbGVtID0gJCggdGhpcyApLAoJCXByb3BzID0gWyAiYmFja2dyb3VuZEltYWdlIiwgImJhY2tncm91bmRDb2xvciIsICJvcGFjaXR5IiBdLAoJCW1vZGUgPSAkLmVmZmVjdHMuc2V0TW9kZSggZWxlbSwgby5tb2RlIHx8ICJzaG93IiApLAoJCWFuaW1hdGlvbiA9IHsKCQkJYmFja2dyb3VuZENvbG9yOiBlbGVtLmNzcyggImJhY2tncm91bmRDb2xvciIgKQoJCX07CgoJaWYgKG1vZGUgPT09ICJoaWRlIikgewoJCWFuaW1hdGlvbi5vcGFjaXR5ID0gMDsKCX0KCgkkLmVmZmVjdHMuc2F2ZSggZWxlbSwgcHJvcHMgKTsKCgllbGVtCgkJLnNob3coKQoJCS5jc3MoewoJCQliYWNrZ3JvdW5kSW1hZ2U6ICJub25lIiwKCQkJYmFja2dyb3VuZENvbG9yOiBvLmNvbG9yIHx8ICIjZmZmZjk5IgoJCX0pCgkJLmFuaW1hdGUoIGFuaW1hdGlvbiwgewoJCQlxdWV1ZTogZmFsc2UsCgkJCWR1cmF0aW9uOiBvLmR1cmF0aW9uLAoJCQllYXNpbmc6IG8uZWFzaW5nLAoJCQljb21wbGV0ZTogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIG1vZGUgPT09ICJoaWRlIiApIHsKCQkJCQllbGVtLmhpZGUoKTsKCQkJCX0KCQkJCSQuZWZmZWN0cy5yZXN0b3JlKCBlbGVtLCBwcm9wcyApOwoJCQkJZG9uZSgpOwoJCQl9CgkJfSk7Cn07Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCiQuZWZmZWN0cy5lZmZlY3QucHVsc2F0ZSA9IGZ1bmN0aW9uKCBvLCBkb25lICkgewoJdmFyIGVsZW0gPSAkKCB0aGlzICksCgkJbW9kZSA9ICQuZWZmZWN0cy5zZXRNb2RlKCBlbGVtLCBvLm1vZGUgfHwgInNob3ciICksCgkJc2hvdyA9IG1vZGUgPT09ICJzaG93IiwKCQloaWRlID0gbW9kZSA9PT0gImhpZGUiLAoJCXNob3doaWRlID0gKCBzaG93IHx8IG1vZGUgPT09ICJoaWRlIiApLAoKCQkvLyBzaG93aW5nIG9yIGhpZGluZyBsZWF2ZXMgb2YgdGhlICJsYXN0IiBhbmltYXRpb24KCQlhbmltcyA9ICggKCBvLnRpbWVzIHx8IDUgKSAqIDIgKSArICggc2hvd2hpZGUgPyAxIDogMCApLAoJCWR1cmF0aW9uID0gby5kdXJhdGlvbiAvIGFuaW1zLAoJCWFuaW1hdGVUbyA9IDAsCgkJcXVldWUgPSBlbGVtLnF1ZXVlKCksCgkJcXVldWVsZW4gPSBxdWV1ZS5sZW5ndGgsCgkJaTsKCglpZiAoIHNob3cgfHwgIWVsZW0uaXMoIjp2aXNpYmxlIikpIHsKCQllbGVtLmNzcyggIm9wYWNpdHkiLCAwICkuc2hvdygpOwoJCWFuaW1hdGVUbyA9IDE7Cgl9CgoJLy8gYW5pbXMgLSAxIG9wYWNpdHkgInRvZ2dsZXMiCglmb3IgKCBpID0gMTsgaSA8IGFuaW1zOyBpKysgKSB7CgkJZWxlbS5hbmltYXRlKHsKCQkJb3BhY2l0eTogYW5pbWF0ZVRvCgkJfSwgZHVyYXRpb24sIG8uZWFzaW5nICk7CgkJYW5pbWF0ZVRvID0gMSAtIGFuaW1hdGVUbzsKCX0KCgllbGVtLmFuaW1hdGUoewoJCW9wYWNpdHk6IGFuaW1hdGVUbwoJfSwgZHVyYXRpb24sIG8uZWFzaW5nKTsKCgllbGVtLnF1ZXVlKGZ1bmN0aW9uKCkgewoJCWlmICggaGlkZSApIHsKCQkJZWxlbS5oaWRlKCk7CgkJfQoJCWRvbmUoKTsKCX0pOwoKCS8vIFdlIGp1c3QgcXVldWVkIHVwICJhbmltcyIgYW5pbWF0aW9ucywgd2UgbmVlZCB0byBwdXQgdGhlbSBuZXh0IGluIHRoZSBxdWV1ZQoJaWYgKCBxdWV1ZWxlbiA+IDEgKSB7CgkJcXVldWUuc3BsaWNlLmFwcGx5KCBxdWV1ZSwKCQkJWyAxLCAwIF0uY29uY2F0KCBxdWV1ZS5zcGxpY2UoIHF1ZXVlbGVuLCBhbmltcyArIDEgKSApICk7Cgl9CgllbGVtLmRlcXVldWUoKTsKfTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKJC5lZmZlY3RzLmVmZmVjdC5wdWZmID0gZnVuY3Rpb24oIG8sIGRvbmUgKSB7Cgl2YXIgZWxlbSA9ICQoIHRoaXMgKSwKCQltb2RlID0gJC5lZmZlY3RzLnNldE1vZGUoIGVsZW0sIG8ubW9kZSB8fCAiaGlkZSIgKSwKCQloaWRlID0gbW9kZSA9PT0gImhpZGUiLAoJCXBlcmNlbnQgPSBwYXJzZUludCggby5wZXJjZW50LCAxMCApIHx8IDE1MCwKCQlmYWN0b3IgPSBwZXJjZW50IC8gMTAwLAoJCW9yaWdpbmFsID0gewoJCQloZWlnaHQ6IGVsZW0uaGVpZ2h0KCksCgkJCXdpZHRoOiBlbGVtLndpZHRoKCksCgkJCW91dGVySGVpZ2h0OiBlbGVtLm91dGVySGVpZ2h0KCksCgkJCW91dGVyV2lkdGg6IGVsZW0ub3V0ZXJXaWR0aCgpCgkJfTsKCgkkLmV4dGVuZCggbywgewoJCWVmZmVjdDogInNjYWxlIiwKCQlxdWV1ZTogZmFsc2UsCgkJZmFkZTogdHJ1ZSwKCQltb2RlOiBtb2RlLAoJCWNvbXBsZXRlOiBkb25lLAoJCXBlcmNlbnQ6IGhpZGUgPyBwZXJjZW50IDogMTAwLAoJCWZyb206IGhpZGUgPwoJCQlvcmlnaW5hbCA6CgkJCXsKCQkJCWhlaWdodDogb3JpZ2luYWwuaGVpZ2h0ICogZmFjdG9yLAoJCQkJd2lkdGg6IG9yaWdpbmFsLndpZHRoICogZmFjdG9yLAoJCQkJb3V0ZXJIZWlnaHQ6IG9yaWdpbmFsLm91dGVySGVpZ2h0ICogZmFjdG9yLAoJCQkJb3V0ZXJXaWR0aDogb3JpZ2luYWwub3V0ZXJXaWR0aCAqIGZhY3RvcgoJCQl9Cgl9KTsKCgllbGVtLmVmZmVjdCggbyApOwp9OwoKJC5lZmZlY3RzLmVmZmVjdC5zY2FsZSA9IGZ1bmN0aW9uKCBvLCBkb25lICkgewoKCS8vIENyZWF0ZSBlbGVtZW50Cgl2YXIgZWwgPSAkKCB0aGlzICksCgkJb3B0aW9ucyA9ICQuZXh0ZW5kKCB0cnVlLCB7fSwgbyApLAoJCW1vZGUgPSAkLmVmZmVjdHMuc2V0TW9kZSggZWwsIG8ubW9kZSB8fCAiZWZmZWN0IiApLAoJCXBlcmNlbnQgPSBwYXJzZUludCggby5wZXJjZW50LCAxMCApIHx8CgkJCSggcGFyc2VJbnQoIG8ucGVyY2VudCwgMTAgKSA9PT0gMCA/IDAgOiAoIG1vZGUgPT09ICJoaWRlIiA/IDAgOiAxMDAgKSApLAoJCWRpcmVjdGlvbiA9IG8uZGlyZWN0aW9uIHx8ICJib3RoIiwKCQlvcmlnaW4gPSBvLm9yaWdpbiwKCQlvcmlnaW5hbCA9IHsKCQkJaGVpZ2h0OiBlbC5oZWlnaHQoKSwKCQkJd2lkdGg6IGVsLndpZHRoKCksCgkJCW91dGVySGVpZ2h0OiBlbC5vdXRlckhlaWdodCgpLAoJCQlvdXRlcldpZHRoOiBlbC5vdXRlcldpZHRoKCkKCQl9LAoJCWZhY3RvciA9IHsKCQkJeTogZGlyZWN0aW9uICE9PSAiaG9yaXpvbnRhbCIgPyAocGVyY2VudCAvIDEwMCkgOiAxLAoJCQl4OiBkaXJlY3Rpb24gIT09ICJ2ZXJ0aWNhbCIgPyAocGVyY2VudCAvIDEwMCkgOiAxCgkJfTsKCgkvLyBXZSBhcmUgZ29pbmcgdG8gcGFzcyB0aGlzIGVmZmVjdCB0byB0aGUgc2l6ZSBlZmZlY3Q6CglvcHRpb25zLmVmZmVjdCA9ICJzaXplIjsKCW9wdGlvbnMucXVldWUgPSBmYWxzZTsKCW9wdGlvbnMuY29tcGxldGUgPSBkb25lOwoKCS8vIFNldCBkZWZhdWx0IG9yaWdpbiBhbmQgcmVzdG9yZSBmb3Igc2hvdy9oaWRlCglpZiAoIG1vZGUgIT09ICJlZmZlY3QiICkgewoJCW9wdGlvbnMub3JpZ2luID0gb3JpZ2luIHx8IFsibWlkZGxlIiwiY2VudGVyIl07CgkJb3B0aW9ucy5yZXN0b3JlID0gdHJ1ZTsKCX0KCglvcHRpb25zLmZyb20gPSBvLmZyb20gfHwgKCBtb2RlID09PSAic2hvdyIgPyB7CgkJaGVpZ2h0OiAwLAoJCXdpZHRoOiAwLAoJCW91dGVySGVpZ2h0OiAwLAoJCW91dGVyV2lkdGg6IDAKCX0gOiBvcmlnaW5hbCApOwoJb3B0aW9ucy50byA9IHsKCQloZWlnaHQ6IG9yaWdpbmFsLmhlaWdodCAqIGZhY3Rvci55LAoJCXdpZHRoOiBvcmlnaW5hbC53aWR0aCAqIGZhY3Rvci54LAoJCW91dGVySGVpZ2h0OiBvcmlnaW5hbC5vdXRlckhlaWdodCAqIGZhY3Rvci55LAoJCW91dGVyV2lkdGg6IG9yaWdpbmFsLm91dGVyV2lkdGggKiBmYWN0b3IueAoJfTsKCgkvLyBGYWRlIG9wdGlvbiB0byBzdXBwb3J0IHB1ZmYKCWlmICggb3B0aW9ucy5mYWRlICkgewoJCWlmICggbW9kZSA9PT0gInNob3ciICkgewoJCQlvcHRpb25zLmZyb20ub3BhY2l0eSA9IDA7CgkJCW9wdGlvbnMudG8ub3BhY2l0eSA9IDE7CgkJfQoJCWlmICggbW9kZSA9PT0gImhpZGUiICkgewoJCQlvcHRpb25zLmZyb20ub3BhY2l0eSA9IDE7CgkJCW9wdGlvbnMudG8ub3BhY2l0eSA9IDA7CgkJfQoJfQoKCS8vIEFuaW1hdGUKCWVsLmVmZmVjdCggb3B0aW9ucyApOwoKfTsKCiQuZWZmZWN0cy5lZmZlY3Quc2l6ZSA9IGZ1bmN0aW9uKCBvLCBkb25lICkgewoKCS8vIENyZWF0ZSBlbGVtZW50Cgl2YXIgb3JpZ2luYWwsIGJhc2VsaW5lLCBmYWN0b3IsCgkJZWwgPSAkKCB0aGlzICksCgkJcHJvcHMwID0gWyAicG9zaXRpb24iLCAidG9wIiwgImJvdHRvbSIsICJsZWZ0IiwgInJpZ2h0IiwgIndpZHRoIiwgImhlaWdodCIsICJvdmVyZmxvdyIsICJvcGFjaXR5IiBdLAoKCQkvLyBBbHdheXMgcmVzdG9yZQoJCXByb3BzMSA9IFsgInBvc2l0aW9uIiwgInRvcCIsICJib3R0b20iLCAibGVmdCIsICJyaWdodCIsICJvdmVyZmxvdyIsICJvcGFjaXR5IiBdLAoKCQkvLyBDb3B5IGZvciBjaGlsZHJlbgoJCXByb3BzMiA9IFsgIndpZHRoIiwgImhlaWdodCIsICJvdmVyZmxvdyIgXSwKCQljUHJvcHMgPSBbICJmb250U2l6ZSIgXSwKCQl2UHJvcHMgPSBbICJib3JkZXJUb3BXaWR0aCIsICJib3JkZXJCb3R0b21XaWR0aCIsICJwYWRkaW5nVG9wIiwgInBhZGRpbmdCb3R0b20iIF0sCgkJaFByb3BzID0gWyAiYm9yZGVyTGVmdFdpZHRoIiwgImJvcmRlclJpZ2h0V2lkdGgiLCAicGFkZGluZ0xlZnQiLCAicGFkZGluZ1JpZ2h0IiBdLAoKCQkvLyBTZXQgb3B0aW9ucwoJCW1vZGUgPSAkLmVmZmVjdHMuc2V0TW9kZSggZWwsIG8ubW9kZSB8fCAiZWZmZWN0IiApLAoJCXJlc3RvcmUgPSBvLnJlc3RvcmUgfHwgbW9kZSAhPT0gImVmZmVjdCIsCgkJc2NhbGUgPSBvLnNjYWxlIHx8ICJib3RoIiwKCQlvcmlnaW4gPSBvLm9yaWdpbiB8fCBbICJtaWRkbGUiLCAiY2VudGVyIiBdLAoJCXBvc2l0aW9uID0gZWwuY3NzKCAicG9zaXRpb24iICksCgkJcHJvcHMgPSByZXN0b3JlID8gcHJvcHMwIDogcHJvcHMxLAoJCXplcm8gPSB7CgkJCWhlaWdodDogMCwKCQkJd2lkdGg6IDAsCgkJCW91dGVySGVpZ2h0OiAwLAoJCQlvdXRlcldpZHRoOiAwCgkJfTsKCglpZiAoIG1vZGUgPT09ICJzaG93IiApIHsKCQllbC5zaG93KCk7Cgl9CglvcmlnaW5hbCA9IHsKCQloZWlnaHQ6IGVsLmhlaWdodCgpLAoJCXdpZHRoOiBlbC53aWR0aCgpLAoJCW91dGVySGVpZ2h0OiBlbC5vdXRlckhlaWdodCgpLAoJCW91dGVyV2lkdGg6IGVsLm91dGVyV2lkdGgoKQoJfTsKCglpZiAoIG8ubW9kZSA9PT0gInRvZ2dsZSIgJiYgbW9kZSA9PT0gInNob3ciICkgewoJCWVsLmZyb20gPSBvLnRvIHx8IHplcm87CgkJZWwudG8gPSBvLmZyb20gfHwgb3JpZ2luYWw7Cgl9IGVsc2UgewoJCWVsLmZyb20gPSBvLmZyb20gfHwgKCBtb2RlID09PSAic2hvdyIgPyB6ZXJvIDogb3JpZ2luYWwgKTsKCQllbC50byA9IG8udG8gfHwgKCBtb2RlID09PSAiaGlkZSIgPyB6ZXJvIDogb3JpZ2luYWwgKTsKCX0KCgkvLyBTZXQgc2NhbGluZyBmYWN0b3IKCWZhY3RvciA9IHsKCQlmcm9tOiB7CgkJCXk6IGVsLmZyb20uaGVpZ2h0IC8gb3JpZ2luYWwuaGVpZ2h0LAoJCQl4OiBlbC5mcm9tLndpZHRoIC8gb3JpZ2luYWwud2lkdGgKCQl9LAoJCXRvOiB7CgkJCXk6IGVsLnRvLmhlaWdodCAvIG9yaWdpbmFsLmhlaWdodCwKCQkJeDogZWwudG8ud2lkdGggLyBvcmlnaW5hbC53aWR0aAoJCX0KCX07CgoJLy8gU2NhbGUgdGhlIGNzcyBib3gKCWlmICggc2NhbGUgPT09ICJib3giIHx8IHNjYWxlID09PSAiYm90aCIgKSB7CgoJCS8vIFZlcnRpY2FsIHByb3BzIHNjYWxpbmcKCQlpZiAoIGZhY3Rvci5mcm9tLnkgIT09IGZhY3Rvci50by55ICkgewoJCQlwcm9wcyA9IHByb3BzLmNvbmNhdCggdlByb3BzICk7CgkJCWVsLmZyb20gPSAkLmVmZmVjdHMuc2V0VHJhbnNpdGlvbiggZWwsIHZQcm9wcywgZmFjdG9yLmZyb20ueSwgZWwuZnJvbSApOwoJCQllbC50byA9ICQuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKCBlbCwgdlByb3BzLCBmYWN0b3IudG8ueSwgZWwudG8gKTsKCQl9CgoJCS8vIEhvcml6b250YWwgcHJvcHMgc2NhbGluZwoJCWlmICggZmFjdG9yLmZyb20ueCAhPT0gZmFjdG9yLnRvLnggKSB7CgkJCXByb3BzID0gcHJvcHMuY29uY2F0KCBoUHJvcHMgKTsKCQkJZWwuZnJvbSA9ICQuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKCBlbCwgaFByb3BzLCBmYWN0b3IuZnJvbS54LCBlbC5mcm9tICk7CgkJCWVsLnRvID0gJC5lZmZlY3RzLnNldFRyYW5zaXRpb24oIGVsLCBoUHJvcHMsIGZhY3Rvci50by54LCBlbC50byApOwoJCX0KCX0KCgkvLyBTY2FsZSB0aGUgY29udGVudAoJaWYgKCBzY2FsZSA9PT0gImNvbnRlbnQiIHx8IHNjYWxlID09PSAiYm90aCIgKSB7CgoJCS8vIFZlcnRpY2FsIHByb3BzIHNjYWxpbmcKCQlpZiAoIGZhY3Rvci5mcm9tLnkgIT09IGZhY3Rvci50by55ICkgewoJCQlwcm9wcyA9IHByb3BzLmNvbmNhdCggY1Byb3BzICkuY29uY2F0KCBwcm9wczIgKTsKCQkJZWwuZnJvbSA9ICQuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKCBlbCwgY1Byb3BzLCBmYWN0b3IuZnJvbS55LCBlbC5mcm9tICk7CgkJCWVsLnRvID0gJC5lZmZlY3RzLnNldFRyYW5zaXRpb24oIGVsLCBjUHJvcHMsIGZhY3Rvci50by55LCBlbC50byApOwoJCX0KCX0KCgkkLmVmZmVjdHMuc2F2ZSggZWwsIHByb3BzICk7CgllbC5zaG93KCk7CgkkLmVmZmVjdHMuY3JlYXRlV3JhcHBlciggZWwgKTsKCWVsLmNzcyggIm92ZXJmbG93IiwgImhpZGRlbiIgKS5jc3MoIGVsLmZyb20gKTsKCgkvLyBBZGp1c3QKCWlmIChvcmlnaW4pIHsgLy8gQ2FsY3VsYXRlIGJhc2VsaW5lIHNoaWZ0cwoJCWJhc2VsaW5lID0gJC5lZmZlY3RzLmdldEJhc2VsaW5lKCBvcmlnaW4sIG9yaWdpbmFsICk7CgkJZWwuZnJvbS50b3AgPSAoIG9yaWdpbmFsLm91dGVySGVpZ2h0IC0gZWwub3V0ZXJIZWlnaHQoKSApICogYmFzZWxpbmUueTsKCQllbC5mcm9tLmxlZnQgPSAoIG9yaWdpbmFsLm91dGVyV2lkdGggLSBlbC5vdXRlcldpZHRoKCkgKSAqIGJhc2VsaW5lLng7CgkJZWwudG8udG9wID0gKCBvcmlnaW5hbC5vdXRlckhlaWdodCAtIGVsLnRvLm91dGVySGVpZ2h0ICkgKiBiYXNlbGluZS55OwoJCWVsLnRvLmxlZnQgPSAoIG9yaWdpbmFsLm91dGVyV2lkdGggLSBlbC50by5vdXRlcldpZHRoICkgKiBiYXNlbGluZS54OwoJfQoJZWwuY3NzKCBlbC5mcm9tICk7IC8vIHNldCB0b3AgJiBsZWZ0CgoJLy8gQW5pbWF0ZQoJaWYgKCBzY2FsZSA9PT0gImNvbnRlbnQiIHx8IHNjYWxlID09PSAiYm90aCIgKSB7IC8vIFNjYWxlIHRoZSBjaGlsZHJlbgoKCQkvLyBBZGQgbWFyZ2lucy9mb250LXNpemUKCQl2UHJvcHMgPSB2UHJvcHMuY29uY2F0KFsgIm1hcmdpblRvcCIsICJtYXJnaW5Cb3R0b20iIF0pLmNvbmNhdChjUHJvcHMpOwoJCWhQcm9wcyA9IGhQcm9wcy5jb25jYXQoWyAibWFyZ2luTGVmdCIsICJtYXJnaW5SaWdodCIgXSk7CgkJcHJvcHMyID0gcHJvcHMwLmNvbmNhdCh2UHJvcHMpLmNvbmNhdChoUHJvcHMpOwoKCQllbC5maW5kKCAiKlt3aWR0aF0iICkuZWFjaCggZnVuY3Rpb24oKXsKCQkJdmFyIGNoaWxkID0gJCggdGhpcyApLAoJCQkJY19vcmlnaW5hbCA9IHsKCQkJCQloZWlnaHQ6IGNoaWxkLmhlaWdodCgpLAoJCQkJCXdpZHRoOiBjaGlsZC53aWR0aCgpLAoJCQkJCW91dGVySGVpZ2h0OiBjaGlsZC5vdXRlckhlaWdodCgpLAoJCQkJCW91dGVyV2lkdGg6IGNoaWxkLm91dGVyV2lkdGgoKQoJCQkJfTsKCQkJaWYgKHJlc3RvcmUpIHsKCQkJCSQuZWZmZWN0cy5zYXZlKGNoaWxkLCBwcm9wczIpOwoJCQl9CgoJCQljaGlsZC5mcm9tID0gewoJCQkJaGVpZ2h0OiBjX29yaWdpbmFsLmhlaWdodCAqIGZhY3Rvci5mcm9tLnksCgkJCQl3aWR0aDogY19vcmlnaW5hbC53aWR0aCAqIGZhY3Rvci5mcm9tLngsCgkJCQlvdXRlckhlaWdodDogY19vcmlnaW5hbC5vdXRlckhlaWdodCAqIGZhY3Rvci5mcm9tLnksCgkJCQlvdXRlcldpZHRoOiBjX29yaWdpbmFsLm91dGVyV2lkdGggKiBmYWN0b3IuZnJvbS54CgkJCX07CgkJCWNoaWxkLnRvID0gewoJCQkJaGVpZ2h0OiBjX29yaWdpbmFsLmhlaWdodCAqIGZhY3Rvci50by55LAoJCQkJd2lkdGg6IGNfb3JpZ2luYWwud2lkdGggKiBmYWN0b3IudG8ueCwKCQkJCW91dGVySGVpZ2h0OiBjX29yaWdpbmFsLmhlaWdodCAqIGZhY3Rvci50by55LAoJCQkJb3V0ZXJXaWR0aDogY19vcmlnaW5hbC53aWR0aCAqIGZhY3Rvci50by54CgkJCX07CgoJCQkvLyBWZXJ0aWNhbCBwcm9wcyBzY2FsaW5nCgkJCWlmICggZmFjdG9yLmZyb20ueSAhPT0gZmFjdG9yLnRvLnkgKSB7CgkJCQljaGlsZC5mcm9tID0gJC5lZmZlY3RzLnNldFRyYW5zaXRpb24oIGNoaWxkLCB2UHJvcHMsIGZhY3Rvci5mcm9tLnksIGNoaWxkLmZyb20gKTsKCQkJCWNoaWxkLnRvID0gJC5lZmZlY3RzLnNldFRyYW5zaXRpb24oIGNoaWxkLCB2UHJvcHMsIGZhY3Rvci50by55LCBjaGlsZC50byApOwoJCQl9CgoJCQkvLyBIb3Jpem9udGFsIHByb3BzIHNjYWxpbmcKCQkJaWYgKCBmYWN0b3IuZnJvbS54ICE9PSBmYWN0b3IudG8ueCApIHsKCQkJCWNoaWxkLmZyb20gPSAkLmVmZmVjdHMuc2V0VHJhbnNpdGlvbiggY2hpbGQsIGhQcm9wcywgZmFjdG9yLmZyb20ueCwgY2hpbGQuZnJvbSApOwoJCQkJY2hpbGQudG8gPSAkLmVmZmVjdHMuc2V0VHJhbnNpdGlvbiggY2hpbGQsIGhQcm9wcywgZmFjdG9yLnRvLngsIGNoaWxkLnRvICk7CgkJCX0KCgkJCS8vIEFuaW1hdGUgY2hpbGRyZW4KCQkJY2hpbGQuY3NzKCBjaGlsZC5mcm9tICk7CgkJCWNoaWxkLmFuaW1hdGUoIGNoaWxkLnRvLCBvLmR1cmF0aW9uLCBvLmVhc2luZywgZnVuY3Rpb24oKSB7CgoJCQkJLy8gUmVzdG9yZSBjaGlsZHJlbgoJCQkJaWYgKCByZXN0b3JlICkgewoJCQkJCSQuZWZmZWN0cy5yZXN0b3JlKCBjaGlsZCwgcHJvcHMyICk7CgkJCQl9CgkJCX0pOwoJCX0pOwoJfQoKCS8vIEFuaW1hdGUKCWVsLmFuaW1hdGUoIGVsLnRvLCB7CgkJcXVldWU6IGZhbHNlLAoJCWR1cmF0aW9uOiBvLmR1cmF0aW9uLAoJCWVhc2luZzogby5lYXNpbmcsCgkJY29tcGxldGU6IGZ1bmN0aW9uKCkgewoJCQlpZiAoIGVsLnRvLm9wYWNpdHkgPT09IDAgKSB7CgkJCQllbC5jc3MoICJvcGFjaXR5IiwgZWwuZnJvbS5vcGFjaXR5ICk7CgkJCX0KCQkJaWYoIG1vZGUgPT09ICJoaWRlIiApIHsKCQkJCWVsLmhpZGUoKTsKCQkJfQoJCQkkLmVmZmVjdHMucmVzdG9yZSggZWwsIHByb3BzICk7CgkJCWlmICggIXJlc3RvcmUgKSB7CgoJCQkJLy8gd2UgbmVlZCB0byBjYWxjdWxhdGUgb3VyIG5ldyBwb3NpdGlvbmluZyBiYXNlZCBvbiB0aGUgc2NhbGluZwoJCQkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCQkJZWwuY3NzKHsKCQkJCQkJcG9zaXRpb246ICJyZWxhdGl2ZSIsCgkJCQkJCXRvcDogZWwudG8udG9wLAoJCQkJCQlsZWZ0OiBlbC50by5sZWZ0CgkJCQkJfSk7CgkJCQl9IGVsc2UgewoJCQkJCSQuZWFjaChbICJ0b3AiLCAibGVmdCIgXSwgZnVuY3Rpb24oIGlkeCwgcG9zICkgewoJCQkJCQllbC5jc3MoIHBvcywgZnVuY3Rpb24oIF8sIHN0ciApIHsKCQkJCQkJCXZhciB2YWwgPSBwYXJzZUludCggc3RyLCAxMCApLAoJCQkJCQkJCXRvUmVmID0gaWR4ID8gZWwudG8ubGVmdCA6IGVsLnRvLnRvcDsKCgkJCQkJCQkvLyBpZiBvcmlnaW5hbCB3YXMgImF1dG8iLCByZWNhbGN1bGF0ZSB0aGUgbmV3IHZhbHVlIGZyb20gd3JhcHBlcgoJCQkJCQkJaWYgKCBzdHIgPT09ICJhdXRvIiApIHsKCQkJCQkJCQlyZXR1cm4gdG9SZWYgKyAicHgiOwoJCQkJCQkJfQoKCQkJCQkJCXJldHVybiB2YWwgKyB0b1JlZiArICJweCI7CgkJCQkJCX0pOwoJCQkJCX0pOwoJCQkJfQoJCQl9CgoJCQkkLmVmZmVjdHMucmVtb3ZlV3JhcHBlciggZWwgKTsKCQkJZG9uZSgpOwoJCX0KCX0pOwoKfTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKJC5lZmZlY3RzLmVmZmVjdC5zaGFrZSA9IGZ1bmN0aW9uKCBvLCBkb25lICkgewoKCXZhciBlbCA9ICQoIHRoaXMgKSwKCQlwcm9wcyA9IFsgInBvc2l0aW9uIiwgInRvcCIsICJib3R0b20iLCAibGVmdCIsICJyaWdodCIsICJoZWlnaHQiLCAid2lkdGgiIF0sCgkJbW9kZSA9ICQuZWZmZWN0cy5zZXRNb2RlKCBlbCwgby5tb2RlIHx8ICJlZmZlY3QiICksCgkJZGlyZWN0aW9uID0gby5kaXJlY3Rpb24gfHwgImxlZnQiLAoJCWRpc3RhbmNlID0gby5kaXN0YW5jZSB8fCAyMCwKCQl0aW1lcyA9IG8udGltZXMgfHwgMywKCQlhbmltcyA9IHRpbWVzICogMiArIDEsCgkJc3BlZWQgPSBNYXRoLnJvdW5kKG8uZHVyYXRpb24vYW5pbXMpLAoJCXJlZiA9IChkaXJlY3Rpb24gPT09ICJ1cCIgfHwgZGlyZWN0aW9uID09PSAiZG93biIpID8gInRvcCIgOiAibGVmdCIsCgkJcG9zaXRpdmVNb3Rpb24gPSAoZGlyZWN0aW9uID09PSAidXAiIHx8IGRpcmVjdGlvbiA9PT0gImxlZnQiKSwKCQlhbmltYXRpb24gPSB7fSwKCQlhbmltYXRpb24xID0ge30sCgkJYW5pbWF0aW9uMiA9IHt9LAoJCWksCgoJCS8vIHdlIHdpbGwgbmVlZCB0byByZS1hc3NlbWJsZSB0aGUgcXVldWUgdG8gc3RhY2sgb3VyIGFuaW1hdGlvbnMgaW4gcGxhY2UKCQlxdWV1ZSA9IGVsLnF1ZXVlKCksCgkJcXVldWVsZW4gPSBxdWV1ZS5sZW5ndGg7CgoJJC5lZmZlY3RzLnNhdmUoIGVsLCBwcm9wcyApOwoJZWwuc2hvdygpOwoJJC5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoIGVsICk7CgoJLy8gQW5pbWF0aW9uCglhbmltYXRpb25bIHJlZiBdID0gKCBwb3NpdGl2ZU1vdGlvbiA/ICItPSIgOiAiKz0iICkgKyBkaXN0YW5jZTsKCWFuaW1hdGlvbjFbIHJlZiBdID0gKCBwb3NpdGl2ZU1vdGlvbiA/ICIrPSIgOiAiLT0iICkgKyBkaXN0YW5jZSAqIDI7CglhbmltYXRpb24yWyByZWYgXSA9ICggcG9zaXRpdmVNb3Rpb24gPyAiLT0iIDogIis9IiApICsgZGlzdGFuY2UgKiAyOwoKCS8vIEFuaW1hdGUKCWVsLmFuaW1hdGUoIGFuaW1hdGlvbiwgc3BlZWQsIG8uZWFzaW5nICk7CgoJLy8gU2hha2VzCglmb3IgKCBpID0gMTsgaSA8IHRpbWVzOyBpKysgKSB7CgkJZWwuYW5pbWF0ZSggYW5pbWF0aW9uMSwgc3BlZWQsIG8uZWFzaW5nICkuYW5pbWF0ZSggYW5pbWF0aW9uMiwgc3BlZWQsIG8uZWFzaW5nICk7Cgl9CgllbAoJCS5hbmltYXRlKCBhbmltYXRpb24xLCBzcGVlZCwgby5lYXNpbmcgKQoJCS5hbmltYXRlKCBhbmltYXRpb24sIHNwZWVkIC8gMiwgby5lYXNpbmcgKQoJCS5xdWV1ZShmdW5jdGlvbigpIHsKCQkJaWYgKCBtb2RlID09PSAiaGlkZSIgKSB7CgkJCQllbC5oaWRlKCk7CgkJCX0KCQkJJC5lZmZlY3RzLnJlc3RvcmUoIGVsLCBwcm9wcyApOwoJCQkkLmVmZmVjdHMucmVtb3ZlV3JhcHBlciggZWwgKTsKCQkJZG9uZSgpOwoJCX0pOwoKCS8vIGluamVjdCBhbGwgdGhlIGFuaW1hdGlvbnMgd2UganVzdCBxdWV1ZWQgdG8gYmUgZmlyc3QgaW4gbGluZSAoYWZ0ZXIgImlucHJvZ3Jlc3MiKQoJaWYgKCBxdWV1ZWxlbiA+IDEpIHsKCQlxdWV1ZS5zcGxpY2UuYXBwbHkoIHF1ZXVlLAoJCQlbIDEsIDAgXS5jb25jYXQoIHF1ZXVlLnNwbGljZSggcXVldWVsZW4sIGFuaW1zICsgMSApICkgKTsKCX0KCWVsLmRlcXVldWUoKTsKCn07Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCiQuZWZmZWN0cy5lZmZlY3Quc2xpZGUgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCgkvLyBDcmVhdGUgZWxlbWVudAoJdmFyIGVsID0gJCggdGhpcyApLAoJCXByb3BzID0gWyAicG9zaXRpb24iLCAidG9wIiwgImJvdHRvbSIsICJsZWZ0IiwgInJpZ2h0IiwgIndpZHRoIiwgImhlaWdodCIgXSwKCQltb2RlID0gJC5lZmZlY3RzLnNldE1vZGUoIGVsLCBvLm1vZGUgfHwgInNob3ciICksCgkJc2hvdyA9IG1vZGUgPT09ICJzaG93IiwKCQlkaXJlY3Rpb24gPSBvLmRpcmVjdGlvbiB8fCAibGVmdCIsCgkJcmVmID0gKGRpcmVjdGlvbiA9PT0gInVwIiB8fCBkaXJlY3Rpb24gPT09ICJkb3duIikgPyAidG9wIiA6ICJsZWZ0IiwKCQlwb3NpdGl2ZU1vdGlvbiA9IChkaXJlY3Rpb24gPT09ICJ1cCIgfHwgZGlyZWN0aW9uID09PSAibGVmdCIpLAoJCWRpc3RhbmNlLAoJCWFuaW1hdGlvbiA9IHt9OwoKCS8vIEFkanVzdAoJJC5lZmZlY3RzLnNhdmUoIGVsLCBwcm9wcyApOwoJZWwuc2hvdygpOwoJZGlzdGFuY2UgPSBvLmRpc3RhbmNlIHx8IGVsWyByZWYgPT09ICJ0b3AiID8gIm91dGVySGVpZ2h0IiA6ICJvdXRlcldpZHRoIiBdKCB0cnVlICk7CgoJJC5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoIGVsICkuY3NzKHsKCQlvdmVyZmxvdzogImhpZGRlbiIKCX0pOwoKCWlmICggc2hvdyApIHsKCQllbC5jc3MoIHJlZiwgcG9zaXRpdmVNb3Rpb24gPyAoaXNOYU4oZGlzdGFuY2UpID8gIi0iICsgZGlzdGFuY2UgOiAtZGlzdGFuY2UpIDogZGlzdGFuY2UgKTsKCX0KCgkvLyBBbmltYXRpb24KCWFuaW1hdGlvblsgcmVmIF0gPSAoIHNob3cgPwoJCSggcG9zaXRpdmVNb3Rpb24gPyAiKz0iIDogIi09IikgOgoJCSggcG9zaXRpdmVNb3Rpb24gPyAiLT0iIDogIis9IikpICsKCQlkaXN0YW5jZTsKCgkvLyBBbmltYXRlCgllbC5hbmltYXRlKCBhbmltYXRpb24sIHsKCQlxdWV1ZTogZmFsc2UsCgkJZHVyYXRpb246IG8uZHVyYXRpb24sCgkJZWFzaW5nOiBvLmVhc2luZywKCQljb21wbGV0ZTogZnVuY3Rpb24oKSB7CgkJCWlmICggbW9kZSA9PT0gImhpZGUiICkgewoJCQkJZWwuaGlkZSgpOwoJCQl9CgkJCSQuZWZmZWN0cy5yZXN0b3JlKCBlbCwgcHJvcHMgKTsKCQkJJC5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoIGVsICk7CgkJCWRvbmUoKTsKCQl9Cgl9KTsKfTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKJC5lZmZlY3RzLmVmZmVjdC50cmFuc2ZlciA9IGZ1bmN0aW9uKCBvLCBkb25lICkgewoJdmFyIGVsZW0gPSAkKCB0aGlzICksCgkJdGFyZ2V0ID0gJCggby50byApLAoJCXRhcmdldEZpeGVkID0gdGFyZ2V0LmNzcyggInBvc2l0aW9uIiApID09PSAiZml4ZWQiLAoJCWJvZHkgPSAkKCJib2R5IiksCgkJZml4VG9wID0gdGFyZ2V0Rml4ZWQgPyBib2R5LnNjcm9sbFRvcCgpIDogMCwKCQlmaXhMZWZ0ID0gdGFyZ2V0Rml4ZWQgPyBib2R5LnNjcm9sbExlZnQoKSA6IDAsCgkJZW5kUG9zaXRpb24gPSB0YXJnZXQub2Zmc2V0KCksCgkJYW5pbWF0aW9uID0gewoJCQl0b3A6IGVuZFBvc2l0aW9uLnRvcCAtIGZpeFRvcCAsCgkJCWxlZnQ6IGVuZFBvc2l0aW9uLmxlZnQgLSBmaXhMZWZ0ICwKCQkJaGVpZ2h0OiB0YXJnZXQuaW5uZXJIZWlnaHQoKSwKCQkJd2lkdGg6IHRhcmdldC5pbm5lcldpZHRoKCkKCQl9LAoJCXN0YXJ0UG9zaXRpb24gPSBlbGVtLm9mZnNldCgpLAoJCXRyYW5zZmVyID0gJCggJzxkaXYgY2xhc3M9InVpLWVmZmVjdHMtdHJhbnNmZXIiPjwvZGl2PicgKQoJCQkuYXBwZW5kVG8oIGRvY3VtZW50LmJvZHkgKQoJCQkuYWRkQ2xhc3MoIG8uY2xhc3NOYW1lICkKCQkJLmNzcyh7CgkJCQl0b3A6IHN0YXJ0UG9zaXRpb24udG9wIC0gZml4VG9wICwKCQkJCWxlZnQ6IHN0YXJ0UG9zaXRpb24ubGVmdCAtIGZpeExlZnQgLAoJCQkJaGVpZ2h0OiBlbGVtLmlubmVySGVpZ2h0KCksCgkJCQl3aWR0aDogZWxlbS5pbm5lcldpZHRoKCksCgkJCQlwb3NpdGlvbjogdGFyZ2V0Rml4ZWQgPyAiZml4ZWQiIDogImFic29sdXRlIgoJCQl9KQoJCQkuYW5pbWF0ZSggYW5pbWF0aW9uLCBvLmR1cmF0aW9uLCBvLmVhc2luZywgZnVuY3Rpb24oKSB7CgkJCQl0cmFuc2Zlci5yZW1vdmUoKTsKCQkJCWRvbmUoKTsKCQkJfSk7Cn07Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCnZhciBtb3VzZUhhbmRsZWQgPSBmYWxzZTsKCiQud2lkZ2V0KCAidWkubWVudSIsIHsKCXZlcnNpb246ICIxLjkuMiIsCglkZWZhdWx0RWxlbWVudDogIjx1bD4iLAoJZGVsYXk6IDMwMCwKCW9wdGlvbnM6IHsKCQlpY29uczogewoJCQlzdWJtZW51OiAidWktaWNvbi1jYXJhdC0xLWUiCgkJfSwKCQltZW51czogInVsIiwKCQlwb3NpdGlvbjogewoJCQlteTogImxlZnQgdG9wIiwKCQkJYXQ6ICJyaWdodCB0b3AiCgkJfSwKCQlyb2xlOiAibWVudSIsCgoJCS8vIGNhbGxiYWNrcwoJCWJsdXI6IG51bGwsCgkJZm9jdXM6IG51bGwsCgkJc2VsZWN0OiBudWxsCgl9LAoKCV9jcmVhdGU6IGZ1bmN0aW9uKCkgewoJCXRoaXMuYWN0aXZlTWVudSA9IHRoaXMuZWxlbWVudDsKCQl0aGlzLmVsZW1lbnQKCQkJLnVuaXF1ZUlkKCkKCQkJLmFkZENsYXNzKCAidWktbWVudSB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIgKQoJCQkudG9nZ2xlQ2xhc3MoICJ1aS1tZW51LWljb25zIiwgISF0aGlzLmVsZW1lbnQuZmluZCggIi51aS1pY29uIiApLmxlbmd0aCApCgkJCS5hdHRyKHsKCQkJCXJvbGU6IHRoaXMub3B0aW9ucy5yb2xlLAoJCQkJdGFiSW5kZXg6IDAKCQkJfSkKCQkJLy8gbmVlZCB0byBjYXRjaCBhbGwgY2xpY2tzIG9uIGRpc2FibGVkIG1lbnUKCQkJLy8gbm90IHBvc3NpYmxlIHRocm91Z2ggX29uCgkJCS5iaW5kKCAiY2xpY2siICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgJC5wcm94eShmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlpZiAoIHRoaXMub3B0aW9ucy5kaXNhYmxlZCApIHsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJfQoJCQl9LCB0aGlzICkpOwoKCQlpZiAoIHRoaXMub3B0aW9ucy5kaXNhYmxlZCApIHsKCQkJdGhpcy5lbGVtZW50CgkJCQkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1kaXNhYmxlZCIgKQoJCQkJLmF0dHIoICJhcmlhLWRpc2FibGVkIiwgInRydWUiICk7CgkJfQoKCQl0aGlzLl9vbih7CgkJCS8vIFByZXZlbnQgZm9jdXMgZnJvbSBzdGlja2luZyB0byBsaW5rcyBpbnNpZGUgbWVudSBhZnRlciBjbGlja2luZwoJCQkvLyB0aGVtIChmb2N1cyBzaG91bGQgYWx3YXlzIHN0YXkgb24gVUwgZHVyaW5nIG5hdmlnYXRpb24pLgoJCQkibW91c2Vkb3duIC51aS1tZW51LWl0ZW0gPiBhIjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJfSwKCQkJImNsaWNrIC51aS1zdGF0ZS1kaXNhYmxlZCA+IGEiOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQl9LAoJCQkiY2xpY2sgLnVpLW1lbnUtaXRlbTpoYXMoYSkiOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQl2YXIgdGFyZ2V0ID0gJCggZXZlbnQudGFyZ2V0ICkuY2xvc2VzdCggIi51aS1tZW51LWl0ZW0iICk7CgkJCQlpZiAoICFtb3VzZUhhbmRsZWQgJiYgdGFyZ2V0Lm5vdCggIi51aS1zdGF0ZS1kaXNhYmxlZCIgKS5sZW5ndGggKSB7CgkJCQkJbW91c2VIYW5kbGVkID0gdHJ1ZTsKCgkJCQkJdGhpcy5zZWxlY3QoIGV2ZW50ICk7CgkJCQkJLy8gT3BlbiBzdWJtZW51IG9uIGNsaWNrCgkJCQkJaWYgKCB0YXJnZXQuaGFzKCAiLnVpLW1lbnUiICkubGVuZ3RoICkgewoJCQkJCQl0aGlzLmV4cGFuZCggZXZlbnQgKTsKCQkJCQl9IGVsc2UgaWYgKCAhdGhpcy5lbGVtZW50LmlzKCAiOmZvY3VzIiApICkgewoJCQkJCQkvLyBSZWRpcmVjdCBmb2N1cyB0byB0aGUgbWVudQoJCQkJCQl0aGlzLmVsZW1lbnQudHJpZ2dlciggImZvY3VzIiwgWyB0cnVlIF0gKTsKCgkJCQkJCS8vIElmIHRoZSBhY3RpdmUgaXRlbSBpcyBvbiB0aGUgdG9wIGxldmVsLCBsZXQgaXQgc3RheSBhY3RpdmUuCgkJCQkJCS8vIE90aGVyd2lzZSwgYmx1ciB0aGUgYWN0aXZlIGl0ZW0gc2luY2UgaXQgaXMgbm8gbG9uZ2VyIHZpc2libGUuCgkJCQkJCWlmICggdGhpcy5hY3RpdmUgJiYgdGhpcy5hY3RpdmUucGFyZW50cyggIi51aS1tZW51IiApLmxlbmd0aCA9PT0gMSApIHsKCQkJCQkJCWNsZWFyVGltZW91dCggdGhpcy50aW1lciApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9LAoJCQkibW91c2VlbnRlciAudWktbWVudS1pdGVtIjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJdmFyIHRhcmdldCA9ICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKTsKCQkJCS8vIFJlbW92ZSB1aS1zdGF0ZS1hY3RpdmUgY2xhc3MgZnJvbSBzaWJsaW5ncyBvZiB0aGUgbmV3bHkgZm9jdXNlZCBtZW51IGl0ZW0KCQkJCS8vIHRvIGF2b2lkIGEganVtcCBjYXVzZWQgYnkgYWRqYWNlbnQgZWxlbWVudHMgYm90aCBoYXZpbmcgYSBjbGFzcyB3aXRoIGEgYm9yZGVyCgkJCQl0YXJnZXQuc2libGluZ3MoKS5jaGlsZHJlbiggIi51aS1zdGF0ZS1hY3RpdmUiICkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCQl0aGlzLmZvY3VzKCBldmVudCwgdGFyZ2V0ICk7CgkJCX0sCgkJCW1vdXNlbGVhdmU6ICJjb2xsYXBzZUFsbCIsCgkJCSJtb3VzZWxlYXZlIC51aS1tZW51IjogImNvbGxhcHNlQWxsIiwKCQkJZm9jdXM6IGZ1bmN0aW9uKCBldmVudCwga2VlcEFjdGl2ZUl0ZW0gKSB7CgkJCQkvLyBJZiB0aGVyZSdzIGFscmVhZHkgYW4gYWN0aXZlIGl0ZW0sIGtlZXAgaXQgYWN0aXZlCgkJCQkvLyBJZiBub3QsIGFjdGl2YXRlIHRoZSBmaXJzdCBpdGVtCgkJCQl2YXIgaXRlbSA9IHRoaXMuYWN0aXZlIHx8IHRoaXMuZWxlbWVudC5jaGlsZHJlbiggIi51aS1tZW51LWl0ZW0iICkuZXEoIDAgKTsKCgkJCQlpZiAoICFrZWVwQWN0aXZlSXRlbSApIHsKCQkJCQl0aGlzLmZvY3VzKCBldmVudCwgaXRlbSApOwoJCQkJfQoJCQl9LAoJCQlibHVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQl0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJCQlpZiAoICEkLmNvbnRhaW5zKCB0aGlzLmVsZW1lbnRbMF0sIHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCApICkgewoJCQkJCQl0aGlzLmNvbGxhcHNlQWxsKCBldmVudCApOwoJCQkJCX0KCQkJCX0pOwoJCQl9LAoJCQlrZXlkb3duOiAiX2tleWRvd24iCgkJfSk7CgoJCXRoaXMucmVmcmVzaCgpOwoKCQkvLyBDbGlja3Mgb3V0c2lkZSBvZiBhIG1lbnUgY29sbGFwc2UgYW55IG9wZW4gbWVudXMKCQl0aGlzLl9vbiggdGhpcy5kb2N1bWVudCwgewoJCQljbGljazogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJaWYgKCAhJCggZXZlbnQudGFyZ2V0ICkuY2xvc2VzdCggIi51aS1tZW51IiApLmxlbmd0aCApIHsKCQkJCQl0aGlzLmNvbGxhcHNlQWxsKCBldmVudCApOwoJCQkJfQoKCQkJCS8vIFJlc2V0IHRoZSBtb3VzZUhhbmRsZWQgZmxhZwoJCQkJbW91c2VIYW5kbGVkID0gZmFsc2U7CgkJCX0KCQl9KTsKCX0sCgoJX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCS8vIERlc3Ryb3kgKHN1YiltZW51cwoJCXRoaXMuZWxlbWVudAoJCQkucmVtb3ZlQXR0ciggImFyaWEtYWN0aXZlZGVzY2VuZGFudCIgKQoJCQkuZmluZCggIi51aS1tZW51IiApLmFuZFNlbGYoKQoJCQkJLnJlbW92ZUNsYXNzKCAidWktbWVudSB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCB1aS1tZW51LWljb25zIiApCgkJCQkucmVtb3ZlQXR0ciggInJvbGUiICkKCQkJCS5yZW1vdmVBdHRyKCAidGFiSW5kZXgiICkKCQkJCS5yZW1vdmVBdHRyKCAiYXJpYS1sYWJlbGxlZGJ5IiApCgkJCQkucmVtb3ZlQXR0ciggImFyaWEtZXhwYW5kZWQiICkKCQkJCS5yZW1vdmVBdHRyKCAiYXJpYS1oaWRkZW4iICkKCQkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkJLnJlbW92ZVVuaXF1ZUlkKCkKCQkJCS5zaG93KCk7CgoJCS8vIERlc3Ryb3kgbWVudSBpdGVtcwoJCXRoaXMuZWxlbWVudC5maW5kKCAiLnVpLW1lbnUtaXRlbSIgKQoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1tZW51LWl0ZW0iICkKCQkJLnJlbW92ZUF0dHIoICJyb2xlIiApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkuY2hpbGRyZW4oICJhIiApCgkJCQkucmVtb3ZlVW5pcXVlSWQoKQoJCQkJLnJlbW92ZUNsYXNzKCAidWktY29ybmVyLWFsbCB1aS1zdGF0ZS1ob3ZlciIgKQoJCQkJLnJlbW92ZUF0dHIoICJ0YWJJbmRleCIgKQoJCQkJLnJlbW92ZUF0dHIoICJyb2xlIiApCgkJCQkucmVtb3ZlQXR0ciggImFyaWEtaGFzcG9wdXAiICkKCQkJCS5jaGlsZHJlbigpLmVhY2goIGZ1bmN0aW9uKCkgewoJCQkJCXZhciBlbGVtID0gJCggdGhpcyApOwoJCQkJCWlmICggZWxlbS5kYXRhKCAidWktbWVudS1zdWJtZW51LWNhcmF0IiApICkgewoJCQkJCQllbGVtLnJlbW92ZSgpOwoJCQkJCX0KCQkJCX0pOwoKCQkvLyBEZXN0cm95IG1lbnUgZGl2aWRlcnMKCQl0aGlzLmVsZW1lbnQuZmluZCggIi51aS1tZW51LWRpdmlkZXIiICkucmVtb3ZlQ2xhc3MoICJ1aS1tZW51LWRpdmlkZXIgdWktd2lkZ2V0LWNvbnRlbnQiICk7Cgl9LAoKCV9rZXlkb3duOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdmFyIG1hdGNoLCBwcmV2LCBjaGFyYWN0ZXIsIHNraXAsIHJlZ2V4LAoJCQlwcmV2ZW50RGVmYXVsdCA9IHRydWU7CgoJCWZ1bmN0aW9uIGVzY2FwZSggdmFsdWUgKSB7CgkJCXJldHVybiB2YWx1ZS5yZXBsYWNlKCAvW1wtXFtcXXt9KCkqKz8uLFxcXF4kfCNcc10vZywgIlxcJCYiICk7CgkJfQoKCQlzd2l0Y2ggKCBldmVudC5rZXlDb2RlICkgewoJCWNhc2UgJC51aS5rZXlDb2RlLlBBR0VfVVA6CgkJCXRoaXMucHJldmlvdXNQYWdlKCBldmVudCApOwoJCQlicmVhazsKCQljYXNlICQudWkua2V5Q29kZS5QQUdFX0RPV046CgkJCXRoaXMubmV4dFBhZ2UoIGV2ZW50ICk7CgkJCWJyZWFrOwoJCWNhc2UgJC51aS5rZXlDb2RlLkhPTUU6CgkJCXRoaXMuX21vdmUoICJmaXJzdCIsICJmaXJzdCIsIGV2ZW50ICk7CgkJCWJyZWFrOwoJCWNhc2UgJC51aS5rZXlDb2RlLkVORDoKCQkJdGhpcy5fbW92ZSggImxhc3QiLCAibGFzdCIsIGV2ZW50ICk7CgkJCWJyZWFrOwoJCWNhc2UgJC51aS5rZXlDb2RlLlVQOgoJCQl0aGlzLnByZXZpb3VzKCBldmVudCApOwoJCQlicmVhazsKCQljYXNlICQudWkua2V5Q29kZS5ET1dOOgoJCQl0aGlzLm5leHQoIGV2ZW50ICk7CgkJCWJyZWFrOwoJCWNhc2UgJC51aS5rZXlDb2RlLkxFRlQ6CgkJCXRoaXMuY29sbGFwc2UoIGV2ZW50ICk7CgkJCWJyZWFrOwoJCWNhc2UgJC51aS5rZXlDb2RlLlJJR0hUOgoJCQlpZiAoIHRoaXMuYWN0aXZlICYmICF0aGlzLmFjdGl2ZS5pcyggIi51aS1zdGF0ZS1kaXNhYmxlZCIgKSApIHsKCQkJCXRoaXMuZXhwYW5kKCBldmVudCApOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgJC51aS5rZXlDb2RlLkVOVEVSOgoJCWNhc2UgJC51aS5rZXlDb2RlLlNQQUNFOgoJCQl0aGlzLl9hY3RpdmF0ZSggZXZlbnQgKTsKCQkJYnJlYWs7CgkJY2FzZSAkLnVpLmtleUNvZGUuRVNDQVBFOgoJCQl0aGlzLmNvbGxhcHNlKCBldmVudCApOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlwcmV2ZW50RGVmYXVsdCA9IGZhbHNlOwoJCQlwcmV2ID0gdGhpcy5wcmV2aW91c0ZpbHRlciB8fCAiIjsKCQkJY2hhcmFjdGVyID0gU3RyaW5nLmZyb21DaGFyQ29kZSggZXZlbnQua2V5Q29kZSApOwoJCQlza2lwID0gZmFsc2U7CgoJCQljbGVhclRpbWVvdXQoIHRoaXMuZmlsdGVyVGltZXIgKTsKCgkJCWlmICggY2hhcmFjdGVyID09PSBwcmV2ICkgewoJCQkJc2tpcCA9IHRydWU7CgkJCX0gZWxzZSB7CgkJCQljaGFyYWN0ZXIgPSBwcmV2ICsgY2hhcmFjdGVyOwoJCQl9CgoJCQlyZWdleCA9IG5ldyBSZWdFeHAoICJeIiArIGVzY2FwZSggY2hhcmFjdGVyICksICJpIiApOwoJCQltYXRjaCA9IHRoaXMuYWN0aXZlTWVudS5jaGlsZHJlbiggIi51aS1tZW51LWl0ZW0iICkuZmlsdGVyKGZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuIHJlZ2V4LnRlc3QoICQoIHRoaXMgKS5jaGlsZHJlbiggImEiICkudGV4dCgpICk7CgkJCX0pOwoJCQltYXRjaCA9IHNraXAgJiYgbWF0Y2guaW5kZXgoIHRoaXMuYWN0aXZlLm5leHQoKSApICE9PSAtMSA/CgkJCQl0aGlzLmFjdGl2ZS5uZXh0QWxsKCAiLnVpLW1lbnUtaXRlbSIgKSA6CgkJCQltYXRjaDsKCgkJCS8vIElmIG5vIG1hdGNoZXMgb24gdGhlIGN1cnJlbnQgZmlsdGVyLCByZXNldCB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgcHJlc3NlZAoJCQkvLyB0byBtb3ZlIGRvd24gdGhlIG1lbnUgdG8gdGhlIGZpcnN0IGl0ZW0gdGhhdCBzdGFydHMgd2l0aCB0aGF0IGNoYXJhY3RlcgoJCQlpZiAoICFtYXRjaC5sZW5ndGggKSB7CgkJCQljaGFyYWN0ZXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCBldmVudC5rZXlDb2RlICk7CgkJCQlyZWdleCA9IG5ldyBSZWdFeHAoICJeIiArIGVzY2FwZSggY2hhcmFjdGVyICksICJpIiApOwoJCQkJbWF0Y2ggPSB0aGlzLmFjdGl2ZU1lbnUuY2hpbGRyZW4oICIudWktbWVudS1pdGVtIiApLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gcmVnZXgudGVzdCggJCggdGhpcyApLmNoaWxkcmVuKCAiYSIgKS50ZXh0KCkgKTsKCQkJCX0pOwoJCQl9CgoJCQlpZiAoIG1hdGNoLmxlbmd0aCApIHsKCQkJCXRoaXMuZm9jdXMoIGV2ZW50LCBtYXRjaCApOwoJCQkJaWYgKCBtYXRjaC5sZW5ndGggPiAxICkgewoJCQkJCXRoaXMucHJldmlvdXNGaWx0ZXIgPSBjaGFyYWN0ZXI7CgkJCQkJdGhpcy5maWx0ZXJUaW1lciA9IHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJCQlkZWxldGUgdGhpcy5wcmV2aW91c0ZpbHRlcjsKCQkJCQl9LCAxMDAwICk7CgkJCQl9IGVsc2UgewoJCQkJCWRlbGV0ZSB0aGlzLnByZXZpb3VzRmlsdGVyOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZGVsZXRlIHRoaXMucHJldmlvdXNGaWx0ZXI7CgkJCX0KCQl9CgoJCWlmICggcHJldmVudERlZmF1bHQgKSB7CgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJfQoJfSwKCglfYWN0aXZhdGU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQlpZiAoICF0aGlzLmFjdGl2ZS5pcyggIi51aS1zdGF0ZS1kaXNhYmxlZCIgKSApIHsKCQkJaWYgKCB0aGlzLmFjdGl2ZS5jaGlsZHJlbiggImFbYXJpYS1oYXNwb3B1cD0ndHJ1ZSddIiApLmxlbmd0aCApIHsKCQkJCXRoaXMuZXhwYW5kKCBldmVudCApOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5zZWxlY3QoIGV2ZW50ICk7CgkJCX0KCQl9Cgl9LAoKCXJlZnJlc2g6IGZ1bmN0aW9uKCkgewoJCXZhciBtZW51cywKCQkJaWNvbiA9IHRoaXMub3B0aW9ucy5pY29ucy5zdWJtZW51LAoJCQlzdWJtZW51cyA9IHRoaXMuZWxlbWVudC5maW5kKCB0aGlzLm9wdGlvbnMubWVudXMgKTsKCgkJLy8gSW5pdGlhbGl6ZSBuZXN0ZWQgbWVudXMKCQlzdWJtZW51cy5maWx0ZXIoICI6bm90KC51aS1tZW51KSIgKQoJCQkuYWRkQ2xhc3MoICJ1aS1tZW51IHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIiApCgkJCS5oaWRlKCkKCQkJLmF0dHIoewoJCQkJcm9sZTogdGhpcy5vcHRpb25zLnJvbGUsCgkJCQkiYXJpYS1oaWRkZW4iOiAidHJ1ZSIsCgkJCQkiYXJpYS1leHBhbmRlZCI6ICJmYWxzZSIKCQkJfSkKCQkJLmVhY2goZnVuY3Rpb24oKSB7CgkJCQl2YXIgbWVudSA9ICQoIHRoaXMgKSwKCQkJCQlpdGVtID0gbWVudS5wcmV2KCAiYSIgKSwKCQkJCQlzdWJtZW51Q2FyYXQgPSAkKCAiPHNwYW4+IiApCgkJCQkJCS5hZGRDbGFzcyggInVpLW1lbnUtaWNvbiB1aS1pY29uICIgKyBpY29uICkKCQkJCQkJLmRhdGEoICJ1aS1tZW51LXN1Ym1lbnUtY2FyYXQiLCB0cnVlICk7CgoJCQkJaXRlbQoJCQkJCS5hdHRyKCAiYXJpYS1oYXNwb3B1cCIsICJ0cnVlIiApCgkJCQkJLnByZXBlbmQoIHN1Ym1lbnVDYXJhdCApOwoJCQkJbWVudS5hdHRyKCAiYXJpYS1sYWJlbGxlZGJ5IiwgaXRlbS5hdHRyKCAiaWQiICkgKTsKCQkJfSk7CgoJCW1lbnVzID0gc3VibWVudXMuYWRkKCB0aGlzLmVsZW1lbnQgKTsKCgkJLy8gRG9uJ3QgcmVmcmVzaCBsaXN0IGl0ZW1zIHRoYXQgYXJlIGFscmVhZHkgYWRhcHRlZAoJCW1lbnVzLmNoaWxkcmVuKCAiOm5vdCgudWktbWVudS1pdGVtKTpoYXMoYSkiICkKCQkJLmFkZENsYXNzKCAidWktbWVudS1pdGVtIiApCgkJCS5hdHRyKCAicm9sZSIsICJwcmVzZW50YXRpb24iICkKCQkJLmNoaWxkcmVuKCAiYSIgKQoJCQkJLnVuaXF1ZUlkKCkKCQkJCS5hZGRDbGFzcyggInVpLWNvcm5lci1hbGwiICkKCQkJCS5hdHRyKHsKCQkJCQl0YWJJbmRleDogLTEsCgkJCQkJcm9sZTogdGhpcy5faXRlbVJvbGUoKQoJCQkJfSk7CgoJCS8vIEluaXRpYWxpemUgdW5saW5rZWQgbWVudS1pdGVtcyBjb250YWluaW5nIHNwYWNlcyBhbmQvb3IgZGFzaGVzIG9ubHkgYXMgZGl2aWRlcnMKCQltZW51cy5jaGlsZHJlbiggIjpub3QoLnVpLW1lbnUtaXRlbSkiICkuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIGl0ZW0gPSAkKCB0aGlzICk7CgkJCS8vIGh5cGhlbiwgZW0gZGFzaCwgZW4gZGFzaAoJCQlpZiAoICEvW15cLeKAlOKAk1xzXS8udGVzdCggaXRlbS50ZXh0KCkgKSApIHsKCQkJCWl0ZW0uYWRkQ2xhc3MoICJ1aS13aWRnZXQtY29udGVudCB1aS1tZW51LWRpdmlkZXIiICk7CgkJCX0KCQl9KTsKCgkJLy8gQWRkIGFyaWEtZGlzYWJsZWQgYXR0cmlidXRlIHRvIGFueSBkaXNhYmxlZCBtZW51IGl0ZW0KCQltZW51cy5jaGlsZHJlbiggIi51aS1zdGF0ZS1kaXNhYmxlZCIgKS5hdHRyKCAiYXJpYS1kaXNhYmxlZCIsICJ0cnVlIiApOwoKCQkvLyBJZiB0aGUgYWN0aXZlIGl0ZW0gaGFzIGJlZW4gcmVtb3ZlZCwgYmx1ciB0aGUgbWVudQoJCWlmICggdGhpcy5hY3RpdmUgJiYgISQuY29udGFpbnMoIHRoaXMuZWxlbWVudFsgMCBdLCB0aGlzLmFjdGl2ZVsgMCBdICkgKSB7CgkJCXRoaXMuYmx1cigpOwoJCX0KCX0sCgoJX2l0ZW1Sb2xlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gewoJCQltZW51OiAibWVudWl0ZW0iLAoJCQlsaXN0Ym94OiAib3B0aW9uIgoJCX1bIHRoaXMub3B0aW9ucy5yb2xlIF07Cgl9LAoKCWZvY3VzOiBmdW5jdGlvbiggZXZlbnQsIGl0ZW0gKSB7CgkJdmFyIG5lc3RlZCwgZm9jdXNlZDsKCQl0aGlzLmJsdXIoIGV2ZW50LCBldmVudCAmJiBldmVudC50eXBlID09PSAiZm9jdXMiICk7CgoJCXRoaXMuX3Njcm9sbEludG9WaWV3KCBpdGVtICk7CgoJCXRoaXMuYWN0aXZlID0gaXRlbS5maXJzdCgpOwoJCWZvY3VzZWQgPSB0aGlzLmFjdGl2ZS5jaGlsZHJlbiggImEiICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkvLyBPbmx5IHVwZGF0ZSBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQgaWYgdGhlcmUncyBhIHJvbGUKCQkvLyBvdGhlcndpc2Ugd2UgYXNzdW1lIGZvY3VzIGlzIG1hbmFnZWQgZWxzZXdoZXJlCgkJaWYgKCB0aGlzLm9wdGlvbnMucm9sZSApIHsKCQkJdGhpcy5lbGVtZW50LmF0dHIoICJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiLCBmb2N1c2VkLmF0dHIoICJpZCIgKSApOwoJCX0KCgkJLy8gSGlnaGxpZ2h0IGFjdGl2ZSBwYXJlbnQgbWVudSBpdGVtLCBpZiBhbnkKCQl0aGlzLmFjdGl2ZQoJCQkucGFyZW50KCkKCQkJLmNsb3Nlc3QoICIudWktbWVudS1pdGVtIiApCgkJCS5jaGlsZHJlbiggImE6Zmlyc3QiICkKCQkJLmFkZENsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApOwoKCQlpZiAoIGV2ZW50ICYmIGV2ZW50LnR5cGUgPT09ICJrZXlkb3duIiApIHsKCQkJdGhpcy5fY2xvc2UoKTsKCQl9IGVsc2UgewoJCQl0aGlzLnRpbWVyID0gdGhpcy5fZGVsYXkoZnVuY3Rpb24oKSB7CgkJCQl0aGlzLl9jbG9zZSgpOwoJCQl9LCB0aGlzLmRlbGF5ICk7CgkJfQoKCQluZXN0ZWQgPSBpdGVtLmNoaWxkcmVuKCAiLnVpLW1lbnUiICk7CgkJaWYgKCBuZXN0ZWQubGVuZ3RoICYmICggL15tb3VzZS8udGVzdCggZXZlbnQudHlwZSApICkgKSB7CgkJCXRoaXMuX3N0YXJ0T3BlbmluZyhuZXN0ZWQpOwoJCX0KCQl0aGlzLmFjdGl2ZU1lbnUgPSBpdGVtLnBhcmVudCgpOwoKCQl0aGlzLl90cmlnZ2VyKCAiZm9jdXMiLCBldmVudCwgeyBpdGVtOiBpdGVtIH0gKTsKCX0sCgoJX3Njcm9sbEludG9WaWV3OiBmdW5jdGlvbiggaXRlbSApIHsKCQl2YXIgYm9yZGVyVG9wLCBwYWRkaW5nVG9wLCBvZmZzZXQsIHNjcm9sbCwgZWxlbWVudEhlaWdodCwgaXRlbUhlaWdodDsKCQlpZiAoIHRoaXMuX2hhc1Njcm9sbCgpICkgewoJCQlib3JkZXJUb3AgPSBwYXJzZUZsb2F0KCAkLmNzcyggdGhpcy5hY3RpdmVNZW51WzBdLCAiYm9yZGVyVG9wV2lkdGgiICkgKSB8fCAwOwoJCQlwYWRkaW5nVG9wID0gcGFyc2VGbG9hdCggJC5jc3MoIHRoaXMuYWN0aXZlTWVudVswXSwgInBhZGRpbmdUb3AiICkgKSB8fCAwOwoJCQlvZmZzZXQgPSBpdGVtLm9mZnNldCgpLnRvcCAtIHRoaXMuYWN0aXZlTWVudS5vZmZzZXQoKS50b3AgLSBib3JkZXJUb3AgLSBwYWRkaW5nVG9wOwoJCQlzY3JvbGwgPSB0aGlzLmFjdGl2ZU1lbnUuc2Nyb2xsVG9wKCk7CgkJCWVsZW1lbnRIZWlnaHQgPSB0aGlzLmFjdGl2ZU1lbnUuaGVpZ2h0KCk7CgkJCWl0ZW1IZWlnaHQgPSBpdGVtLmhlaWdodCgpOwoKCQkJaWYgKCBvZmZzZXQgPCAwICkgewoJCQkJdGhpcy5hY3RpdmVNZW51LnNjcm9sbFRvcCggc2Nyb2xsICsgb2Zmc2V0ICk7CgkJCX0gZWxzZSBpZiAoIG9mZnNldCArIGl0ZW1IZWlnaHQgPiBlbGVtZW50SGVpZ2h0ICkgewoJCQkJdGhpcy5hY3RpdmVNZW51LnNjcm9sbFRvcCggc2Nyb2xsICsgb2Zmc2V0IC0gZWxlbWVudEhlaWdodCArIGl0ZW1IZWlnaHQgKTsKCQkJfQoJCX0KCX0sCgoJYmx1cjogZnVuY3Rpb24oIGV2ZW50LCBmcm9tRm9jdXMgKSB7CgkJaWYgKCAhZnJvbUZvY3VzICkgewoJCQljbGVhclRpbWVvdXQoIHRoaXMudGltZXIgKTsKCQl9CgoJCWlmICggIXRoaXMuYWN0aXZlICkgewoJCQlyZXR1cm47CgkJfQoKCQl0aGlzLmFjdGl2ZS5jaGlsZHJlbiggImEiICkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQl0aGlzLmFjdGl2ZSA9IG51bGw7CgoJCXRoaXMuX3RyaWdnZXIoICJibHVyIiwgZXZlbnQsIHsgaXRlbTogdGhpcy5hY3RpdmUgfSApOwoJfSwKCglfc3RhcnRPcGVuaW5nOiBmdW5jdGlvbiggc3VibWVudSApIHsKCQljbGVhclRpbWVvdXQoIHRoaXMudGltZXIgKTsKCgkJLy8gRG9uJ3Qgb3BlbiBpZiBhbHJlYWR5IG9wZW4gZml4ZXMgYSBGaXJlZm94IGJ1ZyB0aGF0IGNhdXNlZCBhIC41IHBpeGVsCgkJLy8gc2hpZnQgaW4gdGhlIHN1Ym1lbnUgcG9zaXRpb24gd2hlbiBtb3VzaW5nIG92ZXIgdGhlIGNhcmF0IGljb24KCQlpZiAoIHN1Ym1lbnUuYXR0ciggImFyaWEtaGlkZGVuIiApICE9PSAidHJ1ZSIgKSB7CgkJCXJldHVybjsKCQl9CgoJCXRoaXMudGltZXIgPSB0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJdGhpcy5fY2xvc2UoKTsKCQkJdGhpcy5fb3Blbiggc3VibWVudSApOwoJCX0sIHRoaXMuZGVsYXkgKTsKCX0sCgoJX29wZW46IGZ1bmN0aW9uKCBzdWJtZW51ICkgewoJCXZhciBwb3NpdGlvbiA9ICQuZXh0ZW5kKHsKCQkJb2Y6IHRoaXMuYWN0aXZlCgkJfSwgdGhpcy5vcHRpb25zLnBvc2l0aW9uICk7CgoJCWNsZWFyVGltZW91dCggdGhpcy50aW1lciApOwoJCXRoaXMuZWxlbWVudC5maW5kKCAiLnVpLW1lbnUiICkubm90KCBzdWJtZW51LnBhcmVudHMoICIudWktbWVudSIgKSApCgkJCS5oaWRlKCkKCQkJLmF0dHIoICJhcmlhLWhpZGRlbiIsICJ0cnVlIiApOwoKCQlzdWJtZW51CgkJCS5zaG93KCkKCQkJLnJlbW92ZUF0dHIoICJhcmlhLWhpZGRlbiIgKQoJCQkuYXR0ciggImFyaWEtZXhwYW5kZWQiLCAidHJ1ZSIgKQoJCQkucG9zaXRpb24oIHBvc2l0aW9uICk7Cgl9LAoKCWNvbGxhcHNlQWxsOiBmdW5jdGlvbiggZXZlbnQsIGFsbCApIHsKCQljbGVhclRpbWVvdXQoIHRoaXMudGltZXIgKTsKCQl0aGlzLnRpbWVyID0gdGhpcy5fZGVsYXkoZnVuY3Rpb24oKSB7CgkJCS8vIElmIHdlIHdlcmUgcGFzc2VkIGFuIGV2ZW50LCBsb29rIGZvciB0aGUgc3VibWVudSB0aGF0IGNvbnRhaW5zIHRoZSBldmVudAoJCQl2YXIgY3VycmVudE1lbnUgPSBhbGwgPyB0aGlzLmVsZW1lbnQgOgoJCQkJJCggZXZlbnQgJiYgZXZlbnQudGFyZ2V0ICkuY2xvc2VzdCggdGhpcy5lbGVtZW50LmZpbmQoICIudWktbWVudSIgKSApOwoKCQkJLy8gSWYgd2UgZm91bmQgbm8gdmFsaWQgc3VibWVudSBhbmNlc3RvciwgdXNlIHRoZSBtYWluIG1lbnUgdG8gY2xvc2UgYWxsIHN1YiBtZW51cyBhbnl3YXkKCQkJaWYgKCAhY3VycmVudE1lbnUubGVuZ3RoICkgewoJCQkJY3VycmVudE1lbnUgPSB0aGlzLmVsZW1lbnQ7CgkJCX0KCgkJCXRoaXMuX2Nsb3NlKCBjdXJyZW50TWVudSApOwoKCQkJdGhpcy5ibHVyKCBldmVudCApOwoJCQl0aGlzLmFjdGl2ZU1lbnUgPSBjdXJyZW50TWVudTsKCQl9LCB0aGlzLmRlbGF5ICk7Cgl9LAoKCS8vIFdpdGggbm8gYXJndW1lbnRzLCBjbG9zZXMgdGhlIGN1cnJlbnRseSBhY3RpdmUgbWVudSAtIGlmIG5vdGhpbmcgaXMgYWN0aXZlCgkvLyBpdCBjbG9zZXMgYWxsIG1lbnVzLiAgSWYgcGFzc2VkIGFuIGFyZ3VtZW50LCBpdCB3aWxsIHNlYXJjaCBmb3IgbWVudXMgQkVMT1cKCV9jbG9zZTogZnVuY3Rpb24oIHN0YXJ0TWVudSApIHsKCQlpZiAoICFzdGFydE1lbnUgKSB7CgkJCXN0YXJ0TWVudSA9IHRoaXMuYWN0aXZlID8gdGhpcy5hY3RpdmUucGFyZW50KCkgOiB0aGlzLmVsZW1lbnQ7CgkJfQoKCQlzdGFydE1lbnUKCQkJLmZpbmQoICIudWktbWVudSIgKQoJCQkJLmhpZGUoKQoJCQkJLmF0dHIoICJhcmlhLWhpZGRlbiIsICJ0cnVlIiApCgkJCQkuYXR0ciggImFyaWEtZXhwYW5kZWQiLCAiZmFsc2UiICkKCQkJLmVuZCgpCgkJCS5maW5kKCAiYS51aS1zdGF0ZS1hY3RpdmUiICkKCQkJCS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKTsKCX0sCgoJY29sbGFwc2U6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgbmV3SXRlbSA9IHRoaXMuYWN0aXZlICYmCgkJCXRoaXMuYWN0aXZlLnBhcmVudCgpLmNsb3Nlc3QoICIudWktbWVudS1pdGVtIiwgdGhpcy5lbGVtZW50ICk7CgkJaWYgKCBuZXdJdGVtICYmIG5ld0l0ZW0ubGVuZ3RoICkgewoJCQl0aGlzLl9jbG9zZSgpOwoJCQl0aGlzLmZvY3VzKCBldmVudCwgbmV3SXRlbSApOwoJCX0KCX0sCgoJZXhwYW5kOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdmFyIG5ld0l0ZW0gPSB0aGlzLmFjdGl2ZSAmJgoJCQl0aGlzLmFjdGl2ZQoJCQkJLmNoaWxkcmVuKCAiLnVpLW1lbnUgIiApCgkJCQkuY2hpbGRyZW4oICIudWktbWVudS1pdGVtIiApCgkJCQkuZmlyc3QoKTsKCgkJaWYgKCBuZXdJdGVtICYmIG5ld0l0ZW0ubGVuZ3RoICkgewoJCQl0aGlzLl9vcGVuKCBuZXdJdGVtLnBhcmVudCgpICk7CgoJCQkvLyBEZWxheSBzbyBGaXJlZm94IHdpbGwgbm90IGhpZGUgYWN0aXZlZGVzY2VuZGFudCBjaGFuZ2UgaW4gZXhwYW5kaW5nIHN1Ym1lbnUgZnJvbSBBVAoJCQl0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJCXRoaXMuZm9jdXMoIGV2ZW50LCBuZXdJdGVtICk7CgkJCX0pOwoJCX0KCX0sCgoJbmV4dDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXRoaXMuX21vdmUoICJuZXh0IiwgImZpcnN0IiwgZXZlbnQgKTsKCX0sCgoJcHJldmlvdXM6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl0aGlzLl9tb3ZlKCAicHJldiIsICJsYXN0IiwgZXZlbnQgKTsKCX0sCgoJaXNGaXJzdEl0ZW06IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmFjdGl2ZSAmJiAhdGhpcy5hY3RpdmUucHJldkFsbCggIi51aS1tZW51LWl0ZW0iICkubGVuZ3RoOwoJfSwKCglpc0xhc3RJdGVtOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5hY3RpdmUgJiYgIXRoaXMuYWN0aXZlLm5leHRBbGwoICIudWktbWVudS1pdGVtIiApLmxlbmd0aDsKCX0sCgoJX21vdmU6IGZ1bmN0aW9uKCBkaXJlY3Rpb24sIGZpbHRlciwgZXZlbnQgKSB7CgkJdmFyIG5leHQ7CgkJaWYgKCB0aGlzLmFjdGl2ZSApIHsKCQkJaWYgKCBkaXJlY3Rpb24gPT09ICJmaXJzdCIgfHwgZGlyZWN0aW9uID09PSAibGFzdCIgKSB7CgkJCQluZXh0ID0gdGhpcy5hY3RpdmUKCQkJCQlbIGRpcmVjdGlvbiA9PT0gImZpcnN0IiA/ICJwcmV2QWxsIiA6ICJuZXh0QWxsIiBdKCAiLnVpLW1lbnUtaXRlbSIgKQoJCQkJCS5lcSggLTEgKTsKCQkJfSBlbHNlIHsKCQkJCW5leHQgPSB0aGlzLmFjdGl2ZQoJCQkJCVsgZGlyZWN0aW9uICsgIkFsbCIgXSggIi51aS1tZW51LWl0ZW0iICkKCQkJCQkuZXEoIDAgKTsKCQkJfQoJCX0KCQlpZiAoICFuZXh0IHx8ICFuZXh0Lmxlbmd0aCB8fCAhdGhpcy5hY3RpdmUgKSB7CgkJCW5leHQgPSB0aGlzLmFjdGl2ZU1lbnUuY2hpbGRyZW4oICIudWktbWVudS1pdGVtIiApWyBmaWx0ZXIgXSgpOwoJCX0KCgkJdGhpcy5mb2N1cyggZXZlbnQsIG5leHQgKTsKCX0sCgoJbmV4dFBhZ2U6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgaXRlbSwgYmFzZSwgaGVpZ2h0OwoKCQlpZiAoICF0aGlzLmFjdGl2ZSApIHsKCQkJdGhpcy5uZXh0KCBldmVudCApOwoJCQlyZXR1cm47CgkJfQoJCWlmICggdGhpcy5pc0xhc3RJdGVtKCkgKSB7CgkJCXJldHVybjsKCQl9CgkJaWYgKCB0aGlzLl9oYXNTY3JvbGwoKSApIHsKCQkJYmFzZSA9IHRoaXMuYWN0aXZlLm9mZnNldCgpLnRvcDsKCQkJaGVpZ2h0ID0gdGhpcy5lbGVtZW50LmhlaWdodCgpOwoJCQl0aGlzLmFjdGl2ZS5uZXh0QWxsKCAiLnVpLW1lbnUtaXRlbSIgKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJaXRlbSA9ICQoIHRoaXMgKTsKCQkJCXJldHVybiBpdGVtLm9mZnNldCgpLnRvcCAtIGJhc2UgLSBoZWlnaHQgPCAwOwoJCQl9KTsKCgkJCXRoaXMuZm9jdXMoIGV2ZW50LCBpdGVtICk7CgkJfSBlbHNlIHsKCQkJdGhpcy5mb2N1cyggZXZlbnQsIHRoaXMuYWN0aXZlTWVudS5jaGlsZHJlbiggIi51aS1tZW51LWl0ZW0iICkKCQkJCVsgIXRoaXMuYWN0aXZlID8gImZpcnN0IiA6ICJsYXN0IiBdKCkgKTsKCQl9Cgl9LAoKCXByZXZpb3VzUGFnZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXZhciBpdGVtLCBiYXNlLCBoZWlnaHQ7CgkJaWYgKCAhdGhpcy5hY3RpdmUgKSB7CgkJCXRoaXMubmV4dCggZXZlbnQgKTsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoIHRoaXMuaXNGaXJzdEl0ZW0oKSApIHsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoIHRoaXMuX2hhc1Njcm9sbCgpICkgewoJCQliYXNlID0gdGhpcy5hY3RpdmUub2Zmc2V0KCkudG9wOwoJCQloZWlnaHQgPSB0aGlzLmVsZW1lbnQuaGVpZ2h0KCk7CgkJCXRoaXMuYWN0aXZlLnByZXZBbGwoICIudWktbWVudS1pdGVtIiApLmVhY2goZnVuY3Rpb24oKSB7CgkJCQlpdGVtID0gJCggdGhpcyApOwoJCQkJcmV0dXJuIGl0ZW0ub2Zmc2V0KCkudG9wIC0gYmFzZSArIGhlaWdodCA+IDA7CgkJCX0pOwoKCQkJdGhpcy5mb2N1cyggZXZlbnQsIGl0ZW0gKTsKCQl9IGVsc2UgewoJCQl0aGlzLmZvY3VzKCBldmVudCwgdGhpcy5hY3RpdmVNZW51LmNoaWxkcmVuKCAiLnVpLW1lbnUtaXRlbSIgKS5maXJzdCgpICk7CgkJfQoJfSwKCglfaGFzU2Nyb2xsOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCkgPCB0aGlzLmVsZW1lbnQucHJvcCggInNjcm9sbEhlaWdodCIgKTsKCX0sCgoJc2VsZWN0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJLy8gVE9ETzogSXQgc2hvdWxkIG5ldmVyIGJlIHBvc3NpYmxlIHRvIG5vdCBoYXZlIGFuIGFjdGl2ZSBpdGVtIGF0IHRoaXMKCQkvLyBwb2ludCwgYnV0IHRoZSB0ZXN0cyBkb24ndCB0cmlnZ2VyIG1vdXNlZW50ZXIgYmVmb3JlIGNsaWNrLgoJCXRoaXMuYWN0aXZlID0gdGhpcy5hY3RpdmUgfHwgJCggZXZlbnQudGFyZ2V0ICkuY2xvc2VzdCggIi51aS1tZW51LWl0ZW0iICk7CgkJdmFyIHVpID0geyBpdGVtOiB0aGlzLmFjdGl2ZSB9OwoJCWlmICggIXRoaXMuYWN0aXZlLmhhcyggIi51aS1tZW51IiApLmxlbmd0aCApIHsKCQkJdGhpcy5jb2xsYXBzZUFsbCggZXZlbnQsIHRydWUgKTsKCQl9CgkJdGhpcy5fdHJpZ2dlciggInNlbGVjdCIsIGV2ZW50LCB1aSApOwoJfQp9KTsKCn0oIGpRdWVyeSApKTsKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgokLndpZGdldCggInVpLnByb2dyZXNzYmFyIiwgewoJdmVyc2lvbjogIjEuOS4yIiwKCW9wdGlvbnM6IHsKCQl2YWx1ZTogMCwKCQltYXg6IDEwMAoJfSwKCgltaW46IDAsCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbGVtZW50CgkJCS5hZGRDbGFzcyggInVpLXByb2dyZXNzYmFyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIiApCgkJCS5hdHRyKHsKCQkJCXJvbGU6ICJwcm9ncmVzc2JhciIsCgkJCQkiYXJpYS12YWx1ZW1pbiI6IHRoaXMubWluLAoJCQkJImFyaWEtdmFsdWVtYXgiOiB0aGlzLm9wdGlvbnMubWF4LAoJCQkJImFyaWEtdmFsdWVub3ciOiB0aGlzLl92YWx1ZSgpCgkJCX0pOwoKCQl0aGlzLnZhbHVlRGl2ID0gJCggIjxkaXYgY2xhc3M9J3VpLXByb2dyZXNzYmFyLXZhbHVlIHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWxlZnQnPjwvZGl2PiIgKQoJCQkuYXBwZW5kVG8oIHRoaXMuZWxlbWVudCApOwoKCQl0aGlzLm9sZFZhbHVlID0gdGhpcy5fdmFsdWUoKTsKCQl0aGlzLl9yZWZyZXNoVmFsdWUoKTsKCX0sCgoJX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWxlbWVudAoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1wcm9ncmVzc2JhciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIgKQoJCQkucmVtb3ZlQXR0ciggInJvbGUiICkKCQkJLnJlbW92ZUF0dHIoICJhcmlhLXZhbHVlbWluIiApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS12YWx1ZW1heCIgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtdmFsdWVub3ciICk7CgoJCXRoaXMudmFsdWVEaXYucmVtb3ZlKCk7Cgl9LAoKCXZhbHVlOiBmdW5jdGlvbiggbmV3VmFsdWUgKSB7CgkJaWYgKCBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkICkgewoJCQlyZXR1cm4gdGhpcy5fdmFsdWUoKTsKCQl9CgoJCXRoaXMuX3NldE9wdGlvbiggInZhbHVlIiwgbmV3VmFsdWUgKTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJaWYgKCBrZXkgPT09ICJ2YWx1ZSIgKSB7CgkJCXRoaXMub3B0aW9ucy52YWx1ZSA9IHZhbHVlOwoJCQl0aGlzLl9yZWZyZXNoVmFsdWUoKTsKCQkJaWYgKCB0aGlzLl92YWx1ZSgpID09PSB0aGlzLm9wdGlvbnMubWF4ICkgewoJCQkJdGhpcy5fdHJpZ2dlciggImNvbXBsZXRlIiApOwoJCQl9CgkJfQoKCQl0aGlzLl9zdXBlcigga2V5LCB2YWx1ZSApOwoJfSwKCglfdmFsdWU6IGZ1bmN0aW9uKCkgewoJCXZhciB2YWwgPSB0aGlzLm9wdGlvbnMudmFsdWU7CgkJLy8gbm9ybWFsaXplIGludmFsaWQgdmFsdWUKCQlpZiAoIHR5cGVvZiB2YWwgIT09ICJudW1iZXIiICkgewoJCQl2YWwgPSAwOwoJCX0KCQlyZXR1cm4gTWF0aC5taW4oIHRoaXMub3B0aW9ucy5tYXgsIE1hdGgubWF4KCB0aGlzLm1pbiwgdmFsICkgKTsKCX0sCgoJX3BlcmNlbnRhZ2U6IGZ1bmN0aW9uKCkgewoJCXJldHVybiAxMDAgKiB0aGlzLl92YWx1ZSgpIC8gdGhpcy5vcHRpb25zLm1heDsKCX0sCgoJX3JlZnJlc2hWYWx1ZTogZnVuY3Rpb24oKSB7CgkJdmFyIHZhbHVlID0gdGhpcy52YWx1ZSgpLAoJCQlwZXJjZW50YWdlID0gdGhpcy5fcGVyY2VudGFnZSgpOwoKCQlpZiAoIHRoaXMub2xkVmFsdWUgIT09IHZhbHVlICkgewoJCQl0aGlzLm9sZFZhbHVlID0gdmFsdWU7CgkJCXRoaXMuX3RyaWdnZXIoICJjaGFuZ2UiICk7CgkJfQoKCQl0aGlzLnZhbHVlRGl2CgkJCS50b2dnbGUoIHZhbHVlID4gdGhpcy5taW4gKQoJCQkudG9nZ2xlQ2xhc3MoICJ1aS1jb3JuZXItcmlnaHQiLCB2YWx1ZSA9PT0gdGhpcy5vcHRpb25zLm1heCApCgkJCS53aWR0aCggcGVyY2VudGFnZS50b0ZpeGVkKDApICsgIiUiICk7CgkJdGhpcy5lbGVtZW50LmF0dHIoICJhcmlhLXZhbHVlbm93IiwgdmFsdWUgKTsKCX0KfSk7Cgp9KSggalF1ZXJ5ICk7CihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKJC53aWRnZXQoInVpLnJlc2l6YWJsZSIsICQudWkubW91c2UsIHsKCXZlcnNpb246ICIxLjkuMiIsCgl3aWRnZXRFdmVudFByZWZpeDogInJlc2l6ZSIsCglvcHRpb25zOiB7CgkJYWxzb1Jlc2l6ZTogZmFsc2UsCgkJYW5pbWF0ZTogZmFsc2UsCgkJYW5pbWF0ZUR1cmF0aW9uOiAic2xvdyIsCgkJYW5pbWF0ZUVhc2luZzogInN3aW5nIiwKCQlhc3BlY3RSYXRpbzogZmFsc2UsCgkJYXV0b0hpZGU6IGZhbHNlLAoJCWNvbnRhaW5tZW50OiBmYWxzZSwKCQlnaG9zdDogZmFsc2UsCgkJZ3JpZDogZmFsc2UsCgkJaGFuZGxlczogImUscyxzZSIsCgkJaGVscGVyOiBmYWxzZSwKCQltYXhIZWlnaHQ6IG51bGwsCgkJbWF4V2lkdGg6IG51bGwsCgkJbWluSGVpZ2h0OiAxMCwKCQltaW5XaWR0aDogMTAsCgkJekluZGV4OiAxMDAwCgl9LAoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgoJCXZhciB0aGF0ID0gdGhpcywgbyA9IHRoaXMub3B0aW9uczsKCQl0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZSIpOwoKCQkkLmV4dGVuZCh0aGlzLCB7CgkJCV9hc3BlY3RSYXRpbzogISEoby5hc3BlY3RSYXRpbyksCgkJCWFzcGVjdFJhdGlvOiBvLmFzcGVjdFJhdGlvLAoJCQlvcmlnaW5hbEVsZW1lbnQ6IHRoaXMuZWxlbWVudCwKCQkJX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHM6IFtdLAoJCQlfaGVscGVyOiBvLmhlbHBlciB8fCBvLmdob3N0IHx8IG8uYW5pbWF0ZSA/IG8uaGVscGVyIHx8ICd1aS1yZXNpemFibGUtaGVscGVyJyA6IG51bGwKCQl9KTsKCgkJLy9XcmFwIHRoZSBlbGVtZW50IGlmIGl0IGNhbm5vdCBob2xkIGNoaWxkIG5vZGVzCgkJaWYodGhpcy5lbGVtZW50WzBdLm5vZGVOYW1lLm1hdGNoKC9jYW52YXN8dGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbnxpbWcvaSkpIHsKCgkJCS8vQ3JlYXRlIGEgd3JhcHBlciBlbGVtZW50IGFuZCBzZXQgdGhlIHdyYXBwZXIgdG8gdGhlIG5ldyBjdXJyZW50IGludGVybmFsIGVsZW1lbnQKCQkJdGhpcy5lbGVtZW50LndyYXAoCgkJCQkkKCc8ZGl2IGNsYXNzPSJ1aS13cmFwcGVyIiBzdHlsZT0ib3ZlcmZsb3c6IGhpZGRlbjsiPjwvZGl2PicpLmNzcyh7CgkJCQkJcG9zaXRpb246IHRoaXMuZWxlbWVudC5jc3MoJ3Bvc2l0aW9uJyksCgkJCQkJd2lkdGg6IHRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCksCgkJCQkJaGVpZ2h0OiB0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKSwKCQkJCQl0b3A6IHRoaXMuZWxlbWVudC5jc3MoJ3RvcCcpLAoJCQkJCWxlZnQ6IHRoaXMuZWxlbWVudC5jc3MoJ2xlZnQnKQoJCQkJfSkKCQkJKTsKCgkJCS8vT3ZlcndyaXRlIHRoZSBvcmlnaW5hbCB0aGlzLmVsZW1lbnQKCQkJdGhpcy5lbGVtZW50ID0gdGhpcy5lbGVtZW50LnBhcmVudCgpLmRhdGEoCgkJCQkicmVzaXphYmxlIiwgdGhpcy5lbGVtZW50LmRhdGEoJ3Jlc2l6YWJsZScpCgkJCSk7CgoJCQl0aGlzLmVsZW1lbnRJc1dyYXBwZXIgPSB0cnVlOwoKCQkJLy9Nb3ZlIG1hcmdpbnMgdG8gdGhlIHdyYXBwZXIKCQkJdGhpcy5lbGVtZW50LmNzcyh7IG1hcmdpbkxlZnQ6IHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luTGVmdCIpLCBtYXJnaW5Ub3A6IHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luVG9wIiksIG1hcmdpblJpZ2h0OiB0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpblJpZ2h0IiksIG1hcmdpbkJvdHRvbTogdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5Cb3R0b20iKSB9KTsKCQkJdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHsgbWFyZ2luTGVmdDogMCwgbWFyZ2luVG9wOiAwLCBtYXJnaW5SaWdodDogMCwgbWFyZ2luQm90dG9tOiAwfSk7CgoJCQkvL1ByZXZlbnQgU2FmYXJpIHRleHRhcmVhIHJlc2l6ZQoJCQl0aGlzLm9yaWdpbmFsUmVzaXplU3R5bGUgPSB0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoJ3Jlc2l6ZScpOwoJCQl0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoJ3Jlc2l6ZScsICdub25lJyk7CgoJCQkvL1B1c2ggdGhlIGFjdHVhbCBlbGVtZW50IHRvIG91ciBwcm9wb3J0aW9uYWxseVJlc2l6ZSBpbnRlcm5hbCBhcnJheQoJCQl0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLnB1c2godGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHsgcG9zaXRpb246ICdzdGF0aWMnLCB6b29tOiAxLCBkaXNwbGF5OiAnYmxvY2snIH0pKTsKCgkJCS8vIGF2b2lkIElFIGp1bXAgKGhhcmQgc2V0IHRoZSBtYXJnaW4pCgkJCXRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7IG1hcmdpbjogdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCdtYXJnaW4nKSB9KTsKCgkJCS8vIGZpeCBoYW5kbGVycyBvZmZzZXQKCQkJdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKTsKCgkJfQoKCQl0aGlzLmhhbmRsZXMgPSBvLmhhbmRsZXMgfHwgKCEkKCcudWktcmVzaXphYmxlLWhhbmRsZScsIHRoaXMuZWxlbWVudCkubGVuZ3RoID8gImUscyxzZSIgOiB7IG46ICcudWktcmVzaXphYmxlLW4nLCBlOiAnLnVpLXJlc2l6YWJsZS1lJywgczogJy51aS1yZXNpemFibGUtcycsIHc6ICcudWktcmVzaXphYmxlLXcnLCBzZTogJy51aS1yZXNpemFibGUtc2UnLCBzdzogJy51aS1yZXNpemFibGUtc3cnLCBuZTogJy51aS1yZXNpemFibGUtbmUnLCBudzogJy51aS1yZXNpemFibGUtbncnIH0pOwoJCWlmKHRoaXMuaGFuZGxlcy5jb25zdHJ1Y3RvciA9PSBTdHJpbmcpIHsKCgkJCWlmKHRoaXMuaGFuZGxlcyA9PSAnYWxsJykgdGhpcy5oYW5kbGVzID0gJ24sZSxzLHcsc2Usc3csbmUsbncnOwoJCQl2YXIgbiA9IHRoaXMuaGFuZGxlcy5zcGxpdCgiLCIpOyB0aGlzLmhhbmRsZXMgPSB7fTsKCgkJCWZvcih2YXIgaSA9IDA7IGkgPCBuLmxlbmd0aDsgaSsrKSB7CgoJCQkJdmFyIGhhbmRsZSA9ICQudHJpbShuW2ldKSwgaG5hbWUgPSAndWktcmVzaXphYmxlLScraGFuZGxlOwoJCQkJdmFyIGF4aXMgPSAkKCc8ZGl2IGNsYXNzPSJ1aS1yZXNpemFibGUtaGFuZGxlICcgKyBobmFtZSArICciPjwvZGl2PicpOwoKCQkJCS8vIEFwcGx5IHpJbmRleCB0byBhbGwgaGFuZGxlcyAtIHNlZSAjNzk2MAoJCQkJYXhpcy5jc3MoeyB6SW5kZXg6IG8uekluZGV4IH0pOwoKCQkJCS8vVE9ETyA6IFdoYXQncyBnb2luZyBvbiBoZXJlPwoJCQkJaWYgKCdzZScgPT0gaGFuZGxlKSB7CgkJCQkJYXhpcy5hZGRDbGFzcygndWktaWNvbiB1aS1pY29uLWdyaXBzbWFsbC1kaWFnb25hbC1zZScpOwoJCQkJfTsKCgkJCQkvL0luc2VydCBpbnRvIGludGVybmFsIGhhbmRsZXMgb2JqZWN0IGFuZCBhcHBlbmQgdG8gZWxlbWVudAoJCQkJdGhpcy5oYW5kbGVzW2hhbmRsZV0gPSAnLnVpLXJlc2l6YWJsZS0nK2hhbmRsZTsKCQkJCXRoaXMuZWxlbWVudC5hcHBlbmQoYXhpcyk7CgkJCX0KCgkJfQoKCQl0aGlzLl9yZW5kZXJBeGlzID0gZnVuY3Rpb24odGFyZ2V0KSB7CgoJCQl0YXJnZXQgPSB0YXJnZXQgfHwgdGhpcy5lbGVtZW50OwoKCQkJZm9yKHZhciBpIGluIHRoaXMuaGFuZGxlcykgewoKCQkJCWlmKHRoaXMuaGFuZGxlc1tpXS5jb25zdHJ1Y3RvciA9PSBTdHJpbmcpCgkJCQkJdGhpcy5oYW5kbGVzW2ldID0gJCh0aGlzLmhhbmRsZXNbaV0sIHRoaXMuZWxlbWVudCkuc2hvdygpOwoKCQkJCS8vQXBwbHkgcGFkIHRvIHdyYXBwZXIgZWxlbWVudCwgbmVlZGVkIHRvIGZpeCBheGlzIHBvc2l0aW9uICh0ZXh0YXJlYSwgaW5wdXRzLCBzY3JvbGxzKQoJCQkJaWYgKHRoaXMuZWxlbWVudElzV3JhcHBlciAmJiB0aGlzLm9yaWdpbmFsRWxlbWVudFswXS5ub2RlTmFtZS5tYXRjaCgvdGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbi9pKSkgewoKCQkJCQl2YXIgYXhpcyA9ICQodGhpcy5oYW5kbGVzW2ldLCB0aGlzLmVsZW1lbnQpLCBwYWRXcmFwcGVyID0gMDsKCgkJCQkJLy9DaGVja2luZyB0aGUgY29ycmVjdCBwYWQgYW5kIGJvcmRlcgoJCQkJCXBhZFdyYXBwZXIgPSAvc3d8bmV8bnd8c2V8bnxzLy50ZXN0KGkpID8gYXhpcy5vdXRlckhlaWdodCgpIDogYXhpcy5vdXRlcldpZHRoKCk7CgoJCQkJCS8vVGhlIHBhZGRpbmcgdHlwZSBpIGhhdmUgdG8gYXBwbHkuLi4KCQkJCQl2YXIgcGFkUG9zID0gWyAncGFkZGluZycsCgkJCQkJCS9uZXxud3xuLy50ZXN0KGkpID8gJ1RvcCcgOgoJCQkJCQkvc2V8c3d8cy8udGVzdChpKSA/ICdCb3R0b20nIDoKCQkJCQkJL15lJC8udGVzdChpKSA/ICdSaWdodCcgOiAnTGVmdCcgXS5qb2luKCIiKTsKCgkJCQkJdGFyZ2V0LmNzcyhwYWRQb3MsIHBhZFdyYXBwZXIpOwoKCQkJCQl0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpOwoKCQkJCX0KCgkJCQkvL1RPRE86IFdoYXQncyB0aGF0IGdvb2QgZm9yPyBUaGVyZSdzIG5vdCBhbnl0aGluZyB0byBiZSBleGVjdXRlZCBsZWZ0CgkJCQlpZighJCh0aGlzLmhhbmRsZXNbaV0pLmxlbmd0aCkKCQkJCQljb250aW51ZTsKCgkJCX0KCQl9OwoKCQkvL1RPRE86IG1ha2UgcmVuZGVyQXhpcyBhIHByb3RvdHlwZSBmdW5jdGlvbgoJCXRoaXMuX3JlbmRlckF4aXModGhpcy5lbGVtZW50KTsKCgkJdGhpcy5faGFuZGxlcyA9ICQoJy51aS1yZXNpemFibGUtaGFuZGxlJywgdGhpcy5lbGVtZW50KQoJCQkuZGlzYWJsZVNlbGVjdGlvbigpOwoKCQkvL01hdGNoaW5nIGF4aXMgbmFtZQoJCXRoaXMuX2hhbmRsZXMubW91c2VvdmVyKGZ1bmN0aW9uKCkgewoJCQlpZiAoIXRoYXQucmVzaXppbmcpIHsKCQkJCWlmICh0aGlzLmNsYXNzTmFtZSkKCQkJCQl2YXIgYXhpcyA9IHRoaXMuY2xhc3NOYW1lLm1hdGNoKC91aS1yZXNpemFibGUtKHNlfHN3fG5lfG53fG58ZXxzfHcpL2kpOwoJCQkJLy9BeGlzLCBkZWZhdWx0ID0gc2UKCQkJCXRoYXQuYXhpcyA9IGF4aXMgJiYgYXhpc1sxXSA/IGF4aXNbMV0gOiAnc2UnOwoJCQl9CgkJfSk7CgoJCS8vSWYgd2Ugd2FudCB0byBhdXRvIGhpZGUgdGhlIGVsZW1lbnRzCgkJaWYgKG8uYXV0b0hpZGUpIHsKCQkJdGhpcy5faGFuZGxlcy5oaWRlKCk7CgkJCSQodGhpcy5lbGVtZW50KQoJCQkJLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKQoJCQkJLm1vdXNlZW50ZXIoZnVuY3Rpb24oKSB7CgkJCQkJaWYgKG8uZGlzYWJsZWQpIHJldHVybjsKCQkJCQkkKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKTsKCQkJCQl0aGF0Ll9oYW5kbGVzLnNob3coKTsKCQkJCX0pCgkJCQkubW91c2VsZWF2ZShmdW5jdGlvbigpewoJCQkJCWlmIChvLmRpc2FibGVkKSByZXR1cm47CgkJCQkJaWYgKCF0aGF0LnJlc2l6aW5nKSB7CgkJCQkJCSQodGhpcykuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpOwoJCQkJCQl0aGF0Ll9oYW5kbGVzLmhpZGUoKTsKCQkJCQl9CgkJCQl9KTsKCQl9CgoJCS8vSW5pdGlhbGl6ZSB0aGUgbW91c2UgaW50ZXJhY3Rpb24KCQl0aGlzLl9tb3VzZUluaXQoKTsKCgl9LAoKCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCgkJdGhpcy5fbW91c2VEZXN0cm95KCk7CgoJCXZhciBfZGVzdHJveSA9IGZ1bmN0aW9uKGV4cCkgewoJCQkkKGV4cCkucmVtb3ZlQ2xhc3MoInVpLXJlc2l6YWJsZSB1aS1yZXNpemFibGUtZGlzYWJsZWQgdWktcmVzaXphYmxlLXJlc2l6aW5nIikKCQkJCS5yZW1vdmVEYXRhKCJyZXNpemFibGUiKS5yZW1vdmVEYXRhKCJ1aS1yZXNpemFibGUiKS51bmJpbmQoIi5yZXNpemFibGUiKS5maW5kKCcudWktcmVzaXphYmxlLWhhbmRsZScpLnJlbW92ZSgpOwoJCX07CgoJCS8vVE9ETzogVW53cmFwIGF0IHNhbWUgRE9NIHBvc2l0aW9uCgkJaWYgKHRoaXMuZWxlbWVudElzV3JhcHBlcikgewoJCQlfZGVzdHJveSh0aGlzLmVsZW1lbnQpOwoJCQl2YXIgd3JhcHBlciA9IHRoaXMuZWxlbWVudDsKCQkJdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHsKCQkJCXBvc2l0aW9uOiB3cmFwcGVyLmNzcygncG9zaXRpb24nKSwKCQkJCXdpZHRoOiB3cmFwcGVyLm91dGVyV2lkdGgoKSwKCQkJCWhlaWdodDogd3JhcHBlci5vdXRlckhlaWdodCgpLAoJCQkJdG9wOiB3cmFwcGVyLmNzcygndG9wJyksCgkJCQlsZWZ0OiB3cmFwcGVyLmNzcygnbGVmdCcpCgkJCX0pLmluc2VydEFmdGVyKCB3cmFwcGVyICk7CgkJCXdyYXBwZXIucmVtb3ZlKCk7CgkJfQoKCQl0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoJ3Jlc2l6ZScsIHRoaXMub3JpZ2luYWxSZXNpemVTdHlsZSk7CgkJX2Rlc3Ryb3kodGhpcy5vcmlnaW5hbEVsZW1lbnQpOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJX21vdXNlQ2FwdHVyZTogZnVuY3Rpb24oZXZlbnQpIHsKCQl2YXIgaGFuZGxlID0gZmFsc2U7CgkJZm9yICh2YXIgaSBpbiB0aGlzLmhhbmRsZXMpIHsKCQkJaWYgKCQodGhpcy5oYW5kbGVzW2ldKVswXSA9PSBldmVudC50YXJnZXQpIHsKCQkJCWhhbmRsZSA9IHRydWU7CgkJCX0KCQl9CgoJCXJldHVybiAhdGhpcy5vcHRpb25zLmRpc2FibGVkICYmIGhhbmRsZTsKCX0sCgoJX21vdXNlU3RhcnQ6IGZ1bmN0aW9uKGV2ZW50KSB7CgoJCXZhciBvID0gdGhpcy5vcHRpb25zLCBpbmlQb3MgPSB0aGlzLmVsZW1lbnQucG9zaXRpb24oKSwgZWwgPSB0aGlzLmVsZW1lbnQ7CgoJCXRoaXMucmVzaXppbmcgPSB0cnVlOwoJCXRoaXMuZG9jdW1lbnRTY3JvbGwgPSB7IHRvcDogJChkb2N1bWVudCkuc2Nyb2xsVG9wKCksIGxlZnQ6ICQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSB9OwoKCQkvLyBidWdmaXggZm9yIGh0dHA6Ly9kZXYuanF1ZXJ5LmNvbS90aWNrZXQvMTc0OQoJCWlmIChlbC5pcygnLnVpLWRyYWdnYWJsZScpIHx8ICgvYWJzb2x1dGUvKS50ZXN0KGVsLmNzcygncG9zaXRpb24nKSkpIHsKCQkJZWwuY3NzKHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIHRvcDogaW5pUG9zLnRvcCwgbGVmdDogaW5pUG9zLmxlZnQgfSk7CgkJfQoKCQl0aGlzLl9yZW5kZXJQcm94eSgpOwoKCQl2YXIgY3VybGVmdCA9IG51bSh0aGlzLmhlbHBlci5jc3MoJ2xlZnQnKSksIGN1cnRvcCA9IG51bSh0aGlzLmhlbHBlci5jc3MoJ3RvcCcpKTsKCgkJaWYgKG8uY29udGFpbm1lbnQpIHsKCQkJY3VybGVmdCArPSAkKG8uY29udGFpbm1lbnQpLnNjcm9sbExlZnQoKSB8fCAwOwoJCQljdXJ0b3AgKz0gJChvLmNvbnRhaW5tZW50KS5zY3JvbGxUb3AoKSB8fCAwOwoJCX0KCgkJLy9TdG9yZSBuZWVkZWQgdmFyaWFibGVzCgkJdGhpcy5vZmZzZXQgPSB0aGlzLmhlbHBlci5vZmZzZXQoKTsKCQl0aGlzLnBvc2l0aW9uID0geyBsZWZ0OiBjdXJsZWZ0LCB0b3A6IGN1cnRvcCB9OwoJCXRoaXMuc2l6ZSA9IHRoaXMuX2hlbHBlciA/IHsgd2lkdGg6IGVsLm91dGVyV2lkdGgoKSwgaGVpZ2h0OiBlbC5vdXRlckhlaWdodCgpIH0gOiB7IHdpZHRoOiBlbC53aWR0aCgpLCBoZWlnaHQ6IGVsLmhlaWdodCgpIH07CgkJdGhpcy5vcmlnaW5hbFNpemUgPSB0aGlzLl9oZWxwZXIgPyB7IHdpZHRoOiBlbC5vdXRlcldpZHRoKCksIGhlaWdodDogZWwub3V0ZXJIZWlnaHQoKSB9IDogeyB3aWR0aDogZWwud2lkdGgoKSwgaGVpZ2h0OiBlbC5oZWlnaHQoKSB9OwoJCXRoaXMub3JpZ2luYWxQb3NpdGlvbiA9IHsgbGVmdDogY3VybGVmdCwgdG9wOiBjdXJ0b3AgfTsKCQl0aGlzLnNpemVEaWZmID0geyB3aWR0aDogZWwub3V0ZXJXaWR0aCgpIC0gZWwud2lkdGgoKSwgaGVpZ2h0OiBlbC5vdXRlckhlaWdodCgpIC0gZWwuaGVpZ2h0KCkgfTsKCQl0aGlzLm9yaWdpbmFsTW91c2VQb3NpdGlvbiA9IHsgbGVmdDogZXZlbnQucGFnZVgsIHRvcDogZXZlbnQucGFnZVkgfTsKCgkJLy9Bc3BlY3QgUmF0aW8KCQl0aGlzLmFzcGVjdFJhdGlvID0gKHR5cGVvZiBvLmFzcGVjdFJhdGlvID09ICdudW1iZXInKSA/IG8uYXNwZWN0UmF0aW8gOiAoKHRoaXMub3JpZ2luYWxTaXplLndpZHRoIC8gdGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0KSB8fCAxKTsKCgkJdmFyIGN1cnNvciA9ICQoJy51aS1yZXNpemFibGUtJyArIHRoaXMuYXhpcykuY3NzKCdjdXJzb3InKTsKCQkkKCdib2R5JykuY3NzKCdjdXJzb3InLCBjdXJzb3IgPT0gJ2F1dG8nID8gdGhpcy5heGlzICsgJy1yZXNpemUnIDogY3Vyc29yKTsKCgkJZWwuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1yZXNpemluZyIpOwoJCXRoaXMuX3Byb3BhZ2F0ZSgic3RhcnQiLCBldmVudCk7CgkJcmV0dXJuIHRydWU7Cgl9LAoKCV9tb3VzZURyYWc6IGZ1bmN0aW9uKGV2ZW50KSB7CgoJCS8vSW5jcmVhc2UgcGVyZm9ybWFuY2UsIGF2b2lkIHJlZ2V4CgkJdmFyIGVsID0gdGhpcy5oZWxwZXIsIG8gPSB0aGlzLm9wdGlvbnMsIHByb3BzID0ge30sCgkJCXRoYXQgPSB0aGlzLCBzbXAgPSB0aGlzLm9yaWdpbmFsTW91c2VQb3NpdGlvbiwgYSA9IHRoaXMuYXhpczsKCgkJdmFyIGR4ID0gKGV2ZW50LnBhZ2VYLXNtcC5sZWZ0KXx8MCwgZHkgPSAoZXZlbnQucGFnZVktc21wLnRvcCl8fDA7CgkJdmFyIHRyaWdnZXIgPSB0aGlzLl9jaGFuZ2VbYV07CgkJaWYgKCF0cmlnZ2VyKSByZXR1cm4gZmFsc2U7CgoJCS8vIENhbGN1bGF0ZSB0aGUgYXR0cnMgdGhhdCB3aWxsIGJlIGNoYW5nZQoJCXZhciBkYXRhID0gdHJpZ2dlci5hcHBseSh0aGlzLCBbZXZlbnQsIGR4LCBkeV0pOwoKCQkvLyBQdXQgdGhpcyBpbiB0aGUgbW91c2VEcmFnIGhhbmRsZXIgc2luY2UgdGhlIHVzZXIgY2FuIHN0YXJ0IHByZXNzaW5nIHNoaWZ0IHdoaWxlIHJlc2l6aW5nCgkJdGhpcy5fdXBkYXRlVmlydHVhbEJvdW5kYXJpZXMoZXZlbnQuc2hpZnRLZXkpOwoJCWlmICh0aGlzLl9hc3BlY3RSYXRpbyB8fCBldmVudC5zaGlmdEtleSkKCQkJZGF0YSA9IHRoaXMuX3VwZGF0ZVJhdGlvKGRhdGEsIGV2ZW50KTsKCgkJZGF0YSA9IHRoaXMuX3Jlc3BlY3RTaXplKGRhdGEsIGV2ZW50KTsKCgkJLy8gcGx1Z2lucyBjYWxsYmFja3MgbmVlZCB0byBiZSBjYWxsZWQgZmlyc3QKCQl0aGlzLl9wcm9wYWdhdGUoInJlc2l6ZSIsIGV2ZW50KTsKCgkJZWwuY3NzKHsKCQkJdG9wOiB0aGlzLnBvc2l0aW9uLnRvcCArICJweCIsIGxlZnQ6IHRoaXMucG9zaXRpb24ubGVmdCArICJweCIsCgkJCXdpZHRoOiB0aGlzLnNpemUud2lkdGggKyAicHgiLCBoZWlnaHQ6IHRoaXMuc2l6ZS5oZWlnaHQgKyAicHgiCgkJfSk7CgoJCWlmICghdGhpcy5faGVscGVyICYmIHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoKQoJCQl0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpOwoKCQl0aGlzLl91cGRhdGVDYWNoZShkYXRhKTsKCgkJLy8gY2FsbGluZyB0aGUgdXNlciBjYWxsYmFjayBhdCB0aGUgZW5kCgkJdGhpcy5fdHJpZ2dlcigncmVzaXplJywgZXZlbnQsIHRoaXMudWkoKSk7CgoJCXJldHVybiBmYWxzZTsKCX0sCgoJX21vdXNlU3RvcDogZnVuY3Rpb24oZXZlbnQpIHsKCgkJdGhpcy5yZXNpemluZyA9IGZhbHNlOwoJCXZhciBvID0gdGhpcy5vcHRpb25zLCB0aGF0ID0gdGhpczsKCgkJaWYodGhpcy5faGVscGVyKSB7CgkJCXZhciBwciA9IHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMsIGlzdGEgPSBwci5sZW5ndGggJiYgKC90ZXh0YXJlYS9pKS50ZXN0KHByWzBdLm5vZGVOYW1lKSwKCQkJCXNvZmZzZXRoID0gaXN0YSAmJiAkLnVpLmhhc1Njcm9sbChwclswXSwgJ2xlZnQnKSAvKiBUT0RPIC0ganVtcCBoZWlnaHQgKi8gPyAwIDogdGhhdC5zaXplRGlmZi5oZWlnaHQsCgkJCQlzb2Zmc2V0dyA9IGlzdGEgPyAwIDogdGhhdC5zaXplRGlmZi53aWR0aDsKCgkJCXZhciBzID0geyB3aWR0aDogKHRoYXQuaGVscGVyLndpZHRoKCkgIC0gc29mZnNldHcpLCBoZWlnaHQ6ICh0aGF0LmhlbHBlci5oZWlnaHQoKSAtIHNvZmZzZXRoKSB9LAoJCQkJbGVmdCA9IChwYXJzZUludCh0aGF0LmVsZW1lbnQuY3NzKCdsZWZ0JyksIDEwKSArICh0aGF0LnBvc2l0aW9uLmxlZnQgLSB0aGF0Lm9yaWdpbmFsUG9zaXRpb24ubGVmdCkpIHx8IG51bGwsCgkJCQl0b3AgPSAocGFyc2VJbnQodGhhdC5lbGVtZW50LmNzcygndG9wJyksIDEwKSArICh0aGF0LnBvc2l0aW9uLnRvcCAtIHRoYXQub3JpZ2luYWxQb3NpdGlvbi50b3ApKSB8fCBudWxsOwoKCQkJaWYgKCFvLmFuaW1hdGUpCgkJCQl0aGlzLmVsZW1lbnQuY3NzKCQuZXh0ZW5kKHMsIHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfSkpOwoKCQkJdGhhdC5oZWxwZXIuaGVpZ2h0KHRoYXQuc2l6ZS5oZWlnaHQpOwoJCQl0aGF0LmhlbHBlci53aWR0aCh0aGF0LnNpemUud2lkdGgpOwoKCQkJaWYgKHRoaXMuX2hlbHBlciAmJiAhby5hbmltYXRlKSB0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpOwoJCX0KCgkJJCgnYm9keScpLmNzcygnY3Vyc29yJywgJ2F1dG8nKTsKCgkJdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKTsKCgkJdGhpcy5fcHJvcGFnYXRlKCJzdG9wIiwgZXZlbnQpOwoKCQlpZiAodGhpcy5faGVscGVyKSB0aGlzLmhlbHBlci5yZW1vdmUoKTsKCQlyZXR1cm4gZmFsc2U7CgoJfSwKCglfdXBkYXRlVmlydHVhbEJvdW5kYXJpZXM6IGZ1bmN0aW9uKGZvcmNlQXNwZWN0UmF0aW8pIHsKCQl2YXIgbyA9IHRoaXMub3B0aW9ucywgcE1pbldpZHRoLCBwTWF4V2lkdGgsIHBNaW5IZWlnaHQsIHBNYXhIZWlnaHQsIGI7CgoJCWIgPSB7CgkJCW1pbldpZHRoOiBpc051bWJlcihvLm1pbldpZHRoKSA/IG8ubWluV2lkdGggOiAwLAoJCQltYXhXaWR0aDogaXNOdW1iZXIoby5tYXhXaWR0aCkgPyBvLm1heFdpZHRoIDogSW5maW5pdHksCgkJCW1pbkhlaWdodDogaXNOdW1iZXIoby5taW5IZWlnaHQpID8gby5taW5IZWlnaHQgOiAwLAoJCQltYXhIZWlnaHQ6IGlzTnVtYmVyKG8ubWF4SGVpZ2h0KSA/IG8ubWF4SGVpZ2h0IDogSW5maW5pdHkKCQl9OwoKCQlpZih0aGlzLl9hc3BlY3RSYXRpbyB8fCBmb3JjZUFzcGVjdFJhdGlvKSB7CgkJCS8vIFdlIHdhbnQgdG8gY3JlYXRlIGFuIGVuY2xvc2luZyBib3ggd2hvc2UgYXNwZWN0IHJhdGlvbiBpcyB0aGUgcmVxdWVzdGVkIG9uZQoJCQkvLyBGaXJzdCwgY29tcHV0ZSB0aGUgInByb2plY3RlZCIgc2l6ZSBmb3IgZWFjaCBkaW1lbnNpb24gYmFzZWQgb24gdGhlIGFzcGVjdCByYXRpbyBhbmQgb3RoZXIgZGltZW5zaW9uCgkJCXBNaW5XaWR0aCA9IGIubWluSGVpZ2h0ICogdGhpcy5hc3BlY3RSYXRpbzsKCQkJcE1pbkhlaWdodCA9IGIubWluV2lkdGggLyB0aGlzLmFzcGVjdFJhdGlvOwoJCQlwTWF4V2lkdGggPSBiLm1heEhlaWdodCAqIHRoaXMuYXNwZWN0UmF0aW87CgkJCXBNYXhIZWlnaHQgPSBiLm1heFdpZHRoIC8gdGhpcy5hc3BlY3RSYXRpbzsKCgkJCWlmKHBNaW5XaWR0aCA+IGIubWluV2lkdGgpIGIubWluV2lkdGggPSBwTWluV2lkdGg7CgkJCWlmKHBNaW5IZWlnaHQgPiBiLm1pbkhlaWdodCkgYi5taW5IZWlnaHQgPSBwTWluSGVpZ2h0OwoJCQlpZihwTWF4V2lkdGggPCBiLm1heFdpZHRoKSBiLm1heFdpZHRoID0gcE1heFdpZHRoOwoJCQlpZihwTWF4SGVpZ2h0IDwgYi5tYXhIZWlnaHQpIGIubWF4SGVpZ2h0ID0gcE1heEhlaWdodDsKCQl9CgkJdGhpcy5fdkJvdW5kYXJpZXMgPSBiOwoJfSwKCglfdXBkYXRlQ2FjaGU6IGZ1bmN0aW9uKGRhdGEpIHsKCQl2YXIgbyA9IHRoaXMub3B0aW9uczsKCQl0aGlzLm9mZnNldCA9IHRoaXMuaGVscGVyLm9mZnNldCgpOwoJCWlmIChpc051bWJlcihkYXRhLmxlZnQpKSB0aGlzLnBvc2l0aW9uLmxlZnQgPSBkYXRhLmxlZnQ7CgkJaWYgKGlzTnVtYmVyKGRhdGEudG9wKSkgdGhpcy5wb3NpdGlvbi50b3AgPSBkYXRhLnRvcDsKCQlpZiAoaXNOdW1iZXIoZGF0YS5oZWlnaHQpKSB0aGlzLnNpemUuaGVpZ2h0ID0gZGF0YS5oZWlnaHQ7CgkJaWYgKGlzTnVtYmVyKGRhdGEud2lkdGgpKSB0aGlzLnNpemUud2lkdGggPSBkYXRhLndpZHRoOwoJfSwKCglfdXBkYXRlUmF0aW86IGZ1bmN0aW9uKGRhdGEsIGV2ZW50KSB7CgoJCXZhciBvID0gdGhpcy5vcHRpb25zLCBjcG9zID0gdGhpcy5wb3NpdGlvbiwgY3NpemUgPSB0aGlzLnNpemUsIGEgPSB0aGlzLmF4aXM7CgoJCWlmIChpc051bWJlcihkYXRhLmhlaWdodCkpIGRhdGEud2lkdGggPSAoZGF0YS5oZWlnaHQgKiB0aGlzLmFzcGVjdFJhdGlvKTsKCQllbHNlIGlmIChpc051bWJlcihkYXRhLndpZHRoKSkgZGF0YS5oZWlnaHQgPSAoZGF0YS53aWR0aCAvIHRoaXMuYXNwZWN0UmF0aW8pOwoKCQlpZiAoYSA9PSAnc3cnKSB7CgkJCWRhdGEubGVmdCA9IGNwb3MubGVmdCArIChjc2l6ZS53aWR0aCAtIGRhdGEud2lkdGgpOwoJCQlkYXRhLnRvcCA9IG51bGw7CgkJfQoJCWlmIChhID09ICdudycpIHsKCQkJZGF0YS50b3AgPSBjcG9zLnRvcCArIChjc2l6ZS5oZWlnaHQgLSBkYXRhLmhlaWdodCk7CgkJCWRhdGEubGVmdCA9IGNwb3MubGVmdCArIChjc2l6ZS53aWR0aCAtIGRhdGEud2lkdGgpOwoJCX0KCgkJcmV0dXJuIGRhdGE7Cgl9LAoKCV9yZXNwZWN0U2l6ZTogZnVuY3Rpb24oZGF0YSwgZXZlbnQpIHsKCgkJdmFyIGVsID0gdGhpcy5oZWxwZXIsIG8gPSB0aGlzLl92Qm91bmRhcmllcywgcFJhdGlvID0gdGhpcy5fYXNwZWN0UmF0aW8gfHwgZXZlbnQuc2hpZnRLZXksIGEgPSB0aGlzLmF4aXMsCgkJCQlpc21heHcgPSBpc051bWJlcihkYXRhLndpZHRoKSAmJiBvLm1heFdpZHRoICYmIChvLm1heFdpZHRoIDwgZGF0YS53aWR0aCksIGlzbWF4aCA9IGlzTnVtYmVyKGRhdGEuaGVpZ2h0KSAmJiBvLm1heEhlaWdodCAmJiAoby5tYXhIZWlnaHQgPCBkYXRhLmhlaWdodCksCgkJCQkJaXNtaW53ID0gaXNOdW1iZXIoZGF0YS53aWR0aCkgJiYgby5taW5XaWR0aCAmJiAoby5taW5XaWR0aCA+IGRhdGEud2lkdGgpLCBpc21pbmggPSBpc051bWJlcihkYXRhLmhlaWdodCkgJiYgby5taW5IZWlnaHQgJiYgKG8ubWluSGVpZ2h0ID4gZGF0YS5oZWlnaHQpOwoKCQlpZiAoaXNtaW53KSBkYXRhLndpZHRoID0gby5taW5XaWR0aDsKCQlpZiAoaXNtaW5oKSBkYXRhLmhlaWdodCA9IG8ubWluSGVpZ2h0OwoJCWlmIChpc21heHcpIGRhdGEud2lkdGggPSBvLm1heFdpZHRoOwoJCWlmIChpc21heGgpIGRhdGEuaGVpZ2h0ID0gby5tYXhIZWlnaHQ7CgoJCXZhciBkdyA9IHRoaXMub3JpZ2luYWxQb3NpdGlvbi5sZWZ0ICsgdGhpcy5vcmlnaW5hbFNpemUud2lkdGgsIGRoID0gdGhpcy5wb3NpdGlvbi50b3AgKyB0aGlzLnNpemUuaGVpZ2h0OwoJCXZhciBjdyA9IC9zd3xud3x3Ly50ZXN0KGEpLCBjaCA9IC9ud3xuZXxuLy50ZXN0KGEpOwoKCQlpZiAoaXNtaW53ICYmIGN3KSBkYXRhLmxlZnQgPSBkdyAtIG8ubWluV2lkdGg7CgkJaWYgKGlzbWF4dyAmJiBjdykgZGF0YS5sZWZ0ID0gZHcgLSBvLm1heFdpZHRoOwoJCWlmIChpc21pbmggJiYgY2gpCWRhdGEudG9wID0gZGggLSBvLm1pbkhlaWdodDsKCQlpZiAoaXNtYXhoICYmIGNoKQlkYXRhLnRvcCA9IGRoIC0gby5tYXhIZWlnaHQ7CgoJCS8vIGZpeGluZyBqdW1wIGVycm9yIG9uIHRvcC9sZWZ0IC0gYnVnICMyMzMwCgkJdmFyIGlzTm90d2ggPSAhZGF0YS53aWR0aCAmJiAhZGF0YS5oZWlnaHQ7CgkJaWYgKGlzTm90d2ggJiYgIWRhdGEubGVmdCAmJiBkYXRhLnRvcCkgZGF0YS50b3AgPSBudWxsOwoJCWVsc2UgaWYgKGlzTm90d2ggJiYgIWRhdGEudG9wICYmIGRhdGEubGVmdCkgZGF0YS5sZWZ0ID0gbnVsbDsKCgkJcmV0dXJuIGRhdGE7Cgl9LAoKCV9wcm9wb3J0aW9uYWxseVJlc2l6ZTogZnVuY3Rpb24oKSB7CgoJCXZhciBvID0gdGhpcy5vcHRpb25zOwoJCWlmICghdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5sZW5ndGgpIHJldHVybjsKCQl2YXIgZWxlbWVudCA9IHRoaXMuaGVscGVyIHx8IHRoaXMuZWxlbWVudDsKCgkJZm9yICh2YXIgaT0wOyBpIDwgdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5sZW5ndGg7IGkrKykgewoKCQkJdmFyIHByZWwgPSB0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzW2ldOwoKCQkJaWYgKCF0aGlzLmJvcmRlckRpZikgewoJCQkJdmFyIGIgPSBbcHJlbC5jc3MoJ2JvcmRlclRvcFdpZHRoJyksIHByZWwuY3NzKCdib3JkZXJSaWdodFdpZHRoJyksIHByZWwuY3NzKCdib3JkZXJCb3R0b21XaWR0aCcpLCBwcmVsLmNzcygnYm9yZGVyTGVmdFdpZHRoJyldLAoJCQkJCXAgPSBbcHJlbC5jc3MoJ3BhZGRpbmdUb3AnKSwgcHJlbC5jc3MoJ3BhZGRpbmdSaWdodCcpLCBwcmVsLmNzcygncGFkZGluZ0JvdHRvbScpLCBwcmVsLmNzcygncGFkZGluZ0xlZnQnKV07CgoJCQkJdGhpcy5ib3JkZXJEaWYgPSAkLm1hcChiLCBmdW5jdGlvbih2LCBpKSB7CgkJCQkJdmFyIGJvcmRlciA9IHBhcnNlSW50KHYsMTApfHwwLCBwYWRkaW5nID0gcGFyc2VJbnQocFtpXSwxMCl8fDA7CgkJCQkJcmV0dXJuIGJvcmRlciArIHBhZGRpbmc7CgkJCQl9KTsKCQkJfQoKCQkJcHJlbC5jc3MoewoJCQkJaGVpZ2h0OiAoZWxlbWVudC5oZWlnaHQoKSAtIHRoaXMuYm9yZGVyRGlmWzBdIC0gdGhpcy5ib3JkZXJEaWZbMl0pIHx8IDAsCgkJCQl3aWR0aDogKGVsZW1lbnQud2lkdGgoKSAtIHRoaXMuYm9yZGVyRGlmWzFdIC0gdGhpcy5ib3JkZXJEaWZbM10pIHx8IDAKCQkJfSk7CgoJCX07CgoJfSwKCglfcmVuZGVyUHJveHk6IGZ1bmN0aW9uKCkgewoKCQl2YXIgZWwgPSB0aGlzLmVsZW1lbnQsIG8gPSB0aGlzLm9wdGlvbnM7CgkJdGhpcy5lbGVtZW50T2Zmc2V0ID0gZWwub2Zmc2V0KCk7CgoJCWlmKHRoaXMuX2hlbHBlcikgewoKCQkJdGhpcy5oZWxwZXIgPSB0aGlzLmhlbHBlciB8fCAkKCc8ZGl2IHN0eWxlPSJvdmVyZmxvdzpoaWRkZW47Ij48L2Rpdj4nKTsKCgkJCS8vIGZpeCBpZTYgb2Zmc2V0IFRPRE86IFRoaXMgc2VlbXMgYnJva2VuCgkJCXZhciBpZTZvZmZzZXQgPSAoJC51aS5pZTYgPyAxIDogMCksCgkJCXB4eW9mZnNldCA9ICggJC51aS5pZTYgPyAyIDogLTEgKTsKCgkJCXRoaXMuaGVscGVyLmFkZENsYXNzKHRoaXMuX2hlbHBlcikuY3NzKHsKCQkJCXdpZHRoOiB0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpICsgcHh5b2Zmc2V0LAoJCQkJaGVpZ2h0OiB0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKSArIHB4eW9mZnNldCwKCQkJCXBvc2l0aW9uOiAnYWJzb2x1dGUnLAoJCQkJbGVmdDogdGhpcy5lbGVtZW50T2Zmc2V0LmxlZnQgLSBpZTZvZmZzZXQgKydweCcsCgkJCQl0b3A6IHRoaXMuZWxlbWVudE9mZnNldC50b3AgLSBpZTZvZmZzZXQgKydweCcsCgkJCQl6SW5kZXg6ICsrby56SW5kZXggLy9UT0RPOiBEb24ndCBtb2RpZnkgb3B0aW9uCgkJCX0pOwoKCQkJdGhpcy5oZWxwZXIKCQkJCS5hcHBlbmRUbygiYm9keSIpCgkJCQkuZGlzYWJsZVNlbGVjdGlvbigpOwoKCQl9IGVsc2UgewoJCQl0aGlzLmhlbHBlciA9IHRoaXMuZWxlbWVudDsKCQl9CgoJfSwKCglfY2hhbmdlOiB7CgkJZTogZnVuY3Rpb24oZXZlbnQsIGR4LCBkeSkgewoJCQlyZXR1cm4geyB3aWR0aDogdGhpcy5vcmlnaW5hbFNpemUud2lkdGggKyBkeCB9OwoJCX0sCgkJdzogZnVuY3Rpb24oZXZlbnQsIGR4LCBkeSkgewoJCQl2YXIgbyA9IHRoaXMub3B0aW9ucywgY3MgPSB0aGlzLm9yaWdpbmFsU2l6ZSwgc3AgPSB0aGlzLm9yaWdpbmFsUG9zaXRpb247CgkJCXJldHVybiB7IGxlZnQ6IHNwLmxlZnQgKyBkeCwgd2lkdGg6IGNzLndpZHRoIC0gZHggfTsKCQl9LAoJCW46IGZ1bmN0aW9uKGV2ZW50LCBkeCwgZHkpIHsKCQkJdmFyIG8gPSB0aGlzLm9wdGlvbnMsIGNzID0gdGhpcy5vcmlnaW5hbFNpemUsIHNwID0gdGhpcy5vcmlnaW5hbFBvc2l0aW9uOwoJCQlyZXR1cm4geyB0b3A6IHNwLnRvcCArIGR5LCBoZWlnaHQ6IGNzLmhlaWdodCAtIGR5IH07CgkJfSwKCQlzOiBmdW5jdGlvbihldmVudCwgZHgsIGR5KSB7CgkJCXJldHVybiB7IGhlaWdodDogdGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0ICsgZHkgfTsKCQl9LAoJCXNlOiBmdW5jdGlvbihldmVudCwgZHgsIGR5KSB7CgkJCXJldHVybiAkLmV4dGVuZCh0aGlzLl9jaGFuZ2Uucy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0aGlzLl9jaGFuZ2UuZS5hcHBseSh0aGlzLCBbZXZlbnQsIGR4LCBkeV0pKTsKCQl9LAoJCXN3OiBmdW5jdGlvbihldmVudCwgZHgsIGR5KSB7CgkJCXJldHVybiAkLmV4dGVuZCh0aGlzLl9jaGFuZ2Uucy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0aGlzLl9jaGFuZ2Uudy5hcHBseSh0aGlzLCBbZXZlbnQsIGR4LCBkeV0pKTsKCQl9LAoJCW5lOiBmdW5jdGlvbihldmVudCwgZHgsIGR5KSB7CgkJCXJldHVybiAkLmV4dGVuZCh0aGlzLl9jaGFuZ2Uubi5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0aGlzLl9jaGFuZ2UuZS5hcHBseSh0aGlzLCBbZXZlbnQsIGR4LCBkeV0pKTsKCQl9LAoJCW53OiBmdW5jdGlvbihldmVudCwgZHgsIGR5KSB7CgkJCXJldHVybiAkLmV4dGVuZCh0aGlzLl9jaGFuZ2Uubi5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0aGlzLl9jaGFuZ2Uudy5hcHBseSh0aGlzLCBbZXZlbnQsIGR4LCBkeV0pKTsKCQl9Cgl9LAoKCV9wcm9wYWdhdGU6IGZ1bmN0aW9uKG4sIGV2ZW50KSB7CgkJJC51aS5wbHVnaW4uY2FsbCh0aGlzLCBuLCBbZXZlbnQsIHRoaXMudWkoKV0pOwoJCShuICE9ICJyZXNpemUiICYmIHRoaXMuX3RyaWdnZXIobiwgZXZlbnQsIHRoaXMudWkoKSkpOwoJfSwKCglwbHVnaW5zOiB7fSwKCgl1aTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHsKCQkJb3JpZ2luYWxFbGVtZW50OiB0aGlzLm9yaWdpbmFsRWxlbWVudCwKCQkJZWxlbWVudDogdGhpcy5lbGVtZW50LAoJCQloZWxwZXI6IHRoaXMuaGVscGVyLAoJCQlwb3NpdGlvbjogdGhpcy5wb3NpdGlvbiwKCQkJc2l6ZTogdGhpcy5zaXplLAoJCQlvcmlnaW5hbFNpemU6IHRoaXMub3JpZ2luYWxTaXplLAoJCQlvcmlnaW5hbFBvc2l0aW9uOiB0aGlzLm9yaWdpbmFsUG9zaXRpb24KCQl9OwoJfQoKfSk7CgovKgogKiBSZXNpemFibGUgRXh0ZW5zaW9ucwogKi8KCiQudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwgImFsc29SZXNpemUiLCB7CgoJc3RhcnQ6IGZ1bmN0aW9uIChldmVudCwgdWkpIHsKCQl2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgicmVzaXphYmxlIiksIG8gPSB0aGF0Lm9wdGlvbnM7CgoJCXZhciBfc3RvcmUgPSBmdW5jdGlvbiAoZXhwKSB7CgkJCSQoZXhwKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGVsID0gJCh0aGlzKTsKCQkJCWVsLmRhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIiwgewoJCQkJCXdpZHRoOiBwYXJzZUludChlbC53aWR0aCgpLCAxMCksIGhlaWdodDogcGFyc2VJbnQoZWwuaGVpZ2h0KCksIDEwKSwKCQkJCQlsZWZ0OiBwYXJzZUludChlbC5jc3MoJ2xlZnQnKSwgMTApLCB0b3A6IHBhcnNlSW50KGVsLmNzcygndG9wJyksIDEwKQoJCQkJfSk7CgkJCX0pOwoJCX07CgoJCWlmICh0eXBlb2Yoby5hbHNvUmVzaXplKSA9PSAnb2JqZWN0JyAmJiAhby5hbHNvUmVzaXplLnBhcmVudE5vZGUpIHsKCQkJaWYgKG8uYWxzb1Jlc2l6ZS5sZW5ndGgpIHsgby5hbHNvUmVzaXplID0gby5hbHNvUmVzaXplWzBdOyBfc3RvcmUoby5hbHNvUmVzaXplKTsgfQoJCQllbHNlIHsgJC5lYWNoKG8uYWxzb1Jlc2l6ZSwgZnVuY3Rpb24gKGV4cCkgeyBfc3RvcmUoZXhwKTsgfSk7IH0KCQl9ZWxzZXsKCQkJX3N0b3JlKG8uYWxzb1Jlc2l6ZSk7CgkJfQoJfSwKCglyZXNpemU6IGZ1bmN0aW9uIChldmVudCwgdWkpIHsKCQl2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgicmVzaXphYmxlIiksIG8gPSB0aGF0Lm9wdGlvbnMsIG9zID0gdGhhdC5vcmlnaW5hbFNpemUsIG9wID0gdGhhdC5vcmlnaW5hbFBvc2l0aW9uOwoKCQl2YXIgZGVsdGEgPSB7CgkJCWhlaWdodDogKHRoYXQuc2l6ZS5oZWlnaHQgLSBvcy5oZWlnaHQpIHx8IDAsIHdpZHRoOiAodGhhdC5zaXplLndpZHRoIC0gb3Mud2lkdGgpIHx8IDAsCgkJCXRvcDogKHRoYXQucG9zaXRpb24udG9wIC0gb3AudG9wKSB8fCAwLCBsZWZ0OiAodGhhdC5wb3NpdGlvbi5sZWZ0IC0gb3AubGVmdCkgfHwgMAoJCX0sCgoJCV9hbHNvUmVzaXplID0gZnVuY3Rpb24gKGV4cCwgYykgewoJCQkkKGV4cCkuZWFjaChmdW5jdGlvbigpIHsKCQkJCXZhciBlbCA9ICQodGhpcyksIHN0YXJ0ID0gJCh0aGlzKS5kYXRhKCJyZXNpemFibGUtYWxzb3Jlc2l6ZSIpLCBzdHlsZSA9IHt9LAoJCQkJCWNzcyA9IGMgJiYgYy5sZW5ndGggPyBjIDogZWwucGFyZW50cyh1aS5vcmlnaW5hbEVsZW1lbnRbMF0pLmxlbmd0aCA/IFsnd2lkdGgnLCAnaGVpZ2h0J10gOiBbJ3dpZHRoJywgJ2hlaWdodCcsICd0b3AnLCAnbGVmdCddOwoKCQkJCSQuZWFjaChjc3MsIGZ1bmN0aW9uIChpLCBwcm9wKSB7CgkJCQkJdmFyIHN1bSA9IChzdGFydFtwcm9wXXx8MCkgKyAoZGVsdGFbcHJvcF18fDApOwoJCQkJCWlmIChzdW0gJiYgc3VtID49IDApCgkJCQkJCXN0eWxlW3Byb3BdID0gc3VtIHx8IG51bGw7CgkJCQl9KTsKCgkJCQllbC5jc3Moc3R5bGUpOwoJCQl9KTsKCQl9OwoKCQlpZiAodHlwZW9mKG8uYWxzb1Jlc2l6ZSkgPT0gJ29iamVjdCcgJiYgIW8uYWxzb1Jlc2l6ZS5ub2RlVHlwZSkgewoJCQkkLmVhY2goby5hbHNvUmVzaXplLCBmdW5jdGlvbiAoZXhwLCBjKSB7IF9hbHNvUmVzaXplKGV4cCwgYyk7IH0pOwoJCX1lbHNlewoJCQlfYWxzb1Jlc2l6ZShvLmFsc29SZXNpemUpOwoJCX0KCX0sCgoJc3RvcDogZnVuY3Rpb24gKGV2ZW50LCB1aSkgewoJCSQodGhpcykucmVtb3ZlRGF0YSgicmVzaXphYmxlLWFsc29yZXNpemUiKTsKCX0KfSk7CgokLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsICJhbmltYXRlIiwgewoKCXN0b3A6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewoJCXZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSwgbyA9IHRoYXQub3B0aW9uczsKCgkJdmFyIHByID0gdGhhdC5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cywgaXN0YSA9IHByLmxlbmd0aCAmJiAoL3RleHRhcmVhL2kpLnRlc3QocHJbMF0ubm9kZU5hbWUpLAoJCQkJCXNvZmZzZXRoID0gaXN0YSAmJiAkLnVpLmhhc1Njcm9sbChwclswXSwgJ2xlZnQnKSAvKiBUT0RPIC0ganVtcCBoZWlnaHQgKi8gPyAwIDogdGhhdC5zaXplRGlmZi5oZWlnaHQsCgkJCQkJCXNvZmZzZXR3ID0gaXN0YSA/IDAgOiB0aGF0LnNpemVEaWZmLndpZHRoOwoKCQl2YXIgc3R5bGUgPSB7IHdpZHRoOiAodGhhdC5zaXplLndpZHRoIC0gc29mZnNldHcpLCBoZWlnaHQ6ICh0aGF0LnNpemUuaGVpZ2h0IC0gc29mZnNldGgpIH0sCgkJCQkJbGVmdCA9IChwYXJzZUludCh0aGF0LmVsZW1lbnQuY3NzKCdsZWZ0JyksIDEwKSArICh0aGF0LnBvc2l0aW9uLmxlZnQgLSB0aGF0Lm9yaWdpbmFsUG9zaXRpb24ubGVmdCkpIHx8IG51bGwsCgkJCQkJCXRvcCA9IChwYXJzZUludCh0aGF0LmVsZW1lbnQuY3NzKCd0b3AnKSwgMTApICsgKHRoYXQucG9zaXRpb24udG9wIC0gdGhhdC5vcmlnaW5hbFBvc2l0aW9uLnRvcCkpIHx8IG51bGw7CgoJCXRoYXQuZWxlbWVudC5hbmltYXRlKAoJCQkkLmV4dGVuZChzdHlsZSwgdG9wICYmIGxlZnQgPyB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH0gOiB7fSksIHsKCQkJCWR1cmF0aW9uOiBvLmFuaW1hdGVEdXJhdGlvbiwKCQkJCWVhc2luZzogby5hbmltYXRlRWFzaW5nLAoJCQkJc3RlcDogZnVuY3Rpb24oKSB7CgoJCQkJCXZhciBkYXRhID0gewoJCQkJCQl3aWR0aDogcGFyc2VJbnQodGhhdC5lbGVtZW50LmNzcygnd2lkdGgnKSwgMTApLAoJCQkJCQloZWlnaHQ6IHBhcnNlSW50KHRoYXQuZWxlbWVudC5jc3MoJ2hlaWdodCcpLCAxMCksCgkJCQkJCXRvcDogcGFyc2VJbnQodGhhdC5lbGVtZW50LmNzcygndG9wJyksIDEwKSwKCQkJCQkJbGVmdDogcGFyc2VJbnQodGhhdC5lbGVtZW50LmNzcygnbGVmdCcpLCAxMCkKCQkJCQl9OwoKCQkJCQlpZiAocHIgJiYgcHIubGVuZ3RoKSAkKHByWzBdKS5jc3MoeyB3aWR0aDogZGF0YS53aWR0aCwgaGVpZ2h0OiBkYXRhLmhlaWdodCB9KTsKCgkJCQkJLy8gcHJvcGFnYXRpbmcgcmVzaXplLCBhbmQgdXBkYXRpbmcgdmFsdWVzIGZvciBlYWNoIGFuaW1hdGlvbiBzdGVwCgkJCQkJdGhhdC5fdXBkYXRlQ2FjaGUoZGF0YSk7CgkJCQkJdGhhdC5fcHJvcGFnYXRlKCJyZXNpemUiLCBldmVudCk7CgoJCQkJfQoJCQl9CgkJKTsKCX0KCn0pOwoKJC51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCAiY29udGFpbm1lbnQiLCB7CgoJc3RhcnQ6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewoJCXZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSwgbyA9IHRoYXQub3B0aW9ucywgZWwgPSB0aGF0LmVsZW1lbnQ7CgkJdmFyIG9jID0gby5jb250YWlubWVudCwJY2UgPSAob2MgaW5zdGFuY2VvZiAkKSA/IG9jLmdldCgwKSA6ICgvcGFyZW50Ly50ZXN0KG9jKSkgPyBlbC5wYXJlbnQoKS5nZXQoMCkgOiBvYzsKCQlpZiAoIWNlKSByZXR1cm47CgoJCXRoYXQuY29udGFpbmVyRWxlbWVudCA9ICQoY2UpOwoKCQlpZiAoL2RvY3VtZW50Ly50ZXN0KG9jKSB8fCBvYyA9PSBkb2N1bWVudCkgewoJCQl0aGF0LmNvbnRhaW5lck9mZnNldCA9IHsgbGVmdDogMCwgdG9wOiAwIH07CgkJCXRoYXQuY29udGFpbmVyUG9zaXRpb24gPSB7IGxlZnQ6IDAsIHRvcDogMCB9OwoKCQkJdGhhdC5wYXJlbnREYXRhID0gewoJCQkJZWxlbWVudDogJChkb2N1bWVudCksIGxlZnQ6IDAsIHRvcDogMCwKCQkJCXdpZHRoOiAkKGRvY3VtZW50KS53aWR0aCgpLCBoZWlnaHQ6ICQoZG9jdW1lbnQpLmhlaWdodCgpIHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQKCQkJfTsKCQl9CgoJCS8vIGknbSBhIG5vZGUsIHNvIGNvbXB1dGUgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tCgkJZWxzZSB7CgkJCXZhciBlbGVtZW50ID0gJChjZSksIHAgPSBbXTsKCQkJJChbICJUb3AiLCAiUmlnaHQiLCAiTGVmdCIsICJCb3R0b20iIF0pLmVhY2goZnVuY3Rpb24oaSwgbmFtZSkgeyBwW2ldID0gbnVtKGVsZW1lbnQuY3NzKCJwYWRkaW5nIiArIG5hbWUpKTsgfSk7CgoJCQl0aGF0LmNvbnRhaW5lck9mZnNldCA9IGVsZW1lbnQub2Zmc2V0KCk7CgkJCXRoYXQuY29udGFpbmVyUG9zaXRpb24gPSBlbGVtZW50LnBvc2l0aW9uKCk7CgkJCXRoYXQuY29udGFpbmVyU2l6ZSA9IHsgaGVpZ2h0OiAoZWxlbWVudC5pbm5lckhlaWdodCgpIC0gcFszXSksIHdpZHRoOiAoZWxlbWVudC5pbm5lcldpZHRoKCkgLSBwWzFdKSB9OwoKCQkJdmFyIGNvID0gdGhhdC5jb250YWluZXJPZmZzZXQsIGNoID0gdGhhdC5jb250YWluZXJTaXplLmhlaWdodCwJY3cgPSB0aGF0LmNvbnRhaW5lclNpemUud2lkdGgsCgkJCQkJCXdpZHRoID0gKCQudWkuaGFzU2Nyb2xsKGNlLCAibGVmdCIpID8gY2Uuc2Nyb2xsV2lkdGggOiBjdyApLCBoZWlnaHQgPSAoJC51aS5oYXNTY3JvbGwoY2UpID8gY2Uuc2Nyb2xsSGVpZ2h0IDogY2gpOwoKCQkJdGhhdC5wYXJlbnREYXRhID0gewoJCQkJZWxlbWVudDogY2UsIGxlZnQ6IGNvLmxlZnQsIHRvcDogY28udG9wLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0CgkJCX07CgkJfQoJfSwKCglyZXNpemU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewoJCXZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSwgbyA9IHRoYXQub3B0aW9ucywKCQkJCXBzID0gdGhhdC5jb250YWluZXJTaXplLCBjbyA9IHRoYXQuY29udGFpbmVyT2Zmc2V0LCBjcyA9IHRoYXQuc2l6ZSwgY3AgPSB0aGF0LnBvc2l0aW9uLAoJCQkJcFJhdGlvID0gdGhhdC5fYXNwZWN0UmF0aW8gfHwgZXZlbnQuc2hpZnRLZXksIGNvcCA9IHsgdG9wOjAsIGxlZnQ6MCB9LCBjZSA9IHRoYXQuY29udGFpbmVyRWxlbWVudDsKCgkJaWYgKGNlWzBdICE9IGRvY3VtZW50ICYmICgvc3RhdGljLykudGVzdChjZS5jc3MoJ3Bvc2l0aW9uJykpKSBjb3AgPSBjbzsKCgkJaWYgKGNwLmxlZnQgPCAodGhhdC5faGVscGVyID8gY28ubGVmdCA6IDApKSB7CgkJCXRoYXQuc2l6ZS53aWR0aCA9IHRoYXQuc2l6ZS53aWR0aCArICh0aGF0Ll9oZWxwZXIgPyAodGhhdC5wb3NpdGlvbi5sZWZ0IC0gY28ubGVmdCkgOiAodGhhdC5wb3NpdGlvbi5sZWZ0IC0gY29wLmxlZnQpKTsKCQkJaWYgKHBSYXRpbykgdGhhdC5zaXplLmhlaWdodCA9IHRoYXQuc2l6ZS53aWR0aCAvIHRoYXQuYXNwZWN0UmF0aW87CgkJCXRoYXQucG9zaXRpb24ubGVmdCA9IG8uaGVscGVyID8gY28ubGVmdCA6IDA7CgkJfQoKCQlpZiAoY3AudG9wIDwgKHRoYXQuX2hlbHBlciA/IGNvLnRvcCA6IDApKSB7CgkJCXRoYXQuc2l6ZS5oZWlnaHQgPSB0aGF0LnNpemUuaGVpZ2h0ICsgKHRoYXQuX2hlbHBlciA/ICh0aGF0LnBvc2l0aW9uLnRvcCAtIGNvLnRvcCkgOiB0aGF0LnBvc2l0aW9uLnRvcCk7CgkJCWlmIChwUmF0aW8pIHRoYXQuc2l6ZS53aWR0aCA9IHRoYXQuc2l6ZS5oZWlnaHQgKiB0aGF0LmFzcGVjdFJhdGlvOwoJCQl0aGF0LnBvc2l0aW9uLnRvcCA9IHRoYXQuX2hlbHBlciA/IGNvLnRvcCA6IDA7CgkJfQoKCQl0aGF0Lm9mZnNldC5sZWZ0ID0gdGhhdC5wYXJlbnREYXRhLmxlZnQrdGhhdC5wb3NpdGlvbi5sZWZ0OwoJCXRoYXQub2Zmc2V0LnRvcCA9IHRoYXQucGFyZW50RGF0YS50b3ArdGhhdC5wb3NpdGlvbi50b3A7CgoJCXZhciB3b3NldCA9IE1hdGguYWJzKCAodGhhdC5faGVscGVyID8gdGhhdC5vZmZzZXQubGVmdCAtIGNvcC5sZWZ0IDogKHRoYXQub2Zmc2V0LmxlZnQgLSBjb3AubGVmdCkpICsgdGhhdC5zaXplRGlmZi53aWR0aCApLAoJCQkJCWhvc2V0ID0gTWF0aC5hYnMoICh0aGF0Ll9oZWxwZXIgPyB0aGF0Lm9mZnNldC50b3AgLSBjb3AudG9wIDogKHRoYXQub2Zmc2V0LnRvcCAtIGNvLnRvcCkpICsgdGhhdC5zaXplRGlmZi5oZWlnaHQgKTsKCgkJdmFyIGlzUGFyZW50ID0gdGhhdC5jb250YWluZXJFbGVtZW50LmdldCgwKSA9PSB0aGF0LmVsZW1lbnQucGFyZW50KCkuZ2V0KDApLAoJCQlpc09mZnNldFJlbGF0aXZlID0gL3JlbGF0aXZlfGFic29sdXRlLy50ZXN0KHRoYXQuY29udGFpbmVyRWxlbWVudC5jc3MoJ3Bvc2l0aW9uJykpOwoKCQlpZihpc1BhcmVudCAmJiBpc09mZnNldFJlbGF0aXZlKSB3b3NldCAtPSB0aGF0LnBhcmVudERhdGEubGVmdDsKCgkJaWYgKHdvc2V0ICsgdGhhdC5zaXplLndpZHRoID49IHRoYXQucGFyZW50RGF0YS53aWR0aCkgewoJCQl0aGF0LnNpemUud2lkdGggPSB0aGF0LnBhcmVudERhdGEud2lkdGggLSB3b3NldDsKCQkJaWYgKHBSYXRpbykgdGhhdC5zaXplLmhlaWdodCA9IHRoYXQuc2l6ZS53aWR0aCAvIHRoYXQuYXNwZWN0UmF0aW87CgkJfQoKCQlpZiAoaG9zZXQgKyB0aGF0LnNpemUuaGVpZ2h0ID49IHRoYXQucGFyZW50RGF0YS5oZWlnaHQpIHsKCQkJdGhhdC5zaXplLmhlaWdodCA9IHRoYXQucGFyZW50RGF0YS5oZWlnaHQgLSBob3NldDsKCQkJaWYgKHBSYXRpbykgdGhhdC5zaXplLndpZHRoID0gdGhhdC5zaXplLmhlaWdodCAqIHRoYXQuYXNwZWN0UmF0aW87CgkJfQoJfSwKCglzdG9wOiBmdW5jdGlvbihldmVudCwgdWkpewoJCXZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSwgbyA9IHRoYXQub3B0aW9ucywgY3AgPSB0aGF0LnBvc2l0aW9uLAoJCQkJY28gPSB0aGF0LmNvbnRhaW5lck9mZnNldCwgY29wID0gdGhhdC5jb250YWluZXJQb3NpdGlvbiwgY2UgPSB0aGF0LmNvbnRhaW5lckVsZW1lbnQ7CgoJCXZhciBoZWxwZXIgPSAkKHRoYXQuaGVscGVyKSwgaG8gPSBoZWxwZXIub2Zmc2V0KCksIHcgPSBoZWxwZXIub3V0ZXJXaWR0aCgpIC0gdGhhdC5zaXplRGlmZi53aWR0aCwgaCA9IGhlbHBlci5vdXRlckhlaWdodCgpIC0gdGhhdC5zaXplRGlmZi5oZWlnaHQ7CgoJCWlmICh0aGF0Ll9oZWxwZXIgJiYgIW8uYW5pbWF0ZSAmJiAoL3JlbGF0aXZlLykudGVzdChjZS5jc3MoJ3Bvc2l0aW9uJykpKQoJCQkkKHRoaXMpLmNzcyh7IGxlZnQ6IGhvLmxlZnQgLSBjb3AubGVmdCAtIGNvLmxlZnQsIHdpZHRoOiB3LCBoZWlnaHQ6IGggfSk7CgoJCWlmICh0aGF0Ll9oZWxwZXIgJiYgIW8uYW5pbWF0ZSAmJiAoL3N0YXRpYy8pLnRlc3QoY2UuY3NzKCdwb3NpdGlvbicpKSkKCQkJJCh0aGlzKS5jc3MoeyBsZWZ0OiBoby5sZWZ0IC0gY29wLmxlZnQgLSBjby5sZWZ0LCB3aWR0aDogdywgaGVpZ2h0OiBoIH0pOwoKCX0KfSk7CgokLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsICJnaG9zdCIsIHsKCglzdGFydDogZnVuY3Rpb24oZXZlbnQsIHVpKSB7CgoJCXZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSwgbyA9IHRoYXQub3B0aW9ucywgY3MgPSB0aGF0LnNpemU7CgoJCXRoYXQuZ2hvc3QgPSB0aGF0Lm9yaWdpbmFsRWxlbWVudC5jbG9uZSgpOwoJCXRoYXQuZ2hvc3QKCQkJLmNzcyh7IG9wYWNpdHk6IC4yNSwgZGlzcGxheTogJ2Jsb2NrJywgcG9zaXRpb246ICdyZWxhdGl2ZScsIGhlaWdodDogY3MuaGVpZ2h0LCB3aWR0aDogY3Mud2lkdGgsIG1hcmdpbjogMCwgbGVmdDogMCwgdG9wOiAwIH0pCgkJCS5hZGRDbGFzcygndWktcmVzaXphYmxlLWdob3N0JykKCQkJLmFkZENsYXNzKHR5cGVvZiBvLmdob3N0ID09ICdzdHJpbmcnID8gby5naG9zdCA6ICcnKTsKCgkJdGhhdC5naG9zdC5hcHBlbmRUbyh0aGF0LmhlbHBlcik7CgoJfSwKCglyZXNpemU6IGZ1bmN0aW9uKGV2ZW50LCB1aSl7CgkJdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLCBvID0gdGhhdC5vcHRpb25zOwoJCWlmICh0aGF0Lmdob3N0KSB0aGF0Lmdob3N0LmNzcyh7IHBvc2l0aW9uOiAncmVsYXRpdmUnLCBoZWlnaHQ6IHRoYXQuc2l6ZS5oZWlnaHQsIHdpZHRoOiB0aGF0LnNpemUud2lkdGggfSk7Cgl9LAoKCXN0b3A6IGZ1bmN0aW9uKGV2ZW50LCB1aSl7CgkJdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLCBvID0gdGhhdC5vcHRpb25zOwoJCWlmICh0aGF0Lmdob3N0ICYmIHRoYXQuaGVscGVyKSB0aGF0LmhlbHBlci5nZXQoMCkucmVtb3ZlQ2hpbGQodGhhdC5naG9zdC5nZXQoMCkpOwoJfQoKfSk7CgokLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsICJncmlkIiwgewoKCXJlc2l6ZTogZnVuY3Rpb24oZXZlbnQsIHVpKSB7CgkJdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLCBvID0gdGhhdC5vcHRpb25zLCBjcyA9IHRoYXQuc2l6ZSwgb3MgPSB0aGF0Lm9yaWdpbmFsU2l6ZSwgb3AgPSB0aGF0Lm9yaWdpbmFsUG9zaXRpb24sIGEgPSB0aGF0LmF4aXMsIHJhdGlvID0gby5fYXNwZWN0UmF0aW8gfHwgZXZlbnQuc2hpZnRLZXk7CgkJby5ncmlkID0gdHlwZW9mIG8uZ3JpZCA9PSAibnVtYmVyIiA/IFtvLmdyaWQsIG8uZ3JpZF0gOiBvLmdyaWQ7CgkJdmFyIG94ID0gTWF0aC5yb3VuZCgoY3Mud2lkdGggLSBvcy53aWR0aCkgLyAoby5ncmlkWzBdfHwxKSkgKiAoby5ncmlkWzBdfHwxKSwgb3kgPSBNYXRoLnJvdW5kKChjcy5oZWlnaHQgLSBvcy5oZWlnaHQpIC8gKG8uZ3JpZFsxXXx8MSkpICogKG8uZ3JpZFsxXXx8MSk7CgoJCWlmICgvXihzZXxzfGUpJC8udGVzdChhKSkgewoJCQl0aGF0LnNpemUud2lkdGggPSBvcy53aWR0aCArIG94OwoJCQl0aGF0LnNpemUuaGVpZ2h0ID0gb3MuaGVpZ2h0ICsgb3k7CgkJfQoJCWVsc2UgaWYgKC9eKG5lKSQvLnRlc3QoYSkpIHsKCQkJdGhhdC5zaXplLndpZHRoID0gb3Mud2lkdGggKyBveDsKCQkJdGhhdC5zaXplLmhlaWdodCA9IG9zLmhlaWdodCArIG95OwoJCQl0aGF0LnBvc2l0aW9uLnRvcCA9IG9wLnRvcCAtIG95OwoJCX0KCQllbHNlIGlmICgvXihzdykkLy50ZXN0KGEpKSB7CgkJCXRoYXQuc2l6ZS53aWR0aCA9IG9zLndpZHRoICsgb3g7CgkJCXRoYXQuc2l6ZS5oZWlnaHQgPSBvcy5oZWlnaHQgKyBveTsKCQkJdGhhdC5wb3NpdGlvbi5sZWZ0ID0gb3AubGVmdCAtIG94OwoJCX0KCQllbHNlIHsKCQkJdGhhdC5zaXplLndpZHRoID0gb3Mud2lkdGggKyBveDsKCQkJdGhhdC5zaXplLmhlaWdodCA9IG9zLmhlaWdodCArIG95OwoJCQl0aGF0LnBvc2l0aW9uLnRvcCA9IG9wLnRvcCAtIG95OwoJCQl0aGF0LnBvc2l0aW9uLmxlZnQgPSBvcC5sZWZ0IC0gb3g7CgkJfQoJfQoKfSk7Cgp2YXIgbnVtID0gZnVuY3Rpb24odikgewoJcmV0dXJuIHBhcnNlSW50KHYsIDEwKSB8fCAwOwp9OwoKdmFyIGlzTnVtYmVyID0gZnVuY3Rpb24odmFsdWUpIHsKCXJldHVybiAhaXNOYU4ocGFyc2VJbnQodmFsdWUsIDEwKSk7Cn07Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCiQud2lkZ2V0KCJ1aS5zZWxlY3RhYmxlIiwgJC51aS5tb3VzZSwgewoJdmVyc2lvbjogIjEuOS4yIiwKCW9wdGlvbnM6IHsKCQlhcHBlbmRUbzogJ2JvZHknLAoJCWF1dG9SZWZyZXNoOiB0cnVlLAoJCWRpc3RhbmNlOiAwLAoJCWZpbHRlcjogJyonLAoJCXRvbGVyYW5jZTogJ3RvdWNoJwoJfSwKCV9jcmVhdGU6IGZ1bmN0aW9uKCkgewoJCXZhciB0aGF0ID0gdGhpczsKCgkJdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RhYmxlIik7CgoJCXRoaXMuZHJhZ2dlZCA9IGZhbHNlOwoKCQkvLyBjYWNoZSBzZWxlY3RlZSBjaGlsZHJlbiBiYXNlZCBvbiBmaWx0ZXIKCQl2YXIgc2VsZWN0ZWVzOwoJCXRoaXMucmVmcmVzaCA9IGZ1bmN0aW9uKCkgewoJCQlzZWxlY3RlZXMgPSAkKHRoYXQub3B0aW9ucy5maWx0ZXIsIHRoYXQuZWxlbWVudFswXSk7CgkJCXNlbGVjdGVlcy5hZGRDbGFzcygidWktc2VsZWN0ZWUiKTsKCQkJc2VsZWN0ZWVzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQl2YXIgJHRoaXMgPSAkKHRoaXMpOwoJCQkJdmFyIHBvcyA9ICR0aGlzLm9mZnNldCgpOwoJCQkJJC5kYXRhKHRoaXMsICJzZWxlY3RhYmxlLWl0ZW0iLCB7CgkJCQkJZWxlbWVudDogdGhpcywKCQkJCQkkZWxlbWVudDogJHRoaXMsCgkJCQkJbGVmdDogcG9zLmxlZnQsCgkJCQkJdG9wOiBwb3MudG9wLAoJCQkJCXJpZ2h0OiBwb3MubGVmdCArICR0aGlzLm91dGVyV2lkdGgoKSwKCQkJCQlib3R0b206IHBvcy50b3AgKyAkdGhpcy5vdXRlckhlaWdodCgpLAoJCQkJCXN0YXJ0c2VsZWN0ZWQ6IGZhbHNlLAoJCQkJCXNlbGVjdGVkOiAkdGhpcy5oYXNDbGFzcygndWktc2VsZWN0ZWQnKSwKCQkJCQlzZWxlY3Rpbmc6ICR0aGlzLmhhc0NsYXNzKCd1aS1zZWxlY3RpbmcnKSwKCQkJCQl1bnNlbGVjdGluZzogJHRoaXMuaGFzQ2xhc3MoJ3VpLXVuc2VsZWN0aW5nJykKCQkJCX0pOwoJCQl9KTsKCQl9OwoJCXRoaXMucmVmcmVzaCgpOwoKCQl0aGlzLnNlbGVjdGVlcyA9IHNlbGVjdGVlcy5hZGRDbGFzcygidWktc2VsZWN0ZWUiKTsKCgkJdGhpcy5fbW91c2VJbml0KCk7CgoJCXRoaXMuaGVscGVyID0gJCgiPGRpdiBjbGFzcz0ndWktc2VsZWN0YWJsZS1oZWxwZXInPjwvZGl2PiIpOwoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdGhpcy5zZWxlY3RlZXMKCQkJLnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZSIpCgkJCS5yZW1vdmVEYXRhKCJzZWxlY3RhYmxlLWl0ZW0iKTsKCQl0aGlzLmVsZW1lbnQKCQkJLnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RhYmxlIHVpLXNlbGVjdGFibGUtZGlzYWJsZWQiKTsKCQl0aGlzLl9tb3VzZURlc3Ryb3koKTsKCX0sCgoJX21vdXNlU3RhcnQ6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoKCQl0aGlzLm9wb3MgPSBbZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZXTsKCgkJaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKCQkJcmV0dXJuOwoKCQl2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKCgkJdGhpcy5zZWxlY3RlZXMgPSAkKG9wdGlvbnMuZmlsdGVyLCB0aGlzLmVsZW1lbnRbMF0pOwoKCQl0aGlzLl90cmlnZ2VyKCJzdGFydCIsIGV2ZW50KTsKCgkJJChvcHRpb25zLmFwcGVuZFRvKS5hcHBlbmQodGhpcy5oZWxwZXIpOwoJCS8vIHBvc2l0aW9uIGhlbHBlciAobGFzc28pCgkJdGhpcy5oZWxwZXIuY3NzKHsKCQkJImxlZnQiOiBldmVudC5jbGllbnRYLAoJCQkidG9wIjogZXZlbnQuY2xpZW50WSwKCQkJIndpZHRoIjogMCwKCQkJImhlaWdodCI6IDAKCQl9KTsKCgkJaWYgKG9wdGlvbnMuYXV0b1JlZnJlc2gpIHsKCQkJdGhpcy5yZWZyZXNoKCk7CgkJfQoKCQl0aGlzLnNlbGVjdGVlcy5maWx0ZXIoJy51aS1zZWxlY3RlZCcpLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciBzZWxlY3RlZSA9ICQuZGF0YSh0aGlzLCAic2VsZWN0YWJsZS1pdGVtIik7CgkJCXNlbGVjdGVlLnN0YXJ0c2VsZWN0ZWQgPSB0cnVlOwoJCQlpZiAoIWV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LmN0cmxLZXkpIHsKCQkJCXNlbGVjdGVlLiRlbGVtZW50LnJlbW92ZUNsYXNzKCd1aS1zZWxlY3RlZCcpOwoJCQkJc2VsZWN0ZWUuc2VsZWN0ZWQgPSBmYWxzZTsKCQkJCXNlbGVjdGVlLiRlbGVtZW50LmFkZENsYXNzKCd1aS11bnNlbGVjdGluZycpOwoJCQkJc2VsZWN0ZWUudW5zZWxlY3RpbmcgPSB0cnVlOwoJCQkJLy8gc2VsZWN0YWJsZSBVTlNFTEVDVElORyBjYWxsYmFjawoJCQkJdGhhdC5fdHJpZ2dlcigidW5zZWxlY3RpbmciLCBldmVudCwgewoJCQkJCXVuc2VsZWN0aW5nOiBzZWxlY3RlZS5lbGVtZW50CgkJCQl9KTsKCQkJfQoJCX0pOwoKCQkkKGV2ZW50LnRhcmdldCkucGFyZW50cygpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZWN0ZWUgPSAkLmRhdGEodGhpcywgInNlbGVjdGFibGUtaXRlbSIpOwoJCQlpZiAoc2VsZWN0ZWUpIHsKCQkJCXZhciBkb1NlbGVjdCA9ICghZXZlbnQubWV0YUtleSAmJiAhZXZlbnQuY3RybEtleSkgfHwgIXNlbGVjdGVlLiRlbGVtZW50Lmhhc0NsYXNzKCd1aS1zZWxlY3RlZCcpOwoJCQkJc2VsZWN0ZWUuJGVsZW1lbnQKCQkJCQkucmVtb3ZlQ2xhc3MoZG9TZWxlY3QgPyAidWktdW5zZWxlY3RpbmciIDogInVpLXNlbGVjdGVkIikKCQkJCQkuYWRkQ2xhc3MoZG9TZWxlY3QgPyAidWktc2VsZWN0aW5nIiA6ICJ1aS11bnNlbGVjdGluZyIpOwoJCQkJc2VsZWN0ZWUudW5zZWxlY3RpbmcgPSAhZG9TZWxlY3Q7CgkJCQlzZWxlY3RlZS5zZWxlY3RpbmcgPSBkb1NlbGVjdDsKCQkJCXNlbGVjdGVlLnNlbGVjdGVkID0gZG9TZWxlY3Q7CgkJCQkvLyBzZWxlY3RhYmxlIChVTilTRUxFQ1RJTkcgY2FsbGJhY2sKCQkJCWlmIChkb1NlbGVjdCkgewoJCQkJCXRoYXQuX3RyaWdnZXIoInNlbGVjdGluZyIsIGV2ZW50LCB7CgkJCQkJCXNlbGVjdGluZzogc2VsZWN0ZWUuZWxlbWVudAoJCQkJCX0pOwoJCQkJfSBlbHNlIHsKCQkJCQl0aGF0Ll90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsIGV2ZW50LCB7CgkJCQkJCXVuc2VsZWN0aW5nOiBzZWxlY3RlZS5lbGVtZW50CgkJCQkJfSk7CgkJCQl9CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9KTsKCgl9LAoKCV9tb3VzZURyYWc6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoJCXRoaXMuZHJhZ2dlZCA9IHRydWU7CgoJCWlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpCgkJCXJldHVybjsKCgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJCXZhciB4MSA9IHRoaXMub3Bvc1swXSwgeTEgPSB0aGlzLm9wb3NbMV0sIHgyID0gZXZlbnQucGFnZVgsIHkyID0gZXZlbnQucGFnZVk7CgkJaWYgKHgxID4geDIpIHsgdmFyIHRtcCA9IHgyOyB4MiA9IHgxOyB4MSA9IHRtcDsgfQoJCWlmICh5MSA+IHkyKSB7IHZhciB0bXAgPSB5MjsgeTIgPSB5MTsgeTEgPSB0bXA7IH0KCQl0aGlzLmhlbHBlci5jc3Moe2xlZnQ6IHgxLCB0b3A6IHkxLCB3aWR0aDogeDIteDEsIGhlaWdodDogeTIteTF9KTsKCgkJdGhpcy5zZWxlY3RlZXMuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIHNlbGVjdGVlID0gJC5kYXRhKHRoaXMsICJzZWxlY3RhYmxlLWl0ZW0iKTsKCQkJLy9wcmV2ZW50IGhlbHBlciBmcm9tIGJlaW5nIHNlbGVjdGVkIGlmIGFwcGVuZFRvOiBzZWxlY3RhYmxlCgkJCWlmICghc2VsZWN0ZWUgfHwgc2VsZWN0ZWUuZWxlbWVudCA9PSB0aGF0LmVsZW1lbnRbMF0pCgkJCQlyZXR1cm47CgkJCXZhciBoaXQgPSBmYWxzZTsKCQkJaWYgKG9wdGlvbnMudG9sZXJhbmNlID09ICd0b3VjaCcpIHsKCQkJCWhpdCA9ICggIShzZWxlY3RlZS5sZWZ0ID4geDIgfHwgc2VsZWN0ZWUucmlnaHQgPCB4MSB8fCBzZWxlY3RlZS50b3AgPiB5MiB8fCBzZWxlY3RlZS5ib3R0b20gPCB5MSkgKTsKCQkJfSBlbHNlIGlmIChvcHRpb25zLnRvbGVyYW5jZSA9PSAnZml0JykgewoJCQkJaGl0ID0gKHNlbGVjdGVlLmxlZnQgPiB4MSAmJiBzZWxlY3RlZS5yaWdodCA8IHgyICYmIHNlbGVjdGVlLnRvcCA+IHkxICYmIHNlbGVjdGVlLmJvdHRvbSA8IHkyKTsKCQkJfQoKCQkJaWYgKGhpdCkgewoJCQkJLy8gU0VMRUNUCgkJCQlpZiAoc2VsZWN0ZWUuc2VsZWN0ZWQpIHsKCQkJCQlzZWxlY3RlZS4kZWxlbWVudC5yZW1vdmVDbGFzcygndWktc2VsZWN0ZWQnKTsKCQkJCQlzZWxlY3RlZS5zZWxlY3RlZCA9IGZhbHNlOwoJCQkJfQoJCQkJaWYgKHNlbGVjdGVlLnVuc2VsZWN0aW5nKSB7CgkJCQkJc2VsZWN0ZWUuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ3VpLXVuc2VsZWN0aW5nJyk7CgkJCQkJc2VsZWN0ZWUudW5zZWxlY3RpbmcgPSBmYWxzZTsKCQkJCX0KCQkJCWlmICghc2VsZWN0ZWUuc2VsZWN0aW5nKSB7CgkJCQkJc2VsZWN0ZWUuJGVsZW1lbnQuYWRkQ2xhc3MoJ3VpLXNlbGVjdGluZycpOwoJCQkJCXNlbGVjdGVlLnNlbGVjdGluZyA9IHRydWU7CgkJCQkJLy8gc2VsZWN0YWJsZSBTRUxFQ1RJTkcgY2FsbGJhY2sKCQkJCQl0aGF0Ll90cmlnZ2VyKCJzZWxlY3RpbmciLCBldmVudCwgewoJCQkJCQlzZWxlY3Rpbmc6IHNlbGVjdGVlLmVsZW1lbnQKCQkJCQl9KTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCS8vIFVOU0VMRUNUCgkJCQlpZiAoc2VsZWN0ZWUuc2VsZWN0aW5nKSB7CgkJCQkJaWYgKChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpICYmIHNlbGVjdGVlLnN0YXJ0c2VsZWN0ZWQpIHsKCQkJCQkJc2VsZWN0ZWUuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ3VpLXNlbGVjdGluZycpOwoJCQkJCQlzZWxlY3RlZS5zZWxlY3RpbmcgPSBmYWxzZTsKCQkJCQkJc2VsZWN0ZWUuJGVsZW1lbnQuYWRkQ2xhc3MoJ3VpLXNlbGVjdGVkJyk7CgkJCQkJCXNlbGVjdGVlLnNlbGVjdGVkID0gdHJ1ZTsKCQkJCQl9IGVsc2UgewoJCQkJCQlzZWxlY3RlZS4kZWxlbWVudC5yZW1vdmVDbGFzcygndWktc2VsZWN0aW5nJyk7CgkJCQkJCXNlbGVjdGVlLnNlbGVjdGluZyA9IGZhbHNlOwoJCQkJCQlpZiAoc2VsZWN0ZWUuc3RhcnRzZWxlY3RlZCkgewoJCQkJCQkJc2VsZWN0ZWUuJGVsZW1lbnQuYWRkQ2xhc3MoJ3VpLXVuc2VsZWN0aW5nJyk7CgkJCQkJCQlzZWxlY3RlZS51bnNlbGVjdGluZyA9IHRydWU7CgkJCQkJCX0KCQkJCQkJLy8gc2VsZWN0YWJsZSBVTlNFTEVDVElORyBjYWxsYmFjawoJCQkJCQl0aGF0Ll90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsIGV2ZW50LCB7CgkJCQkJCQl1bnNlbGVjdGluZzogc2VsZWN0ZWUuZWxlbWVudAoJCQkJCQl9KTsKCQkJCQl9CgkJCQl9CgkJCQlpZiAoc2VsZWN0ZWUuc2VsZWN0ZWQpIHsKCQkJCQlpZiAoIWV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIXNlbGVjdGVlLnN0YXJ0c2VsZWN0ZWQpIHsKCQkJCQkJc2VsZWN0ZWUuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ3VpLXNlbGVjdGVkJyk7CgkJCQkJCXNlbGVjdGVlLnNlbGVjdGVkID0gZmFsc2U7CgoJCQkJCQlzZWxlY3RlZS4kZWxlbWVudC5hZGRDbGFzcygndWktdW5zZWxlY3RpbmcnKTsKCQkJCQkJc2VsZWN0ZWUudW5zZWxlY3RpbmcgPSB0cnVlOwoJCQkJCQkvLyBzZWxlY3RhYmxlIFVOU0VMRUNUSU5HIGNhbGxiYWNrCgkJCQkJCXRoYXQuX3RyaWdnZXIoInVuc2VsZWN0aW5nIiwgZXZlbnQsIHsKCQkJCQkJCXVuc2VsZWN0aW5nOiBzZWxlY3RlZS5lbGVtZW50CgkJCQkJCX0pOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0pOwoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCV9tb3VzZVN0b3A6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoKCQl0aGlzLmRyYWdnZWQgPSBmYWxzZTsKCgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJCSQoJy51aS11bnNlbGVjdGluZycsIHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIHNlbGVjdGVlID0gJC5kYXRhKHRoaXMsICJzZWxlY3RhYmxlLWl0ZW0iKTsKCQkJc2VsZWN0ZWUuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ3VpLXVuc2VsZWN0aW5nJyk7CgkJCXNlbGVjdGVlLnVuc2VsZWN0aW5nID0gZmFsc2U7CgkJCXNlbGVjdGVlLnN0YXJ0c2VsZWN0ZWQgPSBmYWxzZTsKCQkJdGhhdC5fdHJpZ2dlcigidW5zZWxlY3RlZCIsIGV2ZW50LCB7CgkJCQl1bnNlbGVjdGVkOiBzZWxlY3RlZS5lbGVtZW50CgkJCX0pOwoJCX0pOwoJCSQoJy51aS1zZWxlY3RpbmcnLCB0aGlzLmVsZW1lbnRbMF0pLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciBzZWxlY3RlZSA9ICQuZGF0YSh0aGlzLCAic2VsZWN0YWJsZS1pdGVtIik7CgkJCXNlbGVjdGVlLiRlbGVtZW50LnJlbW92ZUNsYXNzKCd1aS1zZWxlY3RpbmcnKS5hZGRDbGFzcygndWktc2VsZWN0ZWQnKTsKCQkJc2VsZWN0ZWUuc2VsZWN0aW5nID0gZmFsc2U7CgkJCXNlbGVjdGVlLnNlbGVjdGVkID0gdHJ1ZTsKCQkJc2VsZWN0ZWUuc3RhcnRzZWxlY3RlZCA9IHRydWU7CgkJCXRoYXQuX3RyaWdnZXIoInNlbGVjdGVkIiwgZXZlbnQsIHsKCQkJCXNlbGVjdGVkOiBzZWxlY3RlZS5lbGVtZW50CgkJCX0pOwoJCX0pOwoJCXRoaXMuX3RyaWdnZXIoInN0b3AiLCBldmVudCk7CgoJCXRoaXMuaGVscGVyLnJlbW92ZSgpOwoKCQlyZXR1cm4gZmFsc2U7Cgl9Cgp9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKLy8gbnVtYmVyIG9mIHBhZ2VzIGluIGEgc2xpZGVyCi8vIChob3cgbWFueSB0aW1lcyBjYW4geW91IHBhZ2UgdXAvZG93biB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSByYW5nZSkKdmFyIG51bVBhZ2VzID0gNTsKCiQud2lkZ2V0KCAidWkuc2xpZGVyIiwgJC51aS5tb3VzZSwgewoJdmVyc2lvbjogIjEuOS4yIiwKCXdpZGdldEV2ZW50UHJlZml4OiAic2xpZGUiLAoKCW9wdGlvbnM6IHsKCQlhbmltYXRlOiBmYWxzZSwKCQlkaXN0YW5jZTogMCwKCQltYXg6IDEwMCwKCQltaW46IDAsCgkJb3JpZW50YXRpb246ICJob3Jpem9udGFsIiwKCQlyYW5nZTogZmFsc2UsCgkJc3RlcDogMSwKCQl2YWx1ZTogMCwKCQl2YWx1ZXM6IG51bGwKCX0sCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdmFyIGksIGhhbmRsZUNvdW50LAoJCQlvID0gdGhpcy5vcHRpb25zLAoJCQlleGlzdGluZ0hhbmRsZXMgPSB0aGlzLmVsZW1lbnQuZmluZCggIi51aS1zbGlkZXItaGFuZGxlIiApLmFkZENsYXNzKCAidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIiApLAoJCQloYW5kbGUgPSAiPGEgY2xhc3M9J3VpLXNsaWRlci1oYW5kbGUgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsJyBocmVmPScjJz48L2E+IiwKCQkJaGFuZGxlcyA9IFtdOwoKCQl0aGlzLl9rZXlTbGlkaW5nID0gZmFsc2U7CgkJdGhpcy5fbW91c2VTbGlkaW5nID0gZmFsc2U7CgkJdGhpcy5fYW5pbWF0ZU9mZiA9IHRydWU7CgkJdGhpcy5faGFuZGxlSW5kZXggPSBudWxsOwoJCXRoaXMuX2RldGVjdE9yaWVudGF0aW9uKCk7CgkJdGhpcy5fbW91c2VJbml0KCk7CgoJCXRoaXMuZWxlbWVudAoJCQkuYWRkQ2xhc3MoICJ1aS1zbGlkZXIiICsKCQkJCSIgdWktc2xpZGVyLSIgKyB0aGlzLm9yaWVudGF0aW9uICsKCQkJCSIgdWktd2lkZ2V0IiArCgkJCQkiIHVpLXdpZGdldC1jb250ZW50IiArCgkJCQkiIHVpLWNvcm5lci1hbGwiICsKCQkJCSggby5kaXNhYmxlZCA/ICIgdWktc2xpZGVyLWRpc2FibGVkIHVpLWRpc2FibGVkIiA6ICIiICkgKTsKCgkJdGhpcy5yYW5nZSA9ICQoW10pOwoKCQlpZiAoIG8ucmFuZ2UgKSB7CgkJCWlmICggby5yYW5nZSA9PT0gdHJ1ZSApIHsKCQkJCWlmICggIW8udmFsdWVzICkgewoJCQkJCW8udmFsdWVzID0gWyB0aGlzLl92YWx1ZU1pbigpLCB0aGlzLl92YWx1ZU1pbigpIF07CgkJCQl9CgkJCQlpZiAoIG8udmFsdWVzLmxlbmd0aCAmJiBvLnZhbHVlcy5sZW5ndGggIT09IDIgKSB7CgkJCQkJby52YWx1ZXMgPSBbIG8udmFsdWVzWzBdLCBvLnZhbHVlc1swXSBdOwoJCQkJfQoJCQl9CgoJCQl0aGlzLnJhbmdlID0gJCggIjxkaXY+PC9kaXY+IiApCgkJCQkuYXBwZW5kVG8oIHRoaXMuZWxlbWVudCApCgkJCQkuYWRkQ2xhc3MoICJ1aS1zbGlkZXItcmFuZ2UiICsKCQkJCS8vIG5vdGU6IHRoaXMgaXNuJ3QgdGhlIG1vc3QgZml0dGluZ2x5IHNlbWFudGljIGZyYW1ld29yayBjbGFzcyBmb3IgdGhpcyBlbGVtZW50LAoJCQkJLy8gYnV0IHdvcmtlZCBiZXN0IHZpc3VhbGx5IHdpdGggYSB2YXJpZXR5IG9mIHRoZW1lcwoJCQkJIiB1aS13aWRnZXQtaGVhZGVyIiArCgkJCQkoICggby5yYW5nZSA9PT0gIm1pbiIgfHwgby5yYW5nZSA9PT0gIm1heCIgKSA/ICIgdWktc2xpZGVyLXJhbmdlLSIgKyBvLnJhbmdlIDogIiIgKSApOwoJCX0KCgkJaGFuZGxlQ291bnQgPSAoIG8udmFsdWVzICYmIG8udmFsdWVzLmxlbmd0aCApIHx8IDE7CgoJCWZvciAoIGkgPSBleGlzdGluZ0hhbmRsZXMubGVuZ3RoOyBpIDwgaGFuZGxlQ291bnQ7IGkrKyApIHsKCQkJaGFuZGxlcy5wdXNoKCBoYW5kbGUgKTsKCQl9CgoJCXRoaXMuaGFuZGxlcyA9IGV4aXN0aW5nSGFuZGxlcy5hZGQoICQoIGhhbmRsZXMuam9pbiggIiIgKSApLmFwcGVuZFRvKCB0aGlzLmVsZW1lbnQgKSApOwoKCQl0aGlzLmhhbmRsZSA9IHRoaXMuaGFuZGxlcy5lcSggMCApOwoKCQl0aGlzLmhhbmRsZXMuYWRkKCB0aGlzLnJhbmdlICkuZmlsdGVyKCAiYSIgKQoJCQkuY2xpY2soZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJfSkKCQkJLm1vdXNlZW50ZXIoZnVuY3Rpb24oKSB7CgkJCQlpZiAoICFvLmRpc2FibGVkICkgewoJCQkJCSQoIHRoaXMgKS5hZGRDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQkJfQoJCQl9KQoJCQkubW91c2VsZWF2ZShmdW5jdGlvbigpIHsKCQkJCSQoIHRoaXMgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQl9KQoJCQkuZm9jdXMoZnVuY3Rpb24oKSB7CgkJCQlpZiAoICFvLmRpc2FibGVkICkgewoJCQkJCSQoICIudWktc2xpZGVyIC51aS1zdGF0ZS1mb2N1cyIgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQkJCSQoIHRoaXMgKS5hZGRDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQkJfSBlbHNlIHsKCQkJCQkkKCB0aGlzICkuYmx1cigpOwoJCQkJfQoJCQl9KQoJCQkuYmx1cihmdW5jdGlvbigpIHsKCQkJCSQoIHRoaXMgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQl9KTsKCgkJdGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCSQoIHRoaXMgKS5kYXRhKCAidWktc2xpZGVyLWhhbmRsZS1pbmRleCIsIGkgKTsKCQl9KTsKCgkJdGhpcy5fb24oIHRoaXMuaGFuZGxlcywgewoJCQlrZXlkb3duOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQl2YXIgYWxsb3dlZCwgY3VyVmFsLCBuZXdWYWwsIHN0ZXAsCgkJCQkJaW5kZXggPSAkKCBldmVudC50YXJnZXQgKS5kYXRhKCAidWktc2xpZGVyLWhhbmRsZS1pbmRleCIgKTsKCgkJCQlzd2l0Y2ggKCBldmVudC5rZXlDb2RlICkgewoJCQkJCWNhc2UgJC51aS5rZXlDb2RlLkhPTUU6CgkJCQkJY2FzZSAkLnVpLmtleUNvZGUuRU5EOgoJCQkJCWNhc2UgJC51aS5rZXlDb2RlLlBBR0VfVVA6CgkJCQkJY2FzZSAkLnVpLmtleUNvZGUuUEFHRV9ET1dOOgoJCQkJCWNhc2UgJC51aS5rZXlDb2RlLlVQOgoJCQkJCWNhc2UgJC51aS5rZXlDb2RlLlJJR0hUOgoJCQkJCWNhc2UgJC51aS5rZXlDb2RlLkRPV046CgkJCQkJY2FzZSAkLnVpLmtleUNvZGUuTEVGVDoKCQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCQkJaWYgKCAhdGhpcy5fa2V5U2xpZGluZyApIHsKCQkJCQkJCXRoaXMuX2tleVNsaWRpbmcgPSB0cnVlOwoJCQkJCQkJJCggZXZlbnQudGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCQkJCQlhbGxvd2VkID0gdGhpcy5fc3RhcnQoIGV2ZW50LCBpbmRleCApOwoJCQkJCQkJaWYgKCBhbGxvd2VkID09PSBmYWxzZSApIHsKCQkJCQkJCQlyZXR1cm47CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJc3RlcCA9IHRoaXMub3B0aW9ucy5zdGVwOwoJCQkJaWYgKCB0aGlzLm9wdGlvbnMudmFsdWVzICYmIHRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoICkgewoJCQkJCWN1clZhbCA9IG5ld1ZhbCA9IHRoaXMudmFsdWVzKCBpbmRleCApOwoJCQkJfSBlbHNlIHsKCQkJCQljdXJWYWwgPSBuZXdWYWwgPSB0aGlzLnZhbHVlKCk7CgkJCQl9CgoJCQkJc3dpdGNoICggZXZlbnQua2V5Q29kZSApIHsKCQkJCQljYXNlICQudWkua2V5Q29kZS5IT01FOgoJCQkJCQluZXdWYWwgPSB0aGlzLl92YWx1ZU1pbigpOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICQudWkua2V5Q29kZS5FTkQ6CgkJCQkJCW5ld1ZhbCA9IHRoaXMuX3ZhbHVlTWF4KCk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJC51aS5rZXlDb2RlLlBBR0VfVVA6CgkJCQkJCW5ld1ZhbCA9IHRoaXMuX3RyaW1BbGlnblZhbHVlKCBjdXJWYWwgKyAoICh0aGlzLl92YWx1ZU1heCgpIC0gdGhpcy5fdmFsdWVNaW4oKSkgLyBudW1QYWdlcyApICk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJC51aS5rZXlDb2RlLlBBR0VfRE9XTjoKCQkJCQkJbmV3VmFsID0gdGhpcy5fdHJpbUFsaWduVmFsdWUoIGN1clZhbCAtICggKHRoaXMuX3ZhbHVlTWF4KCkgLSB0aGlzLl92YWx1ZU1pbigpKSAvIG51bVBhZ2VzICkgKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAkLnVpLmtleUNvZGUuVVA6CgkJCQkJY2FzZSAkLnVpLmtleUNvZGUuUklHSFQ6CgkJCQkJCWlmICggY3VyVmFsID09PSB0aGlzLl92YWx1ZU1heCgpICkgewoJCQkJCQkJcmV0dXJuOwoJCQkJCQl9CgkJCQkJCW5ld1ZhbCA9IHRoaXMuX3RyaW1BbGlnblZhbHVlKCBjdXJWYWwgKyBzdGVwICk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJC51aS5rZXlDb2RlLkRPV046CgkJCQkJY2FzZSAkLnVpLmtleUNvZGUuTEVGVDoKCQkJCQkJaWYgKCBjdXJWYWwgPT09IHRoaXMuX3ZhbHVlTWluKCkgKSB7CgkJCQkJCQlyZXR1cm47CgkJCQkJCX0KCQkJCQkJbmV3VmFsID0gdGhpcy5fdHJpbUFsaWduVmFsdWUoIGN1clZhbCAtIHN0ZXAgKTsKCQkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJdGhpcy5fc2xpZGUoIGV2ZW50LCBpbmRleCwgbmV3VmFsICk7CgkJCX0sCgkJCWtleXVwOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQl2YXIgaW5kZXggPSAkKCBldmVudC50YXJnZXQgKS5kYXRhKCAidWktc2xpZGVyLWhhbmRsZS1pbmRleCIgKTsKCgkJCQlpZiAoIHRoaXMuX2tleVNsaWRpbmcgKSB7CgkJCQkJdGhpcy5fa2V5U2xpZGluZyA9IGZhbHNlOwoJCQkJCXRoaXMuX3N0b3AoIGV2ZW50LCBpbmRleCApOwoJCQkJCXRoaXMuX2NoYW5nZSggZXZlbnQsIGluZGV4ICk7CgkJCQkJJCggZXZlbnQudGFyZ2V0ICkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCQl9CgkJCX0KCQl9KTsKCgkJdGhpcy5fcmVmcmVzaFZhbHVlKCk7CgoJCXRoaXMuX2FuaW1hdGVPZmYgPSBmYWxzZTsKCX0sCgoJX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaGFuZGxlcy5yZW1vdmUoKTsKCQl0aGlzLnJhbmdlLnJlbW92ZSgpOwoKCQl0aGlzLmVsZW1lbnQKCQkJLnJlbW92ZUNsYXNzKCAidWktc2xpZGVyIiArCgkJCQkiIHVpLXNsaWRlci1ob3Jpem9udGFsIiArCgkJCQkiIHVpLXNsaWRlci12ZXJ0aWNhbCIgKwoJCQkJIiB1aS1zbGlkZXItZGlzYWJsZWQiICsKCQkJCSIgdWktd2lkZ2V0IiArCgkJCQkiIHVpLXdpZGdldC1jb250ZW50IiArCgkJCQkiIHVpLWNvcm5lci1hbGwiICk7CgoJCXRoaXMuX21vdXNlRGVzdHJveSgpOwoJfSwKCglfbW91c2VDYXB0dXJlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdmFyIHBvc2l0aW9uLCBub3JtVmFsdWUsIGRpc3RhbmNlLCBjbG9zZXN0SGFuZGxlLCBpbmRleCwgYWxsb3dlZCwgb2Zmc2V0LCBtb3VzZU92ZXJIYW5kbGUsCgkJCXRoYXQgPSB0aGlzLAoJCQlvID0gdGhpcy5vcHRpb25zOwoKCQlpZiAoIG8uZGlzYWJsZWQgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXRoaXMuZWxlbWVudFNpemUgPSB7CgkJCXdpZHRoOiB0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpLAoJCQloZWlnaHQ6IHRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpCgkJfTsKCQl0aGlzLmVsZW1lbnRPZmZzZXQgPSB0aGlzLmVsZW1lbnQub2Zmc2V0KCk7CgoJCXBvc2l0aW9uID0geyB4OiBldmVudC5wYWdlWCwgeTogZXZlbnQucGFnZVkgfTsKCQlub3JtVmFsdWUgPSB0aGlzLl9ub3JtVmFsdWVGcm9tTW91c2UoIHBvc2l0aW9uICk7CgkJZGlzdGFuY2UgPSB0aGlzLl92YWx1ZU1heCgpIC0gdGhpcy5fdmFsdWVNaW4oKSArIDE7CgkJdGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCXZhciB0aGlzRGlzdGFuY2UgPSBNYXRoLmFicyggbm9ybVZhbHVlIC0gdGhhdC52YWx1ZXMoaSkgKTsKCQkJaWYgKCBkaXN0YW5jZSA+IHRoaXNEaXN0YW5jZSApIHsKCQkJCWRpc3RhbmNlID0gdGhpc0Rpc3RhbmNlOwoJCQkJY2xvc2VzdEhhbmRsZSA9ICQoIHRoaXMgKTsKCQkJCWluZGV4ID0gaTsKCQkJfQoJCX0pOwoKCQkvLyB3b3JrYXJvdW5kIGZvciBidWcgIzM3MzYgKGlmIGJvdGggaGFuZGxlcyBvZiBhIHJhbmdlIGFyZSBhdCAwLAoJCS8vIHRoZSBmaXJzdCBpcyBhbHdheXMgdXNlZCBhcyB0aGUgb25lIHdpdGggbGVhc3QgZGlzdGFuY2UsCgkJLy8gYW5kIG1vdmluZyBpdCBpcyBvYnZpb3VzbHkgcHJldmVudGVkIGJ5IHByZXZlbnRpbmcgbmVnYXRpdmUgcmFuZ2VzKQoJCWlmKCBvLnJhbmdlID09PSB0cnVlICYmIHRoaXMudmFsdWVzKDEpID09PSBvLm1pbiApIHsKCQkJaW5kZXggKz0gMTsKCQkJY2xvc2VzdEhhbmRsZSA9ICQoIHRoaXMuaGFuZGxlc1tpbmRleF0gKTsKCQl9CgoJCWFsbG93ZWQgPSB0aGlzLl9zdGFydCggZXZlbnQsIGluZGV4ICk7CgkJaWYgKCBhbGxvd2VkID09PSBmYWxzZSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQl0aGlzLl9tb3VzZVNsaWRpbmcgPSB0cnVlOwoKCQl0aGlzLl9oYW5kbGVJbmRleCA9IGluZGV4OwoKCQljbG9zZXN0SGFuZGxlCgkJCS5hZGRDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKQoJCQkuZm9jdXMoKTsKCgkJb2Zmc2V0ID0gY2xvc2VzdEhhbmRsZS5vZmZzZXQoKTsKCQltb3VzZU92ZXJIYW5kbGUgPSAhJCggZXZlbnQudGFyZ2V0ICkucGFyZW50cygpLmFuZFNlbGYoKS5pcyggIi51aS1zbGlkZXItaGFuZGxlIiApOwoJCXRoaXMuX2NsaWNrT2Zmc2V0ID0gbW91c2VPdmVySGFuZGxlID8geyBsZWZ0OiAwLCB0b3A6IDAgfSA6IHsKCQkJbGVmdDogZXZlbnQucGFnZVggLSBvZmZzZXQubGVmdCAtICggY2xvc2VzdEhhbmRsZS53aWR0aCgpIC8gMiApLAoJCQl0b3A6IGV2ZW50LnBhZ2VZIC0gb2Zmc2V0LnRvcCAtCgkJCQkoIGNsb3Nlc3RIYW5kbGUuaGVpZ2h0KCkgLyAyICkgLQoJCQkJKCBwYXJzZUludCggY2xvc2VzdEhhbmRsZS5jc3MoImJvcmRlclRvcFdpZHRoIiksIDEwICkgfHwgMCApIC0KCQkJCSggcGFyc2VJbnQoIGNsb3Nlc3RIYW5kbGUuY3NzKCJib3JkZXJCb3R0b21XaWR0aCIpLCAxMCApIHx8IDApICsKCQkJCSggcGFyc2VJbnQoIGNsb3Nlc3RIYW5kbGUuY3NzKCJtYXJnaW5Ub3AiKSwgMTAgKSB8fCAwKQoJCX07CgoJCWlmICggIXRoaXMuaGFuZGxlcy5oYXNDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApICkgewoJCQl0aGlzLl9zbGlkZSggZXZlbnQsIGluZGV4LCBub3JtVmFsdWUgKTsKCQl9CgkJdGhpcy5fYW5pbWF0ZU9mZiA9IHRydWU7CgkJcmV0dXJuIHRydWU7Cgl9LAoKCV9tb3VzZVN0YXJ0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0sCgoJX21vdXNlRHJhZzogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXZhciBwb3NpdGlvbiA9IHsgeDogZXZlbnQucGFnZVgsIHk6IGV2ZW50LnBhZ2VZIH0sCgkJCW5vcm1WYWx1ZSA9IHRoaXMuX25vcm1WYWx1ZUZyb21Nb3VzZSggcG9zaXRpb24gKTsKCgkJdGhpcy5fc2xpZGUoIGV2ZW50LCB0aGlzLl9oYW5kbGVJbmRleCwgbm9ybVZhbHVlICk7CgoJCXJldHVybiBmYWxzZTsKCX0sCgoJX21vdXNlU3RvcDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXRoaXMuaGFuZGxlcy5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKTsKCQl0aGlzLl9tb3VzZVNsaWRpbmcgPSBmYWxzZTsKCgkJdGhpcy5fc3RvcCggZXZlbnQsIHRoaXMuX2hhbmRsZUluZGV4ICk7CgkJdGhpcy5fY2hhbmdlKCBldmVudCwgdGhpcy5faGFuZGxlSW5kZXggKTsKCgkJdGhpcy5faGFuZGxlSW5kZXggPSBudWxsOwoJCXRoaXMuX2NsaWNrT2Zmc2V0ID0gbnVsbDsKCQl0aGlzLl9hbmltYXRlT2ZmID0gZmFsc2U7CgoJCXJldHVybiBmYWxzZTsKCX0sCgoJX2RldGVjdE9yaWVudGF0aW9uOiBmdW5jdGlvbigpIHsKCQl0aGlzLm9yaWVudGF0aW9uID0gKCB0aGlzLm9wdGlvbnMub3JpZW50YXRpb24gPT09ICJ2ZXJ0aWNhbCIgKSA/ICJ2ZXJ0aWNhbCIgOiAiaG9yaXpvbnRhbCI7Cgl9LAoKCV9ub3JtVmFsdWVGcm9tTW91c2U6IGZ1bmN0aW9uKCBwb3NpdGlvbiApIHsKCQl2YXIgcGl4ZWxUb3RhbCwKCQkJcGl4ZWxNb3VzZSwKCQkJcGVyY2VudE1vdXNlLAoJCQl2YWx1ZVRvdGFsLAoJCQl2YWx1ZU1vdXNlOwoKCQlpZiAoIHRoaXMub3JpZW50YXRpb24gPT09ICJob3Jpem9udGFsIiApIHsKCQkJcGl4ZWxUb3RhbCA9IHRoaXMuZWxlbWVudFNpemUud2lkdGg7CgkJCXBpeGVsTW91c2UgPSBwb3NpdGlvbi54IC0gdGhpcy5lbGVtZW50T2Zmc2V0LmxlZnQgLSAoIHRoaXMuX2NsaWNrT2Zmc2V0ID8gdGhpcy5fY2xpY2tPZmZzZXQubGVmdCA6IDAgKTsKCQl9IGVsc2UgewoJCQlwaXhlbFRvdGFsID0gdGhpcy5lbGVtZW50U2l6ZS5oZWlnaHQ7CgkJCXBpeGVsTW91c2UgPSBwb3NpdGlvbi55IC0gdGhpcy5lbGVtZW50T2Zmc2V0LnRvcCAtICggdGhpcy5fY2xpY2tPZmZzZXQgPyB0aGlzLl9jbGlja09mZnNldC50b3AgOiAwICk7CgkJfQoKCQlwZXJjZW50TW91c2UgPSAoIHBpeGVsTW91c2UgLyBwaXhlbFRvdGFsICk7CgkJaWYgKCBwZXJjZW50TW91c2UgPiAxICkgewoJCQlwZXJjZW50TW91c2UgPSAxOwoJCX0KCQlpZiAoIHBlcmNlbnRNb3VzZSA8IDAgKSB7CgkJCXBlcmNlbnRNb3VzZSA9IDA7CgkJfQoJCWlmICggdGhpcy5vcmllbnRhdGlvbiA9PT0gInZlcnRpY2FsIiApIHsKCQkJcGVyY2VudE1vdXNlID0gMSAtIHBlcmNlbnRNb3VzZTsKCQl9CgoJCXZhbHVlVG90YWwgPSB0aGlzLl92YWx1ZU1heCgpIC0gdGhpcy5fdmFsdWVNaW4oKTsKCQl2YWx1ZU1vdXNlID0gdGhpcy5fdmFsdWVNaW4oKSArIHBlcmNlbnRNb3VzZSAqIHZhbHVlVG90YWw7CgoJCXJldHVybiB0aGlzLl90cmltQWxpZ25WYWx1ZSggdmFsdWVNb3VzZSApOwoJfSwKCglfc3RhcnQ6IGZ1bmN0aW9uKCBldmVudCwgaW5kZXggKSB7CgkJdmFyIHVpSGFzaCA9IHsKCQkJaGFuZGxlOiB0aGlzLmhhbmRsZXNbIGluZGV4IF0sCgkJCXZhbHVlOiB0aGlzLnZhbHVlKCkKCQl9OwoJCWlmICggdGhpcy5vcHRpb25zLnZhbHVlcyAmJiB0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCApIHsKCQkJdWlIYXNoLnZhbHVlID0gdGhpcy52YWx1ZXMoIGluZGV4ICk7CgkJCXVpSGFzaC52YWx1ZXMgPSB0aGlzLnZhbHVlcygpOwoJCX0KCQlyZXR1cm4gdGhpcy5fdHJpZ2dlciggInN0YXJ0IiwgZXZlbnQsIHVpSGFzaCApOwoJfSwKCglfc2xpZGU6IGZ1bmN0aW9uKCBldmVudCwgaW5kZXgsIG5ld1ZhbCApIHsKCQl2YXIgb3RoZXJWYWwsCgkJCW5ld1ZhbHVlcywKCQkJYWxsb3dlZDsKCgkJaWYgKCB0aGlzLm9wdGlvbnMudmFsdWVzICYmIHRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoICkgewoJCQlvdGhlclZhbCA9IHRoaXMudmFsdWVzKCBpbmRleCA/IDAgOiAxICk7CgoJCQlpZiAoICggdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGggPT09IDIgJiYgdGhpcy5vcHRpb25zLnJhbmdlID09PSB0cnVlICkgJiYKCQkJCQkoICggaW5kZXggPT09IDAgJiYgbmV3VmFsID4gb3RoZXJWYWwpIHx8ICggaW5kZXggPT09IDEgJiYgbmV3VmFsIDwgb3RoZXJWYWwgKSApCgkJCQkpIHsKCQkJCW5ld1ZhbCA9IG90aGVyVmFsOwoJCQl9CgoJCQlpZiAoIG5ld1ZhbCAhPT0gdGhpcy52YWx1ZXMoIGluZGV4ICkgKSB7CgkJCQluZXdWYWx1ZXMgPSB0aGlzLnZhbHVlcygpOwoJCQkJbmV3VmFsdWVzWyBpbmRleCBdID0gbmV3VmFsOwoJCQkJLy8gQSBzbGlkZSBjYW4gYmUgY2FuY2VsZWQgYnkgcmV0dXJuaW5nIGZhbHNlIGZyb20gdGhlIHNsaWRlIGNhbGxiYWNrCgkJCQlhbGxvd2VkID0gdGhpcy5fdHJpZ2dlciggInNsaWRlIiwgZXZlbnQsIHsKCQkJCQloYW5kbGU6IHRoaXMuaGFuZGxlc1sgaW5kZXggXSwKCQkJCQl2YWx1ZTogbmV3VmFsLAoJCQkJCXZhbHVlczogbmV3VmFsdWVzCgkJCQl9ICk7CgkJCQlvdGhlclZhbCA9IHRoaXMudmFsdWVzKCBpbmRleCA/IDAgOiAxICk7CgkJCQlpZiAoIGFsbG93ZWQgIT09IGZhbHNlICkgewoJCQkJCXRoaXMudmFsdWVzKCBpbmRleCwgbmV3VmFsLCB0cnVlICk7CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoIG5ld1ZhbCAhPT0gdGhpcy52YWx1ZSgpICkgewoJCQkJLy8gQSBzbGlkZSBjYW4gYmUgY2FuY2VsZWQgYnkgcmV0dXJuaW5nIGZhbHNlIGZyb20gdGhlIHNsaWRlIGNhbGxiYWNrCgkJCQlhbGxvd2VkID0gdGhpcy5fdHJpZ2dlciggInNsaWRlIiwgZXZlbnQsIHsKCQkJCQloYW5kbGU6IHRoaXMuaGFuZGxlc1sgaW5kZXggXSwKCQkJCQl2YWx1ZTogbmV3VmFsCgkJCQl9ICk7CgkJCQlpZiAoIGFsbG93ZWQgIT09IGZhbHNlICkgewoJCQkJCXRoaXMudmFsdWUoIG5ld1ZhbCApOwoJCQkJfQoJCQl9CgkJfQoJfSwKCglfc3RvcDogZnVuY3Rpb24oIGV2ZW50LCBpbmRleCApIHsKCQl2YXIgdWlIYXNoID0gewoJCQloYW5kbGU6IHRoaXMuaGFuZGxlc1sgaW5kZXggXSwKCQkJdmFsdWU6IHRoaXMudmFsdWUoKQoJCX07CgkJaWYgKCB0aGlzLm9wdGlvbnMudmFsdWVzICYmIHRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoICkgewoJCQl1aUhhc2gudmFsdWUgPSB0aGlzLnZhbHVlcyggaW5kZXggKTsKCQkJdWlIYXNoLnZhbHVlcyA9IHRoaXMudmFsdWVzKCk7CgkJfQoKCQl0aGlzLl90cmlnZ2VyKCAic3RvcCIsIGV2ZW50LCB1aUhhc2ggKTsKCX0sCgoJX2NoYW5nZTogZnVuY3Rpb24oIGV2ZW50LCBpbmRleCApIHsKCQlpZiAoICF0aGlzLl9rZXlTbGlkaW5nICYmICF0aGlzLl9tb3VzZVNsaWRpbmcgKSB7CgkJCXZhciB1aUhhc2ggPSB7CgkJCQloYW5kbGU6IHRoaXMuaGFuZGxlc1sgaW5kZXggXSwKCQkJCXZhbHVlOiB0aGlzLnZhbHVlKCkKCQkJfTsKCQkJaWYgKCB0aGlzLm9wdGlvbnMudmFsdWVzICYmIHRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoICkgewoJCQkJdWlIYXNoLnZhbHVlID0gdGhpcy52YWx1ZXMoIGluZGV4ICk7CgkJCQl1aUhhc2gudmFsdWVzID0gdGhpcy52YWx1ZXMoKTsKCQkJfQoKCQkJdGhpcy5fdHJpZ2dlciggImNoYW5nZSIsIGV2ZW50LCB1aUhhc2ggKTsKCQl9Cgl9LAoKCXZhbHVlOiBmdW5jdGlvbiggbmV3VmFsdWUgKSB7CgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQl0aGlzLm9wdGlvbnMudmFsdWUgPSB0aGlzLl90cmltQWxpZ25WYWx1ZSggbmV3VmFsdWUgKTsKCQkJdGhpcy5fcmVmcmVzaFZhbHVlKCk7CgkJCXRoaXMuX2NoYW5nZSggbnVsbCwgMCApOwoJCQlyZXR1cm47CgkJfQoKCQlyZXR1cm4gdGhpcy5fdmFsdWUoKTsKCX0sCgoJdmFsdWVzOiBmdW5jdGlvbiggaW5kZXgsIG5ld1ZhbHVlICkgewoJCXZhciB2YWxzLAoJCQluZXdWYWx1ZXMsCgkJCWk7CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCA+IDEgKSB7CgkJCXRoaXMub3B0aW9ucy52YWx1ZXNbIGluZGV4IF0gPSB0aGlzLl90cmltQWxpZ25WYWx1ZSggbmV3VmFsdWUgKTsKCQkJdGhpcy5fcmVmcmVzaFZhbHVlKCk7CgkJCXRoaXMuX2NoYW5nZSggbnVsbCwgaW5kZXggKTsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQlpZiAoICQuaXNBcnJheSggYXJndW1lbnRzWyAwIF0gKSApIHsKCQkJCXZhbHMgPSB0aGlzLm9wdGlvbnMudmFsdWVzOwoJCQkJbmV3VmFsdWVzID0gYXJndW1lbnRzWyAwIF07CgkJCQlmb3IgKCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpICs9IDEgKSB7CgkJCQkJdmFsc1sgaSBdID0gdGhpcy5fdHJpbUFsaWduVmFsdWUoIG5ld1ZhbHVlc1sgaSBdICk7CgkJCQkJdGhpcy5fY2hhbmdlKCBudWxsLCBpICk7CgkJCQl9CgkJCQl0aGlzLl9yZWZyZXNoVmFsdWUoKTsKCQkJfSBlbHNlIHsKCQkJCWlmICggdGhpcy5vcHRpb25zLnZhbHVlcyAmJiB0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCApIHsKCQkJCQlyZXR1cm4gdGhpcy5fdmFsdWVzKCBpbmRleCApOwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gdGhpcy52YWx1ZSgpOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJcmV0dXJuIHRoaXMuX3ZhbHVlcygpOwoJCX0KCX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJdmFyIGksCgkJCXZhbHNMZW5ndGggPSAwOwoKCQlpZiAoICQuaXNBcnJheSggdGhpcy5vcHRpb25zLnZhbHVlcyApICkgewoJCQl2YWxzTGVuZ3RoID0gdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg7CgkJfQoKCQkkLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgoJCXN3aXRjaCAoIGtleSApIHsKCQkJY2FzZSAiZGlzYWJsZWQiOgoJCQkJaWYgKCB2YWx1ZSApIHsKCQkJCQl0aGlzLmhhbmRsZXMuZmlsdGVyKCAiLnVpLXN0YXRlLWZvY3VzIiApLmJsdXIoKTsKCQkJCQl0aGlzLmhhbmRsZXMucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJCQl0aGlzLmhhbmRsZXMucHJvcCggImRpc2FibGVkIiwgdHJ1ZSApOwoJCQkJCXRoaXMuZWxlbWVudC5hZGRDbGFzcyggInVpLWRpc2FibGVkIiApOwoJCQkJfSBlbHNlIHsKCQkJCQl0aGlzLmhhbmRsZXMucHJvcCggImRpc2FibGVkIiwgZmFsc2UgKTsKCQkJCQl0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoICJ1aS1kaXNhYmxlZCIgKTsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlICJvcmllbnRhdGlvbiI6CgkJCQl0aGlzLl9kZXRlY3RPcmllbnRhdGlvbigpOwoJCQkJdGhpcy5lbGVtZW50CgkJCQkJLnJlbW92ZUNsYXNzKCAidWktc2xpZGVyLWhvcml6b250YWwgdWktc2xpZGVyLXZlcnRpY2FsIiApCgkJCQkJLmFkZENsYXNzKCAidWktc2xpZGVyLSIgKyB0aGlzLm9yaWVudGF0aW9uICk7CgkJCQl0aGlzLl9yZWZyZXNoVmFsdWUoKTsKCQkJCWJyZWFrOwoJCQljYXNlICJ2YWx1ZSI6CgkJCQl0aGlzLl9hbmltYXRlT2ZmID0gdHJ1ZTsKCQkJCXRoaXMuX3JlZnJlc2hWYWx1ZSgpOwoJCQkJdGhpcy5fY2hhbmdlKCBudWxsLCAwICk7CgkJCQl0aGlzLl9hbmltYXRlT2ZmID0gZmFsc2U7CgkJCQlicmVhazsKCQkJY2FzZSAidmFsdWVzIjoKCQkJCXRoaXMuX2FuaW1hdGVPZmYgPSB0cnVlOwoJCQkJdGhpcy5fcmVmcmVzaFZhbHVlKCk7CgkJCQlmb3IgKCBpID0gMDsgaSA8IHZhbHNMZW5ndGg7IGkgKz0gMSApIHsKCQkJCQl0aGlzLl9jaGFuZ2UoIG51bGwsIGkgKTsKCQkJCX0KCQkJCXRoaXMuX2FuaW1hdGVPZmYgPSBmYWxzZTsKCQkJCWJyZWFrOwoJCQljYXNlICJtaW4iOgoJCQljYXNlICJtYXgiOgoJCQkJdGhpcy5fYW5pbWF0ZU9mZiA9IHRydWU7CgkJCQl0aGlzLl9yZWZyZXNoVmFsdWUoKTsKCQkJCXRoaXMuX2FuaW1hdGVPZmYgPSBmYWxzZTsKCQkJCWJyZWFrOwoJCX0KCX0sCgoJLy9pbnRlcm5hbCB2YWx1ZSBnZXR0ZXIKCS8vIF92YWx1ZSgpIHJldHVybnMgdmFsdWUgdHJpbW1lZCBieSBtaW4gYW5kIG1heCwgYWxpZ25lZCBieSBzdGVwCglfdmFsdWU6IGZ1bmN0aW9uKCkgewoJCXZhciB2YWwgPSB0aGlzLm9wdGlvbnMudmFsdWU7CgkJdmFsID0gdGhpcy5fdHJpbUFsaWduVmFsdWUoIHZhbCApOwoKCQlyZXR1cm4gdmFsOwoJfSwKCgkvL2ludGVybmFsIHZhbHVlcyBnZXR0ZXIKCS8vIF92YWx1ZXMoKSByZXR1cm5zIGFycmF5IG9mIHZhbHVlcyB0cmltbWVkIGJ5IG1pbiBhbmQgbWF4LCBhbGlnbmVkIGJ5IHN0ZXAKCS8vIF92YWx1ZXMoIGluZGV4ICkgcmV0dXJucyBzaW5nbGUgdmFsdWUgdHJpbW1lZCBieSBtaW4gYW5kIG1heCwgYWxpZ25lZCBieSBzdGVwCglfdmFsdWVzOiBmdW5jdGlvbiggaW5kZXggKSB7CgkJdmFyIHZhbCwKCQkJdmFscywKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQl2YWwgPSB0aGlzLm9wdGlvbnMudmFsdWVzWyBpbmRleCBdOwoJCQl2YWwgPSB0aGlzLl90cmltQWxpZ25WYWx1ZSggdmFsICk7CgoJCQlyZXR1cm4gdmFsOwoJCX0gZWxzZSB7CgkJCS8vIC5zbGljZSgpIGNyZWF0ZXMgYSBjb3B5IG9mIHRoZSBhcnJheQoJCQkvLyB0aGlzIGNvcHkgZ2V0cyB0cmltbWVkIGJ5IG1pbiBhbmQgbWF4IGFuZCB0aGVuIHJldHVybmVkCgkJCXZhbHMgPSB0aGlzLm9wdGlvbnMudmFsdWVzLnNsaWNlKCk7CgkJCWZvciAoIGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrPSAxKSB7CgkJCQl2YWxzWyBpIF0gPSB0aGlzLl90cmltQWxpZ25WYWx1ZSggdmFsc1sgaSBdICk7CgkJCX0KCgkJCXJldHVybiB2YWxzOwoJCX0KCX0sCgoJLy8gcmV0dXJucyB0aGUgc3RlcC1hbGlnbmVkIHZhbHVlIHRoYXQgdmFsIGlzIGNsb3Nlc3QgdG8sIGJldHdlZW4gKGluY2x1c2l2ZSkgbWluIGFuZCBtYXgKCV90cmltQWxpZ25WYWx1ZTogZnVuY3Rpb24oIHZhbCApIHsKCQlpZiAoIHZhbCA8PSB0aGlzLl92YWx1ZU1pbigpICkgewoJCQlyZXR1cm4gdGhpcy5fdmFsdWVNaW4oKTsKCQl9CgkJaWYgKCB2YWwgPj0gdGhpcy5fdmFsdWVNYXgoKSApIHsKCQkJcmV0dXJuIHRoaXMuX3ZhbHVlTWF4KCk7CgkJfQoJCXZhciBzdGVwID0gKCB0aGlzLm9wdGlvbnMuc3RlcCA+IDAgKSA/IHRoaXMub3B0aW9ucy5zdGVwIDogMSwKCQkJdmFsTW9kU3RlcCA9ICh2YWwgLSB0aGlzLl92YWx1ZU1pbigpKSAlIHN0ZXAsCgkJCWFsaWduVmFsdWUgPSB2YWwgLSB2YWxNb2RTdGVwOwoKCQlpZiAoIE1hdGguYWJzKHZhbE1vZFN0ZXApICogMiA+PSBzdGVwICkgewoJCQlhbGlnblZhbHVlICs9ICggdmFsTW9kU3RlcCA+IDAgKSA/IHN0ZXAgOiAoIC1zdGVwICk7CgkJfQoKCQkvLyBTaW5jZSBKYXZhU2NyaXB0IGhhcyBwcm9ibGVtcyB3aXRoIGxhcmdlIGZsb2F0cywgcm91bmQKCQkvLyB0aGUgZmluYWwgdmFsdWUgdG8gNSBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgKHNlZSAjNDEyNCkKCQlyZXR1cm4gcGFyc2VGbG9hdCggYWxpZ25WYWx1ZS50b0ZpeGVkKDUpICk7Cgl9LAoKCV92YWx1ZU1pbjogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMub3B0aW9ucy5taW47Cgl9LAoKCV92YWx1ZU1heDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMub3B0aW9ucy5tYXg7Cgl9LAoKCV9yZWZyZXNoVmFsdWU6IGZ1bmN0aW9uKCkgewoJCXZhciBsYXN0VmFsUGVyY2VudCwgdmFsUGVyY2VudCwgdmFsdWUsIHZhbHVlTWluLCB2YWx1ZU1heCwKCQkJb1JhbmdlID0gdGhpcy5vcHRpb25zLnJhbmdlLAoJCQlvID0gdGhpcy5vcHRpb25zLAoJCQl0aGF0ID0gdGhpcywKCQkJYW5pbWF0ZSA9ICggIXRoaXMuX2FuaW1hdGVPZmYgKSA/IG8uYW5pbWF0ZSA6IGZhbHNlLAoJCQlfc2V0ID0ge307CgoJCWlmICggdGhpcy5vcHRpb25zLnZhbHVlcyAmJiB0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCApIHsKCQkJdGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCQl2YWxQZXJjZW50ID0gKCB0aGF0LnZhbHVlcyhpKSAtIHRoYXQuX3ZhbHVlTWluKCkgKSAvICggdGhhdC5fdmFsdWVNYXgoKSAtIHRoYXQuX3ZhbHVlTWluKCkgKSAqIDEwMDsKCQkJCV9zZXRbIHRoYXQub3JpZW50YXRpb24gPT09ICJob3Jpem9udGFsIiA/ICJsZWZ0IiA6ICJib3R0b20iIF0gPSB2YWxQZXJjZW50ICsgIiUiOwoJCQkJJCggdGhpcyApLnN0b3AoIDEsIDEgKVsgYW5pbWF0ZSA/ICJhbmltYXRlIiA6ICJjc3MiIF0oIF9zZXQsIG8uYW5pbWF0ZSApOwoJCQkJaWYgKCB0aGF0Lm9wdGlvbnMucmFuZ2UgPT09IHRydWUgKSB7CgkJCQkJaWYgKCB0aGF0Lm9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgKSB7CgkJCQkJCWlmICggaSA9PT0gMCApIHsKCQkJCQkJCXRoYXQucmFuZ2Uuc3RvcCggMSwgMSApWyBhbmltYXRlID8gImFuaW1hdGUiIDogImNzcyIgXSggeyBsZWZ0OiB2YWxQZXJjZW50ICsgIiUiIH0sIG8uYW5pbWF0ZSApOwoJCQkJCQl9CgkJCQkJCWlmICggaSA9PT0gMSApIHsKCQkJCQkJCXRoYXQucmFuZ2VbIGFuaW1hdGUgPyAiYW5pbWF0ZSIgOiAiY3NzIiBdKCB7IHdpZHRoOiAoIHZhbFBlcmNlbnQgLSBsYXN0VmFsUGVyY2VudCApICsgIiUiIH0sIHsgcXVldWU6IGZhbHNlLCBkdXJhdGlvbjogby5hbmltYXRlIH0gKTsKCQkJCQkJfQoJCQkJCX0gZWxzZSB7CgkJCQkJCWlmICggaSA9PT0gMCApIHsKCQkJCQkJCXRoYXQucmFuZ2Uuc3RvcCggMSwgMSApWyBhbmltYXRlID8gImFuaW1hdGUiIDogImNzcyIgXSggeyBib3R0b206ICggdmFsUGVyY2VudCApICsgIiUiIH0sIG8uYW5pbWF0ZSApOwoJCQkJCQl9CgkJCQkJCWlmICggaSA9PT0gMSApIHsKCQkJCQkJCXRoYXQucmFuZ2VbIGFuaW1hdGUgPyAiYW5pbWF0ZSIgOiAiY3NzIiBdKCB7IGhlaWdodDogKCB2YWxQZXJjZW50IC0gbGFzdFZhbFBlcmNlbnQgKSArICIlIiB9LCB7IHF1ZXVlOiBmYWxzZSwgZHVyYXRpb246IG8uYW5pbWF0ZSB9ICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQlsYXN0VmFsUGVyY2VudCA9IHZhbFBlcmNlbnQ7CgkJCX0pOwoJCX0gZWxzZSB7CgkJCXZhbHVlID0gdGhpcy52YWx1ZSgpOwoJCQl2YWx1ZU1pbiA9IHRoaXMuX3ZhbHVlTWluKCk7CgkJCXZhbHVlTWF4ID0gdGhpcy5fdmFsdWVNYXgoKTsKCQkJdmFsUGVyY2VudCA9ICggdmFsdWVNYXggIT09IHZhbHVlTWluICkgPwoJCQkJCSggdmFsdWUgLSB2YWx1ZU1pbiApIC8gKCB2YWx1ZU1heCAtIHZhbHVlTWluICkgKiAxMDAgOgoJCQkJCTA7CgkJCV9zZXRbIHRoaXMub3JpZW50YXRpb24gPT09ICJob3Jpem9udGFsIiA/ICJsZWZ0IiA6ICJib3R0b20iIF0gPSB2YWxQZXJjZW50ICsgIiUiOwoJCQl0aGlzLmhhbmRsZS5zdG9wKCAxLCAxIClbIGFuaW1hdGUgPyAiYW5pbWF0ZSIgOiAiY3NzIiBdKCBfc2V0LCBvLmFuaW1hdGUgKTsKCgkJCWlmICggb1JhbmdlID09PSAibWluIiAmJiB0aGlzLm9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgKSB7CgkJCQl0aGlzLnJhbmdlLnN0b3AoIDEsIDEgKVsgYW5pbWF0ZSA/ICJhbmltYXRlIiA6ICJjc3MiIF0oIHsgd2lkdGg6IHZhbFBlcmNlbnQgKyAiJSIgfSwgby5hbmltYXRlICk7CgkJCX0KCQkJaWYgKCBvUmFuZ2UgPT09ICJtYXgiICYmIHRoaXMub3JpZW50YXRpb24gPT09ICJob3Jpem9udGFsIiApIHsKCQkJCXRoaXMucmFuZ2VbIGFuaW1hdGUgPyAiYW5pbWF0ZSIgOiAiY3NzIiBdKCB7IHdpZHRoOiAoIDEwMCAtIHZhbFBlcmNlbnQgKSArICIlIiB9LCB7IHF1ZXVlOiBmYWxzZSwgZHVyYXRpb246IG8uYW5pbWF0ZSB9ICk7CgkJCX0KCQkJaWYgKCBvUmFuZ2UgPT09ICJtaW4iICYmIHRoaXMub3JpZW50YXRpb24gPT09ICJ2ZXJ0aWNhbCIgKSB7CgkJCQl0aGlzLnJhbmdlLnN0b3AoIDEsIDEgKVsgYW5pbWF0ZSA/ICJhbmltYXRlIiA6ICJjc3MiIF0oIHsgaGVpZ2h0OiB2YWxQZXJjZW50ICsgIiUiIH0sIG8uYW5pbWF0ZSApOwoJCQl9CgkJCWlmICggb1JhbmdlID09PSAibWF4IiAmJiB0aGlzLm9yaWVudGF0aW9uID09PSAidmVydGljYWwiICkgewoJCQkJdGhpcy5yYW5nZVsgYW5pbWF0ZSA/ICJhbmltYXRlIiA6ICJjc3MiIF0oIHsgaGVpZ2h0OiAoIDEwMCAtIHZhbFBlcmNlbnQgKSArICIlIiB9LCB7IHF1ZXVlOiBmYWxzZSwgZHVyYXRpb246IG8uYW5pbWF0ZSB9ICk7CgkJCX0KCQl9Cgl9Cgp9KTsKCn0oalF1ZXJ5KSk7CihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKJC53aWRnZXQoInVpLnNvcnRhYmxlIiwgJC51aS5tb3VzZSwgewoJdmVyc2lvbjogIjEuOS4yIiwKCXdpZGdldEV2ZW50UHJlZml4OiAic29ydCIsCglyZWFkeTogZmFsc2UsCglvcHRpb25zOiB7CgkJYXBwZW5kVG86ICJwYXJlbnQiLAoJCWF4aXM6IGZhbHNlLAoJCWNvbm5lY3RXaXRoOiBmYWxzZSwKCQljb250YWlubWVudDogZmFsc2UsCgkJY3Vyc29yOiAnYXV0bycsCgkJY3Vyc29yQXQ6IGZhbHNlLAoJCWRyb3BPbkVtcHR5OiB0cnVlLAoJCWZvcmNlUGxhY2Vob2xkZXJTaXplOiBmYWxzZSwKCQlmb3JjZUhlbHBlclNpemU6IGZhbHNlLAoJCWdyaWQ6IGZhbHNlLAoJCWhhbmRsZTogZmFsc2UsCgkJaGVscGVyOiAib3JpZ2luYWwiLAoJCWl0ZW1zOiAnPiAqJywKCQlvcGFjaXR5OiBmYWxzZSwKCQlwbGFjZWhvbGRlcjogZmFsc2UsCgkJcmV2ZXJ0OiBmYWxzZSwKCQlzY3JvbGw6IHRydWUsCgkJc2Nyb2xsU2Vuc2l0aXZpdHk6IDIwLAoJCXNjcm9sbFNwZWVkOiAyMCwKCQlzY29wZTogImRlZmF1bHQiLAoJCXRvbGVyYW5jZTogImludGVyc2VjdCIsCgkJekluZGV4OiAxMDAwCgl9LAoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgoJCXZhciBvID0gdGhpcy5vcHRpb25zOwoJCXRoaXMuY29udGFpbmVyQ2FjaGUgPSB7fTsKCQl0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXNvcnRhYmxlIik7CgoJCS8vR2V0IHRoZSBpdGVtcwoJCXRoaXMucmVmcmVzaCgpOwoKCQkvL0xldCdzIGRldGVybWluZSBpZiB0aGUgaXRlbXMgYXJlIGJlaW5nIGRpc3BsYXllZCBob3Jpem9udGFsbHkKCQl0aGlzLmZsb2F0aW5nID0gdGhpcy5pdGVtcy5sZW5ndGggPyBvLmF4aXMgPT09ICd4JyB8fCAoL2xlZnR8cmlnaHQvKS50ZXN0KHRoaXMuaXRlbXNbMF0uaXRlbS5jc3MoJ2Zsb2F0JykpIHx8ICgvaW5saW5lfHRhYmxlLWNlbGwvKS50ZXN0KHRoaXMuaXRlbXNbMF0uaXRlbS5jc3MoJ2Rpc3BsYXknKSkgOiBmYWxzZTsKCgkJLy9MZXQncyBkZXRlcm1pbmUgdGhlIHBhcmVudCdzIG9mZnNldAoJCXRoaXMub2Zmc2V0ID0gdGhpcy5lbGVtZW50Lm9mZnNldCgpOwoKCQkvL0luaXRpYWxpemUgbW91c2UgZXZlbnRzIGZvciBpbnRlcmFjdGlvbgoJCXRoaXMuX21vdXNlSW5pdCgpOwoKCQkvL1dlJ3JlIHJlYWR5IHRvIGdvCgkJdGhpcy5yZWFkeSA9IHRydWUKCgl9LAoKCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLmVsZW1lbnQKCQkJLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZSB1aS1zb3J0YWJsZS1kaXNhYmxlZCIpOwoJCXRoaXMuX21vdXNlRGVzdHJveSgpOwoKCQlmb3IgKCB2YXIgaSA9IHRoaXMuaXRlbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKQoJCQl0aGlzLml0ZW1zW2ldLml0ZW0ucmVtb3ZlRGF0YSh0aGlzLndpZGdldE5hbWUgKyAiLWl0ZW0iKTsKCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCV9zZXRPcHRpb246IGZ1bmN0aW9uKGtleSwgdmFsdWUpewoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCQl0aGlzLndpZGdldCgpLnRvZ2dsZUNsYXNzKCAidWktc29ydGFibGUtZGlzYWJsZWQiLCAhIXZhbHVlICk7CgkJfSBlbHNlIHsKCQkJLy8gRG9uJ3QgY2FsbCB3aWRnZXQgYmFzZSBfc2V0T3B0aW9uIGZvciBkaXNhYmxlIGFzIGl0IGFkZHMgdWktc3RhdGUtZGlzYWJsZWQgY2xhc3MKCQkJJC5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCQl9Cgl9LAoKCV9tb3VzZUNhcHR1cmU6IGZ1bmN0aW9uKGV2ZW50LCBvdmVycmlkZUhhbmRsZSkgewoJCXZhciB0aGF0ID0gdGhpczsKCgkJaWYgKHRoaXMucmV2ZXJ0aW5nKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCWlmKHRoaXMub3B0aW9ucy5kaXNhYmxlZCB8fCB0aGlzLm9wdGlvbnMudHlwZSA9PSAnc3RhdGljJykgcmV0dXJuIGZhbHNlOwoKCQkvL1dlIGhhdmUgdG8gcmVmcmVzaCB0aGUgaXRlbXMgZGF0YSBvbmNlIGZpcnN0CgkJdGhpcy5fcmVmcmVzaEl0ZW1zKGV2ZW50KTsKCgkJLy9GaW5kIG91dCBpZiB0aGUgY2xpY2tlZCBub2RlIChvciBvbmUgb2YgaXRzIHBhcmVudHMpIGlzIGEgYWN0dWFsIGl0ZW0gaW4gdGhpcy5pdGVtcwoJCXZhciBjdXJyZW50SXRlbSA9IG51bGwsIG5vZGVzID0gJChldmVudC50YXJnZXQpLnBhcmVudHMoKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQlpZigkLmRhdGEodGhpcywgdGhhdC53aWRnZXROYW1lICsgJy1pdGVtJykgPT0gdGhhdCkgewoJCQkJY3VycmVudEl0ZW0gPSAkKHRoaXMpOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfSk7CgkJaWYoJC5kYXRhKGV2ZW50LnRhcmdldCwgdGhhdC53aWRnZXROYW1lICsgJy1pdGVtJykgPT0gdGhhdCkgY3VycmVudEl0ZW0gPSAkKGV2ZW50LnRhcmdldCk7CgoJCWlmKCFjdXJyZW50SXRlbSkgcmV0dXJuIGZhbHNlOwoJCWlmKHRoaXMub3B0aW9ucy5oYW5kbGUgJiYgIW92ZXJyaWRlSGFuZGxlKSB7CgkJCXZhciB2YWxpZEhhbmRsZSA9IGZhbHNlOwoKCQkJJCh0aGlzLm9wdGlvbnMuaGFuZGxlLCBjdXJyZW50SXRlbSkuZmluZCgiKiIpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCkgeyBpZih0aGlzID09IGV2ZW50LnRhcmdldCkgdmFsaWRIYW5kbGUgPSB0cnVlOyB9KTsKCQkJaWYoIXZhbGlkSGFuZGxlKSByZXR1cm4gZmFsc2U7CgkJfQoKCQl0aGlzLmN1cnJlbnRJdGVtID0gY3VycmVudEl0ZW07CgkJdGhpcy5fcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXMoKTsKCQlyZXR1cm4gdHJ1ZTsKCgl9LAoKCV9tb3VzZVN0YXJ0OiBmdW5jdGlvbihldmVudCwgb3ZlcnJpZGVIYW5kbGUsIG5vQWN0aXZhdGlvbikgewoKCQl2YXIgbyA9IHRoaXMub3B0aW9uczsKCQl0aGlzLmN1cnJlbnRDb250YWluZXIgPSB0aGlzOwoKCQkvL1dlIG9ubHkgbmVlZCB0byBjYWxsIHJlZnJlc2hQb3NpdGlvbnMsIGJlY2F1c2UgdGhlIHJlZnJlc2hJdGVtcyBjYWxsIGhhcyBiZWVuIG1vdmVkIHRvIG1vdXNlQ2FwdHVyZQoJCXRoaXMucmVmcmVzaFBvc2l0aW9ucygpOwoKCQkvL0NyZWF0ZSBhbmQgYXBwZW5kIHRoZSB2aXNpYmxlIGhlbHBlcgoJCXRoaXMuaGVscGVyID0gdGhpcy5fY3JlYXRlSGVscGVyKGV2ZW50KTsKCgkJLy9DYWNoZSB0aGUgaGVscGVyIHNpemUKCQl0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCk7CgoJCS8qCgkJICogLSBQb3NpdGlvbiBnZW5lcmF0aW9uIC0KCQkgKiBUaGlzIGJsb2NrIGdlbmVyYXRlcyBldmVyeXRoaW5nIHBvc2l0aW9uIHJlbGF0ZWQgLSBpdCdzIHRoZSBjb3JlIG9mIGRyYWdnYWJsZXMuCgkJICovCgoJCS8vQ2FjaGUgdGhlIG1hcmdpbnMgb2YgdGhlIG9yaWdpbmFsIGVsZW1lbnQKCQl0aGlzLl9jYWNoZU1hcmdpbnMoKTsKCgkJLy9HZXQgdGhlIG5leHQgc2Nyb2xsaW5nIHBhcmVudAoJCXRoaXMuc2Nyb2xsUGFyZW50ID0gdGhpcy5oZWxwZXIuc2Nyb2xsUGFyZW50KCk7CgoJCS8vVGhlIGVsZW1lbnQncyBhYnNvbHV0ZSBwb3NpdGlvbiBvbiB0aGUgcGFnZSBtaW51cyBtYXJnaW5zCgkJdGhpcy5vZmZzZXQgPSB0aGlzLmN1cnJlbnRJdGVtLm9mZnNldCgpOwoJCXRoaXMub2Zmc2V0ID0gewoJCQl0b3A6IHRoaXMub2Zmc2V0LnRvcCAtIHRoaXMubWFyZ2lucy50b3AsCgkJCWxlZnQ6IHRoaXMub2Zmc2V0LmxlZnQgLSB0aGlzLm1hcmdpbnMubGVmdAoJCX07CgoJCSQuZXh0ZW5kKHRoaXMub2Zmc2V0LCB7CgkJCWNsaWNrOiB7IC8vV2hlcmUgdGhlIGNsaWNrIGhhcHBlbmVkLCByZWxhdGl2ZSB0byB0aGUgZWxlbWVudAoJCQkJbGVmdDogZXZlbnQucGFnZVggLSB0aGlzLm9mZnNldC5sZWZ0LAoJCQkJdG9wOiBldmVudC5wYWdlWSAtIHRoaXMub2Zmc2V0LnRvcAoJCQl9LAoJCQlwYXJlbnQ6IHRoaXMuX2dldFBhcmVudE9mZnNldCgpLAoJCQlyZWxhdGl2ZTogdGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKSAvL1RoaXMgaXMgYSByZWxhdGl2ZSB0byBhYnNvbHV0ZSBwb3NpdGlvbiBtaW51cyB0aGUgYWN0dWFsIHBvc2l0aW9uIGNhbGN1bGF0aW9uIC0gb25seSB1c2VkIGZvciByZWxhdGl2ZSBwb3NpdGlvbmVkIGhlbHBlcgoJCX0pOwoKCQkvLyBPbmx5IGFmdGVyIHdlIGdvdCB0aGUgb2Zmc2V0LCB3ZSBjYW4gY2hhbmdlIHRoZSBoZWxwZXIncyBwb3NpdGlvbiB0byBhYnNvbHV0ZQoJCS8vIFRPRE86IFN0aWxsIG5lZWQgdG8gZmlndXJlIG91dCBhIHdheSB0byBtYWtlIHJlbGF0aXZlIHNvcnRpbmcgcG9zc2libGUKCQl0aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIiwgImFic29sdXRlIik7CgkJdGhpcy5jc3NQb3NpdGlvbiA9IHRoaXMuaGVscGVyLmNzcygicG9zaXRpb24iKTsKCgkJLy9HZW5lcmF0ZSB0aGUgb3JpZ2luYWwgcG9zaXRpb24KCQl0aGlzLm9yaWdpbmFsUG9zaXRpb24gPSB0aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKGV2ZW50KTsKCQl0aGlzLm9yaWdpbmFsUGFnZVggPSBldmVudC5wYWdlWDsKCQl0aGlzLm9yaWdpbmFsUGFnZVkgPSBldmVudC5wYWdlWTsKCgkJLy9BZGp1c3QgdGhlIG1vdXNlIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgaGVscGVyIGlmICdjdXJzb3JBdCcgaXMgc3VwcGxpZWQKCQkoby5jdXJzb3JBdCAmJiB0aGlzLl9hZGp1c3RPZmZzZXRGcm9tSGVscGVyKG8uY3Vyc29yQXQpKTsKCgkJLy9DYWNoZSB0aGUgZm9ybWVyIERPTSBwb3NpdGlvbgoJCXRoaXMuZG9tUG9zaXRpb24gPSB7IHByZXY6IHRoaXMuY3VycmVudEl0ZW0ucHJldigpWzBdLCBwYXJlbnQ6IHRoaXMuY3VycmVudEl0ZW0ucGFyZW50KClbMF0gfTsKCgkJLy9JZiB0aGUgaGVscGVyIGlzIG5vdCB0aGUgb3JpZ2luYWwsIGhpZGUgdGhlIG9yaWdpbmFsIHNvIGl0J3Mgbm90IHBsYXlpbmcgYW55IHJvbGUgZHVyaW5nIHRoZSBkcmFnLCB3b24ndCBjYXVzZSBhbnl0aGluZyBiYWQgdGhpcyB3YXkKCQlpZih0aGlzLmhlbHBlclswXSAhPSB0aGlzLmN1cnJlbnRJdGVtWzBdKSB7CgkJCXRoaXMuY3VycmVudEl0ZW0uaGlkZSgpOwoJCX0KCgkJLy9DcmVhdGUgdGhlIHBsYWNlaG9sZGVyCgkJdGhpcy5fY3JlYXRlUGxhY2Vob2xkZXIoKTsKCgkJLy9TZXQgYSBjb250YWlubWVudCBpZiBnaXZlbiBpbiB0aGUgb3B0aW9ucwoJCWlmKG8uY29udGFpbm1lbnQpCgkJCXRoaXMuX3NldENvbnRhaW5tZW50KCk7CgoJCWlmKG8uY3Vyc29yKSB7IC8vIGN1cnNvciBvcHRpb24KCQkJaWYgKCQoJ2JvZHknKS5jc3MoImN1cnNvciIpKSB0aGlzLl9zdG9yZWRDdXJzb3IgPSAkKCdib2R5JykuY3NzKCJjdXJzb3IiKTsKCQkJJCgnYm9keScpLmNzcygiY3Vyc29yIiwgby5jdXJzb3IpOwoJCX0KCgkJaWYoby5vcGFjaXR5KSB7IC8vIG9wYWNpdHkgb3B0aW9uCgkJCWlmICh0aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiKSkgdGhpcy5fc3RvcmVkT3BhY2l0eSA9IHRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIpOwoJCQl0aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiLCBvLm9wYWNpdHkpOwoJCX0KCgkJaWYoby56SW5kZXgpIHsgLy8gekluZGV4IG9wdGlvbgoJCQlpZiAodGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiKSkgdGhpcy5fc3RvcmVkWkluZGV4ID0gdGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiKTsKCQkJdGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiLCBvLnpJbmRleCk7CgkJfQoKCQkvL1ByZXBhcmUgc2Nyb2xsaW5nCgkJaWYodGhpcy5zY3JvbGxQYXJlbnRbMF0gIT0gZG9jdW1lbnQgJiYgdGhpcy5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSAhPSAnSFRNTCcpCgkJCXRoaXMub3ZlcmZsb3dPZmZzZXQgPSB0aGlzLnNjcm9sbFBhcmVudC5vZmZzZXQoKTsKCgkJLy9DYWxsIGNhbGxiYWNrcwoJCXRoaXMuX3RyaWdnZXIoInN0YXJ0IiwgZXZlbnQsIHRoaXMuX3VpSGFzaCgpKTsKCgkJLy9SZWNhY2hlIHRoZSBoZWxwZXIgc2l6ZQoJCWlmKCF0aGlzLl9wcmVzZXJ2ZUhlbHBlclByb3BvcnRpb25zKQoJCQl0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCk7CgoKCQkvL1Bvc3QgJ2FjdGl2YXRlJyBldmVudHMgdG8gcG9zc2libGUgY29udGFpbmVycwoJCWlmKCFub0FjdGl2YXRpb24pIHsKCQkJIGZvciAodmFyIGkgPSB0aGlzLmNvbnRhaW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsgdGhpcy5jb250YWluZXJzW2ldLl90cmlnZ2VyKCJhY3RpdmF0ZSIsIGV2ZW50LCB0aGlzLl91aUhhc2godGhpcykpOyB9CgkJfQoKCQkvL1ByZXBhcmUgcG9zc2libGUgZHJvcHBhYmxlcwoJCWlmKCQudWkuZGRtYW5hZ2VyKQoJCQkkLnVpLmRkbWFuYWdlci5jdXJyZW50ID0gdGhpczsKCgkJaWYgKCQudWkuZGRtYW5hZ2VyICYmICFvLmRyb3BCZWhhdmlvdXIpCgkJCSQudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsIGV2ZW50KTsKCgkJdGhpcy5kcmFnZ2luZyA9IHRydWU7CgoJCXRoaXMuaGVscGVyLmFkZENsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKTsKCQl0aGlzLl9tb3VzZURyYWcoZXZlbnQpOyAvL0V4ZWN1dGUgdGhlIGRyYWcgb25jZSAtIHRoaXMgY2F1c2VzIHRoZSBoZWxwZXIgbm90IHRvIGJlIHZpc2libGUgYmVmb3JlIGdldHRpbmcgaXRzIGNvcnJlY3QgcG9zaXRpb24KCQlyZXR1cm4gdHJ1ZTsKCgl9LAoKCV9tb3VzZURyYWc6IGZ1bmN0aW9uKGV2ZW50KSB7CgoJCS8vQ29tcHV0ZSB0aGUgaGVscGVycyBwb3NpdGlvbgoJCXRoaXMucG9zaXRpb24gPSB0aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKGV2ZW50KTsKCQl0aGlzLnBvc2l0aW9uQWJzID0gdGhpcy5fY29udmVydFBvc2l0aW9uVG8oImFic29sdXRlIik7CgoJCWlmICghdGhpcy5sYXN0UG9zaXRpb25BYnMpIHsKCQkJdGhpcy5sYXN0UG9zaXRpb25BYnMgPSB0aGlzLnBvc2l0aW9uQWJzOwoJCX0KCgkJLy9EbyBzY3JvbGxpbmcKCQlpZih0aGlzLm9wdGlvbnMuc2Nyb2xsKSB7CgkJCXZhciBvID0gdGhpcy5vcHRpb25zLCBzY3JvbGxlZCA9IGZhbHNlOwoJCQlpZih0aGlzLnNjcm9sbFBhcmVudFswXSAhPSBkb2N1bWVudCAmJiB0aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lICE9ICdIVE1MJykgewoKCQkJCWlmKCh0aGlzLm92ZXJmbG93T2Zmc2V0LnRvcCArIHRoaXMuc2Nyb2xsUGFyZW50WzBdLm9mZnNldEhlaWdodCkgLSBldmVudC5wYWdlWSA8IG8uc2Nyb2xsU2Vuc2l0aXZpdHkpCgkJCQkJdGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wID0gc2Nyb2xsZWQgPSB0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3AgKyBvLnNjcm9sbFNwZWVkOwoJCQkJZWxzZSBpZihldmVudC5wYWdlWSAtIHRoaXMub3ZlcmZsb3dPZmZzZXQudG9wIDwgby5zY3JvbGxTZW5zaXRpdml0eSkKCQkJCQl0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3AgPSBzY3JvbGxlZCA9IHRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCAtIG8uc2Nyb2xsU3BlZWQ7CgoJCQkJaWYoKHRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdCArIHRoaXMuc2Nyb2xsUGFyZW50WzBdLm9mZnNldFdpZHRoKSAtIGV2ZW50LnBhZ2VYIDwgby5zY3JvbGxTZW5zaXRpdml0eSkKCQkJCQl0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0ID0gc2Nyb2xsZWQgPSB0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0ICsgby5zY3JvbGxTcGVlZDsKCQkJCWVsc2UgaWYoZXZlbnQucGFnZVggLSB0aGlzLm92ZXJmbG93T2Zmc2V0LmxlZnQgPCBvLnNjcm9sbFNlbnNpdGl2aXR5KQoJCQkJCXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQgPSBzY3JvbGxlZCA9IHRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQgLSBvLnNjcm9sbFNwZWVkOwoKCQkJfSBlbHNlIHsKCgkJCQlpZihldmVudC5wYWdlWSAtICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpIDwgby5zY3JvbGxTZW5zaXRpdml0eSkKCQkJCQlzY3JvbGxlZCA9ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSAtIG8uc2Nyb2xsU3BlZWQpOwoJCQkJZWxzZSBpZigkKHdpbmRvdykuaGVpZ2h0KCkgLSAoZXZlbnQucGFnZVkgLSAkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSkgPCBvLnNjcm9sbFNlbnNpdGl2aXR5KQoJCQkJCXNjcm9sbGVkID0gJChkb2N1bWVudCkuc2Nyb2xsVG9wKCQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpICsgby5zY3JvbGxTcGVlZCk7CgoJCQkJaWYoZXZlbnQucGFnZVggLSAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkgPCBvLnNjcm9sbFNlbnNpdGl2aXR5KQoJCQkJCXNjcm9sbGVkID0gJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkgLSBvLnNjcm9sbFNwZWVkKTsKCQkJCWVsc2UgaWYoJCh3aW5kb3cpLndpZHRoKCkgLSAoZXZlbnQucGFnZVggLSAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkpIDwgby5zY3JvbGxTZW5zaXRpdml0eSkKCQkJCQlzY3JvbGxlZCA9ICQoZG9jdW1lbnQpLnNjcm9sbExlZnQoJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpICsgby5zY3JvbGxTcGVlZCk7CgoJCQl9CgoJCQlpZihzY3JvbGxlZCAhPT0gZmFsc2UgJiYgJC51aS5kZG1hbmFnZXIgJiYgIW8uZHJvcEJlaGF2aW91cikKCQkJCSQudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsIGV2ZW50KTsKCQl9CgoJCS8vUmVnZW5lcmF0ZSB0aGUgYWJzb2x1dGUgcG9zaXRpb24gdXNlZCBmb3IgcG9zaXRpb24gY2hlY2tzCgkJdGhpcy5wb3NpdGlvbkFicyA9IHRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpOwoKCQkvL1NldCB0aGUgaGVscGVyIHBvc2l0aW9uCgkJaWYoIXRoaXMub3B0aW9ucy5heGlzIHx8IHRoaXMub3B0aW9ucy5heGlzICE9ICJ5IikgdGhpcy5oZWxwZXJbMF0uc3R5bGUubGVmdCA9IHRoaXMucG9zaXRpb24ubGVmdCsncHgnOwoJCWlmKCF0aGlzLm9wdGlvbnMuYXhpcyB8fCB0aGlzLm9wdGlvbnMuYXhpcyAhPSAieCIpIHRoaXMuaGVscGVyWzBdLnN0eWxlLnRvcCA9IHRoaXMucG9zaXRpb24udG9wKydweCc7CgoJCS8vUmVhcnJhbmdlCgkJZm9yICh2YXIgaSA9IHRoaXMuaXRlbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCgkJCS8vQ2FjaGUgdmFyaWFibGVzIGFuZCBpbnRlcnNlY3Rpb24sIGNvbnRpbnVlIGlmIG5vIGludGVyc2VjdGlvbgoJCQl2YXIgaXRlbSA9IHRoaXMuaXRlbXNbaV0sIGl0ZW1FbGVtZW50ID0gaXRlbS5pdGVtWzBdLCBpbnRlcnNlY3Rpb24gPSB0aGlzLl9pbnRlcnNlY3RzV2l0aFBvaW50ZXIoaXRlbSk7CgkJCWlmICghaW50ZXJzZWN0aW9uKSBjb250aW51ZTsKCgkJCS8vIE9ubHkgcHV0IHRoZSBwbGFjZWhvbGRlciBpbnNpZGUgdGhlIGN1cnJlbnQgQ29udGFpbmVyLCBza2lwIGFsbAoJCQkvLyBpdGVtcyBmb3JtIG90aGVyIGNvbnRhaW5lcnMuIFRoaXMgd29ya3MgYmVjYXVzZSB3aGVuIG1vdmluZwoJCQkvLyBhbiBpdGVtIGZyb20gb25lIGNvbnRhaW5lciB0byBhbm90aGVyIHRoZQoJCQkvLyBjdXJyZW50Q29udGFpbmVyIGlzIHN3aXRjaGVkIGJlZm9yZSB0aGUgcGxhY2Vob2xkZXIgaXMgbW92ZWQuCgkJCS8vCgkJCS8vIFdpdGhvdXQgdGhpcyBtb3ZpbmcgaXRlbXMgaW4gInN1Yi1zb3J0YWJsZXMiIGNhbiBjYXVzZSB0aGUgcGxhY2Vob2xkZXIgdG8gaml0dGVyCgkJCS8vIGJlZXR3ZWVuIHRoZSBvdXRlciBhbmQgaW5uZXIgY29udGFpbmVyLgoJCQlpZiAoaXRlbS5pbnN0YW5jZSAhPT0gdGhpcy5jdXJyZW50Q29udGFpbmVyKSBjb250aW51ZTsKCgkJCWlmIChpdGVtRWxlbWVudCAhPSB0aGlzLmN1cnJlbnRJdGVtWzBdIC8vY2Fubm90IGludGVyc2VjdCB3aXRoIGl0c2VsZgoJCQkJJiYJdGhpcy5wbGFjZWhvbGRlcltpbnRlcnNlY3Rpb24gPT0gMSA/ICJuZXh0IiA6ICJwcmV2Il0oKVswXSAhPSBpdGVtRWxlbWVudCAvL25vIHVzZWxlc3MgYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBkb25lIGJlZm9yZQoJCQkJJiYJISQuY29udGFpbnModGhpcy5wbGFjZWhvbGRlclswXSwgaXRlbUVsZW1lbnQpIC8vbm8gYWN0aW9uIGlmIHRoZSBpdGVtIG1vdmVkIGlzIHRoZSBwYXJlbnQgb2YgdGhlIGl0ZW0gY2hlY2tlZAoJCQkJJiYgKHRoaXMub3B0aW9ucy50eXBlID09ICdzZW1pLWR5bmFtaWMnID8gISQuY29udGFpbnModGhpcy5lbGVtZW50WzBdLCBpdGVtRWxlbWVudCkgOiB0cnVlKQoJCQkJLy8mJiBpdGVtRWxlbWVudC5wYXJlbnROb2RlID09IHRoaXMucGxhY2Vob2xkZXJbMF0ucGFyZW50Tm9kZSAvLyBvbmx5IHJlYXJyYW5nZSBpdGVtcyB3aXRoaW4gdGhlIHNhbWUgY29udGFpbmVyCgkJCSkgewoKCQkJCXRoaXMuZGlyZWN0aW9uID0gaW50ZXJzZWN0aW9uID09IDEgPyAiZG93biIgOiAidXAiOwoKCQkJCWlmICh0aGlzLm9wdGlvbnMudG9sZXJhbmNlID09ICJwb2ludGVyIiB8fCB0aGlzLl9pbnRlcnNlY3RzV2l0aFNpZGVzKGl0ZW0pKSB7CgkJCQkJdGhpcy5fcmVhcnJhbmdlKGV2ZW50LCBpdGVtKTsKCQkJCX0gZWxzZSB7CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJdGhpcy5fdHJpZ2dlcigiY2hhbmdlIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCgpKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoKCQkvL1Bvc3QgZXZlbnRzIHRvIGNvbnRhaW5lcnMKCQl0aGlzLl9jb250YWN0Q29udGFpbmVycyhldmVudCk7CgoJCS8vSW50ZXJjb25uZWN0IHdpdGggZHJvcHBhYmxlcwoJCWlmKCQudWkuZGRtYW5hZ2VyKSAkLnVpLmRkbWFuYWdlci5kcmFnKHRoaXMsIGV2ZW50KTsKCgkJLy9DYWxsIGNhbGxiYWNrcwoJCXRoaXMuX3RyaWdnZXIoJ3NvcnQnLCBldmVudCwgdGhpcy5fdWlIYXNoKCkpOwoKCQl0aGlzLmxhc3RQb3NpdGlvbkFicyA9IHRoaXMucG9zaXRpb25BYnM7CgkJcmV0dXJuIGZhbHNlOwoKCX0sCgoJX21vdXNlU3RvcDogZnVuY3Rpb24oZXZlbnQsIG5vUHJvcGFnYXRpb24pIHsKCgkJaWYoIWV2ZW50KSByZXR1cm47CgoJCS8vSWYgd2UgYXJlIHVzaW5nIGRyb3BwYWJsZXMsIGluZm9ybSB0aGUgbWFuYWdlciBhYm91dCB0aGUgZHJvcAoJCWlmICgkLnVpLmRkbWFuYWdlciAmJiAhdGhpcy5vcHRpb25zLmRyb3BCZWhhdmlvdXIpCgkJCSQudWkuZGRtYW5hZ2VyLmRyb3AodGhpcywgZXZlbnQpOwoKCQlpZih0aGlzLm9wdGlvbnMucmV2ZXJ0KSB7CgkJCXZhciB0aGF0ID0gdGhpczsKCQkJdmFyIGN1ciA9IHRoaXMucGxhY2Vob2xkZXIub2Zmc2V0KCk7CgoJCQl0aGlzLnJldmVydGluZyA9IHRydWU7CgoJCQkkKHRoaXMuaGVscGVyKS5hbmltYXRlKHsKCQkJCWxlZnQ6IGN1ci5sZWZ0IC0gdGhpcy5vZmZzZXQucGFyZW50LmxlZnQgLSB0aGlzLm1hcmdpbnMubGVmdCArICh0aGlzLm9mZnNldFBhcmVudFswXSA9PSBkb2N1bWVudC5ib2R5ID8gMCA6IHRoaXMub2Zmc2V0UGFyZW50WzBdLnNjcm9sbExlZnQpLAoJCQkJdG9wOiBjdXIudG9wIC0gdGhpcy5vZmZzZXQucGFyZW50LnRvcCAtIHRoaXMubWFyZ2lucy50b3AgKyAodGhpcy5vZmZzZXRQYXJlbnRbMF0gPT0gZG9jdW1lbnQuYm9keSA/IDAgOiB0aGlzLm9mZnNldFBhcmVudFswXS5zY3JvbGxUb3ApCgkJCX0sIHBhcnNlSW50KHRoaXMub3B0aW9ucy5yZXZlcnQsIDEwKSB8fCA1MDAsIGZ1bmN0aW9uKCkgewoJCQkJdGhhdC5fY2xlYXIoZXZlbnQpOwoJCQl9KTsKCQl9IGVsc2UgewoJCQl0aGlzLl9jbGVhcihldmVudCwgbm9Qcm9wYWdhdGlvbik7CgkJfQoKCQlyZXR1cm4gZmFsc2U7CgoJfSwKCgljYW5jZWw6IGZ1bmN0aW9uKCkgewoKCQlpZih0aGlzLmRyYWdnaW5nKSB7CgoJCQl0aGlzLl9tb3VzZVVwKHsgdGFyZ2V0OiBudWxsIH0pOwoKCQkJaWYodGhpcy5vcHRpb25zLmhlbHBlciA9PSAib3JpZ2luYWwiKQoJCQkJdGhpcy5jdXJyZW50SXRlbS5jc3ModGhpcy5fc3RvcmVkQ1NTKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGVscGVyIik7CgkJCWVsc2UKCQkJCXRoaXMuY3VycmVudEl0ZW0uc2hvdygpOwoKCQkJLy9Qb3N0IGRlYWN0aXZhdGluZyBldmVudHMgdG8gY29udGFpbmVycwoJCQlmb3IgKHZhciBpID0gdGhpcy5jb250YWluZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXsKCQkJCXRoaXMuY29udGFpbmVyc1tpXS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsIG51bGwsIHRoaXMuX3VpSGFzaCh0aGlzKSk7CgkJCQlpZih0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUub3ZlcikgewoJCQkJCXRoaXMuY29udGFpbmVyc1tpXS5fdHJpZ2dlcigib3V0IiwgbnVsbCwgdGhpcy5fdWlIYXNoKHRoaXMpKTsKCQkJCQl0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUub3ZlciA9IDA7CgkJCQl9CgkJCX0KCgkJfQoKCQlpZiAodGhpcy5wbGFjZWhvbGRlcikgewoJCQkvLyQodGhpcy5wbGFjZWhvbGRlclswXSkucmVtb3ZlKCk7IHdvdWxkIGhhdmUgYmVlbiB0aGUgalF1ZXJ5IHdheSAtIHVuZm9ydHVuYXRlbHksIGl0IHVuYmluZHMgQUxMIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCBub2RlIQoJCQlpZih0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUpIHRoaXMucGxhY2Vob2xkZXJbMF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBsYWNlaG9sZGVyWzBdKTsKCQkJaWYodGhpcy5vcHRpb25zLmhlbHBlciAhPSAib3JpZ2luYWwiICYmIHRoaXMuaGVscGVyICYmIHRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGUpIHRoaXMuaGVscGVyLnJlbW92ZSgpOwoKCQkJJC5leHRlbmQodGhpcywgewoJCQkJaGVscGVyOiBudWxsLAoJCQkJZHJhZ2dpbmc6IGZhbHNlLAoJCQkJcmV2ZXJ0aW5nOiBmYWxzZSwKCQkJCV9ub0ZpbmFsU29ydDogbnVsbAoJCQl9KTsKCgkJCWlmKHRoaXMuZG9tUG9zaXRpb24ucHJldikgewoJCQkJJCh0aGlzLmRvbVBvc2l0aW9uLnByZXYpLmFmdGVyKHRoaXMuY3VycmVudEl0ZW0pOwoJCQl9IGVsc2UgewoJCQkJJCh0aGlzLmRvbVBvc2l0aW9uLnBhcmVudCkucHJlcGVuZCh0aGlzLmN1cnJlbnRJdGVtKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7CgoJfSwKCglzZXJpYWxpemU6IGZ1bmN0aW9uKG8pIHsKCgkJdmFyIGl0ZW1zID0gdGhpcy5fZ2V0SXRlbXNBc2pRdWVyeShvICYmIG8uY29ubmVjdGVkKTsKCQl2YXIgc3RyID0gW107IG8gPSBvIHx8IHt9OwoKCQkkKGl0ZW1zKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgcmVzID0gKCQoby5pdGVtIHx8IHRoaXMpLmF0dHIoby5hdHRyaWJ1dGUgfHwgJ2lkJykgfHwgJycpLm1hdGNoKG8uZXhwcmVzc2lvbiB8fCAoLyguKylbLT1fXSguKykvKSk7CgkJCWlmKHJlcykgc3RyLnB1c2goKG8ua2V5IHx8IHJlc1sxXSsnW10nKSsnPScrKG8ua2V5ICYmIG8uZXhwcmVzc2lvbiA/IHJlc1sxXSA6IHJlc1syXSkpOwoJCX0pOwoKCQlpZighc3RyLmxlbmd0aCAmJiBvLmtleSkgewoJCQlzdHIucHVzaChvLmtleSArICc9Jyk7CgkJfQoKCQlyZXR1cm4gc3RyLmpvaW4oJyYnKTsKCgl9LAoKCXRvQXJyYXk6IGZ1bmN0aW9uKG8pIHsKCgkJdmFyIGl0ZW1zID0gdGhpcy5fZ2V0SXRlbXNBc2pRdWVyeShvICYmIG8uY29ubmVjdGVkKTsKCQl2YXIgcmV0ID0gW107IG8gPSBvIHx8IHt9OwoKCQlpdGVtcy5lYWNoKGZ1bmN0aW9uKCkgeyByZXQucHVzaCgkKG8uaXRlbSB8fCB0aGlzKS5hdHRyKG8uYXR0cmlidXRlIHx8ICdpZCcpIHx8ICcnKTsgfSk7CgkJcmV0dXJuIHJldDsKCgl9LAoKCS8qIEJlIGNhcmVmdWwgd2l0aCB0aGUgZm9sbG93aW5nIGNvcmUgZnVuY3Rpb25zICovCglfaW50ZXJzZWN0c1dpdGg6IGZ1bmN0aW9uKGl0ZW0pIHsKCgkJdmFyIHgxID0gdGhpcy5wb3NpdGlvbkFicy5sZWZ0LAoJCQl4MiA9IHgxICsgdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCwKCQkJeTEgPSB0aGlzLnBvc2l0aW9uQWJzLnRvcCwKCQkJeTIgPSB5MSArIHRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0OwoKCQl2YXIgbCA9IGl0ZW0ubGVmdCwKCQkJciA9IGwgKyBpdGVtLndpZHRoLAoJCQl0ID0gaXRlbS50b3AsCgkJCWIgPSB0ICsgaXRlbS5oZWlnaHQ7CgoJCXZhciBkeUNsaWNrID0gdGhpcy5vZmZzZXQuY2xpY2sudG9wLAoJCQlkeENsaWNrID0gdGhpcy5vZmZzZXQuY2xpY2subGVmdDsKCgkJdmFyIGlzT3ZlckVsZW1lbnQgPSAoeTEgKyBkeUNsaWNrKSA+IHQgJiYgKHkxICsgZHlDbGljaykgPCBiICYmICh4MSArIGR4Q2xpY2spID4gbCAmJiAoeDEgKyBkeENsaWNrKSA8IHI7CgoJCWlmKAkgICB0aGlzLm9wdGlvbnMudG9sZXJhbmNlID09ICJwb2ludGVyIgoJCQl8fCB0aGlzLm9wdGlvbnMuZm9yY2VQb2ludGVyRm9yQ29udGFpbmVycwoJCQl8fCAodGhpcy5vcHRpb25zLnRvbGVyYW5jZSAhPSAicG9pbnRlciIgJiYgdGhpcy5oZWxwZXJQcm9wb3J0aW9uc1t0aGlzLmZsb2F0aW5nID8gJ3dpZHRoJyA6ICdoZWlnaHQnXSA+IGl0ZW1bdGhpcy5mbG9hdGluZyA/ICd3aWR0aCcgOiAnaGVpZ2h0J10pCgkJKSB7CgkJCXJldHVybiBpc092ZXJFbGVtZW50OwoJCX0gZWxzZSB7CgoJCQlyZXR1cm4gKGwgPCB4MSArICh0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoIC8gMikgLy8gUmlnaHQgSGFsZgoJCQkJJiYgeDIgLSAodGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCAvIDIpIDwgciAvLyBMZWZ0IEhhbGYKCQkJCSYmIHQgPCB5MSArICh0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCAvIDIpIC8vIEJvdHRvbSBIYWxmCgkJCQkmJiB5MiAtICh0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCAvIDIpIDwgYiApOyAvLyBUb3AgSGFsZgoKCQl9Cgl9LAoKCV9pbnRlcnNlY3RzV2l0aFBvaW50ZXI6IGZ1bmN0aW9uKGl0ZW0pIHsKCgkJdmFyIGlzT3ZlckVsZW1lbnRIZWlnaHQgPSAodGhpcy5vcHRpb25zLmF4aXMgPT09ICd4JykgfHwgJC51aS5pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMudG9wICsgdGhpcy5vZmZzZXQuY2xpY2sudG9wLCBpdGVtLnRvcCwgaXRlbS5oZWlnaHQpLAoJCQlpc092ZXJFbGVtZW50V2lkdGggPSAodGhpcy5vcHRpb25zLmF4aXMgPT09ICd5JykgfHwgJC51aS5pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMubGVmdCArIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQsIGl0ZW0ubGVmdCwgaXRlbS53aWR0aCksCgkJCWlzT3ZlckVsZW1lbnQgPSBpc092ZXJFbGVtZW50SGVpZ2h0ICYmIGlzT3ZlckVsZW1lbnRXaWR0aCwKCQkJdmVydGljYWxEaXJlY3Rpb24gPSB0aGlzLl9nZXREcmFnVmVydGljYWxEaXJlY3Rpb24oKSwKCQkJaG9yaXpvbnRhbERpcmVjdGlvbiA9IHRoaXMuX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uKCk7CgoJCWlmICghaXNPdmVyRWxlbWVudCkKCQkJcmV0dXJuIGZhbHNlOwoKCQlyZXR1cm4gdGhpcy5mbG9hdGluZyA/CgkJCSggKChob3Jpem9udGFsRGlyZWN0aW9uICYmIGhvcml6b250YWxEaXJlY3Rpb24gPT0gInJpZ2h0IikgfHwgdmVydGljYWxEaXJlY3Rpb24gPT0gImRvd24iKSA/IDIgOiAxICkKCQkJOiAoIHZlcnRpY2FsRGlyZWN0aW9uICYmICh2ZXJ0aWNhbERpcmVjdGlvbiA9PSAiZG93biIgPyAyIDogMSkgKTsKCgl9LAoKCV9pbnRlcnNlY3RzV2l0aFNpZGVzOiBmdW5jdGlvbihpdGVtKSB7CgoJCXZhciBpc092ZXJCb3R0b21IYWxmID0gJC51aS5pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMudG9wICsgdGhpcy5vZmZzZXQuY2xpY2sudG9wLCBpdGVtLnRvcCArIChpdGVtLmhlaWdodC8yKSwgaXRlbS5oZWlnaHQpLAoJCQlpc092ZXJSaWdodEhhbGYgPSAkLnVpLmlzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy5sZWZ0ICsgdGhpcy5vZmZzZXQuY2xpY2subGVmdCwgaXRlbS5sZWZ0ICsgKGl0ZW0ud2lkdGgvMiksIGl0ZW0ud2lkdGgpLAoJCQl2ZXJ0aWNhbERpcmVjdGlvbiA9IHRoaXMuX2dldERyYWdWZXJ0aWNhbERpcmVjdGlvbigpLAoJCQlob3Jpem9udGFsRGlyZWN0aW9uID0gdGhpcy5fZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb24oKTsKCgkJaWYgKHRoaXMuZmxvYXRpbmcgJiYgaG9yaXpvbnRhbERpcmVjdGlvbikgewoJCQlyZXR1cm4gKChob3Jpem9udGFsRGlyZWN0aW9uID09ICJyaWdodCIgJiYgaXNPdmVyUmlnaHRIYWxmKSB8fCAoaG9yaXpvbnRhbERpcmVjdGlvbiA9PSAibGVmdCIgJiYgIWlzT3ZlclJpZ2h0SGFsZikpOwoJCX0gZWxzZSB7CgkJCXJldHVybiB2ZXJ0aWNhbERpcmVjdGlvbiAmJiAoKHZlcnRpY2FsRGlyZWN0aW9uID09ICJkb3duIiAmJiBpc092ZXJCb3R0b21IYWxmKSB8fCAodmVydGljYWxEaXJlY3Rpb24gPT0gInVwIiAmJiAhaXNPdmVyQm90dG9tSGFsZikpOwoJCX0KCgl9LAoKCV9nZXREcmFnVmVydGljYWxEaXJlY3Rpb246IGZ1bmN0aW9uKCkgewoJCXZhciBkZWx0YSA9IHRoaXMucG9zaXRpb25BYnMudG9wIC0gdGhpcy5sYXN0UG9zaXRpb25BYnMudG9wOwoJCXJldHVybiBkZWx0YSAhPSAwICYmIChkZWx0YSA+IDAgPyAiZG93biIgOiAidXAiKTsKCX0sCgoJX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uOiBmdW5jdGlvbigpIHsKCQl2YXIgZGVsdGEgPSB0aGlzLnBvc2l0aW9uQWJzLmxlZnQgLSB0aGlzLmxhc3RQb3NpdGlvbkFicy5sZWZ0OwoJCXJldHVybiBkZWx0YSAhPSAwICYmIChkZWx0YSA+IDAgPyAicmlnaHQiIDogImxlZnQiKTsKCX0sCgoJcmVmcmVzaDogZnVuY3Rpb24oZXZlbnQpIHsKCQl0aGlzLl9yZWZyZXNoSXRlbXMoZXZlbnQpOwoJCXRoaXMucmVmcmVzaFBvc2l0aW9ucygpOwoJCXJldHVybiB0aGlzOwoJfSwKCglfY29ubmVjdFdpdGg6IGZ1bmN0aW9uKCkgewoJCXZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwoJCXJldHVybiBvcHRpb25zLmNvbm5lY3RXaXRoLmNvbnN0cnVjdG9yID09IFN0cmluZwoJCQk/IFtvcHRpb25zLmNvbm5lY3RXaXRoXQoJCQk6IG9wdGlvbnMuY29ubmVjdFdpdGg7Cgl9LAoKCV9nZXRJdGVtc0FzalF1ZXJ5OiBmdW5jdGlvbihjb25uZWN0ZWQpIHsKCgkJdmFyIGl0ZW1zID0gW107CgkJdmFyIHF1ZXJpZXMgPSBbXTsKCQl2YXIgY29ubmVjdFdpdGggPSB0aGlzLl9jb25uZWN0V2l0aCgpOwoKCQlpZihjb25uZWN0V2l0aCAmJiBjb25uZWN0ZWQpIHsKCQkJZm9yICh2YXIgaSA9IGNvbm5lY3RXaXRoLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXsKCQkJCXZhciBjdXIgPSAkKGNvbm5lY3RXaXRoW2ldKTsKCQkJCWZvciAodmFyIGogPSBjdXIubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pewoJCQkJCXZhciBpbnN0ID0gJC5kYXRhKGN1cltqXSwgdGhpcy53aWRnZXROYW1lKTsKCQkJCQlpZihpbnN0ICYmIGluc3QgIT0gdGhpcyAmJiAhaW5zdC5vcHRpb25zLmRpc2FibGVkKSB7CgkJCQkJCXF1ZXJpZXMucHVzaChbJC5pc0Z1bmN0aW9uKGluc3Qub3B0aW9ucy5pdGVtcykgPyBpbnN0Lm9wdGlvbnMuaXRlbXMuY2FsbChpbnN0LmVsZW1lbnQpIDogJChpbnN0Lm9wdGlvbnMuaXRlbXMsIGluc3QuZWxlbWVudCkubm90KCIudWktc29ydGFibGUtaGVscGVyIikubm90KCcudWktc29ydGFibGUtcGxhY2Vob2xkZXInKSwgaW5zdF0pOwoJCQkJCX0KCQkJCX07CgkJCX07CgkJfQoKCQlxdWVyaWVzLnB1c2goWyQuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMuaXRlbXMpID8gdGhpcy5vcHRpb25zLml0ZW1zLmNhbGwodGhpcy5lbGVtZW50LCBudWxsLCB7IG9wdGlvbnM6IHRoaXMub3B0aW9ucywgaXRlbTogdGhpcy5jdXJyZW50SXRlbSB9KSA6ICQodGhpcy5vcHRpb25zLml0ZW1zLCB0aGlzLmVsZW1lbnQpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpLm5vdCgnLnVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyJyksIHRoaXNdKTsKCgkJZm9yICh2YXIgaSA9IHF1ZXJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pewoJCQlxdWVyaWVzW2ldWzBdLmVhY2goZnVuY3Rpb24oKSB7CgkJCQlpdGVtcy5wdXNoKHRoaXMpOwoJCQl9KTsKCQl9OwoKCQlyZXR1cm4gJChpdGVtcyk7CgoJfSwKCglfcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXM6IGZ1bmN0aW9uKCkgewoKCQl2YXIgbGlzdCA9IHRoaXMuY3VycmVudEl0ZW0uZmluZCgiOmRhdGEoIiArIHRoaXMud2lkZ2V0TmFtZSArICItaXRlbSkiKTsKCgkJdGhpcy5pdGVtcyA9ICQuZ3JlcCh0aGlzLml0ZW1zLCBmdW5jdGlvbiAoaXRlbSkgewoJCQlmb3IgKHZhciBqPTA7IGogPCBsaXN0Lmxlbmd0aDsgaisrKSB7CgkJCQlpZihsaXN0W2pdID09IGl0ZW0uaXRlbVswXSkKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCX07CgkJCXJldHVybiB0cnVlOwoJCX0pOwoKCX0sCgoJX3JlZnJlc2hJdGVtczogZnVuY3Rpb24oZXZlbnQpIHsKCgkJdGhpcy5pdGVtcyA9IFtdOwoJCXRoaXMuY29udGFpbmVycyA9IFt0aGlzXTsKCQl2YXIgaXRlbXMgPSB0aGlzLml0ZW1zOwoJCXZhciBxdWVyaWVzID0gW1skLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLml0ZW1zKSA/IHRoaXMub3B0aW9ucy5pdGVtcy5jYWxsKHRoaXMuZWxlbWVudFswXSwgZXZlbnQsIHsgaXRlbTogdGhpcy5jdXJyZW50SXRlbSB9KSA6ICQodGhpcy5vcHRpb25zLml0ZW1zLCB0aGlzLmVsZW1lbnQpLCB0aGlzXV07CgkJdmFyIGNvbm5lY3RXaXRoID0gdGhpcy5fY29ubmVjdFdpdGgoKTsKCgkJaWYoY29ubmVjdFdpdGggJiYgdGhpcy5yZWFkeSkgeyAvL1Nob3VsZG4ndCBiZSBydW4gdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCBkdWUgdG8gbWFzc2l2ZSBzbG93LWRvd24KCQkJZm9yICh2YXIgaSA9IGNvbm5lY3RXaXRoLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXsKCQkJCXZhciBjdXIgPSAkKGNvbm5lY3RXaXRoW2ldKTsKCQkJCWZvciAodmFyIGogPSBjdXIubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pewoJCQkJCXZhciBpbnN0ID0gJC5kYXRhKGN1cltqXSwgdGhpcy53aWRnZXROYW1lKTsKCQkJCQlpZihpbnN0ICYmIGluc3QgIT0gdGhpcyAmJiAhaW5zdC5vcHRpb25zLmRpc2FibGVkKSB7CgkJCQkJCXF1ZXJpZXMucHVzaChbJC5pc0Z1bmN0aW9uKGluc3Qub3B0aW9ucy5pdGVtcykgPyBpbnN0Lm9wdGlvbnMuaXRlbXMuY2FsbChpbnN0LmVsZW1lbnRbMF0sIGV2ZW50LCB7IGl0ZW06IHRoaXMuY3VycmVudEl0ZW0gfSkgOiAkKGluc3Qub3B0aW9ucy5pdGVtcywgaW5zdC5lbGVtZW50KSwgaW5zdF0pOwoJCQkJCQl0aGlzLmNvbnRhaW5lcnMucHVzaChpbnN0KTsKCQkJCQl9CgkJCQl9OwoJCQl9OwoJCX0KCgkJZm9yICh2YXIgaSA9IHF1ZXJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJdmFyIHRhcmdldERhdGEgPSBxdWVyaWVzW2ldWzFdOwoJCQl2YXIgX3F1ZXJpZXMgPSBxdWVyaWVzW2ldWzBdOwoKCQkJZm9yICh2YXIgaj0wLCBxdWVyaWVzTGVuZ3RoID0gX3F1ZXJpZXMubGVuZ3RoOyBqIDwgcXVlcmllc0xlbmd0aDsgaisrKSB7CgkJCQl2YXIgaXRlbSA9ICQoX3F1ZXJpZXNbal0pOwoKCQkJCWl0ZW0uZGF0YSh0aGlzLndpZGdldE5hbWUgKyAnLWl0ZW0nLCB0YXJnZXREYXRhKTsgLy8gRGF0YSBmb3IgdGFyZ2V0IGNoZWNraW5nIChtb3VzZSBtYW5hZ2VyKQoKCQkJCWl0ZW1zLnB1c2goewoJCQkJCWl0ZW06IGl0ZW0sCgkJCQkJaW5zdGFuY2U6IHRhcmdldERhdGEsCgkJCQkJd2lkdGg6IDAsIGhlaWdodDogMCwKCQkJCQlsZWZ0OiAwLCB0b3A6IDAKCQkJCX0pOwoJCQl9OwoJCX07CgoJfSwKCglyZWZyZXNoUG9zaXRpb25zOiBmdW5jdGlvbihmYXN0KSB7CgoJCS8vVGhpcyBoYXMgdG8gYmUgcmVkb25lIGJlY2F1c2UgZHVlIHRvIHRoZSBpdGVtIGJlaW5nIG1vdmVkIG91dC9pbnRvIHRoZSBvZmZzZXRQYXJlbnQsIHRoZSBvZmZzZXRQYXJlbnQncyBwb3NpdGlvbiB3aWxsIGNoYW5nZQoJCWlmKHRoaXMub2Zmc2V0UGFyZW50ICYmIHRoaXMuaGVscGVyKSB7CgkJCXRoaXMub2Zmc2V0LnBhcmVudCA9IHRoaXMuX2dldFBhcmVudE9mZnNldCgpOwoJCX0KCgkJZm9yICh2YXIgaSA9IHRoaXMuaXRlbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pewoJCQl2YXIgaXRlbSA9IHRoaXMuaXRlbXNbaV07CgoJCQkvL1dlIGlnbm9yZSBjYWxjdWxhdGluZyBwb3NpdGlvbnMgb2YgYWxsIGNvbm5lY3RlZCBjb250YWluZXJzIHdoZW4gd2UncmUgbm90IG92ZXIgdGhlbQoJCQlpZihpdGVtLmluc3RhbmNlICE9IHRoaXMuY3VycmVudENvbnRhaW5lciAmJiB0aGlzLmN1cnJlbnRDb250YWluZXIgJiYgaXRlbS5pdGVtWzBdICE9IHRoaXMuY3VycmVudEl0ZW1bMF0pCgkJCQljb250aW51ZTsKCgkJCXZhciB0ID0gdGhpcy5vcHRpb25zLnRvbGVyYW5jZUVsZW1lbnQgPyAkKHRoaXMub3B0aW9ucy50b2xlcmFuY2VFbGVtZW50LCBpdGVtLml0ZW0pIDogaXRlbS5pdGVtOwoKCQkJaWYgKCFmYXN0KSB7CgkJCQlpdGVtLndpZHRoID0gdC5vdXRlcldpZHRoKCk7CgkJCQlpdGVtLmhlaWdodCA9IHQub3V0ZXJIZWlnaHQoKTsKCQkJfQoKCQkJdmFyIHAgPSB0Lm9mZnNldCgpOwoJCQlpdGVtLmxlZnQgPSBwLmxlZnQ7CgkJCWl0ZW0udG9wID0gcC50b3A7CgkJfTsKCgkJaWYodGhpcy5vcHRpb25zLmN1c3RvbSAmJiB0aGlzLm9wdGlvbnMuY3VzdG9tLnJlZnJlc2hDb250YWluZXJzKSB7CgkJCXRoaXMub3B0aW9ucy5jdXN0b20ucmVmcmVzaENvbnRhaW5lcnMuY2FsbCh0aGlzKTsKCQl9IGVsc2UgewoJCQlmb3IgKHZhciBpID0gdGhpcy5jb250YWluZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXsKCQkJCXZhciBwID0gdGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnQub2Zmc2V0KCk7CgkJCQl0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUubGVmdCA9IHAubGVmdDsKCQkJCXRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS50b3AgPSBwLnRvcDsKCQkJCXRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS53aWR0aAk9IHRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50Lm91dGVyV2lkdGgoKTsKCQkJCXRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS5oZWlnaHQgPSB0aGlzLmNvbnRhaW5lcnNbaV0uZWxlbWVudC5vdXRlckhlaWdodCgpOwoJCQl9OwoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCV9jcmVhdGVQbGFjZWhvbGRlcjogZnVuY3Rpb24odGhhdCkgewoJCXRoYXQgPSB0aGF0IHx8IHRoaXM7CgkJdmFyIG8gPSB0aGF0Lm9wdGlvbnM7CgoJCWlmKCFvLnBsYWNlaG9sZGVyIHx8IG8ucGxhY2Vob2xkZXIuY29uc3RydWN0b3IgPT0gU3RyaW5nKSB7CgkJCXZhciBjbGFzc05hbWUgPSBvLnBsYWNlaG9sZGVyOwoJCQlvLnBsYWNlaG9sZGVyID0gewoJCQkJZWxlbWVudDogZnVuY3Rpb24oKSB7CgoJCQkJCXZhciBlbCA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGF0LmN1cnJlbnRJdGVtWzBdLm5vZGVOYW1lKSkKCQkJCQkJLmFkZENsYXNzKGNsYXNzTmFtZSB8fCB0aGF0LmN1cnJlbnRJdGVtWzBdLmNsYXNzTmFtZSsiIHVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIikKCQkJCQkJLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKVswXTsKCgkJCQkJaWYoIWNsYXNzTmFtZSkKCQkJCQkJZWwuc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOwoKCQkJCQlyZXR1cm4gZWw7CgkJCQl9LAoJCQkJdXBkYXRlOiBmdW5jdGlvbihjb250YWluZXIsIHApIHsKCgkJCQkJLy8gMS4gSWYgYSBjbGFzc05hbWUgaXMgc2V0IGFzICdwbGFjZWhvbGRlciBvcHRpb24sIHdlIGRvbid0IGZvcmNlIHNpemVzIC0gdGhlIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciB0aGF0CgkJCQkJLy8gMi4gVGhlIG9wdGlvbiAnZm9yY2VQbGFjZWhvbGRlclNpemUgY2FuIGJlIGVuYWJsZWQgdG8gZm9yY2UgaXQgZXZlbiBpZiBhIGNsYXNzIG5hbWUgaXMgc3BlY2lmaWVkCgkJCQkJaWYoY2xhc3NOYW1lICYmICFvLmZvcmNlUGxhY2Vob2xkZXJTaXplKSByZXR1cm47CgoJCQkJCS8vSWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGEgYWN0dWFsIGhlaWdodCBieSBpdHNlbGYgKHdpdGhvdXQgc3R5bGVzIGNvbWluZyBmcm9tIGEgc3R5bGVzaGVldCksIGl0IHJlY2VpdmVzIHRoZSBpbmxpbmUgaGVpZ2h0IGZyb20gdGhlIGRyYWdnZWQgaXRlbQoJCQkJCWlmKCFwLmhlaWdodCgpKSB7IHAuaGVpZ2h0KHRoYXQuY3VycmVudEl0ZW0uaW5uZXJIZWlnaHQoKSAtIHBhcnNlSW50KHRoYXQuY3VycmVudEl0ZW0uY3NzKCdwYWRkaW5nVG9wJyl8fDAsIDEwKSAtIHBhcnNlSW50KHRoYXQuY3VycmVudEl0ZW0uY3NzKCdwYWRkaW5nQm90dG9tJyl8fDAsIDEwKSk7IH07CgkJCQkJaWYoIXAud2lkdGgoKSkgeyBwLndpZHRoKHRoYXQuY3VycmVudEl0ZW0uaW5uZXJXaWR0aCgpIC0gcGFyc2VJbnQodGhhdC5jdXJyZW50SXRlbS5jc3MoJ3BhZGRpbmdMZWZ0Jyl8fDAsIDEwKSAtIHBhcnNlSW50KHRoYXQuY3VycmVudEl0ZW0uY3NzKCdwYWRkaW5nUmlnaHQnKXx8MCwgMTApKTsgfTsKCQkJCX0KCQkJfTsKCQl9CgoJCS8vQ3JlYXRlIHRoZSBwbGFjZWhvbGRlcgoJCXRoYXQucGxhY2Vob2xkZXIgPSAkKG8ucGxhY2Vob2xkZXIuZWxlbWVudC5jYWxsKHRoYXQuZWxlbWVudCwgdGhhdC5jdXJyZW50SXRlbSkpOwoKCQkvL0FwcGVuZCBpdCBhZnRlciB0aGUgYWN0dWFsIGN1cnJlbnQgaXRlbQoJCXRoYXQuY3VycmVudEl0ZW0uYWZ0ZXIodGhhdC5wbGFjZWhvbGRlcik7CgoJCS8vVXBkYXRlIHRoZSBzaXplIG9mIHRoZSBwbGFjZWhvbGRlciAoVE9ETzogTG9naWMgdG8gZnV6enksIHNlZSBsaW5lIDMxNi8zMTcpCgkJby5wbGFjZWhvbGRlci51cGRhdGUodGhhdCwgdGhhdC5wbGFjZWhvbGRlcik7CgoJfSwKCglfY29udGFjdENvbnRhaW5lcnM6IGZ1bmN0aW9uKGV2ZW50KSB7CgoJCS8vIGdldCBpbm5lcm1vc3QgY29udGFpbmVyIHRoYXQgaW50ZXJzZWN0cyB3aXRoIGl0ZW0KCQl2YXIgaW5uZXJtb3N0Q29udGFpbmVyID0gbnVsbCwgaW5uZXJtb3N0SW5kZXggPSBudWxsOwoKCgkJZm9yICh2YXIgaSA9IHRoaXMuY29udGFpbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7CgoJCQkvLyBuZXZlciBjb25zaWRlciBhIGNvbnRhaW5lciB0aGF0J3MgbG9jYXRlZCB3aXRoaW4gdGhlIGl0ZW0gaXRzZWxmCgkJCWlmKCQuY29udGFpbnModGhpcy5jdXJyZW50SXRlbVswXSwgdGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnRbMF0pKQoJCQkJY29udGludWU7CgoJCQlpZih0aGlzLl9pbnRlcnNlY3RzV2l0aCh0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUpKSB7CgoJCQkJLy8gaWYgd2UndmUgYWxyZWFkeSBmb3VuZCBhIGNvbnRhaW5lciBhbmQgaXQncyBtb3JlICJpbm5lciIgdGhhbiB0aGlzLCB0aGVuIGNvbnRpbnVlCgkJCQlpZihpbm5lcm1vc3RDb250YWluZXIgJiYgJC5jb250YWlucyh0aGlzLmNvbnRhaW5lcnNbaV0uZWxlbWVudFswXSwgaW5uZXJtb3N0Q29udGFpbmVyLmVsZW1lbnRbMF0pKQoJCQkJCWNvbnRpbnVlOwoKCQkJCWlubmVybW9zdENvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyc1tpXTsKCQkJCWlubmVybW9zdEluZGV4ID0gaTsKCgkJCX0gZWxzZSB7CgkJCQkvLyBjb250YWluZXIgZG9lc24ndCBpbnRlcnNlY3QuIHRyaWdnZXIgIm91dCIgZXZlbnQgaWYgbmVjZXNzYXJ5CgkJCQlpZih0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUub3ZlcikgewoJCQkJCXRoaXMuY29udGFpbmVyc1tpXS5fdHJpZ2dlcigib3V0IiwgZXZlbnQsIHRoaXMuX3VpSGFzaCh0aGlzKSk7CgkJCQkJdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLm92ZXIgPSAwOwoJCQkJfQoJCQl9CgoJCX0KCgkJLy8gaWYgbm8gaW50ZXJzZWN0aW5nIGNvbnRhaW5lcnMgZm91bmQsIHJldHVybgoJCWlmKCFpbm5lcm1vc3RDb250YWluZXIpIHJldHVybjsKCgkJLy8gbW92ZSB0aGUgaXRlbSBpbnRvIHRoZSBjb250YWluZXIgaWYgaXQncyBub3QgdGhlcmUgYWxyZWFkeQoJCWlmKHRoaXMuY29udGFpbmVycy5sZW5ndGggPT09IDEpIHsKCQkJdGhpcy5jb250YWluZXJzW2lubmVybW9zdEluZGV4XS5fdHJpZ2dlcigib3ZlciIsIGV2ZW50LCB0aGlzLl91aUhhc2godGhpcykpOwoJCQl0aGlzLmNvbnRhaW5lcnNbaW5uZXJtb3N0SW5kZXhdLmNvbnRhaW5lckNhY2hlLm92ZXIgPSAxOwoJCX0gZWxzZSB7CgoJCQkvL1doZW4gZW50ZXJpbmcgYSBuZXcgY29udGFpbmVyLCB3ZSB3aWxsIGZpbmQgdGhlIGl0ZW0gd2l0aCB0aGUgbGVhc3QgZGlzdGFuY2UgYW5kIGFwcGVuZCBvdXIgaXRlbSBuZWFyIGl0CgkJCXZhciBkaXN0ID0gMTAwMDA7IHZhciBpdGVtV2l0aExlYXN0RGlzdGFuY2UgPSBudWxsOwoJCQl2YXIgcG9zUHJvcGVydHkgPSB0aGlzLmNvbnRhaW5lcnNbaW5uZXJtb3N0SW5kZXhdLmZsb2F0aW5nID8gJ2xlZnQnIDogJ3RvcCc7CgkJCXZhciBzaXplUHJvcGVydHkgPSB0aGlzLmNvbnRhaW5lcnNbaW5uZXJtb3N0SW5kZXhdLmZsb2F0aW5nID8gJ3dpZHRoJyA6ICdoZWlnaHQnOwoJCQl2YXIgYmFzZSA9IHRoaXMucG9zaXRpb25BYnNbcG9zUHJvcGVydHldICsgdGhpcy5vZmZzZXQuY2xpY2tbcG9zUHJvcGVydHldOwoJCQlmb3IgKHZhciBqID0gdGhpcy5pdGVtcy5sZW5ndGggLSAxOyBqID49IDA7IGotLSkgewoJCQkJaWYoISQuY29udGFpbnModGhpcy5jb250YWluZXJzW2lubmVybW9zdEluZGV4XS5lbGVtZW50WzBdLCB0aGlzLml0ZW1zW2pdLml0ZW1bMF0pKSBjb250aW51ZTsKCQkJCWlmKHRoaXMuaXRlbXNbal0uaXRlbVswXSA9PSB0aGlzLmN1cnJlbnRJdGVtWzBdKSBjb250aW51ZTsKCQkJCXZhciBjdXIgPSB0aGlzLml0ZW1zW2pdLml0ZW0ub2Zmc2V0KClbcG9zUHJvcGVydHldOwoJCQkJdmFyIG5lYXJCb3R0b20gPSBmYWxzZTsKCQkJCWlmKE1hdGguYWJzKGN1ciAtIGJhc2UpID4gTWF0aC5hYnMoY3VyICsgdGhpcy5pdGVtc1tqXVtzaXplUHJvcGVydHldIC0gYmFzZSkpewoJCQkJCW5lYXJCb3R0b20gPSB0cnVlOwoJCQkJCWN1ciArPSB0aGlzLml0ZW1zW2pdW3NpemVQcm9wZXJ0eV07CgkJCQl9CgoJCQkJaWYoTWF0aC5hYnMoY3VyIC0gYmFzZSkgPCBkaXN0KSB7CgkJCQkJZGlzdCA9IE1hdGguYWJzKGN1ciAtIGJhc2UpOyBpdGVtV2l0aExlYXN0RGlzdGFuY2UgPSB0aGlzLml0ZW1zW2pdOwoJCQkJCXRoaXMuZGlyZWN0aW9uID0gbmVhckJvdHRvbSA/ICJ1cCI6ICJkb3duIjsKCQkJCX0KCQkJfQoKCQkJaWYoIWl0ZW1XaXRoTGVhc3REaXN0YW5jZSAmJiAhdGhpcy5vcHRpb25zLmRyb3BPbkVtcHR5KSAvL0NoZWNrIGlmIGRyb3BPbkVtcHR5IGlzIGVuYWJsZWQKCQkJCXJldHVybjsKCgkJCXRoaXMuY3VycmVudENvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyc1tpbm5lcm1vc3RJbmRleF07CgkJCWl0ZW1XaXRoTGVhc3REaXN0YW5jZSA/IHRoaXMuX3JlYXJyYW5nZShldmVudCwgaXRlbVdpdGhMZWFzdERpc3RhbmNlLCBudWxsLCB0cnVlKSA6IHRoaXMuX3JlYXJyYW5nZShldmVudCwgbnVsbCwgdGhpcy5jb250YWluZXJzW2lubmVybW9zdEluZGV4XS5lbGVtZW50LCB0cnVlKTsKCQkJdGhpcy5fdHJpZ2dlcigiY2hhbmdlIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCgpKTsKCQkJdGhpcy5jb250YWluZXJzW2lubmVybW9zdEluZGV4XS5fdHJpZ2dlcigiY2hhbmdlIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCh0aGlzKSk7CgoJCQkvL1VwZGF0ZSB0aGUgcGxhY2Vob2xkZXIKCQkJdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyLnVwZGF0ZSh0aGlzLmN1cnJlbnRDb250YWluZXIsIHRoaXMucGxhY2Vob2xkZXIpOwoKCQkJdGhpcy5jb250YWluZXJzW2lubmVybW9zdEluZGV4XS5fdHJpZ2dlcigib3ZlciIsIGV2ZW50LCB0aGlzLl91aUhhc2godGhpcykpOwoJCQl0aGlzLmNvbnRhaW5lcnNbaW5uZXJtb3N0SW5kZXhdLmNvbnRhaW5lckNhY2hlLm92ZXIgPSAxOwoJCX0KCgoJfSwKCglfY3JlYXRlSGVscGVyOiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgbyA9IHRoaXMub3B0aW9uczsKCQl2YXIgaGVscGVyID0gJC5pc0Z1bmN0aW9uKG8uaGVscGVyKSA/ICQoby5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLCBbZXZlbnQsIHRoaXMuY3VycmVudEl0ZW1dKSkgOiAoby5oZWxwZXIgPT0gJ2Nsb25lJyA/IHRoaXMuY3VycmVudEl0ZW0uY2xvbmUoKSA6IHRoaXMuY3VycmVudEl0ZW0pOwoKCQlpZighaGVscGVyLnBhcmVudHMoJ2JvZHknKS5sZW5ndGgpIC8vQWRkIHRoZSBoZWxwZXIgdG8gdGhlIERPTSBpZiB0aGF0IGRpZG4ndCBoYXBwZW4gYWxyZWFkeQoJCQkkKG8uYXBwZW5kVG8gIT0gJ3BhcmVudCcgPyBvLmFwcGVuZFRvIDogdGhpcy5jdXJyZW50SXRlbVswXS5wYXJlbnROb2RlKVswXS5hcHBlbmRDaGlsZChoZWxwZXJbMF0pOwoKCQlpZihoZWxwZXJbMF0gPT0gdGhpcy5jdXJyZW50SXRlbVswXSkKCQkJdGhpcy5fc3RvcmVkQ1NTID0geyB3aWR0aDogdGhpcy5jdXJyZW50SXRlbVswXS5zdHlsZS53aWR0aCwgaGVpZ2h0OiB0aGlzLmN1cnJlbnRJdGVtWzBdLnN0eWxlLmhlaWdodCwgcG9zaXRpb246IHRoaXMuY3VycmVudEl0ZW0uY3NzKCJwb3NpdGlvbiIpLCB0b3A6IHRoaXMuY3VycmVudEl0ZW0uY3NzKCJ0b3AiKSwgbGVmdDogdGhpcy5jdXJyZW50SXRlbS5jc3MoImxlZnQiKSB9OwoKCQlpZihoZWxwZXJbMF0uc3R5bGUud2lkdGggPT0gJycgfHwgby5mb3JjZUhlbHBlclNpemUpIGhlbHBlci53aWR0aCh0aGlzLmN1cnJlbnRJdGVtLndpZHRoKCkpOwoJCWlmKGhlbHBlclswXS5zdHlsZS5oZWlnaHQgPT0gJycgfHwgby5mb3JjZUhlbHBlclNpemUpIGhlbHBlci5oZWlnaHQodGhpcy5jdXJyZW50SXRlbS5oZWlnaHQoKSk7CgoJCXJldHVybiBoZWxwZXI7CgoJfSwKCglfYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcjogZnVuY3Rpb24ob2JqKSB7CgkJaWYgKHR5cGVvZiBvYmogPT0gJ3N0cmluZycpIHsKCQkJb2JqID0gb2JqLnNwbGl0KCcgJyk7CgkJfQoJCWlmICgkLmlzQXJyYXkob2JqKSkgewoJCQlvYmogPSB7bGVmdDogK29ialswXSwgdG9wOiArb2JqWzFdIHx8IDB9OwoJCX0KCQlpZiAoJ2xlZnQnIGluIG9iaikgewoJCQl0aGlzLm9mZnNldC5jbGljay5sZWZ0ID0gb2JqLmxlZnQgKyB0aGlzLm1hcmdpbnMubGVmdDsKCQl9CgkJaWYgKCdyaWdodCcgaW4gb2JqKSB7CgkJCXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPSB0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoIC0gb2JqLnJpZ2h0ICsgdGhpcy5tYXJnaW5zLmxlZnQ7CgkJfQoJCWlmICgndG9wJyBpbiBvYmopIHsKCQkJdGhpcy5vZmZzZXQuY2xpY2sudG9wID0gb2JqLnRvcCArIHRoaXMubWFyZ2lucy50b3A7CgkJfQoJCWlmICgnYm90dG9tJyBpbiBvYmopIHsKCQkJdGhpcy5vZmZzZXQuY2xpY2sudG9wID0gdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQgLSBvYmouYm90dG9tICsgdGhpcy5tYXJnaW5zLnRvcDsKCQl9Cgl9LAoKCV9nZXRQYXJlbnRPZmZzZXQ6IGZ1bmN0aW9uKCkgewoKCgkJLy9HZXQgdGhlIG9mZnNldFBhcmVudCBhbmQgY2FjaGUgaXRzIHBvc2l0aW9uCgkJdGhpcy5vZmZzZXRQYXJlbnQgPSB0aGlzLmhlbHBlci5vZmZzZXRQYXJlbnQoKTsKCQl2YXIgcG8gPSB0aGlzLm9mZnNldFBhcmVudC5vZmZzZXQoKTsKCgkJLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB3aGVyZSB3ZSBuZWVkIHRvIG1vZGlmeSBhIG9mZnNldCBjYWxjdWxhdGVkIG9uIHN0YXJ0LCBzaW5jZSB0aGUgZm9sbG93aW5nIGhhcHBlbmVkOgoJCS8vIDEuIFRoZSBwb3NpdGlvbiBvZiB0aGUgaGVscGVyIGlzIGFic29sdXRlLCBzbyBpdCdzIHBvc2l0aW9uIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIG5leHQgcG9zaXRpb25lZCBwYXJlbnQKCQkvLyAyLiBUaGUgYWN0dWFsIG9mZnNldCBwYXJlbnQgaXMgYSBjaGlsZCBvZiB0aGUgc2Nyb2xsIHBhcmVudCwgYW5kIHRoZSBzY3JvbGwgcGFyZW50IGlzbid0IHRoZSBkb2N1bWVudCwgd2hpY2ggbWVhbnMgdGhhdAoJCS8vICAgIHRoZSBzY3JvbGwgaXMgaW5jbHVkZWQgaW4gdGhlIGluaXRpYWwgY2FsY3VsYXRpb24gb2YgdGhlIG9mZnNldCBvZiB0aGUgcGFyZW50LCBhbmQgbmV2ZXIgcmVjYWxjdWxhdGVkIHVwb24gZHJhZwoJCWlmKHRoaXMuY3NzUG9zaXRpb24gPT0gJ2Fic29sdXRlJyAmJiB0aGlzLnNjcm9sbFBhcmVudFswXSAhPSBkb2N1bWVudCAmJiAkLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLCB0aGlzLm9mZnNldFBhcmVudFswXSkpIHsKCQkJcG8ubGVmdCArPSB0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk7CgkJCXBvLnRvcCArPSB0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTsKCQl9CgoJCWlmKCh0aGlzLm9mZnNldFBhcmVudFswXSA9PSBkb2N1bWVudC5ib2R5KSAvL1RoaXMgbmVlZHMgdG8gYmUgYWN0dWFsbHkgZG9uZSBmb3IgYWxsIGJyb3dzZXJzLCBzaW5jZSBwYWdlWC9wYWdlWSBpbmNsdWRlcyB0aGlzIGluZm9ybWF0aW9uCgkJfHwgKHRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUgJiYgdGhpcy5vZmZzZXRQYXJlbnRbMF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICdodG1sJyAmJiAkLnVpLmllKSkgLy9VZ2x5IElFIGZpeAoJCQlwbyA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07CgoJCXJldHVybiB7CgkJCXRvcDogcG8udG9wICsgKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCkgfHwgMCksCgkJCWxlZnQ6IHBvLmxlZnQgKyAocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCkgfHwgMCkKCQl9OwoKCX0sCgoJX2dldFJlbGF0aXZlT2Zmc2V0OiBmdW5jdGlvbigpIHsKCgkJaWYodGhpcy5jc3NQb3NpdGlvbiA9PSAicmVsYXRpdmUiKSB7CgkJCXZhciBwID0gdGhpcy5jdXJyZW50SXRlbS5wb3NpdGlvbigpOwoJCQlyZXR1cm4gewoJCQkJdG9wOiBwLnRvcCAtIChwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoInRvcCIpLDEwKSB8fCAwKSArIHRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpLAoJCQkJbGVmdDogcC5sZWZ0IC0gKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygibGVmdCIpLDEwKSB8fCAwKSArIHRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKQoJCQl9OwoJCX0gZWxzZSB7CgkJCXJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9OwoJCX0KCgl9LAoKCV9jYWNoZU1hcmdpbnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMubWFyZ2lucyA9IHsKCQkJbGVmdDogKHBhcnNlSW50KHRoaXMuY3VycmVudEl0ZW0uY3NzKCJtYXJnaW5MZWZ0IiksMTApIHx8IDApLAoJCQl0b3A6IChwYXJzZUludCh0aGlzLmN1cnJlbnRJdGVtLmNzcygibWFyZ2luVG9wIiksMTApIHx8IDApCgkJfTsKCX0sCgoJX2NhY2hlSGVscGVyUHJvcG9ydGlvbnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaGVscGVyUHJvcG9ydGlvbnMgPSB7CgkJCXdpZHRoOiB0aGlzLmhlbHBlci5vdXRlcldpZHRoKCksCgkJCWhlaWdodDogdGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKQoJCX07Cgl9LAoKCV9zZXRDb250YWlubWVudDogZnVuY3Rpb24oKSB7CgoJCXZhciBvID0gdGhpcy5vcHRpb25zOwoJCWlmKG8uY29udGFpbm1lbnQgPT0gJ3BhcmVudCcpIG8uY29udGFpbm1lbnQgPSB0aGlzLmhlbHBlclswXS5wYXJlbnROb2RlOwoJCWlmKG8uY29udGFpbm1lbnQgPT0gJ2RvY3VtZW50JyB8fCBvLmNvbnRhaW5tZW50ID09ICd3aW5kb3cnKSB0aGlzLmNvbnRhaW5tZW50ID0gWwoJCQkwIC0gdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdCAtIHRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0LAoJCQkwIC0gdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wIC0gdGhpcy5vZmZzZXQucGFyZW50LnRvcCwKCQkJJChvLmNvbnRhaW5tZW50ID09ICdkb2N1bWVudCcgPyBkb2N1bWVudCA6IHdpbmRvdykud2lkdGgoKSAtIHRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGggLSB0aGlzLm1hcmdpbnMubGVmdCwKCQkJKCQoby5jb250YWlubWVudCA9PSAnZG9jdW1lbnQnID8gZG9jdW1lbnQgOiB3aW5kb3cpLmhlaWdodCgpIHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpIC0gdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQgLSB0aGlzLm1hcmdpbnMudG9wCgkJXTsKCgkJaWYoISgvXihkb2N1bWVudHx3aW5kb3d8cGFyZW50KSQvKS50ZXN0KG8uY29udGFpbm1lbnQpKSB7CgkJCXZhciBjZSA9ICQoby5jb250YWlubWVudClbMF07CgkJCXZhciBjbyA9ICQoby5jb250YWlubWVudCkub2Zmc2V0KCk7CgkJCXZhciBvdmVyID0gKCQoY2UpLmNzcygib3ZlcmZsb3ciKSAhPSAnaGlkZGVuJyk7CgoJCQl0aGlzLmNvbnRhaW5tZW50ID0gWwoJCQkJY28ubGVmdCArIChwYXJzZUludCgkKGNlKS5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKSB8fCAwKSArIChwYXJzZUludCgkKGNlKS5jc3MoInBhZGRpbmdMZWZ0IiksMTApIHx8IDApIC0gdGhpcy5tYXJnaW5zLmxlZnQsCgkJCQljby50b3AgKyAocGFyc2VJbnQoJChjZSkuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKSB8fCAwKSArIChwYXJzZUludCgkKGNlKS5jc3MoInBhZGRpbmdUb3AiKSwxMCkgfHwgMCkgLSB0aGlzLm1hcmdpbnMudG9wLAoJCQkJY28ubGVmdCsob3ZlciA/IE1hdGgubWF4KGNlLnNjcm9sbFdpZHRoLGNlLm9mZnNldFdpZHRoKSA6IGNlLm9mZnNldFdpZHRoKSAtIChwYXJzZUludCgkKGNlKS5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKSB8fCAwKSAtIChwYXJzZUludCgkKGNlKS5jc3MoInBhZGRpbmdSaWdodCIpLDEwKSB8fCAwKSAtIHRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGggLSB0aGlzLm1hcmdpbnMubGVmdCwKCQkJCWNvLnRvcCsob3ZlciA/IE1hdGgubWF4KGNlLnNjcm9sbEhlaWdodCxjZS5vZmZzZXRIZWlnaHQpIDogY2Uub2Zmc2V0SGVpZ2h0KSAtIChwYXJzZUludCgkKGNlKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApIHx8IDApIC0gKHBhcnNlSW50KCQoY2UpLmNzcygicGFkZGluZ0JvdHRvbSIpLDEwKSB8fCAwKSAtIHRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0IC0gdGhpcy5tYXJnaW5zLnRvcAoJCQldOwoJCX0KCgl9LAoKCV9jb252ZXJ0UG9zaXRpb25UbzogZnVuY3Rpb24oZCwgcG9zKSB7CgoJCWlmKCFwb3MpIHBvcyA9IHRoaXMucG9zaXRpb247CgkJdmFyIG1vZCA9IGQgPT0gImFic29sdXRlIiA/IDEgOiAtMTsKCQl2YXIgbyA9IHRoaXMub3B0aW9ucywgc2Nyb2xsID0gdGhpcy5jc3NQb3NpdGlvbiA9PSAnYWJzb2x1dGUnICYmICEodGhpcy5zY3JvbGxQYXJlbnRbMF0gIT0gZG9jdW1lbnQgJiYgJC5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSwgdGhpcy5vZmZzZXRQYXJlbnRbMF0pKSA/IHRoaXMub2Zmc2V0UGFyZW50IDogdGhpcy5zY3JvbGxQYXJlbnQsIHNjcm9sbElzUm9vdE5vZGUgPSAoLyhodG1sfGJvZHkpL2kpLnRlc3Qoc2Nyb2xsWzBdLnRhZ05hbWUpOwoKCQlyZXR1cm4gewoJCQl0b3A6ICgKCQkJCXBvcy50b3AJCQkJCQkJCQkJCQkJCQkJCS8vIFRoZSBhYnNvbHV0ZSBtb3VzZSBwb3NpdGlvbgoJCQkJKyB0aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AgKiBtb2QJCQkJCQkJCQkJLy8gT25seSBmb3IgcmVsYXRpdmUgcG9zaXRpb25lZCBub2RlczogUmVsYXRpdmUgb2Zmc2V0IGZyb20gZWxlbWVudCB0byBvZmZzZXQgcGFyZW50CgkJCQkrIHRoaXMub2Zmc2V0LnBhcmVudC50b3AgKiBtb2QJCQkJCQkJCQkJCS8vIFRoZSBvZmZzZXRQYXJlbnQncyBvZmZzZXQgd2l0aG91dCBib3JkZXJzIChvZmZzZXQgKyBib3JkZXIpCgkJCQktICggKCB0aGlzLmNzc1Bvc2l0aW9uID09ICdmaXhlZCcgPyAtdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCkgOiAoIHNjcm9sbElzUm9vdE5vZGUgPyAwIDogc2Nyb2xsLnNjcm9sbFRvcCgpICkgKSAqIG1vZCkKCQkJKSwKCQkJbGVmdDogKAoJCQkJcG9zLmxlZnQJCQkJCQkJCQkJCQkJCQkJLy8gVGhlIGFic29sdXRlIG1vdXNlIHBvc2l0aW9uCgkJCQkrIHRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQgKiBtb2QJCQkJCQkJCQkJLy8gT25seSBmb3IgcmVsYXRpdmUgcG9zaXRpb25lZCBub2RlczogUmVsYXRpdmUgb2Zmc2V0IGZyb20gZWxlbWVudCB0byBvZmZzZXQgcGFyZW50CgkJCQkrIHRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0ICogbW9kCQkJCQkJCQkJCQkvLyBUaGUgb2Zmc2V0UGFyZW50J3Mgb2Zmc2V0IHdpdGhvdXQgYm9yZGVycyAob2Zmc2V0ICsgYm9yZGVyKQoJCQkJLSAoICggdGhpcy5jc3NQb3NpdGlvbiA9PSAnZml4ZWQnID8gLXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSA6IHNjcm9sbElzUm9vdE5vZGUgPyAwIDogc2Nyb2xsLnNjcm9sbExlZnQoKSApICogbW9kKQoJCQkpCgkJfTsKCgl9LAoKCV9nZW5lcmF0ZVBvc2l0aW9uOiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgbyA9IHRoaXMub3B0aW9ucywgc2Nyb2xsID0gdGhpcy5jc3NQb3NpdGlvbiA9PSAnYWJzb2x1dGUnICYmICEodGhpcy5zY3JvbGxQYXJlbnRbMF0gIT0gZG9jdW1lbnQgJiYgJC5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSwgdGhpcy5vZmZzZXRQYXJlbnRbMF0pKSA/IHRoaXMub2Zmc2V0UGFyZW50IDogdGhpcy5zY3JvbGxQYXJlbnQsIHNjcm9sbElzUm9vdE5vZGUgPSAoLyhodG1sfGJvZHkpL2kpLnRlc3Qoc2Nyb2xsWzBdLnRhZ05hbWUpOwoKCQkvLyBUaGlzIGlzIGFub3RoZXIgdmVyeSB3ZWlyZCBzcGVjaWFsIGNhc2UgdGhhdCBvbmx5IGhhcHBlbnMgZm9yIHJlbGF0aXZlIGVsZW1lbnRzOgoJCS8vIDEuIElmIHRoZSBjc3MgcG9zaXRpb24gaXMgcmVsYXRpdmUKCQkvLyAyLiBhbmQgdGhlIHNjcm9sbCBwYXJlbnQgaXMgdGhlIGRvY3VtZW50IG9yIHNpbWlsYXIgdG8gdGhlIG9mZnNldCBwYXJlbnQKCQkvLyB3ZSBoYXZlIHRvIHJlZnJlc2ggdGhlIHJlbGF0aXZlIG9mZnNldCBkdXJpbmcgdGhlIHNjcm9sbCBzbyB0aGVyZSBhcmUgbm8ganVtcHMKCQlpZih0aGlzLmNzc1Bvc2l0aW9uID09ICdyZWxhdGl2ZScgJiYgISh0aGlzLnNjcm9sbFBhcmVudFswXSAhPSBkb2N1bWVudCAmJiB0aGlzLnNjcm9sbFBhcmVudFswXSAhPSB0aGlzLm9mZnNldFBhcmVudFswXSkpIHsKCQkJdGhpcy5vZmZzZXQucmVsYXRpdmUgPSB0aGlzLl9nZXRSZWxhdGl2ZU9mZnNldCgpOwoJCX0KCgkJdmFyIHBhZ2VYID0gZXZlbnQucGFnZVg7CgkJdmFyIHBhZ2VZID0gZXZlbnQucGFnZVk7CgoJCS8qCgkJICogLSBQb3NpdGlvbiBjb25zdHJhaW5pbmcgLQoJCSAqIENvbnN0cmFpbiB0aGUgcG9zaXRpb24gdG8gYSBtaXggb2YgZ3JpZCwgY29udGFpbm1lbnQuCgkJICovCgoJCWlmKHRoaXMub3JpZ2luYWxQb3NpdGlvbikgeyAvL0lmIHdlIGFyZSBub3QgZHJhZ2dpbmcgeWV0LCB3ZSB3b24ndCBjaGVjayBmb3Igb3B0aW9ucwoKCQkJaWYodGhpcy5jb250YWlubWVudCkgewoJCQkJaWYoZXZlbnQucGFnZVggLSB0aGlzLm9mZnNldC5jbGljay5sZWZ0IDwgdGhpcy5jb250YWlubWVudFswXSkgcGFnZVggPSB0aGlzLmNvbnRhaW5tZW50WzBdICsgdGhpcy5vZmZzZXQuY2xpY2subGVmdDsKCQkJCWlmKGV2ZW50LnBhZ2VZIC0gdGhpcy5vZmZzZXQuY2xpY2sudG9wIDwgdGhpcy5jb250YWlubWVudFsxXSkgcGFnZVkgPSB0aGlzLmNvbnRhaW5tZW50WzFdICsgdGhpcy5vZmZzZXQuY2xpY2sudG9wOwoJCQkJaWYoZXZlbnQucGFnZVggLSB0aGlzLm9mZnNldC5jbGljay5sZWZ0ID4gdGhpcy5jb250YWlubWVudFsyXSkgcGFnZVggPSB0aGlzLmNvbnRhaW5tZW50WzJdICsgdGhpcy5vZmZzZXQuY2xpY2subGVmdDsKCQkJCWlmKGV2ZW50LnBhZ2VZIC0gdGhpcy5vZmZzZXQuY2xpY2sudG9wID4gdGhpcy5jb250YWlubWVudFszXSkgcGFnZVkgPSB0aGlzLmNvbnRhaW5tZW50WzNdICsgdGhpcy5vZmZzZXQuY2xpY2sudG9wOwoJCQl9CgoJCQlpZihvLmdyaWQpIHsKCQkJCXZhciB0b3AgPSB0aGlzLm9yaWdpbmFsUGFnZVkgKyBNYXRoLnJvdW5kKChwYWdlWSAtIHRoaXMub3JpZ2luYWxQYWdlWSkgLyBvLmdyaWRbMV0pICogby5ncmlkWzFdOwoJCQkJcGFnZVkgPSB0aGlzLmNvbnRhaW5tZW50ID8gKCEodG9wIC0gdGhpcy5vZmZzZXQuY2xpY2sudG9wIDwgdGhpcy5jb250YWlubWVudFsxXSB8fCB0b3AgLSB0aGlzLm9mZnNldC5jbGljay50b3AgPiB0aGlzLmNvbnRhaW5tZW50WzNdKSA/IHRvcCA6ICghKHRvcCAtIHRoaXMub2Zmc2V0LmNsaWNrLnRvcCA8IHRoaXMuY29udGFpbm1lbnRbMV0pID8gdG9wIC0gby5ncmlkWzFdIDogdG9wICsgby5ncmlkWzFdKSkgOiB0b3A7CgoJCQkJdmFyIGxlZnQgPSB0aGlzLm9yaWdpbmFsUGFnZVggKyBNYXRoLnJvdW5kKChwYWdlWCAtIHRoaXMub3JpZ2luYWxQYWdlWCkgLyBvLmdyaWRbMF0pICogby5ncmlkWzBdOwoJCQkJcGFnZVggPSB0aGlzLmNvbnRhaW5tZW50ID8gKCEobGVmdCAtIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPCB0aGlzLmNvbnRhaW5tZW50WzBdIHx8IGxlZnQgLSB0aGlzLm9mZnNldC5jbGljay5sZWZ0ID4gdGhpcy5jb250YWlubWVudFsyXSkgPyBsZWZ0IDogKCEobGVmdCAtIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPCB0aGlzLmNvbnRhaW5tZW50WzBdKSA/IGxlZnQgLSBvLmdyaWRbMF0gOiBsZWZ0ICsgby5ncmlkWzBdKSkgOiBsZWZ0OwoJCQl9CgoJCX0KCgkJcmV0dXJuIHsKCQkJdG9wOiAoCgkJCQlwYWdlWQkJCQkJCQkJCQkJCQkJCQkvLyBUaGUgYWJzb2x1dGUgbW91c2UgcG9zaXRpb24KCQkJCS0gdGhpcy5vZmZzZXQuY2xpY2sudG9wCQkJCQkJCQkJCQkJCS8vIENsaWNrIG9mZnNldCAocmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQpCgkJCQktIHRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcAkJCQkJCQkJCQkJCS8vIE9ubHkgZm9yIHJlbGF0aXZlIHBvc2l0aW9uZWQgbm9kZXM6IFJlbGF0aXZlIG9mZnNldCBmcm9tIGVsZW1lbnQgdG8gb2Zmc2V0IHBhcmVudAoJCQkJLSB0aGlzLm9mZnNldC5wYXJlbnQudG9wCQkJCQkJCQkJCQkJLy8gVGhlIG9mZnNldFBhcmVudCdzIG9mZnNldCB3aXRob3V0IGJvcmRlcnMgKG9mZnNldCArIGJvcmRlcikKCQkJCSsgKCAoIHRoaXMuY3NzUG9zaXRpb24gPT0gJ2ZpeGVkJyA/IC10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSA6ICggc2Nyb2xsSXNSb290Tm9kZSA/IDAgOiBzY3JvbGwuc2Nyb2xsVG9wKCkgKSApKQoJCQkpLAoJCQlsZWZ0OiAoCgkJCQlwYWdlWAkJCQkJCQkJCQkJCQkJCQkvLyBUaGUgYWJzb2x1dGUgbW91c2UgcG9zaXRpb24KCQkJCS0gdGhpcy5vZmZzZXQuY2xpY2subGVmdAkJCQkJCQkJCQkJCS8vIENsaWNrIG9mZnNldCAocmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQpCgkJCQktIHRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQJCQkJCQkJCQkJCQkvLyBPbmx5IGZvciByZWxhdGl2ZSBwb3NpdGlvbmVkIG5vZGVzOiBSZWxhdGl2ZSBvZmZzZXQgZnJvbSBlbGVtZW50IHRvIG9mZnNldCBwYXJlbnQKCQkJCS0gdGhpcy5vZmZzZXQucGFyZW50LmxlZnQJCQkJCQkJCQkJCQkvLyBUaGUgb2Zmc2V0UGFyZW50J3Mgb2Zmc2V0IHdpdGhvdXQgYm9yZGVycyAob2Zmc2V0ICsgYm9yZGVyKQoJCQkJKyAoICggdGhpcy5jc3NQb3NpdGlvbiA9PSAnZml4ZWQnID8gLXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSA6IHNjcm9sbElzUm9vdE5vZGUgPyAwIDogc2Nyb2xsLnNjcm9sbExlZnQoKSApKQoJCQkpCgkJfTsKCgl9LAoKCV9yZWFycmFuZ2U6IGZ1bmN0aW9uKGV2ZW50LCBpLCBhLCBoYXJkUmVmcmVzaCkgewoKCQlhID8gYVswXS5hcHBlbmRDaGlsZCh0aGlzLnBsYWNlaG9sZGVyWzBdKSA6IGkuaXRlbVswXS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnBsYWNlaG9sZGVyWzBdLCAodGhpcy5kaXJlY3Rpb24gPT0gJ2Rvd24nID8gaS5pdGVtWzBdIDogaS5pdGVtWzBdLm5leHRTaWJsaW5nKSk7CgoJCS8vVmFyaW91cyB0aGluZ3MgZG9uZSBoZXJlIHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlOgoJCS8vIDEuIHdlIGNyZWF0ZSBhIHNldFRpbWVvdXQsIHRoYXQgY2FsbHMgcmVmcmVzaFBvc2l0aW9ucwoJCS8vIDIuIG9uIHRoZSBpbnN0YW5jZSwgd2UgaGF2ZSBhIGNvdW50ZXIgdmFyaWFibGUsIHRoYXQgZ2V0J3MgaGlnaGVyIGFmdGVyIGV2ZXJ5IGFwcGVuZAoJCS8vIDMuIG9uIHRoZSBsb2NhbCBzY29wZSwgd2UgY29weSB0aGUgY291bnRlciB2YXJpYWJsZSwgYW5kIGNoZWNrIGluIHRoZSB0aW1lb3V0LCBpZiBpdCdzIHN0aWxsIHRoZSBzYW1lCgkJLy8gNC4gdGhpcyBsZXRzIG9ubHkgdGhlIGxhc3QgYWRkaXRpb24gdG8gdGhlIHRpbWVvdXQgc3RhY2sgdGhyb3VnaAoJCXRoaXMuY291bnRlciA9IHRoaXMuY291bnRlciA/ICsrdGhpcy5jb3VudGVyIDogMTsKCQl2YXIgY291bnRlciA9IHRoaXMuY291bnRlcjsKCgkJdGhpcy5fZGVsYXkoZnVuY3Rpb24oKSB7CgkJCWlmKGNvdW50ZXIgPT0gdGhpcy5jb3VudGVyKSB0aGlzLnJlZnJlc2hQb3NpdGlvbnMoIWhhcmRSZWZyZXNoKTsgLy9QcmVjb21wdXRlIGFmdGVyIGVhY2ggRE9NIGluc2VydGlvbiwgTk9UIG9uIG1vdXNlbW92ZQoJCX0pOwoKCX0sCgoJX2NsZWFyOiBmdW5jdGlvbihldmVudCwgbm9Qcm9wYWdhdGlvbikgewoKCQl0aGlzLnJldmVydGluZyA9IGZhbHNlOwoJCS8vIFdlIGRlbGF5IGFsbCBldmVudHMgdGhhdCBoYXZlIHRvIGJlIHRyaWdnZXJlZCB0byBhZnRlciB0aGUgcG9pbnQgd2hlcmUgdGhlIHBsYWNlaG9sZGVyIGhhcyBiZWVuIHJlbW92ZWQgYW5kCgkJLy8gZXZlcnl0aGluZyBlbHNlIG5vcm1hbGl6ZWQgYWdhaW4KCQl2YXIgZGVsYXllZFRyaWdnZXJzID0gW107CgoJCS8vIFdlIGZpcnN0IGhhdmUgdG8gdXBkYXRlIHRoZSBkb20gcG9zaXRpb24gb2YgdGhlIGFjdHVhbCBjdXJyZW50SXRlbQoJCS8vIE5vdGU6IGRvbid0IGRvIGl0IGlmIHRoZSBjdXJyZW50IGl0ZW0gaXMgYWxyZWFkeSByZW1vdmVkIChieSBhIHVzZXIpLCBvciBpdCBnZXRzIHJlYXBwZW5kZWQgKHNlZSAjNDA4OCkKCQlpZighdGhpcy5fbm9GaW5hbFNvcnQgJiYgdGhpcy5jdXJyZW50SXRlbS5wYXJlbnQoKS5sZW5ndGgpIHRoaXMucGxhY2Vob2xkZXIuYmVmb3JlKHRoaXMuY3VycmVudEl0ZW0pOwoJCXRoaXMuX25vRmluYWxTb3J0ID0gbnVsbDsKCgkJaWYodGhpcy5oZWxwZXJbMF0gPT0gdGhpcy5jdXJyZW50SXRlbVswXSkgewoJCQlmb3IodmFyIGkgaW4gdGhpcy5fc3RvcmVkQ1NTKSB7CgkJCQlpZih0aGlzLl9zdG9yZWRDU1NbaV0gPT0gJ2F1dG8nIHx8IHRoaXMuX3N0b3JlZENTU1tpXSA9PSAnc3RhdGljJykgdGhpcy5fc3RvcmVkQ1NTW2ldID0gJyc7CgkJCX0KCQkJdGhpcy5jdXJyZW50SXRlbS5jc3ModGhpcy5fc3RvcmVkQ1NTKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGVscGVyIik7CgkJfSBlbHNlIHsKCQkJdGhpcy5jdXJyZW50SXRlbS5zaG93KCk7CgkJfQoKCQlpZih0aGlzLmZyb21PdXRzaWRlICYmICFub1Byb3BhZ2F0aW9uKSBkZWxheWVkVHJpZ2dlcnMucHVzaChmdW5jdGlvbihldmVudCkgeyB0aGlzLl90cmlnZ2VyKCJyZWNlaXZlIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCh0aGlzLmZyb21PdXRzaWRlKSk7IH0pOwoJCWlmKCh0aGlzLmZyb21PdXRzaWRlIHx8IHRoaXMuZG9tUG9zaXRpb24ucHJldiAhPSB0aGlzLmN1cnJlbnRJdGVtLnByZXYoKS5ub3QoIi51aS1zb3J0YWJsZS1oZWxwZXIiKVswXSB8fCB0aGlzLmRvbVBvc2l0aW9uLnBhcmVudCAhPSB0aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpWzBdKSAmJiAhbm9Qcm9wYWdhdGlvbikgZGVsYXllZFRyaWdnZXJzLnB1c2goZnVuY3Rpb24oZXZlbnQpIHsgdGhpcy5fdHJpZ2dlcigidXBkYXRlIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCgpKTsgfSk7IC8vVHJpZ2dlciB1cGRhdGUgY2FsbGJhY2sgaWYgdGhlIERPTSBwb3NpdGlvbiBoYXMgY2hhbmdlZAoKCQkvLyBDaGVjayBpZiB0aGUgaXRlbXMgQ29udGFpbmVyIGhhcyBDaGFuZ2VkIGFuZCB0cmlnZ2VyIGFwcHJvcHJpYXRlCgkJLy8gZXZlbnRzLgoJCWlmICh0aGlzICE9PSB0aGlzLmN1cnJlbnRDb250YWluZXIpIHsKCQkJaWYoIW5vUHJvcGFnYXRpb24pIHsKCQkJCWRlbGF5ZWRUcmlnZ2Vycy5wdXNoKGZ1bmN0aW9uKGV2ZW50KSB7IHRoaXMuX3RyaWdnZXIoInJlbW92ZSIsIGV2ZW50LCB0aGlzLl91aUhhc2goKSk7IH0pOwoJCQkJZGVsYXllZFRyaWdnZXJzLnB1c2goKGZ1bmN0aW9uKGMpIHsgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7IGMuX3RyaWdnZXIoInJlY2VpdmUiLCBldmVudCwgdGhpcy5fdWlIYXNoKHRoaXMpKTsgfTsgIH0pLmNhbGwodGhpcywgdGhpcy5jdXJyZW50Q29udGFpbmVyKSk7CgkJCQlkZWxheWVkVHJpZ2dlcnMucHVzaCgoZnVuY3Rpb24oYykgeyByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHsgYy5fdHJpZ2dlcigidXBkYXRlIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCh0aGlzKSk7ICB9OyB9KS5jYWxsKHRoaXMsIHRoaXMuY3VycmVudENvbnRhaW5lcikpOwoJCQl9CgkJfQoKCgkJLy9Qb3N0IGV2ZW50cyB0byBjb250YWluZXJzCgkJZm9yICh2YXIgaSA9IHRoaXMuY29udGFpbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7CgkJCWlmKCFub1Byb3BhZ2F0aW9uKSBkZWxheWVkVHJpZ2dlcnMucHVzaCgoZnVuY3Rpb24oYykgeyByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHsgYy5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsIGV2ZW50LCB0aGlzLl91aUhhc2godGhpcykpOyB9OyAgfSkuY2FsbCh0aGlzLCB0aGlzLmNvbnRhaW5lcnNbaV0pKTsKCQkJaWYodGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLm92ZXIpIHsKCQkJCWRlbGF5ZWRUcmlnZ2Vycy5wdXNoKChmdW5jdGlvbihjKSB7IHJldHVybiBmdW5jdGlvbihldmVudCkgeyBjLl90cmlnZ2VyKCJvdXQiLCBldmVudCwgdGhpcy5fdWlIYXNoKHRoaXMpKTsgfTsgIH0pLmNhbGwodGhpcywgdGhpcy5jb250YWluZXJzW2ldKSk7CgkJCQl0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUub3ZlciA9IDA7CgkJCX0KCQl9CgoJCS8vRG8gd2hhdCB3YXMgb3JpZ2luYWxseSBpbiBwbHVnaW5zCgkJaWYodGhpcy5fc3RvcmVkQ3Vyc29yKSAkKCdib2R5JykuY3NzKCJjdXJzb3IiLCB0aGlzLl9zdG9yZWRDdXJzb3IpOyAvL1Jlc2V0IGN1cnNvcgoJCWlmKHRoaXMuX3N0b3JlZE9wYWNpdHkpIHRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIsIHRoaXMuX3N0b3JlZE9wYWNpdHkpOyAvL1Jlc2V0IG9wYWNpdHkKCQlpZih0aGlzLl9zdG9yZWRaSW5kZXgpIHRoaXMuaGVscGVyLmNzcygiekluZGV4IiwgdGhpcy5fc3RvcmVkWkluZGV4ID09ICdhdXRvJyA/ICcnIDogdGhpcy5fc3RvcmVkWkluZGV4KTsgLy9SZXNldCB6LWluZGV4CgoJCXRoaXMuZHJhZ2dpbmcgPSBmYWxzZTsKCQlpZih0aGlzLmNhbmNlbEhlbHBlclJlbW92YWwpIHsKCQkJaWYoIW5vUHJvcGFnYXRpb24pIHsKCQkJCXRoaXMuX3RyaWdnZXIoImJlZm9yZVN0b3AiLCBldmVudCwgdGhpcy5fdWlIYXNoKCkpOwoJCQkJZm9yICh2YXIgaT0wOyBpIDwgZGVsYXllZFRyaWdnZXJzLmxlbmd0aDsgaSsrKSB7IGRlbGF5ZWRUcmlnZ2Vyc1tpXS5jYWxsKHRoaXMsIGV2ZW50KTsgfTsgLy9UcmlnZ2VyIGFsbCBkZWxheWVkIGV2ZW50cwoJCQkJdGhpcy5fdHJpZ2dlcigic3RvcCIsIGV2ZW50LCB0aGlzLl91aUhhc2goKSk7CgkJCX0KCgkJCXRoaXMuZnJvbU91dHNpZGUgPSBmYWxzZTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYoIW5vUHJvcGFnYXRpb24pIHRoaXMuX3RyaWdnZXIoImJlZm9yZVN0b3AiLCBldmVudCwgdGhpcy5fdWlIYXNoKCkpOwoKCQkvLyQodGhpcy5wbGFjZWhvbGRlclswXSkucmVtb3ZlKCk7IHdvdWxkIGhhdmUgYmVlbiB0aGUgalF1ZXJ5IHdheSAtIHVuZm9ydHVuYXRlbHksIGl0IHVuYmluZHMgQUxMIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCBub2RlIQoJCXRoaXMucGxhY2Vob2xkZXJbMF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBsYWNlaG9sZGVyWzBdKTsKCgkJaWYodGhpcy5oZWxwZXJbMF0gIT0gdGhpcy5jdXJyZW50SXRlbVswXSkgdGhpcy5oZWxwZXIucmVtb3ZlKCk7IHRoaXMuaGVscGVyID0gbnVsbDsKCgkJaWYoIW5vUHJvcGFnYXRpb24pIHsKCQkJZm9yICh2YXIgaT0wOyBpIDwgZGVsYXllZFRyaWdnZXJzLmxlbmd0aDsgaSsrKSB7IGRlbGF5ZWRUcmlnZ2Vyc1tpXS5jYWxsKHRoaXMsIGV2ZW50KTsgfTsgLy9UcmlnZ2VyIGFsbCBkZWxheWVkIGV2ZW50cwoJCQl0aGlzLl90cmlnZ2VyKCJzdG9wIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCgpKTsKCQl9CgoJCXRoaXMuZnJvbU91dHNpZGUgPSBmYWxzZTsKCQlyZXR1cm4gdHJ1ZTsKCgl9LAoKCV90cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQlpZiAoJC5XaWRnZXQucHJvdG90eXBlLl90cmlnZ2VyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgPT09IGZhbHNlKSB7CgkJCXRoaXMuY2FuY2VsKCk7CgkJfQoJfSwKCglfdWlIYXNoOiBmdW5jdGlvbihfaW5zdCkgewoJCXZhciBpbnN0ID0gX2luc3QgfHwgdGhpczsKCQlyZXR1cm4gewoJCQloZWxwZXI6IGluc3QuaGVscGVyLAoJCQlwbGFjZWhvbGRlcjogaW5zdC5wbGFjZWhvbGRlciB8fCAkKFtdKSwKCQkJcG9zaXRpb246IGluc3QucG9zaXRpb24sCgkJCW9yaWdpbmFsUG9zaXRpb246IGluc3Qub3JpZ2luYWxQb3NpdGlvbiwKCQkJb2Zmc2V0OiBpbnN0LnBvc2l0aW9uQWJzLAoJCQlpdGVtOiBpbnN0LmN1cnJlbnRJdGVtLAoJCQlzZW5kZXI6IF9pbnN0ID8gX2luc3QuZWxlbWVudCA6IG51bGwKCQl9OwoJfQoKfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oICQgKSB7CgpmdW5jdGlvbiBtb2RpZmllciggZm4gKSB7CglyZXR1cm4gZnVuY3Rpb24oKSB7CgkJdmFyIHByZXZpb3VzID0gdGhpcy5lbGVtZW50LnZhbCgpOwoJCWZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQl0aGlzLl9yZWZyZXNoKCk7CgkJaWYgKCBwcmV2aW91cyAhPT0gdGhpcy5lbGVtZW50LnZhbCgpICkgewoJCQl0aGlzLl90cmlnZ2VyKCAiY2hhbmdlIiApOwoJCX0KCX07Cn0KCiQud2lkZ2V0KCAidWkuc3Bpbm5lciIsIHsKCXZlcnNpb246ICIxLjkuMiIsCglkZWZhdWx0RWxlbWVudDogIjxpbnB1dD4iLAoJd2lkZ2V0RXZlbnRQcmVmaXg6ICJzcGluIiwKCW9wdGlvbnM6IHsKCQljdWx0dXJlOiBudWxsLAoJCWljb25zOiB7CgkJCWRvd246ICJ1aS1pY29uLXRyaWFuZ2xlLTEtcyIsCgkJCXVwOiAidWktaWNvbi10cmlhbmdsZS0xLW4iCgkJfSwKCQlpbmNyZW1lbnRhbDogdHJ1ZSwKCQltYXg6IG51bGwsCgkJbWluOiBudWxsLAoJCW51bWJlckZvcm1hdDogbnVsbCwKCQlwYWdlOiAxMCwKCQlzdGVwOiAxLAoKCQljaGFuZ2U6IG51bGwsCgkJc3BpbjogbnVsbCwKCQlzdGFydDogbnVsbCwKCQlzdG9wOiBudWxsCgl9LAoKCV9jcmVhdGU6IGZ1bmN0aW9uKCkgewoJCS8vIGhhbmRsZSBzdHJpbmcgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSBwYXJzZWQKCQl0aGlzLl9zZXRPcHRpb24oICJtYXgiLCB0aGlzLm9wdGlvbnMubWF4ICk7CgkJdGhpcy5fc2V0T3B0aW9uKCAibWluIiwgdGhpcy5vcHRpb25zLm1pbiApOwoJCXRoaXMuX3NldE9wdGlvbiggInN0ZXAiLCB0aGlzLm9wdGlvbnMuc3RlcCApOwoKCQkvLyBmb3JtYXQgdGhlIHZhbHVlLCBidXQgZG9uJ3QgY29uc3RyYWluCgkJdGhpcy5fdmFsdWUoIHRoaXMuZWxlbWVudC52YWwoKSwgdHJ1ZSApOwoKCQl0aGlzLl9kcmF3KCk7CgkJdGhpcy5fb24oIHRoaXMuX2V2ZW50cyApOwoJCXRoaXMuX3JlZnJlc2goKTsKCgkJLy8gdHVybmluZyBvZmYgYXV0b2NvbXBsZXRlIHByZXZlbnRzIHRoZSBicm93c2VyIGZyb20gcmVtZW1iZXJpbmcgdGhlCgkJLy8gdmFsdWUgd2hlbiBuYXZpZ2F0aW5nIHRocm91Z2ggaGlzdG9yeSwgc28gd2UgcmUtZW5hYmxlIGF1dG9jb21wbGV0ZQoJCS8vIGlmIHRoZSBwYWdlIGlzIHVubG9hZGVkIGJlZm9yZSB0aGUgd2lkZ2V0IGlzIGRlc3Ryb3llZC4gIzc3OTAKCQl0aGlzLl9vbiggdGhpcy53aW5kb3csIHsKCQkJYmVmb3JldW5sb2FkOiBmdW5jdGlvbigpIHsKCQkJCXRoaXMuZWxlbWVudC5yZW1vdmVBdHRyKCAiYXV0b2NvbXBsZXRlIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV9nZXRDcmVhdGVPcHRpb25zOiBmdW5jdGlvbigpIHsKCQl2YXIgb3B0aW9ucyA9IHt9LAoJCQllbGVtZW50ID0gdGhpcy5lbGVtZW50OwoKCQkkLmVhY2goIFsgIm1pbiIsICJtYXgiLCAic3RlcCIgXSwgZnVuY3Rpb24oIGksIG9wdGlvbiApIHsKCQkJdmFyIHZhbHVlID0gZWxlbWVudC5hdHRyKCBvcHRpb24gKTsKCQkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLmxlbmd0aCApIHsKCQkJCW9wdGlvbnNbIG9wdGlvbiBdID0gdmFsdWU7CgkJCX0KCQl9KTsKCgkJcmV0dXJuIG9wdGlvbnM7Cgl9LAoKCV9ldmVudHM6IHsKCQlrZXlkb3duOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCWlmICggdGhpcy5fc3RhcnQoIGV2ZW50ICkgJiYgdGhpcy5fa2V5ZG93biggZXZlbnQgKSApIHsKCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCX0KCQl9LAoJCWtleXVwOiAiX3N0b3AiLAoJCWZvY3VzOiBmdW5jdGlvbigpIHsKCQkJdGhpcy5wcmV2aW91cyA9IHRoaXMuZWxlbWVudC52YWwoKTsKCQl9LAoJCWJsdXI6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJaWYgKCB0aGlzLmNhbmNlbEJsdXIgKSB7CgkJCQlkZWxldGUgdGhpcy5jYW5jZWxCbHVyOwoJCQkJcmV0dXJuOwoJCQl9CgoJCQl0aGlzLl9yZWZyZXNoKCk7CgkJCWlmICggdGhpcy5wcmV2aW91cyAhPT0gdGhpcy5lbGVtZW50LnZhbCgpICkgewoJCQkJdGhpcy5fdHJpZ2dlciggImNoYW5nZSIsIGV2ZW50ICk7CgkJCX0KCQl9LAoJCW1vdXNld2hlZWw6IGZ1bmN0aW9uKCBldmVudCwgZGVsdGEgKSB7CgkJCWlmICggIWRlbHRhICkgewoJCQkJcmV0dXJuOwoJCQl9CgkJCWlmICggIXRoaXMuc3Bpbm5pbmcgJiYgIXRoaXMuX3N0YXJ0KCBldmVudCApICkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQl0aGlzLl9zcGluKCAoZGVsdGEgPiAwID8gMSA6IC0xKSAqIHRoaXMub3B0aW9ucy5zdGVwLCBldmVudCApOwoJCQljbGVhclRpbWVvdXQoIHRoaXMubW91c2V3aGVlbFRpbWVyICk7CgkJCXRoaXMubW91c2V3aGVlbFRpbWVyID0gdGhpcy5fZGVsYXkoZnVuY3Rpb24oKSB7CgkJCQlpZiAoIHRoaXMuc3Bpbm5pbmcgKSB7CgkJCQkJdGhpcy5fc3RvcCggZXZlbnQgKTsKCQkJCX0KCQkJfSwgMTAwICk7CgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJfSwKCQkibW91c2Vkb3duIC51aS1zcGlubmVyLWJ1dHRvbiI6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJdmFyIHByZXZpb3VzOwoKCQkJLy8gV2UgbmV2ZXIgd2FudCB0aGUgYnV0dG9ucyB0byBoYXZlIGZvY3VzOyB3aGVuZXZlciB0aGUgdXNlciBpcwoJCQkvLyBpbnRlcmFjdGluZyB3aXRoIHRoZSBzcGlubmVyLCB0aGUgZm9jdXMgc2hvdWxkIGJlIG9uIHRoZSBpbnB1dC4KCQkJLy8gSWYgdGhlIGlucHV0IGlzIGZvY3VzZWQgdGhlbiB0aGlzLnByZXZpb3VzIGlzIHByb3Blcmx5IHNldCBmcm9tCgkJCS8vIHdoZW4gdGhlIGlucHV0IGZpcnN0IHJlY2VpdmVkIGZvY3VzLiBJZiB0aGUgaW5wdXQgaXMgbm90IGZvY3VzZWQKCQkJLy8gdGhlbiB3ZSBuZWVkIHRvIHNldCB0aGlzLnByZXZpb3VzIGJhc2VkIG9uIHRoZSB2YWx1ZSBiZWZvcmUgc3Bpbm5pbmcuCgkJCXByZXZpb3VzID0gdGhpcy5lbGVtZW50WzBdID09PSB0aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQgPwoJCQkJdGhpcy5wcmV2aW91cyA6IHRoaXMuZWxlbWVudC52YWwoKTsKCQkJZnVuY3Rpb24gY2hlY2tGb2N1cygpIHsKCQkJCXZhciBpc0FjdGl2ZSA9IHRoaXMuZWxlbWVudFswXSA9PT0gdGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50OwoJCQkJaWYgKCAhaXNBY3RpdmUgKSB7CgkJCQkJdGhpcy5lbGVtZW50LmZvY3VzKCk7CgkJCQkJdGhpcy5wcmV2aW91cyA9IHByZXZpb3VzOwoJCQkJCS8vIHN1cHBvcnQ6IElFCgkJCQkJLy8gSUUgc2V0cyBmb2N1cyBhc3luY2hyb25vdXNseSwgc28gd2UgbmVlZCB0byBjaGVjayBpZiBmb2N1cwoJCQkJCS8vIG1vdmVkIG9mZiBvZiB0aGUgaW5wdXQgYmVjYXVzZSB0aGUgdXNlciBjbGlja2VkIG9uIHRoZSBidXR0b24uCgkJCQkJdGhpcy5fZGVsYXkoZnVuY3Rpb24oKSB7CgkJCQkJCXRoaXMucHJldmlvdXMgPSBwcmV2aW91czsKCQkJCQl9KTsKCQkJCX0KCQkJfQoKCQkJLy8gZW5zdXJlIGZvY3VzIGlzIG9uIChvciBzdGF5cyBvbikgdGhlIHRleHQgZmllbGQKCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJY2hlY2tGb2N1cy5jYWxsKCB0aGlzICk7CgoJCQkvLyBzdXBwb3J0OiBJRQoJCQkvLyBJRSBkb2Vzbid0IHByZXZlbnQgbW92aW5nIGZvY3VzIGV2ZW4gd2l0aCBldmVudC5wcmV2ZW50RGVmYXVsdCgpCgkJCS8vIHNvIHdlIHNldCBhIGZsYWcgdG8ga25vdyB3aGVuIHdlIHNob3VsZCBpZ25vcmUgdGhlIGJsdXIgZXZlbnQKCQkJLy8gYW5kIGNoZWNrIChhZ2FpbikgaWYgZm9jdXMgbW92ZWQgb2ZmIG9mIHRoZSBpbnB1dC4KCQkJdGhpcy5jYW5jZWxCbHVyID0gdHJ1ZTsKCQkJdGhpcy5fZGVsYXkoZnVuY3Rpb24oKSB7CgkJCQlkZWxldGUgdGhpcy5jYW5jZWxCbHVyOwoJCQkJY2hlY2tGb2N1cy5jYWxsKCB0aGlzICk7CgkJCX0pOwoKCQkJaWYgKCB0aGlzLl9zdGFydCggZXZlbnQgKSA9PT0gZmFsc2UgKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCXRoaXMuX3JlcGVhdCggbnVsbCwgJCggZXZlbnQuY3VycmVudFRhcmdldCApLmhhc0NsYXNzKCAidWktc3Bpbm5lci11cCIgKSA/IDEgOiAtMSwgZXZlbnQgKTsKCQl9LAoJCSJtb3VzZXVwIC51aS1zcGlubmVyLWJ1dHRvbiI6ICJfc3RvcCIsCgkJIm1vdXNlZW50ZXIgLnVpLXNwaW5uZXItYnV0dG9uIjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkvLyBidXR0b24gd2lsbCBhZGQgdWktc3RhdGUtYWN0aXZlIGlmIG1vdXNlIHdhcyBkb3duIHdoaWxlIG1vdXNlbGVhdmUgYW5kIGtlcHQgZG93bgoJCQlpZiAoICEkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuaGFzQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICkgKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCWlmICggdGhpcy5fc3RhcnQoIGV2ZW50ICkgPT09IGZhbHNlICkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCXRoaXMuX3JlcGVhdCggbnVsbCwgJCggZXZlbnQuY3VycmVudFRhcmdldCApLmhhc0NsYXNzKCAidWktc3Bpbm5lci11cCIgKSA/IDEgOiAtMSwgZXZlbnQgKTsKCQl9LAoJCS8vIFRPRE86IGRvIHdlIHJlYWxseSB3YW50IHRvIGNvbnNpZGVyIHRoaXMgYSBzdG9wPwoJCS8vIHNob3VsZG4ndCB3ZSBqdXN0IHN0b3AgdGhlIHJlcGVhdGVyIGFuZCB3YWl0IHVudGlsIG1vdXNldXAgYmVmb3JlCgkJLy8gd2UgdHJpZ2dlciB0aGUgc3RvcCBldmVudD8KCQkibW91c2VsZWF2ZSAudWktc3Bpbm5lci1idXR0b24iOiAiX3N0b3AiCgl9LAoKCV9kcmF3OiBmdW5jdGlvbigpIHsKCQl2YXIgdWlTcGlubmVyID0gdGhpcy51aVNwaW5uZXIgPSB0aGlzLmVsZW1lbnQKCQkJLmFkZENsYXNzKCAidWktc3Bpbm5lci1pbnB1dCIgKQoJCQkuYXR0ciggImF1dG9jb21wbGV0ZSIsICJvZmYiICkKCQkJLndyYXAoIHRoaXMuX3VpU3Bpbm5lckh0bWwoKSApCgkJCS5wYXJlbnQoKQoJCQkJLy8gYWRkIGJ1dHRvbnMKCQkJCS5hcHBlbmQoIHRoaXMuX2J1dHRvbkh0bWwoKSApOwoKCQl0aGlzLmVsZW1lbnQuYXR0ciggInJvbGUiLCAic3BpbmJ1dHRvbiIgKTsKCgkJLy8gYnV0dG9uIGJpbmRpbmdzCgkJdGhpcy5idXR0b25zID0gdWlTcGlubmVyLmZpbmQoICIudWktc3Bpbm5lci1idXR0b24iICkKCQkJLmF0dHIoICJ0YWJJbmRleCIsIC0xICkKCQkJLmJ1dHRvbigpCgkJCS5yZW1vdmVDbGFzcyggInVpLWNvcm5lci1hbGwiICk7CgoJCS8vIElFIDYgZG9lc24ndCB1bmRlcnN0YW5kIGhlaWdodDogNTAlIGZvciB0aGUgYnV0dG9ucwoJCS8vIHVubGVzcyB0aGUgd3JhcHBlciBoYXMgYW4gZXhwbGljaXQgaGVpZ2h0CgkJaWYgKCB0aGlzLmJ1dHRvbnMuaGVpZ2h0KCkgPiBNYXRoLmNlaWwoIHVpU3Bpbm5lci5oZWlnaHQoKSAqIDAuNSApICYmCgkJCQl1aVNwaW5uZXIuaGVpZ2h0KCkgPiAwICkgewoJCQl1aVNwaW5uZXIuaGVpZ2h0KCB1aVNwaW5uZXIuaGVpZ2h0KCkgKTsKCQl9CgoJCS8vIGRpc2FibGUgc3Bpbm5lciBpZiBlbGVtZW50IHdhcyBhbHJlYWR5IGRpc2FibGVkCgkJaWYgKCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQgKSB7CgkJCXRoaXMuZGlzYWJsZSgpOwoJCX0KCX0sCgoJX2tleWRvd246IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywKCQkJa2V5Q29kZSA9ICQudWkua2V5Q29kZTsKCgkJc3dpdGNoICggZXZlbnQua2V5Q29kZSApIHsKCQljYXNlIGtleUNvZGUuVVA6CgkJCXRoaXMuX3JlcGVhdCggbnVsbCwgMSwgZXZlbnQgKTsKCQkJcmV0dXJuIHRydWU7CgkJY2FzZSBrZXlDb2RlLkRPV046CgkJCXRoaXMuX3JlcGVhdCggbnVsbCwgLTEsIGV2ZW50ICk7CgkJCXJldHVybiB0cnVlOwoJCWNhc2Uga2V5Q29kZS5QQUdFX1VQOgoJCQl0aGlzLl9yZXBlYXQoIG51bGwsIG9wdGlvbnMucGFnZSwgZXZlbnQgKTsKCQkJcmV0dXJuIHRydWU7CgkJY2FzZSBrZXlDb2RlLlBBR0VfRE9XTjoKCQkJdGhpcy5fcmVwZWF0KCBudWxsLCAtb3B0aW9ucy5wYWdlLCBldmVudCApOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCXJldHVybiBmYWxzZTsKCX0sCgoJX3VpU3Bpbm5lckh0bWw6IGZ1bmN0aW9uKCkgewoJCXJldHVybiAiPHNwYW4gY2xhc3M9J3VpLXNwaW5uZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwnPjwvc3Bhbj4iOwoJfSwKCglfYnV0dG9uSHRtbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuICIiICsKCQkJIjxhIGNsYXNzPSd1aS1zcGlubmVyLWJ1dHRvbiB1aS1zcGlubmVyLXVwIHVpLWNvcm5lci10cic+IiArCgkJCQkiPHNwYW4gY2xhc3M9J3VpLWljb24gIiArIHRoaXMub3B0aW9ucy5pY29ucy51cCArICInPiYjOTY1MDs8L3NwYW4+IiArCgkJCSI8L2E+IiArCgkJCSI8YSBjbGFzcz0ndWktc3Bpbm5lci1idXR0b24gdWktc3Bpbm5lci1kb3duIHVpLWNvcm5lci1icic+IiArCgkJCQkiPHNwYW4gY2xhc3M9J3VpLWljb24gIiArIHRoaXMub3B0aW9ucy5pY29ucy5kb3duICsgIic+JiM5NjYwOzwvc3Bhbj4iICsKCQkJIjwvYT4iOwoJfSwKCglfc3RhcnQ6IGZ1bmN0aW9uKCBldmVudCApIHsKCQlpZiAoICF0aGlzLnNwaW5uaW5nICYmIHRoaXMuX3RyaWdnZXIoICJzdGFydCIsIGV2ZW50ICkgPT09IGZhbHNlICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlpZiAoICF0aGlzLmNvdW50ZXIgKSB7CgkJCXRoaXMuY291bnRlciA9IDE7CgkJfQoJCXRoaXMuc3Bpbm5pbmcgPSB0cnVlOwoJCXJldHVybiB0cnVlOwoJfSwKCglfcmVwZWF0OiBmdW5jdGlvbiggaSwgc3RlcHMsIGV2ZW50ICkgewoJCWkgPSBpIHx8IDUwMDsKCgkJY2xlYXJUaW1lb3V0KCB0aGlzLnRpbWVyICk7CgkJdGhpcy50aW1lciA9IHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQl0aGlzLl9yZXBlYXQoIDQwLCBzdGVwcywgZXZlbnQgKTsKCQl9LCBpICk7CgoJCXRoaXMuX3NwaW4oIHN0ZXBzICogdGhpcy5vcHRpb25zLnN0ZXAsIGV2ZW50ICk7Cgl9LAoKCV9zcGluOiBmdW5jdGlvbiggc3RlcCwgZXZlbnQgKSB7CgkJdmFyIHZhbHVlID0gdGhpcy52YWx1ZSgpIHx8IDA7CgoJCWlmICggIXRoaXMuY291bnRlciApIHsKCQkJdGhpcy5jb3VudGVyID0gMTsKCQl9CgoJCXZhbHVlID0gdGhpcy5fYWRqdXN0VmFsdWUoIHZhbHVlICsgc3RlcCAqIHRoaXMuX2luY3JlbWVudCggdGhpcy5jb3VudGVyICkgKTsKCgkJaWYgKCAhdGhpcy5zcGlubmluZyB8fCB0aGlzLl90cmlnZ2VyKCAic3BpbiIsIGV2ZW50LCB7IHZhbHVlOiB2YWx1ZSB9ICkgIT09IGZhbHNlKSB7CgkJCXRoaXMuX3ZhbHVlKCB2YWx1ZSApOwoJCQl0aGlzLmNvdW50ZXIrKzsKCQl9Cgl9LAoKCV9pbmNyZW1lbnQ6IGZ1bmN0aW9uKCBpICkgewoJCXZhciBpbmNyZW1lbnRhbCA9IHRoaXMub3B0aW9ucy5pbmNyZW1lbnRhbDsKCgkJaWYgKCBpbmNyZW1lbnRhbCApIHsKCQkJcmV0dXJuICQuaXNGdW5jdGlvbiggaW5jcmVtZW50YWwgKSA/CgkJCQlpbmNyZW1lbnRhbCggaSApIDoKCQkJCU1hdGguZmxvb3IoIGkqaSppLzUwMDAwIC0gaSppLzUwMCArIDE3KmkvMjAwICsgMSApOwoJCX0KCgkJcmV0dXJuIDE7Cgl9LAoKCV9wcmVjaXNpb246IGZ1bmN0aW9uKCkgewoJCXZhciBwcmVjaXNpb24gPSB0aGlzLl9wcmVjaXNpb25PZiggdGhpcy5vcHRpb25zLnN0ZXAgKTsKCQlpZiAoIHRoaXMub3B0aW9ucy5taW4gIT09IG51bGwgKSB7CgkJCXByZWNpc2lvbiA9IE1hdGgubWF4KCBwcmVjaXNpb24sIHRoaXMuX3ByZWNpc2lvbk9mKCB0aGlzLm9wdGlvbnMubWluICkgKTsKCQl9CgkJcmV0dXJuIHByZWNpc2lvbjsKCX0sCgoJX3ByZWNpc2lvbk9mOiBmdW5jdGlvbiggbnVtICkgewoJCXZhciBzdHIgPSBudW0udG9TdHJpbmcoKSwKCQkJZGVjaW1hbCA9IHN0ci5pbmRleE9mKCAiLiIgKTsKCQlyZXR1cm4gZGVjaW1hbCA9PT0gLTEgPyAwIDogc3RyLmxlbmd0aCAtIGRlY2ltYWwgLSAxOwoJfSwKCglfYWRqdXN0VmFsdWU6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQl2YXIgYmFzZSwgYWJvdmVNaW4sCgkJCW9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJCS8vIG1ha2Ugc3VyZSB3ZSdyZSBhdCBhIHZhbGlkIHN0ZXAKCQkvLyAtIGZpbmQgb3V0IHdoZXJlIHdlIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZSAobWluIG9yIDApCgkJYmFzZSA9IG9wdGlvbnMubWluICE9PSBudWxsID8gb3B0aW9ucy5taW4gOiAwOwoJCWFib3ZlTWluID0gdmFsdWUgLSBiYXNlOwoJCS8vIC0gcm91bmQgdG8gdGhlIG5lYXJlc3Qgc3RlcAoJCWFib3ZlTWluID0gTWF0aC5yb3VuZChhYm92ZU1pbiAvIG9wdGlvbnMuc3RlcCkgKiBvcHRpb25zLnN0ZXA7CgkJLy8gLSByb3VuZGluZyBpcyBiYXNlZCBvbiAwLCBzbyBhZGp1c3QgYmFjayB0byBvdXIgYmFzZQoJCXZhbHVlID0gYmFzZSArIGFib3ZlTWluOwoKCQkvLyBmaXggcHJlY2lzaW9uIGZyb20gYmFkIEpTIGZsb2F0aW5nIHBvaW50IG1hdGgKCQl2YWx1ZSA9IHBhcnNlRmxvYXQoIHZhbHVlLnRvRml4ZWQoIHRoaXMuX3ByZWNpc2lvbigpICkgKTsKCgkJLy8gY2xhbXAgdGhlIHZhbHVlCgkJaWYgKCBvcHRpb25zLm1heCAhPT0gbnVsbCAmJiB2YWx1ZSA+IG9wdGlvbnMubWF4KSB7CgkJCXJldHVybiBvcHRpb25zLm1heDsKCQl9CgkJaWYgKCBvcHRpb25zLm1pbiAhPT0gbnVsbCAmJiB2YWx1ZSA8IG9wdGlvbnMubWluICkgewoJCQlyZXR1cm4gb3B0aW9ucy5taW47CgkJfQoKCQlyZXR1cm4gdmFsdWU7Cgl9LAoKCV9zdG9wOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCAhdGhpcy5zcGlubmluZyApIHsKCQkJcmV0dXJuOwoJCX0KCgkJY2xlYXJUaW1lb3V0KCB0aGlzLnRpbWVyICk7CgkJY2xlYXJUaW1lb3V0KCB0aGlzLm1vdXNld2hlZWxUaW1lciApOwoJCXRoaXMuY291bnRlciA9IDA7CgkJdGhpcy5zcGlubmluZyA9IGZhbHNlOwoJCXRoaXMuX3RyaWdnZXIoICJzdG9wIiwgZXZlbnQgKTsKCX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJaWYgKCBrZXkgPT09ICJjdWx0dXJlIiB8fCBrZXkgPT09ICJudW1iZXJGb3JtYXQiICkgewoJCQl2YXIgcHJldlZhbHVlID0gdGhpcy5fcGFyc2UoIHRoaXMuZWxlbWVudC52YWwoKSApOwoJCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgkJCXRoaXMuZWxlbWVudC52YWwoIHRoaXMuX2Zvcm1hdCggcHJldlZhbHVlICkgKTsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBrZXkgPT09ICJtYXgiIHx8IGtleSA9PT0gIm1pbiIgfHwga2V5ID09PSAic3RlcCIgKSB7CgkJCWlmICggdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiApIHsKCQkJCXZhbHVlID0gdGhpcy5fcGFyc2UoIHZhbHVlICk7CgkJCX0KCQl9CgoJCXRoaXMuX3N1cGVyKCBrZXksIHZhbHVlICk7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQlpZiAoIHZhbHVlICkgewoJCQkJdGhpcy5lbGVtZW50LnByb3AoICJkaXNhYmxlZCIsIHRydWUgKTsKCQkJCXRoaXMuYnV0dG9ucy5idXR0b24oICJkaXNhYmxlIiApOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5lbGVtZW50LnByb3AoICJkaXNhYmxlZCIsIGZhbHNlICk7CgkJCQl0aGlzLmJ1dHRvbnMuYnV0dG9uKCAiZW5hYmxlIiApOwoJCQl9CgkJfQoJfSwKCglfc2V0T3B0aW9uczogbW9kaWZpZXIoZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdGhpcy5fc3VwZXIoIG9wdGlvbnMgKTsKCQl0aGlzLl92YWx1ZSggdGhpcy5lbGVtZW50LnZhbCgpICk7Cgl9KSwKCglfcGFyc2U6IGZ1bmN0aW9uKCB2YWwgKSB7CgkJaWYgKCB0eXBlb2YgdmFsID09PSAic3RyaW5nIiAmJiB2YWwgIT09ICIiICkgewoJCQl2YWwgPSB3aW5kb3cuR2xvYmFsaXplICYmIHRoaXMub3B0aW9ucy5udW1iZXJGb3JtYXQgPwoJCQkJR2xvYmFsaXplLnBhcnNlRmxvYXQoIHZhbCwgMTAsIHRoaXMub3B0aW9ucy5jdWx0dXJlICkgOiArdmFsOwoJCX0KCQlyZXR1cm4gdmFsID09PSAiIiB8fCBpc05hTiggdmFsICkgPyBudWxsIDogdmFsOwoJfSwKCglfZm9ybWF0OiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJaWYgKCB2YWx1ZSA9PT0gIiIgKSB7CgkJCXJldHVybiAiIjsKCQl9CgkJcmV0dXJuIHdpbmRvdy5HbG9iYWxpemUgJiYgdGhpcy5vcHRpb25zLm51bWJlckZvcm1hdCA/CgkJCUdsb2JhbGl6ZS5mb3JtYXQoIHZhbHVlLCB0aGlzLm9wdGlvbnMubnVtYmVyRm9ybWF0LCB0aGlzLm9wdGlvbnMuY3VsdHVyZSApIDoKCQkJdmFsdWU7Cgl9LAoKCV9yZWZyZXNoOiBmdW5jdGlvbigpIHsKCQl0aGlzLmVsZW1lbnQuYXR0cih7CgkJCSJhcmlhLXZhbHVlbWluIjogdGhpcy5vcHRpb25zLm1pbiwKCQkJImFyaWEtdmFsdWVtYXgiOiB0aGlzLm9wdGlvbnMubWF4LAoJCQkvLyBUT0RPOiB3aGF0IHNob3VsZCB3ZSBkbyB3aXRoIHZhbHVlcyB0aGF0IGNhbid0IGJlIHBhcnNlZD8KCQkJImFyaWEtdmFsdWVub3ciOiB0aGlzLl9wYXJzZSggdGhpcy5lbGVtZW50LnZhbCgpICkKCQl9KTsKCX0sCgoJLy8gdXBkYXRlIHRoZSB2YWx1ZSB3aXRob3V0IHRyaWdnZXJpbmcgY2hhbmdlCglfdmFsdWU6IGZ1bmN0aW9uKCB2YWx1ZSwgYWxsb3dBbnkgKSB7CgkJdmFyIHBhcnNlZDsKCQlpZiAoIHZhbHVlICE9PSAiIiApIHsKCQkJcGFyc2VkID0gdGhpcy5fcGFyc2UoIHZhbHVlICk7CgkJCWlmICggcGFyc2VkICE9PSBudWxsICkgewoJCQkJaWYgKCAhYWxsb3dBbnkgKSB7CgkJCQkJcGFyc2VkID0gdGhpcy5fYWRqdXN0VmFsdWUoIHBhcnNlZCApOwoJCQkJfQoJCQkJdmFsdWUgPSB0aGlzLl9mb3JtYXQoIHBhcnNlZCApOwoJCQl9CgkJfQoJCXRoaXMuZWxlbWVudC52YWwoIHZhbHVlICk7CgkJdGhpcy5fcmVmcmVzaCgpOwoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbGVtZW50CgkJCS5yZW1vdmVDbGFzcyggInVpLXNwaW5uZXItaW5wdXQiICkKCQkJLnByb3AoICJkaXNhYmxlZCIsIGZhbHNlICkKCQkJLnJlbW92ZUF0dHIoICJhdXRvY29tcGxldGUiICkKCQkJLnJlbW92ZUF0dHIoICJyb2xlIiApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS12YWx1ZW1pbiIgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtdmFsdWVtYXgiICkKCQkJLnJlbW92ZUF0dHIoICJhcmlhLXZhbHVlbm93IiApOwoJCXRoaXMudWlTcGlubmVyLnJlcGxhY2VXaXRoKCB0aGlzLmVsZW1lbnQgKTsKCX0sCgoJc3RlcFVwOiBtb2RpZmllcihmdW5jdGlvbiggc3RlcHMgKSB7CgkJdGhpcy5fc3RlcFVwKCBzdGVwcyApOwoJfSksCglfc3RlcFVwOiBmdW5jdGlvbiggc3RlcHMgKSB7CgkJdGhpcy5fc3BpbiggKHN0ZXBzIHx8IDEpICogdGhpcy5vcHRpb25zLnN0ZXAgKTsKCX0sCgoJc3RlcERvd246IG1vZGlmaWVyKGZ1bmN0aW9uKCBzdGVwcyApIHsKCQl0aGlzLl9zdGVwRG93biggc3RlcHMgKTsKCX0pLAoJX3N0ZXBEb3duOiBmdW5jdGlvbiggc3RlcHMgKSB7CgkJdGhpcy5fc3BpbiggKHN0ZXBzIHx8IDEpICogLXRoaXMub3B0aW9ucy5zdGVwICk7Cgl9LAoKCXBhZ2VVcDogbW9kaWZpZXIoZnVuY3Rpb24oIHBhZ2VzICkgewoJCXRoaXMuX3N0ZXBVcCggKHBhZ2VzIHx8IDEpICogdGhpcy5vcHRpb25zLnBhZ2UgKTsKCX0pLAoKCXBhZ2VEb3duOiBtb2RpZmllcihmdW5jdGlvbiggcGFnZXMgKSB7CgkJdGhpcy5fc3RlcERvd24oIChwYWdlcyB8fCAxKSAqIHRoaXMub3B0aW9ucy5wYWdlICk7Cgl9KSwKCgl2YWx1ZTogZnVuY3Rpb24oIG5ld1ZhbCApIHsKCQlpZiAoICFhcmd1bWVudHMubGVuZ3RoICkgewoJCQlyZXR1cm4gdGhpcy5fcGFyc2UoIHRoaXMuZWxlbWVudC52YWwoKSApOwoJCX0KCQltb2RpZmllciggdGhpcy5fdmFsdWUgKS5jYWxsKCB0aGlzLCBuZXdWYWwgKTsKCX0sCgoJd2lkZ2V0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy51aVNwaW5uZXI7Cgl9Cn0pOwoKfSggalF1ZXJ5ICkgKTsKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7Cgp2YXIgdGFiSWQgPSAwLAoJcmhhc2ggPSAvIy4qJC87CgpmdW5jdGlvbiBnZXROZXh0VGFiSWQoKSB7CglyZXR1cm4gKyt0YWJJZDsKfQoKZnVuY3Rpb24gaXNMb2NhbCggYW5jaG9yICkgewoJcmV0dXJuIGFuY2hvci5oYXNoLmxlbmd0aCA+IDEgJiYKCQlhbmNob3IuaHJlZi5yZXBsYWNlKCByaGFzaCwgIiIgKSA9PT0KCQkJbG9jYXRpb24uaHJlZi5yZXBsYWNlKCByaGFzaCwgIiIgKQoJCQkJLy8gc3VwcG9ydDogU2FmYXJpIDUuMQoJCQkJLy8gU2FmYXJpIDUuMSBkb2Vzbid0IGVuY29kZSBzcGFjZXMgaW4gd2luZG93LmxvY2F0aW9uCgkJCQkvLyBidXQgaXQgZG9lcyBlbmNvZGUgc3BhY2VzIGZyb20gYW5jaG9ycyAoIzg3NzcpCgkJCQkucmVwbGFjZSggL1xzL2csICIlMjAiICk7Cn0KCiQud2lkZ2V0KCAidWkudGFicyIsIHsKCXZlcnNpb246ICIxLjkuMiIsCglkZWxheTogMzAwLAoJb3B0aW9uczogewoJCWFjdGl2ZTogbnVsbCwKCQljb2xsYXBzaWJsZTogZmFsc2UsCgkJZXZlbnQ6ICJjbGljayIsCgkJaGVpZ2h0U3R5bGU6ICJjb250ZW50IiwKCQloaWRlOiBudWxsLAoJCXNob3c6IG51bGwsCgoJCS8vIGNhbGxiYWNrcwoJCWFjdGl2YXRlOiBudWxsLAoJCWJlZm9yZUFjdGl2YXRlOiBudWxsLAoJCWJlZm9yZUxvYWQ6IG51bGwsCgkJbG9hZDogbnVsbAoJfSwKCglfY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCW9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsCgkJCWFjdGl2ZSA9IG9wdGlvbnMuYWN0aXZlLAoJCQlsb2NhdGlvbkhhc2ggPSBsb2NhdGlvbi5oYXNoLnN1YnN0cmluZyggMSApOwoKCQl0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKCgkJdGhpcy5lbGVtZW50CgkJCS5hZGRDbGFzcyggInVpLXRhYnMgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiICkKCQkJLnRvZ2dsZUNsYXNzKCAidWktdGFicy1jb2xsYXBzaWJsZSIsIG9wdGlvbnMuY29sbGFwc2libGUgKQoJCQkvLyBQcmV2ZW50IHVzZXJzIGZyb20gZm9jdXNpbmcgZGlzYWJsZWQgdGFicyB2aWEgY2xpY2sKCQkJLmRlbGVnYXRlKCAiLnVpLXRhYnMtbmF2ID4gbGkiLCAibW91c2Vkb3duIiArIHRoaXMuZXZlbnROYW1lc3BhY2UsIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWlmICggJCggdGhpcyApLmlzKCAiLnVpLXN0YXRlLWRpc2FibGVkIiApICkgewoJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQl9CgkJCX0pCgkJCS8vIHN1cHBvcnQ6IElFIDw5CgkJCS8vIFByZXZlbnRpbmcgdGhlIGRlZmF1bHQgYWN0aW9uIGluIG1vdXNlZG93biBkb2Vzbid0IHByZXZlbnQgSUUKCQkJLy8gZnJvbSBmb2N1c2luZyB0aGUgZWxlbWVudCwgc28gaWYgdGhlIGFuY2hvciBnZXRzIGZvY3VzZWQsIGJsdXIuCgkJCS8vIFdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgZm9jdXNpbmcgdGhlIHByZXZpb3VzbHkgZm9jdXNlZAoJCQkvLyBlbGVtZW50IHNpbmNlIGNsaWNraW5nIG9uIGEgbm9uLWZvY3VzYWJsZSBlbGVtZW50IHNob3VsZCBmb2N1cwoJCQkvLyB0aGUgYm9keSBhbnl3YXkuCgkJCS5kZWxlZ2F0ZSggIi51aS10YWJzLWFuY2hvciIsICJmb2N1cyIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbigpIHsKCQkJCWlmICggJCggdGhpcyApLmNsb3Nlc3QoICJsaSIgKS5pcyggIi51aS1zdGF0ZS1kaXNhYmxlZCIgKSApIHsKCQkJCQl0aGlzLmJsdXIoKTsKCQkJCX0KCQkJfSk7CgoJCXRoaXMuX3Byb2Nlc3NUYWJzKCk7CgoJCWlmICggYWN0aXZlID09PSBudWxsICkgewoJCQkvLyBjaGVjayB0aGUgZnJhZ21lbnQgaWRlbnRpZmllciBpbiB0aGUgVVJMCgkJCWlmICggbG9jYXRpb25IYXNoICkgewoJCQkJdGhpcy50YWJzLmVhY2goZnVuY3Rpb24oIGksIHRhYiApIHsKCQkJCQlpZiAoICQoIHRhYiApLmF0dHIoICJhcmlhLWNvbnRyb2xzIiApID09PSBsb2NhdGlvbkhhc2ggKSB7CgkJCQkJCWFjdGl2ZSA9IGk7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQl9KTsKCQkJfQoKCQkJLy8gY2hlY2sgZm9yIGEgdGFiIG1hcmtlZCBhY3RpdmUgdmlhIGEgY2xhc3MKCQkJaWYgKCBhY3RpdmUgPT09IG51bGwgKSB7CgkJCQlhY3RpdmUgPSB0aGlzLnRhYnMuaW5kZXgoIHRoaXMudGFicy5maWx0ZXIoICIudWktdGFicy1hY3RpdmUiICkgKTsKCQkJfQoKCQkJLy8gbm8gYWN0aXZlIHRhYiwgc2V0IHRvIGZhbHNlCgkJCWlmICggYWN0aXZlID09PSBudWxsIHx8IGFjdGl2ZSA9PT0gLTEgKSB7CgkJCQlhY3RpdmUgPSB0aGlzLnRhYnMubGVuZ3RoID8gMCA6IGZhbHNlOwoJCQl9CgkJfQoKCQkvLyBoYW5kbGUgbnVtYmVyczogbmVnYXRpdmUsIG91dCBvZiByYW5nZQoJCWlmICggYWN0aXZlICE9PSBmYWxzZSApIHsKCQkJYWN0aXZlID0gdGhpcy50YWJzLmluZGV4KCB0aGlzLnRhYnMuZXEoIGFjdGl2ZSApICk7CgkJCWlmICggYWN0aXZlID09PSAtMSApIHsKCQkJCWFjdGl2ZSA9IG9wdGlvbnMuY29sbGFwc2libGUgPyBmYWxzZSA6IDA7CgkJCX0KCQl9CgkJb3B0aW9ucy5hY3RpdmUgPSBhY3RpdmU7CgoJCS8vIGRvbid0IGFsbG93IGNvbGxhcHNpYmxlOiBmYWxzZSBhbmQgYWN0aXZlOiBmYWxzZQoJCWlmICggIW9wdGlvbnMuY29sbGFwc2libGUgJiYgb3B0aW9ucy5hY3RpdmUgPT09IGZhbHNlICYmIHRoaXMuYW5jaG9ycy5sZW5ndGggKSB7CgkJCW9wdGlvbnMuYWN0aXZlID0gMDsKCQl9CgoJCS8vIFRha2UgZGlzYWJsaW5nIHRhYnMgdmlhIGNsYXNzIGF0dHJpYnV0ZSBmcm9tIEhUTUwKCQkvLyBpbnRvIGFjY291bnQgYW5kIHVwZGF0ZSBvcHRpb24gcHJvcGVybHkuCgkJaWYgKCAkLmlzQXJyYXkoIG9wdGlvbnMuZGlzYWJsZWQgKSApIHsKCQkJb3B0aW9ucy5kaXNhYmxlZCA9ICQudW5pcXVlKCBvcHRpb25zLmRpc2FibGVkLmNvbmNhdCgKCQkJCSQubWFwKCB0aGlzLnRhYnMuZmlsdGVyKCAiLnVpLXN0YXRlLWRpc2FibGVkIiApLCBmdW5jdGlvbiggbGkgKSB7CgkJCQkJcmV0dXJuIHRoYXQudGFicy5pbmRleCggbGkgKTsKCQkJCX0pCgkJCSkgKS5zb3J0KCk7CgkJfQoKCQkvLyBjaGVjayBmb3IgbGVuZ3RoIGF2b2lkcyBlcnJvciB3aGVuIGluaXRpYWxpemluZyBlbXB0eSBsaXN0CgkJaWYgKCB0aGlzLm9wdGlvbnMuYWN0aXZlICE9PSBmYWxzZSAmJiB0aGlzLmFuY2hvcnMubGVuZ3RoICkgewoJCQl0aGlzLmFjdGl2ZSA9IHRoaXMuX2ZpbmRBY3RpdmUoIHRoaXMub3B0aW9ucy5hY3RpdmUgKTsKCQl9IGVsc2UgewoJCQl0aGlzLmFjdGl2ZSA9ICQoKTsKCQl9CgoJCXRoaXMuX3JlZnJlc2goKTsKCgkJaWYgKCB0aGlzLmFjdGl2ZS5sZW5ndGggKSB7CgkJCXRoaXMubG9hZCggb3B0aW9ucy5hY3RpdmUgKTsKCQl9Cgl9LAoKCV9nZXRDcmVhdGVFdmVudERhdGE6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB7CgkJCXRhYjogdGhpcy5hY3RpdmUsCgkJCXBhbmVsOiAhdGhpcy5hY3RpdmUubGVuZ3RoID8gJCgpIDogdGhpcy5fZ2V0UGFuZWxGb3JUYWIoIHRoaXMuYWN0aXZlICkKCQl9OwoJfSwKCglfdGFiS2V5ZG93bjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXZhciBmb2N1c2VkVGFiID0gJCggdGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50ICkuY2xvc2VzdCggImxpIiApLAoJCQlzZWxlY3RlZEluZGV4ID0gdGhpcy50YWJzLmluZGV4KCBmb2N1c2VkVGFiICksCgkJCWdvaW5nRm9yd2FyZCA9IHRydWU7CgoJCWlmICggdGhpcy5faGFuZGxlUGFnZU5hdiggZXZlbnQgKSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJc3dpdGNoICggZXZlbnQua2V5Q29kZSApIHsKCQkJY2FzZSAkLnVpLmtleUNvZGUuUklHSFQ6CgkJCWNhc2UgJC51aS5rZXlDb2RlLkRPV046CgkJCQlzZWxlY3RlZEluZGV4Kys7CgkJCQlicmVhazsKCQkJY2FzZSAkLnVpLmtleUNvZGUuVVA6CgkJCWNhc2UgJC51aS5rZXlDb2RlLkxFRlQ6CgkJCQlnb2luZ0ZvcndhcmQgPSBmYWxzZTsKCQkJCXNlbGVjdGVkSW5kZXgtLTsKCQkJCWJyZWFrOwoJCQljYXNlICQudWkua2V5Q29kZS5FTkQ6CgkJCQlzZWxlY3RlZEluZGV4ID0gdGhpcy5hbmNob3JzLmxlbmd0aCAtIDE7CgkJCQlicmVhazsKCQkJY2FzZSAkLnVpLmtleUNvZGUuSE9NRToKCQkJCXNlbGVjdGVkSW5kZXggPSAwOwoJCQkJYnJlYWs7CgkJCWNhc2UgJC51aS5rZXlDb2RlLlNQQUNFOgoJCQkJLy8gQWN0aXZhdGUgb25seSwgbm8gY29sbGFwc2luZwoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCWNsZWFyVGltZW91dCggdGhpcy5hY3RpdmF0aW5nICk7CgkJCQl0aGlzLl9hY3RpdmF0ZSggc2VsZWN0ZWRJbmRleCApOwoJCQkJcmV0dXJuOwoJCQljYXNlICQudWkua2V5Q29kZS5FTlRFUjoKCQkJCS8vIFRvZ2dsZSAoY2FuY2VsIGRlbGF5ZWQgYWN0aXZhdGlvbiwgYWxsb3cgY29sbGFwc2luZykKCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQljbGVhclRpbWVvdXQoIHRoaXMuYWN0aXZhdGluZyApOwoJCQkJLy8gRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBjb2xsYXBzZSBvciBhY3RpdmF0ZQoJCQkJdGhpcy5fYWN0aXZhdGUoIHNlbGVjdGVkSW5kZXggPT09IHRoaXMub3B0aW9ucy5hY3RpdmUgPyBmYWxzZSA6IHNlbGVjdGVkSW5kZXggKTsKCQkJCXJldHVybjsKCQkJZGVmYXVsdDoKCQkJCXJldHVybjsKCQl9CgoJCS8vIEZvY3VzIHRoZSBhcHByb3ByaWF0ZSB0YWIsIGJhc2VkIG9uIHdoaWNoIGtleSB3YXMgcHJlc3NlZAoJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJY2xlYXJUaW1lb3V0KCB0aGlzLmFjdGl2YXRpbmcgKTsKCQlzZWxlY3RlZEluZGV4ID0gdGhpcy5fZm9jdXNOZXh0VGFiKCBzZWxlY3RlZEluZGV4LCBnb2luZ0ZvcndhcmQgKTsKCgkJLy8gTmF2aWdhdGluZyB3aXRoIGNvbnRyb2wga2V5IHdpbGwgcHJldmVudCBhdXRvbWF0aWMgYWN0aXZhdGlvbgoJCWlmICggIWV2ZW50LmN0cmxLZXkgKSB7CgkJCS8vIFVwZGF0ZSBhcmlhLXNlbGVjdGVkIGltbWVkaWF0ZWx5IHNvIHRoYXQgQVQgdGhpbmsgdGhlIHRhYiBpcyBhbHJlYWR5IHNlbGVjdGVkLgoJCQkvLyBPdGhlcndpc2UgQVQgbWF5IGNvbmZ1c2UgdGhlIHVzZXIgYnkgc3RhdGluZyB0aGF0IHRoZXkgbmVlZCB0byBhY3RpdmF0ZSB0aGUgdGFiLAoJCQkvLyBidXQgdGhlIHRhYiB3aWxsIGFscmVhZHkgYmUgYWN0aXZhdGVkIGJ5IHRoZSB0aW1lIHRoZSBhbm5vdW5jZW1lbnQgZmluaXNoZXMuCgkJCWZvY3VzZWRUYWIuYXR0ciggImFyaWEtc2VsZWN0ZWQiLCAiZmFsc2UiICk7CgkJCXRoaXMudGFicy5lcSggc2VsZWN0ZWRJbmRleCApLmF0dHIoICJhcmlhLXNlbGVjdGVkIiwgInRydWUiICk7CgoJCQl0aGlzLmFjdGl2YXRpbmcgPSB0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJCXRoaXMub3B0aW9uKCAiYWN0aXZlIiwgc2VsZWN0ZWRJbmRleCApOwoJCQl9LCB0aGlzLmRlbGF5ICk7CgkJfQoJfSwKCglfcGFuZWxLZXlkb3duOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCB0aGlzLl9oYW5kbGVQYWdlTmF2KCBldmVudCApICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBDdHJsK3VwIG1vdmVzIGZvY3VzIHRvIHRoZSBjdXJyZW50IHRhYgoJCWlmICggZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXlDb2RlID09PSAkLnVpLmtleUNvZGUuVVAgKSB7CgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCXRoaXMuYWN0aXZlLmZvY3VzKCk7CgkJfQoJfSwKCgkvLyBBbHQrcGFnZSB1cC9kb3duIG1vdmVzIGZvY3VzIHRvIHRoZSBwcmV2aW91cy9uZXh0IHRhYiAoYW5kIGFjdGl2YXRlcykKCV9oYW5kbGVQYWdlTmF2OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCBldmVudC5hbHRLZXkgJiYgZXZlbnQua2V5Q29kZSA9PT0gJC51aS5rZXlDb2RlLlBBR0VfVVAgKSB7CgkJCXRoaXMuX2FjdGl2YXRlKCB0aGlzLl9mb2N1c05leHRUYWIoIHRoaXMub3B0aW9ucy5hY3RpdmUgLSAxLCBmYWxzZSApICk7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlpZiAoIGV2ZW50LmFsdEtleSAmJiBldmVudC5rZXlDb2RlID09PSAkLnVpLmtleUNvZGUuUEFHRV9ET1dOICkgewoJCQl0aGlzLl9hY3RpdmF0ZSggdGhpcy5fZm9jdXNOZXh0VGFiKCB0aGlzLm9wdGlvbnMuYWN0aXZlICsgMSwgdHJ1ZSApICk7CgkJCXJldHVybiB0cnVlOwoJCX0KCX0sCgoJX2ZpbmROZXh0VGFiOiBmdW5jdGlvbiggaW5kZXgsIGdvaW5nRm9yd2FyZCApIHsKCQl2YXIgbGFzdFRhYkluZGV4ID0gdGhpcy50YWJzLmxlbmd0aCAtIDE7CgoJCWZ1bmN0aW9uIGNvbnN0cmFpbigpIHsKCQkJaWYgKCBpbmRleCA+IGxhc3RUYWJJbmRleCApIHsKCQkJCWluZGV4ID0gMDsKCQkJfQoJCQlpZiAoIGluZGV4IDwgMCApIHsKCQkJCWluZGV4ID0gbGFzdFRhYkluZGV4OwoJCQl9CgkJCXJldHVybiBpbmRleDsKCQl9CgoJCXdoaWxlICggJC5pbkFycmF5KCBjb25zdHJhaW4oKSwgdGhpcy5vcHRpb25zLmRpc2FibGVkICkgIT09IC0xICkgewoJCQlpbmRleCA9IGdvaW5nRm9yd2FyZCA/IGluZGV4ICsgMSA6IGluZGV4IC0gMTsKCQl9CgoJCXJldHVybiBpbmRleDsKCX0sCgoJX2ZvY3VzTmV4dFRhYjogZnVuY3Rpb24oIGluZGV4LCBnb2luZ0ZvcndhcmQgKSB7CgkJaW5kZXggPSB0aGlzLl9maW5kTmV4dFRhYiggaW5kZXgsIGdvaW5nRm9yd2FyZCApOwoJCXRoaXMudGFicy5lcSggaW5kZXggKS5mb2N1cygpOwoJCXJldHVybiBpbmRleDsKCX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJaWYgKCBrZXkgPT09ICJhY3RpdmUiICkgewoJCQkvLyBfYWN0aXZhdGUoKSB3aWxsIGhhbmRsZSBpbnZhbGlkIHZhbHVlcyBhbmQgdXBkYXRlIHRoaXMub3B0aW9ucwoJCQl0aGlzLl9hY3RpdmF0ZSggdmFsdWUgKTsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBrZXkgPT09ICJkaXNhYmxlZCIgKSB7CgkJCS8vIGRvbid0IHVzZSB0aGUgd2lkZ2V0IGZhY3RvcnkncyBkaXNhYmxlZCBoYW5kbGluZwoJCQl0aGlzLl9zZXR1cERpc2FibGVkKCB2YWx1ZSApOwoJCQlyZXR1cm47CgkJfQoKCQl0aGlzLl9zdXBlcigga2V5LCB2YWx1ZSk7CgoJCWlmICgga2V5ID09PSAiY29sbGFwc2libGUiICkgewoJCQl0aGlzLmVsZW1lbnQudG9nZ2xlQ2xhc3MoICJ1aS10YWJzLWNvbGxhcHNpYmxlIiwgdmFsdWUgKTsKCQkJLy8gU2V0dGluZyBjb2xsYXBzaWJsZTogZmFsc2Ugd2hpbGUgY29sbGFwc2VkOyBvcGVuIGZpcnN0IHBhbmVsCgkJCWlmICggIXZhbHVlICYmIHRoaXMub3B0aW9ucy5hY3RpdmUgPT09IGZhbHNlICkgewoJCQkJdGhpcy5fYWN0aXZhdGUoIDAgKTsKCQkJfQoJCX0KCgkJaWYgKCBrZXkgPT09ICJldmVudCIgKSB7CgkJCXRoaXMuX3NldHVwRXZlbnRzKCB2YWx1ZSApOwoJCX0KCgkJaWYgKCBrZXkgPT09ICJoZWlnaHRTdHlsZSIgKSB7CgkJCXRoaXMuX3NldHVwSGVpZ2h0U3R5bGUoIHZhbHVlICk7CgkJfQoJfSwKCglfdGFiSWQ6IGZ1bmN0aW9uKCB0YWIgKSB7CgkJcmV0dXJuIHRhYi5hdHRyKCAiYXJpYS1jb250cm9scyIgKSB8fCAidWktdGFicy0iICsgZ2V0TmV4dFRhYklkKCk7Cgl9LAoKCV9zYW5pdGl6ZVNlbGVjdG9yOiBmdW5jdGlvbiggaGFzaCApIHsKCQlyZXR1cm4gaGFzaCA/IGhhc2gucmVwbGFjZSggL1shIiQlJicoKSorLC5cLzo7PD0+P0BcW1xdXF5ge3x9fl0vZywgIlxcJCYiICkgOiAiIjsKCX0sCgoJcmVmcmVzaDogZnVuY3Rpb24oKSB7CgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsCgkJCWxpcyA9IHRoaXMudGFibGlzdC5jaGlsZHJlbiggIjpoYXMoYVtocmVmXSkiICk7CgoJCS8vIGdldCBkaXNhYmxlZCB0YWJzIGZyb20gY2xhc3MgYXR0cmlidXRlIGZyb20gSFRNTAoJCS8vIHRoaXMgd2lsbCBnZXQgY29udmVydGVkIHRvIGEgYm9vbGVhbiBpZiBuZWVkZWQgaW4gX3JlZnJlc2goKQoJCW9wdGlvbnMuZGlzYWJsZWQgPSAkLm1hcCggbGlzLmZpbHRlciggIi51aS1zdGF0ZS1kaXNhYmxlZCIgKSwgZnVuY3Rpb24oIHRhYiApIHsKCQkJcmV0dXJuIGxpcy5pbmRleCggdGFiICk7CgkJfSk7CgoJCXRoaXMuX3Byb2Nlc3NUYWJzKCk7CgoJCS8vIHdhcyBjb2xsYXBzZWQgb3Igbm8gdGFicwoJCWlmICggb3B0aW9ucy5hY3RpdmUgPT09IGZhbHNlIHx8ICF0aGlzLmFuY2hvcnMubGVuZ3RoICkgewoJCQlvcHRpb25zLmFjdGl2ZSA9IGZhbHNlOwoJCQl0aGlzLmFjdGl2ZSA9ICQoKTsKCQkvLyB3YXMgYWN0aXZlLCBidXQgYWN0aXZlIHRhYiBpcyBnb25lCgkJfSBlbHNlIGlmICggdGhpcy5hY3RpdmUubGVuZ3RoICYmICEkLmNvbnRhaW5zKCB0aGlzLnRhYmxpc3RbIDAgXSwgdGhpcy5hY3RpdmVbIDAgXSApICkgewoJCQkvLyBhbGwgcmVtYWluaW5nIHRhYnMgYXJlIGRpc2FibGVkCgkJCWlmICggdGhpcy50YWJzLmxlbmd0aCA9PT0gb3B0aW9ucy5kaXNhYmxlZC5sZW5ndGggKSB7CgkJCQlvcHRpb25zLmFjdGl2ZSA9IGZhbHNlOwoJCQkJdGhpcy5hY3RpdmUgPSAkKCk7CgkJCS8vIGFjdGl2YXRlIHByZXZpb3VzIHRhYgoJCQl9IGVsc2UgewoJCQkJdGhpcy5fYWN0aXZhdGUoIHRoaXMuX2ZpbmROZXh0VGFiKCBNYXRoLm1heCggMCwgb3B0aW9ucy5hY3RpdmUgLSAxICksIGZhbHNlICkgKTsKCQkJfQoJCS8vIHdhcyBhY3RpdmUsIGFjdGl2ZSB0YWIgc3RpbGwgZXhpc3RzCgkJfSBlbHNlIHsKCQkJLy8gbWFrZSBzdXJlIGFjdGl2ZSBpbmRleCBpcyBjb3JyZWN0CgkJCW9wdGlvbnMuYWN0aXZlID0gdGhpcy50YWJzLmluZGV4KCB0aGlzLmFjdGl2ZSApOwoJCX0KCgkJdGhpcy5fcmVmcmVzaCgpOwoJfSwKCglfcmVmcmVzaDogZnVuY3Rpb24oKSB7CgkJdGhpcy5fc2V0dXBEaXNhYmxlZCggdGhpcy5vcHRpb25zLmRpc2FibGVkICk7CgkJdGhpcy5fc2V0dXBFdmVudHMoIHRoaXMub3B0aW9ucy5ldmVudCApOwoJCXRoaXMuX3NldHVwSGVpZ2h0U3R5bGUoIHRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZSApOwoKCQl0aGlzLnRhYnMubm90KCB0aGlzLmFjdGl2ZSApLmF0dHIoewoJCQkiYXJpYS1zZWxlY3RlZCI6ICJmYWxzZSIsCgkJCXRhYkluZGV4OiAtMQoJCX0pOwoJCXRoaXMucGFuZWxzLm5vdCggdGhpcy5fZ2V0UGFuZWxGb3JUYWIoIHRoaXMuYWN0aXZlICkgKQoJCQkuaGlkZSgpCgkJCS5hdHRyKHsKCQkJCSJhcmlhLWV4cGFuZGVkIjogImZhbHNlIiwKCQkJCSJhcmlhLWhpZGRlbiI6ICJ0cnVlIgoJCQl9KTsKCgkJLy8gTWFrZSBzdXJlIG9uZSB0YWIgaXMgaW4gdGhlIHRhYiBvcmRlcgoJCWlmICggIXRoaXMuYWN0aXZlLmxlbmd0aCApIHsKCQkJdGhpcy50YWJzLmVxKCAwICkuYXR0ciggInRhYkluZGV4IiwgMCApOwoJCX0gZWxzZSB7CgkJCXRoaXMuYWN0aXZlCgkJCQkuYWRkQ2xhc3MoICJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiICkKCQkJCS5hdHRyKHsKCQkJCQkiYXJpYS1zZWxlY3RlZCI6ICJ0cnVlIiwKCQkJCQl0YWJJbmRleDogMAoJCQkJfSk7CgkJCXRoaXMuX2dldFBhbmVsRm9yVGFiKCB0aGlzLmFjdGl2ZSApCgkJCQkuc2hvdygpCgkJCQkuYXR0cih7CgkJCQkJImFyaWEtZXhwYW5kZWQiOiAidHJ1ZSIsCgkJCQkJImFyaWEtaGlkZGVuIjogImZhbHNlIgoJCQkJfSk7CgkJfQoJfSwKCglfcHJvY2Vzc1RhYnM6IGZ1bmN0aW9uKCkgewoJCXZhciB0aGF0ID0gdGhpczsKCgkJdGhpcy50YWJsaXN0ID0gdGhpcy5fZ2V0TGlzdCgpCgkJCS5hZGRDbGFzcyggInVpLXRhYnMtbmF2IHVpLWhlbHBlci1yZXNldCB1aS1oZWxwZXItY2xlYXJmaXggdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIiApCgkJCS5hdHRyKCAicm9sZSIsICJ0YWJsaXN0IiApOwoKCQl0aGlzLnRhYnMgPSB0aGlzLnRhYmxpc3QuZmluZCggIj4gbGk6aGFzKGFbaHJlZl0pIiApCgkJCS5hZGRDbGFzcyggInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLXRvcCIgKQoJCQkuYXR0cih7CgkJCQlyb2xlOiAidGFiIiwKCQkJCXRhYkluZGV4OiAtMQoJCQl9KTsKCgkJdGhpcy5hbmNob3JzID0gdGhpcy50YWJzLm1hcChmdW5jdGlvbigpIHsKCQkJCXJldHVybiAkKCAiYSIsIHRoaXMgKVsgMCBdOwoJCQl9KQoJCQkuYWRkQ2xhc3MoICJ1aS10YWJzLWFuY2hvciIgKQoJCQkuYXR0cih7CgkJCQlyb2xlOiAicHJlc2VudGF0aW9uIiwKCQkJCXRhYkluZGV4OiAtMQoJCQl9KTsKCgkJdGhpcy5wYW5lbHMgPSAkKCk7CgoJCXRoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKCBpLCBhbmNob3IgKSB7CgkJCXZhciBzZWxlY3RvciwgcGFuZWwsIHBhbmVsSWQsCgkJCQlhbmNob3JJZCA9ICQoIGFuY2hvciApLnVuaXF1ZUlkKCkuYXR0ciggImlkIiApLAoJCQkJdGFiID0gJCggYW5jaG9yICkuY2xvc2VzdCggImxpIiApLAoJCQkJb3JpZ2luYWxBcmlhQ29udHJvbHMgPSB0YWIuYXR0ciggImFyaWEtY29udHJvbHMiICk7CgoJCQkvLyBpbmxpbmUgdGFiCgkJCWlmICggaXNMb2NhbCggYW5jaG9yICkgKSB7CgkJCQlzZWxlY3RvciA9IGFuY2hvci5oYXNoOwoJCQkJcGFuZWwgPSB0aGF0LmVsZW1lbnQuZmluZCggdGhhdC5fc2FuaXRpemVTZWxlY3Rvciggc2VsZWN0b3IgKSApOwoJCQkvLyByZW1vdGUgdGFiCgkJCX0gZWxzZSB7CgkJCQlwYW5lbElkID0gdGhhdC5fdGFiSWQoIHRhYiApOwoJCQkJc2VsZWN0b3IgPSAiIyIgKyBwYW5lbElkOwoJCQkJcGFuZWwgPSB0aGF0LmVsZW1lbnQuZmluZCggc2VsZWN0b3IgKTsKCQkJCWlmICggIXBhbmVsLmxlbmd0aCApIHsKCQkJCQlwYW5lbCA9IHRoYXQuX2NyZWF0ZVBhbmVsKCBwYW5lbElkICk7CgkJCQkJcGFuZWwuaW5zZXJ0QWZ0ZXIoIHRoYXQucGFuZWxzWyBpIC0gMSBdIHx8IHRoYXQudGFibGlzdCApOwoJCQkJfQoJCQkJcGFuZWwuYXR0ciggImFyaWEtbGl2ZSIsICJwb2xpdGUiICk7CgkJCX0KCgkJCWlmICggcGFuZWwubGVuZ3RoKSB7CgkJCQl0aGF0LnBhbmVscyA9IHRoYXQucGFuZWxzLmFkZCggcGFuZWwgKTsKCQkJfQoJCQlpZiAoIG9yaWdpbmFsQXJpYUNvbnRyb2xzICkgewoJCQkJdGFiLmRhdGEoICJ1aS10YWJzLWFyaWEtY29udHJvbHMiLCBvcmlnaW5hbEFyaWFDb250cm9scyApOwoJCQl9CgkJCXRhYi5hdHRyKHsKCQkJCSJhcmlhLWNvbnRyb2xzIjogc2VsZWN0b3Iuc3Vic3RyaW5nKCAxICksCgkJCQkiYXJpYS1sYWJlbGxlZGJ5IjogYW5jaG9ySWQKCQkJfSk7CgkJCXBhbmVsLmF0dHIoICJhcmlhLWxhYmVsbGVkYnkiLCBhbmNob3JJZCApOwoJCX0pOwoKCQl0aGlzLnBhbmVscwoJCQkuYWRkQ2xhc3MoICJ1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iICkKCQkJLmF0dHIoICJyb2xlIiwgInRhYnBhbmVsIiApOwoJfSwKCgkvLyBhbGxvdyBvdmVycmlkaW5nIGhvdyB0byBmaW5kIHRoZSBsaXN0IGZvciByYXJlIHVzYWdlIHNjZW5hcmlvcyAoIzc3MTUpCglfZ2V0TGlzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudC5maW5kKCAib2wsdWwiICkuZXEoIDAgKTsKCX0sCgoJX2NyZWF0ZVBhbmVsOiBmdW5jdGlvbiggaWQgKSB7CgkJcmV0dXJuICQoICI8ZGl2PiIgKQoJCQkuYXR0ciggImlkIiwgaWQgKQoJCQkuYWRkQ2xhc3MoICJ1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iICkKCQkJLmRhdGEoICJ1aS10YWJzLWRlc3Ryb3kiLCB0cnVlICk7Cgl9LAoKCV9zZXR1cERpc2FibGVkOiBmdW5jdGlvbiggZGlzYWJsZWQgKSB7CgkJaWYgKCAkLmlzQXJyYXkoIGRpc2FibGVkICkgKSB7CgkJCWlmICggIWRpc2FibGVkLmxlbmd0aCApIHsKCQkJCWRpc2FibGVkID0gZmFsc2U7CgkJCX0gZWxzZSBpZiAoIGRpc2FibGVkLmxlbmd0aCA9PT0gdGhpcy5hbmNob3JzLmxlbmd0aCApIHsKCQkJCWRpc2FibGVkID0gdHJ1ZTsKCQkJfQoJCX0KCgkJLy8gZGlzYWJsZSB0YWJzCgkJZm9yICggdmFyIGkgPSAwLCBsaTsgKCBsaSA9IHRoaXMudGFic1sgaSBdICk7IGkrKyApIHsKCQkJaWYgKCBkaXNhYmxlZCA9PT0gdHJ1ZSB8fCAkLmluQXJyYXkoIGksIGRpc2FibGVkICkgIT09IC0xICkgewoJCQkJJCggbGkgKQoJCQkJCS5hZGRDbGFzcyggInVpLXN0YXRlLWRpc2FibGVkIiApCgkJCQkJLmF0dHIoICJhcmlhLWRpc2FibGVkIiwgInRydWUiICk7CgkJCX0gZWxzZSB7CgkJCQkkKCBsaSApCgkJCQkJLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkKCQkJCQkucmVtb3ZlQXR0ciggImFyaWEtZGlzYWJsZWQiICk7CgkJCX0KCQl9CgoJCXRoaXMub3B0aW9ucy5kaXNhYmxlZCA9IGRpc2FibGVkOwoJfSwKCglfc2V0dXBFdmVudHM6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgZXZlbnRzID0gewoJCQljbGljazogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJfQoJCX07CgkJaWYgKCBldmVudCApIHsKCQkJJC5lYWNoKCBldmVudC5zcGxpdCgiICIpLCBmdW5jdGlvbiggaW5kZXgsIGV2ZW50TmFtZSApIHsKCQkJCWV2ZW50c1sgZXZlbnROYW1lIF0gPSAiX2V2ZW50SGFuZGxlciI7CgkJCX0pOwoJCX0KCgkJdGhpcy5fb2ZmKCB0aGlzLmFuY2hvcnMuYWRkKCB0aGlzLnRhYnMgKS5hZGQoIHRoaXMucGFuZWxzICkgKTsKCQl0aGlzLl9vbiggdGhpcy5hbmNob3JzLCBldmVudHMgKTsKCQl0aGlzLl9vbiggdGhpcy50YWJzLCB7IGtleWRvd246ICJfdGFiS2V5ZG93biIgfSApOwoJCXRoaXMuX29uKCB0aGlzLnBhbmVscywgeyBrZXlkb3duOiAiX3BhbmVsS2V5ZG93biIgfSApOwoKCQl0aGlzLl9mb2N1c2FibGUoIHRoaXMudGFicyApOwoJCXRoaXMuX2hvdmVyYWJsZSggdGhpcy50YWJzICk7Cgl9LAoKCV9zZXR1cEhlaWdodFN0eWxlOiBmdW5jdGlvbiggaGVpZ2h0U3R5bGUgKSB7CgkJdmFyIG1heEhlaWdodCwgb3ZlcmZsb3csCgkJCXBhcmVudCA9IHRoaXMuZWxlbWVudC5wYXJlbnQoKTsKCgkJaWYgKCBoZWlnaHRTdHlsZSA9PT0gImZpbGwiICkgewoJCQkvLyBJRSA2IHRyZWF0cyBoZWlnaHQgbGlrZSBtaW5IZWlnaHQsIHNvIHdlIG5lZWQgdG8gdHVybiBvZmYgb3ZlcmZsb3cKCQkJLy8gaW4gb3JkZXIgdG8gZ2V0IGEgcmVsaWFibGUgaGVpZ2h0CgkJCS8vIHdlIHVzZSB0aGUgbWluSGVpZ2h0IHN1cHBvcnQgdGVzdCBiZWNhdXNlIHdlIGFzc3VtZSB0aGF0IG9ubHkKCQkJLy8gYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IG1pbkhlaWdodCB3aWxsIHRyZWF0IGhlaWdodCBhcyBtaW5IZWlnaHQKCQkJaWYgKCAhJC5zdXBwb3J0Lm1pbkhlaWdodCApIHsKCQkJCW92ZXJmbG93ID0gcGFyZW50LmNzcyggIm92ZXJmbG93IiApOwoJCQkJcGFyZW50LmNzcyggIm92ZXJmbG93IiwgImhpZGRlbiIpOwoJCQl9CgkJCW1heEhlaWdodCA9IHBhcmVudC5oZWlnaHQoKTsKCQkJdGhpcy5lbGVtZW50LnNpYmxpbmdzKCAiOnZpc2libGUiICkuZWFjaChmdW5jdGlvbigpIHsKCQkJCXZhciBlbGVtID0gJCggdGhpcyApLAoJCQkJCXBvc2l0aW9uID0gZWxlbS5jc3MoICJwb3NpdGlvbiIgKTsKCgkJCQlpZiAoIHBvc2l0aW9uID09PSAiYWJzb2x1dGUiIHx8IHBvc2l0aW9uID09PSAiZml4ZWQiICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCW1heEhlaWdodCAtPSBlbGVtLm91dGVySGVpZ2h0KCB0cnVlICk7CgkJCX0pOwoJCQlpZiAoIG92ZXJmbG93ICkgewoJCQkJcGFyZW50LmNzcyggIm92ZXJmbG93Iiwgb3ZlcmZsb3cgKTsKCQkJfQoKCQkJdGhpcy5lbGVtZW50LmNoaWxkcmVuKCkubm90KCB0aGlzLnBhbmVscyApLmVhY2goZnVuY3Rpb24oKSB7CgkJCQltYXhIZWlnaHQgLT0gJCggdGhpcyApLm91dGVySGVpZ2h0KCB0cnVlICk7CgkJCX0pOwoKCQkJdGhpcy5wYW5lbHMuZWFjaChmdW5jdGlvbigpIHsKCQkJCSQoIHRoaXMgKS5oZWlnaHQoIE1hdGgubWF4KCAwLCBtYXhIZWlnaHQgLQoJCQkJCSQoIHRoaXMgKS5pbm5lckhlaWdodCgpICsgJCggdGhpcyApLmhlaWdodCgpICkgKTsKCQkJfSkKCQkJLmNzcyggIm92ZXJmbG93IiwgImF1dG8iICk7CgkJfSBlbHNlIGlmICggaGVpZ2h0U3R5bGUgPT09ICJhdXRvIiApIHsKCQkJbWF4SGVpZ2h0ID0gMDsKCQkJdGhpcy5wYW5lbHMuZWFjaChmdW5jdGlvbigpIHsKCQkJCW1heEhlaWdodCA9IE1hdGgubWF4KCBtYXhIZWlnaHQsICQoIHRoaXMgKS5oZWlnaHQoICIiICkuaGVpZ2h0KCkgKTsKCQkJfSkuaGVpZ2h0KCBtYXhIZWlnaHQgKTsKCQl9Cgl9LAoKCV9ldmVudEhhbmRsZXI6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywKCQkJYWN0aXZlID0gdGhpcy5hY3RpdmUsCgkJCWFuY2hvciA9ICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwKCQkJdGFiID0gYW5jaG9yLmNsb3Nlc3QoICJsaSIgKSwKCQkJY2xpY2tlZElzQWN0aXZlID0gdGFiWyAwIF0gPT09IGFjdGl2ZVsgMCBdLAoJCQljb2xsYXBzaW5nID0gY2xpY2tlZElzQWN0aXZlICYmIG9wdGlvbnMuY29sbGFwc2libGUsCgkJCXRvU2hvdyA9IGNvbGxhcHNpbmcgPyAkKCkgOiB0aGlzLl9nZXRQYW5lbEZvclRhYiggdGFiICksCgkJCXRvSGlkZSA9ICFhY3RpdmUubGVuZ3RoID8gJCgpIDogdGhpcy5fZ2V0UGFuZWxGb3JUYWIoIGFjdGl2ZSApLAoJCQlldmVudERhdGEgPSB7CgkJCQlvbGRUYWI6IGFjdGl2ZSwKCQkJCW9sZFBhbmVsOiB0b0hpZGUsCgkJCQluZXdUYWI6IGNvbGxhcHNpbmcgPyAkKCkgOiB0YWIsCgkJCQluZXdQYW5lbDogdG9TaG93CgkJCX07CgoJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCWlmICggdGFiLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgfHwKCQkJCS8vIHRhYiBpcyBhbHJlYWR5IGxvYWRpbmcKCQkJCXRhYi5oYXNDbGFzcyggInVpLXRhYnMtbG9hZGluZyIgKSB8fAoJCQkJLy8gY2FuJ3Qgc3dpdGNoIGR1cm5pbmcgYW4gYW5pbWF0aW9uCgkJCQl0aGlzLnJ1bm5pbmcgfHwKCQkJCS8vIGNsaWNrIG9uIGFjdGl2ZSBoZWFkZXIsIGJ1dCBub3QgY29sbGFwc2libGUKCQkJCSggY2xpY2tlZElzQWN0aXZlICYmICFvcHRpb25zLmNvbGxhcHNpYmxlICkgfHwKCQkJCS8vIGFsbG93IGNhbmNlbGluZyBhY3RpdmF0aW9uCgkJCQkoIHRoaXMuX3RyaWdnZXIoICJiZWZvcmVBY3RpdmF0ZSIsIGV2ZW50LCBldmVudERhdGEgKSA9PT0gZmFsc2UgKSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJb3B0aW9ucy5hY3RpdmUgPSBjb2xsYXBzaW5nID8gZmFsc2UgOiB0aGlzLnRhYnMuaW5kZXgoIHRhYiApOwoKCQl0aGlzLmFjdGl2ZSA9IGNsaWNrZWRJc0FjdGl2ZSA/ICQoKSA6IHRhYjsKCQlpZiAoIHRoaXMueGhyICkgewoJCQl0aGlzLnhoci5hYm9ydCgpOwoJCX0KCgkJaWYgKCAhdG9IaWRlLmxlbmd0aCAmJiAhdG9TaG93Lmxlbmd0aCApIHsKCQkJJC5lcnJvciggImpRdWVyeSBVSSBUYWJzOiBNaXNtYXRjaGluZyBmcmFnbWVudCBpZGVudGlmaWVyLiIgKTsKCQl9CgoJCWlmICggdG9TaG93Lmxlbmd0aCApIHsKCQkJdGhpcy5sb2FkKCB0aGlzLnRhYnMuaW5kZXgoIHRhYiApLCBldmVudCApOwoJCX0KCQl0aGlzLl90b2dnbGUoIGV2ZW50LCBldmVudERhdGEgKTsKCX0sCgoJLy8gaGFuZGxlcyBzaG93L2hpZGUgZm9yIHNlbGVjdGluZyB0YWJzCglfdG9nZ2xlOiBmdW5jdGlvbiggZXZlbnQsIGV2ZW50RGF0YSApIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCXRvU2hvdyA9IGV2ZW50RGF0YS5uZXdQYW5lbCwKCQkJdG9IaWRlID0gZXZlbnREYXRhLm9sZFBhbmVsOwoKCQl0aGlzLnJ1bm5pbmcgPSB0cnVlOwoKCQlmdW5jdGlvbiBjb21wbGV0ZSgpIHsKCQkJdGhhdC5ydW5uaW5nID0gZmFsc2U7CgkJCXRoYXQuX3RyaWdnZXIoICJhY3RpdmF0ZSIsIGV2ZW50LCBldmVudERhdGEgKTsKCQl9CgoJCWZ1bmN0aW9uIHNob3coKSB7CgkJCWV2ZW50RGF0YS5uZXdUYWIuY2xvc2VzdCggImxpIiApLmFkZENsYXNzKCAidWktdGFicy1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIiApOwoKCQkJaWYgKCB0b1Nob3cubGVuZ3RoICYmIHRoYXQub3B0aW9ucy5zaG93ICkgewoJCQkJdGhhdC5fc2hvdyggdG9TaG93LCB0aGF0Lm9wdGlvbnMuc2hvdywgY29tcGxldGUgKTsKCQkJfSBlbHNlIHsKCQkJCXRvU2hvdy5zaG93KCk7CgkJCQljb21wbGV0ZSgpOwoJCQl9CgkJfQoKCQkvLyBzdGFydCBvdXQgYnkgaGlkaW5nLCB0aGVuIHNob3dpbmcsIHRoZW4gY29tcGxldGluZwoJCWlmICggdG9IaWRlLmxlbmd0aCAmJiB0aGlzLm9wdGlvbnMuaGlkZSApIHsKCQkJdGhpcy5faGlkZSggdG9IaWRlLCB0aGlzLm9wdGlvbnMuaGlkZSwgZnVuY3Rpb24oKSB7CgkJCQlldmVudERhdGEub2xkVGFiLmNsb3Nlc3QoICJsaSIgKS5yZW1vdmVDbGFzcyggInVpLXRhYnMtYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIgKTsKCQkJCXNob3coKTsKCQkJfSk7CgkJfSBlbHNlIHsKCQkJZXZlbnREYXRhLm9sZFRhYi5jbG9zZXN0KCAibGkiICkucmVtb3ZlQ2xhc3MoICJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCXRvSGlkZS5oaWRlKCk7CgkJCXNob3coKTsKCQl9CgoJCXRvSGlkZS5hdHRyKHsKCQkJImFyaWEtZXhwYW5kZWQiOiAiZmFsc2UiLAoJCQkiYXJpYS1oaWRkZW4iOiAidHJ1ZSIKCQl9KTsKCQlldmVudERhdGEub2xkVGFiLmF0dHIoICJhcmlhLXNlbGVjdGVkIiwgImZhbHNlIiApOwoJCS8vIElmIHdlJ3JlIHN3aXRjaGluZyB0YWJzLCByZW1vdmUgdGhlIG9sZCB0YWIgZnJvbSB0aGUgdGFiIG9yZGVyLgoJCS8vIElmIHdlJ3JlIG9wZW5pbmcgZnJvbSBjb2xsYXBzZWQgc3RhdGUsIHJlbW92ZSB0aGUgcHJldmlvdXMgdGFiIGZyb20gdGhlIHRhYiBvcmRlci4KCQkvLyBJZiB3ZSdyZSBjb2xsYXBzaW5nLCB0aGVuIGtlZXAgdGhlIGNvbGxhcHNpbmcgdGFiIGluIHRoZSB0YWIgb3JkZXIuCgkJaWYgKCB0b1Nob3cubGVuZ3RoICYmIHRvSGlkZS5sZW5ndGggKSB7CgkJCWV2ZW50RGF0YS5vbGRUYWIuYXR0ciggInRhYkluZGV4IiwgLTEgKTsKCQl9IGVsc2UgaWYgKCB0b1Nob3cubGVuZ3RoICkgewoJCQl0aGlzLnRhYnMuZmlsdGVyKGZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuICQoIHRoaXMgKS5hdHRyKCAidGFiSW5kZXgiICkgPT09IDA7CgkJCX0pCgkJCS5hdHRyKCAidGFiSW5kZXgiLCAtMSApOwoJCX0KCgkJdG9TaG93LmF0dHIoewoJCQkiYXJpYS1leHBhbmRlZCI6ICJ0cnVlIiwKCQkJImFyaWEtaGlkZGVuIjogImZhbHNlIgoJCX0pOwoJCWV2ZW50RGF0YS5uZXdUYWIuYXR0cih7CgkJCSJhcmlhLXNlbGVjdGVkIjogInRydWUiLAoJCQl0YWJJbmRleDogMAoJCX0pOwoJfSwKCglfYWN0aXZhdGU6IGZ1bmN0aW9uKCBpbmRleCApIHsKCQl2YXIgYW5jaG9yLAoJCQlhY3RpdmUgPSB0aGlzLl9maW5kQWN0aXZlKCBpbmRleCApOwoKCQkvLyB0cnlpbmcgdG8gYWN0aXZhdGUgdGhlIGFscmVhZHkgYWN0aXZlIHBhbmVsCgkJaWYgKCBhY3RpdmVbIDAgXSA9PT0gdGhpcy5hY3RpdmVbIDAgXSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gdHJ5aW5nIHRvIGNvbGxhcHNlLCBzaW11bGF0ZSBhIGNsaWNrIG9uIHRoZSBjdXJyZW50IGFjdGl2ZSBoZWFkZXIKCQlpZiAoICFhY3RpdmUubGVuZ3RoICkgewoJCQlhY3RpdmUgPSB0aGlzLmFjdGl2ZTsKCQl9CgoJCWFuY2hvciA9IGFjdGl2ZS5maW5kKCAiLnVpLXRhYnMtYW5jaG9yIiApWyAwIF07CgkJdGhpcy5fZXZlbnRIYW5kbGVyKHsKCQkJdGFyZ2V0OiBhbmNob3IsCgkJCWN1cnJlbnRUYXJnZXQ6IGFuY2hvciwKCQkJcHJldmVudERlZmF1bHQ6ICQubm9vcAoJCX0pOwoJfSwKCglfZmluZEFjdGl2ZTogZnVuY3Rpb24oIGluZGV4ICkgewoJCXJldHVybiBpbmRleCA9PT0gZmFsc2UgPyAkKCkgOiB0aGlzLnRhYnMuZXEoIGluZGV4ICk7Cgl9LAoKCV9nZXRJbmRleDogZnVuY3Rpb24oIGluZGV4ICkgewoJCS8vIG1ldGEtZnVuY3Rpb24gdG8gZ2l2ZSB1c2VycyBvcHRpb24gdG8gcHJvdmlkZSBhIGhyZWYgc3RyaW5nIGluc3RlYWQgb2YgYSBudW1lcmljYWwgaW5kZXguCgkJaWYgKCB0eXBlb2YgaW5kZXggPT09ICJzdHJpbmciICkgewoJCQlpbmRleCA9IHRoaXMuYW5jaG9ycy5pbmRleCggdGhpcy5hbmNob3JzLmZpbHRlciggIltocmVmJD0nIiArIGluZGV4ICsgIiddIiApICk7CgkJfQoKCQlyZXR1cm4gaW5kZXg7Cgl9LAoKCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCQlpZiAoIHRoaXMueGhyICkgewoJCQl0aGlzLnhoci5hYm9ydCgpOwoJCX0KCgkJdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCAidWktdGFicyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCB1aS10YWJzLWNvbGxhcHNpYmxlIiApOwoKCQl0aGlzLnRhYmxpc3QKCQkJLnJlbW92ZUNsYXNzKCAidWktdGFicy1uYXYgdWktaGVscGVyLXJlc2V0IHVpLWhlbHBlci1jbGVhcmZpeCB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1hbGwiICkKCQkJLnJlbW92ZUF0dHIoICJyb2xlIiApOwoKCQl0aGlzLmFuY2hvcnMKCQkJLnJlbW92ZUNsYXNzKCAidWktdGFicy1hbmNob3IiICkKCQkJLnJlbW92ZUF0dHIoICJyb2xlIiApCgkJCS5yZW1vdmVBdHRyKCAidGFiSW5kZXgiICkKCQkJLnJlbW92ZURhdGEoICJocmVmLnRhYnMiICkKCQkJLnJlbW92ZURhdGEoICJsb2FkLnRhYnMiICkKCQkJLnJlbW92ZVVuaXF1ZUlkKCk7CgoJCXRoaXMudGFicy5hZGQoIHRoaXMucGFuZWxzICkuZWFjaChmdW5jdGlvbigpIHsKCQkJaWYgKCAkLmRhdGEoIHRoaXMsICJ1aS10YWJzLWRlc3Ryb3kiICkgKSB7CgkJCQkkKCB0aGlzICkucmVtb3ZlKCk7CgkJCX0gZWxzZSB7CgkJCQkkKCB0aGlzICkKCQkJCQkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1kZWZhdWx0IHVpLXN0YXRlLWFjdGl2ZSB1aS1zdGF0ZS1kaXNhYmxlZCAiICsKCQkJCQkJInVpLWNvcm5lci10b3AgdWktY29ybmVyLWJvdHRvbSB1aS13aWRnZXQtY29udGVudCB1aS10YWJzLWFjdGl2ZSB1aS10YWJzLXBhbmVsIiApCgkJCQkJLnJlbW92ZUF0dHIoICJ0YWJJbmRleCIgKQoJCQkJCS5yZW1vdmVBdHRyKCAiYXJpYS1saXZlIiApCgkJCQkJLnJlbW92ZUF0dHIoICJhcmlhLWJ1c3kiICkKCQkJCQkucmVtb3ZlQXR0ciggImFyaWEtc2VsZWN0ZWQiICkKCQkJCQkucmVtb3ZlQXR0ciggImFyaWEtbGFiZWxsZWRieSIgKQoJCQkJCS5yZW1vdmVBdHRyKCAiYXJpYS1oaWRkZW4iICkKCQkJCQkucmVtb3ZlQXR0ciggImFyaWEtZXhwYW5kZWQiICkKCQkJCQkucmVtb3ZlQXR0ciggInJvbGUiICk7CgkJCX0KCQl9KTsKCgkJdGhpcy50YWJzLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciBsaSA9ICQoIHRoaXMgKSwKCQkJCXByZXYgPSBsaS5kYXRhKCAidWktdGFicy1hcmlhLWNvbnRyb2xzIiApOwoJCQlpZiAoIHByZXYgKSB7CgkJCQlsaS5hdHRyKCAiYXJpYS1jb250cm9scyIsIHByZXYgKTsKCQkJfSBlbHNlIHsKCQkJCWxpLnJlbW92ZUF0dHIoICJhcmlhLWNvbnRyb2xzIiApOwoJCQl9CgkJfSk7CgoJCXRoaXMucGFuZWxzLnNob3coKTsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuaGVpZ2h0U3R5bGUgIT09ICJjb250ZW50IiApIHsKCQkJdGhpcy5wYW5lbHMuY3NzKCAiaGVpZ2h0IiwgIiIgKTsKCQl9Cgl9LAoKCWVuYWJsZTogZnVuY3Rpb24oIGluZGV4ICkgewoJCXZhciBkaXNhYmxlZCA9IHRoaXMub3B0aW9ucy5kaXNhYmxlZDsKCQlpZiAoIGRpc2FibGVkID09PSBmYWxzZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBpbmRleCA9PT0gdW5kZWZpbmVkICkgewoJCQlkaXNhYmxlZCA9IGZhbHNlOwoJCX0gZWxzZSB7CgkJCWluZGV4ID0gdGhpcy5fZ2V0SW5kZXgoIGluZGV4ICk7CgkJCWlmICggJC5pc0FycmF5KCBkaXNhYmxlZCApICkgewoJCQkJZGlzYWJsZWQgPSAkLm1hcCggZGlzYWJsZWQsIGZ1bmN0aW9uKCBudW0gKSB7CgkJCQkJcmV0dXJuIG51bSAhPT0gaW5kZXggPyBudW0gOiBudWxsOwoJCQkJfSk7CgkJCX0gZWxzZSB7CgkJCQlkaXNhYmxlZCA9ICQubWFwKCB0aGlzLnRhYnMsIGZ1bmN0aW9uKCBsaSwgbnVtICkgewoJCQkJCXJldHVybiBudW0gIT09IGluZGV4ID8gbnVtIDogbnVsbDsKCQkJCX0pOwoJCQl9CgkJfQoJCXRoaXMuX3NldHVwRGlzYWJsZWQoIGRpc2FibGVkICk7Cgl9LAoKCWRpc2FibGU6IGZ1bmN0aW9uKCBpbmRleCApIHsKCQl2YXIgZGlzYWJsZWQgPSB0aGlzLm9wdGlvbnMuZGlzYWJsZWQ7CgkJaWYgKCBkaXNhYmxlZCA9PT0gdHJ1ZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBpbmRleCA9PT0gdW5kZWZpbmVkICkgewoJCQlkaXNhYmxlZCA9IHRydWU7CgkJfSBlbHNlIHsKCQkJaW5kZXggPSB0aGlzLl9nZXRJbmRleCggaW5kZXggKTsKCQkJaWYgKCAkLmluQXJyYXkoIGluZGV4LCBkaXNhYmxlZCApICE9PSAtMSApIHsKCQkJCXJldHVybjsKCQkJfQoJCQlpZiAoICQuaXNBcnJheSggZGlzYWJsZWQgKSApIHsKCQkJCWRpc2FibGVkID0gJC5tZXJnZSggWyBpbmRleCBdLCBkaXNhYmxlZCApLnNvcnQoKTsKCQkJfSBlbHNlIHsKCQkJCWRpc2FibGVkID0gWyBpbmRleCBdOwoJCQl9CgkJfQoJCXRoaXMuX3NldHVwRGlzYWJsZWQoIGRpc2FibGVkICk7Cgl9LAoKCWxvYWQ6IGZ1bmN0aW9uKCBpbmRleCwgZXZlbnQgKSB7CgkJaW5kZXggPSB0aGlzLl9nZXRJbmRleCggaW5kZXggKTsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCXRhYiA9IHRoaXMudGFicy5lcSggaW5kZXggKSwKCQkJYW5jaG9yID0gdGFiLmZpbmQoICIudWktdGFicy1hbmNob3IiICksCgkJCXBhbmVsID0gdGhpcy5fZ2V0UGFuZWxGb3JUYWIoIHRhYiApLAoJCQlldmVudERhdGEgPSB7CgkJCQl0YWI6IHRhYiwKCQkJCXBhbmVsOiBwYW5lbAoJCQl9OwoKCQkvLyBub3QgcmVtb3RlCgkJaWYgKCBpc0xvY2FsKCBhbmNob3JbIDAgXSApICkgewoJCQlyZXR1cm47CgkJfQoKCQl0aGlzLnhociA9ICQuYWpheCggdGhpcy5fYWpheFNldHRpbmdzKCBhbmNob3IsIGV2ZW50LCBldmVudERhdGEgKSApOwoKCQkvLyBzdXBwb3J0OiBqUXVlcnkgPDEuOAoJCS8vIGpRdWVyeSA8MS44IHJldHVybnMgZmFsc2UgaWYgdGhlIHJlcXVlc3QgaXMgY2FuY2VsZWQgaW4gYmVmb3JlU2VuZCwKCQkvLyBidXQgYXMgb2YgMS44LCAkLmFqYXgoKSBhbHdheXMgcmV0dXJucyBhIGpxWEhSIG9iamVjdC4KCQlpZiAoIHRoaXMueGhyICYmIHRoaXMueGhyLnN0YXR1c1RleHQgIT09ICJjYW5jZWxlZCIgKSB7CgkJCXRhYi5hZGRDbGFzcyggInVpLXRhYnMtbG9hZGluZyIgKTsKCQkJcGFuZWwuYXR0ciggImFyaWEtYnVzeSIsICJ0cnVlIiApOwoKCQkJdGhpcy54aHIKCQkJCS5zdWNjZXNzKGZ1bmN0aW9uKCByZXNwb25zZSApIHsKCQkJCQkvLyBzdXBwb3J0OiBqUXVlcnkgPDEuOAoJCQkJCS8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzExNzc4CgkJCQkJc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQkJCQkJcGFuZWwuaHRtbCggcmVzcG9uc2UgKTsKCQkJCQkJdGhhdC5fdHJpZ2dlciggImxvYWQiLCBldmVudCwgZXZlbnREYXRhICk7CgkJCQkJfSwgMSApOwoJCQkJfSkKCQkJCS5jb21wbGV0ZShmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHsKCQkJCQkvLyBzdXBwb3J0OiBqUXVlcnkgPDEuOAoJCQkJCS8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzExNzc4CgkJCQkJc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQkJCQkJaWYgKCBzdGF0dXMgPT09ICJhYm9ydCIgKSB7CgkJCQkJCQl0aGF0LnBhbmVscy5zdG9wKCBmYWxzZSwgdHJ1ZSApOwoJCQkJCQl9CgoJCQkJCQl0YWIucmVtb3ZlQ2xhc3MoICJ1aS10YWJzLWxvYWRpbmciICk7CgkJCQkJCXBhbmVsLnJlbW92ZUF0dHIoICJhcmlhLWJ1c3kiICk7CgoJCQkJCQlpZiAoIGpxWEhSID09PSB0aGF0LnhociApIHsKCQkJCQkJCWRlbGV0ZSB0aGF0LnhocjsKCQkJCQkJfQoJCQkJCX0sIDEgKTsKCQkJCX0pOwoJCX0KCX0sCgoJLy8gVE9ETzogUmVtb3ZlIHRoaXMgZnVuY3Rpb24gaW4gMS4xMCB3aGVuIGFqYXhPcHRpb25zIGlzIHJlbW92ZWQKCV9hamF4U2V0dGluZ3M6IGZ1bmN0aW9uKCBhbmNob3IsIGV2ZW50LCBldmVudERhdGEgKSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoJCXJldHVybiB7CgkJCXVybDogYW5jaG9yLmF0dHIoICJocmVmIiApLAoJCQliZWZvcmVTZW5kOiBmdW5jdGlvbigganFYSFIsIHNldHRpbmdzICkgewoJCQkJcmV0dXJuIHRoYXQuX3RyaWdnZXIoICJiZWZvcmVMb2FkIiwgZXZlbnQsCgkJCQkJJC5leHRlbmQoIHsganFYSFIgOiBqcVhIUiwgYWpheFNldHRpbmdzOiBzZXR0aW5ncyB9LCBldmVudERhdGEgKSApOwoJCQl9CgkJfTsKCX0sCgoJX2dldFBhbmVsRm9yVGFiOiBmdW5jdGlvbiggdGFiICkgewoJCXZhciBpZCA9ICQoIHRhYiApLmF0dHIoICJhcmlhLWNvbnRyb2xzIiApOwoJCXJldHVybiB0aGlzLmVsZW1lbnQuZmluZCggdGhpcy5fc2FuaXRpemVTZWxlY3RvciggIiMiICsgaWQgKSApOwoJfQp9KTsKCi8vIERFUFJFQ0FURUQKaWYgKCAkLnVpQmFja0NvbXBhdCAhPT0gZmFsc2UgKSB7CgoJLy8gaGVscGVyIG1ldGhvZCBmb3IgYSBsb3Qgb2YgdGhlIGJhY2sgY29tcGF0IGV4dGVuc2lvbnMKCSQudWkudGFicy5wcm90b3R5cGUuX3VpID0gZnVuY3Rpb24oIHRhYiwgcGFuZWwgKSB7CgkJcmV0dXJuIHsKCQkJdGFiOiB0YWIsCgkJCXBhbmVsOiBwYW5lbCwKCQkJaW5kZXg6IHRoaXMuYW5jaG9ycy5pbmRleCggdGFiICkKCQl9OwoJfTsKCgkvLyB1cmwgbWV0aG9kCgkkLndpZGdldCggInVpLnRhYnMiLCAkLnVpLnRhYnMsIHsKCQl1cmw6IGZ1bmN0aW9uKCBpbmRleCwgdXJsICkgewoJCQl0aGlzLmFuY2hvcnMuZXEoIGluZGV4ICkuYXR0ciggImhyZWYiLCB1cmwgKTsKCQl9Cgl9KTsKCgkvLyBUT0RPOiBSZW1vdmUgX2FqYXhTZXR0aW5ncygpIG1ldGhvZCB3aGVuIHJlbW92aW5nIHRoaXMgZXh0ZW5zaW9uCgkvLyBhamF4T3B0aW9ucyBhbmQgY2FjaGUgb3B0aW9ucwoJJC53aWRnZXQoICJ1aS50YWJzIiwgJC51aS50YWJzLCB7CgkJb3B0aW9uczogewoJCQlhamF4T3B0aW9uczogbnVsbCwKCQkJY2FjaGU6IGZhbHNlCgkJfSwKCgkJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJCXRoaXMuX3N1cGVyKCk7CgoJCQl2YXIgdGhhdCA9IHRoaXM7CgoJCQl0aGlzLl9vbih7IHRhYnNiZWZvcmVsb2FkOiBmdW5jdGlvbiggZXZlbnQsIHVpICkgewoJCQkJLy8gdGFiIGlzIGFscmVhZHkgY2FjaGVkCgkJCQlpZiAoICQuZGF0YSggdWkudGFiWyAwIF0sICJjYWNoZS50YWJzIiApICkgewoJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJcmV0dXJuOwoJCQkJfQoKCQkJCXVpLmpxWEhSLnN1Y2Nlc3MoZnVuY3Rpb24oKSB7CgkJCQkJaWYgKCB0aGF0Lm9wdGlvbnMuY2FjaGUgKSB7CgkJCQkJCSQuZGF0YSggdWkudGFiWyAwIF0sICJjYWNoZS50YWJzIiwgdHJ1ZSApOwoJCQkJCX0KCQkJCX0pOwoJCQl9fSk7CgkJfSwKCgkJX2FqYXhTZXR0aW5nczogZnVuY3Rpb24oIGFuY2hvciwgZXZlbnQsIHVpICkgewoJCQl2YXIgYWpheE9wdGlvbnMgPSB0aGlzLm9wdGlvbnMuYWpheE9wdGlvbnM7CgkJCXJldHVybiAkLmV4dGVuZCgge30sIGFqYXhPcHRpb25zLCB7CgkJCQllcnJvcjogZnVuY3Rpb24oIHhociwgc3RhdHVzICkgewoJCQkJCXRyeSB7CgkJCQkJCS8vIFBhc3NpbmcgaW5kZXggYXZvaWQgYSByYWNlIGNvbmRpdGlvbiB3aGVuIHRoaXMgbWV0aG9kIGlzCgkJCQkJCS8vIGNhbGxlZCBhZnRlciB0aGUgdXNlciBoYXMgc2VsZWN0ZWQgYW5vdGhlciB0YWIuCgkJCQkJCS8vIFBhc3MgdGhlIGFuY2hvciB0aGF0IGluaXRpYXRlZCB0aGlzIHJlcXVlc3QgYWxsb3dzCgkJCQkJCS8vIGxvYWRFcnJvciB0byBtYW5pcHVsYXRlIHRoZSB0YWIgY29udGVudCBwYW5lbCB2aWEgJChhLmhhc2gpCgkJCQkJCWFqYXhPcHRpb25zLmVycm9yKAoJCQkJCQkJeGhyLCBzdGF0dXMsIHVpLnRhYi5jbG9zZXN0KCAibGkiICkuaW5kZXgoKSwgdWkudGFiWyAwIF0gKTsKCQkJCQl9CgkJCQkJY2F0Y2ggKCBlcnJvciApIHt9CgkJCQl9CgkJCX0sIHRoaXMuX3N1cGVyQXBwbHkoIGFyZ3VtZW50cyApICk7CgkJfSwKCgkJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJCS8vIHJlc2V0IGNhY2hlIGlmIHN3aXRjaGluZyBmcm9tIGNhY2hlZCB0byBub3QgY2FjaGVkCgkJCWlmICgga2V5ID09PSAiY2FjaGUiICYmIHZhbHVlID09PSBmYWxzZSApIHsKCQkJCXRoaXMuYW5jaG9ycy5yZW1vdmVEYXRhKCAiY2FjaGUudGFicyIgKTsKCQkJfQoJCQl0aGlzLl9zdXBlcigga2V5LCB2YWx1ZSApOwoJCX0sCgoJCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCQkJdGhpcy5hbmNob3JzLnJlbW92ZURhdGEoICJjYWNoZS50YWJzIiApOwoJCQl0aGlzLl9zdXBlcigpOwoJCX0sCgoJCXVybDogZnVuY3Rpb24oIGluZGV4ICl7CgkJCXRoaXMuYW5jaG9ycy5lcSggaW5kZXggKS5yZW1vdmVEYXRhKCAiY2FjaGUudGFicyIgKTsKCQkJdGhpcy5fc3VwZXJBcHBseSggYXJndW1lbnRzICk7CgkJfQoJfSk7CgoJLy8gYWJvcnQgbWV0aG9kCgkkLndpZGdldCggInVpLnRhYnMiLCAkLnVpLnRhYnMsIHsKCQlhYm9ydDogZnVuY3Rpb24oKSB7CgkJCWlmICggdGhpcy54aHIgKSB7CgkJCQl0aGlzLnhoci5hYm9ydCgpOwoJCQl9CgkJfQoJfSk7CgoJLy8gc3Bpbm5lcgoJJC53aWRnZXQoICJ1aS50YWJzIiwgJC51aS50YWJzLCB7CgkJb3B0aW9uczogewoJCQlzcGlubmVyOiAiPGVtPkxvYWRpbmcmIzgyMzA7PC9lbT4iCgkJfSwKCQlfY3JlYXRlOiBmdW5jdGlvbigpIHsKCQkJdGhpcy5fc3VwZXIoKTsKCQkJdGhpcy5fb24oewoJCQkJdGFic2JlZm9yZWxvYWQ6IGZ1bmN0aW9uKCBldmVudCwgdWkgKSB7CgkJCQkJLy8gRG9uJ3QgcmVhY3QgdG8gbmVzdGVkIHRhYnMgb3IgdGFicyB0aGF0IGRvbid0IHVzZSBhIHNwaW5uZXIKCQkJCQlpZiAoIGV2ZW50LnRhcmdldCAhPT0gdGhpcy5lbGVtZW50WyAwIF0gfHwKCQkJCQkJCSF0aGlzLm9wdGlvbnMuc3Bpbm5lciApIHsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCgkJCQkJdmFyIHNwYW4gPSB1aS50YWIuZmluZCggInNwYW4iICksCgkJCQkJCWh0bWwgPSBzcGFuLmh0bWwoKTsKCQkJCQlzcGFuLmh0bWwoIHRoaXMub3B0aW9ucy5zcGlubmVyICk7CgkJCQkJdWkuanFYSFIuY29tcGxldGUoZnVuY3Rpb24oKSB7CgkJCQkJCXNwYW4uaHRtbCggaHRtbCApOwoJCQkJCX0pOwoJCQkJfQoJCQl9KTsKCQl9Cgl9KTsKCgkvLyBlbmFibGUvZGlzYWJsZSBldmVudHMKCSQud2lkZ2V0KCAidWkudGFicyIsICQudWkudGFicywgewoJCW9wdGlvbnM6IHsKCQkJZW5hYmxlOiBudWxsLAoJCQlkaXNhYmxlOiBudWxsCgkJfSwKCgkJZW5hYmxlOiBmdW5jdGlvbiggaW5kZXggKSB7CgkJCXZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLAoJCQkJdHJpZ2dlcjsKCgkJCWlmICggaW5kZXggJiYgb3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCSggJC5pc0FycmF5KCBvcHRpb25zLmRpc2FibGVkICkgJiYgJC5pbkFycmF5KCBpbmRleCwgb3B0aW9ucy5kaXNhYmxlZCApICE9PSAtMSApICkgewoJCQkJdHJpZ2dlciA9IHRydWU7CgkJCX0KCgkJCXRoaXMuX3N1cGVyQXBwbHkoIGFyZ3VtZW50cyApOwoKCQkJaWYgKCB0cmlnZ2VyICkgewoJCQkJdGhpcy5fdHJpZ2dlciggImVuYWJsZSIsIG51bGwsIHRoaXMuX3VpKCB0aGlzLmFuY2hvcnNbIGluZGV4IF0sIHRoaXMucGFuZWxzWyBpbmRleCBdICkgKTsKCQkJfQoJCX0sCgoJCWRpc2FibGU6IGZ1bmN0aW9uKCBpbmRleCApIHsKCQkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsCgkJCQl0cmlnZ2VyOwoKCQkJaWYgKCBpbmRleCAmJiBvcHRpb25zLmRpc2FibGVkID09PSBmYWxzZSB8fAoJCQkJCSggJC5pc0FycmF5KCBvcHRpb25zLmRpc2FibGVkICkgJiYgJC5pbkFycmF5KCBpbmRleCwgb3B0aW9ucy5kaXNhYmxlZCApID09PSAtMSApICkgewoJCQkJdHJpZ2dlciA9IHRydWU7CgkJCX0KCgkJCXRoaXMuX3N1cGVyQXBwbHkoIGFyZ3VtZW50cyApOwoKCQkJaWYgKCB0cmlnZ2VyICkgewoJCQkJdGhpcy5fdHJpZ2dlciggImRpc2FibGUiLCBudWxsLCB0aGlzLl91aSggdGhpcy5hbmNob3JzWyBpbmRleCBdLCB0aGlzLnBhbmVsc1sgaW5kZXggXSApICk7CgkJCX0KCQl9Cgl9KTsKCgkvLyBhZGQvcmVtb3ZlIG1ldGhvZHMgYW5kIGV2ZW50cwoJJC53aWRnZXQoICJ1aS50YWJzIiwgJC51aS50YWJzLCB7CgkJb3B0aW9uczogewoJCQlhZGQ6IG51bGwsCgkJCXJlbW92ZTogbnVsbCwKCQkJdGFiVGVtcGxhdGU6ICI8bGk+PGEgaHJlZj0nI3tocmVmfSc+PHNwYW4+I3tsYWJlbH08L3NwYW4+PC9hPjwvbGk+IgoJCX0sCgoJCWFkZDogZnVuY3Rpb24oIHVybCwgbGFiZWwsIGluZGV4ICkgewoJCQlpZiAoIGluZGV4ID09PSB1bmRlZmluZWQgKSB7CgkJCQlpbmRleCA9IHRoaXMuYW5jaG9ycy5sZW5ndGg7CgkJCX0KCgkJCXZhciBkb0luc2VydEFmdGVyLCBwYW5lbCwKCQkJCW9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsCgkJCQlsaSA9ICQoIG9wdGlvbnMudGFiVGVtcGxhdGUKCQkJCQkucmVwbGFjZSggLyNce2hyZWZcfS9nLCB1cmwgKQoJCQkJCS5yZXBsYWNlKCAvI1x7bGFiZWxcfS9nLCBsYWJlbCApICksCgkJCQlpZCA9ICF1cmwuaW5kZXhPZiggIiMiICkgPwoJCQkJCXVybC5yZXBsYWNlKCAiIyIsICIiICkgOgoJCQkJCXRoaXMuX3RhYklkKCBsaSApOwoKCQkJbGkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci10b3AiICkuZGF0YSggInVpLXRhYnMtZGVzdHJveSIsIHRydWUgKTsKCQkJbGkuYXR0ciggImFyaWEtY29udHJvbHMiLCBpZCApOwoKCQkJZG9JbnNlcnRBZnRlciA9IGluZGV4ID49IHRoaXMudGFicy5sZW5ndGg7CgoJCQkvLyB0cnkgdG8gZmluZCBhbiBleGlzdGluZyBlbGVtZW50IGJlZm9yZSBjcmVhdGluZyBhIG5ldyBvbmUKCQkJcGFuZWwgPSB0aGlzLmVsZW1lbnQuZmluZCggIiMiICsgaWQgKTsKCQkJaWYgKCAhcGFuZWwubGVuZ3RoICkgewoJCQkJcGFuZWwgPSB0aGlzLl9jcmVhdGVQYW5lbCggaWQgKTsKCQkJCWlmICggZG9JbnNlcnRBZnRlciApIHsKCQkJCQlpZiAoIGluZGV4ID4gMCApIHsKCQkJCQkJcGFuZWwuaW5zZXJ0QWZ0ZXIoIHRoaXMucGFuZWxzLmVxKCAtMSApICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJcGFuZWwuYXBwZW5kVG8oIHRoaXMuZWxlbWVudCApOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJcGFuZWwuaW5zZXJ0QmVmb3JlKCB0aGlzLnBhbmVsc1sgaW5kZXggXSApOwoJCQkJfQoJCQl9CgkJCXBhbmVsLmFkZENsYXNzKCAidWktdGFicy1wYW5lbCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIiApLmhpZGUoKTsKCgkJCWlmICggZG9JbnNlcnRBZnRlciApIHsKCQkJCWxpLmFwcGVuZFRvKCB0aGlzLnRhYmxpc3QgKTsKCQkJfSBlbHNlIHsKCQkJCWxpLmluc2VydEJlZm9yZSggdGhpcy50YWJzWyBpbmRleCBdICk7CgkJCX0KCgkJCW9wdGlvbnMuZGlzYWJsZWQgPSAkLm1hcCggb3B0aW9ucy5kaXNhYmxlZCwgZnVuY3Rpb24oIG4gKSB7CgkJCQlyZXR1cm4gbiA+PSBpbmRleCA/ICsrbiA6IG47CgkJCX0pOwoKCQkJdGhpcy5yZWZyZXNoKCk7CgkJCWlmICggdGhpcy50YWJzLmxlbmd0aCA9PT0gMSAmJiBvcHRpb25zLmFjdGl2ZSA9PT0gZmFsc2UgKSB7CgkJCQl0aGlzLm9wdGlvbiggImFjdGl2ZSIsIDAgKTsKCQkJfQoKCQkJdGhpcy5fdHJpZ2dlciggImFkZCIsIG51bGwsIHRoaXMuX3VpKCB0aGlzLmFuY2hvcnNbIGluZGV4IF0sIHRoaXMucGFuZWxzWyBpbmRleCBdICkgKTsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCgkJcmVtb3ZlOiBmdW5jdGlvbiggaW5kZXggKSB7CgkJCWluZGV4ID0gdGhpcy5fZ2V0SW5kZXgoIGluZGV4ICk7CgkJCXZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLAoJCQkJdGFiID0gdGhpcy50YWJzLmVxKCBpbmRleCApLnJlbW92ZSgpLAoJCQkJcGFuZWwgPSB0aGlzLl9nZXRQYW5lbEZvclRhYiggdGFiICkucmVtb3ZlKCk7CgoJCQkvLyBJZiBzZWxlY3RlZCB0YWIgd2FzIHJlbW92ZWQgZm9jdXMgdGFiIHRvIHRoZSByaWdodCBvcgoJCQkvLyBpbiBjYXNlIHRoZSBsYXN0IHRhYiB3YXMgcmVtb3ZlZCB0aGUgdGFiIHRvIHRoZSBsZWZ0LgoJCQkvLyBXZSBjaGVjayBmb3IgbW9yZSB0aGFuIDIgdGFicywgYmVjYXVzZSBpZiB0aGVyZSBhcmUgb25seSAyLAoJCQkvLyB0aGVuIHdoZW4gd2UgcmVtb3ZlIHRoaXMgdGFiLCB0aGVyZSB3aWxsIG9ubHkgYmUgb25lIHRhYiBsZWZ0CgkJCS8vIHNvIHdlIGRvbid0IG5lZWQgdG8gZGV0ZWN0IHdoaWNoIHRhYiB0byBhY3RpdmF0ZS4KCQkJaWYgKCB0YWIuaGFzQ2xhc3MoICJ1aS10YWJzLWFjdGl2ZSIgKSAmJiB0aGlzLmFuY2hvcnMubGVuZ3RoID4gMiApIHsKCQkJCXRoaXMuX2FjdGl2YXRlKCBpbmRleCArICggaW5kZXggKyAxIDwgdGhpcy5hbmNob3JzLmxlbmd0aCA/IDEgOiAtMSApICk7CgkJCX0KCgkJCW9wdGlvbnMuZGlzYWJsZWQgPSAkLm1hcCgKCQkJCSQuZ3JlcCggb3B0aW9ucy5kaXNhYmxlZCwgZnVuY3Rpb24oIG4gKSB7CgkJCQkJcmV0dXJuIG4gIT09IGluZGV4OwoJCQkJfSksCgkJCQlmdW5jdGlvbiggbiApIHsKCQkJCQlyZXR1cm4gbiA+PSBpbmRleCA/IC0tbiA6IG47CgkJCQl9KTsKCgkJCXRoaXMucmVmcmVzaCgpOwoKCQkJdGhpcy5fdHJpZ2dlciggInJlbW92ZSIsIG51bGwsIHRoaXMuX3VpKCB0YWIuZmluZCggImEiIClbIDAgXSwgcGFuZWxbIDAgXSApICk7CgkJCXJldHVybiB0aGlzOwoJCX0KCX0pOwoKCS8vIGxlbmd0aCBtZXRob2QKCSQud2lkZ2V0KCAidWkudGFicyIsICQudWkudGFicywgewoJCWxlbmd0aDogZnVuY3Rpb24oKSB7CgkJCXJldHVybiB0aGlzLmFuY2hvcnMubGVuZ3RoOwoJCX0KCX0pOwoKCS8vIHBhbmVsIGlkcyAoaWRQcmVmaXggb3B0aW9uICsgdGl0bGUgYXR0cmlidXRlKQoJJC53aWRnZXQoICJ1aS50YWJzIiwgJC51aS50YWJzLCB7CgkJb3B0aW9uczogewoJCQlpZFByZWZpeDogInVpLXRhYnMtIgoJCX0sCgoJCV90YWJJZDogZnVuY3Rpb24oIHRhYiApIHsKCQkJdmFyIGEgPSB0YWIuaXMoICJsaSIgKSA/IHRhYi5maW5kKCAiYVtocmVmXSIgKSA6IHRhYjsKCQkJYSA9IGFbMF07CgkJCXJldHVybiAkKCBhICkuY2xvc2VzdCggImxpIiApLmF0dHIoICJhcmlhLWNvbnRyb2xzIiApIHx8CgkJCQlhLnRpdGxlICYmIGEudGl0bGUucmVwbGFjZSggL1xzL2csICJfIiApLnJlcGxhY2UoIC9bXlx3XHUwMGMwLVx1RkZGRlwtXS9nLCAiIiApIHx8CgkJCQl0aGlzLm9wdGlvbnMuaWRQcmVmaXggKyBnZXROZXh0VGFiSWQoKTsKCQl9Cgl9KTsKCgkvLyBfY3JlYXRlUGFuZWwgbWV0aG9kCgkkLndpZGdldCggInVpLnRhYnMiLCAkLnVpLnRhYnMsIHsKCQlvcHRpb25zOiB7CgkJCXBhbmVsVGVtcGxhdGU6ICI8ZGl2PjwvZGl2PiIKCQl9LAoKCQlfY3JlYXRlUGFuZWw6IGZ1bmN0aW9uKCBpZCApIHsKCQkJcmV0dXJuICQoIHRoaXMub3B0aW9ucy5wYW5lbFRlbXBsYXRlICkKCQkJCS5hdHRyKCAiaWQiLCBpZCApCgkJCQkuYWRkQ2xhc3MoICJ1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iICkKCQkJCS5kYXRhKCAidWktdGFicy1kZXN0cm95IiwgdHJ1ZSApOwoJCX0KCX0pOwoKCS8vIHNlbGVjdGVkIG9wdGlvbgoJJC53aWRnZXQoICJ1aS50YWJzIiwgJC51aS50YWJzLCB7CgkJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJCXZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwoJCQlpZiAoIG9wdGlvbnMuYWN0aXZlID09PSBudWxsICYmIG9wdGlvbnMuc2VsZWN0ZWQgIT09IHVuZGVmaW5lZCApIHsKCQkJCW9wdGlvbnMuYWN0aXZlID0gb3B0aW9ucy5zZWxlY3RlZCA9PT0gLTEgPyBmYWxzZSA6IG9wdGlvbnMuc2VsZWN0ZWQ7CgkJCX0KCQkJdGhpcy5fc3VwZXIoKTsKCQkJb3B0aW9ucy5zZWxlY3RlZCA9IG9wdGlvbnMuYWN0aXZlOwoJCQlpZiAoIG9wdGlvbnMuc2VsZWN0ZWQgPT09IGZhbHNlICkgewoJCQkJb3B0aW9ucy5zZWxlY3RlZCA9IC0xOwoJCQl9CgkJfSwKCgkJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJCWlmICgga2V5ICE9PSAic2VsZWN0ZWQiICkgewoJCQkJcmV0dXJuIHRoaXMuX3N1cGVyKCBrZXksIHZhbHVlICk7CgkJCX0KCgkJCXZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwoJCQl0aGlzLl9zdXBlciggImFjdGl2ZSIsIHZhbHVlID09PSAtMSA/IGZhbHNlIDogdmFsdWUgKTsKCQkJb3B0aW9ucy5zZWxlY3RlZCA9IG9wdGlvbnMuYWN0aXZlOwoJCQlpZiAoIG9wdGlvbnMuc2VsZWN0ZWQgPT09IGZhbHNlICkgewoJCQkJb3B0aW9ucy5zZWxlY3RlZCA9IC0xOwoJCQl9CgkJfSwKCgkJX2V2ZW50SGFuZGxlcjogZnVuY3Rpb24oKSB7CgkJCXRoaXMuX3N1cGVyQXBwbHkoIGFyZ3VtZW50cyApOwoJCQl0aGlzLm9wdGlvbnMuc2VsZWN0ZWQgPSB0aGlzLm9wdGlvbnMuYWN0aXZlOwoJCQlpZiAoIHRoaXMub3B0aW9ucy5zZWxlY3RlZCA9PT0gZmFsc2UgKSB7CgkJCQl0aGlzLm9wdGlvbnMuc2VsZWN0ZWQgPSAtMTsKCQkJfQoJCX0KCX0pOwoKCS8vIHNob3cgYW5kIHNlbGVjdCBldmVudAoJJC53aWRnZXQoICJ1aS50YWJzIiwgJC51aS50YWJzLCB7CgkJb3B0aW9uczogewoJCQlzaG93OiBudWxsLAoJCQlzZWxlY3Q6IG51bGwKCQl9LAoJCV9jcmVhdGU6IGZ1bmN0aW9uKCkgewoJCQl0aGlzLl9zdXBlcigpOwoJCQlpZiAoIHRoaXMub3B0aW9ucy5hY3RpdmUgIT09IGZhbHNlICkgewoJCQkJdGhpcy5fdHJpZ2dlciggInNob3ciLCBudWxsLCB0aGlzLl91aSgKCQkJCQl0aGlzLmFjdGl2ZS5maW5kKCAiLnVpLXRhYnMtYW5jaG9yIiApWyAwIF0sCgkJCQkJdGhpcy5fZ2V0UGFuZWxGb3JUYWIoIHRoaXMuYWN0aXZlIClbIDAgXSApICk7CgkJCX0KCQl9LAoJCV90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7CgkJCXZhciB0YWIsIHBhbmVsLAoJCQkJcmV0ID0gdGhpcy5fc3VwZXJBcHBseSggYXJndW1lbnRzICk7CgoJCQlpZiAoICFyZXQgKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCgkJCWlmICggdHlwZSA9PT0gImJlZm9yZUFjdGl2YXRlIiApIHsKCQkJCXRhYiA9IGRhdGEubmV3VGFiLmxlbmd0aCA/IGRhdGEubmV3VGFiIDogZGF0YS5vbGRUYWI7CgkJCQlwYW5lbCA9IGRhdGEubmV3UGFuZWwubGVuZ3RoID8gZGF0YS5uZXdQYW5lbCA6IGRhdGEub2xkUGFuZWw7CgkJCQlyZXQgPSB0aGlzLl9zdXBlciggInNlbGVjdCIsIGV2ZW50LCB7CgkJCQkJdGFiOiB0YWIuZmluZCggIi51aS10YWJzLWFuY2hvciIgKVsgMF0sCgkJCQkJcGFuZWw6IHBhbmVsWyAwIF0sCgkJCQkJaW5kZXg6IHRhYi5jbG9zZXN0KCAibGkiICkuaW5kZXgoKQoJCQkJfSk7CgkJCX0gZWxzZSBpZiAoIHR5cGUgPT09ICJhY3RpdmF0ZSIgJiYgZGF0YS5uZXdUYWIubGVuZ3RoICkgewoJCQkJcmV0ID0gdGhpcy5fc3VwZXIoICJzaG93IiwgZXZlbnQsIHsKCQkJCQl0YWI6IGRhdGEubmV3VGFiLmZpbmQoICIudWktdGFicy1hbmNob3IiIClbIDAgXSwKCQkJCQlwYW5lbDogZGF0YS5uZXdQYW5lbFsgMCBdLAoJCQkJCWluZGV4OiBkYXRhLm5ld1RhYi5jbG9zZXN0KCAibGkiICkuaW5kZXgoKQoJCQkJfSk7CgkJCX0KCQkJcmV0dXJuIHJldDsKCQl9Cgl9KTsKCgkvLyBzZWxlY3QgbWV0aG9kCgkkLndpZGdldCggInVpLnRhYnMiLCAkLnVpLnRhYnMsIHsKCQlzZWxlY3Q6IGZ1bmN0aW9uKCBpbmRleCApIHsKCQkJaW5kZXggPSB0aGlzLl9nZXRJbmRleCggaW5kZXggKTsKCQkJaWYgKCBpbmRleCA9PT0gLTEgKSB7CgkJCQlpZiAoIHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSAmJiB0aGlzLm9wdGlvbnMuc2VsZWN0ZWQgIT09IC0xICkgewoJCQkJCWluZGV4ID0gdGhpcy5vcHRpb25zLnNlbGVjdGVkOwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCX0KCQkJdGhpcy5hbmNob3JzLmVxKCBpbmRleCApLnRyaWdnZXIoIHRoaXMub3B0aW9ucy5ldmVudCArIHRoaXMuZXZlbnROYW1lc3BhY2UgKTsKCQl9Cgl9KTsKCgkvLyBjb29raWUgb3B0aW9uCgkoZnVuY3Rpb24oKSB7CgoJdmFyIGxpc3RJZCA9IDA7CgoJJC53aWRnZXQoICJ1aS50YWJzIiwgJC51aS50YWJzLCB7CgkJb3B0aW9uczogewoJCQljb29raWU6IG51bGwgLy8gZS5nLiB7IGV4cGlyZXM6IDcsIHBhdGg6ICcvJywgZG9tYWluOiAnanF1ZXJ5LmNvbScsIHNlY3VyZTogdHJ1ZSB9CgkJfSwKCQlfY3JlYXRlOiBmdW5jdGlvbigpIHsKCQkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsCgkJCQlhY3RpdmU7CgkJCWlmICggb3B0aW9ucy5hY3RpdmUgPT0gbnVsbCAmJiBvcHRpb25zLmNvb2tpZSApIHsKCQkJCWFjdGl2ZSA9IHBhcnNlSW50KCB0aGlzLl9jb29raWUoKSwgMTAgKTsKCQkJCWlmICggYWN0aXZlID09PSAtMSApIHsKCQkJCQlhY3RpdmUgPSBmYWxzZTsKCQkJCX0KCQkJCW9wdGlvbnMuYWN0aXZlID0gYWN0aXZlOwoJCQl9CgkJCXRoaXMuX3N1cGVyKCk7CgkJfSwKCQlfY29va2llOiBmdW5jdGlvbiggYWN0aXZlICkgewoJCQl2YXIgY29va2llID0gWyB0aGlzLmNvb2tpZSB8fAoJCQkJKCB0aGlzLmNvb2tpZSA9IHRoaXMub3B0aW9ucy5jb29raWUubmFtZSB8fCAidWktdGFicy0iICsgKCsrbGlzdElkKSApIF07CgkJCWlmICggYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJCWNvb2tpZS5wdXNoKCBhY3RpdmUgPT09IGZhbHNlID8gLTEgOiBhY3RpdmUgKTsKCQkJCWNvb2tpZS5wdXNoKCB0aGlzLm9wdGlvbnMuY29va2llICk7CgkJCX0KCQkJcmV0dXJuICQuY29va2llLmFwcGx5KCBudWxsLCBjb29raWUgKTsKCQl9LAoJCV9yZWZyZXNoOiBmdW5jdGlvbigpIHsKCQkJdGhpcy5fc3VwZXIoKTsKCQkJaWYgKCB0aGlzLm9wdGlvbnMuY29va2llICkgewoJCQkJdGhpcy5fY29va2llKCB0aGlzLm9wdGlvbnMuYWN0aXZlLCB0aGlzLm9wdGlvbnMuY29va2llICk7CgkJCX0KCQl9LAoJCV9ldmVudEhhbmRsZXI6IGZ1bmN0aW9uKCkgewoJCQl0aGlzLl9zdXBlckFwcGx5KCBhcmd1bWVudHMgKTsKCQkJaWYgKCB0aGlzLm9wdGlvbnMuY29va2llICkgewoJCQkJdGhpcy5fY29va2llKCB0aGlzLm9wdGlvbnMuYWN0aXZlLCB0aGlzLm9wdGlvbnMuY29va2llICk7CgkJCX0KCQl9LAoJCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCQkJdGhpcy5fc3VwZXIoKTsKCQkJaWYgKCB0aGlzLm9wdGlvbnMuY29va2llICkgewoJCQkJdGhpcy5fY29va2llKCBudWxsLCB0aGlzLm9wdGlvbnMuY29va2llICk7CgkJCX0KCQl9Cgl9KTsKCgl9KSgpOwoKCS8vIGxvYWQgZXZlbnQKCSQud2lkZ2V0KCAidWkudGFicyIsICQudWkudGFicywgewoJCV90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7CgkJCXZhciBfZGF0YSA9ICQuZXh0ZW5kKCB7fSwgZGF0YSApOwoJCQlpZiAoIHR5cGUgPT09ICJsb2FkIiApIHsKCQkJCV9kYXRhLnBhbmVsID0gX2RhdGEucGFuZWxbIDAgXTsKCQkJCV9kYXRhLnRhYiA9IF9kYXRhLnRhYi5maW5kKCAiLnVpLXRhYnMtYW5jaG9yIiApWyAwIF07CgkJCX0KCQkJcmV0dXJuIHRoaXMuX3N1cGVyKCB0eXBlLCBldmVudCwgX2RhdGEgKTsKCQl9Cgl9KTsKCgkvLyBmeCBvcHRpb24KCS8vIFRoZSBuZXcgYW5pbWF0aW9uIG9wdGlvbnMgKHNob3csIGhpZGUpIGNvbmZsaWN0IHdpdGggdGhlIG9sZCBzaG93IGNhbGxiYWNrLgoJLy8gVGhlIG9sZCBmeCBvcHRpb24gd2lucyBvdmVyIHNob3cvaGlkZSBhbnl3YXkgKGFsd2F5cyBmYXZvciBiYWNrLWNvbXBhdCkuCgkvLyBJZiBhIHVzZXIgd2FudHMgdG8gdXNlIHRoZSBuZXcgYW5pbWF0aW9uIEFQSSwgdGhleSBtdXN0IGdpdmUgdXAgdGhlIG9sZCBBUEkuCgkkLndpZGdldCggInVpLnRhYnMiLCAkLnVpLnRhYnMsIHsKCQlvcHRpb25zOiB7CgkJCWZ4OiBudWxsIC8vIGUuZy4geyBoZWlnaHQ6ICJ0b2dnbGUiLCBvcGFjaXR5OiAidG9nZ2xlIiwgZHVyYXRpb246IDIwMCB9CgkJfSwKCgkJX2dldEZ4OiBmdW5jdGlvbigpIHsKCQkJdmFyIGhpZGUsIHNob3csCgkJCQlmeCA9IHRoaXMub3B0aW9ucy5meDsKCgkJCWlmICggZnggKSB7CgkJCQlpZiAoICQuaXNBcnJheSggZnggKSApIHsKCQkJCQloaWRlID0gZnhbIDAgXTsKCQkJCQlzaG93ID0gZnhbIDEgXTsKCQkJCX0gZWxzZSB7CgkJCQkJaGlkZSA9IHNob3cgPSBmeDsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGZ4ID8geyBzaG93OiBzaG93LCBoaWRlOiBoaWRlIH0gOiBudWxsOwoJCX0sCgoJCV90b2dnbGU6IGZ1bmN0aW9uKCBldmVudCwgZXZlbnREYXRhICkgewoJCQl2YXIgdGhhdCA9IHRoaXMsCgkJCQl0b1Nob3cgPSBldmVudERhdGEubmV3UGFuZWwsCgkJCQl0b0hpZGUgPSBldmVudERhdGEub2xkUGFuZWwsCgkJCQlmeCA9IHRoaXMuX2dldEZ4KCk7CgoJCQlpZiAoICFmeCApIHsKCQkJCXJldHVybiB0aGlzLl9zdXBlciggZXZlbnQsIGV2ZW50RGF0YSApOwoJCQl9CgoJCQl0aGF0LnJ1bm5pbmcgPSB0cnVlOwoKCQkJZnVuY3Rpb24gY29tcGxldGUoKSB7CgkJCQl0aGF0LnJ1bm5pbmcgPSBmYWxzZTsKCQkJCXRoYXQuX3RyaWdnZXIoICJhY3RpdmF0ZSIsIGV2ZW50LCBldmVudERhdGEgKTsKCQkJfQoKCQkJZnVuY3Rpb24gc2hvdygpIHsKCQkJCWV2ZW50RGF0YS5uZXdUYWIuY2xvc2VzdCggImxpIiApLmFkZENsYXNzKCAidWktdGFicy1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIiApOwoKCQkJCWlmICggdG9TaG93Lmxlbmd0aCAmJiBmeC5zaG93ICkgewoJCQkJCXRvU2hvdwoJCQkJCQkuYW5pbWF0ZSggZnguc2hvdywgZnguc2hvdy5kdXJhdGlvbiwgZnVuY3Rpb24oKSB7CgkJCQkJCQljb21wbGV0ZSgpOwoJCQkJCQl9KTsKCQkJCX0gZWxzZSB7CgkJCQkJdG9TaG93LnNob3coKTsKCQkJCQljb21wbGV0ZSgpOwoJCQkJfQoJCQl9CgoJCQkvLyBzdGFydCBvdXQgYnkgaGlkaW5nLCB0aGVuIHNob3dpbmcsIHRoZW4gY29tcGxldGluZwoJCQlpZiAoIHRvSGlkZS5sZW5ndGggJiYgZnguaGlkZSApIHsKCQkJCXRvSGlkZS5hbmltYXRlKCBmeC5oaWRlLCBmeC5oaWRlLmR1cmF0aW9uLCBmdW5jdGlvbigpIHsKCQkJCQlldmVudERhdGEub2xkVGFiLmNsb3Nlc3QoICJsaSIgKS5yZW1vdmVDbGFzcyggInVpLXRhYnMtYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIgKTsKCQkJCQlzaG93KCk7CgkJCQl9KTsKCQkJfSBlbHNlIHsKCQkJCWV2ZW50RGF0YS5vbGRUYWIuY2xvc2VzdCggImxpIiApLnJlbW92ZUNsYXNzKCAidWktdGFicy1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIiApOwoJCQkJdG9IaWRlLmhpZGUoKTsKCQkJCXNob3coKTsKCQkJfQoJCX0KCX0pOwp9Cgp9KSggalF1ZXJ5ICk7CihmdW5jdGlvbiggJCApIHsKCnZhciBpbmNyZW1lbnRzID0gMDsKCmZ1bmN0aW9uIGFkZERlc2NyaWJlZEJ5KCBlbGVtLCBpZCApIHsKCXZhciBkZXNjcmliZWRieSA9IChlbGVtLmF0dHIoICJhcmlhLWRlc2NyaWJlZGJ5IiApIHx8ICIiKS5zcGxpdCggL1xzKy8gKTsKCWRlc2NyaWJlZGJ5LnB1c2goIGlkICk7CgllbGVtCgkJLmRhdGEoICJ1aS10b29sdGlwLWlkIiwgaWQgKQoJCS5hdHRyKCAiYXJpYS1kZXNjcmliZWRieSIsICQudHJpbSggZGVzY3JpYmVkYnkuam9pbiggIiAiICkgKSApOwp9CgpmdW5jdGlvbiByZW1vdmVEZXNjcmliZWRCeSggZWxlbSApIHsKCXZhciBpZCA9IGVsZW0uZGF0YSggInVpLXRvb2x0aXAtaWQiICksCgkJZGVzY3JpYmVkYnkgPSAoZWxlbS5hdHRyKCAiYXJpYS1kZXNjcmliZWRieSIgKSB8fCAiIikuc3BsaXQoIC9ccysvICksCgkJaW5kZXggPSAkLmluQXJyYXkoIGlkLCBkZXNjcmliZWRieSApOwoJaWYgKCBpbmRleCAhPT0gLTEgKSB7CgkJZGVzY3JpYmVkYnkuc3BsaWNlKCBpbmRleCwgMSApOwoJfQoKCWVsZW0ucmVtb3ZlRGF0YSggInVpLXRvb2x0aXAtaWQiICk7CglkZXNjcmliZWRieSA9ICQudHJpbSggZGVzY3JpYmVkYnkuam9pbiggIiAiICkgKTsKCWlmICggZGVzY3JpYmVkYnkgKSB7CgkJZWxlbS5hdHRyKCAiYXJpYS1kZXNjcmliZWRieSIsIGRlc2NyaWJlZGJ5ICk7Cgl9IGVsc2UgewoJCWVsZW0ucmVtb3ZlQXR0ciggImFyaWEtZGVzY3JpYmVkYnkiICk7Cgl9Cn0KCiQud2lkZ2V0KCAidWkudG9vbHRpcCIsIHsKCXZlcnNpb246ICIxLjkuMiIsCglvcHRpb25zOiB7CgkJY29udGVudDogZnVuY3Rpb24oKSB7CgkJCXJldHVybiAkKCB0aGlzICkuYXR0ciggInRpdGxlIiApOwoJCX0sCgkJaGlkZTogdHJ1ZSwKCQkvLyBEaXNhYmxlZCBlbGVtZW50cyBoYXZlIGluY29uc2lzdGVudCBiZWhhdmlvciBhY3Jvc3MgYnJvd3NlcnMgKCM4NjYxKQoJCWl0ZW1zOiAiW3RpdGxlXTpub3QoW2Rpc2FibGVkXSkiLAoJCXBvc2l0aW9uOiB7CgkJCW15OiAibGVmdCB0b3ArMTUiLAoJCQlhdDogImxlZnQgYm90dG9tIiwKCQkJY29sbGlzaW9uOiAiZmxpcGZpdCBmbGlwIgoJCX0sCgkJc2hvdzogdHJ1ZSwKCQl0b29sdGlwQ2xhc3M6IG51bGwsCgkJdHJhY2s6IGZhbHNlLAoKCQkvLyBjYWxsYmFja3MKCQljbG9zZTogbnVsbCwKCQlvcGVuOiBudWxsCgl9LAoKCV9jcmVhdGU6IGZ1bmN0aW9uKCkgewoJCXRoaXMuX29uKHsKCQkJbW91c2VvdmVyOiAib3BlbiIsCgkJCWZvY3VzaW46ICJvcGVuIgoJCX0pOwoKCQkvLyBJRHMgb2YgZ2VuZXJhdGVkIHRvb2x0aXBzLCBuZWVkZWQgZm9yIGRlc3Ryb3kKCQl0aGlzLnRvb2x0aXBzID0ge307CgkJLy8gSURzIG9mIHBhcmVudCB0b29sdGlwcyB3aGVyZSB3ZSByZW1vdmVkIHRoZSB0aXRsZSBhdHRyaWJ1dGUKCQl0aGlzLnBhcmVudHMgPSB7fTsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQgKSB7CgkJCXRoaXMuX2Rpc2FibGUoKTsKCQl9Cgl9LAoKCV9zZXRPcHRpb246IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCXZhciB0aGF0ID0gdGhpczsKCgkJaWYgKCBrZXkgPT09ICJkaXNhYmxlZCIgKSB7CgkJCXRoaXNbIHZhbHVlID8gIl9kaXNhYmxlIiA6ICJfZW5hYmxlIiBdKCk7CgkJCXRoaXMub3B0aW9uc1sga2V5IF0gPSB2YWx1ZTsKCQkJLy8gZGlzYWJsZSBlbGVtZW50IHN0eWxlIGNoYW5nZXMKCQkJcmV0dXJuOwoJCX0KCgkJdGhpcy5fc3VwZXIoIGtleSwgdmFsdWUgKTsKCgkJaWYgKCBrZXkgPT09ICJjb250ZW50IiApIHsKCQkJJC5lYWNoKCB0aGlzLnRvb2x0aXBzLCBmdW5jdGlvbiggaWQsIGVsZW1lbnQgKSB7CgkJCQl0aGF0Ll91cGRhdGVDb250ZW50KCBlbGVtZW50ICk7CgkJCX0pOwoJCX0KCX0sCgoJX2Rpc2FibGU6IGZ1bmN0aW9uKCkgewoJCXZhciB0aGF0ID0gdGhpczsKCgkJLy8gY2xvc2Ugb3BlbiB0b29sdGlwcwoJCSQuZWFjaCggdGhpcy50b29sdGlwcywgZnVuY3Rpb24oIGlkLCBlbGVtZW50ICkgewoJCQl2YXIgZXZlbnQgPSAkLkV2ZW50KCAiYmx1ciIgKTsKCQkJZXZlbnQudGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCA9IGVsZW1lbnRbMF07CgkJCXRoYXQuY2xvc2UoIGV2ZW50LCB0cnVlICk7CgkJfSk7CgoJCS8vIHJlbW92ZSB0aXRsZSBhdHRyaWJ1dGVzIHRvIHByZXZlbnQgbmF0aXZlIHRvb2x0aXBzCgkJdGhpcy5lbGVtZW50LmZpbmQoIHRoaXMub3B0aW9ucy5pdGVtcyApLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgZWxlbWVudCA9ICQoIHRoaXMgKTsKCQkJaWYgKCBlbGVtZW50LmlzKCAiW3RpdGxlXSIgKSApIHsKCQkJCWVsZW1lbnQKCQkJCQkuZGF0YSggInVpLXRvb2x0aXAtdGl0bGUiLCBlbGVtZW50LmF0dHIoICJ0aXRsZSIgKSApCgkJCQkJLmF0dHIoICJ0aXRsZSIsICIiICk7CgkJCX0KCQl9KTsKCX0sCgoJX2VuYWJsZTogZnVuY3Rpb24oKSB7CgkJLy8gcmVzdG9yZSB0aXRsZSBhdHRyaWJ1dGVzCgkJdGhpcy5lbGVtZW50LmZpbmQoIHRoaXMub3B0aW9ucy5pdGVtcyApLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgZWxlbWVudCA9ICQoIHRoaXMgKTsKCQkJaWYgKCBlbGVtZW50LmRhdGEoICJ1aS10b29sdGlwLXRpdGxlIiApICkgewoJCQkJZWxlbWVudC5hdHRyKCAidGl0bGUiLCBlbGVtZW50LmRhdGEoICJ1aS10b29sdGlwLXRpdGxlIiApICk7CgkJCX0KCQl9KTsKCX0sCgoJb3BlbjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXZhciB0aGF0ID0gdGhpcywKCQkJdGFyZ2V0ID0gJCggZXZlbnQgPyBldmVudC50YXJnZXQgOiB0aGlzLmVsZW1lbnQgKQoJCQkJLy8gd2UgbmVlZCBjbG9zZXN0IGhlcmUgZHVlIHRvIG1vdXNlb3ZlciBidWJibGluZywKCQkJCS8vIGJ1dCBhbHdheXMgcG9pbnRpbmcgYXQgdGhlIHNhbWUgZXZlbnQgdGFyZ2V0CgkJCQkuY2xvc2VzdCggdGhpcy5vcHRpb25zLml0ZW1zICk7CgoJCS8vIE5vIGVsZW1lbnQgdG8gc2hvdyBhIHRvb2x0aXAgZm9yIG9yIHRoZSB0b29sdGlwIGlzIGFscmVhZHkgb3BlbgoJCWlmICggIXRhcmdldC5sZW5ndGggfHwgdGFyZ2V0LmRhdGEoICJ1aS10b29sdGlwLWlkIiApICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIHRhcmdldC5hdHRyKCAidGl0bGUiICkgKSB7CgkJCXRhcmdldC5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIsIHRhcmdldC5hdHRyKCAidGl0bGUiICkgKTsKCQl9CgoJCXRhcmdldC5kYXRhKCAidWktdG9vbHRpcC1vcGVuIiwgdHJ1ZSApOwoKCQkvLyBraWxsIHBhcmVudCB0b29sdGlwcywgY3VzdG9tIG9yIG5hdGl2ZSwgZm9yIGhvdmVyCgkJaWYgKCBldmVudCAmJiBldmVudC50eXBlID09PSAibW91c2VvdmVyIiApIHsKCQkJdGFyZ2V0LnBhcmVudHMoKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIHBhcmVudCA9ICQoIHRoaXMgKSwKCQkJCQlibHVyRXZlbnQ7CgkJCQlpZiAoIHBhcmVudC5kYXRhKCAidWktdG9vbHRpcC1vcGVuIiApICkgewoJCQkJCWJsdXJFdmVudCA9ICQuRXZlbnQoICJibHVyIiApOwoJCQkJCWJsdXJFdmVudC50YXJnZXQgPSBibHVyRXZlbnQuY3VycmVudFRhcmdldCA9IHRoaXM7CgkJCQkJdGhhdC5jbG9zZSggYmx1ckV2ZW50LCB0cnVlICk7CgkJCQl9CgkJCQlpZiAoIHBhcmVudC5hdHRyKCAidGl0bGUiICkgKSB7CgkJCQkJcGFyZW50LnVuaXF1ZUlkKCk7CgkJCQkJdGhhdC5wYXJlbnRzWyB0aGlzLmlkIF0gPSB7CgkJCQkJCWVsZW1lbnQ6IHRoaXMsCgkJCQkJCXRpdGxlOiBwYXJlbnQuYXR0ciggInRpdGxlIiApCgkJCQkJfTsKCQkJCQlwYXJlbnQuYXR0ciggInRpdGxlIiwgIiIgKTsKCQkJCX0KCQkJfSk7CgkJfQoKCQl0aGlzLl91cGRhdGVDb250ZW50KCB0YXJnZXQsIGV2ZW50ICk7Cgl9LAoKCV91cGRhdGVDb250ZW50OiBmdW5jdGlvbiggdGFyZ2V0LCBldmVudCApIHsKCQl2YXIgY29udGVudCwKCQkJY29udGVudE9wdGlvbiA9IHRoaXMub3B0aW9ucy5jb250ZW50LAoJCQl0aGF0ID0gdGhpcywKCQkJZXZlbnRUeXBlID0gZXZlbnQgPyBldmVudC50eXBlIDogbnVsbDsKCgkJaWYgKCB0eXBlb2YgY29udGVudE9wdGlvbiA9PT0gInN0cmluZyIgKSB7CgkJCXJldHVybiB0aGlzLl9vcGVuKCBldmVudCwgdGFyZ2V0LCBjb250ZW50T3B0aW9uICk7CgkJfQoKCQljb250ZW50ID0gY29udGVudE9wdGlvbi5jYWxsKCB0YXJnZXRbMF0sIGZ1bmN0aW9uKCByZXNwb25zZSApIHsKCQkJLy8gaWdub3JlIGFzeW5jIHJlc3BvbnNlIGlmIHRvb2x0aXAgd2FzIGNsb3NlZCBhbHJlYWR5CgkJCWlmICggIXRhcmdldC5kYXRhKCAidWktdG9vbHRpcC1vcGVuIiApICkgewoJCQkJcmV0dXJuOwoJCQl9CgkJCS8vIElFIG1heSBpbnN0YW50bHkgc2VydmUgYSBjYWNoZWQgcmVzcG9uc2UgZm9yIGFqYXggcmVxdWVzdHMKCQkJLy8gZGVsYXkgdGhpcyBjYWxsIHRvIF9vcGVuIHNvIHRoZSBvdGhlciBjYWxsIHRvIF9vcGVuIHJ1bnMgZmlyc3QKCQkJdGhhdC5fZGVsYXkoZnVuY3Rpb24oKSB7CgkJCQkvLyBqUXVlcnkgY3JlYXRlcyBhIHNwZWNpYWwgZXZlbnQgZm9yIGZvY3VzaW4gd2hlbiBpdCBkb2Vzbid0CgkJCQkvLyBleGlzdCBuYXRpdmVseS4gVG8gaW1wcm92ZSBwZXJmb3JtYW5jZSwgdGhlIG5hdGl2ZSBldmVudAoJCQkJLy8gb2JqZWN0IGlzIHJldXNlZCBhbmQgdGhlIHR5cGUgaXMgY2hhbmdlZC4gVGhlcmVmb3JlLCB3ZSBjYW4ndAoJCQkJLy8gcmVseSBvbiB0aGUgdHlwZSBiZWluZyBjb3JyZWN0IGFmdGVyIHRoZSBldmVudCBmaW5pc2hlZAoJCQkJLy8gYnViYmxpbmcsIHNvIHdlIHNldCBpdCBiYWNrIHRvIHRoZSBwcmV2aW91cyB2YWx1ZS4gKCM4NzQwKQoJCQkJaWYgKCBldmVudCApIHsKCQkJCQlldmVudC50eXBlID0gZXZlbnRUeXBlOwoJCQkJfQoJCQkJdGhpcy5fb3BlbiggZXZlbnQsIHRhcmdldCwgcmVzcG9uc2UgKTsKCQkJfSk7CgkJfSk7CgkJaWYgKCBjb250ZW50ICkgewoJCQl0aGlzLl9vcGVuKCBldmVudCwgdGFyZ2V0LCBjb250ZW50ICk7CgkJfQoJfSwKCglfb3BlbjogZnVuY3Rpb24oIGV2ZW50LCB0YXJnZXQsIGNvbnRlbnQgKSB7CgkJdmFyIHRvb2x0aXAsIGV2ZW50cywgZGVsYXllZFNob3csCgkJCXBvc2l0aW9uT3B0aW9uID0gJC5leHRlbmQoIHt9LCB0aGlzLm9wdGlvbnMucG9zaXRpb24gKTsKCgkJaWYgKCAhY29udGVudCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gQ29udGVudCBjYW4gYmUgdXBkYXRlZCBtdWx0aXBsZSB0aW1lcy4gSWYgdGhlIHRvb2x0aXAgYWxyZWFkeQoJCS8vIGV4aXN0cywgdGhlbiBqdXN0IHVwZGF0ZSB0aGUgY29udGVudCBhbmQgYmFpbC4KCQl0b29sdGlwID0gdGhpcy5fZmluZCggdGFyZ2V0ICk7CgkJaWYgKCB0b29sdGlwLmxlbmd0aCApIHsKCQkJdG9vbHRpcC5maW5kKCAiLnVpLXRvb2x0aXAtY29udGVudCIgKS5odG1sKCBjb250ZW50ICk7CgkJCXJldHVybjsKCQl9CgoJCS8vIGlmIHdlIGhhdmUgYSB0aXRsZSwgY2xlYXIgaXQgdG8gcHJldmVudCB0aGUgbmF0aXZlIHRvb2x0aXAKCQkvLyB3ZSBoYXZlIHRvIGNoZWNrIGZpcnN0IHRvIGF2b2lkIGRlZmluaW5nIGEgdGl0bGUgaWYgbm9uZSBleGlzdHMKCQkvLyAod2UgZG9uJ3Qgd2FudCB0byBjYXVzZSBhbiBlbGVtZW50IHRvIHN0YXJ0IG1hdGNoaW5nIFt0aXRsZV0pCgkJLy8KCQkvLyBXZSB1c2UgcmVtb3ZlQXR0ciBvbmx5IGZvciBrZXkgZXZlbnRzLCB0byBhbGxvdyBJRSB0byBleHBvcnQgdGhlIGNvcnJlY3QKCQkvLyBhY2Nlc3NpYmxlIGF0dHJpYnV0ZXMuIEZvciBtb3VzZSBldmVudHMsIHNldCB0byBlbXB0eSBzdHJpbmcgdG8gYXZvaWQKCQkvLyBuYXRpdmUgdG9vbHRpcCBzaG93aW5nIHVwIChoYXBwZW5zIG9ubHkgd2hlbiByZW1vdmluZyBpbnNpZGUgbW91c2VvdmVyKS4KCQlpZiAoIHRhcmdldC5pcyggIlt0aXRsZV0iICkgKSB7CgkJCWlmICggZXZlbnQgJiYgZXZlbnQudHlwZSA9PT0gIm1vdXNlb3ZlciIgKSB7CgkJCQl0YXJnZXQuYXR0ciggInRpdGxlIiwgIiIgKTsKCQkJfSBlbHNlIHsKCQkJCXRhcmdldC5yZW1vdmVBdHRyKCAidGl0bGUiICk7CgkJCX0KCQl9CgoJCXRvb2x0aXAgPSB0aGlzLl90b29sdGlwKCB0YXJnZXQgKTsKCQlhZGREZXNjcmliZWRCeSggdGFyZ2V0LCB0b29sdGlwLmF0dHIoICJpZCIgKSApOwoJCXRvb2x0aXAuZmluZCggIi51aS10b29sdGlwLWNvbnRlbnQiICkuaHRtbCggY29udGVudCApOwoKCQlmdW5jdGlvbiBwb3NpdGlvbiggZXZlbnQgKSB7CgkJCXBvc2l0aW9uT3B0aW9uLm9mID0gZXZlbnQ7CgkJCWlmICggdG9vbHRpcC5pcyggIjpoaWRkZW4iICkgKSB7CgkJCQlyZXR1cm47CgkJCX0KCQkJdG9vbHRpcC5wb3NpdGlvbiggcG9zaXRpb25PcHRpb24gKTsKCQl9CgkJaWYgKCB0aGlzLm9wdGlvbnMudHJhY2sgJiYgZXZlbnQgJiYgL15tb3VzZS8udGVzdCggZXZlbnQudHlwZSApICkgewoJCQl0aGlzLl9vbiggdGhpcy5kb2N1bWVudCwgewoJCQkJbW91c2Vtb3ZlOiBwb3NpdGlvbgoJCQl9KTsKCQkJLy8gdHJpZ2dlciBvbmNlIHRvIG92ZXJyaWRlIGVsZW1lbnQtcmVsYXRpdmUgcG9zaXRpb25pbmcKCQkJcG9zaXRpb24oIGV2ZW50ICk7CgkJfSBlbHNlIHsKCQkJdG9vbHRpcC5wb3NpdGlvbiggJC5leHRlbmQoewoJCQkJb2Y6IHRhcmdldAoJCQl9LCB0aGlzLm9wdGlvbnMucG9zaXRpb24gKSApOwoJCX0KCgkJdG9vbHRpcC5oaWRlKCk7CgoJCXRoaXMuX3Nob3coIHRvb2x0aXAsIHRoaXMub3B0aW9ucy5zaG93ICk7CgkJLy8gSGFuZGxlIHRyYWNraW5nIHRvb2x0aXBzIHRoYXQgYXJlIHNob3duIHdpdGggYSBkZWxheSAoIzg2NDQpLiBBcyBzb29uCgkJLy8gYXMgdGhlIHRvb2x0aXAgaXMgdmlzaWJsZSwgcG9zaXRpb24gdGhlIHRvb2x0aXAgdXNpbmcgdGhlIG1vc3QgcmVjZW50CgkJLy8gZXZlbnQuCgkJaWYgKCB0aGlzLm9wdGlvbnMuc2hvdyAmJiB0aGlzLm9wdGlvbnMuc2hvdy5kZWxheSApIHsKCQkJZGVsYXllZFNob3cgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKCQkJCWlmICggdG9vbHRpcC5pcyggIjp2aXNpYmxlIiApICkgewoJCQkJCXBvc2l0aW9uKCBwb3NpdGlvbk9wdGlvbi5vZiApOwoJCQkJCWNsZWFySW50ZXJ2YWwoIGRlbGF5ZWRTaG93ICk7CgkJCQl9CgkJCX0sICQuZnguaW50ZXJ2YWwgKTsKCQl9CgoJCXRoaXMuX3RyaWdnZXIoICJvcGVuIiwgZXZlbnQsIHsgdG9vbHRpcDogdG9vbHRpcCB9ICk7CgoJCWV2ZW50cyA9IHsKCQkJa2V5dXA6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWlmICggZXZlbnQua2V5Q29kZSA9PT0gJC51aS5rZXlDb2RlLkVTQ0FQRSApIHsKCQkJCQl2YXIgZmFrZUV2ZW50ID0gJC5FdmVudChldmVudCk7CgkJCQkJZmFrZUV2ZW50LmN1cnJlbnRUYXJnZXQgPSB0YXJnZXRbMF07CgkJCQkJdGhpcy5jbG9zZSggZmFrZUV2ZW50LCB0cnVlICk7CgkJCQl9CgkJCX0sCgkJCXJlbW92ZTogZnVuY3Rpb24oKSB7CgkJCQl0aGlzLl9yZW1vdmVUb29sdGlwKCB0b29sdGlwICk7CgkJCX0KCQl9OwoJCWlmICggIWV2ZW50IHx8IGV2ZW50LnR5cGUgPT09ICJtb3VzZW92ZXIiICkgewoJCQlldmVudHMubW91c2VsZWF2ZSA9ICJjbG9zZSI7CgkJfQoJCWlmICggIWV2ZW50IHx8IGV2ZW50LnR5cGUgPT09ICJmb2N1c2luIiApIHsKCQkJZXZlbnRzLmZvY3Vzb3V0ID0gImNsb3NlIjsKCQl9CgkJdGhpcy5fb24oIHRydWUsIHRhcmdldCwgZXZlbnRzICk7Cgl9LAoKCWNsb3NlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdmFyIHRoYXQgPSB0aGlzLAoJCQl0YXJnZXQgPSAkKCBldmVudCA/IGV2ZW50LmN1cnJlbnRUYXJnZXQgOiB0aGlzLmVsZW1lbnQgKSwKCQkJdG9vbHRpcCA9IHRoaXMuX2ZpbmQoIHRhcmdldCApOwoKCQkvLyBkaXNhYmxpbmcgY2xvc2VzIHRoZSB0b29sdGlwLCBzbyB3ZSBuZWVkIHRvIHRyYWNrIHdoZW4gd2UncmUgY2xvc2luZwoJCS8vIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AgaW4gY2FzZSB0aGUgdG9vbHRpcCBiZWNvbWVzIGRpc2FibGVkIG9uIGNsb3NlCgkJaWYgKCB0aGlzLmNsb3NpbmcgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIG9ubHkgc2V0IHRpdGxlIGlmIHdlIGhhZCBvbmUgYmVmb3JlIChzZWUgY29tbWVudCBpbiBfb3BlbigpKQoJCWlmICggdGFyZ2V0LmRhdGEoICJ1aS10b29sdGlwLXRpdGxlIiApICkgewoJCQl0YXJnZXQuYXR0ciggInRpdGxlIiwgdGFyZ2V0LmRhdGEoICJ1aS10b29sdGlwLXRpdGxlIiApICk7CgkJfQoKCQlyZW1vdmVEZXNjcmliZWRCeSggdGFyZ2V0ICk7CgoJCXRvb2x0aXAuc3RvcCggdHJ1ZSApOwoJCXRoaXMuX2hpZGUoIHRvb2x0aXAsIHRoaXMub3B0aW9ucy5oaWRlLCBmdW5jdGlvbigpIHsKCQkJdGhhdC5fcmVtb3ZlVG9vbHRpcCggJCggdGhpcyApICk7CgkJfSk7CgoJCXRhcmdldC5yZW1vdmVEYXRhKCAidWktdG9vbHRpcC1vcGVuIiApOwoJCXRoaXMuX29mZiggdGFyZ2V0LCAibW91c2VsZWF2ZSBmb2N1c291dCBrZXl1cCIgKTsKCQkvLyBSZW1vdmUgJ3JlbW92ZScgYmluZGluZyBvbmx5IG9uIGRlbGVnYXRlZCB0YXJnZXRzCgkJaWYgKCB0YXJnZXRbMF0gIT09IHRoaXMuZWxlbWVudFswXSApIHsKCQkJdGhpcy5fb2ZmKCB0YXJnZXQsICJyZW1vdmUiICk7CgkJfQoJCXRoaXMuX29mZiggdGhpcy5kb2N1bWVudCwgIm1vdXNlbW92ZSIgKTsKCgkJaWYgKCBldmVudCAmJiBldmVudC50eXBlID09PSAibW91c2VsZWF2ZSIgKSB7CgkJCSQuZWFjaCggdGhpcy5wYXJlbnRzLCBmdW5jdGlvbiggaWQsIHBhcmVudCApIHsKCQkJCSQoIHBhcmVudC5lbGVtZW50ICkuYXR0ciggInRpdGxlIiwgcGFyZW50LnRpdGxlICk7CgkJCQlkZWxldGUgdGhhdC5wYXJlbnRzWyBpZCBdOwoJCQl9KTsKCQl9CgoJCXRoaXMuY2xvc2luZyA9IHRydWU7CgkJdGhpcy5fdHJpZ2dlciggImNsb3NlIiwgZXZlbnQsIHsgdG9vbHRpcDogdG9vbHRpcCB9ICk7CgkJdGhpcy5jbG9zaW5nID0gZmFsc2U7Cgl9LAoKCV90b29sdGlwOiBmdW5jdGlvbiggZWxlbWVudCApIHsKCQl2YXIgaWQgPSAidWktdG9vbHRpcC0iICsgaW5jcmVtZW50cysrLAoJCQl0b29sdGlwID0gJCggIjxkaXY+IiApCgkJCQkuYXR0cih7CgkJCQkJaWQ6IGlkLAoJCQkJCXJvbGU6ICJ0b29sdGlwIgoJCQkJfSkKCQkJCS5hZGRDbGFzcyggInVpLXRvb2x0aXAgdWktd2lkZ2V0IHVpLWNvcm5lci1hbGwgdWktd2lkZ2V0LWNvbnRlbnQgIiArCgkJCQkJKCB0aGlzLm9wdGlvbnMudG9vbHRpcENsYXNzIHx8ICIiICkgKTsKCQkkKCAiPGRpdj4iICkKCQkJLmFkZENsYXNzKCAidWktdG9vbHRpcC1jb250ZW50IiApCgkJCS5hcHBlbmRUbyggdG9vbHRpcCApOwoJCXRvb2x0aXAuYXBwZW5kVG8oIHRoaXMuZG9jdW1lbnRbMF0uYm9keSApOwoJCWlmICggJC5mbi5iZ2lmcmFtZSApIHsKCQkJdG9vbHRpcC5iZ2lmcmFtZSgpOwoJCX0KCQl0aGlzLnRvb2x0aXBzWyBpZCBdID0gZWxlbWVudDsKCQlyZXR1cm4gdG9vbHRpcDsKCX0sCgoJX2ZpbmQ6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7CgkJdmFyIGlkID0gdGFyZ2V0LmRhdGEoICJ1aS10b29sdGlwLWlkIiApOwoJCXJldHVybiBpZCA/ICQoICIjIiArIGlkICkgOiAkKCk7Cgl9LAoKCV9yZW1vdmVUb29sdGlwOiBmdW5jdGlvbiggdG9vbHRpcCApIHsKCQl0b29sdGlwLnJlbW92ZSgpOwoJCWRlbGV0ZSB0aGlzLnRvb2x0aXBzWyB0b29sdGlwLmF0dHIoICJpZCIgKSBdOwoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoKCQkvLyBjbG9zZSBvcGVuIHRvb2x0aXBzCgkJJC5lYWNoKCB0aGlzLnRvb2x0aXBzLCBmdW5jdGlvbiggaWQsIGVsZW1lbnQgKSB7CgkJCS8vIERlbGVnYXRlIHRvIGNsb3NlIG1ldGhvZCB0byBoYW5kbGUgY29tbW9uIGNsZWFudXAKCQkJdmFyIGV2ZW50ID0gJC5FdmVudCggImJsdXIiICk7CgkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBlbGVtZW50WzBdOwoJCQl0aGF0LmNsb3NlKCBldmVudCwgdHJ1ZSApOwoKCQkJLy8gUmVtb3ZlIGltbWVkaWF0ZWx5OyBkZXN0cm95aW5nIGFuIG9wZW4gdG9vbHRpcCBkb2Vzbid0IHVzZSB0aGUKCQkJLy8gaGlkZSBhbmltYXRpb24KCQkJJCggIiMiICsgaWQgKS5yZW1vdmUoKTsKCgkJCS8vIFJlc3RvcmUgdGhlIHRpdGxlCgkJCWlmICggZWxlbWVudC5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIgKSApIHsKCQkJCWVsZW1lbnQuYXR0ciggInRpdGxlIiwgZWxlbWVudC5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIgKSApOwoJCQkJZWxlbWVudC5yZW1vdmVEYXRhKCAidWktdG9vbHRpcC10aXRsZSIgKTsKCQkJfQoJCX0pOwoJfQp9KTsKCn0oIGpRdWVyeSApICk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/js/jquery-ui-1.9.2.custom.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSBVSSAtIHYxLjkuMiAtIDIwMTItMTEtMjMKKiBodHRwOi8vanF1ZXJ5dWkuY29tCiogSW5jbHVkZXM6IGpxdWVyeS51aS5jb3JlLmpzLCBqcXVlcnkudWkud2lkZ2V0LmpzLCBqcXVlcnkudWkubW91c2UuanMsIGpxdWVyeS51aS5wb3NpdGlvbi5qcywganF1ZXJ5LnVpLmFjY29yZGlvbi5qcywganF1ZXJ5LnVpLmF1dG9jb21wbGV0ZS5qcywganF1ZXJ5LnVpLmJ1dHRvbi5qcywganF1ZXJ5LnVpLmRhdGVwaWNrZXIuanMsIGpxdWVyeS51aS5kaWFsb2cuanMsIGpxdWVyeS51aS5kcmFnZ2FibGUuanMsIGpxdWVyeS51aS5kcm9wcGFibGUuanMsIGpxdWVyeS51aS5lZmZlY3QuanMsIGpxdWVyeS51aS5lZmZlY3QtYmxpbmQuanMsIGpxdWVyeS51aS5lZmZlY3QtYm91bmNlLmpzLCBqcXVlcnkudWkuZWZmZWN0LWNsaXAuanMsIGpxdWVyeS51aS5lZmZlY3QtZHJvcC5qcywganF1ZXJ5LnVpLmVmZmVjdC1leHBsb2RlLmpzLCBqcXVlcnkudWkuZWZmZWN0LWZhZGUuanMsIGpxdWVyeS51aS5lZmZlY3QtZm9sZC5qcywganF1ZXJ5LnVpLmVmZmVjdC1oaWdobGlnaHQuanMsIGpxdWVyeS51aS5lZmZlY3QtcHVsc2F0ZS5qcywganF1ZXJ5LnVpLmVmZmVjdC1zY2FsZS5qcywganF1ZXJ5LnVpLmVmZmVjdC1zaGFrZS5qcywganF1ZXJ5LnVpLmVmZmVjdC1zbGlkZS5qcywganF1ZXJ5LnVpLmVmZmVjdC10cmFuc2Zlci5qcywganF1ZXJ5LnVpLm1lbnUuanMsIGpxdWVyeS51aS5wcm9ncmVzc2Jhci5qcywganF1ZXJ5LnVpLnJlc2l6YWJsZS5qcywganF1ZXJ5LnVpLnNlbGVjdGFibGUuanMsIGpxdWVyeS51aS5zbGlkZXIuanMsIGpxdWVyeS51aS5zb3J0YWJsZS5qcywganF1ZXJ5LnVpLnNwaW5uZXIuanMsIGpxdWVyeS51aS50YWJzLmpzLCBqcXVlcnkudWkudG9vbHRpcC5qcwoqIENvcHlyaWdodCAoYykgMjAxMiBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIExpY2Vuc2VkIE1JVCAqLwoKKGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gaSh0LG4pe3ZhciByLGksbyx1PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iYXJlYSI9PT11PyhyPXQucGFyZW50Tm9kZSxpPXIubmFtZSwhdC5ocmVmfHwhaXx8ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im1hcCI/ITE6KG89ZSgiaW1nW3VzZW1hcD0jIitpKyJdIilbMF0sISFvJiZzKG8pKSk6KC9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdC8udGVzdCh1KT8hdC5kaXNhYmxlZDoiYSI9PT11P3QuaHJlZnx8bjpuKSYmcyh0KX1mdW5jdGlvbiBzKHQpe3JldHVybiBlLmV4cHIuZmlsdGVycy52aXNpYmxlKHQpJiYhZSh0KS5wYXJlbnRzKCkuYW5kU2VsZigpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBlLmNzcyh0aGlzLCJ2aXNpYmlsaXR5Iik9PT0iaGlkZGVuIn0pLmxlbmd0aH12YXIgbj0wLHI9L151aS1pZC1cZCskLztlLnVpPWUudWl8fHt9O2lmKGUudWkudmVyc2lvbilyZXR1cm47ZS5leHRlbmQoZS51aSx7dmVyc2lvbjoiMS45LjIiLGtleUNvZGU6e0JBQ0tTUEFDRTo4LENPTU1BOjE4OCxERUxFVEU6NDYsRE9XTjo0MCxFTkQ6MzUsRU5URVI6MTMsRVNDQVBFOjI3LEhPTUU6MzYsTEVGVDozNyxOVU1QQURfQUREOjEwNyxOVU1QQURfREVDSU1BTDoxMTAsTlVNUEFEX0RJVklERToxMTEsTlVNUEFEX0VOVEVSOjEwOCxOVU1QQURfTVVMVElQTFk6MTA2LE5VTVBBRF9TVUJUUkFDVDoxMDksUEFHRV9ET1dOOjM0LFBBR0VfVVA6MzMsUEVSSU9EOjE5MCxSSUdIVDozOSxTUEFDRTozMixUQUI6OSxVUDozOH19KSxlLmZuLmV4dGVuZCh7X2ZvY3VzOmUuZm4uZm9jdXMsZm9jdXM6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciByPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2UocikuZm9jdXMoKSxuJiZuLmNhbGwocil9LHQpfSk6dGhpcy5fZm9jdXMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxzY3JvbGxQYXJlbnQ6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gZS51aS5pZSYmLyhzdGF0aWN8cmVsYXRpdmUpLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKXx8L2Fic29sdXRlLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKT90PXRoaXMucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybi8ocmVsYXRpdmV8YWJzb2x1dGV8Zml4ZWQpLy50ZXN0KGUuY3NzKHRoaXMsInBvc2l0aW9uIikpJiYvKGF1dG98c2Nyb2xsKS8udGVzdChlLmNzcyh0aGlzLCJvdmVyZmxvdyIpK2UuY3NzKHRoaXMsIm92ZXJmbG93LXkiKStlLmNzcyh0aGlzLCJvdmVyZmxvdy14IikpfSkuZXEoMCk6dD10aGlzLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4vKGF1dG98c2Nyb2xsKS8udGVzdChlLmNzcyh0aGlzLCJvdmVyZmxvdyIpK2UuY3NzKHRoaXMsIm92ZXJmbG93LXkiKStlLmNzcyh0aGlzLCJvdmVyZmxvdy14IikpfSkuZXEoMCksL2ZpeGVkLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKXx8IXQubGVuZ3RoP2UoZG9jdW1lbnQpOnR9LHpJbmRleDpmdW5jdGlvbihuKXtpZihuIT09dClyZXR1cm4gdGhpcy5jc3MoInpJbmRleCIsbik7aWYodGhpcy5sZW5ndGgpe3ZhciByPWUodGhpc1swXSksaSxzO3doaWxlKHIubGVuZ3RoJiZyWzBdIT09ZG9jdW1lbnQpe2k9ci5jc3MoInBvc2l0aW9uIik7aWYoaT09PSJhYnNvbHV0ZSJ8fGk9PT0icmVsYXRpdmUifHxpPT09ImZpeGVkIil7cz1wYXJzZUludChyLmNzcygiekluZGV4IiksMTApO2lmKCFpc05hTihzKSYmcyE9PTApcmV0dXJuIHN9cj1yLnBhcmVudCgpfX1yZXR1cm4gMH0sdW5pcXVlSWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5pZHx8KHRoaXMuaWQ9InVpLWlkLSIrICsrbil9KX0scmVtb3ZlVW5pcXVlSWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ci50ZXN0KHRoaXMuaWQpJiZlKHRoaXMpLnJlbW92ZUF0dHIoImlkIil9KX19KSxlLmV4dGVuZChlLmV4cHJbIjoiXSx7ZGF0YTplLmV4cHIuY3JlYXRlUHNldWRvP2UuZXhwci5jcmVhdGVQc2V1ZG8oZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiEhZS5kYXRhKG4sdCl9fSk6ZnVuY3Rpb24odCxuLHIpe3JldHVybiEhZS5kYXRhKHQsclszXSl9LGZvY3VzYWJsZTpmdW5jdGlvbih0KXtyZXR1cm4gaSh0LCFpc05hTihlLmF0dHIodCwidGFiaW5kZXgiKSkpfSx0YWJiYWJsZTpmdW5jdGlvbih0KXt2YXIgbj1lLmF0dHIodCwidGFiaW5kZXgiKSxyPWlzTmFOKG4pO3JldHVybihyfHxuPj0wKSYmaSh0LCFyKX19KSxlKGZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuYm9keSxuPXQuYXBwZW5kQ2hpbGQobj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7bi5vZmZzZXRIZWlnaHQsZS5leHRlbmQobi5zdHlsZSx7bWluSGVpZ2h0OiIxMDBweCIsaGVpZ2h0OiJhdXRvIixwYWRkaW5nOjAsYm9yZGVyV2lkdGg6MH0pLGUuc3VwcG9ydC5taW5IZWlnaHQ9bi5vZmZzZXRIZWlnaHQ9PT0xMDAsZS5zdXBwb3J0LnNlbGVjdHN0YXJ0PSJvbnNlbGVjdHN0YXJ0ImluIG4sdC5yZW1vdmVDaGlsZChuKS5zdHlsZS5kaXNwbGF5PSJub25lIn0pLGUoIjxhPiIpLm91dGVyV2lkdGgoMSkuanF1ZXJ5fHxlLmVhY2goWyJXaWR0aCIsIkhlaWdodCJdLGZ1bmN0aW9uKG4scil7ZnVuY3Rpb24gdSh0LG4scixzKXtyZXR1cm4gZS5lYWNoKGksZnVuY3Rpb24oKXtuLT1wYXJzZUZsb2F0KGUuY3NzKHQsInBhZGRpbmciK3RoaXMpKXx8MCxyJiYobi09cGFyc2VGbG9hdChlLmNzcyh0LCJib3JkZXIiK3RoaXMrIldpZHRoIikpfHwwKSxzJiYobi09cGFyc2VGbG9hdChlLmNzcyh0LCJtYXJnaW4iK3RoaXMpKXx8MCl9KSxufXZhciBpPXI9PT0iV2lkdGgiP1siTGVmdCIsIlJpZ2h0Il06WyJUb3AiLCJCb3R0b20iXSxzPXIudG9Mb3dlckNhc2UoKSxvPXtpbm5lcldpZHRoOmUuZm4uaW5uZXJXaWR0aCxpbm5lckhlaWdodDplLmZuLmlubmVySGVpZ2h0LG91dGVyV2lkdGg6ZS5mbi5vdXRlcldpZHRoLG91dGVySGVpZ2h0OmUuZm4ub3V0ZXJIZWlnaHR9O2UuZm5bImlubmVyIityXT1mdW5jdGlvbihuKXtyZXR1cm4gbj09PXQ/b1siaW5uZXIiK3JdLmNhbGwodGhpcyk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZSh0aGlzKS5jc3Mocyx1KHRoaXMsbikrInB4Iil9KX0sZS5mblsib3V0ZXIiK3JdPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHR5cGVvZiB0IT0ibnVtYmVyIj9vWyJvdXRlciIrcl0uY2FsbCh0aGlzLHQpOnRoaXMuZWFjaChmdW5jdGlvbigpe2UodGhpcykuY3NzKHMsdSh0aGlzLHQsITAsbikrInB4Iil9KX19KSxlKCI8YT4iKS5kYXRhKCJhLWIiLCJhIikucmVtb3ZlRGF0YSgiYS1iIikuZGF0YSgiYS1iIikmJihlLmZuLnJlbW92ZURhdGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QuY2FsbCh0aGlzLGUuY2FtZWxDYXNlKG4pKTp0LmNhbGwodGhpcyl9fShlLmZuLnJlbW92ZURhdGEpKSxmdW5jdGlvbigpe3ZhciB0PS9tc2llIChbXHcuXSspLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSl8fFtdO2UudWkuaWU9dC5sZW5ndGg/ITA6ITEsZS51aS5pZTY9cGFyc2VGbG9hdCh0WzFdLDEwKT09PTZ9KCksZS5mbi5leHRlbmQoe2Rpc2FibGVTZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iaW5kKChlLnN1cHBvcnQuc2VsZWN0c3RhcnQ/InNlbGVjdHN0YXJ0IjoibW91c2Vkb3duIikrIi51aS1kaXNhYmxlU2VsZWN0aW9uIixmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCl9KX0sZW5hYmxlU2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5iaW5kKCIudWktZGlzYWJsZVNlbGVjdGlvbiIpfX0pLGUuZXh0ZW5kKGUudWkse3BsdWdpbjp7YWRkOmZ1bmN0aW9uKHQsbixyKXt2YXIgaSxzPWUudWlbdF0ucHJvdG90eXBlO2ZvcihpIGluIHIpcy5wbHVnaW5zW2ldPXMucGx1Z2luc1tpXXx8W10scy5wbHVnaW5zW2ldLnB1c2goW24scltpXV0pfSxjYWxsOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPWUucGx1Z2luc1t0XTtpZighaXx8IWUuZWxlbWVudFswXS5wYXJlbnROb2RlfHxlLmVsZW1lbnRbMF0ucGFyZW50Tm9kZS5ub2RlVHlwZT09PTExKXJldHVybjtmb3Iocj0wO3I8aS5sZW5ndGg7cisrKWUub3B0aW9uc1tpW3JdWzBdXSYmaVtyXVsxXS5hcHBseShlLmVsZW1lbnQsbil9fSxjb250YWluczplLmNvbnRhaW5zLGhhc1Njcm9sbDpmdW5jdGlvbih0LG4pe2lmKGUodCkuY3NzKCJvdmVyZmxvdyIpPT09ImhpZGRlbiIpcmV0dXJuITE7dmFyIHI9biYmbj09PSJsZWZ0Ij8ic2Nyb2xsTGVmdCI6InNjcm9sbFRvcCIsaT0hMTtyZXR1cm4gdFtyXT4wPyEwOih0W3JdPTEsaT10W3JdPjAsdFtyXT0wLGkpfSxpc092ZXJBeGlzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT50JiZlPHQrbn0saXNPdmVyOmZ1bmN0aW9uKHQsbixyLGkscyxvKXtyZXR1cm4gZS51aS5pc092ZXJBeGlzKHQscixzKSYmZS51aS5pc092ZXJBeGlzKG4saSxvKX19KX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyPUFycmF5LnByb3RvdHlwZS5zbGljZSxpPWUuY2xlYW5EYXRhO2UuY2xlYW5EYXRhPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wLHI7KHI9dFtuXSkhPW51bGw7bisrKXRyeXtlKHIpLnRyaWdnZXJIYW5kbGVyKCJyZW1vdmUiKX1jYXRjaChzKXt9aSh0KX0sZS53aWRnZXQ9ZnVuY3Rpb24odCxuLHIpe3ZhciBpLHMsbyx1LGE9dC5zcGxpdCgiLiIpWzBdO3Q9dC5zcGxpdCgiLiIpWzFdLGk9YSsiLSIrdCxyfHwocj1uLG49ZS5XaWRnZXQpLGUuZXhwclsiOiJdW2kudG9Mb3dlckNhc2UoKV09ZnVuY3Rpb24odCl7cmV0dXJuISFlLmRhdGEodCxpKX0sZVthXT1lW2FdfHx7fSxzPWVbYV1bdF0sbz1lW2FdW3RdPWZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuX2NyZWF0ZVdpZGdldClyZXR1cm4gbmV3IG8oZSx0KTthcmd1bWVudHMubGVuZ3RoJiZ0aGlzLl9jcmVhdGVXaWRnZXQoZSx0KX0sZS5leHRlbmQobyxzLHt2ZXJzaW9uOnIudmVyc2lvbixfcHJvdG86ZS5leHRlbmQoe30sciksX2NoaWxkQ29uc3RydWN0b3JzOltdfSksdT1uZXcgbix1Lm9wdGlvbnM9ZS53aWRnZXQuZXh0ZW5kKHt9LHUub3B0aW9ucyksZS5lYWNoKHIsZnVuY3Rpb24odCxpKXtlLmlzRnVuY3Rpb24oaSkmJihyW3RdPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gbi5wcm90b3R5cGVbdF0uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxyPWZ1bmN0aW9uKGUpe3JldHVybiBuLnByb3RvdHlwZVt0XS5hcHBseSh0aGlzLGUpfTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zdXBlcixuPXRoaXMuX3N1cGVyQXBwbHkscztyZXR1cm4gdGhpcy5fc3VwZXI9ZSx0aGlzLl9zdXBlckFwcGx5PXIscz1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9zdXBlcj10LHRoaXMuX3N1cGVyQXBwbHk9bixzfX0oKSl9KSxvLnByb3RvdHlwZT1lLndpZGdldC5leHRlbmQodSx7d2lkZ2V0RXZlbnRQcmVmaXg6cz91LndpZGdldEV2ZW50UHJlZml4OnR9LHIse2NvbnN0cnVjdG9yOm8sbmFtZXNwYWNlOmEsd2lkZ2V0TmFtZTp0LHdpZGdldEJhc2VDbGFzczppLHdpZGdldEZ1bGxOYW1lOml9KSxzPyhlLmVhY2gocy5fY2hpbGRDb25zdHJ1Y3RvcnMsZnVuY3Rpb24odCxuKXt2YXIgcj1uLnByb3RvdHlwZTtlLndpZGdldChyLm5hbWVzcGFjZSsiLiIrci53aWRnZXROYW1lLG8sbi5fcHJvdG8pfSksZGVsZXRlIHMuX2NoaWxkQ29uc3RydWN0b3JzKTpuLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKG8pLGUud2lkZ2V0LmJyaWRnZSh0LG8pfSxlLndpZGdldC5leHRlbmQ9ZnVuY3Rpb24obil7dmFyIGk9ci5jYWxsKGFyZ3VtZW50cywxKSxzPTAsbz1pLmxlbmd0aCx1LGE7Zm9yKDtzPG87cysrKWZvcih1IGluIGlbc10pYT1pW3NdW3VdLGlbc10uaGFzT3duUHJvcGVydHkodSkmJmEhPT10JiYoZS5pc1BsYWluT2JqZWN0KGEpP25bdV09ZS5pc1BsYWluT2JqZWN0KG5bdV0pP2Uud2lkZ2V0LmV4dGVuZCh7fSxuW3VdLGEpOmUud2lkZ2V0LmV4dGVuZCh7fSxhKTpuW3VdPWEpO3JldHVybiBufSxlLndpZGdldC5icmlkZ2U9ZnVuY3Rpb24obixpKXt2YXIgcz1pLnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZXx8bjtlLmZuW25dPWZ1bmN0aW9uKG8pe3ZhciB1PXR5cGVvZiBvPT0ic3RyaW5nIixhPXIuY2FsbChhcmd1bWVudHMsMSksZj10aGlzO3JldHVybiBvPSF1JiZhLmxlbmd0aD9lLndpZGdldC5leHRlbmQuYXBwbHkobnVsbCxbb10uY29uY2F0KGEpKTpvLHU/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHIsaT1lLmRhdGEodGhpcyxzKTtpZighaSlyZXR1cm4gZS5lcnJvcigiY2Fubm90IGNhbGwgbWV0aG9kcyBvbiAiK24rIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIisiYXR0ZW1wdGVkIHRvIGNhbGwgbWV0aG9kICciK28rIiciKTtpZighZS5pc0Z1bmN0aW9uKGlbb10pfHxvLmNoYXJBdCgwKT09PSJfIilyZXR1cm4gZS5lcnJvcigibm8gc3VjaCBtZXRob2QgJyIrbysiJyBmb3IgIituKyIgd2lkZ2V0IGluc3RhbmNlIik7cj1pW29dLmFwcGx5KGksYSk7aWYociE9PWkmJnIhPT10KXJldHVybiBmPXImJnIuanF1ZXJ5P2YucHVzaFN0YWNrKHIuZ2V0KCkpOnIsITF9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lLmRhdGEodGhpcyxzKTt0P3Qub3B0aW9uKG98fHt9KS5faW5pdCgpOmUuZGF0YSh0aGlzLHMsbmV3IGkobyx0aGlzKSl9KSxmfX0sZS5XaWRnZXQ9ZnVuY3Rpb24oKXt9LGUuV2lkZ2V0Ll9jaGlsZENvbnN0cnVjdG9ycz1bXSxlLldpZGdldC5wcm90b3R5cGU9e3dpZGdldE5hbWU6IndpZGdldCIsd2lkZ2V0RXZlbnRQcmVmaXg6IiIsZGVmYXVsdEVsZW1lbnQ6IjxkaXY+IixvcHRpb25zOntkaXNhYmxlZDohMSxjcmVhdGU6bnVsbH0sX2NyZWF0ZVdpZGdldDpmdW5jdGlvbih0LHIpe3I9ZShyfHx0aGlzLmRlZmF1bHRFbGVtZW50fHx0aGlzKVswXSx0aGlzLmVsZW1lbnQ9ZShyKSx0aGlzLnV1aWQ9bisrLHRoaXMuZXZlbnROYW1lc3BhY2U9Ii4iK3RoaXMud2lkZ2V0TmFtZSt0aGlzLnV1aWQsdGhpcy5vcHRpb25zPWUud2lkZ2V0LmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMsdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLHQpLHRoaXMuYmluZGluZ3M9ZSgpLHRoaXMuaG92ZXJhYmxlPWUoKSx0aGlzLmZvY3VzYWJsZT1lKCksciE9PXRoaXMmJihlLmRhdGEocix0aGlzLndpZGdldE5hbWUsdGhpcyksZS5kYXRhKHIsdGhpcy53aWRnZXRGdWxsTmFtZSx0aGlzKSx0aGlzLl9vbighMCx0aGlzLmVsZW1lbnQse3JlbW92ZTpmdW5jdGlvbihlKXtlLnRhcmdldD09PXImJnRoaXMuZGVzdHJveSgpfX0pLHRoaXMuZG9jdW1lbnQ9ZShyLnN0eWxlP3Iub3duZXJEb2N1bWVudDpyLmRvY3VtZW50fHxyKSx0aGlzLndpbmRvdz1lKHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXd8fHRoaXMuZG9jdW1lbnRbMF0ucGFyZW50V2luZG93KSksdGhpcy5fY3JlYXRlKCksdGhpcy5fdHJpZ2dlcigiY3JlYXRlIixudWxsLHRoaXMuX2dldENyZWF0ZUV2ZW50RGF0YSgpKSx0aGlzLl9pbml0KCl9LF9nZXRDcmVhdGVPcHRpb25zOmUubm9vcCxfZ2V0Q3JlYXRlRXZlbnREYXRhOmUubm9vcCxfY3JlYXRlOmUubm9vcCxfaW5pdDplLm5vb3AsZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuX2Rlc3Ryb3koKSx0aGlzLmVsZW1lbnQudW5iaW5kKHRoaXMuZXZlbnROYW1lc3BhY2UpLnJlbW92ZURhdGEodGhpcy53aWRnZXROYW1lKS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0RnVsbE5hbWUpLnJlbW92ZURhdGEoZS5jYW1lbENhc2UodGhpcy53aWRnZXRGdWxsTmFtZSkpLHRoaXMud2lkZ2V0KCkudW5iaW5kKHRoaXMuZXZlbnROYW1lc3BhY2UpLnJlbW92ZUF0dHIoImFyaWEtZGlzYWJsZWQiKS5yZW1vdmVDbGFzcyh0aGlzLndpZGdldEZ1bGxOYW1lKyItZGlzYWJsZWQgIisidWktc3RhdGUtZGlzYWJsZWQiKSx0aGlzLmJpbmRpbmdzLnVuYmluZCh0aGlzLmV2ZW50TmFtZXNwYWNlKSx0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKSx0aGlzLmZvY3VzYWJsZS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKX0sX2Rlc3Ryb3k6ZS5ub29wLHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnR9LG9wdGlvbjpmdW5jdGlvbihuLHIpe3ZhciBpPW4scyxvLHU7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApcmV0dXJuIGUud2lkZ2V0LmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMpO2lmKHR5cGVvZiBuPT0ic3RyaW5nIil7aT17fSxzPW4uc3BsaXQoIi4iKSxuPXMuc2hpZnQoKTtpZihzLmxlbmd0aCl7bz1pW25dPWUud2lkZ2V0LmV4dGVuZCh7fSx0aGlzLm9wdGlvbnNbbl0pO2Zvcih1PTA7dTxzLmxlbmd0aC0xO3UrKylvW3NbdV1dPW9bc1t1XV18fHt9LG89b1tzW3VdXTtuPXMucG9wKCk7aWYocj09PXQpcmV0dXJuIG9bbl09PT10P251bGw6b1tuXTtvW25dPXJ9ZWxzZXtpZihyPT09dClyZXR1cm4gdGhpcy5vcHRpb25zW25dPT09dD9udWxsOnRoaXMub3B0aW9uc1tuXTtpW25dPXJ9fXJldHVybiB0aGlzLl9zZXRPcHRpb25zKGkpLHRoaXN9LF9zZXRPcHRpb25zOmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpdGhpcy5fc2V0T3B0aW9uKHQsZVt0XSk7cmV0dXJuIHRoaXN9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vcHRpb25zW2VdPXQsZT09PSJkaXNhYmxlZCImJih0aGlzLndpZGdldCgpLnRvZ2dsZUNsYXNzKHRoaXMud2lkZ2V0RnVsbE5hbWUrIi1kaXNhYmxlZCB1aS1zdGF0ZS1kaXNhYmxlZCIsISF0KS5hdHRyKCJhcmlhLWRpc2FibGVkIix0KSx0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKSx0aGlzLmZvY3VzYWJsZS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKSksdGhpc30sZW5hYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldE9wdGlvbigiZGlzYWJsZWQiLCExKX0sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIiwhMCl9LF9vbjpmdW5jdGlvbih0LG4scil7dmFyIGkscz10aGlzO3R5cGVvZiB0IT0iYm9vbGVhbiImJihyPW4sbj10LHQ9ITEpLHI/KG49aT1lKG4pLHRoaXMuYmluZGluZ3M9dGhpcy5iaW5kaW5ncy5hZGQobikpOihyPW4sbj10aGlzLmVsZW1lbnQsaT10aGlzLndpZGdldCgpKSxlLmVhY2gocixmdW5jdGlvbihyLG8pe2Z1bmN0aW9uIHUoKXtpZighdCYmKHMub3B0aW9ucy5kaXNhYmxlZD09PSEwfHxlKHRoaXMpLmhhc0NsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpKSlyZXR1cm47cmV0dXJuKHR5cGVvZiBvPT0ic3RyaW5nIj9zW29dOm8pLmFwcGx5KHMsYXJndW1lbnRzKX10eXBlb2YgbyE9InN0cmluZyImJih1Lmd1aWQ9by5ndWlkPW8uZ3VpZHx8dS5ndWlkfHxlLmd1aWQrKyk7dmFyIGE9ci5tYXRjaCgvXihcdyspXHMqKC4qKSQvKSxmPWFbMV0rcy5ldmVudE5hbWVzcGFjZSxsPWFbMl07bD9pLmRlbGVnYXRlKGwsZix1KTpuLmJpbmQoZix1KX0pfSxfb2ZmOmZ1bmN0aW9uKGUsdCl7dD0odHx8IiIpLnNwbGl0KCIgIikuam9pbih0aGlzLmV2ZW50TmFtZXNwYWNlKyIgIikrdGhpcy5ldmVudE5hbWVzcGFjZSxlLnVuYmluZCh0KS51bmRlbGVnYXRlKHQpfSxfZGVsYXk6ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7cmV0dXJuKHR5cGVvZiBlPT0ic3RyaW5nIj9yW2VdOmUpLmFwcGx5KHIsYXJndW1lbnRzKX12YXIgcj10aGlzO3JldHVybiBzZXRUaW1lb3V0KG4sdHx8MCl9LF9ob3ZlcmFibGU6ZnVuY3Rpb24odCl7dGhpcy5ob3ZlcmFibGU9dGhpcy5ob3ZlcmFibGUuYWRkKHQpLHRoaXMuX29uKHQse21vdXNlZW50ZXI6ZnVuY3Rpb24odCl7ZSh0LmN1cnJlbnRUYXJnZXQpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSxtb3VzZWxlYXZlOmZ1bmN0aW9uKHQpe2UodC5jdXJyZW50VGFyZ2V0KS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKX19KX0sX2ZvY3VzYWJsZTpmdW5jdGlvbih0KXt0aGlzLmZvY3VzYWJsZT10aGlzLmZvY3VzYWJsZS5hZGQodCksdGhpcy5fb24odCx7Zm9jdXNpbjpmdW5jdGlvbih0KXtlKHQuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoInVpLXN0YXRlLWZvY3VzIil9LGZvY3Vzb3V0OmZ1bmN0aW9uKHQpe2UodC5jdXJyZW50VGFyZ2V0KS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKX19KX0sX3RyaWdnZXI6ZnVuY3Rpb24odCxuLHIpe3ZhciBpLHMsbz10aGlzLm9wdGlvbnNbdF07cj1yfHx7fSxuPWUuRXZlbnQobiksbi50eXBlPSh0PT09dGhpcy53aWRnZXRFdmVudFByZWZpeD90OnRoaXMud2lkZ2V0RXZlbnRQcmVmaXgrdCkudG9Mb3dlckNhc2UoKSxuLnRhcmdldD10aGlzLmVsZW1lbnRbMF0scz1uLm9yaWdpbmFsRXZlbnQ7aWYocylmb3IoaSBpbiBzKWkgaW4gbnx8KG5baV09c1tpXSk7cmV0dXJuIHRoaXMuZWxlbWVudC50cmlnZ2VyKG4sciksIShlLmlzRnVuY3Rpb24obykmJm8uYXBwbHkodGhpcy5lbGVtZW50WzBdLFtuXS5jb25jYXQocikpPT09ITF8fG4uaXNEZWZhdWx0UHJldmVudGVkKCkpfX0sZS5lYWNoKHtzaG93OiJmYWRlSW4iLGhpZGU6ImZhZGVPdXQifSxmdW5jdGlvbih0LG4pe2UuV2lkZ2V0LnByb3RvdHlwZVsiXyIrdF09ZnVuY3Rpb24ocixpLHMpe3R5cGVvZiBpPT0ic3RyaW5nIiYmKGk9e2VmZmVjdDppfSk7dmFyIG8sdT1pP2k9PT0hMHx8dHlwZW9mIGk9PSJudW1iZXIiP246aS5lZmZlY3R8fG46dDtpPWl8fHt9LHR5cGVvZiBpPT0ibnVtYmVyIiYmKGk9e2R1cmF0aW9uOml9KSxvPSFlLmlzRW1wdHlPYmplY3QoaSksaS5jb21wbGV0ZT1zLGkuZGVsYXkmJnIuZGVsYXkoaS5kZWxheSksbyYmZS5lZmZlY3RzJiYoZS5lZmZlY3RzLmVmZmVjdFt1XXx8ZS51aUJhY2tDb21wYXQhPT0hMSYmZS5lZmZlY3RzW3VdKT9yW3RdKGkpOnUhPT10JiZyW3VdP3JbdV0oaS5kdXJhdGlvbixpLmVhc2luZyxzKTpyLnF1ZXVlKGZ1bmN0aW9uKG4pe2UodGhpcylbdF0oKSxzJiZzLmNhbGwoclswXSksbigpfSl9fSksZS51aUJhY2tDb21wYXQhPT0hMSYmKGUuV2lkZ2V0LnByb3RvdHlwZS5fZ2V0Q3JlYXRlT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybiBlLm1ldGFkYXRhJiZlLm1ldGFkYXRhLmdldCh0aGlzLmVsZW1lbnRbMF0pW3RoaXMud2lkZ2V0TmFtZV19KX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7dmFyIG49ITE7ZShkb2N1bWVudCkubW91c2V1cChmdW5jdGlvbihlKXtuPSExfSksZS53aWRnZXQoInVpLm1vdXNlIix7dmVyc2lvbjoiMS45LjIiLG9wdGlvbnM6e2NhbmNlbDoiaW5wdXQsdGV4dGFyZWEsYnV0dG9uLHNlbGVjdCxvcHRpb24iLGRpc3RhbmNlOjEsZGVsYXk6MH0sX21vdXNlSW5pdDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5lbGVtZW50LmJpbmQoIm1vdXNlZG93bi4iK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbihlKXtyZXR1cm4gdC5fbW91c2VEb3duKGUpfSkuYmluZCgiY2xpY2suIit0aGlzLndpZGdldE5hbWUsZnVuY3Rpb24obil7aWYoITA9PT1lLmRhdGEobi50YXJnZXQsdC53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKSlyZXR1cm4gZS5yZW1vdmVEYXRhKG4udGFyZ2V0LHQud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50Iiksbi5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSwhMX0pLHRoaXMuc3RhcnRlZD0hMX0sX21vdXNlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC51bmJpbmQoIi4iK3RoaXMud2lkZ2V0TmFtZSksdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGUmJmUoZG9jdW1lbnQpLnVuYmluZCgibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS51bmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKX0sX21vdXNlRG93bjpmdW5jdGlvbih0KXtpZihuKXJldHVybjt0aGlzLl9tb3VzZVN0YXJ0ZWQmJnRoaXMuX21vdXNlVXAodCksdGhpcy5fbW91c2VEb3duRXZlbnQ9dDt2YXIgcj10aGlzLGk9dC53aGljaD09PTEscz10eXBlb2YgdGhpcy5vcHRpb25zLmNhbmNlbD09InN0cmluZyImJnQudGFyZ2V0Lm5vZGVOYW1lP2UodC50YXJnZXQpLmNsb3Nlc3QodGhpcy5vcHRpb25zLmNhbmNlbCkubGVuZ3RoOiExO2lmKCFpfHxzfHwhdGhpcy5fbW91c2VDYXB0dXJlKHQpKXJldHVybiEwO3RoaXMubW91c2VEZWxheU1ldD0hdGhpcy5vcHRpb25zLmRlbGF5LHRoaXMubW91c2VEZWxheU1ldHx8KHRoaXMuX21vdXNlRGVsYXlUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5tb3VzZURlbGF5TWV0PSEwfSx0aGlzLm9wdGlvbnMuZGVsYXkpKTtpZih0aGlzLl9tb3VzZURpc3RhbmNlTWV0KHQpJiZ0aGlzLl9tb3VzZURlbGF5TWV0KHQpKXt0aGlzLl9tb3VzZVN0YXJ0ZWQ9dGhpcy5fbW91c2VTdGFydCh0KSE9PSExO2lmKCF0aGlzLl9tb3VzZVN0YXJ0ZWQpcmV0dXJuIHQucHJldmVudERlZmF1bHQoKSwhMH1yZXR1cm4hMD09PWUuZGF0YSh0LnRhcmdldCx0aGlzLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpJiZlLnJlbW92ZURhdGEodC50YXJnZXQsdGhpcy53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZT1mdW5jdGlvbihlKXtyZXR1cm4gci5fbW91c2VNb3ZlKGUpfSx0aGlzLl9tb3VzZVVwRGVsZWdhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHIuX21vdXNlVXAoZSl9LGUoZG9jdW1lbnQpLmJpbmQoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkuYmluZCgibW91c2V1cC4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUpLHQucHJldmVudERlZmF1bHQoKSxuPSEwLCEwfSxfbW91c2VNb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiFlLnVpLmllfHxkb2N1bWVudC5kb2N1bWVudE1vZGU+PTl8fCEhdC5idXR0b24/dGhpcy5fbW91c2VTdGFydGVkPyh0aGlzLl9tb3VzZURyYWcodCksdC5wcmV2ZW50RGVmYXVsdCgpKToodGhpcy5fbW91c2VEaXN0YW5jZU1ldCh0KSYmdGhpcy5fbW91c2VEZWxheU1ldCh0KSYmKHRoaXMuX21vdXNlU3RhcnRlZD10aGlzLl9tb3VzZVN0YXJ0KHRoaXMuX21vdXNlRG93bkV2ZW50LHQpIT09ITEsdGhpcy5fbW91c2VTdGFydGVkP3RoaXMuX21vdXNlRHJhZyh0KTp0aGlzLl9tb3VzZVVwKHQpKSwhdGhpcy5fbW91c2VTdGFydGVkKTp0aGlzLl9tb3VzZVVwKHQpfSxfbW91c2VVcDpmdW5jdGlvbih0KXtyZXR1cm4gZShkb2N1bWVudCkudW5iaW5kKCJtb3VzZW1vdmUuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGUpLnVuYmluZCgibW91c2V1cC4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUpLHRoaXMuX21vdXNlU3RhcnRlZCYmKHRoaXMuX21vdXNlU3RhcnRlZD0hMSx0LnRhcmdldD09PXRoaXMuX21vdXNlRG93bkV2ZW50LnRhcmdldCYmZS5kYXRhKHQudGFyZ2V0LHRoaXMud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IiwhMCksdGhpcy5fbW91c2VTdG9wKHQpKSwhMX0sX21vdXNlRGlzdGFuY2VNZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubWF4KE1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VYLWUucGFnZVgpLE1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VZLWUucGFnZVkpKT49dGhpcy5vcHRpb25zLmRpc3RhbmNlfSxfbW91c2VEZWxheU1ldDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5tb3VzZURlbGF5TWV0fSxfbW91c2VTdGFydDpmdW5jdGlvbihlKXt9LF9tb3VzZURyYWc6ZnVuY3Rpb24oZSl7fSxfbW91c2VTdG9wOmZ1bmN0aW9uKGUpe30sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbihlKXtyZXR1cm4hMH19KX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gaChlLHQsbil7cmV0dXJuW3BhcnNlSW50KGVbMF0sMTApKihsLnRlc3QoZVswXSk/dC8xMDA6MSkscGFyc2VJbnQoZVsxXSwxMCkqKGwudGVzdChlWzFdKT9uLzEwMDoxKV19ZnVuY3Rpb24gcCh0LG4pe3JldHVybiBwYXJzZUludChlLmNzcyh0LG4pLDEwKXx8MH1lLnVpPWUudWl8fHt9O3ZhciBuLHI9TWF0aC5tYXgsaT1NYXRoLmFicyxzPU1hdGgucm91bmQsbz0vbGVmdHxjZW50ZXJ8cmlnaHQvLHU9L3RvcHxjZW50ZXJ8Ym90dG9tLyxhPS9bXCtcLV1cZCslPy8sZj0vXlx3Ky8sbD0vJSQvLGM9ZS5mbi5wb3NpdGlvbjtlLnBvc2l0aW9uPXtzY3JvbGxiYXJXaWR0aDpmdW5jdGlvbigpe2lmKG4hPT10KXJldHVybiBuO3ZhciByLGkscz1lKCI8ZGl2IHN0eWxlPSdkaXNwbGF5OmJsb2NrO3dpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6aGlkZGVuOyc+PGRpdiBzdHlsZT0naGVpZ2h0OjEwMHB4O3dpZHRoOmF1dG87Jz48L2Rpdj48L2Rpdj4iKSxvPXMuY2hpbGRyZW4oKVswXTtyZXR1cm4gZSgiYm9keSIpLmFwcGVuZChzKSxyPW8ub2Zmc2V0V2lkdGgscy5jc3MoIm92ZXJmbG93Iiwic2Nyb2xsIiksaT1vLm9mZnNldFdpZHRoLHI9PT1pJiYoaT1zWzBdLmNsaWVudFdpZHRoKSxzLnJlbW92ZSgpLG49ci1pfSxnZXRTY3JvbGxJbmZvOmZ1bmN0aW9uKHQpe3ZhciBuPXQuaXNXaW5kb3c/IiI6dC5lbGVtZW50LmNzcygib3ZlcmZsb3cteCIpLHI9dC5pc1dpbmRvdz8iIjp0LmVsZW1lbnQuY3NzKCJvdmVyZmxvdy15IiksaT1uPT09InNjcm9sbCJ8fG49PT0iYXV0byImJnQud2lkdGg8dC5lbGVtZW50WzBdLnNjcm9sbFdpZHRoLHM9cj09PSJzY3JvbGwifHxyPT09ImF1dG8iJiZ0LmhlaWdodDx0LmVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0O3JldHVybnt3aWR0aDppP2UucG9zaXRpb24uc2Nyb2xsYmFyV2lkdGgoKTowLGhlaWdodDpzP2UucG9zaXRpb24uc2Nyb2xsYmFyV2lkdGgoKTowfX0sZ2V0V2l0aGluSW5mbzpmdW5jdGlvbih0KXt2YXIgbj1lKHR8fHdpbmRvdykscj1lLmlzV2luZG93KG5bMF0pO3JldHVybntlbGVtZW50Om4saXNXaW5kb3c6cixvZmZzZXQ6bi5vZmZzZXQoKXx8e2xlZnQ6MCx0b3A6MH0sc2Nyb2xsTGVmdDpuLnNjcm9sbExlZnQoKSxzY3JvbGxUb3A6bi5zY3JvbGxUb3AoKSx3aWR0aDpyP24ud2lkdGgoKTpuLm91dGVyV2lkdGgoKSxoZWlnaHQ6cj9uLmhlaWdodCgpOm4ub3V0ZXJIZWlnaHQoKX19fSxlLmZuLnBvc2l0aW9uPWZ1bmN0aW9uKHQpe2lmKCF0fHwhdC5vZilyZXR1cm4gYy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dD1lLmV4dGVuZCh7fSx0KTt2YXIgbixsLGQsdixtLGc9ZSh0Lm9mKSx5PWUucG9zaXRpb24uZ2V0V2l0aGluSW5mbyh0LndpdGhpbiksYj1lLnBvc2l0aW9uLmdldFNjcm9sbEluZm8oeSksdz1nWzBdLEU9KHQuY29sbGlzaW9ufHwiZmxpcCIpLnNwbGl0KCIgIiksUz17fTtyZXR1cm4gdy5ub2RlVHlwZT09PTk/KGw9Zy53aWR0aCgpLGQ9Zy5oZWlnaHQoKSx2PXt0b3A6MCxsZWZ0OjB9KTplLmlzV2luZG93KHcpPyhsPWcud2lkdGgoKSxkPWcuaGVpZ2h0KCksdj17dG9wOmcuc2Nyb2xsVG9wKCksbGVmdDpnLnNjcm9sbExlZnQoKX0pOncucHJldmVudERlZmF1bHQ/KHQuYXQ9ImxlZnQgdG9wIixsPWQ9MCx2PXt0b3A6dy5wYWdlWSxsZWZ0OncucGFnZVh9KToobD1nLm91dGVyV2lkdGgoKSxkPWcub3V0ZXJIZWlnaHQoKSx2PWcub2Zmc2V0KCkpLG09ZS5leHRlbmQoe30sdiksZS5lYWNoKFsibXkiLCJhdCJdLGZ1bmN0aW9uKCl7dmFyIGU9KHRbdGhpc118fCIiKS5zcGxpdCgiICIpLG4scjtlLmxlbmd0aD09PTEmJihlPW8udGVzdChlWzBdKT9lLmNvbmNhdChbImNlbnRlciJdKTp1LnRlc3QoZVswXSk/WyJjZW50ZXIiXS5jb25jYXQoZSk6WyJjZW50ZXIiLCJjZW50ZXIiXSksZVswXT1vLnRlc3QoZVswXSk/ZVswXToiY2VudGVyIixlWzFdPXUudGVzdChlWzFdKT9lWzFdOiJjZW50ZXIiLG49YS5leGVjKGVbMF0pLHI9YS5leGVjKGVbMV0pLFNbdGhpc109W24/blswXTowLHI/clswXTowXSx0W3RoaXNdPVtmLmV4ZWMoZVswXSlbMF0sZi5leGVjKGVbMV0pWzBdXX0pLEUubGVuZ3RoPT09MSYmKEVbMV09RVswXSksdC5hdFswXT09PSJyaWdodCI/bS5sZWZ0Kz1sOnQuYXRbMF09PT0iY2VudGVyIiYmKG0ubGVmdCs9bC8yKSx0LmF0WzFdPT09ImJvdHRvbSI/bS50b3ArPWQ6dC5hdFsxXT09PSJjZW50ZXIiJiYobS50b3ArPWQvMiksbj1oKFMuYXQsbCxkKSxtLmxlZnQrPW5bMF0sbS50b3ArPW5bMV0sdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG8sdSxhPWUodGhpcyksZj1hLm91dGVyV2lkdGgoKSxjPWEub3V0ZXJIZWlnaHQoKSx3PXAodGhpcywibWFyZ2luTGVmdCIpLHg9cCh0aGlzLCJtYXJnaW5Ub3AiKSxUPWYrdytwKHRoaXMsIm1hcmdpblJpZ2h0IikrYi53aWR0aCxOPWMreCtwKHRoaXMsIm1hcmdpbkJvdHRvbSIpK2IuaGVpZ2h0LEM9ZS5leHRlbmQoe30sbSksaz1oKFMubXksYS5vdXRlcldpZHRoKCksYS5vdXRlckhlaWdodCgpKTt0Lm15WzBdPT09InJpZ2h0Ij9DLmxlZnQtPWY6dC5teVswXT09PSJjZW50ZXIiJiYoQy5sZWZ0LT1mLzIpLHQubXlbMV09PT0iYm90dG9tIj9DLnRvcC09Yzp0Lm15WzFdPT09ImNlbnRlciImJihDLnRvcC09Yy8yKSxDLmxlZnQrPWtbMF0sQy50b3ArPWtbMV0sZS5zdXBwb3J0Lm9mZnNldEZyYWN0aW9uc3x8KEMubGVmdD1zKEMubGVmdCksQy50b3A9cyhDLnRvcCkpLG89e21hcmdpbkxlZnQ6dyxtYXJnaW5Ub3A6eH0sZS5lYWNoKFsibGVmdCIsInRvcCJdLGZ1bmN0aW9uKHIsaSl7ZS51aS5wb3NpdGlvbltFW3JdXSYmZS51aS5wb3NpdGlvbltFW3JdXVtpXShDLHt0YXJnZXRXaWR0aDpsLHRhcmdldEhlaWdodDpkLGVsZW1XaWR0aDpmLGVsZW1IZWlnaHQ6Yyxjb2xsaXNpb25Qb3NpdGlvbjpvLGNvbGxpc2lvbldpZHRoOlQsY29sbGlzaW9uSGVpZ2h0Ok4sb2Zmc2V0OltuWzBdK2tbMF0sblsxXStrWzFdXSxteTp0Lm15LGF0OnQuYXQsd2l0aGluOnksZWxlbTphfSl9KSxlLmZuLmJnaWZyYW1lJiZhLmJnaWZyYW1lKCksdC51c2luZyYmKHU9ZnVuY3Rpb24oZSl7dmFyIG49di5sZWZ0LUMubGVmdCxzPW4rbC1mLG89di50b3AtQy50b3AsdT1vK2QtYyxoPXt0YXJnZXQ6e2VsZW1lbnQ6ZyxsZWZ0OnYubGVmdCx0b3A6di50b3Asd2lkdGg6bCxoZWlnaHQ6ZH0sZWxlbWVudDp7ZWxlbWVudDphLGxlZnQ6Qy5sZWZ0LHRvcDpDLnRvcCx3aWR0aDpmLGhlaWdodDpjfSxob3Jpem9udGFsOnM8MD8ibGVmdCI6bj4wPyJyaWdodCI6ImNlbnRlciIsdmVydGljYWw6dTwwPyJ0b3AiOm8+MD8iYm90dG9tIjoibWlkZGxlIn07bDxmJiZpKG4rcyk8bCYmKGguaG9yaXpvbnRhbD0iY2VudGVyIiksZDxjJiZpKG8rdSk8ZCYmKGgudmVydGljYWw9Im1pZGRsZSIpLHIoaShuKSxpKHMpKT5yKGkobyksaSh1KSk/aC5pbXBvcnRhbnQ9Imhvcml6b250YWwiOmguaW1wb3J0YW50PSJ2ZXJ0aWNhbCIsdC51c2luZy5jYWxsKHRoaXMsZSxoKX0pLGEub2Zmc2V0KGUuZXh0ZW5kKEMse3VzaW5nOnV9KSl9KX0sZS51aS5wb3NpdGlvbj17Zml0OntsZWZ0OmZ1bmN0aW9uKGUsdCl7dmFyIG49dC53aXRoaW4saT1uLmlzV2luZG93P24uc2Nyb2xsTGVmdDpuLm9mZnNldC5sZWZ0LHM9bi53aWR0aCxvPWUubGVmdC10LmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpbkxlZnQsdT1pLW8sYT1vK3QuY29sbGlzaW9uV2lkdGgtcy1pLGY7dC5jb2xsaXNpb25XaWR0aD5zP3U+MCYmYTw9MD8oZj1lLmxlZnQrdSt0LmNvbGxpc2lvbldpZHRoLXMtaSxlLmxlZnQrPXUtZik6YT4wJiZ1PD0wP2UubGVmdD1pOnU+YT9lLmxlZnQ9aStzLXQuY29sbGlzaW9uV2lkdGg6ZS5sZWZ0PWk6dT4wP2UubGVmdCs9dTphPjA/ZS5sZWZ0LT1hOmUubGVmdD1yKGUubGVmdC1vLGUubGVmdCl9LHRvcDpmdW5jdGlvbihlLHQpe3ZhciBuPXQud2l0aGluLGk9bi5pc1dpbmRvdz9uLnNjcm9sbFRvcDpuLm9mZnNldC50b3Ascz10LndpdGhpbi5oZWlnaHQsbz1lLnRvcC10LmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpblRvcCx1PWktbyxhPW8rdC5jb2xsaXNpb25IZWlnaHQtcy1pLGY7dC5jb2xsaXNpb25IZWlnaHQ+cz91PjAmJmE8PTA/KGY9ZS50b3ArdSt0LmNvbGxpc2lvbkhlaWdodC1zLWksZS50b3ArPXUtZik6YT4wJiZ1PD0wP2UudG9wPWk6dT5hP2UudG9wPWkrcy10LmNvbGxpc2lvbkhlaWdodDplLnRvcD1pOnU+MD9lLnRvcCs9dTphPjA/ZS50b3AtPWE6ZS50b3A9cihlLnRvcC1vLGUudG9wKX19LGZsaXA6e2xlZnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LndpdGhpbixyPW4ub2Zmc2V0LmxlZnQrbi5zY3JvbGxMZWZ0LHM9bi53aWR0aCxvPW4uaXNXaW5kb3c/bi5zY3JvbGxMZWZ0Om4ub2Zmc2V0LmxlZnQsdT1lLmxlZnQtdC5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5MZWZ0LGE9dS1vLGY9dSt0LmNvbGxpc2lvbldpZHRoLXMtbyxsPXQubXlbMF09PT0ibGVmdCI/LXQuZWxlbVdpZHRoOnQubXlbMF09PT0icmlnaHQiP3QuZWxlbVdpZHRoOjAsYz10LmF0WzBdPT09ImxlZnQiP3QudGFyZ2V0V2lkdGg6dC5hdFswXT09PSJyaWdodCI/LXQudGFyZ2V0V2lkdGg6MCxoPS0yKnQub2Zmc2V0WzBdLHAsZDtpZihhPDApe3A9ZS5sZWZ0K2wrYytoK3QuY29sbGlzaW9uV2lkdGgtcy1yO2lmKHA8MHx8cDxpKGEpKWUubGVmdCs9bCtjK2h9ZWxzZSBpZihmPjApe2Q9ZS5sZWZ0LXQuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luTGVmdCtsK2MraC1vO2lmKGQ+MHx8aShkKTxmKWUubGVmdCs9bCtjK2h9fSx0b3A6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LndpdGhpbixyPW4ub2Zmc2V0LnRvcCtuLnNjcm9sbFRvcCxzPW4uaGVpZ2h0LG89bi5pc1dpbmRvdz9uLnNjcm9sbFRvcDpuLm9mZnNldC50b3AsdT1lLnRvcC10LmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpblRvcCxhPXUtbyxmPXUrdC5jb2xsaXNpb25IZWlnaHQtcy1vLGw9dC5teVsxXT09PSJ0b3AiLGM9bD8tdC5lbGVtSGVpZ2h0OnQubXlbMV09PT0iYm90dG9tIj90LmVsZW1IZWlnaHQ6MCxoPXQuYXRbMV09PT0idG9wIj90LnRhcmdldEhlaWdodDp0LmF0WzFdPT09ImJvdHRvbSI/LXQudGFyZ2V0SGVpZ2h0OjAscD0tMip0Lm9mZnNldFsxXSxkLHY7YTwwPyh2PWUudG9wK2MraCtwK3QuY29sbGlzaW9uSGVpZ2h0LXMtcixlLnRvcCtjK2grcD5hJiYodjwwfHx2PGkoYSkpJiYoZS50b3ArPWMraCtwKSk6Zj4wJiYoZD1lLnRvcC10LmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpblRvcCtjK2grcC1vLGUudG9wK2MraCtwPmYmJihkPjB8fGkoZCk8ZikmJihlLnRvcCs9YytoK3ApKX19LGZsaXBmaXQ6e2xlZnQ6ZnVuY3Rpb24oKXtlLnVpLnBvc2l0aW9uLmZsaXAubGVmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS51aS5wb3NpdGlvbi5maXQubGVmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHRvcDpmdW5jdGlvbigpe2UudWkucG9zaXRpb24uZmxpcC50b3AuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudWkucG9zaXRpb24uZml0LnRvcC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24oKXt2YXIgdCxuLHIsaSxzLG89ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSx1PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChvPyJkaXYiOiJib2R5Iikscj17dmlzaWJpbGl0eToiaGlkZGVuIix3aWR0aDowLGhlaWdodDowLGJvcmRlcjowLG1hcmdpbjowLGJhY2tncm91bmQ6Im5vbmUifSxvJiZlLmV4dGVuZChyLHtwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6Ii0xMDAwcHgiLHRvcDoiLTEwMDBweCJ9KTtmb3IocyBpbiByKXQuc3R5bGVbc109cltzXTt0LmFwcGVuZENoaWxkKHUpLG49b3x8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LG4uaW5zZXJ0QmVmb3JlKHQsbi5maXJzdENoaWxkKSx1LnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMTAuNzQzMjIyMnB4OyIsaT1lKHUpLm9mZnNldCgpLmxlZnQsZS5zdXBwb3J0Lm9mZnNldEZyYWN0aW9ucz1pPjEwJiZpPDExLHQuaW5uZXJIVE1MPSIiLG4ucmVtb3ZlQ2hpbGQodCl9KCksZS51aUJhY2tDb21wYXQhPT0hMSYmZnVuY3Rpb24oZSl7dmFyIG49ZS5mbi5wb3NpdGlvbjtlLmZuLnBvc2l0aW9uPWZ1bmN0aW9uKHIpe2lmKCFyfHwhci5vZmZzZXQpcmV0dXJuIG4uY2FsbCh0aGlzLHIpO3ZhciBpPXIub2Zmc2V0LnNwbGl0KCIgIikscz1yLmF0LnNwbGl0KCIgIik7cmV0dXJuIGkubGVuZ3RoPT09MSYmKGlbMV09aVswXSksL15cZC8udGVzdChpWzBdKSYmKGlbMF09IisiK2lbMF0pLC9eXGQvLnRlc3QoaVsxXSkmJihpWzFdPSIrIitpWzFdKSxzLmxlbmd0aD09PTEmJigvbGVmdHxjZW50ZXJ8cmlnaHQvLnRlc3Qoc1swXSk/c1sxXT0iY2VudGVyIjooc1sxXT1zWzBdLHNbMF09ImNlbnRlciIpKSxuLmNhbGwodGhpcyxlLmV4dGVuZChyLHthdDpzWzBdK2lbMF0rIiAiK3NbMV0raVsxXSxvZmZzZXQ6dH0pKX19KGpRdWVyeSl9KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe3ZhciBuPTAscj17fSxpPXt9O3IuaGVpZ2h0PXIucGFkZGluZ1RvcD1yLnBhZGRpbmdCb3R0b209ci5ib3JkZXJUb3BXaWR0aD1yLmJvcmRlckJvdHRvbVdpZHRoPSJoaWRlIixpLmhlaWdodD1pLnBhZGRpbmdUb3A9aS5wYWRkaW5nQm90dG9tPWkuYm9yZGVyVG9wV2lkdGg9aS5ib3JkZXJCb3R0b21XaWR0aD0ic2hvdyIsZS53aWRnZXQoInVpLmFjY29yZGlvbiIse3ZlcnNpb246IjEuOS4yIixvcHRpb25zOnthY3RpdmU6MCxhbmltYXRlOnt9LGNvbGxhcHNpYmxlOiExLGV2ZW50OiJjbGljayIsaGVhZGVyOiI+IGxpID4gOmZpcnN0LWNoaWxkLD4gOm5vdChsaSk6ZXZlbiIsaGVpZ2h0U3R5bGU6ImF1dG8iLGljb25zOnthY3RpdmVIZWFkZXI6InVpLWljb24tdHJpYW5nbGUtMS1zIixoZWFkZXI6InVpLWljb24tdHJpYW5nbGUtMS1lIn0sYWN0aXZhdGU6bnVsbCxiZWZvcmVBY3RpdmF0ZTpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hY2NvcmRpb25JZD0idWktYWNjb3JkaW9uLSIrKHRoaXMuZWxlbWVudC5hdHRyKCJpZCIpfHwrK24pLHI9dGhpcy5vcHRpb25zO3RoaXMucHJldlNob3c9dGhpcy5wcmV2SGlkZT1lKCksdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1hY2NvcmRpb24gdWktd2lkZ2V0IHVpLWhlbHBlci1yZXNldCIpLHRoaXMuaGVhZGVycz10aGlzLmVsZW1lbnQuZmluZChyLmhlYWRlcikuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1oZWFkZXIgdWktaGVscGVyLXJlc2V0IHVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIpLHRoaXMuX2hvdmVyYWJsZSh0aGlzLmhlYWRlcnMpLHRoaXMuX2ZvY3VzYWJsZSh0aGlzLmhlYWRlcnMpLHRoaXMuaGVhZGVycy5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50IHVpLWhlbHBlci1yZXNldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIikuaGlkZSgpLCFyLmNvbGxhcHNpYmxlJiYoci5hY3RpdmU9PT0hMXx8ci5hY3RpdmU9PW51bGwpJiYoci5hY3RpdmU9MCksci5hY3RpdmU8MCYmKHIuYWN0aXZlKz10aGlzLmhlYWRlcnMubGVuZ3RoKSx0aGlzLmFjdGl2ZT10aGlzLl9maW5kQWN0aXZlKHIuYWN0aXZlKS5hZGRDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlci1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIikudG9nZ2xlQ2xhc3MoInVpLWNvcm5lci1hbGwgdWktY29ybmVyLXRvcCIpLHRoaXMuYWN0aXZlLm5leHQoKS5hZGRDbGFzcygidWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIikuc2hvdygpLHRoaXMuX2NyZWF0ZUljb25zKCksdGhpcy5yZWZyZXNoKCksdGhpcy5lbGVtZW50LmF0dHIoInJvbGUiLCJ0YWJsaXN0IiksdGhpcy5oZWFkZXJzLmF0dHIoInJvbGUiLCJ0YWIiKS5lYWNoKGZ1bmN0aW9uKG4pe3ZhciByPWUodGhpcyksaT1yLmF0dHIoImlkIikscz1yLm5leHQoKSxvPXMuYXR0cigiaWQiKTtpfHwoaT10KyItaGVhZGVyLSIrbixyLmF0dHIoImlkIixpKSksb3x8KG89dCsiLXBhbmVsLSIrbixzLmF0dHIoImlkIixvKSksci5hdHRyKCJhcmlhLWNvbnRyb2xzIixvKSxzLmF0dHIoImFyaWEtbGFiZWxsZWRieSIsaSl9KS5uZXh0KCkuYXR0cigicm9sZSIsInRhYnBhbmVsIiksdGhpcy5oZWFkZXJzLm5vdCh0aGlzLmFjdGl2ZSkuYXR0cih7ImFyaWEtc2VsZWN0ZWQiOiJmYWxzZSIsdGFiSW5kZXg6LTF9KS5uZXh0KCkuYXR0cih7ImFyaWEtZXhwYW5kZWQiOiJmYWxzZSIsImFyaWEtaGlkZGVuIjoidHJ1ZSJ9KS5oaWRlKCksdGhpcy5hY3RpdmUubGVuZ3RoP3RoaXMuYWN0aXZlLmF0dHIoeyJhcmlhLXNlbGVjdGVkIjoidHJ1ZSIsdGFiSW5kZXg6MH0pLm5leHQoKS5hdHRyKHsiYXJpYS1leHBhbmRlZCI6InRydWUiLCJhcmlhLWhpZGRlbiI6ImZhbHNlIn0pOnRoaXMuaGVhZGVycy5lcSgwKS5hdHRyKCJ0YWJJbmRleCIsMCksdGhpcy5fb24odGhpcy5oZWFkZXJzLHtrZXlkb3duOiJfa2V5ZG93biJ9KSx0aGlzLl9vbih0aGlzLmhlYWRlcnMubmV4dCgpLHtrZXlkb3duOiJfcGFuZWxLZXlEb3duIn0pLHRoaXMuX3NldHVwRXZlbnRzKHIuZXZlbnQpfSxfZ2V0Q3JlYXRlRXZlbnREYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2hlYWRlcjp0aGlzLmFjdGl2ZSxjb250ZW50OnRoaXMuYWN0aXZlLmxlbmd0aD90aGlzLmFjdGl2ZS5uZXh0KCk6ZSgpfX0sX2NyZWF0ZUljb25zOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLmljb25zO3QmJihlKCI8c3Bhbj4iKS5hZGRDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlci1pY29uIHVpLWljb24gIit0LmhlYWRlcikucHJlcGVuZFRvKHRoaXMuaGVhZGVycyksdGhpcy5hY3RpdmUuY2hpbGRyZW4oIi51aS1hY2NvcmRpb24taGVhZGVyLWljb24iKS5yZW1vdmVDbGFzcyh0LmhlYWRlcikuYWRkQ2xhc3ModC5hY3RpdmVIZWFkZXIpLHRoaXMuaGVhZGVycy5hZGRDbGFzcygidWktYWNjb3JkaW9uLWljb25zIikpfSxfZGVzdHJveUljb25zOmZ1bmN0aW9uKCl7dGhpcy5oZWFkZXJzLnJlbW92ZUNsYXNzKCJ1aS1hY2NvcmRpb24taWNvbnMiKS5jaGlsZHJlbigiLnVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiIpLnJlbW92ZSgpfSxfZGVzdHJveTpmdW5jdGlvbigpe3ZhciBlO3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktYWNjb3JkaW9uIHVpLXdpZGdldCB1aS1oZWxwZXItcmVzZXQiKS5yZW1vdmVBdHRyKCJyb2xlIiksdGhpcy5oZWFkZXJzLnJlbW92ZUNsYXNzKCJ1aS1hY2NvcmRpb24taGVhZGVyIHVpLWFjY29yZGlvbi1oZWFkZXItYWN0aXZlIHVpLWhlbHBlci1yZXNldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwgdWktc3RhdGUtYWN0aXZlIHVpLXN0YXRlLWRpc2FibGVkIHVpLWNvcm5lci10b3AiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigiYXJpYS1zZWxlY3RlZCIpLnJlbW92ZUF0dHIoImFyaWEtY29udHJvbHMiKS5yZW1vdmVBdHRyKCJ0YWJJbmRleCIpLmVhY2goZnVuY3Rpb24oKXsvXnVpLWFjY29yZGlvbi8udGVzdCh0aGlzLmlkKSYmdGhpcy5yZW1vdmVBdHRyaWJ1dGUoImlkIil9KSx0aGlzLl9kZXN0cm95SWNvbnMoKSxlPXRoaXMuaGVhZGVycy5uZXh0KCkuY3NzKCJkaXNwbGF5IiwiIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtZXhwYW5kZWQiKS5yZW1vdmVBdHRyKCJhcmlhLWhpZGRlbiIpLnJlbW92ZUF0dHIoImFyaWEtbGFiZWxsZWRieSIpLnJlbW92ZUNsYXNzKCJ1aS1oZWxwZXItcmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSB1aS1hY2NvcmRpb24tY29udGVudCB1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUgdWktc3RhdGUtZGlzYWJsZWQiKS5lYWNoKGZ1bmN0aW9uKCl7L151aS1hY2NvcmRpb24vLnRlc3QodGhpcy5pZCkmJnRoaXMucmVtb3ZlQXR0cmlidXRlKCJpZCIpfSksdGhpcy5vcHRpb25zLmhlaWdodFN0eWxlIT09ImNvbnRlbnQiJiZlLmNzcygiaGVpZ2h0IiwiIil9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtpZihlPT09ImFjdGl2ZSIpe3RoaXMuX2FjdGl2YXRlKHQpO3JldHVybn1lPT09ImV2ZW50IiYmKHRoaXMub3B0aW9ucy5ldmVudCYmdGhpcy5fb2ZmKHRoaXMuaGVhZGVycyx0aGlzLm9wdGlvbnMuZXZlbnQpLHRoaXMuX3NldHVwRXZlbnRzKHQpKSx0aGlzLl9zdXBlcihlLHQpLGU9PT0iY29sbGFwc2libGUiJiYhdCYmdGhpcy5vcHRpb25zLmFjdGl2ZT09PSExJiZ0aGlzLl9hY3RpdmF0ZSgwKSxlPT09Imljb25zIiYmKHRoaXMuX2Rlc3Ryb3lJY29ucygpLHQmJnRoaXMuX2NyZWF0ZUljb25zKCkpLGU9PT0iZGlzYWJsZWQiJiZ0aGlzLmhlYWRlcnMuYWRkKHRoaXMuaGVhZGVycy5uZXh0KCkpLnRvZ2dsZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIsISF0KX0sX2tleWRvd246ZnVuY3Rpb24odCl7aWYodC5hbHRLZXl8fHQuY3RybEtleSlyZXR1cm47dmFyIG49ZS51aS5rZXlDb2RlLHI9dGhpcy5oZWFkZXJzLmxlbmd0aCxpPXRoaXMuaGVhZGVycy5pbmRleCh0LnRhcmdldCkscz0hMTtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIG4uUklHSFQ6Y2FzZSBuLkRPV046cz10aGlzLmhlYWRlcnNbKGkrMSklcl07YnJlYWs7Y2FzZSBuLkxFRlQ6Y2FzZSBuLlVQOnM9dGhpcy5oZWFkZXJzWyhpLTErciklcl07YnJlYWs7Y2FzZSBuLlNQQUNFOmNhc2Ugbi5FTlRFUjp0aGlzLl9ldmVudEhhbmRsZXIodCk7YnJlYWs7Y2FzZSBuLkhPTUU6cz10aGlzLmhlYWRlcnNbMF07YnJlYWs7Y2FzZSBuLkVORDpzPXRoaXMuaGVhZGVyc1tyLTFdfXMmJihlKHQudGFyZ2V0KS5hdHRyKCJ0YWJJbmRleCIsLTEpLGUocykuYXR0cigidGFiSW5kZXgiLDApLHMuZm9jdXMoKSx0LnByZXZlbnREZWZhdWx0KCkpfSxfcGFuZWxLZXlEb3duOmZ1bmN0aW9uKHQpe3Qua2V5Q29kZT09PWUudWkua2V5Q29kZS5VUCYmdC5jdHJsS2V5JiZlKHQuY3VycmVudFRhcmdldCkucHJldigpLmZvY3VzKCl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdCxuLHI9dGhpcy5vcHRpb25zLmhlaWdodFN0eWxlLGk9dGhpcy5lbGVtZW50LnBhcmVudCgpO3I9PT0iZmlsbCI/KGUuc3VwcG9ydC5taW5IZWlnaHR8fChuPWkuY3NzKCJvdmVyZmxvdyIpLGkuY3NzKCJvdmVyZmxvdyIsImhpZGRlbiIpKSx0PWkuaGVpZ2h0KCksdGhpcy5lbGVtZW50LnNpYmxpbmdzKCI6dmlzaWJsZSIpLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1lKHRoaXMpLHI9bi5jc3MoInBvc2l0aW9uIik7aWYocj09PSJhYnNvbHV0ZSJ8fHI9PT0iZml4ZWQiKXJldHVybjt0LT1uLm91dGVySGVpZ2h0KCEwKX0pLG4mJmkuY3NzKCJvdmVyZmxvdyIsbiksdGhpcy5oZWFkZXJzLmVhY2goZnVuY3Rpb24oKXt0LT1lKHRoaXMpLm91dGVySGVpZ2h0KCEwKX0pLHRoaXMuaGVhZGVycy5uZXh0KCkuZWFjaChmdW5jdGlvbigpe2UodGhpcykuaGVpZ2h0KE1hdGgubWF4KDAsdC1lKHRoaXMpLmlubmVySGVpZ2h0KCkrZSh0aGlzKS5oZWlnaHQoKSkpfSkuY3NzKCJvdmVyZmxvdyIsImF1dG8iKSk6cj09PSJhdXRvIiYmKHQ9MCx0aGlzLmhlYWRlcnMubmV4dCgpLmVhY2goZnVuY3Rpb24oKXt0PU1hdGgubWF4KHQsZSh0aGlzKS5jc3MoImhlaWdodCIsIiIpLmhlaWdodCgpKX0pLmhlaWdodCh0KSl9LF9hY3RpdmF0ZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9maW5kQWN0aXZlKHQpWzBdO2lmKG49PT10aGlzLmFjdGl2ZVswXSlyZXR1cm47bj1ufHx0aGlzLmFjdGl2ZVswXSx0aGlzLl9ldmVudEhhbmRsZXIoe3RhcmdldDpuLGN1cnJlbnRUYXJnZXQ6bixwcmV2ZW50RGVmYXVsdDplLm5vb3B9KX0sX2ZpbmRBY3RpdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIj90aGlzLmhlYWRlcnMuZXEodCk6ZSgpfSxfc2V0dXBFdmVudHM6ZnVuY3Rpb24odCl7dmFyIG49e307aWYoIXQpcmV0dXJuO2UuZWFjaCh0LnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtuW3RdPSJfZXZlbnRIYW5kbGVyIn0pLHRoaXMuX29uKHRoaXMuaGVhZGVycyxuKX0sX2V2ZW50SGFuZGxlcjpmdW5jdGlvbih0KXt2YXIgbj10aGlzLm9wdGlvbnMscj10aGlzLmFjdGl2ZSxpPWUodC5jdXJyZW50VGFyZ2V0KSxzPWlbMF09PT1yWzBdLG89cyYmbi5jb2xsYXBzaWJsZSx1PW8/ZSgpOmkubmV4dCgpLGE9ci5uZXh0KCksZj17b2xkSGVhZGVyOnIsb2xkUGFuZWw6YSxuZXdIZWFkZXI6bz9lKCk6aSxuZXdQYW5lbDp1fTt0LnByZXZlbnREZWZhdWx0KCk7aWYocyYmIW4uY29sbGFwc2libGV8fHRoaXMuX3RyaWdnZXIoImJlZm9yZUFjdGl2YXRlIix0LGYpPT09ITEpcmV0dXJuO24uYWN0aXZlPW8/ITE6dGhpcy5oZWFkZXJzLmluZGV4KGkpLHRoaXMuYWN0aXZlPXM/ZSgpOmksdGhpcy5fdG9nZ2xlKGYpLHIucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbi1oZWFkZXItYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIpLG4uaWNvbnMmJnIuY2hpbGRyZW4oIi51aS1hY2NvcmRpb24taGVhZGVyLWljb24iKS5yZW1vdmVDbGFzcyhuLmljb25zLmFjdGl2ZUhlYWRlcikuYWRkQ2xhc3Mobi5pY29ucy5oZWFkZXIpLHN8fChpLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItYWxsIikuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1oZWFkZXItYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSB1aS1jb3JuZXItdG9wIiksbi5pY29ucyYmaS5jaGlsZHJlbigiLnVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiIpLnJlbW92ZUNsYXNzKG4uaWNvbnMuaGVhZGVyKS5hZGRDbGFzcyhuLmljb25zLmFjdGl2ZUhlYWRlciksaS5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIpKX0sX3RvZ2dsZTpmdW5jdGlvbih0KXt2YXIgbj10Lm5ld1BhbmVsLHI9dGhpcy5wcmV2U2hvdy5sZW5ndGg/dGhpcy5wcmV2U2hvdzp0Lm9sZFBhbmVsO3RoaXMucHJldlNob3cuYWRkKHRoaXMucHJldkhpZGUpLnN0b3AoITAsITApLHRoaXMucHJldlNob3c9bix0aGlzLnByZXZIaWRlPXIsdGhpcy5vcHRpb25zLmFuaW1hdGU/dGhpcy5fYW5pbWF0ZShuLHIsdCk6KHIuaGlkZSgpLG4uc2hvdygpLHRoaXMuX3RvZ2dsZUNvbXBsZXRlKHQpKSxyLmF0dHIoeyJhcmlhLWV4cGFuZGVkIjoiZmFsc2UiLCJhcmlhLWhpZGRlbiI6InRydWUifSksci5wcmV2KCkuYXR0cigiYXJpYS1zZWxlY3RlZCIsImZhbHNlIiksbi5sZW5ndGgmJnIubGVuZ3RoP3IucHJldigpLmF0dHIoInRhYkluZGV4IiwtMSk6bi5sZW5ndGgmJnRoaXMuaGVhZGVycy5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzKS5hdHRyKCJ0YWJJbmRleCIpPT09MH0pLmF0dHIoInRhYkluZGV4IiwtMSksbi5hdHRyKHsiYXJpYS1leHBhbmRlZCI6InRydWUiLCJhcmlhLWhpZGRlbiI6ImZhbHNlIn0pLnByZXYoKS5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6InRydWUiLHRhYkluZGV4OjB9KX0sX2FuaW1hdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBzLG8sdSxhPXRoaXMsZj0wLGw9ZS5sZW5ndGgmJighdC5sZW5ndGh8fGUuaW5kZXgoKTx0LmluZGV4KCkpLGM9dGhpcy5vcHRpb25zLmFuaW1hdGV8fHt9LGg9bCYmYy5kb3dufHxjLHA9ZnVuY3Rpb24oKXthLl90b2dnbGVDb21wbGV0ZShuKX07dHlwZW9mIGg9PSJudW1iZXIiJiYodT1oKSx0eXBlb2YgaD09InN0cmluZyImJihvPWgpLG89b3x8aC5lYXNpbmd8fGMuZWFzaW5nLHU9dXx8aC5kdXJhdGlvbnx8Yy5kdXJhdGlvbjtpZighdC5sZW5ndGgpcmV0dXJuIGUuYW5pbWF0ZShpLHUsbyxwKTtpZighZS5sZW5ndGgpcmV0dXJuIHQuYW5pbWF0ZShyLHUsbyxwKTtzPWUuc2hvdygpLm91dGVySGVpZ2h0KCksdC5hbmltYXRlKHIse2R1cmF0aW9uOnUsZWFzaW5nOm8sc3RlcDpmdW5jdGlvbihlLHQpe3Qubm93PU1hdGgucm91bmQoZSl9fSksZS5oaWRlKCkuYW5pbWF0ZShpLHtkdXJhdGlvbjp1LGVhc2luZzpvLGNvbXBsZXRlOnAsc3RlcDpmdW5jdGlvbihlLG4pe24ubm93PU1hdGgucm91bmQoZSksbi5wcm9wIT09ImhlaWdodCI/Zis9bi5ub3c6YS5vcHRpb25zLmhlaWdodFN0eWxlIT09ImNvbnRlbnQiJiYobi5ub3c9TWF0aC5yb3VuZChzLXQub3V0ZXJIZWlnaHQoKS1mKSxmPTApfX0pfSxfdG9nZ2xlQ29tcGxldGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vbGRQYW5lbDt0LnJlbW92ZUNsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKS5wcmV2KCkucmVtb3ZlQ2xhc3MoInVpLWNvcm5lci10b3AiKS5hZGRDbGFzcygidWktY29ybmVyLWFsbCIpLHQubGVuZ3RoJiYodC5wYXJlbnQoKVswXS5jbGFzc05hbWU9dC5wYXJlbnQoKVswXS5jbGFzc05hbWUpLHRoaXMuX3RyaWdnZXIoImFjdGl2YXRlIixudWxsLGUpfX0pLGUudWlCYWNrQ29tcGF0IT09ITEmJihmdW5jdGlvbihlLHQpe2UuZXh0ZW5kKHQub3B0aW9ucyx7bmF2aWdhdGlvbjohMSxuYXZpZ2F0aW9uRmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHJlZi50b0xvd2VyQ2FzZSgpPT09bG9jYXRpb24uaHJlZi50b0xvd2VyQ2FzZSgpfX0pO3ZhciBuPXQuX2NyZWF0ZTt0Ll9jcmVhdGU9ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMubmF2aWdhdGlvbil7dmFyIHQ9dGhpcyxyPXRoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5oZWFkZXIpLGk9ci5uZXh0KCkscz1yLmFkZChpKS5maW5kKCJhIikuZmlsdGVyKHRoaXMub3B0aW9ucy5uYXZpZ2F0aW9uRmlsdGVyKVswXTtzJiZyLmFkZChpKS5lYWNoKGZ1bmN0aW9uKG4pe2lmKGUuY29udGFpbnModGhpcyxzKSlyZXR1cm4gdC5vcHRpb25zLmFjdGl2ZT1NYXRoLmZsb29yKG4vMiksITF9KX1uLmNhbGwodGhpcyl9fShqUXVlcnksalF1ZXJ5LnVpLmFjY29yZGlvbi5wcm90b3R5cGUpLGZ1bmN0aW9uKGUsdCl7ZS5leHRlbmQodC5vcHRpb25zLHtoZWlnaHRTdHlsZTpudWxsLGF1dG9IZWlnaHQ6ITAsY2xlYXJTdHlsZTohMSxmaWxsU3BhY2U6ITF9KTt2YXIgbj10Ll9jcmVhdGUscj10Ll9zZXRPcHRpb247ZS5leHRlbmQodCx7X2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5oZWlnaHRTdHlsZT10aGlzLm9wdGlvbnMuaGVpZ2h0U3R5bGV8fHRoaXMuX21lcmdlSGVpZ2h0U3R5bGUoKSxuLmNhbGwodGhpcyl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSl7aWYoZT09PSJhdXRvSGVpZ2h0Inx8ZT09PSJjbGVhclN0eWxlInx8ZT09PSJmaWxsU3BhY2UiKXRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZT10aGlzLl9tZXJnZUhlaWdodFN0eWxlKCk7ci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9tZXJnZUhlaWdodFN0eWxlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zO2lmKGUuZmlsbFNwYWNlKXJldHVybiJmaWxsIjtpZihlLmNsZWFyU3R5bGUpcmV0dXJuImNvbnRlbnQiO2lmKGUuYXV0b0hlaWdodClyZXR1cm4iYXV0byJ9fSl9KGpRdWVyeSxqUXVlcnkudWkuYWNjb3JkaW9uLnByb3RvdHlwZSksZnVuY3Rpb24oZSx0KXtlLmV4dGVuZCh0Lm9wdGlvbnMuaWNvbnMse2FjdGl2ZUhlYWRlcjpudWxsLGhlYWRlclNlbGVjdGVkOiJ1aS1pY29uLXRyaWFuZ2xlLTEtcyJ9KTt2YXIgbj10Ll9jcmVhdGVJY29uczt0Ll9jcmVhdGVJY29ucz1mdW5jdGlvbigpe3RoaXMub3B0aW9ucy5pY29ucyYmKHRoaXMub3B0aW9ucy5pY29ucy5hY3RpdmVIZWFkZXI9dGhpcy5vcHRpb25zLmljb25zLmFjdGl2ZUhlYWRlcnx8dGhpcy5vcHRpb25zLmljb25zLmhlYWRlclNlbGVjdGVkKSxuLmNhbGwodGhpcyl9fShqUXVlcnksalF1ZXJ5LnVpLmFjY29yZGlvbi5wcm90b3R5cGUpLGZ1bmN0aW9uKGUsdCl7dC5hY3RpdmF0ZT10Ll9hY3RpdmF0ZTt2YXIgbj10Ll9maW5kQWN0aXZlO3QuX2ZpbmRBY3RpdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT0tMSYmKGU9ITEpLGUmJnR5cGVvZiBlIT0ibnVtYmVyIiYmKGU9dGhpcy5oZWFkZXJzLmluZGV4KHRoaXMuaGVhZGVycy5maWx0ZXIoZSkpLGU9PT0tMSYmKGU9ITEpKSxuLmNhbGwodGhpcyxlKX19KGpRdWVyeSxqUXVlcnkudWkuYWNjb3JkaW9uLnByb3RvdHlwZSksalF1ZXJ5LnVpLmFjY29yZGlvbi5wcm90b3R5cGUucmVzaXplPWpRdWVyeS51aS5hY2NvcmRpb24ucHJvdG90eXBlLnJlZnJlc2gsZnVuY3Rpb24oZSx0KXtlLmV4dGVuZCh0Lm9wdGlvbnMse2NoYW5nZTpudWxsLGNoYW5nZXN0YXJ0Om51bGx9KTt2YXIgbj10Ll90cmlnZ2VyO3QuX3RyaWdnZXI9ZnVuY3Rpb24oZSx0LHIpe3ZhciBpPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBpPyhlPT09ImJlZm9yZUFjdGl2YXRlIj9pPW4uY2FsbCh0aGlzLCJjaGFuZ2VzdGFydCIsdCx7b2xkSGVhZGVyOnIub2xkSGVhZGVyLG9sZENvbnRlbnQ6ci5vbGRQYW5lbCxuZXdIZWFkZXI6ci5uZXdIZWFkZXIsbmV3Q29udGVudDpyLm5ld1BhbmVsfSk6ZT09PSJhY3RpdmF0ZSImJihpPW4uY2FsbCh0aGlzLCJjaGFuZ2UiLHQse29sZEhlYWRlcjpyLm9sZEhlYWRlcixvbGRDb250ZW50OnIub2xkUGFuZWwsbmV3SGVhZGVyOnIubmV3SGVhZGVyLG5ld0NvbnRlbnQ6ci5uZXdQYW5lbH0pKSxpKTohMX19KGpRdWVyeSxqUXVlcnkudWkuYWNjb3JkaW9uLnByb3RvdHlwZSksZnVuY3Rpb24oZSx0KXtlLmV4dGVuZCh0Lm9wdGlvbnMse2FuaW1hdGU6bnVsbCxhbmltYXRlZDoic2xpZGUifSk7dmFyIG49dC5fY3JlYXRlO3QuX2NyZWF0ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucztlLmFuaW1hdGU9PT1udWxsJiYoZS5hbmltYXRlZD9lLmFuaW1hdGVkPT09InNsaWRlIj9lLmFuaW1hdGU9MzAwOmUuYW5pbWF0ZWQ9PT0iYm91bmNlc2xpZGUiP2UuYW5pbWF0ZT17ZHVyYXRpb246MjAwLGRvd246e2Vhc2luZzoiZWFzZU91dEJvdW5jZSIsZHVyYXRpb246MWUzfX06ZS5hbmltYXRlPWUuYW5pbWF0ZWQ6ZS5hbmltYXRlPSExKSxuLmNhbGwodGhpcyl9fShqUXVlcnksalF1ZXJ5LnVpLmFjY29yZGlvbi5wcm90b3R5cGUpKX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7dmFyIG49MDtlLndpZGdldCgidWkuYXV0b2NvbXBsZXRlIix7dmVyc2lvbjoiMS45LjIiLGRlZmF1bHRFbGVtZW50OiI8aW5wdXQ+IixvcHRpb25zOnthcHBlbmRUbzoiYm9keSIsYXV0b0ZvY3VzOiExLGRlbGF5OjMwMCxtaW5MZW5ndGg6MSxwb3NpdGlvbjp7bXk6ImxlZnQgdG9wIixhdDoibGVmdCBib3R0b20iLGNvbGxpc2lvbjoibm9uZSJ9LHNvdXJjZTpudWxsLGNoYW5nZTpudWxsLGNsb3NlOm51bGwsZm9jdXM6bnVsbCxvcGVuOm51bGwscmVzcG9uc2U6bnVsbCxzZWFyY2g6bnVsbCxzZWxlY3Q6bnVsbH0scGVuZGluZzowLF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdCxuLHI7dGhpcy5pc011bHRpTGluZT10aGlzLl9pc011bHRpTGluZSgpLHRoaXMudmFsdWVNZXRob2Q9dGhpcy5lbGVtZW50W3RoaXMuZWxlbWVudC5pcygiaW5wdXQsdGV4dGFyZWEiKT8idmFsIjoidGV4dCJdLHRoaXMuaXNOZXdNZW51PSEwLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktYXV0b2NvbXBsZXRlLWlucHV0IikuYXR0cigiYXV0b2NvbXBsZXRlIiwib2ZmIiksdGhpcy5fb24odGhpcy5lbGVtZW50LHtrZXlkb3duOmZ1bmN0aW9uKGkpe2lmKHRoaXMuZWxlbWVudC5wcm9wKCJyZWFkT25seSIpKXt0PSEwLHI9ITAsbj0hMDtyZXR1cm59dD0hMSxyPSExLG49ITE7dmFyIHM9ZS51aS5rZXlDb2RlO3N3aXRjaChpLmtleUNvZGUpe2Nhc2Ugcy5QQUdFX1VQOnQ9ITAsdGhpcy5fbW92ZSgicHJldmlvdXNQYWdlIixpKTticmVhaztjYXNlIHMuUEFHRV9ET1dOOnQ9ITAsdGhpcy5fbW92ZSgibmV4dFBhZ2UiLGkpO2JyZWFrO2Nhc2Ugcy5VUDp0PSEwLHRoaXMuX2tleUV2ZW50KCJwcmV2aW91cyIsaSk7YnJlYWs7Y2FzZSBzLkRPV046dD0hMCx0aGlzLl9rZXlFdmVudCgibmV4dCIsaSk7YnJlYWs7Y2FzZSBzLkVOVEVSOmNhc2Ugcy5OVU1QQURfRU5URVI6dGhpcy5tZW51LmFjdGl2ZSYmKHQ9ITAsaS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubWVudS5zZWxlY3QoaSkpO2JyZWFrO2Nhc2Ugcy5UQUI6dGhpcy5tZW51LmFjdGl2ZSYmdGhpcy5tZW51LnNlbGVjdChpKTticmVhaztjYXNlIHMuRVNDQVBFOnRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpJiYodGhpcy5fdmFsdWUodGhpcy50ZXJtKSx0aGlzLmNsb3NlKGkpLGkucHJldmVudERlZmF1bHQoKSk7YnJlYWs7ZGVmYXVsdDpuPSEwLHRoaXMuX3NlYXJjaFRpbWVvdXQoaSl9fSxrZXlwcmVzczpmdW5jdGlvbihyKXtpZih0KXt0PSExLHIucHJldmVudERlZmF1bHQoKTtyZXR1cm59aWYobilyZXR1cm47dmFyIGk9ZS51aS5rZXlDb2RlO3N3aXRjaChyLmtleUNvZGUpe2Nhc2UgaS5QQUdFX1VQOnRoaXMuX21vdmUoInByZXZpb3VzUGFnZSIscik7YnJlYWs7Y2FzZSBpLlBBR0VfRE9XTjp0aGlzLl9tb3ZlKCJuZXh0UGFnZSIscik7YnJlYWs7Y2FzZSBpLlVQOnRoaXMuX2tleUV2ZW50KCJwcmV2aW91cyIscik7YnJlYWs7Y2FzZSBpLkRPV046dGhpcy5fa2V5RXZlbnQoIm5leHQiLHIpfX0saW5wdXQ6ZnVuY3Rpb24oZSl7aWYocil7cj0hMSxlLnByZXZlbnREZWZhdWx0KCk7cmV0dXJufXRoaXMuX3NlYXJjaFRpbWVvdXQoZSl9LGZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZEl0ZW09bnVsbCx0aGlzLnByZXZpb3VzPXRoaXMuX3ZhbHVlKCl9LGJsdXI6ZnVuY3Rpb24oZSl7aWYodGhpcy5jYW5jZWxCbHVyKXtkZWxldGUgdGhpcy5jYW5jZWxCbHVyO3JldHVybn1jbGVhclRpbWVvdXQodGhpcy5zZWFyY2hpbmcpLHRoaXMuY2xvc2UoZSksdGhpcy5fY2hhbmdlKGUpfX0pLHRoaXMuX2luaXRTb3VyY2UoKSx0aGlzLm1lbnU9ZSgiPHVsPiIpLmFkZENsYXNzKCJ1aS1hdXRvY29tcGxldGUiKS5hcHBlbmRUbyh0aGlzLmRvY3VtZW50LmZpbmQodGhpcy5vcHRpb25zLmFwcGVuZFRvfHwiYm9keSIpWzBdKS5tZW51KHtpbnB1dDplKCkscm9sZTpudWxsfSkuekluZGV4KHRoaXMuZWxlbWVudC56SW5kZXgoKSsxKS5oaWRlKCkuZGF0YSgibWVudSIpLHRoaXMuX29uKHRoaXMubWVudS5lbGVtZW50LHttb3VzZWRvd246ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuY2FuY2VsQmx1cj0hMCx0aGlzLl9kZWxheShmdW5jdGlvbigpe2RlbGV0ZSB0aGlzLmNhbmNlbEJsdXJ9KTt2YXIgbj10aGlzLm1lbnUuZWxlbWVudFswXTtlKHQudGFyZ2V0KS5jbG9zZXN0KCIudWktbWVudS1pdGVtIikubGVuZ3RofHx0aGlzLl9kZWxheShmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5kb2N1bWVudC5vbmUoIm1vdXNlZG93biIsZnVuY3Rpb24ocil7ci50YXJnZXQhPT10LmVsZW1lbnRbMF0mJnIudGFyZ2V0IT09biYmIWUuY29udGFpbnMobixyLnRhcmdldCkmJnQuY2xvc2UoKX0pfSl9LG1lbnVmb2N1czpmdW5jdGlvbih0LG4pe2lmKHRoaXMuaXNOZXdNZW51KXt0aGlzLmlzTmV3TWVudT0hMTtpZih0Lm9yaWdpbmFsRXZlbnQmJi9ebW91c2UvLnRlc3QodC5vcmlnaW5hbEV2ZW50LnR5cGUpKXt0aGlzLm1lbnUuYmx1cigpLHRoaXMuZG9jdW1lbnQub25lKCJtb3VzZW1vdmUiLGZ1bmN0aW9uKCl7ZSh0LnRhcmdldCkudHJpZ2dlcih0Lm9yaWdpbmFsRXZlbnQpfSk7cmV0dXJufX12YXIgcj1uLml0ZW0uZGF0YSgidWktYXV0b2NvbXBsZXRlLWl0ZW0iKXx8bi5pdGVtLmRhdGEoIml0ZW0uYXV0b2NvbXBsZXRlIik7ITEhPT10aGlzLl90cmlnZ2VyKCJmb2N1cyIsdCx7aXRlbTpyfSk/dC5vcmlnaW5hbEV2ZW50JiYvXmtleS8udGVzdCh0Lm9yaWdpbmFsRXZlbnQudHlwZSkmJnRoaXMuX3ZhbHVlKHIudmFsdWUpOnRoaXMubGl2ZVJlZ2lvbi50ZXh0KHIudmFsdWUpfSxtZW51c2VsZWN0OmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5pdGVtLmRhdGEoInVpLWF1dG9jb21wbGV0ZS1pdGVtIil8fHQuaXRlbS5kYXRhKCJpdGVtLmF1dG9jb21wbGV0ZSIpLHI9dGhpcy5wcmV2aW91czt0aGlzLmVsZW1lbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQmJih0aGlzLmVsZW1lbnQuZm9jdXMoKSx0aGlzLnByZXZpb3VzPXIsdGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLnByZXZpb3VzPXIsdGhpcy5zZWxlY3RlZEl0ZW09bn0pKSwhMSE9PXRoaXMuX3RyaWdnZXIoInNlbGVjdCIsZSx7aXRlbTpufSkmJnRoaXMuX3ZhbHVlKG4udmFsdWUpLHRoaXMudGVybT10aGlzLl92YWx1ZSgpLHRoaXMuY2xvc2UoZSksdGhpcy5zZWxlY3RlZEl0ZW09bn19KSx0aGlzLmxpdmVSZWdpb249ZSgiPHNwYW4+Iix7cm9sZToic3RhdHVzIiwiYXJpYS1saXZlIjoicG9saXRlIn0pLmFkZENsYXNzKCJ1aS1oZWxwZXItaGlkZGVuLWFjY2Vzc2libGUiKS5pbnNlcnRBZnRlcih0aGlzLmVsZW1lbnQpLGUuZm4uYmdpZnJhbWUmJnRoaXMubWVudS5lbGVtZW50LmJnaWZyYW1lKCksdGhpcy5fb24odGhpcy53aW5kb3cse2JlZm9yZXVubG9hZDpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKX19KX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hpbmcpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktYXV0b2NvbXBsZXRlLWlucHV0IikucmVtb3ZlQXR0cigiYXV0b2NvbXBsZXRlIiksdGhpcy5tZW51LmVsZW1lbnQucmVtb3ZlKCksdGhpcy5saXZlUmVnaW9uLnJlbW92ZSgpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7dGhpcy5fc3VwZXIoZSx0KSxlPT09InNvdXJjZSImJnRoaXMuX2luaXRTb3VyY2UoKSxlPT09ImFwcGVuZFRvIiYmdGhpcy5tZW51LmVsZW1lbnQuYXBwZW5kVG8odGhpcy5kb2N1bWVudC5maW5kKHR8fCJib2R5IilbMF0pLGU9PT0iZGlzYWJsZWQiJiZ0JiZ0aGlzLnhociYmdGhpcy54aHIuYWJvcnQoKX0sX2lzTXVsdGlMaW5lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5pcygidGV4dGFyZWEiKT8hMDp0aGlzLmVsZW1lbnQuaXMoImlucHV0Iik/ITE6dGhpcy5lbGVtZW50LnByb3AoImlzQ29udGVudEVkaXRhYmxlIil9LF9pbml0U291cmNlOmZ1bmN0aW9uKCl7dmFyIHQsbixyPXRoaXM7ZS5pc0FycmF5KHRoaXMub3B0aW9ucy5zb3VyY2UpPyh0PXRoaXMub3B0aW9ucy5zb3VyY2UsdGhpcy5zb3VyY2U9ZnVuY3Rpb24obixyKXtyKGUudWkuYXV0b2NvbXBsZXRlLmZpbHRlcih0LG4udGVybSkpfSk6dHlwZW9mIHRoaXMub3B0aW9ucy5zb3VyY2U9PSJzdHJpbmciPyhuPXRoaXMub3B0aW9ucy5zb3VyY2UsdGhpcy5zb3VyY2U9ZnVuY3Rpb24odCxpKXtyLnhociYmci54aHIuYWJvcnQoKSxyLnhocj1lLmFqYXgoe3VybDpuLGRhdGE6dCxkYXRhVHlwZToianNvbiIsc3VjY2VzczpmdW5jdGlvbihlKXtpKGUpfSxlcnJvcjpmdW5jdGlvbigpe2koW10pfX0pfSk6dGhpcy5zb3VyY2U9dGhpcy5vcHRpb25zLnNvdXJjZX0sX3NlYXJjaFRpbWVvdXQ6ZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoaW5nKSx0aGlzLnNlYXJjaGluZz10aGlzLl9kZWxheShmdW5jdGlvbigpe3RoaXMudGVybSE9PXRoaXMuX3ZhbHVlKCkmJih0aGlzLnNlbGVjdGVkSXRlbT1udWxsLHRoaXMuc2VhcmNoKG51bGwsZSkpfSx0aGlzLm9wdGlvbnMuZGVsYXkpfSxzZWFyY2g6ZnVuY3Rpb24oZSx0KXtlPWUhPW51bGw/ZTp0aGlzLl92YWx1ZSgpLHRoaXMudGVybT10aGlzLl92YWx1ZSgpO2lmKGUubGVuZ3RoPHRoaXMub3B0aW9ucy5taW5MZW5ndGgpcmV0dXJuIHRoaXMuY2xvc2UodCk7aWYodGhpcy5fdHJpZ2dlcigic2VhcmNoIix0KT09PSExKXJldHVybjtyZXR1cm4gdGhpcy5fc2VhcmNoKGUpfSxfc2VhcmNoOmZ1bmN0aW9uKGUpe3RoaXMucGVuZGluZysrLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktYXV0b2NvbXBsZXRlLWxvYWRpbmciKSx0aGlzLmNhbmNlbFNlYXJjaD0hMSx0aGlzLnNvdXJjZSh7dGVybTplfSx0aGlzLl9yZXNwb25zZSgpKX0sX3Jlc3BvbnNlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PSsrbjtyZXR1cm4gZnVuY3Rpb24ocil7dD09PW4mJmUuX19yZXNwb25zZShyKSxlLnBlbmRpbmctLSxlLnBlbmRpbmd8fGUuZWxlbWVudC5yZW1vdmVDbGFzcygidWktYXV0b2NvbXBsZXRlLWxvYWRpbmciKX19LF9fcmVzcG9uc2U6ZnVuY3Rpb24oZSl7ZSYmKGU9dGhpcy5fbm9ybWFsaXplKGUpKSx0aGlzLl90cmlnZ2VyKCJyZXNwb25zZSIsbnVsbCx7Y29udGVudDplfSksIXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmZSYmZS5sZW5ndGgmJiF0aGlzLmNhbmNlbFNlYXJjaD8odGhpcy5fc3VnZ2VzdChlKSx0aGlzLl90cmlnZ2VyKCJvcGVuIikpOnRoaXMuX2Nsb3NlKCl9LGNsb3NlOmZ1bmN0aW9uKGUpe3RoaXMuY2FuY2VsU2VhcmNoPSEwLHRoaXMuX2Nsb3NlKGUpfSxfY2xvc2U6ZnVuY3Rpb24oZSl7dGhpcy5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikmJih0aGlzLm1lbnUuZWxlbWVudC5oaWRlKCksdGhpcy5tZW51LmJsdXIoKSx0aGlzLmlzTmV3TWVudT0hMCx0aGlzLl90cmlnZ2VyKCJjbG9zZSIsZSkpfSxfY2hhbmdlOmZ1bmN0aW9uKGUpe3RoaXMucHJldmlvdXMhPT10aGlzLl92YWx1ZSgpJiZ0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLGUse2l0ZW06dGhpcy5zZWxlY3RlZEl0ZW19KX0sX25vcm1hbGl6ZTpmdW5jdGlvbih0KXtyZXR1cm4gdC5sZW5ndGgmJnRbMF0ubGFiZWwmJnRbMF0udmFsdWU/dDplLm1hcCh0LGZ1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdD09InN0cmluZyI/e2xhYmVsOnQsdmFsdWU6dH06ZS5leHRlbmQoe2xhYmVsOnQubGFiZWx8fHQudmFsdWUsdmFsdWU6dC52YWx1ZXx8dC5sYWJlbH0sdCl9KX0sX3N1Z2dlc3Q6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5tZW51LmVsZW1lbnQuZW1wdHkoKS56SW5kZXgodGhpcy5lbGVtZW50LnpJbmRleCgpKzEpO3RoaXMuX3JlbmRlck1lbnUobix0KSx0aGlzLm1lbnUucmVmcmVzaCgpLG4uc2hvdygpLHRoaXMuX3Jlc2l6ZU1lbnUoKSxuLnBvc2l0aW9uKGUuZXh0ZW5kKHtvZjp0aGlzLmVsZW1lbnR9LHRoaXMub3B0aW9ucy5wb3NpdGlvbikpLHRoaXMub3B0aW9ucy5hdXRvRm9jdXMmJnRoaXMubWVudS5uZXh0KCl9LF9yZXNpemVNZW51OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5tZW51LmVsZW1lbnQ7ZS5vdXRlcldpZHRoKE1hdGgubWF4KGUud2lkdGgoIiIpLm91dGVyV2lkdGgoKSsxLHRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCkpKX0sX3JlbmRlck1lbnU6ZnVuY3Rpb24odCxuKXt2YXIgcj10aGlzO2UuZWFjaChuLGZ1bmN0aW9uKGUsbil7ci5fcmVuZGVySXRlbURhdGEodCxuKX0pfSxfcmVuZGVySXRlbURhdGE6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fcmVuZGVySXRlbShlLHQpLmRhdGEoInVpLWF1dG9jb21wbGV0ZS1pdGVtIix0KX0sX3JlbmRlckl0ZW06ZnVuY3Rpb24odCxuKXtyZXR1cm4gZSgiPGxpPiIpLmFwcGVuZChlKCI8YT4iKS50ZXh0KG4ubGFiZWwpKS5hcHBlbmRUbyh0KX0sX21vdmU6ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikpe3RoaXMuc2VhcmNoKG51bGwsdCk7cmV0dXJufWlmKHRoaXMubWVudS5pc0ZpcnN0SXRlbSgpJiYvXnByZXZpb3VzLy50ZXN0KGUpfHx0aGlzLm1lbnUuaXNMYXN0SXRlbSgpJiYvXm5leHQvLnRlc3QoZSkpe3RoaXMuX3ZhbHVlKHRoaXMudGVybSksdGhpcy5tZW51LmJsdXIoKTtyZXR1cm59dGhpcy5tZW51W2VdKHQpfSx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZW51LmVsZW1lbnR9LF92YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlTWV0aG9kLmFwcGx5KHRoaXMuZWxlbWVudCxhcmd1bWVudHMpfSxfa2V5RXZlbnQ6ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5pc011bHRpTGluZXx8dGhpcy5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikpdGhpcy5fbW92ZShlLHQpLHQucHJldmVudERlZmF1bHQoKX19KSxlLmV4dGVuZChlLnVpLmF1dG9jb21wbGV0ZSx7ZXNjYXBlUmVnZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvW1wtXFtcXXt9KCkqKz8uLFxcXF4kfCNcc10vZywiXFwkJiIpfSxmaWx0ZXI6ZnVuY3Rpb24odCxuKXt2YXIgcj1uZXcgUmVnRXhwKGUudWkuYXV0b2NvbXBsZXRlLmVzY2FwZVJlZ2V4KG4pLCJpIik7cmV0dXJuIGUuZ3JlcCh0LGZ1bmN0aW9uKGUpe3JldHVybiByLnRlc3QoZS5sYWJlbHx8ZS52YWx1ZXx8ZSl9KX19KSxlLndpZGdldCgidWkuYXV0b2NvbXBsZXRlIixlLnVpLmF1dG9jb21wbGV0ZSx7b3B0aW9uczp7bWVzc2FnZXM6e25vUmVzdWx0czoiTm8gc2VhcmNoIHJlc3VsdHMuIixyZXN1bHRzOmZ1bmN0aW9uKGUpe3JldHVybiBlKyhlPjE/IiByZXN1bHRzIGFyZSI6IiByZXN1bHQgaXMiKSsiIGF2YWlsYWJsZSwgdXNlIHVwIGFuZCBkb3duIGFycm93IGtleXMgdG8gbmF2aWdhdGUuIn19fSxfX3Jlc3BvbnNlOmZ1bmN0aW9uKGUpe3ZhciB0O3RoaXMuX3N1cGVyQXBwbHkoYXJndW1lbnRzKTtpZih0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fHRoaXMuY2FuY2VsU2VhcmNoKXJldHVybjtlJiZlLmxlbmd0aD90PXRoaXMub3B0aW9ucy5tZXNzYWdlcy5yZXN1bHRzKGUubGVuZ3RoKTp0PXRoaXMub3B0aW9ucy5tZXNzYWdlcy5ub1Jlc3VsdHMsdGhpcy5saXZlUmVnaW9uLnRleHQodCl9fSl9KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxzLG89InVpLWJ1dHRvbiB1aS13aWRnZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIix1PSJ1aS1zdGF0ZS1ob3ZlciB1aS1zdGF0ZS1hY3RpdmUgIixhPSJ1aS1idXR0b24taWNvbnMtb25seSB1aS1idXR0b24taWNvbi1vbmx5IHVpLWJ1dHRvbi10ZXh0LWljb25zIHVpLWJ1dHRvbi10ZXh0LWljb24tcHJpbWFyeSB1aS1idXR0b24tdGV4dC1pY29uLXNlY29uZGFyeSB1aS1idXR0b24tdGV4dC1vbmx5IixmPWZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKS5maW5kKCI6dWktYnV0dG9uIik7c2V0VGltZW91dChmdW5jdGlvbigpe3QuYnV0dG9uKCJyZWZyZXNoIil9LDEpfSxsPWZ1bmN0aW9uKHQpe3ZhciBuPXQubmFtZSxyPXQuZm9ybSxpPWUoW10pO3JldHVybiBuJiYocj9pPWUocikuZmluZCgiW25hbWU9JyIrbisiJ10iKTppPWUoIltuYW1lPSciK24rIiddIix0Lm93bmVyRG9jdW1lbnQpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiF0aGlzLmZvcm19KSksaX07ZS53aWRnZXQoInVpLmJ1dHRvbiIse3ZlcnNpb246IjEuOS4yIixkZWZhdWx0RWxlbWVudDoiPGJ1dHRvbj4iLG9wdGlvbnM6e2Rpc2FibGVkOm51bGwsdGV4dDohMCxsYWJlbDpudWxsLGljb25zOntwcmltYXJ5Om51bGwsc2Vjb25kYXJ5Om51bGx9fSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmNsb3Nlc3QoImZvcm0iKS51bmJpbmQoInJlc2V0Iit0aGlzLmV2ZW50TmFtZXNwYWNlKS5iaW5kKCJyZXNldCIrdGhpcy5ldmVudE5hbWVzcGFjZSxmKSx0eXBlb2YgdGhpcy5vcHRpb25zLmRpc2FibGVkIT0iYm9vbGVhbiI/dGhpcy5vcHRpb25zLmRpc2FibGVkPSEhdGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIik6dGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIix0aGlzLm9wdGlvbnMuZGlzYWJsZWQpLHRoaXMuX2RldGVybWluZUJ1dHRvblR5cGUoKSx0aGlzLmhhc1RpdGxlPSEhdGhpcy5idXR0b25FbGVtZW50LmF0dHIoInRpdGxlIik7dmFyIHQ9dGhpcyx1PXRoaXMub3B0aW9ucyxhPXRoaXMudHlwZT09PSJjaGVja2JveCJ8fHRoaXMudHlwZT09PSJyYWRpbyIsYz1hPyIiOiJ1aS1zdGF0ZS1hY3RpdmUiLGg9InVpLXN0YXRlLWZvY3VzIjt1LmxhYmVsPT09bnVsbCYmKHUubGFiZWw9dGhpcy50eXBlPT09ImlucHV0Ij90aGlzLmJ1dHRvbkVsZW1lbnQudmFsKCk6dGhpcy5idXR0b25FbGVtZW50Lmh0bWwoKSksdGhpcy5faG92ZXJhYmxlKHRoaXMuYnV0dG9uRWxlbWVudCksdGhpcy5idXR0b25FbGVtZW50LmFkZENsYXNzKG8pLmF0dHIoInJvbGUiLCJidXR0b24iKS5iaW5kKCJtb3VzZWVudGVyIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7aWYodS5kaXNhYmxlZClyZXR1cm47dGhpcz09PW4mJmUodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSkuYmluZCgibW91c2VsZWF2ZSIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2lmKHUuZGlzYWJsZWQpcmV0dXJuO2UodGhpcykucmVtb3ZlQ2xhc3MoYyl9KS5iaW5kKCJjbGljayIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbihlKXt1LmRpc2FibGVkJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfSksdGhpcy5lbGVtZW50LmJpbmQoImZvY3VzIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7dC5idXR0b25FbGVtZW50LmFkZENsYXNzKGgpfSkuYmluZCgiYmx1ciIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe3QuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcyhoKX0pLGEmJih0aGlzLmVsZW1lbnQuYmluZCgiY2hhbmdlIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7aWYocylyZXR1cm47dC5yZWZyZXNoKCl9KSx0aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgibW91c2Vkb3duIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKGUpe2lmKHUuZGlzYWJsZWQpcmV0dXJuO3M9ITEscj1lLnBhZ2VYLGk9ZS5wYWdlWX0pLmJpbmQoIm1vdXNldXAiK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oZSl7aWYodS5kaXNhYmxlZClyZXR1cm47aWYociE9PWUucGFnZVh8fGkhPT1lLnBhZ2VZKXM9ITB9KSksdGhpcy50eXBlPT09ImNoZWNrYm94Ij90aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgiY2xpY2siK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXtpZih1LmRpc2FibGVkfHxzKXJldHVybiExO2UodGhpcykudG9nZ2xlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLHQuYnV0dG9uRWxlbWVudC5hdHRyKCJhcmlhLXByZXNzZWQiLHQuZWxlbWVudFswXS5jaGVja2VkKX0pOnRoaXMudHlwZT09PSJyYWRpbyI/dGhpcy5idXR0b25FbGVtZW50LmJpbmQoImNsaWNrIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7aWYodS5kaXNhYmxlZHx8cylyZXR1cm4hMTtlKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx0LmJ1dHRvbkVsZW1lbnQuYXR0cigiYXJpYS1wcmVzc2VkIiwidHJ1ZSIpO3ZhciBuPXQuZWxlbWVudFswXTtsKG4pLm5vdChuKS5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzKS5idXR0b24oIndpZGdldCIpWzBdfSkucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsImZhbHNlIil9KToodGhpcy5idXR0b25FbGVtZW50LmJpbmQoIm1vdXNlZG93biIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2lmKHUuZGlzYWJsZWQpcmV0dXJuITE7ZSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIiksbj10aGlzLHQuZG9jdW1lbnQub25lKCJtb3VzZXVwIixmdW5jdGlvbigpe249bnVsbH0pfSkuYmluZCgibW91c2V1cCIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2lmKHUuZGlzYWJsZWQpcmV0dXJuITE7ZSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIil9KS5iaW5kKCJrZXlkb3duIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKHQpe2lmKHUuZGlzYWJsZWQpcmV0dXJuITE7KHQua2V5Q29kZT09PWUudWkua2V5Q29kZS5TUEFDRXx8dC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLkVOVEVSKSYmZSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIil9KS5iaW5kKCJrZXl1cCIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2UodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSksdGhpcy5idXR0b25FbGVtZW50LmlzKCJhIikmJnRoaXMuYnV0dG9uRWxlbWVudC5rZXl1cChmdW5jdGlvbih0KXt0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuU1BBQ0UmJmUodGhpcykuY2xpY2soKX0pKSx0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIix1LmRpc2FibGVkKSx0aGlzLl9yZXNldEJ1dHRvbigpfSxfZGV0ZXJtaW5lQnV0dG9uVHlwZTpmdW5jdGlvbigpe3ZhciBlLHQsbjt0aGlzLmVsZW1lbnQuaXMoIlt0eXBlPWNoZWNrYm94XSIpP3RoaXMudHlwZT0iY2hlY2tib3giOnRoaXMuZWxlbWVudC5pcygiW3R5cGU9cmFkaW9dIik/dGhpcy50eXBlPSJyYWRpbyI6dGhpcy5lbGVtZW50LmlzKCJpbnB1dCIpP3RoaXMudHlwZT0iaW5wdXQiOnRoaXMudHlwZT0iYnV0dG9uIix0aGlzLnR5cGU9PT0iY2hlY2tib3gifHx0aGlzLnR5cGU9PT0icmFkaW8iPyhlPXRoaXMuZWxlbWVudC5wYXJlbnRzKCkubGFzdCgpLHQ9ImxhYmVsW2Zvcj0nIit0aGlzLmVsZW1lbnQuYXR0cigiaWQiKSsiJ10iLHRoaXMuYnV0dG9uRWxlbWVudD1lLmZpbmQodCksdGhpcy5idXR0b25FbGVtZW50Lmxlbmd0aHx8KGU9ZS5sZW5ndGg/ZS5zaWJsaW5ncygpOnRoaXMuZWxlbWVudC5zaWJsaW5ncygpLHRoaXMuYnV0dG9uRWxlbWVudD1lLmZpbHRlcih0KSx0aGlzLmJ1dHRvbkVsZW1lbnQubGVuZ3RofHwodGhpcy5idXR0b25FbGVtZW50PWUuZmluZCh0KSkpLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIiksbj10aGlzLmVsZW1lbnQuaXMoIjpjaGVja2VkIiksbiYmdGhpcy5idXR0b25FbGVtZW50LmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLmJ1dHRvbkVsZW1lbnQucHJvcCgiYXJpYS1wcmVzc2VkIixuKSk6dGhpcy5idXR0b25FbGVtZW50PXRoaXMuZWxlbWVudH0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnV0dG9uRWxlbWVudH0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZSIpLHRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcyhvKyIgIit1KyIgIithKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigiYXJpYS1wcmVzc2VkIikuaHRtbCh0aGlzLmJ1dHRvbkVsZW1lbnQuZmluZCgiLnVpLWJ1dHRvbi10ZXh0IikuaHRtbCgpKSx0aGlzLmhhc1RpdGxlfHx0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQXR0cigidGl0bGUiKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe3RoaXMuX3N1cGVyKGUsdCk7aWYoZT09PSJkaXNhYmxlZCIpe3Q/dGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIiwhMCk6dGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIiwhMSk7cmV0dXJufXRoaXMuX3Jlc2V0QnV0dG9uKCl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsZW1lbnQuaXMoImlucHV0LCBidXR0b24iKT90aGlzLmVsZW1lbnQuaXMoIjpkaXNhYmxlZCIpOnRoaXMuZWxlbWVudC5oYXNDbGFzcygidWktYnV0dG9uLWRpc2FibGVkIik7dCE9PXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsdCksdGhpcy50eXBlPT09InJhZGlvIj9sKHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpe2UodGhpcykuaXMoIjpjaGVja2VkIik/ZSh0aGlzKS5idXR0b24oIndpZGdldCIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKCJhcmlhLXByZXNzZWQiLCJ0cnVlIik6ZSh0aGlzKS5idXR0b24oIndpZGdldCIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKCJhcmlhLXByZXNzZWQiLCJmYWxzZSIpfSk6dGhpcy50eXBlPT09ImNoZWNrYm94IiYmKHRoaXMuZWxlbWVudC5pcygiOmNoZWNrZWQiKT90aGlzLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsInRydWUiKTp0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsImZhbHNlIikpfSxfcmVzZXRCdXR0b246ZnVuY3Rpb24oKXtpZih0aGlzLnR5cGU9PT0iaW5wdXQiKXt0aGlzLm9wdGlvbnMubGFiZWwmJnRoaXMuZWxlbWVudC52YWwodGhpcy5vcHRpb25zLmxhYmVsKTtyZXR1cm59dmFyIHQ9dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKGEpLG49ZSgiPHNwYW4+PC9zcGFuPiIsdGhpcy5kb2N1bWVudFswXSkuYWRkQ2xhc3MoInVpLWJ1dHRvbi10ZXh0IikuaHRtbCh0aGlzLm9wdGlvbnMubGFiZWwpLmFwcGVuZFRvKHQuZW1wdHkoKSkudGV4dCgpLHI9dGhpcy5vcHRpb25zLmljb25zLGk9ci5wcmltYXJ5JiZyLnNlY29uZGFyeSxzPVtdO3IucHJpbWFyeXx8ci5zZWNvbmRhcnk/KHRoaXMub3B0aW9ucy50ZXh0JiZzLnB1c2goInVpLWJ1dHRvbi10ZXh0LWljb24iKyhpPyJzIjpyLnByaW1hcnk/Ii1wcmltYXJ5IjoiLXNlY29uZGFyeSIpKSxyLnByaW1hcnkmJnQucHJlcGVuZCgiPHNwYW4gY2xhc3M9J3VpLWJ1dHRvbi1pY29uLXByaW1hcnkgdWktaWNvbiAiK3IucHJpbWFyeSsiJz48L3NwYW4+Iiksci5zZWNvbmRhcnkmJnQuYXBwZW5kKCI8c3BhbiBjbGFzcz0ndWktYnV0dG9uLWljb24tc2Vjb25kYXJ5IHVpLWljb24gIityLnNlY29uZGFyeSsiJz48L3NwYW4+IiksdGhpcy5vcHRpb25zLnRleHR8fChzLnB1c2goaT8idWktYnV0dG9uLWljb25zLW9ubHkiOiJ1aS1idXR0b24taWNvbi1vbmx5IiksdGhpcy5oYXNUaXRsZXx8dC5hdHRyKCJ0aXRsZSIsZS50cmltKG4pKSkpOnMucHVzaCgidWktYnV0dG9uLXRleHQtb25seSIpLHQuYWRkQ2xhc3Mocy5qb2luKCIgIikpfX0pLGUud2lkZ2V0KCJ1aS5idXR0b25zZXQiLHt2ZXJzaW9uOiIxLjkuMiIsb3B0aW9uczp7aXRlbXM6ImJ1dHRvbiwgaW5wdXRbdHlwZT1idXR0b25dLCBpbnB1dFt0eXBlPXN1Ym1pdF0sIGlucHV0W3R5cGU9cmVzZXRdLCBpbnB1dFt0eXBlPWNoZWNrYm94XSwgaW5wdXRbdHlwZT1yYWRpb10sIGEsIDpkYXRhKGJ1dHRvbikifSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1idXR0b25zZXQiKX0sX2luaXQ6ZnVuY3Rpb24oKXt0aGlzLnJlZnJlc2goKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe2U9PT0iZGlzYWJsZWQiJiZ0aGlzLmJ1dHRvbnMuYnV0dG9uKCJvcHRpb24iLGUsdCksdGhpcy5fc3VwZXIoZSx0KX0scmVmcmVzaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWxlbWVudC5jc3MoImRpcmVjdGlvbiIpPT09InJ0bCI7dGhpcy5idXR0b25zPXRoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcykuZmlsdGVyKCI6dWktYnV0dG9uIikuYnV0dG9uKCJyZWZyZXNoIikuZW5kKCkubm90KCI6dWktYnV0dG9uIikuYnV0dG9uKCkuZW5kKCkubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGUodGhpcykuYnV0dG9uKCJ3aWRnZXQiKVswXX0pLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItYWxsIHVpLWNvcm5lci1sZWZ0IHVpLWNvcm5lci1yaWdodCIpLmZpbHRlcigiOmZpcnN0IikuYWRkQ2xhc3ModD8idWktY29ybmVyLXJpZ2h0IjoidWktY29ybmVyLWxlZnQiKS5lbmQoKS5maWx0ZXIoIjpsYXN0IikuYWRkQ2xhc3ModD8idWktY29ybmVyLWxlZnQiOiJ1aS1jb3JuZXItcmlnaHQiKS5lbmQoKS5lbmQoKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWJ1dHRvbnNldCIpLHRoaXMuYnV0dG9ucy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzKS5idXR0b24oIndpZGdldCIpWzBdfSkucmVtb3ZlQ2xhc3MoInVpLWNvcm5lci1sZWZ0IHVpLWNvcm5lci1yaWdodCIpLmVuZCgpLmJ1dHRvbigiZGVzdHJveSIpfX0pfSkoalF1ZXJ5KTsoZnVuY3Rpb24oJCx1bmRlZmluZWQpe2Z1bmN0aW9uIERhdGVwaWNrZXIoKXt0aGlzLmRlYnVnPSExLHRoaXMuX2N1ckluc3Q9bnVsbCx0aGlzLl9rZXlFdmVudD0hMSx0aGlzLl9kaXNhYmxlZElucHV0cz1bXSx0aGlzLl9kYXRlcGlja2VyU2hvd2luZz0hMSx0aGlzLl9pbkRpYWxvZz0hMSx0aGlzLl9tYWluRGl2SWQ9InVpLWRhdGVwaWNrZXItZGl2Iix0aGlzLl9pbmxpbmVDbGFzcz0idWktZGF0ZXBpY2tlci1pbmxpbmUiLHRoaXMuX2FwcGVuZENsYXNzPSJ1aS1kYXRlcGlja2VyLWFwcGVuZCIsdGhpcy5fdHJpZ2dlckNsYXNzPSJ1aS1kYXRlcGlja2VyLXRyaWdnZXIiLHRoaXMuX2RpYWxvZ0NsYXNzPSJ1aS1kYXRlcGlja2VyLWRpYWxvZyIsdGhpcy5fZGlzYWJsZUNsYXNzPSJ1aS1kYXRlcGlja2VyLWRpc2FibGVkIix0aGlzLl91bnNlbGVjdGFibGVDbGFzcz0idWktZGF0ZXBpY2tlci11bnNlbGVjdGFibGUiLHRoaXMuX2N1cnJlbnRDbGFzcz0idWktZGF0ZXBpY2tlci1jdXJyZW50LWRheSIsdGhpcy5fZGF5T3ZlckNsYXNzPSJ1aS1kYXRlcGlja2VyLWRheXMtY2VsbC1vdmVyIix0aGlzLnJlZ2lvbmFsPVtdLHRoaXMucmVnaW9uYWxbIiJdPXtjbG9zZVRleHQ6IkRvbmUiLHByZXZUZXh0OiJQcmV2IixuZXh0VGV4dDoiTmV4dCIsY3VycmVudFRleHQ6IlRvZGF5Iixtb250aE5hbWVzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxtb250aE5hbWVzU2hvcnQ6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSxkYXlOYW1lczpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sZGF5TmFtZXNTaG9ydDpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLGRheU5hbWVzTWluOlsiU3UiLCJNbyIsIlR1IiwiV2UiLCJUaCIsIkZyIiwiU2EiXSx3ZWVrSGVhZGVyOiJXayIsZGF0ZUZvcm1hdDoibW0vZGQveXkiLGZpcnN0RGF5OjAsaXNSVEw6ITEsc2hvd01vbnRoQWZ0ZXJZZWFyOiExLHllYXJTdWZmaXg6IiJ9LHRoaXMuX2RlZmF1bHRzPXtzaG93T246ImZvY3VzIixzaG93QW5pbToiZmFkZUluIixzaG93T3B0aW9uczp7fSxkZWZhdWx0RGF0ZTpudWxsLGFwcGVuZFRleHQ6IiIsYnV0dG9uVGV4dDoiLi4uIixidXR0b25JbWFnZToiIixidXR0b25JbWFnZU9ubHk6ITEsaGlkZUlmTm9QcmV2TmV4dDohMSxuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0OiExLGdvdG9DdXJyZW50OiExLGNoYW5nZU1vbnRoOiExLGNoYW5nZVllYXI6ITEseWVhclJhbmdlOiJjLTEwOmMrMTAiLHNob3dPdGhlck1vbnRoczohMSxzZWxlY3RPdGhlck1vbnRoczohMSxzaG93V2VlazohMSxjYWxjdWxhdGVXZWVrOnRoaXMuaXNvODYwMVdlZWssc2hvcnRZZWFyQ3V0b2ZmOiIrMTAiLG1pbkRhdGU6bnVsbCxtYXhEYXRlOm51bGwsZHVyYXRpb246ImZhc3QiLGJlZm9yZVNob3dEYXk6bnVsbCxiZWZvcmVTaG93Om51bGwsb25TZWxlY3Q6bnVsbCxvbkNoYW5nZU1vbnRoWWVhcjpudWxsLG9uQ2xvc2U6bnVsbCxudW1iZXJPZk1vbnRoczoxLHNob3dDdXJyZW50QXRQb3M6MCxzdGVwTW9udGhzOjEsc3RlcEJpZ01vbnRoczoxMixhbHRGaWVsZDoiIixhbHRGb3JtYXQ6IiIsY29uc3RyYWluSW5wdXQ6ITAsc2hvd0J1dHRvblBhbmVsOiExLGF1dG9TaXplOiExLGRpc2FibGVkOiExfSwkLmV4dGVuZCh0aGlzLl9kZWZhdWx0cyx0aGlzLnJlZ2lvbmFsWyIiXSksdGhpcy5kcERpdj1iaW5kSG92ZXIoJCgnPGRpdiBpZD0iJyt0aGlzLl9tYWluRGl2SWQrJyIgY2xhc3M9InVpLWRhdGVwaWNrZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCB1aS1jb3JuZXItYWxsIj48L2Rpdj4nKSl9ZnVuY3Rpb24gYmluZEhvdmVyKGUpe3ZhciB0PSJidXR0b24sIC51aS1kYXRlcGlja2VyLXByZXYsIC51aS1kYXRlcGlja2VyLW5leHQsIC51aS1kYXRlcGlja2VyLWNhbGVuZGFyIHRkIGEiO3JldHVybiBlLmRlbGVnYXRlKHQsIm1vdXNlb3V0IixmdW5jdGlvbigpeyQodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksdGhpcy5jbGFzc05hbWUuaW5kZXhPZigidWktZGF0ZXBpY2tlci1wcmV2IikhPS0xJiYkKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1kYXRlcGlja2VyLXByZXYtaG92ZXIiKSx0aGlzLmNsYXNzTmFtZS5pbmRleE9mKCJ1aS1kYXRlcGlja2VyLW5leHQiKSE9LTEmJiQodGhpcykucmVtb3ZlQ2xhc3MoInVpLWRhdGVwaWNrZXItbmV4dC1ob3ZlciIpfSkuZGVsZWdhdGUodCwibW91c2VvdmVyIixmdW5jdGlvbigpeyQuZGF0ZXBpY2tlci5faXNEaXNhYmxlZERhdGVwaWNrZXIoaW5zdEFjdGl2ZS5pbmxpbmU/ZS5wYXJlbnQoKVswXTppbnN0QWN0aXZlLmlucHV0WzBdKXx8KCQodGhpcykucGFyZW50cygiLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIiKS5maW5kKCJhIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksJCh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtaG92ZXIiKSx0aGlzLmNsYXNzTmFtZS5pbmRleE9mKCJ1aS1kYXRlcGlja2VyLXByZXYiKSE9LTEmJiQodGhpcykuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItcHJldi1ob3ZlciIpLHRoaXMuY2xhc3NOYW1lLmluZGV4T2YoInVpLWRhdGVwaWNrZXItbmV4dCIpIT0tMSYmJCh0aGlzKS5hZGRDbGFzcygidWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyIikpfSl9ZnVuY3Rpb24gZXh0ZW5kUmVtb3ZlKGUsdCl7JC5leHRlbmQoZSx0KTtmb3IodmFyIG4gaW4gdClpZih0W25dPT1udWxsfHx0W25dPT11bmRlZmluZWQpZVtuXT10W25dO3JldHVybiBlfSQuZXh0ZW5kKCQudWkse2RhdGVwaWNrZXI6e3ZlcnNpb246IjEuOS4yIn19KTt2YXIgUFJPUF9OQU1FPSJkYXRlcGlja2VyIixkcHV1aWQ9KG5ldyBEYXRlKS5nZXRUaW1lKCksaW5zdEFjdGl2ZTskLmV4dGVuZChEYXRlcGlja2VyLnByb3RvdHlwZSx7bWFya2VyQ2xhc3NOYW1lOiJoYXNEYXRlcGlja2VyIixtYXhSb3dzOjQsbG9nOmZ1bmN0aW9uKCl7dGhpcy5kZWJ1ZyYmY29uc29sZS5sb2cuYXBwbHkoIiIsYXJndW1lbnRzKX0sX3dpZGdldERhdGVwaWNrZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kcERpdn0sc2V0RGVmYXVsdHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGV4dGVuZFJlbW92ZSh0aGlzLl9kZWZhdWx0cyxlfHx7fSksdGhpc30sX2F0dGFjaERhdGVwaWNrZXI6ZnVuY3Rpb24odGFyZ2V0LHNldHRpbmdzKXt2YXIgaW5saW5lU2V0dGluZ3M9bnVsbDtmb3IodmFyIGF0dHJOYW1lIGluIHRoaXMuX2RlZmF1bHRzKXt2YXIgYXR0clZhbHVlPXRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGU6IithdHRyTmFtZSk7aWYoYXR0clZhbHVlKXtpbmxpbmVTZXR0aW5ncz1pbmxpbmVTZXR0aW5nc3x8e307dHJ5e2lubGluZVNldHRpbmdzW2F0dHJOYW1lXT1ldmFsKGF0dHJWYWx1ZSl9Y2F0Y2goZXJyKXtpbmxpbmVTZXR0aW5nc1thdHRyTmFtZV09YXR0clZhbHVlfX19dmFyIG5vZGVOYW1lPXRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGlubGluZT1ub2RlTmFtZT09ImRpdiJ8fG5vZGVOYW1lPT0ic3BhbiI7dGFyZ2V0LmlkfHwodGhpcy51dWlkKz0xLHRhcmdldC5pZD0iZHAiK3RoaXMudXVpZCk7dmFyIGluc3Q9dGhpcy5fbmV3SW5zdCgkKHRhcmdldCksaW5saW5lKTtpbnN0LnNldHRpbmdzPSQuZXh0ZW5kKHt9LHNldHRpbmdzfHx7fSxpbmxpbmVTZXR0aW5nc3x8e30pLG5vZGVOYW1lPT0iaW5wdXQiP3RoaXMuX2Nvbm5lY3REYXRlcGlja2VyKHRhcmdldCxpbnN0KTppbmxpbmUmJnRoaXMuX2lubGluZURhdGVwaWNrZXIodGFyZ2V0LGluc3QpfSxfbmV3SW5zdDpmdW5jdGlvbihlLHQpe3ZhciBuPWVbMF0uaWQucmVwbGFjZSgvKFteQS1aYS16MC05Xy1dKS9nLCJcXFxcJDEiKTtyZXR1cm57aWQ6bixpbnB1dDplLHNlbGVjdGVkRGF5OjAsc2VsZWN0ZWRNb250aDowLHNlbGVjdGVkWWVhcjowLGRyYXdNb250aDowLGRyYXdZZWFyOjAsaW5saW5lOnQsZHBEaXY6dD9iaW5kSG92ZXIoJCgnPGRpdiBjbGFzcz0iJyt0aGlzLl9pbmxpbmVDbGFzcysnIHVpLWRhdGVwaWNrZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCB1aS1jb3JuZXItYWxsIj48L2Rpdj4nKSk6dGhpcy5kcERpdn19LF9jb25uZWN0RGF0ZXBpY2tlcjpmdW5jdGlvbihlLHQpe3ZhciBuPSQoZSk7dC5hcHBlbmQ9JChbXSksdC50cmlnZ2VyPSQoW10pO2lmKG4uaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKXJldHVybjt0aGlzLl9hdHRhY2htZW50cyhuLHQpLG4uYWRkQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmtleWRvd24odGhpcy5fZG9LZXlEb3duKS5rZXlwcmVzcyh0aGlzLl9kb0tleVByZXNzKS5rZXl1cCh0aGlzLl9kb0tleVVwKS5iaW5kKCJzZXREYXRhLmRhdGVwaWNrZXIiLGZ1bmN0aW9uKGUsbixyKXt0LnNldHRpbmdzW25dPXJ9KS5iaW5kKCJnZXREYXRhLmRhdGVwaWNrZXIiLGZ1bmN0aW9uKGUsbil7cmV0dXJuIHRoaXMuX2dldCh0LG4pfSksdGhpcy5fYXV0b1NpemUodCksJC5kYXRhKGUsUFJPUF9OQU1FLHQpLHQuc2V0dGluZ3MuZGlzYWJsZWQmJnRoaXMuX2Rpc2FibGVEYXRlcGlja2VyKGUpfSxfYXR0YWNobWVudHM6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9nZXQodCwiYXBwZW5kVGV4dCIpLHI9dGhpcy5fZ2V0KHQsImlzUlRMIik7dC5hcHBlbmQmJnQuYXBwZW5kLnJlbW92ZSgpLG4mJih0LmFwcGVuZD0kKCc8c3BhbiBjbGFzcz0iJyt0aGlzLl9hcHBlbmRDbGFzcysnIj4nK24rIjwvc3Bhbj4iKSxlW3I/ImJlZm9yZSI6ImFmdGVyIl0odC5hcHBlbmQpKSxlLnVuYmluZCgiZm9jdXMiLHRoaXMuX3Nob3dEYXRlcGlja2VyKSx0LnRyaWdnZXImJnQudHJpZ2dlci5yZW1vdmUoKTt2YXIgaT10aGlzLl9nZXQodCwic2hvd09uIik7KGk9PSJmb2N1cyJ8fGk9PSJib3RoIikmJmUuZm9jdXModGhpcy5fc2hvd0RhdGVwaWNrZXIpO2lmKGk9PSJidXR0b24ifHxpPT0iYm90aCIpe3ZhciBzPXRoaXMuX2dldCh0LCJidXR0b25UZXh0Iiksbz10aGlzLl9nZXQodCwiYnV0dG9uSW1hZ2UiKTt0LnRyaWdnZXI9JCh0aGlzLl9nZXQodCwiYnV0dG9uSW1hZ2VPbmx5Iik/JCgiPGltZy8+IikuYWRkQ2xhc3ModGhpcy5fdHJpZ2dlckNsYXNzKS5hdHRyKHtzcmM6byxhbHQ6cyx0aXRsZTpzfSk6JCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iPjwvYnV0dG9uPicpLmFkZENsYXNzKHRoaXMuX3RyaWdnZXJDbGFzcykuaHRtbChvPT0iIj9zOiQoIjxpbWcvPiIpLmF0dHIoe3NyYzpvLGFsdDpzLHRpdGxlOnN9KSkpLGVbcj8iYmVmb3JlIjoiYWZ0ZXIiXSh0LnRyaWdnZXIpLHQudHJpZ2dlci5jbGljayhmdW5jdGlvbigpe3JldHVybiAkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiYkLmRhdGVwaWNrZXIuX2xhc3RJbnB1dD09ZVswXT8kLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk6JC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmJC5kYXRlcGlja2VyLl9sYXN0SW5wdXQhPWVbMF0/KCQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKSwkLmRhdGVwaWNrZXIuX3Nob3dEYXRlcGlja2VyKGVbMF0pKTokLmRhdGVwaWNrZXIuX3Nob3dEYXRlcGlja2VyKGVbMF0pLCExfSl9fSxfYXV0b1NpemU6ZnVuY3Rpb24oZSl7aWYodGhpcy5fZ2V0KGUsImF1dG9TaXplIikmJiFlLmlubGluZSl7dmFyIHQ9bmV3IERhdGUoMjAwOSwxMSwyMCksbj10aGlzLl9nZXQoZSwiZGF0ZUZvcm1hdCIpO2lmKG4ubWF0Y2goL1tETV0vKSl7dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPTA7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspZVtyXS5sZW5ndGg+dCYmKHQ9ZVtyXS5sZW5ndGgsbj1yKTtyZXR1cm4gbn07dC5zZXRNb250aChyKHRoaXMuX2dldChlLG4ubWF0Y2goL01NLyk/Im1vbnRoTmFtZXMiOiJtb250aE5hbWVzU2hvcnQiKSkpLHQuc2V0RGF0ZShyKHRoaXMuX2dldChlLG4ubWF0Y2goL0RELyk/ImRheU5hbWVzIjoiZGF5TmFtZXNTaG9ydCIpKSsyMC10LmdldERheSgpKX1lLmlucHV0LmF0dHIoInNpemUiLHRoaXMuX2Zvcm1hdERhdGUoZSx0KS5sZW5ndGgpfX0sX2lubGluZURhdGVwaWNrZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj0kKGUpO2lmKG4uaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKXJldHVybjtuLmFkZENsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5hcHBlbmQodC5kcERpdikuYmluZCgic2V0RGF0YS5kYXRlcGlja2VyIixmdW5jdGlvbihlLG4scil7dC5zZXR0aW5nc1tuXT1yfSkuYmluZCgiZ2V0RGF0YS5kYXRlcGlja2VyIixmdW5jdGlvbihlLG4pe3JldHVybiB0aGlzLl9nZXQodCxuKX0pLCQuZGF0YShlLFBST1BfTkFNRSx0KSx0aGlzLl9zZXREYXRlKHQsdGhpcy5fZ2V0RGVmYXVsdERhdGUodCksITApLHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIodCksdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKHQpLHQuc2V0dGluZ3MuZGlzYWJsZWQmJnRoaXMuX2Rpc2FibGVEYXRlcGlja2VyKGUpLHQuZHBEaXYuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sX2RpYWxvZ0RhdGVwaWNrZXI6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgcz10aGlzLl9kaWFsb2dJbnN0O2lmKCFzKXt0aGlzLnV1aWQrPTE7dmFyIG89ImRwIit0aGlzLnV1aWQ7dGhpcy5fZGlhbG9nSW5wdXQ9JCgnPGlucHV0IHR5cGU9InRleHQiIGlkPSInK28rJyIgc3R5bGU9InBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAtMTAwcHg7IHdpZHRoOiAwcHg7Ii8+JyksdGhpcy5fZGlhbG9nSW5wdXQua2V5ZG93bih0aGlzLl9kb0tleURvd24pLCQoImJvZHkiKS5hcHBlbmQodGhpcy5fZGlhbG9nSW5wdXQpLHM9dGhpcy5fZGlhbG9nSW5zdD10aGlzLl9uZXdJbnN0KHRoaXMuX2RpYWxvZ0lucHV0LCExKSxzLnNldHRpbmdzPXt9LCQuZGF0YSh0aGlzLl9kaWFsb2dJbnB1dFswXSxQUk9QX05BTUUscyl9ZXh0ZW5kUmVtb3ZlKHMuc2V0dGluZ3Mscnx8e30pLHQ9dCYmdC5jb25zdHJ1Y3Rvcj09RGF0ZT90aGlzLl9mb3JtYXREYXRlKHMsdCk6dCx0aGlzLl9kaWFsb2dJbnB1dC52YWwodCksdGhpcy5fcG9zPWk/aS5sZW5ndGg/aTpbaS5wYWdlWCxpLnBhZ2VZXTpudWxsO2lmKCF0aGlzLl9wb3Mpe3ZhciB1PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxhPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsZj1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0LGw9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7dGhpcy5fcG9zPVt1LzItMTAwK2YsYS8yLTE1MCtsXX1yZXR1cm4gdGhpcy5fZGlhbG9nSW5wdXQuY3NzKCJsZWZ0Iix0aGlzLl9wb3NbMF0rMjArInB4IikuY3NzKCJ0b3AiLHRoaXMuX3Bvc1sxXSsicHgiKSxzLnNldHRpbmdzLm9uU2VsZWN0PW4sdGhpcy5faW5EaWFsb2c9ITAsdGhpcy5kcERpdi5hZGRDbGFzcyh0aGlzLl9kaWFsb2dDbGFzcyksdGhpcy5fc2hvd0RhdGVwaWNrZXIodGhpcy5fZGlhbG9nSW5wdXRbMF0pLCQuYmxvY2tVSSYmJC5ibG9ja1VJKHRoaXMuZHBEaXYpLCQuZGF0YSh0aGlzLl9kaWFsb2dJbnB1dFswXSxQUk9QX05BTUUscyksdGhpc30sX2Rlc3Ryb3lEYXRlcGlja2VyOmZ1bmN0aW9uKGUpe3ZhciB0PSQoZSksbj0kLmRhdGEoZSxQUk9QX05BTUUpO2lmKCF0Lmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSlyZXR1cm47dmFyIHI9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyQucmVtb3ZlRGF0YShlLFBST1BfTkFNRSkscj09ImlucHV0Ij8obi5hcHBlbmQucmVtb3ZlKCksbi50cmlnZ2VyLnJlbW92ZSgpLHQucmVtb3ZlQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLnVuYmluZCgiZm9jdXMiLHRoaXMuX3Nob3dEYXRlcGlja2VyKS51bmJpbmQoImtleWRvd24iLHRoaXMuX2RvS2V5RG93bikudW5iaW5kKCJrZXlwcmVzcyIsdGhpcy5fZG9LZXlQcmVzcykudW5iaW5kKCJrZXl1cCIsdGhpcy5fZG9LZXlVcCkpOihyPT0iZGl2Inx8cj09InNwYW4iKSYmdC5yZW1vdmVDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkuZW1wdHkoKX0sX2VuYWJsZURhdGVwaWNrZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9JChlKSxuPSQuZGF0YShlLFBST1BfTkFNRSk7aWYoIXQuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKXJldHVybjt2YXIgcj1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYocj09ImlucHV0IillLmRpc2FibGVkPSExLG4udHJpZ2dlci5maWx0ZXIoImJ1dHRvbiIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkPSExfSkuZW5kKCkuZmlsdGVyKCJpbWciKS5jc3Moe29wYWNpdHk6IjEuMCIsY3Vyc29yOiIifSk7ZWxzZSBpZihyPT0iZGl2Inx8cj09InNwYW4iKXt2YXIgaT10LmNoaWxkcmVuKCIuIit0aGlzLl9pbmxpbmVDbGFzcyk7aS5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpLGkuZmluZCgic2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgsIHNlbGVjdC51aS1kYXRlcGlja2VyLXllYXIiKS5wcm9wKCJkaXNhYmxlZCIsITEpfXRoaXMuX2Rpc2FibGVkSW5wdXRzPSQubWFwKHRoaXMuX2Rpc2FibGVkSW5wdXRzLGZ1bmN0aW9uKHQpe3JldHVybiB0PT1lP251bGw6dH0pfSxfZGlzYWJsZURhdGVwaWNrZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9JChlKSxuPSQuZGF0YShlLFBST1BfTkFNRSk7aWYoIXQuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKXJldHVybjt2YXIgcj1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYocj09ImlucHV0IillLmRpc2FibGVkPSEwLG4udHJpZ2dlci5maWx0ZXIoImJ1dHRvbiIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkPSEwfSkuZW5kKCkuZmlsdGVyKCJpbWciKS5jc3Moe29wYWNpdHk6IjAuNSIsY3Vyc29yOiJkZWZhdWx0In0pO2Vsc2UgaWYocj09ImRpdiJ8fHI9PSJzcGFuIil7dmFyIGk9dC5jaGlsZHJlbigiLiIrdGhpcy5faW5saW5lQ2xhc3MpO2kuY2hpbGRyZW4oKS5hZGRDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKSxpLmZpbmQoInNlbGVjdC51aS1kYXRlcGlja2VyLW1vbnRoLCBzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFyIikucHJvcCgiZGlzYWJsZWQiLCEwKX10aGlzLl9kaXNhYmxlZElucHV0cz0kLm1hcCh0aGlzLl9kaXNhYmxlZElucHV0cyxmdW5jdGlvbih0KXtyZXR1cm4gdD09ZT9udWxsOnR9KSx0aGlzLl9kaXNhYmxlZElucHV0c1t0aGlzLl9kaXNhYmxlZElucHV0cy5sZW5ndGhdPWV9LF9pc0Rpc2FibGVkRGF0ZXBpY2tlcjpmdW5jdGlvbihlKXtpZighZSlyZXR1cm4hMTtmb3IodmFyIHQ9MDt0PHRoaXMuX2Rpc2FibGVkSW5wdXRzLmxlbmd0aDt0KyspaWYodGhpcy5fZGlzYWJsZWRJbnB1dHNbdF09PWUpcmV0dXJuITA7cmV0dXJuITF9LF9nZXRJbnN0OmZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4gJC5kYXRhKGUsUFJPUF9OQU1FKX1jYXRjaCh0KXt0aHJvdyJNaXNzaW5nIGluc3RhbmNlIGRhdGEgZm9yIHRoaXMgZGF0ZXBpY2tlciJ9fSxfb3B0aW9uRGF0ZXBpY2tlcjpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fZ2V0SW5zdChlKTtpZihhcmd1bWVudHMubGVuZ3RoPT0yJiZ0eXBlb2YgdD09InN0cmluZyIpcmV0dXJuIHQ9PSJkZWZhdWx0cyI/JC5leHRlbmQoe30sJC5kYXRlcGlja2VyLl9kZWZhdWx0cyk6cj90PT0iYWxsIj8kLmV4dGVuZCh7fSxyLnNldHRpbmdzKTp0aGlzLl9nZXQocix0KTpudWxsO3ZhciBpPXR8fHt9O3R5cGVvZiB0PT0ic3RyaW5nIiYmKGk9e30saVt0XT1uKTtpZihyKXt0aGlzLl9jdXJJbnN0PT1yJiZ0aGlzLl9oaWRlRGF0ZXBpY2tlcigpO3ZhciBzPXRoaXMuX2dldERhdGVEYXRlcGlja2VyKGUsITApLG89dGhpcy5fZ2V0TWluTWF4RGF0ZShyLCJtaW4iKSx1PXRoaXMuX2dldE1pbk1heERhdGUociwibWF4Iik7ZXh0ZW5kUmVtb3ZlKHIuc2V0dGluZ3MsaSksbyE9PW51bGwmJmkuZGF0ZUZvcm1hdCE9PXVuZGVmaW5lZCYmaS5taW5EYXRlPT09dW5kZWZpbmVkJiYoci5zZXR0aW5ncy5taW5EYXRlPXRoaXMuX2Zvcm1hdERhdGUocixvKSksdSE9PW51bGwmJmkuZGF0ZUZvcm1hdCE9PXVuZGVmaW5lZCYmaS5tYXhEYXRlPT09dW5kZWZpbmVkJiYoci5zZXR0aW5ncy5tYXhEYXRlPXRoaXMuX2Zvcm1hdERhdGUocix1KSksdGhpcy5fYXR0YWNobWVudHMoJChlKSxyKSx0aGlzLl9hdXRvU2l6ZShyKSx0aGlzLl9zZXREYXRlKHIscyksdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKHIpLHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIocil9fSxfY2hhbmdlRGF0ZXBpY2tlcjpmdW5jdGlvbihlLHQsbil7dGhpcy5fb3B0aW9uRGF0ZXBpY2tlcihlLHQsbil9LF9yZWZyZXNoRGF0ZXBpY2tlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRJbnN0KGUpO3QmJnRoaXMuX3VwZGF0ZURhdGVwaWNrZXIodCl9LF9zZXREYXRlRGF0ZXBpY2tlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2dldEluc3QoZSk7biYmKHRoaXMuX3NldERhdGUobix0KSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKG4pLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShuKSl9LF9nZXREYXRlRGF0ZXBpY2tlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2dldEluc3QoZSk7cmV0dXJuIG4mJiFuLmlubGluZSYmdGhpcy5fc2V0RGF0ZUZyb21GaWVsZChuLHQpLG4/dGhpcy5fZ2V0RGF0ZShuKTpudWxsfSxfZG9LZXlEb3duOmZ1bmN0aW9uKGUpe3ZhciB0PSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChlLnRhcmdldCksbj0hMCxyPXQuZHBEaXYuaXMoIi51aS1kYXRlcGlja2VyLXJ0bCIpO3QuX2tleUV2ZW50PSEwO2lmKCQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcpc3dpdGNoKGUua2V5Q29kZSl7Y2FzZSA5OiQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKSxuPSExO2JyZWFrO2Nhc2UgMTM6dmFyIGk9JCgidGQuIiskLmRhdGVwaWNrZXIuX2RheU92ZXJDbGFzcysiOm5vdCguIiskLmRhdGVwaWNrZXIuX2N1cnJlbnRDbGFzcysiKSIsdC5kcERpdik7aVswXSYmJC5kYXRlcGlja2VyLl9zZWxlY3REYXkoZS50YXJnZXQsdC5zZWxlY3RlZE1vbnRoLHQuc2VsZWN0ZWRZZWFyLGlbMF0pO3ZhciBzPSQuZGF0ZXBpY2tlci5fZ2V0KHQsIm9uU2VsZWN0Iik7aWYocyl7dmFyIG89JC5kYXRlcGlja2VyLl9mb3JtYXREYXRlKHQpO3MuYXBwbHkodC5pbnB1dD90LmlucHV0WzBdOm51bGwsW28sdF0pfWVsc2UgJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpO3JldHVybiExO2Nhc2UgMjc6JC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpO2JyZWFrO2Nhc2UgMzM6JC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGUudGFyZ2V0LGUuY3RybEtleT8tJC5kYXRlcGlja2VyLl9nZXQodCwic3RlcEJpZ01vbnRocyIpOi0kLmRhdGVwaWNrZXIuX2dldCh0LCJzdGVwTW9udGhzIiksIk0iKTticmVhaztjYXNlIDM0OiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShlLnRhcmdldCxlLmN0cmxLZXk/KyQuZGF0ZXBpY2tlci5fZ2V0KHQsInN0ZXBCaWdNb250aHMiKTorJC5kYXRlcGlja2VyLl9nZXQodCwic3RlcE1vbnRocyIpLCJNIik7YnJlYWs7Y2FzZSAzNTooZS5jdHJsS2V5fHxlLm1ldGFLZXkpJiYkLmRhdGVwaWNrZXIuX2NsZWFyRGF0ZShlLnRhcmdldCksbj1lLmN0cmxLZXl8fGUubWV0YUtleTticmVhaztjYXNlIDM2OihlLmN0cmxLZXl8fGUubWV0YUtleSkmJiQuZGF0ZXBpY2tlci5fZ290b1RvZGF5KGUudGFyZ2V0KSxuPWUuY3RybEtleXx8ZS5tZXRhS2V5O2JyZWFrO2Nhc2UgMzc6KGUuY3RybEtleXx8ZS5tZXRhS2V5KSYmJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGUudGFyZ2V0LHI/MTotMSwiRCIpLG49ZS5jdHJsS2V5fHxlLm1ldGFLZXksZS5vcmlnaW5hbEV2ZW50LmFsdEtleSYmJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGUudGFyZ2V0LGUuY3RybEtleT8tJC5kYXRlcGlja2VyLl9nZXQodCwic3RlcEJpZ01vbnRocyIpOi0kLmRhdGVwaWNrZXIuX2dldCh0LCJzdGVwTW9udGhzIiksIk0iKTticmVhaztjYXNlIDM4OihlLmN0cmxLZXl8fGUubWV0YUtleSkmJiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShlLnRhcmdldCwtNywiRCIpLG49ZS5jdHJsS2V5fHxlLm1ldGFLZXk7YnJlYWs7Y2FzZSAzOTooZS5jdHJsS2V5fHxlLm1ldGFLZXkpJiYkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZS50YXJnZXQscj8tMToxLCJEIiksbj1lLmN0cmxLZXl8fGUubWV0YUtleSxlLm9yaWdpbmFsRXZlbnQuYWx0S2V5JiYkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZS50YXJnZXQsZS5jdHJsS2V5PyskLmRhdGVwaWNrZXIuX2dldCh0LCJzdGVwQmlnTW9udGhzIik6KyQuZGF0ZXBpY2tlci5fZ2V0KHQsInN0ZXBNb250aHMiKSwiTSIpO2JyZWFrO2Nhc2UgNDA6KGUuY3RybEtleXx8ZS5tZXRhS2V5KSYmJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGUudGFyZ2V0LDcsIkQiKSxuPWUuY3RybEtleXx8ZS5tZXRhS2V5O2JyZWFrO2RlZmF1bHQ6bj0hMX1lbHNlIGUua2V5Q29kZT09MzYmJmUuY3RybEtleT8kLmRhdGVwaWNrZXIuX3Nob3dEYXRlcGlja2VyKHRoaXMpOm49ITE7biYmKGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpKX0sX2RvS2V5UHJlc3M6ZnVuY3Rpb24oZSl7dmFyIHQ9JC5kYXRlcGlja2VyLl9nZXRJbnN0KGUudGFyZ2V0KTtpZigkLmRhdGVwaWNrZXIuX2dldCh0LCJjb25zdHJhaW5JbnB1dCIpKXt2YXIgbj0kLmRhdGVwaWNrZXIuX3Bvc3NpYmxlQ2hhcnMoJC5kYXRlcGlja2VyLl9nZXQodCwiZGF0ZUZvcm1hdCIpKSxyPVN0cmluZy5mcm9tQ2hhckNvZGUoZS5jaGFyQ29kZT09dW5kZWZpbmVkP2Uua2V5Q29kZTplLmNoYXJDb2RlKTtyZXR1cm4gZS5jdHJsS2V5fHxlLm1ldGFLZXl8fHI8IiAifHwhbnx8bi5pbmRleE9mKHIpPi0xfX0sX2RvS2V5VXA6ZnVuY3Rpb24oZSl7dmFyIHQ9JC5kYXRlcGlja2VyLl9nZXRJbnN0KGUudGFyZ2V0KTtpZih0LmlucHV0LnZhbCgpIT10Lmxhc3RWYWwpdHJ5e3ZhciBuPSQuZGF0ZXBpY2tlci5wYXJzZURhdGUoJC5kYXRlcGlja2VyLl9nZXQodCwiZGF0ZUZvcm1hdCIpLHQuaW5wdXQ/dC5pbnB1dC52YWwoKTpudWxsLCQuZGF0ZXBpY2tlci5fZ2V0Rm9ybWF0Q29uZmlnKHQpKTtuJiYoJC5kYXRlcGlja2VyLl9zZXREYXRlRnJvbUZpZWxkKHQpLCQuZGF0ZXBpY2tlci5fdXBkYXRlQWx0ZXJuYXRlKHQpLCQuZGF0ZXBpY2tlci5fdXBkYXRlRGF0ZXBpY2tlcih0KSl9Y2F0Y2gocil7JC5kYXRlcGlja2VyLmxvZyhyKX1yZXR1cm4hMH0sX3Nob3dEYXRlcGlja2VyOmZ1bmN0aW9uKGUpe2U9ZS50YXJnZXR8fGUsZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT0iaW5wdXQiJiYoZT0kKCJpbnB1dCIsZS5wYXJlbnROb2RlKVswXSk7aWYoJC5kYXRlcGlja2VyLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcihlKXx8JC5kYXRlcGlja2VyLl9sYXN0SW5wdXQ9PWUpcmV0dXJuO3ZhciB0PSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChlKTskLmRhdGVwaWNrZXIuX2N1ckluc3QmJiQuZGF0ZXBpY2tlci5fY3VySW5zdCE9dCYmKCQuZGF0ZXBpY2tlci5fY3VySW5zdC5kcERpdi5zdG9wKCEwLCEwKSx0JiYkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiYkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCQuZGF0ZXBpY2tlci5fY3VySW5zdC5pbnB1dFswXSkpO3ZhciBuPSQuZGF0ZXBpY2tlci5fZ2V0KHQsImJlZm9yZVNob3ciKSxyPW4/bi5hcHBseShlLFtlLHRdKTp7fTtpZihyPT09ITEpcmV0dXJuO2V4dGVuZFJlbW92ZSh0LnNldHRpbmdzLHIpLHQubGFzdFZhbD1udWxsLCQuZGF0ZXBpY2tlci5fbGFzdElucHV0PWUsJC5kYXRlcGlja2VyLl9zZXREYXRlRnJvbUZpZWxkKHQpLCQuZGF0ZXBpY2tlci5faW5EaWFsb2cmJihlLnZhbHVlPSIiKSwkLmRhdGVwaWNrZXIuX3Bvc3x8KCQuZGF0ZXBpY2tlci5fcG9zPSQuZGF0ZXBpY2tlci5fZmluZFBvcyhlKSwkLmRhdGVwaWNrZXIuX3Bvc1sxXSs9ZS5vZmZzZXRIZWlnaHQpO3ZhciBpPSExOyQoZSkucGFyZW50cygpLmVhY2goZnVuY3Rpb24oKXtyZXR1cm4gaXw9JCh0aGlzKS5jc3MoInBvc2l0aW9uIik9PSJmaXhlZCIsIWl9KTt2YXIgcz17bGVmdDokLmRhdGVwaWNrZXIuX3Bvc1swXSx0b3A6JC5kYXRlcGlja2VyLl9wb3NbMV19OyQuZGF0ZXBpY2tlci5fcG9zPW51bGwsdC5kcERpdi5lbXB0eSgpLHQuZHBEaXYuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6ImJsb2NrIix0b3A6Ii0xMDAwcHgifSksJC5kYXRlcGlja2VyLl91cGRhdGVEYXRlcGlja2VyKHQpLHM9JC5kYXRlcGlja2VyLl9jaGVja09mZnNldCh0LHMsaSksdC5kcERpdi5jc3Moe3Bvc2l0aW9uOiQuZGF0ZXBpY2tlci5faW5EaWFsb2cmJiQuYmxvY2tVST8ic3RhdGljIjppPyJmaXhlZCI6ImFic29sdXRlIixkaXNwbGF5OiJub25lIixsZWZ0OnMubGVmdCsicHgiLHRvcDpzLnRvcCsicHgifSk7aWYoIXQuaW5saW5lKXt2YXIgbz0kLmRhdGVwaWNrZXIuX2dldCh0LCJzaG93QW5pbSIpLHU9JC5kYXRlcGlja2VyLl9nZXQodCwiZHVyYXRpb24iKSxhPWZ1bmN0aW9uKCl7dmFyIGU9dC5kcERpdi5maW5kKCJpZnJhbWUudWktZGF0ZXBpY2tlci1jb3ZlciIpO2lmKCEhZS5sZW5ndGgpe3ZhciBuPSQuZGF0ZXBpY2tlci5fZ2V0Qm9yZGVycyh0LmRwRGl2KTtlLmNzcyh7bGVmdDotblswXSx0b3A6LW5bMV0sd2lkdGg6dC5kcERpdi5vdXRlcldpZHRoKCksaGVpZ2h0OnQuZHBEaXYub3V0ZXJIZWlnaHQoKX0pfX07dC5kcERpdi56SW5kZXgoJChlKS56SW5kZXgoKSsxKSwkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nPSEwLCQuZWZmZWN0cyYmKCQuZWZmZWN0cy5lZmZlY3Rbb118fCQuZWZmZWN0c1tvXSk/dC5kcERpdi5zaG93KG8sJC5kYXRlcGlja2VyLl9nZXQodCwic2hvd09wdGlvbnMiKSx1LGEpOnQuZHBEaXZbb3x8InNob3ciXShvP3U6bnVsbCxhKSwoIW98fCF1KSYmYSgpLHQuaW5wdXQuaXMoIjp2aXNpYmxlIikmJiF0LmlucHV0LmlzKCI6ZGlzYWJsZWQiKSYmdC5pbnB1dC5mb2N1cygpLCQuZGF0ZXBpY2tlci5fY3VySW5zdD10fX0sX3VwZGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24oZSl7dGhpcy5tYXhSb3dzPTQ7dmFyIHQ9JC5kYXRlcGlja2VyLl9nZXRCb3JkZXJzKGUuZHBEaXYpO2luc3RBY3RpdmU9ZSxlLmRwRGl2LmVtcHR5KCkuYXBwZW5kKHRoaXMuX2dlbmVyYXRlSFRNTChlKSksdGhpcy5fYXR0YWNoSGFuZGxlcnMoZSk7dmFyIG49ZS5kcERpdi5maW5kKCJpZnJhbWUudWktZGF0ZXBpY2tlci1jb3ZlciIpOyFuLmxlbmd0aHx8bi5jc3Moe2xlZnQ6LXRbMF0sdG9wOi10WzFdLHdpZHRoOmUuZHBEaXYub3V0ZXJXaWR0aCgpLGhlaWdodDplLmRwRGl2Lm91dGVySGVpZ2h0KCl9KSxlLmRwRGl2LmZpbmQoIi4iK3RoaXMuX2RheU92ZXJDbGFzcysiIGEiKS5tb3VzZW92ZXIoKTt2YXIgcj10aGlzLl9nZXROdW1iZXJPZk1vbnRocyhlKSxpPXJbMV0scz0xNztlLmRwRGl2LnJlbW92ZUNsYXNzKCJ1aS1kYXRlcGlja2VyLW11bHRpLTIgdWktZGF0ZXBpY2tlci1tdWx0aS0zIHVpLWRhdGVwaWNrZXItbXVsdGktNCIpLndpZHRoKCIiKSxpPjEmJmUuZHBEaXYuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItbXVsdGktIitpKS5jc3MoIndpZHRoIixzKmkrImVtIiksZS5kcERpdlsoclswXSE9MXx8clsxXSE9MT8iYWRkIjoicmVtb3ZlIikrIkNsYXNzIl0oInVpLWRhdGVwaWNrZXItbXVsdGkiKSxlLmRwRGl2Wyh0aGlzLl9nZXQoZSwiaXNSVEwiKT8iYWRkIjoicmVtb3ZlIikrIkNsYXNzIl0oInVpLWRhdGVwaWNrZXItcnRsIiksZT09JC5kYXRlcGlja2VyLl9jdXJJbnN0JiYkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiZlLmlucHV0JiZlLmlucHV0LmlzKCI6dmlzaWJsZSIpJiYhZS5pbnB1dC5pcygiOmRpc2FibGVkIikmJmUuaW5wdXRbMF0hPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQmJmUuaW5wdXQuZm9jdXMoKTtpZihlLnllYXJzaHRtbCl7dmFyIG89ZS55ZWFyc2h0bWw7c2V0VGltZW91dChmdW5jdGlvbigpe289PT1lLnllYXJzaHRtbCYmZS55ZWFyc2h0bWwmJmUuZHBEaXYuZmluZCgic2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhcjpmaXJzdCIpLnJlcGxhY2VXaXRoKGUueWVhcnNodG1sKSxvPWUueWVhcnNodG1sPW51bGx9LDApfX0sX2dldEJvcmRlcnM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZnVuY3Rpb24oZSl7cmV0dXJue3RoaW46MSxtZWRpdW06Mix0aGljazozfVtlXXx8ZX07cmV0dXJuW3BhcnNlRmxvYXQodChlLmNzcygiYm9yZGVyLWxlZnQtd2lkdGgiKSkpLHBhcnNlRmxvYXQodChlLmNzcygiYm9yZGVyLXRvcC13aWR0aCIpKSldfSxfY2hlY2tPZmZzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuZHBEaXYub3V0ZXJXaWR0aCgpLGk9ZS5kcERpdi5vdXRlckhlaWdodCgpLHM9ZS5pbnB1dD9lLmlucHV0Lm91dGVyV2lkdGgoKTowLG89ZS5pbnB1dD9lLmlucHV0Lm91dGVySGVpZ2h0KCk6MCx1PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCsobj8wOiQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSksYT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KyhuPzA6JChkb2N1bWVudCkuc2Nyb2xsVG9wKCkpO3JldHVybiB0LmxlZnQtPXRoaXMuX2dldChlLCJpc1JUTCIpP3ItczowLHQubGVmdC09biYmdC5sZWZ0PT1lLmlucHV0Lm9mZnNldCgpLmxlZnQ/JChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpOjAsdC50b3AtPW4mJnQudG9wPT1lLmlucHV0Lm9mZnNldCgpLnRvcCtvPyQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpOjAsdC5sZWZ0LT1NYXRoLm1pbih0LmxlZnQsdC5sZWZ0K3I+dSYmdT5yP01hdGguYWJzKHQubGVmdCtyLXUpOjApLHQudG9wLT1NYXRoLm1pbih0LnRvcCx0LnRvcCtpPmEmJmE+aT9NYXRoLmFicyhpK28pOjApLHR9LF9maW5kUG9zOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldEluc3QoZSksbj10aGlzLl9nZXQodCwiaXNSVEwiKTt3aGlsZShlJiYoZS50eXBlPT0iaGlkZGVuInx8ZS5ub2RlVHlwZSE9MXx8JC5leHByLmZpbHRlcnMuaGlkZGVuKGUpKSllPWVbbj8icHJldmlvdXNTaWJsaW5nIjoibmV4dFNpYmxpbmciXTt2YXIgcj0kKGUpLm9mZnNldCgpO3JldHVybltyLmxlZnQsci50b3BdfSxfaGlkZURhdGVwaWNrZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fY3VySW5zdDtpZighdHx8ZSYmdCE9JC5kYXRhKGUsUFJPUF9OQU1FKSlyZXR1cm47aWYodGhpcy5fZGF0ZXBpY2tlclNob3dpbmcpe3ZhciBuPXRoaXMuX2dldCh0LCJzaG93QW5pbSIpLHI9dGhpcy5fZ2V0KHQsImR1cmF0aW9uIiksaT1mdW5jdGlvbigpeyQuZGF0ZXBpY2tlci5fdGlkeURpYWxvZyh0KX07JC5lZmZlY3RzJiYoJC5lZmZlY3RzLmVmZmVjdFtuXXx8JC5lZmZlY3RzW25dKT90LmRwRGl2LmhpZGUobiwkLmRhdGVwaWNrZXIuX2dldCh0LCJzaG93T3B0aW9ucyIpLHIsaSk6dC5kcERpdltuPT0ic2xpZGVEb3duIj8ic2xpZGVVcCI6bj09ImZhZGVJbiI/ImZhZGVPdXQiOiJoaWRlIl0obj9yOm51bGwsaSksbnx8aSgpLHRoaXMuX2RhdGVwaWNrZXJTaG93aW5nPSExO3ZhciBzPXRoaXMuX2dldCh0LCJvbkNsb3NlIik7cyYmcy5hcHBseSh0LmlucHV0P3QuaW5wdXRbMF06bnVsbCxbdC5pbnB1dD90LmlucHV0LnZhbCgpOiIiLHRdKSx0aGlzLl9sYXN0SW5wdXQ9bnVsbCx0aGlzLl9pbkRpYWxvZyYmKHRoaXMuX2RpYWxvZ0lucHV0LmNzcyh7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OiIwIix0b3A6Ii0xMDBweCJ9KSwkLmJsb2NrVUkmJigkLnVuYmxvY2tVSSgpLCQoImJvZHkiKS5hcHBlbmQodGhpcy5kcERpdikpKSx0aGlzLl9pbkRpYWxvZz0hMX19LF90aWR5RGlhbG9nOmZ1bmN0aW9uKGUpe2UuZHBEaXYucmVtb3ZlQ2xhc3ModGhpcy5fZGlhbG9nQ2xhc3MpLnVuYmluZCgiLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIiKX0sX2NoZWNrRXh0ZXJuYWxDbGljazpmdW5jdGlvbihlKXtpZighJC5kYXRlcGlja2VyLl9jdXJJbnN0KXJldHVybjt2YXIgdD0kKGUudGFyZ2V0KSxuPSQuZGF0ZXBpY2tlci5fZ2V0SW5zdCh0WzBdKTsodFswXS5pZCE9JC5kYXRlcGlja2VyLl9tYWluRGl2SWQmJnQucGFyZW50cygiIyIrJC5kYXRlcGlja2VyLl9tYWluRGl2SWQpLmxlbmd0aD09MCYmIXQuaGFzQ2xhc3MoJC5kYXRlcGlja2VyLm1hcmtlckNsYXNzTmFtZSkmJiF0LmNsb3Nlc3QoIi4iKyQuZGF0ZXBpY2tlci5fdHJpZ2dlckNsYXNzKS5sZW5ndGgmJiQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJighJC5kYXRlcGlja2VyLl9pbkRpYWxvZ3x8ISQuYmxvY2tVSSl8fHQuaGFzQ2xhc3MoJC5kYXRlcGlja2VyLm1hcmtlckNsYXNzTmFtZSkmJiQuZGF0ZXBpY2tlci5fY3VySW5zdCE9bikmJiQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKX0sX2FkanVzdERhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPSQoZSksaT10aGlzLl9nZXRJbnN0KHJbMF0pO2lmKHRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKHJbMF0pKXJldHVybjt0aGlzLl9hZGp1c3RJbnN0RGF0ZShpLHQrKG49PSJNIj90aGlzLl9nZXQoaSwic2hvd0N1cnJlbnRBdFBvcyIpOjApLG4pLHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoaSl9LF9nb3RvVG9kYXk6ZnVuY3Rpb24oZSl7dmFyIHQ9JChlKSxuPXRoaXMuX2dldEluc3QodFswXSk7aWYodGhpcy5fZ2V0KG4sImdvdG9DdXJyZW50IikmJm4uY3VycmVudERheSluLnNlbGVjdGVkRGF5PW4uY3VycmVudERheSxuLmRyYXdNb250aD1uLnNlbGVjdGVkTW9udGg9bi5jdXJyZW50TW9udGgsbi5kcmF3WWVhcj1uLnNlbGVjdGVkWWVhcj1uLmN1cnJlbnRZZWFyO2Vsc2V7dmFyIHI9bmV3IERhdGU7bi5zZWxlY3RlZERheT1yLmdldERhdGUoKSxuLmRyYXdNb250aD1uLnNlbGVjdGVkTW9udGg9ci5nZXRNb250aCgpLG4uZHJhd1llYXI9bi5zZWxlY3RlZFllYXI9ci5nZXRGdWxsWWVhcigpfXRoaXMuX25vdGlmeUNoYW5nZShuKSx0aGlzLl9hZGp1c3REYXRlKHQpfSxfc2VsZWN0TW9udGhZZWFyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0kKGUpLGk9dGhpcy5fZ2V0SW5zdChyWzBdKTtpWyJzZWxlY3RlZCIrKG49PSJNIj8iTW9udGgiOiJZZWFyIildPWlbImRyYXciKyhuPT0iTSI/Ik1vbnRoIjoiWWVhciIpXT1wYXJzZUludCh0Lm9wdGlvbnNbdC5zZWxlY3RlZEluZGV4XS52YWx1ZSwxMCksdGhpcy5fbm90aWZ5Q2hhbmdlKGkpLHRoaXMuX2FkanVzdERhdGUocil9LF9zZWxlY3REYXk6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9JChlKTtpZigkKHIpLmhhc0NsYXNzKHRoaXMuX3Vuc2VsZWN0YWJsZUNsYXNzKXx8dGhpcy5faXNEaXNhYmxlZERhdGVwaWNrZXIoaVswXSkpcmV0dXJuO3ZhciBzPXRoaXMuX2dldEluc3QoaVswXSk7cy5zZWxlY3RlZERheT1zLmN1cnJlbnREYXk9JCgiYSIscikuaHRtbCgpLHMuc2VsZWN0ZWRNb250aD1zLmN1cnJlbnRNb250aD10LHMuc2VsZWN0ZWRZZWFyPXMuY3VycmVudFllYXI9bix0aGlzLl9zZWxlY3REYXRlKGUsdGhpcy5fZm9ybWF0RGF0ZShzLHMuY3VycmVudERheSxzLmN1cnJlbnRNb250aCxzLmN1cnJlbnRZZWFyKSl9LF9jbGVhckRhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9JChlKSxuPXRoaXMuX2dldEluc3QodFswXSk7dGhpcy5fc2VsZWN0RGF0ZSh0LCIiKX0sX3NlbGVjdERhdGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj0kKGUpLHI9dGhpcy5fZ2V0SW5zdChuWzBdKTt0PXQhPW51bGw/dDp0aGlzLl9mb3JtYXREYXRlKHIpLHIuaW5wdXQmJnIuaW5wdXQudmFsKHQpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShyKTt2YXIgaT10aGlzLl9nZXQociwib25TZWxlY3QiKTtpP2kuYXBwbHkoci5pbnB1dD9yLmlucHV0WzBdOm51bGwsW3Qscl0pOnIuaW5wdXQmJnIuaW5wdXQudHJpZ2dlcigiY2hhbmdlIiksci5pbmxpbmU/dGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihyKToodGhpcy5faGlkZURhdGVwaWNrZXIoKSx0aGlzLl9sYXN0SW5wdXQ9ci5pbnB1dFswXSx0eXBlb2Ygci5pbnB1dFswXSE9Im9iamVjdCImJnIuaW5wdXQuZm9jdXMoKSx0aGlzLl9sYXN0SW5wdXQ9bnVsbCl9LF91cGRhdGVBbHRlcm5hdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0KGUsImFsdEZpZWxkIik7aWYodCl7dmFyIG49dGhpcy5fZ2V0KGUsImFsdEZvcm1hdCIpfHx0aGlzLl9nZXQoZSwiZGF0ZUZvcm1hdCIpLHI9dGhpcy5fZ2V0RGF0ZShlKSxpPXRoaXMuZm9ybWF0RGF0ZShuLHIsdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGUpKTskKHQpLmVhY2goZnVuY3Rpb24oKXskKHRoaXMpLnZhbChpKX0pfX0sbm9XZWVrZW5kczpmdW5jdGlvbihlKXt2YXIgdD1lLmdldERheSgpO3JldHVyblt0PjAmJnQ8NiwiIl19LGlzbzg2MDFXZWVrOmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBEYXRlKGUuZ2V0VGltZSgpKTt0LnNldERhdGUodC5nZXREYXRlKCkrNC0odC5nZXREYXkoKXx8NykpO3ZhciBuPXQuZ2V0VGltZSgpO3JldHVybiB0LnNldE1vbnRoKDApLHQuc2V0RGF0ZSgxKSxNYXRoLmZsb29yKE1hdGgucm91bmQoKG4tdCkvODY0ZTUpLzcpKzF9LHBhcnNlRGF0ZTpmdW5jdGlvbihlLHQsbil7aWYoZT09bnVsbHx8dD09bnVsbCl0aHJvdyJJbnZhbGlkIGFyZ3VtZW50cyI7dD10eXBlb2YgdD09Im9iamVjdCI/dC50b1N0cmluZygpOnQrIiI7aWYodD09IiIpcmV0dXJuIG51bGw7dmFyIHI9KG4/bi5zaG9ydFllYXJDdXRvZmY6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLnNob3J0WWVhckN1dG9mZjtyPXR5cGVvZiByIT0ic3RyaW5nIj9yOihuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSUxMDArcGFyc2VJbnQociwxMCk7dmFyIGk9KG4/bi5kYXlOYW1lc1Nob3J0Om51bGwpfHx0aGlzLl9kZWZhdWx0cy5kYXlOYW1lc1Nob3J0LHM9KG4/bi5kYXlOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXMsbz0obj9uLm1vbnRoTmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lc1Nob3J0LHU9KG4/bi5tb250aE5hbWVzOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzLGE9LTEsZj0tMSxsPS0xLGM9LTEsaD0hMSxwPWZ1bmN0aW9uKHQpe3ZhciBuPXkrMTxlLmxlbmd0aCYmZS5jaGFyQXQoeSsxKT09dDtyZXR1cm4gbiYmeSsrLG59LGQ9ZnVuY3Rpb24oZSl7dmFyIG49cChlKSxyPWU9PSJAIj8xNDplPT0iISI/MjA6ZT09InkiJiZuPzQ6ZT09Im8iPzM6MixpPW5ldyBSZWdFeHAoIl5cXGR7MSwiK3IrIn0iKSxzPXQuc3Vic3RyaW5nKGcpLm1hdGNoKGkpO2lmKCFzKXRocm93Ik1pc3NpbmcgbnVtYmVyIGF0IHBvc2l0aW9uICIrZztyZXR1cm4gZys9c1swXS5sZW5ndGgscGFyc2VJbnQoc1swXSwxMCl9LHY9ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPSQubWFwKHAoZSk/cjpuLGZ1bmN0aW9uKGUsdCl7cmV0dXJuW1t0LGVdXX0pLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4tKGVbMV0ubGVuZ3RoLXRbMV0ubGVuZ3RoKX0pLHM9LTE7JC5lYWNoKGksZnVuY3Rpb24oZSxuKXt2YXIgcj1uWzFdO2lmKHQuc3Vic3RyKGcsci5sZW5ndGgpLnRvTG93ZXJDYXNlKCk9PXIudG9Mb3dlckNhc2UoKSlyZXR1cm4gcz1uWzBdLGcrPXIubGVuZ3RoLCExfSk7aWYocyE9LTEpcmV0dXJuIHMrMTt0aHJvdyJVbmtub3duIG5hbWUgYXQgcG9zaXRpb24gIitnfSxtPWZ1bmN0aW9uKCl7aWYodC5jaGFyQXQoZykhPWUuY2hhckF0KHkpKXRocm93IlVuZXhwZWN0ZWQgbGl0ZXJhbCBhdCBwb3NpdGlvbiAiK2c7ZysrfSxnPTA7Zm9yKHZhciB5PTA7eTxlLmxlbmd0aDt5KyspaWYoaCllLmNoYXJBdCh5KT09IiciJiYhcCgiJyIpP2g9ITE6bSgpO2Vsc2Ugc3dpdGNoKGUuY2hhckF0KHkpKXtjYXNlImQiOmw9ZCgiZCIpO2JyZWFrO2Nhc2UiRCI6digiRCIsaSxzKTticmVhaztjYXNlIm8iOmM9ZCgibyIpO2JyZWFrO2Nhc2UibSI6Zj1kKCJtIik7YnJlYWs7Y2FzZSJNIjpmPXYoIk0iLG8sdSk7YnJlYWs7Y2FzZSJ5IjphPWQoInkiKTticmVhaztjYXNlIkAiOnZhciBiPW5ldyBEYXRlKGQoIkAiKSk7YT1iLmdldEZ1bGxZZWFyKCksZj1iLmdldE1vbnRoKCkrMSxsPWIuZ2V0RGF0ZSgpO2JyZWFrO2Nhc2UiISI6dmFyIGI9bmV3IERhdGUoKGQoIiEiKS10aGlzLl90aWNrc1RvMTk3MCkvMWU0KTthPWIuZ2V0RnVsbFllYXIoKSxmPWIuZ2V0TW9udGgoKSsxLGw9Yi5nZXREYXRlKCk7YnJlYWs7Y2FzZSInIjpwKCInIik/bSgpOmg9ITA7YnJlYWs7ZGVmYXVsdDptKCl9aWYoZzx0Lmxlbmd0aCl7dmFyIHc9dC5zdWJzdHIoZyk7aWYoIS9eXHMrLy50ZXN0KHcpKXRocm93IkV4dHJhL3VucGFyc2VkIGNoYXJhY3RlcnMgZm91bmQgaW4gZGF0ZTogIit3fWE9PS0xP2E9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpOmE8MTAwJiYoYSs9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSUxMDArKGE8PXI/MDotMTAwKSk7aWYoYz4tMSl7Zj0xLGw9Yztkb3t2YXIgRT10aGlzLl9nZXREYXlzSW5Nb250aChhLGYtMSk7aWYobDw9RSlicmVhaztmKyssbC09RX13aGlsZSghMCl9dmFyIGI9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoYSxmLTEsbCkpO2lmKGIuZ2V0RnVsbFllYXIoKSE9YXx8Yi5nZXRNb250aCgpKzEhPWZ8fGIuZ2V0RGF0ZSgpIT1sKXRocm93IkludmFsaWQgZGF0ZSI7cmV0dXJuIGJ9LEFUT006Inl5LW1tLWRkIixDT09LSUU6IkQsIGRkIE0geXkiLElTT184NjAxOiJ5eS1tbS1kZCIsUkZDXzgyMjoiRCwgZCBNIHkiLFJGQ184NTA6IkRELCBkZC1NLXkiLFJGQ18xMDM2OiJELCBkIE0geSIsUkZDXzExMjM6IkQsIGQgTSB5eSIsUkZDXzI4MjI6IkQsIGQgTSB5eSIsUlNTOiJELCBkIE0geSIsVElDS1M6IiEiLFRJTUVTVEFNUDoiQCIsVzNDOiJ5eS1tbS1kZCIsX3RpY2tzVG8xOTcwOig3MTg2ODUrTWF0aC5mbG9vcig0OTIuNSktTWF0aC5mbG9vcigxOS43KStNYXRoLmZsb29yKDQuOTI1KSkqMjQqNjAqNjAqMWU3LGZvcm1hdERhdGU6ZnVuY3Rpb24oZSx0LG4pe2lmKCF0KXJldHVybiIiO3ZhciByPShuP24uZGF5TmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXNTaG9ydCxpPShuP24uZGF5TmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzLHM9KG4/bi5tb250aE5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXNTaG9ydCxvPShuP24ubW9udGhOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lcyx1PWZ1bmN0aW9uKHQpe3ZhciBuPWgrMTxlLmxlbmd0aCYmZS5jaGFyQXQoaCsxKT09dDtyZXR1cm4gbiYmaCsrLG59LGE9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPSIiK3Q7aWYodShlKSl3aGlsZShyLmxlbmd0aDxuKXI9IjAiK3I7cmV0dXJuIHJ9LGY9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHUoZSk/clt0XTpuW3RdfSxsPSIiLGM9ITE7aWYodClmb3IodmFyIGg9MDtoPGUubGVuZ3RoO2grKylpZihjKWUuY2hhckF0KGgpPT0iJyImJiF1KCInIik/Yz0hMTpsKz1lLmNoYXJBdChoKTtlbHNlIHN3aXRjaChlLmNoYXJBdChoKSl7Y2FzZSJkIjpsKz1hKCJkIix0LmdldERhdGUoKSwyKTticmVhaztjYXNlIkQiOmwrPWYoIkQiLHQuZ2V0RGF5KCkscixpKTticmVhaztjYXNlIm8iOmwrPWEoIm8iLE1hdGgucm91bmQoKChuZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksdC5nZXRNb250aCgpLHQuZ2V0RGF0ZSgpKSkuZ2V0VGltZSgpLShuZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksMCwwKSkuZ2V0VGltZSgpKS84NjRlNSksMyk7YnJlYWs7Y2FzZSJtIjpsKz1hKCJtIix0LmdldE1vbnRoKCkrMSwyKTticmVhaztjYXNlIk0iOmwrPWYoIk0iLHQuZ2V0TW9udGgoKSxzLG8pO2JyZWFrO2Nhc2UieSI6bCs9dSgieSIpP3QuZ2V0RnVsbFllYXIoKToodC5nZXRZZWFyKCklMTAwPDEwPyIwIjoiIikrdC5nZXRZZWFyKCklMTAwO2JyZWFrO2Nhc2UiQCI6bCs9dC5nZXRUaW1lKCk7YnJlYWs7Y2FzZSIhIjpsKz10LmdldFRpbWUoKSoxZTQrdGhpcy5fdGlja3NUbzE5NzA7YnJlYWs7Y2FzZSInIjp1KCInIik/bCs9IiciOmM9ITA7YnJlYWs7ZGVmYXVsdDpsKz1lLmNoYXJBdChoKX1yZXR1cm4gbH0sX3Bvc3NpYmxlQ2hhcnM6ZnVuY3Rpb24oZSl7dmFyIHQ9IiIsbj0hMSxyPWZ1bmN0aW9uKHQpe3ZhciBuPWkrMTxlLmxlbmd0aCYmZS5jaGFyQXQoaSsxKT09dDtyZXR1cm4gbiYmaSsrLG59O2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKWlmKG4pZS5jaGFyQXQoaSk9PSInIiYmIXIoIiciKT9uPSExOnQrPWUuY2hhckF0KGkpO2Vsc2Ugc3dpdGNoKGUuY2hhckF0KGkpKXtjYXNlImQiOmNhc2UibSI6Y2FzZSJ5IjpjYXNlIkAiOnQrPSIwMTIzNDU2Nzg5IjticmVhaztjYXNlIkQiOmNhc2UiTSI6cmV0dXJuIG51bGw7Y2FzZSInIjpyKCInIik/dCs9IiciOm49ITA7YnJlYWs7ZGVmYXVsdDp0Kz1lLmNoYXJBdChpKX1yZXR1cm4gdH0sX2dldDpmdW5jdGlvbihlLHQpe3JldHVybiBlLnNldHRpbmdzW3RdIT09dW5kZWZpbmVkP2Uuc2V0dGluZ3NbdF06dGhpcy5fZGVmYXVsdHNbdF19LF9zZXREYXRlRnJvbUZpZWxkOmZ1bmN0aW9uKGUsdCl7aWYoZS5pbnB1dC52YWwoKT09ZS5sYXN0VmFsKXJldHVybjt2YXIgbj10aGlzLl9nZXQoZSwiZGF0ZUZvcm1hdCIpLHI9ZS5sYXN0VmFsPWUuaW5wdXQ/ZS5pbnB1dC52YWwoKTpudWxsLGkscztpPXM9dGhpcy5fZ2V0RGVmYXVsdERhdGUoZSk7dmFyIG89dGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGUpO3RyeXtpPXRoaXMucGFyc2VEYXRlKG4scixvKXx8c31jYXRjaCh1KXt0aGlzLmxvZyh1KSxyPXQ/IiI6cn1lLnNlbGVjdGVkRGF5PWkuZ2V0RGF0ZSgpLGUuZHJhd01vbnRoPWUuc2VsZWN0ZWRNb250aD1pLmdldE1vbnRoKCksZS5kcmF3WWVhcj1lLnNlbGVjdGVkWWVhcj1pLmdldEZ1bGxZZWFyKCksZS5jdXJyZW50RGF5PXI/aS5nZXREYXRlKCk6MCxlLmN1cnJlbnRNb250aD1yP2kuZ2V0TW9udGgoKTowLGUuY3VycmVudFllYXI9cj9pLmdldEZ1bGxZZWFyKCk6MCx0aGlzLl9hZGp1c3RJbnN0RGF0ZShlKX0sX2dldERlZmF1bHREYXRlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9yZXN0cmljdE1pbk1heChlLHRoaXMuX2RldGVybWluZURhdGUoZSx0aGlzLl9nZXQoZSwiZGVmYXVsdERhdGUiKSxuZXcgRGF0ZSkpfSxfZGV0ZXJtaW5lRGF0ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IERhdGU7cmV0dXJuIHQuc2V0RGF0ZSh0LmdldERhdGUoKStlKSx0fSxpPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gJC5kYXRlcGlja2VyLnBhcnNlRGF0ZSgkLmRhdGVwaWNrZXIuX2dldChlLCJkYXRlRm9ybWF0IiksdCwkLmRhdGVwaWNrZXIuX2dldEZvcm1hdENvbmZpZyhlKSl9Y2F0Y2gobil7fXZhciByPSh0LnRvTG93ZXJDYXNlKCkubWF0Y2goL15jLyk/JC5kYXRlcGlja2VyLl9nZXREYXRlKGUpOm51bGwpfHxuZXcgRGF0ZSxpPXIuZ2V0RnVsbFllYXIoKSxzPXIuZ2V0TW9udGgoKSxvPXIuZ2V0RGF0ZSgpLHU9LyhbKy1dP1swLTldKylccyooZHxEfHd8V3xtfE18eXxZKT8vZyxhPXUuZXhlYyh0KTt3aGlsZShhKXtzd2l0Y2goYVsyXXx8ImQiKXtjYXNlImQiOmNhc2UiRCI6bys9cGFyc2VJbnQoYVsxXSwxMCk7YnJlYWs7Y2FzZSJ3IjpjYXNlIlciOm8rPXBhcnNlSW50KGFbMV0sMTApKjc7YnJlYWs7Y2FzZSJtIjpjYXNlIk0iOnMrPXBhcnNlSW50KGFbMV0sMTApLG89TWF0aC5taW4obywkLmRhdGVwaWNrZXIuX2dldERheXNJbk1vbnRoKGkscykpO2JyZWFrO2Nhc2UieSI6Y2FzZSJZIjppKz1wYXJzZUludChhWzFdLDEwKSxvPU1hdGgubWluKG8sJC5kYXRlcGlja2VyLl9nZXREYXlzSW5Nb250aChpLHMpKX1hPXUuZXhlYyh0KX1yZXR1cm4gbmV3IERhdGUoaSxzLG8pfSxzPXQ9PW51bGx8fHQ9PT0iIj9uOnR5cGVvZiB0PT0ic3RyaW5nIj9pKHQpOnR5cGVvZiB0PT0ibnVtYmVyIj9pc05hTih0KT9uOnIodCk6bmV3IERhdGUodC5nZXRUaW1lKCkpO3JldHVybiBzPXMmJnMudG9TdHJpbmcoKT09IkludmFsaWQgRGF0ZSI/bjpzLHMmJihzLnNldEhvdXJzKDApLHMuc2V0TWludXRlcygwKSxzLnNldFNlY29uZHMoMCkscy5zZXRNaWxsaXNlY29uZHMoMCkpLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KHMpfSxfZGF5bGlnaHRTYXZpbmdBZGp1c3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/KGUuc2V0SG91cnMoZS5nZXRIb3VycygpPjEyP2UuZ2V0SG91cnMoKSsyOjApLGUpOm51bGx9LF9zZXREYXRlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0hdCxpPWUuc2VsZWN0ZWRNb250aCxzPWUuc2VsZWN0ZWRZZWFyLG89dGhpcy5fcmVzdHJpY3RNaW5NYXgoZSx0aGlzLl9kZXRlcm1pbmVEYXRlKGUsdCxuZXcgRGF0ZSkpO2Uuc2VsZWN0ZWREYXk9ZS5jdXJyZW50RGF5PW8uZ2V0RGF0ZSgpLGUuZHJhd01vbnRoPWUuc2VsZWN0ZWRNb250aD1lLmN1cnJlbnRNb250aD1vLmdldE1vbnRoKCksZS5kcmF3WWVhcj1lLnNlbGVjdGVkWWVhcj1lLmN1cnJlbnRZZWFyPW8uZ2V0RnVsbFllYXIoKSwoaSE9ZS5zZWxlY3RlZE1vbnRofHxzIT1lLnNlbGVjdGVkWWVhcikmJiFuJiZ0aGlzLl9ub3RpZnlDaGFuZ2UoZSksdGhpcy5fYWRqdXN0SW5zdERhdGUoZSksZS5pbnB1dCYmZS5pbnB1dC52YWwocj8iIjp0aGlzLl9mb3JtYXREYXRlKGUpKX0sX2dldERhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9IWUuY3VycmVudFllYXJ8fGUuaW5wdXQmJmUuaW5wdXQudmFsKCk9PSIiP251bGw6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZS5jdXJyZW50WWVhcixlLmN1cnJlbnRNb250aCxlLmN1cnJlbnREYXkpKTtyZXR1cm4gdH0sX2F0dGFjaEhhbmRsZXJzOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldChlLCJzdGVwTW9udGhzIiksbj0iIyIrZS5pZC5yZXBsYWNlKC9cXFxcL2csIlxcIik7ZS5kcERpdi5maW5kKCJbZGF0YS1oYW5kbGVyXSIpLm1hcChmdW5jdGlvbigpe3ZhciBlPXtwcmV2OmZ1bmN0aW9uKCl7d2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX2FkanVzdERhdGUobiwtdCwiTSIpfSxuZXh0OmZ1bmN0aW9uKCl7d2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX2FkanVzdERhdGUobiwrdCwiTSIpfSxoaWRlOmZ1bmN0aW9uKCl7d2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCl9LHRvZGF5OmZ1bmN0aW9uKCl7d2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX2dvdG9Ub2RheShuKX0sc2VsZWN0RGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvd1siRFBfalF1ZXJ5XyIrZHB1dWlkXS5kYXRlcGlja2VyLl9zZWxlY3REYXkobiwrdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtbW9udGgiKSwrdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEteWVhciIpLHRoaXMpLCExfSxzZWxlY3RNb250aDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3dbIkRQX2pRdWVyeV8iK2RwdXVpZF0uZGF0ZXBpY2tlci5fc2VsZWN0TW9udGhZZWFyKG4sdGhpcywiTSIpLCExfSxzZWxlY3RZZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvd1siRFBfalF1ZXJ5XyIrZHB1dWlkXS5kYXRlcGlja2VyLl9zZWxlY3RNb250aFllYXIobix0aGlzLCJZIiksITF9fTskKHRoaXMpLmJpbmQodGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtZXZlbnQiKSxlW3RoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLWhhbmRsZXIiKV0pfSl9LF9nZW5lcmF0ZUhUTUw6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IERhdGU7dD10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksdC5nZXRNb250aCgpLHQuZ2V0RGF0ZSgpKSk7dmFyIG49dGhpcy5fZ2V0KGUsImlzUlRMIikscj10aGlzLl9nZXQoZSwic2hvd0J1dHRvblBhbmVsIiksaT10aGlzLl9nZXQoZSwiaGlkZUlmTm9QcmV2TmV4dCIpLHM9dGhpcy5fZ2V0KGUsIm5hdmlnYXRpb25Bc0RhdGVGb3JtYXQiKSxvPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGUpLHU9dGhpcy5fZ2V0KGUsInNob3dDdXJyZW50QXRQb3MiKSxhPXRoaXMuX2dldChlLCJzdGVwTW9udGhzIiksZj1vWzBdIT0xfHxvWzFdIT0xLGw9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QoZS5jdXJyZW50RGF5P25ldyBEYXRlKGUuY3VycmVudFllYXIsZS5jdXJyZW50TW9udGgsZS5jdXJyZW50RGF5KTpuZXcgRGF0ZSg5OTk5LDksOSkpLGM9dGhpcy5fZ2V0TWluTWF4RGF0ZShlLCJtaW4iKSxoPXRoaXMuX2dldE1pbk1heERhdGUoZSwibWF4IikscD1lLmRyYXdNb250aC11LGQ9ZS5kcmF3WWVhcjtwPDAmJihwKz0xMixkLS0pO2lmKGgpe3ZhciB2PXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGguZ2V0RnVsbFllYXIoKSxoLmdldE1vbnRoKCktb1swXSpvWzFdKzEsaC5nZXREYXRlKCkpKTt2PWMmJnY8Yz9jOnY7d2hpbGUodGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZCxwLDEpKT52KXAtLSxwPDAmJihwPTExLGQtLSl9ZS5kcmF3TW9udGg9cCxlLmRyYXdZZWFyPWQ7dmFyIG09dGhpcy5fZ2V0KGUsInByZXZUZXh0Iik7bT1zP3RoaXMuZm9ybWF0RGF0ZShtLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGQscC1hLDEpKSx0aGlzLl9nZXRGb3JtYXRDb25maWcoZSkpOm07dmFyIGc9dGhpcy5fY2FuQWRqdXN0TW9udGgoZSwtMSxkLHApPyc8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1wcmV2IHVpLWNvcm5lci1hbGwiIGRhdGEtaGFuZGxlcj0icHJldiIgZGF0YS1ldmVudD0iY2xpY2siIHRpdGxlPSInK20rJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysobj8iZSI6InciKSsnIj4nK20rIjwvc3Bhbj48L2E+IjppPyIiOic8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1wcmV2IHVpLWNvcm5lci1hbGwgdWktc3RhdGUtZGlzYWJsZWQiIHRpdGxlPSInK20rJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysobj8iZSI6InciKSsnIj4nK20rIjwvc3Bhbj48L2E+Iix5PXRoaXMuX2dldChlLCJuZXh0VGV4dCIpO3k9cz90aGlzLmZvcm1hdERhdGUoeSx0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkLHArYSwxKSksdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGUpKTp5O3ZhciBiPXRoaXMuX2NhbkFkanVzdE1vbnRoKGUsMSxkLHApPyc8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1hbGwiIGRhdGEtaGFuZGxlcj0ibmV4dCIgZGF0YS1ldmVudD0iY2xpY2siIHRpdGxlPSInK3krJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysobj8idyI6ImUiKSsnIj4nK3krIjwvc3Bhbj48L2E+IjppPyIiOic8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1hbGwgdWktc3RhdGUtZGlzYWJsZWQiIHRpdGxlPSInK3krJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysobj8idyI6ImUiKSsnIj4nK3krIjwvc3Bhbj48L2E+Iix3PXRoaXMuX2dldChlLCJjdXJyZW50VGV4dCIpLEU9dGhpcy5fZ2V0KGUsImdvdG9DdXJyZW50IikmJmUuY3VycmVudERheT9sOnQ7dz1zP3RoaXMuZm9ybWF0RGF0ZSh3LEUsdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGUpKTp3O3ZhciBTPWUuaW5saW5lPyIiOic8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InVpLWRhdGVwaWNrZXItY2xvc2UgdWktc3RhdGUtZGVmYXVsdCB1aS1wcmlvcml0eS1wcmltYXJ5IHVpLWNvcm5lci1hbGwiIGRhdGEtaGFuZGxlcj0iaGlkZSIgZGF0YS1ldmVudD0iY2xpY2siPicrdGhpcy5fZ2V0KGUsImNsb3NlVGV4dCIpKyI8L2J1dHRvbj4iLHg9cj8nPGRpdiBjbGFzcz0idWktZGF0ZXBpY2tlci1idXR0b25wYW5lIHVpLXdpZGdldC1jb250ZW50Ij4nKyhuP1M6IiIpKyh0aGlzLl9pc0luUmFuZ2UoZSxFKT8nPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ1aS1kYXRlcGlja2VyLWN1cnJlbnQgdWktc3RhdGUtZGVmYXVsdCB1aS1wcmlvcml0eS1zZWNvbmRhcnkgdWktY29ybmVyLWFsbCIgZGF0YS1oYW5kbGVyPSJ0b2RheSIgZGF0YS1ldmVudD0iY2xpY2siPicrdysiPC9idXR0b24+IjoiIikrKG4/IiI6UykrIjwvZGl2PiI6IiIsVD1wYXJzZUludCh0aGlzLl9nZXQoZSwiZmlyc3REYXkiKSwxMCk7VD1pc05hTihUKT8wOlQ7dmFyIE49dGhpcy5fZ2V0KGUsInNob3dXZWVrIiksQz10aGlzLl9nZXQoZSwiZGF5TmFtZXMiKSxrPXRoaXMuX2dldChlLCJkYXlOYW1lc1Nob3J0IiksTD10aGlzLl9nZXQoZSwiZGF5TmFtZXNNaW4iKSxBPXRoaXMuX2dldChlLCJtb250aE5hbWVzIiksTz10aGlzLl9nZXQoZSwibW9udGhOYW1lc1Nob3J0IiksTT10aGlzLl9nZXQoZSwiYmVmb3JlU2hvd0RheSIpLF89dGhpcy5fZ2V0KGUsInNob3dPdGhlck1vbnRocyIpLEQ9dGhpcy5fZ2V0KGUsInNlbGVjdE90aGVyTW9udGhzIiksUD10aGlzLl9nZXQoZSwiY2FsY3VsYXRlV2VlayIpfHx0aGlzLmlzbzg2MDFXZWVrLEg9dGhpcy5fZ2V0RGVmYXVsdERhdGUoZSksQj0iIjtmb3IodmFyIGo9MDtqPG9bMF07aisrKXt2YXIgRj0iIjt0aGlzLm1heFJvd3M9NDtmb3IodmFyIEk9MDtJPG9bMV07SSsrKXt2YXIgcT10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkLHAsZS5zZWxlY3RlZERheSkpLFI9IiB1aS1jb3JuZXItYWxsIixVPSIiO2lmKGYpe1UrPSc8ZGl2IGNsYXNzPSJ1aS1kYXRlcGlja2VyLWdyb3VwJztpZihvWzFdPjEpc3dpdGNoKEkpe2Nhc2UgMDpVKz0iIHVpLWRhdGVwaWNrZXItZ3JvdXAtZmlyc3QiLFI9IiB1aS1jb3JuZXItIisobj8icmlnaHQiOiJsZWZ0Iik7YnJlYWs7Y2FzZSBvWzFdLTE6VSs9IiB1aS1kYXRlcGlja2VyLWdyb3VwLWxhc3QiLFI9IiB1aS1jb3JuZXItIisobj8ibGVmdCI6InJpZ2h0Iik7YnJlYWs7ZGVmYXVsdDpVKz0iIHVpLWRhdGVwaWNrZXItZ3JvdXAtbWlkZGxlIixSPSIifVUrPSciPid9VSs9JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItaGVhZGVyIHVpLXdpZGdldC1oZWFkZXIgdWktaGVscGVyLWNsZWFyZml4JytSKyciPicrKC9hbGx8bGVmdC8udGVzdChSKSYmaj09MD9uP2I6ZzoiIikrKC9hbGx8cmlnaHQvLnRlc3QoUikmJmo9PTA/bj9nOmI6IiIpK3RoaXMuX2dlbmVyYXRlTW9udGhZZWFySGVhZGVyKGUscCxkLGMsaCxqPjB8fEk+MCxBLE8pKyc8L2Rpdj48dGFibGUgY2xhc3M9InVpLWRhdGVwaWNrZXItY2FsZW5kYXIiPjx0aGVhZD4nKyI8dHI+Ijt2YXIgej1OPyc8dGggY2xhc3M9InVpLWRhdGVwaWNrZXItd2Vlay1jb2wiPicrdGhpcy5fZ2V0KGUsIndlZWtIZWFkZXIiKSsiPC90aD4iOiIiO2Zvcih2YXIgVz0wO1c8NztXKyspe3ZhciBYPShXK1QpJTc7eis9Ijx0aCIrKChXK1QrNiklNz49NT8nIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXdlZWstZW5kIic6IiIpKyI+IisnPHNwYW4gdGl0bGU9IicrQ1tYXSsnIj4nK0xbWF0rIjwvc3Bhbj48L3RoPiJ9VSs9eisiPC90cj48L3RoZWFkPjx0Ym9keT4iO3ZhciBWPXRoaXMuX2dldERheXNJbk1vbnRoKGQscCk7ZD09ZS5zZWxlY3RlZFllYXImJnA9PWUuc2VsZWN0ZWRNb250aCYmKGUuc2VsZWN0ZWREYXk9TWF0aC5taW4oZS5zZWxlY3RlZERheSxWKSk7dmFyIEo9KHRoaXMuX2dldEZpcnN0RGF5T2ZNb250aChkLHApLVQrNyklNyxLPU1hdGguY2VpbCgoSitWKS83KSxRPWY/dGhpcy5tYXhSb3dzPks/dGhpcy5tYXhSb3dzOks6Szt0aGlzLm1heFJvd3M9UTt2YXIgRz10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkLHAsMS1KKSk7Zm9yKHZhciBZPTA7WTxRO1krKyl7VSs9Ijx0cj4iO3ZhciBaPU4/Jzx0ZCBjbGFzcz0idWktZGF0ZXBpY2tlci13ZWVrLWNvbCI+Jyt0aGlzLl9nZXQoZSwiY2FsY3VsYXRlV2VlayIpKEcpKyI8L3RkPiI6IiI7Zm9yKHZhciBXPTA7Vzw3O1crKyl7dmFyIGV0PU0/TS5hcHBseShlLmlucHV0P2UuaW5wdXRbMF06bnVsbCxbR10pOlshMCwiIl0sdHQ9Ry5nZXRNb250aCgpIT1wLG50PXR0JiYhRHx8IWV0WzBdfHxjJiZHPGN8fGgmJkc+aDtaKz0nPHRkIGNsYXNzPSInKygoVytUKzYpJTc+PTU/IiB1aS1kYXRlcGlja2VyLXdlZWstZW5kIjoiIikrKHR0PyIgdWktZGF0ZXBpY2tlci1vdGhlci1tb250aCI6IiIpKyhHLmdldFRpbWUoKT09cS5nZXRUaW1lKCkmJnA9PWUuc2VsZWN0ZWRNb250aCYmZS5fa2V5RXZlbnR8fEguZ2V0VGltZSgpPT1HLmdldFRpbWUoKSYmSC5nZXRUaW1lKCk9PXEuZ2V0VGltZSgpPyIgIit0aGlzLl9kYXlPdmVyQ2xhc3M6IiIpKyhudD8iICIrdGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3MrIiB1aS1zdGF0ZS1kaXNhYmxlZCI6IiIpKyh0dCYmIV8/IiI6IiAiK2V0WzFdKyhHLmdldFRpbWUoKT09bC5nZXRUaW1lKCk/IiAiK3RoaXMuX2N1cnJlbnRDbGFzczoiIikrKEcuZ2V0VGltZSgpPT10LmdldFRpbWUoKT8iIHVpLWRhdGVwaWNrZXItdG9kYXkiOiIiKSkrJyInKygoIXR0fHxfKSYmZXRbMl0/JyB0aXRsZT0iJytldFsyXSsnIic6IiIpKyhudD8iIjonIGRhdGEtaGFuZGxlcj0ic2VsZWN0RGF5IiBkYXRhLWV2ZW50PSJjbGljayIgZGF0YS1tb250aD0iJytHLmdldE1vbnRoKCkrJyIgZGF0YS15ZWFyPSInK0cuZ2V0RnVsbFllYXIoKSsnIicpKyI+IisodHQmJiFfPyImI3hhMDsiOm50Pyc8c3BhbiBjbGFzcz0idWktc3RhdGUtZGVmYXVsdCI+JytHLmdldERhdGUoKSsiPC9zcGFuPiI6JzxhIGNsYXNzPSJ1aS1zdGF0ZS1kZWZhdWx0JysoRy5nZXRUaW1lKCk9PXQuZ2V0VGltZSgpPyIgdWktc3RhdGUtaGlnaGxpZ2h0IjoiIikrKEcuZ2V0VGltZSgpPT1sLmdldFRpbWUoKT8iIHVpLXN0YXRlLWFjdGl2ZSI6IiIpKyh0dD8iIHVpLXByaW9yaXR5LXNlY29uZGFyeSI6IiIpKyciIGhyZWY9IiMiPicrRy5nZXREYXRlKCkrIjwvYT4iKSsiPC90ZD4iLEcuc2V0RGF0ZShHLmdldERhdGUoKSsxKSxHPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KEcpfVUrPVorIjwvdHI+In1wKysscD4xMSYmKHA9MCxkKyspLFUrPSI8L3Rib2R5PjwvdGFibGU+IisoZj8iPC9kaXY+Iisob1swXT4wJiZJPT1vWzFdLTE/JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItcm93LWJyZWFrIj48L2Rpdj4nOiIiKToiIiksRis9VX1CKz1GfXJldHVybiBCKz14KygkLnVpLmllNiYmIWUuaW5saW5lPyc8aWZyYW1lIHNyYz0iamF2YXNjcmlwdDpmYWxzZTsiIGNsYXNzPSJ1aS1kYXRlcGlja2VyLWNvdmVyIiBmcmFtZWJvcmRlcj0iMCI+PC9pZnJhbWU+JzoiIiksZS5fa2V5RXZlbnQ9ITEsQn0sX2dlbmVyYXRlTW9udGhZZWFySGVhZGVyOmZ1bmN0aW9uKGUsdCxuLHIsaSxzLG8sdSl7dmFyIGE9dGhpcy5fZ2V0KGUsImNoYW5nZU1vbnRoIiksZj10aGlzLl9nZXQoZSwiY2hhbmdlWWVhciIpLGw9dGhpcy5fZ2V0KGUsInNob3dNb250aEFmdGVyWWVhciIpLGM9JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItdGl0bGUiPicsaD0iIjtpZihzfHwhYSloKz0nPHNwYW4gY2xhc3M9InVpLWRhdGVwaWNrZXItbW9udGgiPicrb1t0XSsiPC9zcGFuPiI7ZWxzZXt2YXIgcD1yJiZyLmdldEZ1bGxZZWFyKCk9PW4sZD1pJiZpLmdldEZ1bGxZZWFyKCk9PW47aCs9JzxzZWxlY3QgY2xhc3M9InVpLWRhdGVwaWNrZXItbW9udGgiIGRhdGEtaGFuZGxlcj0ic2VsZWN0TW9udGgiIGRhdGEtZXZlbnQ9ImNoYW5nZSI+Jztmb3IodmFyIHY9MDt2PDEyO3YrKykoIXB8fHY+PXIuZ2V0TW9udGgoKSkmJighZHx8djw9aS5nZXRNb250aCgpKSYmKGgrPSc8b3B0aW9uIHZhbHVlPSInK3YrJyInKyh2PT10Pycgc2VsZWN0ZWQ9InNlbGVjdGVkIic6IiIpKyI+Iit1W3ZdKyI8L29wdGlvbj4iKTtoKz0iPC9zZWxlY3Q+In1sfHwoYys9aCsoc3x8IWF8fCFmPyImI3hhMDsiOiIiKSk7aWYoIWUueWVhcnNodG1sKXtlLnllYXJzaHRtbD0iIjtpZihzfHwhZiljKz0nPHNwYW4gY2xhc3M9InVpLWRhdGVwaWNrZXIteWVhciI+JytuKyI8L3NwYW4+IjtlbHNle3ZhciBtPXRoaXMuX2dldChlLCJ5ZWFyUmFuZ2UiKS5zcGxpdCgiOiIpLGc9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLHk9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXRjaCgvY1srLV0uKi8pP24rcGFyc2VJbnQoZS5zdWJzdHJpbmcoMSksMTApOmUubWF0Y2goL1srLV0uKi8pP2crcGFyc2VJbnQoZSwxMCk6cGFyc2VJbnQoZSwxMCk7cmV0dXJuIGlzTmFOKHQpP2c6dH0sYj15KG1bMF0pLHc9TWF0aC5tYXgoYix5KG1bMV18fCIiKSk7Yj1yP01hdGgubWF4KGIsci5nZXRGdWxsWWVhcigpKTpiLHc9aT9NYXRoLm1pbih3LGkuZ2V0RnVsbFllYXIoKSk6dyxlLnllYXJzaHRtbCs9JzxzZWxlY3QgY2xhc3M9InVpLWRhdGVwaWNrZXIteWVhciIgZGF0YS1oYW5kbGVyPSJzZWxlY3RZZWFyIiBkYXRhLWV2ZW50PSJjaGFuZ2UiPic7Zm9yKDtiPD13O2IrKyllLnllYXJzaHRtbCs9JzxvcHRpb24gdmFsdWU9IicrYisnIicrKGI9PW4/JyBzZWxlY3RlZD0ic2VsZWN0ZWQiJzoiIikrIj4iK2IrIjwvb3B0aW9uPiI7ZS55ZWFyc2h0bWwrPSI8L3NlbGVjdD4iLGMrPWUueWVhcnNodG1sLGUueWVhcnNodG1sPW51bGx9fXJldHVybiBjKz10aGlzLl9nZXQoZSwieWVhclN1ZmZpeCIpLGwmJihjKz0oc3x8IWF8fCFmPyImI3hhMDsiOiIiKStoKSxjKz0iPC9kaXY+IixjfSxfYWRqdXN0SW5zdERhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuZHJhd1llYXIrKG49PSJZIj90OjApLGk9ZS5kcmF3TW9udGgrKG49PSJNIj90OjApLHM9TWF0aC5taW4oZS5zZWxlY3RlZERheSx0aGlzLl9nZXREYXlzSW5Nb250aChyLGkpKSsobj09IkQiP3Q6MCksbz10aGlzLl9yZXN0cmljdE1pbk1heChlLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHIsaSxzKSkpO2Uuc2VsZWN0ZWREYXk9by5nZXREYXRlKCksZS5kcmF3TW9udGg9ZS5zZWxlY3RlZE1vbnRoPW8uZ2V0TW9udGgoKSxlLmRyYXdZZWFyPWUuc2VsZWN0ZWRZZWFyPW8uZ2V0RnVsbFllYXIoKSwobj09Ik0ifHxuPT0iWSIpJiZ0aGlzLl9ub3RpZnlDaGFuZ2UoZSl9LF9yZXN0cmljdE1pbk1heDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2dldE1pbk1heERhdGUoZSwibWluIikscj10aGlzLl9nZXRNaW5NYXhEYXRlKGUsIm1heCIpLGk9biYmdDxuP246dDtyZXR1cm4gaT1yJiZpPnI/cjppLGl9LF9ub3RpZnlDaGFuZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0KGUsIm9uQ2hhbmdlTW9udGhZZWFyIik7dCYmdC5hcHBseShlLmlucHV0P2UuaW5wdXRbMF06bnVsbCxbZS5zZWxlY3RlZFllYXIsZS5zZWxlY3RlZE1vbnRoKzEsZV0pfSxfZ2V0TnVtYmVyT2ZNb250aHM6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0KGUsIm51bWJlck9mTW9udGhzIik7cmV0dXJuIHQ9PW51bGw/WzEsMV06dHlwZW9mIHQ9PSJudW1iZXIiP1sxLHRdOnR9LF9nZXRNaW5NYXhEYXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX2RldGVybWluZURhdGUoZSx0aGlzLl9nZXQoZSx0KyJEYXRlIiksbnVsbCl9LF9nZXREYXlzSW5Nb250aDpmdW5jdGlvbihlLHQpe3JldHVybiAzMi10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShlLHQsMzIpKS5nZXREYXRlKCl9LF9nZXRGaXJzdERheU9mTW9udGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4obmV3IERhdGUoZSx0LDEpKS5nZXREYXkoKX0sX2NhbkFkanVzdE1vbnRoOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGUpLHM9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUobixyKyh0PDA/dDppWzBdKmlbMV0pLDEpKTtyZXR1cm4gdDwwJiZzLnNldERhdGUodGhpcy5fZ2V0RGF5c0luTW9udGgocy5nZXRGdWxsWWVhcigpLHMuZ2V0TW9udGgoKSkpLHRoaXMuX2lzSW5SYW5nZShlLHMpfSxfaXNJblJhbmdlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5fZ2V0TWluTWF4RGF0ZShlLCJtaW4iKSxyPXRoaXMuX2dldE1pbk1heERhdGUoZSwibWF4Iik7cmV0dXJuKCFufHx0LmdldFRpbWUoKT49bi5nZXRUaW1lKCkpJiYoIXJ8fHQuZ2V0VGltZSgpPD1yLmdldFRpbWUoKSl9LF9nZXRGb3JtYXRDb25maWc6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0KGUsInNob3J0WWVhckN1dG9mZiIpO3JldHVybiB0PXR5cGVvZiB0IT0ic3RyaW5nIj90OihuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSUxMDArcGFyc2VJbnQodCwxMCkse3Nob3J0WWVhckN1dG9mZjp0LGRheU5hbWVzU2hvcnQ6dGhpcy5fZ2V0KGUsImRheU5hbWVzU2hvcnQiKSxkYXlOYW1lczp0aGlzLl9nZXQoZSwiZGF5TmFtZXMiKSxtb250aE5hbWVzU2hvcnQ6dGhpcy5fZ2V0KGUsIm1vbnRoTmFtZXNTaG9ydCIpLG1vbnRoTmFtZXM6dGhpcy5fZ2V0KGUsIm1vbnRoTmFtZXMiKX19LF9mb3JtYXREYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3R8fChlLmN1cnJlbnREYXk9ZS5zZWxlY3RlZERheSxlLmN1cnJlbnRNb250aD1lLnNlbGVjdGVkTW9udGgsZS5jdXJyZW50WWVhcj1lLnNlbGVjdGVkWWVhcik7dmFyIGk9dD90eXBlb2YgdD09Im9iamVjdCI/dDp0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShyLG4sdCkpOnRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGUuY3VycmVudFllYXIsZS5jdXJyZW50TW9udGgsZS5jdXJyZW50RGF5KSk7cmV0dXJuIHRoaXMuZm9ybWF0RGF0ZSh0aGlzLl9nZXQoZSwiZGF0ZUZvcm1hdCIpLGksdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGUpKX19KSwkLmZuLmRhdGVwaWNrZXI9ZnVuY3Rpb24oZSl7aWYoIXRoaXMubGVuZ3RoKXJldHVybiB0aGlzOyQuZGF0ZXBpY2tlci5pbml0aWFsaXplZHx8KCQoZG9jdW1lbnQpLm1vdXNlZG93bigkLmRhdGVwaWNrZXIuX2NoZWNrRXh0ZXJuYWxDbGljaykuZmluZChkb2N1bWVudC5ib2R5KS5hcHBlbmQoJC5kYXRlcGlja2VyLmRwRGl2KSwkLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWQ9ITApO3ZhciB0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gdHlwZW9mIGUhPSJzdHJpbmcifHxlIT0iaXNEaXNhYmxlZCImJmUhPSJnZXREYXRlIiYmZSE9IndpZGdldCI/ZT09Im9wdGlvbiImJmFyZ3VtZW50cy5sZW5ndGg9PTImJnR5cGVvZiBhcmd1bWVudHNbMV09PSJzdHJpbmciPyQuZGF0ZXBpY2tlclsiXyIrZSsiRGF0ZXBpY2tlciJdLmFwcGx5KCQuZGF0ZXBpY2tlcixbdGhpc1swXV0uY29uY2F0KHQpKTp0aGlzLmVhY2goZnVuY3Rpb24oKXt0eXBlb2YgZT09InN0cmluZyI/JC5kYXRlcGlja2VyWyJfIitlKyJEYXRlcGlja2VyIl0uYXBwbHkoJC5kYXRlcGlja2VyLFt0aGlzXS5jb25jYXQodCkpOiQuZGF0ZXBpY2tlci5fYXR0YWNoRGF0ZXBpY2tlcih0aGlzLGUpfSk6JC5kYXRlcGlja2VyWyJfIitlKyJEYXRlcGlja2VyIl0uYXBwbHkoJC5kYXRlcGlja2VyLFt0aGlzWzBdXS5jb25jYXQodCkpfSwkLmRhdGVwaWNrZXI9bmV3IERhdGVwaWNrZXIsJC5kYXRlcGlja2VyLmluaXRpYWxpemVkPSExLCQuZGF0ZXBpY2tlci51dWlkPShuZXcgRGF0ZSkuZ2V0VGltZSgpLCQuZGF0ZXBpY2tlci52ZXJzaW9uPSIxLjkuMiIsd2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdPSR9KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe3ZhciBuPSJ1aS1kaWFsb2cgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwgIixyPXtidXR0b25zOiEwLGhlaWdodDohMCxtYXhIZWlnaHQ6ITAsbWF4V2lkdGg6ITAsbWluSGVpZ2h0OiEwLG1pbldpZHRoOiEwLHdpZHRoOiEwfSxpPXttYXhIZWlnaHQ6ITAsbWF4V2lkdGg6ITAsbWluSGVpZ2h0OiEwLG1pbldpZHRoOiEwfTtlLndpZGdldCgidWkuZGlhbG9nIix7dmVyc2lvbjoiMS45LjIiLG9wdGlvbnM6e2F1dG9PcGVuOiEwLGJ1dHRvbnM6e30sY2xvc2VPbkVzY2FwZTohMCxjbG9zZVRleHQ6ImNsb3NlIixkaWFsb2dDbGFzczoiIixkcmFnZ2FibGU6ITAsaGlkZTpudWxsLGhlaWdodDoiYXV0byIsbWF4SGVpZ2h0OiExLG1heFdpZHRoOiExLG1pbkhlaWdodDoxNTAsbWluV2lkdGg6MTUwLG1vZGFsOiExLHBvc2l0aW9uOntteToiY2VudGVyIixhdDoiY2VudGVyIixvZjp3aW5kb3csY29sbGlzaW9uOiJmaXQiLHVzaW5nOmZ1bmN0aW9uKHQpe3ZhciBuPWUodGhpcykuY3NzKHQpLm9mZnNldCgpLnRvcDtuPDAmJmUodGhpcykuY3NzKCJ0b3AiLHQudG9wLW4pfX0scmVzaXphYmxlOiEwLHNob3c6bnVsbCxzdGFjazohMCx0aXRsZToiIix3aWR0aDozMDAsekluZGV4OjFlM30sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMub3JpZ2luYWxUaXRsZT10aGlzLmVsZW1lbnQuYXR0cigidGl0bGUiKSx0eXBlb2YgdGhpcy5vcmlnaW5hbFRpdGxlIT0ic3RyaW5nIiYmKHRoaXMub3JpZ2luYWxUaXRsZT0iIiksdGhpcy5vbGRQb3NpdGlvbj17cGFyZW50OnRoaXMuZWxlbWVudC5wYXJlbnQoKSxpbmRleDp0aGlzLmVsZW1lbnQucGFyZW50KCkuY2hpbGRyZW4oKS5pbmRleCh0aGlzLmVsZW1lbnQpfSx0aGlzLm9wdGlvbnMudGl0bGU9dGhpcy5vcHRpb25zLnRpdGxlfHx0aGlzLm9yaWdpbmFsVGl0bGU7dmFyIHQ9dGhpcyxyPXRoaXMub3B0aW9ucyxpPXIudGl0bGV8fCImIzE2MDsiLHMsbyx1LGEsZjtzPSh0aGlzLnVpRGlhbG9nPWUoIjxkaXY+IikpLmFkZENsYXNzKG4rci5kaWFsb2dDbGFzcykuY3NzKHtkaXNwbGF5OiJub25lIixvdXRsaW5lOjAsekluZGV4OnIuekluZGV4fSkuYXR0cigidGFiSW5kZXgiLC0xKS5rZXlkb3duKGZ1bmN0aW9uKG4pe3IuY2xvc2VPbkVzY2FwZSYmIW4uaXNEZWZhdWx0UHJldmVudGVkKCkmJm4ua2V5Q29kZSYmbi5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLkVTQ0FQRSYmKHQuY2xvc2Uobiksbi5wcmV2ZW50RGVmYXVsdCgpKX0pLm1vdXNlZG93bihmdW5jdGlvbihlKXt0Lm1vdmVUb1RvcCghMSxlKX0pLmFwcGVuZFRvKCJib2R5IiksdGhpcy5lbGVtZW50LnNob3coKS5yZW1vdmVBdHRyKCJ0aXRsZSIpLmFkZENsYXNzKCJ1aS1kaWFsb2ctY29udGVudCB1aS13aWRnZXQtY29udGVudCIpLmFwcGVuZFRvKHMpLG89KHRoaXMudWlEaWFsb2dUaXRsZWJhcj1lKCI8ZGl2PiIpKS5hZGRDbGFzcygidWktZGlhbG9nLXRpdGxlYmFyICB1aS13aWRnZXQtaGVhZGVyICB1aS1jb3JuZXItYWxsICB1aS1oZWxwZXItY2xlYXJmaXgiKS5iaW5kKCJtb3VzZWRvd24iLGZ1bmN0aW9uKCl7cy5mb2N1cygpfSkucHJlcGVuZFRvKHMpLHU9ZSgiPGEgaHJlZj0nIyc+PC9hPiIpLmFkZENsYXNzKCJ1aS1kaWFsb2ctdGl0bGViYXItY2xvc2UgIHVpLWNvcm5lci1hbGwiKS5hdHRyKCJyb2xlIiwiYnV0dG9uIikuY2xpY2soZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpLHQuY2xvc2UoZSl9KS5hcHBlbmRUbyhvKSwodGhpcy51aURpYWxvZ1RpdGxlYmFyQ2xvc2VUZXh0PWUoIjxzcGFuPiIpKS5hZGRDbGFzcygidWktaWNvbiB1aS1pY29uLWNsb3NldGhpY2siKS50ZXh0KHIuY2xvc2VUZXh0KS5hcHBlbmRUbyh1KSxhPWUoIjxzcGFuPiIpLnVuaXF1ZUlkKCkuYWRkQ2xhc3MoInVpLWRpYWxvZy10aXRsZSIpLmh0bWwoaSkucHJlcGVuZFRvKG8pLGY9KHRoaXMudWlEaWFsb2dCdXR0b25QYW5lPWUoIjxkaXY+IikpLmFkZENsYXNzKCJ1aS1kaWFsb2ctYnV0dG9ucGFuZSB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXgiKSwodGhpcy51aUJ1dHRvblNldD1lKCI8ZGl2PiIpKS5hZGRDbGFzcygidWktZGlhbG9nLWJ1dHRvbnNldCIpLmFwcGVuZFRvKGYpLHMuYXR0cih7cm9sZToiZGlhbG9nIiwiYXJpYS1sYWJlbGxlZGJ5IjphLmF0dHIoImlkIil9KSxvLmZpbmQoIioiKS5hZGQobykuZGlzYWJsZVNlbGVjdGlvbigpLHRoaXMuX2hvdmVyYWJsZSh1KSx0aGlzLl9mb2N1c2FibGUodSksci5kcmFnZ2FibGUmJmUuZm4uZHJhZ2dhYmxlJiZ0aGlzLl9tYWtlRHJhZ2dhYmxlKCksci5yZXNpemFibGUmJmUuZm4ucmVzaXphYmxlJiZ0aGlzLl9tYWtlUmVzaXphYmxlKCksdGhpcy5fY3JlYXRlQnV0dG9ucyhyLmJ1dHRvbnMpLHRoaXMuX2lzT3Blbj0hMSxlLmZuLmJnaWZyYW1lJiZzLmJnaWZyYW1lKCksdGhpcy5fb24ocyx7a2V5ZG93bjpmdW5jdGlvbih0KXtpZighci5tb2RhbHx8dC5rZXlDb2RlIT09ZS51aS5rZXlDb2RlLlRBQilyZXR1cm47dmFyIG49ZSgiOnRhYmJhYmxlIixzKSxpPW4uZmlsdGVyKCI6Zmlyc3QiKSxvPW4uZmlsdGVyKCI6bGFzdCIpO2lmKHQudGFyZ2V0PT09b1swXSYmIXQuc2hpZnRLZXkpcmV0dXJuIGkuZm9jdXMoMSksITE7aWYodC50YXJnZXQ9PT1pWzBdJiZ0LnNoaWZ0S2V5KXJldHVybiBvLmZvY3VzKDEpLCExfX0pfSxfaW5pdDpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5hdXRvT3BlbiYmdGhpcy5vcGVuKCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLm9sZFBvc2l0aW9uO3RoaXMub3ZlcmxheSYmdGhpcy5vdmVybGF5LmRlc3Ryb3koKSx0aGlzLnVpRGlhbG9nLmhpZGUoKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1jb250ZW50IHVpLXdpZGdldC1jb250ZW50IikuaGlkZSgpLmFwcGVuZFRvKCJib2R5IiksdGhpcy51aURpYWxvZy5yZW1vdmUoKSx0aGlzLm9yaWdpbmFsVGl0bGUmJnRoaXMuZWxlbWVudC5hdHRyKCJ0aXRsZSIsdGhpcy5vcmlnaW5hbFRpdGxlKSxlPXQucGFyZW50LmNoaWxkcmVuKCkuZXEodC5pbmRleCksZS5sZW5ndGgmJmVbMF0hPT10aGlzLmVsZW1lbnRbMF0/ZS5iZWZvcmUodGhpcy5lbGVtZW50KTp0LnBhcmVudC5hcHBlbmQodGhpcy5lbGVtZW50KX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWlEaWFsb2d9LGNsb3NlOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMscixpO2lmKCF0aGlzLl9pc09wZW4pcmV0dXJuO2lmKCExPT09dGhpcy5fdHJpZ2dlcigiYmVmb3JlQ2xvc2UiLHQpKXJldHVybjtyZXR1cm4gdGhpcy5faXNPcGVuPSExLHRoaXMub3ZlcmxheSYmdGhpcy5vdmVybGF5LmRlc3Ryb3koKSx0aGlzLm9wdGlvbnMuaGlkZT90aGlzLl9oaWRlKHRoaXMudWlEaWFsb2csdGhpcy5vcHRpb25zLmhpZGUsZnVuY3Rpb24oKXtuLl90cmlnZ2VyKCJjbG9zZSIsdCl9KToodGhpcy51aURpYWxvZy5oaWRlKCksdGhpcy5fdHJpZ2dlcigiY2xvc2UiLHQpKSxlLnVpLmRpYWxvZy5vdmVybGF5LnJlc2l6ZSgpLHRoaXMub3B0aW9ucy5tb2RhbCYmKHI9MCxlKCIudWktZGlhbG9nIikuZWFjaChmdW5jdGlvbigpe3RoaXMhPT1uLnVpRGlhbG9nWzBdJiYoaT1lKHRoaXMpLmNzcygiei1pbmRleCIpLGlzTmFOKGkpfHwocj1NYXRoLm1heChyLGkpKSl9KSxlLnVpLmRpYWxvZy5tYXhaPXIpLHRoaXN9LGlzT3BlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc09wZW59LG1vdmVUb1RvcDpmdW5jdGlvbih0LG4pe3ZhciByPXRoaXMub3B0aW9ucyxpO3JldHVybiByLm1vZGFsJiYhdHx8IXIuc3RhY2smJiFyLm1vZGFsP3RoaXMuX3RyaWdnZXIoImZvY3VzIixuKTooci56SW5kZXg+ZS51aS5kaWFsb2cubWF4WiYmKGUudWkuZGlhbG9nLm1heFo9ci56SW5kZXgpLHRoaXMub3ZlcmxheSYmKGUudWkuZGlhbG9nLm1heForPTEsZS51aS5kaWFsb2cub3ZlcmxheS5tYXhaPWUudWkuZGlhbG9nLm1heFosdGhpcy5vdmVybGF5LiRlbC5jc3MoInotaW5kZXgiLGUudWkuZGlhbG9nLm92ZXJsYXkubWF4WikpLGk9e3Njcm9sbFRvcDp0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wKCksc2Nyb2xsTGVmdDp0aGlzLmVsZW1lbnQuc2Nyb2xsTGVmdCgpfSxlLnVpLmRpYWxvZy5tYXhaKz0xLHRoaXMudWlEaWFsb2cuY3NzKCJ6LWluZGV4IixlLnVpLmRpYWxvZy5tYXhaKSx0aGlzLmVsZW1lbnQuYXR0cihpKSx0aGlzLl90cmlnZ2VyKCJmb2N1cyIsbiksdGhpcyl9LG9wZW46ZnVuY3Rpb24oKXtpZih0aGlzLl9pc09wZW4pcmV0dXJuO3ZhciB0LG49dGhpcy5vcHRpb25zLHI9dGhpcy51aURpYWxvZztyZXR1cm4gdGhpcy5fc2l6ZSgpLHRoaXMuX3Bvc2l0aW9uKG4ucG9zaXRpb24pLHIuc2hvdyhuLnNob3cpLHRoaXMub3ZlcmxheT1uLm1vZGFsP25ldyBlLnVpLmRpYWxvZy5vdmVybGF5KHRoaXMpOm51bGwsdGhpcy5tb3ZlVG9Ub3AoITApLHQ9dGhpcy5lbGVtZW50LmZpbmQoIjp0YWJiYWJsZSIpLHQubGVuZ3RofHwodD10aGlzLnVpRGlhbG9nQnV0dG9uUGFuZS5maW5kKCI6dGFiYmFibGUiKSx0Lmxlbmd0aHx8KHQ9cikpLHQuZXEoMCkuZm9jdXMoKSx0aGlzLl9pc09wZW49ITAsdGhpcy5fdHJpZ2dlcigib3BlbiIpLHRoaXN9LF9jcmVhdGVCdXR0b25zOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMscj0hMTt0aGlzLnVpRGlhbG9nQnV0dG9uUGFuZS5yZW1vdmUoKSx0aGlzLnVpQnV0dG9uU2V0LmVtcHR5KCksdHlwZW9mIHQ9PSJvYmplY3QiJiZ0IT09bnVsbCYmZS5lYWNoKHQsZnVuY3Rpb24oKXtyZXR1cm4hKHI9ITApfSkscj8oZS5lYWNoKHQsZnVuY3Rpb24odCxyKXt2YXIgaSxzO3I9ZS5pc0Z1bmN0aW9uKHIpP3tjbGljazpyLHRleHQ6dH06cixyPWUuZXh0ZW5kKHt0eXBlOiJidXR0b24ifSxyKSxzPXIuY2xpY2ssci5jbGljaz1mdW5jdGlvbigpe3MuYXBwbHkobi5lbGVtZW50WzBdLGFyZ3VtZW50cyl9LGk9ZSgiPGJ1dHRvbj48L2J1dHRvbj4iLHIpLmFwcGVuZFRvKG4udWlCdXR0b25TZXQpLGUuZm4uYnV0dG9uJiZpLmJ1dHRvbigpfSksdGhpcy51aURpYWxvZy5hZGRDbGFzcygidWktZGlhbG9nLWJ1dHRvbnMiKSx0aGlzLnVpRGlhbG9nQnV0dG9uUGFuZS5hcHBlbmRUbyh0aGlzLnVpRGlhbG9nKSk6dGhpcy51aURpYWxvZy5yZW1vdmVDbGFzcygidWktZGlhbG9nLWJ1dHRvbnMiKX0sX21ha2VEcmFnZ2FibGU6ZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUpe3JldHVybntwb3NpdGlvbjplLnBvc2l0aW9uLG9mZnNldDplLm9mZnNldH19dmFyIHQ9dGhpcyxuPXRoaXMub3B0aW9uczt0aGlzLnVpRGlhbG9nLmRyYWdnYWJsZSh7Y2FuY2VsOiIudWktZGlhbG9nLWNvbnRlbnQsIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2UiLGhhbmRsZToiLnVpLWRpYWxvZy10aXRsZWJhciIsY29udGFpbm1lbnQ6ImRvY3VtZW50IixzdGFydDpmdW5jdGlvbihuLGkpe2UodGhpcykuYWRkQ2xhc3MoInVpLWRpYWxvZy1kcmFnZ2luZyIpLHQuX3RyaWdnZXIoImRyYWdTdGFydCIsbixyKGkpKX0sZHJhZzpmdW5jdGlvbihlLG4pe3QuX3RyaWdnZXIoImRyYWciLGUscihuKSl9LHN0b3A6ZnVuY3Rpb24oaSxzKXtuLnBvc2l0aW9uPVtzLnBvc2l0aW9uLmxlZnQtdC5kb2N1bWVudC5zY3JvbGxMZWZ0KCkscy5wb3NpdGlvbi50b3AtdC5kb2N1bWVudC5zY3JvbGxUb3AoKV0sZSh0aGlzKS5yZW1vdmVDbGFzcygidWktZGlhbG9nLWRyYWdnaW5nIiksdC5fdHJpZ2dlcigiZHJhZ1N0b3AiLGkscihzKSksZS51aS5kaWFsb2cub3ZlcmxheS5yZXNpemUoKX19KX0sX21ha2VSZXNpemFibGU6ZnVuY3Rpb24obil7ZnVuY3Rpb24gdShlKXtyZXR1cm57b3JpZ2luYWxQb3NpdGlvbjplLm9yaWdpbmFsUG9zaXRpb24sb3JpZ2luYWxTaXplOmUub3JpZ2luYWxTaXplLHBvc2l0aW9uOmUucG9zaXRpb24sc2l6ZTplLnNpemV9fW49bj09PXQ/dGhpcy5vcHRpb25zLnJlc2l6YWJsZTpuO3ZhciByPXRoaXMsaT10aGlzLm9wdGlvbnMscz10aGlzLnVpRGlhbG9nLmNzcygicG9zaXRpb24iKSxvPXR5cGVvZiBuPT0ic3RyaW5nIj9uOiJuLGUscyx3LHNlLHN3LG5lLG53Ijt0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSh7Y2FuY2VsOiIudWktZGlhbG9nLWNvbnRlbnQiLGNvbnRhaW5tZW50OiJkb2N1bWVudCIsYWxzb1Jlc2l6ZTp0aGlzLmVsZW1lbnQsbWF4V2lkdGg6aS5tYXhXaWR0aCxtYXhIZWlnaHQ6aS5tYXhIZWlnaHQsbWluV2lkdGg6aS5taW5XaWR0aCxtaW5IZWlnaHQ6dGhpcy5fbWluSGVpZ2h0KCksaGFuZGxlczpvLHN0YXJ0OmZ1bmN0aW9uKHQsbil7ZSh0aGlzKS5hZGRDbGFzcygidWktZGlhbG9nLXJlc2l6aW5nIiksci5fdHJpZ2dlcigicmVzaXplU3RhcnQiLHQsdShuKSl9LHJlc2l6ZTpmdW5jdGlvbihlLHQpe3IuX3RyaWdnZXIoInJlc2l6ZSIsZSx1KHQpKX0sc3RvcDpmdW5jdGlvbih0LG4pe2UodGhpcykucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1yZXNpemluZyIpLGkuaGVpZ2h0PWUodGhpcykuaGVpZ2h0KCksaS53aWR0aD1lKHRoaXMpLndpZHRoKCksci5fdHJpZ2dlcigicmVzaXplU3RvcCIsdCx1KG4pKSxlLnVpLmRpYWxvZy5vdmVybGF5LnJlc2l6ZSgpfX0pLmNzcygicG9zaXRpb24iLHMpLmZpbmQoIi51aS1yZXNpemFibGUtc2UiKS5hZGRDbGFzcygidWktaWNvbiB1aS1pY29uLWdyaXAtZGlhZ29uYWwtc2UiKX0sX21pbkhlaWdodDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucztyZXR1cm4gZS5oZWlnaHQ9PT0iYXV0byI/ZS5taW5IZWlnaHQ6TWF0aC5taW4oZS5taW5IZWlnaHQsZS5oZWlnaHQpfSxfcG9zaXRpb246ZnVuY3Rpb24odCl7dmFyIG49W10scj1bMCwwXSxpO2lmKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nInx8dHlwZW9mIHQ9PSJvYmplY3QiJiYiMCJpbiB0KW49dC5zcGxpdD90LnNwbGl0KCIgIik6W3RbMF0sdFsxXV0sbi5sZW5ndGg9PT0xJiYoblsxXT1uWzBdKSxlLmVhY2goWyJsZWZ0IiwidG9wIl0sZnVuY3Rpb24oZSx0KXsrbltlXT09PW5bZV0mJihyW2VdPW5bZV0sbltlXT10KX0pLHQ9e215Om5bMF0rKHJbMF08MD9yWzBdOiIrIityWzBdKSsiICIrblsxXSsoclsxXTwwP3JbMV06IisiK3JbMV0pLGF0Om4uam9pbigiICIpfTt0PWUuZXh0ZW5kKHt9LGUudWkuZGlhbG9nLnByb3RvdHlwZS5vcHRpb25zLnBvc2l0aW9uLHQpfWVsc2UgdD1lLnVpLmRpYWxvZy5wcm90b3R5cGUub3B0aW9ucy5wb3NpdGlvbjtpPXRoaXMudWlEaWFsb2cuaXMoIjp2aXNpYmxlIiksaXx8dGhpcy51aURpYWxvZy5zaG93KCksdGhpcy51aURpYWxvZy5wb3NpdGlvbih0KSxpfHx0aGlzLnVpRGlhbG9nLmhpZGUoKX0sX3NldE9wdGlvbnM6ZnVuY3Rpb24odCl7dmFyIG49dGhpcyxzPXt9LG89ITE7ZS5lYWNoKHQsZnVuY3Rpb24oZSx0KXtuLl9zZXRPcHRpb24oZSx0KSxlIGluIHImJihvPSEwKSxlIGluIGkmJihzW2VdPXQpfSksbyYmdGhpcy5fc2l6ZSgpLHRoaXMudWlEaWFsb2cuaXMoIjpkYXRhKHJlc2l6YWJsZSkiKSYmdGhpcy51aURpYWxvZy5yZXNpemFibGUoIm9wdGlvbiIscyl9LF9zZXRPcHRpb246ZnVuY3Rpb24odCxyKXt2YXIgaSxzLG89dGhpcy51aURpYWxvZztzd2l0Y2godCl7Y2FzZSJidXR0b25zIjp0aGlzLl9jcmVhdGVCdXR0b25zKHIpO2JyZWFrO2Nhc2UiY2xvc2VUZXh0Ijp0aGlzLnVpRGlhbG9nVGl0bGViYXJDbG9zZVRleHQudGV4dCgiIityKTticmVhaztjYXNlImRpYWxvZ0NsYXNzIjpvLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5kaWFsb2dDbGFzcykuYWRkQ2xhc3MobityKTticmVhaztjYXNlImRpc2FibGVkIjpyP28uYWRkQ2xhc3MoInVpLWRpYWxvZy1kaXNhYmxlZCIpOm8ucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1kaXNhYmxlZCIpO2JyZWFrO2Nhc2UiZHJhZ2dhYmxlIjppPW8uaXMoIjpkYXRhKGRyYWdnYWJsZSkiKSxpJiYhciYmby5kcmFnZ2FibGUoImRlc3Ryb3kiKSwhaSYmciYmdGhpcy5fbWFrZURyYWdnYWJsZSgpO2JyZWFrO2Nhc2UicG9zaXRpb24iOnRoaXMuX3Bvc2l0aW9uKHIpO2JyZWFrO2Nhc2UicmVzaXphYmxlIjpzPW8uaXMoIjpkYXRhKHJlc2l6YWJsZSkiKSxzJiYhciYmby5yZXNpemFibGUoImRlc3Ryb3kiKSxzJiZ0eXBlb2Ygcj09InN0cmluZyImJm8ucmVzaXphYmxlKCJvcHRpb24iLCJoYW5kbGVzIixyKSwhcyYmciE9PSExJiZ0aGlzLl9tYWtlUmVzaXphYmxlKHIpO2JyZWFrO2Nhc2UidGl0bGUiOmUoIi51aS1kaWFsb2ctdGl0bGUiLHRoaXMudWlEaWFsb2dUaXRsZWJhcikuaHRtbCgiIisocnx8IiYjMTYwOyIpKX10aGlzLl9zdXBlcih0LHIpfSxfc2l6ZTpmdW5jdGlvbigpe3ZhciB0LG4scixpPXRoaXMub3B0aW9ucyxzPXRoaXMudWlEaWFsb2cuaXMoIjp2aXNpYmxlIik7dGhpcy5lbGVtZW50LnNob3coKS5jc3Moe3dpZHRoOiJhdXRvIixtaW5IZWlnaHQ6MCxoZWlnaHQ6MH0pLGkubWluV2lkdGg+aS53aWR0aCYmKGkud2lkdGg9aS5taW5XaWR0aCksdD10aGlzLnVpRGlhbG9nLmNzcyh7aGVpZ2h0OiJhdXRvIix3aWR0aDppLndpZHRofSkub3V0ZXJIZWlnaHQoKSxuPU1hdGgubWF4KDAsaS5taW5IZWlnaHQtdCksaS5oZWlnaHQ9PT0iYXV0byI/ZS5zdXBwb3J0Lm1pbkhlaWdodD90aGlzLmVsZW1lbnQuY3NzKHttaW5IZWlnaHQ6bixoZWlnaHQ6ImF1dG8ifSk6KHRoaXMudWlEaWFsb2cuc2hvdygpLHI9dGhpcy5lbGVtZW50LmNzcygiaGVpZ2h0IiwiYXV0byIpLmhlaWdodCgpLHN8fHRoaXMudWlEaWFsb2cuaGlkZSgpLHRoaXMuZWxlbWVudC5oZWlnaHQoTWF0aC5tYXgocixuKSkpOnRoaXMuZWxlbWVudC5oZWlnaHQoTWF0aC5tYXgoaS5oZWlnaHQtdCwwKSksdGhpcy51aURpYWxvZy5pcygiOmRhdGEocmVzaXphYmxlKSIpJiZ0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSgib3B0aW9uIiwibWluSGVpZ2h0Iix0aGlzLl9taW5IZWlnaHQoKSl9fSksZS5leHRlbmQoZS51aS5kaWFsb2cse3V1aWQ6MCxtYXhaOjAsZ2V0VGl0bGVJZDpmdW5jdGlvbihlKXt2YXIgdD1lLmF0dHIoImlkIik7cmV0dXJuIHR8fCh0aGlzLnV1aWQrPTEsdD10aGlzLnV1aWQpLCJ1aS1kaWFsb2ctdGl0bGUtIit0fSxvdmVybGF5OmZ1bmN0aW9uKHQpe3RoaXMuJGVsPWUudWkuZGlhbG9nLm92ZXJsYXkuY3JlYXRlKHQpfX0pLGUuZXh0ZW5kKGUudWkuZGlhbG9nLm92ZXJsYXkse2luc3RhbmNlczpbXSxvbGRJbnN0YW5jZXM6W10sbWF4WjowLGV2ZW50czplLm1hcCgiZm9jdXMsbW91c2Vkb3duLG1vdXNldXAsa2V5ZG93bixrZXlwcmVzcyxjbGljayIuc3BsaXQoIiwiKSxmdW5jdGlvbihlKXtyZXR1cm4gZSsiLmRpYWxvZy1vdmVybGF5In0pLmpvaW4oIiAiKSxjcmVhdGU6ZnVuY3Rpb24odCl7dGhpcy5pbnN0YW5jZXMubGVuZ3RoPT09MCYmKHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnVpLmRpYWxvZy5vdmVybGF5Lmluc3RhbmNlcy5sZW5ndGgmJmUoZG9jdW1lbnQpLmJpbmQoZS51aS5kaWFsb2cub3ZlcmxheS5ldmVudHMsZnVuY3Rpb24odCl7aWYoZSh0LnRhcmdldCkuekluZGV4KCk8ZS51aS5kaWFsb2cub3ZlcmxheS5tYXhaKXJldHVybiExfSl9LDEpLGUod2luZG93KS5iaW5kKCJyZXNpemUuZGlhbG9nLW92ZXJsYXkiLGUudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKSk7dmFyIG49dGhpcy5vbGRJbnN0YW5jZXMucG9wKCl8fGUoIjxkaXY+IikuYWRkQ2xhc3MoInVpLXdpZGdldC1vdmVybGF5Iik7cmV0dXJuIGUoZG9jdW1lbnQpLmJpbmQoImtleWRvd24uZGlhbG9nLW92ZXJsYXkiLGZ1bmN0aW9uKHIpe3ZhciBpPWUudWkuZGlhbG9nLm92ZXJsYXkuaW5zdGFuY2VzO2kubGVuZ3RoIT09MCYmaVtpLmxlbmd0aC0xXT09PW4mJnQub3B0aW9ucy5jbG9zZU9uRXNjYXBlJiYhci5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmci5rZXlDb2RlJiZyLmtleUNvZGU9PT1lLnVpLmtleUNvZGUuRVNDQVBFJiYodC5jbG9zZShyKSxyLnByZXZlbnREZWZhdWx0KCkpfSksbi5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5jc3Moe3dpZHRoOnRoaXMud2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWlnaHQoKX0pLGUuZm4uYmdpZnJhbWUmJm4uYmdpZnJhbWUoKSx0aGlzLmluc3RhbmNlcy5wdXNoKG4pLG59LGRlc3Ryb3k6ZnVuY3Rpb24odCl7dmFyIG49ZS5pbkFycmF5KHQsdGhpcy5pbnN0YW5jZXMpLHI9MDtuIT09LTEmJnRoaXMub2xkSW5zdGFuY2VzLnB1c2godGhpcy5pbnN0YW5jZXMuc3BsaWNlKG4sMSlbMF0pLHRoaXMuaW5zdGFuY2VzLmxlbmd0aD09PTAmJmUoW2RvY3VtZW50LHdpbmRvd10pLnVuYmluZCgiLmRpYWxvZy1vdmVybGF5IiksdC5oZWlnaHQoMCkud2lkdGgoMCkucmVtb3ZlKCksZS5lYWNoKHRoaXMuaW5zdGFuY2VzLGZ1bmN0aW9uKCl7cj1NYXRoLm1heChyLHRoaXMuY3NzKCJ6LWluZGV4IikpfSksdGhpcy5tYXhaPXJ9LGhlaWdodDpmdW5jdGlvbigpe3ZhciB0LG47cmV0dXJuIGUudWkuaWU/KHQ9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCxkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCksbj1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0LGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0KSx0PG4/ZSh3aW5kb3cpLmhlaWdodCgpKyJweCI6dCsicHgiKTplKGRvY3VtZW50KS5oZWlnaHQoKSsicHgifSx3aWR0aDpmdW5jdGlvbigpe3ZhciB0LG47cmV0dXJuIGUudWkuaWU/KHQ9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoLGRvY3VtZW50LmJvZHkuc2Nyb2xsV2lkdGgpLG49TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldFdpZHRoLGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGgpLHQ8bj9lKHdpbmRvdykud2lkdGgoKSsicHgiOnQrInB4Iik6ZShkb2N1bWVudCkud2lkdGgoKSsicHgifSxyZXNpemU6ZnVuY3Rpb24oKXt2YXIgdD1lKFtdKTtlLmVhY2goZS51aS5kaWFsb2cub3ZlcmxheS5pbnN0YW5jZXMsZnVuY3Rpb24oKXt0PXQuYWRkKHRoaXMpfSksdC5jc3Moe3dpZHRoOjAsaGVpZ2h0OjB9KS5jc3Moe3dpZHRoOmUudWkuZGlhbG9nLm92ZXJsYXkud2lkdGgoKSxoZWlnaHQ6ZS51aS5kaWFsb2cub3ZlcmxheS5oZWlnaHQoKX0pfX0pLGUuZXh0ZW5kKGUudWkuZGlhbG9nLm92ZXJsYXkucHJvdG90eXBlLHtkZXN0cm95OmZ1bmN0aW9uKCl7ZS51aS5kaWFsb2cub3ZlcmxheS5kZXN0cm95KHRoaXMuJGVsKX19KX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7ZS53aWRnZXQoInVpLmRyYWdnYWJsZSIsZS51aS5tb3VzZSx7dmVyc2lvbjoiMS45LjIiLHdpZGdldEV2ZW50UHJlZml4OiJkcmFnIixvcHRpb25zOnthZGRDbGFzc2VzOiEwLGFwcGVuZFRvOiJwYXJlbnQiLGF4aXM6ITEsY29ubmVjdFRvU29ydGFibGU6ITEsY29udGFpbm1lbnQ6ITEsY3Vyc29yOiJhdXRvIixjdXJzb3JBdDohMSxncmlkOiExLGhhbmRsZTohMSxoZWxwZXI6Im9yaWdpbmFsIixpZnJhbWVGaXg6ITEsb3BhY2l0eTohMSxyZWZyZXNoUG9zaXRpb25zOiExLHJldmVydDohMSxyZXZlcnREdXJhdGlvbjo1MDAsc2NvcGU6ImRlZmF1bHQiLHNjcm9sbDohMCxzY3JvbGxTZW5zaXRpdml0eToyMCxzY3JvbGxTcGVlZDoyMCxzbmFwOiExLHNuYXBNb2RlOiJib3RoIixzbmFwVG9sZXJhbmNlOjIwLHN0YWNrOiExLHpJbmRleDohMX0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5oZWxwZXI9PSJvcmlnaW5hbCImJiEvXig/OnJ8YXxmKS8udGVzdCh0aGlzLmVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpKSYmKHRoaXMuZWxlbWVudFswXS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSx0aGlzLm9wdGlvbnMuYWRkQ2xhc3NlcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUiKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZHJhZ2dhYmxlLWRpc2FibGVkIiksdGhpcy5fbW91c2VJbml0KCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUgdWktZHJhZ2dhYmxlLWRyYWdnaW5nIHVpLWRyYWdnYWJsZS1kaXNhYmxlZCIpLHRoaXMuX21vdXNlRGVzdHJveSgpfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5oZWxwZXJ8fG4uZGlzYWJsZWR8fGUodC50YXJnZXQpLmlzKCIudWktcmVzaXphYmxlLWhhbmRsZSIpPyExOih0aGlzLmhhbmRsZT10aGlzLl9nZXRIYW5kbGUodCksdGhpcy5oYW5kbGU/KGUobi5pZnJhbWVGaXg9PT0hMD8iaWZyYW1lIjpuLmlmcmFtZUZpeCkuZWFjaChmdW5jdGlvbigpe2UoJzxkaXYgY2xhc3M9InVpLWRyYWdnYWJsZS1pZnJhbWVGaXgiIHN0eWxlPSJiYWNrZ3JvdW5kOiAjZmZmOyI+PC9kaXY+JykuY3NzKHt3aWR0aDp0aGlzLm9mZnNldFdpZHRoKyJweCIsaGVpZ2h0OnRoaXMub2Zmc2V0SGVpZ2h0KyJweCIscG9zaXRpb246ImFic29sdXRlIixvcGFjaXR5OiIwLjAwMSIsekluZGV4OjFlM30pLmNzcyhlKHRoaXMpLm9mZnNldCgpKS5hcHBlbmRUbygiYm9keSIpfSksITApOiExKX0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5vcHRpb25zO3JldHVybiB0aGlzLmhlbHBlcj10aGlzLl9jcmVhdGVIZWxwZXIodCksdGhpcy5oZWxwZXIuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpLHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSxlLnVpLmRkbWFuYWdlciYmKGUudWkuZGRtYW5hZ2VyLmN1cnJlbnQ9dGhpcyksdGhpcy5fY2FjaGVNYXJnaW5zKCksdGhpcy5jc3NQb3NpdGlvbj10aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIiksdGhpcy5zY3JvbGxQYXJlbnQ9dGhpcy5oZWxwZXIuc2Nyb2xsUGFyZW50KCksdGhpcy5vZmZzZXQ9dGhpcy5wb3NpdGlvbkFicz10aGlzLmVsZW1lbnQub2Zmc2V0KCksdGhpcy5vZmZzZXQ9e3RvcDp0aGlzLm9mZnNldC50b3AtdGhpcy5tYXJnaW5zLnRvcCxsZWZ0OnRoaXMub2Zmc2V0LmxlZnQtdGhpcy5tYXJnaW5zLmxlZnR9LGUuZXh0ZW5kKHRoaXMub2Zmc2V0LHtjbGljazp7bGVmdDp0LnBhZ2VYLXRoaXMub2Zmc2V0LmxlZnQsdG9wOnQucGFnZVktdGhpcy5vZmZzZXQudG9wfSxwYXJlbnQ6dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkscmVsYXRpdmU6dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKX0pLHRoaXMub3JpZ2luYWxQb3NpdGlvbj10aGlzLnBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24odCksdGhpcy5vcmlnaW5hbFBhZ2VYPXQucGFnZVgsdGhpcy5vcmlnaW5hbFBhZ2VZPXQucGFnZVksbi5jdXJzb3JBdCYmdGhpcy5fYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcihuLmN1cnNvckF0KSxuLmNvbnRhaW5tZW50JiZ0aGlzLl9zZXRDb250YWlubWVudCgpLHRoaXMuX3RyaWdnZXIoInN0YXJ0Iix0KT09PSExPyh0aGlzLl9jbGVhcigpLCExKToodGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpLGUudWkuZGRtYW5hZ2VyJiYhbi5kcm9wQmVoYXZpb3VyJiZlLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0aGlzLHQpLHRoaXMuX21vdXNlRHJhZyh0LCEwKSxlLnVpLmRkbWFuYWdlciYmZS51aS5kZG1hbmFnZXIuZHJhZ1N0YXJ0KHRoaXMsdCksITApfSxfbW91c2VEcmFnOmZ1bmN0aW9uKHQsbil7dGhpcy5wb3NpdGlvbj10aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKHQpLHRoaXMucG9zaXRpb25BYnM9dGhpcy5fY29udmVydFBvc2l0aW9uVG8oImFic29sdXRlIik7aWYoIW4pe3ZhciByPXRoaXMuX3VpSGFzaCgpO2lmKHRoaXMuX3RyaWdnZXIoImRyYWciLHQscik9PT0hMSlyZXR1cm4gdGhpcy5fbW91c2VVcCh7fSksITE7dGhpcy5wb3NpdGlvbj1yLnBvc2l0aW9ufWlmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ5Iil0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCsicHgiO2lmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ4Iil0aGlzLmhlbHBlclswXS5zdHlsZS50b3A9dGhpcy5wb3NpdGlvbi50b3ArInB4IjtyZXR1cm4gZS51aS5kZG1hbmFnZXImJmUudWkuZGRtYW5hZ2VyLmRyYWcodGhpcyx0KSwhMX0sX21vdXNlU3RvcDpmdW5jdGlvbih0KXt2YXIgbj0hMTtlLnVpLmRkbWFuYWdlciYmIXRoaXMub3B0aW9ucy5kcm9wQmVoYXZpb3VyJiYobj1lLnVpLmRkbWFuYWdlci5kcm9wKHRoaXMsdCkpLHRoaXMuZHJvcHBlZCYmKG49dGhpcy5kcm9wcGVkLHRoaXMuZHJvcHBlZD0hMSk7dmFyIHI9dGhpcy5lbGVtZW50WzBdLGk9ITE7d2hpbGUociYmKHI9ci5wYXJlbnROb2RlKSlyPT1kb2N1bWVudCYmKGk9ITApO2lmKCFpJiZ0aGlzLm9wdGlvbnMuaGVscGVyPT09Im9yaWdpbmFsIilyZXR1cm4hMTtpZih0aGlzLm9wdGlvbnMucmV2ZXJ0PT0iaW52YWxpZCImJiFufHx0aGlzLm9wdGlvbnMucmV2ZXJ0PT0idmFsaWQiJiZufHx0aGlzLm9wdGlvbnMucmV2ZXJ0PT09ITB8fGUuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMucmV2ZXJ0KSYmdGhpcy5vcHRpb25zLnJldmVydC5jYWxsKHRoaXMuZWxlbWVudCxuKSl7dmFyIHM9dGhpcztlKHRoaXMuaGVscGVyKS5hbmltYXRlKHRoaXMub3JpZ2luYWxQb3NpdGlvbixwYXJzZUludCh0aGlzLm9wdGlvbnMucmV2ZXJ0RHVyYXRpb24sMTApLGZ1bmN0aW9uKCl7cy5fdHJpZ2dlcigic3RvcCIsdCkhPT0hMSYmcy5fY2xlYXIoKX0pfWVsc2UgdGhpcy5fdHJpZ2dlcigic3RvcCIsdCkhPT0hMSYmdGhpcy5fY2xlYXIoKTtyZXR1cm4hMX0sX21vdXNlVXA6ZnVuY3Rpb24odCl7cmV0dXJuIGUoImRpdi51aS1kcmFnZ2FibGUtaWZyYW1lRml4IikuZWFjaChmdW5jdGlvbigpe3RoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKX0pLGUudWkuZGRtYW5hZ2VyJiZlLnVpLmRkbWFuYWdlci5kcmFnU3RvcCh0aGlzLHQpLGUudWkubW91c2UucHJvdG90eXBlLl9tb3VzZVVwLmNhbGwodGhpcyx0KX0sY2FuY2VsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGVscGVyLmlzKCIudWktZHJhZ2dhYmxlLWRyYWdnaW5nIik/dGhpcy5fbW91c2VVcCh7fSk6dGhpcy5fY2xlYXIoKSx0aGlzfSxfZ2V0SGFuZGxlOmZ1bmN0aW9uKHQpe3ZhciBuPSF0aGlzLm9wdGlvbnMuaGFuZGxlfHwhZSh0aGlzLm9wdGlvbnMuaGFuZGxlLHRoaXMuZWxlbWVudCkubGVuZ3RoPyEwOiExO3JldHVybiBlKHRoaXMub3B0aW9ucy5oYW5kbGUsdGhpcy5lbGVtZW50KS5maW5kKCIqIikuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXt0aGlzPT10LnRhcmdldCYmKG49ITApfSksbn0sX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbih0KXt2YXIgbj10aGlzLm9wdGlvbnMscj1lLmlzRnVuY3Rpb24obi5oZWxwZXIpP2Uobi5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLFt0XSkpOm4uaGVscGVyPT0iY2xvbmUiP3RoaXMuZWxlbWVudC5jbG9uZSgpLnJlbW92ZUF0dHIoImlkIik6dGhpcy5lbGVtZW50O3JldHVybiByLnBhcmVudHMoImJvZHkiKS5sZW5ndGh8fHIuYXBwZW5kVG8obi5hcHBlbmRUbz09InBhcmVudCI/dGhpcy5lbGVtZW50WzBdLnBhcmVudE5vZGU6bi5hcHBlbmRUbyksclswXSE9dGhpcy5lbGVtZW50WzBdJiYhLyhmaXhlZHxhYnNvbHV0ZSkvLnRlc3Qoci5jc3MoInBvc2l0aW9uIikpJiZyLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpLHJ9LF9hZGp1c3RPZmZzZXRGcm9tSGVscGVyOmZ1bmN0aW9uKHQpe3R5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9dC5zcGxpdCgiICIpKSxlLmlzQXJyYXkodCkmJih0PXtsZWZ0Oit0WzBdLHRvcDordFsxXXx8MH0pLCJsZWZ0ImluIHQmJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXQubGVmdCt0aGlzLm1hcmdpbnMubGVmdCksInJpZ2h0ImluIHQmJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdC5yaWdodCt0aGlzLm1hcmdpbnMubGVmdCksInRvcCJpbiB0JiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPXQudG9wK3RoaXMubWFyZ2lucy50b3ApLCJib3R0b20iaW4gdCYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10LmJvdHRvbSt0aGlzLm1hcmdpbnMudG9wKX0sX2dldFBhcmVudE9mZnNldDpmdW5jdGlvbigpe3RoaXMub2Zmc2V0UGFyZW50PXRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpO3ZhciB0PXRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpO3RoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJnRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmZS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSkmJih0LmxlZnQrPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSx0LnRvcCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCkpO2lmKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5fHx0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lJiZ0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJodG1sIiYmZS51aS5pZSl0PXt0b3A6MCxsZWZ0OjB9O3JldHVybnt0b3A6dC50b3ArKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLGxlZnQ6dC5sZWZ0KyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCl9fSxfZ2V0UmVsYXRpdmVPZmZzZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLmNzc1Bvc2l0aW9uPT0icmVsYXRpdmUiKXt2YXIgZT10aGlzLmVsZW1lbnQucG9zaXRpb24oKTtyZXR1cm57dG9wOmUudG9wLShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoInRvcCIpLDEwKXx8MCkrdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCksbGVmdDplLmxlZnQtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygibGVmdCIpLDEwKXx8MCkrdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpfX1yZXR1cm57dG9wOjAsbGVmdDowfX0sX2NhY2hlTWFyZ2luczpmdW5jdGlvbigpe3RoaXMubWFyZ2lucz17bGVmdDpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5MZWZ0IiksMTApfHwwLHRvcDpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5Ub3AiKSwxMCl8fDAscmlnaHQ6cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luUmlnaHQiKSwxMCl8fDAsYm90dG9tOnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpbkJvdHRvbSIpLDEwKXx8MH19LF9jYWNoZUhlbHBlclByb3BvcnRpb25zOmZ1bmN0aW9uKCl7dGhpcy5oZWxwZXJQcm9wb3J0aW9ucz17d2lkdGg6dGhpcy5oZWxwZXIub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmhlbHBlci5vdXRlckhlaWdodCgpfX0sX3NldENvbnRhaW5tZW50OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zO3QuY29udGFpbm1lbnQ9PSJwYXJlbnQiJiYodC5jb250YWlubWVudD10aGlzLmhlbHBlclswXS5wYXJlbnROb2RlKTtpZih0LmNvbnRhaW5tZW50PT0iZG9jdW1lbnQifHx0LmNvbnRhaW5tZW50PT0id2luZG93Iil0aGlzLmNvbnRhaW5tZW50PVt0LmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6ZSh3aW5kb3cpLnNjcm9sbExlZnQoKS10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0LHQuY29udGFpbm1lbnQ9PSJkb2N1bWVudCI/MDplKHdpbmRvdykuc2Nyb2xsVG9wKCktdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AsKHQuY29udGFpbm1lbnQ9PSJkb2N1bWVudCI/MDplKHdpbmRvdykuc2Nyb2xsTGVmdCgpKStlKHQuY29udGFpbm1lbnQ9PSJkb2N1bWVudCI/ZG9jdW1lbnQ6d2luZG93KS53aWR0aCgpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdGhpcy5tYXJnaW5zLmxlZnQsKHQuY29udGFpbm1lbnQ9PSJkb2N1bWVudCI/MDplKHdpbmRvdykuc2Nyb2xsVG9wKCkpKyhlKHQuY29udGFpbm1lbnQ9PSJkb2N1bWVudCI/ZG9jdW1lbnQ6d2luZG93KS5oZWlnaHQoKXx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF07aWYoIS9eKGRvY3VtZW50fHdpbmRvd3xwYXJlbnQpJC8udGVzdCh0LmNvbnRhaW5tZW50KSYmdC5jb250YWlubWVudC5jb25zdHJ1Y3RvciE9QXJyYXkpe3ZhciBuPWUodC5jb250YWlubWVudCkscj1uWzBdO2lmKCFyKXJldHVybjt2YXIgaT1uLm9mZnNldCgpLHM9ZShyKS5jc3MoIm92ZXJmbG93IikhPSJoaWRkZW4iO3RoaXMuY29udGFpbm1lbnQ9WyhwYXJzZUludChlKHIpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoZShyKS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKSwocGFyc2VJbnQoZShyKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoZShyKS5jc3MoInBhZGRpbmdUb3AiKSwxMCl8fDApLChzP01hdGgubWF4KHIuc2Nyb2xsV2lkdGgsci5vZmZzZXRXaWR0aCk6ci5vZmZzZXRXaWR0aCktKHBhcnNlSW50KGUocikuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApLShwYXJzZUludChlKHIpLmNzcygicGFkZGluZ1JpZ2h0IiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LXRoaXMubWFyZ2lucy5yaWdodCwocz9NYXRoLm1heChyLnNjcm9sbEhlaWdodCxyLm9mZnNldEhlaWdodCk6ci5vZmZzZXRIZWlnaHQpLShwYXJzZUludChlKHIpLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLShwYXJzZUludChlKHIpLmNzcygicGFkZGluZ0JvdHRvbSIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcC10aGlzLm1hcmdpbnMuYm90dG9tXSx0aGlzLnJlbGF0aXZlX2NvbnRhaW5lcj1ufWVsc2UgdC5jb250YWlubWVudC5jb25zdHJ1Y3Rvcj09QXJyYXkmJih0aGlzLmNvbnRhaW5tZW50PXQuY29udGFpbm1lbnQpfSxfY29udmVydFBvc2l0aW9uVG86ZnVuY3Rpb24odCxuKXtufHwobj10aGlzLnBvc2l0aW9uKTt2YXIgcj10PT0iYWJzb2x1dGUiPzE6LTEsaT10aGlzLm9wdGlvbnMscz10aGlzLmNzc1Bvc2l0aW9uIT0iYWJzb2x1dGUifHx0aGlzLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJiEhZS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSk/dGhpcy5zY3JvbGxQYXJlbnQ6dGhpcy5vZmZzZXRQYXJlbnQsbz0vKGh0bWx8Ym9keSkvaS50ZXN0KHNbMF0udGFnTmFtZSk7cmV0dXJue3RvcDpuLnRvcCt0aGlzLm9mZnNldC5yZWxhdGl2ZS50b3Aqcit0aGlzLm9mZnNldC5wYXJlbnQudG9wKnItKHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOm8/MDpzLnNjcm9sbFRvcCgpKSpyLGxlZnQ6bi5sZWZ0K3RoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQqcit0aGlzLm9mZnNldC5wYXJlbnQubGVmdCpyLSh0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6bz8wOnMuc2Nyb2xsTGVmdCgpKSpyfX0sX2dlbmVyYXRlUG9zaXRpb246ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5vcHRpb25zLHI9dGhpcy5jc3NQb3NpdGlvbiE9ImFic29sdXRlInx8dGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiYhIWUuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pP3RoaXMuc2Nyb2xsUGFyZW50OnRoaXMub2Zmc2V0UGFyZW50LGk9LyhodG1sfGJvZHkpL2kudGVzdChyWzBdLnRhZ05hbWUpLHM9dC5wYWdlWCxvPXQucGFnZVk7aWYodGhpcy5vcmlnaW5hbFBvc2l0aW9uKXt2YXIgdTtpZih0aGlzLmNvbnRhaW5tZW50KXtpZih0aGlzLnJlbGF0aXZlX2NvbnRhaW5lcil7dmFyIGE9dGhpcy5yZWxhdGl2ZV9jb250YWluZXIub2Zmc2V0KCk7dT1bdGhpcy5jb250YWlubWVudFswXSthLmxlZnQsdGhpcy5jb250YWlubWVudFsxXSthLnRvcCx0aGlzLmNvbnRhaW5tZW50WzJdK2EubGVmdCx0aGlzLmNvbnRhaW5tZW50WzNdK2EudG9wXX1lbHNlIHU9dGhpcy5jb250YWlubWVudDt0LnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8dVswXSYmKHM9dVswXSt0aGlzLm9mZnNldC5jbGljay5sZWZ0KSx0LnBhZ2VZLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDx1WzFdJiYobz11WzFdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCksdC5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PnVbMl0mJihzPXVbMl0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksdC5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A+dVszXSYmKG89dVszXSt0aGlzLm9mZnNldC5jbGljay50b3ApfWlmKG4uZ3JpZCl7dmFyIGY9bi5ncmlkWzFdP3RoaXMub3JpZ2luYWxQYWdlWStNYXRoLnJvdW5kKChvLXRoaXMub3JpZ2luYWxQYWdlWSkvbi5ncmlkWzFdKSpuLmdyaWRbMV06dGhpcy5vcmlnaW5hbFBhZ2VZO289dT9mLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDx1WzFdfHxmLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD51WzNdP2YtdGhpcy5vZmZzZXQuY2xpY2sudG9wPHVbMV0/ZituLmdyaWRbMV06Zi1uLmdyaWRbMV06ZjpmO3ZhciBsPW4uZ3JpZFswXT90aGlzLm9yaWdpbmFsUGFnZVgrTWF0aC5yb3VuZCgocy10aGlzLm9yaWdpbmFsUGFnZVgpL24uZ3JpZFswXSkqbi5ncmlkWzBdOnRoaXMub3JpZ2luYWxQYWdlWDtzPXU/bC10aGlzLm9mZnNldC5jbGljay5sZWZ0PHVbMF18fGwtdGhpcy5vZmZzZXQuY2xpY2subGVmdD51WzJdP2wtdGhpcy5vZmZzZXQuY2xpY2subGVmdDx1WzBdP2wrbi5ncmlkWzBdOmwtbi5ncmlkWzBdOmw6bH19cmV0dXJue3RvcDpvLXRoaXMub2Zmc2V0LmNsaWNrLnRvcC10aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AtdGhpcy5vZmZzZXQucGFyZW50LnRvcCsodGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCk6aT8wOnIuc2Nyb2xsVG9wKCkpLGxlZnQ6cy10aGlzLm9mZnNldC5jbGljay5sZWZ0LXRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQrKHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTppPzA6ci5zY3JvbGxMZWZ0KCkpfX0sX2NsZWFyOmZ1bmN0aW9uKCl7dGhpcy5oZWxwZXIucmVtb3ZlQ2xhc3MoInVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpLHRoaXMuaGVscGVyWzBdIT10aGlzLmVsZW1lbnRbMF0mJiF0aGlzLmNhbmNlbEhlbHBlclJlbW92YWwmJnRoaXMuaGVscGVyLnJlbW92ZSgpLHRoaXMuaGVscGVyPW51bGwsdGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsPSExfSxfdHJpZ2dlcjpmdW5jdGlvbih0LG4scil7cmV0dXJuIHI9cnx8dGhpcy5fdWlIYXNoKCksZS51aS5wbHVnaW4uY2FsbCh0aGlzLHQsW24scl0pLHQ9PSJkcmFnIiYmKHRoaXMucG9zaXRpb25BYnM9dGhpcy5fY29udmVydFBvc2l0aW9uVG8oImFic29sdXRlIikpLGUuV2lkZ2V0LnByb3RvdHlwZS5fdHJpZ2dlci5jYWxsKHRoaXMsdCxuLHIpfSxwbHVnaW5zOnt9LF91aUhhc2g6ZnVuY3Rpb24oZSl7cmV0dXJue2hlbHBlcjp0aGlzLmhlbHBlcixwb3NpdGlvbjp0aGlzLnBvc2l0aW9uLG9yaWdpbmFsUG9zaXRpb246dGhpcy5vcmlnaW5hbFBvc2l0aW9uLG9mZnNldDp0aGlzLnBvc2l0aW9uQWJzfX19KSxlLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsImNvbm5lY3RUb1NvcnRhYmxlIix7c3RhcnQ6ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGk9ci5vcHRpb25zLHM9ZS5leHRlbmQoe30sbix7aXRlbTpyLmVsZW1lbnR9KTtyLnNvcnRhYmxlcz1bXSxlKGkuY29ubmVjdFRvU29ydGFibGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1lLmRhdGEodGhpcywic29ydGFibGUiKTtuJiYhbi5vcHRpb25zLmRpc2FibGVkJiYoci5zb3J0YWJsZXMucHVzaCh7aW5zdGFuY2U6bixzaG91bGRSZXZlcnQ6bi5vcHRpb25zLnJldmVydH0pLG4ucmVmcmVzaFBvc2l0aW9ucygpLG4uX3RyaWdnZXIoImFjdGl2YXRlIix0LHMpKX0pfSxzdG9wOmZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxpPWUuZXh0ZW5kKHt9LG4se2l0ZW06ci5lbGVtZW50fSk7ZS5lYWNoKHIuc29ydGFibGVzLGZ1bmN0aW9uKCl7dGhpcy5pbnN0YW5jZS5pc092ZXI/KHRoaXMuaW5zdGFuY2UuaXNPdmVyPTAsci5jYW5jZWxIZWxwZXJSZW1vdmFsPSEwLHRoaXMuaW5zdGFuY2UuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMSx0aGlzLnNob3VsZFJldmVydCYmKHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXZlcnQ9ITApLHRoaXMuaW5zdGFuY2UuX21vdXNlU3RvcCh0KSx0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyPXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5faGVscGVyLHIub3B0aW9ucy5oZWxwZXI9PSJvcmlnaW5hbCImJnRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW0uY3NzKHt0b3A6ImF1dG8iLGxlZnQ6ImF1dG8ifSkpOih0aGlzLmluc3RhbmNlLmNhbmNlbEhlbHBlclJlbW92YWw9ITEsdGhpcy5pbnN0YW5jZS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsdCxpKSl9KX0sZHJhZzpmdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksaT10aGlzLHM9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5vZmZzZXQuY2xpY2sudG9wLHI9dGhpcy5vZmZzZXQuY2xpY2subGVmdCxpPXRoaXMucG9zaXRpb25BYnMudG9wLHM9dGhpcy5wb3NpdGlvbkFicy5sZWZ0LG89dC5oZWlnaHQsdT10LndpZHRoLGE9dC50b3AsZj10LmxlZnQ7cmV0dXJuIGUudWkuaXNPdmVyKGkrbixzK3IsYSxmLG8sdSl9O2UuZWFjaChyLnNvcnRhYmxlcyxmdW5jdGlvbihzKXt2YXIgbz0hMSx1PXRoaXM7dGhpcy5pbnN0YW5jZS5wb3NpdGlvbkFicz1yLnBvc2l0aW9uQWJzLHRoaXMuaW5zdGFuY2UuaGVscGVyUHJvcG9ydGlvbnM9ci5oZWxwZXJQcm9wb3J0aW9ucyx0aGlzLmluc3RhbmNlLm9mZnNldC5jbGljaz1yLm9mZnNldC5jbGljayx0aGlzLmluc3RhbmNlLl9pbnRlcnNlY3RzV2l0aCh0aGlzLmluc3RhbmNlLmNvbnRhaW5lckNhY2hlKSYmKG89ITAsZS5lYWNoKHIuc29ydGFibGVzLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zdGFuY2UucG9zaXRpb25BYnM9ci5wb3NpdGlvbkFicyx0aGlzLmluc3RhbmNlLmhlbHBlclByb3BvcnRpb25zPXIuaGVscGVyUHJvcG9ydGlvbnMsdGhpcy5pbnN0YW5jZS5vZmZzZXQuY2xpY2s9ci5vZmZzZXQuY2xpY2ssdGhpcyE9dSYmdGhpcy5pbnN0YW5jZS5faW50ZXJzZWN0c1dpdGgodGhpcy5pbnN0YW5jZS5jb250YWluZXJDYWNoZSkmJmUudWkuY29udGFpbnModS5pbnN0YW5jZS5lbGVtZW50WzBdLHRoaXMuaW5zdGFuY2UuZWxlbWVudFswXSkmJihvPSExKSxvfSkpLG8/KHRoaXMuaW5zdGFuY2UuaXNPdmVyfHwodGhpcy5pbnN0YW5jZS5pc092ZXI9MSx0aGlzLmluc3RhbmNlLmN1cnJlbnRJdGVtPWUoaSkuY2xvbmUoKS5yZW1vdmVBdHRyKCJpZCIpLmFwcGVuZFRvKHRoaXMuaW5zdGFuY2UuZWxlbWVudCkuZGF0YSgic29ydGFibGUtaXRlbSIsITApLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5faGVscGVyPXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXIsdGhpcy5pbnN0YW5jZS5vcHRpb25zLmhlbHBlcj1mdW5jdGlvbigpe3JldHVybiBuLmhlbHBlclswXX0sdC50YXJnZXQ9dGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbVswXSx0aGlzLmluc3RhbmNlLl9tb3VzZUNhcHR1cmUodCwhMCksdGhpcy5pbnN0YW5jZS5fbW91c2VTdGFydCh0LCEwLCEwKSx0aGlzLmluc3RhbmNlLm9mZnNldC5jbGljay50b3A9ci5vZmZzZXQuY2xpY2sudG9wLHRoaXMuaW5zdGFuY2Uub2Zmc2V0LmNsaWNrLmxlZnQ9ci5vZmZzZXQuY2xpY2subGVmdCx0aGlzLmluc3RhbmNlLm9mZnNldC5wYXJlbnQubGVmdC09ci5vZmZzZXQucGFyZW50LmxlZnQtdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LmxlZnQsdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LnRvcC09ci5vZmZzZXQucGFyZW50LnRvcC10aGlzLmluc3RhbmNlLm9mZnNldC5wYXJlbnQudG9wLHIuX3RyaWdnZXIoInRvU29ydGFibGUiLHQpLHIuZHJvcHBlZD10aGlzLmluc3RhbmNlLmVsZW1lbnQsci5jdXJyZW50SXRlbT1yLmVsZW1lbnQsdGhpcy5pbnN0YW5jZS5mcm9tT3V0c2lkZT1yKSx0aGlzLmluc3RhbmNlLmN1cnJlbnRJdGVtJiZ0aGlzLmluc3RhbmNlLl9tb3VzZURyYWcodCkpOnRoaXMuaW5zdGFuY2UuaXNPdmVyJiYodGhpcy5pbnN0YW5jZS5pc092ZXI9MCx0aGlzLmluc3RhbmNlLmNhbmNlbEhlbHBlclJlbW92YWw9ITAsdGhpcy5pbnN0YW5jZS5vcHRpb25zLnJldmVydD0hMSx0aGlzLmluc3RhbmNlLl90cmlnZ2VyKCJvdXQiLHQsdGhpcy5pbnN0YW5jZS5fdWlIYXNoKHRoaXMuaW5zdGFuY2UpKSx0aGlzLmluc3RhbmNlLl9tb3VzZVN0b3AodCwhMCksdGhpcy5pbnN0YW5jZS5vcHRpb25zLmhlbHBlcj10aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlcix0aGlzLmluc3RhbmNlLmN1cnJlbnRJdGVtLnJlbW92ZSgpLHRoaXMuaW5zdGFuY2UucGxhY2Vob2xkZXImJnRoaXMuaW5zdGFuY2UucGxhY2Vob2xkZXIucmVtb3ZlKCksci5fdHJpZ2dlcigiZnJvbVNvcnRhYmxlIix0KSxyLmRyb3BwZWQ9ITEpfSl9fSksZS51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJjdXJzb3IiLHtzdGFydDpmdW5jdGlvbih0LG4pe3ZhciByPWUoImJvZHkiKSxpPWUodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9ucztyLmNzcygiY3Vyc29yIikmJihpLl9jdXJzb3I9ci5jc3MoImN1cnNvciIpKSxyLmNzcygiY3Vyc29yIixpLmN1cnNvcil9LHN0b3A6ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ci5fY3Vyc29yJiZlKCJib2R5IikuY3NzKCJjdXJzb3IiLHIuX2N1cnNvcil9fSksZS51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJvcGFjaXR5Iix7c3RhcnQ6ZnVuY3Rpb24odCxuKXt2YXIgcj1lKG4uaGVscGVyKSxpPWUodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9ucztyLmNzcygib3BhY2l0eSIpJiYoaS5fb3BhY2l0eT1yLmNzcygib3BhY2l0eSIpKSxyLmNzcygib3BhY2l0eSIsaS5vcGFjaXR5KX0sc3RvcDpmdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9ucztyLl9vcGFjaXR5JiZlKG4uaGVscGVyKS5jc3MoIm9wYWNpdHkiLHIuX29wYWNpdHkpfX0pLGUudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwic2Nyb2xsIix7c3RhcnQ6ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpO3Iuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmci5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSE9IkhUTUwiJiYoci5vdmVyZmxvd09mZnNldD1yLnNjcm9sbFBhcmVudC5vZmZzZXQoKSl9LGRyYWc6ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGk9ci5vcHRpb25zLHM9ITE7aWYoci5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZyLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0iSFRNTCIpe2lmKCFpLmF4aXN8fGkuYXhpcyE9IngiKXIub3ZlcmZsb3dPZmZzZXQudG9wK3Iuc2Nyb2xsUGFyZW50WzBdLm9mZnNldEhlaWdodC10LnBhZ2VZPGkuc2Nyb2xsU2Vuc2l0aXZpdHk/ci5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wPXM9ci5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wK2kuc2Nyb2xsU3BlZWQ6dC5wYWdlWS1yLm92ZXJmbG93T2Zmc2V0LnRvcDxpLnNjcm9sbFNlbnNpdGl2aXR5JiYoci5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wPXM9ci5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wLWkuc2Nyb2xsU3BlZWQpO2lmKCFpLmF4aXN8fGkuYXhpcyE9InkiKXIub3ZlcmZsb3dPZmZzZXQubGVmdCtyLnNjcm9sbFBhcmVudFswXS5vZmZzZXRXaWR0aC10LnBhZ2VYPGkuc2Nyb2xsU2Vuc2l0aXZpdHk/ci5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1zPXIuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQraS5zY3JvbGxTcGVlZDp0LnBhZ2VYLXIub3ZlcmZsb3dPZmZzZXQubGVmdDxpLnNjcm9sbFNlbnNpdGl2aXR5JiYoci5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1zPXIuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQtaS5zY3JvbGxTcGVlZCl9ZWxzZXtpZighaS5heGlzfHxpLmF4aXMhPSJ4Iil0LnBhZ2VZLWUoZG9jdW1lbnQpLnNjcm9sbFRvcCgpPGkuc2Nyb2xsU2Vuc2l0aXZpdHk/cz1lKGRvY3VtZW50KS5zY3JvbGxUb3AoZShkb2N1bWVudCkuc2Nyb2xsVG9wKCktaS5zY3JvbGxTcGVlZCk6ZSh3aW5kb3cpLmhlaWdodCgpLSh0LnBhZ2VZLWUoZG9jdW1lbnQpLnNjcm9sbFRvcCgpKTxpLnNjcm9sbFNlbnNpdGl2aXR5JiYocz1lKGRvY3VtZW50KS5zY3JvbGxUb3AoZShkb2N1bWVudCkuc2Nyb2xsVG9wKCkraS5zY3JvbGxTcGVlZCkpO2lmKCFpLmF4aXN8fGkuYXhpcyE9InkiKXQucGFnZVgtZShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpPGkuc2Nyb2xsU2Vuc2l0aXZpdHk/cz1lKGRvY3VtZW50KS5zY3JvbGxMZWZ0KGUoZG9jdW1lbnQpLnNjcm9sbExlZnQoKS1pLnNjcm9sbFNwZWVkKTplKHdpbmRvdykud2lkdGgoKS0odC5wYWdlWC1lKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkpPGkuc2Nyb2xsU2Vuc2l0aXZpdHkmJihzPWUoZG9jdW1lbnQpLnNjcm9sbExlZnQoZShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpK2kuc2Nyb2xsU3BlZWQpKX1zIT09ITEmJmUudWkuZGRtYW5hZ2VyJiYhaS5kcm9wQmVoYXZpb3VyJiZlLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyhyLHQpfX0pLGUudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwic25hcCIse3N0YXJ0OmZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxpPXIub3B0aW9ucztyLnNuYXBFbGVtZW50cz1bXSxlKGkuc25hcC5jb25zdHJ1Y3RvciE9U3RyaW5nP2kuc25hcC5pdGVtc3x8IjpkYXRhKGRyYWdnYWJsZSkiOmkuc25hcCkuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcyksbj10Lm9mZnNldCgpO3RoaXMhPXIuZWxlbWVudFswXSYmci5zbmFwRWxlbWVudHMucHVzaCh7aXRlbTp0aGlzLHdpZHRoOnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0Lm91dGVySGVpZ2h0KCksdG9wOm4udG9wLGxlZnQ6bi5sZWZ0fSl9KX0sZHJhZzpmdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksaT1yLm9wdGlvbnMscz1pLnNuYXBUb2xlcmFuY2Usbz1uLm9mZnNldC5sZWZ0LHU9bytyLmhlbHBlclByb3BvcnRpb25zLndpZHRoLGE9bi5vZmZzZXQudG9wLGY9YStyLmhlbHBlclByb3BvcnRpb25zLmhlaWdodDtmb3IodmFyIGw9ci5zbmFwRWxlbWVudHMubGVuZ3RoLTE7bD49MDtsLS0pe3ZhciBjPXIuc25hcEVsZW1lbnRzW2xdLmxlZnQsaD1jK3Iuc25hcEVsZW1lbnRzW2xdLndpZHRoLHA9ci5zbmFwRWxlbWVudHNbbF0udG9wLGQ9cCtyLnNuYXBFbGVtZW50c1tsXS5oZWlnaHQ7aWYoIShjLXM8byYmbzxoK3MmJnAtczxhJiZhPGQrc3x8Yy1zPG8mJm88aCtzJiZwLXM8ZiYmZjxkK3N8fGMtczx1JiZ1PGgrcyYmcC1zPGEmJmE8ZCtzfHxjLXM8dSYmdTxoK3MmJnAtczxmJiZmPGQrcykpe3Iuc25hcEVsZW1lbnRzW2xdLnNuYXBwaW5nJiZyLm9wdGlvbnMuc25hcC5yZWxlYXNlJiZyLm9wdGlvbnMuc25hcC5yZWxlYXNlLmNhbGwoci5lbGVtZW50LHQsZS5leHRlbmQoci5fdWlIYXNoKCkse3NuYXBJdGVtOnIuc25hcEVsZW1lbnRzW2xdLml0ZW19KSksci5zbmFwRWxlbWVudHNbbF0uc25hcHBpbmc9ITE7Y29udGludWV9aWYoaS5zbmFwTW9kZSE9ImlubmVyIil7dmFyIHY9TWF0aC5hYnMocC1mKTw9cyxtPU1hdGguYWJzKGQtYSk8PXMsZz1NYXRoLmFicyhjLXUpPD1zLHk9TWF0aC5hYnMoaC1vKTw9czt2JiYobi5wb3NpdGlvbi50b3A9ci5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOnAtci5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsbGVmdDowfSkudG9wLXIubWFyZ2lucy50b3ApLG0mJihuLnBvc2l0aW9uLnRvcD1yLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6ZCxsZWZ0OjB9KS50b3Atci5tYXJnaW5zLnRvcCksZyYmKG4ucG9zaXRpb24ubGVmdD1yLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0OmMtci5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aH0pLmxlZnQtci5tYXJnaW5zLmxlZnQpLHkmJihuLnBvc2l0aW9uLmxlZnQ9ci5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOjAsbGVmdDpofSkubGVmdC1yLm1hcmdpbnMubGVmdCl9dmFyIGI9dnx8bXx8Z3x8eTtpZihpLnNuYXBNb2RlIT0ib3V0ZXIiKXt2YXIgdj1NYXRoLmFicyhwLWEpPD1zLG09TWF0aC5hYnMoZC1mKTw9cyxnPU1hdGguYWJzKGMtbyk8PXMseT1NYXRoLmFicyhoLXUpPD1zO3YmJihuLnBvc2l0aW9uLnRvcD1yLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6cCxsZWZ0OjB9KS50b3Atci5tYXJnaW5zLnRvcCksbSYmKG4ucG9zaXRpb24udG9wPXIuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDpkLXIuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGxlZnQ6MH0pLnRvcC1yLm1hcmdpbnMudG9wKSxnJiYobi5wb3NpdGlvbi5sZWZ0PXIuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6Y30pLmxlZnQtci5tYXJnaW5zLmxlZnQpLHkmJihuLnBvc2l0aW9uLmxlZnQ9ci5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOjAsbGVmdDpoLXIuaGVscGVyUHJvcG9ydGlvbnMud2lkdGh9KS5sZWZ0LXIubWFyZ2lucy5sZWZ0KX0hci5zbmFwRWxlbWVudHNbbF0uc25hcHBpbmcmJih2fHxtfHxnfHx5fHxiKSYmci5vcHRpb25zLnNuYXAuc25hcCYmci5vcHRpb25zLnNuYXAuc25hcC5jYWxsKHIuZWxlbWVudCx0LGUuZXh0ZW5kKHIuX3VpSGFzaCgpLHtzbmFwSXRlbTpyLnNuYXBFbGVtZW50c1tsXS5pdGVtfSkpLHIuc25hcEVsZW1lbnRzW2xdLnNuYXBwaW5nPXZ8fG18fGd8fHl8fGJ9fX0pLGUudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwic3RhY2siLHtzdGFydDpmdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9ucyxpPWUubWFrZUFycmF5KGUoci5zdGFjaykpLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4ocGFyc2VJbnQoZSh0KS5jc3MoInpJbmRleCIpLDEwKXx8MCktKHBhcnNlSW50KGUobikuY3NzKCJ6SW5kZXgiKSwxMCl8fDApfSk7aWYoIWkubGVuZ3RoKXJldHVybjt2YXIgcz1wYXJzZUludChpWzBdLnN0eWxlLnpJbmRleCl8fDA7ZShpKS5lYWNoKGZ1bmN0aW9uKGUpe3RoaXMuc3R5bGUuekluZGV4PXMrZX0pLHRoaXNbMF0uc3R5bGUuekluZGV4PXMraS5sZW5ndGh9fSksZS51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJ6SW5kZXgiLHtzdGFydDpmdW5jdGlvbih0LG4pe3ZhciByPWUobi5oZWxwZXIpLGk9ZSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zO3IuY3NzKCJ6SW5kZXgiKSYmKGkuX3pJbmRleD1yLmNzcygiekluZGV4IikpLHIuY3NzKCJ6SW5kZXgiLGkuekluZGV4KX0sc3RvcDpmdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9ucztyLl96SW5kZXgmJmUobi5oZWxwZXIpLmNzcygiekluZGV4IixyLl96SW5kZXgpfX0pfSkoalF1ZXJ5KTsoZnVuY3Rpb24oZSx0KXtlLndpZGdldCgidWkuZHJvcHBhYmxlIix7dmVyc2lvbjoiMS45LjIiLHdpZGdldEV2ZW50UHJlZml4OiJkcm9wIixvcHRpb25zOnthY2NlcHQ6IioiLGFjdGl2ZUNsYXNzOiExLGFkZENsYXNzZXM6ITAsZ3JlZWR5OiExLGhvdmVyQ2xhc3M6ITEsc2NvcGU6ImRlZmF1bHQiLHRvbGVyYW5jZToiaW50ZXJzZWN0In0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucyxuPXQuYWNjZXB0O3RoaXMuaXNvdmVyPTAsdGhpcy5pc291dD0xLHRoaXMuYWNjZXB0PWUuaXNGdW5jdGlvbihuKT9uOmZ1bmN0aW9uKGUpe3JldHVybiBlLmlzKG4pfSx0aGlzLnByb3BvcnRpb25zPXt3aWR0aDp0aGlzLmVsZW1lbnRbMF0ub2Zmc2V0V2lkdGgsaGVpZ2h0OnRoaXMuZWxlbWVudFswXS5vZmZzZXRIZWlnaHR9LGUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdC5zY29wZV09ZS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0LnNjb3BlXXx8W10sZS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0LnNjb3BlXS5wdXNoKHRoaXMpLHQuYWRkQ2xhc3NlcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcm9wcGFibGUiKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgdD1lLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3RoaXMub3B0aW9ucy5zY29wZV07Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXT09dGhpcyYmdC5zcGxpY2UobiwxKTt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWRyb3BwYWJsZSB1aS1kcm9wcGFibGUtZGlzYWJsZWQiKX0sX3NldE9wdGlvbjpmdW5jdGlvbih0LG4pe3Q9PSJhY2NlcHQiJiYodGhpcy5hY2NlcHQ9ZS5pc0Z1bmN0aW9uKG4pP246ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXMobil9KSxlLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9hY3RpdmF0ZTpmdW5jdGlvbih0KXt2YXIgbj1lLnVpLmRkbWFuYWdlci5jdXJyZW50O3RoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksbiYmdGhpcy5fdHJpZ2dlcigiYWN0aXZhdGUiLHQsdGhpcy51aShuKSl9LF9kZWFjdGl2YXRlOmZ1bmN0aW9uKHQpe3ZhciBuPWUudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7dGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSxuJiZ0aGlzLl90cmlnZ2VyKCJkZWFjdGl2YXRlIix0LHRoaXMudWkobikpfSxfb3ZlcjpmdW5jdGlvbih0KXt2YXIgbj1lLnVpLmRkbWFuYWdlci5jdXJyZW50O2lmKCFufHwobi5jdXJyZW50SXRlbXx8bi5lbGVtZW50KVswXT09dGhpcy5lbGVtZW50WzBdKXJldHVybjt0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSxuLmN1cnJlbnRJdGVtfHxuLmVsZW1lbnQpJiYodGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MmJnRoaXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyksdGhpcy5fdHJpZ2dlcigib3ZlciIsdCx0aGlzLnVpKG4pKSl9LF9vdXQ6ZnVuY3Rpb24odCl7dmFyIG49ZS51aS5kZG1hbmFnZXIuY3VycmVudDtpZighbnx8KG4uY3VycmVudEl0ZW18fG4uZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFswXSlyZXR1cm47dGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sbi5jdXJyZW50SXRlbXx8bi5lbGVtZW50KSYmKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpLHRoaXMuX3RyaWdnZXIoIm91dCIsdCx0aGlzLnVpKG4pKSl9LF9kcm9wOmZ1bmN0aW9uKHQsbil7dmFyIHI9bnx8ZS51aS5kZG1hbmFnZXIuY3VycmVudDtpZighcnx8KHIuY3VycmVudEl0ZW18fHIuZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFswXSlyZXR1cm4hMTt2YXIgaT0hMTtyZXR1cm4gdGhpcy5lbGVtZW50LmZpbmQoIjpkYXRhKGRyb3BwYWJsZSkiKS5ub3QoIi51aS1kcmFnZ2FibGUtZHJhZ2dpbmciKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5kYXRhKHRoaXMsImRyb3BwYWJsZSIpO2lmKHQub3B0aW9ucy5ncmVlZHkmJiF0Lm9wdGlvbnMuZGlzYWJsZWQmJnQub3B0aW9ucy5zY29wZT09ci5vcHRpb25zLnNjb3BlJiZ0LmFjY2VwdC5jYWxsKHQuZWxlbWVudFswXSxyLmN1cnJlbnRJdGVtfHxyLmVsZW1lbnQpJiZlLnVpLmludGVyc2VjdChyLGUuZXh0ZW5kKHQse29mZnNldDp0LmVsZW1lbnQub2Zmc2V0KCl9KSx0Lm9wdGlvbnMudG9sZXJhbmNlKSlyZXR1cm4gaT0hMCwhMX0pLGk/ITE6dGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sci5jdXJyZW50SXRlbXx8ci5lbGVtZW50KT8odGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSx0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyYmdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzKSx0aGlzLl90cmlnZ2VyKCJkcm9wIix0LHRoaXMudWkocikpLHRoaXMuZWxlbWVudCk6ITF9LHVpOmZ1bmN0aW9uKGUpe3JldHVybntkcmFnZ2FibGU6ZS5jdXJyZW50SXRlbXx8ZS5lbGVtZW50LGhlbHBlcjplLmhlbHBlcixwb3NpdGlvbjplLnBvc2l0aW9uLG9mZnNldDplLnBvc2l0aW9uQWJzfX19KSxlLnVpLmludGVyc2VjdD1mdW5jdGlvbih0LG4scil7aWYoIW4ub2Zmc2V0KXJldHVybiExO3ZhciBpPSh0LnBvc2l0aW9uQWJzfHx0LnBvc2l0aW9uLmFic29sdXRlKS5sZWZ0LHM9aSt0LmhlbHBlclByb3BvcnRpb25zLndpZHRoLG89KHQucG9zaXRpb25BYnN8fHQucG9zaXRpb24uYWJzb2x1dGUpLnRvcCx1PW8rdC5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsYT1uLm9mZnNldC5sZWZ0LGY9YStuLnByb3BvcnRpb25zLndpZHRoLGw9bi5vZmZzZXQudG9wLGM9bCtuLnByb3BvcnRpb25zLmhlaWdodDtzd2l0Y2gocil7Y2FzZSJmaXQiOnJldHVybiBhPD1pJiZzPD1mJiZsPD1vJiZ1PD1jO2Nhc2UiaW50ZXJzZWN0IjpyZXR1cm4gYTxpK3QuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMiYmcy10LmhlbHBlclByb3BvcnRpb25zLndpZHRoLzI8ZiYmbDxvK3QuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzImJnUtdC5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMjxjO2Nhc2UicG9pbnRlciI6dmFyIGg9KHQucG9zaXRpb25BYnN8fHQucG9zaXRpb24uYWJzb2x1dGUpLmxlZnQrKHQuY2xpY2tPZmZzZXR8fHQub2Zmc2V0LmNsaWNrKS5sZWZ0LHA9KHQucG9zaXRpb25BYnN8fHQucG9zaXRpb24uYWJzb2x1dGUpLnRvcCsodC5jbGlja09mZnNldHx8dC5vZmZzZXQuY2xpY2spLnRvcCxkPWUudWkuaXNPdmVyKHAsaCxsLGEsbi5wcm9wb3J0aW9ucy5oZWlnaHQsbi5wcm9wb3J0aW9ucy53aWR0aCk7cmV0dXJuIGQ7Y2FzZSJ0b3VjaCI6cmV0dXJuKG8+PWwmJm88PWN8fHU+PWwmJnU8PWN8fG88bCYmdT5jKSYmKGk+PWEmJmk8PWZ8fHM+PWEmJnM8PWZ8fGk8YSYmcz5mKTtkZWZhdWx0OnJldHVybiExfX0sZS51aS5kZG1hbmFnZXI9e2N1cnJlbnQ6bnVsbCxkcm9wcGFibGVzOnsiZGVmYXVsdCI6W119LHByZXBhcmVPZmZzZXRzOmZ1bmN0aW9uKHQsbil7dmFyIHI9ZS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0Lm9wdGlvbnMuc2NvcGVdfHxbXSxpPW4/bi50eXBlOm51bGwscz0odC5jdXJyZW50SXRlbXx8dC5lbGVtZW50KS5maW5kKCI6ZGF0YShkcm9wcGFibGUpIikuYW5kU2VsZigpO2U6Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspe2lmKHJbb10ub3B0aW9ucy5kaXNhYmxlZHx8dCYmIXJbb10uYWNjZXB0LmNhbGwocltvXS5lbGVtZW50WzBdLHQuY3VycmVudEl0ZW18fHQuZWxlbWVudCkpY29udGludWU7Zm9yKHZhciB1PTA7dTxzLmxlbmd0aDt1KyspaWYoc1t1XT09cltvXS5lbGVtZW50WzBdKXtyW29dLnByb3BvcnRpb25zLmhlaWdodD0wO2NvbnRpbnVlIGV9cltvXS52aXNpYmxlPXJbb10uZWxlbWVudC5jc3MoImRpc3BsYXkiKSE9Im5vbmUiO2lmKCFyW29dLnZpc2libGUpY29udGludWU7aT09Im1vdXNlZG93biImJnJbb10uX2FjdGl2YXRlLmNhbGwocltvXSxuKSxyW29dLm9mZnNldD1yW29dLmVsZW1lbnQub2Zmc2V0KCkscltvXS5wcm9wb3J0aW9ucz17d2lkdGg6cltvXS5lbGVtZW50WzBdLm9mZnNldFdpZHRoLGhlaWdodDpyW29dLmVsZW1lbnRbMF0ub2Zmc2V0SGVpZ2h0fX19LGRyb3A6ZnVuY3Rpb24odCxuKXt2YXIgcj0hMTtyZXR1cm4gZS5lYWNoKGUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdC5vcHRpb25zLnNjb3BlXXx8W10sZnVuY3Rpb24oKXtpZighdGhpcy5vcHRpb25zKXJldHVybjshdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLnZpc2libGUmJmUudWkuaW50ZXJzZWN0KHQsdGhpcyx0aGlzLm9wdGlvbnMudG9sZXJhbmNlKSYmKHI9dGhpcy5fZHJvcC5jYWxsKHRoaXMsbil8fHIpLCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMudmlzaWJsZSYmdGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sdC5jdXJyZW50SXRlbXx8dC5lbGVtZW50KSYmKHRoaXMuaXNvdXQ9MSx0aGlzLmlzb3Zlcj0wLHRoaXMuX2RlYWN0aXZhdGUuY2FsbCh0aGlzLG4pKX0pLHJ9LGRyYWdTdGFydDpmdW5jdGlvbih0LG4pe3QuZWxlbWVudC5wYXJlbnRzVW50aWwoImJvZHkiKS5iaW5kKCJzY3JvbGwuZHJvcHBhYmxlIixmdW5jdGlvbigpe3Qub3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zfHxlLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0LG4pfSl9LGRyYWc6ZnVuY3Rpb24odCxuKXt0Lm9wdGlvbnMucmVmcmVzaFBvc2l0aW9ucyYmZS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModCxuKSxlLmVhY2goZS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0Lm9wdGlvbnMuc2NvcGVdfHxbXSxmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5kaXNhYmxlZHx8dGhpcy5ncmVlZHlDaGlsZHx8IXRoaXMudmlzaWJsZSlyZXR1cm47dmFyIHI9ZS51aS5pbnRlcnNlY3QodCx0aGlzLHRoaXMub3B0aW9ucy50b2xlcmFuY2UpLGk9IXImJnRoaXMuaXNvdmVyPT0xPyJpc291dCI6ciYmdGhpcy5pc292ZXI9PTA/Imlzb3ZlciI6bnVsbDtpZighaSlyZXR1cm47dmFyIHM7aWYodGhpcy5vcHRpb25zLmdyZWVkeSl7dmFyIG89dGhpcy5vcHRpb25zLnNjb3BlLHU9dGhpcy5lbGVtZW50LnBhcmVudHMoIjpkYXRhKGRyb3BwYWJsZSkiKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gZS5kYXRhKHRoaXMsImRyb3BwYWJsZSIpLm9wdGlvbnMuc2NvcGU9PT1vfSk7dS5sZW5ndGgmJihzPWUuZGF0YSh1WzBdLCJkcm9wcGFibGUiKSxzLmdyZWVkeUNoaWxkPWk9PSJpc292ZXIiPzE6MCl9cyYmaT09Imlzb3ZlciImJihzLmlzb3Zlcj0wLHMuaXNvdXQ9MSxzLl9vdXQuY2FsbChzLG4pKSx0aGlzW2ldPTEsdGhpc1tpPT0iaXNvdXQiPyJpc292ZXIiOiJpc291dCJdPTAsdGhpc1tpPT0iaXNvdmVyIj8iX292ZXIiOiJfb3V0Il0uY2FsbCh0aGlzLG4pLHMmJmk9PSJpc291dCImJihzLmlzb3V0PTAscy5pc292ZXI9MSxzLl9vdmVyLmNhbGwocyxuKSl9KX0sZHJhZ1N0b3A6ZnVuY3Rpb24odCxuKXt0LmVsZW1lbnQucGFyZW50c1VudGlsKCJib2R5IikudW5iaW5kKCJzY3JvbGwuZHJvcHBhYmxlIiksdC5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnN8fGUudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHQsbil9fX0pKGpRdWVyeSk7alF1ZXJ5LmVmZmVjdHN8fGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS51aUJhY2tDb21wYXQhPT0hMSxyPSJ1aS1lZmZlY3RzLSI7ZS5lZmZlY3RzPXtlZmZlY3Q6e319LGZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gcChlLHQsbil7dmFyIHI9YVt0LnR5cGVdfHx7fTtyZXR1cm4gZT09bnVsbD9ufHwhdC5kZWY/bnVsbDp0LmRlZjooZT1yLmZsb29yP35+ZTpwYXJzZUZsb2F0KGUpLGlzTmFOKGUpP3QuZGVmOnIubW9kPyhlK3IubW9kKSVyLm1vZDowPmU/MDpyLm1heDxlP3IubWF4OmUpfWZ1bmN0aW9uIGQoZSl7dmFyIG49bygpLHI9bi5fcmdiYT1bXTtyZXR1cm4gZT1lLnRvTG93ZXJDYXNlKCksaChzLGZ1bmN0aW9uKHQsaSl7dmFyIHMsbz1pLnJlLmV4ZWMoZSksYT1vJiZpLnBhcnNlKG8pLGY9aS5zcGFjZXx8InJnYmEiO2lmKGEpcmV0dXJuIHM9bltmXShhKSxuW3VbZl0uY2FjaGVdPXNbdVtmXS5jYWNoZV0scj1uLl9yZ2JhPXMuX3JnYmEsITF9KSxyLmxlbmd0aD8oci5qb2luKCk9PT0iMCwwLDAsMCImJnQuZXh0ZW5kKHIsYy50cmFuc3BhcmVudCksbik6Y1tlXX1mdW5jdGlvbiB2KGUsdCxuKXtyZXR1cm4gbj0obisxKSUxLG4qNjwxP2UrKHQtZSkqbio2Om4qMjwxP3Q6biozPDI/ZSsodC1lKSooMi8zLW4pKjY6ZX12YXIgcj0iYmFja2dyb3VuZENvbG9yIGJvcmRlckJvdHRvbUNvbG9yIGJvcmRlckxlZnRDb2xvciBib3JkZXJSaWdodENvbG9yIGJvcmRlclRvcENvbG9yIGNvbG9yIGNvbHVtblJ1bGVDb2xvciBvdXRsaW5lQ29sb3IgdGV4dERlY29yYXRpb25Db2xvciB0ZXh0RW1waGFzaXNDb2xvciIuc3BsaXQoIiAiKSxpPS9eKFtcLStdKT1ccyooXGQrXC4/XGQqKS8scz1be3JlOi9yZ2JhP1woXHMqKFxkezEsM30pXHMqLFxzKihcZHsxLDN9KVxzKixccyooXGR7MSwzfSlccyooPzosXHMqKFxkKyg/OlwuXGQrKT8pXHMqKT9cKS8scGFyc2U6ZnVuY3Rpb24oZSl7cmV0dXJuW2VbMV0sZVsyXSxlWzNdLGVbNF1dfX0se3JlOi9yZ2JhP1woXHMqKFxkKyg/OlwuXGQrKT8pXCVccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyooPzosXHMqKFxkKyg/OlwuXGQrKT8pXHMqKT9cKS8scGFyc2U6ZnVuY3Rpb24oZSl7cmV0dXJuW2VbMV0qMi41NSxlWzJdKjIuNTUsZVszXSoyLjU1LGVbNF1dfX0se3JlOi8jKFthLWYwLTldezJ9KShbYS1mMC05XXsyfSkoW2EtZjAtOV17Mn0pLyxwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm5bcGFyc2VJbnQoZVsxXSwxNikscGFyc2VJbnQoZVsyXSwxNikscGFyc2VJbnQoZVszXSwxNildfX0se3JlOi8jKFthLWYwLTldKShbYS1mMC05XSkoW2EtZjAtOV0pLyxwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm5bcGFyc2VJbnQoZVsxXStlWzFdLDE2KSxwYXJzZUludChlWzJdK2VbMl0sMTYpLHBhcnNlSW50KGVbM10rZVszXSwxNildfX0se3JlOi9oc2xhP1woXHMqKFxkKyg/OlwuXGQrKT8pXHMqLFxzKihcZCsoPzpcLlxkKyk/KVwlXHMqLFxzKihcZCsoPzpcLlxkKyk/KVwlXHMqKD86LFxzKihcZCsoPzpcLlxkKyk/KVxzKik/XCkvLHNwYWNlOiJoc2xhIixwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm5bZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCxlWzRdXX19XSxvPXQuQ29sb3I9ZnVuY3Rpb24oZSxuLHIsaSl7cmV0dXJuIG5ldyB0LkNvbG9yLmZuLnBhcnNlKGUsbixyLGkpfSx1PXtyZ2JhOntwcm9wczp7cmVkOntpZHg6MCx0eXBlOiJieXRlIn0sZ3JlZW46e2lkeDoxLHR5cGU6ImJ5dGUifSxibHVlOntpZHg6Mix0eXBlOiJieXRlIn19fSxoc2xhOntwcm9wczp7aHVlOntpZHg6MCx0eXBlOiJkZWdyZWVzIn0sc2F0dXJhdGlvbjp7aWR4OjEsdHlwZToicGVyY2VudCJ9LGxpZ2h0bmVzczp7aWR4OjIsdHlwZToicGVyY2VudCJ9fX19LGE9eyJieXRlIjp7Zmxvb3I6ITAsbWF4OjI1NX0scGVyY2VudDp7bWF4OjF9LGRlZ3JlZXM6e21vZDozNjAsZmxvb3I6ITB9fSxmPW8uc3VwcG9ydD17fSxsPXQoIjxwPiIpWzBdLGMsaD10LmVhY2g7bC5zdHlsZS5jc3NUZXh0PSJiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMSwxLDEsLjUpIixmLnJnYmE9bC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IuaW5kZXhPZigicmdiYSIpPi0xLGgodSxmdW5jdGlvbihlLHQpe3QuY2FjaGU9Il8iK2UsdC5wcm9wcy5hbHBoYT17aWR4OjMsdHlwZToicGVyY2VudCIsZGVmOjF9fSksby5mbj10LmV4dGVuZChvLnByb3RvdHlwZSx7cGFyc2U6ZnVuY3Rpb24ocixpLHMsYSl7aWYocj09PW4pcmV0dXJuIHRoaXMuX3JnYmE9W251bGwsbnVsbCxudWxsLG51bGxdLHRoaXM7aWYoci5qcXVlcnl8fHIubm9kZVR5cGUpcj10KHIpLmNzcyhpKSxpPW47dmFyIGY9dGhpcyxsPXQudHlwZShyKSx2PXRoaXMuX3JnYmE9W107aSE9PW4mJihyPVtyLGkscyxhXSxsPSJhcnJheSIpO2lmKGw9PT0ic3RyaW5nIilyZXR1cm4gdGhpcy5wYXJzZShkKHIpfHxjLl9kZWZhdWx0KTtpZihsPT09ImFycmF5IilyZXR1cm4gaCh1LnJnYmEucHJvcHMsZnVuY3Rpb24oZSx0KXt2W3QuaWR4XT1wKHJbdC5pZHhdLHQpfSksdGhpcztpZihsPT09Im9iamVjdCIpcmV0dXJuIHIgaW5zdGFuY2VvZiBvP2godSxmdW5jdGlvbihlLHQpe3JbdC5jYWNoZV0mJihmW3QuY2FjaGVdPXJbdC5jYWNoZV0uc2xpY2UoKSl9KTpoKHUsZnVuY3Rpb24odCxuKXt2YXIgaT1uLmNhY2hlO2gobi5wcm9wcyxmdW5jdGlvbihlLHQpe2lmKCFmW2ldJiZuLnRvKXtpZihlPT09ImFscGhhInx8cltlXT09bnVsbClyZXR1cm47ZltpXT1uLnRvKGYuX3JnYmEpfWZbaV1bdC5pZHhdPXAocltlXSx0LCEwKX0pLGZbaV0mJmUuaW5BcnJheShudWxsLGZbaV0uc2xpY2UoMCwzKSk8MCYmKGZbaV1bM109MSxuLmZyb20mJihmLl9yZ2JhPW4uZnJvbShmW2ldKSkpfSksdGhpc30saXM6ZnVuY3Rpb24oZSl7dmFyIHQ9byhlKSxuPSEwLHI9dGhpcztyZXR1cm4gaCh1LGZ1bmN0aW9uKGUsaSl7dmFyIHMsbz10W2kuY2FjaGVdO3JldHVybiBvJiYocz1yW2kuY2FjaGVdfHxpLnRvJiZpLnRvKHIuX3JnYmEpfHxbXSxoKGkucHJvcHMsZnVuY3Rpb24oZSx0KXtpZihvW3QuaWR4XSE9bnVsbClyZXR1cm4gbj1vW3QuaWR4XT09PXNbdC5pZHhdLG59KSksbn0pLG59LF9zcGFjZTpmdW5jdGlvbigpe3ZhciBlPVtdLHQ9dGhpcztyZXR1cm4gaCh1LGZ1bmN0aW9uKG4scil7dFtyLmNhY2hlXSYmZS5wdXNoKG4pfSksZS5wb3AoKX0sdHJhbnNpdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBuPW8oZSkscj1uLl9zcGFjZSgpLGk9dVtyXSxzPXRoaXMuYWxwaGEoKT09PTA/bygidHJhbnNwYXJlbnQiKTp0aGlzLGY9c1tpLmNhY2hlXXx8aS50byhzLl9yZ2JhKSxsPWYuc2xpY2UoKTtyZXR1cm4gbj1uW2kuY2FjaGVdLGgoaS5wcm9wcyxmdW5jdGlvbihlLHIpe3ZhciBpPXIuaWR4LHM9ZltpXSxvPW5baV0sdT1hW3IudHlwZV18fHt9O2lmKG89PT1udWxsKXJldHVybjtzPT09bnVsbD9sW2ldPW86KHUubW9kJiYoby1zPnUubW9kLzI/cys9dS5tb2Q6cy1vPnUubW9kLzImJihzLT11Lm1vZCkpLGxbaV09cCgoby1zKSp0K3MscikpfSksdGhpc1tyXShsKX0sYmxlbmQ6ZnVuY3Rpb24oZSl7aWYodGhpcy5fcmdiYVszXT09PTEpcmV0dXJuIHRoaXM7dmFyIG49dGhpcy5fcmdiYS5zbGljZSgpLHI9bi5wb3AoKSxpPW8oZSkuX3JnYmE7cmV0dXJuIG8odC5tYXAobixmdW5jdGlvbihlLHQpe3JldHVybigxLXIpKmlbdF0rciplfSkpfSx0b1JnYmFTdHJpbmc6ZnVuY3Rpb24oKXt2YXIgZT0icmdiYSgiLG49dC5tYXAodGhpcy5fcmdiYSxmdW5jdGlvbihlLHQpe3JldHVybiBlPT1udWxsP3Q+Mj8xOjA6ZX0pO3JldHVybiBuWzNdPT09MSYmKG4ucG9wKCksZT0icmdiKCIpLGUrbi5qb2luKCkrIikifSx0b0hzbGFTdHJpbmc6ZnVuY3Rpb24oKXt2YXIgZT0iaHNsYSgiLG49dC5tYXAodGhpcy5oc2xhKCksZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09bnVsbCYmKGU9dD4yPzE6MCksdCYmdDwzJiYoZT1NYXRoLnJvdW5kKGUqMTAwKSsiJSIpLGV9KTtyZXR1cm4gblszXT09PTEmJihuLnBvcCgpLGU9ImhzbCgiKSxlK24uam9pbigpKyIpIn0sdG9IZXhTdHJpbmc6ZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5fcmdiYS5zbGljZSgpLHI9bi5wb3AoKTtyZXR1cm4gZSYmbi5wdXNoKH5+KHIqMjU1KSksIiMiK3QubWFwKG4sZnVuY3Rpb24oZSl7cmV0dXJuIGU9KGV8fDApLnRvU3RyaW5nKDE2KSxlLmxlbmd0aD09PTE/IjAiK2U6ZX0pLmpvaW4oIiIpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZ2JhWzNdPT09MD8idHJhbnNwYXJlbnQiOnRoaXMudG9SZ2JhU3RyaW5nKCl9fSksby5mbi5wYXJzZS5wcm90b3R5cGU9by5mbix1LmhzbGEudG89ZnVuY3Rpb24oZSl7aWYoZVswXT09bnVsbHx8ZVsxXT09bnVsbHx8ZVsyXT09bnVsbClyZXR1cm5bbnVsbCxudWxsLG51bGwsZVszXV07dmFyIHQ9ZVswXS8yNTUsbj1lWzFdLzI1NSxyPWVbMl0vMjU1LGk9ZVszXSxzPU1hdGgubWF4KHQsbixyKSxvPU1hdGgubWluKHQsbixyKSx1PXMtbyxhPXMrbyxmPWEqLjUsbCxjO3JldHVybiBvPT09cz9sPTA6dD09PXM/bD02MCoobi1yKS91KzM2MDpuPT09cz9sPTYwKihyLXQpL3UrMTIwOmw9NjAqKHQtbikvdSsyNDAsZj09PTB8fGY9PT0xP2M9ZjpmPD0uNT9jPXUvYTpjPXUvKDItYSksW01hdGgucm91bmQobCklMzYwLGMsZixpPT1udWxsPzE6aV19LHUuaHNsYS5mcm9tPWZ1bmN0aW9uKGUpe2lmKGVbMF09PW51bGx8fGVbMV09PW51bGx8fGVbMl09PW51bGwpcmV0dXJuW251bGwsbnVsbCxudWxsLGVbM11dO3ZhciB0PWVbMF0vMzYwLG49ZVsxXSxyPWVbMl0saT1lWzNdLHM9cjw9LjU/ciooMStuKTpyK24tcipuLG89MipyLXM7cmV0dXJuW01hdGgucm91bmQodihvLHMsdCsxLzMpKjI1NSksTWF0aC5yb3VuZCh2KG8scyx0KSoyNTUpLE1hdGgucm91bmQodihvLHMsdC0xLzMpKjI1NSksaV19LGgodSxmdW5jdGlvbihlLHIpe3ZhciBzPXIucHJvcHMsdT1yLmNhY2hlLGE9ci50byxmPXIuZnJvbTtvLmZuW2VdPWZ1bmN0aW9uKGUpe2EmJiF0aGlzW3VdJiYodGhpc1t1XT1hKHRoaXMuX3JnYmEpKTtpZihlPT09bilyZXR1cm4gdGhpc1t1XS5zbGljZSgpO3ZhciByLGk9dC50eXBlKGUpLGw9aT09PSJhcnJheSJ8fGk9PT0ib2JqZWN0Ij9lOmFyZ3VtZW50cyxjPXRoaXNbdV0uc2xpY2UoKTtyZXR1cm4gaChzLGZ1bmN0aW9uKGUsdCl7dmFyIG49bFtpPT09Im9iamVjdCI/ZTp0LmlkeF07bj09bnVsbCYmKG49Y1t0LmlkeF0pLGNbdC5pZHhdPXAobix0KX0pLGY/KHI9byhmKGMpKSxyW3VdPWMscik6byhjKX0saChzLGZ1bmN0aW9uKG4scil7aWYoby5mbltuXSlyZXR1cm47by5mbltuXT1mdW5jdGlvbihzKXt2YXIgbz10LnR5cGUocyksdT1uPT09ImFscGhhIj90aGlzLl9oc2xhPyJoc2xhIjoicmdiYSI6ZSxhPXRoaXNbdV0oKSxmPWFbci5pZHhdLGw7cmV0dXJuIG89PT0idW5kZWZpbmVkIj9mOihvPT09ImZ1bmN0aW9uIiYmKHM9cy5jYWxsKHRoaXMsZiksbz10LnR5cGUocykpLHM9PW51bGwmJnIuZW1wdHk/dGhpczoobz09PSJzdHJpbmciJiYobD1pLmV4ZWMocyksbCYmKHM9ZitwYXJzZUZsb2F0KGxbMl0pKihsWzFdPT09IisiPzE6LTEpKSksYVtyLmlkeF09cyx0aGlzW3VdKGEpKSl9fSl9KSxoKHIsZnVuY3Rpb24oZSxuKXt0LmNzc0hvb2tzW25dPXtzZXQ6ZnVuY3Rpb24oZSxyKXt2YXIgaSxzLHU9IiI7aWYodC50eXBlKHIpIT09InN0cmluZyJ8fChpPWQocikpKXtyPW8oaXx8cik7aWYoIWYucmdiYSYmci5fcmdiYVszXSE9PTEpe3M9bj09PSJiYWNrZ3JvdW5kQ29sb3IiP2UucGFyZW50Tm9kZTplO3doaWxlKCh1PT09IiJ8fHU9PT0idHJhbnNwYXJlbnQiKSYmcyYmcy5zdHlsZSl0cnl7dT10LmNzcyhzLCJiYWNrZ3JvdW5kQ29sb3IiKSxzPXMucGFyZW50Tm9kZX1jYXRjaChhKXt9cj1yLmJsZW5kKHUmJnUhPT0idHJhbnNwYXJlbnQiP3U6Il9kZWZhdWx0Iil9cj1yLnRvUmdiYVN0cmluZygpfXRyeXtlLnN0eWxlW25dPXJ9Y2F0Y2gobCl7fX19LHQuZnguc3RlcFtuXT1mdW5jdGlvbihlKXtlLmNvbG9ySW5pdHx8KGUuc3RhcnQ9byhlLmVsZW0sbiksZS5lbmQ9byhlLmVuZCksZS5jb2xvckluaXQ9ITApLHQuY3NzSG9va3Nbbl0uc2V0KGUuZWxlbSxlLnN0YXJ0LnRyYW5zaXRpb24oZS5lbmQsZS5wb3MpKX19KSx0LmNzc0hvb2tzLmJvcmRlckNvbG9yPXtleHBhbmQ6ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGgoWyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxmdW5jdGlvbihuLHIpe3RbImJvcmRlciIrcisiQ29sb3IiXT1lfSksdH19LGM9dC5Db2xvci5uYW1lcz17YXF1YToiIzAwZmZmZiIsYmxhY2s6IiMwMDAwMDAiLGJsdWU6IiMwMDAwZmYiLGZ1Y2hzaWE6IiNmZjAwZmYiLGdyYXk6IiM4MDgwODAiLGdyZWVuOiIjMDA4MDAwIixsaW1lOiIjMDBmZjAwIixtYXJvb246IiM4MDAwMDAiLG5hdnk6IiMwMDAwODAiLG9saXZlOiIjODA4MDAwIixwdXJwbGU6IiM4MDAwODAiLHJlZDoiI2ZmMDAwMCIsc2lsdmVyOiIjYzBjMGMwIix0ZWFsOiIjMDA4MDgwIix3aGl0ZToiI2ZmZmZmZiIseWVsbG93OiIjZmZmZjAwIix0cmFuc3BhcmVudDpbbnVsbCxudWxsLG51bGwsMF0sX2RlZmF1bHQ6IiNmZmZmZmYifX0oalF1ZXJ5KSxmdW5jdGlvbigpe2Z1bmN0aW9uIGkoKXt2YXIgdD10aGlzLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc/dGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodGhpcyxudWxsKTp0aGlzLmN1cnJlbnRTdHlsZSxuPXt9LHIsaTtpZih0JiZ0Lmxlbmd0aCYmdFswXSYmdFt0WzBdXSl7aT10Lmxlbmd0aDt3aGlsZShpLS0pcj10W2ldLHR5cGVvZiB0W3JdPT0ic3RyaW5nIiYmKG5bZS5jYW1lbENhc2UocildPXRbcl0pfWVsc2UgZm9yKHIgaW4gdCl0eXBlb2YgdFtyXT09InN0cmluZyImJihuW3JdPXRbcl0pO3JldHVybiBufWZ1bmN0aW9uIHModCxuKXt2YXIgaT17fSxzLG87Zm9yKHMgaW4gbilvPW5bc10sdFtzXSE9PW8mJiFyW3NdJiYoZS5meC5zdGVwW3NdfHwhaXNOYU4ocGFyc2VGbG9hdChvKSkpJiYoaVtzXT1vKTtyZXR1cm4gaX12YXIgbj1bImFkZCIsInJlbW92ZSIsInRvZ2dsZSJdLHI9e2JvcmRlcjoxLGJvcmRlckJvdHRvbToxLGJvcmRlckNvbG9yOjEsYm9yZGVyTGVmdDoxLGJvcmRlclJpZ2h0OjEsYm9yZGVyVG9wOjEsYm9yZGVyV2lkdGg6MSxtYXJnaW46MSxwYWRkaW5nOjF9O2UuZWFjaChbImJvcmRlckxlZnRTdHlsZSIsImJvcmRlclJpZ2h0U3R5bGUiLCJib3JkZXJCb3R0b21TdHlsZSIsImJvcmRlclRvcFN0eWxlIl0sZnVuY3Rpb24odCxuKXtlLmZ4LnN0ZXBbbl09ZnVuY3Rpb24oZSl7aWYoZS5lbmQhPT0ibm9uZSImJiFlLnNldEF0dHJ8fGUucG9zPT09MSYmIWUuc2V0QXR0cilqUXVlcnkuc3R5bGUoZS5lbGVtLG4sZS5lbmQpLGUuc2V0QXR0cj0hMH19KSxlLmVmZmVjdHMuYW5pbWF0ZUNsYXNzPWZ1bmN0aW9uKHQscixvLHUpe3ZhciBhPWUuc3BlZWQocixvLHUpO3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIHI9ZSh0aGlzKSxvPXIuYXR0cigiY2xhc3MiKXx8IiIsdSxmPWEuY2hpbGRyZW4/ci5maW5kKCIqIikuYW5kU2VsZigpOnI7Zj1mLm1hcChmdW5jdGlvbigpe3ZhciB0PWUodGhpcyk7cmV0dXJue2VsOnQsc3RhcnQ6aS5jYWxsKHRoaXMpfX0pLHU9ZnVuY3Rpb24oKXtlLmVhY2gobixmdW5jdGlvbihlLG4pe3Rbbl0mJnJbbisiQ2xhc3MiXSh0W25dKX0pfSx1KCksZj1mLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVuZD1pLmNhbGwodGhpcy5lbFswXSksdGhpcy5kaWZmPXModGhpcy5zdGFydCx0aGlzLmVuZCksdGhpc30pLHIuYXR0cigiY2xhc3MiLG8pLGY9Zi5tYXAoZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49ZS5EZWZlcnJlZCgpLHI9alF1ZXJ5LmV4dGVuZCh7fSxhLHtxdWV1ZTohMSxjb21wbGV0ZTpmdW5jdGlvbigpe24ucmVzb2x2ZSh0KX19KTtyZXR1cm4gdGhpcy5lbC5hbmltYXRlKHRoaXMuZGlmZixyKSxuLnByb21pc2UoKX0pLGUud2hlbi5hcHBseShlLGYuZ2V0KCkpLmRvbmUoZnVuY3Rpb24oKXt1KCksZS5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWw7ZS5lYWNoKHRoaXMuZGlmZixmdW5jdGlvbihlKXt0LmNzcyhlLCIiKX0pfSksYS5jb21wbGV0ZS5jYWxsKHJbMF0pfSl9KX0sZS5mbi5leHRlbmQoe19hZGRDbGFzczplLmZuLmFkZENsYXNzLGFkZENsYXNzOmZ1bmN0aW9uKHQsbixyLGkpe3JldHVybiBuP2UuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCh0aGlzLHthZGQ6dH0sbixyLGkpOnRoaXMuX2FkZENsYXNzKHQpfSxfcmVtb3ZlQ2xhc3M6ZS5mbi5yZW1vdmVDbGFzcyxyZW1vdmVDbGFzczpmdW5jdGlvbih0LG4scixpKXtyZXR1cm4gbj9lLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwodGhpcyx7cmVtb3ZlOnR9LG4scixpKTp0aGlzLl9yZW1vdmVDbGFzcyh0KX0sX3RvZ2dsZUNsYXNzOmUuZm4udG9nZ2xlQ2xhc3MsdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24obixyLGkscyxvKXtyZXR1cm4gdHlwZW9mIHI9PSJib29sZWFuInx8cj09PXQ/aT9lLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwodGhpcyxyP3thZGQ6bn06e3JlbW92ZTpufSxpLHMsbyk6dGhpcy5fdG9nZ2xlQ2xhc3MobixyKTplLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwodGhpcyx7dG9nZ2xlOm59LHIsaSxzKX0sc3dpdGNoQ2xhc3M6ZnVuY3Rpb24odCxuLHIsaSxzKXtyZXR1cm4gZS5lZmZlY3RzLmFuaW1hdGVDbGFzcy5jYWxsKHRoaXMse2FkZDpuLHJlbW92ZTp0fSxyLGkscyl9fSl9KCksZnVuY3Rpb24oKXtmdW5jdGlvbiBpKHQsbixyLGkpe2UuaXNQbGFpbk9iamVjdCh0KSYmKG49dCx0PXQuZWZmZWN0KSx0PXtlZmZlY3Q6dH0sbj09bnVsbCYmKG49e30pLGUuaXNGdW5jdGlvbihuKSYmKGk9bixyPW51bGwsbj17fSk7aWYodHlwZW9mIG49PSJudW1iZXIifHxlLmZ4LnNwZWVkc1tuXSlpPXIscj1uLG49e307cmV0dXJuIGUuaXNGdW5jdGlvbihyKSYmKGk9cixyPW51bGwpLG4mJmUuZXh0ZW5kKHQsbikscj1yfHxuLmR1cmF0aW9uLHQuZHVyYXRpb249ZS5meC5vZmY/MDp0eXBlb2Ygcj09Im51bWJlciI/cjpyIGluIGUuZnguc3BlZWRzP2UuZnguc3BlZWRzW3JdOmUuZnguc3BlZWRzLl9kZWZhdWx0LHQuY29tcGxldGU9aXx8bi5jb21wbGV0ZSx0fWZ1bmN0aW9uIHModCl7cmV0dXJuIXR8fHR5cGVvZiB0PT0ibnVtYmVyInx8ZS5meC5zcGVlZHNbdF0/ITA6dHlwZW9mIHQ9PSJzdHJpbmciJiYhZS5lZmZlY3RzLmVmZmVjdFt0XT9uJiZlLmVmZmVjdHNbdF0/ITE6ITA6ITF9ZS5leHRlbmQoZS5lZmZlY3RzLHt2ZXJzaW9uOiIxLjkuMiIsc2F2ZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXRbbl0hPT1udWxsJiZlLmRhdGEocit0W25dLGVbMF0uc3R5bGVbdFtuXV0pfSxyZXN0b3JlOmZ1bmN0aW9uKGUsbil7dmFyIGkscztmb3Iocz0wO3M8bi5sZW5ndGg7cysrKW5bc10hPT1udWxsJiYoaT1lLmRhdGEocituW3NdKSxpPT09dCYmKGk9IiIpLGUuY3NzKG5bc10saSkpfSxzZXRNb2RlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9PT0idG9nZ2xlIiYmKHQ9ZS5pcygiOmhpZGRlbiIpPyJzaG93IjoiaGlkZSIpLHR9LGdldEJhc2VsaW5lOmZ1bmN0aW9uKGUsdCl7dmFyIG4scjtzd2l0Y2goZVswXSl7Y2FzZSJ0b3AiOm49MDticmVhaztjYXNlIm1pZGRsZSI6bj0uNTticmVhaztjYXNlImJvdHRvbSI6bj0xO2JyZWFrO2RlZmF1bHQ6bj1lWzBdL3QuaGVpZ2h0fXN3aXRjaChlWzFdKXtjYXNlImxlZnQiOnI9MDticmVhaztjYXNlImNlbnRlciI6cj0uNTticmVhaztjYXNlInJpZ2h0IjpyPTE7YnJlYWs7ZGVmYXVsdDpyPWVbMV0vdC53aWR0aH1yZXR1cm57eDpyLHk6bn19LGNyZWF0ZVdyYXBwZXI6ZnVuY3Rpb24odCl7aWYodC5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpKXJldHVybiB0LnBhcmVudCgpO3ZhciBuPXt3aWR0aDp0Lm91dGVyV2lkdGgoITApLGhlaWdodDp0Lm91dGVySGVpZ2h0KCEwKSwiZmxvYXQiOnQuY3NzKCJmbG9hdCIpfSxyPWUoIjxkaXY+PC9kaXY+IikuYWRkQ2xhc3MoInVpLWVmZmVjdHMtd3JhcHBlciIpLmNzcyh7Zm9udFNpemU6IjEwMCUiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLG1hcmdpbjowLHBhZGRpbmc6MH0pLGk9e3dpZHRoOnQud2lkdGgoKSxoZWlnaHQ6dC5oZWlnaHQoKX0scz1kb2N1bWVudC5hY3RpdmVFbGVtZW50O3RyeXtzLmlkfWNhdGNoKG8pe3M9ZG9jdW1lbnQuYm9keX1yZXR1cm4gdC53cmFwKHIpLCh0WzBdPT09c3x8ZS5jb250YWlucyh0WzBdLHMpKSYmZShzKS5mb2N1cygpLHI9dC5wYXJlbnQoKSx0LmNzcygicG9zaXRpb24iKT09PSJzdGF0aWMiPyhyLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIn0pLHQuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUifSkpOihlLmV4dGVuZChuLHtwb3NpdGlvbjp0LmNzcygicG9zaXRpb24iKSx6SW5kZXg6dC5jc3MoInotaW5kZXgiKX0pLGUuZWFjaChbInRvcCIsImxlZnQiLCJib3R0b20iLCJyaWdodCJdLGZ1bmN0aW9uKGUscil7bltyXT10LmNzcyhyKSxpc05hTihwYXJzZUludChuW3JdLDEwKSkmJihuW3JdPSJhdXRvIil9KSx0LmNzcyh7cG9zaXRpb246InJlbGF0aXZlIix0b3A6MCxsZWZ0OjAscmlnaHQ6ImF1dG8iLGJvdHRvbToiYXV0byJ9KSksdC5jc3MoaSksci5jc3Mobikuc2hvdygpfSxyZW1vdmVXcmFwcGVyOmZ1bmN0aW9uKHQpe3ZhciBuPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7cmV0dXJuIHQucGFyZW50KCkuaXMoIi51aS1lZmZlY3RzLXdyYXBwZXIiKSYmKHQucGFyZW50KCkucmVwbGFjZVdpdGgodCksKHRbMF09PT1ufHxlLmNvbnRhaW5zKHRbMF0sbikpJiZlKG4pLmZvY3VzKCkpLHR9LHNldFRyYW5zaXRpb246ZnVuY3Rpb24odCxuLHIsaSl7cmV0dXJuIGk9aXx8e30sZS5lYWNoKG4sZnVuY3Rpb24oZSxuKXt2YXIgcz10LmNzc1VuaXQobik7c1swXT4wJiYoaVtuXT1zWzBdKnIrc1sxXSl9KSxpfX0pLGUuZm4uZXh0ZW5kKHtlZmZlY3Q6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKG4pe2Z1bmN0aW9uIHUoKXtlLmlzRnVuY3Rpb24oaSkmJmkuY2FsbChyWzBdKSxlLmlzRnVuY3Rpb24obikmJm4oKX12YXIgcj1lKHRoaXMpLGk9dC5jb21wbGV0ZSxzPXQubW9kZTsoci5pcygiOmhpZGRlbiIpP3M9PT0iaGlkZSI6cz09PSJzaG93Iik/dSgpOm8uY2FsbChyWzBdLHQsdSl9dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cykscj10Lm1vZGUscz10LnF1ZXVlLG89ZS5lZmZlY3RzLmVmZmVjdFt0LmVmZmVjdF0sdT0hbyYmbiYmZS5lZmZlY3RzW3QuZWZmZWN0XTtyZXR1cm4gZS5meC5vZmZ8fCFvJiYhdT9yP3RoaXNbcl0odC5kdXJhdGlvbix0LmNvbXBsZXRlKTp0aGlzLmVhY2goZnVuY3Rpb24oKXt0LmNvbXBsZXRlJiZ0LmNvbXBsZXRlLmNhbGwodGhpcyl9KTpvP3M9PT0hMT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShzfHwiZngiLGEpOnUuY2FsbCh0aGlzLHtvcHRpb25zOnQsZHVyYXRpb246dC5kdXJhdGlvbixjYWxsYmFjazp0LmNvbXBsZXRlLG1vZGU6dC5tb2RlfSl9LF9zaG93OmUuZm4uc2hvdyxzaG93OmZ1bmN0aW9uKGUpe2lmKHMoZSkpcmV0dXJuIHRoaXMuX3Nob3cuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB0Lm1vZGU9InNob3ciLHRoaXMuZWZmZWN0LmNhbGwodGhpcyx0KX0sX2hpZGU6ZS5mbi5oaWRlLGhpZGU6ZnVuY3Rpb24oZSl7aWYocyhlKSlyZXR1cm4gdGhpcy5faGlkZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHQubW9kZT0iaGlkZSIsdGhpcy5lZmZlY3QuY2FsbCh0aGlzLHQpfSxfX3RvZ2dsZTplLmZuLnRvZ2dsZSx0b2dnbGU6ZnVuY3Rpb24odCl7aWYocyh0KXx8dHlwZW9mIHQ9PSJib29sZWFuInx8ZS5pc0Z1bmN0aW9uKHQpKXJldHVybiB0aGlzLl9fdG9nZ2xlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgbj1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbi5tb2RlPSJ0b2dnbGUiLHRoaXMuZWZmZWN0LmNhbGwodGhpcyxuKX0sY3NzVW5pdDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLmNzcyh0KSxyPVtdO3JldHVybiBlLmVhY2goWyJlbSIsInB4IiwiJSIsInB0Il0sZnVuY3Rpb24oZSx0KXtuLmluZGV4T2YodCk+MCYmKHI9W3BhcnNlRmxvYXQobiksdF0pfSkscn19KX0oKSxmdW5jdGlvbigpe3ZhciB0PXt9O2UuZWFjaChbIlF1YWQiLCJDdWJpYyIsIlF1YXJ0IiwiUXVpbnQiLCJFeHBvIl0sZnVuY3Rpb24oZSxuKXt0W25dPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdyh0LGUrMil9fSksZS5leHRlbmQodCx7U2luZTpmdW5jdGlvbihlKXtyZXR1cm4gMS1NYXRoLmNvcyhlKk1hdGguUEkvMil9LENpcmM6ZnVuY3Rpb24oZSl7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtZSplKX0sRWxhc3RpYzpmdW5jdGlvbihlKXtyZXR1cm4gZT09PTB8fGU9PT0xP2U6LU1hdGgucG93KDIsOCooZS0xKSkqTWF0aC5zaW4oKChlLTEpKjgwLTcuNSkqTWF0aC5QSS8xNSl9LEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIGUqZSooMyplLTIpfSxCb3VuY2U6ZnVuY3Rpb24oZSl7dmFyIHQsbj00O3doaWxlKGU8KCh0PU1hdGgucG93KDIsLS1uKSktMSkvMTEpO3JldHVybiAxL01hdGgucG93KDQsMy1uKS03LjU2MjUqTWF0aC5wb3coKHQqMy0yKS8yMi1lLDIpfX0pLGUuZWFjaCh0LGZ1bmN0aW9uKHQsbil7ZS5lYXNpbmdbImVhc2VJbiIrdF09bixlLmVhc2luZ1siZWFzZU91dCIrdF09ZnVuY3Rpb24oZSl7cmV0dXJuIDEtbigxLWUpfSxlLmVhc2luZ1siZWFzZUluT3V0Iit0XT1mdW5jdGlvbihlKXtyZXR1cm4gZTwuNT9uKGUqMikvMjoxLW4oZSotMisyKS8yfX0pfSgpfShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe3ZhciBuPS91cHxkb3dufHZlcnRpY2FsLyxyPS91cHxsZWZ0fHZlcnRpY2FsfGhvcml6b250YWwvO2UuZWZmZWN0cy5lZmZlY3QuYmxpbmQ9ZnVuY3Rpb24odCxpKXt2YXIgcz1lKHRoaXMpLG89WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0sdT1lLmVmZmVjdHMuc2V0TW9kZShzLHQubW9kZXx8ImhpZGUiKSxhPXQuZGlyZWN0aW9ufHwidXAiLGY9bi50ZXN0KGEpLGw9Zj8iaGVpZ2h0Ijoid2lkdGgiLGM9Zj8idG9wIjoibGVmdCIsaD1yLnRlc3QoYSkscD17fSxkPXU9PT0ic2hvdyIsdixtLGc7cy5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpP2UuZWZmZWN0cy5zYXZlKHMucGFyZW50KCksbyk6ZS5lZmZlY3RzLnNhdmUocyxvKSxzLnNob3coKSx2PWUuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKHMpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxtPXZbbF0oKSxnPXBhcnNlRmxvYXQodi5jc3MoYykpfHwwLHBbbF09ZD9tOjAsaHx8KHMuY3NzKGY/ImJvdHRvbSI6InJpZ2h0IiwwKS5jc3MoZj8idG9wIjoibGVmdCIsImF1dG8iKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSJ9KSxwW2NdPWQ/ZzptK2cpLGQmJih2LmNzcyhsLDApLGh8fHYuY3NzKGMsZyttKSksdi5hbmltYXRlKHAse2R1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLHF1ZXVlOiExLGNvbXBsZXRlOmZ1bmN0aW9uKCl7dT09PSJoaWRlIiYmcy5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUocyxvKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihzKSxpKCl9fSl9fSkoalF1ZXJ5KTsoZnVuY3Rpb24oZSx0KXtlLmVmZmVjdHMuZWZmZWN0LmJvdW5jZT1mdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcyksaT1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwiaGVpZ2h0Iiwid2lkdGgiXSxzPWUuZWZmZWN0cy5zZXRNb2RlKHIsdC5tb2RlfHwiZWZmZWN0Iiksbz1zPT09ImhpZGUiLHU9cz09PSJzaG93IixhPXQuZGlyZWN0aW9ufHwidXAiLGY9dC5kaXN0YW5jZSxsPXQudGltZXN8fDUsYz1sKjIrKHV8fG8/MTowKSxoPXQuZHVyYXRpb24vYyxwPXQuZWFzaW5nLGQ9YT09PSJ1cCJ8fGE9PT0iZG93biI/InRvcCI6ImxlZnQiLHY9YT09PSJ1cCJ8fGE9PT0ibGVmdCIsbSxnLHksYj1yLnF1ZXVlKCksdz1iLmxlbmd0aDsodXx8bykmJmkucHVzaCgib3BhY2l0eSIpLGUuZWZmZWN0cy5zYXZlKHIsaSksci5zaG93KCksZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIociksZnx8KGY9cltkPT09InRvcCI/Im91dGVySGVpZ2h0Ijoib3V0ZXJXaWR0aCJdKCkvMyksdSYmKHk9e29wYWNpdHk6MX0seVtkXT0wLHIuY3NzKCJvcGFjaXR5IiwwKS5jc3MoZCx2Py1mKjI6ZioyKS5hbmltYXRlKHksaCxwKSksbyYmKGYvPU1hdGgucG93KDIsbC0xKSkseT17fSx5W2RdPTA7Zm9yKG09MDttPGw7bSsrKWc9e30sZ1tkXT0odj8iLT0iOiIrPSIpK2Ysci5hbmltYXRlKGcsaCxwKS5hbmltYXRlKHksaCxwKSxmPW8/ZioyOmYvMjtvJiYoZz17b3BhY2l0eTowfSxnW2RdPSh2PyItPSI6Iis9IikrZixyLmFuaW1hdGUoZyxoLHApKSxyLnF1ZXVlKGZ1bmN0aW9uKCl7byYmci5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUocixpKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihyKSxuKCl9KSx3PjEmJmIuc3BsaWNlLmFwcGx5KGIsWzEsMF0uY29uY2F0KGIuc3BsaWNlKHcsYysxKSkpLHIuZGVxdWV1ZSgpfX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7ZS5lZmZlY3RzLmVmZmVjdC5jbGlwPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKSxpPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJoZWlnaHQiLCJ3aWR0aCJdLHM9ZS5lZmZlY3RzLnNldE1vZGUocix0Lm1vZGV8fCJoaWRlIiksbz1zPT09InNob3ciLHU9dC5kaXJlY3Rpb258fCJ2ZXJ0aWNhbCIsYT11PT09InZlcnRpY2FsIixmPWE/ImhlaWdodCI6IndpZHRoIixsPWE/InRvcCI6ImxlZnQiLGM9e30saCxwLGQ7ZS5lZmZlY3RzLnNhdmUocixpKSxyLnNob3coKSxoPWUuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKHIpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxwPXJbMF0udGFnTmFtZT09PSJJTUciP2g6cixkPXBbZl0oKSxvJiYocC5jc3MoZiwwKSxwLmNzcyhsLGQvMikpLGNbZl09bz9kOjAsY1tsXT1vPzA6ZC8yLHAuYW5pbWF0ZShjLHtxdWV1ZTohMSxkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpe298fHIuaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKHIsaSksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIociksbigpfX0pfX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7ZS5lZmZlY3RzLmVmZmVjdC5kcm9wPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKSxpPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJvcGFjaXR5IiwiaGVpZ2h0Iiwid2lkdGgiXSxzPWUuZWZmZWN0cy5zZXRNb2RlKHIsdC5tb2RlfHwiaGlkZSIpLG89cz09PSJzaG93Iix1PXQuZGlyZWN0aW9ufHwibGVmdCIsYT11PT09InVwInx8dT09PSJkb3duIj8idG9wIjoibGVmdCIsZj11PT09InVwInx8dT09PSJsZWZ0Ij8icG9zIjoibmVnIixsPXtvcGFjaXR5Om8/MTowfSxjO2UuZWZmZWN0cy5zYXZlKHIsaSksci5zaG93KCksZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIociksYz10LmRpc3RhbmNlfHxyW2E9PT0idG9wIj8ib3V0ZXJIZWlnaHQiOiJvdXRlcldpZHRoIl0oITApLzIsbyYmci5jc3MoIm9wYWNpdHkiLDApLmNzcyhhLGY9PT0icG9zIj8tYzpjKSxsW2FdPShvP2Y9PT0icG9zIj8iKz0iOiItPSI6Zj09PSJwb3MiPyItPSI6Iis9IikrYyxyLmFuaW1hdGUobCx7cXVldWU6ITEsZHVyYXRpb246dC5kdXJhdGlvbixlYXNpbmc6dC5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtzPT09ImhpZGUiJiZyLmhpZGUoKSxlLmVmZmVjdHMucmVzdG9yZShyLGkpLGUuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKHIpLG4oKX19KX19KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe2UuZWZmZWN0cy5lZmZlY3QuZXhwbG9kZT1mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIHkoKXtjLnB1c2godGhpcyksYy5sZW5ndGg9PT1yKmkmJmIoKX1mdW5jdGlvbiBiKCl7cy5jc3Moe3Zpc2liaWxpdHk6InZpc2libGUifSksZShjKS5yZW1vdmUoKSx1fHxzLmhpZGUoKSxuKCl9dmFyIHI9dC5waWVjZXM/TWF0aC5yb3VuZChNYXRoLnNxcnQodC5waWVjZXMpKTozLGk9cixzPWUodGhpcyksbz1lLmVmZmVjdHMuc2V0TW9kZShzLHQubW9kZXx8ImhpZGUiKSx1PW89PT0ic2hvdyIsYT1zLnNob3coKS5jc3MoInZpc2liaWxpdHkiLCJoaWRkZW4iKS5vZmZzZXQoKSxmPU1hdGguY2VpbChzLm91dGVyV2lkdGgoKS9pKSxsPU1hdGguY2VpbChzLm91dGVySGVpZ2h0KCkvciksYz1bXSxoLHAsZCx2LG0sZztmb3IoaD0wO2g8cjtoKyspe3Y9YS50b3AraCpsLGc9aC0oci0xKS8yO2ZvcihwPTA7cDxpO3ArKylkPWEubGVmdCtwKmYsbT1wLShpLTEpLzIscy5jbG9uZSgpLmFwcGVuZFRvKCJib2R5Iikud3JhcCgiPGRpdj48L2Rpdj4iKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToidmlzaWJsZSIsbGVmdDotcCpmLHRvcDotaCpsfSkucGFyZW50KCkuYWRkQ2xhc3MoInVpLWVmZmVjdHMtZXhwbG9kZSIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixvdmVyZmxvdzoiaGlkZGVuIix3aWR0aDpmLGhlaWdodDpsLGxlZnQ6ZCsodT9tKmY6MCksdG9wOnYrKHU/ZypsOjApLG9wYWNpdHk6dT8wOjF9KS5hbmltYXRlKHtsZWZ0OmQrKHU/MDptKmYpLHRvcDp2Kyh1PzA6ZypsKSxvcGFjaXR5OnU/MTowfSx0LmR1cmF0aW9ufHw1MDAsdC5lYXNpbmcseSl9fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7ZS5lZmZlY3RzLmVmZmVjdC5mYWRlPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKSxpPWUuZWZmZWN0cy5zZXRNb2RlKHIsdC5tb2RlfHwidG9nZ2xlIik7ci5hbmltYXRlKHtvcGFjaXR5Oml9LHtxdWV1ZTohMSxkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxjb21wbGV0ZTpufSl9fSkoalF1ZXJ5KTsoZnVuY3Rpb24oZSx0KXtlLmVmZmVjdHMuZWZmZWN0LmZvbGQ9ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLGk9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0scz1lLmVmZmVjdHMuc2V0TW9kZShyLHQubW9kZXx8ImhpZGUiKSxvPXM9PT0ic2hvdyIsdT1zPT09ImhpZGUiLGE9dC5zaXplfHwxNSxmPS8oWzAtOV0rKSUvLmV4ZWMoYSksbD0hIXQuaG9yaXpGaXJzdCxjPW8hPT1sLGg9Yz9bIndpZHRoIiwiaGVpZ2h0Il06WyJoZWlnaHQiLCJ3aWR0aCJdLHA9dC5kdXJhdGlvbi8yLGQsdixtPXt9LGc9e307ZS5lZmZlY3RzLnNhdmUocixpKSxyLnNob3coKSxkPWUuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKHIpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSx2PWM/W2Qud2lkdGgoKSxkLmhlaWdodCgpXTpbZC5oZWlnaHQoKSxkLndpZHRoKCldLGYmJihhPXBhcnNlSW50KGZbMV0sMTApLzEwMCp2W3U/MDoxXSksbyYmZC5jc3MobD97aGVpZ2h0OjAsd2lkdGg6YX06e2hlaWdodDphLHdpZHRoOjB9KSxtW2hbMF1dPW8/dlswXTphLGdbaFsxXV09bz92WzFdOjAsZC5hbmltYXRlKG0scCx0LmVhc2luZykuYW5pbWF0ZShnLHAsdC5lYXNpbmcsZnVuY3Rpb24oKXt1JiZyLmhpZGUoKSxlLmVmZmVjdHMucmVzdG9yZShyLGkpLGUuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKHIpLG4oKX0pfX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7ZS5lZmZlY3RzLmVmZmVjdC5oaWdobGlnaHQ9ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLGk9WyJiYWNrZ3JvdW5kSW1hZ2UiLCJiYWNrZ3JvdW5kQ29sb3IiLCJvcGFjaXR5Il0scz1lLmVmZmVjdHMuc2V0TW9kZShyLHQubW9kZXx8InNob3ciKSxvPXtiYWNrZ3JvdW5kQ29sb3I6ci5jc3MoImJhY2tncm91bmRDb2xvciIpfTtzPT09ImhpZGUiJiYoby5vcGFjaXR5PTApLGUuZWZmZWN0cy5zYXZlKHIsaSksci5zaG93KCkuY3NzKHtiYWNrZ3JvdW5kSW1hZ2U6Im5vbmUiLGJhY2tncm91bmRDb2xvcjp0LmNvbG9yfHwiI2ZmZmY5OSJ9KS5hbmltYXRlKG8se3F1ZXVlOiExLGR1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7cz09PSJoaWRlIiYmci5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUocixpKSxuKCl9fSl9fSkoalF1ZXJ5KTsoZnVuY3Rpb24oZSx0KXtlLmVmZmVjdHMuZWZmZWN0LnB1bHNhdGU9ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLGk9ZS5lZmZlY3RzLnNldE1vZGUocix0Lm1vZGV8fCJzaG93Iikscz1pPT09InNob3ciLG89aT09PSJoaWRlIix1PXN8fGk9PT0iaGlkZSIsYT0odC50aW1lc3x8NSkqMisodT8xOjApLGY9dC5kdXJhdGlvbi9hLGw9MCxjPXIucXVldWUoKSxoPWMubGVuZ3RoLHA7aWYoc3x8IXIuaXMoIjp2aXNpYmxlIikpci5jc3MoIm9wYWNpdHkiLDApLnNob3coKSxsPTE7Zm9yKHA9MTtwPGE7cCsrKXIuYW5pbWF0ZSh7b3BhY2l0eTpsfSxmLHQuZWFzaW5nKSxsPTEtbDtyLmFuaW1hdGUoe29wYWNpdHk6bH0sZix0LmVhc2luZyksci5xdWV1ZShmdW5jdGlvbigpe28mJnIuaGlkZSgpLG4oKX0pLGg+MSYmYy5zcGxpY2UuYXBwbHkoYyxbMSwwXS5jb25jYXQoYy5zcGxpY2UoaCxhKzEpKSksci5kZXF1ZXVlKCl9fSkoalF1ZXJ5KTsoZnVuY3Rpb24oZSx0KXtlLmVmZmVjdHMuZWZmZWN0LnB1ZmY9ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLGk9ZS5lZmZlY3RzLnNldE1vZGUocix0Lm1vZGV8fCJoaWRlIikscz1pPT09ImhpZGUiLG89cGFyc2VJbnQodC5wZXJjZW50LDEwKXx8MTUwLHU9by8xMDAsYT17aGVpZ2h0OnIuaGVpZ2h0KCksd2lkdGg6ci53aWR0aCgpLG91dGVySGVpZ2h0OnIub3V0ZXJIZWlnaHQoKSxvdXRlcldpZHRoOnIub3V0ZXJXaWR0aCgpfTtlLmV4dGVuZCh0LHtlZmZlY3Q6InNjYWxlIixxdWV1ZTohMSxmYWRlOiEwLG1vZGU6aSxjb21wbGV0ZTpuLHBlcmNlbnQ6cz9vOjEwMCxmcm9tOnM/YTp7aGVpZ2h0OmEuaGVpZ2h0KnUsd2lkdGg6YS53aWR0aCp1LG91dGVySGVpZ2h0OmEub3V0ZXJIZWlnaHQqdSxvdXRlcldpZHRoOmEub3V0ZXJXaWR0aCp1fX0pLHIuZWZmZWN0KHQpfSxlLmVmZmVjdHMuZWZmZWN0LnNjYWxlPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKSxpPWUuZXh0ZW5kKCEwLHt9LHQpLHM9ZS5lZmZlY3RzLnNldE1vZGUocix0Lm1vZGV8fCJlZmZlY3QiKSxvPXBhcnNlSW50KHQucGVyY2VudCwxMCl8fChwYXJzZUludCh0LnBlcmNlbnQsMTApPT09MD8wOnM9PT0iaGlkZSI/MDoxMDApLHU9dC5kaXJlY3Rpb258fCJib3RoIixhPXQub3JpZ2luLGY9e2hlaWdodDpyLmhlaWdodCgpLHdpZHRoOnIud2lkdGgoKSxvdXRlckhlaWdodDpyLm91dGVySGVpZ2h0KCksb3V0ZXJXaWR0aDpyLm91dGVyV2lkdGgoKX0sbD17eTp1IT09Imhvcml6b250YWwiP28vMTAwOjEseDp1IT09InZlcnRpY2FsIj9vLzEwMDoxfTtpLmVmZmVjdD0ic2l6ZSIsaS5xdWV1ZT0hMSxpLmNvbXBsZXRlPW4scyE9PSJlZmZlY3QiJiYoaS5vcmlnaW49YXx8WyJtaWRkbGUiLCJjZW50ZXIiXSxpLnJlc3RvcmU9ITApLGkuZnJvbT10LmZyb218fChzPT09InNob3ciP3toZWlnaHQ6MCx3aWR0aDowLG91dGVySGVpZ2h0OjAsb3V0ZXJXaWR0aDowfTpmKSxpLnRvPXtoZWlnaHQ6Zi5oZWlnaHQqbC55LHdpZHRoOmYud2lkdGgqbC54LG91dGVySGVpZ2h0OmYub3V0ZXJIZWlnaHQqbC55LG91dGVyV2lkdGg6Zi5vdXRlcldpZHRoKmwueH0saS5mYWRlJiYocz09PSJzaG93IiYmKGkuZnJvbS5vcGFjaXR5PTAsaS50by5vcGFjaXR5PTEpLHM9PT0iaGlkZSImJihpLmZyb20ub3BhY2l0eT0xLGkudG8ub3BhY2l0eT0wKSksci5lZmZlY3QoaSl9LGUuZWZmZWN0cy5lZmZlY3Quc2l6ZT1mdW5jdGlvbih0LG4pe3ZhciByLGkscyxvPWUodGhpcyksdT1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJvdmVyZmxvdyIsIm9wYWNpdHkiXSxhPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJvdmVyZmxvdyIsIm9wYWNpdHkiXSxmPVsid2lkdGgiLCJoZWlnaHQiLCJvdmVyZmxvdyJdLGw9WyJmb250U2l6ZSJdLGM9WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxoPVsiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0Il0scD1lLmVmZmVjdHMuc2V0TW9kZShvLHQubW9kZXx8ImVmZmVjdCIpLGQ9dC5yZXN0b3JlfHxwIT09ImVmZmVjdCIsdj10LnNjYWxlfHwiYm90aCIsbT10Lm9yaWdpbnx8WyJtaWRkbGUiLCJjZW50ZXIiXSxnPW8uY3NzKCJwb3NpdGlvbiIpLHk9ZD91OmEsYj17aGVpZ2h0OjAsd2lkdGg6MCxvdXRlckhlaWdodDowLG91dGVyV2lkdGg6MH07cD09PSJzaG93IiYmby5zaG93KCkscj17aGVpZ2h0Om8uaGVpZ2h0KCksd2lkdGg6by53aWR0aCgpLG91dGVySGVpZ2h0Om8ub3V0ZXJIZWlnaHQoKSxvdXRlcldpZHRoOm8ub3V0ZXJXaWR0aCgpfSx0Lm1vZGU9PT0idG9nZ2xlIiYmcD09PSJzaG93Ij8oby5mcm9tPXQudG98fGIsby50bz10LmZyb218fHIpOihvLmZyb209dC5mcm9tfHwocD09PSJzaG93Ij9iOnIpLG8udG89dC50b3x8KHA9PT0iaGlkZSI/YjpyKSkscz17ZnJvbTp7eTpvLmZyb20uaGVpZ2h0L3IuaGVpZ2h0LHg6by5mcm9tLndpZHRoL3Iud2lkdGh9LHRvOnt5Om8udG8uaGVpZ2h0L3IuaGVpZ2h0LHg6by50by53aWR0aC9yLndpZHRofX07aWYodj09PSJib3gifHx2PT09ImJvdGgiKXMuZnJvbS55IT09cy50by55JiYoeT15LmNvbmNhdChjKSxvLmZyb209ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24obyxjLHMuZnJvbS55LG8uZnJvbSksby50bz1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihvLGMscy50by55LG8udG8pKSxzLmZyb20ueCE9PXMudG8ueCYmKHk9eS5jb25jYXQoaCksby5mcm9tPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKG8saCxzLmZyb20ueCxvLmZyb20pLG8udG89ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24obyxoLHMudG8ueCxvLnRvKSk7KHY9PT0iY29udGVudCJ8fHY9PT0iYm90aCIpJiZzLmZyb20ueSE9PXMudG8ueSYmKHk9eS5jb25jYXQobCkuY29uY2F0KGYpLG8uZnJvbT1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihvLGwscy5mcm9tLnksby5mcm9tKSxvLnRvPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKG8sbCxzLnRvLnksby50bykpLGUuZWZmZWN0cy5zYXZlKG8seSksby5zaG93KCksZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIobyksby5jc3MoIm92ZXJmbG93IiwiaGlkZGVuIikuY3NzKG8uZnJvbSksbSYmKGk9ZS5lZmZlY3RzLmdldEJhc2VsaW5lKG0sciksby5mcm9tLnRvcD0oci5vdXRlckhlaWdodC1vLm91dGVySGVpZ2h0KCkpKmkueSxvLmZyb20ubGVmdD0oci5vdXRlcldpZHRoLW8ub3V0ZXJXaWR0aCgpKSppLngsby50by50b3A9KHIub3V0ZXJIZWlnaHQtby50by5vdXRlckhlaWdodCkqaS55LG8udG8ubGVmdD0oci5vdXRlcldpZHRoLW8udG8ub3V0ZXJXaWR0aCkqaS54KSxvLmNzcyhvLmZyb20pO2lmKHY9PT0iY29udGVudCJ8fHY9PT0iYm90aCIpYz1jLmNvbmNhdChbIm1hcmdpblRvcCIsIm1hcmdpbkJvdHRvbSJdKS5jb25jYXQobCksaD1oLmNvbmNhdChbIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCJdKSxmPXUuY29uY2F0KGMpLmNvbmNhdChoKSxvLmZpbmQoIipbd2lkdGhdIikuZWFjaChmdW5jdGlvbigpe3ZhciBuPWUodGhpcykscj17aGVpZ2h0Om4uaGVpZ2h0KCksd2lkdGg6bi53aWR0aCgpLG91dGVySGVpZ2h0Om4ub3V0ZXJIZWlnaHQoKSxvdXRlcldpZHRoOm4ub3V0ZXJXaWR0aCgpfTtkJiZlLmVmZmVjdHMuc2F2ZShuLGYpLG4uZnJvbT17aGVpZ2h0OnIuaGVpZ2h0KnMuZnJvbS55LHdpZHRoOnIud2lkdGgqcy5mcm9tLngsb3V0ZXJIZWlnaHQ6ci5vdXRlckhlaWdodCpzLmZyb20ueSxvdXRlcldpZHRoOnIub3V0ZXJXaWR0aCpzLmZyb20ueH0sbi50bz17aGVpZ2h0OnIuaGVpZ2h0KnMudG8ueSx3aWR0aDpyLndpZHRoKnMudG8ueCxvdXRlckhlaWdodDpyLmhlaWdodCpzLnRvLnksb3V0ZXJXaWR0aDpyLndpZHRoKnMudG8ueH0scy5mcm9tLnkhPT1zLnRvLnkmJihuLmZyb209ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24obixjLHMuZnJvbS55LG4uZnJvbSksbi50bz1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihuLGMscy50by55LG4udG8pKSxzLmZyb20ueCE9PXMudG8ueCYmKG4uZnJvbT1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihuLGgscy5mcm9tLngsbi5mcm9tKSxuLnRvPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKG4saCxzLnRvLngsbi50bykpLG4uY3NzKG4uZnJvbSksbi5hbmltYXRlKG4udG8sdC5kdXJhdGlvbix0LmVhc2luZyxmdW5jdGlvbigpe2QmJmUuZWZmZWN0cy5yZXN0b3JlKG4sZil9KX0pO28uYW5pbWF0ZShvLnRvLHtxdWV1ZTohMSxkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpe28udG8ub3BhY2l0eT09PTAmJm8uY3NzKCJvcGFjaXR5IixvLmZyb20ub3BhY2l0eSkscD09PSJoaWRlIiYmby5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobyx5KSxkfHwoZz09PSJzdGF0aWMiP28uY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUiLHRvcDpvLnRvLnRvcCxsZWZ0Om8udG8ubGVmdH0pOmUuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihlLHQpe28uY3NzKHQsZnVuY3Rpb24odCxuKXt2YXIgcj1wYXJzZUludChuLDEwKSxpPWU/by50by5sZWZ0Om8udG8udG9wO3JldHVybiBuPT09ImF1dG8iP2krInB4IjpyK2krInB4In0pfSkpLGUuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKG8pLG4oKX19KX19KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe2UuZWZmZWN0cy5lZmZlY3Quc2hha2U9ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLGk9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0scz1lLmVmZmVjdHMuc2V0TW9kZShyLHQubW9kZXx8ImVmZmVjdCIpLG89dC5kaXJlY3Rpb258fCJsZWZ0Iix1PXQuZGlzdGFuY2V8fDIwLGE9dC50aW1lc3x8MyxmPWEqMisxLGw9TWF0aC5yb3VuZCh0LmR1cmF0aW9uL2YpLGM9bz09PSJ1cCJ8fG89PT0iZG93biI/InRvcCI6ImxlZnQiLGg9bz09PSJ1cCJ8fG89PT0ibGVmdCIscD17fSxkPXt9LHY9e30sbSxnPXIucXVldWUoKSx5PWcubGVuZ3RoO2UuZWZmZWN0cy5zYXZlKHIsaSksci5zaG93KCksZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIocikscFtjXT0oaD8iLT0iOiIrPSIpK3UsZFtjXT0oaD8iKz0iOiItPSIpK3UqMix2W2NdPShoPyItPSI6Iis9IikrdSoyLHIuYW5pbWF0ZShwLGwsdC5lYXNpbmcpO2ZvcihtPTE7bTxhO20rKylyLmFuaW1hdGUoZCxsLHQuZWFzaW5nKS5hbmltYXRlKHYsbCx0LmVhc2luZyk7ci5hbmltYXRlKGQsbCx0LmVhc2luZykuYW5pbWF0ZShwLGwvMix0LmVhc2luZykucXVldWUoZnVuY3Rpb24oKXtzPT09ImhpZGUiJiZyLmhpZGUoKSxlLmVmZmVjdHMucmVzdG9yZShyLGkpLGUuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKHIpLG4oKX0pLHk+MSYmZy5zcGxpY2UuYXBwbHkoZyxbMSwwXS5jb25jYXQoZy5zcGxpY2UoeSxmKzEpKSksci5kZXF1ZXVlKCl9fSkoalF1ZXJ5KTsoZnVuY3Rpb24oZSx0KXtlLmVmZmVjdHMuZWZmZWN0LnNsaWRlPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKSxpPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJ3aWR0aCIsImhlaWdodCJdLHM9ZS5lZmZlY3RzLnNldE1vZGUocix0Lm1vZGV8fCJzaG93Iiksbz1zPT09InNob3ciLHU9dC5kaXJlY3Rpb258fCJsZWZ0IixhPXU9PT0idXAifHx1PT09ImRvd24iPyJ0b3AiOiJsZWZ0IixmPXU9PT0idXAifHx1PT09ImxlZnQiLGwsYz17fTtlLmVmZmVjdHMuc2F2ZShyLGkpLHIuc2hvdygpLGw9dC5kaXN0YW5jZXx8clthPT09InRvcCI/Im91dGVySGVpZ2h0Ijoib3V0ZXJXaWR0aCJdKCEwKSxlLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihyKS5jc3Moe292ZXJmbG93OiJoaWRkZW4ifSksbyYmci5jc3MoYSxmP2lzTmFOKGwpPyItIitsOi1sOmwpLGNbYV09KG8/Zj8iKz0iOiItPSI6Zj8iLT0iOiIrPSIpK2wsci5hbmltYXRlKGMse3F1ZXVlOiExLGR1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7cz09PSJoaWRlIiYmci5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUocixpKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihyKSxuKCl9fSl9fSkoalF1ZXJ5KTsoZnVuY3Rpb24oZSx0KXtlLmVmZmVjdHMuZWZmZWN0LnRyYW5zZmVyPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKSxpPWUodC50bykscz1pLmNzcygicG9zaXRpb24iKT09PSJmaXhlZCIsbz1lKCJib2R5IiksdT1zP28uc2Nyb2xsVG9wKCk6MCxhPXM/by5zY3JvbGxMZWZ0KCk6MCxmPWkub2Zmc2V0KCksbD17dG9wOmYudG9wLXUsbGVmdDpmLmxlZnQtYSxoZWlnaHQ6aS5pbm5lckhlaWdodCgpLHdpZHRoOmkuaW5uZXJXaWR0aCgpfSxjPXIub2Zmc2V0KCksaD1lKCc8ZGl2IGNsYXNzPSJ1aS1lZmZlY3RzLXRyYW5zZmVyIj48L2Rpdj4nKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5hZGRDbGFzcyh0LmNsYXNzTmFtZSkuY3NzKHt0b3A6Yy50b3AtdSxsZWZ0OmMubGVmdC1hLGhlaWdodDpyLmlubmVySGVpZ2h0KCksd2lkdGg6ci5pbm5lcldpZHRoKCkscG9zaXRpb246cz8iZml4ZWQiOiJhYnNvbHV0ZSJ9KS5hbmltYXRlKGwsdC5kdXJhdGlvbix0LmVhc2luZyxmdW5jdGlvbigpe2gucmVtb3ZlKCksbigpfSl9fSkoalF1ZXJ5KTsoZnVuY3Rpb24oZSx0KXt2YXIgbj0hMTtlLndpZGdldCgidWkubWVudSIse3ZlcnNpb246IjEuOS4yIixkZWZhdWx0RWxlbWVudDoiPHVsPiIsZGVsYXk6MzAwLG9wdGlvbnM6e2ljb25zOntzdWJtZW51OiJ1aS1pY29uLWNhcmF0LTEtZSJ9LG1lbnVzOiJ1bCIscG9zaXRpb246e215OiJsZWZ0IHRvcCIsYXQ6InJpZ2h0IHRvcCJ9LHJvbGU6Im1lbnUiLGJsdXI6bnVsbCxmb2N1czpudWxsLHNlbGVjdDpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5hY3RpdmVNZW51PXRoaXMuZWxlbWVudCx0aGlzLmVsZW1lbnQudW5pcXVlSWQoKS5hZGRDbGFzcygidWktbWVudSB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIpLnRvZ2dsZUNsYXNzKCJ1aS1tZW51LWljb25zIiwhIXRoaXMuZWxlbWVudC5maW5kKCIudWktaWNvbiIpLmxlbmd0aCkuYXR0cih7cm9sZTp0aGlzLm9wdGlvbnMucm9sZSx0YWJJbmRleDowfSkuYmluZCgiY2xpY2siK3RoaXMuZXZlbnROYW1lc3BhY2UsZS5wcm94eShmdW5jdGlvbihlKXt0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJmUucHJldmVudERlZmF1bHQoKX0sdGhpcykpLHRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpLmF0dHIoImFyaWEtZGlzYWJsZWQiLCJ0cnVlIiksdGhpcy5fb24oeyJtb3VzZWRvd24gLnVpLW1lbnUtaXRlbSA+IGEiOmZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKX0sImNsaWNrIC51aS1zdGF0ZS1kaXNhYmxlZCA+IGEiOmZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKX0sImNsaWNrIC51aS1tZW51LWl0ZW06aGFzKGEpIjpmdW5jdGlvbih0KXt2YXIgcj1lKHQudGFyZ2V0KS5jbG9zZXN0KCIudWktbWVudS1pdGVtIik7IW4mJnIubm90KCIudWktc3RhdGUtZGlzYWJsZWQiKS5sZW5ndGgmJihuPSEwLHRoaXMuc2VsZWN0KHQpLHIuaGFzKCIudWktbWVudSIpLmxlbmd0aD90aGlzLmV4cGFuZCh0KTp0aGlzLmVsZW1lbnQuaXMoIjpmb2N1cyIpfHwodGhpcy5lbGVtZW50LnRyaWdnZXIoImZvY3VzIixbITBdKSx0aGlzLmFjdGl2ZSYmdGhpcy5hY3RpdmUucGFyZW50cygiLnVpLW1lbnUiKS5sZW5ndGg9PT0xJiZjbGVhclRpbWVvdXQodGhpcy50aW1lcikpKX0sIm1vdXNlZW50ZXIgLnVpLW1lbnUtaXRlbSI6ZnVuY3Rpb24odCl7dmFyIG49ZSh0LmN1cnJlbnRUYXJnZXQpO24uc2libGluZ3MoKS5jaGlsZHJlbigiLnVpLXN0YXRlLWFjdGl2ZSIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLmZvY3VzKHQsbil9LG1vdXNlbGVhdmU6ImNvbGxhcHNlQWxsIiwibW91c2VsZWF2ZSAudWktbWVudSI6ImNvbGxhcHNlQWxsIixmb2N1czpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuYWN0aXZlfHx0aGlzLmVsZW1lbnQuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW0iKS5lcSgwKTt0fHx0aGlzLmZvY3VzKGUsbil9LGJsdXI6ZnVuY3Rpb24odCl7dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXtlLmNvbnRhaW5zKHRoaXMuZWxlbWVudFswXSx0aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQpfHx0aGlzLmNvbGxhcHNlQWxsKHQpfSl9LGtleWRvd246Il9rZXlkb3duIn0pLHRoaXMucmVmcmVzaCgpLHRoaXMuX29uKHRoaXMuZG9jdW1lbnQse2NsaWNrOmZ1bmN0aW9uKHQpe2UodC50YXJnZXQpLmNsb3Nlc3QoIi51aS1tZW51IikubGVuZ3RofHx0aGlzLmNvbGxhcHNlQWxsKHQpLG49ITF9fSl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUF0dHIoImFyaWEtYWN0aXZlZGVzY2VuZGFudCIpLmZpbmQoIi51aS1tZW51IikuYW5kU2VsZigpLnJlbW92ZUNsYXNzKCJ1aS1tZW51IHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIHVpLW1lbnUtaWNvbnMiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigidGFiSW5kZXgiKS5yZW1vdmVBdHRyKCJhcmlhLWxhYmVsbGVkYnkiKS5yZW1vdmVBdHRyKCJhcmlhLWV4cGFuZGVkIikucmVtb3ZlQXR0cigiYXJpYS1oaWRkZW4iKS5yZW1vdmVBdHRyKCJhcmlhLWRpc2FibGVkIikucmVtb3ZlVW5pcXVlSWQoKS5zaG93KCksdGhpcy5lbGVtZW50LmZpbmQoIi51aS1tZW51LWl0ZW0iKS5yZW1vdmVDbGFzcygidWktbWVudS1pdGVtIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtZGlzYWJsZWQiKS5jaGlsZHJlbigiYSIpLnJlbW92ZVVuaXF1ZUlkKCkucmVtb3ZlQ2xhc3MoInVpLWNvcm5lci1hbGwgdWktc3RhdGUtaG92ZXIiKS5yZW1vdmVBdHRyKCJ0YWJJbmRleCIpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJhcmlhLWhhc3BvcHVwIikuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTt0LmRhdGEoInVpLW1lbnUtc3VibWVudS1jYXJhdCIpJiZ0LnJlbW92ZSgpfSksdGhpcy5lbGVtZW50LmZpbmQoIi51aS1tZW51LWRpdmlkZXIiKS5yZW1vdmVDbGFzcygidWktbWVudS1kaXZpZGVyIHVpLXdpZGdldC1jb250ZW50Iil9LF9rZXlkb3duOmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGEoZSl7cmV0dXJuIGUucmVwbGFjZSgvW1wtXFtcXXt9KCkqKz8uLFxcXF4kfCNcc10vZywiXFwkJiIpfXZhciBuLHIsaSxzLG8sdT0hMDtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIGUudWkua2V5Q29kZS5QQUdFX1VQOnRoaXMucHJldmlvdXNQYWdlKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlBBR0VfRE9XTjp0aGlzLm5leHRQYWdlKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkhPTUU6dGhpcy5fbW92ZSgiZmlyc3QiLCJmaXJzdCIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5EOnRoaXMuX21vdmUoImxhc3QiLCJsYXN0Iix0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5VUDp0aGlzLnByZXZpb3VzKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkRPV046dGhpcy5uZXh0KHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkxFRlQ6dGhpcy5jb2xsYXBzZSh0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5SSUdIVDp0aGlzLmFjdGl2ZSYmIXRoaXMuYWN0aXZlLmlzKCIudWktc3RhdGUtZGlzYWJsZWQiKSYmdGhpcy5leHBhbmQodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5URVI6Y2FzZSBlLnVpLmtleUNvZGUuU1BBQ0U6dGhpcy5fYWN0aXZhdGUodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRVNDQVBFOnRoaXMuY29sbGFwc2UodCk7YnJlYWs7ZGVmYXVsdDp1PSExLHI9dGhpcy5wcmV2aW91c0ZpbHRlcnx8IiIsaT1TdHJpbmcuZnJvbUNoYXJDb2RlKHQua2V5Q29kZSkscz0hMSxjbGVhclRpbWVvdXQodGhpcy5maWx0ZXJUaW1lciksaT09PXI/cz0hMDppPXIraSxvPW5ldyBSZWdFeHAoIl4iK2EoaSksImkiKSxuPXRoaXMuYWN0aXZlTWVudS5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBvLnRlc3QoZSh0aGlzKS5jaGlsZHJlbigiYSIpLnRleHQoKSl9KSxuPXMmJm4uaW5kZXgodGhpcy5hY3RpdmUubmV4dCgpKSE9PS0xP3RoaXMuYWN0aXZlLm5leHRBbGwoIi51aS1tZW51LWl0ZW0iKTpuLG4ubGVuZ3RofHwoaT1TdHJpbmcuZnJvbUNoYXJDb2RlKHQua2V5Q29kZSksbz1uZXcgUmVnRXhwKCJeIithKGkpLCJpIiksbj10aGlzLmFjdGl2ZU1lbnUuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW0iKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gby50ZXN0KGUodGhpcykuY2hpbGRyZW4oImEiKS50ZXh0KCkpfSkpLG4ubGVuZ3RoPyh0aGlzLmZvY3VzKHQsbiksbi5sZW5ndGg+MT8odGhpcy5wcmV2aW91c0ZpbHRlcj1pLHRoaXMuZmlsdGVyVGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5wcmV2aW91c0ZpbHRlcn0sMWUzKSk6ZGVsZXRlIHRoaXMucHJldmlvdXNGaWx0ZXIpOmRlbGV0ZSB0aGlzLnByZXZpb3VzRmlsdGVyfXUmJnQucHJldmVudERlZmF1bHQoKX0sX2FjdGl2YXRlOmZ1bmN0aW9uKGUpe3RoaXMuYWN0aXZlLmlzKCIudWktc3RhdGUtZGlzYWJsZWQiKXx8KHRoaXMuYWN0aXZlLmNoaWxkcmVuKCJhW2FyaWEtaGFzcG9wdXA9J3RydWUnXSIpLmxlbmd0aD90aGlzLmV4cGFuZChlKTp0aGlzLnNlbGVjdChlKSl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdCxuPXRoaXMub3B0aW9ucy5pY29ucy5zdWJtZW51LHI9dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLm1lbnVzKTtyLmZpbHRlcigiOm5vdCgudWktbWVudSkiKS5hZGRDbGFzcygidWktbWVudSB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIpLmhpZGUoKS5hdHRyKHtyb2xlOnRoaXMub3B0aW9ucy5yb2xlLCJhcmlhLWhpZGRlbiI6InRydWUiLCJhcmlhLWV4cGFuZGVkIjoiZmFsc2UifSkuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcykscj10LnByZXYoImEiKSxpPWUoIjxzcGFuPiIpLmFkZENsYXNzKCJ1aS1tZW51LWljb24gdWktaWNvbiAiK24pLmRhdGEoInVpLW1lbnUtc3VibWVudS1jYXJhdCIsITApO3IuYXR0cigiYXJpYS1oYXNwb3B1cCIsInRydWUiKS5wcmVwZW5kKGkpLHQuYXR0cigiYXJpYS1sYWJlbGxlZGJ5IixyLmF0dHIoImlkIikpfSksdD1yLmFkZCh0aGlzLmVsZW1lbnQpLHQuY2hpbGRyZW4oIjpub3QoLnVpLW1lbnUtaXRlbSk6aGFzKGEpIikuYWRkQ2xhc3MoInVpLW1lbnUtaXRlbSIpLmF0dHIoInJvbGUiLCJwcmVzZW50YXRpb24iKS5jaGlsZHJlbigiYSIpLnVuaXF1ZUlkKCkuYWRkQ2xhc3MoInVpLWNvcm5lci1hbGwiKS5hdHRyKHt0YWJJbmRleDotMSxyb2xlOnRoaXMuX2l0ZW1Sb2xlKCl9KSx0LmNoaWxkcmVuKCI6bm90KC51aS1tZW51LWl0ZW0pIikuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcyk7L1teXC3igJTigJNcc10vLnRlc3QodC50ZXh0KCkpfHx0LmFkZENsYXNzKCJ1aS13aWRnZXQtY29udGVudCB1aS1tZW51LWRpdmlkZXIiKX0pLHQuY2hpbGRyZW4oIi51aS1zdGF0ZS1kaXNhYmxlZCIpLmF0dHIoImFyaWEtZGlzYWJsZWQiLCJ0cnVlIiksdGhpcy5hY3RpdmUmJiFlLmNvbnRhaW5zKHRoaXMuZWxlbWVudFswXSx0aGlzLmFjdGl2ZVswXSkmJnRoaXMuYmx1cigpfSxfaXRlbVJvbGU6ZnVuY3Rpb24oKXtyZXR1cm57bWVudToibWVudWl0ZW0iLGxpc3Rib3g6Im9wdGlvbiJ9W3RoaXMub3B0aW9ucy5yb2xlXX0sZm9jdXM6ZnVuY3Rpb24oZSx0KXt2YXIgbixyO3RoaXMuYmx1cihlLGUmJmUudHlwZT09PSJmb2N1cyIpLHRoaXMuX3Njcm9sbEludG9WaWV3KHQpLHRoaXMuYWN0aXZlPXQuZmlyc3QoKSxyPXRoaXMuYWN0aXZlLmNoaWxkcmVuKCJhIikuYWRkQ2xhc3MoInVpLXN0YXRlLWZvY3VzIiksdGhpcy5vcHRpb25zLnJvbGUmJnRoaXMuZWxlbWVudC5hdHRyKCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiLHIuYXR0cigiaWQiKSksdGhpcy5hY3RpdmUucGFyZW50KCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSIpLmNoaWxkcmVuKCJhOmZpcnN0IikuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGUmJmUudHlwZT09PSJrZXlkb3duIj90aGlzLl9jbG9zZSgpOnRoaXMudGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLl9jbG9zZSgpfSx0aGlzLmRlbGF5KSxuPXQuY2hpbGRyZW4oIi51aS1tZW51Iiksbi5sZW5ndGgmJi9ebW91c2UvLnRlc3QoZS50eXBlKSYmdGhpcy5fc3RhcnRPcGVuaW5nKG4pLHRoaXMuYWN0aXZlTWVudT10LnBhcmVudCgpLHRoaXMuX3RyaWdnZXIoImZvY3VzIixlLHtpdGVtOnR9KX0sX3Njcm9sbEludG9WaWV3OmZ1bmN0aW9uKHQpe3ZhciBuLHIsaSxzLG8sdTt0aGlzLl9oYXNTY3JvbGwoKSYmKG49cGFyc2VGbG9hdChlLmNzcyh0aGlzLmFjdGl2ZU1lbnVbMF0sImJvcmRlclRvcFdpZHRoIikpfHwwLHI9cGFyc2VGbG9hdChlLmNzcyh0aGlzLmFjdGl2ZU1lbnVbMF0sInBhZGRpbmdUb3AiKSl8fDAsaT10Lm9mZnNldCgpLnRvcC10aGlzLmFjdGl2ZU1lbnUub2Zmc2V0KCkudG9wLW4tcixzPXRoaXMuYWN0aXZlTWVudS5zY3JvbGxUb3AoKSxvPXRoaXMuYWN0aXZlTWVudS5oZWlnaHQoKSx1PXQuaGVpZ2h0KCksaTwwP3RoaXMuYWN0aXZlTWVudS5zY3JvbGxUb3AocytpKTppK3U+byYmdGhpcy5hY3RpdmVNZW51LnNjcm9sbFRvcChzK2ktbyt1KSl9LGJsdXI6ZnVuY3Rpb24oZSx0KXt0fHxjbGVhclRpbWVvdXQodGhpcy50aW1lcik7aWYoIXRoaXMuYWN0aXZlKXJldHVybjt0aGlzLmFjdGl2ZS5jaGlsZHJlbigiYSIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpLHRoaXMuYWN0aXZlPW51bGwsdGhpcy5fdHJpZ2dlcigiYmx1ciIsZSx7aXRlbTp0aGlzLmFjdGl2ZX0pfSxfc3RhcnRPcGVuaW5nOmZ1bmN0aW9uKGUpe2NsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtpZihlLmF0dHIoImFyaWEtaGlkZGVuIikhPT0idHJ1ZSIpcmV0dXJuO3RoaXMudGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLl9jbG9zZSgpLHRoaXMuX29wZW4oZSl9LHRoaXMuZGVsYXkpfSxfb3BlbjpmdW5jdGlvbih0KXt2YXIgbj1lLmV4dGVuZCh7b2Y6dGhpcy5hY3RpdmV9LHRoaXMub3B0aW9ucy5wb3NpdGlvbik7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMuZWxlbWVudC5maW5kKCIudWktbWVudSIpLm5vdCh0LnBhcmVudHMoIi51aS1tZW51IikpLmhpZGUoKS5hdHRyKCJhcmlhLWhpZGRlbiIsInRydWUiKSx0LnNob3coKS5yZW1vdmVBdHRyKCJhcmlhLWhpZGRlbiIpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCJ0cnVlIikucG9zaXRpb24obil9LGNvbGxhcHNlQWxsOmZ1bmN0aW9uKHQsbil7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt2YXIgcj1uP3RoaXMuZWxlbWVudDplKHQmJnQudGFyZ2V0KS5jbG9zZXN0KHRoaXMuZWxlbWVudC5maW5kKCIudWktbWVudSIpKTtyLmxlbmd0aHx8KHI9dGhpcy5lbGVtZW50KSx0aGlzLl9jbG9zZShyKSx0aGlzLmJsdXIodCksdGhpcy5hY3RpdmVNZW51PXJ9LHRoaXMuZGVsYXkpfSxfY2xvc2U6ZnVuY3Rpb24oZSl7ZXx8KGU9dGhpcy5hY3RpdmU/dGhpcy5hY3RpdmUucGFyZW50KCk6dGhpcy5lbGVtZW50KSxlLmZpbmQoIi51aS1tZW51IikuaGlkZSgpLmF0dHIoImFyaWEtaGlkZGVuIiwidHJ1ZSIpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCJmYWxzZSIpLmVuZCgpLmZpbmQoImEudWktc3RhdGUtYWN0aXZlIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSxjb2xsYXBzZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmFjdGl2ZSYmdGhpcy5hY3RpdmUucGFyZW50KCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSIsdGhpcy5lbGVtZW50KTt0JiZ0Lmxlbmd0aCYmKHRoaXMuX2Nsb3NlKCksdGhpcy5mb2N1cyhlLHQpKX0sZXhwYW5kOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuYWN0aXZlJiZ0aGlzLmFjdGl2ZS5jaGlsZHJlbigiLnVpLW1lbnUgIikuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW0iKS5maXJzdCgpO3QmJnQubGVuZ3RoJiYodGhpcy5fb3Blbih0LnBhcmVudCgpKSx0aGlzLl9kZWxheShmdW5jdGlvbigpe3RoaXMuZm9jdXMoZSx0KX0pKX0sbmV4dDpmdW5jdGlvbihlKXt0aGlzLl9tb3ZlKCJuZXh0IiwiZmlyc3QiLGUpfSxwcmV2aW91czpmdW5jdGlvbihlKXt0aGlzLl9tb3ZlKCJwcmV2IiwibGFzdCIsZSl9LGlzRmlyc3RJdGVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlJiYhdGhpcy5hY3RpdmUucHJldkFsbCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aH0saXNMYXN0SXRlbTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFjdGl2ZSYmIXRoaXMuYWN0aXZlLm5leHRBbGwoIi51aS1tZW51LWl0ZW0iKS5sZW5ndGh9LF9tb3ZlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjt0aGlzLmFjdGl2ZSYmKGU9PT0iZmlyc3QifHxlPT09Imxhc3QiP3I9dGhpcy5hY3RpdmVbZT09PSJmaXJzdCI/InByZXZBbGwiOiJuZXh0QWxsIl0oIi51aS1tZW51LWl0ZW0iKS5lcSgtMSk6cj10aGlzLmFjdGl2ZVtlKyJBbGwiXSgiLnVpLW1lbnUtaXRlbSIpLmVxKDApKTtpZighcnx8IXIubGVuZ3RofHwhdGhpcy5hY3RpdmUpcj10aGlzLmFjdGl2ZU1lbnUuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW0iKVt0XSgpO3RoaXMuZm9jdXMobixyKX0sbmV4dFBhZ2U6ZnVuY3Rpb24odCl7dmFyIG4scixpO2lmKCF0aGlzLmFjdGl2ZSl7dGhpcy5uZXh0KHQpO3JldHVybn1pZih0aGlzLmlzTGFzdEl0ZW0oKSlyZXR1cm47dGhpcy5faGFzU2Nyb2xsKCk/KHI9dGhpcy5hY3RpdmUub2Zmc2V0KCkudG9wLGk9dGhpcy5lbGVtZW50LmhlaWdodCgpLHRoaXMuYWN0aXZlLm5leHRBbGwoIi51aS1tZW51LWl0ZW0iKS5lYWNoKGZ1bmN0aW9uKCl7cmV0dXJuIG49ZSh0aGlzKSxuLm9mZnNldCgpLnRvcC1yLWk8MH0pLHRoaXMuZm9jdXModCxuKSk6dGhpcy5mb2N1cyh0LHRoaXMuYWN0aXZlTWVudS5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpW3RoaXMuYWN0aXZlPyJsYXN0IjoiZmlyc3QiXSgpKX0scHJldmlvdXNQYWdlOmZ1bmN0aW9uKHQpe3ZhciBuLHIsaTtpZighdGhpcy5hY3RpdmUpe3RoaXMubmV4dCh0KTtyZXR1cm59aWYodGhpcy5pc0ZpcnN0SXRlbSgpKXJldHVybjt0aGlzLl9oYXNTY3JvbGwoKT8ocj10aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3AsaT10aGlzLmVsZW1lbnQuaGVpZ2h0KCksdGhpcy5hY3RpdmUucHJldkFsbCgiLnVpLW1lbnUtaXRlbSIpLmVhY2goZnVuY3Rpb24oKXtyZXR1cm4gbj1lKHRoaXMpLG4ub2Zmc2V0KCkudG9wLXIraT4wfSksdGhpcy5mb2N1cyh0LG4pKTp0aGlzLmZvY3VzKHQsdGhpcy5hY3RpdmVNZW51LmNoaWxkcmVuKCIudWktbWVudS1pdGVtIikuZmlyc3QoKSl9LF9oYXNTY3JvbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCk8dGhpcy5lbGVtZW50LnByb3AoInNjcm9sbEhlaWdodCIpfSxzZWxlY3Q6ZnVuY3Rpb24odCl7dGhpcy5hY3RpdmU9dGhpcy5hY3RpdmV8fGUodC50YXJnZXQpLmNsb3Nlc3QoIi51aS1tZW51LWl0ZW0iKTt2YXIgbj17aXRlbTp0aGlzLmFjdGl2ZX07dGhpcy5hY3RpdmUuaGFzKCIudWktbWVudSIpLmxlbmd0aHx8dGhpcy5jb2xsYXBzZUFsbCh0LCEwKSx0aGlzLl90cmlnZ2VyKCJzZWxlY3QiLHQsbil9fSl9KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe2Uud2lkZ2V0KCJ1aS5wcm9ncmVzc2JhciIse3ZlcnNpb246IjEuOS4yIixvcHRpb25zOnt2YWx1ZTowLG1heDoxMDB9LG1pbjowLF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXByb2dyZXNzYmFyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikuYXR0cih7cm9sZToicHJvZ3Jlc3NiYXIiLCJhcmlhLXZhbHVlbWluIjp0aGlzLm1pbiwiYXJpYS12YWx1ZW1heCI6dGhpcy5vcHRpb25zLm1heCwiYXJpYS12YWx1ZW5vdyI6dGhpcy5fdmFsdWUoKX0pLHRoaXMudmFsdWVEaXY9ZSgiPGRpdiBjbGFzcz0ndWktcHJvZ3Jlc3NiYXItdmFsdWUgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItbGVmdCc+PC9kaXY+IikuYXBwZW5kVG8odGhpcy5lbGVtZW50KSx0aGlzLm9sZFZhbHVlPXRoaXMuX3ZhbHVlKCksdGhpcy5fcmVmcmVzaFZhbHVlKCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1wcm9ncmVzc2JhciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbWluIikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW1heCIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVub3ciKSx0aGlzLnZhbHVlRGl2LnJlbW92ZSgpfSx2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZT09PXQ/dGhpcy5fdmFsdWUoKToodGhpcy5fc2V0T3B0aW9uKCJ2YWx1ZSIsZSksdGhpcyl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtlPT09InZhbHVlIiYmKHRoaXMub3B0aW9ucy52YWx1ZT10LHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHRoaXMuX3ZhbHVlKCk9PT10aGlzLm9wdGlvbnMubWF4JiZ0aGlzLl90cmlnZ2VyKCJjb21wbGV0ZSIpKSx0aGlzLl9zdXBlcihlLHQpfSxfdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnMudmFsdWU7cmV0dXJuIHR5cGVvZiBlIT0ibnVtYmVyIiYmKGU9MCksTWF0aC5taW4odGhpcy5vcHRpb25zLm1heCxNYXRoLm1heCh0aGlzLm1pbixlKSl9LF9wZXJjZW50YWdlOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCp0aGlzLl92YWx1ZSgpL3RoaXMub3B0aW9ucy5tYXh9LF9yZWZyZXNoVmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnZhbHVlKCksdD10aGlzLl9wZXJjZW50YWdlKCk7dGhpcy5vbGRWYWx1ZSE9PWUmJih0aGlzLm9sZFZhbHVlPWUsdGhpcy5fdHJpZ2dlcigiY2hhbmdlIikpLHRoaXMudmFsdWVEaXYudG9nZ2xlKGU+dGhpcy5taW4pLnRvZ2dsZUNsYXNzKCJ1aS1jb3JuZXItcmlnaHQiLGU9PT10aGlzLm9wdGlvbnMubWF4KS53aWR0aCh0LnRvRml4ZWQoMCkrIiUiKSx0aGlzLmVsZW1lbnQuYXR0cigiYXJpYS12YWx1ZW5vdyIsZSl9fSl9KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe2Uud2lkZ2V0KCJ1aS5yZXNpemFibGUiLGUudWkubW91c2Use3ZlcnNpb246IjEuOS4yIix3aWRnZXRFdmVudFByZWZpeDoicmVzaXplIixvcHRpb25zOnthbHNvUmVzaXplOiExLGFuaW1hdGU6ITEsYW5pbWF0ZUR1cmF0aW9uOiJzbG93IixhbmltYXRlRWFzaW5nOiJzd2luZyIsYXNwZWN0UmF0aW86ITEsYXV0b0hpZGU6ITEsY29udGFpbm1lbnQ6ITEsZ2hvc3Q6ITEsZ3JpZDohMSxoYW5kbGVzOiJlLHMsc2UiLGhlbHBlcjohMSxtYXhIZWlnaHQ6bnVsbCxtYXhXaWR0aDpudWxsLG1pbkhlaWdodDoxMCxtaW5XaWR0aDoxMCx6SW5kZXg6MWUzfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPXRoaXMub3B0aW9uczt0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZSIpLGUuZXh0ZW5kKHRoaXMse19hc3BlY3RSYXRpbzohIW4uYXNwZWN0UmF0aW8sYXNwZWN0UmF0aW86bi5hc3BlY3RSYXRpbyxvcmlnaW5hbEVsZW1lbnQ6dGhpcy5lbGVtZW50LF9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzOltdLF9oZWxwZXI6bi5oZWxwZXJ8fG4uZ2hvc3R8fG4uYW5pbWF0ZT9uLmhlbHBlcnx8InVpLXJlc2l6YWJsZS1oZWxwZXIiOm51bGx9KSx0aGlzLmVsZW1lbnRbMF0ubm9kZU5hbWUubWF0Y2goL2NhbnZhc3x0ZXh0YXJlYXxpbnB1dHxzZWxlY3R8YnV0dG9ufGltZy9pKSYmKHRoaXMuZWxlbWVudC53cmFwKGUoJzxkaXYgY2xhc3M9InVpLXdyYXBwZXIiIHN0eWxlPSJvdmVyZmxvdzogaGlkZGVuOyI+PC9kaXY+JykuY3NzKHtwb3NpdGlvbjp0aGlzLmVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpLHdpZHRoOnRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpLHRvcDp0aGlzLmVsZW1lbnQuY3NzKCJ0b3AiKSxsZWZ0OnRoaXMuZWxlbWVudC5jc3MoImxlZnQiKX0pKSx0aGlzLmVsZW1lbnQ9dGhpcy5lbGVtZW50LnBhcmVudCgpLmRhdGEoInJlc2l6YWJsZSIsdGhpcy5lbGVtZW50LmRhdGEoInJlc2l6YWJsZSIpKSx0aGlzLmVsZW1lbnRJc1dyYXBwZXI9ITAsdGhpcy5lbGVtZW50LmNzcyh7bWFyZ2luTGVmdDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbkxlZnQiKSxtYXJnaW5Ub3A6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5Ub3AiKSxtYXJnaW5SaWdodDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpblJpZ2h0IiksbWFyZ2luQm90dG9tOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luQm90dG9tIil9KSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe21hcmdpbkxlZnQ6MCxtYXJnaW5Ub3A6MCxtYXJnaW5SaWdodDowLG1hcmdpbkJvdHRvbTowfSksdGhpcy5vcmlnaW5hbFJlc2l6ZVN0eWxlPXRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygicmVzaXplIiksdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiLCJub25lIiksdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5wdXNoKHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7cG9zaXRpb246InN0YXRpYyIsem9vbToxLGRpc3BsYXk6ImJsb2NrIn0pKSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe21hcmdpbjp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbiIpfSksdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKSksdGhpcy5oYW5kbGVzPW4uaGFuZGxlc3x8KGUoIi51aS1yZXNpemFibGUtaGFuZGxlIix0aGlzLmVsZW1lbnQpLmxlbmd0aD97bjoiLnVpLXJlc2l6YWJsZS1uIixlOiIudWktcmVzaXphYmxlLWUiLHM6Ii51aS1yZXNpemFibGUtcyIsdzoiLnVpLXJlc2l6YWJsZS13IixzZToiLnVpLXJlc2l6YWJsZS1zZSIsc3c6Ii51aS1yZXNpemFibGUtc3ciLG5lOiIudWktcmVzaXphYmxlLW5lIixudzoiLnVpLXJlc2l6YWJsZS1udyJ9OiJlLHMsc2UiKTtpZih0aGlzLmhhbmRsZXMuY29uc3RydWN0b3I9PVN0cmluZyl7dGhpcy5oYW5kbGVzPT0iYWxsIiYmKHRoaXMuaGFuZGxlcz0ibixlLHMsdyxzZSxzdyxuZSxudyIpO3ZhciByPXRoaXMuaGFuZGxlcy5zcGxpdCgiLCIpO3RoaXMuaGFuZGxlcz17fTtmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIHM9ZS50cmltKHJbaV0pLG89InVpLXJlc2l6YWJsZS0iK3MsdT1lKCc8ZGl2IGNsYXNzPSJ1aS1yZXNpemFibGUtaGFuZGxlICcrbysnIj48L2Rpdj4nKTt1LmNzcyh7ekluZGV4Om4uekluZGV4fSksInNlIj09cyYmdS5hZGRDbGFzcygidWktaWNvbiB1aS1pY29uLWdyaXBzbWFsbC1kaWFnb25hbC1zZSIpLHRoaXMuaGFuZGxlc1tzXT0iLnVpLXJlc2l6YWJsZS0iK3MsdGhpcy5lbGVtZW50LmFwcGVuZCh1KX19dGhpcy5fcmVuZGVyQXhpcz1mdW5jdGlvbih0KXt0PXR8fHRoaXMuZWxlbWVudDtmb3IodmFyIG4gaW4gdGhpcy5oYW5kbGVzKXt0aGlzLmhhbmRsZXNbbl0uY29uc3RydWN0b3I9PVN0cmluZyYmKHRoaXMuaGFuZGxlc1tuXT1lKHRoaXMuaGFuZGxlc1tuXSx0aGlzLmVsZW1lbnQpLnNob3coKSk7aWYodGhpcy5lbGVtZW50SXNXcmFwcGVyJiZ0aGlzLm9yaWdpbmFsRWxlbWVudFswXS5ub2RlTmFtZS5tYXRjaCgvdGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbi9pKSl7dmFyIHI9ZSh0aGlzLmhhbmRsZXNbbl0sdGhpcy5lbGVtZW50KSxpPTA7aT0vc3d8bmV8bnd8c2V8bnxzLy50ZXN0KG4pP3Iub3V0ZXJIZWlnaHQoKTpyLm91dGVyV2lkdGgoKTt2YXIgcz1bInBhZGRpbmciLC9uZXxud3xuLy50ZXN0KG4pPyJUb3AiOi9zZXxzd3xzLy50ZXN0KG4pPyJCb3R0b20iOi9eZSQvLnRlc3Qobik/IlJpZ2h0IjoiTGVmdCJdLmpvaW4oIiIpO3QuY3NzKHMsaSksdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKX1pZighZSh0aGlzLmhhbmRsZXNbbl0pLmxlbmd0aCljb250aW51ZX19LHRoaXMuX3JlbmRlckF4aXModGhpcy5lbGVtZW50KSx0aGlzLl9oYW5kbGVzPWUoIi51aS1yZXNpemFibGUtaGFuZGxlIix0aGlzLmVsZW1lbnQpLmRpc2FibGVTZWxlY3Rpb24oKSx0aGlzLl9oYW5kbGVzLm1vdXNlb3ZlcihmdW5jdGlvbigpe2lmKCF0LnJlc2l6aW5nKXtpZih0aGlzLmNsYXNzTmFtZSl2YXIgZT10aGlzLmNsYXNzTmFtZS5tYXRjaCgvdWktcmVzaXphYmxlLShzZXxzd3xuZXxud3xufGV8c3x3KS9pKTt0LmF4aXM9ZSYmZVsxXT9lWzFdOiJzZSJ9fSksbi5hdXRvSGlkZSYmKHRoaXMuX2hhbmRsZXMuaGlkZSgpLGUodGhpcy5lbGVtZW50KS5hZGRDbGFzcygidWktcmVzaXphYmxlLWF1dG9oaWRlIikubW91c2VlbnRlcihmdW5jdGlvbigpe2lmKG4uZGlzYWJsZWQpcmV0dXJuO2UodGhpcykucmVtb3ZlQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpLHQuX2hhbmRsZXMuc2hvdygpfSkubW91c2VsZWF2ZShmdW5jdGlvbigpe2lmKG4uZGlzYWJsZWQpcmV0dXJuO3QucmVzaXppbmd8fChlKHRoaXMpLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKSx0Ll9oYW5kbGVzLmhpZGUoKSl9KSksdGhpcy5fbW91c2VJbml0KCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fbW91c2VEZXN0cm95KCk7dmFyIHQ9ZnVuY3Rpb24odCl7ZSh0KS5yZW1vdmVDbGFzcygidWktcmVzaXphYmxlIHVpLXJlc2l6YWJsZS1kaXNhYmxlZCB1aS1yZXNpemFibGUtcmVzaXppbmciKS5yZW1vdmVEYXRhKCJyZXNpemFibGUiKS5yZW1vdmVEYXRhKCJ1aS1yZXNpemFibGUiKS51bmJpbmQoIi5yZXNpemFibGUiKS5maW5kKCIudWktcmVzaXphYmxlLWhhbmRsZSIpLnJlbW92ZSgpfTtpZih0aGlzLmVsZW1lbnRJc1dyYXBwZXIpe3QodGhpcy5lbGVtZW50KTt2YXIgbj10aGlzLmVsZW1lbnQ7dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHtwb3NpdGlvbjpuLmNzcygicG9zaXRpb24iKSx3aWR0aDpuLm91dGVyV2lkdGgoKSxoZWlnaHQ6bi5vdXRlckhlaWdodCgpLHRvcDpuLmNzcygidG9wIiksbGVmdDpuLmNzcygibGVmdCIpfSkuaW5zZXJ0QWZ0ZXIobiksbi5yZW1vdmUoKX1yZXR1cm4gdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiLHRoaXMub3JpZ2luYWxSZXNpemVTdHlsZSksdCh0aGlzLm9yaWdpbmFsRWxlbWVudCksdGhpc30sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbih0KXt2YXIgbj0hMTtmb3IodmFyIHIgaW4gdGhpcy5oYW5kbGVzKWUodGhpcy5oYW5kbGVzW3JdKVswXT09dC50YXJnZXQmJihuPSEwKTtyZXR1cm4hdGhpcy5vcHRpb25zLmRpc2FibGVkJiZufSxfbW91c2VTdGFydDpmdW5jdGlvbih0KXt2YXIgcj10aGlzLm9wdGlvbnMsaT10aGlzLmVsZW1lbnQucG9zaXRpb24oKSxzPXRoaXMuZWxlbWVudDt0aGlzLnJlc2l6aW5nPSEwLHRoaXMuZG9jdW1lbnRTY3JvbGw9e3RvcDplKGRvY3VtZW50KS5zY3JvbGxUb3AoKSxsZWZ0OmUoZG9jdW1lbnQpLnNjcm9sbExlZnQoKX0sKHMuaXMoIi51aS1kcmFnZ2FibGUiKXx8L2Fic29sdXRlLy50ZXN0KHMuY3NzKCJwb3NpdGlvbiIpKSkmJnMuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDppLnRvcCxsZWZ0OmkubGVmdH0pLHRoaXMuX3JlbmRlclByb3h5KCk7dmFyIG89bih0aGlzLmhlbHBlci5jc3MoImxlZnQiKSksdT1uKHRoaXMuaGVscGVyLmNzcygidG9wIikpO3IuY29udGFpbm1lbnQmJihvKz1lKHIuY29udGFpbm1lbnQpLnNjcm9sbExlZnQoKXx8MCx1Kz1lKHIuY29udGFpbm1lbnQpLnNjcm9sbFRvcCgpfHwwKSx0aGlzLm9mZnNldD10aGlzLmhlbHBlci5vZmZzZXQoKSx0aGlzLnBvc2l0aW9uPXtsZWZ0Om8sdG9wOnV9LHRoaXMuc2l6ZT10aGlzLl9oZWxwZXI/e3dpZHRoOnMub3V0ZXJXaWR0aCgpLGhlaWdodDpzLm91dGVySGVpZ2h0KCl9Ont3aWR0aDpzLndpZHRoKCksaGVpZ2h0OnMuaGVpZ2h0KCl9LHRoaXMub3JpZ2luYWxTaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6cy5vdXRlcldpZHRoKCksaGVpZ2h0OnMub3V0ZXJIZWlnaHQoKX06e3dpZHRoOnMud2lkdGgoKSxoZWlnaHQ6cy5oZWlnaHQoKX0sdGhpcy5vcmlnaW5hbFBvc2l0aW9uPXtsZWZ0Om8sdG9wOnV9LHRoaXMuc2l6ZURpZmY9e3dpZHRoOnMub3V0ZXJXaWR0aCgpLXMud2lkdGgoKSxoZWlnaHQ6cy5vdXRlckhlaWdodCgpLXMuaGVpZ2h0KCl9LHRoaXMub3JpZ2luYWxNb3VzZVBvc2l0aW9uPXtsZWZ0OnQucGFnZVgsdG9wOnQucGFnZVl9LHRoaXMuYXNwZWN0UmF0aW89dHlwZW9mIHIuYXNwZWN0UmF0aW89PSJudW1iZXIiP3IuYXNwZWN0UmF0aW86dGhpcy5vcmlnaW5hbFNpemUud2lkdGgvdGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0fHwxO3ZhciBhPWUoIi51aS1yZXNpemFibGUtIit0aGlzLmF4aXMpLmNzcygiY3Vyc29yIik7cmV0dXJuIGUoImJvZHkiKS5jc3MoImN1cnNvciIsYT09ImF1dG8iP3RoaXMuYXhpcysiLXJlc2l6ZSI6YSkscy5hZGRDbGFzcygidWktcmVzaXphYmxlLXJlc2l6aW5nIiksdGhpcy5fcHJvcGFnYXRlKCJzdGFydCIsdCksITB9LF9tb3VzZURyYWc6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5oZWxwZXIsbj10aGlzLm9wdGlvbnMscj17fSxpPXRoaXMscz10aGlzLm9yaWdpbmFsTW91c2VQb3NpdGlvbixvPXRoaXMuYXhpcyx1PWUucGFnZVgtcy5sZWZ0fHwwLGE9ZS5wYWdlWS1zLnRvcHx8MCxmPXRoaXMuX2NoYW5nZVtvXTtpZighZilyZXR1cm4hMTt2YXIgbD1mLmFwcGx5KHRoaXMsW2UsdSxhXSk7dGhpcy5fdXBkYXRlVmlydHVhbEJvdW5kYXJpZXMoZS5zaGlmdEtleSk7aWYodGhpcy5fYXNwZWN0UmF0aW98fGUuc2hpZnRLZXkpbD10aGlzLl91cGRhdGVSYXRpbyhsLGUpO3JldHVybiBsPXRoaXMuX3Jlc3BlY3RTaXplKGwsZSksdGhpcy5fcHJvcGFnYXRlKCJyZXNpemUiLGUpLHQuY3NzKHt0b3A6dGhpcy5wb3NpdGlvbi50b3ArInB4IixsZWZ0OnRoaXMucG9zaXRpb24ubGVmdCsicHgiLHdpZHRoOnRoaXMuc2l6ZS53aWR0aCsicHgiLGhlaWdodDp0aGlzLnNpemUuaGVpZ2h0KyJweCJ9KSwhdGhpcy5faGVscGVyJiZ0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLmxlbmd0aCYmdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKSx0aGlzLl91cGRhdGVDYWNoZShsKSx0aGlzLl90cmlnZ2VyKCJyZXNpemUiLGUsdGhpcy51aSgpKSwhMX0sX21vdXNlU3RvcDpmdW5jdGlvbih0KXt0aGlzLnJlc2l6aW5nPSExO3ZhciBuPXRoaXMub3B0aW9ucyxyPXRoaXM7aWYodGhpcy5faGVscGVyKXt2YXIgaT10aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLHM9aS5sZW5ndGgmJi90ZXh0YXJlYS9pLnRlc3QoaVswXS5ub2RlTmFtZSksbz1zJiZlLnVpLmhhc1Njcm9sbChpWzBdLCJsZWZ0Iik/MDpyLnNpemVEaWZmLmhlaWdodCx1PXM/MDpyLnNpemVEaWZmLndpZHRoLGE9e3dpZHRoOnIuaGVscGVyLndpZHRoKCktdSxoZWlnaHQ6ci5oZWxwZXIuaGVpZ2h0KCktb30sZj1wYXJzZUludChyLmVsZW1lbnQuY3NzKCJsZWZ0IiksMTApKyhyLnBvc2l0aW9uLmxlZnQtci5vcmlnaW5hbFBvc2l0aW9uLmxlZnQpfHxudWxsLGw9cGFyc2VJbnQoci5lbGVtZW50LmNzcygidG9wIiksMTApKyhyLnBvc2l0aW9uLnRvcC1yLm9yaWdpbmFsUG9zaXRpb24udG9wKXx8bnVsbDtuLmFuaW1hdGV8fHRoaXMuZWxlbWVudC5jc3MoZS5leHRlbmQoYSx7dG9wOmwsbGVmdDpmfSkpLHIuaGVscGVyLmhlaWdodChyLnNpemUuaGVpZ2h0KSxyLmhlbHBlci53aWR0aChyLnNpemUud2lkdGgpLHRoaXMuX2hlbHBlciYmIW4uYW5pbWF0ZSYmdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKX1yZXR1cm4gZSgiYm9keSIpLmNzcygiY3Vyc29yIiwiYXV0byIpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktcmVzaXphYmxlLXJlc2l6aW5nIiksdGhpcy5fcHJvcGFnYXRlKCJzdG9wIix0KSx0aGlzLl9oZWxwZXImJnRoaXMuaGVscGVyLnJlbW92ZSgpLCExfSxfdXBkYXRlVmlydHVhbEJvdW5kYXJpZXM6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5vcHRpb25zLG4saSxzLG8sdTt1PXttaW5XaWR0aDpyKHQubWluV2lkdGgpP3QubWluV2lkdGg6MCxtYXhXaWR0aDpyKHQubWF4V2lkdGgpP3QubWF4V2lkdGg6SW5maW5pdHksbWluSGVpZ2h0OnIodC5taW5IZWlnaHQpP3QubWluSGVpZ2h0OjAsbWF4SGVpZ2h0OnIodC5tYXhIZWlnaHQpP3QubWF4SGVpZ2h0OkluZmluaXR5fTtpZih0aGlzLl9hc3BlY3RSYXRpb3x8ZSluPXUubWluSGVpZ2h0KnRoaXMuYXNwZWN0UmF0aW8scz11Lm1pbldpZHRoL3RoaXMuYXNwZWN0UmF0aW8saT11Lm1heEhlaWdodCp0aGlzLmFzcGVjdFJhdGlvLG89dS5tYXhXaWR0aC90aGlzLmFzcGVjdFJhdGlvLG4+dS5taW5XaWR0aCYmKHUubWluV2lkdGg9bikscz51Lm1pbkhlaWdodCYmKHUubWluSGVpZ2h0PXMpLGk8dS5tYXhXaWR0aCYmKHUubWF4V2lkdGg9aSksbzx1Lm1heEhlaWdodCYmKHUubWF4SGVpZ2h0PW8pO3RoaXMuX3ZCb3VuZGFyaWVzPXV9LF91cGRhdGVDYWNoZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLm9wdGlvbnM7dGhpcy5vZmZzZXQ9dGhpcy5oZWxwZXIub2Zmc2V0KCkscihlLmxlZnQpJiYodGhpcy5wb3NpdGlvbi5sZWZ0PWUubGVmdCkscihlLnRvcCkmJih0aGlzLnBvc2l0aW9uLnRvcD1lLnRvcCkscihlLmhlaWdodCkmJih0aGlzLnNpemUuaGVpZ2h0PWUuaGVpZ2h0KSxyKGUud2lkdGgpJiYodGhpcy5zaXplLndpZHRoPWUud2lkdGgpfSxfdXBkYXRlUmF0aW86ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLm9wdGlvbnMsaT10aGlzLnBvc2l0aW9uLHM9dGhpcy5zaXplLG89dGhpcy5heGlzO3JldHVybiByKGUuaGVpZ2h0KT9lLndpZHRoPWUuaGVpZ2h0KnRoaXMuYXNwZWN0UmF0aW86cihlLndpZHRoKSYmKGUuaGVpZ2h0PWUud2lkdGgvdGhpcy5hc3BlY3RSYXRpbyksbz09InN3IiYmKGUubGVmdD1pLmxlZnQrKHMud2lkdGgtZS53aWR0aCksZS50b3A9bnVsbCksbz09Im53IiYmKGUudG9wPWkudG9wKyhzLmhlaWdodC1lLmhlaWdodCksZS5sZWZ0PWkubGVmdCsocy53aWR0aC1lLndpZHRoKSksZX0sX3Jlc3BlY3RTaXplOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5oZWxwZXIsaT10aGlzLl92Qm91bmRhcmllcyxzPXRoaXMuX2FzcGVjdFJhdGlvfHx0LnNoaWZ0S2V5LG89dGhpcy5heGlzLHU9cihlLndpZHRoKSYmaS5tYXhXaWR0aCYmaS5tYXhXaWR0aDxlLndpZHRoLGE9cihlLmhlaWdodCkmJmkubWF4SGVpZ2h0JiZpLm1heEhlaWdodDxlLmhlaWdodCxmPXIoZS53aWR0aCkmJmkubWluV2lkdGgmJmkubWluV2lkdGg+ZS53aWR0aCxsPXIoZS5oZWlnaHQpJiZpLm1pbkhlaWdodCYmaS5taW5IZWlnaHQ+ZS5oZWlnaHQ7ZiYmKGUud2lkdGg9aS5taW5XaWR0aCksbCYmKGUuaGVpZ2h0PWkubWluSGVpZ2h0KSx1JiYoZS53aWR0aD1pLm1heFdpZHRoKSxhJiYoZS5oZWlnaHQ9aS5tYXhIZWlnaHQpO3ZhciBjPXRoaXMub3JpZ2luYWxQb3NpdGlvbi5sZWZ0K3RoaXMub3JpZ2luYWxTaXplLndpZHRoLGg9dGhpcy5wb3NpdGlvbi50b3ArdGhpcy5zaXplLmhlaWdodCxwPS9zd3xud3x3Ly50ZXN0KG8pLGQ9L253fG5lfG4vLnRlc3Qobyk7ZiYmcCYmKGUubGVmdD1jLWkubWluV2lkdGgpLHUmJnAmJihlLmxlZnQ9Yy1pLm1heFdpZHRoKSxsJiZkJiYoZS50b3A9aC1pLm1pbkhlaWdodCksYSYmZCYmKGUudG9wPWgtaS5tYXhIZWlnaHQpO3ZhciB2PSFlLndpZHRoJiYhZS5oZWlnaHQ7cmV0dXJuIHYmJiFlLmxlZnQmJmUudG9wP2UudG9wPW51bGw6diYmIWUudG9wJiZlLmxlZnQmJihlLmxlZnQ9bnVsbCksZX0sX3Byb3BvcnRpb25hbGx5UmVzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zO2lmKCF0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLmxlbmd0aClyZXR1cm47dmFyIG49dGhpcy5oZWxwZXJ8fHRoaXMuZWxlbWVudDtmb3IodmFyIHI9MDtyPHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoO3IrKyl7dmFyIGk9dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50c1tyXTtpZighdGhpcy5ib3JkZXJEaWYpe3ZhciBzPVtpLmNzcygiYm9yZGVyVG9wV2lkdGgiKSxpLmNzcygiYm9yZGVyUmlnaHRXaWR0aCIpLGkuY3NzKCJib3JkZXJCb3R0b21XaWR0aCIpLGkuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKV0sbz1baS5jc3MoInBhZGRpbmdUb3AiKSxpLmNzcygicGFkZGluZ1JpZ2h0IiksaS5jc3MoInBhZGRpbmdCb3R0b20iKSxpLmNzcygicGFkZGluZ0xlZnQiKV07dGhpcy5ib3JkZXJEaWY9ZS5tYXAocyxmdW5jdGlvbihlLHQpe3ZhciBuPXBhcnNlSW50KGUsMTApfHwwLHI9cGFyc2VJbnQob1t0XSwxMCl8fDA7cmV0dXJuIG4rcn0pfWkuY3NzKHtoZWlnaHQ6bi5oZWlnaHQoKS10aGlzLmJvcmRlckRpZlswXS10aGlzLmJvcmRlckRpZlsyXXx8MCx3aWR0aDpuLndpZHRoKCktdGhpcy5ib3JkZXJEaWZbMV0tdGhpcy5ib3JkZXJEaWZbM118fDB9KX19LF9yZW5kZXJQcm94eTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWxlbWVudCxuPXRoaXMub3B0aW9uczt0aGlzLmVsZW1lbnRPZmZzZXQ9dC5vZmZzZXQoKTtpZih0aGlzLl9oZWxwZXIpe3RoaXMuaGVscGVyPXRoaXMuaGVscGVyfHxlKCc8ZGl2IHN0eWxlPSJvdmVyZmxvdzpoaWRkZW47Ij48L2Rpdj4nKTt2YXIgcj1lLnVpLmllNj8xOjAsaT1lLnVpLmllNj8yOi0xO3RoaXMuaGVscGVyLmFkZENsYXNzKHRoaXMuX2hlbHBlcikuY3NzKHt3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpK2ksaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpK2kscG9zaXRpb246ImFic29sdXRlIixsZWZ0OnRoaXMuZWxlbWVudE9mZnNldC5sZWZ0LXIrInB4Iix0b3A6dGhpcy5lbGVtZW50T2Zmc2V0LnRvcC1yKyJweCIsekluZGV4Oisrbi56SW5kZXh9KSx0aGlzLmhlbHBlci5hcHBlbmRUbygiYm9keSIpLmRpc2FibGVTZWxlY3Rpb24oKX1lbHNlIHRoaXMuaGVscGVyPXRoaXMuZWxlbWVudH0sX2NoYW5nZTp7ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJue3dpZHRoOnRoaXMub3JpZ2luYWxTaXplLndpZHRoK3R9fSx3OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLm9wdGlvbnMsaT10aGlzLm9yaWdpbmFsU2l6ZSxzPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57bGVmdDpzLmxlZnQrdCx3aWR0aDppLndpZHRoLXR9fSxuOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLm9wdGlvbnMsaT10aGlzLm9yaWdpbmFsU2l6ZSxzPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57dG9wOnMudG9wK24saGVpZ2h0OmkuaGVpZ2h0LW59fSxzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm57aGVpZ2h0OnRoaXMub3JpZ2luYWxTaXplLmhlaWdodCtufX0sc2U6ZnVuY3Rpb24odCxuLHIpe3JldHVybiBlLmV4dGVuZCh0aGlzLl9jaGFuZ2Uucy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLmUuYXBwbHkodGhpcyxbdCxuLHJdKSl9LHN3OmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gZS5leHRlbmQodGhpcy5fY2hhbmdlLnMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS53LmFwcGx5KHRoaXMsW3QsbixyXSkpfSxuZTpmdW5jdGlvbih0LG4scil7cmV0dXJuIGUuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2UuZS5hcHBseSh0aGlzLFt0LG4scl0pKX0sbnc6ZnVuY3Rpb24odCxuLHIpe3JldHVybiBlLmV4dGVuZCh0aGlzLl9jaGFuZ2Uubi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLncuYXBwbHkodGhpcyxbdCxuLHJdKSl9fSxfcHJvcGFnYXRlOmZ1bmN0aW9uKHQsbil7ZS51aS5wbHVnaW4uY2FsbCh0aGlzLHQsW24sdGhpcy51aSgpXSksdCE9InJlc2l6ZSImJnRoaXMuX3RyaWdnZXIodCxuLHRoaXMudWkoKSl9LHBsdWdpbnM6e30sdWk6ZnVuY3Rpb24oKXtyZXR1cm57b3JpZ2luYWxFbGVtZW50OnRoaXMub3JpZ2luYWxFbGVtZW50LGVsZW1lbnQ6dGhpcy5lbGVtZW50LGhlbHBlcjp0aGlzLmhlbHBlcixwb3NpdGlvbjp0aGlzLnBvc2l0aW9uLHNpemU6dGhpcy5zaXplLG9yaWdpbmFsU2l6ZTp0aGlzLm9yaWdpbmFsU2l6ZSxvcmlnaW5hbFBvc2l0aW9uOnRoaXMub3JpZ2luYWxQb3NpdGlvbn19fSksZS51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJhbHNvUmVzaXplIix7c3RhcnQ6ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGk9ci5vcHRpb25zLHM9ZnVuY3Rpb24odCl7ZSh0KS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTt0LmRhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIix7d2lkdGg6cGFyc2VJbnQodC53aWR0aCgpLDEwKSxoZWlnaHQ6cGFyc2VJbnQodC5oZWlnaHQoKSwxMCksbGVmdDpwYXJzZUludCh0LmNzcygibGVmdCIpLDEwKSx0b3A6cGFyc2VJbnQodC5jc3MoInRvcCIpLDEwKX0pfSl9O3R5cGVvZiBpLmFsc29SZXNpemU9PSJvYmplY3QiJiYhaS5hbHNvUmVzaXplLnBhcmVudE5vZGU/aS5hbHNvUmVzaXplLmxlbmd0aD8oaS5hbHNvUmVzaXplPWkuYWxzb1Jlc2l6ZVswXSxzKGkuYWxzb1Jlc2l6ZSkpOmUuZWFjaChpLmFsc29SZXNpemUsZnVuY3Rpb24oZSl7cyhlKX0pOnMoaS5hbHNvUmVzaXplKX0scmVzaXplOmZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxpPXIub3B0aW9ucyxzPXIub3JpZ2luYWxTaXplLG89ci5vcmlnaW5hbFBvc2l0aW9uLHU9e2hlaWdodDpyLnNpemUuaGVpZ2h0LXMuaGVpZ2h0fHwwLHdpZHRoOnIuc2l6ZS53aWR0aC1zLndpZHRofHwwLHRvcDpyLnBvc2l0aW9uLnRvcC1vLnRvcHx8MCxsZWZ0OnIucG9zaXRpb24ubGVmdC1vLmxlZnR8fDB9LGE9ZnVuY3Rpb24odCxyKXtlKHQpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLGk9ZSh0aGlzKS5kYXRhKCJyZXNpemFibGUtYWxzb3Jlc2l6ZSIpLHM9e30sbz1yJiZyLmxlbmd0aD9yOnQucGFyZW50cyhuLm9yaWdpbmFsRWxlbWVudFswXSkubGVuZ3RoP1sid2lkdGgiLCJoZWlnaHQiXTpbIndpZHRoIiwiaGVpZ2h0IiwidG9wIiwibGVmdCJdO2UuZWFjaChvLGZ1bmN0aW9uKGUsdCl7dmFyIG49KGlbdF18fDApKyh1W3RdfHwwKTtuJiZuPj0wJiYoc1t0XT1ufHxudWxsKX0pLHQuY3NzKHMpfSl9O3R5cGVvZiBpLmFsc29SZXNpemU9PSJvYmplY3QiJiYhaS5hbHNvUmVzaXplLm5vZGVUeXBlP2UuZWFjaChpLmFsc29SZXNpemUsZnVuY3Rpb24oZSx0KXthKGUsdCl9KTphKGkuYWxzb1Jlc2l6ZSl9LHN0b3A6ZnVuY3Rpb24odCxuKXtlKHRoaXMpLnJlbW92ZURhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIil9fSksZS51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJhbmltYXRlIix7c3RvcDpmdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksaT1yLm9wdGlvbnMscz1yLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLG89cy5sZW5ndGgmJi90ZXh0YXJlYS9pLnRlc3Qoc1swXS5ub2RlTmFtZSksdT1vJiZlLnVpLmhhc1Njcm9sbChzWzBdLCJsZWZ0Iik/MDpyLnNpemVEaWZmLmhlaWdodCxhPW8/MDpyLnNpemVEaWZmLndpZHRoLGY9e3dpZHRoOnIuc2l6ZS53aWR0aC1hLGhlaWdodDpyLnNpemUuaGVpZ2h0LXV9LGw9cGFyc2VJbnQoci5lbGVtZW50LmNzcygibGVmdCIpLDEwKSsoci5wb3NpdGlvbi5sZWZ0LXIub3JpZ2luYWxQb3NpdGlvbi5sZWZ0KXx8bnVsbCxjPXBhcnNlSW50KHIuZWxlbWVudC5jc3MoInRvcCIpLDEwKSsoci5wb3NpdGlvbi50b3Atci5vcmlnaW5hbFBvc2l0aW9uLnRvcCl8fG51bGw7ci5lbGVtZW50LmFuaW1hdGUoZS5leHRlbmQoZixjJiZsP3t0b3A6YyxsZWZ0Omx9Ont9KSx7ZHVyYXRpb246aS5hbmltYXRlRHVyYXRpb24sZWFzaW5nOmkuYW5pbWF0ZUVhc2luZyxzdGVwOmZ1bmN0aW9uKCl7dmFyIG49e3dpZHRoOnBhcnNlSW50KHIuZWxlbWVudC5jc3MoIndpZHRoIiksMTApLGhlaWdodDpwYXJzZUludChyLmVsZW1lbnQuY3NzKCJoZWlnaHQiKSwxMCksdG9wOnBhcnNlSW50KHIuZWxlbWVudC5jc3MoInRvcCIpLDEwKSxsZWZ0OnBhcnNlSW50KHIuZWxlbWVudC5jc3MoImxlZnQiKSwxMCl9O3MmJnMubGVuZ3RoJiZlKHNbMF0pLmNzcyh7d2lkdGg6bi53aWR0aCxoZWlnaHQ6bi5oZWlnaHR9KSxyLl91cGRhdGVDYWNoZShuKSxyLl9wcm9wYWdhdGUoInJlc2l6ZSIsdCl9fSl9fSksZS51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJjb250YWlubWVudCIse3N0YXJ0OmZ1bmN0aW9uKHQscil7dmFyIGk9ZSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxzPWkub3B0aW9ucyxvPWkuZWxlbWVudCx1PXMuY29udGFpbm1lbnQsYT11IGluc3RhbmNlb2YgZT91LmdldCgwKTovcGFyZW50Ly50ZXN0KHUpP28ucGFyZW50KCkuZ2V0KDApOnU7aWYoIWEpcmV0dXJuO2kuY29udGFpbmVyRWxlbWVudD1lKGEpO2lmKC9kb2N1bWVudC8udGVzdCh1KXx8dT09ZG9jdW1lbnQpaS5jb250YWluZXJPZmZzZXQ9e2xlZnQ6MCx0b3A6MH0saS5jb250YWluZXJQb3NpdGlvbj17bGVmdDowLHRvcDowfSxpLnBhcmVudERhdGE9e2VsZW1lbnQ6ZShkb2N1bWVudCksbGVmdDowLHRvcDowLHdpZHRoOmUoZG9jdW1lbnQpLndpZHRoKCksaGVpZ2h0OmUoZG9jdW1lbnQpLmhlaWdodCgpfHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0fTtlbHNle3ZhciBmPWUoYSksbD1bXTtlKFsiVG9wIiwiUmlnaHQiLCJMZWZ0IiwiQm90dG9tIl0pLmVhY2goZnVuY3Rpb24oZSx0KXtsW2VdPW4oZi5jc3MoInBhZGRpbmciK3QpKX0pLGkuY29udGFpbmVyT2Zmc2V0PWYub2Zmc2V0KCksaS5jb250YWluZXJQb3NpdGlvbj1mLnBvc2l0aW9uKCksaS5jb250YWluZXJTaXplPXtoZWlnaHQ6Zi5pbm5lckhlaWdodCgpLWxbM10sd2lkdGg6Zi5pbm5lcldpZHRoKCktbFsxXX07dmFyIGM9aS5jb250YWluZXJPZmZzZXQsaD1pLmNvbnRhaW5lclNpemUuaGVpZ2h0LHA9aS5jb250YWluZXJTaXplLndpZHRoLGQ9ZS51aS5oYXNTY3JvbGwoYSwibGVmdCIpP2Euc2Nyb2xsV2lkdGg6cCx2PWUudWkuaGFzU2Nyb2xsKGEpP2Euc2Nyb2xsSGVpZ2h0Omg7aS5wYXJlbnREYXRhPXtlbGVtZW50OmEsbGVmdDpjLmxlZnQsdG9wOmMudG9wLHdpZHRoOmQsaGVpZ2h0OnZ9fX0scmVzaXplOmZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxpPXIub3B0aW9ucyxzPXIuY29udGFpbmVyU2l6ZSxvPXIuY29udGFpbmVyT2Zmc2V0LHU9ci5zaXplLGE9ci5wb3NpdGlvbixmPXIuX2FzcGVjdFJhdGlvfHx0LnNoaWZ0S2V5LGw9e3RvcDowLGxlZnQ6MH0sYz1yLmNvbnRhaW5lckVsZW1lbnQ7Y1swXSE9ZG9jdW1lbnQmJi9zdGF0aWMvLnRlc3QoYy5jc3MoInBvc2l0aW9uIikpJiYobD1vKSxhLmxlZnQ8KHIuX2hlbHBlcj9vLmxlZnQ6MCkmJihyLnNpemUud2lkdGg9ci5zaXplLndpZHRoKyhyLl9oZWxwZXI/ci5wb3NpdGlvbi5sZWZ0LW8ubGVmdDpyLnBvc2l0aW9uLmxlZnQtbC5sZWZ0KSxmJiYoci5zaXplLmhlaWdodD1yLnNpemUud2lkdGgvci5hc3BlY3RSYXRpbyksci5wb3NpdGlvbi5sZWZ0PWkuaGVscGVyP28ubGVmdDowKSxhLnRvcDwoci5faGVscGVyP28udG9wOjApJiYoci5zaXplLmhlaWdodD1yLnNpemUuaGVpZ2h0KyhyLl9oZWxwZXI/ci5wb3NpdGlvbi50b3Atby50b3A6ci5wb3NpdGlvbi50b3ApLGYmJihyLnNpemUud2lkdGg9ci5zaXplLmhlaWdodCpyLmFzcGVjdFJhdGlvKSxyLnBvc2l0aW9uLnRvcD1yLl9oZWxwZXI/by50b3A6MCksci5vZmZzZXQubGVmdD1yLnBhcmVudERhdGEubGVmdCtyLnBvc2l0aW9uLmxlZnQsci5vZmZzZXQudG9wPXIucGFyZW50RGF0YS50b3Arci5wb3NpdGlvbi50b3A7dmFyIGg9TWF0aC5hYnMoKHIuX2hlbHBlcj9yLm9mZnNldC5sZWZ0LWwubGVmdDpyLm9mZnNldC5sZWZ0LWwubGVmdCkrci5zaXplRGlmZi53aWR0aCkscD1NYXRoLmFicygoci5faGVscGVyP3Iub2Zmc2V0LnRvcC1sLnRvcDpyLm9mZnNldC50b3Atby50b3ApK3Iuc2l6ZURpZmYuaGVpZ2h0KSxkPXIuY29udGFpbmVyRWxlbWVudC5nZXQoMCk9PXIuZWxlbWVudC5wYXJlbnQoKS5nZXQoMCksdj0vcmVsYXRpdmV8YWJzb2x1dGUvLnRlc3Qoci5jb250YWluZXJFbGVtZW50LmNzcygicG9zaXRpb24iKSk7ZCYmdiYmKGgtPXIucGFyZW50RGF0YS5sZWZ0KSxoK3Iuc2l6ZS53aWR0aD49ci5wYXJlbnREYXRhLndpZHRoJiYoci5zaXplLndpZHRoPXIucGFyZW50RGF0YS53aWR0aC1oLGYmJihyLnNpemUuaGVpZ2h0PXIuc2l6ZS53aWR0aC9yLmFzcGVjdFJhdGlvKSkscCtyLnNpemUuaGVpZ2h0Pj1yLnBhcmVudERhdGEuaGVpZ2h0JiYoci5zaXplLmhlaWdodD1yLnBhcmVudERhdGEuaGVpZ2h0LXAsZiYmKHIuc2l6ZS53aWR0aD1yLnNpemUuaGVpZ2h0KnIuYXNwZWN0UmF0aW8pKX0sc3RvcDpmdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksaT1yLm9wdGlvbnMscz1yLnBvc2l0aW9uLG89ci5jb250YWluZXJPZmZzZXQsdT1yLmNvbnRhaW5lclBvc2l0aW9uLGE9ci5jb250YWluZXJFbGVtZW50LGY9ZShyLmhlbHBlciksbD1mLm9mZnNldCgpLGM9Zi5vdXRlcldpZHRoKCktci5zaXplRGlmZi53aWR0aCxoPWYub3V0ZXJIZWlnaHQoKS1yLnNpemVEaWZmLmhlaWdodDtyLl9oZWxwZXImJiFpLmFuaW1hdGUmJi9yZWxhdGl2ZS8udGVzdChhLmNzcygicG9zaXRpb24iKSkmJmUodGhpcykuY3NzKHtsZWZ0OmwubGVmdC11LmxlZnQtby5sZWZ0LHdpZHRoOmMsaGVpZ2h0Omh9KSxyLl9oZWxwZXImJiFpLmFuaW1hdGUmJi9zdGF0aWMvLnRlc3QoYS5jc3MoInBvc2l0aW9uIikpJiZlKHRoaXMpLmNzcyh7bGVmdDpsLmxlZnQtdS5sZWZ0LW8ubGVmdCx3aWR0aDpjLGhlaWdodDpofSl9fSksZS51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJnaG9zdCIse3N0YXJ0OmZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxpPXIub3B0aW9ucyxzPXIuc2l6ZTtyLmdob3N0PXIub3JpZ2luYWxFbGVtZW50LmNsb25lKCksci5naG9zdC5jc3Moe29wYWNpdHk6LjI1LGRpc3BsYXk6ImJsb2NrIixwb3NpdGlvbjoicmVsYXRpdmUiLGhlaWdodDpzLmhlaWdodCx3aWR0aDpzLndpZHRoLG1hcmdpbjowLGxlZnQ6MCx0b3A6MH0pLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtZ2hvc3QiKS5hZGRDbGFzcyh0eXBlb2YgaS5naG9zdD09InN0cmluZyI/aS5naG9zdDoiIiksci5naG9zdC5hcHBlbmRUbyhyLmhlbHBlcil9LHJlc2l6ZTpmdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksaT1yLm9wdGlvbnM7ci5naG9zdCYmci5naG9zdC5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OnIuc2l6ZS5oZWlnaHQsd2lkdGg6ci5zaXplLndpZHRofSl9LHN0b3A6ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGk9ci5vcHRpb25zO3IuZ2hvc3QmJnIuaGVscGVyJiZyLmhlbHBlci5nZXQoMCkucmVtb3ZlQ2hpbGQoci5naG9zdC5nZXQoMCkpfX0pLGUudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiZ3JpZCIse3Jlc2l6ZTpmdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksaT1yLm9wdGlvbnMscz1yLnNpemUsbz1yLm9yaWdpbmFsU2l6ZSx1PXIub3JpZ2luYWxQb3NpdGlvbixhPXIuYXhpcyxmPWkuX2FzcGVjdFJhdGlvfHx0LnNoaWZ0S2V5O2kuZ3JpZD10eXBlb2YgaS5ncmlkPT0ibnVtYmVyIj9baS5ncmlkLGkuZ3JpZF06aS5ncmlkO3ZhciBsPU1hdGgucm91bmQoKHMud2lkdGgtby53aWR0aCkvKGkuZ3JpZFswXXx8MSkpKihpLmdyaWRbMF18fDEpLGM9TWF0aC5yb3VuZCgocy5oZWlnaHQtby5oZWlnaHQpLyhpLmdyaWRbMV18fDEpKSooaS5ncmlkWzFdfHwxKTsvXihzZXxzfGUpJC8udGVzdChhKT8oci5zaXplLndpZHRoPW8ud2lkdGgrbCxyLnNpemUuaGVpZ2h0PW8uaGVpZ2h0K2MpOi9eKG5lKSQvLnRlc3QoYSk/KHIuc2l6ZS53aWR0aD1vLndpZHRoK2wsci5zaXplLmhlaWdodD1vLmhlaWdodCtjLHIucG9zaXRpb24udG9wPXUudG9wLWMpOi9eKHN3KSQvLnRlc3QoYSk/KHIuc2l6ZS53aWR0aD1vLndpZHRoK2wsci5zaXplLmhlaWdodD1vLmhlaWdodCtjLHIucG9zaXRpb24ubGVmdD11LmxlZnQtbCk6KHIuc2l6ZS53aWR0aD1vLndpZHRoK2wsci5zaXplLmhlaWdodD1vLmhlaWdodCtjLHIucG9zaXRpb24udG9wPXUudG9wLWMsci5wb3NpdGlvbi5sZWZ0PXUubGVmdC1sKX19KTt2YXIgbj1mdW5jdGlvbihlKXtyZXR1cm4gcGFyc2VJbnQoZSwxMCl8fDB9LHI9ZnVuY3Rpb24oZSl7cmV0dXJuIWlzTmFOKHBhcnNlSW50KGUsMTApKX19KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe2Uud2lkZ2V0KCJ1aS5zZWxlY3RhYmxlIixlLnVpLm1vdXNlLHt2ZXJzaW9uOiIxLjkuMiIsb3B0aW9uczp7YXBwZW5kVG86ImJvZHkiLGF1dG9SZWZyZXNoOiEwLGRpc3RhbmNlOjAsZmlsdGVyOiIqIix0b2xlcmFuY2U6InRvdWNoIn0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RhYmxlIiksdGhpcy5kcmFnZ2VkPSExO3ZhciBuO3RoaXMucmVmcmVzaD1mdW5jdGlvbigpe249ZSh0Lm9wdGlvbnMuZmlsdGVyLHQuZWxlbWVudFswXSksbi5hZGRDbGFzcygidWktc2VsZWN0ZWUiKSxuLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLG49dC5vZmZzZXQoKTtlLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIix7ZWxlbWVudDp0aGlzLCRlbGVtZW50OnQsbGVmdDpuLmxlZnQsdG9wOm4udG9wLHJpZ2h0Om4ubGVmdCt0Lm91dGVyV2lkdGgoKSxib3R0b206bi50b3ArdC5vdXRlckhlaWdodCgpLHN0YXJ0c2VsZWN0ZWQ6ITEsc2VsZWN0ZWQ6dC5oYXNDbGFzcygidWktc2VsZWN0ZWQiKSxzZWxlY3Rpbmc6dC5oYXNDbGFzcygidWktc2VsZWN0aW5nIiksdW5zZWxlY3Rpbmc6dC5oYXNDbGFzcygidWktdW5zZWxlY3RpbmciKX0pfSl9LHRoaXMucmVmcmVzaCgpLHRoaXMuc2VsZWN0ZWVzPW4uYWRkQ2xhc3MoInVpLXNlbGVjdGVlIiksdGhpcy5fbW91c2VJbml0KCksdGhpcy5oZWxwZXI9ZSgiPGRpdiBjbGFzcz0ndWktc2VsZWN0YWJsZS1oZWxwZXInPjwvZGl2PiIpfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWVzLnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZSIpLnJlbW92ZURhdGEoInNlbGVjdGFibGUtaXRlbSIpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0YWJsZSB1aS1zZWxlY3RhYmxlLWRpc2FibGVkIiksdGhpcy5fbW91c2VEZXN0cm95KCl9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXM7dGhpcy5vcG9zPVt0LnBhZ2VYLHQucGFnZVldO2lmKHRoaXMub3B0aW9ucy5kaXNhYmxlZClyZXR1cm47dmFyIHI9dGhpcy5vcHRpb25zO3RoaXMuc2VsZWN0ZWVzPWUoci5maWx0ZXIsdGhpcy5lbGVtZW50WzBdKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsdCksZShyLmFwcGVuZFRvKS5hcHBlbmQodGhpcy5oZWxwZXIpLHRoaXMuaGVscGVyLmNzcyh7bGVmdDp0LmNsaWVudFgsdG9wOnQuY2xpZW50WSx3aWR0aDowLGhlaWdodDowfSksci5hdXRvUmVmcmVzaCYmdGhpcy5yZWZyZXNoKCksdGhpcy5zZWxlY3RlZXMuZmlsdGVyKCIudWktc2VsZWN0ZWQiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHI9ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO3Iuc3RhcnRzZWxlY3RlZD0hMCwhdC5tZXRhS2V5JiYhdC5jdHJsS2V5JiYoci4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKSxyLnNlbGVjdGVkPSExLHIuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIiksci51bnNlbGVjdGluZz0hMCxuLl90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsdCx7dW5zZWxlY3Rpbmc6ci5lbGVtZW50fSkpfSksZSh0LnRhcmdldCkucGFyZW50cygpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHI9ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO2lmKHIpe3ZhciBpPSF0Lm1ldGFLZXkmJiF0LmN0cmxLZXl8fCFyLiRlbGVtZW50Lmhhc0NsYXNzKCJ1aS1zZWxlY3RlZCIpO3JldHVybiByLiRlbGVtZW50LnJlbW92ZUNsYXNzKGk/InVpLXVuc2VsZWN0aW5nIjoidWktc2VsZWN0ZWQiKS5hZGRDbGFzcyhpPyJ1aS1zZWxlY3RpbmciOiJ1aS11bnNlbGVjdGluZyIpLHIudW5zZWxlY3Rpbmc9IWksci5zZWxlY3Rpbmc9aSxyLnNlbGVjdGVkPWksaT9uLl90cmlnZ2VyKCJzZWxlY3RpbmciLHQse3NlbGVjdGluZzpyLmVsZW1lbnR9KTpuLl90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsdCx7dW5zZWxlY3Rpbmc6ci5lbGVtZW50fSksITF9fSl9LF9tb3VzZURyYWc6ZnVuY3Rpb24odCl7dmFyIG49dGhpczt0aGlzLmRyYWdnZWQ9ITA7aWYodGhpcy5vcHRpb25zLmRpc2FibGVkKXJldHVybjt2YXIgcj10aGlzLm9wdGlvbnMsaT10aGlzLm9wb3NbMF0scz10aGlzLm9wb3NbMV0sbz10LnBhZ2VYLHU9dC5wYWdlWTtpZihpPm8pe3ZhciBhPW87bz1pLGk9YX1pZihzPnUpe3ZhciBhPXU7dT1zLHM9YX1yZXR1cm4gdGhpcy5oZWxwZXIuY3NzKHtsZWZ0OmksdG9wOnMsd2lkdGg6by1pLGhlaWdodDp1LXN9KSx0aGlzLnNlbGVjdGVlcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGE9ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO2lmKCFhfHxhLmVsZW1lbnQ9PW4uZWxlbWVudFswXSlyZXR1cm47dmFyIGY9ITE7ci50b2xlcmFuY2U9PSJ0b3VjaCI/Zj0hKGEubGVmdD5vfHxhLnJpZ2h0PGl8fGEudG9wPnV8fGEuYm90dG9tPHMpOnIudG9sZXJhbmNlPT0iZml0IiYmKGY9YS5sZWZ0PmkmJmEucmlnaHQ8byYmYS50b3A+cyYmYS5ib3R0b208dSksZj8oYS5zZWxlY3RlZCYmKGEuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGVkIiksYS5zZWxlY3RlZD0hMSksYS51bnNlbGVjdGluZyYmKGEuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXVuc2VsZWN0aW5nIiksYS51bnNlbGVjdGluZz0hMSksYS5zZWxlY3Rpbmd8fChhLiRlbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RpbmciKSxhLnNlbGVjdGluZz0hMCxuLl90cmlnZ2VyKCJzZWxlY3RpbmciLHQse3NlbGVjdGluZzphLmVsZW1lbnR9KSkpOihhLnNlbGVjdGluZyYmKCh0Lm1ldGFLZXl8fHQuY3RybEtleSkmJmEuc3RhcnRzZWxlY3RlZD8oYS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0aW5nIiksYS5zZWxlY3Rpbmc9ITEsYS4kZWxlbWVudC5hZGRDbGFzcygidWktc2VsZWN0ZWQiKSxhLnNlbGVjdGVkPSEwKTooYS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0aW5nIiksYS5zZWxlY3Rpbmc9ITEsYS5zdGFydHNlbGVjdGVkJiYoYS4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKSxhLnVuc2VsZWN0aW5nPSEwKSxuLl90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsdCx7dW5zZWxlY3Rpbmc6YS5lbGVtZW50fSkpKSxhLnNlbGVjdGVkJiYhdC5tZXRhS2V5JiYhdC5jdHJsS2V5JiYhYS5zdGFydHNlbGVjdGVkJiYoYS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKSxhLnNlbGVjdGVkPSExLGEuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIiksYS51bnNlbGVjdGluZz0hMCxuLl90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsdCx7dW5zZWxlY3Rpbmc6YS5lbGVtZW50fSkpKX0pLCExfSxfbW91c2VTdG9wOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXM7dGhpcy5kcmFnZ2VkPSExO3ZhciByPXRoaXMub3B0aW9ucztyZXR1cm4gZSgiLnVpLXVuc2VsZWN0aW5nIix0aGlzLmVsZW1lbnRbMF0pLmVhY2goZnVuY3Rpb24oKXt2YXIgcj1lLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7ci4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktdW5zZWxlY3RpbmciKSxyLnVuc2VsZWN0aW5nPSExLHIuc3RhcnRzZWxlY3RlZD0hMSxuLl90cmlnZ2VyKCJ1bnNlbGVjdGVkIix0LHt1bnNlbGVjdGVkOnIuZWxlbWVudH0pfSksZSgiLnVpLXNlbGVjdGluZyIsdGhpcy5lbGVtZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHI9ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO3IuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGluZyIpLmFkZENsYXNzKCJ1aS1zZWxlY3RlZCIpLHIuc2VsZWN0aW5nPSExLHIuc2VsZWN0ZWQ9ITAsci5zdGFydHNlbGVjdGVkPSEwLG4uX3RyaWdnZXIoInNlbGVjdGVkIix0LHtzZWxlY3RlZDpyLmVsZW1lbnR9KX0pLHRoaXMuX3RyaWdnZXIoInN0b3AiLHQpLHRoaXMuaGVscGVyLnJlbW92ZSgpLCExfX0pfSkoalF1ZXJ5KTsoZnVuY3Rpb24oZSx0KXt2YXIgbj01O2Uud2lkZ2V0KCJ1aS5zbGlkZXIiLGUudWkubW91c2Use3ZlcnNpb246IjEuOS4yIix3aWRnZXRFdmVudFByZWZpeDoic2xpZGUiLG9wdGlvbnM6e2FuaW1hdGU6ITEsZGlzdGFuY2U6MCxtYXg6MTAwLG1pbjowLG9yaWVudGF0aW9uOiJob3Jpem9udGFsIixyYW5nZTohMSxzdGVwOjEsdmFsdWU6MCx2YWx1ZXM6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciB0LHIsaT10aGlzLm9wdGlvbnMscz10aGlzLmVsZW1lbnQuZmluZCgiLnVpLXNsaWRlci1oYW5kbGUiKS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIiksbz0iPGEgY2xhc3M9J3VpLXNsaWRlci1oYW5kbGUgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsJyBocmVmPScjJz48L2E+Iix1PVtdO3RoaXMuX2tleVNsaWRpbmc9ITEsdGhpcy5fbW91c2VTbGlkaW5nPSExLHRoaXMuX2FuaW1hdGVPZmY9ITAsdGhpcy5faGFuZGxlSW5kZXg9bnVsbCx0aGlzLl9kZXRlY3RPcmllbnRhdGlvbigpLHRoaXMuX21vdXNlSW5pdCgpLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc2xpZGVyIHVpLXNsaWRlci0iK3RoaXMub3JpZW50YXRpb24rIiB1aS13aWRnZXQiKyIgdWktd2lkZ2V0LWNvbnRlbnQiKyIgdWktY29ybmVyLWFsbCIrKGkuZGlzYWJsZWQ/IiB1aS1zbGlkZXItZGlzYWJsZWQgdWktZGlzYWJsZWQiOiIiKSksdGhpcy5yYW5nZT1lKFtdKSxpLnJhbmdlJiYoaS5yYW5nZT09PSEwJiYoaS52YWx1ZXN8fChpLnZhbHVlcz1bdGhpcy5fdmFsdWVNaW4oKSx0aGlzLl92YWx1ZU1pbigpXSksaS52YWx1ZXMubGVuZ3RoJiZpLnZhbHVlcy5sZW5ndGghPT0yJiYoaS52YWx1ZXM9W2kudmFsdWVzWzBdLGkudmFsdWVzWzBdXSkpLHRoaXMucmFuZ2U9ZSgiPGRpdj48L2Rpdj4iKS5hcHBlbmRUbyh0aGlzLmVsZW1lbnQpLmFkZENsYXNzKCJ1aS1zbGlkZXItcmFuZ2UgdWktd2lkZ2V0LWhlYWRlciIrKGkucmFuZ2U9PT0ibWluInx8aS5yYW5nZT09PSJtYXgiPyIgdWktc2xpZGVyLXJhbmdlLSIraS5yYW5nZToiIikpKSxyPWkudmFsdWVzJiZpLnZhbHVlcy5sZW5ndGh8fDE7Zm9yKHQ9cy5sZW5ndGg7dDxyO3QrKyl1LnB1c2gobyk7dGhpcy5oYW5kbGVzPXMuYWRkKGUodS5qb2luKCIiKSkuYXBwZW5kVG8odGhpcy5lbGVtZW50KSksdGhpcy5oYW5kbGU9dGhpcy5oYW5kbGVzLmVxKDApLHRoaXMuaGFuZGxlcy5hZGQodGhpcy5yYW5nZSkuZmlsdGVyKCJhIikuY2xpY2soZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpfSkubW91c2VlbnRlcihmdW5jdGlvbigpe2kuZGlzYWJsZWR8fGUodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9KS5tb3VzZWxlYXZlKGZ1bmN0aW9uKCl7ZSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKX0pLmZvY3VzKGZ1bmN0aW9uKCl7aS5kaXNhYmxlZD9lKHRoaXMpLmJsdXIoKTooZSgiLnVpLXNsaWRlciAudWktc3RhdGUtZm9jdXMiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKSxlKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpKX0pLmJsdXIoZnVuY3Rpb24oKXtlKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSksdGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24odCl7ZSh0aGlzKS5kYXRhKCJ1aS1zbGlkZXItaGFuZGxlLWluZGV4Iix0KX0pLHRoaXMuX29uKHRoaXMuaGFuZGxlcyx7a2V5ZG93bjpmdW5jdGlvbih0KXt2YXIgcixpLHMsbyx1PWUodC50YXJnZXQpLmRhdGEoInVpLXNsaWRlci1oYW5kbGUtaW5kZXgiKTtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIGUudWkua2V5Q29kZS5IT01FOmNhc2UgZS51aS5rZXlDb2RlLkVORDpjYXNlIGUudWkua2V5Q29kZS5QQUdFX1VQOmNhc2UgZS51aS5rZXlDb2RlLlBBR0VfRE9XTjpjYXNlIGUudWkua2V5Q29kZS5VUDpjYXNlIGUudWkua2V5Q29kZS5SSUdIVDpjYXNlIGUudWkua2V5Q29kZS5ET1dOOmNhc2UgZS51aS5rZXlDb2RlLkxFRlQ6dC5wcmV2ZW50RGVmYXVsdCgpO2lmKCF0aGlzLl9rZXlTbGlkaW5nKXt0aGlzLl9rZXlTbGlkaW5nPSEwLGUodC50YXJnZXQpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSxyPXRoaXMuX3N0YXJ0KHQsdSk7aWYocj09PSExKXJldHVybn19bz10aGlzLm9wdGlvbnMuc3RlcCx0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD9pPXM9dGhpcy52YWx1ZXModSk6aT1zPXRoaXMudmFsdWUoKTtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIGUudWkua2V5Q29kZS5IT01FOnM9dGhpcy5fdmFsdWVNaW4oKTticmVhaztjYXNlIGUudWkua2V5Q29kZS5FTkQ6cz10aGlzLl92YWx1ZU1heCgpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlBBR0VfVVA6cz10aGlzLl90cmltQWxpZ25WYWx1ZShpKyh0aGlzLl92YWx1ZU1heCgpLXRoaXMuX3ZhbHVlTWluKCkpL24pO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlBBR0VfRE9XTjpzPXRoaXMuX3RyaW1BbGlnblZhbHVlKGktKHRoaXMuX3ZhbHVlTWF4KCktdGhpcy5fdmFsdWVNaW4oKSkvbik7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuVVA6Y2FzZSBlLnVpLmtleUNvZGUuUklHSFQ6aWYoaT09PXRoaXMuX3ZhbHVlTWF4KCkpcmV0dXJuO3M9dGhpcy5fdHJpbUFsaWduVmFsdWUoaStvKTticmVhaztjYXNlIGUudWkua2V5Q29kZS5ET1dOOmNhc2UgZS51aS5rZXlDb2RlLkxFRlQ6aWYoaT09PXRoaXMuX3ZhbHVlTWluKCkpcmV0dXJuO3M9dGhpcy5fdHJpbUFsaWduVmFsdWUoaS1vKX10aGlzLl9zbGlkZSh0LHUscyl9LGtleXVwOmZ1bmN0aW9uKHQpe3ZhciBuPWUodC50YXJnZXQpLmRhdGEoInVpLXNsaWRlci1oYW5kbGUtaW5kZXgiKTt0aGlzLl9rZXlTbGlkaW5nJiYodGhpcy5fa2V5U2xpZGluZz0hMSx0aGlzLl9zdG9wKHQsbiksdGhpcy5fY2hhbmdlKHQsbiksZSh0LnRhcmdldCkucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpKX19KSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9hbmltYXRlT2ZmPSExfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuaGFuZGxlcy5yZW1vdmUoKSx0aGlzLnJhbmdlLnJlbW92ZSgpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2xpZGVyIHVpLXNsaWRlci1ob3Jpem9udGFsIHVpLXNsaWRlci12ZXJ0aWNhbCB1aS1zbGlkZXItZGlzYWJsZWQgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKSx0aGlzLl9tb3VzZURlc3Ryb3koKX0sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbih0KXt2YXIgbixyLGkscyxvLHUsYSxmLGw9dGhpcyxjPXRoaXMub3B0aW9ucztyZXR1cm4gYy5kaXNhYmxlZD8hMToodGhpcy5lbGVtZW50U2l6ZT17d2lkdGg6dGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCl9LHRoaXMuZWxlbWVudE9mZnNldD10aGlzLmVsZW1lbnQub2Zmc2V0KCksbj17eDp0LnBhZ2VYLHk6dC5wYWdlWX0scj10aGlzLl9ub3JtVmFsdWVGcm9tTW91c2UobiksaT10aGlzLl92YWx1ZU1heCgpLXRoaXMuX3ZhbHVlTWluKCkrMSx0aGlzLmhhbmRsZXMuZWFjaChmdW5jdGlvbih0KXt2YXIgbj1NYXRoLmFicyhyLWwudmFsdWVzKHQpKTtpPm4mJihpPW4scz1lKHRoaXMpLG89dCl9KSxjLnJhbmdlPT09ITAmJnRoaXMudmFsdWVzKDEpPT09Yy5taW4mJihvKz0xLHM9ZSh0aGlzLmhhbmRsZXNbb10pKSx1PXRoaXMuX3N0YXJ0KHQsbyksdT09PSExPyExOih0aGlzLl9tb3VzZVNsaWRpbmc9ITAsdGhpcy5faGFuZGxlSW5kZXg9byxzLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5mb2N1cygpLGE9cy5vZmZzZXQoKSxmPSFlKHQudGFyZ2V0KS5wYXJlbnRzKCkuYW5kU2VsZigpLmlzKCIudWktc2xpZGVyLWhhbmRsZSIpLHRoaXMuX2NsaWNrT2Zmc2V0PWY/e2xlZnQ6MCx0b3A6MH06e2xlZnQ6dC5wYWdlWC1hLmxlZnQtcy53aWR0aCgpLzIsdG9wOnQucGFnZVktYS50b3Atcy5oZWlnaHQoKS8yLShwYXJzZUludChzLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLShwYXJzZUludChzLmNzcygiYm9yZGVyQm90dG9tV2lkdGgiKSwxMCl8fDApKyhwYXJzZUludChzLmNzcygibWFyZ2luVG9wIiksMTApfHwwKX0sdGhpcy5oYW5kbGVzLmhhc0NsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfHx0aGlzLl9zbGlkZSh0LG8sciksdGhpcy5fYW5pbWF0ZU9mZj0hMCwhMCkpfSxfbW91c2VTdGFydDpmdW5jdGlvbigpe3JldHVybiEwfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGUpe3ZhciB0PXt4OmUucGFnZVgseTplLnBhZ2VZfSxuPXRoaXMuX25vcm1WYWx1ZUZyb21Nb3VzZSh0KTtyZXR1cm4gdGhpcy5fc2xpZGUoZSx0aGlzLl9oYW5kbGVJbmRleCxuKSwhMX0sX21vdXNlU3RvcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5oYW5kbGVzLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLl9tb3VzZVNsaWRpbmc9ITEsdGhpcy5fc3RvcChlLHRoaXMuX2hhbmRsZUluZGV4KSx0aGlzLl9jaGFuZ2UoZSx0aGlzLl9oYW5kbGVJbmRleCksdGhpcy5faGFuZGxlSW5kZXg9bnVsbCx0aGlzLl9jbGlja09mZnNldD1udWxsLHRoaXMuX2FuaW1hdGVPZmY9ITEsITF9LF9kZXRlY3RPcmllbnRhdGlvbjpmdW5jdGlvbigpe3RoaXMub3JpZW50YXRpb249dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uPT09InZlcnRpY2FsIj8idmVydGljYWwiOiJob3Jpem9udGFsIn0sX25vcm1WYWx1ZUZyb21Nb3VzZTpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxzO3JldHVybiB0aGlzLm9yaWVudGF0aW9uPT09Imhvcml6b250YWwiPyh0PXRoaXMuZWxlbWVudFNpemUud2lkdGgsbj1lLngtdGhpcy5lbGVtZW50T2Zmc2V0LmxlZnQtKHRoaXMuX2NsaWNrT2Zmc2V0P3RoaXMuX2NsaWNrT2Zmc2V0LmxlZnQ6MCkpOih0PXRoaXMuZWxlbWVudFNpemUuaGVpZ2h0LG49ZS55LXRoaXMuZWxlbWVudE9mZnNldC50b3AtKHRoaXMuX2NsaWNrT2Zmc2V0P3RoaXMuX2NsaWNrT2Zmc2V0LnRvcDowKSkscj1uL3Qscj4xJiYocj0xKSxyPDAmJihyPTApLHRoaXMub3JpZW50YXRpb249PT0idmVydGljYWwiJiYocj0xLXIpLGk9dGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpLHM9dGhpcy5fdmFsdWVNaW4oKStyKmksdGhpcy5fdHJpbUFsaWduVmFsdWUocyl9LF9zdGFydDpmdW5jdGlvbihlLHQpe3ZhciBuPXtoYW5kbGU6dGhpcy5oYW5kbGVzW3RdLHZhbHVlOnRoaXMudmFsdWUoKX07cmV0dXJuIHRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoJiYobi52YWx1ZT10aGlzLnZhbHVlcyh0KSxuLnZhbHVlcz10aGlzLnZhbHVlcygpKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsZSxuKX0sX3NsaWRlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLHM7dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg/KHI9dGhpcy52YWx1ZXModD8wOjEpLHRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoPT09MiYmdGhpcy5vcHRpb25zLnJhbmdlPT09ITAmJih0PT09MCYmbj5yfHx0PT09MSYmbjxyKSYmKG49ciksbiE9PXRoaXMudmFsdWVzKHQpJiYoaT10aGlzLnZhbHVlcygpLGlbdF09bixzPXRoaXMuX3RyaWdnZXIoInNsaWRlIixlLHtoYW5kbGU6dGhpcy5oYW5kbGVzW3RdLHZhbHVlOm4sdmFsdWVzOml9KSxyPXRoaXMudmFsdWVzKHQ/MDoxKSxzIT09ITEmJnRoaXMudmFsdWVzKHQsbiwhMCkpKTpuIT09dGhpcy52YWx1ZSgpJiYocz10aGlzLl90cmlnZ2VyKCJzbGlkZSIsZSx7aGFuZGxlOnRoaXMuaGFuZGxlc1t0XSx2YWx1ZTpufSkscyE9PSExJiZ0aGlzLnZhbHVlKG4pKX0sX3N0b3A6ZnVuY3Rpb24oZSx0KXt2YXIgbj17aGFuZGxlOnRoaXMuaGFuZGxlc1t0XSx2YWx1ZTp0aGlzLnZhbHVlKCl9O3RoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoJiYobi52YWx1ZT10aGlzLnZhbHVlcyh0KSxuLnZhbHVlcz10aGlzLnZhbHVlcygpKSx0aGlzLl90cmlnZ2VyKCJzdG9wIixlLG4pfSxfY2hhbmdlOmZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuX2tleVNsaWRpbmcmJiF0aGlzLl9tb3VzZVNsaWRpbmcpe3ZhciBuPXtoYW5kbGU6dGhpcy5oYW5kbGVzW3RdLHZhbHVlOnRoaXMudmFsdWUoKX07dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgmJihuLnZhbHVlPXRoaXMudmFsdWVzKHQpLG4udmFsdWVzPXRoaXMudmFsdWVzKCkpLHRoaXMuX3RyaWdnZXIoImNoYW5nZSIsZSxuKX19LHZhbHVlOmZ1bmN0aW9uKGUpe2lmKGFyZ3VtZW50cy5sZW5ndGgpe3RoaXMub3B0aW9ucy52YWx1ZT10aGlzLl90cmltQWxpZ25WYWx1ZShlKSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCwwKTtyZXR1cm59cmV0dXJuIHRoaXMuX3ZhbHVlKCl9LHZhbHVlczpmdW5jdGlvbih0LG4pe3ZhciByLGkscztpZihhcmd1bWVudHMubGVuZ3RoPjEpe3RoaXMub3B0aW9ucy52YWx1ZXNbdF09dGhpcy5fdHJpbUFsaWduVmFsdWUobiksdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5fY2hhbmdlKG51bGwsdCk7cmV0dXJufWlmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl92YWx1ZXMoKTtpZighZS5pc0FycmF5KGFyZ3VtZW50c1swXSkpcmV0dXJuIHRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoP3RoaXMuX3ZhbHVlcyh0KTp0aGlzLnZhbHVlKCk7cj10aGlzLm9wdGlvbnMudmFsdWVzLGk9YXJndW1lbnRzWzBdO2ZvcihzPTA7czxyLmxlbmd0aDtzKz0xKXJbc109dGhpcy5fdHJpbUFsaWduVmFsdWUoaVtzXSksdGhpcy5fY2hhbmdlKG51bGwscyk7dGhpcy5fcmVmcmVzaFZhbHVlKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24odCxuKXt2YXIgcixpPTA7ZS5pc0FycmF5KHRoaXMub3B0aW9ucy52YWx1ZXMpJiYoaT10aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCksZS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpO3N3aXRjaCh0KXtjYXNlImRpc2FibGVkIjpuPyh0aGlzLmhhbmRsZXMuZmlsdGVyKCIudWktc3RhdGUtZm9jdXMiKS5ibHVyKCksdGhpcy5oYW5kbGVzLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLHRoaXMuaGFuZGxlcy5wcm9wKCJkaXNhYmxlZCIsITApLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZGlzYWJsZWQiKSk6KHRoaXMuaGFuZGxlcy5wcm9wKCJkaXNhYmxlZCIsITEpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktZGlzYWJsZWQiKSk7YnJlYWs7Y2FzZSJvcmllbnRhdGlvbiI6dGhpcy5fZGV0ZWN0T3JpZW50YXRpb24oKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNsaWRlci1ob3Jpem9udGFsIHVpLXNsaWRlci12ZXJ0aWNhbCIpLmFkZENsYXNzKCJ1aS1zbGlkZXItIit0aGlzLm9yaWVudGF0aW9uKSx0aGlzLl9yZWZyZXNoVmFsdWUoKTticmVhaztjYXNlInZhbHVlIjp0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHRoaXMuX2NoYW5nZShudWxsLDApLHRoaXMuX2FuaW1hdGVPZmY9ITE7YnJlYWs7Y2FzZSJ2YWx1ZXMiOnRoaXMuX2FuaW1hdGVPZmY9ITAsdGhpcy5fcmVmcmVzaFZhbHVlKCk7Zm9yKHI9MDtyPGk7cis9MSl0aGlzLl9jaGFuZ2UobnVsbCxyKTt0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2UibWluIjpjYXNlIm1heCI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9hbmltYXRlT2ZmPSExfX0sX3ZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zLnZhbHVlO3JldHVybiBlPXRoaXMuX3RyaW1BbGlnblZhbHVlKGUpLGV9LF92YWx1ZXM6ZnVuY3Rpb24oZSl7dmFyIHQsbixyO2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQ9dGhpcy5vcHRpb25zLnZhbHVlc1tlXSx0PXRoaXMuX3RyaW1BbGlnblZhbHVlKHQpLHQ7bj10aGlzLm9wdGlvbnMudmFsdWVzLnNsaWNlKCk7Zm9yKHI9MDtyPG4ubGVuZ3RoO3IrPTEpbltyXT10aGlzLl90cmltQWxpZ25WYWx1ZShuW3JdKTtyZXR1cm4gbn0sX3RyaW1BbGlnblZhbHVlOmZ1bmN0aW9uKGUpe2lmKGU8PXRoaXMuX3ZhbHVlTWluKCkpcmV0dXJuIHRoaXMuX3ZhbHVlTWluKCk7aWYoZT49dGhpcy5fdmFsdWVNYXgoKSlyZXR1cm4gdGhpcy5fdmFsdWVNYXgoKTt2YXIgdD10aGlzLm9wdGlvbnMuc3RlcD4wP3RoaXMub3B0aW9ucy5zdGVwOjEsbj0oZS10aGlzLl92YWx1ZU1pbigpKSV0LHI9ZS1uO3JldHVybiBNYXRoLmFicyhuKSoyPj10JiYocis9bj4wP3Q6LXQpLHBhcnNlRmxvYXQoci50b0ZpeGVkKDUpKX0sX3ZhbHVlTWluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5taW59LF92YWx1ZU1heDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMubWF4fSxfcmVmcmVzaFZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsbixyLGkscyxvPXRoaXMub3B0aW9ucy5yYW5nZSx1PXRoaXMub3B0aW9ucyxhPXRoaXMsZj10aGlzLl9hbmltYXRlT2ZmPyExOnUuYW5pbWF0ZSxsPXt9O3RoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoP3RoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKHIpe249KGEudmFsdWVzKHIpLWEuX3ZhbHVlTWluKCkpLyhhLl92YWx1ZU1heCgpLWEuX3ZhbHVlTWluKCkpKjEwMCxsW2Eub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI/ImxlZnQiOiJib3R0b20iXT1uKyIlIixlKHRoaXMpLnN0b3AoMSwxKVtmPyJhbmltYXRlIjoiY3NzIl0obCx1LmFuaW1hdGUpLGEub3B0aW9ucy5yYW5nZT09PSEwJiYoYS5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIj8ocj09PTAmJmEucmFuZ2Uuc3RvcCgxLDEpW2Y/ImFuaW1hdGUiOiJjc3MiXSh7bGVmdDpuKyIlIn0sdS5hbmltYXRlKSxyPT09MSYmYS5yYW5nZVtmPyJhbmltYXRlIjoiY3NzIl0oe3dpZHRoOm4tdCsiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjp1LmFuaW1hdGV9KSk6KHI9PT0wJiZhLnJhbmdlLnN0b3AoMSwxKVtmPyJhbmltYXRlIjoiY3NzIl0oe2JvdHRvbTpuKyIlIn0sdS5hbmltYXRlKSxyPT09MSYmYS5yYW5nZVtmPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDpuLXQrIiUifSx7cXVldWU6ITEsZHVyYXRpb246dS5hbmltYXRlfSkpKSx0PW59KToocj10aGlzLnZhbHVlKCksaT10aGlzLl92YWx1ZU1pbigpLHM9dGhpcy5fdmFsdWVNYXgoKSxuPXMhPT1pPyhyLWkpLyhzLWkpKjEwMDowLGxbdGhpcy5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIj8ibGVmdCI6ImJvdHRvbSJdPW4rIiUiLHRoaXMuaGFuZGxlLnN0b3AoMSwxKVtmPyJhbmltYXRlIjoiY3NzIl0obCx1LmFuaW1hdGUpLG89PT0ibWluIiYmdGhpcy5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbZj8iYW5pbWF0ZSI6ImNzcyJdKHt3aWR0aDpuKyIlIn0sdS5hbmltYXRlKSxvPT09Im1heCImJnRoaXMub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCImJnRoaXMucmFuZ2VbZj8iYW5pbWF0ZSI6ImNzcyJdKHt3aWR0aDoxMDAtbisiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjp1LmFuaW1hdGV9KSxvPT09Im1pbiImJnRoaXMub3JpZW50YXRpb249PT0idmVydGljYWwiJiZ0aGlzLnJhbmdlLnN0b3AoMSwxKVtmPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDpuKyIlIn0sdS5hbmltYXRlKSxvPT09Im1heCImJnRoaXMub3JpZW50YXRpb249PT0idmVydGljYWwiJiZ0aGlzLnJhbmdlW2Y/ImFuaW1hdGUiOiJjc3MiXSh7aGVpZ2h0OjEwMC1uKyIlIn0se3F1ZXVlOiExLGR1cmF0aW9uOnUuYW5pbWF0ZX0pKX19KX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7ZS53aWRnZXQoInVpLnNvcnRhYmxlIixlLnVpLm1vdXNlLHt2ZXJzaW9uOiIxLjkuMiIsd2lkZ2V0RXZlbnRQcmVmaXg6InNvcnQiLHJlYWR5OiExLG9wdGlvbnM6e2FwcGVuZFRvOiJwYXJlbnQiLGF4aXM6ITEsY29ubmVjdFdpdGg6ITEsY29udGFpbm1lbnQ6ITEsY3Vyc29yOiJhdXRvIixjdXJzb3JBdDohMSxkcm9wT25FbXB0eTohMCxmb3JjZVBsYWNlaG9sZGVyU2l6ZTohMSxmb3JjZUhlbHBlclNpemU6ITEsZ3JpZDohMSxoYW5kbGU6ITEsaGVscGVyOiJvcmlnaW5hbCIsaXRlbXM6Ij4gKiIsb3BhY2l0eTohMSxwbGFjZWhvbGRlcjohMSxyZXZlcnQ6ITEsc2Nyb2xsOiEwLHNjcm9sbFNlbnNpdGl2aXR5OjIwLHNjcm9sbFNwZWVkOjIwLHNjb3BlOiJkZWZhdWx0Iix0b2xlcmFuY2U6ImludGVyc2VjdCIsekluZGV4OjFlM30sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9uczt0aGlzLmNvbnRhaW5lckNhY2hlPXt9LHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc29ydGFibGUiKSx0aGlzLnJlZnJlc2goKSx0aGlzLmZsb2F0aW5nPXRoaXMuaXRlbXMubGVuZ3RoP2UuYXhpcz09PSJ4Inx8L2xlZnR8cmlnaHQvLnRlc3QodGhpcy5pdGVtc1swXS5pdGVtLmNzcygiZmxvYXQiKSl8fC9pbmxpbmV8dGFibGUtY2VsbC8udGVzdCh0aGlzLml0ZW1zWzBdLml0ZW0uY3NzKCJkaXNwbGF5IikpOiExLHRoaXMub2Zmc2V0PXRoaXMuZWxlbWVudC5vZmZzZXQoKSx0aGlzLl9tb3VzZUluaXQoKSx0aGlzLnJlYWR5PSEwfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktc29ydGFibGUgdWktc29ydGFibGUtZGlzYWJsZWQiKSx0aGlzLl9tb3VzZURlc3Ryb3koKTtmb3IodmFyIGU9dGhpcy5pdGVtcy5sZW5ndGgtMTtlPj0wO2UtLSl0aGlzLml0ZW1zW2VdLml0ZW0ucmVtb3ZlRGF0YSh0aGlzLndpZGdldE5hbWUrIi1pdGVtIik7cmV0dXJuIHRoaXN9LF9zZXRPcHRpb246ZnVuY3Rpb24odCxuKXt0PT09ImRpc2FibGVkIj8odGhpcy5vcHRpb25zW3RdPW4sdGhpcy53aWRnZXQoKS50b2dnbGVDbGFzcygidWktc29ydGFibGUtZGlzYWJsZWQiLCEhbikpOmUuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbih0LG4pe3ZhciByPXRoaXM7aWYodGhpcy5yZXZlcnRpbmcpcmV0dXJuITE7aWYodGhpcy5vcHRpb25zLmRpc2FibGVkfHx0aGlzLm9wdGlvbnMudHlwZT09InN0YXRpYyIpcmV0dXJuITE7dGhpcy5fcmVmcmVzaEl0ZW1zKHQpO3ZhciBpPW51bGwscz1lKHQudGFyZ2V0KS5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpe2lmKGUuZGF0YSh0aGlzLHIud2lkZ2V0TmFtZSsiLWl0ZW0iKT09cilyZXR1cm4gaT1lKHRoaXMpLCExfSk7ZS5kYXRhKHQudGFyZ2V0LHIud2lkZ2V0TmFtZSsiLWl0ZW0iKT09ciYmKGk9ZSh0LnRhcmdldCkpO2lmKCFpKXJldHVybiExO2lmKHRoaXMub3B0aW9ucy5oYW5kbGUmJiFuKXt2YXIgbz0hMTtlKHRoaXMub3B0aW9ucy5oYW5kbGUsaSkuZmluZCgiKiIpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcz09dC50YXJnZXQmJihvPSEwKX0pO2lmKCFvKXJldHVybiExfXJldHVybiB0aGlzLmN1cnJlbnRJdGVtPWksdGhpcy5fcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXMoKSwhMH0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24odCxuLHIpe3ZhciBpPXRoaXMub3B0aW9uczt0aGlzLmN1cnJlbnRDb250YWluZXI9dGhpcyx0aGlzLnJlZnJlc2hQb3NpdGlvbnMoKSx0aGlzLmhlbHBlcj10aGlzLl9jcmVhdGVIZWxwZXIodCksdGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpLHRoaXMuX2NhY2hlTWFyZ2lucygpLHRoaXMuc2Nyb2xsUGFyZW50PXRoaXMuaGVscGVyLnNjcm9sbFBhcmVudCgpLHRoaXMub2Zmc2V0PXRoaXMuY3VycmVudEl0ZW0ub2Zmc2V0KCksdGhpcy5vZmZzZXQ9e3RvcDp0aGlzLm9mZnNldC50b3AtdGhpcy5tYXJnaW5zLnRvcCxsZWZ0OnRoaXMub2Zmc2V0LmxlZnQtdGhpcy5tYXJnaW5zLmxlZnR9LGUuZXh0ZW5kKHRoaXMub2Zmc2V0LHtjbGljazp7bGVmdDp0LnBhZ2VYLXRoaXMub2Zmc2V0LmxlZnQsdG9wOnQucGFnZVktdGhpcy5vZmZzZXQudG9wfSxwYXJlbnQ6dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkscmVsYXRpdmU6dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKX0pLHRoaXMuaGVscGVyLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpLHRoaXMuY3NzUG9zaXRpb249dGhpcy5oZWxwZXIuY3NzKCJwb3NpdGlvbiIpLHRoaXMub3JpZ2luYWxQb3NpdGlvbj10aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKHQpLHRoaXMub3JpZ2luYWxQYWdlWD10LnBhZ2VYLHRoaXMub3JpZ2luYWxQYWdlWT10LnBhZ2VZLGkuY3Vyc29yQXQmJnRoaXMuX2FkanVzdE9mZnNldEZyb21IZWxwZXIoaS5jdXJzb3JBdCksdGhpcy5kb21Qb3NpdGlvbj17cHJldjp0aGlzLmN1cnJlbnRJdGVtLnByZXYoKVswXSxwYXJlbnQ6dGhpcy5jdXJyZW50SXRlbS5wYXJlbnQoKVswXX0sdGhpcy5oZWxwZXJbMF0hPXRoaXMuY3VycmVudEl0ZW1bMF0mJnRoaXMuY3VycmVudEl0ZW0uaGlkZSgpLHRoaXMuX2NyZWF0ZVBsYWNlaG9sZGVyKCksaS5jb250YWlubWVudCYmdGhpcy5fc2V0Q29udGFpbm1lbnQoKSxpLmN1cnNvciYmKGUoImJvZHkiKS5jc3MoImN1cnNvciIpJiYodGhpcy5fc3RvcmVkQ3Vyc29yPWUoImJvZHkiKS5jc3MoImN1cnNvciIpKSxlKCJib2R5IikuY3NzKCJjdXJzb3IiLGkuY3Vyc29yKSksaS5vcGFjaXR5JiYodGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5IikmJih0aGlzLl9zdG9yZWRPcGFjaXR5PXRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIpKSx0aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiLGkub3BhY2l0eSkpLGkuekluZGV4JiYodGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiKSYmKHRoaXMuX3N0b3JlZFpJbmRleD10aGlzLmhlbHBlci5jc3MoInpJbmRleCIpKSx0aGlzLmhlbHBlci5jc3MoInpJbmRleCIsaS56SW5kZXgpKSx0aGlzLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJnRoaXMuc2Nyb2xsUGFyZW50WzBdLnRhZ05hbWUhPSJIVE1MIiYmKHRoaXMub3ZlcmZsb3dPZmZzZXQ9dGhpcy5zY3JvbGxQYXJlbnQub2Zmc2V0KCkpLHRoaXMuX3RyaWdnZXIoInN0YXJ0Iix0LHRoaXMuX3VpSGFzaCgpKSx0aGlzLl9wcmVzZXJ2ZUhlbHBlclByb3BvcnRpb25zfHx0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCk7aWYoIXIpZm9yKHZhciBzPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtzPj0wO3MtLSl0aGlzLmNvbnRhaW5lcnNbc10uX3RyaWdnZXIoImFjdGl2YXRlIix0LHRoaXMuX3VpSGFzaCh0aGlzKSk7cmV0dXJuIGUudWkuZGRtYW5hZ2VyJiYoZS51aS5kZG1hbmFnZXIuY3VycmVudD10aGlzKSxlLnVpLmRkbWFuYWdlciYmIWkuZHJvcEJlaGF2aW91ciYmZS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyx0KSx0aGlzLmRyYWdnaW5nPSEwLHRoaXMuaGVscGVyLmFkZENsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKSx0aGlzLl9tb3VzZURyYWcodCksITB9LF9tb3VzZURyYWc6ZnVuY3Rpb24odCl7dGhpcy5wb3NpdGlvbj10aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKHQpLHRoaXMucG9zaXRpb25BYnM9dGhpcy5fY29udmVydFBvc2l0aW9uVG8oImFic29sdXRlIiksdGhpcy5sYXN0UG9zaXRpb25BYnN8fCh0aGlzLmxhc3RQb3NpdGlvbkFicz10aGlzLnBvc2l0aW9uQWJzKTtpZih0aGlzLm9wdGlvbnMuc2Nyb2xsKXt2YXIgbj10aGlzLm9wdGlvbnMscj0hMTt0aGlzLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJnRoaXMuc2Nyb2xsUGFyZW50WzBdLnRhZ05hbWUhPSJIVE1MIj8odGhpcy5vdmVyZmxvd09mZnNldC50b3ArdGhpcy5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0SGVpZ2h0LXQucGFnZVk8bi5zY3JvbGxTZW5zaXRpdml0eT90aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3A9cj10aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3Arbi5zY3JvbGxTcGVlZDp0LnBhZ2VZLXRoaXMub3ZlcmZsb3dPZmZzZXQudG9wPG4uc2Nyb2xsU2Vuc2l0aXZpdHkmJih0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3A9cj10aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3Atbi5zY3JvbGxTcGVlZCksdGhpcy5vdmVyZmxvd09mZnNldC5sZWZ0K3RoaXMuc2Nyb2xsUGFyZW50WzBdLm9mZnNldFdpZHRoLXQucGFnZVg8bi5zY3JvbGxTZW5zaXRpdml0eT90aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0PXI9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdCtuLnNjcm9sbFNwZWVkOnQucGFnZVgtdGhpcy5vdmVyZmxvd09mZnNldC5sZWZ0PG4uc2Nyb2xsU2Vuc2l0aXZpdHkmJih0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0PXI9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdC1uLnNjcm9sbFNwZWVkKSk6KHQucGFnZVktZShkb2N1bWVudCkuc2Nyb2xsVG9wKCk8bi5zY3JvbGxTZW5zaXRpdml0eT9yPWUoZG9jdW1lbnQpLnNjcm9sbFRvcChlKGRvY3VtZW50KS5zY3JvbGxUb3AoKS1uLnNjcm9sbFNwZWVkKTplKHdpbmRvdykuaGVpZ2h0KCktKHQucGFnZVktZShkb2N1bWVudCkuc2Nyb2xsVG9wKCkpPG4uc2Nyb2xsU2Vuc2l0aXZpdHkmJihyPWUoZG9jdW1lbnQpLnNjcm9sbFRvcChlKGRvY3VtZW50KS5zY3JvbGxUb3AoKStuLnNjcm9sbFNwZWVkKSksdC5wYWdlWC1lKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCk8bi5zY3JvbGxTZW5zaXRpdml0eT9yPWUoZG9jdW1lbnQpLnNjcm9sbExlZnQoZShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpLW4uc2Nyb2xsU3BlZWQpOmUod2luZG93KS53aWR0aCgpLSh0LnBhZ2VYLWUoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSk8bi5zY3JvbGxTZW5zaXRpdml0eSYmKHI9ZShkb2N1bWVudCkuc2Nyb2xsTGVmdChlKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkrbi5zY3JvbGxTcGVlZCkpKSxyIT09ITEmJmUudWkuZGRtYW5hZ2VyJiYhbi5kcm9wQmVoYXZpb3VyJiZlLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0aGlzLHQpfXRoaXMucG9zaXRpb25BYnM9dGhpcy5fY29udmVydFBvc2l0aW9uVG8oImFic29sdXRlIik7aWYoIXRoaXMub3B0aW9ucy5heGlzfHx0aGlzLm9wdGlvbnMuYXhpcyE9InkiKXRoaXMuaGVscGVyWzBdLnN0eWxlLmxlZnQ9dGhpcy5wb3NpdGlvbi5sZWZ0KyJweCI7aWYoIXRoaXMub3B0aW9ucy5heGlzfHx0aGlzLm9wdGlvbnMuYXhpcyE9IngiKXRoaXMuaGVscGVyWzBdLnN0eWxlLnRvcD10aGlzLnBvc2l0aW9uLnRvcCsicHgiO2Zvcih2YXIgaT10aGlzLml0ZW1zLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgcz10aGlzLml0ZW1zW2ldLG89cy5pdGVtWzBdLHU9dGhpcy5faW50ZXJzZWN0c1dpdGhQb2ludGVyKHMpO2lmKCF1KWNvbnRpbnVlO2lmKHMuaW5zdGFuY2UhPT10aGlzLmN1cnJlbnRDb250YWluZXIpY29udGludWU7aWYobyE9dGhpcy5jdXJyZW50SXRlbVswXSYmdGhpcy5wbGFjZWhvbGRlclt1PT0xPyJuZXh0IjoicHJldiJdKClbMF0hPW8mJiFlLmNvbnRhaW5zKHRoaXMucGxhY2Vob2xkZXJbMF0sbykmJih0aGlzLm9wdGlvbnMudHlwZT09InNlbWktZHluYW1pYyI/IWUuY29udGFpbnModGhpcy5lbGVtZW50WzBdLG8pOiEwKSl7dGhpcy5kaXJlY3Rpb249dT09MT8iZG93biI6InVwIjtpZih0aGlzLm9wdGlvbnMudG9sZXJhbmNlIT0icG9pbnRlciImJiF0aGlzLl9pbnRlcnNlY3RzV2l0aFNpZGVzKHMpKWJyZWFrO3RoaXMuX3JlYXJyYW5nZSh0LHMpLHRoaXMuX3RyaWdnZXIoImNoYW5nZSIsdCx0aGlzLl91aUhhc2goKSk7YnJlYWt9fXJldHVybiB0aGlzLl9jb250YWN0Q29udGFpbmVycyh0KSxlLnVpLmRkbWFuYWdlciYmZS51aS5kZG1hbmFnZXIuZHJhZyh0aGlzLHQpLHRoaXMuX3RyaWdnZXIoInNvcnQiLHQsdGhpcy5fdWlIYXNoKCkpLHRoaXMubGFzdFBvc2l0aW9uQWJzPXRoaXMucG9zaXRpb25BYnMsITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24odCxuKXtpZighdClyZXR1cm47ZS51aS5kZG1hbmFnZXImJiF0aGlzLm9wdGlvbnMuZHJvcEJlaGF2aW91ciYmZS51aS5kZG1hbmFnZXIuZHJvcCh0aGlzLHQpO2lmKHRoaXMub3B0aW9ucy5yZXZlcnQpe3ZhciByPXRoaXMsaT10aGlzLnBsYWNlaG9sZGVyLm9mZnNldCgpO3RoaXMucmV2ZXJ0aW5nPSEwLGUodGhpcy5oZWxwZXIpLmFuaW1hdGUoe2xlZnQ6aS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0Kyh0aGlzLm9mZnNldFBhcmVudFswXT09ZG9jdW1lbnQuYm9keT8wOnRoaXMub2Zmc2V0UGFyZW50WzBdLnNjcm9sbExlZnQpLHRvcDppLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLXRoaXMubWFyZ2lucy50b3ArKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5PzA6dGhpcy5vZmZzZXRQYXJlbnRbMF0uc2Nyb2xsVG9wKX0scGFyc2VJbnQodGhpcy5vcHRpb25zLnJldmVydCwxMCl8fDUwMCxmdW5jdGlvbigpe3IuX2NsZWFyKHQpfSl9ZWxzZSB0aGlzLl9jbGVhcih0LG4pO3JldHVybiExfSxjYW5jZWw6ZnVuY3Rpb24oKXtpZih0aGlzLmRyYWdnaW5nKXt0aGlzLl9tb3VzZVVwKHt0YXJnZXQ6bnVsbH0pLHRoaXMub3B0aW9ucy5oZWxwZXI9PSJvcmlnaW5hbCI/dGhpcy5jdXJyZW50SXRlbS5jc3ModGhpcy5fc3RvcmVkQ1NTKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGVscGVyIik6dGhpcy5jdXJyZW50SXRlbS5zaG93KCk7Zm9yKHZhciB0PXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTt0Pj0wO3QtLSl0aGlzLmNvbnRhaW5lcnNbdF0uX3RyaWdnZXIoImRlYWN0aXZhdGUiLG51bGwsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbdF0uY29udGFpbmVyQ2FjaGUub3ZlciYmKHRoaXMuY29udGFpbmVyc1t0XS5fdHJpZ2dlcigib3V0IixudWxsLHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW3RdLmNvbnRhaW5lckNhY2hlLm92ZXI9MCl9cmV0dXJuIHRoaXMucGxhY2Vob2xkZXImJih0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUmJnRoaXMucGxhY2Vob2xkZXJbMF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBsYWNlaG9sZGVyWzBdKSx0aGlzLm9wdGlvbnMuaGVscGVyIT0ib3JpZ2luYWwiJiZ0aGlzLmhlbHBlciYmdGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSYmdGhpcy5oZWxwZXIucmVtb3ZlKCksZS5leHRlbmQodGhpcyx7aGVscGVyOm51bGwsZHJhZ2dpbmc6ITEscmV2ZXJ0aW5nOiExLF9ub0ZpbmFsU29ydDpudWxsfSksdGhpcy5kb21Qb3NpdGlvbi5wcmV2P2UodGhpcy5kb21Qb3NpdGlvbi5wcmV2KS5hZnRlcih0aGlzLmN1cnJlbnRJdGVtKTplKHRoaXMuZG9tUG9zaXRpb24ucGFyZW50KS5wcmVwZW5kKHRoaXMuY3VycmVudEl0ZW0pKSx0aGlzfSxzZXJpYWxpemU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fZ2V0SXRlbXNBc2pRdWVyeSh0JiZ0LmNvbm5lY3RlZCkscj1bXTtyZXR1cm4gdD10fHx7fSxlKG4pLmVhY2goZnVuY3Rpb24oKXt2YXIgbj0oZSh0Lml0ZW18fHRoaXMpLmF0dHIodC5hdHRyaWJ1dGV8fCJpZCIpfHwiIikubWF0Y2godC5leHByZXNzaW9ufHwvKC4rKVstPV9dKC4rKS8pO24mJnIucHVzaCgodC5rZXl8fG5bMV0rIltdIikrIj0iKyh0LmtleSYmdC5leHByZXNzaW9uP25bMV06blsyXSkpfSksIXIubGVuZ3RoJiZ0LmtleSYmci5wdXNoKHQua2V5KyI9Iiksci5qb2luKCImIil9LHRvQXJyYXk6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fZ2V0SXRlbXNBc2pRdWVyeSh0JiZ0LmNvbm5lY3RlZCkscj1bXTtyZXR1cm4gdD10fHx7fSxuLmVhY2goZnVuY3Rpb24oKXtyLnB1c2goZSh0Lml0ZW18fHRoaXMpLmF0dHIodC5hdHRyaWJ1dGV8fCJpZCIpfHwiIil9KSxyfSxfaW50ZXJzZWN0c1dpdGg6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wb3NpdGlvbkFicy5sZWZ0LG49dCt0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLHI9dGhpcy5wb3NpdGlvbkFicy50b3AsaT1yK3RoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LHM9ZS5sZWZ0LG89cytlLndpZHRoLHU9ZS50b3AsYT11K2UuaGVpZ2h0LGY9dGhpcy5vZmZzZXQuY2xpY2sudG9wLGw9dGhpcy5vZmZzZXQuY2xpY2subGVmdCxjPXIrZj51JiZyK2Y8YSYmdCtsPnMmJnQrbDxvO3JldHVybiB0aGlzLm9wdGlvbnMudG9sZXJhbmNlPT0icG9pbnRlciJ8fHRoaXMub3B0aW9ucy5mb3JjZVBvaW50ZXJGb3JDb250YWluZXJzfHx0aGlzLm9wdGlvbnMudG9sZXJhbmNlIT0icG9pbnRlciImJnRoaXMuaGVscGVyUHJvcG9ydGlvbnNbdGhpcy5mbG9hdGluZz8id2lkdGgiOiJoZWlnaHQiXT5lW3RoaXMuZmxvYXRpbmc/IndpZHRoIjoiaGVpZ2h0Il0/YzpzPHQrdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC8yJiZuLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMjxvJiZ1PHIrdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMiYmaS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yPGF9LF9pbnRlcnNlY3RzV2l0aFBvaW50ZXI6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5vcHRpb25zLmF4aXM9PT0ieCJ8fGUudWkuaXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLnRvcCt0aGlzLm9mZnNldC5jbGljay50b3AsdC50b3AsdC5oZWlnaHQpLHI9dGhpcy5vcHRpb25zLmF4aXM9PT0ieSJ8fGUudWkuaXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLmxlZnQrdGhpcy5vZmZzZXQuY2xpY2subGVmdCx0LmxlZnQsdC53aWR0aCksaT1uJiZyLHM9dGhpcy5fZ2V0RHJhZ1ZlcnRpY2FsRGlyZWN0aW9uKCksbz10aGlzLl9nZXREcmFnSG9yaXpvbnRhbERpcmVjdGlvbigpO3JldHVybiBpP3RoaXMuZmxvYXRpbmc/byYmbz09InJpZ2h0Inx8cz09ImRvd24iPzI6MTpzJiYocz09ImRvd24iPzI6MSk6ITF9LF9pbnRlcnNlY3RzV2l0aFNpZGVzOmZ1bmN0aW9uKHQpe3ZhciBuPWUudWkuaXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLnRvcCt0aGlzLm9mZnNldC5jbGljay50b3AsdC50b3ArdC5oZWlnaHQvMix0LmhlaWdodCkscj1lLnVpLmlzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy5sZWZ0K3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQsdC5sZWZ0K3Qud2lkdGgvMix0LndpZHRoKSxpPXRoaXMuX2dldERyYWdWZXJ0aWNhbERpcmVjdGlvbigpLHM9dGhpcy5fZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb24oKTtyZXR1cm4gdGhpcy5mbG9hdGluZyYmcz9zPT0icmlnaHQiJiZyfHxzPT0ibGVmdCImJiFyOmkmJihpPT0iZG93biImJm58fGk9PSJ1cCImJiFuKX0sX2dldERyYWdWZXJ0aWNhbERpcmVjdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMucG9zaXRpb25BYnMudG9wLXRoaXMubGFzdFBvc2l0aW9uQWJzLnRvcDtyZXR1cm4gZSE9MCYmKGU+MD8iZG93biI6InVwIil9LF9nZXREcmFnSG9yaXpvbnRhbERpcmVjdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMucG9zaXRpb25BYnMubGVmdC10aGlzLmxhc3RQb3NpdGlvbkFicy5sZWZ0O3JldHVybiBlIT0wJiYoZT4wPyJyaWdodCI6ImxlZnQiKX0scmVmcmVzaDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcmVmcmVzaEl0ZW1zKGUpLHRoaXMucmVmcmVzaFBvc2l0aW9ucygpLHRoaXN9LF9jb25uZWN0V2l0aDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucztyZXR1cm4gZS5jb25uZWN0V2l0aC5jb25zdHJ1Y3Rvcj09U3RyaW5nP1tlLmNvbm5lY3RXaXRoXTplLmNvbm5lY3RXaXRofSxfZ2V0SXRlbXNBc2pRdWVyeTpmdW5jdGlvbih0KXt2YXIgbj1bXSxyPVtdLGk9dGhpcy5fY29ubmVjdFdpdGgoKTtpZihpJiZ0KWZvcih2YXIgcz1pLmxlbmd0aC0xO3M+PTA7cy0tKXt2YXIgbz1lKGlbc10pO2Zvcih2YXIgdT1vLmxlbmd0aC0xO3U+PTA7dS0tKXt2YXIgYT1lLmRhdGEob1t1XSx0aGlzLndpZGdldE5hbWUpO2EmJmEhPXRoaXMmJiFhLm9wdGlvbnMuZGlzYWJsZWQmJnIucHVzaChbZS5pc0Z1bmN0aW9uKGEub3B0aW9ucy5pdGVtcyk/YS5vcHRpb25zLml0ZW1zLmNhbGwoYS5lbGVtZW50KTplKGEub3B0aW9ucy5pdGVtcyxhLmVsZW1lbnQpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpLm5vdCgiLnVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIiksYV0pfX1yLnB1c2goW2UuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMuaXRlbXMpP3RoaXMub3B0aW9ucy5pdGVtcy5jYWxsKHRoaXMuZWxlbWVudCxudWxsLHtvcHRpb25zOnRoaXMub3B0aW9ucyxpdGVtOnRoaXMuY3VycmVudEl0ZW19KTplKHRoaXMub3B0aW9ucy5pdGVtcyx0aGlzLmVsZW1lbnQpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpLm5vdCgiLnVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIiksdGhpc10pO2Zvcih2YXIgcz1yLmxlbmd0aC0xO3M+PTA7cy0tKXJbc11bMF0uZWFjaChmdW5jdGlvbigpe24ucHVzaCh0aGlzKX0pO3JldHVybiBlKG4pfSxfcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmN1cnJlbnRJdGVtLmZpbmQoIjpkYXRhKCIrdGhpcy53aWRnZXROYW1lKyItaXRlbSkiKTt0aGlzLml0ZW1zPWUuZ3JlcCh0aGlzLml0ZW1zLGZ1bmN0aW9uKGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWlmKHRbbl09PWUuaXRlbVswXSlyZXR1cm4hMTtyZXR1cm4hMH0pfSxfcmVmcmVzaEl0ZW1zOmZ1bmN0aW9uKHQpe3RoaXMuaXRlbXM9W10sdGhpcy5jb250YWluZXJzPVt0aGlzXTt2YXIgbj10aGlzLml0ZW1zLHI9W1tlLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLml0ZW1zKT90aGlzLm9wdGlvbnMuaXRlbXMuY2FsbCh0aGlzLmVsZW1lbnRbMF0sdCx7aXRlbTp0aGlzLmN1cnJlbnRJdGVtfSk6ZSh0aGlzLm9wdGlvbnMuaXRlbXMsdGhpcy5lbGVtZW50KSx0aGlzXV0saT10aGlzLl9jb25uZWN0V2l0aCgpO2lmKGkmJnRoaXMucmVhZHkpZm9yKHZhciBzPWkubGVuZ3RoLTE7cz49MDtzLS0pe3ZhciBvPWUoaVtzXSk7Zm9yKHZhciB1PW8ubGVuZ3RoLTE7dT49MDt1LS0pe3ZhciBhPWUuZGF0YShvW3VdLHRoaXMud2lkZ2V0TmFtZSk7YSYmYSE9dGhpcyYmIWEub3B0aW9ucy5kaXNhYmxlZCYmKHIucHVzaChbZS5pc0Z1bmN0aW9uKGEub3B0aW9ucy5pdGVtcyk/YS5vcHRpb25zLml0ZW1zLmNhbGwoYS5lbGVtZW50WzBdLHQse2l0ZW06dGhpcy5jdXJyZW50SXRlbX0pOmUoYS5vcHRpb25zLml0ZW1zLGEuZWxlbWVudCksYV0pLHRoaXMuY29udGFpbmVycy5wdXNoKGEpKX19Zm9yKHZhciBzPXIubGVuZ3RoLTE7cz49MDtzLS0pe3ZhciBmPXJbc11bMV0sbD1yW3NdWzBdO2Zvcih2YXIgdT0wLGM9bC5sZW5ndGg7dTxjO3UrKyl7dmFyIGg9ZShsW3VdKTtoLmRhdGEodGhpcy53aWRnZXROYW1lKyItaXRlbSIsZiksbi5wdXNoKHtpdGVtOmgsaW5zdGFuY2U6Zix3aWR0aDowLGhlaWdodDowLGxlZnQ6MCx0b3A6MH0pfX19LHJlZnJlc2hQb3NpdGlvbnM6ZnVuY3Rpb24odCl7dGhpcy5vZmZzZXRQYXJlbnQmJnRoaXMuaGVscGVyJiYodGhpcy5vZmZzZXQucGFyZW50PXRoaXMuX2dldFBhcmVudE9mZnNldCgpKTtmb3IodmFyIG49dGhpcy5pdGVtcy5sZW5ndGgtMTtuPj0wO24tLSl7dmFyIHI9dGhpcy5pdGVtc1tuXTtpZihyLmluc3RhbmNlIT10aGlzLmN1cnJlbnRDb250YWluZXImJnRoaXMuY3VycmVudENvbnRhaW5lciYmci5pdGVtWzBdIT10aGlzLmN1cnJlbnRJdGVtWzBdKWNvbnRpbnVlO3ZhciBpPXRoaXMub3B0aW9ucy50b2xlcmFuY2VFbGVtZW50P2UodGhpcy5vcHRpb25zLnRvbGVyYW5jZUVsZW1lbnQsci5pdGVtKTpyLml0ZW07dHx8KHIud2lkdGg9aS5vdXRlcldpZHRoKCksci5oZWlnaHQ9aS5vdXRlckhlaWdodCgpKTt2YXIgcz1pLm9mZnNldCgpO3IubGVmdD1zLmxlZnQsci50b3A9cy50b3B9aWYodGhpcy5vcHRpb25zLmN1c3RvbSYmdGhpcy5vcHRpb25zLmN1c3RvbS5yZWZyZXNoQ29udGFpbmVycyl0aGlzLm9wdGlvbnMuY3VzdG9tLnJlZnJlc2hDb250YWluZXJzLmNhbGwodGhpcyk7ZWxzZSBmb3IodmFyIG49dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO24+PTA7bi0tKXt2YXIgcz10aGlzLmNvbnRhaW5lcnNbbl0uZWxlbWVudC5vZmZzZXQoKTt0aGlzLmNvbnRhaW5lcnNbbl0uY29udGFpbmVyQ2FjaGUubGVmdD1zLmxlZnQsdGhpcy5jb250YWluZXJzW25dLmNvbnRhaW5lckNhY2hlLnRvcD1zLnRvcCx0aGlzLmNvbnRhaW5lcnNbbl0uY29udGFpbmVyQ2FjaGUud2lkdGg9dGhpcy5jb250YWluZXJzW25dLmVsZW1lbnQub3V0ZXJXaWR0aCgpLHRoaXMuY29udGFpbmVyc1tuXS5jb250YWluZXJDYWNoZS5oZWlnaHQ9dGhpcy5jb250YWluZXJzW25dLmVsZW1lbnQub3V0ZXJIZWlnaHQoKX1yZXR1cm4gdGhpc30sX2NyZWF0ZVBsYWNlaG9sZGVyOmZ1bmN0aW9uKHQpe3Q9dHx8dGhpczt2YXIgbj10Lm9wdGlvbnM7aWYoIW4ucGxhY2Vob2xkZXJ8fG4ucGxhY2Vob2xkZXIuY29uc3RydWN0b3I9PVN0cmluZyl7dmFyIHI9bi5wbGFjZWhvbGRlcjtuLnBsYWNlaG9sZGVyPXtlbGVtZW50OmZ1bmN0aW9uKCl7dmFyIG49ZShkb2N1bWVudC5jcmVhdGVFbGVtZW50KHQuY3VycmVudEl0ZW1bMF0ubm9kZU5hbWUpKS5hZGRDbGFzcyhyfHx0LmN1cnJlbnRJdGVtWzBdLmNsYXNzTmFtZSsiIHVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIikucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpWzBdO3JldHVybiByfHwobi5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iKSxufSx1cGRhdGU6ZnVuY3Rpb24oZSxpKXtpZihyJiYhbi5mb3JjZVBsYWNlaG9sZGVyU2l6ZSlyZXR1cm47aS5oZWlnaHQoKXx8aS5oZWlnaHQodC5jdXJyZW50SXRlbS5pbm5lckhlaWdodCgpLXBhcnNlSW50KHQuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nVG9wIil8fDAsMTApLXBhcnNlSW50KHQuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nQm90dG9tIil8fDAsMTApKSxpLndpZHRoKCl8fGkud2lkdGgodC5jdXJyZW50SXRlbS5pbm5lcldpZHRoKCktcGFyc2VJbnQodC5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdMZWZ0Iil8fDAsMTApLXBhcnNlSW50KHQuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nUmlnaHQiKXx8MCwxMCkpfX19dC5wbGFjZWhvbGRlcj1lKG4ucGxhY2Vob2xkZXIuZWxlbWVudC5jYWxsKHQuZWxlbWVudCx0LmN1cnJlbnRJdGVtKSksdC5jdXJyZW50SXRlbS5hZnRlcih0LnBsYWNlaG9sZGVyKSxuLnBsYWNlaG9sZGVyLnVwZGF0ZSh0LHQucGxhY2Vob2xkZXIpfSxfY29udGFjdENvbnRhaW5lcnM6ZnVuY3Rpb24odCl7dmFyIG49bnVsbCxyPW51bGw7Zm9yKHZhciBpPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtpPj0wO2ktLSl7aWYoZS5jb250YWlucyh0aGlzLmN1cnJlbnRJdGVtWzBdLHRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50WzBdKSljb250aW51ZTtpZih0aGlzLl9pbnRlcnNlY3RzV2l0aCh0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUpKXtpZihuJiZlLmNvbnRhaW5zKHRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50WzBdLG4uZWxlbWVudFswXSkpY29udGludWU7bj10aGlzLmNvbnRhaW5lcnNbaV0scj1pfWVsc2UgdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLm92ZXImJih0aGlzLmNvbnRhaW5lcnNbaV0uX3RyaWdnZXIoIm91dCIsdCx0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS5vdmVyPTApfWlmKCFuKXJldHVybjtpZih0aGlzLmNvbnRhaW5lcnMubGVuZ3RoPT09MSl0aGlzLmNvbnRhaW5lcnNbcl0uX3RyaWdnZXIoIm92ZXIiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbcl0uY29udGFpbmVyQ2FjaGUub3Zlcj0xO2Vsc2V7dmFyIHM9MWU0LG89bnVsbCx1PXRoaXMuY29udGFpbmVyc1tyXS5mbG9hdGluZz8ibGVmdCI6InRvcCIsYT10aGlzLmNvbnRhaW5lcnNbcl0uZmxvYXRpbmc/IndpZHRoIjoiaGVpZ2h0IixmPXRoaXMucG9zaXRpb25BYnNbdV0rdGhpcy5vZmZzZXQuY2xpY2tbdV07Zm9yKHZhciBsPXRoaXMuaXRlbXMubGVuZ3RoLTE7bD49MDtsLS0pe2lmKCFlLmNvbnRhaW5zKHRoaXMuY29udGFpbmVyc1tyXS5lbGVtZW50WzBdLHRoaXMuaXRlbXNbbF0uaXRlbVswXSkpY29udGludWU7aWYodGhpcy5pdGVtc1tsXS5pdGVtWzBdPT10aGlzLmN1cnJlbnRJdGVtWzBdKWNvbnRpbnVlO3ZhciBjPXRoaXMuaXRlbXNbbF0uaXRlbS5vZmZzZXQoKVt1XSxoPSExO01hdGguYWJzKGMtZik+TWF0aC5hYnMoYyt0aGlzLml0ZW1zW2xdW2FdLWYpJiYoaD0hMCxjKz10aGlzLml0ZW1zW2xdW2FdKSxNYXRoLmFicyhjLWYpPHMmJihzPU1hdGguYWJzKGMtZiksbz10aGlzLml0ZW1zW2xdLHRoaXMuZGlyZWN0aW9uPWg/InVwIjoiZG93biIpfWlmKCFvJiYhdGhpcy5vcHRpb25zLmRyb3BPbkVtcHR5KXJldHVybjt0aGlzLmN1cnJlbnRDb250YWluZXI9dGhpcy5jb250YWluZXJzW3JdLG8/dGhpcy5fcmVhcnJhbmdlKHQsbyxudWxsLCEwKTp0aGlzLl9yZWFycmFuZ2UodCxudWxsLHRoaXMuY29udGFpbmVyc1tyXS5lbGVtZW50LCEwKSx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLHQsdGhpcy5fdWlIYXNoKCkpLHRoaXMuY29udGFpbmVyc1tyXS5fdHJpZ2dlcigiY2hhbmdlIix0LHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyLnVwZGF0ZSh0aGlzLmN1cnJlbnRDb250YWluZXIsdGhpcy5wbGFjZWhvbGRlciksdGhpcy5jb250YWluZXJzW3JdLl90cmlnZ2VyKCJvdmVyIix0LHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW3JdLmNvbnRhaW5lckNhY2hlLm92ZXI9MX19LF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5vcHRpb25zLHI9ZS5pc0Z1bmN0aW9uKG4uaGVscGVyKT9lKG4uaGVscGVyLmFwcGx5KHRoaXMuZWxlbWVudFswXSxbdCx0aGlzLmN1cnJlbnRJdGVtXSkpOm4uaGVscGVyPT0iY2xvbmUiP3RoaXMuY3VycmVudEl0ZW0uY2xvbmUoKTp0aGlzLmN1cnJlbnRJdGVtO3JldHVybiByLnBhcmVudHMoImJvZHkiKS5sZW5ndGh8fGUobi5hcHBlbmRUbyE9InBhcmVudCI/bi5hcHBlbmRUbzp0aGlzLmN1cnJlbnRJdGVtWzBdLnBhcmVudE5vZGUpWzBdLmFwcGVuZENoaWxkKHJbMF0pLHJbMF09PXRoaXMuY3VycmVudEl0ZW1bMF0mJih0aGlzLl9zdG9yZWRDU1M9e3dpZHRoOnRoaXMuY3VycmVudEl0ZW1bMF0uc3R5bGUud2lkdGgsaGVpZ2h0OnRoaXMuY3VycmVudEl0ZW1bMF0uc3R5bGUuaGVpZ2h0LHBvc2l0aW9uOnRoaXMuY3VycmVudEl0ZW0uY3NzKCJwb3NpdGlvbiIpLHRvcDp0aGlzLmN1cnJlbnRJdGVtLmNzcygidG9wIiksbGVmdDp0aGlzLmN1cnJlbnRJdGVtLmNzcygibGVmdCIpfSksKHJbMF0uc3R5bGUud2lkdGg9PSIifHxuLmZvcmNlSGVscGVyU2l6ZSkmJnIud2lkdGgodGhpcy5jdXJyZW50SXRlbS53aWR0aCgpKSwoclswXS5zdHlsZS5oZWlnaHQ9PSIifHxuLmZvcmNlSGVscGVyU2l6ZSkmJnIuaGVpZ2h0KHRoaXMuY3VycmVudEl0ZW0uaGVpZ2h0KCkpLHJ9LF9hZGp1c3RPZmZzZXRGcm9tSGVscGVyOmZ1bmN0aW9uKHQpe3R5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9dC5zcGxpdCgiICIpKSxlLmlzQXJyYXkodCkmJih0PXtsZWZ0Oit0WzBdLHRvcDordFsxXXx8MH0pLCJsZWZ0ImluIHQmJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXQubGVmdCt0aGlzLm1hcmdpbnMubGVmdCksInJpZ2h0ImluIHQmJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdC5yaWdodCt0aGlzLm1hcmdpbnMubGVmdCksInRvcCJpbiB0JiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPXQudG9wK3RoaXMubWFyZ2lucy50b3ApLCJib3R0b20iaW4gdCYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10LmJvdHRvbSt0aGlzLm1hcmdpbnMudG9wKX0sX2dldFBhcmVudE9mZnNldDpmdW5jdGlvbigpe3RoaXMub2Zmc2V0UGFyZW50PXRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpO3ZhciB0PXRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpO3RoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJnRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmZS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSkmJih0LmxlZnQrPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSx0LnRvcCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCkpO2lmKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5fHx0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lJiZ0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJodG1sIiYmZS51aS5pZSl0PXt0b3A6MCxsZWZ0OjB9O3JldHVybnt0b3A6dC50b3ArKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLGxlZnQ6dC5sZWZ0KyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCl9fSxfZ2V0UmVsYXRpdmVPZmZzZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLmNzc1Bvc2l0aW9uPT0icmVsYXRpdmUiKXt2YXIgZT10aGlzLmN1cnJlbnRJdGVtLnBvc2l0aW9uKCk7cmV0dXJue3RvcDplLnRvcC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpLGxlZnQ6ZS5sZWZ0LShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKX19cmV0dXJue3RvcDowLGxlZnQ6MH19LF9jYWNoZU1hcmdpbnM6ZnVuY3Rpb24oKXt0aGlzLm1hcmdpbnM9e2xlZnQ6cGFyc2VJbnQodGhpcy5jdXJyZW50SXRlbS5jc3MoIm1hcmdpbkxlZnQiKSwxMCl8fDAsdG9wOnBhcnNlSW50KHRoaXMuY3VycmVudEl0ZW0uY3NzKCJtYXJnaW5Ub3AiKSwxMCl8fDB9fSxfY2FjaGVIZWxwZXJQcm9wb3J0aW9uczpmdW5jdGlvbigpe3RoaXMuaGVscGVyUHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKX19LF9zZXRDb250YWlubWVudDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uczt0LmNvbnRhaW5tZW50PT0icGFyZW50IiYmKHQuY29udGFpbm1lbnQ9dGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSk7aWYodC5jb250YWlubWVudD09ImRvY3VtZW50Inx8dC5jb250YWlubWVudD09IndpbmRvdyIpdGhpcy5jb250YWlubWVudD1bMC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0LDAtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AsZSh0LmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykud2lkdGgoKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LChlKHQuY29udGFpbm1lbnQ9PSJkb2N1bWVudCI/ZG9jdW1lbnQ6d2luZG93KS5oZWlnaHQoKXx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF07aWYoIS9eKGRvY3VtZW50fHdpbmRvd3xwYXJlbnQpJC8udGVzdCh0LmNvbnRhaW5tZW50KSl7dmFyIG49ZSh0LmNvbnRhaW5tZW50KVswXSxyPWUodC5jb250YWlubWVudCkub2Zmc2V0KCksaT1lKG4pLmNzcygib3ZlcmZsb3ciKSE9ImhpZGRlbiI7dGhpcy5jb250YWlubWVudD1bci5sZWZ0KyhwYXJzZUludChlKG4pLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoZShuKS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKS10aGlzLm1hcmdpbnMubGVmdCxyLnRvcCsocGFyc2VJbnQoZShuKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoZShuKS5jc3MoInBhZGRpbmdUb3AiKSwxMCl8fDApLXRoaXMubWFyZ2lucy50b3Asci5sZWZ0KyhpP01hdGgubWF4KG4uc2Nyb2xsV2lkdGgsbi5vZmZzZXRXaWR0aCk6bi5vZmZzZXRXaWR0aCktKHBhcnNlSW50KGUobikuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApLShwYXJzZUludChlKG4pLmNzcygicGFkZGluZ1JpZ2h0IiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LHIudG9wKyhpP01hdGgubWF4KG4uc2Nyb2xsSGVpZ2h0LG4ub2Zmc2V0SGVpZ2h0KTpuLm9mZnNldEhlaWdodCktKHBhcnNlSW50KGUobikuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCktKHBhcnNlSW50KGUobikuY3NzKCJwYWRkaW5nQm90dG9tIiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXX19LF9jb252ZXJ0UG9zaXRpb25UbzpmdW5jdGlvbih0LG4pe258fChuPXRoaXMucG9zaXRpb24pO3ZhciByPXQ9PSJhYnNvbHV0ZSI/MTotMSxpPXRoaXMub3B0aW9ucyxzPXRoaXMuY3NzUG9zaXRpb24hPSJhYnNvbHV0ZSJ8fHRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmISFlLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKT90aGlzLnNjcm9sbFBhcmVudDp0aGlzLm9mZnNldFBhcmVudCxvPS8oaHRtbHxib2R5KS9pLnRlc3Qoc1swXS50YWdOYW1lKTtyZXR1cm57dG9wOm4udG9wK3RoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcCpyK3RoaXMub2Zmc2V0LnBhcmVudC50b3Aqci0odGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCk6bz8wOnMuc2Nyb2xsVG9wKCkpKnIsbGVmdDpuLmxlZnQrdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdCpyK3RoaXMub2Zmc2V0LnBhcmVudC5sZWZ0KnItKHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTpvPzA6cy5zY3JvbGxMZWZ0KCkpKnJ9fSxfZ2VuZXJhdGVQb3NpdGlvbjpmdW5jdGlvbih0KXt2YXIgbj10aGlzLm9wdGlvbnMscj10aGlzLmNzc1Bvc2l0aW9uIT0iYWJzb2x1dGUifHx0aGlzLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJiEhZS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSk/dGhpcy5zY3JvbGxQYXJlbnQ6dGhpcy5vZmZzZXRQYXJlbnQsaT0vKGh0bWx8Ym9keSkvaS50ZXN0KHJbMF0udGFnTmFtZSk7dGhpcy5jc3NQb3NpdGlvbj09InJlbGF0aXZlIiYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdPT1kb2N1bWVudHx8dGhpcy5zY3JvbGxQYXJlbnRbMF09PXRoaXMub2Zmc2V0UGFyZW50WzBdKSYmKHRoaXMub2Zmc2V0LnJlbGF0aXZlPXRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCkpO3ZhciBzPXQucGFnZVgsbz10LnBhZ2VZO2lmKHRoaXMub3JpZ2luYWxQb3NpdGlvbil7dGhpcy5jb250YWlubWVudCYmKHQucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdDx0aGlzLmNvbnRhaW5tZW50WzBdJiYocz10aGlzLmNvbnRhaW5tZW50WzBdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLHQucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPHRoaXMuY29udGFpbm1lbnRbMV0mJihvPXRoaXMuY29udGFpbm1lbnRbMV0rdGhpcy5vZmZzZXQuY2xpY2sudG9wKSx0LnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+dGhpcy5jb250YWlubWVudFsyXSYmKHM9dGhpcy5jb250YWlubWVudFsyXSt0aGlzLm9mZnNldC5jbGljay5sZWZ0KSx0LnBhZ2VZLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD50aGlzLmNvbnRhaW5tZW50WzNdJiYobz10aGlzLmNvbnRhaW5tZW50WzNdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCkpO2lmKG4uZ3JpZCl7dmFyIHU9dGhpcy5vcmlnaW5hbFBhZ2VZK01hdGgucm91bmQoKG8tdGhpcy5vcmlnaW5hbFBhZ2VZKS9uLmdyaWRbMV0pKm4uZ3JpZFsxXTtvPXRoaXMuY29udGFpbm1lbnQ/dS10aGlzLm9mZnNldC5jbGljay50b3A8dGhpcy5jb250YWlubWVudFsxXXx8dS10aGlzLm9mZnNldC5jbGljay50b3A+dGhpcy5jb250YWlubWVudFszXT91LXRoaXMub2Zmc2V0LmNsaWNrLnRvcDx0aGlzLmNvbnRhaW5tZW50WzFdP3Urbi5ncmlkWzFdOnUtbi5ncmlkWzFdOnU6dTt2YXIgYT10aGlzLm9yaWdpbmFsUGFnZVgrTWF0aC5yb3VuZCgocy10aGlzLm9yaWdpbmFsUGFnZVgpL24uZ3JpZFswXSkqbi5ncmlkWzBdO3M9dGhpcy5jb250YWlubWVudD9hLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8dGhpcy5jb250YWlubWVudFswXXx8YS10aGlzLm9mZnNldC5jbGljay5sZWZ0PnRoaXMuY29udGFpbm1lbnRbMl0/YS10aGlzLm9mZnNldC5jbGljay5sZWZ0PHRoaXMuY29udGFpbm1lbnRbMF0/YStuLmdyaWRbMF06YS1uLmdyaWRbMF06YTphfX1yZXR1cm57dG9wOm8tdGhpcy5vZmZzZXQuY2xpY2sudG9wLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wKyh0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTppPzA6ci5zY3JvbGxUb3AoKSksbGVmdDpzLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQtdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCsodGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpOmk/MDpyLnNjcm9sbExlZnQoKSl9fSxfcmVhcnJhbmdlOmZ1bmN0aW9uKGUsdCxuLHIpe24/blswXS5hcHBlbmRDaGlsZCh0aGlzLnBsYWNlaG9sZGVyWzBdKTp0Lml0ZW1bMF0ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5wbGFjZWhvbGRlclswXSx0aGlzLmRpcmVjdGlvbj09ImRvd24iP3QuaXRlbVswXTp0Lml0ZW1bMF0ubmV4dFNpYmxpbmcpLHRoaXMuY291bnRlcj10aGlzLmNvdW50ZXI/Kyt0aGlzLmNvdW50ZXI6MTt2YXIgaT10aGlzLmNvdW50ZXI7dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXtpPT10aGlzLmNvdW50ZXImJnRoaXMucmVmcmVzaFBvc2l0aW9ucyghcil9KX0sX2NsZWFyOmZ1bmN0aW9uKHQsbil7dGhpcy5yZXZlcnRpbmc9ITE7dmFyIHI9W107IXRoaXMuX25vRmluYWxTb3J0JiZ0aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpLmxlbmd0aCYmdGhpcy5wbGFjZWhvbGRlci5iZWZvcmUodGhpcy5jdXJyZW50SXRlbSksdGhpcy5fbm9GaW5hbFNvcnQ9bnVsbDtpZih0aGlzLmhlbHBlclswXT09dGhpcy5jdXJyZW50SXRlbVswXSl7Zm9yKHZhciBpIGluIHRoaXMuX3N0b3JlZENTUylpZih0aGlzLl9zdG9yZWRDU1NbaV09PSJhdXRvInx8dGhpcy5fc3RvcmVkQ1NTW2ldPT0ic3RhdGljIil0aGlzLl9zdG9yZWRDU1NbaV09IiI7dGhpcy5jdXJyZW50SXRlbS5jc3ModGhpcy5fc3RvcmVkQ1NTKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGVscGVyIil9ZWxzZSB0aGlzLmN1cnJlbnRJdGVtLnNob3coKTt0aGlzLmZyb21PdXRzaWRlJiYhbiYmci5wdXNoKGZ1bmN0aW9uKGUpe3RoaXMuX3RyaWdnZXIoInJlY2VpdmUiLGUsdGhpcy5fdWlIYXNoKHRoaXMuZnJvbU91dHNpZGUpKX0pLCh0aGlzLmZyb21PdXRzaWRlfHx0aGlzLmRvbVBvc2l0aW9uLnByZXYhPXRoaXMuY3VycmVudEl0ZW0ucHJldigpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpWzBdfHx0aGlzLmRvbVBvc2l0aW9uLnBhcmVudCE9dGhpcy5jdXJyZW50SXRlbS5wYXJlbnQoKVswXSkmJiFuJiZyLnB1c2goZnVuY3Rpb24oZSl7dGhpcy5fdHJpZ2dlcigidXBkYXRlIixlLHRoaXMuX3VpSGFzaCgpKX0pLHRoaXMhPT10aGlzLmN1cnJlbnRDb250YWluZXImJihufHwoci5wdXNoKGZ1bmN0aW9uKGUpe3RoaXMuX3RyaWdnZXIoInJlbW92ZSIsZSx0aGlzLl91aUhhc2goKSl9KSxyLnB1c2goZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2UuX3RyaWdnZXIoInJlY2VpdmUiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKX19LmNhbGwodGhpcyx0aGlzLmN1cnJlbnRDb250YWluZXIpKSxyLnB1c2goZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2UuX3RyaWdnZXIoInVwZGF0ZSIsdCx0aGlzLl91aUhhc2godGhpcykpfX0uY2FsbCh0aGlzLHRoaXMuY3VycmVudENvbnRhaW5lcikpKSk7Zm9yKHZhciBpPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtpPj0wO2ktLSlufHxyLnB1c2goZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2UuX3RyaWdnZXIoImRlYWN0aXZhdGUiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKX19LmNhbGwodGhpcyx0aGlzLmNvbnRhaW5lcnNbaV0pKSx0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUub3ZlciYmKHIucHVzaChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7ZS5fdHJpZ2dlcigib3V0Iix0LHRoaXMuX3VpSGFzaCh0aGlzKSl9fS5jYWxsKHRoaXMsdGhpcy5jb250YWluZXJzW2ldKSksdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLm92ZXI9MCk7dGhpcy5fc3RvcmVkQ3Vyc29yJiZlKCJib2R5IikuY3NzKCJjdXJzb3IiLHRoaXMuX3N0b3JlZEN1cnNvciksdGhpcy5fc3RvcmVkT3BhY2l0eSYmdGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5Iix0aGlzLl9zdG9yZWRPcGFjaXR5KSx0aGlzLl9zdG9yZWRaSW5kZXgmJnRoaXMuaGVscGVyLmNzcygiekluZGV4Iix0aGlzLl9zdG9yZWRaSW5kZXg9PSJhdXRvIj8iIjp0aGlzLl9zdG9yZWRaSW5kZXgpLHRoaXMuZHJhZ2dpbmc9ITE7aWYodGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsKXtpZighbil7dGhpcy5fdHJpZ2dlcigiYmVmb3JlU3RvcCIsdCx0aGlzLl91aUhhc2goKSk7Zm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspcltpXS5jYWxsKHRoaXMsdCk7dGhpcy5fdHJpZ2dlcigic3RvcCIsdCx0aGlzLl91aUhhc2goKSl9cmV0dXJuIHRoaXMuZnJvbU91dHNpZGU9ITEsITF9bnx8dGhpcy5fdHJpZ2dlcigiYmVmb3JlU3RvcCIsdCx0aGlzLl91aUhhc2goKSksdGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pLHRoaXMuaGVscGVyWzBdIT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSx0aGlzLmhlbHBlcj1udWxsO2lmKCFuKXtmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKylyW2ldLmNhbGwodGhpcyx0KTt0aGlzLl90cmlnZ2VyKCJzdG9wIix0LHRoaXMuX3VpSGFzaCgpKX1yZXR1cm4gdGhpcy5mcm9tT3V0c2lkZT0hMSwhMH0sX3RyaWdnZXI6ZnVuY3Rpb24oKXtlLldpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpPT09ITEmJnRoaXMuY2FuY2VsKCl9LF91aUhhc2g6ZnVuY3Rpb24odCl7dmFyIG49dHx8dGhpcztyZXR1cm57aGVscGVyOm4uaGVscGVyLHBsYWNlaG9sZGVyOm4ucGxhY2Vob2xkZXJ8fGUoW10pLHBvc2l0aW9uOm4ucG9zaXRpb24sb3JpZ2luYWxQb3NpdGlvbjpuLm9yaWdpbmFsUG9zaXRpb24sb2Zmc2V0Om4ucG9zaXRpb25BYnMsaXRlbTpuLmN1cnJlbnRJdGVtLHNlbmRlcjp0P3QuZWxlbWVudDpudWxsfX19KX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50LnZhbCgpO2UuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX3JlZnJlc2goKSx0IT09dGhpcy5lbGVtZW50LnZhbCgpJiZ0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiKX19ZS53aWRnZXQoInVpLnNwaW5uZXIiLHt2ZXJzaW9uOiIxLjkuMiIsZGVmYXVsdEVsZW1lbnQ6IjxpbnB1dD4iLHdpZGdldEV2ZW50UHJlZml4OiJzcGluIixvcHRpb25zOntjdWx0dXJlOm51bGwsaWNvbnM6e2Rvd246InVpLWljb24tdHJpYW5nbGUtMS1zIix1cDoidWktaWNvbi10cmlhbmdsZS0xLW4ifSxpbmNyZW1lbnRhbDohMCxtYXg6bnVsbCxtaW46bnVsbCxudW1iZXJGb3JtYXQ6bnVsbCxwYWdlOjEwLHN0ZXA6MSxjaGFuZ2U6bnVsbCxzcGluOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLl9zZXRPcHRpb24oIm1heCIsdGhpcy5vcHRpb25zLm1heCksdGhpcy5fc2V0T3B0aW9uKCJtaW4iLHRoaXMub3B0aW9ucy5taW4pLHRoaXMuX3NldE9wdGlvbigic3RlcCIsdGhpcy5vcHRpb25zLnN0ZXApLHRoaXMuX3ZhbHVlKHRoaXMuZWxlbWVudC52YWwoKSwhMCksdGhpcy5fZHJhdygpLHRoaXMuX29uKHRoaXMuX2V2ZW50cyksdGhpcy5fcmVmcmVzaCgpLHRoaXMuX29uKHRoaXMud2luZG93LHtiZWZvcmV1bmxvYWQ6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cigiYXV0b2NvbXBsZXRlIil9fSl9LF9nZXRDcmVhdGVPcHRpb25zOmZ1bmN0aW9uKCl7dmFyIHQ9e30sbj10aGlzLmVsZW1lbnQ7cmV0dXJuIGUuZWFjaChbIm1pbiIsIm1heCIsInN0ZXAiXSxmdW5jdGlvbihlLHIpe3ZhciBpPW4uYXR0cihyKTtpIT09dW5kZWZpbmVkJiZpLmxlbmd0aCYmKHRbcl09aSl9KSx0fSxfZXZlbnRzOntrZXlkb3duOmZ1bmN0aW9uKGUpe3RoaXMuX3N0YXJ0KGUpJiZ0aGlzLl9rZXlkb3duKGUpJiZlLnByZXZlbnREZWZhdWx0KCl9LGtleXVwOiJfc3RvcCIsZm9jdXM6ZnVuY3Rpb24oKXt0aGlzLnByZXZpb3VzPXRoaXMuZWxlbWVudC52YWwoKX0sYmx1cjpmdW5jdGlvbihlKXtpZih0aGlzLmNhbmNlbEJsdXIpe2RlbGV0ZSB0aGlzLmNhbmNlbEJsdXI7cmV0dXJufXRoaXMuX3JlZnJlc2goKSx0aGlzLnByZXZpb3VzIT09dGhpcy5lbGVtZW50LnZhbCgpJiZ0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLGUpfSxtb3VzZXdoZWVsOmZ1bmN0aW9uKGUsdCl7aWYoIXQpcmV0dXJuO2lmKCF0aGlzLnNwaW5uaW5nJiYhdGhpcy5fc3RhcnQoZSkpcmV0dXJuITE7dGhpcy5fc3BpbigodD4wPzE6LTEpKnRoaXMub3B0aW9ucy5zdGVwLGUpLGNsZWFyVGltZW91dCh0aGlzLm1vdXNld2hlZWxUaW1lciksdGhpcy5tb3VzZXdoZWVsVGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLnNwaW5uaW5nJiZ0aGlzLl9zdG9wKGUpfSwxMDApLGUucHJldmVudERlZmF1bHQoKX0sIm1vdXNlZG93biAudWktc3Bpbm5lci1idXR0b24iOmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIoKXt2YXIgZT10aGlzLmVsZW1lbnRbMF09PT10aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQ7ZXx8KHRoaXMuZWxlbWVudC5mb2N1cygpLHRoaXMucHJldmlvdXM9bix0aGlzLl9kZWxheShmdW5jdGlvbigpe3RoaXMucHJldmlvdXM9bn0pKX12YXIgbjtuPXRoaXMuZWxlbWVudFswXT09PXRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudD90aGlzLnByZXZpb3VzOnRoaXMuZWxlbWVudC52YWwoKSx0LnByZXZlbnREZWZhdWx0KCksci5jYWxsKHRoaXMpLHRoaXMuY2FuY2VsQmx1cj0hMCx0aGlzLl9kZWxheShmdW5jdGlvbigpe2RlbGV0ZSB0aGlzLmNhbmNlbEJsdXIsci5jYWxsKHRoaXMpfSk7aWYodGhpcy5fc3RhcnQodCk9PT0hMSlyZXR1cm47dGhpcy5fcmVwZWF0KG51bGwsZSh0LmN1cnJlbnRUYXJnZXQpLmhhc0NsYXNzKCJ1aS1zcGlubmVyLXVwIik/MTotMSx0KX0sIm1vdXNldXAgLnVpLXNwaW5uZXItYnV0dG9uIjoiX3N0b3AiLCJtb3VzZWVudGVyIC51aS1zcGlubmVyLWJ1dHRvbiI6ZnVuY3Rpb24odCl7aWYoIWUodC5jdXJyZW50VGFyZ2V0KS5oYXNDbGFzcygidWktc3RhdGUtYWN0aXZlIikpcmV0dXJuO2lmKHRoaXMuX3N0YXJ0KHQpPT09ITEpcmV0dXJuITE7dGhpcy5fcmVwZWF0KG51bGwsZSh0LmN1cnJlbnRUYXJnZXQpLmhhc0NsYXNzKCJ1aS1zcGlubmVyLXVwIik/MTotMSx0KX0sIm1vdXNlbGVhdmUgLnVpLXNwaW5uZXItYnV0dG9uIjoiX3N0b3AifSxfZHJhdzpmdW5jdGlvbigpe3ZhciBlPXRoaXMudWlTcGlubmVyPXRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc3Bpbm5lci1pbnB1dCIpLmF0dHIoImF1dG9jb21wbGV0ZSIsIm9mZiIpLndyYXAodGhpcy5fdWlTcGlubmVySHRtbCgpKS5wYXJlbnQoKS5hcHBlbmQodGhpcy5fYnV0dG9uSHRtbCgpKTt0aGlzLmVsZW1lbnQuYXR0cigicm9sZSIsInNwaW5idXR0b24iKSx0aGlzLmJ1dHRvbnM9ZS5maW5kKCIudWktc3Bpbm5lci1idXR0b24iKS5hdHRyKCJ0YWJJbmRleCIsLTEpLmJ1dHRvbigpLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItYWxsIiksdGhpcy5idXR0b25zLmhlaWdodCgpPk1hdGguY2VpbChlLmhlaWdodCgpKi41KSYmZS5oZWlnaHQoKT4wJiZlLmhlaWdodChlLmhlaWdodCgpKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuZGlzYWJsZSgpfSxfa2V5ZG93bjpmdW5jdGlvbih0KXt2YXIgbj10aGlzLm9wdGlvbnMscj1lLnVpLmtleUNvZGU7c3dpdGNoKHQua2V5Q29kZSl7Y2FzZSByLlVQOnJldHVybiB0aGlzLl9yZXBlYXQobnVsbCwxLHQpLCEwO2Nhc2Ugci5ET1dOOnJldHVybiB0aGlzLl9yZXBlYXQobnVsbCwtMSx0KSwhMDtjYXNlIHIuUEFHRV9VUDpyZXR1cm4gdGhpcy5fcmVwZWF0KG51bGwsbi5wYWdlLHQpLCEwO2Nhc2Ugci5QQUdFX0RPV046cmV0dXJuIHRoaXMuX3JlcGVhdChudWxsLC1uLnBhZ2UsdCksITB9cmV0dXJuITF9LF91aVNwaW5uZXJIdG1sOmZ1bmN0aW9uKCl7cmV0dXJuIjxzcGFuIGNsYXNzPSd1aS1zcGlubmVyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsJz48L3NwYW4+In0sX2J1dHRvbkh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4iPGEgY2xhc3M9J3VpLXNwaW5uZXItYnV0dG9uIHVpLXNwaW5uZXItdXAgdWktY29ybmVyLXRyJz48c3BhbiBjbGFzcz0ndWktaWNvbiAiK3RoaXMub3B0aW9ucy5pY29ucy51cCsiJz4mIzk2NTA7PC9zcGFuPiIrIjwvYT4iKyI8YSBjbGFzcz0ndWktc3Bpbm5lci1idXR0b24gdWktc3Bpbm5lci1kb3duIHVpLWNvcm5lci1icic+IisiPHNwYW4gY2xhc3M9J3VpLWljb24gIit0aGlzLm9wdGlvbnMuaWNvbnMuZG93bisiJz4mIzk2NjA7PC9zcGFuPiIrIjwvYT4ifSxfc3RhcnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIXRoaXMuc3Bpbm5pbmcmJnRoaXMuX3RyaWdnZXIoInN0YXJ0IixlKT09PSExPyExOih0aGlzLmNvdW50ZXJ8fCh0aGlzLmNvdW50ZXI9MSksdGhpcy5zcGlubmluZz0hMCwhMCl9LF9yZXBlYXQ6ZnVuY3Rpb24oZSx0LG4pe2U9ZXx8NTAwLGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLnRpbWVyPXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5fcmVwZWF0KDQwLHQsbil9LGUpLHRoaXMuX3NwaW4odCp0aGlzLm9wdGlvbnMuc3RlcCxuKX0sX3NwaW46ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnZhbHVlKCl8fDA7dGhpcy5jb3VudGVyfHwodGhpcy5jb3VudGVyPTEpLG49dGhpcy5fYWRqdXN0VmFsdWUobitlKnRoaXMuX2luY3JlbWVudCh0aGlzLmNvdW50ZXIpKTtpZighdGhpcy5zcGlubmluZ3x8dGhpcy5fdHJpZ2dlcigic3BpbiIsdCx7dmFsdWU6bn0pIT09ITEpdGhpcy5fdmFsdWUobiksdGhpcy5jb3VudGVyKyt9LF9pbmNyZW1lbnQ6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5vcHRpb25zLmluY3JlbWVudGFsO3JldHVybiBuP2UuaXNGdW5jdGlvbihuKT9uKHQpOk1hdGguZmxvb3IodCp0KnQvNWU0LXQqdC81MDArMTcqdC8yMDArMSk6MX0sX3ByZWNpc2lvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX3ByZWNpc2lvbk9mKHRoaXMub3B0aW9ucy5zdGVwKTtyZXR1cm4gdGhpcy5vcHRpb25zLm1pbiE9PW51bGwmJihlPU1hdGgubWF4KGUsdGhpcy5fcHJlY2lzaW9uT2YodGhpcy5vcHRpb25zLm1pbikpKSxlfSxfcHJlY2lzaW9uT2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50b1N0cmluZygpLG49dC5pbmRleE9mKCIuIik7cmV0dXJuIG49PT0tMT8wOnQubGVuZ3RoLW4tMX0sX2FkanVzdFZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLm9wdGlvbnM7cmV0dXJuIHQ9ci5taW4hPT1udWxsP3IubWluOjAsbj1lLXQsbj1NYXRoLnJvdW5kKG4vci5zdGVwKSpyLnN0ZXAsZT10K24sZT1wYXJzZUZsb2F0KGUudG9GaXhlZCh0aGlzLl9wcmVjaXNpb24oKSkpLHIubWF4IT09bnVsbCYmZT5yLm1heD9yLm1heDpyLm1pbiE9PW51bGwmJmU8ci5taW4/ci5taW46ZX0sX3N0b3A6ZnVuY3Rpb24oZSl7aWYoIXRoaXMuc3Bpbm5pbmcpcmV0dXJuO2NsZWFyVGltZW91dCh0aGlzLnRpbWVyKSxjbGVhclRpbWVvdXQodGhpcy5tb3VzZXdoZWVsVGltZXIpLHRoaXMuY291bnRlcj0wLHRoaXMuc3Bpbm5pbmc9ITEsdGhpcy5fdHJpZ2dlcigic3RvcCIsZSl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtpZihlPT09ImN1bHR1cmUifHxlPT09Im51bWJlckZvcm1hdCIpe3ZhciBuPXRoaXMuX3BhcnNlKHRoaXMuZWxlbWVudC52YWwoKSk7dGhpcy5vcHRpb25zW2VdPXQsdGhpcy5lbGVtZW50LnZhbCh0aGlzLl9mb3JtYXQobikpO3JldHVybn0oZT09PSJtYXgifHxlPT09Im1pbiJ8fGU9PT0ic3RlcCIpJiZ0eXBlb2YgdD09InN0cmluZyImJih0PXRoaXMuX3BhcnNlKHQpKSx0aGlzLl9zdXBlcihlLHQpLGU9PT0iZGlzYWJsZWQiJiYodD8odGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIiwhMCksdGhpcy5idXR0b25zLmJ1dHRvbigiZGlzYWJsZSIpKToodGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIiwhMSksdGhpcy5idXR0b25zLmJ1dHRvbigiZW5hYmxlIikpKX0sX3NldE9wdGlvbnM6dChmdW5jdGlvbihlKXt0aGlzLl9zdXBlcihlKSx0aGlzLl92YWx1ZSh0aGlzLmVsZW1lbnQudmFsKCkpfSksX3BhcnNlOmZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZT09InN0cmluZyImJmUhPT0iIiYmKGU9d2luZG93Lkdsb2JhbGl6ZSYmdGhpcy5vcHRpb25zLm51bWJlckZvcm1hdD9HbG9iYWxpemUucGFyc2VGbG9hdChlLDEwLHRoaXMub3B0aW9ucy5jdWx0dXJlKTorZSksZT09PSIifHxpc05hTihlKT9udWxsOmV9LF9mb3JtYXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT0iIj8iIjp3aW5kb3cuR2xvYmFsaXplJiZ0aGlzLm9wdGlvbnMubnVtYmVyRm9ybWF0P0dsb2JhbGl6ZS5mb3JtYXQoZSx0aGlzLm9wdGlvbnMubnVtYmVyRm9ybWF0LHRoaXMub3B0aW9ucy5jdWx0dXJlKTplfSxfcmVmcmVzaDpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5hdHRyKHsiYXJpYS12YWx1ZW1pbiI6dGhpcy5vcHRpb25zLm1pbiwiYXJpYS12YWx1ZW1heCI6dGhpcy5vcHRpb25zLm1heCwiYXJpYS12YWx1ZW5vdyI6dGhpcy5fcGFyc2UodGhpcy5lbGVtZW50LnZhbCgpKX0pfSxfdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbjtlIT09IiImJihuPXRoaXMuX3BhcnNlKGUpLG4hPT1udWxsJiYodHx8KG49dGhpcy5fYWRqdXN0VmFsdWUobikpLGU9dGhpcy5fZm9ybWF0KG4pKSksdGhpcy5lbGVtZW50LnZhbChlKSx0aGlzLl9yZWZyZXNoKCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zcGlubmVyLWlucHV0IikucHJvcCgiZGlzYWJsZWQiLCExKS5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW1pbiIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVtYXgiKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbm93IiksdGhpcy51aVNwaW5uZXIucmVwbGFjZVdpdGgodGhpcy5lbGVtZW50KX0sc3RlcFVwOnQoZnVuY3Rpb24oZSl7dGhpcy5fc3RlcFVwKGUpfSksX3N0ZXBVcDpmdW5jdGlvbihlKXt0aGlzLl9zcGluKChlfHwxKSp0aGlzLm9wdGlvbnMuc3RlcCl9LHN0ZXBEb3duOnQoZnVuY3Rpb24oZSl7dGhpcy5fc3RlcERvd24oZSl9KSxfc3RlcERvd246ZnVuY3Rpb24oZSl7dGhpcy5fc3BpbigoZXx8MSkqLXRoaXMub3B0aW9ucy5zdGVwKX0scGFnZVVwOnQoZnVuY3Rpb24oZSl7dGhpcy5fc3RlcFVwKChlfHwxKSp0aGlzLm9wdGlvbnMucGFnZSl9KSxwYWdlRG93bjp0KGZ1bmN0aW9uKGUpe3RoaXMuX3N0ZXBEb3duKChlfHwxKSp0aGlzLm9wdGlvbnMucGFnZSl9KSx2YWx1ZTpmdW5jdGlvbihlKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fcGFyc2UodGhpcy5lbGVtZW50LnZhbCgpKTt0KHRoaXMuX3ZhbHVlKS5jYWxsKHRoaXMsZSl9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVpU3Bpbm5lcn19KX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gaSgpe3JldHVybisrbn1mdW5jdGlvbiBzKGUpe3JldHVybiBlLmhhc2gubGVuZ3RoPjEmJmUuaHJlZi5yZXBsYWNlKHIsIiIpPT09bG9jYXRpb24uaHJlZi5yZXBsYWNlKHIsIiIpLnJlcGxhY2UoL1xzL2csIiUyMCIpfXZhciBuPTAscj0vIy4qJC87ZS53aWRnZXQoInVpLnRhYnMiLHt2ZXJzaW9uOiIxLjkuMiIsZGVsYXk6MzAwLG9wdGlvbnM6e2FjdGl2ZTpudWxsLGNvbGxhcHNpYmxlOiExLGV2ZW50OiJjbGljayIsaGVpZ2h0U3R5bGU6ImNvbnRlbnQiLGhpZGU6bnVsbCxzaG93Om51bGwsYWN0aXZhdGU6bnVsbCxiZWZvcmVBY3RpdmF0ZTpudWxsLGJlZm9yZUxvYWQ6bnVsbCxsb2FkOm51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49dGhpcy5vcHRpb25zLHI9bi5hY3RpdmUsaT1sb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKTt0aGlzLnJ1bm5pbmc9ITEsdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS10YWJzIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikudG9nZ2xlQ2xhc3MoInVpLXRhYnMtY29sbGFwc2libGUiLG4uY29sbGFwc2libGUpLmRlbGVnYXRlKCIudWktdGFicy1uYXYgPiBsaSIsIm1vdXNlZG93biIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbih0KXtlKHRoaXMpLmlzKCIudWktc3RhdGUtZGlzYWJsZWQiKSYmdC5wcmV2ZW50RGVmYXVsdCgpfSkuZGVsZWdhdGUoIi51aS10YWJzLWFuY2hvciIsImZvY3VzIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7ZSh0aGlzKS5jbG9zZXN0KCJsaSIpLmlzKCIudWktc3RhdGUtZGlzYWJsZWQiKSYmdGhpcy5ibHVyKCl9KSx0aGlzLl9wcm9jZXNzVGFicygpO2lmKHI9PT1udWxsKXtpJiZ0aGlzLnRhYnMuZWFjaChmdW5jdGlvbih0LG4pe2lmKGUobikuYXR0cigiYXJpYS1jb250cm9scyIpPT09aSlyZXR1cm4gcj10LCExfSkscj09PW51bGwmJihyPXRoaXMudGFicy5pbmRleCh0aGlzLnRhYnMuZmlsdGVyKCIudWktdGFicy1hY3RpdmUiKSkpO2lmKHI9PT1udWxsfHxyPT09LTEpcj10aGlzLnRhYnMubGVuZ3RoPzA6ITF9ciE9PSExJiYocj10aGlzLnRhYnMuaW5kZXgodGhpcy50YWJzLmVxKHIpKSxyPT09LTEmJihyPW4uY29sbGFwc2libGU/ITE6MCkpLG4uYWN0aXZlPXIsIW4uY29sbGFwc2libGUmJm4uYWN0aXZlPT09ITEmJnRoaXMuYW5jaG9ycy5sZW5ndGgmJihuLmFjdGl2ZT0wKSxlLmlzQXJyYXkobi5kaXNhYmxlZCkmJihuLmRpc2FibGVkPWUudW5pcXVlKG4uZGlzYWJsZWQuY29uY2F0KGUubWFwKHRoaXMudGFicy5maWx0ZXIoIi51aS1zdGF0ZS1kaXNhYmxlZCIpLGZ1bmN0aW9uKGUpe3JldHVybiB0LnRhYnMuaW5kZXgoZSl9KSkpLnNvcnQoKSksdGhpcy5vcHRpb25zLmFjdGl2ZSE9PSExJiZ0aGlzLmFuY2hvcnMubGVuZ3RoP3RoaXMuYWN0aXZlPXRoaXMuX2ZpbmRBY3RpdmUodGhpcy5vcHRpb25zLmFjdGl2ZSk6dGhpcy5hY3RpdmU9ZSgpLHRoaXMuX3JlZnJlc2goKSx0aGlzLmFjdGl2ZS5sZW5ndGgmJnRoaXMubG9hZChuLmFjdGl2ZSl9LF9nZXRDcmVhdGVFdmVudERhdGE6ZnVuY3Rpb24oKXtyZXR1cm57dGFiOnRoaXMuYWN0aXZlLHBhbmVsOnRoaXMuYWN0aXZlLmxlbmd0aD90aGlzLl9nZXRQYW5lbEZvclRhYih0aGlzLmFjdGl2ZSk6ZSgpfX0sX3RhYktleWRvd246ZnVuY3Rpb24odCl7dmFyIG49ZSh0aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQpLmNsb3Nlc3QoImxpIikscj10aGlzLnRhYnMuaW5kZXgobiksaT0hMDtpZih0aGlzLl9oYW5kbGVQYWdlTmF2KHQpKXJldHVybjtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIGUudWkua2V5Q29kZS5SSUdIVDpjYXNlIGUudWkua2V5Q29kZS5ET1dOOnIrKzticmVhaztjYXNlIGUudWkua2V5Q29kZS5VUDpjYXNlIGUudWkua2V5Q29kZS5MRUZUOmk9ITEsci0tO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkVORDpyPXRoaXMuYW5jaG9ycy5sZW5ndGgtMTticmVhaztjYXNlIGUudWkua2V5Q29kZS5IT01FOnI9MDticmVhaztjYXNlIGUudWkua2V5Q29kZS5TUEFDRTp0LnByZXZlbnREZWZhdWx0KCksY2xlYXJUaW1lb3V0KHRoaXMuYWN0aXZhdGluZyksdGhpcy5fYWN0aXZhdGUocik7cmV0dXJuO2Nhc2UgZS51aS5rZXlDb2RlLkVOVEVSOnQucHJldmVudERlZmF1bHQoKSxjbGVhclRpbWVvdXQodGhpcy5hY3RpdmF0aW5nKSx0aGlzLl9hY3RpdmF0ZShyPT09dGhpcy5vcHRpb25zLmFjdGl2ZT8hMTpyKTtyZXR1cm47ZGVmYXVsdDpyZXR1cm59dC5wcmV2ZW50RGVmYXVsdCgpLGNsZWFyVGltZW91dCh0aGlzLmFjdGl2YXRpbmcpLHI9dGhpcy5fZm9jdXNOZXh0VGFiKHIsaSksdC5jdHJsS2V5fHwobi5hdHRyKCJhcmlhLXNlbGVjdGVkIiwiZmFsc2UiKSx0aGlzLnRhYnMuZXEocikuYXR0cigiYXJpYS1zZWxlY3RlZCIsInRydWUiKSx0aGlzLmFjdGl2YXRpbmc9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLm9wdGlvbigiYWN0aXZlIixyKX0sdGhpcy5kZWxheSkpfSxfcGFuZWxLZXlkb3duOmZ1bmN0aW9uKHQpe2lmKHRoaXMuX2hhbmRsZVBhZ2VOYXYodCkpcmV0dXJuO3QuY3RybEtleSYmdC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLlVQJiYodC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuYWN0aXZlLmZvY3VzKCkpfSxfaGFuZGxlUGFnZU5hdjpmdW5jdGlvbih0KXtpZih0LmFsdEtleSYmdC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLlBBR0VfVVApcmV0dXJuIHRoaXMuX2FjdGl2YXRlKHRoaXMuX2ZvY3VzTmV4dFRhYih0aGlzLm9wdGlvbnMuYWN0aXZlLTEsITEpKSwhMDtpZih0LmFsdEtleSYmdC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLlBBR0VfRE9XTilyZXR1cm4gdGhpcy5fYWN0aXZhdGUodGhpcy5fZm9jdXNOZXh0VGFiKHRoaXMub3B0aW9ucy5hY3RpdmUrMSwhMCkpLCEwfSxfZmluZE5leHRUYWI6ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBpKCl7cmV0dXJuIHQ+ciYmKHQ9MCksdDwwJiYodD1yKSx0fXZhciByPXRoaXMudGFicy5sZW5ndGgtMTt3aGlsZShlLmluQXJyYXkoaSgpLHRoaXMub3B0aW9ucy5kaXNhYmxlZCkhPT0tMSl0PW4/dCsxOnQtMTtyZXR1cm4gdH0sX2ZvY3VzTmV4dFRhYjpmdW5jdGlvbihlLHQpe3JldHVybiBlPXRoaXMuX2ZpbmROZXh0VGFiKGUsdCksdGhpcy50YWJzLmVxKGUpLmZvY3VzKCksZX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe2lmKGU9PT0iYWN0aXZlIil7dGhpcy5fYWN0aXZhdGUodCk7cmV0dXJufWlmKGU9PT0iZGlzYWJsZWQiKXt0aGlzLl9zZXR1cERpc2FibGVkKHQpO3JldHVybn10aGlzLl9zdXBlcihlLHQpLGU9PT0iY29sbGFwc2libGUiJiYodGhpcy5lbGVtZW50LnRvZ2dsZUNsYXNzKCJ1aS10YWJzLWNvbGxhcHNpYmxlIix0KSwhdCYmdGhpcy5vcHRpb25zLmFjdGl2ZT09PSExJiZ0aGlzLl9hY3RpdmF0ZSgwKSksZT09PSJldmVudCImJnRoaXMuX3NldHVwRXZlbnRzKHQpLGU9PT0iaGVpZ2h0U3R5bGUiJiZ0aGlzLl9zZXR1cEhlaWdodFN0eWxlKHQpfSxfdGFiSWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXR0cigiYXJpYS1jb250cm9scyIpfHwidWktdGFicy0iK2koKX0sX3Nhbml0aXplU2VsZWN0b3I6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/ZS5yZXBsYWNlKC9bISIkJSYnKCkqKywuXC86Ozw9Pj9AXFtcXVxeYHt8fX5dL2csIlxcJCYiKToiIn0scmVmcmVzaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucyxuPXRoaXMudGFibGlzdC5jaGlsZHJlbigiOmhhcyhhW2hyZWZdKSIpO3QuZGlzYWJsZWQ9ZS5tYXAobi5maWx0ZXIoIi51aS1zdGF0ZS1kaXNhYmxlZCIpLGZ1bmN0aW9uKGUpe3JldHVybiBuLmluZGV4KGUpfSksdGhpcy5fcHJvY2Vzc1RhYnMoKSx0LmFjdGl2ZT09PSExfHwhdGhpcy5hbmNob3JzLmxlbmd0aD8odC5hY3RpdmU9ITEsdGhpcy5hY3RpdmU9ZSgpKTp0aGlzLmFjdGl2ZS5sZW5ndGgmJiFlLmNvbnRhaW5zKHRoaXMudGFibGlzdFswXSx0aGlzLmFjdGl2ZVswXSk/dGhpcy50YWJzLmxlbmd0aD09PXQuZGlzYWJsZWQubGVuZ3RoPyh0LmFjdGl2ZT0hMSx0aGlzLmFjdGl2ZT1lKCkpOnRoaXMuX2FjdGl2YXRlKHRoaXMuX2ZpbmROZXh0VGFiKE1hdGgubWF4KDAsdC5hY3RpdmUtMSksITEpKTp0LmFjdGl2ZT10aGlzLnRhYnMuaW5kZXgodGhpcy5hY3RpdmUpLHRoaXMuX3JlZnJlc2goKX0sX3JlZnJlc2g6ZnVuY3Rpb24oKXt0aGlzLl9zZXR1cERpc2FibGVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCksdGhpcy5fc2V0dXBFdmVudHModGhpcy5vcHRpb25zLmV2ZW50KSx0aGlzLl9zZXR1cEhlaWdodFN0eWxlKHRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZSksdGhpcy50YWJzLm5vdCh0aGlzLmFjdGl2ZSkuYXR0cih7ImFyaWEtc2VsZWN0ZWQiOiJmYWxzZSIsdGFiSW5kZXg6LTF9KSx0aGlzLnBhbmVscy5ub3QodGhpcy5fZ2V0UGFuZWxGb3JUYWIodGhpcy5hY3RpdmUpKS5oaWRlKCkuYXR0cih7ImFyaWEtZXhwYW5kZWQiOiJmYWxzZSIsImFyaWEtaGlkZGVuIjoidHJ1ZSJ9KSx0aGlzLmFjdGl2ZS5sZW5ndGg/KHRoaXMuYWN0aXZlLmFkZENsYXNzKCJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6InRydWUiLHRhYkluZGV4OjB9KSx0aGlzLl9nZXRQYW5lbEZvclRhYih0aGlzLmFjdGl2ZSkuc2hvdygpLmF0dHIoeyJhcmlhLWV4cGFuZGVkIjoidHJ1ZSIsImFyaWEtaGlkZGVuIjoiZmFsc2UifSkpOnRoaXMudGFicy5lcSgwKS5hdHRyKCJ0YWJJbmRleCIsMCl9LF9wcm9jZXNzVGFiczpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy50YWJsaXN0PXRoaXMuX2dldExpc3QoKS5hZGRDbGFzcygidWktdGFicy1uYXYgdWktaGVscGVyLXJlc2V0IHVpLWhlbHBlci1jbGVhcmZpeCB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1hbGwiKS5hdHRyKCJyb2xlIiwidGFibGlzdCIpLHRoaXMudGFicz10aGlzLnRhYmxpc3QuZmluZCgiPiBsaTpoYXMoYVtocmVmXSkiKS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItdG9wIikuYXR0cih7cm9sZToidGFiIix0YWJJbmRleDotMX0pLHRoaXMuYW5jaG9ycz10aGlzLnRhYnMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGUoImEiLHRoaXMpWzBdfSkuYWRkQ2xhc3MoInVpLXRhYnMtYW5jaG9yIikuYXR0cih7cm9sZToicHJlc2VudGF0aW9uIix0YWJJbmRleDotMX0pLHRoaXMucGFuZWxzPWUoKSx0aGlzLmFuY2hvcnMuZWFjaChmdW5jdGlvbihuLHIpe3ZhciBpLG8sdSxhPWUocikudW5pcXVlSWQoKS5hdHRyKCJpZCIpLGY9ZShyKS5jbG9zZXN0KCJsaSIpLGw9Zi5hdHRyKCJhcmlhLWNvbnRyb2xzIik7cyhyKT8oaT1yLmhhc2gsbz10LmVsZW1lbnQuZmluZCh0Ll9zYW5pdGl6ZVNlbGVjdG9yKGkpKSk6KHU9dC5fdGFiSWQoZiksaT0iIyIrdSxvPXQuZWxlbWVudC5maW5kKGkpLG8ubGVuZ3RofHwobz10Ll9jcmVhdGVQYW5lbCh1KSxvLmluc2VydEFmdGVyKHQucGFuZWxzW24tMV18fHQudGFibGlzdCkpLG8uYXR0cigiYXJpYS1saXZlIiwicG9saXRlIikpLG8ubGVuZ3RoJiYodC5wYW5lbHM9dC5wYW5lbHMuYWRkKG8pKSxsJiZmLmRhdGEoInVpLXRhYnMtYXJpYS1jb250cm9scyIsbCksZi5hdHRyKHsiYXJpYS1jb250cm9scyI6aS5zdWJzdHJpbmcoMSksImFyaWEtbGFiZWxsZWRieSI6YX0pLG8uYXR0cigiYXJpYS1sYWJlbGxlZGJ5IixhKX0pLHRoaXMucGFuZWxzLmFkZENsYXNzKCJ1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iKS5hdHRyKCJyb2xlIiwidGFicGFuZWwiKX0sX2dldExpc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50LmZpbmQoIm9sLHVsIikuZXEoMCl9LF9jcmVhdGVQYW5lbDpmdW5jdGlvbih0KXtyZXR1cm4gZSgiPGRpdj4iKS5hdHRyKCJpZCIsdCkuYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpLmRhdGEoInVpLXRhYnMtZGVzdHJveSIsITApfSxfc2V0dXBEaXNhYmxlZDpmdW5jdGlvbih0KXtlLmlzQXJyYXkodCkmJih0Lmxlbmd0aD90Lmxlbmd0aD09PXRoaXMuYW5jaG9ycy5sZW5ndGgmJih0PSEwKTp0PSExKTtmb3IodmFyIG49MCxyO3I9dGhpcy50YWJzW25dO24rKyl0PT09ITB8fGUuaW5BcnJheShuLHQpIT09LTE/ZShyKS5hZGRDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKS5hdHRyKCJhcmlhLWRpc2FibGVkIiwidHJ1ZSIpOmUocikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIikucmVtb3ZlQXR0cigiYXJpYS1kaXNhYmxlZCIpO3RoaXMub3B0aW9ucy5kaXNhYmxlZD10fSxfc2V0dXBFdmVudHM6ZnVuY3Rpb24odCl7dmFyIG49e2NsaWNrOmZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKX19O3QmJmUuZWFjaCh0LnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtuW3RdPSJfZXZlbnRIYW5kbGVyIn0pLHRoaXMuX29mZih0aGlzLmFuY2hvcnMuYWRkKHRoaXMudGFicykuYWRkKHRoaXMucGFuZWxzKSksdGhpcy5fb24odGhpcy5hbmNob3JzLG4pLHRoaXMuX29uKHRoaXMudGFicyx7a2V5ZG93bjoiX3RhYktleWRvd24ifSksdGhpcy5fb24odGhpcy5wYW5lbHMse2tleWRvd246Il9wYW5lbEtleWRvd24ifSksdGhpcy5fZm9jdXNhYmxlKHRoaXMudGFicyksdGhpcy5faG92ZXJhYmxlKHRoaXMudGFicyl9LF9zZXR1cEhlaWdodFN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBuLHIsaT10aGlzLmVsZW1lbnQucGFyZW50KCk7dD09PSJmaWxsIj8oZS5zdXBwb3J0Lm1pbkhlaWdodHx8KHI9aS5jc3MoIm92ZXJmbG93IiksaS5jc3MoIm92ZXJmbG93IiwiaGlkZGVuIikpLG49aS5oZWlnaHQoKSx0aGlzLmVsZW1lbnQuc2libGluZ3MoIjp2aXNpYmxlIikuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcykscj10LmNzcygicG9zaXRpb24iKTtpZihyPT09ImFic29sdXRlInx8cj09PSJmaXhlZCIpcmV0dXJuO24tPXQub3V0ZXJIZWlnaHQoITApfSksciYmaS5jc3MoIm92ZXJmbG93IixyKSx0aGlzLmVsZW1lbnQuY2hpbGRyZW4oKS5ub3QodGhpcy5wYW5lbHMpLmVhY2goZnVuY3Rpb24oKXtuLT1lKHRoaXMpLm91dGVySGVpZ2h0KCEwKX0pLHRoaXMucGFuZWxzLmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLmhlaWdodChNYXRoLm1heCgwLG4tZSh0aGlzKS5pbm5lckhlaWdodCgpK2UodGhpcykuaGVpZ2h0KCkpKX0pLmNzcygib3ZlcmZsb3ciLCJhdXRvIikpOnQ9PT0iYXV0byImJihuPTAsdGhpcy5wYW5lbHMuZWFjaChmdW5jdGlvbigpe249TWF0aC5tYXgobixlKHRoaXMpLmhlaWdodCgiIikuaGVpZ2h0KCkpfSkuaGVpZ2h0KG4pKX0sX2V2ZW50SGFuZGxlcjpmdW5jdGlvbih0KXt2YXIgbj10aGlzLm9wdGlvbnMscj10aGlzLmFjdGl2ZSxpPWUodC5jdXJyZW50VGFyZ2V0KSxzPWkuY2xvc2VzdCgibGkiKSxvPXNbMF09PT1yWzBdLHU9byYmbi5jb2xsYXBzaWJsZSxhPXU/ZSgpOnRoaXMuX2dldFBhbmVsRm9yVGFiKHMpLGY9ci5sZW5ndGg/dGhpcy5fZ2V0UGFuZWxGb3JUYWIocik6ZSgpLGw9e29sZFRhYjpyLG9sZFBhbmVsOmYsbmV3VGFiOnU/ZSgpOnMsbmV3UGFuZWw6YX07dC5wcmV2ZW50RGVmYXVsdCgpO2lmKHMuaGFzQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIil8fHMuaGFzQ2xhc3MoInVpLXRhYnMtbG9hZGluZyIpfHx0aGlzLnJ1bm5pbmd8fG8mJiFuLmNvbGxhcHNpYmxlfHx0aGlzLl90cmlnZ2VyKCJiZWZvcmVBY3RpdmF0ZSIsdCxsKT09PSExKXJldHVybjtuLmFjdGl2ZT11PyExOnRoaXMudGFicy5pbmRleChzKSx0aGlzLmFjdGl2ZT1vP2UoKTpzLHRoaXMueGhyJiZ0aGlzLnhoci5hYm9ydCgpLCFmLmxlbmd0aCYmIWEubGVuZ3RoJiZlLmVycm9yKCJqUXVlcnkgVUkgVGFiczogTWlzbWF0Y2hpbmcgZnJhZ21lbnQgaWRlbnRpZmllci4iKSxhLmxlbmd0aCYmdGhpcy5sb2FkKHRoaXMudGFicy5pbmRleChzKSx0KSx0aGlzLl90b2dnbGUodCxsKX0sX3RvZ2dsZTpmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIG8oKXtyLnJ1bm5pbmc9ITEsci5fdHJpZ2dlcigiYWN0aXZhdGUiLHQsbil9ZnVuY3Rpb24gdSgpe24ubmV3VGFiLmNsb3Nlc3QoImxpIikuYWRkQ2xhc3MoInVpLXRhYnMtYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIpLGkubGVuZ3RoJiZyLm9wdGlvbnMuc2hvdz9yLl9zaG93KGksci5vcHRpb25zLnNob3csbyk6KGkuc2hvdygpLG8oKSl9dmFyIHI9dGhpcyxpPW4ubmV3UGFuZWwscz1uLm9sZFBhbmVsO3RoaXMucnVubmluZz0hMCxzLmxlbmd0aCYmdGhpcy5vcHRpb25zLmhpZGU/dGhpcy5faGlkZShzLHRoaXMub3B0aW9ucy5oaWRlLGZ1bmN0aW9uKCl7bi5vbGRUYWIuY2xvc2VzdCgibGkiKS5yZW1vdmVDbGFzcygidWktdGFicy1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIiksdSgpfSk6KG4ub2xkVGFiLmNsb3Nlc3QoImxpIikucmVtb3ZlQ2xhc3MoInVpLXRhYnMtYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIpLHMuaGlkZSgpLHUoKSkscy5hdHRyKHsiYXJpYS1leHBhbmRlZCI6ImZhbHNlIiwiYXJpYS1oaWRkZW4iOiJ0cnVlIn0pLG4ub2xkVGFiLmF0dHIoImFyaWEtc2VsZWN0ZWQiLCJmYWxzZSIpLGkubGVuZ3RoJiZzLmxlbmd0aD9uLm9sZFRhYi5hdHRyKCJ0YWJJbmRleCIsLTEpOmkubGVuZ3RoJiZ0aGlzLnRhYnMuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIGUodGhpcykuYXR0cigidGFiSW5kZXgiKT09PTB9KS5hdHRyKCJ0YWJJbmRleCIsLTEpLGkuYXR0cih7ImFyaWEtZXhwYW5kZWQiOiJ0cnVlIiwiYXJpYS1oaWRkZW4iOiJmYWxzZSJ9KSxuLm5ld1RhYi5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6InRydWUiLHRhYkluZGV4OjB9KX0sX2FjdGl2YXRlOmZ1bmN0aW9uKHQpe3ZhciBuLHI9dGhpcy5fZmluZEFjdGl2ZSh0KTtpZihyWzBdPT09dGhpcy5hY3RpdmVbMF0pcmV0dXJuO3IubGVuZ3RofHwocj10aGlzLmFjdGl2ZSksbj1yLmZpbmQoIi51aS10YWJzLWFuY2hvciIpWzBdLHRoaXMuX2V2ZW50SGFuZGxlcih7dGFyZ2V0Om4sY3VycmVudFRhcmdldDpuLHByZXZlbnREZWZhdWx0OmUubm9vcH0pfSxfZmluZEFjdGl2ZTpmdW5jdGlvbih0KXtyZXR1cm4gdD09PSExP2UoKTp0aGlzLnRhYnMuZXEodCl9LF9nZXRJbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmciJiYoZT10aGlzLmFuY2hvcnMuaW5kZXgodGhpcy5hbmNob3JzLmZpbHRlcigiW2hyZWYkPSciK2UrIiddIikpKSxlfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMueGhyJiZ0aGlzLnhoci5hYm9ydCgpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktdGFicyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCB1aS10YWJzLWNvbGxhcHNpYmxlIiksdGhpcy50YWJsaXN0LnJlbW92ZUNsYXNzKCJ1aS10YWJzLW5hdiB1aS1oZWxwZXItcmVzZXQgdWktaGVscGVyLWNsZWFyZml4IHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCIpLnJlbW92ZUF0dHIoInJvbGUiKSx0aGlzLmFuY2hvcnMucmVtb3ZlQ2xhc3MoInVpLXRhYnMtYW5jaG9yIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoInRhYkluZGV4IikucmVtb3ZlRGF0YSgiaHJlZi50YWJzIikucmVtb3ZlRGF0YSgibG9hZC50YWJzIikucmVtb3ZlVW5pcXVlSWQoKSx0aGlzLnRhYnMuYWRkKHRoaXMucGFuZWxzKS5lYWNoKGZ1bmN0aW9uKCl7ZS5kYXRhKHRoaXMsInVpLXRhYnMtZGVzdHJveSIpP2UodGhpcykucmVtb3ZlKCk6ZSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1zdGF0ZS1hY3RpdmUgdWktc3RhdGUtZGlzYWJsZWQgdWktY29ybmVyLXRvcCB1aS1jb3JuZXItYm90dG9tIHVpLXdpZGdldC1jb250ZW50IHVpLXRhYnMtYWN0aXZlIHVpLXRhYnMtcGFuZWwiKS5yZW1vdmVBdHRyKCJ0YWJJbmRleCIpLnJlbW92ZUF0dHIoImFyaWEtbGl2ZSIpLnJlbW92ZUF0dHIoImFyaWEtYnVzeSIpLnJlbW92ZUF0dHIoImFyaWEtc2VsZWN0ZWQiKS5yZW1vdmVBdHRyKCJhcmlhLWxhYmVsbGVkYnkiKS5yZW1vdmVBdHRyKCJhcmlhLWhpZGRlbiIpLnJlbW92ZUF0dHIoImFyaWEtZXhwYW5kZWQiKS5yZW1vdmVBdHRyKCJyb2xlIil9KSx0aGlzLnRhYnMuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcyksbj10LmRhdGEoInVpLXRhYnMtYXJpYS1jb250cm9scyIpO24/dC5hdHRyKCJhcmlhLWNvbnRyb2xzIixuKTp0LnJlbW92ZUF0dHIoImFyaWEtY29udHJvbHMiKX0pLHRoaXMucGFuZWxzLnNob3coKSx0aGlzLm9wdGlvbnMuaGVpZ2h0U3R5bGUhPT0iY29udGVudCImJnRoaXMucGFuZWxzLmNzcygiaGVpZ2h0IiwiIil9LGVuYWJsZTpmdW5jdGlvbihuKXt2YXIgcj10aGlzLm9wdGlvbnMuZGlzYWJsZWQ7aWYocj09PSExKXJldHVybjtuPT09dD9yPSExOihuPXRoaXMuX2dldEluZGV4KG4pLGUuaXNBcnJheShyKT9yPWUubWFwKHIsZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT1uP2U6bnVsbH0pOnI9ZS5tYXAodGhpcy50YWJzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQhPT1uP3Q6bnVsbH0pKSx0aGlzLl9zZXR1cERpc2FibGVkKHIpfSxkaXNhYmxlOmZ1bmN0aW9uKG4pe3ZhciByPXRoaXMub3B0aW9ucy5kaXNhYmxlZDtpZihyPT09ITApcmV0dXJuO2lmKG49PT10KXI9ITA7ZWxzZXtuPXRoaXMuX2dldEluZGV4KG4pO2lmKGUuaW5BcnJheShuLHIpIT09LTEpcmV0dXJuO2UuaXNBcnJheShyKT9yPWUubWVyZ2UoW25dLHIpLnNvcnQoKTpyPVtuXX10aGlzLl9zZXR1cERpc2FibGVkKHIpfSxsb2FkOmZ1bmN0aW9uKHQsbil7dD10aGlzLl9nZXRJbmRleCh0KTt2YXIgcj10aGlzLGk9dGhpcy50YWJzLmVxKHQpLG89aS5maW5kKCIudWktdGFicy1hbmNob3IiKSx1PXRoaXMuX2dldFBhbmVsRm9yVGFiKGkpLGE9e3RhYjppLHBhbmVsOnV9O2lmKHMob1swXSkpcmV0dXJuO3RoaXMueGhyPWUuYWpheCh0aGlzLl9hamF4U2V0dGluZ3MobyxuLGEpKSx0aGlzLnhociYmdGhpcy54aHIuc3RhdHVzVGV4dCE9PSJjYW5jZWxlZCImJihpLmFkZENsYXNzKCJ1aS10YWJzLWxvYWRpbmciKSx1LmF0dHIoImFyaWEtYnVzeSIsInRydWUiKSx0aGlzLnhoci5zdWNjZXNzKGZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt1Lmh0bWwoZSksci5fdHJpZ2dlcigibG9hZCIsbixhKX0sMSl9KS5jb21wbGV0ZShmdW5jdGlvbihlLHQpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0PT09ImFib3J0IiYmci5wYW5lbHMuc3RvcCghMSwhMCksaS5yZW1vdmVDbGFzcygidWktdGFicy1sb2FkaW5nIiksdS5yZW1vdmVBdHRyKCJhcmlhLWJ1c3kiKSxlPT09ci54aHImJmRlbGV0ZSByLnhocn0sMSl9KSl9LF9hamF4U2V0dGluZ3M6ZnVuY3Rpb24odCxuLHIpe3ZhciBpPXRoaXM7cmV0dXJue3VybDp0LmF0dHIoImhyZWYiKSxiZWZvcmVTZW5kOmZ1bmN0aW9uKHQscyl7cmV0dXJuIGkuX3RyaWdnZXIoImJlZm9yZUxvYWQiLG4sZS5leHRlbmQoe2pxWEhSOnQsYWpheFNldHRpbmdzOnN9LHIpKX19fSxfZ2V0UGFuZWxGb3JUYWI6ZnVuY3Rpb24odCl7dmFyIG49ZSh0KS5hdHRyKCJhcmlhLWNvbnRyb2xzIik7cmV0dXJuIHRoaXMuZWxlbWVudC5maW5kKHRoaXMuX3Nhbml0aXplU2VsZWN0b3IoIiMiK24pKX19KSxlLnVpQmFja0NvbXBhdCE9PSExJiYoZS51aS50YWJzLnByb3RvdHlwZS5fdWk9ZnVuY3Rpb24oZSx0KXtyZXR1cm57dGFiOmUscGFuZWw6dCxpbmRleDp0aGlzLmFuY2hvcnMuaW5kZXgoZSl9fSxlLndpZGdldCgidWkudGFicyIsZS51aS50YWJzLHt1cmw6ZnVuY3Rpb24oZSx0KXt0aGlzLmFuY2hvcnMuZXEoZSkuYXR0cigiaHJlZiIsdCl9fSksZS53aWRnZXQoInVpLnRhYnMiLGUudWkudGFicyx7b3B0aW9uczp7YWpheE9wdGlvbnM6bnVsbCxjYWNoZTohMX0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuX3N1cGVyKCk7dmFyIHQ9dGhpczt0aGlzLl9vbih7dGFic2JlZm9yZWxvYWQ6ZnVuY3Rpb24obixyKXtpZihlLmRhdGEoci50YWJbMF0sImNhY2hlLnRhYnMiKSl7bi5wcmV2ZW50RGVmYXVsdCgpO3JldHVybn1yLmpxWEhSLnN1Y2Nlc3MoZnVuY3Rpb24oKXt0Lm9wdGlvbnMuY2FjaGUmJmUuZGF0YShyLnRhYlswXSwiY2FjaGUudGFicyIsITApfSl9fSl9LF9hamF4U2V0dGluZ3M6ZnVuY3Rpb24odCxuLHIpe3ZhciBpPXRoaXMub3B0aW9ucy5hamF4T3B0aW9ucztyZXR1cm4gZS5leHRlbmQoe30saSx7ZXJyb3I6ZnVuY3Rpb24oZSx0KXt0cnl7aS5lcnJvcihlLHQsci50YWIuY2xvc2VzdCgibGkiKS5pbmRleCgpLHIudGFiWzBdKX1jYXRjaChuKXt9fX0sdGhpcy5fc3VwZXJBcHBseShhcmd1bWVudHMpKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe2U9PT0iY2FjaGUiJiZ0PT09ITEmJnRoaXMuYW5jaG9ycy5yZW1vdmVEYXRhKCJjYWNoZS50YWJzIiksdGhpcy5fc3VwZXIoZSx0KX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmFuY2hvcnMucmVtb3ZlRGF0YSgiY2FjaGUudGFicyIpLHRoaXMuX3N1cGVyKCl9LHVybDpmdW5jdGlvbihlKXt0aGlzLmFuY2hvcnMuZXEoZSkucmVtb3ZlRGF0YSgiY2FjaGUudGFicyIpLHRoaXMuX3N1cGVyQXBwbHkoYXJndW1lbnRzKX19KSxlLndpZGdldCgidWkudGFicyIsZS51aS50YWJzLHthYm9ydDpmdW5jdGlvbigpe3RoaXMueGhyJiZ0aGlzLnhoci5hYm9ydCgpfX0pLGUud2lkZ2V0KCJ1aS50YWJzIixlLnVpLnRhYnMse29wdGlvbnM6e3NwaW5uZXI6IjxlbT5Mb2FkaW5nJiM4MjMwOzwvZW0+In0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuX3N1cGVyKCksdGhpcy5fb24oe3RhYnNiZWZvcmVsb2FkOmZ1bmN0aW9uKGUsdCl7aWYoZS50YXJnZXQhPT10aGlzLmVsZW1lbnRbMF18fCF0aGlzLm9wdGlvbnMuc3Bpbm5lcilyZXR1cm47dmFyIG49dC50YWIuZmluZCgic3BhbiIpLHI9bi5odG1sKCk7bi5odG1sKHRoaXMub3B0aW9ucy5zcGlubmVyKSx0LmpxWEhSLmNvbXBsZXRlKGZ1bmN0aW9uKCl7bi5odG1sKHIpfSl9fSl9fSksZS53aWRnZXQoInVpLnRhYnMiLGUudWkudGFicyx7b3B0aW9uczp7ZW5hYmxlOm51bGwsZGlzYWJsZTpudWxsfSxlbmFibGU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5vcHRpb25zLHI7aWYodCYmbi5kaXNhYmxlZD09PSEwfHxlLmlzQXJyYXkobi5kaXNhYmxlZCkmJmUuaW5BcnJheSh0LG4uZGlzYWJsZWQpIT09LTEpcj0hMDt0aGlzLl9zdXBlckFwcGx5KGFyZ3VtZW50cyksciYmdGhpcy5fdHJpZ2dlcigiZW5hYmxlIixudWxsLHRoaXMuX3VpKHRoaXMuYW5jaG9yc1t0XSx0aGlzLnBhbmVsc1t0XSkpfSxkaXNhYmxlOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMub3B0aW9ucyxyO2lmKHQmJm4uZGlzYWJsZWQ9PT0hMXx8ZS5pc0FycmF5KG4uZGlzYWJsZWQpJiZlLmluQXJyYXkodCxuLmRpc2FibGVkKT09PS0xKXI9ITA7dGhpcy5fc3VwZXJBcHBseShhcmd1bWVudHMpLHImJnRoaXMuX3RyaWdnZXIoImRpc2FibGUiLG51bGwsdGhpcy5fdWkodGhpcy5hbmNob3JzW3RdLHRoaXMucGFuZWxzW3RdKSl9fSksZS53aWRnZXQoInVpLnRhYnMiLGUudWkudGFicyx7b3B0aW9uczp7YWRkOm51bGwscmVtb3ZlOm51bGwsdGFiVGVtcGxhdGU6IjxsaT48YSBocmVmPScje2hyZWZ9Jz48c3Bhbj4je2xhYmVsfTwvc3Bhbj48L2E+PC9saT4ifSxhZGQ6ZnVuY3Rpb24obixyLGkpe2k9PT10JiYoaT10aGlzLmFuY2hvcnMubGVuZ3RoKTt2YXIgcyxvLHU9dGhpcy5vcHRpb25zLGE9ZSh1LnRhYlRlbXBsYXRlLnJlcGxhY2UoLyNce2hyZWZcfS9nLG4pLnJlcGxhY2UoLyNce2xhYmVsXH0vZyxyKSksZj1uLmluZGV4T2YoIiMiKT90aGlzLl90YWJJZChhKTpuLnJlcGxhY2UoIiMiLCIiKTtyZXR1cm4gYS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItdG9wIikuZGF0YSgidWktdGFicy1kZXN0cm95IiwhMCksYS5hdHRyKCJhcmlhLWNvbnRyb2xzIixmKSxzPWk+PXRoaXMudGFicy5sZW5ndGgsbz10aGlzLmVsZW1lbnQuZmluZCgiIyIrZiksby5sZW5ndGh8fChvPXRoaXMuX2NyZWF0ZVBhbmVsKGYpLHM/aT4wP28uaW5zZXJ0QWZ0ZXIodGhpcy5wYW5lbHMuZXEoLTEpKTpvLmFwcGVuZFRvKHRoaXMuZWxlbWVudCk6by5pbnNlcnRCZWZvcmUodGhpcy5wYW5lbHNbaV0pKSxvLmFkZENsYXNzKCJ1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iKS5oaWRlKCkscz9hLmFwcGVuZFRvKHRoaXMudGFibGlzdCk6YS5pbnNlcnRCZWZvcmUodGhpcy50YWJzW2ldKSx1LmRpc2FibGVkPWUubWFwKHUuZGlzYWJsZWQsZnVuY3Rpb24oZSl7cmV0dXJuIGU+PWk/KytlOmV9KSx0aGlzLnJlZnJlc2goKSx0aGlzLnRhYnMubGVuZ3RoPT09MSYmdS5hY3RpdmU9PT0hMSYmdGhpcy5vcHRpb24oImFjdGl2ZSIsMCksdGhpcy5fdHJpZ2dlcigiYWRkIixudWxsLHRoaXMuX3VpKHRoaXMuYW5jaG9yc1tpXSx0aGlzLnBhbmVsc1tpXSkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbih0KXt0PXRoaXMuX2dldEluZGV4KHQpO3ZhciBuPXRoaXMub3B0aW9ucyxyPXRoaXMudGFicy5lcSh0KS5yZW1vdmUoKSxpPXRoaXMuX2dldFBhbmVsRm9yVGFiKHIpLnJlbW92ZSgpO3JldHVybiByLmhhc0NsYXNzKCJ1aS10YWJzLWFjdGl2ZSIpJiZ0aGlzLmFuY2hvcnMubGVuZ3RoPjImJnRoaXMuX2FjdGl2YXRlKHQrKHQrMTx0aGlzLmFuY2hvcnMubGVuZ3RoPzE6LTEpKSxuLmRpc2FibGVkPWUubWFwKGUuZ3JlcChuLmRpc2FibGVkLGZ1bmN0aW9uKGUpe3JldHVybiBlIT09dH0pLGZ1bmN0aW9uKGUpe3JldHVybiBlPj10Py0tZTplfSksdGhpcy5yZWZyZXNoKCksdGhpcy5fdHJpZ2dlcigicmVtb3ZlIixudWxsLHRoaXMuX3VpKHIuZmluZCgiYSIpWzBdLGlbMF0pKSx0aGlzfX0pLGUud2lkZ2V0KCJ1aS50YWJzIixlLnVpLnRhYnMse2xlbmd0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFuY2hvcnMubGVuZ3RofX0pLGUud2lkZ2V0KCJ1aS50YWJzIixlLnVpLnRhYnMse29wdGlvbnM6e2lkUHJlZml4OiJ1aS10YWJzLSJ9LF90YWJJZDpmdW5jdGlvbih0KXt2YXIgbj10LmlzKCJsaSIpP3QuZmluZCgiYVtocmVmXSIpOnQ7cmV0dXJuIG49blswXSxlKG4pLmNsb3Nlc3QoImxpIikuYXR0cigiYXJpYS1jb250cm9scyIpfHxuLnRpdGxlJiZuLnRpdGxlLnJlcGxhY2UoL1xzL2csIl8iKS5yZXBsYWNlKC9bXlx3XHUwMGMwLVx1RkZGRlwtXS9nLCIiKXx8dGhpcy5vcHRpb25zLmlkUHJlZml4K2koKX19KSxlLndpZGdldCgidWkudGFicyIsZS51aS50YWJzLHtvcHRpb25zOntwYW5lbFRlbXBsYXRlOiI8ZGl2PjwvZGl2PiJ9LF9jcmVhdGVQYW5lbDpmdW5jdGlvbih0KXtyZXR1cm4gZSh0aGlzLm9wdGlvbnMucGFuZWxUZW1wbGF0ZSkuYXR0cigiaWQiLHQpLmFkZENsYXNzKCJ1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iKS5kYXRhKCJ1aS10YWJzLWRlc3Ryb3kiLCEwKX19KSxlLndpZGdldCgidWkudGFicyIsZS51aS50YWJzLHtfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zO2UuYWN0aXZlPT09bnVsbCYmZS5zZWxlY3RlZCE9PXQmJihlLmFjdGl2ZT1lLnNlbGVjdGVkPT09LTE/ITE6ZS5zZWxlY3RlZCksdGhpcy5fc3VwZXIoKSxlLnNlbGVjdGVkPWUuYWN0aXZlLGUuc2VsZWN0ZWQ9PT0hMSYmKGUuc2VsZWN0ZWQ9LTEpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7aWYoZSE9PSJzZWxlY3RlZCIpcmV0dXJuIHRoaXMuX3N1cGVyKGUsdCk7dmFyIG49dGhpcy5vcHRpb25zO3RoaXMuX3N1cGVyKCJhY3RpdmUiLHQ9PT0tMT8hMTp0KSxuLnNlbGVjdGVkPW4uYWN0aXZlLG4uc2VsZWN0ZWQ9PT0hMSYmKG4uc2VsZWN0ZWQ9LTEpfSxfZXZlbnRIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc3VwZXJBcHBseShhcmd1bWVudHMpLHRoaXMub3B0aW9ucy5zZWxlY3RlZD10aGlzLm9wdGlvbnMuYWN0aXZlLHRoaXMub3B0aW9ucy5zZWxlY3RlZD09PSExJiYodGhpcy5vcHRpb25zLnNlbGVjdGVkPS0xKX19KSxlLndpZGdldCgidWkudGFicyIsZS51aS50YWJzLHtvcHRpb25zOntzaG93Om51bGwsc2VsZWN0Om51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLl9zdXBlcigpLHRoaXMub3B0aW9ucy5hY3RpdmUhPT0hMSYmdGhpcy5fdHJpZ2dlcigic2hvdyIsbnVsbCx0aGlzLl91aSh0aGlzLmFjdGl2ZS5maW5kKCIudWktdGFicy1hbmNob3IiKVswXSx0aGlzLl9nZXRQYW5lbEZvclRhYih0aGlzLmFjdGl2ZSlbMF0pKX0sX3RyaWdnZXI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGkscz10aGlzLl9zdXBlckFwcGx5KGFyZ3VtZW50cyk7cmV0dXJuIHM/KGU9PT0iYmVmb3JlQWN0aXZhdGUiPyhyPW4ubmV3VGFiLmxlbmd0aD9uLm5ld1RhYjpuLm9sZFRhYixpPW4ubmV3UGFuZWwubGVuZ3RoP24ubmV3UGFuZWw6bi5vbGRQYW5lbCxzPXRoaXMuX3N1cGVyKCJzZWxlY3QiLHQse3RhYjpyLmZpbmQoIi51aS10YWJzLWFuY2hvciIpWzBdLHBhbmVsOmlbMF0saW5kZXg6ci5jbG9zZXN0KCJsaSIpLmluZGV4KCl9KSk6ZT09PSJhY3RpdmF0ZSImJm4ubmV3VGFiLmxlbmd0aCYmKHM9dGhpcy5fc3VwZXIoInNob3ciLHQse3RhYjpuLm5ld1RhYi5maW5kKCIudWktdGFicy1hbmNob3IiKVswXSxwYW5lbDpuLm5ld1BhbmVsWzBdLGluZGV4Om4ubmV3VGFiLmNsb3Nlc3QoImxpIikuaW5kZXgoKX0pKSxzKTohMX19KSxlLndpZGdldCgidWkudGFicyIsZS51aS50YWJzLHtzZWxlY3Q6ZnVuY3Rpb24oZSl7ZT10aGlzLl9nZXRJbmRleChlKTtpZihlPT09LTEpe2lmKCF0aGlzLm9wdGlvbnMuY29sbGFwc2libGV8fHRoaXMub3B0aW9ucy5zZWxlY3RlZD09PS0xKXJldHVybjtlPXRoaXMub3B0aW9ucy5zZWxlY3RlZH10aGlzLmFuY2hvcnMuZXEoZSkudHJpZ2dlcih0aGlzLm9wdGlvbnMuZXZlbnQrdGhpcy5ldmVudE5hbWVzcGFjZSl9fSksZnVuY3Rpb24oKXt2YXIgdD0wO2Uud2lkZ2V0KCJ1aS50YWJzIixlLnVpLnRhYnMse29wdGlvbnM6e2Nvb2tpZTpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zLHQ7ZS5hY3RpdmU9PW51bGwmJmUuY29va2llJiYodD1wYXJzZUludCh0aGlzLl9jb29raWUoKSwxMCksdD09PS0xJiYodD0hMSksZS5hY3RpdmU9dCksdGhpcy5fc3VwZXIoKX0sX2Nvb2tpZTpmdW5jdGlvbihuKXt2YXIgcj1bdGhpcy5jb29raWV8fCh0aGlzLmNvb2tpZT10aGlzLm9wdGlvbnMuY29va2llLm5hbWV8fCJ1aS10YWJzLSIrICsrdCldO3JldHVybiBhcmd1bWVudHMubGVuZ3RoJiYoci5wdXNoKG49PT0hMT8tMTpuKSxyLnB1c2godGhpcy5vcHRpb25zLmNvb2tpZSkpLGUuY29va2llLmFwcGx5KG51bGwscil9LF9yZWZyZXNoOmZ1bmN0aW9uKCl7dGhpcy5fc3VwZXIoKSx0aGlzLm9wdGlvbnMuY29va2llJiZ0aGlzLl9jb29raWUodGhpcy5vcHRpb25zLmFjdGl2ZSx0aGlzLm9wdGlvbnMuY29va2llKX0sX2V2ZW50SGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuX3N1cGVyQXBwbHkoYXJndW1lbnRzKSx0aGlzLm9wdGlvbnMuY29va2llJiZ0aGlzLl9jb29raWUodGhpcy5vcHRpb25zLmFjdGl2ZSx0aGlzLm9wdGlvbnMuY29va2llKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9zdXBlcigpLHRoaXMub3B0aW9ucy5jb29raWUmJnRoaXMuX2Nvb2tpZShudWxsLHRoaXMub3B0aW9ucy5jb29raWUpfX0pfSgpLGUud2lkZ2V0KCJ1aS50YWJzIixlLnVpLnRhYnMse190cmlnZ2VyOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT1lLmV4dGVuZCh7fSxyKTtyZXR1cm4gdD09PSJsb2FkIiYmKGkucGFuZWw9aS5wYW5lbFswXSxpLnRhYj1pLnRhYi5maW5kKCIudWktdGFicy1hbmNob3IiKVswXSksdGhpcy5fc3VwZXIodCxuLGkpfX0pLGUud2lkZ2V0KCJ1aS50YWJzIixlLnVpLnRhYnMse29wdGlvbnM6e2Z4Om51bGx9LF9nZXRGeDpmdW5jdGlvbigpe3ZhciB0LG4scj10aGlzLm9wdGlvbnMuZng7cmV0dXJuIHImJihlLmlzQXJyYXkocik/KHQ9clswXSxuPXJbMV0pOnQ9bj1yKSxyP3tzaG93Om4saGlkZTp0fTpudWxsfSxfdG9nZ2xlOmZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbygpe24ucnVubmluZz0hMSxuLl90cmlnZ2VyKCJhY3RpdmF0ZSIsZSx0KX1mdW5jdGlvbiB1KCl7dC5uZXdUYWIuY2xvc2VzdCgibGkiKS5hZGRDbGFzcygidWktdGFicy1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIiksci5sZW5ndGgmJnMuc2hvdz9yLmFuaW1hdGUocy5zaG93LHMuc2hvdy5kdXJhdGlvbixmdW5jdGlvbigpe28oKX0pOihyLnNob3coKSxvKCkpfXZhciBuPXRoaXMscj10Lm5ld1BhbmVsLGk9dC5vbGRQYW5lbCxzPXRoaXMuX2dldEZ4KCk7aWYoIXMpcmV0dXJuIHRoaXMuX3N1cGVyKGUsdCk7bi5ydW5uaW5nPSEwLGkubGVuZ3RoJiZzLmhpZGU/aS5hbmltYXRlKHMuaGlkZSxzLmhpZGUuZHVyYXRpb24sZnVuY3Rpb24oKXt0Lm9sZFRhYi5jbG9zZXN0KCJsaSIpLnJlbW92ZUNsYXNzKCJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiKSx1KCl9KToodC5vbGRUYWIuY2xvc2VzdCgibGkiKS5yZW1vdmVDbGFzcygidWktdGFicy1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIiksaS5oaWRlKCksdSgpKX19KSl9KShqUXVlcnkpOyhmdW5jdGlvbihlKXtmdW5jdGlvbiBuKHQsbil7dmFyIHI9KHQuYXR0cigiYXJpYS1kZXNjcmliZWRieSIpfHwiIikuc3BsaXQoL1xzKy8pO3IucHVzaChuKSx0LmRhdGEoInVpLXRvb2x0aXAtaWQiLG4pLmF0dHIoImFyaWEtZGVzY3JpYmVkYnkiLGUudHJpbShyLmpvaW4oIiAiKSkpfWZ1bmN0aW9uIHIodCl7dmFyIG49dC5kYXRhKCJ1aS10b29sdGlwLWlkIikscj0odC5hdHRyKCJhcmlhLWRlc2NyaWJlZGJ5Iil8fCIiKS5zcGxpdCgvXHMrLyksaT1lLmluQXJyYXkobixyKTtpIT09LTEmJnIuc3BsaWNlKGksMSksdC5yZW1vdmVEYXRhKCJ1aS10b29sdGlwLWlkIikscj1lLnRyaW0oci5qb2luKCIgIikpLHI/dC5hdHRyKCJhcmlhLWRlc2NyaWJlZGJ5IixyKTp0LnJlbW92ZUF0dHIoImFyaWEtZGVzY3JpYmVkYnkiKX12YXIgdD0wO2Uud2lkZ2V0KCJ1aS50b29sdGlwIix7dmVyc2lvbjoiMS45LjIiLG9wdGlvbnM6e2NvbnRlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzKS5hdHRyKCJ0aXRsZSIpfSxoaWRlOiEwLGl0ZW1zOiJbdGl0bGVdOm5vdChbZGlzYWJsZWRdKSIscG9zaXRpb246e215OiJsZWZ0IHRvcCsxNSIsYXQ6ImxlZnQgYm90dG9tIixjb2xsaXNpb246ImZsaXBmaXQgZmxpcCJ9LHNob3c6ITAsdG9vbHRpcENsYXNzOm51bGwsdHJhY2s6ITEsY2xvc2U6bnVsbCxvcGVuOm51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLl9vbih7bW91c2VvdmVyOiJvcGVuIixmb2N1c2luOiJvcGVuIn0pLHRoaXMudG9vbHRpcHM9e30sdGhpcy5wYXJlbnRzPXt9LHRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5fZGlzYWJsZSgpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztpZih0PT09ImRpc2FibGVkIil7dGhpc1tuPyJfZGlzYWJsZSI6Il9lbmFibGUiXSgpLHRoaXMub3B0aW9uc1t0XT1uO3JldHVybn10aGlzLl9zdXBlcih0LG4pLHQ9PT0iY29udGVudCImJmUuZWFjaCh0aGlzLnRvb2x0aXBzLGZ1bmN0aW9uKGUsdCl7ci5fdXBkYXRlQ29udGVudCh0KX0pfSxfZGlzYWJsZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7ZS5lYWNoKHRoaXMudG9vbHRpcHMsZnVuY3Rpb24obixyKXt2YXIgaT1lLkV2ZW50KCJibHVyIik7aS50YXJnZXQ9aS5jdXJyZW50VGFyZ2V0PXJbMF0sdC5jbG9zZShpLCEwKX0pLHRoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcykuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3QuaXMoIlt0aXRsZV0iKSYmdC5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIix0LmF0dHIoInRpdGxlIikpLmF0dHIoInRpdGxlIiwiIil9KX0sX2VuYWJsZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcykuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3QuZGF0YSgidWktdG9vbHRpcC10aXRsZSIpJiZ0LmF0dHIoInRpdGxlIix0LmRhdGEoInVpLXRvb2x0aXAtdGl0bGUiKSl9KX0sb3BlbjpmdW5jdGlvbih0KXt2YXIgbj10aGlzLHI9ZSh0P3QudGFyZ2V0OnRoaXMuZWxlbWVudCkuY2xvc2VzdCh0aGlzLm9wdGlvbnMuaXRlbXMpO2lmKCFyLmxlbmd0aHx8ci5kYXRhKCJ1aS10b29sdGlwLWlkIikpcmV0dXJuO3IuYXR0cigidGl0bGUiKSYmci5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIixyLmF0dHIoInRpdGxlIikpLHIuZGF0YSgidWktdG9vbHRpcC1vcGVuIiwhMCksdCYmdC50eXBlPT09Im1vdXNlb3ZlciImJnIucGFyZW50cygpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLHI7dC5kYXRhKCJ1aS10b29sdGlwLW9wZW4iKSYmKHI9ZS5FdmVudCgiYmx1ciIpLHIudGFyZ2V0PXIuY3VycmVudFRhcmdldD10aGlzLG4uY2xvc2UociwhMCkpLHQuYXR0cigidGl0bGUiKSYmKHQudW5pcXVlSWQoKSxuLnBhcmVudHNbdGhpcy5pZF09e2VsZW1lbnQ6dGhpcyx0aXRsZTp0LmF0dHIoInRpdGxlIil9LHQuYXR0cigidGl0bGUiLCIiKSl9KSx0aGlzLl91cGRhdGVDb250ZW50KHIsdCl9LF91cGRhdGVDb250ZW50OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzLm9wdGlvbnMuY29udGVudCxpPXRoaXMscz10P3QudHlwZTpudWxsO2lmKHR5cGVvZiByPT0ic3RyaW5nIilyZXR1cm4gdGhpcy5fb3Blbih0LGUscik7bj1yLmNhbGwoZVswXSxmdW5jdGlvbihuKXtpZighZS5kYXRhKCJ1aS10b29sdGlwLW9wZW4iKSlyZXR1cm47aS5fZGVsYXkoZnVuY3Rpb24oKXt0JiYodC50eXBlPXMpLHRoaXMuX29wZW4odCxlLG4pfSl9KSxuJiZ0aGlzLl9vcGVuKHQsZSxuKX0sX29wZW46ZnVuY3Rpb24odCxyLGkpe2Z1bmN0aW9uIGYoZSl7YS5vZj1lO2lmKHMuaXMoIjpoaWRkZW4iKSlyZXR1cm47cy5wb3NpdGlvbihhKX12YXIgcyxvLHUsYT1lLmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMucG9zaXRpb24pO2lmKCFpKXJldHVybjtzPXRoaXMuX2ZpbmQocik7aWYocy5sZW5ndGgpe3MuZmluZCgiLnVpLXRvb2x0aXAtY29udGVudCIpLmh0bWwoaSk7cmV0dXJufXIuaXMoIlt0aXRsZV0iKSYmKHQmJnQudHlwZT09PSJtb3VzZW92ZXIiP3IuYXR0cigidGl0bGUiLCIiKTpyLnJlbW92ZUF0dHIoInRpdGxlIikpLHM9dGhpcy5fdG9vbHRpcChyKSxuKHIscy5hdHRyKCJpZCIpKSxzLmZpbmQoIi51aS10b29sdGlwLWNvbnRlbnQiKS5odG1sKGkpLHRoaXMub3B0aW9ucy50cmFjayYmdCYmL15tb3VzZS8udGVzdCh0LnR5cGUpPyh0aGlzLl9vbih0aGlzLmRvY3VtZW50LHttb3VzZW1vdmU6Zn0pLGYodCkpOnMucG9zaXRpb24oZS5leHRlbmQoe29mOnJ9LHRoaXMub3B0aW9ucy5wb3NpdGlvbikpLHMuaGlkZSgpLHRoaXMuX3Nob3cocyx0aGlzLm9wdGlvbnMuc2hvdyksdGhpcy5vcHRpb25zLnNob3cmJnRoaXMub3B0aW9ucy5zaG93LmRlbGF5JiYodT1zZXRJbnRlcnZhbChmdW5jdGlvbigpe3MuaXMoIjp2aXNpYmxlIikmJihmKGEub2YpLGNsZWFySW50ZXJ2YWwodSkpfSxlLmZ4LmludGVydmFsKSksdGhpcy5fdHJpZ2dlcigib3BlbiIsdCx7dG9vbHRpcDpzfSksbz17a2V5dXA6ZnVuY3Rpb24odCl7aWYodC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLkVTQ0FQRSl7dmFyIG49ZS5FdmVudCh0KTtuLmN1cnJlbnRUYXJnZXQ9clswXSx0aGlzLmNsb3NlKG4sITApfX0scmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlVG9vbHRpcChzKX19O2lmKCF0fHx0LnR5cGU9PT0ibW91c2VvdmVyIilvLm1vdXNlbGVhdmU9ImNsb3NlIjtpZighdHx8dC50eXBlPT09ImZvY3VzaW4iKW8uZm9jdXNvdXQ9ImNsb3NlIjt0aGlzLl9vbighMCxyLG8pfSxjbG9zZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLGk9ZSh0P3QuY3VycmVudFRhcmdldDp0aGlzLmVsZW1lbnQpLHM9dGhpcy5fZmluZChpKTtpZih0aGlzLmNsb3NpbmcpcmV0dXJuO2kuZGF0YSgidWktdG9vbHRpcC10aXRsZSIpJiZpLmF0dHIoInRpdGxlIixpLmRhdGEoInVpLXRvb2x0aXAtdGl0bGUiKSkscihpKSxzLnN0b3AoITApLHRoaXMuX2hpZGUocyx0aGlzLm9wdGlvbnMuaGlkZSxmdW5jdGlvbigpe24uX3JlbW92ZVRvb2x0aXAoZSh0aGlzKSl9KSxpLnJlbW92ZURhdGEoInVpLXRvb2x0aXAtb3BlbiIpLHRoaXMuX29mZihpLCJtb3VzZWxlYXZlIGZvY3Vzb3V0IGtleXVwIiksaVswXSE9PXRoaXMuZWxlbWVudFswXSYmdGhpcy5fb2ZmKGksInJlbW92ZSIpLHRoaXMuX29mZih0aGlzLmRvY3VtZW50LCJtb3VzZW1vdmUiKSx0JiZ0LnR5cGU9PT0ibW91c2VsZWF2ZSImJmUuZWFjaCh0aGlzLnBhcmVudHMsZnVuY3Rpb24odCxyKXtlKHIuZWxlbWVudCkuYXR0cigidGl0bGUiLHIudGl0bGUpLGRlbGV0ZSBuLnBhcmVudHNbdF19KSx0aGlzLmNsb3Npbmc9ITAsdGhpcy5fdHJpZ2dlcigiY2xvc2UiLHQse3Rvb2x0aXA6c30pLHRoaXMuY2xvc2luZz0hMX0sX3Rvb2x0aXA6ZnVuY3Rpb24obil7dmFyIHI9InVpLXRvb2x0aXAtIit0KyssaT1lKCI8ZGl2PiIpLmF0dHIoe2lkOnIscm9sZToidG9vbHRpcCJ9KS5hZGRDbGFzcygidWktdG9vbHRpcCB1aS13aWRnZXQgdWktY29ybmVyLWFsbCB1aS13aWRnZXQtY29udGVudCAiKyh0aGlzLm9wdGlvbnMudG9vbHRpcENsYXNzfHwiIikpO3JldHVybiBlKCI8ZGl2PiIpLmFkZENsYXNzKCJ1aS10b29sdGlwLWNvbnRlbnQiKS5hcHBlbmRUbyhpKSxpLmFwcGVuZFRvKHRoaXMuZG9jdW1lbnRbMF0uYm9keSksZS5mbi5iZ2lmcmFtZSYmaS5iZ2lmcmFtZSgpLHRoaXMudG9vbHRpcHNbcl09bixpfSxfZmluZDpmdW5jdGlvbih0KXt2YXIgbj10LmRhdGEoInVpLXRvb2x0aXAtaWQiKTtyZXR1cm4gbj9lKCIjIituKTplKCl9LF9yZW1vdmVUb29sdGlwOmZ1bmN0aW9uKGUpe2UucmVtb3ZlKCksZGVsZXRlIHRoaXMudG9vbHRpcHNbZS5hdHRyKCJpZCIpXX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2UuZWFjaCh0aGlzLnRvb2x0aXBzLGZ1bmN0aW9uKG4scil7dmFyIGk9ZS5FdmVudCgiYmx1ciIpO2kudGFyZ2V0PWkuY3VycmVudFRhcmdldD1yWzBdLHQuY2xvc2UoaSwhMCksZSgiIyIrbikucmVtb3ZlKCksci5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIikmJihyLmF0dHIoInRpdGxlIixyLmRhdGEoInVpLXRvb2x0aXAtdGl0bGUiKSksci5yZW1vdmVEYXRhKCJ1aS10b29sdGlwLXRpdGxlIikpfSl9fSl9KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/skeleton.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVRvb2xzIChjKSAyMDA4IGJ5IFJvYmVydCBDYW1wYmVsbCAKIyAgICAgICAgIChjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnKQojICBBIHRvb2xib3ggb2YgY29udmVuaWVuY2VzIHRvIHByb3ZpZGUgZHluYW1pYyBqYXZhc2NyaXB0eSBmdW5jdGlvbmFsaXR5CiMgIGZvciBDTVMgbW9kdWxlcyBhbmQgd2Vic2l0ZSBkZXNpZ25lcnMuCiMgCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCiMgYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCiMgaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwojIE1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiAKIyBzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI0VORF9MSUNFTlNFCgojCiMgRU9GCiMKPz4=]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/incjs.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSB7JEpRdWVyeVRvb2xzLT5HZXROYW1lKCl9IHZlcnNpb24geyRKUXVlcnlUb29scy0+R2V0VmVyc2lvbigpfSAtLT4Ke2lmIGlzc2V0KCRsaWJzKX0Ke2ZvcmVhY2ggZnJvbT0kbGlicyBpdGVtPSdvbmUnfQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JG9uZX0iPjwvc2NyaXB0Pgp7L2ZvcmVhY2h9CnsvaWZ9CntpZiBpc3NldCgkY3NzKX0Ke2ZvcmVhY2ggZnJvbT0kY3NzIGl0ZW09J29uZSd9CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Inskb25lfSIgbWVkaWE9InNjcmVlbiIgLz4Key9mb3JlYWNofQp7L2lmfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/ready.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyogaGVyZSB3ZSBzZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGF0dHJpYnV0ZXMgZm9yIHRoZSBsaWJzIHRoYXQgYXJlIGxvYWRlZC4gKn0NCntjYXB0dXJlIGFzc2lnbj0nb3V0J317c3RyaXB9DQp7aWYgaXNzZXQoJGpxdWVyeV9saWJzLnRhYmxlc29ydGVyKX0NCmpRdWVyeSgiLmNtc19zb3J0YWJsZSIpLnRhYmxlc29ydGVyKHsgd2lkdGhGaXhlZDogdHJ1ZSwgd2lkZ2V0czogWyd6ZWJyYSddLCBzb3J0TGlzdDogW1swLDBdXSB9KQ0Key9pZn0NCntpZiBpc3NldCgkanF1ZXJ5X2xpYnMudWkpfQ0KalF1ZXJ5KCdkaXYuYWNjb3JkaW9uJykuYWNjb3JkaW9uKCk7DQp7L2lmfQ0Ke2lmIGlzc2V0KCRqcXVlcnlfbGlicy5saWdodGJveCl9DQpqUXVlcnkoJ2EubGlnaHRib3gnKS5saWdodEJveCgpOw0Key9pZn0NCntpZiBpc3NldCgkanF1ZXJ5X2xpYnMuZmFuY3lib3gpfQ0KalF1ZXJ5KCdhLmZhbmN5Ym94JykuZmFuY3lib3goKTsNCnsvaWZ9DQp7aWYgaXNzZXQoJGpxdWVyeV9saWJzLmNsdWV0aXApfQ0KalF1ZXJ5KCJhLnRvb2x0aXAiKS5jbHVldGlwKHsgbG9jYWw6dHJ1ZSwgY3Vyc29yOiAncG9pbnRlcicgfSk7DQp7L2lmfQ0Key9zdHJpcH17L2NhcHR1cmV9DQp7aWYgc3RybGVuKCRvdXQpfQ0KPCEtLSB7JEpRdWVyeVRvb2xzLT5HZXROYW1lKCl9IHZlcnNpb24geyRKUXVlcnlUb29scy0+R2V0VmVyc2lvbigpfSAtLT4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBW3tqc21pbn0NCmpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oJCkgew0KeyRvdXR9DQp9KTsgIC8vZW5kDQp7L2pzbWlufS8vXV0+PC9zY3JpcHQ+DQp7L2lmfQ==]]></data>
	</file>
</module>
